From 16c9fd023359dacb98154ee43b270be530f0f3ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D1=8F=201=D0=A1?= Date: Thu, 5 Aug 2010 15:33:00 +0300 Subject: [PATCH] 1_0_7_5 --- SSL/.project | 18 + .../org.eclipse.core.resources.prefs | 2 + SSL/DT-INF/PROJECT.PMF | 2 + .../Задание/Flowchart.scheme | 980 + .../Задание/Forms/ДействиеВыполнить/Form.form | 1358 ++ .../Forms/ДействиеВыполнить/Module.bsl | 146 + .../Задание/Forms/ДействиеПроверить/Form.form | 1507 ++ .../Forms/ДействиеПроверить/Module.bsl | 175 + .../Forms/ФормаБизнесПроцесса/Form.form | 1042 + .../Forms/ФормаБизнесПроцесса/Module.bsl | 87 + .../Список/ExtInfo/ListSettings.dcss | 35 + .../Задание/Forms/ФормаСписка/Form.form | 1073 + .../Задание/Forms/ФормаСписка/Module.bsl | 81 + .../BusinessProcesses/Задание/Help/ru.html | 3 + .../Задание/ManagerModule.bsl | 95 + .../Задание/ObjectModule.bsl | 300 + SSL/src/BusinessProcesses/Задание/Задание.mdo | 486 + .../Forms/ФормаПодбораВалютИзОКВ/Form.form | 591 + .../Forms/ФормаПодбораВалютИзОКВ/Module.bsl | 68 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Валюты/Forms/ФормаСписка/Form.form | 571 + .../Валюты/Forms/ФормаСписка/Help/ru.html | 4 + .../Валюты/Forms/ФормаСписка/Module.bsl | 50 + .../Валюты/Forms/ФормаЭлемента/Form.form | 1431 ++ .../Валюты/Forms/ФормаЭлемента/Module.bsl | 347 + SSL/src/Catalogs/Валюты/ManagerModule.bsl | 0 SSL/src/Catalogs/Валюты/ObjectModule.bsl | 37 + .../Template.txt | 175 + SSL/src/Catalogs/Валюты/Валюты.mdo | 287 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаВыбора/Form.form | 267 + .../Forms/ФормаВыбора/Module.bsl | 7 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 302 + .../Forms/ФормаСписка/Module.bsl | 11 + .../Forms/ФормаЭлемента/Form.form | 187 + .../Forms/ФормаЭлемента/Module.bsl | 22 + .../ВариантыОтветовАнкет/ObjectModule.bsl | 0 .../ВариантыОтветовАнкет.mdo | 182 + .../ConditionalAppearance.dcssca | 80 + .../НастройкаГруппировкиПоРазделам/Form.form | 648 + .../НастройкаГруппировкиПоРазделам/Module.bsl | 298 + .../Forms/ПереместитьВариантВРаздел/Form.form | 466 + .../ПереместитьВариантВРаздел/Module.bsl | 78 + .../Forms/РедактированиеВидимости/Form.form | 610 + .../Forms/РедактированиеВидимости/Module.bsl | 100 + .../ConditionalAppearance.dcssca | 27 + .../Forms/РедактированиеПодсистемы/Form.form | 544 + .../Forms/РедактированиеПодсистемы/Module.bsl | 48 + .../Forms/СкопироватьВариантВРаздел/Form.form | 842 + .../СкопироватьВариантВРаздел/Module.bsl | 130 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 700 + .../Forms/ФормаСписка/Help/ru.html | 4 + .../Forms/ФормаСписка/Module.bsl | 7 + .../ConditionalAppearance.dcssca | 56 + .../Forms/ФормаЭлемента/Form.form | 621 + .../Forms/ФормаЭлемента/Help/ru.html | 9 + .../Forms/ФормаЭлемента/Module.bsl | 210 + SSL/src/Catalogs/ВариантыОтчетов/Help/ru.html | 19 + .../ВариантыОтчетов/ВариантыОтчетов.mdo | 431 + .../ОткрытьВерсииФайла/CommandModule.bsl | 8 + .../Список/ExtInfo/ListSettings.dcss | 20 + .../ВерсииФайлов/Forms/ФормаВыбора/Form.form | 398 + .../Form.form | 229 + .../Module.bsl | 17 + .../Список/ExtInfo/ListSettings.dcss | 46 + .../ВерсииФайлов/Forms/ФормаСписка/Form.form | 900 + .../ВерсииФайлов/Forms/ФормаСписка/Module.bsl | 33 + .../Список/ExtInfo/ListSettings.dcss | 46 + .../Forms/ФормаСпискаВерсийФайла/Form.form | 1341 ++ .../Forms/ФормаСпискаВерсийФайла/Module.bsl | 496 + .../Forms/ФормаЭлемента/Form.form | 1198 ++ .../Forms/ФормаЭлемента/Module.bsl | 38 + SSL/src/Catalogs/ВерсииФайлов/Help/ru.html | 9 + .../Catalogs/ВерсииФайлов/ObjectModule.bsl | 101 + .../Catalogs/ВерсииФайлов/ВерсииФайлов.mdo | 655 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 226 + .../Forms/ФормаЭлемента/Form.form | 80 + .../ВидыДокументовФизическихЛиц/Help/ru.html | 9 + .../ManagerModule.bsl | 4 + .../ВидыДокументовФизическихЛиц.mdo | 151 + .../Список/ExtInfo/ListSettings.dcss | 20 + .../Forms/ФормаВыбораГруппы/Form.form | 241 + .../Forms/ФормаГруппы/Form.form | 89 + .../Список/ExtInfo/ListSettings.dcss | 19 + .../Forms/ФормаСписка/Form.form | 431 + .../Forms/ФормаСписка/Module.bsl | 31 + .../Forms/ФормаЭлемента/Form.form | 305 + .../Forms/ФормаЭлемента/Module.bsl | 92 + .../ManagerModule.bsl | 0 .../ВидыКонтактнойИнформации/ObjectModule.bsl | 0 .../ВидыКонтактнойИнформации.mdo | 324 + .../ExtInfo/ListSettings.dcss | 25 + .../ExtInfo/ListSettings.dcss | 23 + .../Forms/ФормаСписка/Form.form | 1058 + .../Forms/ФормаСписка/Module.bsl | 254 + .../Forms/ФормаЭлемента/Form.form | 2522 +++ .../Forms/ФормаЭлемента/Module.bsl | 946 + .../ВнешниеПользователи/ObjectModule.bsl | 114 + .../ВнешниеПользователи.mdo | 211 + .../ВопросыШаблонаАнкеты/ObjectModule.bsl | 1 + .../ВопросыШаблонаАнкеты.mdo | 331 + .../Список/ExtInfo/ListSettings.dcss | 35 + .../Forms/ФормаСписка/Form.form | 295 + .../Forms/ФормаСписка/Module.bsl | 22 + .../Forms/ФормаЭлемента/Form.form | 2591 +++ .../Forms/ФормаЭлемента/Module.bsl | 679 + .../ObjectModule.bsl | 212 + .../ГруппыВнешнихПользователей.mdo | 296 + .../Form.form | 232 + .../Module.bsl | 51 + .../Список/ExtInfo/ListSettings.dcss | 21 + .../ГруппыДоступа/Forms/ФормаСписка/Form.form | 310 + .../Forms/ФормаСписка/Help/ru.html | 6 + .../Forms/ФормаСписка/Module.bsl | 8 + .../ConditionalAppearance.dcssca | 26 + .../Forms/ФормаЭлемента/Form.form | 2889 +++ .../Forms/ФормаЭлемента/Help/ru.html | 6 + .../Forms/ФормаЭлемента/Module.bsl | 1079 + SSL/src/Catalogs/ГруппыДоступа/Help/ru.html | 11 + .../Catalogs/ГруппыДоступа/ManagerModule.bsl | 0 .../Catalogs/ГруппыДоступа/ObjectModule.bsl | 130 + .../Catalogs/ГруппыДоступа/ГруппыДоступа.mdo | 368 + .../ГруппыИсполнителейЗадач/ManagerModule.bsl | 32 + .../ГруппыИсполнителейЗадач/ObjectModule.bsl | 46 + .../ГруппыИсполнителейЗадач.mdo | 153 + .../Список/ExtInfo/ListSettings.dcss | 35 + .../Forms/ФормаСписка/Form.form | 298 + .../Forms/ФормаСписка/Module.bsl | 22 + .../Forms/ФормаЭлемента/Form.form | 763 + .../Forms/ФормаЭлемента/Help/ru.html | 5 + .../Forms/ФормаЭлемента/Module.bsl | 140 + .../Catalogs/ГруппыПользователей/Help/ru.html | 52 + .../ГруппыПользователей/ManagerModule.bsl | 0 .../ГруппыПользователей/ObjectModule.bsl | 58 + .../ГруппыПользователей.mdo | 235 + .../Form.form | 715 + .../Module.bsl | 101 + .../Forms/ПодборРазделов/Form.form | 475 + .../Forms/ПодборРазделов/Module.bsl | 49 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 419 + .../Forms/ФормаЭлемента/Form.form | 1921 ++ .../Forms/ФормаЭлемента/Module.bsl | 784 + .../Help/ru.html | 18 + .../ManagerModule.bsl | 110 + .../ObjectModule.bsl | 346 + .../ДополнительныеОтчетыИОбработки.mdo | 508 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаВыбора/Form.form | 249 + .../Forms/ФормаВыбора/Module.bsl | 49 + .../Список/ExtInfo/ListSettings.dcss | 20 + .../Forms/ФормаВыбораГруппы/Form.form | 239 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 236 + .../Forms/ФормаСписка/Module.bsl | 16 + .../Forms/ФормаЭлемента/Form.form | 237 + .../Forms/ФормаЭлемента/Module.bsl | 42 + .../ЗначенияСвойствОбъектов/Help/ru.html | 3 + .../ЗначенияСвойствОбъектов.mdo | 199 + .../Календари/Forms/ФормаЭлемента/Form.form | 450 + .../Календари/Forms/ФормаЭлемента/Module.bsl | 189 + SSL/src/Catalogs/Календари/ManagerModule.bsl | 72 + SSL/src/Catalogs/Календари/ObjectModule.bsl | 0 SSL/src/Catalogs/Календари/Календари.mdo | 123 + .../ДеревоСвойств/ExtInfo/ListSettings.dcss | 45 + .../ConditionalAppearance.dcssca | 23 + .../Forms/ПодборСвойств/Form.form | 582 + .../Forms/ПодборСвойств/Module.bsl | 170 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаВыбора/Form.form | 239 + .../Forms/ФормаГруппы/Form.form | 512 + .../Forms/ФормаГруппы/Module.bsl | 18 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 244 + .../Forms/ФормаЭлемента/Form.form | 897 + .../Forms/ФормаЭлемента/Module.bsl | 369 + .../Help/ru.html | 7 + .../ManagerModule.bsl | 35 + .../ObjectModule.bsl | 104 + ...аборыДополнительныхРеквизитовИСведений.mdo | 266 + .../НазначенияСертификатов/Template.txt | 67 + .../НазначенияСертификатовЭЦП.mdo | 116 + .../Организации/Forms/ФормаЭлемента/Form.form | 242 + .../Forms/ФормаЭлемента/Module.bsl | 37 + SSL/src/Catalogs/Организации/ObjectModule.bsl | 0 SSL/src/Catalogs/Организации/Организации.mdo | 349 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../ПапкиФайлов/Forms/ФормаВыбора/Form.form | 243 + .../ПапкиФайлов/Forms/ФормаВыбора/Module.bsl | 7 + .../ПапкиФайлов/Forms/ФормаЭлемента/Form.form | 490 + .../Forms/ФормаЭлемента/Module.bsl | 165 + SSL/src/Catalogs/ПапкиФайлов/Help/ru.html | 7 + SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl | 154 + SSL/src/Catalogs/ПапкиФайлов/ПапкиФайлов.mdo | 278 + .../Commands/ПользователиИБ/CommandModule.bsl | 20 + .../ConditionalAppearance.dcssca | 119 + .../Forms/ПользователиИБ/Form.form | 1339 ++ .../Forms/ПользователиИБ/Help/ru.html | 10 + .../Forms/ПользователиИБ/Module.bsl | 334 + .../Forms/ФормаВыбораПользователяОС/Form.form | 686 + .../ФормаВыбораПользователяОС/Help/ru.html | 2 + .../ФормаВыбораПользователяОС/Module.bsl | 91 + .../Forms/ФормаВыбораРолей/Form.form | 1683 ++ .../Forms/ФормаВыбораРолей/Help/ru.html | 6 + .../Forms/ФормаВыбораРолей/Module.bsl | 256 + .../ExtInfo/ListSettings.dcss | 23 + .../ExtInfo/ListSettings.dcss | 25 + .../Пользователи/Forms/ФормаСписка/Form.form | 1012 + .../Пользователи/Forms/ФормаСписка/Module.bsl | 216 + .../Forms/ФормаЭлемента/Form.form | 3124 +++ .../Forms/ФормаЭлемента/Help/ru.html | 3 + .../Forms/ФормаЭлемента/Module.bsl | 1067 + SSL/src/Catalogs/Пользователи/Help/ru.html | 6 + .../Catalogs/Пользователи/ObjectModule.bsl | 58 + .../Catalogs/Пользователи/Пользователи.mdo | 441 + .../Список/ExtInfo/ListSettings.dcss | 20 + .../Forms/ФормаВыбора/Form.form | 229 + .../Список/ExtInfo/ListSettings.dcss | 21 + .../Forms/ФормаСписка/Form.form | 239 + .../Forms/ФормаСписка/Help/ru.html | 4 + .../Forms/ФормаСписка/Module.bsl | 8 + .../ConditionalAppearance.dcssca | 26 + .../Forms/ФормаЭлемента/Form.form | 3779 ++++ .../Forms/ФормаЭлемента/Module.bsl | 976 + .../Catalogs/ПрофилиГруппДоступа/Help/ru.html | 9 + .../ПрофилиГруппДоступа/ManagerModule.bsl | 0 .../ПрофилиГруппДоступа/ObjectModule.bsl | 125 + .../ПрофилиГруппДоступа.mdo | 516 + .../Список/ExtInfo/ListSettings.dcss | 31 + .../Forms/ФормаВыбора/Form.form | 326 + .../Список/ExtInfo/ListSettings.dcss | 31 + .../Forms/ФормаСписка/Form.form | 326 + .../Forms/ФормаЭлемента/Form.form | 446 + .../Forms/ФормаЭлемента/Module.bsl | 20 + .../Catalogs/РолиИсполнителей/Help/ru.html | 26 + .../РолиИсполнителей/ObjectModule.bsl | 39 + .../РолиИсполнителей/РолиИсполнителей.mdo | 249 + .../СтраныМира/Forms/ФормаЭлемента/Form.form | 275 + .../Templates/Классификатор/Template.txt | 246 + SSL/src/Catalogs/СтраныМира/СтраныМира.mdo | 217 + .../Список/ExtInfo/ListSettings.dcss | 55 + .../Form.form | 939 + .../Module.bsl | 191 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 476 + .../Forms/ФормаСписка/Module.bsl | 36 + .../Forms/ФормаЭлемента/Form.form | 1063 + .../Forms/ФормаЭлемента/Module.bsl | 276 + .../СценарииОбменовДанными/ManagerModule.bsl | 353 + .../СценарииОбменовДанными/ObjectModule.bsl | 70 + .../СценарииОбменовДанными.mdo | 268 + .../Список/ExtInfo/ListSettings.dcss | 19 + .../Forms/ФормаСписка/Form.form | 419 + .../Forms/ФормаЭлемента/Form.form | 535 + .../Forms/ФормаЭлемента/Help/ru.html | 3 + .../Forms/ФормаЭлемента/Module.bsl | 70 + .../Catalogs/ТомаХраненияФайлов/Help/ru.html | 12 + .../ТомаХраненияФайлов/ObjectModule.bsl | 103 + .../ТомаХраненияФайлов/ТомаХраненияФайлов.mdo | 237 + .../ПроверкаУчетнойЗаписи/CommandModule.bsl | 7 + .../Form.form | 1485 ++ .../Help/ru.html | 15 + .../Module.bsl | 309 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 325 + .../Forms/ФормаЭлемента/Form.form | 932 + .../Forms/ФормаЭлемента/Help/ru.html | 11 + .../Forms/ФормаЭлемента/Module.bsl | 87 + .../Help/ru.html | 3 + .../ManagerModule.bsl | 0 .../ObjectModule.bsl | 24 + .../УчетныеЗаписиЭлектроннойПочты.mdo | 613 + .../Файлы/Commands/ВсеФайлы/CommandModule.bsl | 5 + .../Commands/ЗанятыеФайлы/CommandModule.bsl | 11 + .../Commands/ПапкиФайлов/CommandModule.bsl | 11 + .../ВРабочемКаталогеБолееНовыйФайл/Form.form | 649 + .../ВРабочемКаталогеБолееНовыйФайл/Module.bsl | 23 + .../Forms/ВводПароляСОписаниями/Form.form | 325 + .../Forms/ВводПароляСОписаниями/Help/ru.html | 7 + .../Forms/ВводПароляСОписаниями/Module.bsl | 25 + .../Form.form | 596 + .../Help/ru.html | 8 + .../Module.bsl | 72 + .../Form.form | 362 + .../Help/ru.html | 8 + .../Module.bsl | 37 + .../ВыборУстройстваСканирования/Form.form | 170 + .../ВыборУстройстваСканирования/Module.bsl | 31 + .../Forms/НастройкаСканирования/Form.form | 800 + .../Forms/НастройкаСканирования/Help/ru.html | 10 + .../Forms/НастройкаСканирования/Module.bsl | 220 + .../Form.form | 423 + .../Module.bsl | 12 + .../СписокФайлов/ExtInfo/ListSettings.dcss | 15 + .../Файлы/Forms/РедактируемыеФайлы/Form.form | 1044 + .../Forms/РедактируемыеФайлы/Help/ru.html | 3 + .../Файлы/Forms/РедактируемыеФайлы/Module.bsl | 156 + .../Form.form | 543 + .../Module.bsl | 18 + .../Forms/РезультатСканирования/Form.form | 460 + .../Forms/РезультатСканирования/Module.bsl | 202 + .../СписокФайлов/ExtInfo/ListSettings.dcss | 15 + .../Forms/СписокЗанятыхСВопросом/Form.form | 1257 ++ .../Forms/СписокЗанятыхСВопросом/Help/ru.html | 3 + .../Forms/СписокЗанятыхСВопросом/Module.bsl | 140 + .../Form.form | 941 + .../Help/ru.html | 4 + .../Module.bsl | 130 + .../Файлы/Forms/ФайлСуществует/Form.form | 321 + .../Файлы/Forms/ФайлСуществует/Module.bsl | 27 + .../Файлы/Forms/ФормаВозвратаФайла/Form.form | 395 + .../Forms/ФормаВозвратаФайла/Help/ru.html | 5 + .../Файлы/Forms/ФормаВозвратаФайла/Module.bsl | 31 + .../Файлы/Forms/ФормаВопроса/Form.form | 483 + .../Файлы/Forms/ФормаВопроса/Module.bsl | 26 + .../Form.form | 234 + .../Module.bsl | 20 + .../Файлы/Forms/ФормаВопросаИмпорта/Form.form | 392 + .../Forms/ФормаВопросаИмпорта/Help/ru.html | 1 + .../Forms/ФормаВопросаИмпорта/Module.bsl | 33 + .../Form.form | 256 + .../Module.bsl | 32 + .../Группы/ExtInfo/ListSettings.dcss | 20 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Файлы/Forms/ФормаВыбора/Form.form | 986 + .../Файлы/Forms/ФормаВыбора/Module.bsl | 47 + .../ConditionalAppearance.dcssca | 32 + .../Файлы/Forms/ФормаВыбораПодписей/Form.form | 708 + .../Forms/ФормаВыбораПодписей/Help/ru.html | 8 + .../Forms/ФормаВыбораПодписей/Module.bsl | 88 + .../Form.form | 243 + .../Module.bsl | 28 + .../Forms/ФормаВыбораРежимаОткрытия/Form.form | 428 + .../ФормаВыбораРежимаОткрытия/Help/ru.html | 10 + .../ФормаВыбораРежимаОткрытия/Module.bsl | 17 + .../ФормаГруповаяОперацияНаПапке/Form.form | 189 + .../ФормаГруповаяОперацияНаПапке/Module.bsl | 7 + .../ConditionalAppearance.dcssca | 43 + .../ФормаДобавленияПодписиИзФайла/Form.form | 385 + .../Help/ru.html | 7 + .../ФормаДобавленияПодписиИзФайла/Module.bsl | 55 + .../Файлы/Forms/ФормаИмпортаПапки/Form.form | 548 + .../Forms/ФормаИмпортаПапки/Help/ru.html | 9 + .../Файлы/Forms/ФормаИмпортаПапки/Module.bsl | 98 + .../Файлы/Forms/ФормаИмпортаФайлов/Form.form | 946 + .../Forms/ФормаИмпортаФайлов/Help/ru.html | 3 + .../Файлы/Forms/ФормаИмпортаФайлов/Module.bsl | 121 + .../Form.form | 167 + .../Module.bsl | 8 + .../Form.form | 251 + .../Module.bsl | 25 + .../Файлы/Forms/ФормаНового/Form.form | 260 + .../Файлы/Forms/ФормаНового/Help/ru.html | 6 + .../Файлы/Forms/ФормаНового/Module.bsl | 14 + .../Файлы/Forms/ФормаОтчета/Form.form | 130 + .../Файлы/Forms/ФормаОтчета/Module.bsl | 20 + .../Forms/ФормаОтчетаОСохранении/Form.form | 120 + .../Forms/ФормаОтчетаОСохранении/Module.bsl | 5 + .../Файлы/Forms/ФормаПеретаскивания/Form.form | 962 + .../Forms/ФормаПеретаскивания/Module.bsl | 167 + .../Группы/ExtInfo/ListSettings.dcss | 20 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Файлы/Forms/ФормаПодбора/Form.form | 940 + .../Файлы/Forms/ФормаПодбора/Module.bsl | 57 + .../Список/ExtInfo/ListSettings.dcss | 21 + .../Файлы/Forms/ФормаСписка/Form.form | 1140 + .../Файлы/Forms/ФормаСписка/Module.bsl | 102 + .../Список/ExtInfo/ListSettings.dcss | 21 + .../ФормаСпискаПрисоединенныхФайлов/Form.form | 2543 +++ .../Module.bsl | 407 + .../Файлы/Forms/ФормаШифрования/Form.form | 636 + .../Файлы/Forms/ФормаШифрования/Help/ru.html | 8 + .../Файлы/Forms/ФормаШифрования/Module.bsl | 73 + .../Файлы/Forms/ФормаЭкспортаПапки/Form.form | 495 + .../Forms/ФормаЭкспортаПапки/Help/ru.html | 2 + .../Файлы/Forms/ФормаЭкспортаПапки/Module.bsl | 433 + .../ConditionalAppearance.dcssca | 32 + .../Файлы/Forms/ФормаЭлемента/Form.form | 3053 +++ .../Файлы/Forms/ФормаЭлемента/Help/ru.html | 11 + .../Файлы/Forms/ФормаЭлемента/Module.bsl | 1120 + .../Папки/ExtInfo/ListSettings.dcss | 21 + .../Список/ExtInfo/ListSettings.dcss | 21 + .../Файлы/Forms/ХранилищеФайлов/Form.form | 3497 ++++ .../Файлы/Forms/ХранилищеФайлов/Help/ru.html | 5 + .../Файлы/Forms/ХранилищеФайлов/Module.bsl | 988 + SSL/src/Catalogs/Файлы/Help/ru.html | 29 + SSL/src/Catalogs/Файлы/ManagerModule.bsl | 0 SSL/src/Catalogs/Файлы/ObjectModule.bsl | 165 + .../Файлы/Templates/МакетОтчета/Template.mxlx | 119 + SSL/src/Catalogs/Файлы/Файлы.mdo | 1115 + SSL/src/Catalogs/ФизическиеЛица/Help/ru.html | 16 + .../ФизическиеЛица/ФизическиеЛица.mdo | 170 + .../ФормаМастераТабличныхВопросов/Form.form | 3074 +++ .../Help/ru.html | 20 + .../ФормаМастераТабличныхВопросов/Module.bsl | 750 + .../Forms/ФормаПростыхВопросов/Form.form | 532 + .../Forms/ФормаПростыхВопросов/Module.bsl | 137 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../ШаблоныАнкет/Forms/ФормаСписка/Form.form | 264 + .../ConditionalAppearance.dcssca | 81 + .../Forms/ФормаЭлемента/Form.form | 2549 +++ .../Forms/ФормаЭлемента/Module.bsl | 958 + .../Catalogs/ШаблоныАнкет/ObjectModule.bsl | 123 + .../Catalogs/ШаблоныАнкет/ШаблоныАнкет.mdo | 223 + .../Список/ExtInfo/ListSettings.dcss | 23 + .../ВидыДоступа/Forms/ФормаВыбора/Form.form | 239 + .../ВидыДоступа/Forms/ФормаВыбора/Module.bsl | 22 + .../Список/ExtInfo/ListSettings.dcss | 23 + .../ВидыДоступа/Forms/ФормаСписка/Form.form | 288 + .../ВидыДоступа/Forms/ФормаСписка/Module.bsl | 24 + .../ВидыДоступа/Forms/ФормаЭлемента/Form.form | 135 + .../ВидыДоступа/ManagerModule.bsl | 0 .../ВидыДоступа/ObjectModule.bsl | 10 + .../ВидыДоступа/ВидыДоступа.mdo | 203 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаВыбора/Form.form | 272 + .../Forms/ФормаВыбора/Module.bsl | 9 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 305 + .../ВариантыОтветов/ExtInfo/ListSettings.dcss | 19 + .../Forms/ФормаЭлемента/Form.form | 1671 ++ .../Forms/ФормаЭлемента/Module.bsl | 338 + .../ВопросыДляАнкетирования/ObjectModule.bsl | 127 + .../ВопросыДляАнкетирования.mdo | 358 + .../Forms/ФормаГруппы/Form.form | 170 + .../Forms/ФормаГруппы/Module.bsl | 7 + .../Forms/ФормаПоискаСсылокНаПВХ/Form.form | 441 + .../Forms/ФормаПоискаСсылокНаПВХ/Module.bsl | 22 + .../Form.form | 473 + .../Module.bsl | 195 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 277 + .../Forms/ФормаЭлемента/Form.form | 906 + .../Forms/ФормаЭлемента/Module.bsl | 461 + .../Help/ru.html | 7 + .../ManagerModule.bsl | 10 + .../ДополнительныеРеквизитыИСведения.mdo | 298 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 275 + .../Forms/ФормаЭлемента/Form.form | 119 + .../ОбъектыАдресацииЗадач/Help/ru.html | 3 + .../ОбъектыАдресацииЗадач/ObjectModule.bsl | 0 .../ОбъектыАдресацииЗадач.mdo | 146 + .../ВыполнениеОбменаДанными.mdo | 13 + .../ПараметрыОбменаДанными.mdo | 13 + SSL/src/CommandGroups/Печать/Печать.mdo | 15 + .../CommandModule.bsl | 20 + .../ВнешнийПользовательОбъектаАвторизации.mdo | 10 + .../ВыполнитьОбменДанными/CommandModule.bsl | 7 + .../ВыполнитьОбменДанными.mdo | 13 + .../CommandModule.bsl | 7 + .../ВыполнитьОбменДаннымиИнтерактивно.mdo | 13 + .../CommandModule.bsl | 10 + ...льныеОтчетыИОбработкиЗаполнениеОбъекта.mdo | 16 + .../CommandModule.bsl | 10 + .../ДополнительныеОтчетыИОбработкиОтчеты.mdo | 15 + .../CommandModule.bsl | 10 + ...нительныеОтчетыИОбработкиПечатныеФормы.mdo | 15 + .../CommandModule.bsl | 10 + ...етыИОбработкиСозданиеСвязанныхОбъектов.mdo | 16 + .../ДополнительныеСведения/CommandModule.bsl | 12 + .../ДополнительныеСведения.mdo | 17 + .../ЗадачиПоБизнесПроцессу/CommandModule.bsl | 9 + .../ЗадачиПоБизнесПроцессу.mdo | 17 + .../ЗадачиПоПредмету/CommandModule.bsl | 9 + .../ЗадачиПоПредмету/ЗадачиПоПредмету.mdo | 18 + .../ИсторияИзменений/CommandModule.bsl | 25 + .../ИсторияИзменений/ИсторияИзменений.mdo | 17 + .../CommandModule.bsl | 9 + .../КартаМаршрутаБизнесПроцесса.mdo | 20 + .../CommandModule.bsl | 10 + ...оитьПараметрыТранспортаСообщенийОбмена.mdo | 14 + .../CommandModule.bsl | 8 + ...СистемнойУчетнойЗаписиЭлектроннойПочты.mdo | 14 + .../CommandModule.bsl | 12 + .../ОбменДаннымиРазместитьФайлыВТомах.mdo | 14 + .../CommandModule.bsl | 16 + .../ОткрытьПравилаКонвертацииОбъектов.mdo | 10 + .../CommandModule.bsl | 16 + .../ОткрытьПравилаРегистрацииОбъектов.mdo | 10 + .../CommandModule.bsl | 8 + .../ОткрытьСценарииОбменовДанными.mdo | 10 + .../CommandModule.bsl | 10 + .../ОткрытьФормуУправленияОбменамиДанных.mdo | 10 + .../CommandModule.bsl | 6 + ...ЖурналРегистрацииСобытийВыгрузкиДанных.mdo | 13 + .../CommandModule.bsl | 6 + ...ЖурналРегистрацииСобытийЗагрузкиДанных.mdo | 13 + .../CommandModule.bsl | 8 + .../ПерсональнаяНастройкаПроксиСервера.mdo | 10 + .../CommandModule.bsl | 12 + ...ВнешнегоПользователяПоЗначениямДоступа.mdo | 18 + .../ПраваПоЗначениюДоступа/CommandModule.bsl | 12 + .../ПраваПоЗначениюДоступа.mdo | 14 + .../CommandModule.bsl | 12 + .../ПраваПользователяПоЗначениямДоступа.mdo | 18 + .../ПрисоединенныеФайлы/CommandModule.bsl | 16 + .../ПрисоединенныеФайлы.mdo | 10 + .../CommandModule.bsl | 9 + .../РедактированиеМакетовПечатныхФорм.mdo | 10 + .../CommandModule.bsl | 9 + .../РолеваяАдресацияПоОбъекту.mdo | 20 + .../CommandModule.bsl | 6 + .../СозданиеНачальногоОбразаСФайлами.mdo | 13 + .../СписокРеспондента/CommandModule.bsl | 10 + .../СписокРеспондента/СписокРеспондента.mdo | 14 + .../СтруктураПодчиненности/CommandModule.bsl | 15 + .../СтруктураПодчиненности.mdo | 10 + .../CommandModule.bsl | 7 + .../УстановитьРасширениеРаботыСФайлами.mdo | 14 + SSL/src/CommonForms/ВводАдреса/Form.form | 1715 ++ SSL/src/CommonForms/ВводАдреса/Module.bsl | 476 + SSL/src/CommonForms/ВводАдреса/ВводАдреса.mdo | 10 + SSL/src/CommonForms/ВводТелефона/Form.form | 672 + SSL/src/CommonForms/ВводТелефона/Module.bsl | 101 + .../CommonForms/ВводТелефона/ВводТелефона.mdo | 11 + .../Form.form | 257 + .../Module.bsl | 32 + ...росОбУстановкеРасширенияРаботыСФайлами.mdo | 11 + .../ВсеОтчеты/ConditionalAppearance.dcssca | 86 + SSL/src/CommonForms/ВсеОтчеты/Form.form | 1764 ++ SSL/src/CommonForms/ВсеОтчеты/Help/ru.html | 5 + SSL/src/CommonForms/ВсеОтчеты/Module.bsl | 603 + SSL/src/CommonForms/ВсеОтчеты/ВсеОтчеты.mdo | 16 + .../ВыборОбъектовМетаданных/Form.form | 629 + .../ВыборОбъектовМетаданных/Module.bsl | 412 + .../ВыборОбъектовМетаданных.mdo | 10 + .../ВыборСертификатаЭЦПДляПодписи/Form.form | 711 + .../Help/ru.html | 10 + .../ВыборСертификатаЭЦПДляПодписи/Module.bsl | 75 + .../ВыборСертификатаЭЦПДляПодписи.mdo | 16 + .../ВыполнениеОбменаДанными/Form.form | 1179 ++ .../ВыполнениеОбменаДанными/Help/ru.html | 5 + .../ВыполнениеОбменаДанными/Module.bsl | 255 + .../ВыполнениеОбменаДанными.mdo | 15 + .../ДополнительныеОтчетыИОбработки/Form.form | 655 + .../ДополнительныеОтчетыИОбработки/Module.bsl | 210 + .../ДополнительныеОтчетыИОбработки.mdo | 10 + .../ConditionalAppearance.dcssca | 23 + .../МастерАнкетыПоРазделам/Form.form | 2226 ++ .../МастерАнкетыПоРазделам/Module.bsl | 201 + .../МастерАнкетыПоРазделам.mdo | 10 + .../НастройкаЛокальногоКэшаФайлов/Form.form | 761 + .../Help/ru.html | 10 + .../НастройкаЛокальногоКэшаФайлов/Module.bsl | 231 + .../НастройкаЛокальногоКэшаФайлов.mdo | 17 + .../НастройкаМоихОтчетовИОбработок/Form.form | 1000 + .../НастройкаМоихОтчетовИОбработок/Module.bsl | 433 + .../НастройкаМоихОтчетовИОбработок.mdo | 10 + .../Form.form | 394 + .../Module.bsl | 40 + .../НастройкаПечатныхФормПередОтправкой.mdo | 11 + SSL/src/CommonForms/НастройкиЭЦП/Form.form | 819 + SSL/src/CommonForms/НастройкиЭЦП/Help/ru.html | 15 + SSL/src/CommonForms/НастройкиЭЦП/Module.bsl | 157 + .../CommonForms/НастройкиЭЦП/НастройкиЭЦП.mdo | 15 + .../ОписаниеИзмененийСистемы/Form.form | 166 + .../ОписаниеИзмененийСистемы/Help/ru.html | 2 + .../ОписаниеИзмененийСистемы/Module.bsl | 35 + .../ОписаниеИзмененийСистемы.mdo | 17 + SSL/src/CommonForms/ПанельОтчетов/Form.form | 469 + SSL/src/CommonForms/ПанельОтчетов/Module.bsl | 515 + .../ПанельОтчетов/ПанельОтчетов.mdo | 10 + .../Form.form | 752 + .../Module.bsl | 141 + .../ПараметрыАдминистрированияСервернойИБ.mdo | 11 + .../ПараметрыПроксиСервера/Form.form | 553 + .../ПараметрыПроксиСервера/Module.bsl | 79 + .../ПараметрыПроксиСервера.mdo | 11 + .../ПерсональныеНастройкиЭЦП/Form.form | 284 + .../ПерсональныеНастройкиЭЦП/Help/ru.html | 14 + .../ПерсональныеНастройкиЭЦП/Module.bsl | 48 + .../ПерсональныеНастройкиЭЦП.mdo | 16 + .../CommonForms/ПечатьДокументов/Form.form | 1425 ++ .../CommonForms/ПечатьДокументов/Module.bsl | 393 + .../ПечатьДокументов/ПечатьДокументов.mdo | 11 + .../Form.form | 328 + .../Help/ru.html | 7 + .../Module.bsl | 104 + .../ПодтверждениеПароляУчетнойЗаписи.mdo | 16 + SSL/src/CommonForms/ПоискПоИндексу/Form.form | 558 + SSL/src/CommonForms/ПоискПоИндексу/Module.bsl | 54 + .../ПоискПоИндексу/ПоискПоИндексу.mdo | 11 + .../ConditionalAppearance.dcssca | 23 + .../ПраваПоЗначениямДоступа/Form.form | 1092 + .../ПраваПоЗначениямДоступа/Module.bsl | 1132 + .../ПраваПоЗначениямДоступа.mdo | 10 + .../РедактированиеЗначенийСвойств/Form.form | 865 + .../РедактированиеЗначенийСвойств/Module.bsl | 230 + .../РедактированиеЗначенийСвойств.mdo | 11 + .../РедактированиеНовогоПисьма/Form.form | 1192 ++ .../РедактированиеНовогоПисьма/Help/ru.html | 8 + .../РедактированиеНовогоПисьма/Module.bsl | 675 + .../РедактированиеНовогоПисьма.mdo | 16 + .../Form.form | 1463 ++ .../Module.bsl | 91 + .../СозданиеНачальногоОбразаСФайлами.mdo | 11 + .../ConditionalAppearance.dcssca | 23 + .../СтруктураПодчиненности/Form.form | 512 + .../СтруктураПодчиненности/Help/ru.html | 6 + .../СтруктураПодчиненности/Module.bsl | 709 + .../СтруктураПодчиненности.mdo | 15 + .../УправлениеОбменамиДанных/Form.form | 1840 ++ .../УправлениеОбменамиДанных/Help/ru.html | 4 + .../УправлениеОбменамиДанных/Module.bsl | 411 + .../УправлениеОбменамиДанных.mdo | 15 + .../CommonForms/ФормаСертификатаЭЦП/Form.form | 414 + .../ФормаСертификатаЭЦП/Help/ru.html | 8 + .../ФормаСертификатаЭЦП/Module.bsl | 83 + .../ФормаСертификатаЭЦП.mdo | 16 + .../АдресныйКлассификатор/Module.bsl | 801 + .../АдресныйКлассификатор.mdo | 10 + .../АдресныйКлассификаторКлиент/Module.bsl | 437 + .../АдресныйКлассификаторКлиент.mdo | 11 + .../Module.bsl | 90 + .../АдресныйКлассификаторКлиентСервер.mdo | 12 + .../CommonModules/Анкетирование/Module.bsl | 1890 ++ .../Анкетирование/Анкетирование.mdo | 10 + .../АнкетированиеКлиент/Module.bsl | 33 + .../АнкетированиеКлиент.mdo | 10 + .../АнкетированиеКлиентСервер/Module.bsl | 137 + .../АнкетированиеКлиентСервер.mdo | 12 + .../БизнесПроцессыИЗадачиКлиент/Module.bsl | 204 + .../БизнесПроцессыИЗадачиКлиент.mdo | 11 + .../Module.bsl | 27 + .../БизнесПроцессыИЗадачиПереопределяемый.mdo | 10 + .../БизнесПроцессыИЗадачиСервер/Module.bsl | 1166 ++ .../БизнесПроцессыИЗадачиСервер.mdo | 10 + .../БизнесПроцессыИЗадачиСобытия/Module.bsl | 36 + .../БизнесПроцессыИЗадачиСобытия.mdo | 13 + .../CommonModules/ВариантыОтчетов/Module.bsl | 799 + .../ВариантыОтчетов/ВариантыОтчетов.mdo | 10 + .../ВариантыОтчетовКлиент/Module.bsl | 19 + .../ВариантыОтчетовКлиент.mdo | 10 + .../Module.bsl | 11 + .../ВариантыОтчетовКлиентПереопределяемый.mdo | 10 + .../Module.bsl | 63 + .../ВариантыОтчетовПереопределяемый.mdo | 10 + .../ВерсионированиеОбъектов/Module.bsl | 195 + .../ВерсионированиеОбъектов.mdo | 10 + .../ВерсионированиеОбъектовСобытия/Module.bsl | 70 + .../ВерсионированиеОбъектовСобытия.mdo | 12 + .../ВнешниеПользователи/Module.bsl | 558 + .../ВнешниеПользователи.mdo | 10 + .../ВнешниеПользователиСобытия/Module.bsl | 22 + .../ВнешниеПользователиСобытия.mdo | 12 + .../ДополнительныеОтчетыИОбработки/Module.bsl | 537 + .../ДополнительныеОтчетыИОбработки.mdo | 10 + .../Module.bsl | 301 + .../ДополнительныеОтчетыИОбработкиКлиент.mdo | 10 + .../Module.bsl | 38 + ...лнительныеОтчетыИОбработкиКлиентСервер.mdo | 11 + .../Module.bsl | 28 + ...ельныеОтчетыИОбработкиПереопределяемый.mdo | 10 + .../Module.bsl | 216 + ...ЗапретРедактированияРеквизитовОбъектов.mdo | 10 + .../Module.bsl | 149 + ...РедактированияРеквизитовОбъектовКлиент.mdo | 10 + .../КалендарныеГрафики/Module.bsl | 330 + .../КалендарныеГрафики/КалендарныеГрафики.mdo | 10 + .../КомандыРаботыСФайлами/Module.bsl | 337 + .../КомандыРаботыСФайлами.mdo | 10 + .../Module.bsl | 5 + ...ольДинамическогоОбновленияКонфигурации.mdo | 10 + .../Module.bsl | 22 + ...ескогоОбновленияКонфигурацииГлобальный.mdo | 12 + .../Module.bsl | 7 + ...амическогоОбновленияКонфигурацииКлиент.mdo | 11 + .../КонтрольЖурналаРегистрации/Module.bsl | 48 + .../КонтрольЖурналаРегистрации.mdo | 10 + .../НастройкаПорядкаЭлементов/Module.bsl | 185 + .../НастройкаПорядкаЭлементов.mdo | 10 + .../Module.bsl | 149 + .../НастройкаПорядкаЭлементовКлиент.mdo | 10 + .../Module.bsl | 95 + .../НастройкаПорядкаЭлементовСобытия.mdo | 12 + .../ОбменДаннымиКлиент/Module.bsl | 325 + .../ОбменДаннымиКлиент/ОбменДаннымиКлиент.mdo | 11 + .../ОбменДаннымиПереопределяемый/Module.bsl | 14 + .../ОбменДаннымиПереопределяемый.mdo | 10 + .../ОбменДаннымиПовтИсп/Module.bsl | 922 + .../ОбменДаннымиПовтИсп.mdo | 13 + .../ОбменДаннымиСервер/Module.bsl | 1647 ++ .../ОбменДаннымиСервер/ОбменДаннымиСервер.mdo | 10 + .../ОбменДаннымиСобытия/Module.bsl | 1484 ++ .../ОбменДаннымиСобытия.mdo | 12 + SSL/src/CommonModules/ОбменФайлами/Module.bsl | 438 + .../ОбменФайлами/ОбменФайлами.mdo | 10 + .../ОбновлениеИнформационнойБазы/Module.bsl | 410 + .../ОбновлениеИнформационнойБазы.mdo | 10 + .../Module.bsl | 57 + .../ОбновлениеИнформационнойБазыКлиент.mdo | 11 + .../Module.bsl | 16 + ...формационнойБазыКлиентПереопределяемый.mdo | 10 + .../Module.bsl | 61 + ...ениеИнформационнойБазыПереопределяемый.mdo | 10 + .../ОбновлениеКонфигурации/Module.bsl | 316 + .../ОбновлениеКонфигурации.mdo | 11 + .../ОбновлениеКонфигурацииКлиент/Module.bsl | 596 + .../ОбновлениеКонфигурацииКлиент.mdo | 10 + .../Module.bsl | 7 + ...ОбновлениеКонфигурацииКлиентГлобальный.mdo | 11 + .../Module.bsl | 75 + ...ениеКонфигурацииКлиентПереопределяемый.mdo | 10 + .../Module.bsl | 44 + .../ОбновлениеКонфигурацииКлиентПовтИсп.mdo | 11 + .../Module.bsl | 54 + ...ОбновлениеКонфигурацииПереопределяемый.mdo | 11 + .../CommonModules/ОбщегоНазначения/Module.bsl | 1165 ++ .../ОбщегоНазначения/ОбщегоНазначения.mdo | 11 + .../ОбщегоНазначенияКлиент/Module.bsl | 164 + .../ОбщегоНазначенияКлиент.mdo | 12 + .../ОбщегоНазначенияКлиентПовтИсп/Module.bsl | 40 + .../ОбщегоНазначенияКлиентПовтИсп.mdo | 11 + .../ОбщегоНазначенияКлиентСервер/Module.bsl | 779 + .../ОбщегоНазначенияКлиентСервер.mdo | 14 + .../Module.bsl | 57 + .../ОбщегоНазначенияПереопределяемый.mdo | 11 + .../Module.bsl | 24 + ...нотекстовыйПоискКлиентПереопределяемый.mdo | 10 + .../ПолнотекстовыйПоискСервер/Module.bsl | 74 + .../ПолнотекстовыйПоискСервер.mdo | 10 + .../ПолучениеФайловИзИнтернета/Module.bsl | 247 + .../ПолучениеФайловИзИнтернета.mdo | 10 + .../Module.bsl | 82 + .../ПолучениеФайловИзИнтернетаКлиент.mdo | 10 + .../Module.bsl | 317 + ...ПолучениеФайловИзИнтернетаКлиентСервер.mdo | 12 + SSL/src/CommonModules/Пользователи/Module.bsl | 1190 ++ .../Пользователи/Пользователи.mdo | 10 + .../Module.bsl | 12 + .../ПользователиКлиентПереопределяемый.mdo | 10 + .../ПользователиПереопределяемый/Module.bsl | 94 + .../ПользователиПереопределяемый.mdo | 9 + .../ПользователиСерверПовтИсп/Module.bsl | 116 + .../ПользователиСерверПовтИсп.mdo | 11 + .../Module.bsl | 168 + .../ПрефиксацияОбъектовКлиентСервер.mdo | 13 + .../ПрефиксацияОбъектовПовтИсп/Module.bsl | 34 + .../ПрефиксацияОбъектовПовтИсп.mdo | 13 + .../ПрефиксацияОбъектовСобытия/Module.bsl | 344 + .../ПрефиксацияОбъектовСобытия.mdo | 12 + .../Module.bsl | 48 + ...каЛегальностиПолученияОбновленияКлиент.mdo | 10 + .../РаботаСКурсамиВалют/Module.bsl | 267 + .../РаботаСКурсамиВалют.mdo | 10 + .../Module.bsl | 70 + .../РаботаСКурсамиВалютКлиентСервер.mdo | 12 + .../РаботаСКурсамиВалютСобытия/Module.bsl | 38 + .../РаботаСКурсамиВалютСобытия.mdo | 12 + .../РаботаСПочтовымиСообщениями/Module.bsl | 94 + .../РаботаСПочтовымиСообщениями.mdo | 10 + .../Module.bsl | 82 + .../РаботаСПочтовымиСообщениямиКлиент.mdo | 11 + .../CommonModules/РаботаСФайлами/Module.bsl | 3376 +++ .../РаботаСФайлами/РаботаСФайлами.mdo | 11 + .../РаботаСФайламиКлиент/Module.bsl | 4047 ++++ .../РаботаСФайламиКлиент.mdo | 12 + .../РаботаСФайламиКлиентПовтИсп/Module.bsl | 42 + .../РаботаСФайламиКлиентПовтИсп.mdo | 11 + .../РаботаСФайламиКлиентСервер/Module.bsl | 194 + .../РаботаСФайламиКлиентСервер.mdo | 12 + .../РаботаСФайламиПереопределяемый/Module.bsl | 31 + .../РаботаСФайламиПереопределяемый.mdo | 10 + .../РаботаСФайламиПовтИсп/Module.bsl | 37 + .../РаботаСФайламиПовтИсп.mdo | 11 + .../РаботаСоСканеромКлиент/Module.bsl | 156 + .../РаботаСоСканеромКлиент.mdo | 10 + .../РегламентныеЗаданияГлобальный/Module.bsl | 62 + .../РегламентныеЗаданияГлобальный.mdo | 12 + .../РегламентныеЗаданияКлиент/Module.bsl | 210 + .../РегламентныеЗаданияКлиент.mdo | 11 + .../РегламентныеЗаданияСервер/Module.bsl | 1287 ++ .../РегламентныеЗаданияСервер.mdo | 11 + SSL/src/CommonModules/СоединенияИБ/Module.bsl | 580 + .../СоединенияИБ/СоединенияИБ.mdo | 10 + .../СоединенияИБГлобальный/Module.bsl | 113 + .../СоединенияИБГлобальный.mdo | 12 + .../СоединенияИБКлиент/Module.bsl | 106 + .../СоединенияИБКлиент/СоединенияИБКлиент.mdo | 11 + .../СоединенияИБКлиентСервер/Module.bsl | 18 + .../СоединенияИБКлиентСервер.mdo | 12 + .../Module.bsl | 6 + .../СтандартныеПодсистемыКлиентПовтИсп.mdo | 11 + .../Module.bsl | 267 + .../СтандартныеПодсистемыПереопределяемый.mdo | 10 + .../СтроковыеФункцииКлиентСервер/Module.bsl | 487 + .../СтроковыеФункцииКлиентСервер.mdo | 12 + .../УправлениеДоступом/Module.bsl | 4310 ++++ .../УправлениеДоступом/УправлениеДоступом.mdo | 10 + .../Module.bsl | 201 + .../УправлениеДоступомПереопределяемый.mdo | 10 + .../Module.bsl | 293 + .../УправлениеДоступомСерверПовтИсп.mdo | 11 + .../УправлениеДоступомСобытия/Module.bsl | 84 + .../УправлениеДоступомСобытия.mdo | 12 + .../Module.bsl | 57 + .../УправлениеИтогамиИАгрегатамиСобытия.mdo | 12 + .../Module.bsl | 450 + .../УправлениеКонтактнойИнформацией.mdo | 10 + .../Module.bsl | 1218 ++ ...ниеКонтактнойИнформациейКлассификаторы.mdo | 10 + .../Module.bsl | 9 + ...тактнойИнформациейКлассификаторыКлиент.mdo | 10 + .../Module.bsl | 154 + .../УправлениеКонтактнойИнформациейКлиент.mdo | 11 + .../Module.bsl | 46 + ...еКонтактнойИнформациейПереопределяемый.mdo | 10 + .../Module.bsl | 28 + ...УправлениеКонтактнойИнформациейСобытия.mdo | 12 + .../УправлениеПечатью/Module.bsl | 320 + .../УправлениеПечатью/УправлениеПечатью.mdo | 10 + .../УправлениеПечатьюMSWordКлиент/Module.bsl | 564 + .../УправлениеПечатьюMSWordКлиент.mdo | 10 + .../Module.bsl | 406 + .../УправлениеПечатьюOOWriterКлиент.mdo | 10 + .../УправлениеПечатьюКлиент/Module.bsl | 626 + .../УправлениеПечатьюКлиент.mdo | 11 + .../Module.bsl | 30 + .../УправлениеПечатьюПереопределяемый.mdo | 10 + .../УправлениеСвойствами/Module.bsl | 891 + .../УправлениеСвойствами.mdo | 10 + .../УправлениеСвойствамиКлиент/Module.bsl | 57 + .../УправлениеСвойствамиКлиент.mdo | 11 + .../Module.bsl | 24 + .../УправлениеСвойствамиПереопределяемый.mdo | 10 + .../CommonModules/ФайловыеФункции/Module.bsl | 140 + .../ФайловыеФункции/ФайловыеФункции.mdo | 10 + .../ФайловыеФункцииКлиент/Module.bsl | 1027 + .../ФайловыеФункцииКлиент.mdo | 12 + .../ФайловыеФункцииКлиентСервер/Module.bsl | 299 + .../ФайловыеФункцииКлиентСервер.mdo | 11 + .../CommonModules/ФизическиеЛица/Module.bsl | 130 + .../ФизическиеЛица/ФизическиеЛица.mdo | 10 + .../CommonModules/ЭлектроннаяПочта/Module.bsl | 838 + .../ЭлектроннаяПочта/ЭлектроннаяПочта.mdo | 10 + .../ЭлектроннаяПочтаКлиент/Module.bsl | 45 + .../ЭлектроннаяПочтаКлиент.mdo | 11 + .../ЭлектронноЦифроваяПодпись/Module.bsl | 391 + .../ЭлектронноЦифроваяПодпись.mdo | 10 + .../Module.bsl | 474 + .../ЭлектронноЦифроваяПодписьКлиент.mdo | 10 + .../Module.bsl | 5 + ...ЭлектронноЦифроваяПодписьКлиентПовтИсп.mdo | 11 + .../CommonPictures/АрхивАнкета/Picture.png | Bin 0 -> 794 bytes .../АрхивАнкета/АрхивАнкета.mdo | 8 + .../CommonPictures/ВидыОпераций/Picture.png | Bin 0 -> 469 bytes .../ВидыОпераций/ВидыОпераций.mdo | 8 + SSL/src/CommonPictures/Внимание/Picture.png | Bin 0 -> 3580 bytes SSL/src/CommonPictures/Внимание/Внимание.mdo | 8 + .../ВыполнитьЗапускОбменаДанными/Picture.png | Bin 0 -> 754 bytes .../ВыполнитьЗапускОбменаДанными.mdo | 12 + .../ДлительнаяОперация48/Picture.gif | Bin 0 -> 4988 bytes .../ДлительнаяОперация48.mdo | 8 + .../ДобавитьДопСвойствоВНабор/Picture.png | Bin 0 -> 540 bytes .../ДобавитьДопСвойствоВНабор.mdo | 8 + .../ДобавитьПростойВопрос/Picture.png | Bin 0 -> 486 bytes .../ДобавитьПростойВопрос.mdo | 8 + .../ДобавитьРазделАнкеты/Picture.png | Bin 0 -> 628 bytes .../ДобавитьРазделАнкеты.mdo | 8 + .../ДобавитьТабличныйВопрос/Picture.png | Bin 0 -> 621 bytes .../ДобавитьТабличныйВопрос.mdo | 8 + .../ДобавитьУсловныйВопрос/Picture.png | Bin 0 -> 584 bytes .../ДобавитьУсловныйВопрос.mdo | 8 + .../ДокументЗаписанКоннекторВерх/Picture.png | Bin 0 -> 429 bytes .../ДокументЗаписанКоннекторВерх.mdo | 8 + .../Picture.png | Bin 0 -> 430 bytes .../ДокументЗаписанКоннекторВерхНиз.mdo | 8 + .../ДокументЗаписанКоннекторЛево/Picture.png | Bin 0 -> 431 bytes .../ДокументЗаписанКоннекторЛево.mdo | 8 + .../Picture.png | Bin 0 -> 439 bytes .../ДокументЗаписанКоннекторЛевоВерх.mdo | 8 + .../Picture.png | Bin 0 -> 438 bytes .../ДокументЗаписанКоннекторЛевоНиз.mdo | 8 + .../ДокументЗаписанКоннекторНиз/Picture.png | Bin 0 -> 431 bytes .../ДокументЗаписанКоннекторНиз.mdo | 8 + .../Picture.png | Bin 0 -> 568 bytes ...ДокументПомеченНаУдалениеКоннекторВерх.mdo | 8 + .../Picture.png | Bin 0 -> 571 bytes ...ументПомеченНаУдалениеКоннекторВерхНиз.mdo | 8 + .../Picture.png | Bin 0 -> 561 bytes ...ДокументПомеченНаУдалениеКоннекторЛево.mdo | 8 + .../Picture.png | Bin 0 -> 567 bytes ...ментПомеченНаУдалениеКоннекторЛевоВерх.mdo | 8 + .../Picture.png | Bin 0 -> 567 bytes ...ументПомеченНаУдалениеКоннекторЛевоНиз.mdo | 8 + .../Picture.png | Bin 0 -> 569 bytes .../ДокументПомеченНаУдалениеКоннекторНиз.mdo | 8 + .../ДокументПроведенКоннекторВерх/Picture.png | Bin 0 -> 574 bytes .../ДокументПроведенКоннекторВерх.mdo | 8 + .../Picture.png | Bin 0 -> 583 bytes .../ДокументПроведенКоннекторВерхНиз.mdo | 8 + .../ДокументПроведенКоннекторЛево/Picture.png | Bin 0 -> 594 bytes .../ДокументПроведенКоннекторЛево.mdo | 8 + .../Picture.png | Bin 0 -> 598 bytes .../ДокументПроведенКоннекторЛевоВерх.mdo | 8 + .../Picture.png | Bin 0 -> 599 bytes .../ДокументПроведенКоннекторЛевоНиз.mdo | 8 + .../ДокументПроведенКоннекторНиз/Picture.png | Bin 0 -> 581 bytes .../ДокументПроведенКоннекторНиз.mdo | 8 + .../Picture.png | Bin 0 -> 1230 bytes .../ДополнительныеРеквизитыСведения.mdo | 8 + .../ДополнительныеСведения/Picture.png | Bin 0 -> 483 bytes .../ДополнительныеСведения.mdo | 8 + .../ЗавершитьРедактированиеМакета/Picture.png | Bin 0 -> 509 bytes .../ЗавершитьРедактированиеМакета.mdo | 8 + .../ЗакрепитьВариантОтчета/Picture.png | Bin 0 -> 635 bytes .../ЗакрепитьВариантОтчета.mdo | 8 + .../Picture.bmp | Bin 0 -> 515256 bytes .../ЗаставкаОбновленияКонфигурации.mdo | 8 + SSL/src/CommonPictures/Зашифрован/Picture.png | Bin 0 -> 342 bytes .../CommonPictures/Зашифрован/Зашифрован.mdo | 8 + .../Picture.ico | Bin 0 -> 1150 bytes .../ЗначокЗаставкиОбновленияКонфигурации.mdo | 8 + .../ИерархическийСписок/Picture.png | Bin 0 -> 431 bytes .../ИерархическийСписок.mdo | 8 + SSL/src/CommonPictures/Информация/Picture.png | Bin 0 -> 831 bytes .../CommonPictures/Информация/Информация.mdo | 8 + .../CommonPictures/Информация32/Picture.png | Bin 0 -> 784 bytes .../Информация32/Информация32.mdo | 8 + .../Picture.png | Bin 0 -> 662 bytes .../ИспользоватьПользовательскийМакет.mdo | 8 + .../ИспользоватьПоставляемыйМакет/Picture.png | Bin 0 -> 503 bytes .../ИспользоватьПоставляемыйМакет.mdo | 8 + .../CommonPictures/ИсторияВерсий/Picture.png | Bin 0 -> 751 bytes .../ИсторияВерсий/ИсторияВерсий.mdo | 8 + .../КартинкаВДеревеСвойств/Picture.png | Bin 0 -> 631 bytes .../КартинкаВДеревеСвойств.mdo | 8 + .../Picture.png | Bin 0 -> 755 bytes .../КартинкаЗакончитьРедактирование.mdo | 8 + .../CommonPictures/КартинкаЗанять/Picture.png | Bin 0 -> 731 bytes .../КартинкаЗанять/КартинкаЗанять.mdo | 8 + .../КартинкаОпубликовать/Picture.png | Bin 0 -> 675 bytes .../КартинкаОпубликовать.mdo | 8 + .../КартинкаОсвободить/Picture.png | Bin 0 -> 751 bytes .../КартинкаОсвободить/КартинкаОсвободить.mdo | 8 + .../КартинкаОткрыть/Picture.png | Bin 0 -> 441 bytes .../КартинкаОткрыть/КартинкаОткрыть.mdo | 8 + .../КартинкаРедактировать/Picture.png | Bin 0 -> 645 bytes .../КартинкаРедактировать.mdo | 8 + .../КартинкаСохранитьКак/Picture.png | Bin 0 -> 649 bytes .../КартинкаСохранитьКак.mdo | 8 + .../Picture.png | Bin 0 -> 589 bytes .../КоллекцияВариантыВажностиЗадачи.mdo | 8 + .../Picture.png | Bin 0 -> 775 bytes .../КоллекцияВидыАктивныхПользователей.mdo | 9 + .../Picture.png | Bin 0 -> 4275 bytes ...КоллекцияВидыСобытийЖурналаРегистрации.mdo | 9 + .../Picture.png | Bin 0 -> 707 bytes ...ллекцияДляПомеченныхНаУдалениеОбъектов.mdo | 9 + .../КоллекцияКартинокДеревоАнкеты/Picture.png | Bin 0 -> 1776 bytes .../КоллекцияКартинокДеревоАнкеты.mdo | 8 + .../Picture.png | Bin 0 -> 941 bytes .../КоллекцияКартинокДоступныеАнкеты.mdo | 8 + .../КоллекцияПиктограммЭлементов/Picture.png | Bin 0 -> 1026 bytes .../КоллекцияПиктограммЭлементов.mdo | 8 + .../КоннекторВерхНиз/Picture.png | Bin 0 -> 110 bytes .../КоннекторВерхНиз/КоннекторВерхНиз.mdo | 8 + .../КоннекторВерхПраво/Picture.png | Bin 0 -> 106 bytes .../КоннекторВерхПраво/КоннекторВерхПраво.mdo | 8 + .../КоннекторВерхПравоНиз/Picture.png | Bin 0 -> 129 bytes .../КоннекторВерхПравоНиз.mdo | 8 + .../КоннекторЛевоНизПраво/Picture.png | Bin 0 -> 129 bytes .../КоннекторЛевоНизПраво.mdo | 8 + .../КоннекторЛевоПраво/Picture.png | Bin 0 -> 130 bytes .../КоннекторЛевоПраво/КоннекторЛевоПраво.mdo | 8 + .../КоннекторПравоНиз/Picture.png | Bin 0 -> 118 bytes .../КоннекторПравоНиз/КоннекторПравоНиз.mdo | 8 + .../КонтактнаяИнформация/Picture.png | Bin 0 -> 3275 bytes .../КонтактнаяИнформация.mdo | 8 + .../Picture.png | Bin 0 -> 882 bytes .../НастройкаОбработкиРегламентныхЗаданий.mdo | 12 + .../Picture.png | Bin 0 -> 827 bytes .../ОбработатьРегламентноеЗаданиеВручную.mdo | 12 + .../Picture.png | Bin 0 -> 681 bytes ...льныйСеансОбработкиРегламентныхЗаданий.mdo | 12 + .../ОткрепитьВариантОтчета/Picture.png | Bin 0 -> 126 bytes .../ОткрепитьВариантОтчета.mdo | 8 + .../CommonPictures/ОткрытьМакет/Picture.png | Bin 0 -> 527 bytes .../ОткрытьМакет/ОткрытьМакет.mdo | 8 + .../ОтменитьРедактированиеМакета/Picture.png | Bin 0 -> 586 bytes .../ОтменитьРедактированиеМакета.mdo | 8 + .../CommonPictures/ОтправитьEmail/Picture.bmp | Bin 0 -> 826 bytes .../ОтправитьEmail/ОтправитьEmail.mdo | 12 + SSL/src/CommonPictures/Ошибка32/Picture.png | Bin 0 -> 2499 bytes SSL/src/CommonPictures/Ошибка32/Ошибка32.mdo | 8 + .../Picture.png | Bin 0 -> 802 bytes .../ОшибкаОбработкиРегламентныхЗаданий.mdo | 12 + SSL/src/CommonPictures/Папка/Picture.png | Bin 0 -> 440 bytes SSL/src/CommonPictures/Папка/Папка.mdo | 8 + SSL/src/CommonPictures/Папки/Picture.png | Bin 0 -> 731 bytes SSL/src/CommonPictures/Папки/Папки.mdo | 8 + .../ПараметрыОбменаДанными/Picture.png | Bin 0 -> 831 bytes .../ПараметрыОбменаДанными.mdo | 8 + .../CommonPictures/Переключатель/Picture.png | Bin 0 -> 735 bytes .../Переключатель/Переключатель.mdo | 8 + .../ПиктограммыПользователя/Picture.png | Bin 0 -> 2009 bytes .../ПиктограммыПользователя.mdo | 8 + .../ПиктограммыПользователя01/Picture.png | Bin 0 -> 607 bytes .../ПиктограммыПользователя01.mdo | 8 + .../ПиктограммыПользователя02/Picture.png | Bin 0 -> 472 bytes .../ПиктограммыПользователя02.mdo | 8 + .../ПиктограммыПользователя03/Picture.png | Bin 0 -> 757 bytes .../ПиктограммыПользователя03.mdo | 8 + .../ПиктограммыПользователя04/Picture.png | Bin 0 -> 667 bytes .../ПиктограммыПользователя04.mdo | 8 + .../ПиктограммыПользователя05/Picture.png | Bin 0 -> 629 bytes .../ПиктограммыПользователя05.mdo | 8 + .../ПиктограммыПользователя06/Picture.png | Bin 0 -> 565 bytes .../ПиктограммыПользователя06.mdo | 8 + .../ПиктограммыПользователя07/Picture.png | Bin 0 -> 593 bytes .../ПиктограммыПользователя07.mdo | 8 + .../ПиктограммыПользователя08/Picture.png | Bin 0 -> 461 bytes .../ПиктограммыПользователя08.mdo | 8 + .../ПиктограммыПользователя09/Picture.png | Bin 0 -> 727 bytes .../ПиктограммыПользователя09.mdo | 8 + .../ПиктограммыПользователя10/Picture.png | Bin 0 -> 645 bytes .../ПиктограммыПользователя10.mdo | 8 + .../ПиктограммыПользователя11/Picture.png | Bin 0 -> 567 bytes .../ПиктограммыПользователя11.mdo | 8 + .../ПиктограммыПользователя12/Picture.png | Bin 0 -> 511 bytes .../ПиктограммыПользователя12.mdo | 8 + .../ПиктограммыФайлов/Picture.png | Bin 0 -> 19265 bytes .../ПиктограммыФайлов/ПиктограммыФайлов.mdo | 8 + SSL/src/CommonPictures/Подписан/Picture.png | Bin 0 -> 477 bytes SSL/src/CommonPictures/Подписан/Подписан.mdo | 8 + .../ПодсистемаАдминистрирование/Picture.png | Bin 0 -> 3378 bytes .../ПодсистемаАдминистрирование.mdo | 8 + .../ПодсистемаАнкетирование/Picture.png | Bin 0 -> 3441 bytes .../ПодсистемаАнкетирование.mdo | 8 + .../Picture.png | Bin 0 -> 3554 bytes .../ПодсистемаБизнесПроцессыИЗадачи.mdo | 8 + .../ПодсистемаОбменДанными/Picture.png | Bin 0 -> 3977 bytes .../ПодсистемаОбменДанными.mdo | 8 + .../ПодсистемаРаботаСФайлами/Picture.png | Bin 0 -> 2569 bytes .../ПодсистемаРаботаСФайлами.mdo | 8 + .../ПодсистемаУправленияДоступом/Picture.png | Bin 0 -> 3854 bytes .../ПодсистемаУправленияДоступом.mdo | 8 + .../ПоказатьТолькоВыбранныеРоли/Picture.png | Bin 0 -> 309 bytes .../ПоказатьТолькоВыбранныеРоли.mdo | 8 + .../ПолнотекстовыйПоискДалее/Picture.png | Bin 0 -> 3691 bytes .../ПолнотекстовыйПоискДалее.mdo | 8 + .../ПолнотекстовыйПоискНазад/Picture.png | Bin 0 -> 3715 bytes .../ПолнотекстовыйПоискНазад.mdo | 8 + .../Picture.png | Bin 0 -> 528 bytes .../ПользователиВыполнитьСинхронизацию.mdo | 8 + .../Picture.png | Bin 0 -> 4043 bytes ...ПревьюТабличногоВопросаОтветыВКолонках.mdo | 8 + .../Picture.png | Bin 0 -> 4004 bytes .../ПревьюТабличногоВопросаОтветыВСтроках.mdo | 8 + .../Picture.png | Bin 0 -> 3584 bytes ...юТабличногоВопросаОтветыСтрокиИКолонки.mdo | 8 + .../Picture.png | Bin 0 -> 3542 bytes .../ПревьюТабличногоВопросаСоставной.mdo | 8 + .../Предупреждение32/Picture.png | Bin 0 -> 1459 bytes .../Предупреждение32/Предупреждение32.mdo | 8 + .../CommonPictures/ПриложитьФайл/Picture.png | Bin 0 -> 505 bytes .../ПриложитьФайл/ПриложитьФайл.mdo | 8 + .../РабочийКаталогПоУмолчанию/Picture.png | Bin 0 -> 617 bytes .../РабочийКаталогПоУмолчанию.mdo | 8 + .../РазорватьСоединение/Picture.png | Bin 0 -> 836 bytes .../РазорватьСоединение.mdo | 8 + .../Picture.png | Bin 0 -> 611 bytes ...зрешитьРедактированиеРеквизитовОбъекта.mdo | 8 + .../РаспространяетсяВИерархии/Picture.png | Bin 0 -> 434 bytes .../РаспространяетсяВИерархии.mdo | 8 + .../РедактироватьМакет/Picture.png | Bin 0 -> 543 bytes .../РедактироватьМакет/РедактироватьМакет.mdo | 8 + .../CommonPictures/Сканирование/Picture.png | Bin 0 -> 351 bytes .../Сканирование/Сканирование.mdo | 8 + .../СостояниеОбменаДанными/Picture.png | Bin 0 -> 2224 bytes .../СостояниеОбменаДанными.mdo | 8 + .../СостояниеОбменаДаннымиОшибка/Picture.png | Bin 0 -> 825 bytes .../СостояниеОбменаДаннымиОшибка.mdo | 8 + .../СостояниеОбменаДаннымиУспех/Picture.png | Bin 0 -> 821 bytes .../СостояниеОбменаДаннымиУспех.mdo | 8 + .../СтатусыСопоставленияОбъектов/Picture.png | Bin 0 -> 1030 bytes .../СтатусыСопоставленияОбъектов.mdo | 8 + .../CommonPictures/ТипыМакетов/Picture.png | Bin 0 -> 2600 bytes .../ТипыМакетов/ТипыМакетов.mdo | 8 + .../УдалитьПользовательскийМакет/Picture.png | Bin 0 -> 512 bytes .../УдалитьПользовательскийМакет.mdo | 8 + .../СтруктураПодчиненности/Template.mxlx | 2370 +++ .../СтруктураПодчиненности.mdo | 8 + SSL/src/Configuration/Configuration.mdo | 662 + SSL/src/Configuration/Logo.png | Bin 0 -> 4363 bytes .../ManagedApplicationModule.bsl | 129 + .../OrdinaryApplicationModule.bsl | 117 + .../Configuration/ParentConfigurations.bin | 1 + SSL/src/Configuration/SessionModule.bsl | 67 + SSL/src/Configuration/Splash.bmp | Bin 0 -> 100816 bytes .../ValueManagerModule.bsl | 0 ...атыПолученияОтчетаПоЖурналуРегистрации.mdo | 25 + .../АлгоритмПодписи/АлгоритмПодписи.mdo | 21 + .../АлгоритмХеширования.mdo | 21 + .../АлгоритмШифрования/АлгоритмШифрования.mdo | 21 + .../ВыполнятьПроверкуЭЦПНаСервере.mdo | 20 + .../ValueManagerModule.bsl | 7 + ...овленияПовторноИспользуемыхЗначенийМРО.mdo | 22 + .../ДатаУведомленияОНовыхЗадачах.mdo | 22 + .../ЗаголовокСистемы/ЗаголовокСистемы.mdo | 25 + .../ЗапретЗагрузкиФайловПоРасширению.mdo | 20 + .../ИзвлекатьТекстыФайловНаСервере.mdo | 21 + .../ИзменятьЗаданияЗаднимЧислом.mdo | 28 + .../ИспользоватьАнкетирование.mdo | 20 + .../ИспользоватьБизнесПроцессыИЗадачи.mdo | 20 + .../ValueManagerModule.bsl | 0 .../ИспользоватьВерсионированиеОбъектов.mdo | 21 + .../ИспользоватьВнешнихПользователей.mdo | 20 + .../ИспользоватьДатуИВремяВСрокахЗадач.mdo | 28 + .../ИспользоватьДатуНачалаЗадач.mdo | 20 + ...зоватьДополнительныеРеквизитыИСведения.mdo | 21 + .../ValueManagerModule.bsl | 7 + .../ИспользоватьОбменДанными.mdo | 21 + .../ИспользоватьПолнотекстовыйПоиск.mdo | 20 + ...тьЭлектронноЦифровыеПодписиИШифрование.mdo | 20 + .../МаксимальныйРазмерФайла.mdo | 26 + .../ValueManagerModule.bsl | 0 .../НастройкаПроксиСервера.mdo | 21 + .../ValueManagerModule.bsl | 54 + .../ОграничиватьДоступНаУровнеЗаписей.mdo | 24 + .../ПараметрыАдминистрированияИБ.mdo | 21 + .../ValueManagerModule.bsl | 7 + ...ксУзлаРаспределеннойИнформационнойБазы.mdo | 23 + .../Constants/ПровайдерЭЦП/ПровайдерЭЦП.mdo | 21 + .../СостояниеОбработкиРегламентныхЗаданий.mdo | 21 + .../СписокЗапрещенныхРасширений.mdo | 21 + .../СтатусОбновленияКонфигурации.mdo | 20 + .../ТипПровайдераЭЦП/ТипПровайдераЭЦП.mdo | 23 + .../ТипХраненияФайлов/ТипХраненияФайлов.mdo | 21 + .../Forms/Форма/Form.form | 375 + .../Forms/Форма/Module.bsl | 139 + .../Help/ru.html | 3 + .../АвтоматическоеИзвлечениеТекстов.mdo | 28 + .../АктивныеПользователи/CommandModule.bsl | 5 + .../Form.form | 1282 ++ .../Help/ru.html | 4 + .../Module.bsl | 235 + .../АктивныеПользователи.mdo | 37 + .../Forms/Форма/Form.form | 562 + .../Forms/Форма/Help/ru.html | 33 + .../Forms/Форма/Module.bsl | 122 + .../ManagerModule.bsl | 0 .../ObjectModule.bsl | 39 + ...окировкаСоединенийСИнформационнойБазой.mdo | 112 + .../Forms/Настройка/Form.form | 931 + .../Forms/Настройка/Module.bsl | 67 + .../Forms/Форма/ConditionalAppearance.dcssca | 23 + .../Forms/Форма/Form.form | 1871 ++ .../Forms/Форма/Module.bsl | 1490 ++ .../ManagerModule.bsl | 0 .../ObjectModule.bsl | 736 + .../Templates/ФильтрРеквизитов/Template.txt | 29 + .../ГрупповоеИзменениеОбъектов.mdo | 350 + .../ЖурналРегистрации/CommandModule.bsl | 5 + .../Forms/ЖурналРегистрации/Form.form | 2527 +++ .../Forms/ЖурналРегистрации/Help/ru.html | 4 + .../Forms/ЖурналРегистрации/Module.bsl | 534 + .../Forms/ОтборЖурналаРегистрации/Form.form | 2305 ++ .../Forms/ОтборЖурналаРегистрации/Module.bsl | 376 + .../Forms/РедакторСоставаСвойства/Form.form | 651 + .../Forms/РедакторСоставаСвойства/Module.bsl | 291 + .../Forms/ФормаСобытия/Form.form | 3021 +++ .../Forms/ФормаСобытия/Help/ru.html | 3 + .../Forms/ФормаСобытия/Module.bsl | 146 + .../ЖурналРегистрации/ManagerModule.bsl | 34 + .../ЖурналРегистрации/ObjectModule.bsl | 0 .../ЖурналРегистрации/ЖурналРегистрации.mdo | 69 + .../ObjectModule.bsl | 588 + .../ЗагрузкаПравилКонвертацииОбъектов.mdo | 12 + .../ManagerModule.bsl | 89 + .../ObjectModule.bsl | 1198 ++ .../ЗагрузкаПравилРегистрацииОбъектов.mdo | 27 + .../Forms/Форма/Form.form | 315 + .../Forms/Форма/Module.bsl | 87 + .../КартаМаршрутаБизнесПроцесса.mdo | 23 + .../ManagerModule.bsl | 0 .../ObjectModule.bsl | 13101 ++++++++++++ .../КонвертацияОбъектовИнформационныхБаз.mdo | 784 + .../ObjectModule.bsl | 218 + ...бъектовРаспределенныхИнформационныхБаз.mdo | 54 + .../КонтрольЖурналаРегистрации/Form.form | 642 + .../КонтрольЖурналаРегистрации/Help/ru.html | 7 + .../КонтрольЖурналаРегистрации/Module.bsl | 78 + .../Form.form | 180 + .../Help/ru.html | 6 + .../Module.bsl | 62 + .../ManagerModule.bsl | 315 + .../ObjectModule.bsl | 0 .../Template.mxlx | 435 + .../КонтрольЖурналаРегистрации.mdo | 49 + .../КурсыВалютРБК/Forms/Форма/Form.form | 765 + .../КурсыВалютРБК/Forms/Форма/Help/ru.html | 7 + .../КурсыВалютРБК/Forms/Форма/Module.bsl | 243 + .../DataProcessors/КурсыВалютРБК/Help/ru.html | 1 + .../КурсыВалютРБК/ManagerModule.bsl | 0 .../КурсыВалютРБК/ObjectModule.bsl | 30 + .../КурсыВалютРБК/КурсыВалютРБК.mdo | 197 + .../Form.form | 296 + .../Module.bsl | 28 + .../Template.htmldoc | 4 + .../УсловияРаспространенияОбновлений/ru.html | 11 + .../ЛегальностьПолученияОбновлений.mdo | 31 + .../Forms/НастройкаРасписания/Form.form | 385 + .../Forms/НастройкаРасписания/Module.bsl | 116 + .../Forms/НастройкаРезервнойКопии/Form.form | 909 + .../Forms/НастройкаРезервнойКопии/Module.bsl | 88 + .../Forms/Обозреватель/Form.form | 404 + .../Forms/Обозреватель/Module.bsl | 39 + .../Forms/ПредупреждениеWMI/Form.form | 283 + .../Forms/ПредупреждениеWMI/Module.bsl | 5 + .../Forms/Форма/Form.form | 12327 +++++++++++ .../Forms/Форма/Module.bsl | 2893 +++ .../ОбновлениеКонфигурации/Help/ru.html | 29 + .../ОбновлениеКонфигурации/ManagerModule.bsl | 7 + .../ОбновлениеКонфигурации/ObjectModule.bsl | 1 + .../Template.txt | 58 + .../Template.txt | 215 + .../Template.txt | 669 + .../Template.txt | 93 + .../ОбновлениеКонфигурации.mdo | 758 + .../ПолнотекстовыйПоиск/CommandModule.bsl | 11 + .../Forms/УпрощеннаяФорма/Form.form | 217 + .../Forms/УпрощеннаяФорма/Module.bsl | 35 + .../Forms/ФормаПоиска/Form.form | 784 + .../Forms/ФормаПоиска/Module.bsl | 435 + .../ПолнотекстовыйПоискВДанных/Help/ru.html | 26 + .../ПолнотекстовыйПоискВДанных.mdo | 47 + .../Forms/Форма/Form.form | 6200 ++++++ .../Picture.png | Bin 0 -> 38037 bytes .../Picture.png | Bin 0 -> 21975 bytes .../Picture.png | Bin 0 -> 34832 bytes .../Picture.png | Bin 0 -> 20556 bytes .../Items/КартинкаФайлаНастроек/Picture.png | Bin 0 -> 8288 bytes .../КартинкаФайлаСообщенияОбмена/Picture.png | Bin 0 -> 9971 bytes .../Форма/Items/КомандаДалее/Picture.png | Bin 0 -> 460 bytes .../Форма/Items/КомандаДалее1/Picture.png | Bin 0 -> 460 bytes .../Форма/Items/КомандаДалее11/Picture.png | Bin 0 -> 460 bytes .../Форма/Items/КомандаНазад/Picture.png | Bin 0 -> 386 bytes .../Форма/Items/КомандаНазад1/Picture.png | Bin 0 -> 386 bytes .../Форма/Items/КомандаНазад2/Picture.png | Bin 0 -> 386 bytes .../Форма/Items/КомандаНазад3/Picture.png | Bin 0 -> 386 bytes .../Форма/Items/ПустаяКартинка/Picture.png | Bin 0 -> 75 bytes .../Форма/Items/ПустаяКартинка1/Picture.png | Bin 0 -> 75 bytes .../Forms/Форма/Module.bsl | 1439 ++ .../Help/ru.html | 12 + .../ObjectModule.bsl | 654 + .../ПомощникСозданияОбменаДанными.mdo | 411 + .../Forms/Форма/Form.form | 3987 ++++ .../Форма/Items/КомандаДалее1/Picture.png | Bin 0 -> 460 bytes .../Форма/Items/КомандаДалее2/Picture.png | Bin 0 -> 460 bytes .../Форма/Items/КомандаДалее3/Picture.png | Bin 0 -> 460 bytes .../Форма/Items/КомандаНазад/Picture.png | Bin 0 -> 386 bytes .../Форма/Items/КомандаНазад1/Picture.png | Bin 0 -> 386 bytes .../Форма/Items/КомандаНазад2/Picture.png | Bin 0 -> 386 bytes .../Форма/Items/КомандаНазад3/Picture.png | Bin 0 -> 386 bytes .../Forms/Форма/Module.bsl | 1271 ++ .../Help/ru.html | 5 + .../ObjectModule.bsl | 386 + ...СопоставленияОбъектовИнформационныхБаз.mdo | 330 + .../CommandModule.bsl | 5 + .../Form.form | 525 + .../Help/ru.html | 37 + .../Module.bsl | 98 + .../ОбработкаРегламентныхЗаданий/Form.form | 195 + .../ОбработкаРегламентныхЗаданий/Module.bsl | 76 + .../Form.form | 149 + .../Forms/РегламентноеЗадание/Form.form | 1173 ++ .../Forms/РегламентноеЗадание/Help/ru.html | 29 + .../Forms/РегламентноеЗадание/Module.bsl | 171 + .../РегламентныеИФоновыеЗадания/Form.form | 3374 +++ .../РегламентныеИФоновыеЗадания/Help/ru.html | 44 + .../РегламентныеИФоновыеЗадания/Module.bsl | 570 + .../Forms/ФоновоеЗадание/Form.form | 906 + .../Forms/ФоновоеЗадание/Help/ru.html | 30 + .../Forms/ФоновоеЗадание/Module.bsl | 22 + .../ManagerModule.bsl | 1 + .../ObjectModule.bsl | 1 + .../РегламентныеИФоновыеЗадания.mdo | 98 + .../Form.form | 388 + .../Module.bsl | 34 + .../Forms/НастройкаПолейТаблицы/Form.form | 388 + .../Forms/НастройкаПолейТаблицы/Module.bsl | 33 + .../Form.form | 493 + .../Module.bsl | 54 + .../Forms/НастройкаСортировки/Form.form | 507 + .../Forms/НастройкаСортировки/Module.bsl | 21 + .../Form.form | 963 + .../Module.bsl | 161 + .../Forms/Форма/Form.form | 2143 ++ .../Forms/Форма/Module.bsl | 938 + .../ФормаВыбораСвязиСопоставления/Form.form | 649 + .../ФормаВыбораСвязиСопоставления/Module.bsl | 104 + .../ManagerModule.bsl | 0 .../ObjectModule.bsl | 1379 ++ ...СопоставлениеОбъектовИнформационныхБаз.mdo | 589 + .../ExtInfo/ListSettings.dcss | 27 + .../Forms/АрхивАнкет/Form.form | 435 + .../Forms/АрхивАнкет/Module.bsl | 65 + .../СписокРеспондента/Forms/Форма/Form.form | 438 + .../СписокРеспондента/Forms/Форма/Module.bsl | 316 + .../СписокРеспондента/СписокРеспондента.mdo | 44 + .../ObjectModule.bsl | 615 + .../ТранспортСообщенийОбменаEMAIL.mdo | 86 + .../ObjectModule.bsl | 565 + .../ТранспортСообщенийОбменаFILE.mdo | 63 + .../ManagerModule.bsl | 0 .../ObjectModule.bsl | 655 + .../ТранспортСообщенийОбменаFTP.mdo | 139 + .../Forms/ОсновнаяФорма/Form.form | 1378 ++ .../Forms/ОсновнаяФорма/Module.bsl | 430 + .../УдалениеПомеченныхОбъектов/Help/ru.html | 6 + .../ManagerModule.bsl | 130 + .../ObjectModule.bsl | 0 .../УдалениеПомеченныхОбъектов.mdo | 34 + .../Forms/Форма/Form.oform | Bin 0 -> 213234 bytes .../Form.oform | Bin 0 -> 40903 bytes .../Form.oform | Bin 0 -> 8806 bytes .../ФормаСообщенияОбОбычномРежиме/Form.form | 137 + .../УниверсальныйОбменДаннымиXML/Help/ru.html | 49 + .../ObjectModule.bsl | 13924 ++++++++++++ .../ОбщиеПроцедурыФункции/Template.txt | 652 + .../ПараметрыОбработчиков/Template.mxlx | 5893 ++++++ .../УниверсальныйОбменДаннымиXML.mdo | 957 + .../ConditionalAppearance.dcssca | 182 + .../Forms/ОсновнаяФорма/Form.form | 4527 ++++ .../Forms/ОсновнаяФорма/Help/ru.html | 44 + .../Forms/ОсновнаяФорма/Module.bsl | 1200 ++ .../Forms/ФормаВыбораПериода/Form.form | 269 + .../Forms/ФормаВыбораПериода/Help/ru.html | 9 + .../Forms/ФормаВыбораПериода/Module.bsl | 32 + .../ФормаПараметровПерестроения/Form.form | 274 + .../ФормаПараметровПерестроения/Help/ru.html | 7 + .../ФормаПараметровПерестроения/Module.bsl | 21 + .../УправлениеИтогамиИАгрегатами.mdo | 56 + .../Forms/Форма/Form.form | 792 + .../Forms/Форма/Module.bsl | 197 + .../ObjectModule.bsl | 205 + .../УправлениеНастройкамиФорм.mdo | 23 + .../Forms/Форма/ConditionalAppearance.dcssca | 23 + .../Forms/Форма/Form.form | 342 + .../Forms/Форма/Module.bsl | 58 + .../Help/ru.html | 8 + .../УправлениеПолнотекстовымПоиском.mdo | 33 + .../Анкета/Forms/ФормаДокумента/Form.form | 2835 +++ .../Анкета/Forms/ФормаДокумента/Help/ru.html | 20 + .../Анкета/Forms/ФормаДокумента/Module.bsl | 1329 ++ .../Список/ExtInfo/ListSettings.dcss | 15 + .../Анкета/Forms/ФормаСписка/Form.form | 374 + .../Анкета/Forms/ФормаСписка/Module.bsl | 11 + SSL/src/Documents/Анкета/ObjectModule.bsl | 48 + SSL/src/Documents/Анкета/Анкета.mdo | 266 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаВыбора/Form.form | 335 + .../Forms/ФормаДокумента/Form.form | 977 + .../Forms/ФормаДокумента/Module.bsl | 169 + .../Респонденты/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаПодбораРеспондентов/Form.form | 965 + .../Forms/ФормаПодбораРеспондентов/Module.bsl | 53 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 406 + .../НазначениеОпросов/НазначениеОпросов.mdo | 296 + .../ВариантыSMTPАутентификации.mdo | 59 + .../ВариантыВажностиЗадачи.mdo | 52 + .../ВариантыВерсионированияОбъектов.mdo | 52 + ...ликацииДополнительныхОтчетовИОбработок.mdo | 53 + .../ВерсииПодсистемыОбменаДанными.mdo | 52 + .../ВидыДополнительныхОтчетовИОбработок.mdo | 74 + .../ВидыПравилДляОбменаДанными.mdo | 46 + .../ВидыТранспортаСообщенийОбмена.mdo | 52 + .../ДействияПриОбмене/ДействияПриОбмене.mdo | 45 + .../ДействияПриСохраненииСЭЦП.mdo | 45 + .../ДействияСФайламиПоДвойномуЩелчку.mdo | 45 + .../ИсточникиПравилДляОбменаДанными.mdo | 46 + .../ПоворотИзображения/ПоворотИзображения.mdo | 59 + .../ПолФизическогоЛица/ПолФизическогоЛица.mdo | 45 + .../ПриоритетыОбъектовОбмена.mdo | 52 + SSL/src/Enums/РазмерыБумаги/РазмерыБумаги.mdo | 122 + .../РазрешенияСканированногоИзображения.mdo | 59 + .../РезультатыВыполненияОбмена.mdo | 66 + .../СпособыPOP3Аутентификации.mdo | 52 + .../СпособыSMTPАутентификации.mdo | 66 + .../СпособыВызоваДополнительныхОбработок.mdo | 53 + .../СпособыСравненияВерсийФайлов.mdo | 46 + .../СтатусыИзвлеченияТекстаФайлов.mdo | 52 + .../ТипыВариантовОтчетов.mdo | 54 + .../ТипыВопросовШаблонаАнкеты.mdo | 53 + .../ТипыКонтактнойИнформации.mdo | 73 + .../ТипыОтветовНаВопрос.mdo | 95 + .../ТипыТабличныхВопросов.mdo | 60 + .../ТипыТекстовЭлектронныхПисем.mdo | 60 + .../ТипыХраненияФайлов/ТипыХраненияФайлов.mdo | 45 + .../ФорматыСканированногоИзображения.mdo | 66 + .../ЦветностиИзображения.mdo | 52 + .../ЗаписатьВСписокБизнесПроцессов.mdo | 13 + .../ЗаписатьГруппыИВидыДоступа.mdo | 16 + ...ЗаписатьЗависимыеНаборыЗначенийДоступа.mdo | 13 + .../ЗаписатьНаборыЗначенийДоступа.mdo | 13 + .../ЗаполнитьКонтактнуюИнформацию.mdo | 13 + ...бменДаннымиПередЗаписьюУзлаПланаОбмена.mdo | 13 + ...енДаннымиПередУдалениемУзлаПланаОбмена.mdo | 13 + ...овитьПредставлениеВнешнегоПользователя.mdo | 13 + .../УстановитьПометкуУдаленияЗадач.mdo | 13 + .../СвязанныеДокументы/СвязанныеДокументы.mdo | 18 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../ФайлыВТоме/Forms/ФормаСписка/Form.form | 370 + .../FilterCriteria/ФайлыВТоме/ФайлыВТоме.mdo | 27 + ...овленияПовторноИспользуемыхЗначенийМРО.mdo | 10 + .../ВариантыВерсионированияОбъектов.mdo | 9 + .../ИзменятьЗаданияЗаднимЧислом.mdo | 11 + .../ИспользоватьАнкетирование.mdo | 20 + .../ИспользоватьБизнесПроцессыИЗадачи.mdo | 33 + .../ИспользоватьВерсионированиеОбъекта.mdo | 11 + .../ИспользоватьВерсионированиеОбъектов.mdo | 14 + .../ИспользоватьВнешнихПользователей.mdo | 14 + .../ИспользоватьДатуИВремяВСрокахЗадач.mdo | 11 + .../ИспользоватьДатуНачалаЗадач.mdo | 11 + ...льныеОтчетыИОбработкиЗаполненияОбъекта.mdo | 10 + ...тьДополнительныеОтчетыИОбработкиОтчеты.mdo | 10 + ...нительныеОтчетыИОбработкиПечатныеФормы.mdo | 10 + ...етыИОбработкиСозданиеСвязанныхОбъектов.mdo | 10 + ...зоватьДополнительныеРеквизитыИСведения.mdo | 17 + .../ИспользоватьОбменДанными.mdo | 38 + .../ИспользоватьПолнотекстовыйПоиск.mdo | 13 + ...тьЭлектронноЦифровыеПодписиИШифрование.mdo | 21 + .../ОграничиватьДоступНаУровнеЗаписей.mdo | 28 + .../ПрефиксИнформационнойБазы.mdo | 11 + .../ПрефиксыОрганизаций.mdo | 10 + .../Организация/Организация.mdo | 9 + .../ТипОбъектаКонфигурации.mdo | 10 + ...мыСДополнительнымиОтчетамиИОбработками.mdo | 9 + .../АдресныеСокращения/АдресныеСокращения.mdo | 154 + .../Form.form | 422 + .../Help/ru.html | 1 + .../Module.bsl | 58 + .../Список/ExtInfo/ListSettings.dcss | 19 + .../Forms/ФормаВыбора/Form.form | 428 + .../Forms/ФормаВыбора/Module.bsl | 69 + .../Form.form | 1672 ++ .../Help/ru.html | 11 + .../Module.bsl | 625 + .../Form.form | 653 + .../Help/ru.html | 7 + .../Module.bsl | 146 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 1136 + .../Forms/ФормаСписка/Help/ru.html | 21 + .../Forms/ФормаСписка/Module.bsl | 29 + .../АдресныйКлассификатор/Help/ru.html | 2 + .../Template.txt | 92 + .../АдресныйКлассификатор.mdo | 423 + .../Forms/ВыборХранимыхВерсий/Form.form | 967 + .../Forms/ВыборХранимыхВерсий/Module.bsl | 129 + .../Forms/ФормаЗаписи/Form.form | 245 + .../Forms/ФормаЗаписи/Module.bsl | 5 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 435 + .../Forms/ФормаСписка/Module.bsl | 37 + .../ВерсииОбъектов/ВерсииОбъектов.mdo | 197 + .../ВерсииОбъектовАдресногоКлассификатора.mdo | 134 + .../ВерсииПодсистем/ВерсииПодсистем.mdo | 97 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 680 + .../ГруппыЗначенийДоступа/RecordSetModule.bsl | 0 .../ГруппыЗначенийДоступа.mdo | 190 + .../CommandModule.bsl | 8 + .../Список/ExtInfo/ListSettings.dcss | 19 + .../Forms/ДокументыФизическогоЛица/Form.form | 390 + .../Forms/ДокументыФизическогоЛица/Module.bsl | 38 + .../Forms/ФормаЗаписи/Form.form | 517 + .../Forms/ФормаЗаписи/Module.bsl | 21 + .../Список/ExtInfo/ListSettings.dcss | 19 + .../Forms/ФормаСписка/Form.form | 296 + .../Forms/ФормаСписка/Module.bsl | 1 + .../ДокументыФизическихЛиц/Help/ru.html | 6 + .../ДокументыФизическихЛиц/ManagerModule.bsl | 95 + .../RecordSetModule.bsl | 88 + .../ДокументыФизическихЛиц.mdo | 330 + .../ДополнительныеСведения/Help/ru.html | 3 + .../ДополнительныеСведения.mdo | 130 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 476 + .../RecordSetModule.bsl | 49 + .../ЗависимостиПравДоступа.mdo | 206 + .../ЗначенияГруппДоступа.mdo | 125 + .../CommandModule.bsl | 10 + .../Forms/АдресацияПоОбъекту/Form.form | 608 + .../Forms/АдресацияПоОбъекту/Help/ru.html | 6 + .../Forms/АдресацияПоОбъекту/Module.bsl | 108 + .../Forms/АдресацияПоОбъектуИРоли/Form.form | 476 + .../АдресацияПоОбъектуИРоли/Help/ru.html | 6 + .../Forms/АдресацияПоОбъектуИРоли/Module.bsl | 50 + .../Forms/ФормаЗаписи/Form.form | 217 + .../Forms/ФормаЗаписи/Module.bsl | 68 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 372 + .../Forms/ФормаСписка/Module.bsl | 7 + .../ИсполнителиЗадач/Help/ru.html | 34 + .../ИсполнителиЗадач/ManagerModule.bsl | 0 .../ИсполнителиЗадач/RecordSetModule.bsl | 61 + .../ИсполнителиЗадач/ИсполнителиЗадач.mdo | 223 + .../КалендарныеГрафики/КалендарныеГрафики.mdo | 162 + .../КурсыВалют/Forms/ФормаЗаписи/Form.form | 205 + .../КурсыВалют/Forms/ФормаЗаписи/Module.bsl | 5 + .../КурсыВалют/RecordSetModule.bsl | 61 + .../КурсыВалют/КурсыВалют.mdo | 157 + .../Forms/ФормаЗаписи/Form.form | 878 + .../Forms/ФормаЗаписи/Module.bsl | 57 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 841 + .../НаборыЗначенийДоступа/RecordSetModule.bsl | 35 + .../НаборыЗначенийДоступа.mdo | 399 + .../НазначениеДополнительныхОбработок.mdo | 153 + .../Form.form | 1135 + .../Help/ru.html | 5 + .../Module.bsl | 340 + .../ManagerModule.bsl | 0 .../RecordSetModule.bsl | 9 + .../НастройкаВерсионированияОбъектов.mdo | 137 + .../Forms/ФормаЗаписи/Form.form | 1175 ++ .../Forms/ФормаЗаписи/Module.bsl | 145 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 232 + .../НастройкиТранспортаОбмена/Help/ru.html | 7 + .../ManagerModule.bsl | 207 + .../RecordSetModule.bsl | 13 + .../НастройкиТранспортаОбмена.mdo | 373 + .../НомераСканированныхФайлов.mdo | 88 + .../ОтветыНаВопросыАнкет.mdo | 152 + .../ВыбораРежимаОткрытияМакета/Form.form | 403 + .../ВыбораРежимаОткрытияМакета/Help/ru.html | 10 + .../ВыбораРежимаОткрытияМакета/Module.bsl | 47 + .../Forms/ДиалогПовтораПечати/Form.form | 245 + .../Forms/ДиалогПовтораПечати/Module.bsl | 24 + .../ConditionalAppearance.dcssca | 23 + .../Forms/МакетыПечатныхФорм/Form.form | 1154 + .../Forms/МакетыПечатныхФорм/Module.bsl | 910 + .../НастройкаКаталогаФайловПечати/Form.form | 198 + .../НастройкаКаталогаФайловПечати/Module.bsl | 32 + .../ПользовательскиеМакетыПечати.mdo | 174 + ...овательскиеНастройкиДоступаКОбработкам.mdo | 124 + .../RecordSetModule.bsl | 0 .../ПраваПоЗначениямДоступа.mdo | 288 + .../Forms/ФормаЗаписи/Form.form | 765 + .../Forms/ФормаЗаписи/Module.bsl | 189 + .../Список/ExtInfo/ListSettings.dcss | 20 + .../Forms/ФормаСписка/Form.form | 733 + .../Forms/ФормаСписка/Module.bsl | 69 + .../ПравилаДляОбменаДанными/ManagerModule.bsl | 331 + .../RecordSetModule.bsl | 28 + .../ПравилаДляОбменаДанными.mdo | 257 + .../ПутиМодулейКриптографииСерверовЛинукс.mdo | 106 + .../РабочиеКаталогиФайлов/RecordSetModule.bsl | 41 + .../РабочиеКаталогиФайлов.mdo | 107 + .../Forms/ФормаЗаписи/Form.form | 362 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 439 + .../ManagerModule.bsl | 15 + .../RecordSetModule.bsl | 27 + .../СоответствиеОбъектовИнформационныхБаз.mdo | 179 + .../СоставГруппПользователей.mdo | 94 + .../Forms/ФормаЗаписи/Form.form | 282 + .../Forms/ФормаЗаписи/Module.bsl | 1 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 369 + .../СостояниеОбменовДанными/ManagerModule.bsl | 140 + .../RecordSetModule.bsl | 7 + .../СостояниеОбменовДанными.mdo | 152 + .../Forms/ФормаЗаписи/Form.form | 163 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 297 + .../ManagerModule.bsl | 7 + .../RecordSetModule.bsl | 7 + .../СостояниеУспешныхОбменовДанными.mdo | 120 + .../МоиБизнесПроцессы/CommandModule.bsl | 10 + .../Список/ExtInfo/ListSettings.dcss | 53 + .../Forms/МоиБизнесПроцессы/Form.form | 604 + .../Forms/МоиБизнесПроцессы/Help/ru.html | 3 + .../Forms/МоиБизнесПроцессы/Module.bsl | 72 + .../Список/ExtInfo/ListSettings.dcss | 44 + .../Forms/ФормаСписка/Form.form | 581 + .../Forms/ФормаСписка/Module.bsl | 33 + .../СписокБизнесПроцессов/ManagerModule.bsl | 0 .../СписокБизнесПроцессов/RecordSetModule.bsl | 0 .../СписокБизнесПроцессов.mdo | 254 + .../ТаблицыГруппДоступа.mdo | 201 + .../Список/ExtInfo/ListSettings.dcss | 15 + .../Forms/ФормаСписка/Form.form | 525 + .../ФайлыВРабочемКаталоге.mdo | 199 + .../Forms/РасшифровкаПростыхОтветов/Form.form | 294 + .../РасшифровкаПростыхОтветов/Module.bsl | 101 + .../РасшифровкаТабличныхВопросов/Form.form | 292 + .../РасшифровкаТабличныхВопросов/Module.bsl | 386 + .../АнализОпроса/Forms/ФормаОтчета/Form.form | 363 + .../АнализОпроса/Forms/ФормаОтчета/Module.bsl | 74 + SSL/src/Reports/АнализОпроса/ObjectModule.bsl | 1100 + .../Templates/МакетОтветившие/Template.mxlx | 970 + .../Templates/МакетОтветы/Template.mxlx | 697 + .../Templates/ПростыеВопросы/Template.dcs | 259 + SSL/src/Reports/АнализОпроса/АнализОпроса.mdo | 63 + .../Template.dcs | 2243 ++ .../АнкетированиеАналитическийОтчет.mdo | 22 + .../Задачи/Forms/ФормаОтчета/Form.form | 710 + .../Задачи/Forms/ФормаОтчета/Module.bsl | 9 + SSL/src/Reports/Задачи/Help/ru.html | 12 + SSL/src/Reports/Задачи/ManagerModule.bsl | 0 SSL/src/Reports/Задачи/ObjectModule.bsl | 0 .../Template.dcs | 395 + SSL/src/Reports/Задачи/Задачи.mdo | 38 + .../ОтчетПоБизнесПроцессам/ManagerModule.bsl | 0 .../Templates/Макет/Template.dcs | 467 + .../ОтчетПоБизнесПроцессам.mdo | 27 + .../Forms/ФормаОтчета/Form.form | 151 + .../Forms/ФормаОтчета/Module.bsl | 67 + .../Reports/ОтчетПоВерсиям/ManagerModule.bsl | 0 .../Reports/ОтчетПоВерсиям/ObjectModule.bsl | 2618 +++ .../Template.mxlx | 839 + .../Reports/ОтчетПоВерсиям/ОтчетПоВерсиям.mdo | 46 + .../Reports/ОтчетПоЗаданиям/ManagerModule.bsl | 0 .../Templates/Макет/Template.dcs | 912 + .../ОтчетПоЗаданиям/ОтчетПоЗаданиям.mdo | 27 + .../Forms/ФормаОтчета/Form.form | 710 + .../Forms/ФормаОтчета/Module.bsl | 9 + .../Reports/СписокЗависшихЗадач/Help/ru.html | 8 + .../СписокЗависшихЗадач/ManagerModule.bsl | 0 .../СписокЗависшихЗадач/ObjectModule.bsl | 0 .../Template.dcs | 667 + .../СписокЗависшихЗадач.mdo | 38 + .../Forms/ФормаОтчета/Form.form | 710 + .../Forms/ФормаОтчета/Module.bsl | 9 + .../СписокИстекающихЗадач/Help/ru.html | 3 + .../СписокИстекающихЗадач/ManagerModule.bsl | 0 .../СписокИстекающихЗадач/ObjectModule.bsl | 0 .../Template.dcs | 173 + .../СписокИстекающихЗадач.mdo | 39 + .../Forms/ФормаОтчета/Form.form | 710 + .../Forms/ФормаОтчета/Module.bsl | 9 + .../СписокПросроченныхЗадач/Help/ru.html | 3 + .../СписокПросроченныхЗадач/ManagerModule.bsl | 0 .../СписокПросроченныхЗадач/ObjectModule.bsl | 0 .../Template.dcs | 250 + .../СписокПросроченныхЗадач.mdo | 39 + .../Forms/ФормаОтчета/Form.form | 710 + .../Forms/ФормаОтчета/Module.bsl | 9 + .../Help/ru.html | 3 + .../ManagerModule.bsl | 0 .../ObjectModule.bsl | 0 .../Template.dcs | 341 + .../СправкаОбИсполнительскойДисциплине.mdo | 39 + SSL/src/Roles/Администрирование/Rights.rights | 57 + .../Администрирование/Администрирование.mdo | 8 + SSL/src/Roles/БазовыеПрава/Rights.rights | 7969 +++++++ SSL/src/Roles/БазовыеПрава/БазовыеПрава.mdo | 9 + .../Rights.rights | 45 + .../ВыводНаПринтерФайлБуферОбмена.mdo | 8 + .../ВыполнениеОбменовДанными/Rights.rights | 1445 ++ .../ВыполнениеОбменовДанными.mdo | 8 + .../Rights.rights | 3168 +++ .../ДобавлениеИзменениеБазовойНСИ.mdo | 8 + .../Rights.rights | 49 + .../ДобавлениеИзменениеВариантовОтчетов.mdo | 8 + .../Rights.rights | 365 + ...обавлениеИзменениеВнешнихПользователей.mdo | 8 + .../Rights.rights | 379 + ...менениеДополнительныхОтчетовИОбработок.mdo | 8 + .../ДобавлениеИзменениеЗаданий/Rights.rights | 16433 +++++++++++++++ .../ДобавлениеИзменениеЗаданий.mdo | 8 + .../Rights.rights | 2026 ++ .../ДобавлениеИзменениеОбменовДанными.mdo | 8 + .../ДобавлениеИзменениеОпросов/Rights.rights | 361 + .../ДобавлениеИзменениеОпросов.mdo | 8 + .../Rights.rights | 360 + ...бавлениеИзменениеОтветовНаВопросыАнкет.mdo | 8 + .../Rights.rights | 346 + ...менениеПерсональныхДанныхФизическихЛиц.mdo | 8 + .../Rights.rights | 17473 ++++++++++++++++ ...ниеИзменениеПользователейИГруппДоступа.mdo | 8 + .../Rights.rights | 495 + .../ДобавлениеИзменениеРолейИсполнителей.mdo | 8 + .../Rights.rights | 133 + .../ДобавлениеИзменениеФизическихЛиц.mdo | 8 + .../Rights.rights | 851 + .../ДобавлениеИзменениеШаблоновАнкет.mdo | 8 + SSL/src/Roles/ЗапускAutomation/Rights.rights | 45 + .../ЗапускAutomation/ЗапускAutomation.mdo | 8 + SSL/src/Roles/ЗапускВебКлиента/Rights.rights | 45 + .../ЗапускВебКлиента/ЗапускВебКлиента.mdo | 8 + .../ЗапускВнешнегоСоединения/Rights.rights | 45 + .../ЗапускВнешнегоСоединения.mdo | 8 + .../Roles/ЗапускТолстогоКлиента/Rights.rights | 45 + .../ЗапускТолстогоКлиента.mdo | 8 + .../Roles/ЗапускТонкогоКлиента/Rights.rights | 45 + .../ЗапускТонкогоКлиента.mdo | 8 + .../ИзменениеВыполнениеЗадач/Rights.rights | 16354 +++++++++++++++ .../ИзменениеВыполнениеЗадач.mdo | 8 + .../Rights.rights | 3916 ++++ .../ИзменениеДополнительныхСведений.mdo | 8 + .../Rights.rights | 120 + .../ИзменениеМакетовПечатныхФорм.mdo | 8 + .../Rights.rights | 219 + .../ИзменениеТекущегоВнешнегоПользователя.mdo | 8 + .../Rights.rights | 290 + .../ИзменениеТекущегоПользователя.mdo | 8 + .../Rights.rights | 49 + ...тивноеОткрытиеВнешнихОтчетовИОбработок.mdo | 8 + .../Rights.rights | 69 + ...зованиеДополнительныхОтчетовИОбработок.mdo | 8 + .../Rights.rights | 4002 ++++ ...ьзованиеУчетныхЗаписейЭлектроннойПочты.mdo | 8 + .../Rights.rights | 45 + .../ОбновлениеКонфигурацииБазыДанных.mdo | 8 + SSL/src/Roles/ПолныеПрава/Rights.rights | 793 + SSL/src/Roles/ПолныеПрава/ПолныеПрава.mdo | 8 + .../Rights.rights | 556 + ...роверкаДоступныхОбновленийКонфигурации.mdo | 8 + .../ПросмотрЖурналаРегистрации/Rights.rights | 63 + .../ПросмотрЖурналаРегистрации.mdo | 8 + .../Rights.rights | 6 + .../РедактированиеРеквизитовОбъектов.mdo | 8 + SSL/src/Roles/ЧтениеБазовойНСИ/Rights.rights | 1145 + .../ЧтениеБазовойНСИ/ЧтениеБазовойНСИ.mdo | 8 + .../ЧтениеВнешнихПользователей/Rights.rights | 197 + .../ЧтениеВнешнихПользователей.mdo | 8 + .../Rights.rights | 3698 ++++ .../ЧтениеДополнительныхСведений.mdo | 8 + SSL/src/Roles/ЧтениеЗаданий/Rights.rights | 16229 ++++++++++++++ SSL/src/Roles/ЧтениеЗаданий/ЧтениеЗаданий.mdo | 8 + SSL/src/Roles/ЧтениеЗадач/Rights.rights | 16220 ++++++++++++++ SSL/src/Roles/ЧтениеЗадач/ЧтениеЗадач.mdo | 8 + .../ЧтениеОтветовНаВопросыАнкет/Rights.rights | 826 + .../ЧтениеОтветовНаВопросыАнкет.mdo | 8 + .../Rights.rights | 214 + .../ЧтениеПерсональныхДанныхФизическихЛиц.mdo | 8 + .../Roles/ЧтениеФизическихЛиц/Rights.rights | 91 + .../ЧтениеФизическихЛиц.mdo | 8 + .../ВыполнениеОбменаДанными/Schedule.schedule | 22 + .../ВыполнениеОбменаДанными.mdo | 14 + .../ЗагрузкаКурсовВалют/Schedule.schedule | 22 + .../ЗагрузкаКурсовВалют.mdo | 13 + .../Schedule.schedule | 22 + .../ЗаполнениеДанныхДляОграниченияДоступа.mdo | 13 + .../ЗапускДополнительныхОбработок.mdo | 14 + .../ИзвлечениеТекста/Schedule.schedule | 22 + .../ИзвлечениеТекста/ИзвлечениеТекста.mdo | 13 + .../Schedule.schedule | 24 + .../КонтрольЖурналаРегистрации.mdo | 14 + .../МониторингЗадач/Schedule.schedule | 22 + .../МониторингЗадач/МониторингЗадач.mdo | 12 + .../ОбновлениеАгрегатов.mdo | 13 + .../ОбновлениеИндексаППД/Schedule.schedule | 22 + .../ОбновлениеИндексаППД.mdo | 13 + .../ПерестроениеАгрегатов.mdo | 13 + .../СлияниеИндексаППД/Schedule.schedule | 22 + .../СлияниеИндексаППД/СлияниеИндексаППД.mdo | 13 + .../Schedule.schedule | 22 + .../УведомлениеИсполнителейОНовыхЗадачах.mdo | 13 + .../УстановкаПериодаРассчитанныхИтогов.mdo | 12 + .../ВидыДоступаБезГруппЗначенияДоступа.mdo | 11 + .../ВидыДоступаБезОграничения.mdo | 11 + ...тупаЕдинственныеДляТипаЗначенияДоступа.mdo | 11 + ...идыДоступаЧерезПраваПоЗначениямДоступа.mdo | 15 + ...овленияПовторноИспользуемыхЗначенийМРО.mdo | 13 + .../ИспользуемыеПланыОбмена.mdo | 12 + .../ОбменДаннымиВключен.mdo | 12 + .../ОграничиватьДоступПоВиду.mdo | 14 + ...ичиватьДоступПоВидуВнешниеПользователи.mdo | 14 + ...ватьДоступПоВидуДополнительныеСведения.mdo | 14 + .../ОграничиватьДоступПоВидуОбъект.mdo | 14 + .../ОграничиватьДоступПоВидуПользователи.mdo | 14 + ...граничиватьДоступПоВидуПравоДобавления.mdo | 14 + ...ОграничиватьДоступПоВидуПравоИзменения.mdo | 14 + .../ОграничиватьДоступПоВидуПравоЧтения.mdo | 14 + .../ОграничиватьДоступПоВидуУсловие.mdo | 14 + ...тупПоВидуУчетныеЗаписиЭлектроннойПочты.mdo | 14 + .../ПравилаВыборочнойРегистрацииОбъектов.mdo | 11 + .../ПравилаРегистрацииОбъектов.mdo | 12 + ...агатьУстановкуРасширенияРаботыСФайлами.mdo | 11 + .../ПутьКРабочемуКаталогуПользователя.mdo | 12 + .../ТекущийВнешнийПользователь.mdo | 11 + .../ТекущийПользователь.mdo | 11 + .../ConditionalAppearance.dcssca | 28 + .../Forms/ФормаЗагрузки/Form.form | 815 + .../Forms/ФормаЗагрузки/Help/ru.html | 13 + .../Forms/ФормаЗагрузки/Module.bsl | 93 + .../ConditionalAppearance.dcssca | 48 + .../Forms/ФормаСохранения/Form.form | 2001 ++ .../Forms/ФормаСохранения/Help/ru.html | 9 + .../Forms/ФормаСохранения/Module.bsl | 700 + .../ManagerModule.bsl | 113 + .../ХранилищеВариантовОтчетов.mdo | 41 + .../ВыполненнаяЗадача/ВыполненнаяЗадача.mdo | 13 + .../ЗавершенныйБизнесПроцесс.mdo | 13 + .../НеСтартованныйБизнесПроцесс.mdo | 13 + .../ПользовательВыбранный.mdo | 13 + .../ПоясняющийОшибкуТекст.mdo | 13 + .../ПоясняющийТекст/ПоясняющийТекст.mdo | 16 + .../ПросроченнаяЗадача/ПросроченнаяЗадача.mdo | 13 + .../РольБезИсполнителей.mdo | 14 + .../УдаленныйДополнительныйРеквизитЦвет.mdo | 13 + .../УдаленныйДополнительныйРеквизитШрифт.mdo | 18 + .../ФайлЗанятыйДругимПользователем.mdo | 13 + .../ФайлЗанятыйТекущимПользователем.mdo | 13 + .../АдресныйКлассификатор.mdo | 15 + .../Анкетирование/CommandInterface.cmi | 9 + .../Анкетирование/Анкетирование.mdo | 44 + .../БазоваяФункциональность.mdo | 53 + .../CommandInterface.cmi | 11 + .../БизнесПроцессыИЗадачи.mdo | 55 + .../Subsystems/Валюты/Валюты.mdo | 16 + .../ВариантыОтчетов/ВариантыОтчетов.mdo | 23 + .../ВерсионированиеОбъектов.mdo | 18 + .../ДополнительныеОтчетыИОбработки.mdo | 28 + .../CommandInterface.cmi | 9 + .../ЗавершениеРаботыПользователей.mdo | 17 + ...ЗапретРедактированияРеквизитовОбъектов.mdo | 14 + .../КалендарныеГрафики/КалендарныеГрафики.mdo | 13 + .../КонтактнаяИнформация.mdo | 24 + ...ольДинамическогоОбновленияКонфигурации.mdo | 12 + .../КонтрольЖурналаРегистрации.mdo | 13 + .../НастройкаПорядкаЭлементов.mdo | 12 + .../Subsystems/ОбменДанными/ОбменДанными.mdo | 74 + .../ОбновлениеВерсииИБ/ОбновлениеВерсииИБ.mdo | 15 + .../ОбновлениеКонфигурации.mdo | 22 + .../Subsystems/Организации/Организации.mdo | 10 + .../Subsystems/Печать/Печать.mdo | 29 + .../ПолнотекстовыйПоиск.mdo | 18 + .../ПолучениеФайловИзИнтернета.mdo | 15 + .../Subsystems/Пользователи/Пользователи.mdo | 46 + .../ПрефиксацияОбъектов.mdo | 12 + ...ПроверкаЛегальностиПолученияОбновления.mdo | 12 + .../РаботаСПочтовымиСообщениями.mdo | 23 + .../РаботаСФайлами/РаботаСФайлами.mdo | 86 + .../РегламентныеЗадания.mdo | 18 + .../Subsystems/Свойства/Свойства.mdo | 27 + .../СтруктураПодчиненности.mdo | 37 + .../УправлениеДоступом/УправлениеДоступом.mdo | 51 + .../УправлениеИтогамиИАгрегатами.mdo | 14 + .../ФизическиеЛица/ФизическиеЛица.mdo | 18 + .../СтандартныеПодсистемы.mdo | 42 + .../Commands/ВсеЗадачи/CommandModule.bsl | 11 + .../Commands/Выполнено/CommandModule.bsl | 20 + .../Commands/МоиЗадачи/CommandModule.bsl | 11 + .../Commands/Перенаправить/CommandModule.bsl | 7 + .../Forms/Дополнительно/Form.form | 787 + .../Forms/Дополнительно/Help/ru.html | 5 + .../Forms/Дополнительно/Module.bsl | 10 + .../Список/ExtInfo/ListSettings.dcss | 30 + .../Forms/ЗадачиПоБизнесПроцессу/Form.form | 509 + .../Forms/ЗадачиПоБизнесПроцессу/Module.bsl | 62 + .../Список/ExtInfo/ListSettings.dcss | 32 + .../Forms/ЗадачиПоПредмету/Form.form | 465 + .../Forms/ЗадачиПоПредмету/Module.bsl | 52 + .../Список/ExtInfo/ListSettings.dcss | 35 + .../Forms/МоиЗадачи/Form.form | 1059 + .../Forms/МоиЗадачи/Module.bsl | 136 + .../Список/ExtInfo/ListSettings.dcss | 35 + .../Forms/МоиЗадачиДляРабочегоСтола/Form.form | 1169 ++ .../МоиЗадачиДляРабочегоСтола/Module.bsl | 99 + .../Forms/ПеренаправитьЗадачи/Form.form | 886 + .../Forms/ПеренаправитьЗадачи/Help/ru.html | 6 + .../Forms/ПеренаправитьЗадачи/Module.bsl | 201 + .../Forms/ФормаЗадачи/Form.form | 1309 ++ .../Forms/ФормаЗадачи/Module.bsl | 85 + .../Список/ExtInfo/ListSettings.dcss | 21 + .../Forms/ФормаСписка/Form.form | 1320 ++ .../Forms/ФормаСписка/Module.bsl | 140 + SSL/src/Tasks/ЗадачаИсполнителя/Help/ru.html | 5 + .../Tasks/ЗадачаИсполнителя/ManagerModule.bsl | 0 .../Tasks/ЗадачаИсполнителя/ObjectModule.bsl | 110 + .../ЗадачаИсполнителя/ЗадачаИсполнителя.mdo | 607 + 1873 files changed, 540113 insertions(+) create mode 100644 SSL/.project create mode 100644 SSL/.settings/org.eclipse.core.resources.prefs create mode 100644 SSL/DT-INF/PROJECT.PMF create mode 100644 SSL/src/BusinessProcesses/Задание/Flowchart.scheme create mode 100644 SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form create mode 100644 SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Module.bsl create mode 100644 SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form create mode 100644 SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl create mode 100644 SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form create mode 100644 SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl create mode 100644 SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/BusinessProcesses/Задание/Help/ru.html create mode 100644 SSL/src/BusinessProcesses/Задание/ManagerModule.bsl create mode 100644 SSL/src/BusinessProcesses/Задание/ObjectModule.bsl create mode 100644 SSL/src/BusinessProcesses/Задание/Задание.mdo create mode 100644 SSL/src/Catalogs/Валюты/Forms/ФормаПодбораВалютИзОКВ/Form.form create mode 100644 SSL/src/Catalogs/Валюты/Forms/ФормаПодбораВалютИзОКВ/Module.bsl create mode 100644 SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Help/ru.html create mode 100644 SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/Валюты/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/Валюты/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt create mode 100644 SSL/src/Catalogs/Валюты/Валюты.mdo create mode 100644 SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Form.form create mode 100644 SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Module.bsl create mode 100644 SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/ВариантыОтветовАнкет/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ВариантыОтветовАнкет/ВариантыОтветовАнкет.mdo create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/НастройкаГруппировкиПоРазделам/ConditionalAppearance.dcssca create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/НастройкаГруппировкиПоРазделам/Form.form create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/НастройкаГруппировкиПоРазделам/Module.bsl create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/ПереместитьВариантВРаздел/Form.form create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/ПереместитьВариантВРаздел/Module.bsl create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеВидимости/Form.form create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеВидимости/Module.bsl create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеПодсистемы/ConditionalAppearance.dcssca create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеПодсистемы/Form.form create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеПодсистемы/Module.bsl create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/СкопироватьВариантВРаздел/Form.form create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/СкопироватьВариантВРаздел/Module.bsl create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Help/ru.html create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/ConditionalAppearance.dcssca create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Help/ru.html create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Help/ru.html create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/ВариантыОтчетов.mdo create mode 100644 SSL/src/Catalogs/ВерсииФайлов/Commands/ОткрытьВерсииФайла/CommandModule.bsl create mode 100644 SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Form.form create mode 100644 SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбораСпособаСравненияВерсий/Form.form create mode 100644 SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбораСпособаСравненияВерсий/Module.bsl create mode 100644 SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Form.form create mode 100644 SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Module.bsl create mode 100644 SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/ВерсииФайлов/Help/ru.html create mode 100644 SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo create mode 100644 SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Help/ru.html create mode 100644 SSL/src/Catalogs/ВидыДокументовФизическихЛиц/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/ВидыДокументовФизическихЛиц/ВидыДокументовФизическихЛиц.mdo create mode 100644 SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Form.form create mode 100644 SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаГруппы/Form.form create mode 100644 SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/ВидыКонтактнойИнформации/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo create mode 100644 SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Attributes/ВнешниеПользователиСписок/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Attributes/ГруппыВнешнихПользователей/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/ВнешниеПользователи/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ВнешниеПользователи/ВнешниеПользователи.mdo create mode 100644 SSL/src/Catalogs/ВопросыШаблонаАнкеты/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ВопросыШаблонаАнкеты/ВопросыШаблонаАнкеты.mdo create mode 100644 SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/ГруппыВнешнихПользователей/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ГруппыВнешнихПользователей/ГруппыВнешнихПользователей.mdo create mode 100644 SSL/src/Catalogs/ГруппыДоступа/Forms/ОбновлениеДанныхОграниченияДоступа/Form.form create mode 100644 SSL/src/Catalogs/ГруппыДоступа/Forms/ОбновлениеДанныхОграниченияДоступа/Module.bsl create mode 100644 SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Help/ru.html create mode 100644 SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/ConditionalAppearance.dcssca create mode 100644 SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Help/ru.html create mode 100644 SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/ГруппыДоступа/Help/ru.html create mode 100644 SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/ГруппыДоступа/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ГруппыДоступа/ГруппыДоступа.mdo create mode 100644 SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/ГруппыИсполнителейЗадач/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ГруппыИсполнителейЗадач/ГруппыИсполнителейЗадач.mdo create mode 100644 SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Help/ru.html create mode 100644 SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/ГруппыПользователей/Help/ru.html create mode 100644 SSL/src/Catalogs/ГруппыПользователей/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/ГруппыПользователей/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ГруппыПользователей/ГруппыПользователей.mdo create mode 100644 SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form create mode 100644 SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Module.bsl create mode 100644 SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Form.form create mode 100644 SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Module.bsl create mode 100644 SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Help/ru.html create mode 100644 SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo create mode 100644 SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбора/Form.form create mode 100644 SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбора/Module.bsl create mode 100644 SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбораГруппы/Form.form create mode 100644 SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/ЗначенияСвойствОбъектов/Help/ru.html create mode 100644 SSL/src/Catalogs/ЗначенияСвойствОбъектов/ЗначенияСвойствОбъектов.mdo create mode 100644 SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/Календари/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/Календари/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/Календари/Календари.mdo create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/Attributes/ДеревоСвойств/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/ConditionalAppearance.dcssca create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/Form.form create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/Module.bsl create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Form.form create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаГруппы/Form.form create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаГруппы/Module.bsl create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Help/ru.html create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/НаборыДополнительныхРеквизитовИСведений.mdo create mode 100644 SSL/src/Catalogs/НазначенияСертификатовЭЦП/Templates/НазначенияСертификатов/Template.txt create mode 100644 SSL/src/Catalogs/НазначенияСертификатовЭЦП/НазначенияСертификатовЭЦП.mdo create mode 100644 SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/Организации/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/Организации/Организации.mdo create mode 100644 SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Form.form create mode 100644 SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Module.bsl create mode 100644 SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/ПапкиФайлов/Help/ru.html create mode 100644 SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ПапкиФайлов/ПапкиФайлов.mdo create mode 100644 SSL/src/Catalogs/Пользователи/Commands/ПользователиИБ/CommandModule.bsl create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/ConditionalAppearance.dcssca create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Form.form create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Help/ru.html create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Module.bsl create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Form.form create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Help/ru.html create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Module.bsl create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораРолей/Form.form create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораРолей/Help/ru.html create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораРолей/Module.bsl create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ПользователиСписок/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Help/ru.html create mode 100644 SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/Пользователи/Help/ru.html create mode 100644 SSL/src/Catalogs/Пользователи/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/Пользователи/Пользователи.mdo create mode 100644 SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбора/Form.form create mode 100644 SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Help/ru.html create mode 100644 SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/ConditionalAppearance.dcssca create mode 100644 SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/ПрофилиГруппДоступа/Help/ru.html create mode 100644 SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo create mode 100644 SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Form.form create mode 100644 SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/РолиИсполнителей/Help/ru.html create mode 100644 SSL/src/Catalogs/РолиИсполнителей/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/РолиИсполнителей/РолиИсполнителей.mdo create mode 100644 SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/СтраныМира/Templates/Классификатор/Template.txt create mode 100644 SSL/src/Catalogs/СтраныМира/СтраныМира.mdo create mode 100644 SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Form.form create mode 100644 SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl create mode 100644 SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/СценарииОбменовДанными/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/СценарииОбменовДанными/СценарииОбменовДанными.mdo create mode 100644 SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html create mode 100644 SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html create mode 100644 SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ТомаХраненияФайлов/ТомаХраненияФайлов.mdo create mode 100644 SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Commands/ПроверкаУчетнойЗаписи/CommandModule.bsl create mode 100644 SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Form.form create mode 100644 SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Help/ru.html create mode 100644 SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Module.bsl create mode 100644 SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html create mode 100644 SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Help/ru.html create mode 100644 SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo create mode 100644 SSL/src/Catalogs/Файлы/Commands/ВсеФайлы/CommandModule.bsl create mode 100644 SSL/src/Catalogs/Файлы/Commands/ЗанятыеФайлы/CommandModule.bsl create mode 100644 SSL/src/Catalogs/Файлы/Commands/ПапкиФайлов/CommandModule.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ВРабочемКаталогеБолееНовыйФайл/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ВРабочемКаталогеБолееНовыйФайл/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ВводПароляСОписаниями/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ВводПароляСОписаниями/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ВводПароляСОписаниями/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ВыборСертификатаЭЦПДляШифрования/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ВыборСертификатаЭЦПДляШифрования/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ВыборСертификатаЭЦПДляШифрования/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ВыборУстройстваСканирования/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ВыборУстройстваСканирования/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/РазмерФайлаВРабочемКаталогеОтличается/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/РазмерФайлаВРабочемКаталогеОтличается/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Attributes/СписокФайлов/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/РезультатСканирования/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/РезультатСканирования/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Attributes/СписокФайлов/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/СписокФайловВЛокальномКэшеФайлов/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/СписокФайловВЛокальномКэшеФайлов/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/СписокФайловВЛокальномКэшеФайлов/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФайлСуществует/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФайлСуществует/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВопросаИмпорта/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВопросаИмпорта/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВопросаИмпорта/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВопросаОбУстановкеРасширенияРаботыСФайлами/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВопросаОбУстановкеРасширенияРаботыСФайлами/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Группы/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/ConditionalAppearance.dcssca create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПутиКАрхивуФайловТомов/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПутиКАрхивуФайловТомов/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаГруповаяОперацияНаПапке/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаГруповаяОперацияНаПапке/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/ConditionalAppearance.dcssca create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПриРедактировании/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПриРедактировании/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаНового/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаНового/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаНового/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаОтчетаОСохранении/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаОтчетаОСохранении/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Группы/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаШифрования/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаШифрования/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаШифрования/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/ConditionalAppearance.dcssca create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Папки/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Form.form create mode 100644 SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Module.bsl create mode 100644 SSL/src/Catalogs/Файлы/Help/ru.html create mode 100644 SSL/src/Catalogs/Файлы/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/Файлы/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/Файлы/Templates/МакетОтчета/Template.mxlx create mode 100644 SSL/src/Catalogs/Файлы/Файлы.mdo create mode 100644 SSL/src/Catalogs/ФизическиеЛица/Help/ru.html create mode 100644 SSL/src/Catalogs/ФизическиеЛица/ФизическиеЛица.mdo create mode 100644 SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form create mode 100644 SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Help/ru.html create mode 100644 SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl create mode 100644 SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form create mode 100644 SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Module.bsl create mode 100644 SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/ConditionalAppearance.dcssca create mode 100644 SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/Catalogs/ШаблоныАнкет/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ШаблоныАнкет/ШаблоныАнкет.mdo create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Form.form create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Module.bsl create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ManagerModule.bsl create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ObjectModule.bsl create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ВидыДоступа.mdo create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Form.form create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Module.bsl create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Attributes/ВариантыОтветов/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ObjectModule.bsl create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ВопросыДляАнкетирования.mdo create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаГруппы/Form.form create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаГруппы/Module.bsl create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаПоискаСсылокНаПВХ/Form.form create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаПоискаСсылокНаПВХ/Module.bsl create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаРедактированияСпискаНаборов/Form.form create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаРедактированияСпискаНаборов/Module.bsl create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Help/ru.html create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ДополнительныеРеквизитыИСведения.mdo create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаЭлемента/Form.form create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Help/ru.html create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ObjectModule.bsl create mode 100644 SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ОбъектыАдресацииЗадач.mdo create mode 100644 SSL/src/CommandGroups/ВыполнениеОбменаДанными/ВыполнениеОбменаДанными.mdo create mode 100644 SSL/src/CommandGroups/ПараметрыОбменаДанными/ПараметрыОбменаДанными.mdo create mode 100644 SSL/src/CommandGroups/Печать/Печать.mdo create mode 100644 SSL/src/CommonCommands/ВнешнийПользовательОбъектаАвторизации/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ВнешнийПользовательОбъектаАвторизации/ВнешнийПользовательОбъектаАвторизации.mdo create mode 100644 SSL/src/CommonCommands/ВыполнитьОбменДанными/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ВыполнитьОбменДанными/ВыполнитьОбменДанными.mdo create mode 100644 SSL/src/CommonCommands/ВыполнитьОбменДаннымиИнтерактивно/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ВыполнитьОбменДаннымиИнтерактивно/ВыполнитьОбменДаннымиИнтерактивно.mdo create mode 100644 SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта.mdo create mode 100644 SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиОтчеты/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиОтчеты/ДополнительныеОтчетыИОбработкиОтчеты.mdo create mode 100644 SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиПечатныеФормы/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиПечатныеФормы/ДополнительныеОтчетыИОбработкиПечатныеФормы.mdo create mode 100644 SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов.mdo create mode 100644 SSL/src/CommonCommands/ДополнительныеСведения/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ДополнительныеСведения/ДополнительныеСведения.mdo create mode 100644 SSL/src/CommonCommands/ЗадачиПоБизнесПроцессу/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ЗадачиПоБизнесПроцессу/ЗадачиПоБизнесПроцессу.mdo create mode 100644 SSL/src/CommonCommands/ЗадачиПоПредмету/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ЗадачиПоПредмету/ЗадачиПоПредмету.mdo create mode 100644 SSL/src/CommonCommands/ИсторияИзменений/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ИсторияИзменений/ИсторияИзменений.mdo create mode 100644 SSL/src/CommonCommands/КартаМаршрутаБизнесПроцесса/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/КартаМаршрутаБизнесПроцесса/КартаМаршрутаБизнесПроцесса.mdo create mode 100644 SSL/src/CommonCommands/НастроитьПараметрыТранспортаСообщенийОбмена/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/НастроитьПараметрыТранспортаСообщенийОбмена/НастроитьПараметрыТранспортаСообщенийОбмена.mdo create mode 100644 SSL/src/CommonCommands/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты.mdo create mode 100644 SSL/src/CommonCommands/ОбменДаннымиРазместитьФайлыВТомах/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ОбменДаннымиРазместитьФайлыВТомах/ОбменДаннымиРазместитьФайлыВТомах.mdo create mode 100644 SSL/src/CommonCommands/ОткрытьПравилаКонвертацииОбъектов/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ОткрытьПравилаКонвертацииОбъектов/ОткрытьПравилаКонвертацииОбъектов.mdo create mode 100644 SSL/src/CommonCommands/ОткрытьПравилаРегистрацииОбъектов/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ОткрытьПравилаРегистрацииОбъектов/ОткрытьПравилаРегистрацииОбъектов.mdo create mode 100644 SSL/src/CommonCommands/ОткрытьСценарииОбменовДанными/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ОткрытьСценарииОбменовДанными/ОткрытьСценарииОбменовДанными.mdo create mode 100644 SSL/src/CommonCommands/ОткрытьФормуУправленияОбменамиДанных/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ОткрытьФормуУправленияОбменамиДанных/ОткрытьФормуУправленияОбменамиДанных.mdo create mode 100644 SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных/ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных.mdo create mode 100644 SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных/ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных.mdo create mode 100644 SSL/src/CommonCommands/ПерсональнаяНастройкаПроксиСервера/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ПерсональнаяНастройкаПроксиСервера/ПерсональнаяНастройкаПроксиСервера.mdo create mode 100644 SSL/src/CommonCommands/ПраваВнешнегоПользователяПоЗначениямДоступа/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ПраваВнешнегоПользователяПоЗначениямДоступа/ПраваВнешнегоПользователяПоЗначениямДоступа.mdo create mode 100644 SSL/src/CommonCommands/ПраваПоЗначениюДоступа/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ПраваПоЗначениюДоступа/ПраваПоЗначениюДоступа.mdo create mode 100644 SSL/src/CommonCommands/ПраваПользователяПоЗначениямДоступа/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ПраваПользователяПоЗначениямДоступа/ПраваПользователяПоЗначениямДоступа.mdo create mode 100644 SSL/src/CommonCommands/ПрисоединенныеФайлы/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/ПрисоединенныеФайлы/ПрисоединенныеФайлы.mdo create mode 100644 SSL/src/CommonCommands/РедактированиеМакетовПечатныхФорм/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/РедактированиеМакетовПечатныхФорм/РедактированиеМакетовПечатныхФорм.mdo create mode 100644 SSL/src/CommonCommands/РолеваяАдресацияПоОбъекту/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/РолеваяАдресацияПоОбъекту/РолеваяАдресацияПоОбъекту.mdo create mode 100644 SSL/src/CommonCommands/СозданиеНачальногоОбразаСФайлами/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/СозданиеНачальногоОбразаСФайлами/СозданиеНачальногоОбразаСФайлами.mdo create mode 100644 SSL/src/CommonCommands/СписокРеспондента/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/СписокРеспондента/СписокРеспондента.mdo create mode 100644 SSL/src/CommonCommands/СтруктураПодчиненности/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/СтруктураПодчиненности/СтруктураПодчиненности.mdo create mode 100644 SSL/src/CommonCommands/УстановитьРасширениеРаботыСФайлами/CommandModule.bsl create mode 100644 SSL/src/CommonCommands/УстановитьРасширениеРаботыСФайлами/УстановитьРасширениеРаботыСФайлами.mdo create mode 100644 SSL/src/CommonForms/ВводАдреса/Form.form create mode 100644 SSL/src/CommonForms/ВводАдреса/Module.bsl create mode 100644 SSL/src/CommonForms/ВводАдреса/ВводАдреса.mdo create mode 100644 SSL/src/CommonForms/ВводТелефона/Form.form create mode 100644 SSL/src/CommonForms/ВводТелефона/Module.bsl create mode 100644 SSL/src/CommonForms/ВводТелефона/ВводТелефона.mdo create mode 100644 SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Form.form create mode 100644 SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Module.bsl create mode 100644 SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/ВопросОбУстановкеРасширенияРаботыСФайлами.mdo create mode 100644 SSL/src/CommonForms/ВсеОтчеты/ConditionalAppearance.dcssca create mode 100644 SSL/src/CommonForms/ВсеОтчеты/Form.form create mode 100644 SSL/src/CommonForms/ВсеОтчеты/Help/ru.html create mode 100644 SSL/src/CommonForms/ВсеОтчеты/Module.bsl create mode 100644 SSL/src/CommonForms/ВсеОтчеты/ВсеОтчеты.mdo create mode 100644 SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form create mode 100644 SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl create mode 100644 SSL/src/CommonForms/ВыборОбъектовМетаданных/ВыборОбъектовМетаданных.mdo create mode 100644 SSL/src/CommonForms/ВыборСертификатаЭЦПДляПодписи/Form.form create mode 100644 SSL/src/CommonForms/ВыборСертификатаЭЦПДляПодписи/Help/ru.html create mode 100644 SSL/src/CommonForms/ВыборСертификатаЭЦПДляПодписи/Module.bsl create mode 100644 SSL/src/CommonForms/ВыборСертификатаЭЦПДляПодписи/ВыборСертификатаЭЦПДляПодписи.mdo create mode 100644 SSL/src/CommonForms/ВыполнениеОбменаДанными/Form.form create mode 100644 SSL/src/CommonForms/ВыполнениеОбменаДанными/Help/ru.html create mode 100644 SSL/src/CommonForms/ВыполнениеОбменаДанными/Module.bsl create mode 100644 SSL/src/CommonForms/ВыполнениеОбменаДанными/ВыполнениеОбменаДанными.mdo create mode 100644 SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form create mode 100644 SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Module.bsl create mode 100644 SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo create mode 100644 SSL/src/CommonForms/МастерАнкетыПоРазделам/ConditionalAppearance.dcssca create mode 100644 SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form create mode 100644 SSL/src/CommonForms/МастерАнкетыПоРазделам/Module.bsl create mode 100644 SSL/src/CommonForms/МастерАнкетыПоРазделам/МастерАнкетыПоРазделам.mdo create mode 100644 SSL/src/CommonForms/НастройкаЛокальногоКэшаФайлов/Form.form create mode 100644 SSL/src/CommonForms/НастройкаЛокальногоКэшаФайлов/Help/ru.html create mode 100644 SSL/src/CommonForms/НастройкаЛокальногоКэшаФайлов/Module.bsl create mode 100644 SSL/src/CommonForms/НастройкаЛокальногоКэшаФайлов/НастройкаЛокальногоКэшаФайлов.mdo create mode 100644 SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form create mode 100644 SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Module.bsl create mode 100644 SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/НастройкаМоихОтчетовИОбработок.mdo create mode 100644 SSL/src/CommonForms/НастройкаПечатныхФормПередОтправкой/Form.form create mode 100644 SSL/src/CommonForms/НастройкаПечатныхФормПередОтправкой/Module.bsl create mode 100644 SSL/src/CommonForms/НастройкаПечатныхФормПередОтправкой/НастройкаПечатныхФормПередОтправкой.mdo create mode 100644 SSL/src/CommonForms/НастройкиЭЦП/Form.form create mode 100644 SSL/src/CommonForms/НастройкиЭЦП/Help/ru.html create mode 100644 SSL/src/CommonForms/НастройкиЭЦП/Module.bsl create mode 100644 SSL/src/CommonForms/НастройкиЭЦП/НастройкиЭЦП.mdo create mode 100644 SSL/src/CommonForms/ОписаниеИзмененийСистемы/Form.form create mode 100644 SSL/src/CommonForms/ОписаниеИзмененийСистемы/Help/ru.html create mode 100644 SSL/src/CommonForms/ОписаниеИзмененийСистемы/Module.bsl create mode 100644 SSL/src/CommonForms/ОписаниеИзмененийСистемы/ОписаниеИзмененийСистемы.mdo create mode 100644 SSL/src/CommonForms/ПанельОтчетов/Form.form create mode 100644 SSL/src/CommonForms/ПанельОтчетов/Module.bsl create mode 100644 SSL/src/CommonForms/ПанельОтчетов/ПанельОтчетов.mdo create mode 100644 SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Form.form create mode 100644 SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Module.bsl create mode 100644 SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/ПараметрыАдминистрированияСервернойИБ.mdo create mode 100644 SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form create mode 100644 SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl create mode 100644 SSL/src/CommonForms/ПараметрыПроксиСервера/ПараметрыПроксиСервера.mdo create mode 100644 SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Form.form create mode 100644 SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Help/ru.html create mode 100644 SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Module.bsl create mode 100644 SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/ПерсональныеНастройкиЭЦП.mdo create mode 100644 SSL/src/CommonForms/ПечатьДокументов/Form.form create mode 100644 SSL/src/CommonForms/ПечатьДокументов/Module.bsl create mode 100644 SSL/src/CommonForms/ПечатьДокументов/ПечатьДокументов.mdo create mode 100644 SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Form.form create mode 100644 SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Help/ru.html create mode 100644 SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Module.bsl create mode 100644 SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/ПодтверждениеПароляУчетнойЗаписи.mdo create mode 100644 SSL/src/CommonForms/ПоискПоИндексу/Form.form create mode 100644 SSL/src/CommonForms/ПоискПоИндексу/Module.bsl create mode 100644 SSL/src/CommonForms/ПоискПоИндексу/ПоискПоИндексу.mdo create mode 100644 SSL/src/CommonForms/ПраваПоЗначениямДоступа/ConditionalAppearance.dcssca create mode 100644 SSL/src/CommonForms/ПраваПоЗначениямДоступа/Form.form create mode 100644 SSL/src/CommonForms/ПраваПоЗначениямДоступа/Module.bsl create mode 100644 SSL/src/CommonForms/ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo create mode 100644 SSL/src/CommonForms/РедактированиеЗначенийСвойств/Form.form create mode 100644 SSL/src/CommonForms/РедактированиеЗначенийСвойств/Module.bsl create mode 100644 SSL/src/CommonForms/РедактированиеЗначенийСвойств/РедактированиеЗначенийСвойств.mdo create mode 100644 SSL/src/CommonForms/РедактированиеНовогоПисьма/Form.form create mode 100644 SSL/src/CommonForms/РедактированиеНовогоПисьма/Help/ru.html create mode 100644 SSL/src/CommonForms/РедактированиеНовогоПисьма/Module.bsl create mode 100644 SSL/src/CommonForms/РедактированиеНовогоПисьма/РедактированиеНовогоПисьма.mdo create mode 100644 SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form create mode 100644 SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl create mode 100644 SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/СозданиеНачальногоОбразаСФайлами.mdo create mode 100644 SSL/src/CommonForms/СтруктураПодчиненности/ConditionalAppearance.dcssca create mode 100644 SSL/src/CommonForms/СтруктураПодчиненности/Form.form create mode 100644 SSL/src/CommonForms/СтруктураПодчиненности/Help/ru.html create mode 100644 SSL/src/CommonForms/СтруктураПодчиненности/Module.bsl create mode 100644 SSL/src/CommonForms/СтруктураПодчиненности/СтруктураПодчиненности.mdo create mode 100644 SSL/src/CommonForms/УправлениеОбменамиДанных/Form.form create mode 100644 SSL/src/CommonForms/УправлениеОбменамиДанных/Help/ru.html create mode 100644 SSL/src/CommonForms/УправлениеОбменамиДанных/Module.bsl create mode 100644 SSL/src/CommonForms/УправлениеОбменамиДанных/УправлениеОбменамиДанных.mdo create mode 100644 SSL/src/CommonForms/ФормаСертификатаЭЦП/Form.form create mode 100644 SSL/src/CommonForms/ФормаСертификатаЭЦП/Help/ru.html create mode 100644 SSL/src/CommonForms/ФормаСертификатаЭЦП/Module.bsl create mode 100644 SSL/src/CommonForms/ФормаСертификатаЭЦП/ФормаСертификатаЭЦП.mdo create mode 100644 SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl create mode 100644 SSL/src/CommonModules/АдресныйКлассификатор/АдресныйКлассификатор.mdo create mode 100644 SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/АдресныйКлассификаторКлиент/АдресныйКлассификаторКлиент.mdo create mode 100644 SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl create mode 100644 SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/АдресныйКлассификаторКлиентСервер.mdo create mode 100644 SSL/src/CommonModules/Анкетирование/Module.bsl create mode 100644 SSL/src/CommonModules/Анкетирование/Анкетирование.mdo create mode 100644 SSL/src/CommonModules/АнкетированиеКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/АнкетированиеКлиент/АнкетированиеКлиент.mdo create mode 100644 SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl create mode 100644 SSL/src/CommonModules/АнкетированиеКлиентСервер/АнкетированиеКлиентСервер.mdo create mode 100644 SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/БизнесПроцессыИЗадачиКлиент.mdo create mode 100644 SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/БизнесПроцессыИЗадачиПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl create mode 100644 SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/БизнесПроцессыИЗадачиСервер.mdo create mode 100644 SSL/src/CommonModules/БизнесПроцессыИЗадачиСобытия/Module.bsl create mode 100644 SSL/src/CommonModules/БизнесПроцессыИЗадачиСобытия/БизнесПроцессыИЗадачиСобытия.mdo create mode 100644 SSL/src/CommonModules/ВариантыОтчетов/Module.bsl create mode 100644 SSL/src/CommonModules/ВариантыОтчетов/ВариантыОтчетов.mdo create mode 100644 SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/ВариантыОтчетовКлиент/ВариантыОтчетовКлиент.mdo create mode 100644 SSL/src/CommonModules/ВариантыОтчетовКлиентПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/ВариантыОтчетовКлиентПереопределяемый/ВариантыОтчетовКлиентПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/ВариантыОтчетовПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl create mode 100644 SSL/src/CommonModules/ВерсионированиеОбъектов/ВерсионированиеОбъектов.mdo create mode 100644 SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/Module.bsl create mode 100644 SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/ВерсионированиеОбъектовСобытия.mdo create mode 100644 SSL/src/CommonModules/ВнешниеПользователи/Module.bsl create mode 100644 SSL/src/CommonModules/ВнешниеПользователи/ВнешниеПользователи.mdo create mode 100644 SSL/src/CommonModules/ВнешниеПользователиСобытия/Module.bsl create mode 100644 SSL/src/CommonModules/ВнешниеПользователиСобытия/ВнешниеПользователиСобытия.mdo create mode 100644 SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl create mode 100644 SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo create mode 100644 SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/ДополнительныеОтчетыИОбработкиКлиент.mdo create mode 100644 SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl create mode 100644 SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/ДополнительныеОтчетыИОбработкиКлиентСервер.mdo create mode 100644 SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/ДополнительныеОтчетыИОбработкиПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl create mode 100644 SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/ЗапретРедактированияРеквизитовОбъектов.mdo create mode 100644 SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/ЗапретРедактированияРеквизитовОбъектовКлиент.mdo create mode 100644 SSL/src/CommonModules/КалендарныеГрафики/Module.bsl create mode 100644 SSL/src/CommonModules/КалендарныеГрафики/КалендарныеГрафики.mdo create mode 100644 SSL/src/CommonModules/КомандыРаботыСФайлами/Module.bsl create mode 100644 SSL/src/CommonModules/КомандыРаботыСФайлами/КомандыРаботыСФайлами.mdo create mode 100644 SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурации/Module.bsl create mode 100644 SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурации/КонтрольДинамическогоОбновленияКонфигурации.mdo create mode 100644 SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииГлобальный/Module.bsl create mode 100644 SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииГлобальный/КонтрольДинамическогоОбновленияКонфигурацииГлобальный.mdo create mode 100644 SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииКлиент/КонтрольДинамическогоОбновленияКонфигурацииКлиент.mdo create mode 100644 SSL/src/CommonModules/КонтрольЖурналаРегистрации/Module.bsl create mode 100644 SSL/src/CommonModules/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo create mode 100644 SSL/src/CommonModules/НастройкаПорядкаЭлементов/Module.bsl create mode 100644 SSL/src/CommonModules/НастройкаПорядкаЭлементов/НастройкаПорядкаЭлементов.mdo create mode 100644 SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/НастройкаПорядкаЭлементовКлиент.mdo create mode 100644 SSL/src/CommonModules/НастройкаПорядкаЭлементовСобытия/Module.bsl create mode 100644 SSL/src/CommonModules/НастройкаПорядкаЭлементовСобытия/НастройкаПорядкаЭлементовСобытия.mdo create mode 100644 SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/ОбменДаннымиКлиент/ОбменДаннымиКлиент.mdo create mode 100644 SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/ОбменДаннымиПереопределяемый/ОбменДаннымиПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl create mode 100644 SSL/src/CommonModules/ОбменДаннымиПовтИсп/ОбменДаннымиПовтИсп.mdo create mode 100644 SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl create mode 100644 SSL/src/CommonModules/ОбменДаннымиСервер/ОбменДаннымиСервер.mdo create mode 100644 SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl create mode 100644 SSL/src/CommonModules/ОбменДаннымиСобытия/ОбменДаннымиСобытия.mdo create mode 100644 SSL/src/CommonModules/ОбменФайлами/Module.bsl create mode 100644 SSL/src/CommonModules/ОбменФайлами/ОбменФайлами.mdo create mode 100644 SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl create mode 100644 SSL/src/CommonModules/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo create mode 100644 SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/ОбновлениеИнформационнойБазыКлиент.mdo create mode 100644 SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиентПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиентПереопределяемый/ОбновлениеИнформационнойБазыКлиентПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/ОбновлениеИнформационнойБазыПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl create mode 100644 SSL/src/CommonModules/ОбновлениеКонфигурации/ОбновлениеКонфигурации.mdo create mode 100644 SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/ОбновлениеКонфигурацииКлиент.mdo create mode 100644 SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентГлобальный/Module.bsl create mode 100644 SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентГлобальный/ОбновлениеКонфигурацииКлиентГлобальный.mdo create mode 100644 SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/ОбновлениеКонфигурацииКлиентПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПовтИсп/Module.bsl create mode 100644 SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПовтИсп/ОбновлениеКонфигурацииКлиентПовтИсп.mdo create mode 100644 SSL/src/CommonModules/ОбновлениеКонфигурацииПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/ОбновлениеКонфигурацииПереопределяемый/ОбновлениеКонфигурацииПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ОбщегоНазначения/Module.bsl create mode 100644 SSL/src/CommonModules/ОбщегоНазначения/ОбщегоНазначения.mdo create mode 100644 SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/ОбщегоНазначенияКлиент/ОбщегоНазначенияКлиент.mdo create mode 100644 SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/Module.bsl create mode 100644 SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/ОбщегоНазначенияКлиентПовтИсп.mdo create mode 100644 SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl create mode 100644 SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/ОбщегоНазначенияКлиентСервер.mdo create mode 100644 SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/ОбщегоНазначенияПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ПолнотекстовыйПоискКлиентПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/ПолнотекстовыйПоискКлиентПереопределяемый/ПолнотекстовыйПоискКлиентПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl create mode 100644 SSL/src/CommonModules/ПолнотекстовыйПоискСервер/ПолнотекстовыйПоискСервер.mdo create mode 100644 SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl create mode 100644 SSL/src/CommonModules/ПолучениеФайловИзИнтернета/ПолучениеФайловИзИнтернета.mdo create mode 100644 SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/ПолучениеФайловИзИнтернетаКлиент.mdo create mode 100644 SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl create mode 100644 SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/ПолучениеФайловИзИнтернетаКлиентСервер.mdo create mode 100644 SSL/src/CommonModules/Пользователи/Module.bsl create mode 100644 SSL/src/CommonModules/Пользователи/Пользователи.mdo create mode 100644 SSL/src/CommonModules/ПользователиКлиентПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/ПользователиКлиентПереопределяемый/ПользователиКлиентПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/ПользователиПереопределяемый/ПользователиПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ПользователиСерверПовтИсп/Module.bsl create mode 100644 SSL/src/CommonModules/ПользователиСерверПовтИсп/ПользователиСерверПовтИсп.mdo create mode 100644 SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/Module.bsl create mode 100644 SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/ПрефиксацияОбъектовКлиентСервер.mdo create mode 100644 SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/Module.bsl create mode 100644 SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/ПрефиксацияОбъектовПовтИсп.mdo create mode 100644 SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl create mode 100644 SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/ПрефиксацияОбъектовСобытия.mdo create mode 100644 SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/ПроверкаЛегальностиПолученияОбновленияКлиент.mdo create mode 100644 SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl create mode 100644 SSL/src/CommonModules/РаботаСКурсамиВалют/РаботаСКурсамиВалют.mdo create mode 100644 SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl create mode 100644 SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/РаботаСКурсамиВалютКлиентСервер.mdo create mode 100644 SSL/src/CommonModules/РаботаСКурсамиВалютСобытия/Module.bsl create mode 100644 SSL/src/CommonModules/РаботаСКурсамиВалютСобытия/РаботаСКурсамиВалютСобытия.mdo create mode 100644 SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl create mode 100644 SSL/src/CommonModules/РаботаСПочтовымиСообщениями/РаботаСПочтовымиСообщениями.mdo create mode 100644 SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/РаботаСПочтовымиСообщениямиКлиент.mdo create mode 100644 SSL/src/CommonModules/РаботаСФайлами/Module.bsl create mode 100644 SSL/src/CommonModules/РаботаСФайлами/РаботаСФайлами.mdo create mode 100644 SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/РаботаСФайламиКлиент/РаботаСФайламиКлиент.mdo create mode 100644 SSL/src/CommonModules/РаботаСФайламиКлиентПовтИсп/Module.bsl create mode 100644 SSL/src/CommonModules/РаботаСФайламиКлиентПовтИсп/РаботаСФайламиКлиентПовтИсп.mdo create mode 100644 SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl create mode 100644 SSL/src/CommonModules/РаботаСФайламиКлиентСервер/РаботаСФайламиКлиентСервер.mdo create mode 100644 SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/РаботаСФайламиПереопределяемый/РаботаСФайламиПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/РаботаСФайламиПовтИсп/Module.bsl create mode 100644 SSL/src/CommonModules/РаботаСФайламиПовтИсп/РаботаСФайламиПовтИсп.mdo create mode 100644 SSL/src/CommonModules/РаботаСоСканеромКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/РаботаСоСканеромКлиент/РаботаСоСканеромКлиент.mdo create mode 100644 SSL/src/CommonModules/РегламентныеЗаданияГлобальный/Module.bsl create mode 100644 SSL/src/CommonModules/РегламентныеЗаданияГлобальный/РегламентныеЗаданияГлобальный.mdo create mode 100644 SSL/src/CommonModules/РегламентныеЗаданияКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/РегламентныеЗаданияКлиент/РегламентныеЗаданияКлиент.mdo create mode 100644 SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl create mode 100644 SSL/src/CommonModules/РегламентныеЗаданияСервер/РегламентныеЗаданияСервер.mdo create mode 100644 SSL/src/CommonModules/СоединенияИБ/Module.bsl create mode 100644 SSL/src/CommonModules/СоединенияИБ/СоединенияИБ.mdo create mode 100644 SSL/src/CommonModules/СоединенияИБГлобальный/Module.bsl create mode 100644 SSL/src/CommonModules/СоединенияИБГлобальный/СоединенияИБГлобальный.mdo create mode 100644 SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/СоединенияИБКлиент/СоединенияИБКлиент.mdo create mode 100644 SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl create mode 100644 SSL/src/CommonModules/СоединенияИБКлиентСервер/СоединенияИБКлиентСервер.mdo create mode 100644 SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl create mode 100644 SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/СтандартныеПодсистемыКлиентПовтИсп.mdo create mode 100644 SSL/src/CommonModules/СтандартныеПодсистемыПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/СтандартныеПодсистемыПереопределяемый/СтандартныеПодсистемыПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl create mode 100644 SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/СтроковыеФункцииКлиентСервер.mdo create mode 100644 SSL/src/CommonModules/УправлениеДоступом/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеДоступом/УправлениеДоступом.mdo create mode 100644 SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеДоступомПереопределяемый/УправлениеДоступомПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/УправлениеДоступомСерверПовтИсп/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеДоступомСерверПовтИсп/УправлениеДоступомСерверПовтИсп.mdo create mode 100644 SSL/src/CommonModules/УправлениеДоступомСобытия/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеДоступомСобытия/УправлениеДоступомСобытия.mdo create mode 100644 SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСобытия/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСобытия/УправлениеИтогамиИАгрегатамиСобытия.mdo create mode 100644 SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеКонтактнойИнформацией/УправлениеКонтактнойИнформацией.mdo create mode 100644 SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/УправлениеКонтактнойИнформациейКлассификаторы.mdo create mode 100644 SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторыКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторыКлиент/УправлениеКонтактнойИнформациейКлассификаторыКлиент.mdo create mode 100644 SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/УправлениеКонтактнойИнформациейКлиент.mdo create mode 100644 SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/УправлениеКонтактнойИнформациейПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/УправлениеКонтактнойИнформациейСобытия/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеКонтактнойИнформациейСобытия/УправлениеКонтактнойИнформациейСобытия.mdo create mode 100644 SSL/src/CommonModules/УправлениеПечатью/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеПечатью/УправлениеПечатью.mdo create mode 100644 SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/УправлениеПечатьюMSWordКлиент.mdo create mode 100644 SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/УправлениеПечатьюOOWriterКлиент.mdo create mode 100644 SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеПечатьюКлиент/УправлениеПечатьюКлиент.mdo create mode 100644 SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/УправлениеПечатьюПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/УправлениеСвойствами/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеСвойствами/УправлениеСвойствами.mdo create mode 100644 SSL/src/CommonModules/УправлениеСвойствамиКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеСвойствамиКлиент/УправлениеСвойствамиКлиент.mdo create mode 100644 SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/УправлениеСвойствамиПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ФайловыеФункции/Module.bsl create mode 100644 SSL/src/CommonModules/ФайловыеФункции/ФайловыеФункции.mdo create mode 100644 SSL/src/CommonModules/ФайловыеФункцииКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/ФайловыеФункцииКлиент/ФайловыеФункцииКлиент.mdo create mode 100644 SSL/src/CommonModules/ФайловыеФункцииКлиентСервер/Module.bsl create mode 100644 SSL/src/CommonModules/ФайловыеФункцииКлиентСервер/ФайловыеФункцииКлиентСервер.mdo create mode 100644 SSL/src/CommonModules/ФизическиеЛица/Module.bsl create mode 100644 SSL/src/CommonModules/ФизическиеЛица/ФизическиеЛица.mdo create mode 100644 SSL/src/CommonModules/ЭлектроннаяПочта/Module.bsl create mode 100644 SSL/src/CommonModules/ЭлектроннаяПочта/ЭлектроннаяПочта.mdo create mode 100644 SSL/src/CommonModules/ЭлектроннаяПочтаКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/ЭлектроннаяПочтаКлиент/ЭлектроннаяПочтаКлиент.mdo create mode 100644 SSL/src/CommonModules/ЭлектронноЦифроваяПодпись/Module.bsl create mode 100644 SSL/src/CommonModules/ЭлектронноЦифроваяПодпись/ЭлектронноЦифроваяПодпись.mdo create mode 100644 SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиент/ЭлектронноЦифроваяПодписьКлиент.mdo create mode 100644 SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиентПовтИсп/Module.bsl create mode 100644 SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиентПовтИсп/ЭлектронноЦифроваяПодписьКлиентПовтИсп.mdo create mode 100644 SSL/src/CommonPictures/АрхивАнкета/Picture.png create mode 100644 SSL/src/CommonPictures/АрхивАнкета/АрхивАнкета.mdo create mode 100644 SSL/src/CommonPictures/ВидыОпераций/Picture.png create mode 100644 SSL/src/CommonPictures/ВидыОпераций/ВидыОпераций.mdo create mode 100644 SSL/src/CommonPictures/Внимание/Picture.png create mode 100644 SSL/src/CommonPictures/Внимание/Внимание.mdo create mode 100644 SSL/src/CommonPictures/ВыполнитьЗапускОбменаДанными/Picture.png create mode 100644 SSL/src/CommonPictures/ВыполнитьЗапускОбменаДанными/ВыполнитьЗапускОбменаДанными.mdo create mode 100644 SSL/src/CommonPictures/ДлительнаяОперация48/Picture.gif create mode 100644 SSL/src/CommonPictures/ДлительнаяОперация48/ДлительнаяОперация48.mdo create mode 100644 SSL/src/CommonPictures/ДобавитьДопСвойствоВНабор/Picture.png create mode 100644 SSL/src/CommonPictures/ДобавитьДопСвойствоВНабор/ДобавитьДопСвойствоВНабор.mdo create mode 100644 SSL/src/CommonPictures/ДобавитьПростойВопрос/Picture.png create mode 100644 SSL/src/CommonPictures/ДобавитьПростойВопрос/ДобавитьПростойВопрос.mdo create mode 100644 SSL/src/CommonPictures/ДобавитьРазделАнкеты/Picture.png create mode 100644 SSL/src/CommonPictures/ДобавитьРазделАнкеты/ДобавитьРазделАнкеты.mdo create mode 100644 SSL/src/CommonPictures/ДобавитьТабличныйВопрос/Picture.png create mode 100644 SSL/src/CommonPictures/ДобавитьТабличныйВопрос/ДобавитьТабличныйВопрос.mdo create mode 100644 SSL/src/CommonPictures/ДобавитьУсловныйВопрос/Picture.png create mode 100644 SSL/src/CommonPictures/ДобавитьУсловныйВопрос/ДобавитьУсловныйВопрос.mdo create mode 100644 SSL/src/CommonPictures/ДокументЗаписанКоннекторВерх/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументЗаписанКоннекторВерх/ДокументЗаписанКоннекторВерх.mdo create mode 100644 SSL/src/CommonPictures/ДокументЗаписанКоннекторВерхНиз/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументЗаписанКоннекторВерхНиз/ДокументЗаписанКоннекторВерхНиз.mdo create mode 100644 SSL/src/CommonPictures/ДокументЗаписанКоннекторЛево/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументЗаписанКоннекторЛево/ДокументЗаписанКоннекторЛево.mdo create mode 100644 SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоВерх/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоВерх/ДокументЗаписанКоннекторЛевоВерх.mdo create mode 100644 SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоНиз/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоНиз/ДокументЗаписанКоннекторЛевоНиз.mdo create mode 100644 SSL/src/CommonPictures/ДокументЗаписанКоннекторНиз/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументЗаписанКоннекторНиз/ДокументЗаписанКоннекторНиз.mdo create mode 100644 SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерх/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерх/ДокументПомеченНаУдалениеКоннекторВерх.mdo create mode 100644 SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерхНиз/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерхНиз/ДокументПомеченНаУдалениеКоннекторВерхНиз.mdo create mode 100644 SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛево/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛево/ДокументПомеченНаУдалениеКоннекторЛево.mdo create mode 100644 SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоВерх/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоВерх/ДокументПомеченНаУдалениеКоннекторЛевоВерх.mdo create mode 100644 SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоНиз/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоНиз/ДокументПомеченНаУдалениеКоннекторЛевоНиз.mdo create mode 100644 SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторНиз/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторНиз/ДокументПомеченНаУдалениеКоннекторНиз.mdo create mode 100644 SSL/src/CommonPictures/ДокументПроведенКоннекторВерх/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументПроведенКоннекторВерх/ДокументПроведенКоннекторВерх.mdo create mode 100644 SSL/src/CommonPictures/ДокументПроведенКоннекторВерхНиз/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументПроведенКоннекторВерхНиз/ДокументПроведенКоннекторВерхНиз.mdo create mode 100644 SSL/src/CommonPictures/ДокументПроведенКоннекторЛево/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументПроведенКоннекторЛево/ДокументПроведенКоннекторЛево.mdo create mode 100644 SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоВерх/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоВерх/ДокументПроведенКоннекторЛевоВерх.mdo create mode 100644 SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоНиз/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоНиз/ДокументПроведенКоннекторЛевоНиз.mdo create mode 100644 SSL/src/CommonPictures/ДокументПроведенКоннекторНиз/Picture.png create mode 100644 SSL/src/CommonPictures/ДокументПроведенКоннекторНиз/ДокументПроведенКоннекторНиз.mdo create mode 100644 SSL/src/CommonPictures/ДополнительныеРеквизитыСведения/Picture.png create mode 100644 SSL/src/CommonPictures/ДополнительныеРеквизитыСведения/ДополнительныеРеквизитыСведения.mdo create mode 100644 SSL/src/CommonPictures/ДополнительныеСведения/Picture.png create mode 100644 SSL/src/CommonPictures/ДополнительныеСведения/ДополнительныеСведения.mdo create mode 100644 SSL/src/CommonPictures/ЗавершитьРедактированиеМакета/Picture.png create mode 100644 SSL/src/CommonPictures/ЗавершитьРедактированиеМакета/ЗавершитьРедактированиеМакета.mdo create mode 100644 SSL/src/CommonPictures/ЗакрепитьВариантОтчета/Picture.png create mode 100644 SSL/src/CommonPictures/ЗакрепитьВариантОтчета/ЗакрепитьВариантОтчета.mdo create mode 100644 SSL/src/CommonPictures/ЗаставкаОбновленияКонфигурации/Picture.bmp create mode 100644 SSL/src/CommonPictures/ЗаставкаОбновленияКонфигурации/ЗаставкаОбновленияКонфигурации.mdo create mode 100644 SSL/src/CommonPictures/Зашифрован/Picture.png create mode 100644 SSL/src/CommonPictures/Зашифрован/Зашифрован.mdo create mode 100644 SSL/src/CommonPictures/ЗначокЗаставкиОбновленияКонфигурации/Picture.ico create mode 100644 SSL/src/CommonPictures/ЗначокЗаставкиОбновленияКонфигурации/ЗначокЗаставкиОбновленияКонфигурации.mdo create mode 100644 SSL/src/CommonPictures/ИерархическийСписок/Picture.png create mode 100644 SSL/src/CommonPictures/ИерархическийСписок/ИерархическийСписок.mdo create mode 100644 SSL/src/CommonPictures/Информация/Picture.png create mode 100644 SSL/src/CommonPictures/Информация/Информация.mdo create mode 100644 SSL/src/CommonPictures/Информация32/Picture.png create mode 100644 SSL/src/CommonPictures/Информация32/Информация32.mdo create mode 100644 SSL/src/CommonPictures/ИспользоватьПользовательскийМакет/Picture.png create mode 100644 SSL/src/CommonPictures/ИспользоватьПользовательскийМакет/ИспользоватьПользовательскийМакет.mdo create mode 100644 SSL/src/CommonPictures/ИспользоватьПоставляемыйМакет/Picture.png create mode 100644 SSL/src/CommonPictures/ИспользоватьПоставляемыйМакет/ИспользоватьПоставляемыйМакет.mdo create mode 100644 SSL/src/CommonPictures/ИсторияВерсий/Picture.png create mode 100644 SSL/src/CommonPictures/ИсторияВерсий/ИсторияВерсий.mdo create mode 100644 SSL/src/CommonPictures/КартинкаВДеревеСвойств/Picture.png create mode 100644 SSL/src/CommonPictures/КартинкаВДеревеСвойств/КартинкаВДеревеСвойств.mdo create mode 100644 SSL/src/CommonPictures/КартинкаЗакончитьРедактирование/Picture.png create mode 100644 SSL/src/CommonPictures/КартинкаЗакончитьРедактирование/КартинкаЗакончитьРедактирование.mdo create mode 100644 SSL/src/CommonPictures/КартинкаЗанять/Picture.png create mode 100644 SSL/src/CommonPictures/КартинкаЗанять/КартинкаЗанять.mdo create mode 100644 SSL/src/CommonPictures/КартинкаОпубликовать/Picture.png create mode 100644 SSL/src/CommonPictures/КартинкаОпубликовать/КартинкаОпубликовать.mdo create mode 100644 SSL/src/CommonPictures/КартинкаОсвободить/Picture.png create mode 100644 SSL/src/CommonPictures/КартинкаОсвободить/КартинкаОсвободить.mdo create mode 100644 SSL/src/CommonPictures/КартинкаОткрыть/Picture.png create mode 100644 SSL/src/CommonPictures/КартинкаОткрыть/КартинкаОткрыть.mdo create mode 100644 SSL/src/CommonPictures/КартинкаРедактировать/Picture.png create mode 100644 SSL/src/CommonPictures/КартинкаРедактировать/КартинкаРедактировать.mdo create mode 100644 SSL/src/CommonPictures/КартинкаСохранитьКак/Picture.png create mode 100644 SSL/src/CommonPictures/КартинкаСохранитьКак/КартинкаСохранитьКак.mdo create mode 100644 SSL/src/CommonPictures/КоллекцияВариантыВажностиЗадачи/Picture.png create mode 100644 SSL/src/CommonPictures/КоллекцияВариантыВажностиЗадачи/КоллекцияВариантыВажностиЗадачи.mdo create mode 100644 SSL/src/CommonPictures/КоллекцияВидыАктивныхПользователей/Picture.png create mode 100644 SSL/src/CommonPictures/КоллекцияВидыАктивныхПользователей/КоллекцияВидыАктивныхПользователей.mdo create mode 100644 SSL/src/CommonPictures/КоллекцияВидыСобытийЖурналаРегистрации/Picture.png create mode 100644 SSL/src/CommonPictures/КоллекцияВидыСобытийЖурналаРегистрации/КоллекцияВидыСобытийЖурналаРегистрации.mdo create mode 100644 SSL/src/CommonPictures/КоллекцияДляПомеченныхНаУдалениеОбъектов/Picture.png create mode 100644 SSL/src/CommonPictures/КоллекцияДляПомеченныхНаУдалениеОбъектов/КоллекцияДляПомеченныхНаУдалениеОбъектов.mdo create mode 100644 SSL/src/CommonPictures/КоллекцияКартинокДеревоАнкеты/Picture.png create mode 100644 SSL/src/CommonPictures/КоллекцияКартинокДеревоАнкеты/КоллекцияКартинокДеревоАнкеты.mdo create mode 100644 SSL/src/CommonPictures/КоллекцияКартинокДоступныеАнкеты/Picture.png create mode 100644 SSL/src/CommonPictures/КоллекцияКартинокДоступныеАнкеты/КоллекцияКартинокДоступныеАнкеты.mdo create mode 100644 SSL/src/CommonPictures/КоллекцияПиктограммЭлементов/Picture.png create mode 100644 SSL/src/CommonPictures/КоллекцияПиктограммЭлементов/КоллекцияПиктограммЭлементов.mdo create mode 100644 SSL/src/CommonPictures/КоннекторВерхНиз/Picture.png create mode 100644 SSL/src/CommonPictures/КоннекторВерхНиз/КоннекторВерхНиз.mdo create mode 100644 SSL/src/CommonPictures/КоннекторВерхПраво/Picture.png create mode 100644 SSL/src/CommonPictures/КоннекторВерхПраво/КоннекторВерхПраво.mdo create mode 100644 SSL/src/CommonPictures/КоннекторВерхПравоНиз/Picture.png create mode 100644 SSL/src/CommonPictures/КоннекторВерхПравоНиз/КоннекторВерхПравоНиз.mdo create mode 100644 SSL/src/CommonPictures/КоннекторЛевоНизПраво/Picture.png create mode 100644 SSL/src/CommonPictures/КоннекторЛевоНизПраво/КоннекторЛевоНизПраво.mdo create mode 100644 SSL/src/CommonPictures/КоннекторЛевоПраво/Picture.png create mode 100644 SSL/src/CommonPictures/КоннекторЛевоПраво/КоннекторЛевоПраво.mdo create mode 100644 SSL/src/CommonPictures/КоннекторПравоНиз/Picture.png create mode 100644 SSL/src/CommonPictures/КоннекторПравоНиз/КоннекторПравоНиз.mdo create mode 100644 SSL/src/CommonPictures/КонтактнаяИнформация/Picture.png create mode 100644 SSL/src/CommonPictures/КонтактнаяИнформация/КонтактнаяИнформация.mdo create mode 100644 SSL/src/CommonPictures/НастройкаОбработкиРегламентныхЗаданий/Picture.png create mode 100644 SSL/src/CommonPictures/НастройкаОбработкиРегламентныхЗаданий/НастройкаОбработкиРегламентныхЗаданий.mdo create mode 100644 SSL/src/CommonPictures/ОбработатьРегламентноеЗаданиеВручную/Picture.png create mode 100644 SSL/src/CommonPictures/ОбработатьРегламентноеЗаданиеВручную/ОбработатьРегламентноеЗаданиеВручную.mdo create mode 100644 SSL/src/CommonPictures/ОтдельныйСеансОбработкиРегламентныхЗаданий/Picture.png create mode 100644 SSL/src/CommonPictures/ОтдельныйСеансОбработкиРегламентныхЗаданий/ОтдельныйСеансОбработкиРегламентныхЗаданий.mdo create mode 100644 SSL/src/CommonPictures/ОткрепитьВариантОтчета/Picture.png create mode 100644 SSL/src/CommonPictures/ОткрепитьВариантОтчета/ОткрепитьВариантОтчета.mdo create mode 100644 SSL/src/CommonPictures/ОткрытьМакет/Picture.png create mode 100644 SSL/src/CommonPictures/ОткрытьМакет/ОткрытьМакет.mdo create mode 100644 SSL/src/CommonPictures/ОтменитьРедактированиеМакета/Picture.png create mode 100644 SSL/src/CommonPictures/ОтменитьРедактированиеМакета/ОтменитьРедактированиеМакета.mdo create mode 100644 SSL/src/CommonPictures/ОтправитьEmail/Picture.bmp create mode 100644 SSL/src/CommonPictures/ОтправитьEmail/ОтправитьEmail.mdo create mode 100644 SSL/src/CommonPictures/Ошибка32/Picture.png create mode 100644 SSL/src/CommonPictures/Ошибка32/Ошибка32.mdo create mode 100644 SSL/src/CommonPictures/ОшибкаОбработкиРегламентныхЗаданий/Picture.png create mode 100644 SSL/src/CommonPictures/ОшибкаОбработкиРегламентныхЗаданий/ОшибкаОбработкиРегламентныхЗаданий.mdo create mode 100644 SSL/src/CommonPictures/Папка/Picture.png create mode 100644 SSL/src/CommonPictures/Папка/Папка.mdo create mode 100644 SSL/src/CommonPictures/Папки/Picture.png create mode 100644 SSL/src/CommonPictures/Папки/Папки.mdo create mode 100644 SSL/src/CommonPictures/ПараметрыОбменаДанными/Picture.png create mode 100644 SSL/src/CommonPictures/ПараметрыОбменаДанными/ПараметрыОбменаДанными.mdo create mode 100644 SSL/src/CommonPictures/Переключатель/Picture.png create mode 100644 SSL/src/CommonPictures/Переключатель/Переключатель.mdo create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя/Picture.png create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя/ПиктограммыПользователя.mdo create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя01/Picture.png create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя01/ПиктограммыПользователя01.mdo create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя02/Picture.png create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя02/ПиктограммыПользователя02.mdo create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя03/Picture.png create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя03/ПиктограммыПользователя03.mdo create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя04/Picture.png create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя04/ПиктограммыПользователя04.mdo create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя05/Picture.png create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя05/ПиктограммыПользователя05.mdo create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя06/Picture.png create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя06/ПиктограммыПользователя06.mdo create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя07/Picture.png create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя07/ПиктограммыПользователя07.mdo create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя08/Picture.png create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя08/ПиктограммыПользователя08.mdo create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя09/Picture.png create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя09/ПиктограммыПользователя09.mdo create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя10/Picture.png create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя10/ПиктограммыПользователя10.mdo create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя11/Picture.png create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя11/ПиктограммыПользователя11.mdo create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя12/Picture.png create mode 100644 SSL/src/CommonPictures/ПиктограммыПользователя12/ПиктограммыПользователя12.mdo create mode 100644 SSL/src/CommonPictures/ПиктограммыФайлов/Picture.png create mode 100644 SSL/src/CommonPictures/ПиктограммыФайлов/ПиктограммыФайлов.mdo create mode 100644 SSL/src/CommonPictures/Подписан/Picture.png create mode 100644 SSL/src/CommonPictures/Подписан/Подписан.mdo create mode 100644 SSL/src/CommonPictures/ПодсистемаАдминистрирование/Picture.png create mode 100644 SSL/src/CommonPictures/ПодсистемаАдминистрирование/ПодсистемаАдминистрирование.mdo create mode 100644 SSL/src/CommonPictures/ПодсистемаАнкетирование/Picture.png create mode 100644 SSL/src/CommonPictures/ПодсистемаАнкетирование/ПодсистемаАнкетирование.mdo create mode 100644 SSL/src/CommonPictures/ПодсистемаБизнесПроцессыИЗадачи/Picture.png create mode 100644 SSL/src/CommonPictures/ПодсистемаБизнесПроцессыИЗадачи/ПодсистемаБизнесПроцессыИЗадачи.mdo create mode 100644 SSL/src/CommonPictures/ПодсистемаОбменДанными/Picture.png create mode 100644 SSL/src/CommonPictures/ПодсистемаОбменДанными/ПодсистемаОбменДанными.mdo create mode 100644 SSL/src/CommonPictures/ПодсистемаРаботаСФайлами/Picture.png create mode 100644 SSL/src/CommonPictures/ПодсистемаРаботаСФайлами/ПодсистемаРаботаСФайлами.mdo create mode 100644 SSL/src/CommonPictures/ПодсистемаУправленияДоступом/Picture.png create mode 100644 SSL/src/CommonPictures/ПодсистемаУправленияДоступом/ПодсистемаУправленияДоступом.mdo create mode 100644 SSL/src/CommonPictures/ПоказатьТолькоВыбранныеРоли/Picture.png create mode 100644 SSL/src/CommonPictures/ПоказатьТолькоВыбранныеРоли/ПоказатьТолькоВыбранныеРоли.mdo create mode 100644 SSL/src/CommonPictures/ПолнотекстовыйПоискДалее/Picture.png create mode 100644 SSL/src/CommonPictures/ПолнотекстовыйПоискДалее/ПолнотекстовыйПоискДалее.mdo create mode 100644 SSL/src/CommonPictures/ПолнотекстовыйПоискНазад/Picture.png create mode 100644 SSL/src/CommonPictures/ПолнотекстовыйПоискНазад/ПолнотекстовыйПоискНазад.mdo create mode 100644 SSL/src/CommonPictures/ПользователиВыполнитьСинхронизацию/Picture.png create mode 100644 SSL/src/CommonPictures/ПользователиВыполнитьСинхронизацию/ПользователиВыполнитьСинхронизацию.mdo create mode 100644 SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыВКолонках/Picture.png create mode 100644 SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыВКолонках/ПревьюТабличногоВопросаОтветыВКолонках.mdo create mode 100644 SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыВСтроках/Picture.png create mode 100644 SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыВСтроках/ПревьюТабличногоВопросаОтветыВСтроках.mdo create mode 100644 SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыСтрокиИКолонки/Picture.png create mode 100644 SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыСтрокиИКолонки/ПревьюТабличногоВопросаОтветыСтрокиИКолонки.mdo create mode 100644 SSL/src/CommonPictures/ПревьюТабличногоВопросаСоставной/Picture.png create mode 100644 SSL/src/CommonPictures/ПревьюТабличногоВопросаСоставной/ПревьюТабличногоВопросаСоставной.mdo create mode 100644 SSL/src/CommonPictures/Предупреждение32/Picture.png create mode 100644 SSL/src/CommonPictures/Предупреждение32/Предупреждение32.mdo create mode 100644 SSL/src/CommonPictures/ПриложитьФайл/Picture.png create mode 100644 SSL/src/CommonPictures/ПриложитьФайл/ПриложитьФайл.mdo create mode 100644 SSL/src/CommonPictures/РабочийКаталогПоУмолчанию/Picture.png create mode 100644 SSL/src/CommonPictures/РабочийКаталогПоУмолчанию/РабочийКаталогПоУмолчанию.mdo create mode 100644 SSL/src/CommonPictures/РазорватьСоединение/Picture.png create mode 100644 SSL/src/CommonPictures/РазорватьСоединение/РазорватьСоединение.mdo create mode 100644 SSL/src/CommonPictures/РазрешитьРедактированиеРеквизитовОбъекта/Picture.png create mode 100644 SSL/src/CommonPictures/РазрешитьРедактированиеРеквизитовОбъекта/РазрешитьРедактированиеРеквизитовОбъекта.mdo create mode 100644 SSL/src/CommonPictures/РаспространяетсяВИерархии/Picture.png create mode 100644 SSL/src/CommonPictures/РаспространяетсяВИерархии/РаспространяетсяВИерархии.mdo create mode 100644 SSL/src/CommonPictures/РедактироватьМакет/Picture.png create mode 100644 SSL/src/CommonPictures/РедактироватьМакет/РедактироватьМакет.mdo create mode 100644 SSL/src/CommonPictures/Сканирование/Picture.png create mode 100644 SSL/src/CommonPictures/Сканирование/Сканирование.mdo create mode 100644 SSL/src/CommonPictures/СостояниеОбменаДанными/Picture.png create mode 100644 SSL/src/CommonPictures/СостояниеОбменаДанными/СостояниеОбменаДанными.mdo create mode 100644 SSL/src/CommonPictures/СостояниеОбменаДаннымиОшибка/Picture.png create mode 100644 SSL/src/CommonPictures/СостояниеОбменаДаннымиОшибка/СостояниеОбменаДаннымиОшибка.mdo create mode 100644 SSL/src/CommonPictures/СостояниеОбменаДаннымиУспех/Picture.png create mode 100644 SSL/src/CommonPictures/СостояниеОбменаДаннымиУспех/СостояниеОбменаДаннымиУспех.mdo create mode 100644 SSL/src/CommonPictures/СтатусыСопоставленияОбъектов/Picture.png create mode 100644 SSL/src/CommonPictures/СтатусыСопоставленияОбъектов/СтатусыСопоставленияОбъектов.mdo create mode 100644 SSL/src/CommonPictures/ТипыМакетов/Picture.png create mode 100644 SSL/src/CommonPictures/ТипыМакетов/ТипыМакетов.mdo create mode 100644 SSL/src/CommonPictures/УдалитьПользовательскийМакет/Picture.png create mode 100644 SSL/src/CommonPictures/УдалитьПользовательскийМакет/УдалитьПользовательскийМакет.mdo create mode 100644 SSL/src/CommonTemplates/СтруктураПодчиненности/Template.mxlx create mode 100644 SSL/src/CommonTemplates/СтруктураПодчиненности/СтруктураПодчиненности.mdo create mode 100644 SSL/src/Configuration/Configuration.mdo create mode 100644 SSL/src/Configuration/Logo.png create mode 100644 SSL/src/Configuration/ManagedApplicationModule.bsl create mode 100644 SSL/src/Configuration/OrdinaryApplicationModule.bsl create mode 100644 SSL/src/Configuration/ParentConfigurations.bin create mode 100644 SSL/src/Configuration/SessionModule.bsl create mode 100644 SSL/src/Configuration/Splash.bmp create mode 100644 SSL/src/Constants/АдресатыПолученияОтчетаПоЖурналуРегистрации/ValueManagerModule.bsl create mode 100644 SSL/src/Constants/АдресатыПолученияОтчетаПоЖурналуРегистрации/АдресатыПолученияОтчетаПоЖурналуРегистрации.mdo create mode 100644 SSL/src/Constants/АлгоритмПодписи/АлгоритмПодписи.mdo create mode 100644 SSL/src/Constants/АлгоритмХеширования/АлгоритмХеширования.mdo create mode 100644 SSL/src/Constants/АлгоритмШифрования/АлгоритмШифрования.mdo create mode 100644 SSL/src/Constants/ВыполнятьПроверкуЭЦПНаСервере/ВыполнятьПроверкуЭЦПНаСервере.mdo create mode 100644 SSL/src/Constants/ДатаОбновленияПовторноИспользуемыхЗначенийМРО/ValueManagerModule.bsl create mode 100644 SSL/src/Constants/ДатаОбновленияПовторноИспользуемыхЗначенийМРО/ДатаОбновленияПовторноИспользуемыхЗначенийМРО.mdo create mode 100644 SSL/src/Constants/ДатаУведомленияОНовыхЗадачах/ДатаУведомленияОНовыхЗадачах.mdo create mode 100644 SSL/src/Constants/ЗаголовокСистемы/ЗаголовокСистемы.mdo create mode 100644 SSL/src/Constants/ЗапретЗагрузкиФайловПоРасширению/ЗапретЗагрузкиФайловПоРасширению.mdo create mode 100644 SSL/src/Constants/ИзвлекатьТекстыФайловНаСервере/ИзвлекатьТекстыФайловНаСервере.mdo create mode 100644 SSL/src/Constants/ИзменятьЗаданияЗаднимЧислом/ИзменятьЗаданияЗаднимЧислом.mdo create mode 100644 SSL/src/Constants/ИспользоватьАнкетирование/ИспользоватьАнкетирование.mdo create mode 100644 SSL/src/Constants/ИспользоватьБизнесПроцессыИЗадачи/ИспользоватьБизнесПроцессыИЗадачи.mdo create mode 100644 SSL/src/Constants/ИспользоватьВерсионированиеОбъектов/ValueManagerModule.bsl create mode 100644 SSL/src/Constants/ИспользоватьВерсионированиеОбъектов/ИспользоватьВерсионированиеОбъектов.mdo create mode 100644 SSL/src/Constants/ИспользоватьВнешнихПользователей/ИспользоватьВнешнихПользователей.mdo create mode 100644 SSL/src/Constants/ИспользоватьДатуИВремяВСрокахЗадач/ИспользоватьДатуИВремяВСрокахЗадач.mdo create mode 100644 SSL/src/Constants/ИспользоватьДатуНачалаЗадач/ИспользоватьДатуНачалаЗадач.mdo create mode 100644 SSL/src/Constants/ИспользоватьДополнительныеРеквизитыИСведения/ИспользоватьДополнительныеРеквизитыИСведения.mdo create mode 100644 SSL/src/Constants/ИспользоватьОбменДанными/ValueManagerModule.bsl create mode 100644 SSL/src/Constants/ИспользоватьОбменДанными/ИспользоватьОбменДанными.mdo create mode 100644 SSL/src/Constants/ИспользоватьПолнотекстовыйПоиск/ИспользоватьПолнотекстовыйПоиск.mdo create mode 100644 SSL/src/Constants/ИспользоватьЭлектронноЦифровыеПодписиИШифрование/ИспользоватьЭлектронноЦифровыеПодписиИШифрование.mdo create mode 100644 SSL/src/Constants/МаксимальныйРазмерФайла/МаксимальныйРазмерФайла.mdo create mode 100644 SSL/src/Constants/НастройкаПроксиСервера/ValueManagerModule.bsl create mode 100644 SSL/src/Constants/НастройкаПроксиСервера/НастройкаПроксиСервера.mdo create mode 100644 SSL/src/Constants/ОграничиватьДоступНаУровнеЗаписей/ValueManagerModule.bsl create mode 100644 SSL/src/Constants/ОграничиватьДоступНаУровнеЗаписей/ОграничиватьДоступНаУровнеЗаписей.mdo create mode 100644 SSL/src/Constants/ПараметрыАдминистрированияИБ/ПараметрыАдминистрированияИБ.mdo create mode 100644 SSL/src/Constants/ПрефиксУзлаРаспределеннойИнформационнойБазы/ValueManagerModule.bsl create mode 100644 SSL/src/Constants/ПрефиксУзлаРаспределеннойИнформационнойБазы/ПрефиксУзлаРаспределеннойИнформационнойБазы.mdo create mode 100644 SSL/src/Constants/ПровайдерЭЦП/ПровайдерЭЦП.mdo create mode 100644 SSL/src/Constants/СостояниеОбработкиРегламентныхЗаданий/СостояниеОбработкиРегламентныхЗаданий.mdo create mode 100644 SSL/src/Constants/СписокЗапрещенныхРасширений/СписокЗапрещенныхРасширений.mdo create mode 100644 SSL/src/Constants/СтатусОбновленияКонфигурации/СтатусОбновленияКонфигурации.mdo create mode 100644 SSL/src/Constants/ТипПровайдераЭЦП/ТипПровайдераЭЦП.mdo create mode 100644 SSL/src/Constants/ТипХраненияФайлов/ТипХраненияФайлов.mdo create mode 100644 SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form create mode 100644 SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl create mode 100644 SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Help/ru.html create mode 100644 SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/АвтоматическоеИзвлечениеТекстов.mdo 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/ФормаСпискаАктивныхПользователей/Help/ru.html create mode 100644 SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Module.bsl create mode 100644 SSL/src/DataProcessors/АктивныеПользователи/АктивныеПользователи.mdo 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/Форма/Module.bsl create mode 100644 SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/ManagerModule.bsl create mode 100644 SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/БлокировкаСоединенийСИнформационнойБазой.mdo create mode 100644 SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Form.form create mode 100644 SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Module.bsl create mode 100644 SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/ConditionalAppearance.dcssca create mode 100644 SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Form.form 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.txt create mode 100644 SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ГрупповоеИзменениеОбъектов.mdo 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/ЖурналРегистрации/Help/ru.html 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/РедакторСоставаСвойства/Form.form create mode 100644 SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl create mode 100644 SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Form.form create mode 100644 SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Help/ru.html 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/ЖурналРегистрации/ЖурналРегистрации.mdo create mode 100644 SSL/src/DataProcessors/ЗагрузкаПравилКонвертацииОбъектов/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/ЗагрузкаПравилКонвертацииОбъектов/ЗагрузкаПравилКонвертацииОбъектов.mdo create mode 100644 SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ManagerModule.bsl create mode 100644 SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ЗагрузкаПравилРегистрацииОбъектов.mdo create mode 100644 SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form create mode 100644 SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Module.bsl create mode 100644 SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/КартаМаршрутаБизнесПроцесса.mdo create mode 100644 SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ManagerModule.bsl create mode 100644 SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/КонвертацияОбъектовИнформационныхБаз.mdo create mode 100644 SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/КонвертацияОбъектовРаспределенныхИнформационныхБаз.mdo 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/КонтрольЖурналаРегистрации/Module.bsl 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/УстановкаПочтовыхАдресовДляОтправкиОтчета/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.mxlx create mode 100644 SSL/src/DataProcessors/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo 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/Форма/Module.bsl create mode 100644 SSL/src/DataProcessors/КурсыВалютРБК/Help/ru.html create mode 100644 SSL/src/DataProcessors/КурсыВалютРБК/ManagerModule.bsl create mode 100644 SSL/src/DataProcessors/КурсыВалютРБК/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/КурсыВалютРБК/КурсыВалютРБК.mdo create mode 100644 SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form create mode 100644 SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Module.bsl create mode 100644 SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Templates/УсловияРаспространенияОбновлений/Template.htmldoc create mode 100644 SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Templates/УсловияРаспространенияОбновлений/ru.html create mode 100644 SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/ЛегальностьПолученияОбновлений.mdo create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Form.form create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Module.bsl create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Form.form create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Module.bsl create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Обозреватель/Form.form create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Обозреватель/Module.bsl create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/ПредупреждениеWMI/Form.form create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/ПредупреждениеWMI/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/ОбновлениеКонфигурации/Help/ru.html create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/ManagerModule.bsl create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/ДопФайлОбновленияКонфигурации/Template.txt create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/ЗаставкаОбновленияКонфигурации/Template.txt create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/МакетФайлаОбновленияКонфигурации/Template.txt create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/НеинтерактивноеОбновлениеКонфигурации/Template.txt create mode 100644 SSL/src/DataProcessors/ОбновлениеКонфигурации/ОбновлениеКонфигурации.mdo 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 create mode 100644 SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/ФормаПоиска/Form.form create mode 100644 SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/ФормаПоиска/Module.bsl create mode 100644 SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Help/ru.html create mode 100644 SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/ПолнотекстовыйПоискВДанных.mdo create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Form.form create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КартинкаВторойИнформационнойБазы/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КартинкаВторойИнформационнойБазы1/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КартинкаПервойИнформационнойБазы/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КартинкаПервойИнформационнойБазы1/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КартинкаФайлаНастроек/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КартинкаФайлаСообщенияОбмена/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаДалее/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаДалее1/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаДалее11/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаНазад/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаНазад1/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаНазад2/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаНазад3/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/ПустаяКартинка/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/ПустаяКартинка1/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Module.bsl create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo create mode 100644 SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Form.form create mode 100644 SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаДалее1/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаДалее2/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаДалее3/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаНазад/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаНазад1/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаНазад2/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаНазад3/Picture.png create mode 100644 SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Module.bsl create mode 100644 SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Help/ru.html create mode 100644 SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/ПомощникСопоставленияОбъектовИнформационныхБаз.mdo 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/НастройкаОбработкиРегламентныхЗаданий/Help/ru.html 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/РабочийСтолОтдельногоСеансаОбработкиРегламентныхЗаданий/Form.form 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/РегламентноеЗадание/Module.bsl 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/РегламентныеИФоновыеЗадания/Module.bsl 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/ФоновоеЗадание/Module.bsl create mode 100644 SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/ManagerModule.bsl create mode 100644 SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/РегламентныеИФоновыеЗадания.mdo create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаАвтоматическогоСопоставления/Form.form create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаАвтоматическогоСопоставления/Module.bsl create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицы/Form.form create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицы/Module.bsl create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицыСопоставления/Form.form create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицыСопоставления/Module.bsl create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаСортировки/Form.form create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаСортировки/Module.bsl create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Form.form create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Module.bsl create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Form.form create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Form.form create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Module.bsl create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ManagerModule.bsl create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/СопоставлениеОбъектовИнформационныхБаз.mdo create mode 100644 SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Attributes/ОтвеченныеАнкеты/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Form.form create mode 100644 SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Module.bsl create mode 100644 SSL/src/DataProcessors/СписокРеспондента/Forms/Форма/Form.form create mode 100644 SSL/src/DataProcessors/СписокРеспондента/Forms/Форма/Module.bsl create mode 100644 SSL/src/DataProcessors/СписокРеспондента/СписокРеспондента.mdo create mode 100644 SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ТранспортСообщенийОбменаEMAIL.mdo create mode 100644 SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ТранспортСообщенийОбменаFILE.mdo create mode 100644 SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ManagerModule.bsl create mode 100644 SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ТранспортСообщенийОбменаFTP.mdo create mode 100644 SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form create mode 100644 SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Module.bsl create mode 100644 SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Help/ru.html create mode 100644 SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl create mode 100644 SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/УдалениеПомеченныхОбъектов.mdo create mode 100644 SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/Форма/Form.oform create mode 100644 SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/ФормаНастройкиОтладкиОбработчиков/Form.oform create mode 100644 SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/ФормаРедактораТекстовогоДокумента/Form.oform create mode 100644 SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/ФормаСообщенияОбОбычномРежиме/Form.form create mode 100644 SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Help/ru.html create mode 100644 SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Templates/ОбщиеПроцедурыФункции/Template.txt create mode 100644 SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Templates/ПараметрыОбработчиков/Template.mxlx create mode 100644 SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/УниверсальныйОбменДаннымиXML.mdo 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/ОсновнаяФорма/Module.bsl 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/ФормаВыбораПериода/Module.bsl 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/ФормаПараметровПерестроения/Module.bsl create mode 100644 SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/УправлениеИтогамиИАгрегатами.mdo create mode 100644 SSL/src/DataProcessors/УправлениеНастройкамиФорм/Forms/Форма/Form.form create mode 100644 SSL/src/DataProcessors/УправлениеНастройкамиФорм/Forms/Форма/Module.bsl create mode 100644 SSL/src/DataProcessors/УправлениеНастройкамиФорм/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/УправлениеНастройкамиФорм/УправлениеНастройкамиФорм.mdo 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/Форма/Module.bsl create mode 100644 SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/Help/ru.html create mode 100644 SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/УправлениеПолнотекстовымПоиском.mdo create mode 100644 SSL/src/Documents/Анкета/Forms/ФормаДокумента/Form.form create mode 100644 SSL/src/Documents/Анкета/Forms/ФормаДокумента/Help/ru.html create mode 100644 SSL/src/Documents/Анкета/Forms/ФормаДокумента/Module.bsl create mode 100644 SSL/src/Documents/Анкета/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Documents/Анкета/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Documents/Анкета/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Documents/Анкета/ObjectModule.bsl create mode 100644 SSL/src/Documents/Анкета/Анкета.mdo create mode 100644 SSL/src/Documents/НазначениеОпросов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Documents/НазначениеОпросов/Forms/ФормаВыбора/Form.form create mode 100644 SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Form.form create mode 100644 SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Module.bsl create mode 100644 SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Attributes/Респонденты/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Form.form create mode 100644 SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Module.bsl create mode 100644 SSL/src/Documents/НазначениеОпросов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Documents/НазначениеОпросов/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Documents/НазначениеОпросов/НазначениеОпросов.mdo create mode 100644 SSL/src/Enums/ВариантыSMTPАутентификации/ВариантыSMTPАутентификации.mdo create mode 100644 SSL/src/Enums/ВариантыВажностиЗадачи/ВариантыВажностиЗадачи.mdo create mode 100644 SSL/src/Enums/ВариантыВерсионированияОбъектов/ВариантыВерсионированияОбъектов.mdo create mode 100644 SSL/src/Enums/ВариантыПубликацииДополнительныхОтчетовИОбработок/ВариантыПубликацииДополнительныхОтчетовИОбработок.mdo create mode 100644 SSL/src/Enums/ВерсииПодсистемыОбменаДанными/ВерсииПодсистемыОбменаДанными.mdo create mode 100644 SSL/src/Enums/ВидыДополнительныхОтчетовИОбработок/ВидыДополнительныхОтчетовИОбработок.mdo create mode 100644 SSL/src/Enums/ВидыПравилДляОбменаДанными/ВидыПравилДляОбменаДанными.mdo create mode 100644 SSL/src/Enums/ВидыТранспортаСообщенийОбмена/ВидыТранспортаСообщенийОбмена.mdo create mode 100644 SSL/src/Enums/ДействияПриОбмене/ДействияПриОбмене.mdo create mode 100644 SSL/src/Enums/ДействияПриСохраненииСЭЦП/ДействияПриСохраненииСЭЦП.mdo create mode 100644 SSL/src/Enums/ДействияСФайламиПоДвойномуЩелчку/ДействияСФайламиПоДвойномуЩелчку.mdo create mode 100644 SSL/src/Enums/ИсточникиПравилДляОбменаДанными/ИсточникиПравилДляОбменаДанными.mdo create mode 100644 SSL/src/Enums/ПоворотИзображения/ПоворотИзображения.mdo create mode 100644 SSL/src/Enums/ПолФизическогоЛица/ПолФизическогоЛица.mdo create mode 100644 SSL/src/Enums/ПриоритетыОбъектовОбмена/ПриоритетыОбъектовОбмена.mdo create mode 100644 SSL/src/Enums/РазмерыБумаги/РазмерыБумаги.mdo create mode 100644 SSL/src/Enums/РазрешенияСканированногоИзображения/РазрешенияСканированногоИзображения.mdo create mode 100644 SSL/src/Enums/РезультатыВыполненияОбмена/РезультатыВыполненияОбмена.mdo create mode 100644 SSL/src/Enums/СпособыPOP3Аутентификации/СпособыPOP3Аутентификации.mdo create mode 100644 SSL/src/Enums/СпособыSMTPАутентификации/СпособыSMTPАутентификации.mdo create mode 100644 SSL/src/Enums/СпособыВызоваДополнительныхОбработок/СпособыВызоваДополнительныхОбработок.mdo create mode 100644 SSL/src/Enums/СпособыСравненияВерсийФайлов/СпособыСравненияВерсийФайлов.mdo create mode 100644 SSL/src/Enums/СтатусыИзвлеченияТекстаФайлов/СтатусыИзвлеченияТекстаФайлов.mdo create mode 100644 SSL/src/Enums/ТипыВариантовОтчетов/ТипыВариантовОтчетов.mdo create mode 100644 SSL/src/Enums/ТипыВопросовШаблонаАнкеты/ТипыВопросовШаблонаАнкеты.mdo create mode 100644 SSL/src/Enums/ТипыКонтактнойИнформации/ТипыКонтактнойИнформации.mdo create mode 100644 SSL/src/Enums/ТипыОтветовНаВопрос/ТипыОтветовНаВопрос.mdo create mode 100644 SSL/src/Enums/ТипыТабличныхВопросов/ТипыТабличныхВопросов.mdo create mode 100644 SSL/src/Enums/ТипыТекстовЭлектронныхПисем/ТипыТекстовЭлектронныхПисем.mdo create mode 100644 SSL/src/Enums/ТипыХраненияФайлов/ТипыХраненияФайлов.mdo create mode 100644 SSL/src/Enums/ФорматыСканированногоИзображения/ФорматыСканированногоИзображения.mdo create mode 100644 SSL/src/Enums/ЦветностиИзображения/ЦветностиИзображения.mdo create mode 100644 SSL/src/EventSubscriptions/ЗаписатьВСписокБизнесПроцессов/ЗаписатьВСписокБизнесПроцессов.mdo create mode 100644 SSL/src/EventSubscriptions/ЗаписатьГруппыИВидыДоступа/ЗаписатьГруппыИВидыДоступа.mdo create mode 100644 SSL/src/EventSubscriptions/ЗаписатьЗависимыеНаборыЗначенийДоступа/ЗаписатьЗависимыеНаборыЗначенийДоступа.mdo create mode 100644 SSL/src/EventSubscriptions/ЗаписатьНаборыЗначенийДоступа/ЗаписатьНаборыЗначенийДоступа.mdo create mode 100644 SSL/src/EventSubscriptions/ЗаполнитьКонтактнуюИнформацию/ЗаполнитьКонтактнуюИнформацию.mdo create mode 100644 SSL/src/EventSubscriptions/ОбменДаннымиПередЗаписьюУзлаПланаОбмена/ОбменДаннымиПередЗаписьюУзлаПланаОбмена.mdo create mode 100644 SSL/src/EventSubscriptions/ОбменДаннымиПередУдалениемУзлаПланаОбмена/ОбменДаннымиПередУдалениемУзлаПланаОбмена.mdo create mode 100644 SSL/src/EventSubscriptions/ОбновитьПредставлениеВнешнегоПользователя/ОбновитьПредставлениеВнешнегоПользователя.mdo create mode 100644 SSL/src/EventSubscriptions/УстановитьПометкуУдаленияЗадач/УстановитьПометкуУдаленияЗадач.mdo create mode 100644 SSL/src/FilterCriteria/СвязанныеДокументы/СвязанныеДокументы.mdo create mode 100644 SSL/src/FilterCriteria/ФайлыВТоме/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/FilterCriteria/ФайлыВТоме/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/FilterCriteria/ФайлыВТоме/ФайлыВТоме.mdo create mode 100644 SSL/src/FunctionalOptions/АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО/АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО.mdo create mode 100644 SSL/src/FunctionalOptions/ВариантыВерсионированияОбъектов/ВариантыВерсионированияОбъектов.mdo create mode 100644 SSL/src/FunctionalOptions/ИзменятьЗаданияЗаднимЧислом/ИзменятьЗаданияЗаднимЧислом.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьАнкетирование/ИспользоватьАнкетирование.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьБизнесПроцессыИЗадачи/ИспользоватьБизнесПроцессыИЗадачи.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьВерсионированиеОбъекта/ИспользоватьВерсионированиеОбъекта.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьВерсионированиеОбъектов/ИспользоватьВерсионированиеОбъектов.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьВнешнихПользователей/ИспользоватьВнешнихПользователей.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьДатуИВремяВСрокахЗадач/ИспользоватьДатуИВремяВСрокахЗадач.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьДатуНачалаЗадач/ИспользоватьДатуНачалаЗадач.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиЗаполненияОбъекта/ИспользоватьДополнительныеОтчетыИОбработкиЗаполненияОбъекта.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиОтчеты/ИспользоватьДополнительныеОтчетыИОбработкиОтчеты.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиПечатныеФормы/ИспользоватьДополнительныеОтчетыИОбработкиПечатныеФормы.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/ИспользоватьДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьДополнительныеРеквизитыИСведения/ИспользоватьДополнительныеРеквизитыИСведения.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьОбменДанными/ИспользоватьОбменДанными.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьПолнотекстовыйПоиск/ИспользоватьПолнотекстовыйПоиск.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьЭлектронноЦифровыеПодписиИШифрование/ИспользоватьЭлектронноЦифровыеПодписиИШифрование.mdo create mode 100644 SSL/src/FunctionalOptions/ОграничиватьДоступНаУровнеЗаписей/ОграничиватьДоступНаУровнеЗаписей.mdo create mode 100644 SSL/src/FunctionalOptions/ПрефиксИнформационнойБазы/ПрефиксИнформационнойБазы.mdo create mode 100644 SSL/src/FunctionalOptions/ПрефиксыОрганизаций/ПрефиксыОрганизаций.mdo create mode 100644 SSL/src/FunctionalOptionsParameters/Организация/Организация.mdo create mode 100644 SSL/src/FunctionalOptionsParameters/ТипОбъектаКонфигурации/ТипОбъектаКонфигурации.mdo create mode 100644 SSL/src/FunctionalOptionsParameters/ТипФормыСДополнительнымиОтчетамиИОбработками/ТипФормыСДополнительнымиОтчетамиИОбработками.mdo create mode 100644 SSL/src/InformationRegisters/АдресныеСокращения/АдресныеСокращения.mdo create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/АутентификацияНаПользовательскомСайте/Form.form create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/АутентификацияНаПользовательскомСайте/Help/ru.html create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/АутентификацияНаПользовательскомСайте/Module.bsl create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаВыбора/Form.form create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаВыбора/Module.bsl create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаЗагрузкиАдресногоКлассификатора/Form.form create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаЗагрузкиАдресногоКлассификатора/Help/ru.html create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаЗагрузкиАдресногоКлассификатора/Module.bsl create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаОчисткиАдресногоКлассификатора/Form.form create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаОчисткиАдресногоКлассификатора/Help/ru.html create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаОчисткиАдресногоКлассификатора/Module.bsl create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Help/ru.html create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Help/ru.html create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/Templates/КлассификаторАдресныхОбъектовРоссии/Template.txt create mode 100644 SSL/src/InformationRegisters/АдресныйКлассификатор/АдресныйКлассификатор.mdo create mode 100644 SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Form.form create mode 100644 SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Module.bsl create mode 100644 SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаЗаписи/Module.bsl create mode 100644 SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/InformationRegisters/ВерсииОбъектов/ВерсииОбъектов.mdo create mode 100644 SSL/src/InformationRegisters/ВерсииОбъектовАдресногоКлассификатора/ВерсииОбъектовАдресногоКлассификатора.mdo create mode 100644 SSL/src/InformationRegisters/ВерсииПодсистем/ВерсииПодсистем.mdo create mode 100644 SSL/src/InformationRegisters/ГруппыЗначенийДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/ГруппыЗначенийДоступа/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/ГруппыЗначенийДоступа/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ГруппыЗначенийДоступа.mdo create mode 100644 SSL/src/InformationRegisters/ДокументыФизическихЛиц/Commands/ДокументыФизическогоЛица/CommandModule.bsl create mode 100644 SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ДокументыФизическогоЛица/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ДокументыФизическогоЛица/Form.form create mode 100644 SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ДокументыФизическогоЛица/Module.bsl create mode 100644 SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаЗаписи/Module.bsl create mode 100644 SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/InformationRegisters/ДокументыФизическихЛиц/Help/ru.html 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/ДополнительныеСведения/Help/ru.html create mode 100644 SSL/src/InformationRegisters/ДополнительныеСведения/ДополнительныеСведения.mdo create mode 100644 SSL/src/InformationRegisters/ЗависимостиПравДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/ЗависимостиПравДоступа/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/ЗависимостиПравДоступа/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/ЗависимостиПравДоступа/ЗависимостиПравДоступа.mdo create mode 100644 SSL/src/InformationRegisters/ЗначенияГруппДоступа/ЗначенияГруппДоступа.mdo create mode 100644 SSL/src/InformationRegisters/ИсполнителиЗадач/Commands/НастройкаРолевойАдресации/CommandModule.bsl create mode 100644 SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъекту/Form.form create mode 100644 SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъекту/Help/ru.html create mode 100644 SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъекту/Module.bsl create mode 100644 SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъектуИРоли/Form.form create mode 100644 SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъектуИРоли/Help/ru.html create mode 100644 SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъектуИРоли/Module.bsl create mode 100644 SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаЗаписи/Module.bsl create mode 100644 SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/InformationRegisters/ИсполнителиЗадач/Help/ru.html 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/КалендарныеГрафики/КалендарныеГрафики.mdo create mode 100644 SSL/src/InformationRegisters/КурсыВалют/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/КурсыВалют/Forms/ФормаЗаписи/Module.bsl create mode 100644 SSL/src/InformationRegisters/КурсыВалют/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/КурсыВалют/КурсыВалют.mdo create mode 100644 SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаЗаписи/Module.bsl create mode 100644 SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/НаборыЗначенийДоступа/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/НаборыЗначенийДоступа/НаборыЗначенийДоступа.mdo create mode 100644 SSL/src/InformationRegisters/НазначениеДополнительныхОбработок/НазначениеДополнительныхОбработок.mdo create mode 100644 SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/Forms/ФормаНастройкиВерсионированияОбъектов/Form.form create mode 100644 SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/Forms/ФормаНастройкиВерсионированияОбъектов/Help/ru.html 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 create mode 100644 SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаЗаписи/Module.bsl create mode 100644 SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Help/ru.html 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/НомераСканированныхФайлов/НомераСканированныхФайлов.mdo create mode 100644 SSL/src/InformationRegisters/ОтветыНаВопросыАнкет/ОтветыНаВопросыАнкет.mdo create mode 100644 SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Form.form create mode 100644 SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Help/ru.html create mode 100644 SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Module.bsl create mode 100644 SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ДиалогПовтораПечати/Form.form create mode 100644 SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ДиалогПовтораПечати/Module.bsl create mode 100644 SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/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/НастройкаКаталогаФайловПечати/Form.form create mode 100644 SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/НастройкаКаталогаФайловПечати/Module.bsl create mode 100644 SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/ПользовательскиеМакетыПечати.mdo create mode 100644 SSL/src/InformationRegisters/ПользовательскиеНастройкиДоступаКОбработкам/ПользовательскиеНастройкиДоступаКОбработкам.mdo create mode 100644 SSL/src/InformationRegisters/ПраваПоЗначениямДоступа/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo create mode 100644 SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаЗаписи/Module.bsl create mode 100644 SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/ПравилаДляОбменаДанными/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ПравилаДляОбменаДанными.mdo create mode 100644 SSL/src/InformationRegisters/ПутиМодулейКриптографииСерверовЛинукс/ПутиМодулейКриптографииСерверовЛинукс.mdo create mode 100644 SSL/src/InformationRegisters/РабочиеКаталогиФайлов/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/РабочиеКаталогиФайлов/РабочиеКаталогиФайлов.mdo create mode 100644 SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/СоответствиеОбъектовИнформационныхБаз.mdo create mode 100644 SSL/src/InformationRegisters/СоставГруппПользователей/СоставГруппПользователей.mdo create mode 100644 SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаЗаписи/Module.bsl create mode 100644 SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/СостояниеОбменовДанными/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/СостояниеОбменовДанными/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/СостояниеОбменовДанными/СостояниеОбменовДанными.mdo create mode 100644 SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/СостояниеУспешныхОбменовДанными.mdo create mode 100644 SSL/src/InformationRegisters/СписокБизнесПроцессов/Commands/МоиБизнесПроцессы/CommandModule.bsl create mode 100644 SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Form.form create mode 100644 SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Help/ru.html create mode 100644 SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Module.bsl create mode 100644 SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/InformationRegisters/СписокБизнесПроцессов/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/СписокБизнесПроцессов/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/СписокБизнесПроцессов/СписокБизнесПроцессов.mdo create mode 100644 SSL/src/InformationRegisters/ТаблицыГруппДоступа/ТаблицыГруппДоступа.mdo create mode 100644 SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/ФайлыВРабочемКаталоге.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/РасшифровкаТабличныхВопросов/Module.bsl create mode 100644 SSL/src/Reports/АнализОпроса/Forms/ФормаОтчета/Form.form create mode 100644 SSL/src/Reports/АнализОпроса/Forms/ФормаОтчета/Module.bsl create mode 100644 SSL/src/Reports/АнализОпроса/ObjectModule.bsl create mode 100644 SSL/src/Reports/АнализОпроса/Templates/МакетОтветившие/Template.mxlx create mode 100644 SSL/src/Reports/АнализОпроса/Templates/МакетОтветы/Template.mxlx create mode 100644 SSL/src/Reports/АнализОпроса/Templates/ПростыеВопросы/Template.dcs create mode 100644 SSL/src/Reports/АнализОпроса/АнализОпроса.mdo create mode 100644 SSL/src/Reports/АнкетированиеАналитическийОтчет/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs create mode 100644 SSL/src/Reports/АнкетированиеАналитическийОтчет/АнкетированиеАналитическийОтчет.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/Задачи/Help/ru.html 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 create mode 100644 SSL/src/Reports/ОтчетПоБизнесПроцессам/ManagerModule.bsl create mode 100644 SSL/src/Reports/ОтчетПоБизнесПроцессам/Templates/Макет/Template.dcs create mode 100644 SSL/src/Reports/ОтчетПоБизнесПроцессам/ОтчетПоБизнесПроцессам.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/ОтчетПоВерсиям/ManagerModule.bsl create mode 100644 SSL/src/Reports/ОтчетПоВерсиям/ObjectModule.bsl create mode 100644 SSL/src/Reports/ОтчетПоВерсиям/Templates/СтандартныйМакетПредставленияОбъекта/Template.mxlx create mode 100644 SSL/src/Reports/ОтчетПоВерсиям/ОтчетПоВерсиям.mdo create mode 100644 SSL/src/Reports/ОтчетПоЗаданиям/ManagerModule.bsl create mode 100644 SSL/src/Reports/ОтчетПоЗаданиям/Templates/Макет/Template.dcs create mode 100644 SSL/src/Reports/ОтчетПоЗаданиям/ОтчетПоЗаданиям.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/СписокЗависшихЗадач/Help/ru.html 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 create mode 100644 SSL/src/Reports/СписокИстекающихЗадач/Forms/ФормаОтчета/Form.form create mode 100644 SSL/src/Reports/СписокИстекающихЗадач/Forms/ФормаОтчета/Module.bsl create mode 100644 SSL/src/Reports/СписокИстекающихЗадач/Help/ru.html 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 create mode 100644 SSL/src/Reports/СписокПросроченныхЗадач/Forms/ФормаОтчета/Form.form create mode 100644 SSL/src/Reports/СписокПросроченныхЗадач/Forms/ФормаОтчета/Module.bsl create mode 100644 SSL/src/Reports/СписокПросроченныхЗадач/Help/ru.html 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 create mode 100644 SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Forms/ФормаОтчета/Form.form create mode 100644 SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Forms/ФормаОтчета/Module.bsl create mode 100644 SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Help/ru.html 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 create mode 100644 SSL/src/Roles/Администрирование/Rights.rights create mode 100644 SSL/src/Roles/Администрирование/Администрирование.mdo create mode 100644 SSL/src/Roles/БазовыеПрава/Rights.rights create mode 100644 SSL/src/Roles/БазовыеПрава/БазовыеПрава.mdo create mode 100644 SSL/src/Roles/ВыводНаПринтерФайлБуферОбмена/Rights.rights create mode 100644 SSL/src/Roles/ВыводНаПринтерФайлБуферОбмена/ВыводНаПринтерФайлБуферОбмена.mdo create mode 100644 SSL/src/Roles/ВыполнениеОбменовДанными/Rights.rights create mode 100644 SSL/src/Roles/ВыполнениеОбменовДанными/ВыполнениеОбменовДанными.mdo create mode 100644 SSL/src/Roles/ДобавлениеИзменениеБазовойНСИ/Rights.rights create mode 100644 SSL/src/Roles/ДобавлениеИзменениеБазовойНСИ/ДобавлениеИзменениеБазовойНСИ.mdo create mode 100644 SSL/src/Roles/ДобавлениеИзменениеВариантовОтчетов/Rights.rights create mode 100644 SSL/src/Roles/ДобавлениеИзменениеВариантовОтчетов/ДобавлениеИзменениеВариантовОтчетов.mdo create mode 100644 SSL/src/Roles/ДобавлениеИзменениеВнешнихПользователей/Rights.rights create mode 100644 SSL/src/Roles/ДобавлениеИзменениеВнешнихПользователей/ДобавлениеИзменениеВнешнихПользователей.mdo create mode 100644 SSL/src/Roles/ДобавлениеИзменениеДополнительныхОтчетовИОбработок/Rights.rights create mode 100644 SSL/src/Roles/ДобавлениеИзменениеДополнительныхОтчетовИОбработок/ДобавлениеИзменениеДополнительныхОтчетовИОбработок.mdo create mode 100644 SSL/src/Roles/ДобавлениеИзменениеЗаданий/Rights.rights create mode 100644 SSL/src/Roles/ДобавлениеИзменениеЗаданий/ДобавлениеИзменениеЗаданий.mdo create mode 100644 SSL/src/Roles/ДобавлениеИзменениеОбменовДанными/Rights.rights create mode 100644 SSL/src/Roles/ДобавлениеИзменениеОбменовДанными/ДобавлениеИзменениеОбменовДанными.mdo create mode 100644 SSL/src/Roles/ДобавлениеИзменениеОпросов/Rights.rights create mode 100644 SSL/src/Roles/ДобавлениеИзменениеОпросов/ДобавлениеИзменениеОпросов.mdo create mode 100644 SSL/src/Roles/ДобавлениеИзменениеОтветовНаВопросыАнкет/Rights.rights create mode 100644 SSL/src/Roles/ДобавлениеИзменениеОтветовНаВопросыАнкет/ДобавлениеИзменениеОтветовНаВопросыАнкет.mdo create mode 100644 SSL/src/Roles/ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц/Rights.rights create mode 100644 SSL/src/Roles/ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц/ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц.mdo create mode 100644 SSL/src/Roles/ДобавлениеИзменениеПользователейИГруппДоступа/Rights.rights create mode 100644 SSL/src/Roles/ДобавлениеИзменениеПользователейИГруппДоступа/ДобавлениеИзменениеПользователейИГруппДоступа.mdo create mode 100644 SSL/src/Roles/ДобавлениеИзменениеРолейИсполнителей/Rights.rights create mode 100644 SSL/src/Roles/ДобавлениеИзменениеРолейИсполнителей/ДобавлениеИзменениеРолейИсполнителей.mdo create mode 100644 SSL/src/Roles/ДобавлениеИзменениеФизическихЛиц/Rights.rights create mode 100644 SSL/src/Roles/ДобавлениеИзменениеФизическихЛиц/ДобавлениеИзменениеФизическихЛиц.mdo create mode 100644 SSL/src/Roles/ДобавлениеИзменениеШаблоновАнкет/Rights.rights create mode 100644 SSL/src/Roles/ДобавлениеИзменениеШаблоновАнкет/ДобавлениеИзменениеШаблоновАнкет.mdo create mode 100644 SSL/src/Roles/ЗапускAutomation/Rights.rights create mode 100644 SSL/src/Roles/ЗапускAutomation/ЗапускAutomation.mdo create mode 100644 SSL/src/Roles/ЗапускВебКлиента/Rights.rights create mode 100644 SSL/src/Roles/ЗапускВебКлиента/ЗапускВебКлиента.mdo create mode 100644 SSL/src/Roles/ЗапускВнешнегоСоединения/Rights.rights create mode 100644 SSL/src/Roles/ЗапускВнешнегоСоединения/ЗапускВнешнегоСоединения.mdo create mode 100644 SSL/src/Roles/ЗапускТолстогоКлиента/Rights.rights create mode 100644 SSL/src/Roles/ЗапускТолстогоКлиента/ЗапускТолстогоКлиента.mdo create mode 100644 SSL/src/Roles/ЗапускТонкогоКлиента/Rights.rights create mode 100644 SSL/src/Roles/ЗапускТонкогоКлиента/ЗапускТонкогоКлиента.mdo create mode 100644 SSL/src/Roles/ИзменениеВыполнениеЗадач/Rights.rights create mode 100644 SSL/src/Roles/ИзменениеВыполнениеЗадач/ИзменениеВыполнениеЗадач.mdo create mode 100644 SSL/src/Roles/ИзменениеДополнительныхСведений/Rights.rights create mode 100644 SSL/src/Roles/ИзменениеДополнительныхСведений/ИзменениеДополнительныхСведений.mdo create mode 100644 SSL/src/Roles/ИзменениеМакетовПечатныхФорм/Rights.rights create mode 100644 SSL/src/Roles/ИзменениеМакетовПечатныхФорм/ИзменениеМакетовПечатныхФорм.mdo create mode 100644 SSL/src/Roles/ИзменениеТекущегоВнешнегоПользователя/Rights.rights create mode 100644 SSL/src/Roles/ИзменениеТекущегоВнешнегоПользователя/ИзменениеТекущегоВнешнегоПользователя.mdo create mode 100644 SSL/src/Roles/ИзменениеТекущегоПользователя/Rights.rights create mode 100644 SSL/src/Roles/ИзменениеТекущегоПользователя/ИзменениеТекущегоПользователя.mdo create mode 100644 SSL/src/Roles/ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок/Rights.rights create mode 100644 SSL/src/Roles/ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок/ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок.mdo create mode 100644 SSL/src/Roles/ИспользованиеДополнительныхОтчетовИОбработок/Rights.rights create mode 100644 SSL/src/Roles/ИспользованиеДополнительныхОтчетовИОбработок/ИспользованиеДополнительныхОтчетовИОбработок.mdo create mode 100644 SSL/src/Roles/ИспользованиеУчетныхЗаписейЭлектроннойПочты/Rights.rights create mode 100644 SSL/src/Roles/ИспользованиеУчетныхЗаписейЭлектроннойПочты/ИспользованиеУчетныхЗаписейЭлектроннойПочты.mdo create mode 100644 SSL/src/Roles/ОбновлениеКонфигурацииБазыДанных/Rights.rights create mode 100644 SSL/src/Roles/ОбновлениеКонфигурацииБазыДанных/ОбновлениеКонфигурацииБазыДанных.mdo create mode 100644 SSL/src/Roles/ПолныеПрава/Rights.rights create mode 100644 SSL/src/Roles/ПолныеПрава/ПолныеПрава.mdo create mode 100644 SSL/src/Roles/ПроверкаДоступныхОбновленийКонфигурации/Rights.rights create mode 100644 SSL/src/Roles/ПроверкаДоступныхОбновленийКонфигурации/ПроверкаДоступныхОбновленийКонфигурации.mdo create mode 100644 SSL/src/Roles/ПросмотрЖурналаРегистрации/Rights.rights create mode 100644 SSL/src/Roles/ПросмотрЖурналаРегистрации/ПросмотрЖурналаРегистрации.mdo create mode 100644 SSL/src/Roles/РедактированиеРеквизитовОбъектов/Rights.rights create mode 100644 SSL/src/Roles/РедактированиеРеквизитовОбъектов/РедактированиеРеквизитовОбъектов.mdo create mode 100644 SSL/src/Roles/ЧтениеБазовойНСИ/Rights.rights create mode 100644 SSL/src/Roles/ЧтениеБазовойНСИ/ЧтениеБазовойНСИ.mdo create mode 100644 SSL/src/Roles/ЧтениеВнешнихПользователей/Rights.rights create mode 100644 SSL/src/Roles/ЧтениеВнешнихПользователей/ЧтениеВнешнихПользователей.mdo create mode 100644 SSL/src/Roles/ЧтениеДополнительныхСведений/Rights.rights create mode 100644 SSL/src/Roles/ЧтениеДополнительныхСведений/ЧтениеДополнительныхСведений.mdo create mode 100644 SSL/src/Roles/ЧтениеЗаданий/Rights.rights create mode 100644 SSL/src/Roles/ЧтениеЗаданий/ЧтениеЗаданий.mdo create mode 100644 SSL/src/Roles/ЧтениеЗадач/Rights.rights create mode 100644 SSL/src/Roles/ЧтениеЗадач/ЧтениеЗадач.mdo create mode 100644 SSL/src/Roles/ЧтениеОтветовНаВопросыАнкет/Rights.rights create mode 100644 SSL/src/Roles/ЧтениеОтветовНаВопросыАнкет/ЧтениеОтветовНаВопросыАнкет.mdo create mode 100644 SSL/src/Roles/ЧтениеПерсональныхДанныхФизическихЛиц/Rights.rights create mode 100644 SSL/src/Roles/ЧтениеПерсональныхДанныхФизическихЛиц/ЧтениеПерсональныхДанныхФизическихЛиц.mdo create mode 100644 SSL/src/Roles/ЧтениеФизическихЛиц/Rights.rights create mode 100644 SSL/src/Roles/ЧтениеФизическихЛиц/ЧтениеФизическихЛиц.mdo create mode 100644 SSL/src/ScheduledJobs/ВыполнениеОбменаДанными/Schedule.schedule create mode 100644 SSL/src/ScheduledJobs/ВыполнениеОбменаДанными/ВыполнениеОбменаДанными.mdo create mode 100644 SSL/src/ScheduledJobs/ЗагрузкаКурсовВалют/Schedule.schedule create mode 100644 SSL/src/ScheduledJobs/ЗагрузкаКурсовВалют/ЗагрузкаКурсовВалют.mdo create mode 100644 SSL/src/ScheduledJobs/ЗаполнениеДанныхДляОграниченияДоступа/Schedule.schedule create mode 100644 SSL/src/ScheduledJobs/ЗаполнениеДанныхДляОграниченияДоступа/ЗаполнениеДанныхДляОграниченияДоступа.mdo create mode 100644 SSL/src/ScheduledJobs/ЗапускДополнительныхОбработок/ЗапускДополнительныхОбработок.mdo create mode 100644 SSL/src/ScheduledJobs/ИзвлечениеТекста/Schedule.schedule create mode 100644 SSL/src/ScheduledJobs/ИзвлечениеТекста/ИзвлечениеТекста.mdo create mode 100644 SSL/src/ScheduledJobs/КонтрольЖурналаРегистрации/Schedule.schedule create mode 100644 SSL/src/ScheduledJobs/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo create mode 100644 SSL/src/ScheduledJobs/МониторингЗадач/Schedule.schedule create mode 100644 SSL/src/ScheduledJobs/МониторингЗадач/МониторингЗадач.mdo create mode 100644 SSL/src/ScheduledJobs/ОбновлениеАгрегатов/ОбновлениеАгрегатов.mdo create mode 100644 SSL/src/ScheduledJobs/ОбновлениеИндексаППД/Schedule.schedule create mode 100644 SSL/src/ScheduledJobs/ОбновлениеИндексаППД/ОбновлениеИндексаППД.mdo create mode 100644 SSL/src/ScheduledJobs/ПерестроениеАгрегатов/ПерестроениеАгрегатов.mdo create mode 100644 SSL/src/ScheduledJobs/СлияниеИндексаППД/Schedule.schedule create mode 100644 SSL/src/ScheduledJobs/СлияниеИндексаППД/СлияниеИндексаППД.mdo create mode 100644 SSL/src/ScheduledJobs/УведомлениеИсполнителейОНовыхЗадачах/Schedule.schedule create mode 100644 SSL/src/ScheduledJobs/УведомлениеИсполнителейОНовыхЗадачах/УведомлениеИсполнителейОНовыхЗадачах.mdo create mode 100644 SSL/src/ScheduledJobs/УстановкаПериодаРассчитанныхИтогов/УстановкаПериодаРассчитанныхИтогов.mdo create mode 100644 SSL/src/SessionParameters/ВидыДоступаБезГруппЗначенияДоступа/ВидыДоступаБезГруппЗначенияДоступа.mdo create mode 100644 SSL/src/SessionParameters/ВидыДоступаБезОграничения/ВидыДоступаБезОграничения.mdo create mode 100644 SSL/src/SessionParameters/ВидыДоступаЕдинственныеДляТипаЗначенияДоступа/ВидыДоступаЕдинственныеДляТипаЗначенияДоступа.mdo create mode 100644 SSL/src/SessionParameters/ВидыДоступаЧерезПраваПоЗначениямДоступа/ВидыДоступаЧерезПраваПоЗначениямДоступа.mdo create mode 100644 SSL/src/SessionParameters/ДатаОбновленияПовторноИспользуемыхЗначенийМРО/ДатаОбновленияПовторноИспользуемыхЗначенийМРО.mdo create mode 100644 SSL/src/SessionParameters/ИспользуемыеПланыОбмена/ИспользуемыеПланыОбмена.mdo create mode 100644 SSL/src/SessionParameters/ОбменДаннымиВключен/ОбменДаннымиВключен.mdo create mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВиду/ОграничиватьДоступПоВиду.mdo create mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуВнешниеПользователи/ОграничиватьДоступПоВидуВнешниеПользователи.mdo create mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуДополнительныеСведения/ОграничиватьДоступПоВидуДополнительныеСведения.mdo create mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуОбъект/ОграничиватьДоступПоВидуОбъект.mdo create mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуПользователи/ОграничиватьДоступПоВидуПользователи.mdo create mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоДобавления/ОграничиватьДоступПоВидуПравоДобавления.mdo create mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоИзменения/ОграничиватьДоступПоВидуПравоИзменения.mdo create mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоЧтения/ОграничиватьДоступПоВидуПравоЧтения.mdo create mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуУсловие/ОграничиватьДоступПоВидуУсловие.mdo create mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуУчетныеЗаписиЭлектроннойПочты/ОграничиватьДоступПоВидуУчетныеЗаписиЭлектроннойПочты.mdo create mode 100644 SSL/src/SessionParameters/ПравилаВыборочнойРегистрацииОбъектов/ПравилаВыборочнойРегистрацииОбъектов.mdo create mode 100644 SSL/src/SessionParameters/ПравилаРегистрацииОбъектов/ПравилаРегистрацииОбъектов.mdo create mode 100644 SSL/src/SessionParameters/ПредлагатьУстановкуРасширенияРаботыСФайлами/ПредлагатьУстановкуРасширенияРаботыСФайлами.mdo create mode 100644 SSL/src/SessionParameters/ПутьКРабочемуКаталогуПользователя/ПутьКРабочемуКаталогуПользователя.mdo create mode 100644 SSL/src/SessionParameters/ТекущийВнешнийПользователь/ТекущийВнешнийПользователь.mdo create mode 100644 SSL/src/SessionParameters/ТекущийПользователь/ТекущийПользователь.mdo create mode 100644 SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/ConditionalAppearance.dcssca create mode 100644 SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/Form.form create mode 100644 SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/Help/ru.html create mode 100644 SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/Module.bsl create mode 100644 SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/ConditionalAppearance.dcssca create mode 100644 SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/Form.form create mode 100644 SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/Help/ru.html create mode 100644 SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/Module.bsl create mode 100644 SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/ManagerModule.bsl create mode 100644 SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/ХранилищеВариантовОтчетов.mdo create mode 100644 SSL/src/StyleItems/ВыполненнаяЗадача/ВыполненнаяЗадача.mdo create mode 100644 SSL/src/StyleItems/ЗавершенныйБизнесПроцесс/ЗавершенныйБизнесПроцесс.mdo create mode 100644 SSL/src/StyleItems/НеСтартованныйБизнесПроцесс/НеСтартованныйБизнесПроцесс.mdo create mode 100644 SSL/src/StyleItems/ПользовательВыбранный/ПользовательВыбранный.mdo create mode 100644 SSL/src/StyleItems/ПоясняющийОшибкуТекст/ПоясняющийОшибкуТекст.mdo create mode 100644 SSL/src/StyleItems/ПоясняющийТекст/ПоясняющийТекст.mdo create mode 100644 SSL/src/StyleItems/ПросроченнаяЗадача/ПросроченнаяЗадача.mdo create mode 100644 SSL/src/StyleItems/РольБезИсполнителей/РольБезИсполнителей.mdo create mode 100644 SSL/src/StyleItems/УдаленныйДополнительныйРеквизитЦвет/УдаленныйДополнительныйРеквизитЦвет.mdo create mode 100644 SSL/src/StyleItems/УдаленныйДополнительныйРеквизитШрифт/УдаленныйДополнительныйРеквизитШрифт.mdo create mode 100644 SSL/src/StyleItems/ФайлЗанятыйДругимПользователем/ФайлЗанятыйДругимПользователем.mdo create mode 100644 SSL/src/StyleItems/ФайлЗанятыйТекущимПользователем/ФайлЗанятыйТекущимПользователем.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/АдресныйКлассификатор/АдресныйКлассификатор.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Анкетирование/CommandInterface.cmi create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Анкетирование/Анкетирование.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БазоваяФункциональность/БазоваяФункциональность.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БизнесПроцессыИЗадачи/CommandInterface.cmi create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БизнесПроцессыИЗадачи/БизнесПроцессыИЗадачи.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Валюты/Валюты.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВариантыОтчетов/ВариантыОтчетов.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВерсионированиеОбъектов/ВерсионированиеОбъектов.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗавершениеРаботыПользователей/CommandInterface.cmi create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗавершениеРаботыПользователей/ЗавершениеРаботыПользователей.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗапретРедактированияРеквизитовОбъектов/ЗапретРедактированияРеквизитовОбъектов.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КалендарныеГрафики/КалендарныеГрафики.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтактнаяИнформация/КонтактнаяИнформация.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтрольДинамическогоОбновленияКонфигурации/КонтрольДинамическогоОбновленияКонфигурации.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/НастройкаПорядкаЭлементов/НастройкаПорядкаЭлементов.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбменДанными/ОбменДанными.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбновлениеВерсииИБ/ОбновлениеВерсииИБ.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбновлениеКонфигурации/ОбновлениеКонфигурации.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Организации/Организации.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Печать/Печать.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПолнотекстовыйПоиск/ПолнотекстовыйПоиск.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПолучениеФайловИзИнтернета/ПолучениеФайловИзИнтернета.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Пользователи/Пользователи.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПрефиксацияОбъектов/ПрефиксацияОбъектов.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПроверкаЛегальностиПолученияОбновления/ПроверкаЛегальностиПолученияОбновления.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РаботаСПочтовымиСообщениями/РаботаСПочтовымиСообщениями.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РаботаСФайлами/РаботаСФайлами.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РегламентныеЗадания/РегламентныеЗадания.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Свойства/Свойства.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/СтруктураПодчиненности/СтруктураПодчиненности.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеДоступом/УправлениеДоступом.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеИтогамиИАгрегатами/УправлениеИтогамиИАгрегатами.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ФизическиеЛица/ФизическиеЛица.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/СтандартныеПодсистемы.mdo create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Commands/ВсеЗадачи/CommandModule.bsl create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Commands/Выполнено/CommandModule.bsl create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Commands/МоиЗадачи/CommandModule.bsl create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Commands/Перенаправить/CommandModule.bsl create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Form.form create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Help/ru.html create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Module.bsl create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоБизнесПроцессу/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоБизнесПроцессу/Form.form create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоБизнесПроцессу/Module.bsl create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоПредмету/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоПредмету/Form.form create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоПредмету/Module.bsl create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачи/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачи/Form.form create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачи/Module.bsl create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачиДляРабочегоСтола/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачиДляРабочегоСтола/Form.form create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачиДляРабочегоСтола/Module.bsl create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/ПеренаправитьЗадачи/Form.form create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/ПеренаправитьЗадачи/Help/ru.html create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/ПеренаправитьЗадачи/Module.bsl create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаЗадачи/Form.form create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаЗадачи/Module.bsl create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Form.form create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/Help/ru.html create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/ManagerModule.bsl create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/ObjectModule.bsl create mode 100644 SSL/src/Tasks/ЗадачаИсполнителя/ЗадачаИсполнителя.mdo diff --git a/SSL/.project b/SSL/.project new file mode 100644 index 000000000..ff22eae74 --- /dev/null +++ b/SSL/.project @@ -0,0 +1,18 @@ + + + SSL + + + + + + org.eclipse.xtext.ui.shared.xtextBuilder + + + + + + org.eclipse.xtext.ui.shared.xtextNature + com._1c.g5.v8.dt.core.V8ConfigurationNature + + diff --git a/SSL/.settings/org.eclipse.core.resources.prefs b/SSL/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..99f26c020 --- /dev/null +++ b/SSL/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/SSL/DT-INF/PROJECT.PMF b/SSL/DT-INF/PROJECT.PMF new file mode 100644 index 000000000..579f0fe27 --- /dev/null +++ b/SSL/DT-INF/PROJECT.PMF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 +Runtime-Version: 8.5.1 diff --git a/SSL/src/BusinessProcesses/Задание/Flowchart.scheme b/SSL/src/BusinessProcesses/Задание/Flowchart.scheme new file mode 100644 index 000000000..afdbe8b49 --- /dev/null +++ b/SSL/src/BusinessProcesses/Задание/Flowchart.scheme @@ -0,0 +1,980 @@ + + + style:FieldBackColor + true + Lines + 20 + 20 + + 9 + Portrait + 1 + 1 + 10 + 10 + 10 + 10 + false + 7 + Auto + + + + + Старт + + <ToolTip/> + <TabOrder>1</TabOrder> + <BackColor>auto</BackColor> + <TextColor>style:FormTextColor</TextColor> + <LineColor>style:BorderColor</LineColor> + <GroupNumber>0</GroupNumber> + <ZOrder>0</ZOrder> + <Hyperlink>false</Hyperlink> + <Transparent>false</Transparent> + <Font xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" ref="sys:DefaultGUIFont" kind="WindowsFont"/> + <HorizontalAlign>Center</HorizontalAlign> + <VerticalAlign>Center</VerticalAlign> + <PictureLocation>Left</PictureLocation> + <Location top="20" left="380" bottom="60" right="420"/> + <Border width="1" gap="false"> + <v8ui:style xsi:type="sch:ConnectorLineType">Solid</v8ui:style> + </Border> + <Picture/> + <PictureSize>AutoSize</PictureSize> + </Properties> + <Events> + <Event name="BeforeStart"/> + </Events> + </Start> + <ConnectionLine id="2"> + <Properties> + <Name>Линия1</Name> + <Title/> + <ToolTip/> + <TabOrder>2</TabOrder> + <BackColor>#000000</BackColor> + <TextColor>style:FormTextColor</TextColor> + <LineColor>style:BorderColor</LineColor> + <GroupNumber>0</GroupNumber> + <ZOrder>1</ZOrder> + <Hyperlink>false</Hyperlink> + <Transparent>false</Transparent> + <Font xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" ref="sys:DefaultGUIFont" kind="WindowsFont"/> + <HorizontalAlign>Center</HorizontalAlign> + <VerticalAlign>Center</VerticalAlign> + <PictureLocation>Left</PictureLocation> + <PivotPoints> + <Point x="400" y="60"/> + <Point x="400" y="80"/> + <Point x="400" y="80"/> + <Point x="400" y="100"/> + </PivotPoints> + <Connect> + <From> + <Item>Старт</Item> + <PortIndex>4</PortIndex> + </From> + <To> + <Item>Выполнить</Item> + <PortIndex>2</PortIndex> + </To> + </Connect> + <Line width="1" gap="false"> + <v8ui:style xsi:type="sch:ConnectorLineType">Solid</v8ui:style> + </Line> + <DecorativeLine>false</DecorativeLine> + <TextLocation>FirstSegment</TextLocation> + <BeginArrow>None</BeginArrow> + <EndArrow>Filled</EndArrow> + </Properties> + </ConnectionLine> + <Activity id="3" uuid="fa123bb1-d6d4-46b6-9285-47328d5526b2"> + <Properties> + <Name>Выполнить</Name> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Выполнить</v8:content> + </v8:item> + + + 3 + auto + style:FormTextColor + style:BorderColor + 0 + 2 + false + false + + Center + Center + Left + + + Solid + + + AutoSize + Выполнить + Исполнитель + false + + + + + + + + + + + + + + + + + + + ВыполнитьПриСозданииЗадач + ВыполнитьПриВыполнении + + + + + + + + Линия2 + + <ToolTip/> + <TabOrder>4</TabOrder> + <BackColor>#000000</BackColor> + <TextColor>style:FormTextColor</TextColor> + <LineColor>style:BorderColor</LineColor> + <GroupNumber>0</GroupNumber> + <ZOrder>3</ZOrder> + <Hyperlink>false</Hyperlink> + <Transparent>false</Transparent> + <Font xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" ref="sys:DefaultGUIFont" kind="WindowsFont"/> + <HorizontalAlign>Center</HorizontalAlign> + <VerticalAlign>Center</VerticalAlign> + <PictureLocation>Left</PictureLocation> + <PivotPoints> + <Point x="400" y="160"/> + <Point x="400" y="180"/> + <Point x="400" y="180"/> + <Point x="400" y="200"/> + </PivotPoints> + <Connect> + <From> + <Item>Выполнить</Item> + <PortIndex>4</PortIndex> + </From> + <To> + <Item>НужнаПроверка</Item> + <PortIndex>2</PortIndex> + </To> + </Connect> + <Line width="1" gap="false"> + <v8ui:style xsi:type="sch:ConnectorLineType">Solid</v8ui:style> + </Line> + <DecorativeLine>false</DecorativeLine> + <TextLocation>FirstSegment</TextLocation> + <BeginArrow>None</BeginArrow> + <EndArrow>Filled</EndArrow> + </Properties> + </ConnectionLine> + <Activity id="5" uuid="74a2cd47-0642-4401-8831-720bd844f736"> + <Properties> + <Name>Проверить</Name> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Проверить</v8:content> + </v8:item> + + + 5 + auto + style:FormTextColor + style:BorderColor + 0 + 4 + false + false + + Center + Center + Left + + + Solid + + + AutoSize + Проверить + Проверяющий + false + + + + + + + + + + + + + + + + + + + ПроверитьПриСозданииЗадач + ПроверитьПриВыполнении + + + + + + + + Линия3 + + <ToolTip/> + <TabOrder>6</TabOrder> + <BackColor>#000000</BackColor> + <TextColor>style:FormTextColor</TextColor> + <LineColor>style:BorderColor</LineColor> + <GroupNumber>0</GroupNumber> + <ZOrder>5</ZOrder> + <Hyperlink>false</Hyperlink> + <Transparent>false</Transparent> + <Font xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" ref="sys:DefaultGUIFont" kind="WindowsFont"/> + <HorizontalAlign>Center</HorizontalAlign> + <VerticalAlign>Center</VerticalAlign> + <PictureLocation>Left</PictureLocation> + <PivotPoints> + <Point x="400" y="360"/> + <Point x="400" y="380"/> + <Point x="400" y="380"/> + <Point x="400" y="400"/> + </PivotPoints> + <Connect> + <From> + <Item>Проверить</Item> + <PortIndex>4</PortIndex> + </From> + <To> + <Item>ВернутьИсполнителю</Item> + <PortIndex>2</PortIndex> + </To> + </Connect> + <Line width="1" gap="false"> + <v8ui:style xsi:type="sch:ConnectorLineType">Solid</v8ui:style> + </Line> + <DecorativeLine>false</DecorativeLine> + <TextLocation>FirstSegment</TextLocation> + <BeginArrow>None</BeginArrow> + <EndArrow>Filled</EndArrow> + </Properties> + </ConnectionLine> + <Condition id="11" uuid="6427007c-b0ff-468b-944b-6b183bb9ba6d"> + <Properties> + <Name>ВернутьИсполнителю</Name> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Вернуть исполнителю?</v8:content> + </v8:item> + + + 8 + auto + style:FormTextColor + style:BorderColor + 0 + 6 + false + false + + Center + Center + Left + + + Solid + + + AutoSize + 3 + 1 + + + ВернутьИсполнителюПроверкаУсловия + + + + + Линия4 + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Нет</v8:content> + </v8:item> + + + 9 + #000000 + style:FormTextColor + style:BorderColor + 0 + 7 + false + false + + Center + Center + Left + + + + + + + + + + + + + + + + ВернутьИсполнителю + 1 + + + Завершение + 2 + + + + Solid + + false + FirstSegment + None + Filled + + + + + Линия5 + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Да</v8:content> + </v8:item> + + + 10 + #000000 + style:FormTextColor + style:BorderColor + 0 + 8 + false + false + + Center + Center + Left + + + + + + + + + + + + + + + + ВернутьИсполнителю + 3 + + + Выполнить + 2 + + + + Solid + + false + FirstSegment + None + Filled + + + + + НужнаПроверка + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Нужна проверка?</v8:content> + </v8:item> + + + 11 + auto + style:FormTextColor + style:BorderColor + 0 + 9 + false + false + + Center + Center + Left + + + Solid + + + AutoSize + 3 + 1 + + + НужнаПроверкаПроверкаУсловия + + + + + Линия6 + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Нет</v8:content> + </v8:item> + + + 12 + #000000 + style:FormTextColor + style:BorderColor + 0 + 10 + false + false + + Center + Center + Left + + + + + + + + + + + + + + + + + + + + НужнаПроверка + 1 + + + Завершение + 2 + + + + Solid + + false + FirstSegment + None + Filled + + + + + Линия7 + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Да</v8:content> + </v8:item> + + + 13 + #000000 + style:FormTextColor + style:BorderColor + 0 + 11 + false + false + + Center + Center + Left + + + + + + + + + + + + + + + + НужнаПроверка + 3 + + + Проверить + 2 + + + + Solid + + false + FirstSegment + None + Filled + + + + + ДекоративнаяЛиния1 + + <ToolTip/> + <TabOrder>14</TabOrder> + <BackColor>#000000</BackColor> + <TextColor>style:FormTextColor</TextColor> + <LineColor>style:BorderColor</LineColor> + <GroupNumber>0</GroupNumber> + <ZOrder>12</ZOrder> + <Hyperlink>false</Hyperlink> + <Transparent>false</Transparent> + <Font xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" ref="sys:DefaultGUIFont" kind="WindowsFont"/> + <HorizontalAlign>Center</HorizontalAlign> + <VerticalAlign>Center</VerticalAlign> + <PictureLocation>Left</PictureLocation> + <PivotPoints> + <Point x="160" y="20"/> + <Point x="160" y="640"/> + </PivotPoints> + <Connect> + <From> + <Item/> + <PortIndex>0</PortIndex> + </From> + <To> + <Item/> + <PortIndex>0</PortIndex> + </To> + </Connect> + <Line width="1" gap="false"> + <v8ui:style xsi:type="sch:ConnectorLineType">Dashed</v8ui:style> + </Line> + <DecorativeLine>true</DecorativeLine> + <TextLocation>FirstSegment</TextLocation> + <BeginArrow>None</BeginArrow> + <EndArrow>None</EndArrow> + </Properties> + </ConnectionLine> + <ConnectionLine id="24"> + <Properties> + <Name>ДекоративнаяЛиния2</Name> + <Title/> + <ToolTip/> + <TabOrder>15</TabOrder> + <BackColor>#000000</BackColor> + <TextColor>style:FormTextColor</TextColor> + <LineColor>style:BorderColor</LineColor> + <GroupNumber>0</GroupNumber> + <ZOrder>13</ZOrder> + <Hyperlink>false</Hyperlink> + <Transparent>false</Transparent> + <Font xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" ref="sys:DefaultGUIFont" kind="WindowsFont"/> + <HorizontalAlign>Center</HorizontalAlign> + <VerticalAlign>Center</VerticalAlign> + <PictureLocation>Left</PictureLocation> + <PivotPoints> + <Point x="540" y="20"/> + <Point x="540" y="640"/> + </PivotPoints> + <Connect> + <From> + <Item/> + <PortIndex>0</PortIndex> + </From> + <To> + <Item/> + <PortIndex>0</PortIndex> + </To> + </Connect> + <Line width="1" gap="false"> + <v8ui:style xsi:type="sch:ConnectorLineType">Dashed</v8ui:style> + </Line> + <DecorativeLine>true</DecorativeLine> + <TextLocation>FirstSegment</TextLocation> + <BeginArrow>None</BeginArrow> + <EndArrow>None</EndArrow> + </Properties> + </ConnectionLine> + <Decoration id="25"> + <Properties> + <Name>Декорация1</Name> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>постановка задачи</v8:content> + </v8:item> + + + 16 + auto + style:FormTextColor + style:BorderColor + 0 + 14 + false + true + + Center + Center + Left + + + AutoSize + Document + 0 + 0 + + + + + ДекоративнаяЛиния3 + + <ToolTip/> + <TabOrder>17</TabOrder> + <BackColor>#000000</BackColor> + <TextColor>style:FormTextColor</TextColor> + <LineColor>style:BorderColor</LineColor> + <GroupNumber>0</GroupNumber> + <ZOrder>15</ZOrder> + <Hyperlink>false</Hyperlink> + <Transparent>false</Transparent> + <Font xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" ref="sys:DefaultGUIFont" kind="WindowsFont"/> + <HorizontalAlign>Center</HorizontalAlign> + <VerticalAlign>Center</VerticalAlign> + <PictureLocation>Left</PictureLocation> + <PivotPoints> + <Point x="140" y="130"/> + <Point x="240" y="130"/> + <Point x="240" y="130"/> + <Point x="340" y="130"/> + </PivotPoints> + <Connect> + <From> + <Item>Декорация1</Item> + <PortIndex>5</PortIndex> + </From> + <To> + <Item>Выполнить</Item> + <PortIndex>1</PortIndex> + </To> + </Connect> + <Line width="1" gap="false"> + <v8ui:style xsi:type="sch:ConnectorLineType">Dashed</v8ui:style> + </Line> + <DecorativeLine>true</DecorativeLine> + <TextLocation>FirstSegment</TextLocation> + <BeginArrow>None</BeginArrow> + <EndArrow>Filled</EndArrow> + </Properties> + </ConnectionLine> + <Decoration id="27"> + <Properties> + <Name>Декорация2</Name> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>результат выполнения (оценка исполнителя): +- выполнено; +- отменено.</v8:content> + </v8:item> + + + 18 + auto + style:FormTextColor + style:BorderColor + 0 + 16 + false + true + + Left + Center + Left + + + AutoSize + Document + 0 + 0 + + + + + Декорация3 + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>результат выполнения (оценка исполнителя)</v8:content> + </v8:item> + + + 20 + auto + style:FormTextColor + style:BorderColor + 0 + 17 + false + true + + Center + Center + Left + + + AutoSize + Document + 0 + 0 + + + + + ДекоративнаяЛиния5 + + <ToolTip/> + <TabOrder>21</TabOrder> + <BackColor>#000000</BackColor> + <TextColor>style:FormTextColor</TextColor> + <LineColor>style:BorderColor</LineColor> + <GroupNumber>0</GroupNumber> + <ZOrder>18</ZOrder> + <Hyperlink>false</Hyperlink> + <Transparent>false</Transparent> + <Font xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" ref="sys:DefaultGUIFont" kind="WindowsFont"/> + <HorizontalAlign>Center</HorizontalAlign> + <VerticalAlign>Center</VerticalAlign> + <PictureLocation>Left</PictureLocation> + <PivotPoints> + <Point x="320" y="330"/> + <Point x="330" y="330"/> + <Point x="330" y="330"/> + <Point x="340" y="330"/> + </PivotPoints> + <Connect> + <From> + <Item>Декорация3</Item> + <PortIndex>5</PortIndex> + </From> + <To> + <Item>Проверить</Item> + <PortIndex>1</PortIndex> + </To> + </Connect> + <Line width="1" gap="false"> + <v8ui:style xsi:type="sch:ConnectorLineType">Dashed</v8ui:style> + </Line> + <DecorativeLine>true</DecorativeLine> + <TextLocation>FirstSegment</TextLocation> + <BeginArrow>None</BeginArrow> + <EndArrow>Filled</EndArrow> + </Properties> + </ConnectionLine> + <ConnectionLine id="34"> + <Properties> + <Name>ДекоративнаяЛиния4</Name> + <Title/> + <ToolTip/> + <TabOrder>24</TabOrder> + <BackColor>#000000</BackColor> + <TextColor>style:FormTextColor</TextColor> + <LineColor>style:BorderColor</LineColor> + <GroupNumber>0</GroupNumber> + <ZOrder>19</ZOrder> + <Hyperlink>false</Hyperlink> + <Transparent>false</Transparent> + <Font xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" ref="sys:DefaultGUIFont" kind="WindowsFont"/> + <HorizontalAlign>Center</HorizontalAlign> + <VerticalAlign>Center</VerticalAlign> + <PictureLocation>Left</PictureLocation> + <PivotPoints> + <Point x="460" y="130"/> + <Point x="510" y="130"/> + <Point x="510" y="130"/> + <Point x="560" y="130"/> + </PivotPoints> + <Connect> + <From> + <Item>Выполнить</Item> + <PortIndex>3</PortIndex> + </From> + <To> + <Item>Декорация2</Item> + <PortIndex>1</PortIndex> + </To> + </Connect> + <Line width="1" gap="false"> + <v8ui:style xsi:type="sch:ConnectorLineType">Dashed</v8ui:style> + </Line> + <DecorativeLine>true</DecorativeLine> + <TextLocation>FirstSegment</TextLocation> + <BeginArrow>None</BeginArrow> + <EndArrow>Filled</EndArrow> + </Properties> + </ConnectionLine> + <Decoration id="35"> + <Properties> + <Name>Декорация5</Name> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>результат выполнения (оценка проверяющего): +- выполнено +- отменено +- возвращено (на доработку исполнителю)</v8:content> + </v8:item> + + + 25 + auto + style:FormTextColor + style:BorderColor + 0 + 20 + false + true + + Left + Center + Left + + + AutoSize + Document + 0 + 0 + + + + + ДекоративнаяЛиния7 + + <ToolTip/> + <TabOrder>26</TabOrder> + <BackColor>#000000</BackColor> + <TextColor>style:FormTextColor</TextColor> + <LineColor>style:BorderColor</LineColor> + <GroupNumber>0</GroupNumber> + <ZOrder>21</ZOrder> + <Hyperlink>false</Hyperlink> + <Transparent>false</Transparent> + <Font xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" ref="sys:DefaultGUIFont" kind="WindowsFont"/> + <HorizontalAlign>Center</HorizontalAlign> + <VerticalAlign>Center</VerticalAlign> + <PictureLocation>Left</PictureLocation> + <PivotPoints> + <Point x="460" y="330"/> + <Point x="510" y="330"/> + <Point x="510" y="330"/> + <Point x="560" y="330"/> + </PivotPoints> + <Connect> + <From> + <Item>Проверить</Item> + <PortIndex>3</PortIndex> + </From> + <To> + <Item>Декорация5</Item> + <PortIndex>5</PortIndex> + </To> + </Connect> + <Line width="1" gap="false"> + <v8ui:style xsi:type="sch:ConnectorLineType">Dashed</v8ui:style> + </Line> + <DecorativeLine>true</DecorativeLine> + <TextLocation>FirstSegment</TextLocation> + <BeginArrow>None</BeginArrow> + <EndArrow>Filled</EndArrow> + </Properties> + </ConnectionLine> + <Completion id="74" uuid="de38fbf1-a4c1-4f42-ae7f-4760652559e0"> + <Properties> + <Name>Завершение</Name> + <Title/> + <ToolTip/> + <TabOrder>41</TabOrder> + <BackColor>auto</BackColor> + <TextColor>style:FormTextColor</TextColor> + <LineColor>style:BorderColor</LineColor> + <GroupNumber>0</GroupNumber> + <ZOrder>22</ZOrder> + <Hyperlink>false</Hyperlink> + <Transparent>false</Transparent> + <Font xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" ref="sys:DefaultGUIFont" kind="WindowsFont"/> + <HorizontalAlign>Center</HorizontalAlign> + <VerticalAlign>Center</VerticalAlign> + <PictureLocation>Left</PictureLocation> + <Location top="500" left="380" bottom="540" right="420"/> + <Border width="1" gap="false"> + <v8ui:style xsi:type="sch:ConnectorLineType">Solid</v8ui:style> + </Border> + <Picture/> + <PictureSize>AutoSize</PictureSize> + </Properties> + <Events> + <Event name="OnComplete">ЗавершениеПриЗавершении</Event> + </Events> + </Completion> + </Items> +</GraphicalSchema> \ No newline at end of file diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form new file mode 100644 index 000000000..49fa4bfeb --- /dev/null +++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form @@ -0,0 +1,1358 @@ +<?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>131</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <horizontalStretch>true</horizontalStretch> + <verticalStretch>false</verticalStretch> + <extendedTooltip> + <name>ГруппаСостояниеРасширеннаяПодсказка</name> + <id>162</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <type>UsualGroup</type> + <extInfo xsi:type="form:UsualGroupExtInfo"> + <behavior>Auto</behavior> + <representation>StrongSeparation</representation> + <showLeftMargin>true</showLeftMargin> + <united>true</united> + <throughAlign>Auto</throughAlign> + <currentRowUse>Auto</currentRowUse> + </extInfo> + </items> + <items xsi:type="form:FormGroup"> + <name>ГруппаШапка</name> + <id>154</id> + <items xsi:type="form:FormGroup"> + <name>ГруппаЗаголовок</name> + <id>109</id> + <items xsi:type="form:FormField"> + <name>Автор</name> + <id>51</id> + <title> + <key>ru</key> + <value>Автор</value> + + true + true + + true + + + Объект.Автор + + + АвторРасширеннаяПодсказка + 165 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 52 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Дата + 152 + + <key>ru</key> + <value>Дата</value> + + true + true + + true + + + Объект.Date + + + ДатаРасширеннаяПодсказка + 167 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 153 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Номер + 149 + true + true + + true + + + Объект.Number + + + НомерРасширеннаяПодсказка + 169 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 150 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа заголовок</value> + + + ru + Группа заголовок + + + ГруппаЗаголовокРасширеннаяПодсказка + 164 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаИсполнение + 28 + + Исполнитель + 20 + + <key>ru</key> + <value>Исполнитель</value> + + true + true + + true + + + Объект.Исполнитель + + + ru + Исполнитель + + + ИсполнительРасширеннаяПодсказка + 172 + Label + true + true + + Left + + + + ИсполнительКонтекстноеМеню + 21 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + true + Normal + + + + СрокИсполнения + 12 + true + true + + true + + + Объект.СрокИсполнения + + + ru + Срок исполнения + + + СрокИсполненияРасширеннаяПодсказка + 174 + Label + true + true + + Left + + + + СрокИсполненияКонтекстноеМеню + 13 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + true + Normal + + + + Важность + 16 + true + true + + true + + + Объект.Важность + + + ВажностьРасширеннаяПодсказка + 176 + Label + true + true + + Left + + + + ВажностьКонтекстноеМеню + 17 + true + + InputField + Enter + true + Left + true + Left + + 10 + true + true + false + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Исполнение</value> + + + System.DefaultGUIFont + true + false + false + false + + true + + ГруппаИсполнениеРасширеннаяПодсказка + 171 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаПриоритет + 155 + + СрокНачалаИсполнения + 119 + true + true + + true + + + Объект.ДатаНачала + + + ru + Срок начала исполнения + + + OnChange + СрокНачалаИсполненияПриИзменении + + + СрокНачалаИсполненияРасширеннаяПодсказка + 179 + Label + true + true + + Left + + + + СрокНачалаИсполненияКонтекстноеМеню + 120 + true + + InputField + Enter + true + Left + true + + 10 + true + true + + ru + ДЛФ=D + + true + true + true + Normal + + + + СрокНачалаИсполненияВремя + 135 + true + true + + true + + + Объект.ДатаНачала + + None + + ru + Срок начала исполнения + + + СрокНачалаИсполненияВремяРасширеннаяПодсказка + 181 + Label + true + true + + Left + + + + СрокНачалаИсполненияВремяКонтекстноеМеню + 136 + true + + InputField + Enter + true + Left + true + + 8 + true + true + false + + ru + ДЛФ=T + + true + true + true + Normal + + + true + true + + true + + + ГруппаПриоритетРасширеннаяПодсказка + 178 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + ГруппаШапкаРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаСодержание + 94 + + Наименование + 156 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 184 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 157 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Предмет + 129 + true + true + + true + + + ПредметСтрокой + + + ПредметРасширеннаяПодсказка + 186 + Label + true + true + + Left + + + + ПредметКонтекстноеМеню + 130 + true + + LabelField + Enter + true + Left + true + + + Click + ПредметНажатие + + true + true + true + + + + Описание + 18 + true + true + + true + + + Задание.ОписаниеЗадания + + None + + ОписаниеРасширеннаяПодсказка + 188 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 19 + true + + InputField + true + Enter + true + Left + true + Left + + true + 3 + true + true + true + true + true + + Style.BorderColor + + Normal + + + + РезультатВыполнения + 126 + + <key>ru</key> + <value>История сообщений</value> + + true + true + + true + + + Задание.РезультатВыполнения + + + РезультатВыполненияРасширеннаяПодсказка + 190 + Label + true + true + + Left + + + + РезультатВыполненияКонтекстноеМеню + 127 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Содержание</value> + + + System.DefaultGUIFont + true + false + false + false + + + ГруппаСодержаниеРасширеннаяПодсказка + 183 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаРезультат + 27 + + ОписаниеРезультата + 78 + true + true + + true + + + Объект.РезультатВыполнения + + true + None + + ru + Описание результата выполнения + + + ОписаниеРезультатаРасширеннаяПодсказка + 193 + Label + true + true + + Left + + + + ОписаниеРезультатаКонтекстноеМеню + 79 + true + + InputField + Enter + true + Left + true + + true + 2 + true + true + true + true + true + Normal + + + + ГруппаВыполненоДата + 54 + + Выполнено + 123 + true + true + + true + + false + + ВыполненоРасширеннаяПодсказка + 196 + Label + true + true + + Left + + + UsualButton + Form.Command.Выполнено + Normal + PictureAndText + true + true + UserCmds + Auto + + + Отклонено + 137 + true + true + + true + + false + + ОтклоненоРасширеннаяПодсказка + 197 + Label + true + true + + Left + + + UsualButton + Form.Command.Отменено + Normal + Auto + true + true + UserCmds + Auto + + + ДатаИсполнения + 55 + + <key>ru</key> + <value>Дата</value> + + true + true + + true + + + Объект.ДатаИсполнения + + + OnChange + ДатаИсполненияПриИзменении + + + ДатаИсполненияРасширеннаяПодсказка + 198 + Label + true + true + + Left + + + + ДатаИсполненияКонтекстноеМеню + 56 + true + + InputField + Enter + true + Left + true + + 10 + true + true + false + + ru + ДЛФ=D + + true + true + true + Normal + + + + ДатаИсполненияВремя + 146 + true + true + + true + + + Объект.ДатаИсполнения + + None + + ru + Срок начала исполнения + + + ДатаИсполненияВремяРасширеннаяПодсказка + 200 + Label + true + true + + Left + + + + ДатаИсполненияВремяКонтекстноеМеню + 147 + true + + InputField + Enter + true + Left + true + + 8 + true + true + false + + ru + ДЛФ=T + + true + true + true + Normal + + + true + true + + true + + + ГруппаВыполненоДатаРасширеннаяПодсказка + 195 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Результат выполнения задания</value> + + + System.DefaultGUIFont + true + false + false + false + + + ГруппаРезультатРасширеннаяПодсказка + 192 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ЗаписатьИЗакрыть + 45 + true + true + + true + + false + + ЗаписатьИЗакрытьРасширеннаяПодсказка + 158 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + Auto + true + true + true + UserCmds + Auto + + + ОсновнаяКоманднаяПанель + 1 + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 159 + Label + true + true + + Left + + + + Form + + + + Дополнительно + 148 + true + true + + true + + false + + ДополнительноРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + Form.Command.Дополнительно + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Справка + 151 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 161 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + Activate + Copy + Delete + Execute + ExecuteAndClose + SetDeletionMark + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + TaskObject.ЗадачаИсполнителя + + + true + + + true + +
true
+ true +
+ + НачальныйПризнакВыполнения + + <key>ru</key> + <value>Начальный признак выполнения</value> + + 2 + + Boolean + + + true + + + true + + + + Задание + + <key>ru</key> + <value>Задание</value> + + 4 + + BusinessProcessObject.Задание + + + true + + + true + + true + + + ПредметСтрокой + + <key>ru</key> + <value>Предмет</value> + + 3 + + String + + + + true + + + true + + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 1 + + ru + Записать и закрыть + + + true + + + + ЗаписатьИЗакрытьВыполнить + + + true + Auto + Auto + + + Выполнено + + <key>ru</key> + <value>Выполнено</value> + + 3 + + ru + Отметить задание как выполненное и закрыть + + + true + + + StdPicture.ExecuteTask + + + + ВыполненоВыполнить + + + true + Auto + Auto + + + Отменено + + <key>ru</key> + <value>Отменено</value> + + 2 + + ru + Отметить задание как невыполненное и закрыть + + + true + + + + Отменено + + + true + Auto + Auto + + + Дополнительно + + <key>ru</key> + <value>Дополнительно</value> + + 4 + + ru + Дополнительная информация о задаче + + + true + + + + Дополнительно + + + Auto + Auto + + + + + + Task.ЗадачаИсполнителя.Command.Выполнено + FormCommandBarImportant + 0 + + + + BusinessProcess.Задание.StandardCommand.CreateBasedOn + + true + + + + + + + OnReadAtServer + ПриЧтенииНаСервере + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + + diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Module.bsl b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Module.bsl new file mode 100644 index 000000000..3512c63ff --- /dev/null +++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Module.bsl @@ -0,0 +1,146 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + НачальныйПризнакВыполнения = Объект.Выполнена; + ПрочитатьРеквизитыБизнесПроцесса(); + УстановитьСостояниеЭлементов(); + + ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); + Элементы.СрокНачалаИсполненияВремя.Видимость = ИспользоватьДатуИВремяВСрокахЗадач; + Элементы.ДатаИсполненияВремя.Видимость = ИспользоватьДатуИВремяВСрокахЗадач; + БизнесПроцессыИЗадачиСервер.УстановитьФорматДаты(Элементы.СрокИсполнения); + БизнесПроцессыИЗадачиСервер.УстановитьФорматДаты(Элементы.Дата); + + БизнесПроцессыИЗадачиСервер.ФормаЗадачиПриСозданииНаСервере(ЭтаФорма, Объект, + Элементы.ГруппаСостояние, Элементы.ДатаИсполнения); + Элементы.ОписаниеРезультата.ТолькоПросмотр = Объект.Выполнена; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + ВыполнитьЗадачу = Ложь; + Если НЕ (ПараметрыЗаписи.Свойство("ВыполнитьЗадачу", ВыполнитьЗадачу) И ВыполнитьЗадачу) Тогда + Возврат; + КонецЕсли; + + Если НЕ Задание.Выполнено И НЕ ЗначениеЗаполнено(ТекущийОбъект.РезультатВыполнения) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Укажите причину, по которой задача отклоняется.'"),, + "Объект.РезультатВыполнения", , + Отказ); + Возврат; + КонецЕсли; + + // запись объекта бизнес-процесса + ЗаписатьРеквизитыБизнесПроцесса(ТекущийОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + БизнесПроцессыИЗадачиКлиент.ФормаЗадачиОбработкаОповещения(ЭтаФорма, ИмяСобытия, Параметр, Источник); +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + БизнесПроцессыИЗадачиСервер.ФормаЗадачиПриСозданииНаСервере(ЭтаФорма, Объект, + Элементы.ГруппаСостояние, Элементы.ДатаИсполнения); + Элементы.ОписаниеРезультата.ТолькоПросмотр = Объект.Выполнена; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура СрокНачалаИсполненияПриИзменении(Элемент) + + Если Объект.ДатаНачала = НачалоДня(Объект.ДатаНачала) Тогда + Объект.ДатаНачала = КонецДня(Объект.ДатаНачала); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ДатаИсполненияПриИзменении(Элемент) + + Если Объект.ДатаИсполнения = НачалоДня(Объект.ДатаИсполнения) Тогда + Объект.ДатаИсполнения = КонецДня(Объект.ДатаИсполнения); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьИЗакрытьВыполнить() + + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполненоВыполнить() + + Задание.Выполнено = Истина; + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура Отменено(Команда) + + Задание.Выполнено = Ложь; + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма, Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ПрочитатьРеквизитыБизнесПроцесса() + ЗадачаОбъект = РеквизитФормыВЗначение("Объект"); + УстановитьПривилегированныйРежим(Истина); + ЗаданиеОбъект = ЗадачаОбъект.БизнесПроцесс.ПолучитьОбъект(); + ЗначениеВРеквизитФормы(ЗаданиеОбъект, "Задание"); +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьРеквизитыБизнесПроцесса(ЗадачаОбъект) + УстановитьПривилегированныйРежим(Истина); + ЗаданиеОбъект = ЗадачаОбъект.БизнесПроцесс.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(ЗаданиеОбъект.Ссылка); + ЗаданиеОбъект.Выполнено = Задание.Выполнено; + ЗаданиеОбъект.Записать(); + ЗначениеВРеквизитФормы(ЗаданиеОбъект, "Задание"); +КонецПроцедуры + +&НаСервере +Процедура УстановитьСостояниеЭлементов() + + БизнесПроцессы.Задание.УстановитьСостояниеЭлементовФормыЗадачи(ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредметНажатие(Элемент, СтандартнаяОбработка) + + Если ТипЗнч(Объект.Предмет) = Тип("ЗадачаСсылка.ЗадачаИсполнителя") Тогда + БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(Объект.Предмет); + Иначе + ОткрытьЗначение(Объект.Предмет); + КонецЕсли; + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура Дополнительно(Команда) + + БизнесПроцессыИЗадачиКлиент.ОткрытьДопИнформациюОЗадаче(Объект.Ссылка); + +КонецПроцедуры + diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form new file mode 100644 index 000000000..4824d577d --- /dev/null +++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form @@ -0,0 +1,1507 @@ + + + + ОсновнаяКоманднаяПанель + 1 + + ЗаписатьИЗакрыть + 45 + true + true + + true + + false + + ЗаписатьИЗакрытьРасширеннаяПодсказка + 164 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + Auto + true + true + true + UserCmds + Auto + + + Записать + 38 + true + true + + true + + false + + ЗаписатьРасширеннаяПодсказка + 165 + Label + true + true + + Left + + + Form.StandardCommand.Write + Normal + Auto + true + true + UserCmds + Auto + + + КоманднаяПанельФормы + 131 + true + true + + true + + + <key>ru</key> + <value>Командная панель формы</value> + + + ru + Командная панель формы + + + КоманднаяПанельФормыРасширеннаяПодсказка + 166 + Label + true + true + + Left + + + + FormCommandPanelGlobalCommands + + + + Дополнительно + 148 + true + true + + true + + false + + ДополнительноРасширеннаяПодсказка + 167 + Label + true + true + + Left + + + Form.Command.Дополнительно + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Справка + 43 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 168 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + CommandBar + + Left + + + + ГруппаСостояние + 134 + true + true + + true + + true + false + + ГруппаСостояниеРасширеннаяПодсказка + 169 + Label + true + true + + Left + + + UsualGroup + + Auto + StrongSeparation + true + true + Auto + Auto + + + + ГруппаШапка + 153 + + ГруппаЗаголовок + 109 + + Автор + 51 + + <key>ru</key> + <value>Автор</value> + + true + true + + true + + + Объект.Автор + + + АвторРасширеннаяПодсказка + 172 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 52 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Дата + 149 + true + true + + true + + + Объект.Date + + + ДатаРасширеннаяПодсказка + 174 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 150 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Номер + 151 + true + true + + true + + + Объект.Number + + + НомерРасширеннаяПодсказка + 176 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 152 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа заголовок</value> + + + ru + Группа заголовок + + + ГруппаЗаголовокРасширеннаяПодсказка + 171 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаИсполнение + 28 + + Исполнитель + 20 + + <key>ru</key> + <value>Проверяющий</value> + + true + true + + true + + + Объект.Исполнитель + + + ИсполнительРасширеннаяПодсказка + 179 + Label + true + true + + Left + + + + ИсполнительКонтекстноеМеню + 21 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + true + Normal + + + + СрокИсполнения + 12 + true + true + + true + + + Объект.СрокИсполнения + + + ru + Срок исполнения + + + СрокИсполненияРасширеннаяПодсказка + 181 + Label + true + true + + Left + + + + СрокИсполненияКонтекстноеМеню + 13 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + true + Normal + + + + Важность + 16 + true + true + + true + + + Объект.Важность + + + ВажностьРасширеннаяПодсказка + 183 + Label + true + true + + Left + + + + ВажностьКонтекстноеМеню + 17 + true + + InputField + Enter + true + Left + true + Left + + 10 + true + true + false + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Исполнение</value> + + + System.DefaultGUIFont + true + false + false + false + + true + + ГруппаИсполнениеРасширеннаяПодсказка + 178 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаПриоритет + 154 + + СрокНачалаИсполнения + 155 + true + true + + true + + + Объект.ДатаНачала + + + ru + Срок начала исполнения + + + OnChange + СрокНачалаИсполненияПриИзменении + + + СрокНачалаИсполненияРасширеннаяПодсказка + 186 + Label + true + true + + Left + + + + СрокНачалаИсполненияКонтекстноеМеню + 156 + true + + InputField + Enter + true + Left + true + + 10 + true + true + + ru + ДЛФ=D + + true + true + true + Normal + + + + СрокНачалаИсполненияВремя + 157 + true + true + + true + + + Объект.ДатаНачала + + None + + ru + Срок начала исполнения + + + СрокНачалаИсполненияВремяРасширеннаяПодсказка + 188 + Label + true + true + + Left + + + + СрокНачалаИсполненияВремяКонтекстноеМеню + 158 + true + + InputField + Enter + true + Left + true + + 8 + true + true + false + + ru + ДЛФ=T + + true + true + true + Normal + + + true + true + + true + + + ГруппаПриоритетРасширеннаяПодсказка + 185 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа шапка</value> + + + ГруппаШапкаРасширеннаяПодсказка + 170 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаСодержание + 94 + + Наименование + 159 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 191 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 160 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Предмет + 132 + true + true + + true + + + ПредметСтрокой + + + ПредметРасширеннаяПодсказка + 193 + Label + true + true + + Left + + + + ПредметКонтекстноеМеню + 133 + true + + LabelField + Enter + true + Left + true + + + Click + ПредметНажатие + + true + true + true + + + + Описание + 18 + true + true + + true + + + Задание.ОписаниеЗадания + + None + + ОписаниеРасширеннаяПодсказка + 195 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 19 + true + + InputField + true + Enter + true + Left + true + Left + + true + 3 + true + true + true + true + true + + Style.BorderColor + + Normal + + + + РезультатВыполнения + 126 + + <key>ru</key> + <value>История сообщений</value> + + true + true + + true + + + Задание.РезультатВыполнения + + + РезультатВыполненияРасширеннаяПодсказка + 197 + Label + true + true + + Left + + + + РезультатВыполненияКонтекстноеМеню + 127 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Содержание</value> + + + System.DefaultGUIFont + true + false + false + false + + true + + ГруппаСодержаниеРасширеннаяПодсказка + 190 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаРезультат + 27 + + ОписаниеРезультата + 78 + true + true + + true + + + Объект.РезультатВыполнения + + true + None + + ru + Описание результата выполнения + + + ОписаниеРезультатаРасширеннаяПодсказка + 200 + Label + true + true + + Left + + + + ОписаниеРезультатаКонтекстноеМеню + 79 + true + + InputField + Enter + true + Left + true + + true + 2 + true + true + true + true + true + Normal + + + + ИзменитьПоручение + 130 + true + true + + true + + false + + ИзменитьПоручениеРасширеннаяПодсказка + 202 + Label + true + true + + Left + + + Hyperlink + Form.Command.ИзменитьЗадание + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаВыполненаДата + 54 + + Выполнено + 123 + true + true + + true + + false + + ВыполненоРасширеннаяПодсказка + 204 + Label + true + true + + Left + + + UsualButton + Form.Command.Выполнено + Normal + PictureAndText + true + true + UserCmds + Auto + + + Отменено + 147 + true + true + + true + + false + + ОтмененоРасширеннаяПодсказка + 205 + Label + true + true + + Left + + + UsualButton + Form.Command.Отменено + Normal + Auto + true + true + UserCmds + Auto + + + Возвращено + 124 + true + true + + true + + false + + ВозвращеноРасширеннаяПодсказка + 206 + Label + true + true + + Left + + + UsualButton + Form.Command.Возвращено + Normal + Auto + true + true + UserCmds + Auto + + + ДатаИсполнения + 55 + + <key>ru</key> + <value>Дата проверки</value> + + true + true + + true + + + Объект.ДатаИсполнения + + + ДатаИсполненияРасширеннаяПодсказка + 207 + Label + true + true + + Left + + + + ДатаИсполненияКонтекстноеМеню + 56 + true + + InputField + Enter + true + Left + true + + 10 + true + true + false + + ru + ДЛФ=D + + true + true + true + Normal + + + + ДатаИсполненияВремя + 161 + true + true + + true + + + Объект.ДатаИсполнения + + None + + ДатаИсполненияВремяРасширеннаяПодсказка + 209 + Label + true + true + + Left + + + + ДатаИсполненияВремяКонтекстноеМеню + 162 + true + + InputField + Enter + true + Left + true + + 8 + true + true + false + + ru + ДЛФ=T + + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа выполнена дата</value> + + + ru + Группа выполнена дата + + true + + ГруппаВыполненаДатаРасширеннаяПодсказка + 203 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Результат проверки задания</value> + + + System.DefaultGUIFont + true + false + false + false + + true + + ГруппаРезультатРасширеннаяПодсказка + 199 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + TaskObject.ЗадачаИсполнителя + + + true + + + true + +
true
+ true +
+ + НачальныйПризнакВыполнения + + <key>ru</key> + <value>Начальный признак выполнения</value> + + 2 + + Boolean + + + true + + + true + + + + Задание + + <key>ru</key> + <value>Задание</value> + + 4 + + BusinessProcessObject.Задание + + + true + + + true + + true + + + ПредметСтрокой + + <key>ru</key> + <value>Предмет</value> + + 3 + + String + + + + true + + + true + + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 1 + + ru + Записать и закрыть + + + true + + + + ЗаписатьИЗакрытьВыполнить + + + true + Auto + Auto + + + Выполнено + + <key>ru</key> + <value>Выполнено</value> + + 3 + + ru + Отметить задание как выполненное и закрыть + + + true + + + StdPicture.ExecuteTask + + + + Выполнено + + + true + Auto + Auto + + + Возвращено + + <key>ru</key> + <value>Возвращено</value> + + 4 + + ru + Вернуть задание на доработку исполнителю и закрыть + + + true + + + + Возвращено + + + true + Auto + Auto + + + ИзменитьЗадание + + <key>ru</key> + <value>Изменить задание</value> + + 6 + + ru + Изменить задание + + + true + + + + ИзменитьЗаданиеВыполнить + + + true + Auto + Auto + + + Отменено + + <key>ru</key> + <value>Отменено</value> + + 5 + + ru + Отметить задание как отмененное и закрыть + + + true + + + + Отменено + + + true + Auto + Auto + + + Дополнительно + + <key>ru</key> + <value>Дополнительно</value> + + 2 + + ru + Дополнительная информация о задаче + + + true + + + + Дополнительно + + + Auto + Auto + + + + + + Task.ЗадачаИсполнителя.Command.Выполнено + FormCommandBarImportant + 0 + + + + + + + OnReadAtServer + ПриЧтенииНаСервере + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + +
diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl new file mode 100644 index 000000000..c95f6433e --- /dev/null +++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl @@ -0,0 +1,175 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + НачальныйПризнакВыполнения = Объект.Выполнена; + ПрочитатьРеквизитыБизнесПроцесса(); + УстановитьСостояниеЭлементов(); + + ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); + Элементы.СрокНачалаИсполненияВремя.Видимость = ИспользоватьДатуИВремяВСрокахЗадач; + Элементы.ДатаИсполненияВремя.Видимость = ИспользоватьДатуИВремяВСрокахЗадач; + БизнесПроцессыИЗадачиСервер.УстановитьФорматДаты(Элементы.СрокИсполнения); + БизнесПроцессыИЗадачиСервер.УстановитьФорматДаты(Элементы.Дата); + + БизнесПроцессыИЗадачиСервер.ФормаЗадачиПриСозданииНаСервере(ЭтаФорма, Объект, + Элементы.ГруппаСостояние, Элементы.ДатаИсполнения); + Элементы.ОписаниеРезультата.ТолькоПросмотр = Объект.Выполнена; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + ВыполнитьЗадачу = Ложь; + Если НЕ (ПараметрыЗаписи.Свойство("ВыполнитьЗадачу", ВыполнитьЗадачу) И ВыполнитьЗадачу) Тогда + Возврат; + КонецЕсли; + + Если НЕ Задание.Выполнено И НЕ Задание.Подтверждено + И НЕ ЗначениеЗаполнено(ТекущийОбъект.РезультатВыполнения) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Укажите причину, по которой задача возвращается на доработку.'"),,, + "Объект.РезультатВыполнения", + Отказ); + Возврат; + ИначеЕсли НЕ Задание.Выполнено И Задание.Подтверждено + И НЕ ЗначениеЗаполнено(ТекущийОбъект.РезультатВыполнения) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Укажите причину, по которой задача отменяется.'"),,, + "Объект.РезультатВыполнения", + Отказ); + Возврат; + КонецЕсли; + + ЗаписатьРеквизитыБизнесПроцесса(ТекущийОбъект); + +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + + ПрочитатьРеквизитыБизнесПроцесса(); + УстановитьСостояниеЭлементов(); + + БизнесПроцессыИЗадачиСервер.ФормаЗадачиПриСозданииНаСервере(ЭтаФорма, Объект, + Элементы.ГруппаСостояние, Элементы.ДатаИсполнения); + Элементы.ОписаниеРезультата.ТолькоПросмотр = Объект.Выполнена; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + БизнесПроцессыИЗадачиКлиент.ФормаЗадачиОбработкаОповещения(ЭтаФорма, ИмяСобытия, Параметр, Источник); + + Если ИмяСобытия = "ЗаданиеИзменено" Тогда + Если (Параметр = Задание.Ссылка ИЛИ (ТипЗнч(Параметр) = Тип("Массив") + И Параметр.Найти(Задание.Ссылка) <> Неопределено)) Тогда + Прочитать(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ЗаписатьИЗакрытьВыполнить() + + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура Выполнено() + + Задание.Подтверждено = Истина; + Задание.Выполнено = Истина; + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура Возвращено() + + Задание.Подтверждено = Ложь; + Задание.Выполнено = Ложь; + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура Отменено(Команда) + + Задание.Подтверждено = Истина; + Задание.Выполнено = Ложь; + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьЗаданиеВыполнить() + + Записать(); + ОткрытьЗначение(Задание.Ссылка); + +КонецПроцедуры + +&НаКлиенте +Процедура Дополнительно(Команда) + + БизнесПроцессыИЗадачиКлиент.ОткрытьДопИнформациюОЗадаче(Объект.Ссылка); + +КонецПроцедуры + +&НаКлиенте +Процедура СрокНачалаИсполненияПриИзменении(Элемент) + + Если Объект.ДатаНачала = НачалоДня(Объект.ДатаНачала) Тогда + Объект.ДатаНачала = КонецДня(Объект.ДатаНачала); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ПрочитатьРеквизитыБизнесПроцесса() + ЗадачаОбъект = РеквизитФормыВЗначение("Объект"); + УстановитьПривилегированныйРежим(Истина); + ЗаданиеОбъект = ЗадачаОбъект.БизнесПроцесс.ПолучитьОбъект(); + ЗначениеВРеквизитФормы(ЗаданиеОбъект, "Задание"); +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьРеквизитыБизнесПроцесса(ЗадачаОбъект) + ЗаданиеОбъект = ЗадачаОбъект.БизнесПроцесс.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(ЗаданиеОбъект.Ссылка); + ЗаданиеОбъект.Выполнено = Задание.Выполнено; + ЗаданиеОбъект.Подтверждено = Задание.Подтверждено; + ЗаданиеОбъект.Записать(); + ЗначениеВРеквизитФормы(ЗаданиеОбъект, "Задание"); +КонецПроцедуры + +&НаСервере +Процедура УстановитьСостояниеЭлементов() + + БизнесПроцессы.Задание.УстановитьСостояниеЭлементовФормыЗадачи(ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредметНажатие(Элемент, СтандартнаяОбработка) + Если ТипЗнч(Объект.Предмет) = Тип("ЗадачаСсылка.ЗадачаИсполнителя") Тогда + БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(Объект.Предмет); + Иначе + ОткрытьЗначение(Объект.Предмет); + КонецЕсли; + СтандартнаяОбработка = Ложь; +КонецПроцедуры + diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form new file mode 100644 index 000000000..43d58b208 --- /dev/null +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form @@ -0,0 +1,1042 @@ + + + + ГруппаСостояние + 92 + + ДекорацияЗначок + 93 + true + true + + true + + + ДекорацияЗначокРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + + ДекорацияЗначокКонтекстноеМеню + 94 + true + + 4 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + ДекорацияТекст + 95 + + <key>ru</key> + <value>Задание выполнено</value> + + true + true + + true + + + ДекорацияТекстРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + + ДекорацияТекстКонтекстноеМеню + 96 + true + + Label + true + 2 + true + false + + Left + + + true + true + + true + + true + + ГруппаСостояниеРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + UsualGroup + + Auto + StrongSeparation + true + true + Auto + Auto + + + + ГруппаСрокВажность + 27 + + ЗаголовокЗадания + 19 + true + true + + true + + + Объект.Наименование + + true + + ЗаголовокЗаданияРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + + ЗаголовокЗаданияКонтекстноеМеню + 20 + true + + InputField + Enter + true + Left + true + Left + + 30 + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Важность + 57 + true + true + + true + + + Объект.Важность + + + ВажностьРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + ВажностьКонтекстноеМеню + 58 + true + + InputField + Enter + true + Left + true + + 8 + true + true + false + true + true + true + Normal + + + true + true + + true + + true + + ГруппаСрокВажностьРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаИсполнение + 67 + + Исполнитель + 69 + true + true + + true + + + Объект.Исполнитель + + + ИсполнительРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + + ИсполнительКонтекстноеМеню + 70 + true + + InputField + Enter + true + Left + true + + 25 + true + true + false + false + true + true + true + Normal + + + + СрокИсполнения + 21 + + <key>ru</key> + <value>Срок</value> + + true + true + + true + + + Объект.СрокИсполнения + + + ru + Срок исполнения + + + OnChange + СрокИсполненияПриИзменении + + + СрокИсполненияРасширеннаяПодсказка + 110 + Label + true + true + + Left + + + + СрокИсполненияКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + Left + + 10 + true + true + + ru + ДЛФ=D + + true + true + true + Normal + + + + СрокИсполненияВремя + 88 + + <key>ru</key> + <value>Срок</value> + + true + true + + true + + + Объект.СрокИсполнения + + None + + ru + Срок исполнения (время) + + + СрокИсполненияВремяРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + + СрокИсполненияВремяКонтекстноеМеню + 89 + true + + InputField + Enter + true + Left + true + Left + + 8 + true + true + false + + ru + ДЛФ=T + + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Исполнение</value> + + + System.DefaultGUIFont + true + false + false + false + + true + + ГруппаИсполнениеРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаСодержание + 75 + + Предмет + 86 + true + true + + true + + + ПредметСтрокой + + + ПредметРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + ПредметКонтекстноеМеню + 87 + true + + LabelField + Enter + true + Left + true + + + Click + ПредметНажатие + + true + true + + + + ТекстЗадания + 17 + + <key>ru</key> + <value>Описание</value> + + true + true + + true + + + Объект.ОписаниеЗадания + + None + + ТекстЗаданияРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + + ТекстЗаданияКонтекстноеМеню + 18 + true + + InputField + Enter + true + Left + true + Left + + true + 5 + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Содержание</value> + + + System.DefaultGUIFont + true + false + false + false + + + ГруппаСодержаниеРасширеннаяПодсказка + 114 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаПроверка + 56 + + НаПроверке + 54 + + <key>ru</key> + <value>Проверить выполнение:</value> + + true + true + + true + + + Объект.НаПроверке + + Right + + OnChange + НаПроверкеПриИзменении + + + НаПроверкеРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + + НаПроверкеКонтекстноеМеню + 55 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаПроверяющий + 28 + + Проверяющий + 14 + true + true + + true + + + Объект.Проверяющий + + None + + ПроверяющийРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + + ПроверяющийКонтекстноеМеню + 15 + true + + InputField + false + Enter + true + Left + true + Left + + true + true + false + false + true + true + true + + Style.BorderColor + + Normal + + + + СрокПроверки + 23 + + <key>ru</key> + <value>Срок</value> + + true + true + + true + + + Объект.СрокПроверки + + + ru + Срок проверки + + + OnChange + СрокПроверкиПриИзменении + + + СрокПроверкиРасширеннаяПодсказка + 125 + Label + true + true + + Left + + + + СрокПроверкиКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + Left + + 10 + true + true + + ru + ДЛФ=D + + true + true + true + + Style.BorderColor + + Normal + + + + СрокПроверкиВремя + 90 + + <key>ru</key> + <value>Срок</value> + + true + true + + true + + + Объект.СрокПроверки + + None + + ru + Срок проверки (время) + + + СрокПроверкиВремяРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + + СрокПроверкиВремяКонтекстноеМеню + 91 + true + + InputField + Enter + true + Left + true + Left + + 8 + true + true + false + + ru + ДЛФ=T + + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + ГруппаПроверяющийРасширеннаяПодсказка + 122 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Проверка</value> + + + System.DefaultGUIFont + true + false + false + false + + + ГруппаПроверкаРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + UsualGroup + + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаОбщиеСведения + 81 + + Автор + 79 + true + true + + true + + + Объект.Автор + + + АвторРасширеннаяПодсказка + 130 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 80 + true + + InputField + Enter + true + Left + true + + true + true + false + false + true + true + true + Normal + + + + Дата + 97 + + <key>ru</key> + <value>Начато</value> + + true + true + + true + + + Объект.Date + + + ДатаРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 98 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Автор</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + Группа общие сведения + + true + + ГруппаОбщиеСведенияРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + Top + true + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + BusinessProcessObject.Задание + + + true + + + true + +
true
+ true +
+ + НачальныйПризнакСтарта + + <key>ru</key> + <value>Начальный признак старта</value> + + 2 + + Boolean + + + true + + + true + + + + ПредметСтрокой + + <key>ru</key> + <value>Предмет</value> + + 3 + + String + + + + true + + + true + + + + + + + + + AfterWrite + ПослеЗаписи + + + OnWriteAtServer + ПриЗаписиНаСервере + + +
diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl new file mode 100644 index 000000000..a134abbd9 --- /dev/null +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl @@ -0,0 +1,87 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + НачальныйПризнакСтарта = Объект.Стартован; + ТолькоПросмотр = Объект.Завершен; + + ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); + Элементы.СрокИсполненияВремя.Видимость = ИспользоватьДатуИВремяВСрокахЗадач; + Элементы.СрокПроверкиВремя.Видимость = ИспользоватьДатуИВремяВСрокахЗадач; + Элементы.Дата.Формат = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"); + + Элементы.Предмет.Гиперссылка = Объект.Предмет <> Неопределено И НЕ Объект.Предмет.Пустая(); + ПредметСтрокой = БизнесПроцессыИЗадачиСервер.ПредметСтрокой(Объект.Предмет); + Элементы.ГруппаСостояние.Видимость = Объект.Завершен; + Если Объект.Завершен Тогда + ДатаЗавершенияСтрокой = ?(ИспользоватьДатуИВремяВСрокахЗадач, + Формат(Объект.ДатаЗавершения, "ДЛФ=DT"), Формат(Объект.ДатаЗавершения, "ДЛФ=D")); + ТекстСостояния = ?(Объект.Выполнено, + НСтр("ru = 'Задание выполнено %1.'"), + НСтр("ru = 'Задание отменено %1.'")); + Элементы.ДекорацияТекст.Заголовок = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСостояния, + ДатаЗавершенияСтрокой); + КонецЕсли; + + ДоступностьПоля = Объект.НаПроверке; + Элементы.ГруппаПроверяющий.Доступность = ДоступностьПоля; + Элементы.Проверяющий.АвтоОтметкаНезаполненного = ДоступностьПоля; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + ИзменятьЗаданияЗаднимЧислом = ПолучитьФункциональнуюОпцию("ИзменятьЗаданияЗаднимЧислом"); + Если НачальныйПризнакСтарта И ИзменятьЗаданияЗаднимЧислом Тогда + ТекущийОбъект.ИзменитьРеквизитыНевыполненныхЗадач(); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + + +&НаКлиенте +Процедура НаПроверкеПриИзменении(Элемент) + + ДоступностьПоля = Объект.НаПроверке; + + Элементы.ГруппаПроверяющий.Доступность = ДоступностьПоля; + Элементы.Проверяющий.АвтоОтметкаНезаполненного = ДоступностьПоля; + +КонецПроцедуры + +&НаКлиенте +Процедура ПредметНажатие(Элемент, СтандартнаяОбработка) + Если ТипЗнч(Объект.Предмет) = Тип("ЗадачаСсылка.ЗадачаИсполнителя") Тогда + БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(Объект.Предмет); + Иначе + ОткрытьЗначение(Объект.Предмет); + КонецЕсли; + СтандартнаяОбработка = Ложь; +КонецПроцедуры + +&НаКлиенте +Процедура СрокИсполненияПриИзменении(Элемент) + Если Объект.СрокИсполнения = НачалоДня(Объект.СрокИсполнения) Тогда + Объект.СрокИсполнения = КонецДня(Объект.СрокИсполнения); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура СрокПроверкиПриИзменении(Элемент) + Если Объект.СрокПроверки = НачалоДня(Объект.СрокПроверки) Тогда + Объект.СрокПроверки = КонецДня(Объект.СрокПроверки); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + Оповестить("ЗаданиеИзменено", Объект.Ссылка); + Оповестить("ЗадачаИзменена", Неопределено); +КонецПроцедуры diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..29a1e44f9 --- /dev/null +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,35 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + Дата + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + + + + + Завершен + Equal + true + + + + + ЦветТекста + style:ЗавершенныйБизнесПроцесс + + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..4137488b9 --- /dev/null +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form @@ -0,0 +1,1073 @@ + + + + ГруппаОтбор + 16 + + ГруппаПоРеквизитам + 21 + + ПоАвтору + 14 + true + true + + true + + + ПоАвтору + + + OnChange + ПоАвторуПриИзменении + + + ПоАвторуРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ПоАвторуКонтекстноеМеню + 15 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ПоИсполнителю + 17 + true + true + + true + + + ПоИсполнителю + + + OnChange + ПоИсполнителюПриИзменении + + + ПоИсполнителюРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ПоИсполнителюКонтекстноеМеню + 18 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ПоПроверяющему + 19 + true + true + + true + + + ПоПроверяющему + + + OnChange + ПоПроверяющемуПриИзменении + + + ПоПроверяющемуРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ПоПроверяющемуКонтекстноеМеню + 20 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Отбор по реквизитам</value> + + + ГруппаПоРеквизитамРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ПоказыватьЗавершенныеЗадания + 22 + true + true + + true + + + ПоказыватьЗавершенныеЗадания + + Right + + OnChange + ПоказыватьЗавершенныеЗаданияПриИзменении + + + ПоказыватьЗавершенныеЗаданияРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + ПоказыватьЗавершенныеЗаданияКонтекстноеМеню + 23 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Отбор</value> + + + ГруппаОтборРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + ВажностьКартинка + 24 + true + true + + true + + + Список.ВажностьКартинка + + None + + ВажностьКартинкаРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + ВажностьКартинкаКонтекстноеМеню + 25 + true + + PictureField + Enter + true + Left + true + + true + true + true + true + + CommonPicture.КоллекцияВариантыВажностиЗадачи + + + + 1 + + + + + Номер + 4 + true + true + + + Список.Number + + true + + НомерРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Дата + 6 + true + true + + true + + + Список.Date + + + ДатаРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Наименование + 26 + true + true + + true + + + Список.Наименование + + + НаименованиеРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 27 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ОписаниеЗадания + 28 + true + true + + true + + + Список.ОписаниеЗадания + + + ОписаниеЗаданияРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + ОписаниеЗаданияКонтекстноеМеню + 29 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Предмет + 32 + true + true + + true + + + Список.Предмет + + + ПредметРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + ПредметКонтекстноеМеню + 33 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СрокИсполнения + 42 + true + true + + true + + + Список.СрокИсполнения + + + СрокИсполненияРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + СрокИсполненияКонтекстноеМеню + 43 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СрокПроверки + 44 + true + true + + + Список.СрокПроверки + + + СрокПроверкиРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + СрокПроверкиКонтекстноеМеню + 45 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Стартован + 12 + true + true + + + Список.Started + + + СтартованРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + СтартованКонтекстноеМеню + 13 + true + + CheckBoxField + Enter + true + Left + true + + + + ДатаЗавершения + 38 + true + true + + true + + + Список.ДатаЗавершения + + + ДатаЗавершенияРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + ДатаЗавершенияКонтекстноеМеню + 39 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ВедущаяЗадача + 10 + true + true + + + Список.HeadTask + + + ВедущаяЗадачаРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + ВедущаяЗадачаКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + true + true + + + + НомерИтерации + 30 + true + true + + true + + + Список.НомерИтерации + + + НомерИтерацииРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + НомерИтерацииКонтекстноеМеню + 31 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Автор + 34 + true + true + + + Список.Автор + + + АвторРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 35 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Исполнитель + 36 + true + true + + + Список.Исполнитель + + + ИсполнительРасширеннаяПодсказка + 92 + Label + true + true + + Left + + + + ИсполнительКонтекстноеМеню + 37 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Проверяющий + 40 + true + true + + + Список.Проверяющий + + + ПроверяющийРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + + ПроверяющийКонтекстноеМеню + 41 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 57 + + СписокСтрокаПоискаРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 58 + true + + Список + + true + + + + СписокСостояниеПросмотра + 60 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 61 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 63 + + СписокУправлениеПоискомРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 64 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
+ + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + ВЫБРАТЬ + БизнесПроцессЗадание.Ссылка, + БизнесПроцессЗадание.ПометкаУдаления, + БизнесПроцессЗадание.Номер, + БизнесПроцессЗадание.Дата, + БизнесПроцессЗадание.Завершен, + БизнесПроцессЗадание.ВедущаяЗадача, + БизнесПроцессЗадание.Стартован, + БизнесПроцессЗадание.Автор, + БизнесПроцессЗадание.Важность, + БизнесПроцессЗадание.Выполнено, + БизнесПроцессЗадание.ДатаЗавершения, + БизнесПроцессЗадание.Исполнитель, + БизнесПроцессЗадание.Наименование, + БизнесПроцессЗадание.НаПроверке, + БизнесПроцессЗадание.НомерИтерации, + БизнесПроцессЗадание.ОписаниеЗадания, + БизнесПроцессЗадание.Подтверждено, + БизнесПроцессЗадание.Предмет, + БизнесПроцессЗадание.Проверяющий, + БизнесПроцессЗадание.РезультатВыполнения, + БизнесПроцессЗадание.СрокИсполнения, + БизнесПроцессЗадание.СрокПроверки, + ВЫБОР + КОГДА БизнесПроцессЗадание.Важность = ЗНАЧЕНИЕ(Перечисление.ВариантыВажностиЗадачи.Низкая) + ТОГДА 0 + КОГДА БизнесПроцессЗадание.Важность = ЗНАЧЕНИЕ(Перечисление.ВариантыВажностиЗадачи.Высокая) + ТОГДА 2 + ИНАЧЕ 1 + КОНЕЦ КАК ВажностьКартинка +ИЗ + БизнесПроцесс.Задание КАК БизнесПроцессЗадание + + + BusinessProcess.Задание + true + true + true + true + true + +
+ + ПоАвтору + + <key>ru</key> + <value>По автору</value> + + 2 + + CatalogRef.Пользователи + + + true + + + true + + + + ПоИсполнителю + + <key>ru</key> + <value>По исполнителю</value> + + 3 + + CatalogRef.Пользователи + + + true + + + true + + + + ПоПроверяющему + + <key>ru</key> + <value>По проверяющему</value> + + 4 + + CatalogRef.Пользователи + + + true + + + true + + + + ПоказыватьЗавершенныеЗадания + + <key>ru</key> + <value>Показывать завершенные задания</value> + + 5 + + Boolean + + + true + + + true + + + + + + + +
diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Module.bsl b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..86daac0bd --- /dev/null +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,81 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ПоАвтору = ОбщегоНазначения.ТекущийПользователь(); + УстановитьОтбор(); +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + УстановитьОтборСписка(Настройки); +КонецПроцедуры + +&НаКлиенте +Процедура ПоАвторуПриИзменении(Элемент) + УстановитьОтбор(); +КонецПроцедуры + +&НаКлиенте +Процедура ПоИсполнителюПриИзменении(Элемент) + УстановитьОтбор(); +КонецПроцедуры + +&НаКлиенте +Процедура ПоПроверяющемуПриИзменении(Элемент) + УстановитьОтбор(); +КонецПроцедуры + +&НаКлиенте +Процедура ПоказыватьЗавершенныеЗаданияПриИзменении(Элемент) + УстановитьОтбор(); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура УстановитьОтбор() + ПараметрыОтбора = Новый Соответствие(); + ПараметрыОтбора.Вставить("ПоказыватьЗавершенныеЗадания", ПоказыватьЗавершенныеЗадания); + ПараметрыОтбора.Вставить("ПоАвтору", ПоАвтору); + ПараметрыОтбора.Вставить("ПоИсполнителю", ПоИсполнителю); + ПараметрыОтбора.Вставить("ПоПроверяющему", ПоПроверяющему); + УстановитьОтборСписка(ПараметрыОтбора); +КонецПроцедуры + +&НаСервере +Процедура УстановитьОтборСписка(ПараметрыОтбора) + + ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "Завершен"); + + Если НЕ ПараметрыОтбора["ПоказыватьЗавершенныеЗадания"] Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор, "Завершен", Ложь); + КонецЕсли; + + Если ПараметрыОтбора["ПоАвтору"].Пустая() Тогда + ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "Автор"); + Иначе + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор, "Автор", ПараметрыОтбора["ПоАвтору"]); + КонецЕсли; + + Если ПараметрыОтбора["ПоИсполнителю"].Пустая() Тогда + ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "Исполнитель"); + Иначе + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор, "Исполнитель", ПараметрыОтбора["ПоИсполнителю"]); + КонецЕсли; + + Если ПараметрыОтбора["ПоПроверяющему"].Пустая() Тогда + ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "Проверяющий"); + Иначе + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор, "Проверяющий", ПараметрыОтбора["ПоПроверяющему"]); + КонецЕсли; + +КонецПроцедуры + + diff --git a/SSL/src/BusinessProcesses/Задание/Help/ru.html b/SSL/src/BusinessProcesses/Задание/Help/ru.html new file mode 100644 index 000000000..87a3bff5e --- /dev/null +++ b/SSL/src/BusinessProcesses/Задание/Help/ru.html @@ -0,0 +1,3 @@ + +

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

+

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

\ No newline at end of file diff --git a/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl b/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl new file mode 100644 index 000000000..f87e2a8f7 --- /dev/null +++ b/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl @@ -0,0 +1,95 @@ +//////////////////////////////////////////////////////////////////////////////// +// Программный интерфейс для подсистемы бизнес-процессов и задач + +// Получить структуру с описанием формы выполнения задачи. +// Вызывается при открытии формы выполнения задачи. +// +// Параметры +// ЗадачаСсылка – ЗадачаСсылка.ЗадачаИсполнителя – задача +// ТочкаМаршрутаСсылка – точка маршрута +// +// Возвращаемое значение: +// Структура – структуру с описанием формы выполнения задачи. +// Ключ "ИмяФормы" содержит имя формы, передаваемое в метод контекста ОткрытьФорму(). +// Ключ "ПараметрыФормы" содержит параметры формы. +// +Функция ФормаВыполненияЗадачи(ЗадачаСсылка, ТочкаМаршрутаБизнесПроцесса) Экспорт + + Результат = Новый Структура; + Результат.Вставить("ПараметрыФормы", Новый Структура("Ключ", ЗадачаСсылка)); + Результат.Вставить("ИмяФормы", "БизнесПроцесс.Задание.Форма.Действие" + ТочкаМаршрутаБизнесПроцесса.Имя); + Возврат Результат; + +КонецФункции + +// Вызывается при перенаправлении задачи. +// +// Параметры +// ЗадачаСсылка – ЗадачаСсылка.ЗадачаИсполнителя – перенаправляемая задача. +// НоваяЗадачаСсылка – ЗадачаСсылка.ЗадачаИсполнителя – задача для нового исполнителя. +// +Процедура ПриПеренаправленииЗадачи(ЗадачаСсылка, НоваяЗадачаСсылка) Экспорт + + БизнесПроцессОбъект = ЗадачаСсылка.БизнесПроцесс.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(БизнесПроцессОбъект.Ссылка); + БизнесПроцессОбъект.РезультатВыполнения = РезультатВыполненияПриПеренаправлении(ЗадачаСсылка) + + БизнесПроцессОбъект.РезультатВыполнения; + УстановитьПривилегированныйРежим(Истина); + БизнесПроцессОбъект.Записать(); + +КонецПроцедуры + +// Вызывается при выполнении задачи из формы списка. +// +// Параметры +// ЗадачаСсылка – ЗадачаСсылка.ЗадачаИсполнителя – задача +// ТочкаМаршрутаСсылка – точка маршрута +// +Процедура ОбработкаВыполненияПоУмолчанию(ЗадачаСсылка, БизнесПроцессСсылка, ТочкаМаршрутаБизнесПроцесса) Экспорт + + // устанавливаем значения по умолчанию для пакетного выполнения задач + Если ТочкаМаршрутаБизнесПроцесса = БизнесПроцессы.Задание.ТочкиМаршрута.Выполнить Тогда + ЗаданиеОбъект = БизнесПроцессСсылка.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(ЗаданиеОбъект.Ссылка); + ЗаданиеОбъект.Выполнено = Истина; + ЗаданиеОбъект.Записать(); + ИначеЕсли ТочкаМаршрутаБизнесПроцесса = БизнесПроцессы.Задание.ТочкиМаршрута.Проверить Тогда + ЗаданиеОбъект = БизнесПроцессСсылка.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(ЗаданиеОбъект.Ссылка); + ЗаданиеОбъект.Выполнено = Истина; + ЗаданиеОбъект.Подтверждено = Истина; + ЗаданиеОбъект.Записать(); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры + +Процедура УстановитьСостояниеЭлементовФормыЗадачи(Форма) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ЗаданиеОбъект = Форма.РеквизитФормыВЗначение("Задание"); + Форма.Элементы.РезультатВыполнения.Видимость = НЕ ПустаяСтрока(ЗаданиеОбъект.РезультатВыполнения); + Форма.Элементы.Предмет.Гиперссылка = ЗаданиеОбъект.Предмет <> Неопределено И НЕ ЗаданиеОбъект.Предмет.Пустая(); + Форма.ПредметСтрокой = БизнесПроцессыИЗадачиСервер.ПредметСтрокой(ЗаданиеОбъект.Предмет); + +КонецПроцедуры + +Функция РезультатВыполненияПриПеренаправлении(Знач ЗадачаСсылка) + + СтрокаФормат = НСтр("ru = '%1, %2 перенаправил(а) задачу: + |%3 + |'"); + + Комментарий = СокрЛП(ЗадачаСсылка.РезультатВыполнения); + Комментарий = ?(ПустаяСтрока(Комментарий), "", Комментарий + Символы.ПС); + Результат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаФормат, + ЗадачаСсылка.ДатаИсполнения, + ЗадачаСсылка.Исполнитель, + Комментарий); + + Возврат Результат; + +КонецФункции diff --git a/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl b/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl new file mode 100644 index 000000000..a82272979 --- /dev/null +++ b/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl @@ -0,0 +1,300 @@ + + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий бизнес-процесса + +Процедура ПриЗаписи(Отказ) + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если НЕ ЭтоНовый() И Ссылка.Предмет <> Предмет Тогда + ИзменитьПредметЗадач(); + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) + + Если ЭтоНовый() Тогда + Автор = ОбщегоНазначения.ТекущийПользователь(); + Важность = Перечисления.ВариантыВажностиЗадачи.Обычная; + НаПроверке = Истина; + Проверяющий = ОбщегоНазначения.ТекущийПользователь(); + КонецЕсли; + + Если ДанныеЗаполнения <> Неопределено И ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") + И ДанныеЗаполнения <> Задачи.ЗадачаИсполнителя.ПустаяСсылка() Тогда + Предмет = ДанныеЗаполнения; + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + Если НаПроверке Тогда + ПроверяемыеРеквизиты.Добавить("Проверяющий"); + КонецЕсли; +КонецПроцедуры + +Процедура ПриКопировании(ОбъектКопирования) + + НомерИтерации = 0; + Выполнено = Ложь; + Подтверждено = Ложь; + РезультатВыполнения = ""; + ДатаЗавершения = '00010101000000'; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий элементов карты маршрута + +Процедура ВыполнитьПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ) + + НомерИтерации = НомерИтерации + 1; + Записать(); + + // Устанавливаем реквизиты адресации и доп. реквизиты для каждой задачи + Для каждого Задача Из ФормируемыеЗадачи Цикл + + Задача.Автор = Автор; + Задача.Исполнитель = Исполнитель; + Задача.Наименование = НаименованиеЗадачиДляВыполнения(); + Задача.СрокИсполнения = СрокИсполненияЗадачиДляВыполнения(); + Задача.Важность = Важность; + Задача.Предмет = Предмет; + + КонецЦикла; + +КонецПроцедуры + +Процедура ВыполнитьПриВыполнении(ТочкаМаршрутаБизнесПроцесса, Задача, Отказ) + + РезультатВыполнения = РезультатВыполненияТочкиВыполнить(Задача) + РезультатВыполнения; + УстановитьПривилегированныйРежим(Истина); + Записать(); + +КонецПроцедуры + +Процедура ПроверитьПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ) + + Если Проверяющий.Пустая() Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + // Устанавливаем реквизиты адресации и доп. реквизиты для каждой задачи + Для каждого Задача Из ФормируемыеЗадачи Цикл + + Задача.Автор = Автор; + Задача.Исполнитель = Проверяющий; + Задача.Наименование = НаименованиеЗадачиДляПроверки(); + Задача.СрокИсполнения = СрокИсполненияЗадачиДляПроверки(); + Задача.Важность = Важность; + Задача.Предмет = Предмет; + + КонецЦикла; + +КонецПроцедуры + +Процедура ПроверитьПриВыполнении(ТочкаМаршрутаБизнесПроцесса, Задача, Отказ) + + РезультатВыполнения = РезультатВыполненияТочкиПроверить(Задача) + РезультатВыполнения; + УстановитьПривилегированныйРежим(Истина); + Записать(); + +КонецПроцедуры + +Процедура НужнаПроверкаПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) + + Результат = НаПроверке; + +КонецПроцедуры + +Процедура ВернутьИсполнителюПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) + + Результат = НЕ Подтверждено; + +КонецПроцедуры + +Процедура ЗавершениеПриЗавершении(ТочкаМаршрутаБизнесПроцесса, Отказ) + + ДатаЗавершения = БизнесПроцессыИЗадачиСервер.ДатаЗавершенияБизнесПроцесса(Ссылка); + УстановитьПривилегированныйРежим(Истина); + Записать(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры + +// Актуализирует значения реквизит невыполненных задач +// согласно реквизитам бизнес-процесса Задание: +// Важность, СрокИсполнения, Наименование и Автор +// +Процедура ИзменитьРеквизитыНевыполненныхЗадач() Экспорт + + УстановитьПривилегированныйРежим(Истина); + НачатьТранзакцию(); + Попытка + Запрос = Новый Запрос( + "ВЫБРАТЬ + | Задачи.Ссылка КАК Ссылка + |ИЗ + | Задача.ЗадачаИсполнителя КАК Задачи + |ГДЕ + | Задачи.БизнесПроцесс = &БизнесПроцесс + | И Задачи.ПометкаУдаления = ЛОЖЬ + | И Задачи.Выполнена = ЛОЖЬ"); + Запрос.УстановитьПараметр("БизнесПроцесс", Ссылка); + Результат = Запрос.Выполнить(); + + Блокировка = Новый БлокировкаДанных; + + ВыборкаДетальныеЗаписи = Результат.Выбрать(); + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + ЭлементБлокировки.УстановитьЗначение("Ссылка", ВыборкаДетальныеЗаписи.Ссылка); + КонецЦикла; + Блокировка.Заблокировать(); + + ВыборкаДетальныеЗаписи.Сбросить(); + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + ЗадачаОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); + ЗадачаОбъект.Важность = Важность; + ЗадачаОбъект.СрокИсполнения = + ?(ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Задание.ТочкиМаршрута.Выполнить, + СрокИсполненияЗадачиДляВыполнения(), СрокИсполненияЗадачиДляПроверки()); + ЗадачаОбъект.Наименование = + ?(ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Задание.ТочкиМаршрута.Выполнить, + НаименованиеЗадачиДляВыполнения(), НаименованиеЗадачиДляПроверки()); + ЗадачаОбъект.Автор = Автор; + // Не выполняем предварительную блокировку данных для редактирования, т.к. + // это изменение имеет более высокий приоритет над открытыми формами задач. + ЗадачаОбъект.Записать(); + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +Процедура ИзменитьПредметЗадач() + + УстановитьПривилегированныйРежим(Истина); + НачатьТранзакцию(); + Попытка + Запрос = Новый Запрос( + "ВЫБРАТЬ + | Задачи.Ссылка КАК Ссылка + |ИЗ + | Задача.ЗадачаИсполнителя КАК Задачи + |ГДЕ + | Задачи.БизнесПроцесс = &БизнесПроцесс"); + + Запрос.УстановитьПараметр("БизнесПроцесс", Ссылка); + Результат = Запрос.Выполнить(); + + Блокировка = Новый БлокировкаДанных; + ВыборкаДетальныеЗаписи = Результат.Выбрать(); + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + ЭлементБлокировки.УстановитьЗначение("Ссылка", ВыборкаДетальныеЗаписи.Ссылка); + КонецЦикла; + Блокировка.Заблокировать(); + + ВыборкаДетальныеЗаписи.Сбросить(); + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + ЗадачаОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); + ЗадачаОбъект.Предмет = Предмет; + // Не выполняем предварительную блокировку данных для редактирования, т.к. + // это изменение имеет более высокий приоритет над открытыми формами задач. + ЗадачаОбъект.Записать(); + КонецЦикла; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +Функция НаименованиеЗадачиДляВыполнения() + + Возврат Наименование; + +КонецФункции + +Функция СрокИсполненияЗадачиДляВыполнения() + + Возврат СрокИсполнения; + +КонецФункции + +Функция НаименованиеЗадачиДляПроверки() + + Возврат БизнесПроцессы.Задание.ТочкиМаршрута.Проверить.НаименованиеЗадачи + ": " + Наименование; + +КонецФункции + +Функция СрокИсполненияЗадачиДляПроверки() + + Возврат СрокПроверки; + +КонецФункции + +Функция РезультатВыполненияТочкиВыполнить(Знач ЗадачаСсылка) + + СтрокаФормат = ?(Выполнено, + НСтр("ru = '%1, %2 выполнил(а) задачу: + |%3 + |'"), + НСтр("ru = '%1, %2 отклонил(а) задачу: + |%3 + |'")); + ЗадачаДанные = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ЗадачаСсылка, + "РезультатВыполнения,ДатаИсполнения,Исполнитель"); + Комментарий = СокрЛП(ЗадачаДанные.РезультатВыполнения); + Комментарий = ?(ПустаяСтрока(Комментарий), "", Комментарий + Символы.ПС); + Результат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаФормат, + ЗадачаДанные.ДатаИсполнения, + ЗадачаДанные.Исполнитель, + Комментарий); + + Возврат Результат; + +КонецФункции + +Функция РезультатВыполненияТочкиПроверить(Знач ЗадачаСсылка) + + Если НЕ Подтверждено Тогда + СтрокаФормат = НСтр("ru = '%1, %2 вернул(а) задачу на доработку: + |%3 + |'"); + Иначе + СтрокаФормат = ?(Выполнено, + НСтр("ru = '%1, %2 подтвердил(а) выполнение задачи: + |%3 + |'"), + НСтр("ru = '%1, %2 подтвердил(а) отмену задачи: + |%3 + |'")); + КонецЕсли; + + ЗадачаДанные = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ЗадачаСсылка, + "РезультатВыполнения,ДатаИсполнения,Исполнитель"); + Комментарий = СокрЛП(ЗадачаДанные.РезультатВыполнения); + Комментарий = ?(ПустаяСтрока(Комментарий), "", Комментарий + Символы.ПС); + Результат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаФормат, + ЗадачаДанные.ДатаИсполнения, + ЗадачаДанные.Исполнитель, + Комментарий); + + Возврат Результат; + +КонецФункции diff --git a/SSL/src/BusinessProcesses/Задание/Задание.mdo b/SSL/src/BusinessProcesses/Задание/Задание.mdo new file mode 100644 index 000000000..a640cd7e7 --- /dev/null +++ b/SSL/src/BusinessProcesses/Задание/Задание.mdo @@ -0,0 +1,486 @@ + + + + + + + + + + + Задание + + ru + Задание + + true + BusinessProcess.Задание.StandardAttribute.Number + DontUse + + Use + Started + + Use + + + + + Use + HeadTask + + Task.ЗадачаИсполнителя.EmptyRef + + Use + + + + + Use + Completed + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + Date + + ru + Дата выдачи задания + + + 0001-01-01T00:00:00 + + ShowError + Use + + + + + Use + Number + + + + Use + + + + Catalog.Файлы + Catalog.Пользователи + DontUse + true + + + ru + + + Managed + Use + + ru + Задания + + + ru + Задание для исполнителя + + InDialog + BusinessProcess.Задание.Form.ФормаБизнесПроцесса + BusinessProcess.Задание.Form.ФормаСписка + String + 9 + Variable + true + true + Task.ЗадачаИсполнителя + true + + Автор + + ru + Автор + + + CatalogRef.Пользователи + + + ru + Пользователь, выдавший задание + + + + DontUse + Use + + Catalog.Пользователи.EmptyRef + + Index + Use + Use + + + Важность + + ru + Важность + + Важность задач точки действия Выполнить для исполнителя + + EnumRef.ВариантыВажностиЗадачи + + + + Use + DontUse + true + + Enum.ВариантыВажностиЗадачи.EnumValue.Обычная + + Index + Use + Use + + + Выполнено + + ru + Выполнено + + Результат выполнения задания после завершения бизнес-процесса. + + Boolean + + + + + Use + Use + + + ДатаЗавершения + + ru + Дата завершения + + Фактическая дата завершения бизнес-процесса + + Date + + + + ru + Фактическая дата завершения выполнения задания + + + + + 0001-01-01T00:00:00 + + Index + Use + Use + + + Исполнитель + + ru + Исполнитель + + + CatalogRef.Пользователи + + + ru + Пользователь, которому поручено выполнять задание + + + + ShowError + DontUse + Use + + Catalog.Пользователи.EmptyRef + + Index + Use + Use + + + Наименование + + ru + Задание + + Описание задания + + String + + 250 + + + + ru + Краткое описание задания + + + + ShowError + + Use + Use + + + НаПроверке + + ru + На проверке + + Признак того, что указан проверяющий по задаче + + Boolean + + + ru + Требуется этап проверки + + + + + Use + Use + + + НомерИтерации + + ru + Номер итерации + + Количество циклов бизнес-процесса между исполнителем и проверяющим + + Number + + 10 + true + + + + ru + Количество итераций переписки между исполнителем и проверяющим + + + + + 0 + + Index + Use + Use + + + ОписаниеЗадания + + ru + Содержание + + + String + + + + ru + Содержание задания + + true + true + + + + Use + Use + + + Подтверждено + + ru + Подтверждено + + Внутреннее состояние бизнес-процесса + + Boolean + + + + + Use + Use + + + Предмет + + ru + Предмет + + Объект системы, "по поводу" которого был создан бизнес-процесс. + + AnyRef + + + ru + Объект информационной базы, по поводу которого введено задание + + + + + Index + Use + Use + + + Проверяющий + + ru + Проверяющий + + + CatalogRef.Пользователи + + + ru + Пользователь, выполняющий проверку задания + + + + DontUse + Use + + Catalog.Пользователи.EmptyRef + + Index + Use + Use + + + РезультатВыполнения + + ru + Результат выполнения + + История переписки исполнителя и проверяющего + + String + + + + ru + История переписки по заданию + + true + true + + + + Use + Use + + + СрокИсполнения + + ru + Срок исполнения + + + Date + + + + ru + Плановый срок выполнения задания + + + + ShowError + + 0001-01-01T00:00:00 + + Index + Use + Use + + + СрокПроверки + + ru + Срок проверки + + + Date + + + + ru + Плановый срок проверки задания + + + + + 0001-01-01T00:00:00 + + Index + Use + Use + + + ФормаБизнесПроцесса + + ru + Форма бизнес-процесса + + PersonalComputer + MobileDevice + + + ДействиеВыполнить + + ru + Действие выполнить + + PersonalComputer + MobileDevice + + + ДействиеПроверить + + ru + Действие проверить + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаПодбораВалютИзОКВ/Form.form b/SSL/src/Catalogs/Валюты/Forms/ФормаПодбораВалютИзОКВ/Form.form new file mode 100644 index 000000000..96216449c --- /dev/null +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаПодбораВалютИзОКВ/Form.form @@ -0,0 +1,591 @@ + + + + СписокВалют + 1 + true + true + + true + + + Валюты + + false + None + Add + Change + Choose + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + OutputList + SortListAsc + SortListDesc + + КодВалюты + 4 + true + true + + true + + + Валюты.КодВалютыЦифровой + + + КодВалютыРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + КодВалютыКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + 3 + true + true + false + true + true + true + Normal + + + + КраткоеНаименование + 6 + true + true + + true + + + Валюты.КодВалютыБуквенный + + + КраткоеНаименованиеРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + КраткоеНаименованиеКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + 3 + true + true + false + true + true + true + Normal + + + + Наименование + 8 + true + true + + true + + + Валюты.Наименование + + + НаименованиеРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + 20 + true + true + false + true + true + true + Normal + + + + СтраныИТерритории + 10 + true + true + + true + + + Валюты.СтраныИТерритории + + + СтраныИТерриторииРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + СтраныИТерриторииКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Загружается + 15 + true + true + + true + + + Валюты.Загружается + + + ru + Валюта может быть загружена с сайта РБК + + + ЗагружаетсяРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ЗагружаетсяКонтекстноеМеню + 16 + true + + CheckBoxField + Enter + true + Left + true + + + Top + + СписокВалютКоманднаяПанель + 3 + + Выбрать + 14 + true + true + + true + + false + + ВыбратьРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.Command.Выбрать + Auto + true + true + true + UserCmds + Auto + + + Найти + 12 + true + true + + true + + false + + НайтиРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + Form.Item.СписокВалют.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ОтменитьПоиск + 13 + true + true + + true + + false + + ОтменитьПоискРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.Item.СписокВалют.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + СписокВалютВыбор + + + СписокВалютСтрокаПоиска + 21 + + СписокВалютСтрокаПоискаРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + СписокВалютСтрокаПоискаКонтекстноеМеню + 22 + true + + СписокВалют + + true + + + + СписокВалютСостояниеПросмотра + 24 + + СписокВалютСостояниеПросмотраРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + СписокВалютСостояниеПросмотраКонтекстноеМеню + 25 + true + + ViewStatusAddition + СписокВалют + + true + + + + СписокВалютУправлениеПоиском + 27 + + СписокВалютУправлениеПоискомРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + СписокВалютУправлениеПоискомКонтекстноеМеню + 28 + true + + SearchControlAddition + СписокВалют + + true + + + + СписокВалютРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + СписокВалютКонтекстноеМеню + 2 + true + + true + true + true + true + true + true + true + Row +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + None + None + None + true + +
+ None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + 80 + DontBlock + true + 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 + + 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 + + + + + +
diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаПодбораВалютИзОКВ/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ФормаПодбораВалютИзОКВ/Module.bsl new file mode 100644 index 000000000..89c581546 --- /dev/null +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаПодбораВалютИзОКВ/Module.bsl @@ -0,0 +1,68 @@ + +// Обработчик события "при создании на сервере" +// Вызывает функциональность заполнения списка валют из ОКВ +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗакрыватьПриВыборе = Ложь; + ЗаполнитьТаблицуВалют(); + +КонецПроцедуры + +// Обработчик события "выбор" элемента формы СписокВалют +// Оповещает о выборе вызывающую форму. Форма закрывается. +// +&НаКлиенте +Процедура СписокВалютВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ОбработатьВыборВСпискеВалют(Элемент.ТекущиеДанные); + +КонецПроцедуры + +// Заполняет список валют из макета ОКВ +// +&НаСервере +Процедура ЗаполнитьТаблицуВалют() + + КлассификаторXML = Справочники.Валюты.ПолучитьМакет("ОбщероссийскийКлассификаторВалют").ПолучитьТекст(); + + КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(КлассификаторXML).Данные; + + Для Каждого ЗаписьОКВ Из КлассификаторТаблица Цикл + НоваяСтрока = Валюты.Добавить(); + НоваяСтрока.КодВалютыЦифровой = ЗаписьОКВ.Code; + НоваяСтрока.КодВалютыБуквенный = ЗаписьОКВ.CodeSymbol; + НоваяСтрока.Наименование = ЗаписьОКВ.Name; + НоваяСтрока.СтраныИТерритории = ЗаписьОКВ.Description; + НоваяСтрока.Загружается = ЗаписьОКВ.RBCLoading; + КонецЦикла; + +КонецПроцедуры + +// Обработчик нажатия на кнопку "Выбрать" командной панели +// элемента формы СписокВалют. +// +&НаКлиенте +Процедура ВыбратьВыполнить() + + ОбработатьВыборВСпискеВалют(Элементы.СписокВалют.ТекущиеДанные); + +КонецПроцедуры + +// Обработчик события "выбор" элемента формы СписокВалют +// Оповещает о выборе вызывающую форму. Форма закрывается. +// +&НаКлиенте +Процедура ОбработатьВыборВСпискеВалют(ТекущиеДанные) + + ПараметрыВыбор = Новый Структура("КодВалюты, НаименованиеКраткое, НаименованиеПолное, Загружается"); + ПараметрыВыбор.КодВалюты = ТекущиеДанные.КодВалютыЦифровой; + ПараметрыВыбор.НаименованиеКраткое = ТекущиеДанные.КодВалютыБуквенный; + ПараметрыВыбор.НаименованиеПолное = ТекущиеДанные.Наименование; + ПараметрыВыбор.Загружается = ТекущиеДанные.Загружается; + + ОповеститьОВыборе(ПараметрыВыбор); + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..741acd7b9 --- /dev/null +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form @@ -0,0 +1,571 @@ + + + + Валюты + 25 + true + true + + true + + + Список + + false + None + + Код + 28 + true + true + + true + + + Список.Code + + + КодРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 29 + true + + InputField + Enter + true + Left + true + + 3 + true + true + true + true + true + Normal + + + + Наименование + 32 + true + true + + true + + + Список.Description + + + НаименованиеРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 33 + true + + InputField + Enter + true + Left + true + + 5 + true + true + true + true + true + Normal + + + + НаименованиеПолное + 40 + true + true + + true + + + Список.НаименованиеПолное + + + НаименованиеПолноеРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + НаименованиеПолноеКонтекстноеМеню + 41 + true + + InputField + Enter + true + Left + true + + 20 + true + true + true + true + true + Normal + + + + КурсКратность + 42 + + Курс + 38 + true + true + + true + + + Список.Курс + + + КурсРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + КурсКонтекстноеМеню + 39 + true + + InputField + Enter + true + Left + true + + 8 + true + true + true + true + true + Normal + + + + Кратность + 36 + + <key>ru</key> + <value>кратность</value> + + true + true + + true + + + Список.Кратность + + + ru + кратность равная единице не отображается + + + КратностьРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + КратностьКонтекстноеМеню + 37 + true + + InputField + Enter + true + Left + true + + 5 + true + true + true + true + true + Normal + + + true + true + + true + + + ru + Курс кратность + + true + + КурсКратностьРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + None + + ВалютыКоманднаяПанель + 27 + Left + true + + + ВалютыСтрокаПоиска + 48 + + ВалютыСтрокаПоискаРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ВалютыСтрокаПоискаКонтекстноеМеню + 49 + true + + Валюты + + true + + + + ВалютыСостояниеПросмотра + 51 + + ВалютыСостояниеПросмотраРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ВалютыСостояниеПросмотраКонтекстноеМеню + 52 + true + + ViewStatusAddition + Валюты + + true + + + + ВалютыУправлениеПоиском + 54 + + ВалютыУправлениеПоискомРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + ВалютыУправлениеПоискомКонтекстноеМеню + 55 + true + + SearchControlAddition + Валюты + + true + + + + ВалютыРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ВалютыКонтекстноеМеню + 26 + true + + HierarchicalList + true + true + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
+ + ФормаКоманднаяПанель + -1 + + ФормаЗагрузитьКурсыВалют + 43 + true + true + + true + + + ФормаЗагрузитьКурсыВалютРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + Form.Command.ЗагрузитьКурсыВалют + Normal + Auto + true + true + UserCmds + Auto + + + ФормаПодборИзОКВ + 44 + true + true + + true + + + ФормаПодборИзОКВРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.Command.ПодборИзОКВ + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + ChoiceProcessing + ОбработкаВыбора + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСоздании + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + ВЫБРАТЬ + Валюты.ПометкаУдаления, + Валюты.Код, + Валюты.Наименование, + Валюты.НаименованиеПолное, + КурсыВалют.Курс, + ВЫБОР + КОГДА КурсыВалют.Кратность = 1 ТОГДА + " " + Иначе + КурсыВалют.Кратность + Конец Как Кратность +ИЗ + Справочник.Валюты как Валюты +ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ + РегистрСведений.КурсыВалют.СрезПоследних(&КонецПериода) КАК КурсыВалют +ПО Валюты.Ссылка = КурсыВалют.Валюта + Catalog.Валюты + true + true + true + true + true + +
+ + ПодборИзОКВ + + <key>ru</key> + <value>Подбор из классификатора</value> + + 1 + + ru + Подбор валют из Общероссийского классификатора валют + + + + true + Role.ДобавлениеИзменениеБазовойНСИ + + + true + Role.ПолныеПрава + + + + + ПодборИзОКВ + + + Auto + Auto + + + ЗагрузитьКурсыВалют + + <key>ru</key> + <value>Загрузить курсы валют</value> + + 2 + + ru + Загрузить курсы валют с веб-сайта РБК + + + + true + Role.ДобавлениеИзменениеБазовойНСИ + + + true + Role.ПолныеПрава + + + + + ЗагрузитьКурсыВалют + + + Auto + Auto + + + + + + +
diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Help/ru.html b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Help/ru.html new file mode 100644 index 000000000..6925e641b --- /dev/null +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Help/ru.html @@ -0,0 +1,4 @@ + +

Содержит список валют с последними загруженными курсами.

+

Кнопка "Подбор из классификатора" - создание новой валюты, с помощью ее выбора из общероссийского классификатора валют (ОКВ)

+

Кнопка "Загрузка курсов" - открывает форму для загрузки курсов валют

\ No newline at end of file diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..56605e1c2 --- /dev/null +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,50 @@ +// Обработчик события ПриСоздании формы. +// Устанавливает параметр КонецПериода запроса равным текущей дате. +// +&НаСервере +Процедура ПриСоздании(Отказ, СтандартнаяОбработка) + + ДатаКурса = НачалоДня(ТекущаяДата()); + Элементы.Курс.Заголовок = "Курс на " + Формат(ТекущаяДата(), "ДЛФ=DD"); + Элементы.Курс.Подсказка = Элементы.Курс.Заголовок; + Список.Параметры.УстановитьЗначениеПараметра ("КонецПериода", ДатаКурса); + +КонецПроцедуры + +// Обработчик события "обработка выбора" формы +// Обработка выбора валюты при подборе из ОКВ +// +&НаКлиенте +Процедура ОбработкаВыбора(РезультатВыбора, ИсточникВыбора) + + Если ТипЗнч(РезультатВыбора) = Тип("Структура") Тогда + ОткрытьФорму("Справочник.Валюты.ФормаОбъекта", РезультатВыбора,ЭтаФорма); + КонецЕсли; + +КонецПроцедуры + +// Обработчик события "обработка оповещения" формы. +// Пересчитывает список валют. +// +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ИзменениеКурсовВалют" Тогда + Элементы.Валюты.Обновить(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПодборИзОКВ(Команда) + + ОткрытьФорму("Справочник.Валюты.Форма.ФормаПодбораВалютИзОКВ",, ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗагрузитьКурсыВалют(Команда) + + ОткрытьФорму("Обработка.КурсыВалютРБК.Форма"); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..1807b8b2f --- /dev/null +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,1431 @@ + + + + Странницы + 47 + + ОсновныеСведения + 48 + + НаименованиеПолное + 4 + true + true + + true + + + Объект.НаименованиеПолное + + + НаименованиеПолноеРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + НаименованиеПолноеКонтекстноеМеню + 23 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ГруппаКодыВалюты + 7 + + Наименование + 3 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Код + 2 + true + true + + true + + + Объект.Code + + + КодРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + Left + + 3 + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа коды валюты</value> + + + ru + Группа коды валюты + + + ГруппаКодыВалютыРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Прочее + 38 + + ВалютаЗагружаетсяССайтаРБК + 41 + true + true + + true + + + Объект.ВалютаЗагружается + + Right + + OnChange + ВалютаЗагружаетсяССайтаРБКПриИзменении + + + ВалютаЗагружаетсяССайтаРБКРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + ВалютаЗагружаетсяССайтаРБККонтекстноеМеню + 42 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаЗависимыйКурсВалют + 52 + + ЗависимыйКурсВалют + 50 + true + true + + true + + + ЗависимыйКурсВалют + + Right + + OnChange + ЗависимыйКурсВалютПриИзменении + + + ЗависимыйКурсВалютРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + ЗависимыйКурсВалютКонтекстноеМеню + 51 + true + + CheckBoxField + Enter + true + Left + true + + + + ПодчиненныйКурсОт + 5 + true + true + + true + + + Объект.ПодчиненныйКурсОт + + + ПодчиненныйКурсОтРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + ПодчиненныйКурсОтКонтекстноеМеню + 35 + true + + InputField + Enter + true + Left + true + Left + + + StartChoice + ПодчиненныйКурсОтНачалоВыбора + + 25 + true + true + false + true + + CatalogRef.Валюты + + + Style.BorderColor + + Normal + + + + КоэффициентПодчиненногоКурса + 6 + + <key>ru</key> + <value>Наценка %</value> + + true + true + + true + + + Объект.КоэффициентПодчиненногоКурса + + + КоэффициентПодчиненногоКурсаРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + КоэффициентПодчиненногоКурсаКонтекстноеМеню + 36 + true + + InputField + Enter + true + Left + true + Left + + 5 + true + true + false + false + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа зависимый курс валют</value> + + + ru + Группа зависимый курс валют + + + ГруппаЗависимыйКурсВалютРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Прочее</value> + + + ru + Прочее + + true + + ПрочееРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Основные сведения</value> + + + ru + Основные сведения + + + ОсновныеСведенияРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СуммаПрописью + 37 + + ГруппаПрописанийЦелойЧасти + 9 + + ПолеПрописи4наРусском + 13 + + <key>ru</key> + <value>Род</value> + + true + true + + true + + + ПолеПрописи4наРусском + + + OnChange + ПолеПрописи4наРусскомПриИзменении + + + ПолеПрописи4наРусскомРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + + ПолеПрописи4наРусскомКонтекстноеМеню + 25 + true + + InputField + Enter + true + Left + true + Left + + + AutoComplete + ПолеПрописи4наРусскомАвтоПодбор + + + TextEditEnd + ПолеПрописи4наРусскомОкончаниеВводаТекста + + 10 + true + true + false + true + true + true + true + + + ru + Мужской + + + Мужской + + + + + ru + Женский + + + Женский + + + + + ru + Средний + + + Средний + + + + Style.BorderColor + + Normal + + + + ПолеПрописи1наРусском + 10 + + <key>ru</key> + <value>один</value> + + true + true + + true + + + ПолеПрописи1наРусском + + + ПолеПрописи1наРусскомРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ПолеПрописи1наРусскомКонтекстноеМеню + 26 + true + + InputField + Enter + true + Left + true + Left + + 10 + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ПолеПрописи2наРусском + 11 + + <key>ru</key> + <value>два</value> + + true + true + + true + + + ПолеПрописи2наРусском + + + ПолеПрописи2наРусскомРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + ПолеПрописи2наРусскомКонтекстноеМеню + 27 + true + + InputField + Enter + true + Left + true + Left + + 10 + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ПолеПрописи3наРусском + 12 + + <key>ru</key> + <value>пять</value> + + true + true + + true + + + ПолеПрописи3наРусском + + + ПолеПрописи3наРусскомРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + ПолеПрописи3наРусскомКонтекстноеМеню + 28 + true + + InputField + Enter + true + Left + true + Left + + 10 + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Целая часть</value> + + + ГруппаПрописанийЦелойЧастиРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + UsualGroup + + Auto + WeakSeparation + true + true + + ru + Параметры прописи целой части для русского языка + + auto + Auto + Auto + + + + ГруппаПараметрыДробнойЧасти + 55 + + ГруппаПрописанийДробнойЧасти + 14 + + ПолеПрописи8наРусском + 18 + + <key>ru</key> + <value>Род</value> + + true + true + + true + + + ПолеПрописи8наРусском + + + OnChange + ПолеПрописи8наРусскомПриИзменении + + + ПолеПрописи8наРусскомРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + + ПолеПрописи8наРусскомКонтекстноеМеню + 29 + true + + InputField + Enter + true + Left + true + Left + + + AutoComplete + ПолеПрописи8наРусскомАвтоПодбор + + + TextEditEnd + ПолеПрописи8наРусскомОкончаниеВводаТекста + + 10 + true + true + false + true + true + true + true + + + ru + Мужской + + + Мужской + + + + + ru + Женский + + + Женский + + + + + ru + Средний + + + Средний + + + + Style.BorderColor + + Normal + + + + ПолеПрописи5наРусском + 17 + + <key>ru</key> + <value>один</value> + + true + true + + true + + + ПолеПрописи5наРусском + + + ПолеПрописи5наРусскомРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + ПолеПрописи5наРусскомКонтекстноеМеню + 30 + true + + InputField + Enter + true + Left + true + Left + + 10 + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ПолеПрописи6наРусском + 16 + + <key>ru</key> + <value>два</value> + + true + true + + true + + + ПолеПрописи6наРусском + + + ПолеПрописи6наРусскомРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + + ПолеПрописи6наРусскомКонтекстноеМеню + 31 + true + + InputField + Enter + true + Left + true + Left + + 10 + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ПолеПрописи7наРусском + 15 + + <key>ru</key> + <value>пять</value> + + true + true + + true + + + ПолеПрописи7наРусском + + + ПолеПрописи7наРусскомРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + + ПолеПрописи7наРусскомКонтекстноеМеню + 32 + true + + InputField + Enter + true + Left + true + Left + + 10 + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Дробная часть</value> + + + ГруппаПрописанийДробнойЧастиРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + + ru + Параметры прописи дробной части для русского языка + + Auto + Auto + + + + ДлинаДробнойЧасти + 20 + true + true + + true + + + ДлинаДробнойЧасти + + + ДлинаДробнойЧастиРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + + ДлинаДробнойЧастиКонтекстноеМеню + 33 + true + + InputField + Enter + true + Left + true + Left + + + AutoComplete + ДлинаДробнойЧастиАвтоПодбор + + + TextEditEnd + ДлинаДробнойЧастиОкончаниеВводаТекста + + 15 + true + true + false + true + true + + + ru + 2 знака + + + 2 знака + + + + + ru + 1 знак + + + 1 знак + + + + + ru + 3 знака + + + 3 знака + + + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Дробная часть</value> + + + ru + Группа параметры дробной части + + + ГруппаПараметрыДробнойЧастиРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Параметры прописи валюты</value> + + + ru + Сумма прописью + + + СуммаПрописьюРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + ru + Странницы + + + СтранницыРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + + + Top + true + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.Валюты + + + true + + + true + +
true
+ true +
+ + ПолеПрописи1наРусском + + <key>ru</key> + <value>Поле прописи1на русском</value> + + 2 + + String + + 25 + + + + true + + + true + + + + ПолеПрописи2наРусском + + <key>ru</key> + <value>Поле прописи2на русском</value> + + 3 + + String + + 25 + + + + true + + + true + + + + ПолеПрописи3наРусском + + <key>ru</key> + <value>Поле прописи3на русском</value> + + 4 + + String + + 25 + + + + true + + + true + + + + ПолеПрописи4наРусском + + <key>ru</key> + <value>Поле прописи4на русском</value> + + 5 + + String + + + + true + + + true + + + + ПолеПрописи5наРусском + + <key>ru</key> + <value>Поле прописи5на русском</value> + + 6 + + String + + 25 + + + + true + + + true + + + + ПолеПрописи6наРусском + + <key>ru</key> + <value>Поле прописи6на русском</value> + + 7 + + String + + 25 + + + + true + + + true + + + + ПолеПрописи7наРусском + + <key>ru</key> + <value>Поле прописи7на русском</value> + + 8 + + String + + 25 + + + + true + + + true + + + + ПолеПрописи8наРусском + + <key>ru</key> + <value>Поле прописи8на русском</value> + + 9 + + String + + 25 + + + + true + + + true + + + + ДлинаДробнойЧасти + + <key>ru</key> + <value>Число разрядов дробной части</value> + + 11 + + String + + + + true + + + true + + + + ЗависимыйКурсВалют + + <key>ru</key> + <value>Курс валюты зависит от курса другой валюты</value> + + 10 + + Boolean + + + true + + + true + + true + + + + + + + + BeforeWrite + ПередЗаписью + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + +
diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..c91a84d6a --- /dev/null +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,347 @@ +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ ОБРАБОТЧИКОВ СОБЫТИЙ +// + +// Обработчик события "при создании на сервере" формы +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("КодВалюты") Тогда + Объект.Код = Параметры.КодВалюты; + КонецЕсли; + + Если Параметры.Свойство("НаименованиеКраткое") Тогда + Объект.Наименование = Параметры.НаименованиеКраткое; + КонецЕсли; + + Если Параметры.Свойство("НаименованиеПолное") Тогда + Объект.НаименованиеПолное = Параметры.НаименованиеПолное; + КонецЕсли; + + Если Параметры.Свойство("Загружается") Тогда + Объект.ВалютаЗагружается = Параметры.Загружается; + КонецЕсли; + + Если Объект.ВалютаЗагружается Тогда + Объект.ПодчиненныйКурсОт = Справочники.Валюты.ПустаяСсылка(); + КонецЕсли; + + Если ЗначениеЗаполнено(Объект.ПодчиненныйКурсОт) Тогда + ЗависимыйКурсВалют = Истина; + КонецЕсли; + + ПрочитатьПараметрыПрописи(); + +КонецПроцедуры + +// Обработчик события "ПриОткрытии" формы +// +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + УстановитьСвойстваЭлементовГруппыЗависимойВалюты(); + УстановитьСклоненияПараметровПрописи(); + +КонецПроцедуры + +// Обработчик события "ПриИзменении" элемента формы ВалютаЗагружаетсяССайтаРБК +// +&НаКлиенте +Процедура ВалютаЗагружаетсяССайтаРБКПриИзменении(Элемент) + + Если Объект.ВалютаЗагружается Тогда + ЗависимыйКурсВалют = Ложь; + Объект.ПодчиненныйКурсОт = NULL; + Объект.КоэффициентПодчиненногоКурса = 0; + КонецЕсли; + + УстановитьСвойстваЭлементовГруппыЗависимойВалюты(); + +КонецПроцедуры + +// Обработчик события "ПриИзменении" элемента формы ВалютаЗагружаетсяССайтаРБК +// +&НаКлиенте +Процедура ЗависимыйКурсВалютПриИзменении(Элемент) + + УстановитьСвойстваЭлементовГруппыЗависимойВалюты(); + +КонецПроцедуры + +// Обработчик события "НачалоВыбора" элемента формы ПодчиненныйКурсОт +// +&НаКлиенте +Процедура ПодчиненныйКурсОтНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ПодготовитьДанныеВыбораПодчиненнойВалюты(ДанныеВыбора, Объект.Ссылка); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) + + Если ЗависимыйКурсВалют Тогда + Если Не ЗначениеЗаполнено(Объект.ПодчиненныйКурсОт) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Необходимо указать основную валюту'"), , + "Объект.ПодчиненныйКурсОт", , + Отказ); + КонецЕсли; + + Если Не ЗначениеЗаполнено(Объект.КоэффициентПодчиненногоКурса) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Необходимо установить коэфициент подчинения курса'"), , + "Объект.КоэффициентПодчиненногоКурса", , + Отказ); + КонецЕсли; + + КонецЕсли; + + // Устанавливаем реквизиты загрузки и зависимости валюты + Если НЕ ЗависимыйКурсВалют Тогда + Объект.ПодчиненныйКурсОт = NULL; + Объект.КоэффициентПодчиненногоКурса = 0; + КонецЕсли; + +КонецПроцедуры + +// Обработчик события ПередЗаписьюНаСервере +// +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + ТекущийОбъект.ПараметрыПрописиНаРусском = ПолеПрописи1наРусском + ", " + + ПолеПрописи2наРусском + ", " + + ПолеПрописи3наРусском + ", " + + НРег(Лев(ПолеПрописи4наРусском, 1)) + ", " + + ПолеПрописи5наРусском + ", " + + ПолеПрописи6наРусском + ", " + + ПолеПрописи7наРусском + ", " + + НРег(Лев(ПолеПрописи8наРусском, 1)) + ", " + + ДлинаДробнойЧасти; + +КонецПроцедуры + +// Обработчик события "ПриИзменении" элемента формы ПолеПрописи4наРусском +// +&НаКлиенте +Процедура ПолеПрописи4наРусскомПриИзменении(Элемент) + УстановитьСклоненияПараметровПрописи(); +КонецПроцедуры + +// Обработчик события "ПриИзменении" элемента формы ПолеПрописи8наРусском +// +&НаКлиенте +Процедура ПолеПрописи8наРусскомПриИзменении(Элемент) + УстановитьСклоненияПараметровПрописи(); +КонецПроцедуры + +&НаКлиенте +Процедура ДлинаДробнойЧастиАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + ДанныеВыбора = АвтоПодборПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ДлинаДробнойЧастиОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + ДанныеВыбора = ОкончаниеВводаТекстаПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи4наРусскомАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + ДанныеВыбора = АвтоПодборПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи4наРусскомОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + ДанныеВыбора = ОкончаниеВводаТекстаПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи8наРусскомАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + ДанныеВыбора = АвтоПодборПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолеПрописи8наРусскомОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + ДанныеВыбора = ОкончаниеВводаТекстаПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ СЛУЖЕБНЫХ ФУНКЦИЙ И ПРОЦЕДУР +// + +// Процедура считывает параметры прописи и заполняет соответствующие поля диалога. +// +&НаСервере +Процедура ПрочитатьПараметрыПрописи() + + СтрокаПараметров = СтрЗаменить(Объект.ПараметрыПрописиНаРусском, ",", Символы.ПС); + + ПолеПрописи1наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 1)); + ПолеПрописи2наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 2)); + ПолеПрописи3наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 3)); + + Род = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 4)); + + Если НРег(Род) = "м" Тогда + ПолеПрописи4наРусском = "Мужской"; + ИначеЕсли НРег(Род) = "ж" Тогда + ПолеПрописи4наРусском = "Женский"; + ИначеЕсли НРег(Род) = "с" Тогда + ПолеПрописи4наРусском = "Средний"; + КонецЕсли; + + ПолеПрописи5наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 5)); + ПолеПрописи6наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 6)); + ПолеПрописи7наРусском = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 7)); + + Род = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 8)); + + Если НРег(Род = "м") Тогда + ПолеПрописи8наРусском = "Мужской"; + ИначеЕсли НРег(Род = "ж") Тогда + ПолеПрописи8наРусском = "Женский"; + ИначеЕсли НРег(Род = "с") Тогда + ПолеПрописи8наРусском = "Средний"; + КонецЕсли; + + ДлинаДробнойЧасти = СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 9)); + +КонецПроцедуры + +// Процедура устанавливает видимость элементов управления формы, ответственных +// за установление параметров завимисомти от базовой валюты (ссылка на базовую +// валюту и коэфициент). +// +&НаКлиенте +Процедура УстановитьСвойстваЭлементовГруппыЗависимойВалюты() + + Если Объект.ВалютаЗагружается Тогда + Элементы.ГруппаЗависимыйКурсВалют.Доступность = Ложь; + ФлагПараметровЗависимогоКурса = Ложь; + Иначе + Элементы.ГруппаЗависимыйКурсВалют.Доступность = Истина; + ФлагПараметровЗависимогоКурса = ? (ЗависимыйКурсВалют, Истина, Ложь); + КонецЕсли; + + Элементы.ПодчиненныйКурсОт.АвтоОтметкаНезаполненного = ФлагПараметровЗависимогоКурса; + Элементы.КоэффициентПодчиненногоКурса.АвтоОтметкаНезаполненного = ФлагПараметровЗависимогоКурса; + Элементы.ПодчиненныйКурсОт.Доступность = ФлагПараметровЗависимогоКурса; + Элементы.КоэффициентПодчиненногоКурса.Доступность = ФлагПараметровЗависимогоКурса; + Если Не ФлагПараметровЗависимогоКурса Тогда + Элементы.ПодчиненныйКурсОт.ОтметкаНезаполненного = ФлагПараметровЗависимогоКурса; + Элементы.КоэффициентПодчиненногоКурса.ОтметкаНезаполненного = ФлагПараметровЗависимогоКурса; + КонецЕсли + +КонецПроцедуры + +// Процедура устанавливает склонение заголовков элементов формы +// хранящих за параметры прописи. +// +&НаКлиенте +Процедура УстановитьСклоненияПараметровПрописи() + + Если ПолеПрописи4наРусском = "Женский" Тогда + Элементы.ПолеПрописи1наРусском.Заголовок = "одна"; + Элементы.ПолеПрописи2наРусском.Заголовок = "две"; + ИначеЕсли ПолеПрописи4наРусском = "Мужской" Тогда + Элементы.ПолеПрописи1наРусском.Заголовок = "один"; + Элементы.ПолеПрописи2наРусском.Заголовок = "два"; + Иначе + Элементы.ПолеПрописи1наРусском.Заголовок = "одно"; + Элементы.ПолеПрописи2наРусском.Заголовок = "два"; + КонецЕсли; + + Если ПолеПрописи8наРусском = "Женский" Тогда + Элементы.ПолеПрописи5наРусском.Заголовок = "одна"; + Элементы.ПолеПрописи6наРусском.Заголовок = "две"; + ИначеЕсли ПолеПрописи8наРусском = "Мужской" Тогда + Элементы.ПолеПрописи5наРусском.Заголовок = "один"; + Элементы.ПолеПрописи6наРусском.Заголовок = "два"; + Иначе + Элементы.ПолеПрописи5наРусском.Заголовок = "одно"; + Элементы.ПолеПрописи6наРусском.Заголовок = "два"; + КонецЕсли; + +КонецПроцедуры + +// Подготавливает список выбора для подчиненной валюты таким образом, +// что бы в список не попала сама подчиненная валюта +// +&НаСервереБезКонтекста +Процедура ПодготовитьДанныеВыбораПодчиненнойВалюты(ДанныеВыбора, Ссылка) + + ДанныеВыбора = Новый СписокЗначений; + + Запрос = Новый Запрос; + + Запрос.Текст = "ВЫБРАТЬ Ссылка, НаименованиеПолное + |ИЗ + | Справочник.Валюты + |ГДЕ + | Ссылка <> &Ссылка + |И + | ПодчиненныйКурсОт = Значение(Справочник.Валюты.ПустаяСсылка) + |УПОРЯДОЧИТЬ ПО НаименованиеПолное"; + + Запрос.Параметры.Вставить("Ссылка", Ссылка); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.НаименованиеПолное); + КонецЦикла; + +КонецПроцедуры + +// Вспомогательные функции управлением вводом + +&НаКлиенте +Функция АвтоПодборПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка) + + Для Каждого ЭлементВыбора Из Элемент.СписокВыбора Цикл + Если ВРег(Текст) = ВРег(Лев(ЭлементВыбора.Представление, СтрДлина(Текст))) Тогда + Результат = Новый СписокЗначений; + Результат.Добавить(ЭлементВыбора.Значение, ЭлементВыбора.Представление); + СтандартнаяОбработка = Ложь; + Возврат Результат; + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +&НаКлиенте +Функция ОкончаниеВводаТекстаПоСпискуВыбора(Элемент, Текст, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Для Каждого ЭлементВыбора Из Элемент.СписокВыбора Цикл + Если ВРег(Текст) = ВРег(ЭлементВыбора.Представление) Тогда + СтандартнаяОбработка = Истина; + ИначеЕсли ВРег(Текст) = ВРег(Лев(ЭлементВыбора.Представление, СтрДлина(Текст))) Тогда + СтандартнаяОбработка = Ложь; + Результат = Новый СписокЗначений; + Результат.Добавить(ЭлементВыбора.Значение, ЭлементВыбора.Представление); + Возврат Результат; + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; + +КонецФункции diff --git a/SSL/src/Catalogs/Валюты/ManagerModule.bsl b/SSL/src/Catalogs/Валюты/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Catalogs/Валюты/ObjectModule.bsl b/SSL/src/Catalogs/Валюты/ObjectModule.bsl new file mode 100644 index 000000000..0be9a4f97 --- /dev/null +++ b/SSL/src/Catalogs/Валюты/ObjectModule.bsl @@ -0,0 +1,37 @@ + +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + + Если ВалютаЗагружается И ЗначениеЗаполнено(ПодчиненныйКурсОт) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Валюта не может быть зависимой и при этом загружаться с сайта РБК'")); + Возврат; + КонецЕсли; + +КонецПроцедуры + +Процедура ПриЗаписи(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если ЗначениеЗаполнено(ПодчиненныйКурсОт.ПодчиненныйКурсОт) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Ошибка при записи: основная валюта не может быть зависимой'"),,,,Отказ); + КонецЕсли; + + Если РаботаСКурсамиВалют.ПолучитьСписокЗависимыхВалют(Ссылка).Количество() > 0 + И ЗначениеЗаполнено(ПодчиненныйКурсОт) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Ошибка при записи: валюта не может быть подчиненной, так как она является основной для других валют'"),,,,Отказ); + КонецЕсли; + + Если Отказ Тогда + Возврат; + КонецЕсли; + + РаботаСКурсамиВалют.ПроверитьКорректностьКурсаНа01_01_1980(Ссылка); + + Если ЗначениеЗаполнено(ПодчиненныйКурсОт) Тогда + РаботаСКурсамиВалют.ЗаписатьСведенияДляПодчиненногоРегистра(ПодчиненныйКурсОт, Ссылка); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt b/SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt new file mode 100644 index 000000000..2ece26f3c --- /dev/null +++ b/SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SSL/src/Catalogs/Валюты/Валюты.mdo b/SSL/src/Catalogs/Валюты/Валюты.mdo new file mode 100644 index 000000000..b09de93df --- /dev/null +++ b/SSL/src/Catalogs/Валюты/Валюты.mdo @@ -0,0 +1,287 @@ + + + + + + + + + + Валюты + + ru + Валюты + + true + Catalog.Валюты.StandardAttribute.Description + Catalog.Валюты.StandardAttribute.Code + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ru + Код символьный + + + ru + Символьный код валюты по общероссийскому классификатору валют + + + ShowError + Use + + + + + Use + Code + + ru + Код числовой + + + ru + Числовой код валюты по общероссийскому классификатору валют + + + + + ShowError + Use + + + + DontUse + Managed + Use + + ru + Валюта + + + ru + Валюты, используемые при расчетах + + 2 + true + 3 + 10 + String + Variable + true + AsDescription + InDialog + true + BothWays + Catalog.Валюты.Form.ФормаЭлемента + Catalog.Валюты.Form.ФормаСписка + + НаименованиеПолное + + ru + Наименование валюты + + + String + + 50 + + + + + ShowError + + Use + Use + + + ПараметрыПрописиНаРусском + + ru + Параметры прописи на русском + + + String + + + + ru + Параметры прописи валюты на русском языке + + + + + Use + Use + + + ПодчиненныйКурсОт + + ru + Основная валюта + + + CatalogRef.Валюты + + + ru + Валюта, на основании курса которой рассчитывается курс текущей валюты + + + + DontUse + Use + + Catalog.Валюты.EmptyRef + + Index + Use + Use + + + КоэффициентПодчиненногоКурса + + ru + Коэффициент подчиненного курса + + + Number + + 10 + 2 + + + + ru + Коэффициент пересчета курса базовой валюты в текущий + + + + Use + DontUse + + 0 + + Use + Use + + + ВалютаЗагружается + + ru + Загружается с сайта РБК + + + Boolean + + + ru + Курс валюты загружается с сайта РБК + + + + + Use + Use + + + ФормаСписка + + ru + Форма списка + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + + ФормаПодбораВалютИзОКВ + + ru + Общероссийский классификатор валют + + PersonalComputer + MobileDevice + + + ОбщероссийскийКлассификаторВалют + + ru + Общероссийский классификатор валют + + TextDocument + + diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Form.form new file mode 100644 index 000000000..9197d8387 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Form.form @@ -0,0 +1,267 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 4 + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Код + 6 + true + true + + true + + + Список.Code + + + КодРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 9 + + СписокСтрокаПоискаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 10 + true + + Список + + true + + + + СписокСостояниеПросмотра + 12 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 13 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 15 + + СписокУправлениеПоискомРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 16 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + true + MultiRow +
true
+ 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 + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.ВариантыОтветовАнкет + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Module.bsl new file mode 100644 index 000000000..eeddfdcfe --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Module.bsl @@ -0,0 +1,7 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Анкетирование.УстановитьПараметрыОтбораФормуВыбора(Параметры,Список.Отбор); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..fccff4dfc --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Form.form @@ -0,0 +1,302 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 4 + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Код + 6 + true + true + + true + + + Список.Code + + + КодРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Владелец + 8 + true + true + + true + + + Список.Owner + + + ВладелецРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ВладелецКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 11 + + СписокСтрокаПоискаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 12 + true + + Список + + true + + + + СписокСостояниеПросмотра + 14 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 15 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 17 + + СписокУправлениеПоискомРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 18 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
true
+ 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 + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.ВариантыОтветовАнкет + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..aa43a9954 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,11 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если НЕ ЗначениеЗаполнено(ВнешниеПользователи.ТекущийВнешнийПользователь()) Тогда + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..dee145869 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,187 @@ + + + + КодОткрытыйОтвет + 7 + + Код + 1 + true + true + + true + + + Объект.Code + + + КодРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 2 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТребуетОткрытогоОтвета + 5 + true + true + + true + + + Объект.ТребуетОткрытогоОтвета + + + ТребуетОткрытогоОтветаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ТребуетОткрытогоОтветаКонтекстноеМеню + 6 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + КодОткрытыйОтветРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Наименование + 3 + true + true + + true + + + Объект.Description + + true + + НаименованиеРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ВариантыОтветовАнкет + + + true + + + true + +
true
+ true +
+ + + + + +
diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..f564cb0e0 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,22 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("Владелец") Тогда + Если ТипЗнч(Параметры.Владелец) = Тип("ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования") Тогда + Если НЕ Параметры.Владелец.Пустая() Тогда + + Объект.Владелец = Параметры.Владелец; + + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если Параметры.Свойство("ТипОтвета") Тогда + Элементы.ТребуетОткрытогоОтвета.Видимость = (Параметры.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз); + Иначе + Элементы.ТребуетОткрытогоОтвета.Видимость = (Объект.Владелец.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз); + КонецЕсли; + +КонецПроцедуры + \ No newline at end of file diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/ObjectModule.bsl b/SSL/src/Catalogs/ВариантыОтветовАнкет/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/ВариантыОтветовАнкет.mdo b/SSL/src/Catalogs/ВариантыОтветовАнкет/ВариантыОтветовАнкет.mdo new file mode 100644 index 000000000..17d78f9b7 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/ВариантыОтветовАнкет.mdo @@ -0,0 +1,182 @@ + + + + + + + + + + ВариантыОтветовАнкет + + ru + Варианты ответов анкет + + true + Catalog.ВариантыОтветовАнкет.StandardAttribute.Description + Catalog.ВариантыОтветовАнкет.StandardAttribute.Code + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + + ru + Вопрос + + true + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.EmptyRef + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + Managed + Use + 2 + true + ChartOfCharacteristicTypes.ВопросыДляАнкетирования + 9 + 150 + String + Variable + WithinOwnerSubordination + true + true + AsDescription + InDialog + BothWays + Catalog.ВариантыОтветовАнкет.Form.ФормаЭлемента + Catalog.ВариантыОтветовАнкет.Form.ФормаСписка + Catalog.ВариантыОтветовАнкет.Form.ФормаВыбора + + ТребуетОткрытогоОтвета + + ru + Требует открытого ответа + + + Boolean + + + + + Use + Use + + + РеквизитДопУпорядочивания + + ru + Порядок + + + Number + + 5 + + + + + + 0 + + IndexWithAdditionalOrder + Use + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + + ФормаВыбора + + ru + Форма выбора + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/НастройкаГруппировкиПоРазделам/ConditionalAppearance.dcssca b/SSL/src/Catalogs/ВариантыОтчетов/Forms/НастройкаГруппировкиПоРазделам/ConditionalAppearance.dcssca new file mode 100644 index 000000000..557cea106 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/НастройкаГруппировкиПоРазделам/ConditionalAppearance.dcssca @@ -0,0 +1,80 @@ + + + + false + + + ДеревоПодсистемНазвание + + + + + ДеревоПодсистем.Отчет + NotFilled + + + + + false + Шрифт + + + + + + + + ДеревоПодсистемНазвание + + + + + ДеревоПодсистем.Отчет + Filled + + + ДеревоПодсистем.Предопредленная + Equal + true + + + + + ЦветТекста + #8371FF + + + Шрифт + + + + + + + + ДеревоПодсистемНазвание + + + + + ДеревоПодсистем.Отчет + Filled + + + ДеревоПодсистем.Предопредленная + Equal + false + + + + + ЦветТекста + #0000FF + + + Шрифт + + + + + diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/НастройкаГруппировкиПоРазделам/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/НастройкаГруппировкиПоРазделам/Form.form new file mode 100644 index 000000000..74f7847ef --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/НастройкаГруппировкиПоРазделам/Form.form @@ -0,0 +1,648 @@ + + + + <key>ru</key> + <value>Настройка группировки по разделам</value> + + + ДеревоПодсистем + 2 + true + true + + true + + + ДеревоПодсистем + + None + Add + Change + Copy + CopyToClipboard + EndEdit + HierarchicalList + List + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + Tree + + ДеревоПодсистемНазвание + 7 + true + true + + true + + + ДеревоПодсистем.Представление + + + ДеревоПодсистемНазваниеРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ДеревоПодсистемНазваниеКонтекстноеМеню + 8 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДеревоПодсистемКоманднаяПанель + 4 + + ФормаСкопироватьВариант + 14 + true + true + + true + + + ФормаСкопироватьВариантРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.Command.СкопироватьВариант + Normal + Auto + true + true + UserCmds + Auto + + + ДеревоПодсистемПереместитьВариант + 12 + true + true + + true + + + ДеревоПодсистемПереместитьВариантРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Form.Command.ПереместитьВариант + Normal + Auto + true + true + UserCmds + Auto + + + Удалить + 16 + + <key>ru</key> + <value>Удалить вариант</value> + + true + true + + true + + + УдалитьРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.Item.ДеревоПодсистем.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + Left + + + DragCheck + ДеревоКомандныйИнтерфейсПроверкаПеретаскивания + + + Drag + ДеревоКомандныйИнтерфейсПеретаскивание + + + ДеревоПодсистемСтрокаПоиска + 23 + + ДеревоПодсистемСтрокаПоискаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ДеревоПодсистемСтрокаПоискаКонтекстноеМеню + 24 + true + + ДеревоПодсистем + + true + + + + ДеревоПодсистемСостояниеПросмотра + 26 + + ДеревоПодсистемСостояниеПросмотраРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ДеревоПодсистемСостояниеПросмотраКонтекстноеМеню + 27 + true + + ViewStatusAddition + ДеревоПодсистем + + true + + + + ДеревоПодсистемУправлениеПоиском + 29 + + ДеревоПодсистемУправлениеПоискомРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + ДеревоПодсистемУправлениеПоискомКонтекстноеМеню + 30 + true + + SearchControlAddition + ДеревоПодсистем + + true + + + + ДеревоПодсистемРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ДеревоПодсистемКонтекстноеМеню + 3 + + Tree + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + ExpandAllLevels + true + true + true + true + None + None + None + true + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаПрименитьКомандыйИнтерфейс + 1 + true + true + + true + + + ФормаПрименитьКомандыйИнтерфейсРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.Command.ПрименитьКомандыйИнтерфейс + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 13 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ДеревоПодсистем + + <key>ru</key> + <value>Дерево подсистем</value> + + 1 + + ValueTree + + + true + + + true + + + Путь + + <key>ru</key> + <value>Путь</value> + + 1 + + String + + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Представление</value> + + 2 + + String + + + + true + + + true + + + + Предопредленная + + <key>ru</key> + <value>Предопредленная</value> + + 3 + + Boolean + + + true + + + true + + + + Использование + + <key>ru</key> + <value>Использование</value> + + 4 + + Boolean + + + true + + + true + + + + Вариант + + <key>ru</key> + <value>Вариант</value> + + 5 + + CatalogRef.ВариантыОтчетов + + + 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> + + 2 + + ValueTable + + + true + + + true + + + Путь + + <key>ru</key> + <value>Путь</value> + + 1 + + String + + + + true + + + true + + + + ИдентификаторСтроки + + <key>ru</key> + <value>Идентификатор строки</value> + + 2 + + Number + + 10 + + + + true + + + true + + + + + ПрименитьКомандыйИнтерфейс + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + Применить командый интерфейс + + + true + + + + ПрименитьКомандыйИнтерфейс + + + Auto + Auto + + + ПереместитьВариант + + <key>ru</key> + <value>Переместить вариант</value> + + 2 + + ru + Переместить вариант + + + true + + + StdPicture.MoveItem + + + + ПреместитьВариант + + + Auto + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 3 + + ru + Отмена + + + true + + + + Отмена + + + Auto + Auto + + + СкопироватьВариант + + <key>ru</key> + <value>Добавить вариант</value> + + 4 + + ru + Добавить вариант + + + true + + + StdPicture.CreateListItem + + + + СкопироватьВариант + + + Auto + Auto + + + + + + diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/НастройкаГруппировкиПоРазделам/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/НастройкаГруппировкиПоРазделам/Module.bsl new file mode 100644 index 000000000..13785f1ba --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/НастройкаГруппировкиПоРазделам/Module.bsl @@ -0,0 +1,298 @@ + +&НаКлиенте +Процедура ПрименитьКомандыйИнтерфейс(Команда) + + ПрименитьНастройки(); + Закрыть(); + +КонецПроцедуры + +&НаСервере +Процедура ПрименитьНастройки() + + //список вариантов + СписокВариантов = Новый ТаблицаЗначений; + + СписокВариантов.Колонки.Добавить("Вариант"); + СписокВариантов.Колонки.Добавить("Путь"); + СписокВариантов.Колонки.Добавить("ПутьПредставление"); + + + Для каждого СтрокаВарианта из ДеревоПодсистем.ПолучитьЭлементы() Цикл + Если НЕ СтрокаВарианта.Вариант.Пустая() и НЕ СтрокаВарианта.Предопредленная тогда + СтркаВарианта = СписокВариантов.Добавить(); + СтркаВарианта.Вариант = СтрокаВарианта.Вариант; + СтркаВарианта.Путь = СтрокаВарианта.Путь; + СтркаВарианта.ПутьПредставление = СтрокаВарианта.ПолучитьРодителя().Представление; + Иначе + СкопироватьПодчиенныеВарианты(СтрокаВарианта, СписокВариантов); + КонецЕсли; + + КонецЦикла; + + СписокВариантовБезПодсистем = СписокВариантов.Скопировать(); + СписокВариантовБезПодсистем.Свернуть("Вариант"); + + НачатьТранзакцию(); + + Для каждого СтрокаВарианта из СписокВариантовБезПодсистем Цикл + + ОбъектВарианта = СтрокаВарианта.Вариант.ПолучитьОбъект(); + + МассивСтрокДляУдаления = Новый Массив; + + // удалим подсистемы + Для каждого СтрокаПодсиситемы из ОбъектВарианта.Подсистемы Цикл + Если НЕ СтрокаПодсиситемы.Предопределенная тогда + МассивСтрокДляУдаления.Добавить(СтрокаПодсиситемы); + КонецЕсли; + КонецЦикла; + + Для каждого СтрокаПодсиситемы из МассивСтрокДляУдаления Цикл + ОбъектВарианта.Подсистемы.Удалить(СтрокаПодсиситемы) + КонецЦикла; + + // формирование строк подсистемы + МассивСтрокДляДобавления = СписокВариантов.НайтиСтроки(Новый Структура("Вариант", СтрокаВарианта.Вариант)); + + Для каждого СтрокаПодсистемы из МассивСтрокДляДобавления Цикл + НоваяСтрокаПодсистемы = ОбъектВарианта.Подсистемы.Добавить(); + НоваяСтрокаПодсистемы.Подсистема = СтрокаПодсистемы.Путь; + НоваяСтрокаПодсистемы.Название = СтрокаПодсистемы.ПутьПредставление + КонецЦикла; + ОбъектВарианта.ЗАписать(); + КонецЦикла; + + ЗафиксироватьТранзакцию(); + +КонецПроцедуры + +&НаСервере +Процедура СкопироватьПодчиенныеВарианты(СтрокаВарианта, СписокВариантов) + + Для каждого СтрокаВариантаПодчиненная из СтрокаВарианта.ПолучитьЭлементы() Цикл + Если НЕ СтрокаВариантаПодчиненная.Вариант.Пустая() И НЕ СтрокаВариантаПодчиненная.Предопредленная тогда + СтркаВарианта = СписокВариантов.Добавить(); + СтркаВарианта.Вариант = СтрокаВариантаПодчиненная.Вариант; + СтркаВарианта.Путь = СтрокаВариантаПодчиненная.Путь; + СтркаВарианта.ПутьПредставление = СтрокаВариантаПодчиненная.ПолучитьРодителя().Представление; + Иначе + СкопироватьПодчиенныеВарианты(СтрокаВариантаПодчиненная, СписокВариантов); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗагузитьСтруктураПодсистем(); + + // заполним вариантами группировки + + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетовПодсистемы.Подсистема, + | ВариантыОтчетовПодсистемы.Ссылка, + | ВариантыОтчетовПодсистемы.Ссылка.Наименование КАК Представление, + | ВариантыОтчетовПодсистемы.Ссылка.КлючВарианта, + | ВариантыОтчетовПодсистемы.Ссылка.КлючОбъекта КАК Отчет, + | ВариантыОтчетовПодсистемы.Предопределенная + |ИЗ + | Справочник.ВариантыОтчетов.Подсистемы КАК ВариантыОтчетовПодсистемы + |ГДЕ + | (НЕ ВариантыОтчетовПодсистемы.Ссылка.ПометкаУдаления)"; + + Запрос = Новый Запрос(ТЗ); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + МассивСтрок = СоответсвиеПодсистемИСтрок.НайтиСтроки(Новый Структура("Путь", Выборка.Подсистема)); + Если МассивСтрок.Количество() > 0 тогда + СтрокаПодсистемы = ДеревоПодсистем.НайтиПоИдентификатору(МассивСтрок[0].ИдентификаторСтроки); + Иначе + Продолжить;; + КонецЕсли; + + Если СтрокаПодсистемы = Неопределено тогда + Продолжить; + КонецЕсли; + СтрокаВарианта = СтрокаПодсистемы.ПолучитьЭлементы().Добавить(); + + СтрокаВарианта.Путь = СтрокаПодсистемы.Путь; + СтрокаВарианта.Представление = Выборка.Представление; + СтрокаВарианта.Вариант = Выборка.Ссылка; + СтрокаВарианта.Ключ = Выборка.КлючВарианта; + СтрокаВарианта.Отчет = Выборка.Отчет; + СтрокаВарианта.Предопредленная = Выборка.Предопределенная; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ЗагузитьСтруктураПодсистем() + + ДеревоПодсистемДляКопирования = Новый ДеревоЗначений; + ДеревоПодсистемДляКопирования.Колонки.Добавить("Подсистема"); + ДеревоПодсистемДляКопирования.Колонки.Добавить("Название"); + + СписокПодсистем = Новый СписокЗначений; + СписокПодсистем.Добавить(""); + + // Сделаем список отчетов + СписокПодсистем = ВариантыОтчетов.ПолучитьСписокПодсистем(СписокПодсистем, ДеревоПодсистемДляКопирования); + + СтрокаКонфигурации = ДеревоПодсистем.ПолучитьЭлементы().Добавить(); + СтрокаКонфигурации.Путь = ""; + СтрокаКонфигурации.Представление = "Конфигурация"; + СтрокаКонфигурации.Предопредленная = истина; + + СкопироватьДеревоЗначений(СтрокаКонфигурации.ПолучитьЭлементы(), ДеревоПодсистемДляКопирования.Строки, СоответсвиеПодсистемИСтрок); + +КонецПроцедуры + +&НаСервере +Процедура СкопироватьДеревоЗначений(КолекцияПриемник, КолекцияИсточник, СоответсвиеПодсистемИСтрок) + + Для каждого Элемент из КолекцияИсточник Цикл + СтрокаЗначение = КолекцияПриемник.Добавить(); + СтрокаЗначение.Путь = Элемент.Подсистема; + СтрокаЗначение.Представление = Элемент.Название; + СтрокаЗначение.Предопредленная = Метаданные.НайтиПоПолномуИмени("Подсистема." + СтрЗаменить(Элемент.Подсистема, "\", ".Подсистема.")) <> Неопределено; + СтрокаВарианта = СоответсвиеПодсистемИСтрок.Добавить(); + СтрокаВарианта.Путь = СтрокаЗначение.Путь; + СтрокаВарианта.ИдентификаторСтроки = СтрокаЗначение.ПолучитьИдентификатор(); + СкопироватьДеревоЗначений(СтрокаЗначение.ПолучитьЭлементы(), Элемент.Строки, СоответсвиеПодсистемИСтрок); + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ДеревоКомандныйИнтерфейсПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + + СтандартнаяОбработка = ложь; + + Если ТипЗнч(ПараметрыПеретаскивания.Значение) <> Тип("Массив") тогда + ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; + Возврат; + КонецЕсли; + + СтрокаВставки = ДеревоПодсистем.НайтиПоИдентификатору(Строка); + ПеретаскиваемыеДанные = Неопределено; + Если ПараметрыПеретаскивания.Значение.Количество() > 0 тогда + ИндексСтроки = ПараметрыПеретаскивания.Значение[0]; + ПеретаскиваемыеДанные = ДеревоПодсистем.НайтиПоИдентификатору(ИндексСтроки); + КонецЕсли; + + + Если НЕ ((СтрокаВставки <> Неопределено и СтрокаВставки.Отчет = "") + и (ПеретаскиваемыеДанные <> Неопределено и ПеретаскиваемыеДанные.Отчет <> "")) тогда + ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; + КонецЕсли; + + Если ПеретаскиваемыеДанные <> Неопределено и ПеретаскиваемыеДанные.Предопредленная + и ПараметрыПеретаскивания.Действие <> ДействиеПеретаскивания.Копирование тогда + ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ДеревоКомандныйИнтерфейсПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + + Если ТипЗнч(ПараметрыПеретаскивания.Значение) <> Тип("Массив") тогда + СтандартнаяОбработка = ложь; + Возврат; + КонецЕсли; + + ПеретаскиваемыеДанные = Неопределено; + Если ПараметрыПеретаскивания.Значение.Количество() > 0 тогда + ИндексСтроки = ПараметрыПеретаскивания.Значение[0]; + ПеретаскиваемыеДанные = ДеревоПодсистем.НайтиПоИдентификатору(ИндексСтроки); + КонецЕсли; + СтандартнаяОбработка = ложь; + СтрокаВставки = ДеревоПодсистем.НайтиПоИдентификатору(Строка); + ПутьПодсистемы = СтрокаВставки.Путь; + + // опредлим формирование отчетности + СтрокаВарианта = Неопределено; + Для каждого СтркаВарианта из СтрокаВставки.ПолучитьЭлементы() Цикл + Если СтркаВарианта.Ключ = ПеретаскиваемыеДанные.Ключ + И СтркаВарианта.Отчет = ПеретаскиваемыеДанные.Отчет + И ПутьПодсистемы = ПеретаскиваемыеДанные.ПолучитьРодителя().Путь тогда + СтрокаВарианта = СтркаВарианта; + Прервать; + КонецЕсли; + КонецЦикла; + + Если СтрокаВарианта <> Неопределено тогда + Возврат; + КонецЕсли; + + Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование тогда + НоваяСтрока = СтрокаВставки.ПолучитьЭлементы().Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ПеретаскиваемыеДанные); + НоваяСтрока.Путь = ПутьПодсистемы; + НоваяСтрока.Предопредленная = ложь; + ИначеЕсли ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Перемещение тогда + + НоваяСтрока = СтрокаВставки.ПолучитьЭлементы().Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ПеретаскиваемыеДанные); + НоваяСтрока.Путь = ПутьПодсистемы; + НоваяСтрока.Предопредленная = ложь; + РодительСтроки = ПеретаскиваемыеДанные.ПолучитьРодителя(); + РодительСтроки.ПолучитьЭлементы().Удалить(ПеретаскиваемыеДанные); + + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПреместитьВариант(Команда) + + Результат = ОткрытьФормуМодально("Справочник.ВариантыОтчетов.Форма.ПереместитьВариантВРаздел", , ЭтаФорма); + Если Результат <> Неопределено тогда + МассивСтрок = СоответсвиеПодсистемИСтрок.НайтиСтроки(Новый Структура("Путь", Результат)); + Если МассивСтрок.Количество() > 0 тогда + СтрокаПодсистемы = ДеревоПодсистем.НайтиПоИдентификатору(МассивСтрок[0].ИдентификаторСтроки); + Иначе + Возврат; + КонецЕсли; + ПеретаскиваемыеДанные = Элементы.ДеревоПодсистем.ТекущиеДанные; + НоваяСтрока = СтрокаПодсистемы.ПолучитьЭлементы().Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ПеретаскиваемыеДанные); + НоваяСтрока.Путь = Результат; + + РодительСтроки = ПеретаскиваемыеДанные.ПолучитьРодителя(); + РодительСтроки.ПолучитьЭлементы().Удалить(ПеретаскиваемыеДанные); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Отмена(Команда) + Закрыть(); +КонецПроцедуры + +&НаКлиенте +Процедура СкопироватьВариант(Команда) + + Результат = ОткрытьФормуМодально("Справочник.ВариантыОтчетов.Форма.СкопироватьВариантВРаздел", , ЭтаФорма); + Если Результат <> Неопределено тогда + МассивСтрок = СоответсвиеПодсистемИСтрок.НайтиСтроки(Новый Структура("Путь", Результат.Путь)); + Если МассивСтрок.Количество() > 0 тогда + СтрокаПодсистемы = ДеревоПодсистем.НайтиПоИдентификатору(МассивСтрок[0].ИдентификаторСтроки); + Иначе + Возврат; + КонецЕсли; + НоваяСтрока = СтрокаПодсистемы.ПолучитьЭлементы().Добавить(); + НоваяСтрока.Путь = Результат.Путь; + НоваяСтрока.Отчет = Результат.Отчет; + НоваяСтрока.Ключ = Результат.Вариант; + НоваяСтрока.Вариант = Результат.Ссылка; + НоваяСтрока.Представление = Результат.ПредставлениеВарианта; + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ПереместитьВариантВРаздел/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ПереместитьВариантВРаздел/Form.form new file mode 100644 index 000000000..c7ca75f33 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ПереместитьВариантВРаздел/Form.form @@ -0,0 +1,466 @@ + + + + <key>ru</key> + <value>Переместить вариант в раздел</value> + + + ДеревоПодсистем + 1 + true + true + + true + + + ДеревоПодсистем + + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + HierarchicalList + List + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + Tree + + ДеревоПодсистемПредставление + 4 + + <key>ru</key> + <value>Раздел</value> + + true + true + + true + + + ДеревоПодсистем.Представление + + + ДеревоПодсистемПредставлениеРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ДеревоПодсистемПредставлениеКонтекстноеМеню + 5 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + Bottom + + ДеревоПодсистемКоманднаяПанель + 3 + + ДеревоПодсистемОК + 6 + true + true + + true + + + ДеревоПодсистемОКРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ДеревоПодсистемОтмена + 7 + true + true + + true + + + ДеревоПодсистемОтменаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + Right + + + Selection + ДеревоПодсистемВыбор + + + ДеревоПодсистемСтрокаПоиска + 11 + + ДеревоПодсистемСтрокаПоискаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ДеревоПодсистемСтрокаПоискаКонтекстноеМеню + 12 + true + + ДеревоПодсистем + + true + + + + ДеревоПодсистемСостояниеПросмотра + 14 + + ДеревоПодсистемСостояниеПросмотраРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ДеревоПодсистемСостояниеПросмотраКонтекстноеМеню + 15 + true + + ViewStatusAddition + ДеревоПодсистем + + true + + + + ДеревоПодсистемУправлениеПоиском + 17 + + ДеревоПодсистемУправлениеПоискомРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ДеревоПодсистемУправлениеПоискомКонтекстноеМеню + 18 + true + + SearchControlAddition + ДеревоПодсистем + + true + + + + ДеревоПодсистемРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + ДеревоПодсистемКонтекстноеМеню + 2 + true + + Tree + true + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + ExpandAllLevels + true + true + true + true + None + None + None + true + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ДеревоПодсистем + + <key>ru</key> + <value>Дерево подсистем</value> + + 2 + + ValueTree + + + 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 + + Boolean + + + true + + + true + + + + Использование + + <key>ru</key> + <value>Использование</value> + + 4 + + Boolean + + + true + + + true + + + + Вариант + + <key>ru</key> + <value>Вариант</value> + + 5 + + CatalogRef.ВариантыОтчетов + + + 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> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + 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..b39e2df1e --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ПереместитьВариантВРаздел/Module.bsl @@ -0,0 +1,78 @@ + +&НаКлиенте +Процедура ДеревоПодсистемВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + Если Элементы.ДеревоПодсистем.ТекущиеДанные = Неопределено тогда + Предупреждение("Не выбран раздел отчета"); + Возврат; + КонецЕсли; + + Путь = Элементы.ДеревоПодсистем.ТекущиеДанные.Путь; + Закрыть(Путь); +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗагузитьСтруктураПодсистем(); + +КонецПроцедуры + +&НаСервере +Процедура ЗагузитьСтруктураПодсистем() + + ДеревоПодсистемДляКопирования = Новый ДеревоЗначений; + ДеревоПодсистемДляКопирования.Колонки.Добавить("Подсистема"); + ДеревоПодсистемДляКопирования.Колонки.Добавить("Название"); + + СписокПодсистем = Новый СписокЗначений; + СписокПодсистем.Добавить(""); + + // Сделаем список отчетов + СписокПодсистем = ВариантыОтчетов.ПолучитьСписокПодсистем(СписокПодсистем, ДеревоПодсистемДляКопирования); + + СтрокаКонфигурации = ДеревоПодсистем.ПолучитьЭлементы().Добавить(); + СтрокаКонфигурации.Путь = ""; + СтрокаКонфигурации.Представление = "Конфигурация"; + СтрокаКонфигурации.Предопредленная = истина; + + СоответсвиеПодсистемИСтрок = Новый Соответствие; + + СкопироватьДеревоЗначений(СтрокаКонфигурации.ПолучитьЭлементы(), ДеревоПодсистемДляКопирования.Строки, СоответсвиеПодсистемИСтрок); + +КонецПроцедуры + +&НаСервере +Процедура СкопироватьДеревоЗначений(КолекцияПриемник, КолекцияИсточник, СоответсвиеПодсистемИСтрок) + + Для каждого Элемент из КолекцияИсточник Цикл + СтрокаЗначение = КолекцияПриемник.Добавить(); + СтрокаЗначение.Путь = Элемент.Подсистема; + СтрокаЗначение.Представление = Элемент.Название; + СтрокаЗначение.Предопредленная = Метаданные.НайтиПоПолномуИмени("Подсистема." + СтрЗаменить(Элемент.Подсистема, "\", ".Подсистема.")) <> Неопределено; + СоответсвиеПодсистемИСтрок.Вставить(СтрокаЗначение.Путь, СтрокаЗначение); + СкопироватьДеревоЗначений(СтрокаЗначение.ПолучитьЭлементы(), Элемент.Строки, СоответсвиеПодсистемИСтрок); + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + + Если Элементы.ДеревоПодсистем.ТекущиеДанные = Неопределено тогда + Предупреждение("Не выбран раздел отчета"); + Возврат; + КонецЕсли; + + Путь = Элементы.ДеревоПодсистем.ТекущиеДанные.Путь; + Закрыть(Путь); + +КонецПроцедуры + +&НаКлиенте +Процедура Отмена(Команда) + + Закрыть(); + +КонецПроцедуры + + diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеВидимости/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеВидимости/Form.form new file mode 100644 index 000000000..d76aec3d3 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеВидимости/Form.form @@ -0,0 +1,610 @@ + + + + <key>ru</key> + <value>Настройка быстрого доступа</value> + + + ДоступностьРоли + 1 + true + true + + true + + + ДоступностьПользователей + + None + + ДоступностьРолиГруппаКолонок + 10 + + ДоступностьРолиВидимость + 6 + true + true + + true + + + ДоступностьПользователей.Видимость + + + ДоступностьРолиВидимостьРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ДоступностьРолиВидимостьКонтекстноеМеню + 7 + true + + CheckBoxField + Auto + true + Left + true + + + + ДоступностьРолиПредставлениеРоли + 11 + true + true + + true + + + ДоступностьПользователей.Пользователь + + + ДоступностьРолиПредставлениеРолиРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + ДоступностьРолиПредставлениеРолиКонтекстноеМеню + 12 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Роль</value> + + + ru + Роль + + true + + ДоступностьРолиГруппаКолонокРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + Top + + ДоступностьРолиКоманднаяПанель + 3 + + ДоступностьРолиОтметитьВсе + 19 + true + true + + true + + + ДоступностьРолиОтметитьВсеРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + Form.Command.ОтметитьВсе + Normal + Auto + true + true + UserCmds + Auto + + + ДоступностьРолиСнятьОтметки + 20 + true + true + + true + + + ДоступностьРолиСнятьОтметкиРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Form.Command.СнятьОтметки + Normal + Auto + true + true + UserCmds + Auto + + Left + + + ДоступностьРолиСтрокаПоиска + 25 + + ДоступностьРолиСтрокаПоискаРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + ДоступностьРолиСтрокаПоискаКонтекстноеМеню + 26 + true + + ДоступностьРоли + + true + + + + ДоступностьРолиСостояниеПросмотра + 28 + + ДоступностьРолиСостояниеПросмотраРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ДоступностьРолиСостояниеПросмотраКонтекстноеМеню + 29 + true + + ViewStatusAddition + ДоступностьРоли + + true + + + + ДоступностьРолиУправлениеПоиском + 31 + + ДоступностьРолиУправлениеПоискомРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + ДоступностьРолиУправлениеПоискомКонтекстноеМеню + 32 + true + + SearchControlAddition + ДоступностьРоли + + true + + + + ДоступностьРолиРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ДоступностьРолиКонтекстноеМеню + 2 + true + + Tree + true + true + true + 15 + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + ExpandAllLevels + true + true + true + true + None + None + None + true + + + + Видимость + 8 + + <key>ru</key> + <value>Быстрый доступ к отчету для новых пользователей</value> + + true + true + + true + + + Видимость + + Right + + ВидимостьРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ВидимостьКонтекстноеМеню + 9 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаКоманднаяПанель + 21 + + Принять + 16 + + <key>ru</key> + <value>ОК</value> + + true + true + + true + + + ПринятьРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + Form.Command.Принять + Auto + true + true + true + UserCmds + Auto + + + Закрыть + 17 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + + ЗакрытьРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа командная панель</value> + + + ru + Группа командная панель + + + ГруппаКоманднаяПанельРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + 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 + + ValueTable + + + true + + + true + + + Пользователь + + <key>ru</key> + <value>Пользователь</value> + + 1 + + CatalogRef.Пользователи + + + true + + + true + + + + Видимость + + <key>ru</key> + <value>Видимость</value> + + 2 + + Boolean + + + true + + + true + + + + + Принять + + <key>ru</key> + <value>Принять</value> + + 1 + + true + + + + Принять + + + Auto + Auto + + + ОтметитьВсе + + <key>ru</key> + <value>Отметить все</value> + + 2 + + ru + Отметить все + + + true + + + StdPicture.CheckAll + + + + ОтметитьВсе + + + Picture + Auto + Auto + + + СнятьОтметки + + <key>ru</key> + <value>Снять отметки</value> + + 3 + + ru + Снять отметки + + + true + + + StdPicture.UncheckAll + + + + СнятьОтметки + + + Picture + Auto + Auto + + + Пользователи + + ValueList + + + + Видимость + + Boolean + + + + Варинат + + CatalogRef.ВариантыОтчетов + + + + + + + diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеВидимости/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеВидимости/Module.bsl new file mode 100644 index 000000000..4f424d2d4 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеВидимости/Module.bsl @@ -0,0 +1,100 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Варинат.Пустая() тогда + СписокПользователей = Параметры.Пользователи; + Видимость = Параметры.Видимость; + Иначе + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетовНастройкаВидимости.Пользователь, + | ВариантыОтчетовНастройкаВидимости.Видимость, + | ВариантыОтчетов.Видимость КАК ВидимостьОбщая + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов.НастройкаВидимости КАК ВариантыОтчетовНастройкаВидимости + | ПО ВариантыОтчетов.Ссылка = ВариантыОтчетовНастройкаВидимости.Ссылка + |ГДЕ + | ВариантыОтчетов.Ссылка = &Варинат"; + + Запрос = Новый Запрос(ТЗ); + Запрос.УстановитьПараметр("Варинат", Параметры.Варинат); + + УстановитьПривилегированныйРежим(истина); + Выборка = Запрос.Выполнить().Выбрать(); + УстановитьПривилегированныйРежим(ложь); + + СписокПользователей = Новый СписокЗначений; + + Пока Выборка.Следующий() Цикл + СписокПользователей.Добавить(Выборка.Пользователь, ,Выборка.Видимость); + Видимость = Выборка.ВидимостьОбщая; + КонецЦикла; + + Если Видимость = Неопределено тогда + Видимость = истина; + КонецЕсли; + + КонецЕсли; + + ТЗ = "ВЫБРАТЬ + | Пользователи.Ссылка КАК Пользователь + |ИЗ + | Справочник.Пользователи КАК Пользователи + | + |УПОРЯДОЧИТЬ ПО + | Пользователи.Наименование"; + + Запрос = Новый Запрос(ТЗ); + УстановитьПривилегированныйРежим(истина); + Выборка = Запрос.Выполнить().Выбрать(); + УстановитьПривилегированныйРежим(ложь); + + Пока Выборка.Следующий() Цикл + + СтрокаПользователя = ДоступностьПользователей.Добавить(); + СтрокаПользователя.Пользователь = Выборка.Пользователь; + ЭлементСписка = СписокПользователей.НайтиПоЗначению(Выборка.Пользователь); + Если СписокПользователей.НайтиПоЗначению(Выборка.Пользователь) <> Неопределено тогда + СтрокаПользователя.Видимость = ЭлементСписка.Пометка; + Иначе + СтрокаПользователя.Видимость = Видимость; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура Принять(Команда) + + СписокПользователи = Новый СписокЗначений; + + Для каждого СтрокаПользователя из ДоступностьПользователей Цикл + Если СтрокаПользователя.Видимость <> Видимость тогда + СписокПользователи.Добавить(СтрокаПользователя.Пользователь, , СтрокаПользователя.Видимость); + КонецЕсли; + КонецЦикла; + + Структура = Новый Структура("Видимость, Пользователи", Видимость, СписокПользователи); + Закрыть(Структура); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтметитьВсе(Команда) + + Для каждого Строкапользователя из ДоступностьПользователей Цикл + СтрокаПользователя.Видимость = истина; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура СнятьОтметки(Команда) + + Для каждого СтрокаПользователя из ДоступностьПользователей Цикл + СтрокаПользователя.Видимость = ложь; + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеПодсистемы/ConditionalAppearance.dcssca b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеПодсистемы/ConditionalAppearance.dcssca new file mode 100644 index 000000000..817d11865 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеПодсистемы/ConditionalAppearance.dcssca @@ -0,0 +1,27 @@ + + + + + + ДеревоПодсистемИспользование + + + + + ДеревоПодсистем.Предопределенная + Equal + true + + + + + ЦветТекста + #C0C0C0 + + + ТолькоПросмотр + true + + + + diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеПодсистемы/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеПодсистемы/Form.form new file mode 100644 index 000000000..d310a72b3 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеПодсистемы/Form.form @@ -0,0 +1,544 @@ + + + + <key>ru</key> + <value>Разделы</value> + + + ДеревоПодсистем + 1 + true + true + + true + + + ДеревоПодсистем + + None + + ДеревоПодсистемГруппаПодсистема + 12 + + ДеревоПодсистемИспользование + 10 + true + true + + true + + + ДеревоПодсистем.Использование + + + ДеревоПодсистемИспользованиеРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ДеревоПодсистемИспользованиеКонтекстноеМеню + 11 + true + + CheckBoxField + Auto + true + Left + true + + + + ДеревоПодсистемНазвание + 6 + true + true + + true + + + ДеревоПодсистем.Название + + + ДеревоПодсистемНазваниеРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ДеревоПодсистемНазваниеКонтекстноеМеню + 7 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Дерево подсистем группа подсистема</value> + + + ru + Дерево подсистем группа подсистема + + + ДеревоПодсистемГруппаПодсистемаРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + None + + ДеревоПодсистемКоманднаяПанель + 3 + Left + true + + + ДеревоПодсистемСтрокаПоиска + 18 + + ДеревоПодсистемСтрокаПоискаРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ДеревоПодсистемСтрокаПоискаКонтекстноеМеню + 19 + true + + ДеревоПодсистем + + true + + + + ДеревоПодсистемСостояниеПросмотра + 21 + + ДеревоПодсистемСостояниеПросмотраРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + ДеревоПодсистемСостояниеПросмотраКонтекстноеМеню + 22 + true + + ViewStatusAddition + ДеревоПодсистем + + true + + + + ДеревоПодсистемУправлениеПоиском + 24 + + ДеревоПодсистемУправлениеПоискомРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ДеревоПодсистемУправлениеПоискомКонтекстноеМеню + 25 + true + + SearchControlAddition + ДеревоПодсистем + + true + + + + ДеревоПодсистемРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + ДеревоПодсистемКонтекстноеМеню + 2 + true + + Tree + true + true + true + 15 + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + ExpandAllLevels + true + true + true + true + None + None + None + true + + + Панель + 16 + + Принять + 14 + true + true + + true + + + ПринятьРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + Form.Command.Принять + Auto + true + true + true + UserCmds + Auto + + + Закрыть + 15 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + + ЗакрытьРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Панель</value> + + + ru + Панель + + + ПанельРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ДеревоПодсистем + + <key>ru</key> + <value>Дерево подсистем</value> + + 1 + + ValueTree + + + true + + + true + + + ПутьКПодсистеме + + <key>ru</key> + <value>Путь к подсистеме</value> + + 1 + + String + + + + true + + + true + + + + Название + + <key>ru</key> + <value>Название</value> + + 2 + + String + + + + true + + + true + + + + Предопределенная + + <key>ru</key> + <value>Предопределенная</value> + + 3 + + Boolean + + + true + + + true + + + + Использование + + <key>ru</key> + <value>Использование</value> + + 4 + + Boolean + + + true + + + true + + + + + Подсистемы + + <key>ru</key> + <value>Подсистемы</value> + + 2 + + 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 + + Boolean + + + true + + + true + + + + + Принять + + <key>ru</key> + <value>ОК</value> + + 1 + + true + + + + Принять + + + Auto + Auto + + + АдрессДереваПодсистем + + String + + + + + + + + diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеПодсистемы/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеПодсистемы/Module.bsl new file mode 100644 index 000000000..a221fd3e4 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РедактированиеПодсистемы/Module.bsl @@ -0,0 +1,48 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ДеревоЗначений = Параметры.ДеревоПодсистем; + Дерево = ДанныеФормыВЗначение(ДеревоЗначений, Тип("ДеревоЗначений")); + ЗначениеВРеквизитФормы(Дерево, "ДеревоПодсистем"); + +КонецПроцедуры + +&НаКлиенте +Процедура Принять(Команда) + + Подсистемы.Очистить(); + + Для каждого СтрокаПодсистемы из ДеревоПодсистем.ПолучитьЭлементы() Цикл + Если СтрокаПодсистемы.Использование тогда + ГруппировкаПодсистемы = Подсистемы.Добавить(); + ГруппировкаПодсистемы.Подсистема = СтрокаПодсистемы.ПутьКПодсистеме; + ГруппировкаПодсистемы.Название = СтрокаПодсистемы.Название; + ГруппировкаПодсистемы.Предопределенная = СтрокаПодсистемы.Предопределенная; + КонецЕсли; + ДобавитьПодсистемы(СтрокаПодсистемы) + КонецЦикла; + + ВозвращаемыеПараметры = Новый Структура("СписокПодсистем, ДеревоПодсистем"); + + ВозвращаемыеПараметры.СписокПодсистем = Подсистемы; + ВозвращаемыеПараметры.ДеревоПодсистем = ДеревоПодсистем; + + Закрыть(ВозвращаемыеПараметры); + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьПодсистемы(СтрокаПодсистемы) + + Для каждого СтрокаПодсистемы из СтрокаПодсистемы.ПолучитьЭлементы() Цикл + Если СтрокаПодсистемы.Использование тогда + ГруппировкаПодсистема = Подсистемы.Добавить(); + ГруппировкаПодсистема.Подсистема = СтрокаПодсистемы.ПутьКПодсистеме; + ГруппировкаПодсистема.Название = СтрокаПодсистемы.Название; + ГруппировкаПодсистема.Предопределенная = СтрокаПодсистемы.Предопределенная; + КонецЕсли; + ДобавитьПодсистемы(СтрокаПодсистемы) + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/СкопироватьВариантВРаздел/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СкопироватьВариантВРаздел/Form.form new file mode 100644 index 000000000..d717b1481 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СкопироватьВариантВРаздел/Form.form @@ -0,0 +1,842 @@ + + + + <key>ru</key> + <value>Добавить вариант в раздел</value> + + + СписокОтчетовИВариантов + 8 + true + true + + true + + + СписокОтчетовИВариантов + + None + Add + CancelSearch + Change + Copy + CopyToClipboard + Delete + EndEdit + Find + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + + СписокОтчетовИВариантовПредставлениеВарианта + 17 + + <key>ru</key> + <value>Вариант</value> + + true + true + + true + + + СписокОтчетовИВариантов.ПредставлениеВарианта + + + СписокОтчетовИВариантовПредставлениеВариантаРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + СписокОтчетовИВариантовПредставлениеВариантаКонтекстноеМеню + 18 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + СписокОтчетовИВариантовПредставлениеОтчета + 15 + + <key>ru</key> + <value>Отчет</value> + + true + true + + true + + + СписокОтчетовИВариантов.ПредставлениеОтчета + + + СписокОтчетовИВариантовПредставлениеОтчетаРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + СписокОтчетовИВариантовПредставлениеОтчетаКонтекстноеМеню + 16 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + СписокОтчетовИВариантовКоманднаяПанель + 10 + Left + true + + + СписокОтчетовИВариантовСтрокаПоиска + 22 + + СписокОтчетовИВариантовСтрокаПоискаРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + СписокОтчетовИВариантовСтрокаПоискаКонтекстноеМеню + 23 + true + + СписокОтчетовИВариантов + + true + + + + СписокОтчетовИВариантовСостояниеПросмотра + 25 + + СписокОтчетовИВариантовСостояниеПросмотраРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + СписокОтчетовИВариантовСостояниеПросмотраКонтекстноеМеню + 26 + true + + ViewStatusAddition + СписокОтчетовИВариантов + + true + + + + СписокОтчетовИВариантовУправлениеПоиском + 28 + + СписокОтчетовИВариантовУправлениеПоискомРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + СписокОтчетовИВариантовУправлениеПоискомКонтекстноеМеню + 29 + true + + SearchControlAddition + СписокОтчетовИВариантов + + true + + + + СписокОтчетовИВариантовРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + СписокОтчетовИВариантовКонтекстноеМеню + 9 + true + + true + 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 + +
+ + ДеревоПодсистем + 1 + true + true + + true + + + ДеревоПодсистем + + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + HierarchicalList + List + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + Tree + + ДеревоПодсистемПредставление + 4 + + <key>ru</key> + <value>Раздел</value> + + true + true + + true + + + ДеревоПодсистем.Представление + + + ДеревоПодсистемПредставлениеРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ДеревоПодсистемПредставлениеКонтекстноеМеню + 5 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + Bottom + + ДеревоПодсистемКоманднаяПанель + 3 + Right + + + Selection + ДеревоПодсистемВыбор + + + ДеревоПодсистемСтрокаПоиска + 44 + + ДеревоПодсистемСтрокаПоискаРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ДеревоПодсистемСтрокаПоискаКонтекстноеМеню + 45 + true + + ДеревоПодсистем + + true + + + + ДеревоПодсистемСостояниеПросмотра + 47 + + ДеревоПодсистемСостояниеПросмотраРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + ДеревоПодсистемСостояниеПросмотраКонтекстноеМеню + 48 + true + + ViewStatusAddition + ДеревоПодсистем + + true + + + + ДеревоПодсистемУправлениеПоиском + 50 + + ДеревоПодсистемУправлениеПоискомРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ДеревоПодсистемУправлениеПоискомКонтекстноеМеню + 51 + true + + SearchControlAddition + ДеревоПодсистем + + true + + + + ДеревоПодсистемРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ДеревоПодсистемКонтекстноеМеню + 2 + true + + Tree + true + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + ExpandAllLevels + true + true + true + true + None + None + None + true + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ДеревоПодсистемОК + 6 + true + true + + true + + + ДеревоПодсистемОКРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ДеревоПодсистемОтмена + 7 + true + true + + true + + + ДеревоПодсистемОтменаРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + true + true + UseIfNecessary + auto + true + + ДеревоПодсистем + + <key>ru</key> + <value>Дерево подсистем</value> + + 2 + + ValueTree + + + 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 + + Boolean + + + true + + + true + + + + Использование + + <key>ru</key> + <value>Использование</value> + + 4 + + Boolean + + + true + + + true + + + + Вариант + + <key>ru</key> + <value>Вариант</value> + + 5 + + CatalogRef.ВариантыОтчетов + + + 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> + + 1 + + String + + + + true + + + true + + + + Вариант + + <key>ru</key> + <value>Вариант</value> + + 3 + + String + + + + true + + + true + + + + СписокОтчетовИВариантов + + <key>ru</key> + <value>Список отчетов и вариантов</value> + + 4 + + 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 + + String + + + + true + + + true + + + + ПредставлениеВарианта + + <key>ru</key> + <value>Представление варианта</value> + + 4 + + String + + + + true + + + true + + + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 5 + + CatalogRef.ВариантыОтчетов + + + 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/Catalogs/ВариантыОтчетов/Forms/СкопироватьВариантВРаздел/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СкопироватьВариантВРаздел/Module.bsl new file mode 100644 index 000000000..c1f31f00f --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СкопироватьВариантВРаздел/Module.bsl @@ -0,0 +1,130 @@ + +&НаКлиенте +Процедура ДеревоПодсистемВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + Если Элементы.ДеревоПодсистем.ТекущиеДанные = Неопределено тогда + Предупреждение("Не выбран раздел отчета"); + Возврат; + КонецЕсли; + + Если Элементы.СписокОтчетовИВариантов.ТекущиеДанные = Неопределено тогда + Предупреждение("Не выбран вариант."); + Возврат; + КонецЕсли; + Структура = Новый Структура("Путь, Отчет, Вариант, ССылка, ПредставлениеВарианта"); + + Структура.Путь = Элементы.ДеревоПодсистем.ТекущиеДанные.Путь; + Структура.Вариант = Элементы.СписокОтчетовИВариантов.ТекущиеДанные.Вариант; + Структура.Отчет = Элементы.СписокОтчетовИВариантов.ТекущиеДанные.Отчет; + Структура.Ссылка = Элементы.СписокОтчетовИВариантов.ТекущиеДанные.Ссылка; + Структура.ПредставлениеВарианта = Элементы.СписокОтчетовИВариантов.ТекущиеДанные.ПредставлениеВарианта; + Закрыть(Структура); +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗагузитьСтруктураПодсистем(); + + ЗагрузитьСписокВариантовИОтчетов(); + +КонецПроцедуры + +&НаСервере +Процедура ЗагузитьСтруктураПодсистем() + + ДеревоПодсистемДляКопирования = Новый ДеревоЗначений; + ДеревоПодсистемДляКопирования.Колонки.Добавить("Подсистема"); + ДеревоПодсистемДляКопирования.Колонки.Добавить("Название"); + + СписокПодсистем = Новый СписокЗначений; + СписокПодсистем.Добавить(""); + + // Сделаем список отчетов + СписокПодсистем = ВариантыОтчетов.ПолучитьСписокПодсистем(СписокПодсистем, ДеревоПодсистемДляКопирования); + + СтрокаКонфигурации = ДеревоПодсистем.ПолучитьЭлементы().Добавить(); + СтрокаКонфигурации.Путь = ""; + СтрокаКонфигурации.Представление = "Конфигурация"; + СтрокаКонфигурации.Предопредленная = истина; + + СоответсвиеПодсистемИСтрок = Новый Соответствие; + + СкопироватьДеревоЗначений(СтрокаКонфигурации.ПолучитьЭлементы(), ДеревоПодсистемДляКопирования.Строки, СоответсвиеПодсистемИСтрок); + +КонецПроцедуры + +&НаСервере +Процедура ЗагрузитьСписокВариантовИОтчетов() + + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетов.КлючОбъекта КАК Отчет, + | ВариантыОтчетов.ПредставлениеОбъекта КАК ПредставлениеОтчета, + | ВариантыОтчетов.КлючВарианта КАК Вариант, + | ВариантыОтчетов.Наименование КАК ПредставлениеВарианта, + | ВариантыОтчетов.Ссылка + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов"; + + Запрос = Новый Запрос(ТЗ); + Выборка = Запрос.Выполнить().Выбрать(); + + СписокОтчетовИВариантов.Очистить(); + + Пока Выборка.Следующий() Цикл + + СтрокаДвижения = СписокОтчетовИВариантов.Добавить(); + СтрокаДвижения.Отчет = Выборка.Отчет; + СтрокаДвижения.Ссылка = Выборка.Ссылка; + СтрокаДвижения.Вариант = Выборка.Вариант; + СтрокаДвижения.ПредставлениеОтчета = Выборка.ПредставлениеОтчета; + СтрокаДвижения.ПредставлениеВарианта = Выборка.ПредставлениеВарианта; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура СкопироватьДеревоЗначений(КолекцияПриемник, КолекцияИсточник, СоответсвиеПодсистемИСтрок) + + Для каждого Элемент из КолекцияИсточник Цикл + СтрокаЗначение = КолекцияПриемник.Добавить(); + СтрокаЗначение.Путь = Элемент.Подсистема; + СтрокаЗначение.Представление = Элемент.Название; + СтрокаЗначение.Предопредленная = Метаданные.НайтиПоПолномуИмени("Подсистема." + СтрЗаменить(Элемент.Подсистема, "\", ".Подсистема.")) <> Неопределено; + СоответсвиеПодсистемИСтрок.Вставить(СтрокаЗначение.Путь, СтрокаЗначение); + СкопироватьДеревоЗначений(СтрокаЗначение.ПолучитьЭлементы(), Элемент.Строки, СоответсвиеПодсистемИСтрок); + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + + Если Элементы.ДеревоПодсистем.ТекущиеДанные = Неопределено тогда + Предупреждение("Не выбран раздел отчета"); + Возврат; + КонецЕсли; + + Если Элементы.СписокОтчетовИВариантов.ТекущиеДанные = Неопределено тогда + Предупреждение("Не выбран вариант."); + Возврат; + КонецЕсли; + Структура = Новый Структура("Путь, Отчет, Вариант, ССылка, ПредставлениеВарианта"); + + Структура.Путь = Элементы.ДеревоПодсистем.ТекущиеДанные.Путь; + Структура.Вариант = Элементы.СписокОтчетовИВариантов.ТекущиеДанные.Вариант; + Структура.Отчет = Элементы.СписокОтчетовИВариантов.ТекущиеДанные.Отчет; + Структура.Ссылка = Элементы.СписокОтчетовИВариантов.ТекущиеДанные.Ссылка; + Структура.ПредставлениеВарианта = Элементы.СписокОтчетовИВариантов.ТекущиеДанные.ПредставлениеВарианта; + Закрыть(Структура); + +КонецПроцедуры + +&НаКлиенте +Процедура Отмена(Команда) + + Закрыть(); + +КонецПроцедуры + + diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..d52523860 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form @@ -0,0 +1,700 @@ + + + + Список + 1 + true + true + + true + + + Список + + false + None + + ПредставлениеОбъекта + 17 + + <key>ru</key> + <value>Отчет</value> + + true + true + + true + + + Список.ПредставлениеОбъекта + + + ПредставлениеОбъектаРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ПредставлениеОбъектаКонтекстноеМеню + 18 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Наименование + 4 + + <key>ru</key> + <value>Наименование варинта</value> + + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТипНастройки + 8 + + <key>ru</key> + <value>Тип настройки</value> + + true + true + + + Список.ТипВариантаОтчета + + + ТипНастройкиРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + ТипНастройкиКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Администратор + 15 + + <key>ru</key> + <value>Автор</value> + + true + true + + true + + + Список.Администратор + + + АдминистраторРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + АдминистраторКонтекстноеМеню + 16 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 41 + + СписокСтрокаПоискаРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 42 + true + + Список + + true + + + + СписокСостояниеПросмотра + 44 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 45 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 47 + + СписокУправлениеПоискомРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 48 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + + true + true + true + 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 + +
+ + ГруппаОписание + 21 + + КартинкаИнфо + 22 + + <key>ru</key> + <value>Картинка инфо</value> + + true + true + + true + + + КартинкаИнфоРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + + КартинкаИнфоКонтекстноеМеню + 23 + true + + 2 + true + 1 + true + + + CommonPicture.Информация + + + + + Описание + 19 + true + true + + true + + + Items.Список.CurrentData.Описание + + None + + ОписаниеРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 20 + true + + LabelField + Enter + true + Left + true + + true + 2 + true + + + true + true + + true + + + <key>ru</key> + <value>Группа описание</value> + + + ru + Группа описание + + + ГруппаОписаниеРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + Top + true + + ФормаКоманднаяПанель + -1 + + СписокИзменить + 26 + + <key>ru</key> + <value>Изменить</value> + + true + true + + true + + + СписокИзменитьРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Change + Normal + Auto + true + true + UserCmds + Auto + + + СписокНайти + 24 + true + true + + true + + + СписокНайтиРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + СписокОтменитьПоиск + 25 + true + true + + true + + + СписокОтменитьПоискРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + СписокУстановитьПометкуУдаления + 27 + true + true + + true + + + СписокУстановитьПометкуУдаленияРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.SetDeletionMark + Normal + Auto + true + true + UserCmds + Auto + + + СписокОбновить + 28 + true + true + + true + + + СписокОбновитьРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Refresh + Normal + Auto + true + true + UserCmds + Auto + + + СписокИзменитьФорму + 29 + true + true + + true + + + СписокИзменитьФормуРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + + + СписокВключитьРазделы + 30 + true + true + + true + + + СписокВключитьРазделыРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + Form.Command.НастроитьГруппировкуПоРазделам + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСправка + 31 + true + true + + true + + + ФормаСправкаРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.ВариантыОтчетов + true + true + true + true + +
+ + НастроитьГруппировкуПоРазделам + + <key>ru</key> + <value>Настроить группировку по разделам</value> + + 1 + + ru + Настроить группировку по разделам + + + true + + + + Раздел + + + Auto + Auto + + + + + + +
diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Help/ru.html b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Help/ru.html new file mode 100644 index 000000000..f1bf9374b --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Help/ru.html @@ -0,0 +1,4 @@ + +

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

+

См. также:

+

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

\ No newline at end of file diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..fc0010b63 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,7 @@ + +&НаКлиенте +Процедура Раздел(Команда) + + ОткрытьФорму("Справочник.ВариантыОтчетов.Форма.НастройкаГруппировкиПоРазделам", , ЭтаФорма); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/ConditionalAppearance.dcssca b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/ConditionalAppearance.dcssca new file mode 100644 index 000000000..338eea71d --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/ConditionalAppearance.dcssca @@ -0,0 +1,56 @@ + + + + + + ДереводПодсистемИспользуется + + + ДереводПодсистемНазвание + + + + + ДеревоПодсистем.Предопределенная + Equal + true + + + + + ЦветТекста + #999999 + + + false + Доступность + false + + + ТолькоПросмотр + true + + + + + + + Описание + + + + + Объект.ТипВариантаОтчета + InList + Перечисление.ТипыВариантовОтчетов.Предопределенный + Перечисление.ТипыВариантовОтчетов.Отчет + + + + + ТолькоПросмотр + true + + + + diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..59033f9a2 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,621 @@ + + + + Наименование + 3 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Администратор + 9 + + <key>ru</key> + <value>Автор</value> + + true + true + + true + + + Объект.Администратор + + + АдминистраторРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + АдминистраторКонтекстноеМеню + 10 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + КлючОбъекта + 7 + + <key>ru</key> + <value>Источник данных</value> + + true + true + + + Объект.КлючОбъекта + + + КлючОбъектаРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + КлючОбъектаКонтекстноеМеню + 8 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + КлючВарианта + 28 + true + true + + + Объект.КлючВарианта + + + КлючВариантаРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + + КлючВариантаКонтекстноеМеню + 29 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТипВариантаОтчета + 22 + + <key>ru</key> + <value>Тип отчета</value> + + true + true + + + Объект.ТипВариантаОтчета + + + ТипВариантаОтчетаРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + + ТипВариантаОтчетаКонтекстноеМеню + 23 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Описание + 20 + true + true + + true + + + Объект.Описание + + + ОписаниеРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 21 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаИспользования + 56 + + НастроитьВидимостьПользователей + 54 + + <key>ru</key> + <value>Быстрый доступ:</value> + + true + true + + true + + + НастроитьВидимостьПользователейРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастроитьВидимостьПользователей + Normal + Auto + true + true + UserCmds + Auto + + + Использование + 60 + true + true + + true + + + ИспользованиеРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + ИспользованиеКонтекстноеМеню + 61 + true + + Label + true + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа использования</value> + + + ru + Группа использования + + + ГруппаИспользованияРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаПодсистемы + 59 + + НастроитьПодсистемы + 55 + + <key>ru</key> + <value>Разделы:</value> + + true + true + + true + + + НастроитьПодсистемыРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастроитьПодсистемы + Normal + true + true + UserCmds + Auto + + + Подсистемы + 62 + true + true + + true + + + ПодсистемыРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + ПодсистемыКонтекстноеМеню + 63 + true + + Label + true + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа использования подсистемы</value> + + + ru + Группа использования подсистемы + + + ГруппаПодсистемыРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ВариантыОтчетов + + + true + + + true + +
true
+ true +
+ + ДеревоПодсистем + + <key>ru</key> + <value>Дерево подсистем</value> + + 2 + + ValueTree + + + 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 + + Boolean + + + true + + + true + + + + Использование + + <key>ru</key> + <value>Использование</value> + + 4 + + Boolean + + + true + + + true + + + + + НастроитьВидимостьПользователей + + <key>ru</key> + <value>Настройки видимости варианта отчета</value> + + 1 + + ru + Быстрый доступ + + + true + + + + НастроитьВидимостьПользователей + + + Auto + Auto + + + НастроитьПодсистемы + + <key>ru</key> + <value>Настроить подсистемы</value> + + 2 + + ru + Разделы + + + true + + + + НастроитьПодсистемы + + + Auto + Auto + + + + + + +
diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Help/ru.html new file mode 100644 index 000000000..2e8250bd5 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Help/ru.html @@ -0,0 +1,9 @@ + +

Ответственный за вариант отчета пользователь может изменять настройки СКД. Данная форма позволяет изменить ответственного за вариант отчета.

+

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

+

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

+

См. также:

+

Загрузка вариантов отчета

+

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

+

 

+

 

\ No newline at end of file diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..5c26bf38b --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,210 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СписокПользователей = ""; + СписокПодсистем = ""; + + Для каждого Подсистема из Метаданные.Подсистемы Цикл + + Если Не Подсистема.ВключатьВКомандныйИнтерфейс тогда + Продолжить; + КонецЕсли; + + СтрокаПодсистемы = ДеревоПодсистем.ПолучитьЭлементы().Добавить(); + + СтрокаПодсистемы.ПутьКПодсистеме = Подсистема.Имя; + СтрокаПодсистемы.Название = Подсистема.Синоним; + + МассивСтрок = Объект.Подсистемы.НайтиСтроки(Новый Структура("Подсистема", Подсистема.Имя)); + СтрокаПодсистемы.Использование = МассивСтрок.Количество() > 0; + Если СтрокаПодсистемы.Использование тогда + СписокПодсистем = СписокПодсистем + Подсистема.Синоним + ", "; + СтрокаПодсистемы.Предопределенная = МассивСтрок[0].Предопределенная; + КонецЕсли; + + ДобавитьДеревоПодсистем(Подсистема, СтрокаПодсистемы, СписокПодсистем); + + КонецЦикла; + + ВиртуальныеПодсистемы = ВариантыОтчетов.ПолучитьВиртуальныеПодсистемы(Подсистема); + + Для каждого Подсистема из ВиртуальныеПодсистемы Цикл + + СтрокаПодсистемы = ДеревоПодсистем.Строки.Добавить(); + + СтрокаПодсистемы.ПутьКПодсистеме = Подсистема.Значение; + СтрокаПодсистемы.Название = Подсистема.Представлени; + + МассивСтрок = Объект.Подсистемы.НайтиСтроки(Новый Структура("Подсистема", Подсистема.Значение)); + СтрокаПодсистемы.Использование = МассивСтрок.Количество() > 0; + Если СтрокаПодсистемы.Использование тогда + СписокПодсистем = СписокПодсистем + Подсистема.Синоним + ", "; + СтрокаПодсистемы.Предопределенная = МассивСтрок[0].Предопределенная; + КонецЕсли; + + ДобавитьДеревоВиртуальныхПодсистем(Подсистема.Значение, СтрокаПодсистемы, СписокПодсистем); + + КонецЦикла; + + + Элементы.Использование.Заголовок = ОписаниеПользователей(); + Элементы.Подсистемы.Заголовок = ОписаниеПодсистем(); + +КонецПроцедуры + +Функция ОписаниеПользователей() + + ОписаниеПользователя = ""; + Если Объект.Видимость тогда + ОписаниеПользователя = "все" + ?(Объект.НастройкаВидимости.Количество() > 0, " кроме: ", " "); + Иначе + ОписаниеПользователя = ""; + КонецЕсли; + Для каждого СтрокаПользователя из Объект.НастройкаВидимости Цикл + ОписаниеПользователя = ОписаниеПользователя + СтрокаПользователя.Пользователь + ", "; + КонецЦикла; + ОписаниеПользователя = Лев(ОписаниеПользователя, СтрДлина(ОписаниеПользователя)-2); + + Возврат ОписаниеПользователя; + +КонецФункции + +Функция ОписаниеПодсистем() + + СписокПодсистем = ""; + + Для каждого Подсистема из Объект.Подсистемы Цикл + СписокПодсистем = СписокПодсистем + Подсистема.Название + ", "; + КонецЦикла; + + Возврат Лев(СписокПодсистем, СтрДлина(СписокПодсистем)-2) + +КонецФункции + +Процедура ДобавитьДеревоПодсистем(Подсистема, СтрокаПодсистемы, СписокПодсистем) + + Для каждого ПодсистемаПодчиненная из Подсистема.Подсистемы Цикл + + Если Не ПодсистемаПодчиненная.ВключатьВКомандныйИнтерфейс тогда + Продолжить; + КонецЕсли; + + СтрокаПодсистемыПодчиненой = СтрокаПодсистемы.ПолучитьЭлементы().Добавить(); + СтрокаПодсистемыПодчиненой.Название = ПодсистемаПодчиненная.Синоним; + МассивСтрок = Объект.Подсистемы.НайтиСтроки(Новый Структура("Подсистема", СтрокаПодсистемы.ПутьКПодсистеме + "\" + ПодсистемаПодчиненная.Имя)); + СтрокаПодсистемыПодчиненой.Использование = МассивСтрок.Количество() > 0; + Если СтрокаПодсистемыПодчиненой.Использование тогда + СписокПодсистем = СписокПодсистем + ПодсистемаПодчиненная.Синоним + ", "; + СтрокаПодсистемыПодчиненой.Предопределенная = МассивСтрок[0].Предопределенная; + КонецЕсли; + СтрокаПодсистемыПодчиненой.ПутьКПодсистеме = СтрокаПодсистемы.ПутьКПодсистеме + "\" + ПодсистемаПодчиненная.Имя; + ДобавитьДеревоПодсистем(ПодсистемаПодчиненная, СтрокаПодсистемыПодчиненой, СписокПодсистем); + + КонецЦикла; + + ВиртуальныеПодсистемы = ВариантыОтчетов.ПолучитьВиртуальныеПодсистемы(СтрокаПодсистемы.ПутьКПодсистеме); + + Для каждого ПодсистемаПодчиненная из ВиртуальныеПодсистемы Цикл + + СтрокаПодсистемыПодчиненой = СтрокаПодсистемы.ПолучитьЭлементы().Добавить(); + СтрокаПодсистемыПодчиненой.Название = ПодсистемаПодчиненная.Представление; + МассивСтрок = Объект.Подсистемы.НайтиСтроки(Новый Структура("Подсистема", ПодсистемаПодчиненная.Значение)); + СтрокаПодсистемыПодчиненой.Использование = МассивСтрок.Количество() > 0; + Если СтрокаПодсистемыПодчиненой.Использование тогда + СписокПодсистем = СписокПодсистем + ПодсистемаПодчиненная.Представление + ", "; + СтрокаПодсистемыПодчиненой.Предопределенная = МассивСтрок[0].Предопределенная; + КонецЕсли; + СтрокаПодсистемыПодчиненой.ПутьКПодсистеме = ПодсистемаПодчиненная.Значение; + ДобавитьДеревоВиртуальныхПодсистем(ПодсистемаПодчиненная.Значение, СтрокаПодсистемыПодчиненой, СписокПодсистем); + + КонецЦикла; +КонецПроцедуры + + +Процедура ДобавитьДеревоВиртуальныхПодсистем(Подсистема, СтрокаПодсистемы, СписокПодсистем) + + ВиртуальныеПодсистемы = ВариантыОтчетов.ПолучитьВиртуальныеПодсистемы(Подсистема); + + Для каждого ПодсистемаПодчиненная из ВиртуальныеПодсистемы Цикл + + СтрокаПодсистемыПодчиненой = СтрокаПодсистемы.ПолучитьЭлементы().Добавить(); + СтрокаПодсистемыПодчиненой.Название = ПодсистемаПодчиненная.Представление; + МассивСтрок = Объект.Подсистемы.НайтиСтроки(Новый Структура("Подсистема", ПодсистемаПодчиненная.Значение)); + СтрокаПодсистемыПодчиненой.Использование = МассивСтрок.Количество() > 0; + Если СтрокаПодсистемыПодчиненой.Использование тогда + СписокПодсистем = СписокПодсистем + ПодсистемаПодчиненная.Представление + ", "; + СтрокаПодсистемыПодчиненой.Предопределенная = МассивСтрок[0].Предопределенная; + КонецЕсли; + СтрокаПодсистемыПодчиненой.ПутьКПодсистеме = ПодсистемаПодчиненная.Значение; + ДобавитьДеревоВиртуальныхПодсистем(ПодсистемаПодчиненная.Значение, СтрокаПодсистемыПодчиненой, СписокПодсистем); + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьВидимостьПользователей(Команда) + + СписокПользователей = Новый СписокЗначений; + Для каждого СтрокаПользователь из Объект.НастройкаВидимости Цикл + СписокПользователей.Добавить(СтрокаПользователь.Пользователь,, НЕ Объект.Видимость); + КонецЦикла; + + ПараметрыФормы = Новый Структура("Видимость, Пользователи", Объект.Видимость, СписокПользователей); + Структура = ОткрытьФормуМодально("Справочник.ВариантыОтчетов.Форма.РедактированиеВидимости", ПараметрыФормы, ЭтаФорма); + Если Структура = Неопределено тогда + Возврат; + КонецЕсли; + + СписокПользователей = Структура.Пользователи; + + Объект.НастройкаВидимости.Очистить(); + + Объект.Видимость = Структура.Видимость; + + Для каждого ЭлементПользователи из СписокПользователей Цикл + СтрокаРоли = Объект.НастройкаВидимости.Добавить(); + СтрокаРоли.Пользователь = ЭлементПользователи.Значение; + КонецЦикла; + + Элементы.Использование.Заголовок = ОписаниеПользователей(); + + ЭтаФорма.Модифицированность = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьПодсистемы(Команда) + + ПараметрыФормы = Новый Структура("ДеревоПодсистем", ДеревоПодсистем); + + ВозвращаемыеПараметры = ОткрытьФормуМодально("Справочник.ВариантыОтчетов.Форма.РедактированиеПодсистемы", ПараметрыФормы, ЭтаФорма); + + Если ВозвращаемыеПараметры <> Неопределено тогда + Объект.Подсистемы.Очистить(); + Для каждого ОписаниеПодсистема из ВозвращаемыеПараметры.СписокПодсистем Цикл + СтрокаПодсистемы = Объект.Подсистемы.Добавить(); + СтрокаПодсистемы.Подсистема = ОписаниеПодсистема.Подсистема; + СтрокаПодсистемы.Название = ОписаниеПодсистема.Название; + СтрокаПодсистемы.Предопределенная = ОписаниеПодсистема.Предопределенная; + КонецЦикла; + + Элементы.Подсистемы.Заголовок = ОписаниеПодсистем(); + + ПоместитьДеревоЗначенийВформу(ВозвращаемыеПараметры.ДеревоПодсистем); + ЭтаФорма.Модифицированность = Истина; + + КонецЕсли; + + +КонецПроцедуры + +&НаСервере +Процедура ПоместитьДеревозначенийВформу(ДеревоПодсистем) + + ДеревоПодсистемЗначение = РеквизитФормыВЗначение("ДеревоПодсистем"); + ЗначениеВРеквизитФормы(ДеревоПодсистемЗначение, "ДеревоПодсистем"); + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Help/ru.html b/SSL/src/Catalogs/ВариантыОтчетов/Help/ru.html new file mode 100644 index 000000000..4e61ce0b2 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Help/ru.html @@ -0,0 +1,19 @@ + +

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

+

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

+

Работа с вариантом отчета

+

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

+

Создание варианта отчета

+

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

+

Удаление варианта отчета

+

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

+

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

+

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

+

Пользовательские настройки варианта отчета

+

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

+

Работа с пользовательскими настройками

+

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

+

См. также:

+

Загрузка вариантов отчета

+

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

+

 

\ No newline at end of file diff --git a/SSL/src/Catalogs/ВариантыОтчетов/ВариантыОтчетов.mdo b/SSL/src/Catalogs/ВариантыОтчетов/ВариантыОтчетов.mdo new file mode 100644 index 000000000..43f5eb937 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/ВариантыОтчетов.mdo @@ -0,0 +1,431 @@ + + + + + + + + + + ВариантыОтчетов + + ru + Варианты отчетов + + true + Catalog.ВариантыОтчетов.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + + + Use + + + + Use + true + + + ru + + + Managed + Use + + ru + Вариант отчета + + + ru + Вариант настройки отчета + + + ru + Варианты настройки отчетов + + 2 + true + 70 + String + AsDescription + InDialog + BothWays + Catalog.ВариантыОтчетов.Form.ФормаЭлемента + Catalog.ВариантыОтчетов.Form.ФормаСписка + + КлючОбъекта + + ru + Ключ объекта + + + String + + 150 + + + + + ShowError + + Index + Use + + + Администратор + + ru + Администратор + + Автор варианта отчета + + CatalogRef.Пользователи + + + + ShowError + + Index + Use + Use + + + Описание + + ru + Описание + + + String + + + + + + Use + Use + + + ХранилищеЗначений + + ru + Хранилище значений + + + ValueStorage + + + + + Use + + + ТипВариантаОтчета + + ru + Тип варианта отчета + + + EnumRef.ТипыВариантовОтчетов + + + + ShowError + + Use + Use + + + КлючВарианта + + ru + Ключ варианта + + + String + + 256 + + + + + + Use + + + Видимость + + ru + Быстрый доступ + + Вариант видим всем пользователям по умолчанию + + Boolean + + + + + Use + + + ПредставлениеОбъекта + + ru + Представление объекта + + + String + + 256 + + + + + + Use + Use + + + + + + + Подсистемы + + ru + Подсистемы + + + Use + LineNumber + + Use + + + + + Подсистема + + ru + Подсистема + + + String + + + + + Use + Use + + + Название + + ru + Название + + + String + + 200 + + + + + Use + Use + + + Предопределенная + + ru + Предопределенная + + + Boolean + + + + Use + Use + + + + + + + + НастройкаВидимости + + ru + Настройка видимости + + + Use + LineNumber + + Use + + + + + Пользователь + + ru + Пользователь + + + CatalogRef.Пользователи + + + + Use + Index + Use + + + + ФормаСписка + + ru + Форма списка + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаЭлемента + + ru + Форма элемента + + + + ru + + + PersonalComputer + MobileDevice + + + РедактированиеВидимости + + ru + Использование отчета + + PersonalComputer + MobileDevice + + + РедактированиеПодсистемы + + ru + Редактирование подсистемы + + PersonalComputer + MobileDevice + + + НастройкаГруппировкиПоРазделам + + ru + Настройка группировки по разделам + + PersonalComputer + MobileDevice + + + ПереместитьВариантВРаздел + + ru + Переместить вариант в раздел + + PersonalComputer + MobileDevice + + + СкопироватьВариантВРаздел + + ru + Скопировать вариант в раздел + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/ВерсииФайлов/Commands/ОткрытьВерсииФайла/CommandModule.bsl b/SSL/src/Catalogs/ВерсииФайлов/Commands/ОткрытьВерсииФайла/CommandModule.bsl new file mode 100644 index 000000000..f414f0559 --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/Commands/ОткрытьВерсииФайла/CommandModule.bsl @@ -0,0 +1,8 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ПараметрыФормы = Новый Структура("Файл", ПараметрКоманды); + ОткрытьФорму("Справочник.ВерсииФайлов.Форма.ФормаСпискаВерсийФайла", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..e66dc8781 --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,20 @@ + + + + + DeletionMark + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Form.form new file mode 100644 index 000000000..dc587d93c --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Form.form @@ -0,0 +1,398 @@ + + + + <key>ru</key> + <value>Выбор версии файла</value> + + + ОсновнаяКоманднаяПанель + 1 + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + CommandBar + + Left + Form + + + + Список + 2 + true + true + + true + + + Список + + true + false + None + + НомерВерсии + 19 + + <key>ru</key> + <value>Номер версии</value> + + true + true + + true + + + Список.НомерВерсии + + + НомерВерсииРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + НомерВерсииКонтекстноеМеню + 20 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Автор + 21 + true + true + + true + + + Список.Автор + + + АвторРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ДатаСоздания + 23 + true + true + + true + + + Список.ДатаСоздания + + + ДатаСозданияРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + ДатаСозданияКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Размер + 25 + true + true + + true + + + Список.Размер + + + РазмерРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + РазмерКонтекстноеМеню + 26 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 18 + Left + true + + + СписокСтрокаПоиска + 29 + + СписокСтрокаПоискаРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 30 + true + + Список + + true + + + + СписокСостояниеПросмотра + 32 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 33 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 35 + + СписокУправлениеПоискомРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 36 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 3 + true + + HierarchicalList + true + true + 40 + true + true + 10 + true + true +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + + Style.BorderColor + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
+ None + false + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + ВЫБРАТЬ + ВерсииФайлов.НомерВерсии, + ВерсииФайлов.Размер, + ВерсииФайлов.Автор, + ВерсииФайлов.ДатаСоздания, + ВерсииФайлов.ПометкаУдаления, + ВерсииФайлов.Владелец +ИЗ + Справочник.ВерсииФайлов КАК ВерсииФайлов + Catalog.ВерсииФайлов + true + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбораСпособаСравненияВерсий/Form.form b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбораСпособаСравненияВерсий/Form.form new file mode 100644 index 000000000..bcd062bc0 --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбораСпособаСравненияВерсий/Form.form @@ -0,0 +1,229 @@ + + + + <key>ru</key> + <value>Выберите способ сравнения версий файлов</value> + + + СпособСравненияВерсийФайлов + 1 + true + true + + true + + + СпособСравненияВерсийФайлов + + + СпособСравненияВерсийФайловРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + СпособСравненияВерсийФайловКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + КоманднаяПанель + 3 + + ОК + 4 + + <key>ru</key> + <value>ОК</value> + + true + true + + true + + false + + ОКРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + true + true + true + UserCmds + Auto + + + Отмена + 5 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 6 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + ru + Командная панель + + + КоманднаяПанельРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + СпособСравненияВерсийФайлов + + <key>ru</key> + <value>Сравнивать версии файлов при помощи</value> + + 1 + + EnumRef.СпособыСравненияВерсийФайлов + + + true + + + true + + ShowError + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 1 + + ru + Записать и закрыть + + + true + + + StdPicture.EndEdit + + + + ЗаписатьИЗакрыть + + + TextPicture + Auto + Auto + + + + + + diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбораСпособаСравненияВерсий/Module.bsl b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбораСпособаСравненияВерсий/Module.bsl new file mode 100644 index 000000000..d4df94b75 --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбораСпособаСравненияВерсий/Module.bsl @@ -0,0 +1,17 @@ + +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + МассивСтруктур = Новый Массив; + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "НастройкиСравненияФайлов"); + Элемент.Вставить("Настройка", "СпособСравненияВерсийФайлов"); + Элемент.Вставить("Значение", СпособСравненияВерсийФайлов); + МассивСтруктур.Добавить(Элемент); + + ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур); + ОбновитьПовторноИспользуемыеЗначения(); + + Закрыть(КодВозвратаДиалога.ОК); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..583141cee --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,46 @@ + + + + + false + DeletionMark + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + false + ДатаСоздания + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + + + + + ПометкаУдаления + Equal + true + + + + + ЦветТекста + web:Gray + + + Шрифт + + + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..54e889ef4 --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Form.form @@ -0,0 +1,900 @@ + + + + ОсновнаяКоманднаяПанель + 1 + + ОткрытьВерсию + 36 + + <key>ru</key> + <value>Открыть карточку версии</value> + + true + true + + true + + false + + ОткрытьВерсиюРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Change + Normal + PictureAndText + true + true + UserCmds + Auto + + + ПометитьНаУдаление_СнятьПометку + 42 + true + true + + true + + false + + ПометитьНаУдаление_СнятьПометкуРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.SetDeletionMark + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 33 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + + НастройкаОтображенияДанных + 39 + true + true + + true + + false + + НастройкаОтображенияДанныхРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.ListSettings + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + CommandBar + + Left + + + + Список + 2 + true + true + + true + + + Список + + true + false + None + + ПолноеНаименование + 49 + true + true + + true + + + Список.ПолноеНаименование + + + ПолноеНаименованиеРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + ПолноеНаименованиеКонтекстноеМеню + 50 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Владелец + 40 + true + true + + + Список.Owner + + + ВладелецРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + + ВладелецКонтекстноеМеню + 41 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Автор + 9 + + <key>ru</key> + <value>Автор версии</value> + + true + true + + true + + + Список.Автор + + + АвторРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 20 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Комментарий + 8 + + <key>ru</key> + <value>Комментарий</value> + + true + true + + true + + + Список.Комментарий + + + КомментарийРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + Left + + true + 1 + true + true + true + true + + Style.BorderColor + + Normal + + + + ДатаСоздания + 10 + + <key>ru</key> + <value>Дата создания</value> + + true + true + + true + + + Список.ДатаСоздания + + + ДатаСозданияРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + ДатаСозданияКонтекстноеМеню + 21 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Размер + 7 + + <key>ru</key> + <value>Размер файла</value> + + true + true + + true + + + Список.Размер + + + РазмерРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + РазмерКонтекстноеМеню + 18 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + НомерВерсии + 37 + + <key>ru</key> + <value>Номер версии</value> + + true + true + + true + + + Список.НомерВерсии + + + НомерВерсииРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + НомерВерсииКонтекстноеМеню + 38 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ПометкаУдаления + 47 + true + true + + true + + + Список.DeletionMark + + + ПометкаУдаленияРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + + ПометкаУдаленияКонтекстноеМеню + 48 + true + + CheckBoxField + Enter + true + Left + true + + + + Размер1 + 51 + true + true + + true + + + Список.Размер + + + Размер1РасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + Размер1КонтекстноеМеню + 52 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Расширение + 53 + true + true + + true + + + Список.Расширение + + + РасширениеРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + + РасширениеКонтекстноеМеню + 54 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 22 + Left + true + + + Selection + СписокВыбор + + + BeforeAddRow + СписокПередНачаломДобавления + + + BeforeDeleteRow + СписокПередУдалением + + + СписокСтрокаПоиска + 64 + + СписокСтрокаПоискаРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 65 + true + + Список + + true + + + + СписокСостояниеПросмотра + 67 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 68 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 70 + + СписокУправлениеПоискомРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 71 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 13 + + КонтекстноеМенюСписокОткрытьВерсию + 43 + + <key>ru</key> + <value>Открыть карточку версии</value> + + true + true + + true + + false + + КонтекстноеМенюСписокОткрытьВерсиюРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Change + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокПометитьНаУдаление_СнятьПометку + 45 + true + true + + true + + false + + КонтекстноеМенюСписокПометитьНаУдаление_СнятьПометкуРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.SetDeletionMark + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокКопировать + 46 + true + true + + true + + false + + КонтекстноеМенюСписокКопироватьРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + + + HierarchicalList + true + true + 40 + true + true + 10 + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + End + true + true + true + + Список.ИндексКартинки + + + CommonPicture.ПиктограммыФайлов + + + Style.BorderColor + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
+ None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.ИндексКартинки + + + Список.Расширение + +
true
+ + ВЫБРАТЬ + ВерсииФайлов.НомерВерсии КАК НомерВерсии, + ВерсииФайлов.ФайлХранилище, + ВерсииФайлов.Размер, + ВерсииФайлов.Комментарий, + ВерсииФайлов.Автор, + ВерсииФайлов.ДатаСоздания, + ВерсииФайлов.ПолноеНаименование, + ВерсииФайлов.ИндексКартинки, + ВерсииФайлов.ПометкаУдаления, + ВерсииФайлов.Расширение, + ВерсииФайлов.Владелец +ИЗ + Справочник.ВерсииФайлов КАК ВерсииФайлов + Catalog.ВерсииФайлов + true + true + true + true + true + +
+ + + + + 0 + Added + FormCommandBarImportant + 0 + + true + + + + 0 + Added + FormCommandBarImportant + 1 + + true + + + + 0 + Added + FormCommandBarImportant + 2 + + true + + + + + +
diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..6d292ad92 --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,33 @@ +&НаКлиенте +Процедура СписокПередУдалением(Элемент, Отказ) + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(Неопределено, Элементы.Список.ТекущаяСтрока); + + Если ДанныеФайла.ТекущаяВерсия = Элементы.Список.ТекущаяСтрока Тогда + Предупреждение(НСтр("ru = 'Активную версию нельзя удалить!'")); + Отказ = Истина; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "ЗаконченоРедактирование" Или ИмяСобытия = "ВерсияСохранена" Тогда + Элементы.Список.Обновить(); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + Отказ = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + РаботаСФайламиКлиент.ОткрытьВерсиюФайла( + РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(Неопределено, ВыбраннаяСтрока, УникальныйИдентификатор), + УникальныйИдентификатор); + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..583141cee --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,46 @@ + + + + + false + DeletionMark + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + false + ДатаСоздания + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + + + + + ПометкаУдаления + Equal + true + + + + + ЦветТекста + web:Gray + + + Шрифт + + + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Form.form b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Form.form new file mode 100644 index 000000000..08cfbd081 --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Form.form @@ -0,0 +1,1341 @@ + + + + ОсновнаяКоманднаяПанель + 1 + + ОткрытьВерсию + 62 + true + true + + true + + false + + ОткрытьВерсиюРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + Form.Command.ОткрытьВерсию + Normal + PictureAndText + true + true + UserCmds + Auto + + + ОткрытьКарточку + 36 + + <key>ru</key> + <value>Открыть карточку</value> + + true + true + + true + + false + + ОткрытьКарточкуРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + Form.Command.ОткрытьКарточку + Normal + PictureAndText + true + true + UserCmds + Auto + + + СделатьАктивной + 35 + true + true + + true + + false + + СделатьАктивнойРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Form.Command.СделатьАктивной + Normal + Auto + true + true + UserCmds + Auto + + + ПометитьНаУдаление_СнятьПометку + 42 + true + true + + true + + false + + ПометитьНаУдаление_СнятьПометкуРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + Form.Command.ПометитьНаУдаление + Normal + Auto + true + true + UserCmds + Auto + + + Сравнить + 61 + true + true + + true + + false + + СравнитьРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + Form.Command.Сравнить + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 33 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + + НастройкаОтображенияДанных + 39 + true + true + + true + + false + + НастройкаОтображенияДанныхРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + CommandBar + + Left + + + + Список + 2 + true + true + + true + + + ДеревоВерсий + + true + false + None + + КартинкаИНаименование + 67 + + СписокИндексКартинки + 68 + true + true + + true + + + ДеревоВерсий.ИндексКартинки + + + СписокИндексКартинкиРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + + СписокИндексКартинкиКонтекстноеМеню + 69 + true + + PictureField + Auto + Left + true + + true + true + true + true + + CommonPicture.ПиктограммыФайлов + + + + 1 + + + + + Автор + 49 + true + true + + true + + + ДеревоВерсий.Автор + + + АвторРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 50 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Картинка и наименование</value> + + + ru + Картинка и наименование + + + КартинкаИНаименованиеРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + Владелец + 47 + true + + true + + + ДеревоВерсий.Владелец + + + ВладелецРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + + ВладелецКонтекстноеМеню + 48 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + НомерВерсии + 57 + true + true + + true + + + ДеревоВерсий.НомерВерсии + + + НомерВерсииРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + + НомерВерсииКонтекстноеМеню + 58 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + Комментарий + 51 + true + true + + true + + + ДеревоВерсий.Комментарий + + + КомментарийРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 52 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДатаСоздания + 53 + true + true + + true + + + ДеревоВерсий.ДатаСоздания + + + ДатаСозданияРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + ДатаСозданияКонтекстноеМеню + 54 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + Размер + 55 + true + true + + true + + + ДеревоВерсий.Размер + + + РазмерРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + + РазмерКонтекстноеМеню + 56 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + Ссылка + 59 + true + + true + + + ДеревоВерсий.Ссылка + + + СсылкаРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 60 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 22 + Left + true + + + Selection + СписокВыбор + + + BeforeDeleteRow + СписокПередУдалением + + + OnActivateRow + СписокПриАктивизацииСтроки + + + BeforeRowChange + СписокПередНачаломИзменения + + + СписокСтрокаПоиска + 85 + + СписокСтрокаПоискаРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 86 + true + + Список + + true + + + + СписокСостояниеПросмотра + 88 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 89 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 91 + + СписокУправлениеПоискомРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 92 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 13 + + КонтекстноеМенюСписокОткрытьВерсию + 63 + true + true + + true + + false + + КонтекстноеМенюСписокОткрытьВерсиюРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + Form.Command.ОткрытьВерсию + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокОткрытьКарточку + 43 + + <key>ru</key> + <value>Открыть карточку</value> + + true + true + + true + + false + + КонтекстноеМенюСписокОткрытьКарточкуРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + Form.Command.ОткрытьКарточку + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСделатьАктивной + 44 + true + true + + true + + false + + КонтекстноеМенюСписокСделатьАктивнойРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + Form.Command.СделатьАктивной + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСравнить + 64 + true + true + + true + + false + + КонтекстноеМенюСписокСравнитьРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + Form.Command.Сравнить + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокПометитьНаУдаление_СнятьПометку + 45 + true + true + + true + + false + + КонтекстноеМенюСписокПометитьНаУдаление_СнятьПометкуРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокКопировать + 46 + true + true + + true + + false + + КонтекстноеМенюСписокКопироватьРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + + + Tree + true + true + 40 + true + true + 10 + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + true + true + true + true + + Style.BorderColor + + None + None + None + true +
+ None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.ИндексКартинки + +
true
+ + ВЫБРАТЬ + ВерсииФайлов.Код КАК Код, + ВерсииФайлов.ФайлХранилище, + ВерсииФайлов.Размер, + ВерсииФайлов.Комментарий, + ВерсииФайлов.Автор, + ВерсииФайлов.ДатаСоздания, + ВерсииФайлов.ПолноеНаименование, + ВерсииФайлов.ИндексКартинки, + ВерсииФайлов.ПометкаУдаления, + ВерсииФайлов.Владелец +ИЗ + Справочник.ВерсииФайлов КАК ВерсииФайлов + Catalog.ВерсииФайлов + true + true + true + true + true + +
+ + ДеревоВерсий + + <key>ru</key> + <value>Дерево версий</value> + + 2 + + ValueTree + + + true + + + true + + + Владелец + + <key>ru</key> + <value>Владелец</value> + + 1 + + CatalogRef.Файлы + + + true + + + true + + + + Автор + + <key>ru</key> + <value>Автор</value> + + 2 + + CatalogRef.Пользователи + + + true + + + true + + + + Комментарий + + <key>ru</key> + <value>Комментарий</value> + + 3 + + String + + + + true + + + true + + + + ДатаСоздания + + <key>ru</key> + <value>Дата создания</value> + + 4 + + Date + + + + true + + + true + + + + Размер + + <key>ru</key> + <value>Размер</value> + + 5 + + Number + + 10 + + + + true + + + true + + + + НомерВерсии + + <key>ru</key> + <value>Номер версии</value> + + 6 + + Number + + 5 + + + + true + + + true + + + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 7 + + CatalogRef.ВерсииФайлов + + + true + + + true + + + + ИндексКартинки + + <key>ru</key> + <value>Индекс картинки</value> + + 8 + + Number + + + + true + + + true + + + + ЭтоТекущая + + <key>ru</key> + <value>Это текущая</value> + + 9 + + Boolean + + + true + + + true + + + + РодительскаяВерсия + + <key>ru</key> + <value>Родительская версия</value> + + 10 + + CatalogRef.ВерсииФайлов + + + true + + + true + + + + Расширение + + <key>ru</key> + <value>Расширение</value> + + 11 + + String + + 10 + + + + true + + + true + + + + + СделатьАктивной + + <key>ru</key> + <value>Сделать активной</value> + + 1 + + ru + Сделать активной + + + true + + + + СделатьАктивнойВыполнить + + + Auto + Auto + + + ПометитьНаУдаление + + <key>ru</key> + <value>Пометить на удаление</value> + + 2 + + ru + Пометить на удаление, снять пометку на удаление + + + true + + + StdPicture.MarkToDelete + + + + ПометитьНаУдаление + + + Picture + Auto + Auto + + + ОткрытьКарточку + + <key>ru</key> + <value>Открыть карточку</value> + + 3 + + ru + Открыть карточку версии + + + true + + + StdPicture.Change + + + + ОткрытьКарточку + + + Auto + Auto + + + Сравнить + + <key>ru</key> + <value>Показать отличия</value> + + 4 + + ru + Показать отличия двух версий + + + true + + + + Сравнить + + + Auto + Auto + + + ОткрытьВерсию + + <key>ru</key> + <value>Открыть версию</value> + + 5 + + ru + Открыть версию + + + true + + + CommonPicture.КартинкаОткрыть + + + + ОткрытьВерсию + + + Auto + Auto + + + Файл + + CatalogRef.Файлы + + true + + + + + + Form.Command.СделатьАктивной + Added + FormCommandBarImportant + 0 + + true + + + + Form.Command.ПометитьНаУдаление + Added + FormCommandBarImportant + 1 + + true + + + + Form.Command.ОткрытьКарточку + Added + FormCommandBarImportant + 2 + + true + + + + + +
diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Module.bsl b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Module.bsl new file mode 100644 index 000000000..884d4f989 --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Module.bsl @@ -0,0 +1,496 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ + +&НаСервере +Процедура СменитьАктивнуюВерсиюФайла(Версия) + + Файл = Версия.Владелец.ПолучитьОбъект(); + Файл.Заблокировать(); + Файл.ТекущаяВерсия = Версия; + Файл.ТекстХранилище = Версия.ТекстХранилище; + Файл.Записать(); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьДеревоВерсий() + + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ВерсииФайлов.Код КАК Код, + | ВерсииФайлов.Размер КАК Размер, + | ВерсииФайлов.Комментарий КАК Комментарий, + | ВерсииФайлов.Автор КАК Автор, + | ВерсииФайлов.ДатаСоздания КАК ДатаСоздания, + | ВерсииФайлов.ПолноеНаименование КАК ПолноеНаименование, + | ВерсииФайлов.РодительскаяВерсия КАК РодительскаяВерсия, + | ВЫБОР + | КОГДА ВерсииФайлов.ПометкаУдаления = ИСТИНА + | ТОГДА 1 + | ИНАЧЕ ВерсииФайлов.ИндексКартинки + | КОНЕЦ КАК ИндексКартинки, + | ВерсииФайлов.ПометкаУдаления КАК ПометкаУдаления, + | ВерсииФайлов.Владелец КАК Владелец, + | ВерсииФайлов.Ссылка КАК Ссылка, + | ВЫБОР + | КОГДА ВерсииФайлов.Владелец.ТекущаяВерсия = ВерсииФайлов.Ссылка + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК ЭтоТекущая, + | ВерсииФайлов.Расширение КАК Расширение, + | ВерсииФайлов.НомерВерсии КАК НомерВерсии + |ИЗ + | Справочник.ВерсииФайлов КАК ВерсииФайлов + |ГДЕ + | ВерсииФайлов.Владелец = &Владелец"); + + Запрос.УстановитьПараметр("Владелец", Параметры.Файл); + Данные = Запрос.Выполнить().Выгрузить(); + + Дерево = РеквизитФормыВЗначение("ДеревоВерсий"); + Дерево.Строки.Очистить(); + + ДобавитьПредыдущуюВерсию(Неопределено, Дерево, Данные); + ЗначениеВДанныеФормы(Дерево, ДеревоВерсий); + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьПредыдущуюВерсию(ТекущаяВетвь, Дерево, Данные) + + НайденнаяСтрока = Неопределено; + + Если ТекущаяВетвь = Неопределено Тогда + Для Каждого Строка Из Данные Цикл + Если Строка.ЭтоТекущая Тогда + НайденнаяСтрока = Строка; + Прервать; + КонецЕсли; + КонецЦикла; + Иначе + Для Каждого Строка Из Данные Цикл + Если Строка.Ссылка = ТекущаяВетвь.РодительскаяВерсия Тогда + НайденнаяСтрока = Строка; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если НайденнаяСтрока <> Неопределено Тогда + Ветвь = Дерево.Строки.Добавить(); + ЗаполнитьЗначенияСвойств(Ветвь, НайденнаяСтрока); + Данные.Удалить(НайденнаяСтрока); + + ДобавитьПодчиненныеВерсии(Ветвь, Данные); + ДобавитьПредыдущуюВерсию(Ветвь, Дерево, Данные); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьПодчиненныеВерсии(Ветвь, Данные) + + Для Каждого Строка из Данные Цикл + Если Ветвь.Ссылка = Строка.РодительскаяВерсия Тогда + ЗаполнитьЗначенияСвойств(Ветвь.Строки.Добавить(), Строка); + КонецЕсли; + КонецЦикла; + Для Каждого Веточка из Ветвь.Строки Цикл + ДобавитьПодчиненныеВерсии(Веточка, Данные); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ПометитьНаУдалениеСнятьПометкуНаСервере(Версия) + + Пометка = Не Версия.ПометкаУдаления; + + ВерсияОбъект = Версия.ПолучитьОбъект(); + ВерсияОбъект.Заблокировать(); + ВерсияОбъект.УстановитьПометкуУдаления(Пометка); + +КонецПроцедуры + +&НаКлиенте +Процедура ПометитьНаУдалениеСнятьПометку() + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Пометка = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ТекущиеДанные.Ссылка, "ПометкаУдаления"); + Если Пометка Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Cнять с ""%1"" пометку на удаление?'"), + Строка(ТекущиеДанные.Ссылка)); + Иначе + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Пометить ""%1"" на удаление?'"), + Строка(ТекущиеДанные.Ссылка)); + КонецЕсли; + + Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); + Если Результат <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + ПометитьНаУдалениеСнятьПометкуНаСервере(ТекущиеДанные.Ссылка); + + Если Не Пометка Тогда + ТекущиеДанные.ИндексКартинки = 1; + Иначе + ТекущиеДанные.ИндексКартинки = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ТекущиеДанные.Ссылка, "ИндексКартинки"); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗаполнитьДеревоВерсий(); + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура СделатьАктивнойВыполнить() + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(Неопределено, ТекущиеДанные.Ссылка); + + Если ДанныеФайла.Редактирует.Пустая() Тогда + СменитьАктивнуюВерсиюФайла(ТекущиеДанные.Ссылка); + ЗаполнитьДеревоВерсий(); + Оповестить("АктивнаяВерсияИзменена", Параметры.Файл); + Иначе + Предупреждение(НСтр("ru = 'Смена активной версии разрешена только для не занятых файлов!'")); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ОбойтиВсеУзлыДерева(Элементы, ТекущаяВерсия) + + Для Каждого Версия Из Элементы Цикл + + Если Версия.Ссылка = ТекущаяВерсия Тогда + Идентификатор = Версия.ПолучитьИдентификатор(); + Возврат Идентификатор; + КонецЕсли; + + КодВозврата = ОбойтиВсеУзлыДерева(Версия.ПолучитьЭлементы(), ТекущаяВерсия); + Если КодВозврата <> -1 Тогда + Возврат КодВозврата; + КонецЕсли; + КонецЦикла; + + Возврат -1; +КонецФункции + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ЗаконченоРедактирование" Или ИмяСобытия = "ВерсияСохранена" Тогда + Если Параметры.Файл = Параметр Тогда + + ТекущаяВерсия = Элементы.Список.ТекущиеДанные.Ссылка; + ЗаполнитьДеревоВерсий(); + + КодВозврата = ОбойтиВсеУзлыДерева(ДеревоВерсий.ПолучитьЭлементы(), ТекущаяВерсия); + Если КодВозврата <> -1 Тогда + Элементы.Список.ТекущаяСтрока = КодВозврата; + КонецЕсли; + + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + РаботаСФайламиКлиент.ОткрытьВерсиюФайла( + РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(Неопределено, ТекущиеДанные.Ссылка, УникальныйИдентификатор), + УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКарточку(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные <> Неопределено Тогда + + Версия = ТекущиеДанные.Ссылка; + + ПараметрыОткрытияФормы = Новый Структура("Ключ", Версия); + ОткрытьФорму("Справочник.ВерсииФайлов.ФормаОбъекта", ПараметрыОткрытияФормы); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередУдалением(Элемент, Отказ) + + Отказ = Истина; + ПометитьНаУдалениеСнятьПометку(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПометитьНаУдаление(Команда) + + ПометитьНаУдалениеСнятьПометку(); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломИзменения(Элемент, Отказ) + + Отказ = Истина; + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные <> Неопределено Тогда + + Версия = ТекущиеДанные.Ссылка; + + ПараметрыОткрытияФормы = Новый Структура("Ключ", Версия); + ОткрытьФорму("Справочник.ВерсииФайлов.ФормаОбъекта", ПараметрыОткрытияФормы); + + КонецЕсли; + +КонецПроцедуры + + +// Функция преобразует Windows имя файла в URL OpenOffice +Функция ПреобразоватьВURL(ИмяФайла) + Возврат "file:///" + СтрЗаменить(ИмяФайла, "\", "/"); +КонецФункции + +// создание структуры для параметров OpenOffice +&НаКлиенте +Функция ПрисвоитьЗначениеСвойству(Объект, ИмяСвойства, ЗначениеСвойства) + Свойства = Объект.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); + Свойства.Name = ИмяСвойства; + Свойства.Value = ЗначениеСвойства; + + Возврат Свойства; +КонецФункции + +// Сравнить 2 выбранные версии. +&НаКлиенте +Процедура Сравнить(Команда) + Перем Ссылка1; + Перем Ссылка2; + + ЧислоВыделенныхСтрок = Элементы.Список.ВыделенныеСтроки.Количество(); + + Если ЧислоВыделенныхСтрок = 2 ИЛИ ЧислоВыделенныхСтрок = 1 Тогда + + #Если НЕ ВебКлиент Тогда + + Если ЧислоВыделенныхСтрок = 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"; + КонецЕсли; + + Если СпособСравненияВерсийФайлов = Неопределено Тогда + СпособСравненияВерсийФайлов = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().СпособСравненияВерсийФайлов; + КонецЕсли; + + Если СпособСравненияВерсийФайлов = Неопределено Тогда // первый вызов - еще не инициализирована настройка + Результат = ОткрытьФормуМодально("Справочник.ВерсииФайлов.Форма.ФормаВыбораСпособаСравненияВерсий"); + + Если Результат <> КодВозвратаДиалога.ОК Тогда + Возврат; + КонецЕсли; + + СпособСравненияВерсийФайлов = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().СпособСравненияВерсийФайлов; + КонецЕсли; + + Если СпособСравненияВерсийФайлов = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла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; + КонецЕсли; + + Попытка + + Если СпособСравненияВерсийФайлов = "MicrosoftOfficeWord" Тогда + ОбъектWord = Новый COMОбъект("Word.Application"); + ОбъектWord.Visible = 0; + + Документ = ОбъектWord.Documents.Open(ПутьКФайлу1); + + Документ.Merge(ПутьКФайлу2, 0, 0, 0); // MergeTarget:=wdMergeTargetSelected, DetectFormatChanges:=False, UseFormattingFrom:=wdFormattingFromCurrent + + ОбъектWord.Visible = 1; + ОбъектWord.Activate(); + + Документ.Close(); + ИначеЕсли СпособСравненияВерсийФайлов = "OpenOfficeOrgWriter" Тогда + + // снимем readonly - иначе не сработает + Файл1 = Новый Файл(ПутьКФайлу1); + Файл1.УстановитьТолькоЧтение(Ложь); + + Файл2 = Новый Файл(ПутьКФайлу2); + Файл2.УстановитьТолькоЧтение(Ложь); + + // Открыть OpenOffice + ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager"); + Reflection = ServiceManager.createInstance("com.sun.star.reflection.CoreReflection"); + Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop"); + Dispatcher = ServiceManager.createInstance("com.sun.star.frame.DispatchHelper"); + + // Открыть документ OpenOffice + Args = Новый COMSafeArray("VT_DISPATCH", 1); + OOДокумент = Desktop.loadComponentFromURL(ПреобразоватьВURL(ПутьКФайлу2), "_blank", 0, Args); + + frame = Desktop.getCurrentFrame(); + + // установить показ изменений + ПараметрыСравнения = Новый COMSafeArray("VT_VARIANT", 1); + ПараметрыСравнения.SetValue(0, ПрисвоитьЗначениеСвойству(ServiceManager, "ShowTrackedChanges", Истина)); + dispatcher.executeDispatch(frame, ".uno:ShowTrackedChanges", "", 0, ПараметрыСравнения); + + // сравнить с документом + ПараметрыВызова = Новый COMSafeArray("VT_VARIANT", 1); + ПараметрыВызова.SetValue(0, ПрисвоитьЗначениеСвойству(ServiceManager, "URL", ПреобразоватьВURL(ПутьКФайлу1))); + dispatcher.executeDispatch(frame, ".uno:CompareDocuments", "", 0, ПараметрыВызова); + + OOДокумент = Неопределено; + КонецЕсли; + + Исключение + Информация = ИнформацияОбОшибке(); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Информация.Описание); + КонецПопытки; + + КонецЕсли; + + Состояние(); + #Иначе + Предупреждение(НСтр("ru = 'Сравнение версий в веб-клиенте не поддерживается!'")); + #КонецЕсли + + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура СписокПриАктивизацииСтроки(Элемент) + ЧислоВыделенныхСтрок = Элементы.Список.ВыделенныеСтроки.Количество(); + + КомандаСравненияДоступна = Ложь; + + Если ЧислоВыделенныхСтрок = 2 Тогда + КомандаСравненияДоступна = Истина; + ИначеЕсли ЧислоВыделенныхСтрок = 1 Тогда + + Если Не Элементы.Список.ТекущиеДанные.РодительскаяВерсия.Пустая() Тогда + КомандаСравненияДоступна = Истина; + Иначе + КомандаСравненияДоступна = Ложь; + КонецЕсли; + + Иначе + КомандаСравненияДоступна = Ложь; + КонецЕсли; + + + Если КомандаСравненияДоступна = Истина Тогда + Элементы.ОсновнаяКоманднаяПанель.ПодчиненныеЭлементы.Сравнить.Доступность = Истина; + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокСравнить.Доступность = Истина; + Иначе + Элементы.ОсновнаяКоманднаяПанель.ПодчиненныеЭлементы.Сравнить.Доступность = Ложь; + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокСравнить.Доступность = Ложь; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВерсию(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиКлиент.ОткрытьВерсиюФайла( + РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(Неопределено, ТекущиеДанные.Ссылка, УникальныйИдентификатор), + УникальныйИдентификатор); + +КонецПроцедуры + + diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..a0e085cc2 --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,1198 @@ + + + + ОсновнаяКоманднаяПанель + 1 + + Открыть + 26 + true + true + + true + + false + + ОткрытьРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + Form.Command.Открыть + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + CommandBar + + Left + Form + + + + Владелец + 6 + true + true + + true + + + Объект.Owner + + + ВладелецРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ВладелецКонтекстноеМеню + 7 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + НаименованиеКод + 31 + + ПолноеНаименование + 29 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Объект.ПолноеНаименование + + + OnChange + ПолноеНаименованиеПриИзменении + + + ПолноеНаименованиеРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ПолноеНаименованиеКонтекстноеМеню + 30 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Код + 2 + true + true + + true + + + Объект.Code + + + КодРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 3 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + ru + Наименование код + + + НаименованиеКодРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + РодительскаяВерсия + 33 + true + true + + true + + + Объект.РодительскаяВерсия + + + РодительскаяВерсияРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + РодительскаяВерсияКонтекстноеМеню + 34 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + + Отбор.Владелец + + Объект.Owner + + + Normal + + + + РасширениеКартинка + 32 + + Размер + 8 + true + true + + true + + + Объект.Размер + + + РазмерРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + РазмерКонтекстноеМеню + 9 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Расширение + 10 + true + true + + true + + + Объект.Расширение + + + РасширениеРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + РасширениеКонтекстноеМеню + 11 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + false + true + true + true + + Style.BorderColor + + Normal + + + + Картинка + 20 + true + true + + true + + + Объект.ИндексКартинки + + None + + КартинкаРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + КартинкаКонтекстноеМеню + 21 + true + + PictureField + Enter + true + Left + true + Left + + 2 + true + 1 + true + + CommonPicture.ПиктограммыФайлов + + + 1 + + + + true + true + + true + + + ru + Расширение картинка + + + РасширениеКартинкаРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Комментарий + 12 + + <key>ru</key> + <value>Комментарий к версии</value> + + true + true + + true + + + Объект.Комментарий + + + КомментарийРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 13 + true + + InputField + Enter + true + Left + true + Left + + true + 2 + true + true + true + true + + Style.BorderColor + + Normal + + + + Автор + 14 + + <key>ru</key> + <value>Автор версии</value> + + true + true + + true + + + Объект.Автор + + + АвторРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 15 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ДатаИНомер + 35 + + ДатаСоздания + 16 + true + true + + true + + + Объект.ДатаСоздания + + + ДатаСозданияРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + ДатаСозданияКонтекстноеМеню + 17 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + НомерВерсии + 36 + true + true + + true + + + Объект.НомерВерсии + + + НомерВерсииРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + НомерВерсииКонтекстноеМеню + 37 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + ru + Дата и номер + + + ДатаИНомерРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаХранение + 38 + + ТипХраненияФайла + 39 + true + true + + true + + + Объект.ТипХраненияФайла + + + ТипХраненияФайлаРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + ТипХраненияФайлаКонтекстноеМеню + 40 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ГруппаТом + 47 + + Том + 41 + true + true + + true + + Role.ДобавлениеИзменениеЗаданий + + + Role.ИзменениеВыполнениеЗадач + + + Role.ЧтениеЗаданий + + + Role.Администрирование + + + Role.БазовыеПрава + + + Role.ВыводНаПринтерФайлБуферОбмена + + + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ИзменениеДополнительныхСведений + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеРолейИсполнителей + + + Role.ДобавлениеИзменениеФизическихЛиц + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИзменениеМакетовПечатныхФорм + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеДополнительныхСведений + + + Role.ЧтениеОтветовНаВопросыАнкет + + + Role.ЧтениеПерсональныхДанныхФизическихЛиц + + + + Объект.Том + + + ТомРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ТомКонтекстноеМеню + 42 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТомПолныйПуть + 45 + + <key>ru</key> + <value>Полный путь тома</value> + + true + true + + true + + Role.ДобавлениеИзменениеЗаданий + + + Role.ИзменениеВыполнениеЗадач + + + Role.ЧтениеЗаданий + + + Role.Администрирование + + + Role.БазовыеПрава + + + Role.ВыводНаПринтерФайлБуферОбмена + + + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ИзменениеДополнительныхСведений + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеРолейИсполнителей + + + Role.ДобавлениеИзменениеФизическихЛиц + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИзменениеМакетовПечатныхФорм + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеДополнительныхСведений + + + Role.ЧтениеОтветовНаВопросыАнкет + + + Role.ЧтениеПерсональныхДанныхФизическихЛиц + + + + ТомПолныйПуть + + + ТомПолныйПутьРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + ТомПолныйПутьКонтекстноеМеню + 46 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа том</value> + + + ru + Группа том + + + ГруппаТомРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + LeftNarrowest + Auto + Auto + + + + ПутьКФайлу + 43 + true + true + + true + + + Объект.ПутьКФайлу + + + ПутьКФайлуРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + ПутьКФайлуКонтекстноеМеню + 44 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + + <key>ru</key> + <value>Группа хранение</value> + + + ru + Группа хранение + + + ГруппаХранениеРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ВерсииФайлов + + + true + + + true + + + Объект.ТекстХранилище + + + Объект.ФайлХранилище + +
true
+ true +
+ + ТомПолныйПуть + + <key>ru</key> + <value>Том полный путь</value> + + 2 + + String + + + + true + + + true + + + + Открыть + + <key>ru</key> + <value>Открыть</value> + + 1 + + ru + Открыть + + + true + + + CommonPicture.КартинкаОткрыть + + + + ОткрытьВыполнить + + + Auto + Auto + + + + + 0 + + + + + + + + AfterWrite + ПослеЗаписи + + +
diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..a50c2cd98 --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,38 @@ + +&НаКлиенте +Процедура ОткрытьВыполнить() + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия( + Неопределено, Объект.Ссылка, УникальныйИдентификатор); + РаботаСФайламиКлиент.ОткрытьВерсиюФайла(ДанныеФайла, УникальныйИдентификатор); +КонецПроцедуры + +&НаКлиенте +Процедура ПолноеНаименованиеПриИзменении(Элемент) + Объект.Наименование = Объект.ПолноеНаименование; +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ТипЗнч(Объект.Владелец) = Тип("СправочникСсылка.Файлы") Тогда + Элементы.ПолноеНаименование.ТолькоПросмотр = Истина; + КонецЕсли; + + Если Пользователи.ЭтоПолноправныйПользовательИБ() Тогда + Элементы.Автор.ТолькоПросмотр = Ложь; + Элементы.ДатаСоздания.ТолькоПросмотр = Ложь; + Элементы.РодительскаяВерсия.ТолькоПросмотр = Ложь; + Иначе + Элементы.ГруппаХранение.Видимость = Ложь; + КонецЕсли; + + ТомПолныйПуть = РаботаСФайлами.ПолныйПутьТома(Объект.Том); + +КонецПроцедуры + + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + Оповестить("ВерсияСохранена", Объект.Владелец); +КонецПроцедуры + diff --git a/SSL/src/Catalogs/ВерсииФайлов/Help/ru.html b/SSL/src/Catalogs/ВерсииФайлов/Help/ru.html new file mode 100644 index 000000000..0006a4080 --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/Help/ru.html @@ -0,0 +1,9 @@ + +

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

+

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

+
  • открыть файл версии соответствующим приложением для просмотра (команда "Открыть карточку"); +
  • удалить ненужные версии (клавиша Del или команда "Пометить текущий элемент на удаление"); +
  • изменить активную (текущую) версию (команда "Сделать активной"); +
  • сравнить две версии (команда "Сравнить"). Сравнение версий поддерживается для файлов HTML, TXT, RTF, DOC, DOCX, ODT.

 

+

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

+

 

\ No newline at end of file diff --git a/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl b/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl new file mode 100644 index 000000000..85e5121ce --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl @@ -0,0 +1,101 @@ + +Перем ЗаписьПодписанногоОбъекта Экспорт; + +Процедура ПередЗаписью(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если ЭтоНовый() Тогда + РодительскаяВерсия = Владелец.ТекущаяВерсия; + КонецЕсли; + + Если НЕ ПривилегированныйРежим() И ЗаписьПодписанногоОбъекта <> Истина Тогда + + Если ЗначениеЗаполнено(Ссылка) Тогда + + СсылкаПодписан = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Ссылка, "Подписан"); + Если Подписан И СсылкаПодписан Тогда + ВызватьИсключение НСтр("ru = 'Подписанную версию нельзя редактировать.'"); + КонецЕсли; + + СсылкаЗашифрован = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Ссылка, "Зашифрован"); + Если Зашифрован И СсылкаЗашифрован И Подписан И НЕ СсылкаПодписан Тогда + ВызватьИсключение НСтр("ru = 'Зашифрованный файл нельзя подписывать.'"); + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + // Выполним установку индекса пиктограммы при записи объекта + ИндексКартинки = РаботаСФайламиКлиентСервер.ПолучитьИндексПиктограммыФайла(Расширение); + + Если СтатусИзвлеченияТекста.Пустая() Тогда + СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; + КонецЕсли; + + Если ТипЗнч(Владелец) = Тип("СправочникСсылка.Файлы") Тогда + Наименование = СокрЛП(ПолноеНаименование); + КонецЕсли; + + Если Владелец.ТекущаяВерсия = Ссылка Тогда + Если ПометкаУдаления = Истина И Владелец.ПометкаУдаления <> Истина Тогда + Отказ = Истина; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Активную версию нельзя удалить!'")); + КонецЕсли; + ИначеЕсли РодительскаяВерсия.Пустая() Тогда + Если ПометкаУдаления = Истина И Владелец.ПометкаУдаления <> Истина Тогда + Отказ = Истина; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Первую версию нельзя удалить!'")); + КонецЕсли; + ИначеЕсли ПометкаУдаления = Истина И Владелец.ПометкаУдаления <> Истина Тогда + // Очищаем у версий, дочерних к помеченной, ссылку на родительскую - + // переставляем на родительскую версию удаляемой версии + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ВерсииФайлов.Ссылка КАК Ссылка + |ИЗ + | Справочник.ВерсииФайлов КАК ВерсииФайлов + |ГДЕ + | ВерсииФайлов.РодительскаяВерсия = &РодительскаяВерсия"; + + Запрос.УстановитьПараметр("РодительскаяВерсия", Ссылка); + + Результат = Запрос.Выполнить(); + + Если Не Результат.Пустой() Тогда + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + + Объект = Выборка.Ссылка.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка); + Объект.РодительскаяВерсия = РодительскаяВерсия; + Объект.Записать(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Процедура ПередУдалением(Отказ) + Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + Если НЕ Том.Пустая() Тогда + ПолныйПуть = РаботаСФайлами.ПолныйПутьТома(Том) + ПутьКФайлу; + Попытка + Файл = Новый Файл(ПолныйПуть); + Файл.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ПолныйПуть); + + ПутьСПодкаталогом = Файл.Путь; + МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*.*"); + Если МассивФайловВКаталоге.Количество() = 0 Тогда + УдалитьФайлы(ПутьСПодкаталогом); + КонецЕсли; + + Исключение + КонецПопытки; + КонецЕсли; + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo b/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo new file mode 100644 index 000000000..709abc1f5 --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo @@ -0,0 +1,655 @@ + + + + + + + + + + ВерсииФайлов + + ru + Версии файлов + + Catalog.ВерсииФайлов.StandardAttribute.Code + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ru + Краткое наименование + + + ShowError + Use + + + + + Use + Code + + + + Use + + + + Use + true + + + ru + + + Managed + Use + + ru + Версия файла + + 2 + true + Catalog.Файлы + 9 + 150 + String + Variable + WithinOwnerSubordination + true + true + InDialog + BothWays + Catalog.ВерсииФайлов.Form.ФормаЭлемента + Catalog.ВерсииФайлов.Form.ФормаСписка + Catalog.ВерсииФайлов.Form.ФормаВыбора + + Автор + + ru + Автор + + Автор - пользователь, создавший версию + + CatalogRef.Пользователи + + + + DontUse + Use + + Catalog.Пользователи.EmptyRef + + Use + Use + + + ДатаМодификацииУниверсальная + + ru + Дата модификации универсальная + + Дата модификации файла - приведенная к Гринвичу (очищенная от смещения летнего времени и смещения зоны) + + Date + + + + + + 0001-01-01T00:00:00 + + Use + Use + + + ДатаСоздания + + ru + Дата создания + + Дата создания версии + + Date + + + + + + 0001-01-01T00:00:00 + + Index + Use + Use + + + Зашифрован + + ru + Зашифрован + + Зашифрован + + Boolean + + + + + Index + Use + Use + + + ИндексКартинки + + ru + Индекс картинки + + Индекс иконки, соответствующей расширению файла, для показа в списке + + Number + + 10 + + + + + + 0 + + Use + + + Комментарий + + ru + Комментарий + + Комментарий к версии + + String + + + true + + + + Use + Use + + + НомерВерсии + + ru + Номер версии + + + Number + + 5 + + + + + + Use + Use + + + Подписан + + ru + Подписан + + Подписан ЭЦП + + Boolean + + + + + Use + Use + + + ПолноеНаименование + + ru + Полное наименование + + Полное наименование (длиной до 256 символов) + + String + + 256 + + + + + + + + Index + Use + Use + + + ПутьКФайлу + + ru + Путь к файлу + + Дополнительный путь к файлу на диске (в случае если ТипХраненияФайла - на диске) + + String + + + + + + Use + Use + + + Размер + + ru + Размер + + Размер файла версии + + Number + + 10 + + + + + + 0 + + Index + Use + Use + + + Расширение + + ru + Расширение + + Расширение файла версии + + String + + 10 + + + + + + Index + Use + Use + + + РодительскаяВерсия + + ru + Родительская версия + + Родительская версия для данной версии - возможна древесная структура версий + + CatalogRef.ВерсииФайлов + + + + + Catalog.ВерсииФайлов.EmptyRef + + Index + Use + Use + + + СтатусИзвлеченияТекста + + ru + Статус извлечения текста + + Статус извлечения текста - для фонового задания извлечения текста + + EnumRef.СтатусыИзвлеченияТекстаФайлов + + + + + Enum.СтатусыИзвлеченияТекстаФайлов.EmptyRef + + Index + Use + Use + + + ТекстХранилище + + ru + Текст + + Текст, извлеченный из файла - для полнотекстового поиска + + ValueStorage + + + + + Use + Use + + + ТипХраненияФайла + + ru + Тип хранения файла + + Где хранятся файлы - в базе как ХранилищеЗначения или в каталоге на диске + + EnumRef.ТипыХраненияФайлов + + + + + Use + Use + + + Том + + ru + Том + + Ссылка на том (в случае если ТипХраненияФайла - на диске) + + CatalogRef.ТомаХраненияФайлов + + + + + Index + Use + Use + + + ФайлХранилище + + ru + Файл + + Файл версии + + ValueStorage + + + + + Use + + + + + + + ЭлектронноЦифровыеПодписи + + ru + ЭЦП + + + Use + LineNumber + + Use + + + + + ВерсияАлгоритмаГенерацииФайла + + ru + Версия алгоритма генерации файла + + + Number + + 5 + + + + + Use + Use + + + ДатаПодписи + + ru + Дата подписи + + + Date + + + + + Use + Use + + + ИмяФайлаПодписи + + ru + Имя файла подписи + + + String + + + + + Use + Use + + + Комментарий + + ru + Комментарий + + + String + + + + + Use + Use + + + КомуВыданСертификат + + ru + Кому выдан сертификат + + + String + + + + + Use + Use + + + Отпечаток + + ru + Отпечаток + + + String + + 255 + + + + + Use + + + Подпись + + ru + Подпись + + + ValueStorage + + + + Use + Use + + + УстановившийПодпись + + ru + Установивший подпись + + + CatalogRef.Пользователи + + + + Use + Use + + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаВыбора + + ru + Форма выбора + + PersonalComputer + MobileDevice + + + ФормаВыбораСпособаСравненияВерсий + + ru + Форма выбора способа сравнения версий + + PersonalComputer + MobileDevice + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + + ФормаСпискаВерсийФайла + + ru + Форма списка версий файла + + PersonalComputer + MobileDevice + + + ОткрытьВерсииФайла + + ru + Версии файла + + FormNavigationPanelGoTo + + CatalogRef.Файлы + + Auto + + diff --git a/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..c9dc36b4d --- /dev/null +++ b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаСписка/Form.form @@ -0,0 +1,226 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 4 + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 7 + + СписокСтрокаПоискаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 8 + true + + Список + + true + + + + СписокСостояниеПросмотра + 10 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 11 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 13 + + СписокУправлениеПоискомРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 14 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + 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 + +
+ + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.ВидыДокументовФизическихЛиц + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..6920fee53 --- /dev/null +++ b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,80 @@ + + + + Наименование + 1 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 2 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ВидыДокументовФизическихЛиц + + + true + + + true + +
true
+ true +
+ + + + + +
diff --git a/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Help/ru.html b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Help/ru.html new file mode 100644 index 000000000..f925a16ba --- /dev/null +++ b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Help/ru.html @@ -0,0 +1,9 @@ + +

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

+

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

+

 

+

См. также:

+ \ 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..819a8e8ef --- /dev/null +++ b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/ManagerModule.bsl @@ -0,0 +1,4 @@ + +Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) + Параметры.Отбор.Вставить("ПометкаУдаления",Ложь); +КонецПроцедуры diff --git a/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/ВидыДокументовФизическихЛиц.mdo b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/ВидыДокументовФизическихЛиц.mdo new file mode 100644 index 000000000..5cc3213ec --- /dev/null +++ b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/ВидыДокументовФизическихЛиц.mdo @@ -0,0 +1,151 @@ + + + + + + + + + + ВидыДокументовФизическихЛиц + + ru + Виды документов физических лиц + + true + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + DontUse + true + + + ru + + + Managed + Use + + ru + Вид документа физических лиц + + 2 + true + 150 + String + AsDescription + + + ВодительскоеУдостоверение + Водительское удостоверение + + + + + + ПаспортРФ + Паспорт гражданина РФ + + + + + + InDialog + true + BothWays + Catalog.ВидыДокументовФизическихЛиц.Form.ФормаЭлемента + Catalog.ВидыДокументовФизическихЛиц.Form.ФормаСписка + + ФормаЭлемента + + 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 new file mode 100644 index 000000000..784796455 --- /dev/null +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,20 @@ + + + + + ЭтоГруппа + Equal + true + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Form.form b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Form.form new file mode 100644 index 000000000..15abae079 --- /dev/null +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Form.form @@ -0,0 +1,241 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + Copy + Create + CreateFolder + MoveItem + + Наименование + 4 + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 7 + + СписокСтрокаПоискаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 8 + true + + Список + + true + + + + СписокСостояниеПросмотра + 10 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 11 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 13 + + СписокУправлениеПоискомРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 14 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + Tree + true + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + Auto + Auto + ExpandTopLevel + true + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + Folders + + true + true + true + + + + ФормаКоманднаяПанель + -1 + Left + true + + Copy + Create + CreateFolder + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.ВидыКонтактнойИнформации + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаГруппы/Form.form b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаГруппы/Form.form new file mode 100644 index 000000000..e38db64d0 --- /dev/null +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаГруппы/Form.form @@ -0,0 +1,89 @@ + + + + Наименование + 1 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 2 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + Copy + Delete + Reread + SetDeletionMark + Write + WriteAndClose + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ВидыКонтактнойИнформации + + + true + + + true + +
true
+ true +
+ + + + + + Folders + +
diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..47e7d6fec --- /dev/null +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,19 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + РеквизитДопУпорядочивания + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..594391d3f --- /dev/null +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Form.form @@ -0,0 +1,431 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + CreateFolder + MoveItem + + НомерКартинки + 28 + true + true + + true + + + Список.НомерКартинки + + None + + НомерКартинкиРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + НомерКартинкиКонтекстноеМеню + 29 + true + + PictureField + Enter + true + Left + true + + 2 + true + 1 + true + true + true + + CommonPicture.КонтактнаяИнформация + + + 1 + + + + + Ссылка + 30 + + <key>ru</key> + <value>Вид контактной информации</value> + + true + true + + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 31 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + BeforeAddRow + СписокПередНачаломДобавления + + + СписокСтрокаПоиска + 35 + + СписокСтрокаПоискаРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 36 + true + + Список + + true + + + + СписокСостояниеПросмотра + 38 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 39 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 41 + + СписокУправлениеПоискомРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 42 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + Tree + true + true + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandAllLevels + true + true + + Список.DefaultPicture + + + Style.BorderColor + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
+ Top + true + + ФормаКоманднаяПанель + -1 + + ПереместитьВверх + 17 + true + true + + true + + false + + ПереместитьВверхРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.Command.ПереместитьЭлементВверх + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + Auto + + + ПереместитьВниз + 18 + true + true + + true + + false + + ПереместитьВнизРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.Command.ПереместитьЭлементВниз + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + Auto + + Left + true + + CreateFolder + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.РеквизитДопУпорядочивания + +
true
+ + ВЫБРАТЬ + ВЫБОР + КОГДА СправочникВидыКонтактнойИнформации.ЭтоГруппа + ТОГДА 0 + ИНАЧЕ СправочникВидыКонтактнойИнформации.Тип.Порядок + 2 + КОНЕЦ КАК НомерКартинки, + СправочникВидыКонтактнойИнформации.Ссылка, + СправочникВидыКонтактнойИнформации.ПометкаУдаления, + СправочникВидыКонтактнойИнформации.Предопределенный, + СправочникВидыКонтактнойИнформации.Родитель, + СправочникВидыКонтактнойИнформации.ЭтоГруппа, + СправочникВидыКонтактнойИнформации.Наименование, + СправочникВидыКонтактнойИнформации.Тип, + СправочникВидыКонтактнойИнформации.РеквизитДопУпорядочивания, + СправочникВидыКонтактнойИнформации.РедактированиеТолькоВДиалоге, + СправочникВидыКонтактнойИнформации.МожноИзменятьСпособРедактирования, + СправочникВидыКонтактнойИнформации.АдресТолькоРоссийский +ИЗ + Справочник.ВидыКонтактнойИнформации КАК СправочникВидыКонтактнойИнформации + Catalog.ВидыКонтактнойИнформации + true + true + true + true + true + +
+ + ПереместитьЭлементВверх + + <key>ru</key> + <value>Переместить элемент вверх</value> + + 2 + + ru + Переместить элемент вверх + + + true + + + StdPicture.MoveUp + + + + ПереместитьЭлементВверхВыполнить + + + Auto + Auto + + + ПереместитьЭлементВниз + + <key>ru</key> + <value>Переместить элемент вниз</value> + + 3 + + ru + Переместить элемент вниз + + + true + + + StdPicture.MoveDown + + + + ПереместитьЭлементВнизВыполнить + + + Auto + Auto + + + + + + +
diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..af8e324f2 --- /dev/null +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,31 @@ + +&НаКлиенте +Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + // Проверим, выполняется ли копирование группы + Если Копирование И Группа Тогда + Предупреждение(НСтр("ru = 'Добавление новых групп в справочнике запрещено!'")); + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ПОДСИСТЕМЫ НАСТРОЙКИ ПОРЯДКА ЭЛЕМЕНТОВ + +&НаКлиенте +Процедура ПереместитьЭлементВверхВыполнить() + + НастройкаПорядкаЭлементовКлиент.ПереместитьЭлементВверхВыполнить(Список, Элементы.Список); + +КонецПроцедуры + +&НаКлиенте +Процедура ПереместитьЭлементВнизВыполнить() + + НастройкаПорядкаЭлементовКлиент.ПереместитьЭлементВнизВыполнить(Список, Элементы.Список); + +КонецПроцедуры + + diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..d5f8280e6 --- /dev/null +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,305 @@ + + + + Родитель + 11 + true + true + + true + + + Объект.Parent + + + РодительРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + РодительКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Наименование + 1 + true + true + + true + + + Объект.Description + + true + + НаименованиеРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Тип + 3 + + <key>ru</key> + <value>Тип информации</value> + + true + true + + true + + + Объект.Тип + + + OnChange + ТипПриИзменении + + + ТипРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ТипКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + РедактированиеТолькоВДиалоге + 9 + true + true + + true + + + Объект.РедактированиеТолькоВДиалоге + + Right + + OnChange + РедактированиеТолькоВДиалогеПриИзменении + + + РедактированиеТолькоВДиалогеРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + РедактированиеТолькоВДиалогеКонтекстноеМеню + 10 + true + + CheckBoxField + Enter + true + Left + true + + + + АдресТолькоРоссийский + 13 + true + true + + true + + + Объект.АдресТолькоРоссийский + + Right + + АдресТолькоРоссийскийРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + АдресТолькоРоссийскийКонтекстноеМеню + 14 + true + + CheckBoxField + Enter + true + Left + true + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ВидыКонтактнойИнформации + + + true + + + true + +
true
+ true +
+ + ТипКИАдрес + + <key>ru</key> + <value>Тип КИАдрес</value> + + 2 + + EnumRef.ТипыКонтактнойИнформации + + + true + + + true + + + + ТипКИТелефон + + <key>ru</key> + <value>Тип КИТелефон</value> + + 3 + + EnumRef.ТипыКонтактнойИнформации + + + true + + + true + + + + ТипКИФакс + + <key>ru</key> + <value>Тип КИФакс</value> + + 4 + + EnumRef.ТипыКонтактнойИнформации + + + true + + + true + + + + + + + + + AfterWrite + ПослеЗаписи + + +
diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..506bf66b7 --- /dev/null +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,92 @@ +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ТипКИАдрес = Перечисления.ТипыКонтактнойИнформации.Адрес; + ТипКИТелефон = Перечисления.ТипыКонтактнойИнформации.Телефон; + ТипКИФакс = Перечисления.ТипыКонтактнойИнформации.Факс; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ПроверитьЭлементыФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи() + + ПроверитьЭлементыФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура ТипПриИзменении(Элемент) + + ПроверитьЭлементыФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура РедактированиеТолькоВДиалогеПриИзменении(Элемент) + + ПроверитьЭлементыФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьЭлементыФормы() + + ЭтоНовый = Не ЗначениеЗаполнено(Объект.Ссылка); + + Если ЭтоНовый Тогда + // для новых видов КИ установим признак "Можно изменять способ редактирования" + Объект.МожноИзменятьСпособРедактирования = Истина; + + Иначе + // для уже записанных запретим редактировать группу и тип + Элементы.Родитель.ТолькоПросмотр = Истина; + Элементы.Тип.ТолькоПросмотр = Истина; + + // для предопределенных запретим и наименование редактировать + Если Объект.Предопределенный Тогда + Элементы.Наименование.ТолькоПросмотр = Истина; + КонецЕсли; + + КонецЕсли; + + Если Не Объект.МожноИзменятьСпособРедактирования Тогда + // Если у объекта нельзя менять способ редактирования, то сделаем недоступными оставшиеся элементы + Элементы.РедактированиеТолькоВДиалоге.Доступность = Ложь; + Элементы.АдресТолькоРоссийский.Доступность = Ложь; + Возврат; + + КонецЕсли; + + ЭтоАдрес = (Объект.Тип = ТипКИАдрес); + ЭтоТелефон = (Объект.Тип = ТипКИТелефон); + ЭтоФакс = (Объект.Тип = ТипКИФакс); + + // Установим доступность и проверим значение поля РедактированиеТолькоВДиалоге + Если ЭтоАдрес ИЛИ ЭтоТелефон ИЛИ ЭтоФакс Тогда + Элементы.РедактированиеТолькоВДиалоге.Доступность = Истина; + Иначе + Элементы.РедактированиеТолькоВДиалоге.Доступность = Ложь; + Если Объект.РедактированиеТолькоВДиалоге Тогда + Объект.РедактированиеТолькоВДиалоге = Ложь; + КонецЕсли; + КонецЕсли; + + // Установим доступность и проверим значение поля РедактированиеТолькоВДиалоге + Если ЭтоАдрес И Объект.РедактированиеТолькоВДиалоге Тогда + Элементы.АдресТолькоРоссийский.Доступность = Истина; + Иначе + Элементы.АдресТолькоРоссийский.Доступность = Ложь; + Если Объект.АдресТолькоРоссийский Тогда + Объект.АдресТолькоРоссийский = Ложь; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ObjectModule.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo new file mode 100644 index 000000000..240dc67e4 --- /dev/null +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo @@ -0,0 +1,324 @@ + + + + + + + + + + ВидыКонтактнойИнформации + + ru + Виды контактной информации + + true + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + + ru + Группа + + + ru + Группа вида контактной информации + + true + + Catalog.ВидыКонтактнойИнформации.EmptyRef + + Use + + + + + Use + Description + + ru + Наименование вида контактной информации + + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + Managed + Use + + ru + Вид контактной информации + + true + true + 2 + true + 100 + String + AsDescription + + + СправочникОрганизации + Контактная информация справочника "Организации" + + + + true + + EmailОрганизации + Email + + + + + + ДругаяИнформацияОрганизации + Другое + + + + + + ПочтовыйАдресОрганизации + Почтовый адрес + + + + + + ТелефонОрганизации + Телефон + + + + + + ФаксОрганизации + Факс + + + + + + ФактАдресОрганизации + Фактический адрес + + + + + + ЮрАдресОрганизации + Юридический адрес + + + + + + + СправочникПользователи + Контактная информация справочника "Пользователи" + + + + true + + EmailПользователя + Email + + + + + + + BothWays + Catalog.ВидыКонтактнойИнформации.Form.ФормаЭлемента + Catalog.ВидыКонтактнойИнформации.Form.ФормаГруппы + Catalog.ВидыКонтактнойИнформации.Form.ФормаСписка + Catalog.ВидыКонтактнойИнформации.Form.ФормаВыбораГруппы + + Тип + + ru + Тип + + + EnumRef.ТипыКонтактнойИнформации + + + ru + Тип контактной информации (адрес, телефон и т.д.) + + + + ShowError + + Enum.ТипыКонтактнойИнформации.EmptyRef + + Use + Use + + + РеквизитДопУпорядочивания + + ru + Порядок + + + Number + + 5 + + + + + + 0 + + IndexWithAdditionalOrder + Use + + + РедактированиеТолькоВДиалоге + + ru + Редактирование только в диалоге + + + Boolean + + + + + Use + Use + + + МожноИзменятьСпособРедактирования + + ru + Можно изменять способ редактирования + + + Boolean + + + + + Use + Use + + + АдресТолькоРоссийский + + ru + Адрес только российский + + + Boolean + + + + + Use + Use + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаЭлемента + + ru + Форма элемента + + 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 new file mode 100644 index 000000000..342de596b --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Attributes/ВнешниеПользователиСписок/ExtInfo/ListSettings.dcss @@ -0,0 +1,25 @@ + + + + + false + ПометкаУдаления + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + Наименование + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Attributes/ГруппыВнешнихПользователей/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Attributes/ГруппыВнешнихПользователей/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..31e6269dc --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Attributes/ГруппыВнешнихПользователей/ExtInfo/ListSettings.dcss @@ -0,0 +1,23 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + Предопределенный + Desc + + + Наименование + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..b7531e8ca --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Form.form @@ -0,0 +1,1058 @@ + + + + Группа + 24 + + ГруппыВнешнихПользователей + 25 + true + true + + true + + + ГруппыВнешнихПользователей + + false + None + CopyToClipboard + Delete + OutputList + + НаименованиеГруппы + 30 + true + true + + true + + + ГруппыВнешнихПользователей.Description + + + НаименованиеГруппыРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + НаименованиеГруппыКонтекстноеМеню + 31 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + ГруппыВнешнихПользователейКоманднаяПанель + 27 + Left + true + + + ValueChoice + ГруппыВнешнихПользователейВыборЗначения + + + BeforeAddRow + ГруппыВнешнихПользователейПередНачаломДобавления + + + OnActivateRow + ГруппыВнешнихПользователейПриАктивизацииСтроки + + + ГруппыВнешнихПользователейСтрокаПоиска + 81 + + ГруппыВнешнихПользователейСтрокаПоискаРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + ГруппыВнешнихПользователейСтрокаПоискаКонтекстноеМеню + 82 + true + + ГруппыВнешнихПользователей + + true + + + + ГруппыВнешнихПользователейСостояниеПросмотра + 84 + + ГруппыВнешнихПользователейСостояниеПросмотраРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + ГруппыВнешнихПользователейСостояниеПросмотраКонтекстноеМеню + 85 + true + + ViewStatusAddition + ГруппыВнешнихПользователей + + true + + + + ГруппыВнешнихПользователейУправлениеПоиском + 87 + + ГруппыВнешнихПользователейУправлениеПоискомРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + ГруппыВнешнихПользователейУправлениеПоискомКонтекстноеМеню + 88 + true + + SearchControlAddition + ГруппыВнешнихПользователей + + true + + + + ГруппыВнешнихПользователейРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + ГруппыВнешнихПользователейКонтекстноеМеню + 26 + true + + Tree + true + true + true + true + true + Row + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + true + + ГруппыВнешнихПользователей.НомерКартинки + + + CommonPicture.ПиктограммыПользователя + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + + + + ВнешниеПользователиСписок + 48 + true + true + + true + + + ВнешниеПользователиСписок + + false + None + CopyToClipboard + Delete + OutputList + + Наименование + 51 + + <key>ru</key> + <value>Внешний пользователь</value> + + true + true + + true + + + ВнешниеПользователиСписок.Description + + + НаименованиеРасширеннаяПодсказка + 110 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 52 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + ВнешниеПользователиСписокКоманднаяПанель + 50 + Left + true + + + ValueChoice + ВнешниеПользователиСписокВыборЗначения + + + BeforeAddRow + ВнешниеПользователиСписокПередНачаломДобавления + + + ВнешниеПользователиСписокСтрокаПоиска + 101 + + ВнешниеПользователиСписокСтрокаПоискаРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + + ВнешниеПользователиСписокСтрокаПоискаКонтекстноеМеню + 102 + true + + ВнешниеПользователиСписок + + true + + + + ВнешниеПользователиСписокСостояниеПросмотра + 104 + + ВнешниеПользователиСписокСостояниеПросмотраРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + + ВнешниеПользователиСписокСостояниеПросмотраКонтекстноеМеню + 105 + true + + ViewStatusAddition + ВнешниеПользователиСписок + + true + + + + ВнешниеПользователиСписокУправлениеПоиском + 107 + + ВнешниеПользователиСписокУправлениеПоискомРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + ВнешниеПользователиСписокУправлениеПоискомКонтекстноеМеню + 108 + true + + SearchControlAddition + ВнешниеПользователиСписок + + true + + + + ВнешниеПользователиСписокРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + + ВнешниеПользователиСписокКонтекстноеМеню + 49 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + ВнешниеПользователиСписок.НомерКартинки + + + CommonPicture.ПиктограммыПользователя + + 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 + Группа + + + ГруппаРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + LeftNarrowest + Auto + Auto + + + + ГруппаПоказыватьВнешнихПользователейДочернихГрупп + 58 + + ГруппаНельзяУстановитьСвойство + 60 + + ОписаниеОтображаемыхВнешнихПользователей + 71 + true + true + + true + + + ОписаниеОтображаемыхВнешнихПользователей + + None + + ОписаниеОтображаемыхВнешнихПользователейРасширеннаяПодсказка + 122 + Label + true + true + + Left + + + + ОписаниеОтображаемыхВнешнихПользователейКонтекстноеМеню + 72 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Группа нельзя установить свойство</value> + + + ГруппаНельзяУстановитьСвойствоРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ГруппаУстановитьСвойство + 59 + + ВыбиратьИерархически + 56 + true + true + + true + + + ВыбиратьИерархически + + Right + + OnChange + ВыбиратьИерархическиПриИзменении + + + ВыбиратьИерархическиРасширеннаяПодсказка + 125 + Label + true + true + + Left + + + + ВыбиратьИерархическиКонтекстноеМеню + 57 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Группа установить свойство</value> + + + ГруппаУстановитьСвойствоРасширеннаяПодсказка + 124 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Группа показывать внешних пользователей дочерних групп</value> + + + ru + Группа показывать внешних пользователей дочерних групп + + + ГруппаПоказыватьВнешнихПользователейДочернихГруппРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + Pages + + Auto + + + + ФормаКоманднаяПанель + -1 + + ВыбратьГруппуВнешнихПользователей + 67 + + <key>ru</key> + <value>Выбрать группу</value> + + true + true + + true + + false + + ВыбратьГруппуВнешнихПользователейРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Form.Item.ГруппыВнешнихПользователей.StandardCommand.Choose + Normal + PictureAndText + true + true + UserCmds + + StdPicture.ChooseValue + + Auto + + + ВыбратьВнешнегоПользователя + 68 + true + true + + true + + false + + ВыбратьВнешнегоПользователяРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + Form.Item.ВнешниеПользователиСписок.StandardCommand.Choose + Normal + Auto + true + true + UserCmds + Auto + + + СоздатьВнешнегоПользователя + 54 + true + true + + true + + false + + СоздатьВнешнегоПользователяРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + Form.Item.ВнешниеПользователиСписок.StandardCommand.Create + Normal + Auto + true + true + UserCmds + Auto + + + СоздатьГруппуВнешнихПользователей + 55 + true + true + + true + + false + + СоздатьГруппуВнешнихПользователейРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + Form.Command.СоздатьГруппуВнешнихПользователей + Normal + Auto + true + true + UserCmds + Auto + + + КоманднаяПанельВнешниеПользователи + 53 + + ПользователиИБ + 6 + true + true + + true + + false + + ПользователиИБРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + Catalog.Пользователи.Command.ПользователиИБ + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель внешние пользователи</value> + + + ru + Командная панель внешние пользователи + + + КоманднаяПанельВнешниеПользователиРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + + Form + + + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + Create + 90 + DontBlock + Use + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ВнешниеПользователиСписок + + <key>ru</key> + <value>Внешние пользователи список</value> + + 1 + + DynamicList + + + true + + + true + +
true
+ + ВЫБРАТЬ + ВнешниеПользователи.Ссылка, + ВнешниеПользователи.ПометкаУдаления, + ВнешниеПользователи.Предопределенный, + ВнешниеПользователи.Наименование, + ВЫБОР + КОГДА ВнешниеПользователи.ПометкаУдаления + ТОГДА 6 + КОГДА ВнешниеПользователи.ИдентификаторПользователяИБ = &ПустойУникальныйИдентификатор + ТОГДА 10 + ИНАЧЕ 7 + КОНЕЦ КАК НомерКартинки +ИЗ + Справочник.ВнешниеПользователи КАК ВнешниеПользователи +ГДЕ + (&ЛюбойТипОбъектовАвторизации + ИЛИ &ТипОбъектовАвторизации = ТИПЗНАЧЕНИЯ(ВнешниеПользователи.ОбъектАвторизации)) + И (&ВыбиратьИерархически + И ИСТИНА В + (ВЫБРАТЬ + ИСТИНА + ИЗ + РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + ГДЕ + СоставГруппПользователей.Пользователь = ВнешниеПользователи.Ссылка + И СоставГруппПользователей.ГруппаПользователей = &ГруппаВнешнихПользователей) + ИЛИ (НЕ &ВыбиратьИерархически) + И ИСТИНА В + (ВЫБРАТЬ + ИСТИНА + ИЗ + Справочник.ГруппыВнешнихПользователей.Состав КАК ГруппыВнешнихПользователейСостав + ГДЕ + ГруппыВнешнихПользователейСостав.ВнешнийПользователь = ВнешниеПользователи.Ссылка + И ГруппыВнешнихПользователейСостав.Ссылка = &ГруппаВнешнихПользователей)) + Catalog.ВнешниеПользователи + true + true + true + true + true + +
+ + ГруппыВнешнихПользователей + + <key>ru</key> + <value>Группы внешних пользователей</value> + + 2 + + DynamicList + + + true + + + true + + + ГруппыВнешнихПользователей.Parent + + + ГруппыВнешнихПользователей.ВсеОбъектыАвторизации + + + ГруппыВнешнихПользователей.ТипОбъектовАвторизации + + + ВЫБРАТЬ + ГруппыВнешнихПользователей.Ссылка, + ГруппыВнешнихПользователей.ПометкаУдаления, + ГруппыВнешнихПользователей.Предопределенный, + ГруппыВнешнихПользователей.Родитель, + ГруппыВнешнихПользователей.Наименование, + ВЫБОР + КОГДА ГруппыВнешнихПользователей.ПометкаУдаления + ТОГДА 8 + ИНАЧЕ 9 + КОНЕЦ КАК НомерКартинки, + ГруппыВнешнихПользователей.ТипОбъектовАвторизации, + ГруппыВнешнихПользователей.ВсеОбъектыАвторизации +ИЗ + Справочник.ГруппыВнешнихПользователей КАК ГруппыВнешнихПользователей +ГДЕ + (ГруппыВнешнихПользователей.ТипОбъектовАвторизации = НЕОПРЕДЕЛЕНО + ИЛИ &ЛюбойТипОбъектовАвторизации + ИЛИ &ТипОбъектовАвторизации = ТИПЗНАЧЕНИЯ(ГруппыВнешнихПользователей.ТипОбъектовАвторизации)) + Catalog.ГруппыВнешнихПользователей + true + true + true + true + true + + + + ВыбиратьИерархически + + <key>ru</key> + <value>Показывать внешних пользователей дочерних групп</value> + + 3 + + Boolean + + + true + + + true + + + ВыбиратьИерархически + + + + ОтборОбъектАвторизации + + <key>ru</key> + <value>Отбор объект авторизации</value> + + 4 + + + true + + + true + + + + ТипОбъектовАвторизации + + <key>ru</key> + <value>Тип объектов авторизации</value> + + 5 + + + true + + + true + + + + ГруппаВнешнихПользователейВсеПользователи + + <key>ru</key> + <value>Группа внешних пользователей все пользователи</value> + + 6 + + CatalogRef.ГруппыВнешнихПользователей + + + true + + + true + + + + ПредставлениеТиповОбъектовАвторизации + + <key>ru</key> + <value>Представление типов объектов авторизации</value> + + 7 + + ValueList + + + true + + + true + + + + + + + ОписаниеОтображаемыхВнешнихПользователей + + <key>ru</key> + <value>Описание отображаемых внешних пользователей</value> + + 8 + + String + + + + true + + + true + + + + СоздатьГруппуВнешнихПользователей + + <key>ru</key> + <value>Создать группу внешних пользователей</value> + + 3 + + ru + Создать группу внешних пользователей + + + true + + + StdPicture.CreateFolder + + + + СоздатьГруппуВнешнихПользователей + + + Auto + Auto + + + ВыборГруппВнешнихПользователей + + Boolean + + + + ЗакрыватьПриВыборе + + + + + + + +
diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..fe00d23d6 --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,254 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ТипЗнч(Параметры.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда + Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока = Параметры.ТекущаяСтрока; + Иначе + ТекущийЭлемент = Элементы.ВнешниеПользователиСписок; + Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи; + ОбновитьЗначениеПараметраКомпоновкиДанных(ВнешниеПользователиСписок, "ГруппаВнешнихПользователей", Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи); + ОбновитьЗначениеПараметраКомпоновкиДанных(ВнешниеПользователиСписок, "ВыбиратьИерархически", Истина); + КонецЕсли; + + Если Параметры.Свойство("Отбор") И Параметры.Отбор.Свойство("ОбъектАвторизации") Тогда + ОтборОбъектАвторизации = Параметры.Отбор.ОбъектАвторизации; + КонецЕсли; + + // Настройка постоянных данных для списка пользователей + ОбновитьЗначениеПараметраКомпоновкиДанных(ВнешниеПользователиСписок, "ПустойУникальныйИдентификатор", Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); + ГруппаВнешнихПользователейВсеПользователи = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи; + + // Подготовка представлений типов объектов авторизации. + Для каждого ТекущийТипОбъектовАвторизации Из Метаданные.Справочники.ВнешниеПользователи.Реквизиты.ОбъектАвторизации.Тип.Типы() Цикл + МассивТипов = Новый Массив; + МассивТипов.Добавить(ТекущийТипОбъектовАвторизации); + ОписаниеТипа = Новый ОписаниеТипов(МассивТипов); + ПредставлениеТиповОбъектовАвторизации.Добавить(ОписаниеТипа.ПривестиЗначение(Неопределено), Метаданные.НайтиПоТипу(ТекущийТипОбъектовАвторизации).Синоним); + КонецЦикла; + + Если НЕ ПравоДоступа("Добавление", Метаданные.Справочники.ГруппыВнешнихПользователей) Тогда + Элементы.СоздатьГруппуВнешнихПользователей.Видимость = Ложь; + КонецЕсли; + Если НЕ ПравоДоступа("Добавление", Метаданные.Справочники.ВнешниеПользователи) Тогда + Элементы.СоздатьВнешнегоПользователя.Видимость = Ложь; + КонецЕсли; + + Если Параметры.РежимВыбора Тогда + + Если Элементы.Найти("ПользователиИБ") <> Неопределено Тогда + Элементы.ПользователиИБ.Видимость = Ложь; + КонецЕсли; + + Параметры.Свойство("ТипОбъектовАвторизации", ТипОбъектовАвторизации); + + // Отбор не помеченных на удаление + ВнешниеПользователиСписок.Отбор.Элементы[0].Использование = Истина; + + Элементы.ВнешниеПользователиСписок.РежимВыбора = Истина; + Элементы.ВыбратьГруппуВнешнихПользователей.Видимость = Параметры.ВыборГруппВнешнихПользователей; + Элементы.ГруппыВнешнихПользователей.РежимВыбора = Параметры.ВыборГруппВнешнихПользователей; + Элементы.ВыбратьВнешнегоПользователя.КнопкаПоУмолчанию = НЕ Параметры.ВыборГруппВнешнихПользователей; + + Если Параметры.ЗакрыватьПриВыборе = Ложь Тогда + // Режим подбора + Элементы.ВнешниеПользователиСписок.МножественныйВыбор = Истина; + Элементы.ВнешниеПользователиСписок.РежимВыделения = РежимВыделенияТаблицы.Множественный; + + Если Параметры.ВыборГруппВнешнихПользователей Тогда + Заголовок = НСтр("ru = 'Подбор внешних пользователей и групп'"); + Элементы.ВыбратьВнешнегоПользователя.Заголовок = НСтр("ru = 'Выбрать внешних пользователей'"); + Элементы.ВыбратьГруппуВнешнихПользователей.Заголовок = НСтр("ru = 'Выбрать группы'"); + + Элементы.ГруппыВнешнихПользователей.МножественныйВыбор = Истина; + Элементы.ГруппыВнешнихПользователей.РежимВыделения = РежимВыделенияТаблицы.Множественный; + Иначе + Заголовок = НСтр("ru = 'Подбор внешних пользователей'"); + КонецЕсли; + Иначе + Если Параметры.ВыборГруппВнешнихПользователей Тогда + Заголовок = НСтр("ru = 'Выбор внешнего пользователя или группы'"); + Элементы.ВыбратьВнешнегоПользователя.Заголовок = НСтр("ru = 'Выбрать внешнего пользователя'"); + Иначе + Заголовок = НСтр("ru = 'Выбор внешнего пользователя'"); + КонецЕсли; + КонецЕсли; + Иначе + Элементы.ВыбратьВнешнегоПользователя.Видимость = Ложь; + Элементы.ВыбратьГруппуВнешнихПользователей.Видимость = Ложь; + КонецЕсли; + + ОбновитьЗначениеПараметраКомпоновкиДанных(ГруппыВнешнихПользователей, "ЛюбойТипОбъектовАвторизации", ТипОбъектовАвторизации = Неопределено); + ОбновитьЗначениеПараметраКомпоновкиДанных(ГруппыВнешнихПользователей, "ТипОбъектовАвторизации", ТипЗнч(ТипОбъектовАвторизации)); + + ОбновитьЗначениеПараметраКомпоновкиДанных(ВнешниеПользователиСписок, "ЛюбойТипОбъектовАвторизации", ТипОбъектовАвторизации = Неопределено); + ОбновитьЗначениеПараметраКомпоновкиДанных(ВнешниеПользователиСписок, "ТипОбъектовАвторизации", ТипЗнч(ТипОбъектовАвторизации)); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ОбновитьСодержимоеФормыПриИзмененииГруппы(Элементы.ГруппыВнешнихПользователей.ТекущиеДанные); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ИзмененаГруппаВнешнихПользователей" Тогда + + Если Параметр = Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока Тогда + Элементы.ГруппыВнешнихПользователей.Обновить(); + Элементы.ВнешниеПользователиСписок.Обновить(); + ОбновитьСодержимоеФормыПриИзмененииГруппы(Элементы.ГруппыВнешнихПользователей.ТекущиеДанные); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + + Если Настройки[ВыбиратьИерархически] = Неопределено Тогда + ВыбиратьИерархически = Истина; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий команд и элементов формы +// + +&НаКлиенте +Процедура СоздатьГруппуВнешнихПользователей(Команда) + + Элементы.ГруппыВнешнихПользователей.ДобавитьСтроку(); + +КонецПроцедуры + + +&НаКлиенте +Процедура ГруппыВнешнихПользователейПриАктивизацииСтроки(Элемент) + + ОбновитьСодержимоеФормыПриИзмененииГруппы(Элементы.ГруппыВнешнихПользователей.ТекущиеДанные); + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыВнешнихПользователейВыборЗначения(Элемент, Значение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ОповеститьОВыборе(Значение); + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыВнешнихПользователейПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Если НЕ Копирование Тогда + Отказ = Истина; + ПараметрыФормы = Новый Структура; + + Если ЗначениеЗаполнено(Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока) Тогда + + ПараметрыФормы.Вставить("ЗначенияЗаполнения", Новый Структура("Родитель", Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока)); + КонецЕсли; + + ОткрытьФорму("Справочник.ГруппыВнешнихПользователей.ФормаОбъекта", ПараметрыФормы, Элементы.ГруппыВнешнихПользователей); + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ВнешниеПользователиСписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ОповеститьОВыборе(Значение); + +КонецПроцедуры + +&НаКлиенте +Процедура ВнешниеПользователиСписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Отказ = Истина; + + ПараметрыФормы = Новый Структура("ГруппаНовогоВнешнегоПользователя", Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока); + + Если ОтборОбъектАвторизации <> Неопределено Тогда + ПараметрыФормы.Вставить("ОбъектАвторизацииНовогоВнешнегоПользователя", ОтборОбъектАвторизации); + КонецЕсли; + + Если Копирование И Элемент.ТекущиеДанные <> Неопределено Тогда + ПараметрыФормы.Вставить("ЗначениеКопирования", Элемент.ТекущаяСтрока); + КонецЕсли; + + ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаОбъекта", ПараметрыФормы, Элементы.ВнешниеПользователиСписок); + +КонецПроцедуры + + +&НаКлиенте +Процедура ВыбиратьИерархическиПриИзменении(Элемент) + + ОбновитьСодержимоеФормыПриИзмененииГруппы(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции формы +// + +&НаКлиенте +Процедура ОбновитьСодержимоеФормыПриИзмененииГруппы(Знач ТекущиеДанные = Неопределено) + + Если Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока = ГруппаВнешнихПользователейВсеПользователи Тогда + + ОписаниеОтображаемыхВнешнихПользователей = НСтр("ru = 'Все внешние пользователи'"); + + Элементы.ГруппаПоказыватьВнешнихПользователейДочернихГрупп.ТекущаяСтраница = Элементы.ГруппаНельзяУстановитьСвойство; + ОбновитьЗначениеПараметраКомпоновкиДанных(ВнешниеПользователиСписок, "ВыбиратьИерархически", Истина); + + ИначеЕсли Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока <> Неопределено И + ТекущиеДанные <> Неопределено И + ТекущиеДанные.ВсеОбъектыАвторизации Тогда + + ЭлементПредставленияТипаОбъектаАвторизации = ПредставлениеТиповОбъектовАвторизации.НайтиПоЗначению(ТекущиеДанные.ТипОбъектовАвторизации); + ОписаниеОтображаемыхВнешнихПользователей = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Все %1'"), + НРег(?(ЭлементПредставленияТипаОбъектаАвторизации = Неопределено, НСтр("ru = '<Недопустимый тип>'"), ЭлементПредставленияТипаОбъектаАвторизации.Представление)) ); + + Элементы.ГруппаПоказыватьВнешнихПользователейДочернихГрупп.ТекущаяСтраница = Элементы.ГруппаНельзяУстановитьСвойство; + ОбновитьЗначениеПараметраКомпоновкиДанных(ВнешниеПользователиСписок, "ВыбиратьИерархически", Истина); + Иначе + Элементы.ГруппаПоказыватьВнешнихПользователейДочернихГрупп.ТекущаяСтраница = Элементы.ГруппаУстановитьСвойство; + ОбновитьЗначениеПараметраКомпоновкиДанных(ВнешниеПользователиСписок, "ВыбиратьИерархически", ВыбиратьИерархически); + КонецЕсли; + + ОбновитьЗначениеПараметраКомпоновкиДанных(ВнешниеПользователиСписок, "ГруппаВнешнихПользователей", Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока); + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура ОбновитьЗначениеПараметраКомпоновкиДанных(Знач ВладелецПараметров, Знач ИмяПараметра, Знач ЗначениеПараметра) + + Для каждого Параметр Из ВладелецПараметров.Параметры.Элементы Цикл + Если Строка(Параметр.Параметр) = ИмяПараметра Тогда + Если Параметр.Использование И Параметр.Значение = ЗначениеПараметра Тогда + Возврат; + КонецЕсли; + Прервать; + КонецЕсли; + КонецЦикла; + + ВладелецПараметров.Параметры.УстановитьЗначениеПараметра(ИмяПараметра, ЗначениеПараметра); + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..c2e99e3ec --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,2522 @@ + + + + СвязьОбработкаНесоответствия + 169 + + СвязьКартинкаПредупреждения + 170 + + <key>ru</key> + <value>Связь картинка предупреждения</value> + + true + true + + true + + + СвязьКартинкаПредупрежденияРасширеннаяПодсказка + 175 + Label + true + true + + Left + + + + СвязьКартинкаПредупрежденияКонтекстноеМеню + 171 + true + + 5 + true + 3 + true + false + false + + + CommonPicture.Предупреждение32 + + + + + СвязьПояснениеНесоответствия + 172 + + <key>ru</key> + <value>Пользователь связан с несуществующим пользователем информационной базы (ИБ). +Чтобы установить связь с новым пользователем ИБ, включите флажок "Доступ к информационной базе разрешен". +Чтобы очистить связь оставьте флажок выключенным.</value> + + true + true + + true + + + СвязьПояснениеНесоответствияРасширеннаяПодсказка + 176 + Label + true + true + + Left + + + + СвязьПояснениеНесоответствияКонтекстноеМеню + 173 + true + + Label + true + 3 + true + true + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Связь обработка несоответствия</value> + + true + + СвязьОбработкаНесоответствияРасширеннаяПодсказка + 174 + Label + true + true + + Left + + + UsualGroup + + Auto + StrongSeparation + true + true + Auto + Auto + + + + ОбъектАвторизации + 164 + true + true + + true + + + Объект.ОбъектАвторизации + + + OnChange + ОбъектАвторизацииПриИзменении + + + ОбъектАвторизацииРасширеннаяПодсказка + 177 + Label + true + true + + Left + + + + ОбъектАвторизацииКонтекстноеМеню + 165 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДоступКИнформационнойБазеРазрешен + 99 + true + true + + true + + + ДоступКИнформационнойБазеРазрешен + + Right + + OnChange + ДоступКИнформационнойБазеРазрешенПриИзменении + + + ДоступКИнформационнойБазеРазрешенРасширеннаяПодсказка + 179 + Label + true + true + + Left + + + + ДоступКИнформационнойБазеРазрешенКонтекстноеМеню + 100 + true + + CheckBoxField + Enter + true + Left + true + + + + СвойстваПользователяИБ + 65 + + ОсновныеСвойства + 75 + + ПользовательИнфБазыИмя + 95 + true + true + + true + + + ПользовательИнфБазыИмя + + + ПользовательИнфБазыИмяРасширеннаяПодсказка + 183 + Label + true + true + + Left + + + + ПользовательИнфБазыИмяКонтекстноеМеню + 96 + true + + InputField + Enter + true + Left + true + + 14 + true + true + false + true + true + true + true + Normal + + + + Пароль + 21 + true + true + + true + + + Пароль + + + OnChange + ПарольПриИзменении + + + ПарольРасширеннаяПодсказка + 185 + Label + true + true + + Left + + + + ПарольКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + Left + + 14 + true + true + false + true + true + true + true + + Style.BorderColor + + Normal + + + + ПодтверждениеПароля + 23 + true + true + + true + + + ПодтверждениеПароля + + + OnChange + ПарольПриИзменении + + + ПодтверждениеПароляРасширеннаяПодсказка + 187 + Label + true + true + + Left + + + + ПодтверждениеПароляКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + Left + + 14 + true + true + false + true + true + true + true + + Style.BorderColor + + Normal + + + + ПользовательИнфБазыЗапрещеноИзменятьПароль + 51 + true + true + + true + + + ПользовательИнфБазыЗапрещеноИзменятьПароль + + Left + + ПользовательИнфБазыЗапрещеноИзменятьПарольРасширеннаяПодсказка + 189 + Label + true + true + + Left + + + + ПользовательИнфБазыЗапрещеноИзменятьПарольКонтекстноеМеню + 52 + true + + CheckBoxField + Enter + true + Left + true + + + + ПредставлениеЯзыка + 33 + true + true + + true + + + ПредставлениеЯзыка + + + ПредставлениеЯзыкаРасширеннаяПодсказка + 191 + Label + true + true + + Left + + + + ПредставлениеЯзыкаКонтекстноеМеню + 34 + true + + InputField + Enter + true + Left + true + Left + + 14 + true + true + false + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + true + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + true + Role.ПолныеПрава + + + + <key>ru</key> + <value>Основные свойства</value> + + 32 + false + + ОсновныеСвойстваРасширеннаяПодсказка + 182 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + РедактированиеИлиПросмотрРолей + 168 + + УстановитьРолиНепосредственно + 166 + true + true + + true + + + Объект.УстановитьРолиНепосредственно + + Right + + OnChange + УстановитьРолиНепосредственноПриИзменении + + + УстановитьРолиНепосредственноРасширеннаяПодсказка + 194 + Label + true + true + + Left + + + + УстановитьРолиНепосредственноКонтекстноеМеню + 167 + true + + CheckBoxField + Enter + true + Left + true + + + + ОтображениеРолей + 103 + + ТолькоВыбранныеРоли + 104 + + Роли + 105 + + <key>ru</key> + <value>Разрешенные действия (роли)</value> + + + System.DefaultGUIFont + true + false + false + false + + true + true + + true + + + Роли + + false + None + CancelSearch + Copy + CopyToClipboard + EndEdit + Find + OutputList + + СинонимРоли + 159 + + <key>ru</key> + <value>Разрешенное действие (роль)</value> + + true + true + + true + + + Роли.СинонимРоли + + + ru + Синоним роли, как он задан в конфигураторе + + + OnChange + СинонимРолиПриИзменении + + + СинонимРолиРасширеннаяПодсказка + 222 + Label + true + true + + Left + + + + СинонимРолиКонтекстноеМеню + 160 + true + + InputField + true + Enter + true + Left + true + + + AutoComplete + СинонимРолиАвтоПодбор + + + StartChoice + СинонимРолиНачалоВыбора + + + TextEditEnd + СинонимРолиОкончаниеВводаТекста + + + ChoiceProcessing + СинонимРолиОбработкаВыбора + + true + true + true + true + true + true + true + Normal + + + + РолиКоманднаяПанель + 107 + + РолиПодобрать + 117 + true + true + + true + + false + + РолиПодобратьРасширеннаяПодсказка + 204 + Label + true + true + + Left + + + Form.Command.ПодобратьРоли + Normal + Auto + true + true + UserCmds + Auto + + + РолиДобавить + 118 + true + true + + true + + false + + РолиДобавитьРасширеннаяПодсказка + 205 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + РолиУдалить + 120 + true + true + + true + + false + + РолиУдалитьРасширеннаяПодсказка + 206 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + РолиПереместитьВверх + 121 + true + true + + true + + false + + РолиПереместитьВверхРасширеннаяПодсказка + 207 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + РолиПереместитьВниз + 122 + true + true + + true + + false + + РолиПереместитьВнизРасширеннаяПодсказка + 208 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + РолиСортироватьСписокПоВозрастанию + 123 + true + true + + true + + false + + РолиСортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 209 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + РолиСортироватьСписокПоУбыванию + 124 + true + true + + true + + false + + РолиСортироватьСписокПоУбываниюРасширеннаяПодсказка + 210 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + РолиПоказатьСредиВсехВыбранныеРоли + 125 + true + true + + true + + false + + РолиПоказатьСредиВсехВыбранныеРолиРасширеннаяПодсказка + 211 + Label + true + true + + Left + + + Form.Command.ПоказатьТолькоВыбранныеРоли + Normal + Auto + true + true + UserCmds + true + Auto + + Left + + + OnEditEnd + РолиПриОкончанииРедактирования + + + ChoiceProcessing + РолиОбработкаВыбора + + + OnChange + РолиПриИзменении + + + РолиСтрокаПоиска + 213 + + РолиСтрокаПоискаРасширеннаяПодсказка + 215 + Label + true + true + + Left + + + + РолиСтрокаПоискаКонтекстноеМеню + 214 + true + + Роли + + true + + + + РолиСостояниеПросмотра + 216 + + РолиСостояниеПросмотраРасширеннаяПодсказка + 218 + Label + true + true + + Left + + + + РолиСостояниеПросмотраКонтекстноеМеню + 217 + true + + ViewStatusAddition + Роли + + true + + + + РолиУправлениеПоиском + 219 + + РолиУправлениеПоискомРасширеннаяПодсказка + 221 + Label + true + true + + Left + + + + РолиУправлениеПоискомКонтекстноеМеню + 220 + true + + SearchControlAddition + Роли + + true + + + + РолиРасширеннаяПодсказка + 212 + Label + true + true + + Left + + + + РолиКонтекстноеМеню + 106 + + КонтекстноеМенюРолиПодобрать + 110 + true + true + + true + + false + + КонтекстноеМенюРолиПодобратьРасширеннаяПодсказка + 198 + Label + true + true + + Left + + + Form.Command.ПодобратьРоли + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиДобавить + 111 + true + true + + true + + false + + КонтекстноеМенюРолиДобавитьРасширеннаяПодсказка + 199 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиУдалить + 113 + true + true + + true + + false + + КонтекстноеМенюРолиУдалитьРасширеннаяПодсказка + 200 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиПереместитьВверх + 114 + true + true + + true + + false + + КонтекстноеМенюРолиПереместитьВверхРасширеннаяПодсказка + 201 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиПереместитьВниз + 115 + true + true + + true + + false + + КонтекстноеМенюРолиПереместитьВнизРасширеннаяПодсказка + 202 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиВыделитьВсе + 116 + true + true + + true + + false + + КонтекстноеМенюРолиВыделитьВсеРасширеннаяПодсказка + 203 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.SelectAll + Normal + Auto + true + true + UserCmds + Auto + + + 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>Только выбранные роли</value> + + + ТолькоВыбранныеРолиРасширеннаяПодсказка + 197 + Label + true + true + + Left + + + Page + + Vertical + auto + +
+ + СредиВсехВыбранныеРоли + 126 + + ТаблицаРолей + 127 + true + true + + true + + + ТаблицаРолей + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + OutputList + SelectAll + + ТаблицаРолейПометка + 147 + true + true + + true + + + ТаблицаРолей.Пометка + + None + + OnChange + ТаблицаРолейПометкаПриИзменении + + + ТаблицаРолейПометкаРасширеннаяПодсказка + 252 + Label + true + true + + Left + + + + ТаблицаРолейПометкаКонтекстноеМеню + 148 + true + + CheckBoxField + Auto + true + Left + true + + + + ТаблицаРолейСиноним + 149 + true + true + + true + + + ТаблицаРолей.Синоним + + + ru + Синоним роли, как он задан в конфигураторе + + + ТаблицаРолейСинонимРасширеннаяПодсказка + 254 + Label + true + true + + Left + + + + ТаблицаРолейСинонимКонтекстноеМеню + 150 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейСинонимыПодсистем + 151 + true + true + + + ТаблицаРолей.СинонимыПодсистем + + + ru + Синонимы подсистем, в которые входит роль + + + ТаблицаРолейСинонимыПодсистемРасширеннаяПодсказка + 256 + Label + true + true + + Left + + + + ТаблицаРолейСинонимыПодсистемКонтекстноеМеню + 152 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейИмя + 153 + true + true + + + ТаблицаРолей.Имя + + + ru + Имя роли, как оно задано в конфигураторе + + + ТаблицаРолейИмяРасширеннаяПодсказка + 258 + Label + true + true + + Left + + + + ТаблицаРолейИмяКонтекстноеМеню + 154 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейИменаПодсистем + 155 + true + true + + + ТаблицаРолей.ИменаПодсистем + + + ru + Имена подсистем, в которые входит роль + + + ТаблицаРолейИменаПодсистемРасширеннаяПодсказка + 260 + Label + true + true + + Left + + + + ТаблицаРолейИменаПодсистемКонтекстноеМеню + 156 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейКоманднаяПанель + 129 + + ТаблицаРолейУстановитьФлажки + 140 + true + true + + true + + false + + ТаблицаРолейУстановитьФлажкиРасширеннаяПодсказка + 235 + Label + true + true + + Left + + + Form.Command.УстановитьФлажки + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРолейСнятьФлажки + 141 + true + true + + true + + false + + ТаблицаРолейСнятьФлажкиРасширеннаяПодсказка + 236 + Label + true + true + + Left + + + Form.Command.СнятьФлажки + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРолейНайти + 142 + true + true + + true + + false + + ТаблицаРолейНайтиРасширеннаяПодсказка + 237 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейОтменитьПоиск + 143 + true + true + + true + + false + + ТаблицаРолейОтменитьПоискРасширеннаяПодсказка + 238 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейСортироватьСписокПоВозрастанию + 144 + true + true + + true + + false + + ТаблицаРолейСортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 239 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейСортироватьСписокПоУбыванию + 145 + true + true + + true + + false + + ТаблицаРолейСортироватьСписокПоУбываниюРасширеннаяПодсказка + 240 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейПоказатьТолькоВыбранныеРоли + 146 + true + true + + true + + false + + ТаблицаРолейПоказатьТолькоВыбранныеРолиРасширеннаяПодсказка + 241 + Label + true + true + + Left + + + Form.Command.ПоказатьТолькоВыбранныеРоли + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + ТаблицаРолейСтрокаПоиска + 243 + + ТаблицаРолейСтрокаПоискаРасширеннаяПодсказка + 245 + Label + true + true + + Left + + + + ТаблицаРолейСтрокаПоискаКонтекстноеМеню + 244 + true + + ТаблицаРолей + + true + + + + ТаблицаРолейСостояниеПросмотра + 246 + + ТаблицаРолейСостояниеПросмотраРасширеннаяПодсказка + 248 + Label + true + true + + Left + + + + ТаблицаРолейСостояниеПросмотраКонтекстноеМеню + 247 + true + + ViewStatusAddition + ТаблицаРолей + + true + + + + ТаблицаРолейУправлениеПоиском + 249 + + ТаблицаРолейУправлениеПоискомРасширеннаяПодсказка + 251 + Label + true + true + + Left + + + + ТаблицаРолейУправлениеПоискомКонтекстноеМеню + 250 + true + + SearchControlAddition + ТаблицаРолей + + true + + + + ТаблицаРолейРасширеннаяПодсказка + 242 + Label + true + true + + Left + + + + ТаблицаРолейКонтекстноеМеню + 128 + + КонтекстноеМенюТаблицаРолейНайти + 158 + true + true + + true + + false + + КонтекстноеМенюТаблицаРолейНайтиРасширеннаяПодсказка + 233 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюТаблицаРолейОтменитьПоиск + 157 + true + true + + true + + false + + КонтекстноеМенюТаблицаРолейОтменитьПоискРасширеннаяПодсказка + 234 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + true + + 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>Среди всех выбранные роли</value> + + + СредиВсехВыбранныеРолиРасширеннаяПодсказка + 232 + Label + true + true + + Left + + + Page + + Vertical + auto + +
+ true + true + + true + + + <key>ru</key> + <value>Отображение ролей</value> + + + ОтображениеРолейРасширеннаяПодсказка + 196 + Label + true + true + + Left + + + Pages + + Auto + +
+ true + true + + true + + + <key>ru</key> + <value>Редактирование или просмотр ролей</value> + + + ru + Редактирование или просмотр ролей + + + РедактированиеИлиПросмотрРолейРасширеннаяПодсказка + 193 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + +
+ true + true + + true + + + <key>ru</key> + <value>Свойства пользователя информационной базы</value> + + + СвойстваПользователяИБРасширеннаяПодсказка + 181 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + +
+ + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + + FillCheckProcessingAtServer + ОбработкаПроверкиЗаполненияНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + LockOwner + Use + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ВнешниеПользователи + + + true + + + true + +
true
+ true +
+ + ПользовательИнфБазыПароль + + <key>ru</key> + <value>Пользователь инф базы пароль</value> + + 3 + + + true + + + true + + true + + + ПодтверждениеПароля + + <key>ru</key> + <value>Подтверждение пароля</value> + + 4 + + String + + + + true + + + true + + true + + + ПредставлениеЯзыка + + <key>ru</key> + <value>Язык</value> + + 10 + + String + + + + true + + + true + + true + + + Роли + + <key>ru</key> + <value>Роли</value> + + 11 + + ValueTable + + + true + + true + Role.ПолныеПрава + + + + 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> + + 13 + + Boolean + + + true + + + true + + true + + + ПользовательИнфБазыИмя + + <key>ru</key> + <value>Имя</value> + + 16 + + String + + + + true + + + true + + true + + + ДоступКИнформационнойБазеРазрешен + + <key>ru</key> + <value>Доступ к информационной базе разрешен</value> + + 17 + + Boolean + + + true + + + true + + true + + + ПользовательИБСуществует + + <key>ru</key> + <value>Пользователь ИБСуществует</value> + + 23 + + Boolean + + + true + + + true + + true + + + СписокВыбораРолей + + <key>ru</key> + <value>Список выбора ролей</value> + + 12 + + ValueList + + + true + + + true + + + + + + + ТаблицаРолей + + <key>ru</key> + <value>Таблица ролей</value> + + 25 + + ValueTable + + + true + + + true + + true + + Имя + + <key>ru</key> + <value>Имя роли</value> + + 1 + + String + + + + true + + + true + + + + Синоним + + <key>ru</key> + <value>Разрешенное действие (роль)</value> + + 2 + + String + + + + true + + + true + + + + ИменаПодсистем + + <key>ru</key> + <value>Имена подсистем</value> + + 3 + + String + + + + true + + + true + + + + СинонимыПодсистем + + <key>ru</key> + <value>Подсистемы</value> + + 4 + + String + + + + true + + + true + + + + Пометка + + <key>ru</key> + <value>Пометка</value> + + 5 + + Boolean + + + true + + + true + + + + + ПоказатьТолькоВыбранныеРоли + + <key>ru</key> + <value>Показать только выбранные роли</value> + + 26 + + Boolean + + + true + + + true + + + ПоказатьТолькоВыбранныеРоли + + + + ГруппаНовогоВнешнегоПользователя + + <key>ru</key> + <value>Группа нового внешнего пользователя</value> + + 2 + + CatalogRef.ГруппыВнешнихПользователей + + + true + + + true + + + + ДействияВФорме + + <key>ru</key> + <value>Действия в форме</value> + + 8 + + + true + + + true + + + + Пароль + + <key>ru</key> + <value>Пароль</value> + + 7 + + String + + + + true + + + true + + true + + + СтарыйИдентификаторПользователяИБ + + <key>ru</key> + <value>Старый идентификатор пользователя ИБ</value> + + 28 + + UUID + + + true + + + true + + + + ТекущееПредставлениеОбъектаАвторизации + + <key>ru</key> + <value>Текущее представление объекта авторизации</value> + + 18 + + String + + + + true + + + true + + + + ТипОбъектовАвторизации + + <key>ru</key> + <value>Тип объектов авторизации</value> + + 5 + + + true + + + true + + + + ОбъектАвторизацииЗаданПриОткрытии + + <key>ru</key> + <value>Объект авторизации задан при открытии</value> + + 6 + + Boolean + + + true + + + true + + + + ЕстьСвязьСНесуществующимПользователемИБ + + <key>ru</key> + <value>Есть связь с несуществующим пользователем ИБ</value> + + 9 + + Boolean + + + true + + + true + + + + ПодобратьРоли + + <key>ru</key> + <value>Подобрать</value> + + 2 + + ru + Подобрать роли + + + true + + + + ПодобратьРоли + + + true + Auto + Auto + + + ПоказатьТолькоВыбранныеРоли + + <key>ru</key> + <value>Показать только выбранные роли</value> + + 3 + + ru + Показать только выбранные роли + + + true + + + CommonPicture.ПоказатьТолькоВыбранныеРоли + + + + ПоказатьТолькоВыбранныеРоли + + + Picture + Auto + Auto + + + СнятьФлажки + + <key>ru</key> + <value>Снять флажки</value> + + 5 + + ru + Снять флажки + + + true + + + StdPicture.UncheckAll + + + + СнятьФлажки + + + true + Auto + Auto + + + УстановитьФлажки + + <key>ru</key> + <value>Установить флажки</value> + + 6 + + ru + Установить флажки + + + true + + + StdPicture.CheckAll + + + + УстановитьФлажки + + + true + Auto + Auto + + + ГруппаНовогоВнешнегоПользователя + + CatalogRef.ГруппыВнешнихПользователей + + + + + + + + + AfterWrite + ПослеЗаписи + + + AfterWriteAtServer + ПослеЗаписиНаСервере + + + OnReadAtServer + ПриЧтенииНаСервере + + + BeforeWrite + ПередЗаписью + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + + OnWriteAtServer + ПриЗаписиНаСервере + + +
diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..c9926fe9e --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,946 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + //** Установка начальных значений + // перед загрузкой данных из настроек на сервере + // для случая, когда данные ещё не были записаны и не загружаются + ПоказатьТолькоВыбранныеРоли = (Элементы.ОтображениеРолей.ТекущаяСтраница = Элементы.ТолькоВыбранныеРоли); + + //** Заполнение постоянных данных + + ПодготовитьСписокВыбораИТаблицуРолей(); + + // Заполнение списка выбора языка + Для каждого МетаданныеЯзыка ИЗ Метаданные.Языки Цикл + Элементы.ПредставлениеЯзыка.СписокВыбора.Добавить(МетаданныеЯзыка.Синоним); + КонецЦикла; + + //** Подготовка к интерактивным действиям с учетом сценариев открытия формы + + УстановитьДействияСРолями(); + + УстановитьПривилегированныйРежим(Истина); + + Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда + // Создание нового элемента + Если Параметры.ГруппаНовогоВнешнегоПользователя <> Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда + ГруппаНовогоВнешнегоПользователя = Параметры.ГруппаНовогоВнешнегоПользователя; + КонецЕсли; + Если ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда + // Копирование элемента + Объект.ОбъектАвторизации = Неопределено; + Объект.Наименование = ""; + Объект.Код = ""; + Объект.УдалитьПароль = ""; + ПрочитатьПользователяИБ(ЗначениеЗаполнено(Параметры.ЗначениеКопирования.ИдентификаторПользователяИБ)); + Иначе + // Добавление элемента + Если Параметры.Свойство("ОбъектАвторизацииНовогоВнешнегоПользователя") Тогда + Объект.ОбъектАвторизации = Параметры.ОбъектАвторизацииНовогоВнешнегоПользователя; + ОбъектАвторизацииЗаданПриОткрытии = ЗначениеЗаполнено(Объект.ОбъектАвторизации); + ОбъектАвторизацииПриИзмененииНаКлиентеНаСервере(ЭтаФорма, Объект); + ИначеЕсли ЗначениеЗаполнено(ГруппаНовогоВнешнегоПользователя) Тогда + ТипОбъектовАвторизации = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ГруппаНовогоВнешнегоПользователя, "ТипОбъектовАвторизации"); + Объект.ОбъектАвторизации = ТипОбъектовАвторизации; + Элементы.ОбъектАвторизации.ВыбиратьТип = Ложь; + КонецЕсли; + // Чтение начальных значений свойств пользователя ИБ + ПрочитатьПользователяИБ(); + КонецЕсли; + Иначе + // Открытие существующего элемента + ПрочитатьПользователяИБ(); + КонецЕсли; + + УстановитьПривилегированныйРежим(Ложь); + + ОпределитьДействияВФорме(); + + ОпределитьНесоответствияПользователяСПользователемИБ(); + + //** Установка постоянной доступности свойств + Элементы.СвойстваПользователяИБ.Видимость = ЗначениеЗаполнено(ДействияВФорме.СвойстваПользователяИБ); + Элементы.ОтображениеРолей.Видимость = ЗначениеЗаполнено(ДействияВФорме.Роли); + Элементы.УстановитьРолиНепосредственно.Видимость = ЗначениеЗаполнено(ДействияВФорме.Роли) И НЕ ПользователиПереопределяемый.ЗапретРедактированияРолей(); + + Элементы.УстановитьРолиНепосредственно.Доступность = ДействияВФорме.Роли = "Редактирование"; + + ТолькоПросмотр = ТолькоПросмотр ИЛИ + ДействияВФорме.Роли <> "Редактирование" И + НЕ ( ДействияВФорме.СвойстваПользователяИБ = "РедактированиеВсех" ИЛИ + ДействияВФорме.СвойстваПользователяИБ = "РедактированиеСвоих" ) И + ДействияВФорме.СвойстваЭлемента <> "Редактирование"; + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + УстановитьДоступностьСвойств(); + +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + + ТекущееПредставлениеОбъектаАвторизации = Строка(Объект.ОбъектАвторизации); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗаписью(Отказ) + + ОчиститьСообщения(); + + Если ДействияВФорме.Роли = "Редактирование" И Объект.УстановитьРолиНепосредственно И Роли.Количество() = 0 Тогда + + Если Вопрос(НСтр("ru = 'Пользователю информационной базы не установлено ни одной роли. Продолжить?'"), + РежимДиалогаВопрос.ДаНет, + , + , + НСтр("ru = 'Запись пользователя информационной базы'")) = КодВозвратаДиалога.Нет Тогда + Отказ = Истина; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + Если ДействияВФорме.СвойстваЭлемента <> "Редактирование" Тогда + ЗаполнитьЗначенияСвойств(ТекущийОбъект, ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ТекущийОбъект.Ссылка, "Наименование, ПометкаУдаления")); + КонецЕсли; + + Если ВнешниеПользователи.ОбъектАвторизацииИспользуется(Объект.ОбъектАвторизации, Объект.Ссылка) Тогда + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Объект информационной базы уже используется для другого внешнего пользователя!'"), , + "Объект.ОбъектАвторизации", , + Отказ); + Возврат; + КонецЕсли; + + ТекущийОбъект.ДополнительныеСвойства.Вставить("ГруппаНовогоВнешнегоПользователя", ГруппаНовогоВнешнегоПользователя); + + Если ДоступКИнформационнойБазеРазрешен Тогда + + ЗаписатьПользователяИБ(ТекущийОбъект, Отказ); + Если НЕ Отказ Тогда + Если ТекущийОбъект.ИдентификаторПользователяИБ <> СтарыйИдентификаторПользователяИБ Тогда + ПараметрыЗаписи.Вставить("ДобавленПользовательИБ", ТекущийОбъект.ИдентификаторПользователяИБ); + Иначе + ПараметрыЗаписи.Вставить("ИзмененПользовательИБ", ТекущийОбъект.ИдентификаторПользователяИБ); + КонецЕсли + КонецЕсли; + + ИначеЕсли НЕ ЕстьСвязьСНесуществующимПользователемИБ ИЛИ + ДействияВФорме.СвойстваПользователяИБ = "РедактированиеВсех" Тогда + + ТекущийОбъект.ИдентификаторПользователяИБ = Неопределено; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + Если НЕ ДоступКИнформационнойБазеРазрешен И ПользовательИБСуществует Тогда + УдалитьПользователяИБ(Отказ); + Если НЕ Отказ Тогда + ПараметрыЗаписи.Вставить("УдаленПользовательИБ", СтарыйИдентификаторПользователяИБ); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + + Если ТекущийОбъект.ДополнительныеСвойства.Свойство("ЕстьОшибки") Тогда + ПараметрыЗаписи.Вставить("ЕстьОшибки"); + КонецЕсли; + + ПрочитатьПользователяИБ(); + + ОпределитьНесоответствияПользователяСПользователемИБ(ПараметрыЗаписи); + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + Если ПараметрыЗаписи.Свойство("ДобавленПользовательИБ") Тогда + Оповестить("ДобавленПользовательИБ", ПараметрыЗаписи.ДобавленПользовательИБ, ЭтаФорма); + + ИначеЕсли ПараметрыЗаписи.Свойство("ИзмененПользовательИБ") Тогда + Оповестить("ИзмененПользовательИБ", ПараметрыЗаписи.ИзмененПользовательИБ, ЭтаФорма); + + ИначеЕсли ПараметрыЗаписи.Свойство("УдаленПользовательИБ") Тогда + Оповестить("УдаленПользовательИБ", ПараметрыЗаписи.УдаленПользовательИБ, ЭтаФорма); + + ИначеЕсли ПараметрыЗаписи.Свойство("ОчищенаСвязьСНесуществущимПользователемИБ") Тогда + Оповестить("ОчищенаСвязьСНесуществущимПользователемИБ", ПараметрыЗаписи.ОчищенаСвязьСНесуществущимПользователемИБ, ЭтаФорма); + КонецЕсли; + + Если ПараметрыЗаписи.Свойство("ЕстьОшибки") Тогда + Предупреждение(НСтр("ru = 'При записи возникли ошибки (см. журнал регистрации)'")); + КонецЕсли; + + Если ЗначениеЗаполнено(ГруппаНовогоВнешнегоПользователя) Тогда + ОповеститьОбИзменении(ГруппаНовогоВнешнегоПользователя); + Оповестить("ИзмененСоставГруппыВнешнихПользователей", ГруппаНовогоВнешнегоПользователя, ЭтаФорма); + ГруппаНовогоВнешнегоПользователя = Неопределено; + КонецЕсли; + + УстановитьДоступностьСвойств(); + +КонецПроцедуры + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + + Если ДоступКИнформационнойБазеРазрешен Тогда + + ОбработкаПроверкиЗаполненияСпискаРолей(Отказ); + + Если НЕ Отказ И ПустаяСтрока(ПользовательИнфБазыИмя) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Не заполнено имя пользователя информационной базы.'"), , + "ПользовательИнфБазыИмя", , + Отказ); + КонецЕсли; + + Если НЕ Отказ И ПользовательИнфБазыПароль <> Неопределено И Пароль <> ПодтверждениеПароля Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Пароль и подтверждение пароля не совпадают.'"), , + "Пароль", , + Отказ); + КонецЕсли; + + Если ТребуетсяСоздатьПервогоАдминистратора() Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Первый пользователь информационной базы должен иметь полные права. + |Внешний пользователь не может быть полноправным. + |Сначала создайте обычного пользователя-администратора.'"), , + "ДоступКИнформационнойБазеРазрешен", , + Отказ); + КонецЕсли; + КонецЕсли; + + Если Отказ Тогда + ПроверяемыеРеквизиты.Очистить(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + + Если Настройки["ПоказатьТолькоВыбранныеРоли"] = Ложь Тогда + Элементы.ОтображениеРолей.ТекущаяСтраница = Элементы.СредиВсехВыбранныеРоли; + Иначе + Элементы.ОтображениеРолей.ТекущаяСтраница = Элементы.ТолькоВыбранныеРоли; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий команд и элементов формы +// + +&НаКлиенте +Процедура ОбъектАвторизацииПриИзменении(Элемент) + + ОбъектАвторизацииПриИзмененииНаКлиентеНаСервере(ЭтаФорма, Объект); + +КонецПроцедуры + +&НаКлиенте +Процедура ДоступКИнформационнойБазеРазрешенПриИзменении(Элемент) + + Если НЕ ПользовательИБСуществует И ДоступКИнформационнойБазеРазрешен Тогда + ПользовательИнфБазыИмя = ПолучитьКраткоеИмяПользователяИБ(ТекущееПредставлениеОбъектаАвторизации); + КонецЕсли; + + УстановитьДоступностьСвойств(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПарольПриИзменении(Элемент) + + ПользовательИнфБазыПароль = Пароль; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьРолиНепосредственноПриИзменении(Элемент) + + Если НЕ Объект.УстановитьРолиНепосредственно Тогда + ПрочитатьПользователяИБ(, Истина); + КонецЕсли; + + УстановитьДоступностьСвойств(); + +КонецПроцедуры + +//** Для работы интерфейса ролей + +&НаКлиенте +Процедура ПодобратьРоли(Команда) + + ОткрытьФорму("Справочник.Пользователи.Форма.ФормаВыбораРолей", Новый Структура("ЗакрыватьПриВыборе", Ложь), Элементы.Роли); + +КонецПроцедуры + +&НаКлиенте +Процедура РолиПриИзменении(Элемент) + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаКлиенте +Процедура РолиПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаКлиенте +Процедура РолиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + ДобавитьВыбранныеРоли(ВыбранноеЗначение); + +КонецПроцедуры + + +&НаКлиенте +Процедура СинонимРолиПриИзменении(Элемент) + + Если ЗначениеЗаполнено(Элементы.Роли.ТекущиеДанные.СинонимРоли) Тогда + Элементы.Роли.ТекущиеДанные.СинонимРоли = СписокВыбораРолей.НайтиПоЗначению(Элементы.Роли.ТекущиеДанные.Роль).Представление; + Иначе + Элементы.Роли.ТекущиеДанные.Роль = ""; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + НачальноеЗначение = ?(Элементы.Роли.ТекущиеДанные = Неопределено, Неопределено, Элементы.Роли.ТекущиеДанные.Роль); + ОткрытьФорму("Справочник.Пользователи.Форма.ФормаВыбораРолей", Новый Структура("ТекущаяСтрока", НачальноеЗначение), Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Элементы.Роли.ТекущиеДанные.Роль = ВыбранноеЗначение; + Элементы.Роли.ТекущиеДанные.СинонимРоли = СписокВыбораРолей.НайтиПоЗначению(Элементы.Роли.ТекущиеДанные.Роль).Представление; + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = СформироватьДанныеВыбораРолей(Текст); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = СформироватьДанныеВыбораРолей(Текст); + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ТаблицаРолейПометкаПриИзменении(Элемент) + + СтрокаТаблицы = Элементы.ТаблицаРолей.ТекущиеДанные; + + НайденныеРоли = Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)); + + Если СтрокаТаблицы.Пометка Тогда + Если НайденныеРоли.Количество() = 0 Тогда + Строка = Роли.Добавить(); + Строка.Роль = СтрокаТаблицы.Имя; + Строка.СинонимРоли = СтрокаТаблицы.Синоним; + КонецЕсли; + ИначеЕсли НайденныеРоли.Количество() > 0 Тогда + Роли.Удалить(НайденныеРоли[0]); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьТолькоВыбранныеРоли(Команда) + + ПоказатьТолькоВыбранныеРоли = НЕ ПоказатьТолькоВыбранныеРоли; + + Элементы.ОтображениеРолей.ТекущаяСтраница = ?(ПоказатьТолькоВыбранныеРоли, Элементы.ТолькоВыбранныеРоли, Элементы.СредиВсехВыбранныеРоли); + ТекущийЭлемент = ?(ПоказатьТолькоВыбранныеРоли, Элементы.Роли, Элементы.ТаблицаРолей); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьФлажки(Команда) + + УстановитьФлажкиНаСервере(); + +КонецПроцедуры + +&НаКлиенте +Процедура СнятьФлажки(Команда) + + СнятьФлажкиНаСервере(); + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции формы +// + +&НаСервере +Функция ТребуетсяСоздатьПервогоАдминистратора() + + УстановитьПривилегированныйРежим(Истина); + + Возврат ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() = 0; + +КонецФункции + +&НаСервере +Процедура ОпределитьДействияВФорме() + + ДействияВФорме = Новый Структура; + ДействияВФорме.Вставить("Роли", ""); // "", "Просмотр", "Редактирование" + ДействияВФорме.Вставить("СвойстваПользователяИБ", ""); // "", "ПросмотрВсех", "РедактированиеВсех", "РедактированиеСвоих" + ДействияВФорме.Вставить("СвойстваЭлемента", ""); // "", "Просмотр", "Редактирование" + + Если Пользователи.ЭтоПолноправныйПользовательИБ() ИЛИ + ПравоДоступа("Добавление", Метаданные.Справочники.Пользователи) Тогда + // Администратор + ДействияВФорме.Роли = "Редактирование"; + ДействияВФорме.СвойстваПользователяИБ = "РедактированиеВсех"; + ДействияВФорме.СвойстваЭлемента = "Редактирование"; + + ИначеЕсли РольДоступна("ДобавлениеИзменениеВнешнихПользователей") Тогда + // Менеджер внешних пользователей + ДействияВФорме.Роли = ""; + ДействияВФорме.СвойстваПользователяИБ = "РедактированиеВсех"; + ДействияВФорме.СвойстваЭлемента = "Просмотр"; + + ИначеЕсли ЗначениеЗаполнено(ВнешниеПользователи.ТекущийВнешнийПользователь()) И + Объект.Ссылка = ВнешниеПользователи.ТекущийВнешнийПользователь() Тогда + // Свои свойства + ДействияВФорме.Роли = ""; + ДействияВФорме.СвойстваПользователяИБ = "РедактированиеСвоих"; + ДействияВФорме.СвойстваЭлемента = "Просмотр"; + Иначе + // Читатель внешних пользователей + ДействияВФорме.Роли = ""; + ДействияВФорме.СвойстваПользователяИБ = ""; + ДействияВФорме.СвойстваЭлемента = "Просмотр"; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(Объект.Ссылка) И НЕ ЗначениеЗаполнено(Объект.ОбъектАвторизации) Тогда + ДействияВФорме.СвойстваЭлемента = "Редактирование"; + КонецЕсли; + + ПользователиПереопределяемый.ИзменитьДействияВФорме(Объект.Ссылка, ДействияВФорме); + + // Проверка имен действий в форме + Если Найти(", Просмотр, Редактирование,", ", " + ДействияВФорме.Роли + ",") = 0 Тогда + ДействияВФорме.Роли = ""; + ИначеЕсли ПользователиПереопределяемый.ЗапретРедактированияРолей() Тогда + ДействияВФорме.Роли = "Просмотр"; + КонецЕсли; + Если Найти(", ПросмотрВсех, РедактированиеВсех, РедактированиеСвоих,", ", " + ДействияВФорме.СвойстваПользователяИБ + ",") = 0 Тогда + ДействияВФорме.СвойстваПользователяИБ = ""; + КонецЕсли; + Если Найти(", Просмотр, Редактирование,", ", " + ДействияВФорме.СвойстваЭлемента + ",") = 0 Тогда + ДействияВФорме.СвойстваЭлемента = ""; + КонецЕсли; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура ОбъектАвторизацииПриИзмененииНаКлиентеНаСервере(Контекст, Объект) + + Если Объект.ОбъектАвторизации = Неопределено Тогда + Объект.ОбъектАвторизации = Контекст.ТипОбъектовАвторизации; + КонецЕсли; + + Если Контекст.ТекущееПредставлениеОбъектаАвторизации <> Строка(Объект.ОбъектАвторизации) Тогда + + Контекст.ТекущееПредставлениеОбъектаАвторизации = Строка(Объект.ОбъектАвторизации); + + Если НЕ Контекст.ПользовательИБСуществует И Контекст.ДоступКИнформационнойБазеРазрешен Тогда + Контекст.ПользовательИнфБазыИмя = ПолучитьКраткоеИмяПользователяИБ(Контекст.ТекущееПредставлениеОбъектаАвторизации); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +//** Чтение, запись, удаление, расчет краткого имени пользователя ИБ, проверка несоответствия + +&НаСервере +Процедура ПрочитатьПользователяИБ(ПриКопированииЭлемента = Ложь, ТолькоРоли = Ложь) + + УстановитьПривилегированныйРежим(Истина); + + ПрочитанныеРоли = Неопределено; + + Если ТолькоРоли Тогда + Пользователи.ПрочитатьПользователяИБ(Объект.ИдентификаторПользователяИБ, , ПрочитанныеРоли); + ЗаполнитьРоли(ПрочитанныеРоли); + Возврат; + КонецЕсли; + + Пароль = ""; + ПодтверждениеПароля = ""; + ПрочитанныеСвойства = Неопределено; + СтарыйИдентификаторПользователяИБ = Неопределено; + ПользовательИБСуществует = Ложь; + ДоступКИнформационнойБазеРазрешен = Ложь; + + // Заполнение начальных значений свойств пользователяИБ у пользователя. + Пользователи.ПрочитатьПользователяИБ(Неопределено, ПрочитанныеСвойства, ПрочитанныеРоли); + ЗаполнитьЗначенияСвойств(ЭтаФорма, ПрочитанныеСвойства); + + Если ПриКопированииЭлемента Тогда + + Если Пользователи.ПрочитатьПользователяИБ(Параметры.ЗначениеКопирования.ИдентификаторПользователяИБ, ПрочитанныеСвойства, ПрочитанныеРоли) Тогда + // Т.к. у скопированного пользователя есть связь с пользователемИБ, + // то устанавливается будущая связь и у нового пользователя. + ДоступКИнформационнойБазеРазрешен = Истина; + // Т.к. пользовательИБ скопированного пользователя прочитан, + // то копируются свойства и роли пользователяИБ. + ЗаполнитьЗначенияСвойств(ЭтаФорма, + ПрочитанныеСвойства, + "ПользовательИнфБазыЗапрещеноИзменятьПароль"); + КонецЕсли; + Объект.ИдентификаторПользователяИБ = Неопределено; + Иначе + Если Пользователи.ПрочитатьПользователяИБ(Объект.ИдентификаторПользователяИБ, ПрочитанныеСвойства, ПрочитанныеРоли) Тогда + + ПользовательИБСуществует = Истина; + ДоступКИнформационнойБазеРазрешен = Истина; + СтарыйИдентификаторПользователяИБ = Объект.ИдентификаторПользователяИБ; + + ЗаполнитьЗначенияСвойств(ЭтаФорма, + ПрочитанныеСвойства, + "ПользовательИнфБазыИмя, + |ПользовательИнфБазыЗапрещеноИзменятьПароль"); + + Если ПрочитанныеСвойства.ПользовательИнфБазыПарольУстановлен Тогда + Пароль = "**********"; + ПодтверждениеПароля = "**********"; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + ЗаполнитьПредставлениеЯзыка(ПрочитанныеСвойства.ПользовательИнфБазыЯзык); + ЗаполнитьРоли(ПрочитанныеРоли); + +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьПользователяИБ(ТекущийОбъект, Отказ) + + // Восстановление действий в форме, если они изменены на клиенте + ОпределитьДействияВФорме(); + + Если НЕ (ДействияВФорме.СвойстваПользователяИБ = "РедактированиеВсех" ИЛИ + ДействияВФорме.СвойстваПользователяИБ = "РедактированиеСвоих" )Тогда + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + НачальныеСвойства = Неопределено; + НовыеСвойства = Неопределено; + НовыеРоли = Неопределено; + + // Чтение старых свойств/заполнение начальных свойств пользователяИБ у пользователя. + Пользователи.ПрочитатьПользователяИБ(ТекущийОбъект.ИдентификаторПользователяИБ, НовыеСвойства); + НовыеСвойства.ПользовательИнфБазыПолноеИмя = Строка(ТекущийОбъект.ОбъектАвторизации); + НовыеСвойства.ПользовательИнфБазыАутентификацияСтандартная = Истина; + + Пользователи.ПрочитатьПользователяИБ(Неопределено, НачальныеСвойства); + ЗаполнитьЗначенияСвойств(НовыеСвойства, + НачальныеСвойства, + "ПользовательИнфБазыПоказыватьВСпискеВыбора, + |ПользовательИнфБазыАутентификацияОС, + |ПользовательИнфБазыОсновнойИнтерфейс, + |ПользовательИнфБазыРежимЗапуска"); + + Если ДействияВФорме.СвойстваПользователяИБ = "РедактированиеВсех" Тогда + ЗаполнитьЗначенияСвойств(НовыеСвойства, + ЭтаФорма, + "ПользовательИнфБазыИмя, + |ПользовательИнфБазыПароль, + |ПользовательИнфБазыЗапрещеноИзменятьПароль"); + Иначе + ЗаполнитьЗначенияСвойств(НовыеСвойства, + ЭтаФорма, + "ПользовательИнфБазыИмя, + |ПользовательИнфБазыПароль"); + КонецЕсли; + НовыеСвойства.ПользовательИнфБазыЯзык = ПолучитьВыбранныйЯзык(); + + Если ДействияВФорме.Роли = "Редактирование" И Объект.УстановитьРолиНепосредственно Тогда + НовыеРоли = Роли.Выгрузить().ВыгрузитьКолонку("Роль"); + КонецЕсли; + + // Попытка записи пользователя ИБ + ОписаниеОшибки = ""; + Если Пользователи.ЗаписатьПользователяИБ(ТекущийОбъект.ИдентификаторПользователяИБ, НовыеСвойства, НовыеРоли, НЕ ПользовательИБСуществует, ОписаниеОшибки) Тогда + Если НЕ ПользовательИБСуществует Тогда + ТекущийОбъект.ИдентификаторПользователяИБ = НовыеСвойства.ПользовательИнфБазыУникальныйИдентификатор; + ПользовательИБСуществует = Истина; + КонецЕсли; + Иначе + Отказ = Истина; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция УдалитьПользователяИБ(Отказ) + + УстановитьПривилегированныйРежим(Истина); + + ОписаниеОшибки = ""; + Если НЕ Пользователи.УдалитьПользователяИБ(СтарыйИдентификаторПользователяИБ, ОписаниеОшибки) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки, , , , Отказ); + КонецЕсли; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ПолучитьКраткоеИмяПользователяИБ(Знач ПолноеИмя) + + КраткоеИмя = ""; + ПервыйПроходЦикла = Истина; + + Пока Истина Цикл + Если НЕ ПервыйПроходЦикла Тогда + КраткоеИмя = КраткоеИмя + ВРег(Лев(ПолноеИмя, 1)); + КонецЕсли; + ПозицияПробела = Найти(ПолноеИмя, " "); + Если ПозицияПробела = 0 Тогда + Если ПервыйПроходЦикла Тогда + КраткоеИмя = ПолноеИмя; + КонецЕсли; + Прервать; + КонецЕсли; + + Если ПервыйПроходЦикла Тогда + КраткоеИмя = Лев(ПолноеИмя, ПозицияПробела - 1); + КонецЕсли; + + ПолноеИмя = Прав(ПолноеИмя, СтрДлина(ПолноеИмя) - ПозицияПробела); + + ПервыйПроходЦикла = Ложь; + КонецЦикла; + + КраткоеИмя = СтрЗаменить(КраткоеИмя, " ", ""); + + Возврат КраткоеИмя; + +КонецФункции + +&НаСервере +Процедура ОпределитьНесоответствияПользователяСПользователемИБ(ПараметрыЗаписи = Неопределено) Экспорт + + //** Определение связи с несуществующим пользователем ИБ + ЕстьНоваяСвязьСНесуществующимПользователемИБ = НЕ ПользовательИБСуществует И ЗначениеЗаполнено(Объект.ИдентификаторПользователяИБ); + Если ПараметрыЗаписи <> Неопределено + И ЕстьСвязьСНесуществующимПользователемИБ + И НЕ ЕстьНоваяСвязьСНесуществующимПользователемИБ Тогда + + ПараметрыЗаписи.Вставить("ОчищенаСвязьСНесуществущимПользователемИБ", Объект.Ссылка); + КонецЕсли; + ЕстьСвязьСНесуществующимПользователемИБ = ЕстьНоваяСвязьСНесуществующимПользователемИБ; + + Если ДействияВФорме.СвойстваПользователяИБ <> "РедактированиеВсех" Тогда + // Связь не может быть изменена + Элементы.СвязьОбработкаНесоответствия.Видимость = Ложь; + Иначе + Элементы.СвязьОбработкаНесоответствия.Видимость = ЕстьСвязьСНесуществующимПользователемИБ; + КонецЕсли; + +КонецПроцедуры + +//** Начальное заполнение, проверка заполнения, доступность свойств + +&НаСервере +Процедура ЗаполнитьПредставлениеЯзыка(Язык) + + ПредставлениеЯзыка = ""; + + Для каждого МетаданныеЯзыка ИЗ Метаданные.Языки Цикл + + Если МетаданныеЯзыка.Имя = Язык Тогда + ПредставлениеЯзыка = МетаданныеЯзыка.Синоним; + Прервать; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Функция ПолучитьВыбранныйЯзык() + + Для каждого МетаданныеЯзыка ИЗ Метаданные.Языки Цикл + + Если МетаданныеЯзыка.Синоним = ПредставлениеЯзыка Тогда + Возврат МетаданныеЯзыка.Имя; + КонецЕсли; + КонецЦикла; + + Возврат ""; + +КонецФункции + +&НаСервере +Процедура ЗаполнитьРоли(ПрочитанныеРоли) + + Роли.Очистить(); + + Для каждого Роль Из ПрочитанныеРоли Цикл + НоваяСтрока = Роли.Добавить(); + НоваяСтрока.Роль = Роль; + НоваяСтрока.СинонимРоли = ТаблицаРолей.НайтиСтроки(Новый Структура("Имя", Роль))[0].Синоним; + КонецЦикла; + + Роли.Сортировать("СинонимРоли"); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьСвойств() + + Элементы.ОбъектАвторизации.ТолькоПросмотр = ДействияВФорме.СвойстваЭлемента <> "Редактирование" ИЛИ + ОбъектАвторизацииЗаданПриОткрытии ИЛИ + ЗначениеЗаполнено(Объект.Ссылка) И + ЗначениеЗаполнено(Объект.ОбъектАвторизации); + Элементы.ДоступКИнформационнойБазеРазрешен.ТолькоПросмотр = ДействияВФорме.СвойстваПользователяИБ <> "РедактированиеВсех"; + Элементы.СвойстваПользователяИБ.ТолькоПросмотр = ДействияВФорме.СвойстваПользователяИБ = "ПросмотрВсех"; + Элементы.Пароль.ТолькоПросмотр = ПользовательИнфБазыЗапрещеноИзменятьПароль; + Элементы.ПодтверждениеПароля.ТолькоПросмотр = ПользовательИнфБазыЗапрещеноИзменятьПароль; + Элементы.ПользовательИнфБазыЗапрещеноИзменятьПароль.ТолькоПросмотр = ДействияВФорме.СвойстваПользователяИБ <> "РедактированиеВсех"; + УстановитьТолькоПросмотрРолей(ДействияВФорме.Роли <> "Редактирование" ИЛИ НЕ Объект.УстановитьРолиНепосредственно); + + Элементы.ОсновныеСвойства.Доступность = ДоступКИнформационнойБазеРазрешен; + Элементы.РедактированиеИлиПросмотрРолей.Доступность = ДоступКИнформационнойБазеРазрешен; + Элементы.ПользовательИнфБазыИмя.АвтоОтметкаНезаполненного = ДоступКИнформационнойБазеРазрешен; + +КонецПроцедуры + +//** Для работы интерфейса ролей + +&НаСервере +Процедура УстановитьДействияСРолями() + + ЗапретРедактирования = ПользователиПереопределяемый.ЗапретРедактированияРолей(); + + // ** ТолькоВыбранныеРоли + // Основное меню + Элементы.РолиПодобрать.Видимость = НЕ ЗапретРедактирования; + Элементы.РолиДобавить.Видимость = НЕ ЗапретРедактирования; + Элементы.РолиУдалить.Видимость = НЕ ЗапретРедактирования; + Элементы.РолиПереместитьВверх.Видимость = НЕ ЗапретРедактирования; + Элементы.РолиПереместитьВниз.Видимость = НЕ ЗапретРедактирования; + Элементы.РолиСортироватьСписокПоВозрастанию.Видимость = НЕ ЗапретРедактирования; + Элементы.РолиСортироватьСписокПоУбыванию.Видимость = НЕ ЗапретРедактирования; + // Контекстное меню + Элементы.КонтекстноеМенюРолиПодобрать.Видимость = НЕ ЗапретРедактирования; + Элементы.КонтекстноеМенюРолиДобавить.Видимость = НЕ ЗапретРедактирования; + Элементы.КонтекстноеМенюРолиУдалить.Видимость = НЕ ЗапретРедактирования; + Элементы.КонтекстноеМенюРолиПереместитьВверх.Видимость = НЕ ЗапретРедактирования; + Элементы.КонтекстноеМенюРолиПереместитьВниз.Видимость = НЕ ЗапретРедактирования; + + // ** СредиВсехВыбранныеРоли + // Основное меню + Элементы.ТаблицаРолейУстановитьФлажки.Видимость = НЕ ЗапретРедактирования; + Элементы.ТаблицаРолейСнятьФлажки.Видимость = НЕ ЗапретРедактирования; + Элементы.ТаблицаРолейСортироватьСписокПоВозрастанию.Видимость = НЕ ЗапретРедактирования; + Элементы.ТаблицаРолейСортироватьСписокПоУбыванию.Видимость = НЕ ЗапретРедактирования; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьФлажкиНаСервере() + + Для каждого СтрокаТаблицы Из ТаблицаРолей Цикл + + СтрокаТаблицы.Пометка = Истина; + + НайденныеРоли = Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)); + Если НайденныеРоли.Количество() = 0 Тогда + Строка = Роли.Добавить(); + Строка.Роль = СтрокаТаблицы.Имя; + Строка.СинонимРоли = СтрокаТаблицы.Синоним; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура СнятьФлажкиНаСервере() + + Для каждого СтрокаТаблицы Из ТаблицаРолей Цикл + + СтрокаТаблицы.Пометка = Ложь; + + НайденныеРоли = Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)); + Если НайденныеРоли.Количество() > 0 Тогда + Роли.Удалить(НайденныеРоли[0]); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьВыбранныеРоли(ВыбранныеРоли) + + Для каждого Значение Из ВыбранныеРоли Цикл + + ЭлементСписка = СписокВыбораРолей.НайтиПоЗначению(Значение); + Если ЭлементСписка <> Неопределено Тогда + + Если Роли.НайтиСтроки(Новый Структура("Роль", Значение)).Количество() = 0 Тогда + + Строка = Роли.Добавить(); + Строка.Роль = ЭлементСписка.Значение; + Строка.СинонимРоли = ЭлементСписка.Представление; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаСервере +Процедура ПодготовитьСписокВыбораИТаблицуРолей() + + ВсеРоли = ПользователиСерверПовтИсп.ВсеРоли(); + ВсеРоли.Сортировать("Синоним"); + + Для каждого Строка Из ВсеРоли Цикл + // Заполнение списка выбора + СписокВыбораРолей.Добавить(Строка.Имя, Строка.Синоним); + // Заполнение таблицы ролей + СтрокаТаблицы = ТаблицаРолей.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Строка); + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьТолькоПросмотрРолей(Знач ТолькоПросмотрРолей) + + Элементы.Роли.ТолькоПросмотр = ТолькоПросмотрРолей; + Элементы.ТаблицаРолей.ТолькоПросмотр = ТолькоПросмотрРолей; + + Элементы.РолиПодобрать.Доступность = НЕ ТолькоПросмотрРолей; + Элементы.КонтекстноеМенюРолиПодобрать.Доступность = НЕ ТолькоПросмотрРолей; + Элементы.ТаблицаРолейУстановитьФлажки.Доступность = НЕ ТолькоПросмотрРолей; + Элементы.ТаблицаРолейСнятьФлажки.Доступность = НЕ ТолькоПросмотрРолей; + +КонецПроцедуры + +&НаКлиенте +Функция СформироватьДанныеВыбораРолей(Текст) + + Список = СписокВыбораРолей.Скопировать(); + + НомерЭлемента = Список.Количество()-1; + Пока НомерЭлемента >= 0 Цикл + Если ВРег(Лев(Список[НомерЭлемента].Представление, СтрДлина(Текст))) <> ВРег(Текст) Тогда + Список.Удалить(НомерЭлемента); + КонецЕсли; + НомерЭлемента = НомерЭлемента - 1; + КонецЦикла; + + Возврат Список; + +КонецФункции + +&НаСервере +Процедура ПометитьРолиПоСписку() + + Для каждого СтрокаТаблицы Из ТаблицаРолей Цикл + + СтрокаТаблицы.Пометка = Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)).Количество() > 0; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияСпискаРолей(Отказ) + + // Проверка незаполненных и повторяющихся ролей. + НомерСтроки = Роли.Количество()-1; + Пока НЕ Отказ И НомерСтроки >= 0 Цикл + + ТекущаяСтрока = Роли.Получить(НомерСтроки); + + // Проверка заполнения значения. + Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.СинонимРоли) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Роль не заполнена!'"), + , + "Роли[" + Формат(НомерСтроки, "ЧГ=0") + "].СинонимРоли", + , + Отказ); + Возврат; + КонецЕсли; + + // Проверка наличия повторяющихся значений. + НайденныеЗначения = Роли.НайтиСтроки(Новый Структура("Роль", ТекущаяСтрока.Роль)); + Если НайденныеЗначения.Количество() > 1 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Роль повторяется!'"), + , + "Роли[" + Формат(НомерСтроки, "ЧГ=0") + "].СинонимРоли", + , + Отказ); + Возврат; + КонецЕсли; + + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + +КонецПроцедуры + + diff --git a/SSL/src/Catalogs/ВнешниеПользователи/ObjectModule.bsl b/SSL/src/Catalogs/ВнешниеПользователи/ObjectModule.bsl new file mode 100644 index 000000000..868617a77 --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеПользователи/ObjectModule.bsl @@ -0,0 +1,114 @@ + +Процедура ПередЗаписью(Отказ) + + Если ИдентификаторПользователяИБ <> Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") И + Пользователи.ПользовательПоИдентификаторуСуществует(ИдентификаторПользователяИБ, Ссылка) Тогда + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Один пользователь информационной базы + |может быть связан только с одним пользователем или внешним пользователем!'"), , , , Отказ); + Возврат; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(ОбъектАвторизации) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Для внешнего пользователя не установлен объект авторизации!'"), , , , Отказ); + Возврат; + Иначе + Если ВнешниеПользователи.ОбъектАвторизацииИспользуется(ОбъектАвторизации, Ссылка) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Объект авторизации уже используется для другого внешнего пользователя!'"), , , , Отказ); + Возврат; + КонецЕсли; + КонецЕсли; + + // Проверка, что объект авторизации не изменен + Если НЕ ЭтоНовый() Тогда + СтарыйОбъектАвторизации = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Ссылка, "ОбъектАвторизации"); + Если ЗначениеЗаполнено(СтарыйОбъектАвторизации) И СтарыйОбъектАвторизации <> ОбъектАвторизации Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Объект информационной базы нельзя изменять (и не нужно)!'"), , , , Отказ); + Возврат; + КонецЕсли; + КонецЕсли; + + // Автообновление наименования по представлению объекта авторизации. + УстановитьПривилегированныйРежим(Истина); + Наименование = Строка(ОбъектАвторизации); + УстановитьПривилегированныйРежим(Ложь); + + //Если ОбменДанными.Загрузка Тогда + // Возврат; + //КонецЕсли; + +КонецПроцедуры + +Процедура ПриЗаписи(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + ЕстьОшибки = Ложь; + + МенеджерЗаписи = РегистрыСведений.СоставГруппПользователей.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ГруппаПользователей = Ссылка; + МенеджерЗаписи.Пользователь = Ссылка; + МенеджерЗаписи.Прочитать(); + Если НЕ МенеджерЗаписи.Выбран() Тогда + МенеджерЗаписи.ГруппаПользователей = Ссылка; + МенеджерЗаписи.Пользователь = Ссылка; + МенеджерЗаписи.Записать(); + // Обновление состава автоматической группы "Все внешние пользователи". + ИзмененныеВнешниеПользователи = Неопределено; + ВнешниеПользователи.ОбновитьСоставГруппВнешнихПользователей(Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи, ИзмененныеВнешниеПользователи); + ВнешниеПользователи.ОбновитьРолиВнешнихПользователей(ИзмененныеВнешниеПользователи, ЕстьОшибки); + + // Обновление состава автоматической группы <все объекты авторизации одного типа> (если есть). + Если ЗначениеЗаполнено(ОбъектАвторизации) Тогда + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ГруппыВнешнихПользователей.Ссылка + |ИЗ + | Справочник.ГруппыВнешнихПользователей КАК ГруппыВнешнихПользователей + |ГДЕ + | ГруппыВнешнихПользователей.ВсеОбъектыАвторизации + | И ТИПЗНАЧЕНИЯ(ГруппыВнешнихПользователей.ТипОбъектовАвторизации) = &ТипОбъектовАвторизации"); + Запрос.УстановитьПараметр("ТипОбъектовАвторизации", ТипЗнч(ОбъектАвторизации)); + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + ВнешниеПользователи.ОбновитьСоставГруппВнешнихПользователей(Выборка.Ссылка, ИзмененныеВнешниеПользователи); + ВнешниеПользователи.ОбновитьРолиВнешнихПользователей(ИзмененныеВнешниеПользователи, ЕстьОшибки); + КонецЕсли; + КонецЕсли; + + // Обновление состава группы нового внешнего пользователя (если задана). + Если ДополнительныеСвойства.Свойство("ГруппаНовогоВнешнегоПользователя") И + ЗначениеЗаполнено(ДополнительныеСвойства.ГруппаНовогоВнешнегоПользователя) Тогда + + ОбъектГруппы = ДополнительныеСвойства.ГруппаНовогоВнешнегоПользователя.ПолучитьОбъект(); + ОбъектГруппы.Состав.Добавить().ВнешнийПользователь = Ссылка; + ОбъектГруппы.Записать(); + ВнешниеПользователи.ОбновитьСоставГруппВнешнихПользователей(ОбъектГруппы.Ссылка, ИзмененныеВнешниеПользователи); + ВнешниеПользователи.ОбновитьРолиВнешнихПользователей(ИзмененныеВнешниеПользователи, ЕстьОшибки); + КонецЕсли; + Иначе + ИзмененныеВнешниеПользователи = Новый Массив; + ИзмененныеВнешниеПользователи.Добавить(Ссылка); + ВнешниеПользователи.ОбновитьРолиВнешнихПользователей(ИзмененныеВнешниеПользователи, ЕстьОшибки); + КонецЕсли; + + Если ЕстьОшибки И НЕ ДополнительныеСвойства.Свойство("ЕстьОшибки") Тогда + ДополнительныеСвойства.Вставить("ЕстьОшибки"); + КонецЕсли; + +КонецПроцедуры + +Процедура ПередУдалением(Отказ) + + Если Пользователи.ПользовательИБСуществует(ИдентификаторПользователяИБ) Тогда + + Отказ = НЕ Пользователи.УдалитьПользователяИБ(ИдентификаторПользователяИБ); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/ВнешниеПользователи/ВнешниеПользователи.mdo b/SSL/src/Catalogs/ВнешниеПользователи/ВнешниеПользователи.mdo new file mode 100644 index 000000000..c76833eac --- /dev/null +++ b/SSL/src/Catalogs/ВнешниеПользователи/ВнешниеПользователи.mdo @@ -0,0 +1,211 @@ + + + + + + + + + + ВнешниеПользователи + + ru + Внешние пользователи + + true + Catalog.ВнешниеПользователи.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Catalog.ВнешниеПользователи.EmptyRef + + Use + + + + + Use + Description + + ru + Представление + + + Use + + + + + Use + Code + + ru + Удалить Логин + + + Use + + + + Use + Managed + Use + + ru + Внешний пользователь + + 2 + 30 + 100 + String + Variable + AsDescription + InDialog + BothWays + Catalog.ВнешниеПользователи.Form.ФормаЭлемента + Catalog.ВнешниеПользователи.Form.ФормаСписка + Catalog.ВнешниеПользователи.Form.ФормаСписка + + УдалитьПароль + + ru + Удалить Пароль + + + String + + 30 + + + + + + Use + Use + + + ОбъектАвторизации + + ru + Объект информационной базы + + + String + + 10 + + + + + ShowError + + Use + Use + + + ИдентификаторПользователяИБ + + ru + Идентификатор пользователя ИБ + + Требуется для сопоставления элемента справочника ВнешниеПользователи пользователю ИБ + + UUID + + + + + Use + + + УстановитьРолиНепосредственно + + ru + Установить роли непосредственно + + Используется, если не встроена подсистема "Управление доступом" + + Boolean + + + ru + Установить роли непосредственно без использования ролей, заданных в группах внешних пользователей + + + + + Use + Use + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ObjectModule.bsl b/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ObjectModule.bsl new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ObjectModule.bsl @@ -0,0 +1 @@ + diff --git a/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ВопросыШаблонаАнкеты.mdo b/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ВопросыШаблонаАнкеты.mdo new file mode 100644 index 000000000..8412546b4 --- /dev/null +++ b/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ВопросыШаблонаАнкеты.mdo @@ -0,0 +1,331 @@ + + + + + + + + + + ВопросыШаблонаАнкеты + + ru + Вопросы шаблона анкеты + + true + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.Description + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.Code + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + Managed + Use + + ru + Вопрос шаблона анкеты + + true + 2 + true + Catalog.ШаблоныАнкет + 9 + 150 + Variable + WithinSubordination + true + true + AsDescription + InDialog + BothWays + + Формулировка + + ru + Формулировка + + + String + + 300 + + + + + + Use + ForFolderAndItem + Use + + + Обязательный + + ru + Обязательный + + + Boolean + + + + + Use + Use + + + ТипВопроса + + ru + Тип вопроса + + + EnumRef.ТипыВопросовШаблонаАнкеты + + + + + Enum.ТипыВопросовШаблонаАнкеты.EmptyRef + + Use + Use + + + ТипТабличногоВопроса + + ru + Тип табличного вопроса + + + EnumRef.ТипыТабличныхВопросов + + + + + Enum.ТипыТабличныхВопросов.EmptyRef + + Use + Use + + + ЭлементарныйВопрос + + ru + Элементарный вопрос + + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.EmptyRef + + Use + Use + + + РодительВопрос + + ru + Родитель вопрос + + + CatalogRef.ВопросыШаблонаАнкеты + + + + + Use + Use + + + ВысотаЭлементаФормулировкиВопроса + + ru + Высота элемента формулировки вопроса + + + Number + + 2 + true + + + + + + Use + Use + + + Заметки + + ru + Заметки + + + String + + + + + + Use + ForFolderAndItem + Use + + + + + + + СоставТабличногоВопроса + + ru + Состав табличного вопроса + + + Use + LineNumber + + Use + + + + + ЭлементарныйВопрос + + ru + Элементарный вопрос + + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + + Use + Use + + + + + + + + ПредопределенныеОтветы + + ru + Предопределенные ответы + + + Use + LineNumber + + Use + + + + + ЭлементарныйВопрос + + ru + Элементарный вопрос + + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + + Use + Use + + + Ответ + + ru + Ответ + + + Characteristic.ВопросыДляАнкетирования + + + + Use + Use + + + diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..a7bf3074a --- /dev/null +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,35 @@ + + + + + false + ПометкаУдаления + Equal + false + + + false + Ссылка + NotInList + Справочник.ГруппыВнешнихПользователей.ВсеВнешниеПользователи + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + Предопределенный + Desc + + + Наименование + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..0d21083b4 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Form.form @@ -0,0 +1,295 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 4 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Комментарий + 6 + true + true + + + Список.Комментарий + + + КомментарийРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 9 + + СписокСтрокаПоискаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 10 + true + + Список + + true + + + + СписокСостояниеПросмотра + 12 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 13 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 15 + + СписокУправлениеПоискомРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 16 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + Tree + true + true + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + + Список.НомерКартинки + + + CommonPicture.ПиктограммыПользователя + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
+ + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + ВЫБРАТЬ + ГруппыВнешнихПользователей.Ссылка, + ГруппыВнешнихПользователей.ПометкаУдаления, + ГруппыВнешнихПользователей.Предопределенный, + ГруппыВнешнихПользователей.Родитель, + ГруппыВнешнихПользователей.Наименование, + ГруппыВнешнихПользователей.Комментарий, + ВЫБОР + КОГДА ГруппыВнешнихПользователей.ПометкаУдаления + ТОГДА 8 + ИНАЧЕ 9 + КОНЕЦ КАК НомерКартинки +ИЗ + Справочник.ГруппыВнешнихПользователей КАК ГруппыВнешнихПользователей + Catalog.ГруппыВнешнихПользователей + true + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..614308e32 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,22 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.РежимВыбора Тогда + + Элементы.Список.РежимВыбора = Истина; + // Отбор не помеченных на удаление + Список.Отбор.Элементы[0].Использование = Истина; + Список.Отбор.Элементы[1].Использование = Параметры.Свойство("ВыборРодителя"); + + Если Параметры.ЗакрыватьПриВыборе = Ложь Тогда + // Режим подбора + Заголовок = НСтр("ru = 'Подбор групп внешних пользователей'"); + Элементы.Список.МножественныйВыбор = Истина; + Элементы.Список.РежимВыделения = РежимВыделенияТаблицы.Множественный; + Иначе + Заголовок = НСтр("ru = 'Выбор группы внешних пользователей'"); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..39e54cfbf --- /dev/null +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,2591 @@ + + + + Наименование + 4 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + Left + + 40 + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Родитель + 40 + true + true + + true + + + Объект.Parent + + + OnChange + РодительПриИзменении + + + РодительРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + + РодительКонтекстноеМеню + 41 + true + + InputField + Enter + true + Left + true + + + StartChoice + РодительНачалоВыбора + + true + true + true + true + true + true + Normal + + + + СоставИРоли + 9 + + ВнешниеПользователиГруппы + 55 + + ТипПользователей + 124 + + ПредставлениеТипаОбъектовАвторизации + 127 + true + true + + true + + + ПредставлениеТипаОбъектовАвторизации + + + OnChange + ПредставлениеТипаОбъектовАвторизацииПриИзменении + + + ПредставлениеТипаОбъектовАвторизацииРасширеннаяПодсказка + 138 + Label + true + true + + Left + + + + ПредставлениеТипаОбъектовАвторизацииКонтекстноеМеню + 128 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПредставлениеТипаОбъектовАвторизацииНачалоВыбора + + true + true + true + true + true + true + true + Normal + + + + ВсеОбъектыАвторизации + 129 + true + true + + true + + + Объект.ВсеОбъектыАвторизации + + + OnChange + ВсеОбъектыАвторизацииПриИзменении + + + ВсеОбъектыАвторизацииРасширеннаяПодсказка + 140 + Label + true + true + + Left + + + + ВсеОбъектыАвторизацииКонтекстноеМеню + 130 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Тип пользователей</value> + + + ТипПользователейРасширеннаяПодсказка + 137 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Состав + 10 + + <key>ru</key> + <value>Внешние пользователи</value> + + + System.DefaultGUIFont + + true + true + + true + + + Объект.Состав + + false + None + Copy + + СоставВнешнийПользователь + 53 + true + true + + true + + + Объект.Состав.ВнешнийПользователь + + + СоставВнешнийПользовательРасширеннаяПодсказка + 164 + Label + true + true + + Left + + + + СоставВнешнийПользовательКонтекстноеМеню + 54 + true + + InputField + Auto + true + Left + true + + + StartChoice + СоставВнешнийПользовательНачалоВыбора + + true + true + true + true + true + true + Normal + + + + СоставКоманднаяПанель + 12 + + СоставПодобрать + 31 + true + true + + true + + false + + СоставПодобратьРасширеннаяПодсказка + 146 + Label + true + true + + Left + + + Form.Command.ПодобратьВнешнихПользователей + Normal + Auto + true + true + UserCmds + Auto + + + СоставДобавить + 32 + true + true + + true + + false + + СоставДобавитьРасширеннаяПодсказка + 147 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + СоставСкопировать + 49 + true + true + + true + + false + + СоставСкопироватьРасширеннаяПодсказка + 148 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + СоставУдалить + 33 + true + true + + true + + false + + СоставУдалитьРасширеннаяПодсказка + 149 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + СоставПереместитьВверх + 43 + true + true + + true + + false + + СоставПереместитьВверхРасширеннаяПодсказка + 150 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + СоставПереместитьВниз + 44 + true + true + + true + + false + + СоставПереместитьВнизРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + СортироватьПоВозрастанию + 34 + true + true + + true + + false + + СортироватьПоВозрастаниюРасширеннаяПодсказка + 152 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СортироватьПоУбыванию + 35 + true + true + + true + + false + + СортироватьПоУбываниюРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + Left + + + ChoiceProcessing + СоставОбработкаВыбора + + + СоставСтрокаПоиска + 155 + + СоставСтрокаПоискаРасширеннаяПодсказка + 157 + Label + true + true + + Left + + + + СоставСтрокаПоискаКонтекстноеМеню + 156 + true + + Состав + + true + + + + СоставСостояниеПросмотра + 158 + + СоставСостояниеПросмотраРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + + СоставСостояниеПросмотраКонтекстноеМеню + 159 + true + + ViewStatusAddition + Состав + + true + + + + СоставУправлениеПоиском + 161 + + СоставУправлениеПоискомРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + + СоставУправлениеПоискомКонтекстноеМеню + 162 + true + + SearchControlAddition + Состав + + true + + + + СоставРасширеннаяПодсказка + 154 + Label + true + true + + Left + + + + СоставКонтекстноеМеню + 11 + + КонтекстноеМенюСоставПодобрать + 42 + true + true + + true + + false + + КонтекстноеМенюСоставПодобратьРасширеннаяПодсказка + 142 + Label + true + true + + Left + + + Form.Command.ПодобратьВнешнихПользователей + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСоставДобавить + 45 + true + true + + true + + false + + КонтекстноеМенюСоставДобавитьРасширеннаяПодсказка + 143 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСоставСкопировать + 50 + true + true + + true + + false + + КонтекстноеМенюСоставСкопироватьРасширеннаяПодсказка + 144 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСоставУдалить + 46 + true + true + + true + + false + + КонтекстноеМенюСоставУдалитьРасширеннаяПодсказка + 145 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + true + true + 30 + true + true + 12 + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + true + true + + Style.BorderColor + + None + None + None + true + + + true + true + + true + + + <key>ru</key> + <value>Внешние пользователи</value> + + + ru + Внешние пользователи группы + + + ВнешниеПользователиГруппыРасширеннаяПодсказка + 136 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + РолиГруппы + 56 + + ОтображениеРолей + 64 + + ТолькоВыбранныеРоли + 65 + + Роли + 66 + + <key>ru</key> + <value>Разрешенные действия (роли)</value> + + + System.DefaultGUIFont + true + false + false + false + + true + true + + true + + + Объект.Роли + + false + None + CancelSearch + Copy + CopyToClipboard + EndEdit + Find + OutputList + + СинонимРоли + 110 + + <key>ru</key> + <value>Разрешенное действие (роль)</value> + + true + true + + true + + + Объект.Роли.СинонимРоли + + + ru + Синоним роли, как он задан в конфигураторе + + + OnChange + СинонимРолиПриИзменении + + + СинонимРолиРасширеннаяПодсказка + 201 + Label + true + true + + Left + + + + СинонимРолиКонтекстноеМеню + 111 + true + + InputField + true + Enter + true + Left + true + + + AutoComplete + СинонимРолиАвтоПодбор + + + StartChoice + СинонимРолиНачалоВыбора + + + TextEditEnd + СинонимРолиОкончаниеВводаТекста + + + ChoiceProcessing + СинонимРолиОбработкаВыбора + + true + true + true + true + true + true + true + Normal + + + + РолиКоманднаяПанель + 68 + + РолиПодобрать + 78 + true + true + + true + + false + + РолиПодобратьРасширеннаяПодсказка + 183 + Label + true + true + + Left + + + Form.Command.ПодобратьРоли + Normal + Auto + true + true + UserCmds + Auto + + + РолиДобавить + 79 + true + true + + true + + false + + РолиДобавитьРасширеннаяПодсказка + 184 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + РолиУдалить + 81 + true + true + + true + + false + + РолиУдалитьРасширеннаяПодсказка + 185 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + РолиПереместитьВверх + 82 + true + true + + true + + false + + РолиПереместитьВверхРасширеннаяПодсказка + 186 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + РолиПереместитьВниз + 83 + true + true + + true + + false + + РолиПереместитьВнизРасширеннаяПодсказка + 187 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + РолиСортироватьСписокПоВозрастанию + 84 + true + true + + true + + false + + РолиСортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 188 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + РолиСортироватьСписокПоУбыванию + 85 + true + true + + true + + false + + РолиСортироватьСписокПоУбываниюРасширеннаяПодсказка + 189 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + РолиПоказатьСредиВсехВыбранныеРоли + 86 + true + true + + true + + false + + РолиПоказатьСредиВсехВыбранныеРолиРасширеннаяПодсказка + 190 + Label + true + true + + Left + + + Form.Command.ПоказатьТолькоВыбранныеРоли + Normal + Auto + true + true + UserCmds + true + Auto + + Left + + + OnEditEnd + РолиПриОкончанииРедактирования + + + ChoiceProcessing + РолиОбработкаВыбора + + + OnChange + РолиПриИзменении + + + РолиСтрокаПоиска + 192 + + РолиСтрокаПоискаРасширеннаяПодсказка + 194 + Label + true + true + + Left + + + + РолиСтрокаПоискаКонтекстноеМеню + 193 + true + + Роли + + true + + + + РолиСостояниеПросмотра + 195 + + РолиСостояниеПросмотраРасширеннаяПодсказка + 197 + Label + true + true + + Left + + + + РолиСостояниеПросмотраКонтекстноеМеню + 196 + true + + ViewStatusAddition + Роли + + true + + + + РолиУправлениеПоиском + 198 + + РолиУправлениеПоискомРасширеннаяПодсказка + 200 + Label + true + true + + Left + + + + РолиУправлениеПоискомКонтекстноеМеню + 199 + true + + SearchControlAddition + Роли + + true + + + + РолиРасширеннаяПодсказка + 191 + Label + true + true + + Left + + + + РолиКонтекстноеМеню + 67 + + КонтекстноеМенюРолиПодобрать + 71 + true + true + + true + + false + + КонтекстноеМенюРолиПодобратьРасширеннаяПодсказка + 177 + Label + true + true + + Left + + + Form.Command.ПодобратьРоли + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиДобавить + 72 + true + true + + true + + false + + КонтекстноеМенюРолиДобавитьРасширеннаяПодсказка + 178 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиУдалить + 74 + true + true + + true + + false + + КонтекстноеМенюРолиУдалитьРасширеннаяПодсказка + 179 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиПереместитьВверх + 75 + true + true + + true + + false + + КонтекстноеМенюРолиПереместитьВверхРасширеннаяПодсказка + 180 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиПереместитьВниз + 76 + true + true + + true + + false + + КонтекстноеМенюРолиПереместитьВнизРасширеннаяПодсказка + 181 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиВыделитьВсе + 77 + true + true + + true + + false + + КонтекстноеМенюРолиВыделитьВсеРасширеннаяПодсказка + 182 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.SelectAll + Normal + Auto + true + true + UserCmds + Auto + + + 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>Только выбранные роли</value> + + + ТолькоВыбранныеРолиРасширеннаяПодсказка + 176 + Label + true + true + + Left + + + Page + + Vertical + auto + +
+ + СредиВсехВыбранныеРоли + 87 + + ТаблицаРолей + 88 + true + true + + true + + + ТаблицаРолей + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + OutputList + SelectAll + + ТаблицаРолейПометка + 112 + true + true + + true + + + ТаблицаРолей.Пометка + + None + + OnChange + ТаблицаРолейПометкаПриИзменении + + + ТаблицаРолейПометкаРасширеннаяПодсказка + 231 + Label + true + true + + Left + + + + ТаблицаРолейПометкаКонтекстноеМеню + 113 + true + + CheckBoxField + Auto + true + Left + true + + + + ТаблицаРолейСиноним + 114 + true + true + + true + + + ТаблицаРолей.Синоним + + + ru + Синоним роли, как он задан в конфигураторе + + + ТаблицаРолейСинонимРасширеннаяПодсказка + 233 + Label + true + true + + Left + + + + ТаблицаРолейСинонимКонтекстноеМеню + 115 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейСинонимыПодсистем + 116 + true + true + + + ТаблицаРолей.СинонимыПодсистем + + + ru + Синонимы подсистем, в которые входит роль + + + ТаблицаРолейСинонимыПодсистемРасширеннаяПодсказка + 235 + Label + true + true + + Left + + + + ТаблицаРолейСинонимыПодсистемКонтекстноеМеню + 117 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейИмя + 118 + true + true + + + ТаблицаРолей.Имя + + + ru + Имя роли, как оно задано в конфигураторе + + + ТаблицаРолейИмяРасширеннаяПодсказка + 237 + Label + true + true + + Left + + + + ТаблицаРолейИмяКонтекстноеМеню + 119 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейИменаПодсистем + 120 + true + true + + + ТаблицаРолей.ИменаПодсистем + + + ru + Имена подсистем в которые входит роль + + + ТаблицаРолейИменаПодсистемРасширеннаяПодсказка + 239 + Label + true + true + + Left + + + + ТаблицаРолейИменаПодсистемКонтекстноеМеню + 121 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейКоманднаяПанель + 90 + + ТаблицаРолейУстановитьФлажки + 103 + true + true + + true + + false + + ТаблицаРолейУстановитьФлажкиРасширеннаяПодсказка + 214 + Label + true + true + + Left + + + Form.Command.УстановитьФлажки + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРолейСнятьФлажки + 104 + true + true + + true + + false + + ТаблицаРолейСнятьФлажкиРасширеннаяПодсказка + 215 + Label + true + true + + Left + + + Form.Command.СнятьФлажки + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРолейНайти + 105 + true + true + + true + + false + + ТаблицаРолейНайтиРасширеннаяПодсказка + 216 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейОтменитьПоиск + 106 + true + true + + true + + false + + ТаблицаРолейОтменитьПоискРасширеннаяПодсказка + 217 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейСортироватьСписокПоВозрастанию + 107 + true + true + + true + + false + + ТаблицаРолейСортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 218 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейСортироватьСписокПоУбыванию + 108 + true + true + + true + + false + + ТаблицаРолейСортироватьСписокПоУбываниюРасширеннаяПодсказка + 219 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейПоказатьТолькоВыбранныеРоли + 109 + true + true + + true + + false + + ТаблицаРолейПоказатьТолькоВыбранныеРолиРасширеннаяПодсказка + 220 + Label + true + true + + Left + + + Form.Command.ПоказатьТолькоВыбранныеРоли + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + ТаблицаРолейСтрокаПоиска + 222 + + ТаблицаРолейСтрокаПоискаРасширеннаяПодсказка + 224 + Label + true + true + + Left + + + + ТаблицаРолейСтрокаПоискаКонтекстноеМеню + 223 + true + + ТаблицаРолей + + true + + + + ТаблицаРолейСостояниеПросмотра + 225 + + ТаблицаРолейСостояниеПросмотраРасширеннаяПодсказка + 227 + Label + true + true + + Left + + + + ТаблицаРолейСостояниеПросмотраКонтекстноеМеню + 226 + true + + ViewStatusAddition + ТаблицаРолей + + true + + + + ТаблицаРолейУправлениеПоиском + 228 + + ТаблицаРолейУправлениеПоискомРасширеннаяПодсказка + 230 + Label + true + true + + Left + + + + ТаблицаРолейУправлениеПоискомКонтекстноеМеню + 229 + true + + SearchControlAddition + ТаблицаРолей + + true + + + + ТаблицаРолейРасширеннаяПодсказка + 221 + Label + true + true + + Left + + + + ТаблицаРолейКонтекстноеМеню + 89 + + КонтекстноеМенюТаблицаРолейНайти + 101 + true + true + + true + + false + + КонтекстноеМенюТаблицаРолейНайтиРасширеннаяПодсказка + 212 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюТаблицаРолейОтменитьПоиск + 102 + true + true + + true + + false + + КонтекстноеМенюТаблицаРолейОтменитьПоискРасширеннаяПодсказка + 213 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + true + + 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>Среди всех выбранные роли</value> + + + СредиВсехВыбранныеРолиРасширеннаяПодсказка + 211 + Label + true + true + + Left + + + Page + + Vertical + auto + +
+ true + true + + true + + + <key>ru</key> + <value>Отображение ролей</value> + + + ОтображениеРолейРасширеннаяПодсказка + 175 + Label + true + true + + Left + + + Pages + + Auto + +
+ true + true + + true + + + <key>ru</key> + <value>Роли</value> + + + ru + Роли группы + + + РолиГруппыРасширеннаяПодсказка + 174 + Label + true + true + + Left + + + Page + + Vertical + auto + +
+ true + true + + true + + + <key>ru</key> + <value>Состав и роли</value> + + + ru + Состав и роли + + + СоставИРолиРасширеннаяПодсказка + 135 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + +
+ + Комментарий + 38 + true + true + + true + + + Объект.Комментарий + + + КомментарийРасширеннаяПодсказка + 249 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 39 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + Top + true + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + + FillCheckProcessingAtServer + ОбработкаПроверкиЗаполненияНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + DontBlock + Use + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + + <key>ru</key> + <value>Объект</value> + + 2 + + CatalogObject.ГруппыВнешнихПользователей + + + true + + + true + +
true
+ true + + + Объект.Роли + + + СинонимРоли + + <key>ru</key> + <value>Синоним роли</value> + + 1 + + String + + + + true + + + true + + + +
+ + ПоказатьТолькоВыбранныеРоли + + <key>ru</key> + <value>Показать только выбранные роли</value> + + 1 + + Boolean + + + true + + + true + + + ПоказатьТолькоВыбранныеРоли + + + + СписокВыбораРолей + + <key>ru</key> + <value>Список выбора ролей</value> + + 3 + + ValueList + + + true + + + true + + + + + + + ТаблицаРолей + + <key>ru</key> + <value>Таблица ролей</value> + + 4 + + ValueTable + + + true + + + true + + true + + Имя + + <key>ru</key> + <value>Имя роли</value> + + 1 + + String + + + + true + + + true + + + + Синоним + + <key>ru</key> + <value>Разрешенное действие (роль)</value> + + 2 + + String + + + + true + + + true + + + + ИменаПодсистем + + <key>ru</key> + <value>Имена подсистем</value> + + 3 + + String + + + + true + + + true + + + + СинонимыПодсистем + + <key>ru</key> + <value>Подсистемы</value> + + 4 + + String + + + + true + + + true + + + + Пометка + + <key>ru</key> + <value>Пометка</value> + + 5 + + Boolean + + + true + + + true + + + + + ДействияВФорме + + <key>ru</key> + <value>Действия в форме</value> + + 5 + + + true + + + true + + + + ПредставлениеТипаОбъектовАвторизации + + <key>ru</key> + <value>Участники группы</value> + + 6 + + String + + + + true + + + true + + true + + + ТипыОбъектовАвторизации + + <key>ru</key> + <value>Типы объектов авторизации</value> + + 7 + + ValueList + + + true + + + true + + + + + + + ПодобратьВнешнихПользователей + + <key>ru</key> + <value>Подобрать</value> + + 1 + + ru + Подбор пользователей + + + true + + + + ПодобратьВнешнихПользователей + + + true + Auto + Auto + + + ПодобратьРоли + + <key>ru</key> + <value>Подобрать</value> + + 2 + + ru + Подобрать роли + + + true + + + + ПодобратьРоли + + + true + Auto + Auto + + + ПоказатьТолькоВыбранныеРоли + + <key>ru</key> + <value>Показать только выбранные роли</value> + + 3 + + ru + Показать только выбранные роли + + + true + + + CommonPicture.ПоказатьТолькоВыбранныеРоли + + + + ПоказатьТолькоВыбранныеРоли + + + Picture + Auto + Auto + + + СнятьФлажки + + <key>ru</key> + <value>Снять флажки</value> + + 5 + + ru + Снять флажки + + + true + + + StdPicture.UncheckAll + + + + СнятьФлажки + + + true + Auto + Auto + + + УстановитьФлажки + + <key>ru</key> + <value>Установить флажки</value> + + 6 + + ru + Установить флажки + + + true + + + StdPicture.CheckAll + + + + УстановитьФлажки + + + true + Auto + Auto + + + + + + + + AfterWrite + ПослеЗаписи + + + AfterWriteAtServer + ПослеЗаписиНаСервере + + + OnReadAtServer + ПриЧтенииНаСервере + + +
diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..fcef121ab --- /dev/null +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,679 @@ + +////////////////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + //** Установка начальных значений + // перед загрузкой данных из настроек на сервере + // для случая, когда данные ещё не были записаны и не загружаются + ПоказатьТолькоВыбранныеРоли = (Элементы.ОтображениеРолей.ТекущаяСтраница = Элементы.ТолькоВыбранныеРоли); + + //** Подготовка постоянных данных + + ЗаполнитьСписокТиповОбъектовАвторизации(); + + ПодготовитьСписокВыбораИТаблицуРолей(); + + // Удаление роли ПолныеПрава из списка выбора и таблицы ролей + СписокВыбораРолей.Удалить(СписокВыбораРолей.НайтиПоЗначению("ПолныеПрава")); + ТаблицаРолей.Удалить(ТаблицаРолей.НайтиСтроки(Новый Структура("Имя", "ПолныеПрава"))[0]); + + //** Заполнение изменяемых данных + + // При создании копированием + Если Объект.Роли.Количество() > 0 И НЕ ЗначениеЗаполнено(Объект.Роли[0].СинонимРоли) Тогда + ЗаполнитьСинонимыТабличнойЧастиРоли(); + КонецЕсли; + + Если Объект.Ссылка = Справочники.ГруппыВнешнихПользователей.ПустаяСсылка() И + Объект.Родитель.Ссылка = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда + + Объект.Родитель = Справочники.ГруппыВнешнихПользователей.ПустаяСсылка(); + КонецЕсли; + + ОпределитьДействияВФорме(); + + //** Установка постоянной доступности свойств + + Элементы.Наименование.Видимость = ЗначениеЗаполнено(ДействияВФорме.СвойстваЭлемента); + Элементы.Родитель.Видимость = ЗначениеЗаполнено(ДействияВФорме.СвойстваЭлемента); + Элементы.Комментарий.Видимость = ЗначениеЗаполнено(ДействияВФорме.СвойстваЭлемента); + Элементы.Состав.Видимость = ЗначениеЗаполнено(ДействияВФорме.СоставГруппы); + Элементы.ОтображениеРолей.Видимость = ЗначениеЗаполнено(ДействияВФорме.Роли); + + ЭтоГруппаВсеВнешниеПользователи = (Объект.Ссылка = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи); + + ТолькоПросмотр = ТолькоПросмотр ИЛИ + НЕ ЭтоГруппаВсеВнешниеПользователи И + ДействияВФорме.Роли <> "Редактирование" И + ДействияВФорме.СоставГруппы <> "Редактирование" И + ДействияВФорме.СвойстваЭлемента <> "Редактирование"; + + Элементы.Наименование.ТолькоПросмотр = ЭтоГруппаВсеВнешниеПользователи ИЛИ ДействияВФорме.СвойстваЭлемента <> "Редактирование"; + Элементы.Родитель.ТолькоПросмотр = ЭтоГруппаВсеВнешниеПользователи ИЛИ ДействияВФорме.СвойстваЭлемента <> "Редактирование"; + Элементы.Комментарий.ТолькоПросмотр = ЭтоГруппаВсеВнешниеПользователи ИЛИ ДействияВФорме.СвойстваЭлемента <> "Редактирование"; + Элементы.ВнешниеПользователиГруппы.ТолькоПросмотр = ЭтоГруппаВсеВнешниеПользователи ИЛИ ДействияВФорме.СоставГруппы <> "Редактирование"; + + УстановитьТолькоПросмотрРолей(ДействияВФорме.Роли <> "Редактирование"); + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + УстановитьДоступностьСвойств(); + +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + + ЗаполнитьСинонимыТабличнойЧастиРоли(); + +КонецПроцедуры + +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + + Если ТекущийОбъект.ДополнительныеСвойства.Свойство("ЕстьОшибки") Тогда + ПараметрыЗаписи.Вставить("ЕстьОшибки"); + КонецЕсли; + + ЗаполнитьСинонимыТабличнойЧастиРоли(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + Оповестить("ИзмененаГруппаВнешнихПользователей", Объект.Ссылка, ЭтаФорма); + + Если ПараметрыЗаписи.Свойство("ЕстьОшибки") Тогда + Предупреждение(НСтр("ru = 'При записи возникли ошибки (см. журнал регистрации)'")); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + + ОбработкаПроверкиЗаполненияСпискаРолей(Отказ); + + // Проверка незаполненных и повторяющихся внешних пользователей. + НомерСтроки = Объект.Состав.Количество()-1; + + Пока НЕ Отказ И НомерСтроки >= 0 Цикл + ТекущаяСтрока = Объект.Состав.Получить(НомерСтроки); + + // Проверка заполнения значения. + Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.ВнешнийПользователь) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не заполнен внешний пользователь!'"), + , + "Объект.Состав[" + Формат(НомерСтроки, "ЧГ=0") + "].ВнешнийПользователь", + , + Отказ); + Прервать; + КонецЕсли; + + // Проверка наличия повторяющихся значений. + НайденныеЗначения = Объект.Состав.НайтиСтроки(Новый Структура("ВнешнийПользователь", ТекущаяСтрока.ВнешнийПользователь)); + Если НайденныеЗначения.Количество() > 1 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Внешний пользователь повторяется!'"), + , + "Объект.Состав[" + Формат(НомерСтроки, "ЧГ=0") + "].ВнешнийПользователь", + , + Отказ); + Прервать; + КонецЕсли; + + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + + Если Отказ Тогда + ПроверяемыеРеквизиты.Очистить(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + + Если Настройки["ПоказатьТолькоВыбранныеРоли"] = Ложь Тогда + Элементы.ОтображениеРолей.ТекущаяСтраница = Элементы.СредиВсехВыбранныеРоли; + Иначе + Элементы.ОтображениеРолей.ТекущаяСтраница = Элементы.ТолькоВыбранныеРоли; + КонецЕсли; + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий команд и элементов формы +// + +&НаКлиенте +Процедура РодительПриИзменении(Элемент) + + Объект.ВсеОбъектыАвторизации = Ложь; + + УстановитьДоступностьСвойств(); + +КонецПроцедуры + +&НаКлиенте +Процедура РодительНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ВыборРодителя"); + + ОткрытьФорму("Справочник.ГруппыВнешнихПользователей.ФормаВыбора", ПараметрыФормы, Элементы.Родитель); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеТипаОбъектовАвторизацииПриИзменении(Элемент) + + Если ЗначениеЗаполнено(ПредставлениеТипаОбъектовАвторизации) Тогда + УдалитьНеТипичныеВнешниеПользователи(); + Иначе + Объект.ВсеОбъектыАвторизации = Ложь; + Объект.ТипОбъектовАвторизации = Неопределено; + КонецЕсли; + + УстановитьДоступностьСвойств(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеТипаОбъектовАвторизацииНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ВыбранныйЭлемент = ВыбратьИзСписка(ТипыОбъектовАвторизации, Элемент, ТипыОбъектовАвторизации.НайтиПоЗначению(Объект.ТипОбъектовАвторизации)); + + Если ВыбранныйЭлемент <> Неопределено Тогда + + Модифицированность = Истина; + Объект.ТипОбъектовАвторизации = ВыбранныйЭлемент.Значение; + ПредставлениеТипаОбъектовАвторизации = ВыбранныйЭлемент.Представление; + + ПредставлениеТипаОбъектовАвторизацииПриИзменении(Элемент); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВсеОбъектыАвторизацииПриИзменении(Элемент) + + Если Объект.ВсеОбъектыАвторизации Тогда + Объект.Состав.Очистить(); + КонецЕсли; + + УстановитьДоступностьСвойств(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПодобратьВнешнихПользователей(Команда) + + ВыбратьПодобратьПользователей(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура СоставОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда + Для каждого Значение Из ВыбранноеЗначение Цикл + ОбработкаВыбораВнешнегоПользователя(Значение); + КонецЦикла; + Иначе + ОбработкаВыбораВнешнегоПользователя(ВыбранноеЗначение); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СоставВнешнийПользовательНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ВыбратьПодобратьПользователей(Ложь); + +КонецПроцедуры + +//** Для работы интерфейса ролей + +&НаКлиенте +Процедура ПодобратьРоли(Команда) + + ОткрытьФорму("Справочник.Пользователи.Форма.ФормаВыбораРолей", Новый Структура("ЗакрыватьПриВыборе", Ложь), Элементы.Роли); + +КонецПроцедуры + +&НаКлиенте +Процедура РолиПриИзменении(Элемент) + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаКлиенте +Процедура РолиПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаКлиенте +Процедура РолиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + ДобавитьВыбранныеРоли(ВыбранноеЗначение); + +КонецПроцедуры + + +&НаКлиенте +Процедура СинонимРолиПриИзменении(Элемент) + + Если ЗначениеЗаполнено(Элементы.Роли.ТекущиеДанные.СинонимРоли) Тогда + Элементы.Роли.ТекущиеДанные.СинонимРоли = СписокВыбораРолей.НайтиПоЗначению(Элементы.Роли.ТекущиеДанные.Роль).Представление; + Иначе + Элементы.Роли.ТекущиеДанные.Роль = ""; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + НачальноеЗначение = ?(Элементы.Роли.ТекущиеДанные = Неопределено, Неопределено, Элементы.Роли.ТекущиеДанные.Роль); + ОткрытьФорму("Справочник.Пользователи.Форма.ФормаВыбораРолей", Новый Структура("ТекущаяСтрока", НачальноеЗначение), Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Элементы.Роли.ТекущиеДанные.Роль = ВыбранноеЗначение; + Элементы.Роли.ТекущиеДанные.СинонимРоли = СписокВыбораРолей.НайтиПоЗначению(Элементы.Роли.ТекущиеДанные.Роль).Представление; + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = СформироватьДанныеВыбораРолей(Текст); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = СформироватьДанныеВыбораРолей(Текст); + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ТаблицаРолейПометкаПриИзменении(Элемент) + + СтрокаТаблицы = Элементы.ТаблицаРолей.ТекущиеДанные; + + НайденныеРоли = Объект.Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)); + + Если СтрокаТаблицы.Пометка Тогда + Если НайденныеРоли.Количество() = 0 Тогда + Строка = Объект.Роли.Добавить(); + Строка.Роль = СтрокаТаблицы.Имя; + Строка.СинонимРоли = СтрокаТаблицы.Синоним; + КонецЕсли; + ИначеЕсли НайденныеРоли.Количество() > 0 Тогда + Объект.Роли.Удалить(НайденныеРоли[0]); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьТолькоВыбранныеРоли(Команда) + + ПоказатьТолькоВыбранныеРоли = НЕ ПоказатьТолькоВыбранныеРоли; + + Элементы.ОтображениеРолей.ТекущаяСтраница = ?(ПоказатьТолькоВыбранныеРоли, Элементы.ТолькоВыбранныеРоли, Элементы.СредиВсехВыбранныеРоли); + ТекущийЭлемент = ?(ПоказатьТолькоВыбранныеРоли, Элементы.Роли, Элементы.ТаблицаРолей); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьФлажки(Команда) + + УстановитьФлажкиНаСервере(); + +КонецПроцедуры + +&НаКлиенте +Процедура СнятьФлажки(Команда) + + СнятьФлажкиНаСервере(); + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции формы +// + +&НаСервере +Процедура ОпределитьДействияВФорме() + + ДействияВФорме = Новый Структура; + ДействияВФорме.Вставить("Роли", ""); // "", "Просмотр", "Редактирование" + ДействияВФорме.Вставить("СоставГруппы", ""); // "", "Просмотр", "Редактирование" + ДействияВФорме.Вставить("СвойстваЭлемента", ""); // "", "Просмотр", "Редактирование" + + Если Пользователи.ЭтоПолноправныйПользовательИБ() ИЛИ + ПравоДоступа("Добавление", Метаданные.Справочники.Пользователи) Тогда + // Администратор + ДействияВФорме.Роли = "Редактирование"; + ДействияВФорме.СоставГруппы = "Редактирование"; + ДействияВФорме.СвойстваЭлемента = "Редактирование"; + + ИначеЕсли РольДоступна("ДобавлениеИзменениеВнешнихПользователей") Тогда + // Менеджер внешних пользователей + ДействияВФорме.Роли = ""; + ДействияВФорме.СоставГруппы = "Редактирование"; + ДействияВФорме.СвойстваЭлемента = "Редактирование"; + + Иначе + // Читатель внешних пользователей + ДействияВФорме.Роли = ""; + ДействияВФорме.СоставГруппы = "Просмотр"; + ДействияВФорме.СвойстваЭлемента = "Просмотр"; + КонецЕсли; + + ПользователиПереопределяемый.ИзменитьДействияВФорме(Объект.Ссылка, ДействияВФорме); + + // Проверка имен действий в форме + Если Найти(", Просмотр, Редактирование,", ", " + ДействияВФорме.Роли + ",") = 0 Тогда + ДействияВФорме.Роли = ""; + ИначеЕсли ПользователиПереопределяемый.ЗапретРедактированияРолей() Тогда + ДействияВФорме.Роли = ""; + КонецЕсли; + Если Найти(", Просмотр, Редактирование,", ", " + ДействияВФорме.СоставГруппы + ",") = 0 Тогда + ДействияВФорме.СвойстваПользователяИБ = ""; + КонецЕсли; + Если Найти(", Просмотр, Редактирование,", ", " + ДействияВФорме.СвойстваЭлемента + ",") = 0 Тогда + ДействияВФорме.СвойстваЭлемента = ""; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьСвойств() + + Элементы.Состав.Доступность = НЕ Объект.ВсеОбъектыАвторизации; + + Элементы.СоставПодобрать.Доступность = НЕ Элементы.Состав.ТолькоПросмотр И Элементы.Состав.Доступность; + Элементы.КонтекстноеМенюСоставПодобрать.Доступность = НЕ Элементы.Состав.ТолькоПросмотр И Элементы.Состав.Доступность; + Элементы.СоставДобавить.Доступность = НЕ Элементы.Состав.ТолькоПросмотр И Элементы.Состав.Доступность; + Элементы.КонтекстноеМенюСоставДобавить.Доступность = НЕ Элементы.Состав.ТолькоПросмотр И Элементы.Состав.Доступность; + + Элементы.ВсеОбъектыАвторизации.Доступность = ЗначениеЗаполнено(ПредставлениеТипаОбъектовАвторизации) И НЕ ЗначениеЗаполнено(Объект.Родитель); + +КонецПроцедуры + + +&НаСервере +Процедура ЗаполнитьСписокТиповОбъектовАвторизации() + + Для каждого ТипСсылкиОбъектаАвторизации ИЗ Метаданные.Справочники.ВнешниеПользователи.Реквизиты.ОбъектАвторизации.Тип.Типы() Цикл + + МетаданныеТипа = Метаданные.НайтиПоТипу(ТипСсылкиОбъектаАвторизации); + + МассивТипов = Новый Массив; + МассивТипов.Добавить(ТипСсылкиОбъектаАвторизации); + ОписаниеТипаСсылки = Новый ОписаниеТипов(МассивТипов); + + ТипыОбъектовАвторизации.Добавить(ОписаниеТипаСсылки.ПривестиЗначение(Неопределено), МетаданныеТипа.Синоним); + КонецЦикла; + + + НайденныйЭлемент = ТипыОбъектовАвторизации.НайтиПоЗначению(Объект.ТипОбъектовАвторизации); + ПредставлениеТипаОбъектовАвторизации = ?(НайденныйЭлемент = Неопределено, "", НайденныйЭлемент.Представление); + +КонецПроцедуры + +&НаСервере +Процедура УдалитьНеТипичныеВнешниеПользователи() + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ВнешниеПользователи.Ссылка + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + |ГДЕ + | ТИПЗНАЧЕНИЯ(ВнешниеПользователи.ОбъектАвторизации) <> &ТипОбъектовАвторизации + | И ВнешниеПользователи.Ссылка В(&ВыбранныеВнешниеПользователи)"); + Запрос.УстановитьПараметр("ВыбранныеВнешниеПользователи", Объект.Состав.Выгрузить().ВыгрузитьКолонку("ВнешнийПользователь")); + Запрос.УстановитьПараметр("ТипОбъектовАвторизации", ТипЗнч(Объект.ТипОбъектовАвторизации)); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + НайденныеСтроки = Объект.Состав.НайтиСтроки(Новый Структура("ВнешнийПользователь", Выборка.Ссылка)); + Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл + Объект.Состав.Удалить(Объект.Состав.Индекс(НайденнаяСтрока)); + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + + +&НаКлиенте +Процедура ВыбратьПодобратьПользователей(Подобрать) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ТекущаяСтрока", ?(Элементы.Состав.ТекущиеДанные = Неопределено, Неопределено, Элементы.Состав.ТекущиеДанные.ВнешнийПользователь)); + + Если Подобрать Тогда + ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Ложь); + КонецЕсли; + + Если Объект.ТипОбъектовАвторизации <> Неопределено Тогда + ПараметрыФормы.Вставить("ТипОбъектовАвторизации", Объект.ТипОбъектовАвторизации); + КонецЕсли; + + ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, ?(Подобрать, Элементы.Состав, Элементы.СоставВнешнийПользователь)); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаВыбораВнешнегоПользователя(ВыбранноеЗначение) + + Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда + Если Объект.Состав.НайтиСтроки(Новый Структура("ВнешнийПользователь", ВыбранноеЗначение)).Количество() = 0 Тогда + Объект.Состав.Добавить().ВнешнийПользователь = ВыбранноеЗначение; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + + +//** Для работы интерфейса ролей + +&НаСервере +Процедура УстановитьФлажкиНаСервере() + + Для каждого СтрокаТаблицы Из ТаблицаРолей Цикл + + СтрокаТаблицы.Пометка = Истина; + + НайденныеРоли = Объект.Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)); + Если НайденныеРоли.Количество() = 0 Тогда + Строка = Объект.Роли.Добавить(); + Строка.Роль = СтрокаТаблицы.Имя; + Строка.СинонимРоли = СтрокаТаблицы.Синоним; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура СнятьФлажкиНаСервере() + + Для каждого СтрокаТаблицы Из ТаблицаРолей Цикл + + СтрокаТаблицы.Пометка = Ложь; + + НайденныеРоли = Объект.Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)); + Если НайденныеРоли.Количество() > 0 Тогда + Объект.Роли.Удалить(НайденныеРоли[0]); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьВыбранныеРоли(ВыбранныеРоли) + + Для каждого Значение Из ВыбранныеРоли Цикл + + ЭлементСписка = СписокВыбораРолей.НайтиПоЗначению(Значение); + Если ЭлементСписка <> Неопределено Тогда + + Если Объект.Роли.НайтиСтроки(Новый Структура("Роль", Значение)).Количество() = 0 Тогда + + Строка = Объект.Роли.Добавить(); + Строка.Роль = ЭлементСписка.Значение; + Строка.СинонимРоли = ЭлементСписка.Представление; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСинонимыТабличнойЧастиРоли() + + ВсеРоли = ПользователиСерверПовтИсп.ВсеРоли(); + + Для каждого Строка Из Объект.Роли Цикл + + НайденнаяСтрока = ВсеРоли.Найти(Строка.Роль, "Имя"); + Строка.СинонимРоли = ?(НайденнаяСтрока = Неопределено, "? " + Строка.Роль, НайденнаяСтрока.Синоним); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ПодготовитьСписокВыбораИТаблицуРолей() + + ВсеРоли = ПользователиСерверПовтИсп.ВсеРоли(); + ВсеРоли.Сортировать("Синоним"); + + Для каждого Строка Из ВсеРоли Цикл + // Заполнение списка выбора + СписокВыбораРолей.Добавить(Строка.Имя, Строка.Синоним); + // Заполнение таблицы ролей + СтрокаТаблицы = ТаблицаРолей.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Строка); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьТолькоПросмотрРолей(Знач ТолькоПросмотрРолей) + + Элементы.Роли.ТолькоПросмотр = ТолькоПросмотрРолей; + Элементы.ТаблицаРолей.ТолькоПросмотр = ТолькоПросмотрРолей; + + Элементы.РолиПодобрать.Доступность = НЕ ТолькоПросмотрРолей; + Элементы.КонтекстноеМенюРолиПодобрать.Доступность = НЕ ТолькоПросмотрРолей; + Элементы.ТаблицаРолейУстановитьФлажки.Доступность = НЕ ТолькоПросмотрРолей; + Элементы.ТаблицаРолейСнятьФлажки.Доступность = НЕ ТолькоПросмотрРолей; + +КонецПроцедуры + +&НаСервере +Процедура ПометитьРолиПоСписку() + + Для каждого СтрокаТаблицы Из ТаблицаРолей Цикл + + СтрокаТаблицы.Пометка = Объект.Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)).Количество() > 0; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Функция СформироватьДанныеВыбораРолей(Текст) + + Список = СписокВыбораРолей.Скопировать(); + + НомерЭлемента = Список.Количество()-1; + Пока НомерЭлемента >= 0 Цикл + Если ВРег(Лев(Список[НомерЭлемента].Представление, СтрДлина(Текст))) <> ВРег(Текст) Тогда + Список.Удалить(НомерЭлемента); + КонецЕсли; + НомерЭлемента = НомерЭлемента - 1; + КонецЦикла; + + Возврат Список; + +КонецФункции + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияСпискаРолей(Отказ) + + // Проверка незаполненных и повторяющихся ролей. + НомерСтроки = Объект.Роли.Количество()-1; + Пока НЕ Отказ И НомерСтроки >= 0 Цикл + + ТекущаяСтрока = Объект.Роли.Получить(НомерСтроки); + + // Проверка заполнения значения. + Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.СинонимРоли) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Роль не заполнена!'"), + , + "Объект.Роли[" + Формат(НомерСтроки, "ЧГ=0") + "].СинонимРоли", + , + Отказ); + Возврат; + КонецЕсли; + + // Проверка наличия повторяющихся значений. + НайденныеЗначения = Объект.Роли.НайтиСтроки(Новый Структура("Роль", ТекущаяСтрока.Роль)); + Если НайденныеЗначения.Количество() > 1 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Роль повторяется!'"), + , + "Объект.Роли[" + Формат(НомерСтроки, "ЧГ=0") + "].СинонимРоли", + , + Отказ); + Возврат; + КонецЕсли; + + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + +КонецПроцедуры + + diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/ObjectModule.bsl b/SSL/src/Catalogs/ГруппыВнешнихПользователей/ObjectModule.bsl new file mode 100644 index 000000000..fae8b0281 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/ObjectModule.bsl @@ -0,0 +1,212 @@ + +Перем СтарыйРодитель; +Перем ИзменилсяСоставРолейГруппыВнешнихПользователей; + +// Обработчик ПередЗаписью блокирует недопустимые действия с предопределенной +// группой "Все внешние пользователи". +// +Процедура ПередЗаписью(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если Ссылка = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда + + ТипОбъектовАвторизации = Неопределено; + ВсеОбъектыАвторизации = Ложь; + + Если НЕ Родитель.Пустая() Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Предопределенная группа ""Все внешние пользователи"" может быть только в корне!'"), , , , Отказ); + Возврат; + КонецЕсли; + Если Состав.Количество() > 0 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Добавление внешних пользователей в группу ""Все внешние пользователи"" не поддерживается.'"), , , , Отказ); + Возврат; + КонецЕсли; + Иначе + Если Родитель = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Предопределенная группа ""Все внешние пользователи"" не может быть родителем!'"), , , , Отказ); + Возврат; + КонецЕсли; + СтарыйРодитель = ?(Ссылка.Пустая(), Неопределено, ОбщегоНазначения.ПолучитьЗначениеРеквизита(Ссылка, "Родитель")); + + Если ТипОбъектовАвторизации = Неопределено Тогда + ВсеОбъектыАвторизации = Ложь; + ИначеЕсли ВсеОбъектыАвторизации И ЗначениеЗаполнено(Родитель) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Родитель недопустим у группы для всех объектов информационной базы заданного типа!'"), , , , Отказ); + Возврат; + КонецЕсли; + + // Проверка уникальности группы всех объектов авторизации заданного типа + Если ВсеОбъектыАвторизации Тогда + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ПРЕДСТАВЛЕНИЕ(ГруппыВнешнихПользователей.Ссылка) КАК СсылкаПредставление + |ИЗ + | Справочник.ГруппыВнешнихПользователей КАК ГруппыВнешнихПользователей + |ГДЕ + | ГруппыВнешнихПользователей.Ссылка <> &Ссылка + | И ГруппыВнешнихПользователей.ТипОбъектовАвторизации = &ТипОбъектовАвторизации + | И ГруппыВнешнихПользователей.ВсеОбъектыАвторизации"); + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.УстановитьПараметр("ТипОбъектовАвторизации", ТипОбъектовАвторизации); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Уже есть группа ""%1"" для всех объектов информационной базы типа ""%2""!'"), Выборка.СсылкаПредставление, Метаданные.НайтиПоТипу(ТипЗнч(ТипОбъектовАвторизации)).Синоним), , , , Отказ); + Возврат; + КонецЕсли; + КонецЕсли; + + // Проверка совпадения типа объектов авторизации с родителем (допустимо, если тип у родителя не задан) + Если ЗначениеЗаполнено(Родитель) Тогда + ТипОбъектовАвторизацииРодителя = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Родитель, "ТипОбъектовАвторизации"); + Если ТипОбъектовАвторизацииРодителя <> Неопределено И + ТипОбъектовАвторизацииРодителя <> ТипОбъектовАвторизации Тогда + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Тип объектов информационной базы должен быть ""%1"", как у родителя ""%2""!'"), Метаданные.НайтиПоТипу(ТипЗнч(ТипОбъектовАвторизацииРодителя)).Синоним, Родитель), , , , Отказ); + Возврат; + КонецЕсли; + КонецЕсли; + + // Проверка, что при изменении типа объектов авторизации нет подчиненных элементов другого типа (очистка типа допустима) + Если ТипОбъектовАвторизации <> Неопределено И ЗначениеЗаполнено(Ссылка) Тогда + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ПРЕДСТАВЛЕНИЕ(ГруппыВнешнихПользователей.Ссылка) КАК СсылкаПредставление, + | ГруппыВнешнихПользователей.ТипОбъектовАвторизации + |ИЗ + | Справочник.ГруппыВнешнихПользователей КАК ГруппыВнешнихПользователей + |ГДЕ + | ГруппыВнешнихПользователей.Родитель = &Ссылка + | И ГруппыВнешнихПользователей.ТипОбъектовАвторизации <> &ТипОбъектовАвторизации"); + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.УстановитьПараметр("ТипОбъектовАвторизации", ТипОбъектовАвторизации); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Если Выборка.ТипОбъектовАвторизации = Неопределено Тогда + ПредставлениеДругогоТипаОбъектаАвторизации = НСтр("ru = '<Любой тип>'"); + Иначе + ПредставлениеДругогоТипаОбъектаАвторизации = Метаданные.НайтиПоТипу(ТипЗнч(Выборка.ТипОбъектовАвторизации)).Синоним; + КонецЕсли; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Есть дочерняя группа ""%1"" с другим типом объектов информационной базы ""%2""!'"), Выборка.СсылкаПредставление, ПредставлениеДругогоТипаОбъектаАвторизации), , , , Отказ); + Возврат; + КонецЕсли; + КонецЕсли; + + // Определение изменения состава ролей. + Если ЗначениеЗаполнено(Ссылка) Тогда + Запрос = Новый Запрос( + "ВЫБРАТЬ + | НовыеРоли.Роль + |ПОМЕСТИТЬ НовыеРоли + |ИЗ + | &НовыеРоли КАК НовыеРоли + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК Значение + |ИЗ + | НовыеРоли КАК НовыеРоли + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыВнешнихПользователей.Роли КАК СтарыеРоли + | ПО (СтарыеРоли.Ссылка = &ГруппаВнешнихПользователей) + | И (СтарыеРоли.Роль = НовыеРоли.Роль) + |ГДЕ + | СтарыеРоли.Роль ЕСТЬ NULL + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + |ИЗ + | (ВЫБРАТЬ + | ИСТИНА КАК ЗначениеИстина) КАК ЗначениеИстина + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыВнешнихПользователей.Роли КАК СтарыеРоли + | ПО (СтарыеРоли.Ссылка = &ГруппаВнешнихПользователей) + | ЛЕВОЕ СОЕДИНЕНИЕ НовыеРоли КАК НовыеРоли + | ПО (СтарыеРоли.Роль = НовыеРоли.Роль) + |ГДЕ + | НовыеРоли.Роль ЕСТЬ NULL "); + Запрос.УстановитьПараметр("ГруппаВнешнихПользователей", Ссылка); + Запрос.УстановитьПараметр("НовыеРоли", Роли.Выгрузить()); + ИзменилсяСоставРолейГруппыВнешнихПользователей = НЕ Запрос.Выполнить().Пустой(); + Иначе + ИзменилсяСоставРолейГруппыВнешнихПользователей = Истина; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Обработчик ПриЗаписи вызывает обновление состава групп внешних пользователей. +// +Процедура ПриЗаписи(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + ИзмененныеВнешниеПользователи = Неопределено; + ВнешниеПользователи.ОбновитьСоставГруппВнешнихПользователей(Ссылка, ИзмененныеВнешниеПользователи); + + Если Ссылка = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | СоставГруппПользователей.Пользователь + |ИЗ + | РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + |ГДЕ + | СоставГруппПользователей.ГруппаПользователей = ЗНАЧЕНИЕ(Справочник.ГруппыВнешнихПользователей.ВсеВнешниеПользователи)"); + ИзмененныеВнешниеПользователи = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Пользователь"); + + ИначеЕсли ИзменилсяСоставРолейГруппыВнешнихПользователей Тогда + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | СоставГруппПользователей.Пользователь + |ИЗ + | РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + |ГДЕ + | СоставГруппПользователей.Пользователь В(&ИзмененныеВнешниеПользователи) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ГруппыВнешнихПользователейСостав.ВнешнийПользователь + |ИЗ + | Справочник.ГруппыВнешнихПользователей.Состав КАК ГруппыВнешнихПользователейСостав + |ГДЕ + | ГруппыВнешнихПользователейСостав.Ссылка = &ГруппаВнешнихПользователей + | И (НЕ ГруппыВнешнихПользователейСостав.ВнешнийПользователь.УстановитьРолиНепосредственно)"); + Запрос.УстановитьПараметр("ГруппаВнешнихПользователей", Ссылка); + Запрос.УстановитьПараметр("ИзмененныеВнешниеПользователи", ИзмененныеВнешниеПользователи); + ИзмененныеВнешниеПользователи = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Пользователь"); + КонецЕсли; + + ЕстьОшибки = Ложь; + ВнешниеПользователи.ОбновитьРолиВнешнихПользователей(ИзмененныеВнешниеПользователи, ЕстьОшибки); + + Если ЗначениеЗаполнено(СтарыйРодитель) И СтарыйРодитель <> Родитель Тогда + + ВнешниеПользователи.ОбновитьСоставГруппВнешнихПользователей(СтарыйРодитель, ИзмененныеВнешниеПользователи); + ВнешниеПользователи.ОбновитьРолиВнешнихПользователей(ИзмененныеВнешниеПользователи, ЕстьОшибки); + КонецЕсли; + + Если ЕстьОшибки И НЕ ДополнительныеСвойства.Свойство("ЕстьОшибки") Тогда + ДополнительныеСвойства.Вставить("ЕстьОшибки"); + КонецЕсли; + +КонецПроцедуры + +// Обработчик ОбработкаПроверкиЗаполнения блокирует интерактивный выбор группы "Все внешние пользователи" в качестве родителя. +// +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + + Если Родитель = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Предопределенная группа ""Все внешние пользователи"" не может быть родителем!'"), , "Объект.Родитель", , Отказ); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/ГруппыВнешнихПользователей.mdo b/SSL/src/Catalogs/ГруппыВнешнихПользователей/ГруппыВнешнихПользователей.mdo new file mode 100644 index 000000000..6c4b334e4 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/ГруппыВнешнихПользователей.mdo @@ -0,0 +1,296 @@ + + + + + + + + + + ГруппыВнешнихПользователей + + ru + Группы внешних пользователей + + true + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + + ru + Входит в группу + + + ru + Вышестоящая группа в иерархии + + true + + Catalog.ГруппыВнешнихПользователей.EmptyRef + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + Managed + Use + + ru + Группа внешних пользователей + + + ru + Группы внешних пользователей, имеющих одинаковый доступ к данным системы + + true + HierarchyOfItems + 2 + true + 150 + String + Variable + AsDescription + + + ВсеВнешниеПользователи + Все внешние пользователи + + + + + + InDialog + BothWays + Catalog.ГруппыВнешнихПользователей.Form.ФормаЭлемента + Catalog.ГруппыВнешнихПользователей.Form.ФормаСписка + Catalog.ГруппыВнешнихПользователей.Form.ФормаСписка + + Комментарий + + ru + Комментарий + + + String + + + + + + Use + Use + + + ТипОбъектовАвторизации + + ru + Участники группы + + В качестве типа используется пустая ссылка + + String + + 10 + + + + ru + Тип объектов информационной базы + + + + + Use + Use + + + ВсеОбъектыАвторизации + + ru + Все + + + Boolean + + + ru + Автоматическая группа всех объектов информационной базы заданного типа + + + + + Use + Use + + + + + + + Состав + + ru + Внешние пользователи + + + ru + Внешние пользователи, входящие в группу + + + Use + LineNumber + + Use + + + + + ВнешнийПользователь + + ru + Внешний пользователь + + + CatalogRef.ВнешниеПользователи + + + ru + Внешний пользователь, включенный в группу + + + + ShowError + DontUse + Use + Use + Use + + ForFolderAndItem + + + + + + + Роли + + ru + Разрешенные действия (роли) + + + Use + LineNumber + + Use + + + + + Роль + + ru + Разрешенное действие (роль) + + + String + + 150 + + + + + ShowError + Use + Index + Use + + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ОбновлениеДанныхОграниченияДоступа/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ОбновлениеДанныхОграниченияДоступа/Form.form new file mode 100644 index 000000000..e046daf92 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ОбновлениеДанныхОграниченияДоступа/Form.form @@ -0,0 +1,232 @@ + + + + ПрекращениеОбработки + 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 + DontBlock + 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 new file mode 100644 index 000000000..fe4c3839c --- /dev/null +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ОбновлениеДанныхОграниченияДоступа/Module.bsl @@ -0,0 +1,51 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Отказ = НЕ УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ПодключитьОбработчикОжидания("ВыполнитьОбновление", 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 new file mode 100644 index 000000000..802a6d4fc --- /dev/null +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,21 @@ + + + + + false + Ссылка + NotEqual + Справочник.ГруппыДоступа.Администраторы + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..cbbfc8e5c --- /dev/null +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Form.form @@ -0,0 +1,310 @@ + + + + Список + 1 + true + true + + true + + + Список + + false + None + + Наименование + 4 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Профиль + 6 + true + true + + + Список.Профиль + + + ПрофильРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ПрофильКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Комментарий + 8 + true + true + + + Список.Комментарий + + + КомментарийРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 11 + + СписокСтрокаПоискаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 12 + true + + Список + + true + + + + СписокСостояниеПросмотра + 14 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 15 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 17 + + СписокУправлениеПоискомРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 18 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + true + true +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + 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 + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.ГруппыДоступа + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Help/ru.html b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Help/ru.html new file mode 100644 index 000000000..b446f235e --- /dev/null +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Help/ru.html @@ -0,0 +1,6 @@ + +

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

+

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

+

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

+

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

+

 

\ No newline at end of file diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..5b1e4e8fc --- /dev/null +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,8 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Список.Отбор.Элементы[0].Использование = НЕ (УправлениеДоступом.ЕстьРоль("ПолныеПрава") ИЛИ + УправлениеДоступом.ЕстьРоль("ДобавлениеИзменениеПользователейИГруппДоступа")); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/ConditionalAppearance.dcssca b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/ConditionalAppearance.dcssca new file mode 100644 index 000000000..639b6ffe2 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/ConditionalAppearance.dcssca @@ -0,0 +1,26 @@ + + + + + + ВидДоступа + + + ДоступРазрешенПоВиду + + + + + Объект.ВидыДоступа.ЗначенияЗаданы + Equal + true + + + + + Шрифт + + + + + diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..a28af1295 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,2889 @@ + + + + Наименование + 3 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 288 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Родитель + 286 + true + true + + true + + + Объект.Parent + + + РодительРасширеннаяПодсказка + 290 + Label + true + true + + Left + + + + РодительКонтекстноеМеню + 287 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Профиль + 7 + true + true + + true + + + Объект.Профиль + + + OnChange + ПрофильПриИзменении + + + ПрофильРасширеннаяПодсказка + 292 + Label + true + true + + Left + + + + ПрофильКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ПользователиИДоступ + 11 + + ПользователиГруппы + 212 + + ПредставлениеТипаПользователей + 281 + true + true + + true + + + ПредставлениеТипаПользователей + + + OnChange + ПредставлениеТипаПользователейПриИзменении + + + ПредставлениеТипаПользователейРасширеннаяПодсказка + 296 + Label + true + true + + Left + + + + ПредставлениеТипаПользователейКонтекстноеМеню + 282 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПредставлениеТипаПользователейНачалоВыбора + + true + true + true + true + true + true + true + Normal + + + + Пользователи + 13 + true + true + + true + + + Объект.Пользователи + + false + None + CancelSearch + Copy + CopyToClipboard + EndEdit + Find + OutputList + SelectAll + + Пользователь + 18 + true + true + + true + + + Объект.Пользователи.Пользователь + + + OnChange + ПользовательПриИзменении + + + ПользовательРасширеннаяПодсказка + 320 + Label + true + true + + Left + + + + ПользовательКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + + + AutoComplete + ПользовательАвтоПодбор + + + StartChoice + ПользовательНачалоВыбора + + + Clearing + ПользовательОчистка + + + TextEditEnd + ПользовательОкончаниеВводаТекста + + true + true + true + true + true + Normal + + + + ПользователиКоманднаяПанель + 15 + + ПользователиПодобрать + 226 + true + true + + true + + false + + ПользователиПодобратьРасширеннаяПодсказка + 302 + Label + true + true + + Left + + + Form.Command.Подобрать + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ПользователиДобавить + 229 + true + true + + true + + false + + ПользователиДобавитьРасширеннаяПодсказка + 303 + Label + true + true + + Left + + + Form.Item.Пользователи.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ПользователиСкопировать + 230 + true + true + + true + + false + + ПользователиСкопироватьРасширеннаяПодсказка + 304 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ПользователиУдалить + 232 + true + true + + true + + false + + ПользователиУдалитьРасширеннаяПодсказка + 305 + Label + true + true + + Left + + + Form.Item.Пользователи.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ПользователиПереместитьВверх + 233 + true + true + + true + + false + + ПользователиПереместитьВверхРасширеннаяПодсказка + 306 + Label + true + true + + Left + + + Form.Item.Пользователи.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ПользователиПереместитьВниз + 234 + true + true + + true + + false + + ПользователиПереместитьВнизРасширеннаяПодсказка + 307 + Label + true + true + + Left + + + Form.Item.Пользователи.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ПользователиСортироватьСписокПоВозрастанию + 227 + true + true + + true + + false + + ПользователиСортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 308 + Label + true + true + + Left + + + Form.Item.Пользователи.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ПользователиСортироватьСписокПоУбыванию + 228 + true + true + + true + + false + + ПользователиСортироватьСписокПоУбываниюРасширеннаяПодсказка + 309 + Label + true + true + + Left + + + Form.Item.Пользователи.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + Left + + + OnEditEnd + ПользователиПриОкончанииРедактирования + + + ChoiceProcessing + ПользователиОбработкаВыбора + + + OnStartEdit + ПользователиПриНачалеРедактирования + + + ПользователиСтрокаПоиска + 311 + + ПользователиСтрокаПоискаРасширеннаяПодсказка + 313 + Label + true + true + + Left + + + + ПользователиСтрокаПоискаКонтекстноеМеню + 312 + true + + Пользователи + + true + + + + ПользователиСостояниеПросмотра + 314 + + ПользователиСостояниеПросмотраРасширеннаяПодсказка + 316 + Label + true + true + + Left + + + + ПользователиСостояниеПросмотраКонтекстноеМеню + 315 + true + + ViewStatusAddition + Пользователи + + true + + + + ПользователиУправлениеПоиском + 317 + + ПользователиУправлениеПоискомРасширеннаяПодсказка + 319 + Label + true + true + + Left + + + + ПользователиУправлениеПоискомКонтекстноеМеню + 318 + true + + SearchControlAddition + Пользователи + + true + + + + ПользователиРасширеннаяПодсказка + 310 + Label + true + true + + Left + + + + ПользователиКонтекстноеМеню + 14 + + КонтекстноеМенюПользователиПодобрать + 245 + true + true + + true + + false + + КонтекстноеМенюПользователиПодобратьРасширеннаяПодсказка + 298 + Label + true + true + + Left + + + Form.Command.Подобрать + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюПользователиДобавить + 240 + true + true + + true + + false + + КонтекстноеМенюПользователиДобавитьРасширеннаяПодсказка + 299 + Label + true + true + + Left + + + Form.Item.Пользователи.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюПользователиСкопировать + 241 + true + true + + true + + false + + КонтекстноеМенюПользователиСкопироватьРасширеннаяПодсказка + 300 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюПользователиУдалить + 242 + true + true + + true + + false + + КонтекстноеМенюПользователиУдалитьРасширеннаяПодсказка + 301 + 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 + + Объект.Пользователи.НомерКартинки + + + CommonPicture.ПиктограммыПользователя + + None + None + None + true + + + true + true + + true + + + <key>ru</key> + <value>Пользователи</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + Пользователи группы + + 25 + + ПользователиГруппыРасширеннаяПодсказка + 295 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + Доступ + 64 + + ВидыДоступа + 169 + true + true + + true + + + Объект.ВидыДоступа + + false + None + Add + CancelSearch + Copy + CopyToClipboard + Delete + Find + MoveDown + MoveUp + OutputList + SortListAsc + SortListDesc + + ВидДоступа + 191 + true + true + + true + + + Объект.ВидыДоступа.ВидДоступа + + + ru + Вид доступа изменяется только в профиле + + + ВидДоступаРасширеннаяПодсказка + 343 + Label + true + true + + Left + + + + ВидДоступаКонтекстноеМеню + 192 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ДоступРазрешенПоВиду + 193 + + <key>ru</key> + <value>Все значения, кроме указанных</value> + + true + true + + true + + + Объект.ВидыДоступа.ДоступРазрешен + + + ru + Выбор списка указываемых значений + + + OnChange + ДоступРазрешенПоВидуПриИзменении + + + ДоступРазрешенПоВидуРасширеннаяПодсказка + 345 + Label + true + true + + Left + + + + ДоступРазрешенПоВидуКонтекстноеМеню + 194 + true + + InputField + Enter + true + Left + true + + 20 + true + true + + ru + БЛ=Запрещены; БИ=Разрешены + + + ru + БЛ=Запрещены; БИ=Разрешены + + true + true + true + + + ru + Только для указанных + + + + + + ru + По всем, кроме указанных + + + true + + + Normal + + + + ВидыДоступаКоманднаяПанель + 171 + + ВидыДоступаИзменить + 259 + true + true + + true + + false + + ВидыДоступаИзменитьРасширеннаяПодсказка + 331 + Label + true + true + + Left + + + Form.Item.ВидыДоступа.StandardCommand.Change + Normal + PictureAndText + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ВидыДоступаЗакончитьРедактирование + 260 + true + true + + true + + false + + ВидыДоступаЗакончитьРедактированиеРасширеннаяПодсказка + 332 + Label + true + true + + Left + + + Form.Item.ВидыДоступа.StandardCommand.EndEdit + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + Left + + + OnEditEnd + ВидыДоступаПриОкончанииРедактирования + + + Selection + ВидыДоступаВыбор + + + OnActivateRow + ВидыДоступаПриАктивизацииСтроки + + + OnActivateCell + ВидыДоступаПриАктивизацииЯчейки + + + ВидыДоступаСтрокаПоиска + 334 + + ВидыДоступаСтрокаПоискаРасширеннаяПодсказка + 336 + Label + true + true + + Left + + + + ВидыДоступаСтрокаПоискаКонтекстноеМеню + 335 + true + + ВидыДоступа + + true + + + + ВидыДоступаСостояниеПросмотра + 337 + + ВидыДоступаСостояниеПросмотраРасширеннаяПодсказка + 339 + Label + true + true + + Left + + + + ВидыДоступаСостояниеПросмотраКонтекстноеМеню + 338 + true + + ViewStatusAddition + ВидыДоступа + + true + + + + ВидыДоступаУправлениеПоиском + 340 + + ВидыДоступаУправлениеПоискомРасширеннаяПодсказка + 342 + Label + true + true + + Left + + + + ВидыДоступаУправлениеПоискомКонтекстноеМеню + 341 + true + + SearchControlAddition + ВидыДоступа + + true + + + + ВидыДоступаРасширеннаяПодсказка + 333 + Label + true + true + + Left + + + + ВидыДоступаКонтекстноеМеню + 170 + + true + true + 3 + true + Row +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + None + None + None + true + +
+ + ЗначенияДоступаПоВидуДоступа + 268 + + ГоризонтальнаяГруппа + 285 + + НадписьВидДоступа + 121 + true + true + + true + + + НадписьВидДоступа + + None + Ctrl+S + + НадписьВидДоступаРасширеннаяПодсказка + 357 + Label + true + true + + Left + + + + НадписьВидДоступаКонтекстноеМеню + 122 + true + + LabelField + Enter + true + Left + true + + true + true + true + + System.DefaultGUIFont + true + false + false + false + + + + true + true + + true + + + <key>ru</key> + <value>Горизонтальная группа</value> + + + ГоризонтальнаяГруппаРасширеннаяПодсказка + 356 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ТипыВидовДоступа + 168 + + ОбычныйВидДоступа + 264 + + ЗначенияДоступа + 66 + true + true + + true + + + ЗначенияДоступа + + false + None + CopyToClipboard + EndEdit + OutputList + SelectAll + + НомерСтроки + 279 + true + true + + true + + + ЗначенияДоступа.НомерСтроки + + + НомерСтрокиРасширеннаяПодсказка + 382 + Label + true + true + + Left + + + + НомерСтрокиКонтекстноеМеню + 280 + true + + LabelField + Auto + true + Left + true + + true + true + + + + ЗначениеДоступа + 195 + true + true + + true + + + ЗначенияДоступа.ЗначениеДоступа + + + ru + Например, организация, группа доступа партнеров и т.п. + + + ЗначениеДоступаРасширеннаяПодсказка + 384 + Label + true + true + + Left + + + + ЗначениеДоступаКонтекстноеМеню + 196 + true + + InputField + true + Enter + true + Left + true + + + AutoComplete + ЗначениеДоступаАвтоПодбор + + + StartChoice + ЗначениеДоступаНачалоВыбора + + + Clearing + ЗначениеДоступаОчистка + + + TextEditEnd + ЗначениеДоступаОкончаниеВводаТекста + + + ChoiceProcessing + ЗначениеДоступаОбработкаВыбора + + true + true + true + true + Items + true + true + true + Normal + + + Items.ВидыДоступа.CurrentData.ВидДоступа + + + + + + ДоступРазрешен + 217 + true + + true + + + ЗначенияДоступа.ДоступРазрешен + + + ДоступРазрешенРасширеннаяПодсказка + 386 + Label + true + true + + Left + + + + ДоступРазрешенКонтекстноеМеню + 218 + true + + CheckBoxField + true + Auto + true + Left + true + + + + ЗначенияДоступаКоманднаяПанель + 68 + + ЗначенияДоступаДобавить + 246 + true + true + + true + + false + + ЗначенияДоступаДобавитьРасширеннаяПодсказка + 364 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + ЗначенияДоступаУдалить + 249 + true + true + + true + + false + + ЗначенияДоступаУдалитьРасширеннаяПодсказка + 365 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + ЗначенияДоступаНайти + 239 + true + true + + false + + ЗначенияДоступаНайтиРасширеннаяПодсказка + 366 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ЗначенияДоступаОтменитьПоиск + 236 + true + true + + false + + ЗначенияДоступаОтменитьПоискРасширеннаяПодсказка + 367 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + ЗначенияДоступаПереместитьВверх + 252 + true + true + + true + + false + + ЗначенияДоступаПереместитьВверхРасширеннаяПодсказка + 368 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + ЗначенияДоступаПереместитьВниз + 253 + true + true + + true + + false + + ЗначенияДоступаПереместитьВнизРасширеннаяПодсказка + 369 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + СортироватьСписокПоВозрастанию + 254 + true + true + + true + + false + + СортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 370 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СортироватьСписокПоУбыванию + 255 + true + true + + true + + false + + СортироватьСписокПоУбываниюРасширеннаяПодсказка + 371 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + Left + + + OnStartEdit + ЗначенияДоступаПриНачалеРедактирования + + + OnChange + ЗначенияДоступаПриИзменении + + + ЗначенияДоступаСтрокаПоиска + 373 + + ЗначенияДоступаСтрокаПоискаРасширеннаяПодсказка + 375 + Label + true + true + + Left + + + + ЗначенияДоступаСтрокаПоискаКонтекстноеМеню + 374 + true + + ЗначенияДоступа + + true + + + + ЗначенияДоступаСостояниеПросмотра + 376 + + ЗначенияДоступаСостояниеПросмотраРасширеннаяПодсказка + 378 + Label + true + true + + Left + + + + ЗначенияДоступаСостояниеПросмотраКонтекстноеМеню + 377 + true + + ViewStatusAddition + ЗначенияДоступа + + true + + + + ЗначенияДоступаУправлениеПоиском + 379 + + ЗначенияДоступаУправлениеПоискомРасширеннаяПодсказка + 381 + Label + true + true + + Left + + + + ЗначенияДоступаУправлениеПоискомКонтекстноеМеню + 380 + true + + SearchControlAddition + ЗначенияДоступа + + true + + + + ЗначенияДоступаРасширеннаяПодсказка + 372 + Label + true + true + + Left + + + + ЗначенияДоступаКонтекстноеМеню + 67 + + КонтекстноеМенюЗначенияДоступаДобавить + 256 + true + true + + true + + false + + КонтекстноеМенюЗначенияДоступаДобавитьРасширеннаяПодсказка + 361 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюЗначенияДоступаСкопировать + 257 + true + true + + true + + false + + КонтекстноеМенюЗначенияДоступаСкопироватьРасширеннаяПодсказка + 362 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.Copy + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюЗначенияДоступаУдалить + 258 + true + true + + true + + false + + КонтекстноеМенюЗначенияДоступаУдалитьРасширеннаяПодсказка + 363 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + true + true + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + None + None + None + true + +
+ true + true + + true + + + <key>ru</key> + <value>Обычный вид доступа</value> + + + ru + Обычный вид доступа + + + ОбычныйВидДоступаРасширеннаяПодсказка + 360 + Label + true + true + + Left + + + Page + + Vertical + auto + +
+ + ВидДоступаЧерезПраваПоЗначениямДоступа + 265 + + Информация + 269 + + КартинкаИнформации + 261 + + <key>ru</key> + <value>Картинка информации</value> + + true + true + + true + + + КартинкаИнформацииРасширеннаяПодсказка + 398 + Label + true + true + + Left + + + + КартинкаИнформацииКонтекстноеМеню + 262 + true + + 3 + true + 2 + true + false + + + CommonPicture.Информация32 + + AutoSize + + + + ТекстИнформации + 266 + + <key>ru</key> + <value>Для этого вида доступа настройка выполняется по команде "Права доступа" +в форме списка/элемента его значений, а также +в форме списка/элемента пользователей и групп пользователей.</value> + + true + true + + true + + + ТекстИнформацииРасширеннаяПодсказка + 399 + Label + true + true + + Left + + + + ТекстИнформацииКонтекстноеМеню + 267 + true + + Label + true + true + false + + Left + + + true + true + + true + + + ИнформацияРасширеннаяПодсказка + 397 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ОтображениеПредупреждения + 275 + + ПредупреждениеТребуется + 270 + + КартинкаПредупреждения + 271 + + <key>ru</key> + <value>Картинка предупреждения</value> + + true + true + + true + + + КартинкаПредупрежденияРасширеннаяПодсказка + 402 + Label + true + true + + Left + + + + КартинкаПредупрежденияКонтекстноеМеню + 272 + true + + 3 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + AutoSize + + + + ТекстПредупреждения + 273 + + <key>ru</key> + <value>Когда выбрано "Все значения, кроме указанных - Разрешены", +тогда нет ограничений прав, заданных по команде "Права доступа", +т.е. разрешены все права по всем значениям этого вида доступа.</value> + + true + true + + true + + + ТекстПредупрежденияРасширеннаяПодсказка + 403 + Label + true + true + + Left + + + + ТекстПредупрежденияКонтекстноеМеню + 274 + true + + Label + true + true + false + + Left + + + true + true + + true + + + ПредупреждениеТребуетсяРасширеннаяПодсказка + 401 + Label + true + true + + Left + + + Page + + + + ПредупреждениеНеТребуется + 276 + + ПустойТекст + 277 + true + true + + true + + + ПустойТекстРасширеннаяПодсказка + 405 + Label + true + true + + Left + + + + ПустойТекстКонтекстноеМеню + 278 + true + + Label + true + true + false + + Left + + + true + true + + true + + + ПредупреждениеНеТребуетсяРасширеннаяПодсказка + 404 + Label + true + true + + Left + + + Page + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Отображение предупреждения</value> + + + ОтображениеПредупрежденияРасширеннаяПодсказка + 400 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + ВидДоступаЧерезПраваПоЗначениямДоступаРасширеннаяПодсказка + 396 + Label + true + true + + Left + + + Page + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Типы видов доступа</value> + + + ТипыВидовДоступаРасширеннаяПодсказка + 359 + Label + true + true + + Left + + + Pages + + Auto + +
+ true + true + + true + + + <key>ru</key> + <value>Значения доступа по виду доступа</value> + + + ru + Значения доступа по виду доступа + + + ЗначенияДоступаПоВидуДоступаРасширеннаяПодсказка + 355 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + +
+ true + true + + true + + + <key>ru</key> + <value>Ограничения доступа</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + Доступ + + + ДоступРасширеннаяПодсказка + 330 + Label + true + true + + Left + + + Page + + Vertical + auto + +
+ true + true + + true + + + <key>ru</key> + <value>Пользователи и доступ</value> + + + ru + Пользователи и доступ + + + ПользователиИДоступРасширеннаяПодсказка + 294 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + +
+ + Комментарий + 219 + true + true + + true + + + Объект.Комментарий + + + КомментарийРасширеннаяПодсказка + 406 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 220 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + + FillCheckProcessingAtServer + ОбработкаПроверкиЗаполненияНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ГруппыДоступа + + + true + + + true + +
true
+ true + + + Объект.Пользователи + + + НомерКартинки + + <key>ru</key> + <value>Номер картинки</value> + + 1 + + Number + + 1 + + + + true + + + true + + + + + + Объект.ВидыДоступа + + + ЗначенияЗаданы + + <key>ru</key> + <value>Значения заданы</value> + + 1 + + Boolean + + + true + + + true + + + + ТекущийТипЗначенияДоступа + + <key>ru</key> + <value>Текущий тип значения доступа</value> + + 2 + + AnyRef + + + true + + + true + + + +
+ + ЗначенияДоступа + + <key>ru</key> + <value>Значения и группы значений доступа</value> + + 8 + + ValueTable + + + true + + + true + + true + + ЗначениеДоступа + + <key>ru</key> + <value>Значение или группа значений</value> + + 1 + + Characteristic.ВидыДоступа + + + true + + + true + + + + ДоступРазрешен + + <key>ru</key> + <value>Доступ разрешен</value> + + 2 + + Boolean + + + true + + + true + + + + НомерСтроки + + <key>ru</key> + <value>N</value> + + 3 + + Number + + 4 + true + + + + true + + + true + + + + + ТекущийВидДоступа + + <key>ru</key> + <value>Текущий вид доступа</value> + + 10 + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + true + + + true + + + + ИзменилсяСоставВидовДоступаПриЧтении + + <key>ru</key> + <value>Изменился состав видов доступа при чтении</value> + + 3 + + Boolean + + + true + + + true + + + + ВидыДоступаЧерезПраваПоЗначениямДоступа + + <key>ru</key> + <value>Виды доступа через права по значениям доступа</value> + + 4 + + ValueList + + + true + + + true + + + + + + + ПрофильАдминистратор + + <key>ru</key> + <value>Профиль администратор</value> + + 5 + + CatalogRef.ПрофилиГруппДоступа + + + true + + + true + + + + ГруппаДоступаАдминистраторы + + <key>ru</key> + <value>Группа доступа администраторы</value> + + 6 + + CatalogRef.ГруппыДоступа + + + true + + + true + + + + НадписьВидДоступа + + <key>ru</key> + <value>Надпись вид доступа</value> + + 7 + + String + + + + true + + + true + + + + ПользовательПустаяСсылка + + <key>ru</key> + <value>Пользователь пустая ссылка</value> + + 9 + + CatalogRef.Пользователи + + + true + + + true + + + + ЗначенияЗадаются + + <key>ru</key> + <value>Значения задаются</value> + + 11 + + Boolean + + + true + + + true + + + + ВидДоступаПользователи + + <key>ru</key> + <value>Вид доступа пользователи</value> + + 2 + + ChartOfCharacteristicTypesRef + + + true + + + true + + + + ГруппаПользователейПустаяСсылка + + <key>ru</key> + <value>Группа пользователей пустая ссылка</value> + + 12 + + CatalogRef.ГруппыПользователей + + + true + + + true + + + + ИспользоватьВнешнихПользователей + + <key>ru</key> + <value>Использовать внешних пользователей</value> + + 14 + + Boolean + + + true + + + true + + + + ВнешнийПользовательПустаяСсылка + + <key>ru</key> + <value>Внешний пользователь пустая ссылка</value> + + 15 + + CatalogRef.ВнешниеПользователи + + + true + + + true + + + + ВидДоступаВнешниеПользователи + + <key>ru</key> + <value>Вид доступа внешние пользователи</value> + + 16 + + ChartOfCharacteristicTypesRef + + + true + + + true + + + + СписокТиповПользователей + + <key>ru</key> + <value>Список типов пользователей</value> + + 18 + + ValueList + + + true + + + true + + + + + + + ПредставлениеТипаПользователей + + <key>ru</key> + <value>Участники группы</value> + + 19 + + String + + + + true + + + true + + + + ТипыПользователей + + <key>ru</key> + <value>Типы пользователей</value> + + 20 + + ValueList + + + true + + + true + + + + + + + ТекущиеТипыЗначенийДоступа + + <key>ru</key> + <value>Текущие типы значений доступа</value> + + 22 + + ValueList + + + true + + + true + + + + + + + ТекущийТипЗначенияДоступа + + <key>ru</key> + <value>Текущий тип значения доступа</value> + + 23 + + AnyRef + + + true + + + true + + + + ГруппаВнешнихПользователейПустаяСсылка + + <key>ru</key> + <value>Группа внешних пользователей пустая ссылка</value> + + 13 + + CatalogRef.ГруппыВнешнихПользователей + + + 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 + + + + + Подобрать + + <key>ru</key> + <value>Подобрать</value> + + 3 + + true + + + + Подобрать + + + Picture + Auto + Auto + + + + + + + + AfterWrite + ПослеЗаписи + + + AfterWriteAtServer + ПослеЗаписиНаСервере + + + OnReadAtServer + ПриЧтенииНаСервере + + + BeforeWrite + ПередЗаписью + + +
diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Help/ru.html new file mode 100644 index 000000000..2293b1ff8 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Help/ru.html @@ -0,0 +1,6 @@ + +

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

+

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

+

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

+

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

+

 

\ No newline at end of file diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..6417244f7 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,1079 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + //** Подготовка постоянных коллекций + + // Заполнение списка видов доступа через права по значениям доступа + Для каждого СвойстваВидаДоступа Из УправлениеДоступом.СвойстваВидаДоступа().НайтиСтроки(Новый Структура("ВидДоступаЧерезПраваПоЗначениямДоступа", Истина)) Цикл + ВидыДоступаЧерезПраваПоЗначениямДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа); + КонецЦикла; + + // Заполнение типов значений доступа всех видов доступа + Для каждого СвойстваВидаДоступа Из УправлениеДоступом.СвойстваВидаДоступа() Цикл + Для каждого Тип Из СвойстваВидаДоступа.ВидДоступа.ТипЗначения.Типы() Цикл + МассивТипов = Новый Массив; + МассивТипов.Добавить(Тип); + ОписаниеТипа = Новый ОписаниеТипов(МассивТипов); + + МетаданныеТипа = Метаданные.НайтиПоТипу(Тип); + Если Метаданные.Перечисления.Найти(МетаданныеТипа.Имя) = МетаданныеТипа Тогда + ПредставлениеТипа = МетаданныеТипа.Представление(); + Иначе + ПредставлениеТипа = ?(ЗначениеЗаполнено(МетаданныеТипа.ПредставлениеОбъекта), МетаданныеТипа.ПредставлениеОбъекта, МетаданныеТипа.Представление()); + КонецЕсли; + + НоваяСтрока = ТипыЗначенийДоступаВидовДоступа.Добавить(); + НоваяСтрока.ВидДоступа = СвойстваВидаДоступа.ВидДоступа; + НоваяСтрока.ТипЗначенияДоступа = ОписаниеТипа.ПривестиЗначение(Неопределено); + НоваяСтрока.ПредставлениеТипа = ПредставлениеТипа; + КонецЦикла; + КонецЦикла; + + ПрофильАдминистратор = Справочники.ПрофилиГруппДоступа.Администратор; + ГруппаДоступаАдминистраторы = Справочники.ГруппыДоступа.Администраторы; + + ВидДоступаПользователи = ПланыВидовХарактеристик.ВидыДоступа.Пользователи; + ВидДоступаВнешниеПользователи = ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи; + + ИспользоватьВнешнихПользователей = ВнешниеПользователи.ИспользоватьВнешнихПользователей(); + + СписокТиповПользователей.Добавить(Тип("СправочникСсылка.Пользователи"), "Пользователи"); + СписокТиповПользователей.Добавить(Тип("СправочникСсылка.ВнешниеПользователи"), "ВнешниеПользователи"); + + // Заполнение списка выбора типа пользователей + ЗаполнитьСписокТиповПользователей(); + + УстановитьПривилегированныйРежим(Истина); + Элементы.ПредставлениеТипаПользователей.Видимость = Константы.ИспользоватьВнешнихПользователей.Получить() ИЛИ + Объект.ТипПользователей <> Неопределено И + ТипЗнч(Объект.ТипПользователей) <> Тип("СправочникСсылка.Пользователи"); + + //** Установка постоянной доступности свойств + + // Определение необходимости настройки ограничений доступа + Если НЕ УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда + Элементы.Доступ.Видимость = Ложь; + КонецЕсли; + + // Установка доступности при открытии формы только для просмотра + Элементы.ПользователиПодобрать.Доступность = НЕ ТолькоПросмотр; + Элементы.КонтекстноеМенюПользователиПодобрать.Доступность = НЕ ТолькоПросмотр; + Элементы.ВидыДоступаИзменить.Доступность = НЕ ТолькоПросмотр; + + // Установка доступности свойств для группы доступа Администраторы + Если Объект.Ссылка = ГруппаДоступаАдминистраторы Тогда + + Элементы.Наименование.ТолькоПросмотр = Истина; + Элементы.Профиль.ТолькоПросмотр = Истина; + Элементы.ПредставлениеТипаПользователей.Видимость = Ложь; + + Если НЕ УправлениеДоступом.ЕстьРоль("ПолныеПрава") Тогда + ТолькоПросмотр = Истина; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если Объект.Ссылка = ГруппаДоступаАдминистраторы И + Объект.Профиль <> ПрофильАдминистратор Тогда + Если Вопрос(НСтр("ru = 'У группы доступа Администраторы должен быть профиль Администратор! + | + |Установить профиль в группе доступа (нет - открыть только для просмотра)?'"), + РежимДиалогаВопрос.ДаНет, + , + КодВозвратаДиалога.Нет) = КодВозвратаДиалога.Да Тогда + Объект.Профиль = ПрофильАдминистратор; + Модифицированность = Истина; + Иначе + ТолькоПросмотр = Истина; + КонецЕсли; + КонецЕсли; + + Если НЕ ТолькоПросмотр И ИзменилсяСоставВидовДоступаПриЧтении Тогда + Если Вопрос(НСтр("ru = 'Изменился состав видов доступа профиля этой группы доступа! + | + |Обновить виды доступа в группе доступа (нет - открыть только для просмотра)?'"), + РежимДиалогаВопрос.ДаНет, + , + КодВозвратаДиалога.Нет) = КодВозвратаДиалога.Да Тогда + ОбновитьСоставВидовДоступа(); + Иначе + ТолькоПросмотр = Истина; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + + ОбновитьСоставВидовДоступа(Истина); + + ЗаполнитьНомераКартинокПользователей(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗаписью(Отказ) + + // Сохранение значений из таблицы формы в табличную часть объекта. + ПоместитьЗаполнитьДанные(ТекущийВидДоступа); + +КонецПроцедуры + +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + + Если ТекущийОбъект.ДополнительныеСвойства.Свойство("ЕстьОшибки") Тогда + ПараметрыЗаписи.Вставить("ЕстьОшибки"); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + Если ПараметрыЗаписи.Свойство("ЕстьОшибки") Тогда + Предупреждение(НСтр("ru = 'При записи возникли ошибки (см. журнал регистрации)'")); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + + // Проверка незаполненных и повторяющихся пользователей и групп пользователей. + НомерСтроки = Объект.Пользователи.Количество()-1; + + Пока НЕ Отказ И НомерСтроки >= 0 Цикл + ТекущаяСтрока = Объект.Пользователи.Получить(НомерСтроки); + + // Проверка заполнения значения. + Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.Пользователь) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не заполнен пользователь или группа пользователей!'"), + , + "Объект.Пользователи[" + Формат(НомерСтроки, "ЧГ=0") + "].Пользователь", + , + Отказ); + Продолжить; + КонецЕсли; + + // Проверка наличия повторяющихся значений. + НайденныеЗначения = Объект.Пользователи.НайтиСтроки(Новый Структура("Пользователь", ТекущаяСтрока.Пользователь)); + Если НайденныеЗначения.Количество() > 1 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( ?(ТипЗнч(ТекущаяСтрока.Пользователь) = Тип("СправочникСсылка.Пользователи"), + НСтр("ru = 'Пользователь повторяется!'"), + НСтр("ru = 'Группа пользователей повторяется!'") ), + , + "Объект.Пользователи[" + Формат(НомерСтроки, "ЧГ=0") + "].Пользователь", + , + Отказ); + Продолжить; + КонецЕсли; + + // Проверка наличия только элементов в предопределенной группе Администраторы. + Если Объект.Ссылка = ГруппаДоступаАдминистраторы И ТипЗнч(ТекущаяСтрока.Пользователь) <> Тип("СправочникСсылка.Пользователи") Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( ?(ТипЗнч(ТекущаяСтрока.Пользователь) = Тип("СправочникСсылка.ГруппыПользователей"), + НСтр("ru = 'В предопределенной группе доступа Администраторы могут быть только пользователи. + |Группы пользователей недопустимы!'"), + НСтр("ru = 'В предопределенной группе доступа Администраторы могут быть только пользователи. + |Внешние пользователи и группы внешних пользователей недопустимы!'") ), + , + "Объект.Пользователи[" + Формат(НомерСтроки, "ЧГ=0") + "].Пользователь", + , + Отказ); + Продолжить; + КонецЕсли; + + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + + // Проверка незаполненных и повторяющихся значений доступа. + НомерСтрокиВидДоступа = Объект.ВидыДоступа.Количество()-1; + + Пока НЕ Отказ И НомерСтрокиВидДоступа >= 0 Цикл + ТекущаяСтрокаВидовДоступа = Объект.ВидыДоступа.Получить(НомерСтрокиВидДоступа); + + ЗначенияДоступаВидаДоступа = Объект.ЗначенияДоступа.НайтиСтроки(Новый Структура("ВидДоступа", ТекущаяСтрокаВидовДоступа.ВидДоступа)); + НомерСтроки = ЗначенияДоступаВидаДоступа.Количество()-1; + + Пока НЕ Отказ И НомерСтроки >= 0 Цикл + + ТекущаяСтрока = ЗначенияДоступаВидаДоступа.Получить(НомерСтроки); + + // Проверка заполнения значения. + Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.ЗначениеДоступа) Тогда + Элементы.ВидыДоступа.ТекущаяСтрока = ТекущаяСтрокаВидовДоступа.ПолучитьИдентификатор(); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Значение не заполнено!'"), + , + "ЗначенияДоступа[" + Формат(НомерСтроки, "ЧГ=0") + "].ЗначениеДоступа", + , + Отказ); + Продолжить; + КонецЕсли; + + // Проверка наличия повторяющихся значений. + НайденныеЗначения = Объект.ЗначенияДоступа.НайтиСтроки(Новый Структура("ВидДоступа, ЗначениеДоступа", ТекущаяСтрокаВидовДоступа.ВидДоступа, ТекущаяСтрока.ЗначениеДоступа)); + Если НайденныеЗначения.Количество() > 1 Тогда + Элементы.ВидыДоступа.ТекущаяСтрока = ТекущаяСтрокаВидовДоступа.ПолучитьИдентификатор(); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Значение повторяется!'"), + , + "ЗначенияДоступа[" + Формат(НомерСтроки, "ЧГ=0") + "].ЗначениеДоступа", + , + Отказ); + Продолжить; + КонецЕсли; + + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + + НомерСтрокиВидДоступа = НомерСтрокиВидДоступа - 1; + КонецЦикла; + + Если НЕ Отказ И Объект.Ссылка = ГруппаДоступаАдминистраторы Тогда + + УстановитьПривилегированныйРежим(Истина); + НайденПользовательИБ = Ложь; + Для каждого ОписаниеПользователя ИЗ Объект.Пользователи Цикл + Если ЗначениеЗаполнено(ОписаниеПользователя.Пользователь) + И ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ОписаниеПользователя.Пользователь.ИдентификаторПользователяИБ) <> Неопределено Тогда + // + НайденПользовательИБ = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + УстановитьПривилегированныйРежим(Ложь); + Если НЕ НайденПользовательИБ Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'В группе доступа Администраторы + |должен быть хотя бы один пользователь, + |которому разрешен доступ к информационной базе.'"), + , + "Объект.Пользователи", + , + Отказ); + КонецЕсли; + КонецЕсли; + + Если Отказ Тогда + ПроверяемыеРеквизиты.Очистить(); + КонецЕсли; + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий команд и элементов формы +// + +&НаКлиенте +Процедура Подобрать(Команда) + + ВыбратьПодобратьПользователей(Истина); + +КонецПроцедуры + + +&НаКлиенте +Процедура ПрофильПриИзменении(Элемент) + + // Сохранение значений таблицы формы в табличную часть. + ПоместитьЗаполнитьДанные(ТекущийВидДоступа); + + ОбновитьСоставВидовДоступа(); + + // Помещение значений табличной части в таблицу формы. + ПоместитьЗаполнитьДанные(ТекущийВидДоступа); + +КонецПроцедуры + + +&НаКлиенте +Процедура ПредставлениеТипаПользователейПриИзменении(Элемент) + + Если ЗначениеЗаполнено(ПредставлениеТипаПользователей) Тогда + УдалитьНеТипичныеПользователи(); + Иначе + ПредставлениеТипаПользователей = ""; + Объект.ТипПользователей = Неопределено; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеТипаПользователейНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ВыбранныйЭлемент = ВыбратьИзСписка(ТипыПользователей, Элемент, ТипыПользователей.НайтиПоЗначению(Объект.ТипПользователей)); + + Если ВыбранныйЭлемент <> Неопределено Тогда + + Модифицированность = Истина; + Объект.ТипПользователей = ВыбранныйЭлемент.Значение; + ПредставлениеТипаПользователей = ВыбранныйЭлемент.Представление; + + ПредставлениеТипаПользователейПриИзменении(Элемент); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПользователиПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) + + Если Элемент.ТекущиеДанные.Пользователь = Неопределено Тогда + Элемент.ТекущиеДанные.НомерКартинки = -1; + Элемент.ТекущиеДанные.Пользователь = ПользовательПустаяСсылка; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПользователиПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) + + Если НоваяСтрока И + Элемент.ТекущиеДанные <> Неопределено И + Элемент.ТекущиеДанные.Пользователь = ПользовательПустаяСсылка Тогда + + Элемент.ТекущиеДанные.Пользователь = Неопределено; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПользователиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + ЕстьИзменения = Ложь; + + Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда + Для каждого Значение Из ВыбранноеЗначение Цикл + + Если Объект.Пользователи.НайтиСтроки(Новый Структура("Пользователь", Значение)).Количество() = 0 Тогда + + Строка = Объект.Пользователи.Добавить(); + Строка.Пользователь = Значение; + ЕстьИзменения = Истина; + КонецЕсли; + КонецЦикла; + + ИначеЕсли Элемент.ТекущиеДанные.Пользователь <> ВыбранноеЗначение Тогда + ЕстьИзменения = Истина; + Элемент.ТекущиеДанные.Пользователь = ВыбранноеЗначение; + КонецЕсли; + + Если ЕстьИзменения Тогда + ЗаполнитьНомераКартинокПользователей(); + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ПользовательПриИзменении(Элемент) + + Если ЗначениеЗаполнено(Элементы.Пользователи.ТекущиеДанные.Пользователь) Тогда + ЗаполнитьНомераКартинокПользователей(Элементы.Пользователи.ТекущаяСтрока); + Иначе + Элементы.Пользователи.ТекущиеДанные.НомерКартинки = -1; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПользовательНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ВыбратьПодобратьПользователей(Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ПользовательОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Элементы.Пользователи.ТекущиеДанные.Пользователь = ПользовательПустаяСсылка; + Элементы.Пользователи.ТекущиеДанные.НомерКартинки = -1; + +КонецПроцедуры + +&НаКлиенте +Процедура ПользовательОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = СформироватьДанныеВыбораПользователя(Текст); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПользовательАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = СформироватьДанныеВыбораПользователя(Текст); + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ВидыДоступаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Если НЕ ТолькоПросмотр Тогда + Элементы.ВидыДоступа.ИзменитьСтроку(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаПриАктивизацииСтроки(Элемент) + + ЗначенияЗадаются = Ложь; + + Если Элемент.ТекущиеДанные <> Неопределено Тогда + + Если ТекущийВидДоступа <> Элемент.ТекущиеДанные.ВидДоступа Тогда + Элементы.Доступ.Доступность = Ложь; + Элементы.Доступ.Доступность = Истина; + КонецЕсли; + + ПоместитьЗаполнитьДанные(Элемент.ТекущиеДанные.ВидДоступа); + + Если ВидыДоступаЧерезПраваПоЗначениямДоступа.НайтиПоЗначению(Элемент.ТекущиеДанные.ВидДоступа) = Неопределено Тогда + ЗначенияЗадаются = Истина; + Элементы.ТипыВидовДоступа.ТекущаяСтраница = Элементы.ОбычныйВидДоступа; + Иначе + Элементы.ТипыВидовДоступа.ТекущаяСтраница = Элементы.ВидДоступаЧерезПраваПоЗначениямДоступа; + КонецЕсли; + ОбновитьНадписьВидДоступа(ЗначенияЗадаются); + КонецЕсли; + + Элементы.ЗначенияДоступа.Доступность = ЗначенияЗадаются; + Элементы.ЗначенияДоступаДобавить.Доступность = ЗначенияЗадаются; + Элементы.ЗначениеДоступа.ЦветТекстаЗаголовка = ?(ЗначенияЗадаются, Новый Цвет, Новый Цвет(167, 144, 79)); + Элементы.ДоступРазрешен.ЦветТекстаЗаголовка = ?(ЗначенияЗадаются, Новый Цвет, Новый Цвет(167, 144, 79)); + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаПриАктивизацииЯчейки(Элемент) + + Если Элементы.ВидыДоступа.ТекущийЭлемент <> Элементы.ДоступРазрешенПоВиду Тогда + Элементы.ВидыДоступа.ТекущийЭлемент = Элементы.ДоступРазрешенПоВиду; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ДоступРазрешенПоВидуПриИзменении(Элемент) + + Элементы.ВидыДоступа.ЗакончитьРедактированиеСтроки(Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) + + ОбновитьНадписьВидДоступа(ЗначенияЗадаются); + + Для каждого Строка ИЗ ЗначенияДоступа Цикл + Строка.ДоступРазрешен = НЕ Элементы.ВидыДоступа.ТекущиеДанные.ДоступРазрешен; + КонецЦикла; + +КонецПроцедуры + + +&НаКлиенте +Процедура ЗначенияДоступаПриИзменении(Элемент) + + Объект.ВидыДоступа.НайтиСтроки(Новый Структура("ВидДоступа", ТекущийВидДоступа))[0].ЗначенияЗаданы = ЗначенияДоступа.Количество() <> 0; + + ТекущийНомер = 1; + Для каждого Строка Из ЗначенияДоступа Цикл + Строка.НомерСтроки = ТекущийНомер; + ТекущийНомер = ТекущийНомер + 1; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначенияДоступаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) + + Если НоваяСтрока Тогда + Элемент.ТекущиеДанные.ДоступРазрешен = НЕ Элементы.ВидыДоступа.ТекущиеДанные.ДоступРазрешен; + Элемент.ТекущиеДанные.НомерСтроки = ЗначенияДоступа.Количество(); + КонецЕсли; + + Если Элемент.ТекущиеДанные.ЗначениеДоступа = Неопределено Тогда + Элемент.ТекущиеДанные.ЗначениеДоступа = ТекущиеТипыЗначенийДоступа[0].Значение; + КонецЕсли; + + Элементы.ЗначениеДоступа.КнопкаОчистки = ТекущийТипЗначенияДоступа <> Неопределено + И ТекущиеТипыЗначенийДоступа.Количество() > 1; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + Если НЕ ВыбранТипЗначенияДоступа(ТекущиеТипыЗначенийДоступа) Тогда + СтандартнаяОбработка = Ложь; + Возврат; + КонецЕсли; + + ТекущиеДанные = Элементы.ЗначенияДоступа.ТекущиеДанные; + + Если НЕ ЗначениеЗаполнено(ТекущиеДанные.ЗначениеДоступа) + И ТекущиеДанные.ЗначениеДоступа <> ТекущийТипЗначенияДоступа Тогда + + ТекущиеДанные.ЗначениеДоступа = ТекущийТипЗначенияДоступа; + КонецЕсли; + + Элементы.ЗначениеДоступа.КнопкаОчистки = ТекущийТипЗначенияДоступа <> Неопределено + И ТекущиеТипыЗначенийДоступа.Количество() > 1; + + Если ТекущийТипЗначенияДоступа = ПользовательПустаяСсылка ИЛИ + ТекущийТипЗначенияДоступа = ГруппаПользователейПустаяСсылка Тогда + + СтандартнаяОбработка = Ложь; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ТекущаяСтрока", Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа); + ПараметрыФормы.Вставить("ВыборГруппПользователей", Истина); + ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элемент); + + ИначеЕсли ТекущийТипЗначенияДоступа = ВнешнийПользовательПустаяСсылка ИЛИ + ТекущийТипЗначенияДоступа = ГруппаВнешнихПользователейПустаяСсылка Тогда + + СтандартнаяОбработка = Ложь; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ТекущаяСтрока", Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа); + ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); + ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, Элемент); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + Если ВыбранноеЗначение = Тип("СправочникСсылка.Пользователи") ИЛИ + ВыбранноеЗначение = Тип("СправочникСсылка.ГруппыПользователей") Тогда + + СтандартнаяОбработка = Ложь; + НачальноеЗначение = Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа; + ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", Новый Структура("ВыборГруппПользователей, ТекущаяСтрока", Истина, НачальноеЗначение), Элемент); + + ИначеЕсли ВыбранноеЗначение = Тип("СправочникСсылка.ВнешниеПользователи") ИЛИ + ВыбранноеЗначение = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда + + СтандартнаяОбработка = Ложь; + НачальноеЗначение = Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа; + ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", Новый Структура("ВыборГруппВнешнихПользователей, ТекущаяСтрока", Истина, НачальноеЗначение), Элемент); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ТекущийТипЗначенияДоступа = Неопределено; + + Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа = ТекущиеТипыЗначенийДоступа[0].Значение; + Элементы.ЗначениеДоступа.КнопкаОчистки = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + + Если ТекущийВидДоступа = ВидДоступаВнешниеПользователи ИЛИ ТекущийВидДоступа = ВидДоступаПользователи Тогда + ДанныеВыбора = Пользователи.СформироватьДанныеВыбораПользователя(Текст, , ТекущийВидДоступа = ВидДоступаВнешниеПользователи, ТекущийВидДоступа <> ВидДоступаПользователи); + Иначе + ДанныеВыбора = УправлениеДоступом.СформироватьДанныеВыбораЗначенияДоступа(Текст, ТекущийВидДоступа, Ложь); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + + Если ТекущийВидДоступа = ВидДоступаВнешниеПользователи ИЛИ ТекущийВидДоступа = ВидДоступаПользователи Тогда + ДанныеВыбора = Пользователи.СформироватьДанныеВыбораПользователя(Текст, , ТекущийВидДоступа = ВидДоступаВнешниеПользователи, ТекущийВидДоступа <> ВидДоступаПользователи); + Иначе + ДанныеВыбора = УправлениеДоступом.СформироватьДанныеВыбораЗначенияДоступа(Текст, ТекущийВидДоступа, Ложь); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции формы +// + +&НаСервере +Процедура ЗаполнитьСписокТиповПользователей() + + ТипыПользователей.Добавить(Справочники.Пользователи.ПустаяСсылка(), НСтр("ru = 'Обычные пользователи'")); + + Если ИспользоватьВнешнихПользователей Тогда + + Для каждого ТипСсылкиОбъектаАвторизации ИЗ Метаданные.Справочники.ВнешниеПользователи.Реквизиты.ОбъектАвторизации.Тип.Типы() Цикл + + МетаданныеТипа = Метаданные.НайтиПоТипу(ТипСсылкиОбъектаАвторизации); + + МассивТипов = Новый Массив; + МассивТипов.Добавить(ТипСсылкиОбъектаАвторизации); + ОписаниеТипаСсылки = Новый ОписаниеТипов(МассивТипов); + + ТипыПользователей.Добавить(ОписаниеТипаСсылки.ПривестиЗначение(Неопределено), СтрЗаменить(НСтр("ru = 'Внешние пользователи (%1)'"), "%1", МетаданныеТипа.Синоним)); + КонецЦикла; + КонецЕсли; + + Если Объект.ТипПользователей = Неопределено Тогда + ПредставлениеТипаПользователей = ""; + Иначе + НайденныйЭлемент = ТипыПользователей.НайтиПоЗначению(Объект.ТипПользователей); + ПредставлениеТипаПользователей = ?(НайденныйЭлемент = Неопределено, СтрЗаменить(НСтр("ru = 'Неизвестный тип ""%1""'"), "%1", Строка(ТипЗнч(Объект.ТипПользователей))), НайденныйЭлемент.Представление); + КонецЕсли; + +КонецПроцедуры + + +&НаСервере +Процедура УдалитьНеТипичныеПользователи() + + Если Объект.ТипПользователей = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(Объект.ТипПользователей) = Тип("СправочникСсылка.Пользователи") Тогда + + Индекс = Объект.Пользователи.Количество()-1; + Пока Индекс >= 0 Цикл + + Если ТипЗнч(Объект.Пользователи[Индекс].Пользователь) <> Тип("СправочникСсылка.Пользователи") И + ТипЗнч(Объект.Пользователи[Индекс].Пользователь) <> Тип("СправочникСсылка.ГруппыПользователей") Тогда + + Объект.Пользователи.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + Иначе + Индекс = Объект.Пользователи.Количество()-1; + Пока Индекс >= 0 Цикл + + Если ТипЗнч(Объект.Пользователи[Индекс].Пользователь) <> Тип("СправочникСсылка.ВнешниеПользователи") И + ТипЗнч(Объект.Пользователи[Индекс].Пользователь) <> Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда + + Объект.Пользователи.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ВнешниеПользователи.Ссылка + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + |ГДЕ + | ТИПЗНАЧЕНИЯ(ВнешниеПользователи.ОбъектАвторизации) <> &ТипВнешнихПользователей + | И ВнешниеПользователи.Ссылка В(&ВыбранныеВнешниеПользователиИГруппы) + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ГруппыВнешнихПользователей.Ссылка + |ИЗ + | Справочник.ГруппыВнешнихПользователей КАК ГруппыВнешнихПользователей + |ГДЕ + | ГруппыВнешнихПользователей.ТипОбъектовАвторизации <> НЕОПРЕДЕЛЕНО + | И ТИПЗНАЧЕНИЯ(ГруппыВнешнихПользователей.ТипОбъектовАвторизации) <> &ТипВнешнихПользователей + | И ГруппыВнешнихПользователей.Ссылка В(&ВыбранныеВнешниеПользователиИГруппы)"); + + Запрос.УстановитьПараметр("ВыбранныеВнешниеПользователиИГруппы", Объект.Пользователи.Выгрузить().ВыгрузитьКолонку("Пользователь")); + Запрос.УстановитьПараметр("ТипВнешнихПользователей", ТипЗнч(Объект.ТипПользователей)); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + НайденныеСтроки = Объект.Пользователи.НайтиСтроки(Новый Структура("Пользователь", Выборка.Ссылка)); + Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл + Объект.Пользователи.Удалить(Объект.Пользователи.Индекс(НайденнаяСтрока)); + КонецЦикла; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + + +&НаСервере +Процедура ОбновитьСоставВидовДоступа(ПриЧтенииНаСервере = Ложь) + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ПрофилиГруппДоступаВидыДоступа.ВидДоступа, + | ПрофилиГруппДоступаВидыДоступа.Предустановленный, + | ПрофилиГруппДоступаВидыДоступа.ДоступРазрешен + |ИЗ + | Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ПрофилиГруппДоступаВидыДоступа + |ГДЕ + | ПрофилиГруппДоступаВидыДоступа.Ссылка = &Ссылка + | И ПрофилиГруппДоступаВидыДоступа.ВидДоступа.Предопределенный"); + Запрос.УстановитьПараметр("Ссылка", Объект.Профиль); + УстановитьПривилегированныйРежим(Истина); + ВидыДоступаПрофиля = Запрос.Выполнить().Выгрузить(); + УстановитьПривилегированныйРежим(Ложь); + + ИзменилсяСоставВидовДоступа = Ложь; + + // Добавление недостающих видов доступа. + Для каждого СтрокаТЧ Из ВидыДоступаПрофиля Цикл + + Отбор = Новый Структура("ВидДоступа", СтрокаТЧ.ВидДоступа); + СвойстваВидаДоступа = УправлениеДоступом.СвойстваВидаДоступа(СтрокаТЧ.ВидДоступа); + + Если СвойстваВидаДоступа <> Неопределено + И НЕ СвойстваВидаДоступа.ВидДоступаИспользуетсяВсегда + И НЕ СтрокаТЧ.Предустановленный + И Объект.ВидыДоступа.НайтиСтроки(Новый Структура("ВидДоступа", СтрокаТЧ.ВидДоступа)).Количество() = 0 Тогда + + ИзменилсяСоставВидовДоступа = Истина; + Если ПриЧтенииНаСервере Тогда + Прервать; + Иначе + НоваяСтрока = Объект.ВидыДоступа.Добавить(); + НоваяСтрока.ВидДоступа = СтрокаТЧ.ВидДоступа; + НоваяСтрока.ДоступРазрешен = СтрокаТЧ.ДоступРазрешен; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + // Удаление лишних видов доступа. + Индекс = Объект.ВидыДоступа.Количество() - 1; + Пока Индекс >= 0 Цикл + + ТекущийВидДоступа1 = Объект.ВидыДоступа[Индекс].ВидДоступа; + СвойстваВидаДоступаВПрофиле = ВидыДоступаПрофиля.НайтиСтроки(Новый Структура("ВидДоступа", ТекущийВидДоступа1)); + СвойстваВидаДоступа = УправлениеДоступом.СвойстваВидаДоступа(ТекущийВидДоступа1); + Если СвойстваВидаДоступа = Неопределено + ИЛИ СвойстваВидаДоступа.ВидДоступаИспользуетсяВсегда + ИЛИ СвойстваВидаДоступаВПрофиле.Количество() > 0 + И СвойстваВидаДоступаВПрофиле[0].Предустановленный + ИЛИ ВидыДоступаПрофиля.НайтиСтроки(Новый Структура("ВидДоступа", ТекущийВидДоступа1)).Количество() = 0 Тогда + + ИзменилсяСоставВидовДоступа = Истина; + Если ПриЧтенииНаСервере Тогда + Прервать; + Иначе + Объект.ВидыДоступа.Удалить(Индекс); + Для каждого ЭлементКоллекции Из Объект.ЗначенияДоступа.НайтиСтроки(Новый Структура("ВидДоступа", ТекущийВидДоступа1)) Цикл + Объект.ЗначенияДоступа.Удалить(ЭлементКоллекции); + КонецЦикла; + КонецЕсли; + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + + Модифицированность = Модифицированность ИЛИ ИзменилсяСоставВидовДоступа И НЕ ПриЧтенииНаСервере; + + // Установка флажка для запроса у пользователя решения обновить состав видов доступа. + Если ПриЧтенииНаСервере + И НЕ Объект.Ссылка.Пустая() // ЭтоНовый + И ИзменилсяСоставВидовДоступа + И ОбщегоНазначения.ПолучитьЗначениеРеквизита(Объект.Ссылка, "Профиль") = Объект.Профиль Тогда + + ИзменилсяСоставВидовДоступаПриЧтении = Истина; + КонецЕсли; + + Элементы.Доступ.Доступность = Объект.ВидыДоступа.Количество() > 0; + + // Установка порядка видов доступа по профилю. + Если НЕ ИзменилсяСоставВидовДоступаПриЧтении Тогда + Индекс = ВидыДоступаПрофиля.Количество()-1; + Пока Индекс >=0 Цикл + Если ВидыДоступаПрофиля[Индекс].Предустановленный Тогда + ВидыДоступаПрофиля.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + Для каждого СтрокаТЧ Из ВидыДоступаПрофиля Цикл + Индекс = Объект.ВидыДоступа.Индекс(Объект.ВидыДоступа.НайтиСтроки(Новый Структура("ВидДоступа", СтрокаТЧ.ВидДоступа))[0]); + Объект.ВидыДоступа.Сдвинуть(Индекс, ВидыДоступаПрофиля.Индекс(СтрокаТЧ) - Индекс); + КонецЦикла; + КонецЕсли; + + Для каждого Строка Из Объект.ВидыДоступа Цикл + // Установка наличия заданных значений по видам доступа. + Строка.ЗначенияЗаданы = Объект.ЗначенияДоступа.НайтиСтроки(Новый Структура("ВидДоступа", Строка.ВидДоступа)).Количество() <> 0; + КонецЦикла; + + Если ИзменилсяСоставВидовДоступа Тогда + ТекущийВидДоступа = Неопределено; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоместитьЗаполнитьДанные(НовыйВидДоступа) + + Если ЗначениеЗаполнено(ТекущийВидДоступа) Тогда + + ОтборПоВидуДоступа = Новый Структура("ВидДоступа", ТекущийВидДоступа); + + ОписаниеВидаДоступа = Объект.ВидыДоступа.НайтиСтроки(ОтборПоВидуДоступа)[0]; + ОписаниеВидаДоступа.ТекущийТипЗначенияДоступа = ТекущийТипЗначенияДоступа; + + // Добавление новых строк + Отбор = Новый Структура("ВидДоступа, ЗначениеДоступа, ДоступРазрешен", ТекущийВидДоступа); + Для каждого Строка Из ЗначенияДоступа Цикл + ЗаполнитьЗначенияСвойств(Отбор, Строка); + Если Объект.ЗначенияДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда + НоваяСтрока = Объект.ЗначенияДоступа.Добавить(); + НоваяСтрока.ВидДоступа = ТекущийВидДоступа; + НоваяСтрока.ЗначениеДоступа = Строка.ЗначениеДоступа; + НоваяСтрока.ДоступРазрешен = Строка.ДоступРазрешен; + КонецЕсли; + КонецЦикла; + // Удаление лишних строк + Отбор = Новый Структура("ЗначениеДоступа, ДоступРазрешен"); + Для каждого Строка Из Объект.ЗначенияДоступа.НайтиСтроки(ОтборПоВидуДоступа) Цикл + ЗаполнитьЗначенияСвойств(Отбор, Строка); + Если ЗначенияДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда + Объект.ЗначенияДоступа.Удалить(Строка); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ЗначенияДоступа.Очистить(); + ТекущийТипЗначенияДоступа = Неопределено; + Если ЗначениеЗаполнено(НовыйВидДоступа) Тогда + + Отбор = Новый Структура("ВидДоступа", НовыйВидДоступа); + + ОписаниеВидаДоступа = Объект.ВидыДоступа.НайтиСтроки(Отбор)[0]; + ТекущийТипЗначенияДоступа = ОписаниеВидаДоступа.ТекущийТипЗначенияДоступа; + + // Копирование значений и групп значений со свойством ДоступРазрешен. + ТекущийНомер = 1; + СтрокиТЧ = Объект.ЗначенияДоступа.НайтиСтроки(Отбор); + Для каждого СтрокаТЧ Из СтрокиТЧ Цикл + НоваяСтрока = ЗначенияДоступа.Добавить(); + НоваяСтрока.ЗначениеДоступа = СтрокаТЧ.ЗначениеДоступа; + НоваяСтрока.ДоступРазрешен = СтрокаТЧ.ДоступРазрешен; + НоваяСтрока.НомерСтроки = ТекущийНомер; + ТекущийНомер = ТекущийНомер + 1; + КонецЦикла; + КонецЕсли; + + ТекущийВидДоступа = НовыйВидДоступа; + Элементы.ЗначенияДоступа.Доступность = ЗначениеЗаполнено(ТекущийВидДоступа); + + ОписаниеВидаДоступа = Объект.ВидыДоступа.НайтиСтроки(Новый Структура("ВидДоступа", ТекущийВидДоступа)); + ТекущийТипЗначенияДоступа = ?(ОписаниеВидаДоступа.Количество() = 0, Неопределено, ОписаниеВидаДоступа[0].ТекущийТипЗначенияДоступа); + ТекущиеТипыЗначенийДоступа = Новый СписокЗначений; + Для каждого ОписаниеТипаВидаДоступа Из ТипыЗначенийДоступаВидовДоступа.НайтиСтроки(Новый Структура("ВидДоступа", ТекущийВидДоступа)) Цикл + ТекущиеТипыЗначенийДоступа.Добавить(ОписаниеТипаВидаДоступа.ТипЗначенияДоступа, ОписаниеТипаВидаДоступа.ПредставлениеТипа); + КонецЦикла; + Если ТекущиеТипыЗначенийДоступа.Количество() = 0 Тогда + ТекущиеТипыЗначенийДоступа.Добавить(Неопределено, НСтр("ru = 'Неопределено'")); + КонецЕсли; + +КонецПроцедуры + + +&НаСервере +Процедура ЗаполнитьНомераКартинокПользователей(ИдентификаторСтроки = Неопределено) + + Пользователи.ЗаполнитьНомераКартинокПользователей(Объект.Пользователи, "Пользователь", "НомерКартинки", ИдентификаторСтроки); + +КонецПроцедуры + + +&НаСервере +Функция СформироватьДанныеВыбораПользователя(Текст) + + Если Объект.Ссылка = ГруппаДоступаАдминистраторы Тогда + + Возврат Пользователи.СформироватьДанныеВыбораПользователя(Текст, Ложь, Ложь); + + КонецЕсли; + + Возврат Пользователи.СформироватьДанныеВыбораПользователя(Текст); + +КонецФункции + +&НаКлиенте +Функция ВыбранТипПользователиИлиВнешниеПользователи(ВыборИПодборВнешнихПользователей) + + ВыборИПодборВнешнихПользователей = Ложь; + + Если Объект.Ссылка = ГруппаДоступаАдминистраторы Тогда + Возврат Истина; + КонецЕсли; + + Если Объект.ТипПользователей <> Неопределено Тогда + Если ТипЗнч(Объект.ТипПользователей) <> Тип("СправочникСсылка.Пользователи") Тогда + ВыборИПодборВнешнихПользователей = Истина; + КонецЕсли; + Возврат Истина; + КонецЕсли; + + Если ИспользоватьВнешнихПользователей Тогда + Элемент = СписокТиповПользователей.ВыбратьЭлемент(НСтр("ru = 'Выбор типа данных'"), СписокТиповПользователей[0]); + Если Элемент <> Неопределено Тогда + ВыборИПодборВнешнихПользователей = Элемент.Значение = Тип("СправочникСсылка.ВнешниеПользователи"); + Иначе + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +&НаКлиенте +Функция ВыбранТипЗначенияДоступа(Знач ТипыЗначенияДоступа) + + Если ТекущийТипЗначенияДоступа <> Неопределено Тогда + + Возврат Истина; + + ИначеЕсли ТипыЗначенияДоступа.Количество() = 1 Тогда + + ТекущийТипЗначенияДоступа = ТипыЗначенияДоступа[0].Значение; + Возврат Истина; + + ИначеЕсли ТипыЗначенияДоступа.Количество() > 0 Тогда + + Если ТипыЗначенияДоступа.Количество() = 2 Тогда + + Если ТипыЗначенияДоступа.НайтиПоЗначению(ПользовательПустаяСсылка) <> Неопределено + И ТипыЗначенияДоступа.НайтиПоЗначению(ГруппаПользователейПустаяСсылка) <> Неопределено Тогда + + ТекущийТипЗначенияДоступа = ПользовательПустаяСсылка; + Возврат Истина; + КонецЕсли; + + Если ТипыЗначенияДоступа.НайтиПоЗначению(ВнешнийПользовательПустаяСсылка) <> Неопределено + И ТипыЗначенияДоступа.НайтиПоЗначению(ГруппаВнешнихПользователейПустаяСсылка) <> Неопределено Тогда + + ТекущийТипЗначенияДоступа = ВнешнийПользовательПустаяСсылка; + Возврат Истина; + КонецЕсли; + КонецЕсли; + + Элемент = ТипыЗначенияДоступа.ВыбратьЭлемент(НСтр("ru = 'Выбор типа данных'"), ТипыЗначенияДоступа[0]); + Если Элемент <> Неопределено Тогда + ТекущийТипЗначенияДоступа = Элемент.Значение; + Возврат Истина; + КонецЕсли; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + + +&НаКлиенте +Процедура ВыбратьПодобратьПользователей(Подобрать) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ТекущаяСтрока", ?(Элементы.Пользователи.ТекущиеДанные = Неопределено, Неопределено, Элементы.Пользователи.ТекущиеДанные.Пользователь)); + + Если НЕ Подобрать И + ЗначениеЗаполнено(ПараметрыФормы.ТекущаяСтрока) И + ( ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.Пользователи") ИЛИ + ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыПользователей") ) Тогда + + ВыборИПодборВнешнихПользователей = Ложь; + + ИначеЕсли НЕ Подобрать И + ИспользоватьВнешнихПользователей И + ЗначениеЗаполнено(ПараметрыФормы.ТекущаяСтрока) И + ( ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.ВнешниеПользователи") ИЛИ + ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") ) Тогда + + ВыборИПодборВнешнихПользователей = Истина; + Иначе + Если НЕ ВыбранТипПользователиИлиВнешниеПользователи(ВыборИПодборВнешнихПользователей) Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + Если Объект.Ссылка <> ГруппаДоступаАдминистраторы Тогда + Если ВыборИПодборВнешнихПользователей Тогда + ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); + Иначе + ПараметрыФормы.Вставить("ВыборГруппПользователей", Истина); + КонецЕсли; + КонецЕсли; + + Если Подобрать Тогда + ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Ложь); + КонецЕсли; + + Если ВыборИПодборВнешнихПользователей Тогда + + Если Объект.ТипПользователей <> Неопределено Тогда + ПараметрыФормы.Вставить("ТипОбъектовАвторизации", Объект.ТипПользователей); + КонецЕсли; + ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, Элементы.Пользователи); + Иначе + ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элементы.Пользователи); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ОбновитьНадписьВидДоступа(ЗначенияЗадаются = Истина) + + НадписьВидДоступа = Строка(Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа) + " " + + ?(ЗначенияЗадаются, + ?(Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа = ВидДоступаПользователи, + ?(Элементы.ВидыДоступа.ТекущиеДанные.ДоступРазрешен, + НСтр("ru = '(список запрещенных, текущий пользователь всегда разрешен)'"), + НСтр("ru = '(список разрешенных, текущий пользователь всегда разрешен)'") ), + ?(Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа = ВидДоступаВнешниеПользователи, + ?(Элементы.ВидыДоступа.ТекущиеДанные.ДоступРазрешен, + НСтр("ru = '(список запрещенных, текущий внешний пользователь всегда разрешен)'"), + НСтр("ru = '(список разрешенных, текущий внешний пользователь всегда разрешен)'") ), + ?(Элементы.ВидыДоступа.ТекущиеДанные.ДоступРазрешен, + НСтр("ru = '(список запрещенных)'"), + НСтр("ru = '(список разрешенных)'") ) + ) + ), + "" ); + + Если НЕ ЗначенияЗадаются Тогда + Элементы.ОтображениеПредупреждения.ТекущаяСтраница = ?(Элементы.ВидыДоступа.ТекущиеДанные.ДоступРазрешен, Элементы.ПредупреждениеТребуется, Элементы.ПредупреждениеНеТребуется); + КонецЕсли; + +КонецФункции + + + + + diff --git a/SSL/src/Catalogs/ГруппыДоступа/Help/ru.html b/SSL/src/Catalogs/ГруппыДоступа/Help/ru.html new file mode 100644 index 000000000..72079f77d --- /dev/null +++ b/SSL/src/Catalogs/ГруппыДоступа/Help/ru.html @@ -0,0 +1,11 @@ + +

1. Общее назначение групп доступа.

+

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

+

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

+

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

+

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

+

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

+

2. Особенности использования справочника "Группы доступа".

+

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

+

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

+

 

\ 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..e69de29bb diff --git a/SSL/src/Catalogs/ГруппыДоступа/ObjectModule.bsl b/SSL/src/Catalogs/ГруппыДоступа/ObjectModule.bsl new file mode 100644 index 000000000..8895a2564 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыДоступа/ObjectModule.bsl @@ -0,0 +1,130 @@ + + +// Обработчик события ПередЗаписью формирует временную таблицу старых пользователей +// для обработчика ПриЗаписи. +// +Процедура ПередЗаписью(Отказ) + + // Следующие строки необходимо, чтобы предотвратить возможность администратору пользователей + // повысить себя до администратора программным путем, т.к. запись групп доступа администратору + // пользователей разрешена. + // Для обмена данными эти строки критичны, если выполняется попытка записать загруженный профиль + // со ссылкой на предопределенный профиль Администратор. + // Такие данные загружать недопустимо. + Если Ссылка = Справочники.ГруппыДоступа.Администраторы Тогда + Профиль = Справочники.ПрофилиГруппДоступа.Администратор; + Если НЕ УправлениеДоступом.ЕстьРоль("ПолныеПрава") Тогда + ВызватьИсключение(НСтр("ru = 'Предопределенную группу доступа Администраторы могут + |изменять только Администраторы!'")); + КонецЕсли; + ИначеЕсли Профиль = Справочники.ПрофилиГруппДоступа.Администратор Тогда + ВызватьИсключение(НСтр("ru = 'Предопределенный профиль Администратор может быть только + |у предопределенной группы доступа Администраторы!'")); + КонецЕсли; + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если НЕ ЭтоГруппа И НЕ ДополнительныеСвойства.Свойство("НеОбновлятьРолиПользователей") Тогда + + // Запоминание старых пользователей группы. + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПользователиИГруппыПользователей.ЗначениеДоступа КАК Пользователь + |ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ПО (ПользователиИГруппыПользователей.ВидДоступа В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи))) + | И (ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ) + | И ГруппыДоступаПользователи.Пользователь = ПользователиИГруппыПользователей.ГруппаДоступа + | И (ГруппыДоступаПользователи.Ссылка = &ГруппаДоступа) + | И (ТИПЗНАЧЕНИЯ(ПользователиИГруппыПользователей.ЗначениеДоступа) = ТИП(Справочник.Пользователи) + | ИЛИ ТИПЗНАЧЕНИЯ(ПользователиИГруппыПользователей.ЗначениеДоступа) = ТИП(Справочник.ВнешниеПользователи))"); + Запрос.УстановитьПараметр("ГруппаДоступа", Ссылка); + ЭтотОбъект.ДополнительныеСвойства.Вставить("СтарыеПользователиГруппы", Запрос.Выполнить().Выгрузить()); + + КонецЕсли; + +КонецПроцедуры + +// Обработчик события ПриЗаписи обновляет +// - роли добавленных, оставшихся и удаленных пользователей; +// - РегистрСведений.ТаблицыГруппДоступа; +// - РегистрСведений.ЗначенияГруппДоступа. +// +Процедура ПриЗаписи(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если НЕ ЭтоГруппа Тогда + + Если НЕ ДополнительныеСвойства.Свойство("НеОбновлятьРолиПользователей") Тогда + + // Обновление ролей для добавленных, оставшихся и удаленных пользователей. + Запрос = Новый Запрос( + "ВЫБРАТЬ + | СтарыеПользователиГруппы.Пользователь + |ПОМЕСТИТЬ СтарыеПользователиГруппы + |ИЗ + | &СтарыеПользователиГруппы КАК СтарыеПользователиГруппы + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СтарыеПользователиГруппы.Пользователь + |ИЗ + | СтарыеПользователиГруппы КАК СтарыеПользователиГруппы + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ПользователиИГруппыПользователей.ЗначениеДоступа + |ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ПО (ПользователиИГруппыПользователей.ВидДоступа В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи))) + | И (ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ) + | И ГруппыДоступаПользователи.Пользователь = ПользователиИГруппыПользователей.ГруппаДоступа + | И (ГруппыДоступаПользователи.Ссылка = &ГруппаДоступа) + | И (ТИПЗНАЧЕНИЯ(ПользователиИГруппыПользователей.ЗначениеДоступа) = ТИП(Справочник.Пользователи) + | ИЛИ ТИПЗНАЧЕНИЯ(ПользователиИГруппыПользователей.ЗначениеДоступа) = ТИП(Справочник.ВнешниеПользователи))"); + Запрос.УстановитьПараметр("ГруппаДоступа", Ссылка); + Запрос.Параметры.Вставить("СтарыеПользователиГруппы", ДополнительныеСвойства.СтарыеПользователиГруппы); + ИзмененныеПользователи = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Пользователь"); + + Если Ссылка = Справочники.ГруппыДоступа.Администраторы Тогда + // Добавление пользователей, связанных с пользователямиИБ, имеющих роль ПолныеПрава + УстановитьПривилегированныйРежим(Истина); + Для каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл + Если ПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава) Тогда + Пользователь = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор); + Если НЕ ЗначениеЗаполнено(Пользователь) Тогда + Пользователь = Справочники.ВнешниеПользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор); + КонецЕсли; + Если ЗначениеЗаполнено(Пользователь) + И ИзмененныеПользователи.Найти(Пользователь) = Неопределено Тогда + ИзмененныеПользователи.Добавить(Пользователь); + КонецЕсли; + КонецЕсли; + КонецЦикла; + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + + ЕстьОшибки = Ложь; + УправлениеДоступом.ОбновитьРолиПользователей(ИзмененныеПользователи, ЕстьОшибки); + Если ЕстьОшибки И НЕ ДополнительныеСвойства.Свойство("ЕстьОшибки") Тогда + ДополнительныеСвойства.Вставить("ЕстьОшибки"); + КонецЕсли; + КонецЕсли; + + УправлениеДоступом.ОбновитьТаблицыГруппДоступа(Ссылка); + + УправлениеДоступом.ЗаписатьЗначенияГруппДоступа(Ссылка); + + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/ГруппыДоступа/ГруппыДоступа.mdo b/SSL/src/Catalogs/ГруппыДоступа/ГруппыДоступа.mdo new file mode 100644 index 000000000..f42a800e0 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыДоступа/ГруппыДоступа.mdo @@ -0,0 +1,368 @@ + + + + + + + + + + ГруппыДоступа + + ru + Группы доступа + + true + Catalog.ГруппыДоступа.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + + + ru + + + Managed + Use + + ru + Группа доступа + + true + 2 + true + 150 + String + AsDescription + + + Администраторы + Администраторы + + + + + + InDialog + BothWays + Catalog.ГруппыДоступа.Form.ФормаЭлемента + Catalog.ГруппыДоступа.Form.ФормаСписка + + Профиль + + ru + Профиль + + + CatalogRef.ПрофилиГруппДоступа + + + + + Catalog.ПрофилиГруппДоступа.EmptyRef + + Index + Use + Use + + + Комментарий + + ru + Комментарий + + + String + + + + + + Use + Use + + + ТипПользователей + + ru + Участники группы + + В качестве типа используется пустая ссылка + + CatalogRef.Пользователи + + + ru + Тип объектов информационной базы + + + + + Use + Use + + + + + + + Пользователи + + ru + Пользователи + + + Use + LineNumber + + Use + + + + + Пользователь + + ru + Пользователь + + + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + CatalogRef.ГруппыПользователей + CatalogRef.Пользователи + + + + ShowError + Use + Index + Use + + + + + + + + ВидыДоступа + + ru + Виды доступа + + + Use + LineNumber + + Use + + + + + ВидДоступа + + ru + Вид доступа + + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + + ShowError + Use + Index + Use + + + ДоступРазрешен + + ru + Доступ разрешен + + + Boolean + + + + Use + + + + + + + + ЗначенияДоступа + + ru + Значения доступа + + + Use + LineNumber + + Use + + + + + ВидДоступа + + ru + Вид доступа + + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + + Use + Index + Use + + + ЗначениеДоступа + + ru + Значение доступа + + + Characteristic.ВидыДоступа + + + + + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа.Attribute.ВидДоступа + + Use + Index + Use + + + ДоступРазрешен + + ru + Доступ разрешен + + + Boolean + + + + Use + + + + ФормаСписка + + ru + Форма списка + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаЭлемента + + ru + Форма элемента + + + + ru + + + PersonalComputer + MobileDevice + + + ОбновлениеДанныхОграниченияДоступа + + ru + Обновление данных ограничения доступа + + Используется для обновления данных ограничения доступа после обновления ИБ вместо регламентного задания + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl b/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl new file mode 100644 index 000000000..d447c6e43 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl @@ -0,0 +1,32 @@ +Функция ГруппаИсполнителейЗадач(РольИсполнителя, ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ГруппыИсполнителейЗадач.Ссылка КАК Ссылка + |ИЗ + | Справочник.ГруппыИсполнителейЗадач КАК ГруппыИсполнителейЗадач + |ГДЕ + | ГруппыИсполнителейЗадач.РольИсполнителя = &РольИсполнителя + | И ГруппыИсполнителейЗадач.ОсновнойОбъектАдресации = &ОсновнойОбъектАдресации + | И ГруппыИсполнителейЗадач.ДополнительныйОбъектАдресации = &ДополнительныйОбъектАдресации"); + Запрос.УстановитьПараметр("РольИсполнителя", РольИсполнителя); + Запрос.УстановитьПараметр("ОсновнойОбъектАдресации", ОсновнойОбъектАдресации); + Запрос.УстановитьПараметр("ДополнительныйОбъектАдресации", ДополнительныйОбъектАдресации); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + ГруппаИсполнителей = Выборка.Ссылка; + Иначе + // Требуется добавить новую группу исполнителей задач. + ГруппаИсполнителейОбъект = Справочники.ГруппыИсполнителейЗадач.СоздатьЭлемент(); + ГруппаИсполнителейОбъект.РольИсполнителя = РольИсполнителя; + ГруппаИсполнителейОбъект.ОсновнойОбъектАдресации = ОсновнойОбъектАдресации; + ГруппаИсполнителейОбъект.ДополнительныйОбъектАдресации = ДополнительныйОбъектАдресации; + ГруппаИсполнителейОбъект.Записать(); + ГруппаИсполнителей = ГруппаИсполнителейОбъект.Ссылка; + КонецЕсли; + + Возврат ГруппаИсполнителей; + +КонецФункции diff --git a/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ObjectModule.bsl b/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ObjectModule.bsl new file mode 100644 index 000000000..2ffeba1b6 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ObjectModule.bsl @@ -0,0 +1,46 @@ + +Процедура ПередЗаписью(Отказ) + + Если ЗначениеЗаполнено(РольИсполнителя) Тогда + + Наименование = Строка(РольИсполнителя); + + Если ЗначениеЗаполнено(ОсновнойОбъектАдресации) Тогда + Наименование = Наименование + ", " + Строка(ОсновнойОбъектАдресации); + КонецЕсли; + + Если ЗначениеЗаполнено(ДополнительныйОбъектАдресации) Тогда + Наименование = Наименование + ", " + Строка(ДополнительныйОбъектАдресации); + КонецЕсли; + Иначе + Наименование = "<Без ролевой адресации>"; + КонецЕсли; + + // Проверка дубля. + Запрос = Новый Запрос( + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ГруппыИсполнителейЗадач.Ссылка + |ИЗ + | Справочник.ГруппыИсполнителейЗадач КАК ГруппыИсполнителейЗадач + |ГДЕ + | ГруппыИсполнителейЗадач.РольИсполнителя = &РольИсполнителя + | И ГруппыИсполнителейЗадач.ОсновнойОбъектАдресации = &ОсновнойОбъектАдресации + | И ГруппыИсполнителейЗадач.ДополнительныйОбъектАдресации = &ДополнительныйОбъектАдресации + | И ГруппыИсполнителейЗадач.Ссылка <> &Ссылка"); + Запрос.УстановитьПараметр("РольИсполнителя", РольИсполнителя); + Запрос.УстановитьПараметр("ОсновнойОбъектАдресации", ОсновнойОбъектАдресации); + Запрос.УстановитьПараметр("ДополнительныйОбъектАдресации", ДополнительныйОбъектАдресации); + Запрос.УстановитьПараметр("Ссылка", Ссылка); + + Если НЕ Запрос.Выполнить().Пустой() Тогда + ВызватьИсключение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Уже есть группа исполнителей задач для которой + |Роль исполнителя = ""%1"" + |Основной объект адресации = ""%2"" + |Дополнительный объект адресации = ""%3""'"), + Строка(РольИсполнителя), + Строка(ОсновнойОбъектАдресации), + Строка(ДополнительныйОбъектАдресации))); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ГруппыИсполнителейЗадач.mdo b/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ГруппыИсполнителейЗадач.mdo new file mode 100644 index 000000000..980e1c01b --- /dev/null +++ b/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ГруппыИсполнителейЗадач.mdo @@ -0,0 +1,153 @@ + + + + + + + + + + ГруппыИсполнителейЗадач + + ru + Группы исполнителей задач + + Catalog.ГруппыИсполнителейЗадач.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + + + + + Use + Code + + Use + + + + Use + Managed + Use + + ru + Группа исполнителей задач + + 2 + true + 150 + String + Variable + AsDescription + InDialog + BothWays + + РольИсполнителя + + ru + Роль + + + CatalogRef.РолиИсполнителей + + + + + Catalog.РолиИсполнителей.EmptyRef + + Use + Use + + + ОсновнойОбъектАдресации + + ru + Основной объект адресации + + + Characteristic.ОбъектыАдресацииЗадач + + + + + Use + Use + + + ДополнительныйОбъектАдресации + + ru + Дополнительный объект адресации + + + Characteristic.ОбъектыАдресацииЗадач + + + + + Use + Use + + diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..d1c2189c7 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,35 @@ + + + + + false + ПометкаУдаления + Equal + false + + + false + Ссылка + NotInList + Справочник.ГруппыПользователей.ВсеПользователи + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + Предопределенный + Desc + + + Наименование + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..3040096ce --- /dev/null +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form @@ -0,0 +1,298 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + CopyToClipboard + Delete + OutputList + + Наименование + 4 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Комментарий + 6 + true + true + + + Список.Комментарий + + + КомментарийРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 9 + + СписокСтрокаПоискаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 10 + true + + Список + + true + + + + СписокСостояниеПросмотра + 12 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 13 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 15 + + СписокУправлениеПоискомРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 16 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + Tree + true + true + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + + Список.НомерКартинки + + + CommonPicture.ПиктограммыПользователя + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
+ + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + ВЫБРАТЬ + СправочникГруппыПользователей.Ссылка, + СправочникГруппыПользователей.ПометкаУдаления, + СправочникГруппыПользователей.Предопределенный, + СправочникГруппыПользователей.Родитель, + СправочникГруппыПользователей.Наименование, + СправочникГруппыПользователей.Комментарий, + ВЫБОР + КОГДА СправочникГруппыПользователей.ПометкаУдаления + ТОГДА 2 + ИНАЧЕ 3 + КОНЕЦ КАК НомерКартинки +ИЗ + Справочник.ГруппыПользователей КАК СправочникГруппыПользователей + Catalog.ГруппыПользователей + true + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..edca681a7 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,22 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.РежимВыбора Тогда + + Элементы.Список.РежимВыбора = Истина; + // Отбор не помеченных на удаление + Список.Отбор.Элементы[0].Использование = Истина; + Список.Отбор.Элементы[1].Использование = Параметры.Свойство("ВыборРодителя"); + + Если Параметры.ЗакрыватьПриВыборе = Ложь Тогда + // Режим подбора + Заголовок = НСтр("ru = 'Подбор групп пользователей'"); + Элементы.Список.МножественныйВыбор = Истина; + Элементы.Список.РежимВыделения = РежимВыделенияТаблицы.Множественный; + Иначе + Заголовок = НСтр("ru = 'Выбор группы пользователей'"); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..5cf354bda --- /dev/null +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,763 @@ + + + + Наименование + 4 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + Left + + 40 + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Родитель + 40 + true + true + + true + + + Объект.Parent + + + РодительРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + РодительКонтекстноеМеню + 41 + true + + InputField + Enter + true + Left + true + + + StartChoice + РодительНачалоВыбора + + true + true + true + true + true + true + Normal + + + + ПользователиГруппы + 9 + + Состав + 10 + + System.DefaultGUIFont + + true + true + + true + + + Объект.Состав + + false + Top + Copy + + Пользователь + 15 + true + true + + true + + + Объект.Состав.Пользователь + + + ПользовательРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + ПользовательКонтекстноеМеню + 16 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + СоставКоманднаяПанель + 12 + + СоставПодобрать + 31 + true + true + + true + + false + + СоставПодобратьРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + Form.Command.ПодобратьПользователей + Normal + Auto + true + true + UserCmds + Auto + + + СоставДобавить + 32 + true + true + + true + + false + + СоставДобавитьРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + СоставСкопировать + 49 + true + true + + true + + false + + СоставСкопироватьРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + СоставУдалить + 33 + true + true + + true + + false + + СоставУдалитьРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + СоставПереместитьВверх + 43 + true + true + + true + + false + + СоставПереместитьВверхРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + СоставПереместитьВниз + 44 + true + true + + true + + false + + СоставПереместитьВнизРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + СоставСортироватьПоВозрастанию + 34 + true + true + + true + + false + + СоставСортироватьПоВозрастаниюРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СоставСортироватьПоУбыванию + 35 + true + true + + true + + false + + СоставСортироватьПоУбываниюРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + Left + + + ChoiceProcessing + СоставОбработкаВыбора + + + СоставСтрокаПоиска + 69 + + СоставСтрокаПоискаРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + СоставСтрокаПоискаКонтекстноеМеню + 70 + true + + Состав + + true + + + + СоставСостояниеПросмотра + 72 + + СоставСостояниеПросмотраРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + СоставСостояниеПросмотраКонтекстноеМеню + 73 + true + + ViewStatusAddition + Состав + + true + + + + СоставУправлениеПоиском + 75 + + СоставУправлениеПоискомРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + + СоставУправлениеПоискомКонтекстноеМеню + 76 + true + + SearchControlAddition + Состав + + true + + + + СоставРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + СоставКонтекстноеМеню + 11 + + КонтекстноеМенюСоставПодобратьПользователей + 42 + true + true + + true + + false + + КонтекстноеМенюСоставПодобратьПользователейРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + Form.Command.ПодобратьПользователей + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСоставДобавить + 45 + true + true + + true + + false + + КонтекстноеМенюСоставДобавитьРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСоставСкопировать + 50 + true + true + + true + + false + + КонтекстноеМенюСоставСкопироватьРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСоставУдалить + 46 + true + true + + true + + false + + КонтекстноеМенюСоставУдалитьРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + Form.Item.Состав.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + true + true + 30 + true + true + 12 + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + true + true + + Style.BorderColor + + None + None + None + true + + + true + true + + true + + + <key>ru</key> + <value>Пользователи группы</value> + + + ru + Пользователи группы + + + ПользователиГруппыРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + Комментарий + 38 + true + true + + true + + + Объект.Комментарий + + + КомментарийРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 39 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + Top + true + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ГруппыПользователей + + + true + + + true + +
true
+ true +
+ + ПодобратьПользователей + + <key>ru</key> + <value>Подобрать</value> + + 1 + + ru + Подбор пользователей + + + true + + + + ПодобратьПользователей + + + true + Auto + Auto + + + + + + + + AfterWrite + ПослеЗаписи + + + AfterWriteAtServer + ПослеЗаписиНаСервере + + + BeforeWrite + ПередЗаписью + + +
diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Help/ru.html new file mode 100644 index 000000000..7400edf1d --- /dev/null +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Help/ru.html @@ -0,0 +1,5 @@ + +

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

+

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

+

Подробнее см. справка по группам пользователей.

+

 

\ No newline at end of file diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..3c07ef248 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,140 @@ + +////////////////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Объект.Ссылка = Справочники.ГруппыПользователей.ПустаяСсылка() И + Объект.Родитель.Ссылка = Справочники.ГруппыПользователей.ВсеПользователи Тогда + + Объект.Родитель = Справочники.ГруппыПользователей.ПустаяСсылка(); + + КонецЕсли; + + Если Объект.Ссылка = Справочники.ГруппыПользователей.ВсеПользователи Тогда + Элементы.Наименование.Доступность = Ложь; + Элементы.Родитель.Доступность = Ложь; + Элементы.СоставПодобрать.Доступность = Ложь; + Элементы.Состав.Доступность = Ложь; + Элементы.Комментарий.Доступность = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) + + ОбработкаПроверкиЗаполнения(Отказ); + +КонецПроцедуры + +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + + Если ТекущийОбъект.ДополнительныеСвойства.Свойство("ЕстьОшибки") Тогда + ПараметрыЗаписи.Вставить("ЕстьОшибки"); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + Оповестить("ИзмененСоставГруппыПользователей", Объект.Ссылка, ЭтаФорма); + + Если ПараметрыЗаписи.Свойство("ЕстьОшибки") Тогда + Предупреждение(НСтр("ru = 'При записи возникли ошибки (см. журнал регистрации)'")); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий команд и элементов формы +// + +&НаКлиенте +Процедура РодительНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ВыборРодителя"); + + ОткрытьФорму("Справочник.ГруппыПользователей.ФормаВыбора", ПараметрыФормы, Элементы.Родитель); + +КонецПроцедуры + +&НаКлиенте +Процедура ПодобратьПользователей(Команда) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Ложь); + + ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элементы.Состав); + +КонецПроцедуры + +&НаКлиенте +Процедура СоставОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда + Для каждого Значение Из ВыбранноеЗначение Цикл + ОбработкаВыбораПользователя(Значение); + КонецЦикла; + Иначе + ОбработкаВыбораПользователя(ВыбранноеЗначение); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции формы +// + +&НаКлиенте +Процедура ОбработкаВыбораПользователя(ВыбранноеЗначение) + + Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Пользователи") Тогда + Если Объект.Состав.НайтиСтроки(Новый Структура("Пользователь", ВыбранноеЗначение)).Количество() = 0 Тогда + Объект.Состав.Добавить().Пользователь = ВыбранноеЗначение; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаПроверкиЗаполнения(Отказ) + + // Проверка незаполненных и повторяющихся пользователей. + НомерСтроки = Объект.Состав.Количество()-1; + + Пока НЕ Отказ И НомерСтроки >= 0 Цикл + ТекущаяСтрока = Объект.Состав.Получить(НомерСтроки); + + // Проверка заполнения значения. + Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.Пользователь) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не заполнен пользователь!'"), + , + "Объект.Состав[" + Формат(НомерСтроки, "ЧГ=0") + "].Пользователь", + , + Отказ); + Возврат; + КонецЕсли; + + // Проверка наличия повторяющихся значений. + НайденныеЗначения = Объект.Состав.НайтиСтроки(Новый Структура("Пользователь", ТекущаяСтрока.Пользователь)); + Если НайденныеЗначения.Количество() > 1 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Пользователь повторяется!'"), + , + "Объект.Состав[" + Формат(НомерСтроки, "ЧГ=0") + "].Пользователь", + , + Отказ); + Возврат; + КонецЕсли; + + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ГруппыПользователей/Help/ru.html b/SSL/src/Catalogs/ГруппыПользователей/Help/ru.html new file mode 100644 index 000000000..8bd88154b --- /dev/null +++ b/SSL/src/Catalogs/ГруппыПользователей/Help/ru.html @@ -0,0 +1,52 @@ + +

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

+

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

+

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

+
  • +
    Предприятие
    +
    • +
      Администрация
      +
      • +
        Отдел 1
        +
      • +
        Отдел 2
    • +
      Руководители Администрации
      +
    • +
      Инженерно-технические службы
      +
      • +
        Отдел 1
        +
      • +
        Отдел 2
        +
        • +
          Группа 1
          +
        • +
          Группа 2
      • +
        Руководители инженерно-технических служб
    • +
      Производство
      +
      • +
        Цех 1
        +
        • +
          Участок 1
          +
        • +
          Участок 2
      • +
        Цех 2
        +
        • +
          Участок 1
          +
        • +
          Участок 2
          +
        • +
          Участок 3
      • +
        Руководители производства
    • +
      Руководители предприятия
      +
    • +
      Группа общей инвентаризации

 

+

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

+

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

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

 

+

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

+

 

\ 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..e69de29bb diff --git a/SSL/src/Catalogs/ГруппыПользователей/ObjectModule.bsl b/SSL/src/Catalogs/ГруппыПользователей/ObjectModule.bsl new file mode 100644 index 000000000..a9a341720 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыПользователей/ObjectModule.bsl @@ -0,0 +1,58 @@ + +Перем СтарыйРодитель; + +// Обработчик ПередЗаписью блокирует недопустимые действия с предопределенной +// группой "Все пользователи". +// +Процедура ПередЗаписью(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если Ссылка = Справочники.ГруппыПользователей.ВсеПользователи Тогда + Если НЕ Родитель.Пустая() Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Предопределенная группа ""Все пользователи"" может быть только в корне!'"), , , , Отказ); + Возврат; + КонецЕсли; + Если Состав.Количество() > 0 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Добавление пользователей в группу ""Все пользователи"" не поддерживается.'"), , , , Отказ); + Возврат; + КонецЕсли; + Иначе + Если Родитель = Справочники.ГруппыПользователей.ВсеПользователи Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Предопределенная группа ""Все пользователи"" не может быть родителем!'"), , , , Отказ); + Возврат; + КонецЕсли; + + СтарыйРодитель = ?(Ссылка.Пустая(), Неопределено, ОбщегоНазначения.ПолучитьЗначениеРеквизита(Ссылка, "Родитель")); + КонецЕсли; + +КонецПроцедуры + +// Обработчик ПриЗаписи вызывает обновление состава групп пользователей. +// +Процедура ПриЗаписи(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Пользователи.ОбновитьСоставГруппПользователей(Ссылка); + + Если ЗначениеЗаполнено(СтарыйРодитель) И СтарыйРодитель <> Родитель Тогда + Пользователи.ОбновитьСоставГруппПользователей(СтарыйРодитель); + КонецЕсли; + +КонецПроцедуры + +// Обработчик ОбработкаПроверкиЗаполнения блокирует интерактивный выбор группы "Все пользователи" в качестве родителя. +// +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + + Если Родитель = Справочники.ГруппыПользователей.ВсеПользователи Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Предопределенная группа ""Все пользователи"" не может быть родителем!'"), , "Объект.Родитель", , Отказ); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/ГруппыПользователей/ГруппыПользователей.mdo b/SSL/src/Catalogs/ГруппыПользователей/ГруппыПользователей.mdo new file mode 100644 index 000000000..a1463d3c5 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыПользователей/ГруппыПользователей.mdo @@ -0,0 +1,235 @@ + + + + + + + + + + ГруппыПользователей + + ru + Группы пользователей + + true + Catalog.ГруппыПользователей.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + + ru + Входит в группу + + + ru + Вышестоящая группа в иерархии + + true + + Catalog.ГруппыПользователей.EmptyRef + + Use + + + + + Use + Description + + ru + Название группы + + + ShowError + Use + + + + + Use + Code + + ru + Код, идентифицирующий группу + + + + + Use + + + + Use + + + ru + + + Use + + ru + Группа пользователей + + + ru + Группы пользователей, имеющих одинаковый доступ к данным системы + + true + HierarchyOfItems + 2 + true + 150 + String + Variable + AsDescription + + + ВсеПользователи + Все пользователи + + 000000001 + + + + InDialog + BothWays + Catalog.ГруппыПользователей.Form.ФормаЭлемента + Catalog.ГруппыПользователей.Form.ФормаСписка + Catalog.ГруппыПользователей.Form.ФормаСписка + + Комментарий + + ru + Комментарий + + + String + + + + + + Use + Use + + + + + + + Состав + + ru + Пользователи + + + ru + Пользователи, входящие в группу + + + Use + LineNumber + + Use + + + + + Пользователь + + ru + Пользователь + + + CatalogRef.Пользователи + + + ru + Пользователь, включенный в группу + + + + ShowError + DontUse + Use + Use + Use + + ForFolderAndItem + + + ФормаЭлемента + + ru + Форма элемента + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form new file mode 100644 index 000000000..8a61aaa8d --- /dev/null +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form @@ -0,0 +1,715 @@ + + + + ГруппаПользователи + 12 + + ПользователиКороткогоСписка + 13 + + <key>ru</key> + <value>Команда есть в быстром доступе у пользователей</value> + + true + true + + true + + + ПользователиКороткогоСписка + + false + Top + Add + Change + Copy + Delete + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + ПользователиКороткогоСпискаПользователь + 16 + true + true + + true + + + ПользователиКороткогоСписка.Пользователь + + + ПользователиКороткогоСпискаПользовательРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ПользователиКороткогоСпискаПользовательКонтекстноеМеню + 17 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПользователиКороткогоСпискаКоманднаяПанель + 15 + + ПользователиКороткогоСпискаНайти + 18 + true + true + + true + + false + + ПользователиКороткогоСпискаНайтиРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Form.Item.ПользователиКороткогоСписка.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ПользователиКороткогоСпискаОтменитьПоиск + 19 + true + true + + true + + false + + ПользователиКороткогоСпискаОтменитьПоискРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + Form.Item.ПользователиКороткогоСписка.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + Left + + + DragCheck + ПользователиКороткогоСпискаПроверкаПеретаскивания + + + Drag + ПользователиКороткогоСпискаПеретаскивание + + + ПользователиКороткогоСпискаСтрокаПоиска + 26 + + ПользователиКороткогоСпискаСтрокаПоискаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ПользователиКороткогоСпискаСтрокаПоискаКонтекстноеМеню + 27 + true + + ПользователиКороткогоСписка + + true + + + + ПользователиКороткогоСпискаСостояниеПросмотра + 29 + + ПользователиКороткогоСпискаСостояниеПросмотраРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + ПользователиКороткогоСпискаСостояниеПросмотраКонтекстноеМеню + 30 + true + + ViewStatusAddition + ПользователиКороткогоСписка + + true + + + + ПользователиКороткогоСпискаУправлениеПоиском + 32 + + ПользователиКороткогоСпискаУправлениеПоискомРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ПользователиКороткогоСпискаУправлениеПоискомКонтекстноеМеню + 33 + true + + SearchControlAddition + ПользователиКороткогоСписка + + true + + + + ПользователиКороткогоСпискаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ПользователиКороткогоСпискаКонтекстноеМеню + 14 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + + + + ВсеПользователи + 1 + + <key>ru</key> + <value>Команды нет в быстром доступе у пользователей</value> + + true + true + + true + + + ВсеПользователи + + false + Top + Add + Change + Copy + Delete + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + ПользователиСсылка + 4 + true + true + + true + + + ВсеПользователи.Пользователь + + + ПользователиСсылкаРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + ПользователиСсылкаКонтекстноеМеню + 5 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ВсеПользователиКоманднаяПанель + 3 + + ПользователиНайти + 8 + true + true + + true + + false + + ПользователиНайтиРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + Form.Item.ВсеПользователи.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ПользователиОтменитьПоиск + 9 + true + true + + true + + false + + ПользователиОтменитьПоискРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.Item.ВсеПользователи.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + Left + + + DragCheck + ВсеПользователиПроверкаПеретаскивания + + + Drag + ВсеПользователиПеретаскивание + + + ВсеПользователиСтрокаПоиска + 48 + + ВсеПользователиСтрокаПоискаРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ВсеПользователиСтрокаПоискаКонтекстноеМеню + 49 + true + + ВсеПользователи + + true + + + + ВсеПользователиСостояниеПросмотра + 51 + + ВсеПользователиСостояниеПросмотраРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ВсеПользователиСостояниеПросмотраКонтекстноеМеню + 52 + true + + ViewStatusAddition + ВсеПользователи + + true + + + + ВсеПользователиУправлениеПоиском + 54 + + ВсеПользователиУправлениеПоискомРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + ВсеПользователиУправлениеПоискомКонтекстноеМеню + 55 + true + + SearchControlAddition + ВсеПользователи + + true + + + + ВсеПользователиРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ВсеПользователиКонтекстноеМеню + 2 + true + + 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 + Группа пользователи + + + ГруппаПользователиРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ОК + 10 + true + true + + true + + true + false + + ОКРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 11 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + 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> + + 2 + + CatalogRef.Пользователи + + + true + + + true + + + + + ПользователиКороткогоСписка + + <key>ru</key> + <value>Пользователи короткого списка</value> + + 2 + + ValueTable + + + true + + + true + + + Пользователь + + <key>ru</key> + <value>Пользователь</value> + + 1 + + CatalogRef.Пользователи + + + true + + + true + + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + ПользователиСБыстрымДоступом + + ValueList + + + + ПредставлениеКоманды + + String + + + + + + + + diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Module.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Module.bsl new file mode 100644 index 000000000..023882d86 --- /dev/null +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Module.bsl @@ -0,0 +1,101 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Заголовок = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Быстрый доступ к команде ""%1""'"), + Параметры.ПредставлениеКоманды); + + Для Каждого ПользовательСтрока Из Параметры.ПользователиСБыстрымДоступом Цикл + НоваяСтрока = ПользователиКороткогоСписка.Добавить(); + НоваяСтрока.Пользователь = ПользовательСтрока.Значение; + КонецЦикла; + + ЗаполнитьТаблицуПользователейСКороткимСписком(); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьТаблицуПользователейСКороткимСписком() + + МассивПользователей = ПользователиКороткогоСписка.Выгрузить().ВыгрузитьКолонку("Пользователь"); + + ТекстЗапроса = "ВЫБРАТЬ + | Истина КАК Используется, + | Ссылка КАК Пользователь + |ИЗ + | Справочник.Пользователи + |ГДЕ + | НЕ ПометкаУдаления + | И НЕ Ссылка В (&МассивПользователей)"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.Параметры.Вставить("МассивПользователей", МассивПользователей); + ЗначениеВРеквизитФормы(Запрос.Выполнить().Выгрузить(), "ВсеПользователи"); + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + + Результат = Новый СписокЗначений; + + Для Каждого ЭлементКоллекции Из ПользователиКороткогоСписка Цикл + Результат.Добавить(ЭлементКоллекции.Пользователь); + КонецЦикла; + + Закрыть(Результат); + +КонецПроцедуры + +&НаКлиенте +Процедура ПользователиКороткогоСпискаПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + Если ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Число") Тогда + Возврат; + КонецЕсли; + + ПеренестиПользователей(ПользователиКороткогоСписка, ВсеПользователи, ПараметрыПеретаскивания.Значение); + +КонецПроцедуры + +&НаКлиенте +Процедура ПользователиКороткогоСпискаПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ВсеПользователиПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + + Если ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Число") Тогда + Возврат; + КонецЕсли; + + ПеренестиПользователей(ВсеПользователи, ПользователиКороткогоСписка, ПараметрыПеретаскивания.Значение); + +КонецПроцедуры + +&НаКлиенте +Процедура ВсеПользователиПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +// Блок служебных функций + +&НаКлиенте +Процедура ПеренестиПользователей(Приемник, Источник, МассивПеретаскиваемыхЭлементов) + + Для Каждого ПеретаскиваемыйЭлемент Из МассивПеретаскиваемыхЭлементов Цикл + НовыйПользователь = Приемник.Добавить(); + НовыйПользователь.Пользователь = ПеретаскиваемыйЭлемент.Пользователь; + Источник.Удалить(ПеретаскиваемыйЭлемент); + КонецЦикла; + + Приемник.Сортировать("Пользователь Возр"); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Form.form new file mode 100644 index 000000000..cc7a2057d --- /dev/null +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Form.form @@ -0,0 +1,475 @@ + + + + Разделы + 1 + true + true + + true + + + Разделы + + false + None + Add + Change + Copy + Delete + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + ru + Разделы, в которых будет располагаться команды обработки + + + ГруппаКолонок + 12 + + Используется + 6 + true + true + + true + + + Разделы.Используется + + None + + ИспользуетсяРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ИспользуетсяКонтекстноеМеню + 7 + true + + CheckBoxField + Auto + true + Left + true + + + + Представление + 10 + true + true + + true + + + Разделы.Представление + + + ПредставлениеРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ПредставлениеКонтекстноеМеню + 11 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа колонок</value> + + + ru + Группа колонок + + + ГруппаКолонокРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + ColumnGroup + + auto + true + + + + РазделыКоманднаяПанель + 3 + Left + + + РазделыСтрокаПоиска + 16 + + РазделыСтрокаПоискаРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + РазделыСтрокаПоискаКонтекстноеМеню + 17 + true + + Разделы + + true + + + + РазделыСостояниеПросмотра + 19 + + РазделыСостояниеПросмотраРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + РазделыСостояниеПросмотраКонтекстноеМеню + 20 + true + + ViewStatusAddition + Разделы + + true + + + + РазделыУправлениеПоиском + 22 + + РазделыУправлениеПоискомРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + РазделыУправлениеПоискомКонтекстноеМеню + 23 + true + + SearchControlAddition + Разделы + + true + + + + РазделыРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + РазделыКонтекстноеМеню + 2 + true + + true + true + true + true + true + Row + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ОК + 8 + true + true + + true + + true + false + + ОКРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 9 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + 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 + + Boolean + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Представление</value> + + 3 + + String + + + + true + + + true + + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + ВыделитьВсе + + <key>ru</key> + <value>Выделить все</value> + + 2 + + ru + Выделить все + + + true + + + StdPicture.CheckAll + + Auto + Auto + + + СнятьВыделениеСоВсех + + <key>ru</key> + <value>Снять выделение со всех</value> + + 3 + + ru + Снять выделение со всех + + + true + + Auto + Auto + + + Разделы + + ValueList + + + + ВидОбработки + + EnumRef.ВидыДополнительныхОтчетовИОбработок + + + + + + + diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Module.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Module.bsl new file mode 100644 index 000000000..44b8e1519 --- /dev/null +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Module.bsl @@ -0,0 +1,49 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗаполнитьТаблицуДоступныхРазделов(Параметры.ВидОбработки); + + Для Каждого РазделЭлемент Из Параметры.Разделы Цикл + ИмяРаздела = РазделЭлемент.Значение; + НайденнаяСтрока = Разделы.НайтиСтроки(Новый Структура("ИмяРаздела", ИмяРаздела)); + Если НайденнаяСтрока.Количество() = 1 Тогда + НайденнаяСтрока[0].Используется = Истина; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьТаблицуДоступныхРазделов(ВидОбработки) + + Если ВидОбработки = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда + ТаблицаКоманд = ДополнительныеОтчетыИОбработкиПереопределяемый.ПолучитьОбщиеКомандыДополнительныхОбработок(); + Иначе + ТаблицаКоманд = ДополнительныеОтчетыИОбработкиПереопределяемый.ПолучитьОбщиеКомандыДополнительныхОтчетов(); + КонецЕсли; + + Для Каждого ОписаниеКоманды Из ТаблицаКоманд Цикл + НоваяСтрока = Разделы.Добавить(); + НоваяСтрока.ИмяРаздела = ОписаниеКоманды.ИмяКоманды; + НоваяСтрока.Представление = ОписаниеКоманды.ИмяРабочегоМеста; + КонецЦикла; + + Разделы.Сортировать("Представление Возр"); + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + + Результат = Новый СписокЗначений; + + Для Каждого РазделЭлемент Из Разделы Цикл + Если РазделЭлемент.Используется Тогда + Результат.Добавить(РазделЭлемент.ИмяРаздела); + КонецЕсли; + КонецЦикла; + + Закрыть(Результат); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..7f258d66e --- /dev/null +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form @@ -0,0 +1,419 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 4 + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Вид + 13 + true + true + + true + + + Список.Вид + + + ВидРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ВидКонтекстноеМеню + 14 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Публикация + 11 + true + true + + true + + + Список.Публикация + + + ПубликацияРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ПубликацияКонтекстноеМеню + 12 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Версия + 9 + true + true + + true + + + Список.Версия + + + ВерсияРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ВерсияКонтекстноеМеню + 10 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Ответственный + 7 + true + true + + true + + + Список.Ответственный + + + ОтветственныйРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ОтветственныйКонтекстноеМеню + 8 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 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 + + + + СписокРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + Tree + true + true + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandAllLevels + true + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
+ + ФормаКоманднаяПанель + -1 + + СписокВыполнитьОбработку + 6 + true + true + + true + + false + + СписокВыполнитьОбработкуРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + ВЫБРАТЬ + ДополнительныеОтчетыИОбработки.Ссылка, + ДополнительныеОтчетыИОбработки.ПометкаУдаления, + ДополнительныеОтчетыИОбработки.Наименование, + ДополнительныеОтчетыИОбработки.Версия, + ДополнительныеОтчетыИОбработки.Ответственный, + ДополнительныеОтчетыИОбработки.Публикация, + ДополнительныеОтчетыИОбработки.Вид, + ВЫБОР + КОГДА ДополнительныеОтчетыИОбработки.ЭтоГруппа + ТОГДА 0 + КОГДА ДополнительныеОтчетыИОбработки.Публикация = Значение(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется) + ТОГДА 2 + КОГДА ДополнительныеОтчетыИОбработки.Публикация = Значение(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.НеИспользуется) + ТОГДА 1 + КОГДА ДополнительныеОтчетыИОбработки.Публикация = Значение(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.РежимОтладки) + ТОГДА 3 + КОНЕЦ КАК ИндексКартинкиСтатусаПубликации + +ИЗ + Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки + Catalog.ДополнительныеОтчетыИОбработки + true + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..58acd31a7 --- /dev/null +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,1921 @@ + + + + Группа + 45 + + <key>ru</key> + <value>Группа</value> + + true + true + + true + + + Объект.Parent + + + ГруппаРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + ГруппаКонтекстноеМеню + 46 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Наименование + 1 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 2 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаПубликацияОтветственный + 60 + + Публикация + 43 + true + true + + true + + + Объект.Публикация + + + ПубликацияРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + ПубликацияКонтекстноеМеню + 44 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Ответственный + 31 + true + true + + true + + + Объект.Ответственный + + + ОтветственныйРасширеннаяПодсказка + 87 + 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 + Группа публикация ответственный + + + ГруппаПубликацияОтветственныйРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + СтраницыРазделыНазначение + 61 + + СтраницаНазначение + 62 + + УказатьНазначениеОбработки + 14 + true + true + + true + + false + + УказатьНазначениеОбработкиРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + Hyperlink + Form.Command.УказатьНазначениеОбработки + Normal + Auto + true + true + UserCmds + Auto + + + ИспользоватьДляФормыСписка + 71 + true + true + + true + + + Объект.ИспользоватьДляФормыСписка + + Right + + ИспользоватьДляФормыСпискаРасширеннаяПодсказка + 92 + Label + true + true + + Left + + + + ИспользоватьДляФормыСпискаКонтекстноеМеню + 72 + true + + CheckBoxField + Enter + true + Left + true + + + + ИспользоватьДляФормыОбъекта + 69 + true + true + + true + + + Объект.ИспользоватьДляФормыОбъекта + + Right + + ИспользоватьДляФормыОбъектаРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + + ИспользоватьДляФормыОбъектаКонтекстноеМеню + 70 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Страница назначение</value> + + + ru + Страница назначение + + + СтраницаНазначениеРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + Page + + auto + + + + СтраницаРазделы + 63 + + УказатьРазделыКомандногоИнтерфейса + 64 + true + true + + true + + false + + УказатьРазделыКомандногоИнтерфейсаРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + Hyperlink + Form.Command.УказатьРазделыКомандногоИнтерфейса + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Страница разделы</value> + + + ru + Страница разделы + + + СтраницаРазделыРасширеннаяПодсказка + 96 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы разделы назначение</value> + + + ru + Страницы разделы назначение + + true + + СтраницыРазделыНазначениеРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + Pages + + Auto + + + + КомандыОбработки + 19 + + <key>ru</key> + <value>Поставляемые команды</value> + + true + true + + true + + + КомандыОбработки + + false + None + Add + CancelSearch + Change + Copy + CopyToClipboard + Delete + EndEdit + Find + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + + КомандыПредставление + 54 + true + true + + true + + + КомандыОбработки.Представление + + + КомандыПредставлениеРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + + КомандыПредставлениеКонтекстноеМеню + 55 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + БыстрыйДоступПредставление + 76 + true + true + + true + + + КомандыОбработки.БыстрыйДоступПредставление + + + БыстрыйДоступПредставлениеРасширеннаяПодсказка + 114 + Label + true + true + + Left + + + + БыстрыйДоступПредставлениеКонтекстноеМеню + 77 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + КомандыИспользование + 58 + true + true + + true + + + КомандыОбработки.Использование + + None + + КомандыИспользованиеРасширеннаяПодсказка + 116 + Label + true + true + + Left + + + + КомандыИспользованиеКонтекстноеМеню + 59 + true + + CheckBoxField + Auto + true + + StdPicture.SetTime + + Left + true + + + + КомандыРасписание + 56 + true + true + + true + + + КомандыОбработки.РасписаниеПредставление + + + КомандыРасписаниеРасширеннаяПодсказка + 118 + Label + true + true + + Left + + + + КомандыРасписаниеКонтекстноеМеню + 57 + true + + InputField + Auto + true + Left + true + + + StartChoice + КомандыРасписаниеНачалоВыбора + + true + true + true + true + true + true + Normal + + + + КомандыОбработкиКоманднаяПанель + 21 + + КомандыОбработкиНастроитьБыстрыйДоступККоманде + 68 + true + true + + true + + false + + КомандыОбработкиНастроитьБыстрыйДоступККомандеРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + Form.Command.НастроитьБыстрыйДоступККоманде + Normal + Auto + true + true + UserCmds + Auto + + + КомандыОбработкиНастроитьРасписаниеКоманды + 73 + true + true + + true + + + КомандыОбработкиНастроитьРасписаниеКомандыРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + Form.Command.НастроитьРасписаниеКоманды + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + BeforeRowChange + КомандыОбработкиПередНачаломИзменения + + + КомандыОбработкиСтрокаПоиска + 103 + + КомандыОбработкиСтрокаПоискаРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + КомандыОбработкиСтрокаПоискаКонтекстноеМеню + 104 + true + + КомандыОбработки + + true + + + + КомандыОбработкиСостояниеПросмотра + 106 + + КомандыОбработкиСостояниеПросмотраРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + + КомандыОбработкиСостояниеПросмотраКонтекстноеМеню + 107 + true + + ViewStatusAddition + КомандыОбработки + + true + + + + КомандыОбработкиУправлениеПоиском + 109 + + КомандыОбработкиУправлениеПоискомРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + + КомандыОбработкиУправлениеПоискомКонтекстноеМеню + 110 + true + + SearchControlAddition + КомандыОбработки + + true + + + + КомандыОбработкиРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + + КомандыОбработкиКонтекстноеМеню + 20 + + КомандыОбработкиНастроитьБыстрыйДоступККоманде1 + 74 + true + true + + true + + false + + КомандыОбработкиНастроитьБыстрыйДоступККоманде1РасширеннаяПодсказка + 98 + Label + true + true + + Left + + + Form.Command.НастроитьБыстрыйДоступККоманде + Normal + Auto + true + true + UserCmds + Auto + + + КомандыОбработкиНастроитьРасписаниеКоманды1 + 75 + true + true + + true + + + КомандыОбработкиНастроитьРасписаниеКоманды1РасширеннаяПодсказка + 99 + Label + true + true + + Left + + + Form.Command.НастроитьРасписаниеКоманды + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + 5 + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + +
+ + СведенияОбОбработке + 6 + + Вид + 12 + true + true + + true + + + Объект.Вид + + + ВидРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + + ВидКонтекстноеМеню + 13 + true + + LabelField + Enter + true + Left + true + + 50 + true + true + + System.DefaultGUIFont + true + false + false + false + + + + + ИмяФайла + 4 + + <key>ru</key> + <value>Имя файла</value> + + true + true + + true + + + Объект.ИмяФайла + + + ИмяФайлаРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + + ИмяФайлаКонтекстноеМеню + 5 + true + + LabelField + true + Enter + true + Left + true + + 50 + true + true + + System.DefaultGUIFont + true + false + false + false + + + + + Версия + 7 + + <key>ru</key> + <value>Версия</value> + + true + true + + true + + + Объект.Версия + + + ВерсияРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + + ВерсияКонтекстноеМеню + 8 + true + + LabelField + Enter + true + Left + true + + 10 + true + true + + System.DefaultGUIFont + true + false + false + false + + + + + Информация + 26 + + <key>ru</key> + <value>Краткая информация</value> + + true + true + + true + + + Объект.Информация + + + ИнформацияРасширеннаяПодсказка + 135 + Label + true + true + + Left + + + + ИнформацияКонтекстноеМеню + 27 + true + + InputField + true + Enter + true + Left + true + + true + 3 + true + true + true + true + true + true + Normal + + + + ГруппаДополнительнаяИнформация + 33 + + ГруппаБезТекста + 40 + + ПустаяДекорация + 41 + true + true + + true + + + ПустаяДекорацияРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + + ПустаяДекорацияКонтекстноеМеню + 42 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа без текста</value> + + + ru + Группа без текста + + + ГруппаБезТекстаРасширеннаяПодсказка + 138 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ГруппаПредупреждение + 34 + + ПредупреждениеОНебезопасномРежиме + 36 + + <key>ru</key> + <value>Внимание! Обработка требует разрешить использование в небезопасном режиме. +Более подробно о небезопасном режиме см. информацию в справке к форме.</value> + + true + true + + true + + + ПредупреждениеОНебезопасномРежимеРасширеннаяПодсказка + 141 + Label + true + true + + Left + + + + ПредупреждениеОНебезопасномРежимеКонтекстноеМеню + 37 + true + + Label + true + true + false + + 255 + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа предупреждение</value> + + + ru + Группа предупреждение + + + ГруппаПредупреждениеРасширеннаяПодсказка + 140 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ГруппаИнформация + 35 + + ИнформацияОБезопасномРежиме + 38 + + <key>ru</key> + <value>Обработка используется в безопасном режиме</value> + + true + true + + true + + + ИнформацияОБезопасномРежимеРасширеннаяПодсказка + 143 + Label + true + true + + Left + + + + ИнформацияОБезопасномРежимеКонтекстноеМеню + 39 + true + + Label + true + true + false + + 64 + 125 + 30 + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа информация</value> + + + ru + Группа информация + + + ГруппаИнформацияРасширеннаяПодсказка + 142 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Группа дополнительная информация</value> + + + ru + Группа дополнительная информация + + true + + ГруппаДополнительнаяИнформацияРасширеннаяПодсказка + 137 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Дополнительно</value> + + + ru + Сведения об обработке + + + СведенияОбОбработкеРасширеннаяПодсказка + 128 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + StrongSeparation + true + true + auto + Auto + Auto + + + + Комментарий + 29 + + <key>ru</key> + <value>Комментарий</value> + + true + true + + true + + + Объект.Комментарий + + + КомментарийРасширеннаяПодсказка + 144 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 30 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + + ЗагрузитьФайлОбработкиОтчета + 10 + true + true + + true + + false + + ЗагрузитьФайлОбработкиОтчетаРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + Form.Command.ЗагрузитьФайлОбработкиОтчета + Normal + PictureAndText + true + true + UserCmds + Auto + + + СохранитьФайлОбработкиОтчета + 11 + true + true + + true + + false + + СохранитьФайлОбработкиОтчетаРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + Form.Command.ВыгрузитьФайлОбработкиОтчета + Normal + PictureAndText + true + true + UserCmds + Auto + + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + + FillCheckProcessingAtServer + ОбработкаПроверкиЗаполненияНаСервере + + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ДополнительныеОтчетыИОбработки + + + true + + + true + +
true
+ true +
+ + ПолноеНазначение + + <key>ru</key> + <value>Полное назначение</value> + + 2 + + 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 + + String + + + + true + + + true + + + + + ДвоичныеДанныеОбработки + + <key>ru</key> + <value>Двоичные данные обработки</value> + + 4 + + + true + + + true + + + + РегистрацияОбработки + + <key>ru</key> + <value>Регистрация обработки</value> + + 5 + + Boolean + + + true + + + true + + + + ЭтоНовыйОбъект + + <key>ru</key> + <value>Это новый объект</value> + + 6 + + Boolean + + + true + + + true + + + + КомандыОбработки + + <key>ru</key> + <value>Команды обработки</value> + + 9 + + 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 + + Boolean + + + 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> + + 6 + + ValueList + + + true + + + true + + + + БыстрыйСписокДоступа + + <key>ru</key> + <value>Быстрый список доступа</value> + + 7 + + ValueList + + + true + + + true + + + + БыстрыйДоступПредставление + + <key>ru</key> + <value>Быстрый доступ</value> + + 8 + + String + + + + true + + + true + + + + + ВидДополнительныйОтчет + + <key>ru</key> + <value>Вид дополнительный отчет</value> + + 3 + + EnumRef.ВидыДополнительныхОтчетовИОбработок + + + true + + + true + + + + ВидДополнительнаяОбработка + + <key>ru</key> + <value>Вид дополнительная обработка</value> + + 7 + + EnumRef.ВидыДополнительныхОтчетовИОбработок + + + true + + + true + + + + ЗагрузитьФайлОбработкиОтчета + + <key>ru</key> + <value>Загрузить файл</value> + + 1 + + ru + Загрузить файл обработки отчета + + + true + + + + ЗагрузитьФайлОбработкиОтчета + + + Picture + Auto + Auto + + + ВыгрузитьФайлОбработкиОтчета + + <key>ru</key> + <value>Выгрузить файл</value> + + 2 + + ru + Выгрузить файл обработки отчета + + + true + + + + ВыгрузитьФайлОбработкиОтчета + + + Picture + Auto + Auto + + + УказатьНазначениеОбработки + + <key>ru</key> + <value>Назначение обработки</value> + + 3 + + ru + Указать назначение обработки + + + true + + + + УказатьНазначениеОбработки + + + Auto + Auto + + + УказатьРазделыКомандногоИнтерфейса + + <key>ru</key> + <value>Указать разделы командного интерфейса</value> + + 5 + + ru + Указать разделы командного интерфейса, через которые будет доступна обработка + + + true + + + + УказатьРазделыКомандногоИнтерфейса + + + Auto + Auto + + + НастроитьБыстрыйДоступККоманде + + <key>ru</key> + <value>Быстрый доступ к команде</value> + + 6 + + ru + Настроить быстрый доступ к команде + + + true + + + + НастроитьБыстрыйДоступ + + + Auto + Auto + + + НастроитьРасписаниеКоманды + + <key>ru</key> + <value>Указать расписание команды</value> + + 4 + + ru + Настроить расписание команды + + + true + + + + НастроитьРасписаниеКоманды + + + Auto + Auto + + + + + + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + +
diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..b1cd60e2c --- /dev/null +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,784 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + РегистрацияОбработки = Ложь; + + Если Объект.Ссылка = Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка() Тогда + ЭтоНовыйОбъект = Истина; + Иначе + ЭтоНовыйОбъект = Ложь; + Если ДополнительныеОтчетыИОбработки.ПроверитьНазначаемаяОбработка(Объект.Вид) Тогда + ПолноеНазначениеЗначение = ДополнительныеОтчетыИОбработки.ПолучитьПолноеНазначениеПоВидуДополнительнойВнешнейОбработки(Объект.Вид); + ЗначениеВРеквизитФормы(ПолноеНазначениеЗначение, "ПолноеНазначение"); + КонецЕсли; + КонецЕсли; + + ЗаполнитьКоманды(); + + УстановитьЭлементыФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если ЭтоНовыйОбъект Тогда + + Если НЕ ОткрытьДиалогЗагрузкиФайлаОбработкиОтчета() Тогда + Отказ = Истина; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + Если РегистрацияОбработки Тогда + ТекущийОбъект.ХранилищеОбработки = Новый ХранилищеЗначения(ДвоичныеДанныеОбработки , Новый СжатиеДанных(9)); + РегистрацияОбработки = Ложь; + КонецЕсли; + + Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда + + ТекущийОбъект.ДополнительныеСвойства.Вставить("КомандыОбработки", РеквизитФормыВЗначение("КомандыОбработки")); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗагрузитьФайлОбработкиОтчета(Команда) + + ОткрытьДиалогЗагрузкиФайлаОбработкиОтчета(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыгрузитьФайлОбработкиОтчета(Команда) + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + + ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); + ДиалогСохраненияФайла.ПолноеИмяФайла = Объект.ИмяФайла; + ДиалогСохраненияФайла.Фильтр = "Внешние обработки|*.epf|Внешние отчеты|*.erf"; + ДиалогСохраненияФайла.МножественныйВыбор = Ложь; + ДиалогСохраненияФайла.Заголовок = НСтр("ru = 'Укажите файл'"); + + Если ДиалогСохраненияФайла.Выбрать() Тогда + + Адрес = ПоместитьФайлОбработкиВоВременноеХранилище(); + + Если Адрес = Неопределено Тогда + Предупреждение(НСтр("ru = 'Нет данных для обработки.'")); + Возврат; + КонецЕсли; + + ПолучаемыеФайлы = Новый Массив; + ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(, Адрес)); + + ПолученныеФайлы = Новый Массив; + + ПолучитьФайлы(ПолучаемыеФайлы, ПолученныеФайлы, ДиалогСохраненияФайла.ПолноеИмяФайла, Ложь); + КонецЕсли; + + Иначе + + Адрес = ПоместитьФайлОбработкиВоВременноеХранилище(); + + Если Адрес = Неопределено Тогда + Предупреждение(НСтр("ru = 'Нет данных для обработки.'")); + Возврат; + КонецЕсли; + + ПолучитьФайл(Адрес, Объект.ИмяФайла, Истина); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ВыборОбъектовМетаданных" Тогда + + Объект.Назначение.Очистить(); + + Для Каждого ЭлементПараметр Из Параметр Цикл + + // поиск переданного назначения в полном возможном назначении + НайденныеСтроки = ПолноеНазначение.НайтиСтроки(Новый Структура("ПолноеИмяОбъектаМетаданных", ЭлементПараметр.Значение)); + + Если НайденныеСтроки.Количество() > 0 Тогда + НовоеНазначение = Объект.Назначение.Добавить(); + НовоеНазначение.ПолноеИмяОбъектаМетаданных = ЭлементПараметр.Значение; + КонецЕсли; + + КонецЦикла; + + Модифицированность = Истина; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УказатьНазначениеОбработки(Команда) + + ФильтрПоОбъектамМетаданных = ПолучитьФильтрПоОбъектамМетаданных(Объект.Вид); + + ВыбранныеОбъектыМетаданных = Новый СписокЗначений; + + Для Каждого ЭлементНазначение ИЗ Объект.Назначение Цикл + ВыбранныеОбъектыМетаданных.Добавить(ЭлементНазначение.ПолноеИмяОбъектаМетаданных); + КонецЦикла; + + ПараметрыФормы = Новый Структура; + + ПараметрыФормы.Вставить("ФильтрПоОбъектамМетаданных", ФильтрПоОбъектамМетаданных); + ПараметрыФормы.Вставить("ВыбранныеОбъектыМетаданных", ВыбранныеОбъектыМетаданных); + + ОткрытьФорму("ОбщаяФорма.ВыборОбъектовМетаданных", ПараметрыФормы); + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьФильтрПоОбъектамМетаданных(ВидОбработки) + + ФильтрПоОбъектамМетаданных = Новый СписокЗначений; + + Если ВидОбработки = Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта Тогда + ОбщаяКоманда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта; + + ИначеЕсли ВидОбработки = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет Тогда + ОбщаяКоманда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиОтчеты; + + ИначеЕсли ВидОбработки = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма Тогда + ОбщаяКоманда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиПечатныеФормы; + + ИначеЕсли ВидОбработки = Перечисления.ВидыДополнительныхОтчетовИОбработок.СозданиеСвязанныхОбъектов Тогда + ОбщаяКоманда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов; + КонецЕсли; + + Для Каждого ТипПараметраКоманды Из ОбщаяКоманда.ТипПараметраКоманды.Типы() Цикл + ФильтрПоОбъектамМетаданных.Добавить(Метаданные.НайтиПоТипу(ТипПараметраКоманды).ПолноеИмя()); + КонецЦикла; + + Возврат ФильтрПоОбъектамМетаданных; + +КонецФункции + +&НаКлиенте +Процедура НастроитьРасписаниеКоманды(Команда) + + ТекущиеДанные = Элементы.КомандыОбработки.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТекущиеДанные.Разрешено Тогда + Отказ = Ложь; + УстановитьРасписание(ТекущиеДанные, Отказ); + Если НЕ Отказ Тогда + Модифицированность = Истина; + КонецЕсли; + Иначе + Предупреждение(НСтр("ru = 'Команда используется только на клиенте. + |Регламентное задание можно настраивать только для команд исполняемых в серверном контексте.'")); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура КомандыОбработкиПередНачаломИзменения(Элемент, Отказ) + + Если Элемент.ТекущийЭлемент = Элементы.КомандыОбработки.ПодчиненныеЭлементы.КомандыИспользование Тогда + + Если НЕ Элемент.ТекущиеДанные.Разрешено Тогда + + Отказ = Истина; + Предупреждение(НСтр("ru = 'Команда используется только на клиенте. + |Регламентное задание можно настраивать только для команд исполняемых в серверном контексте.'")); + ИначеЕсли Элемент.ТекущиеДанные.РасписаниеПредставление = стрРасписаниеНеЗадано()Тогда + + УстановитьРасписание(Элементы.КомандыОбработки.ТекущиеДанные, Отказ); + + КонецЕсли; + + ИначеЕсли Элемент.ТекущийЭлемент = Элементы.КомандыОбработки.ПодчиненныеЭлементы.КомандыРасписание Тогда + + Если НЕ Элемент.ТекущиеДанные.Разрешено Тогда + Отказ = Истина; + КонецЕсли; + + ИначеЕсли Элемент.ТекущийЭлемент = Элементы.КомандыОбработки.ПодчиненныеЭлементы.БыстрыйДоступПредставление Тогда + + НастроитьБыстрыйДоступОбщийОбработчик(Элемент.ТекущиеДанные); + Отказ = Истина; + + КонецЕсли + +КонецПроцедуры + +&НаКлиенте +Процедура КомандыРасписаниеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ТекущиеДанные = Элементы.КомандыОбработки.ТекущиеДанные; + + Если НЕ ТекущиеДанные.Разрешено Тогда + Возврат; + КонецЕсли; + + УстановитьРасписание(ТекущиеДанные); + +КонецПроцедуры + +&НаКлиенте +Процедура УказатьРазделыКомандногоИнтерфейса(Команда) + + Разделы = Новый СписокЗначений; + + Для Каждого РазделЭлемент Из Объект.Разделы Цикл + Разделы.Добавить(РазделЭлемент.ИмяРаздела); + КонецЦикла; + + Результат = ОткрытьФормуМодально("Справочник.ДополнительныеОтчетыИОбработки.Форма.ПодборРазделов", + Новый Структура("Разделы,ВидОбработки", Разделы, Объект.Вид)); + + Если ТипЗнч(Результат) = Тип("СписокЗначений") Тогда + Объект.Разделы.Очистить(); + Для Каждого РазделЗн Из Результат Цикл + НоваяСтрока = Объект.Разделы.Добавить(); + НоваяСтрока.ИмяРаздела = РазделЗн.Значение; + КонецЦикла; + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ + +&НаСервере +// Получает файл обработки из временного хранилища, пытается создать объект +// обработки (внешнего отчета) и получает информацию из объекта внешней обработки (отчета) +// +Функция ЗарегистрироватьОбработку(АдресВоВременномХранилище, + ИмяФайла, + РасширениеФайла) + + ДвоичныеДанныеОбработки = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище); + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(РасширениеФайла); + ДвоичныеДанныеОбработки.Записать(ИмяВременногоФайла); + + Попытка + Если ВРег(РасширениеФайла) = "EPF" Тогда + ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяВременногоФайла, Истина); + Иначе + ВнешняяОбработка = ВнешниеОтчеты.Создать(ИмяВременногоФайла, Истина); + КонецЕсли; + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат Ложь; + КонецПопытки; + + Попытка + РегистрационныеДанные = ВнешняяОбработка.СведенияОВнешнейОбработке(); + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Возможно, обработка (отчет) устарела или не является дополнительной:'") + + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат Ложь; + КонецПопытки; + + ОбъектЗначение = РеквизитФормыВЗначение("Объект"); + + Если Объект.ИмяФайла = ИмяФайла + И Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок[РегистрационныеДанные.Вид] Тогда + // если это перерегистрация той же обработи - не очищаем назначение + Иначе + ОбъектЗначение.Назначение.Очистить(); + КонецЕсли; + + // Инициализация сведений об обработке + ОбъектЗначение.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок[РегистрационныеДанные.Вид]; + ОбъектЗначение.Наименование = РегистрационныеДанные.Наименование; + ОбъектЗначение.Версия = РегистрационныеДанные.Версия; + ОбъектЗначение.БезопасныйРежим = РегистрационныеДанные.БезопасныйРежим; + ОбъектЗначение.Информация = РегистрационныеДанные.Информация; + + // Устанавливаем имя файла обработки + ОбъектЗначение.ИмяФайла = ИмяФайла; + + // Если новая обработка или не заполнено назначение - устанавливаем назначение из обработки + Если (Объект.Ссылка = Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка() + ИЛИ ОбъектЗначение.Назначение.Количество() = 0) + И (ОбъектЗначение.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта + ИЛИ ОбъектЗначение.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет + ИЛИ ОбъектЗначение.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма + ИЛИ ОбъектЗначение.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.СозданиеСвязанныхОбъектов) + ТОГДА + + ОбъектЗначение.ИспользоватьДляФормыОбъекта = Истина; + ОбъектЗначение.ИспользоватьДляФормыСписка = Истина; + + ПолноеНазначениеЗначение = ДополнительныеОтчетыИОбработки.ПолучитьПолноеНазначениеПоВидуДополнительнойВнешнейОбработки(ОбъектЗначение.Вид); + + Если РегистрационныеДанные.Свойство("Назначение") Тогда + + Для Каждого ЭлементЗаданноеНазначение Из РегистрационныеДанные.Назначение Цикл + + РазделеннаяСтрока = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ЭлементЗаданноеНазначение, "."); + + Если РазделеннаяСтрока[1] = "*" Тогда + + НайденныеНазначения = ПолноеНазначениеЗначение.НайтиСтроки(Новый Структура("Класс", РазделеннаяСтрока[0])); + + Для Каждого ЭлементНайденноеНазначение Из НайденныеНазначения Цикл + НоваяСтрока = ОбъектЗначение.Назначение.Добавить(); + НоваяСтрока.ПолноеИмяОбъектаМетаданных = ЭлементНайденноеНазначение.ПолноеИмяОбъектаМетаданных; + КонецЦикла; + + Иначе + + Если ПолноеНазначениеЗначение.НайтиСтроки(Новый Структура("ПолноеИмяОбъектаМетаданных", ЭлементЗаданноеНазначение)).Количество() > 0 Тогда + НоваяСтрока = ОбъектЗначение.Назначение.Добавить(); + НоваяСтрока.ПолноеИмяОбъектаМетаданных = ЭлементЗаданноеНазначение; + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + КонецЕсли; + + ОбъектЗначение.Назначение.Свернуть("ПолноеИмяОбъектаМетаданных", ""); + + ЗначениеВРеквизитФормы(ПолноеНазначениеЗначение, "ПолноеНазначение"); + + КонецЕсли; + + КомандыСохраненные = ОбъектЗначение.Команды.Выгрузить(); + + ОбъектЗначение.Команды.Очистить(); + + // Инициализация команд + + Для Каждого ЭлементОписаниеКоманды Из РегистрационныеДанные.Команды Цикл + + НоваяСтрока = ОбъектЗначение.Команды.Добавить(); + НоваяСтрока.Идентификатор = ЭлементОписаниеКоманды.Идентификатор; + НоваяСтрока.Представление = ЭлементОписаниеКоманды.Представление; + НоваяСтрока.Модификатор = ЭлементОписаниеКоманды.Модификатор; + НоваяСтрока.ПоказыватьОповещение = ЭлементОписаниеКоманды.ПоказыватьОповещение; + + Если ЭлементОписаниеКоманды.Использование = "ОткрытиеФормы" Тогда + НоваяСтрока.ВариантЗапуска = Перечисления.СпособыВызоваДополнительныхОбработок.ОткрытиеФормы; + ИначеЕсли ЭлементОписаниеКоманды.Использование = "ВызовКлиентскогоМетода" Тогда + НоваяСтрока.ВариантЗапуска = Перечисления.СпособыВызоваДополнительныхОбработок.ВызовКлиентскогоМетода; + ИначеЕсли ЭлементОписаниеКоманды.Использование = "ВызовСерверногоМетода" Тогда + НоваяСтрока.ВариантЗапуска = Перечисления.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода; + Иначе + ТекстСообщения = НСтр("ru = 'Для команды %1 не определен способ запуска.'"); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ЭлементОписаниеКоманды.Представление); + ВызватьИсключение ТекстСообщения; + КонецЕсли; + + КонецЦикла; + + ОбъектЗначение.Ответственный = ОбщегоНазначения.ТекущийПользователь(); + + ЗначениеВРеквизитФормы(ОбъектЗначение, "Объект"); + + УстановитьЭлементыФормы(Истина); + + ЗаполнитьКоманды(КомандыСохраненные); + + Возврат Истина; + +КонецФункции + +&НаСервере +Процедура ЗаполнитьКоманды(КомандыСохраненные = Неопределено) + + КомандыОбработки.Очистить(); + + Для Каждого ЭлементКоманда Из Объект.Команды Цикл + + НоваяКоманда = КомандыОбработки.Добавить(); + + НоваяКоманда.Представление = ЭлементКоманда.Представление; + НоваяКоманда.Идентификатор = ЭлементКоманда.Идентификатор; + + Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда + ТексЗапроса = "Выбрать + | Пользователь КАК Пользователь + | ИЗ + | РегистрСведений.ПользовательскиеНастройкиДоступаКОбработкам + | ГДЕ + | ДополнительныйОтчетИлиОбработка = &ДополнительныйОтчетИлиОбработка + | И ИдентификаторКоманды = &ИдентификаторКоманды + | И Доступно"; + Запрос = Новый Запрос; + Запрос.Текст = ТексЗапроса; + Запрос.Параметры.Вставить("ДополнительныйОтчетИлиОбработка", Объект.Ссылка); + Запрос.Параметры.Вставить("ИдентификаторКоманды", ЭлементКоманда.Идентификатор); + + УстановитьПривилегированныйРежим(Истина); + + Выгрузка = Запрос.Выполнить().Выгрузить(); + НоваяКоманда.БыстрыйСписокДоступа.ЗагрузитьЗначения(Выгрузка.ВыгрузитьКолонку("Пользователь")); + + НоваяКоманда.БыстрыйДоступПредставление = + ПолучитьСтрокуПредставленияПользователейСБыстрымДоступом( + НоваяКоманда.БыстрыйСписокДоступа.Количество()); + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + + Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка + И ЭлементКоманда.ВариантЗапуска = Перечисления.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода Тогда + + // Можно задавать расписание и указывать использование + НоваяКоманда.Разрешено = Истина; + + РегламентноеЗаданиеЗадано = Ложь; + + Если КомандыСохраненные = Неопределено Тогда + // загрузка команд из таблицы объекта + РегламентноеЗаданиеGUID = ЭлементКоманда.РегламентноеЗаданиеGUID; + Иначе + + НайденнаяСтрока = КомандыСохраненные.Найти(ЭлементКоманда.Идентификатор, "Идентификатор"); + + Если НайденнаяСтрока = Неопределено Тогда + // соответствия не найдено + Иначе + РегламентноеЗаданиеGUID = НайденнаяСтрока.РегламентноеЗаданиеGUID; + КомандыСохраненные.Удалить(НайденнаяСтрока); + КонецЕсли; + + КонецЕсли; + + Если ЗначениеЗаполнено(РегламентноеЗаданиеGUID) Тогда + + РегламентноеЗадание = Справочники.ДополнительныеОтчетыИОбработки.НайтиРегламентноеЗадание(РегламентноеЗаданиеGUID); + + Если РегламентноеЗадание = Неопределено Тогда + + ЭлементКоманда.РегламентноеЗаданиеGUID = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); + + Иначе + + ЭлементКоманда.РегламентноеЗаданиеGUID = РегламентноеЗаданиеGUID; + + НоваяКоманда.РасписаниеПредставление = Строка(РегламентноеЗадание.Расписание); + НоваяКоманда.Использование = РегламентноеЗадание.Использование; + НоваяКоманда.Расписание.Добавить(РегламентноеЗадание.Расписание); + + РегламентноеЗаданиеЗадано = Истина; + КонецЕсли; + + КонецЕсли; + + Если НЕ РегламентноеЗаданиеЗадано Тогда + НоваяКоманда.РасписаниеПредставление = стрРасписаниеНеЗадано(); + НоваяКоманда.Использование = Ложь; + КонецЕсли; + + Иначе + НоваяКоманда.РасписаниеПредставление = НСтр("ru = 'Не применимо - команда используется только на клиенте'"); + НоваяКоманда.Использование = Ложь; + НоваяКоманда.Разрешено = Ложь; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьЭлементыФормы(Регистрация = Ложь) + + Если Регистрация ИЛИ ЗначениеЗаполнено(Объект.Ссылка)Тогда + + Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка + ИЛИ Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда + + Элементы.КомандыОбработки.ПодчиненныеЭлементы.КомандыРасписание.Видимость = Истина; + Элементы.КомандыОбработки.ПодчиненныеЭлементы.КомандыИспользование.Видимость = Истина; + + Элементы.СтраницыРазделыНазначение.ТекущаяСтраница = + Элементы.СтраницаРазделы; + + ИначеЕсли ДополнительныеОтчетыИОбработки.ПроверитьНазначаемаяОбработка(Объект.Вид) Тогда + + Элементы.КомандыОбработки.ПодчиненныеЭлементы.КомандыРасписание.Видимость = Ложь; + Элементы.КомандыОбработки.ПодчиненныеЭлементы.КомандыИспользование.Видимость = Ложь; + + Элементы.СтраницыРазделыНазначение.ТекущаяСтраница = + Элементы.СтраницаНазначение; + + Элементы.КомандыОбработкиНастроитьБыстрыйДоступККоманде.Видимость = Ложь; + Элементы.КомандыОбработкиНастроитьРасписаниеКоманды.Видимость = Ложь; + + Элементы.КомандыОбработки.ПодчиненныеЭлементы.БыстрыйДоступПредставление.Видимость = Ложь; + + КонецЕсли; + + Если Объект.БезопасныйРежим Тогда + Элементы.ГруппаДополнительнаяИнформация.ТекущаяСтраница = + Элементы.ГруппаИнформация; + Иначе + Элементы.ГруппаДополнительнаяИнформация.ТекущаяСтраница = + Элементы.ГруппаПредупреждение; + КонецЕсли; + + Если ЭтоНовыйОбъект Тогда + Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет + ИЛИ Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет Тогда + Заголовок = НСтр("ru = 'Дополнительный отчет (создание)'"); + Иначе + Заголовок = НСтр("ru = 'Дополнительная обработка (создание)'"); + КонецЕсли; + Иначе + Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет + ИЛИ Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет Тогда + Заголовок = Объект.Наименование + " " + НСтр("ru = '(Дополнительный отчет)'"); + Иначе + Заголовок = Объект.Наименование + " " + НСтр("ru = '(Дополнительная обработка)'"); + КонецЕсли; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьБыстрыйДоступОбщийОбработчик(ТекущиеДанные) + + Идентификатор = ТекущиеДанные.Идентификатор; + + ТекущиеДанныеЭлементКоллекции = КомандыОбработки.НайтиСтроки(Новый Структура("Идентификатор", Идентификатор))[0]; + + Результат = ОткрытьФормуМодально("Справочник.ДополнительныеОтчетыИОбработки.Форма.БыстрыйДоступКДополнительнымОтчетамИОбработкам", + Новый Структура("ПользователиСБыстрымДоступом, ПредставлениеКоманды", + ТекущиеДанныеЭлементКоллекции.БыстрыйСписокДоступа, + ТекущиеДанные.Представление)); + + Если ТипЗнч(Результат) = Тип("СписокЗначений") Тогда + ТекущиеДанныеЭлементКоллекции.БыстрыйСписокДоступа.Очистить(); + Для Каждого ЭлементПользователь Из Результат Цикл + ТекущиеДанныеЭлементКоллекции.БыстрыйСписокДоступа.Добавить(ЭлементПользователь.Значение); + КонецЦикла; + Модифицированность = Истина; + КонецЕсли; + + ТекущиеДанныеЭлементКоллекции.БыстрыйДоступПредставление = + ПолучитьСтрокуПредставленияПользователейСБыстрымДоступом( + ТекущиеДанныеЭлементКоллекции.БыстрыйСписокДоступа.Количество()); + +КонецПроцедуры + +&НаСервере +Функция ПоместитьФайлОбработкиВоВременноеХранилище() + + Если РегистрацияОбработки Тогда + Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки); + КонецЕсли; + + Если Объект.Ссылка = Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка() Тогда + Возврат Неопределено; + КонецЕсли; + + Значение = РеквизитФормыВЗначение("Объект").ХранилищеОбработки.Получить(); + + Если ТипЗнч(Значение) <> Тип("ДвоичныеДанные") Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат ПоместитьВоВременноеХранилище(Значение); + +КонецФункции + +&НаКлиенте +Функция ОткрытьДиалогЗагрузкиФайлаОбработкиОтчета() + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + ДиалогОткрытияФайла.ПолноеИмяФайла = Объект.ИмяФайла; + ДиалогОткрытияФайла.Фильтр = "Внешние обработки|*.epf|Внешние отчеты|*.erf"; + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файл'"); + + ПомещаемыеФайлы = Новый Массив; + ПомещенныеФайлы = Новый Массив; + + Если ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, ДиалогОткрытияФайла, Истина) Тогда + МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПомещенныеФайлы[0].Имя, "\"); + ИмяФайла = МассивПодстрок.Получить(МассивПодстрок.ВГраница()); + РасширениеФайла = Прав(ИмяФайла, 3); + + Если Не ЗарегистрироватьОбработку(ПомещенныеФайлы[0].Хранение, ИмяФайла, РасширениеФайла) Тогда + Возврат Ложь; + КонецЕсли; + Иначе + Возврат Ложь; + КонецЕсли; + Иначе + + АдресВоВременномХранилище = ""; + ВыбранноеИмяФайла = ""; + + Если ПоместитьФайл(АдресВоВременномХранилище, , ВыбранноеИмяФайла, Истина) Тогда + + МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ВыбранноеИмяФайла, "\"); + ИмяФайла = МассивПодстрок.Получить(МассивПодстрок.ВГраница()); + РасширениеФайла = Прав(ИмяФайла, 3); + + Если ВРег(РасширениеФайла) = "EPF" Тогда + // внешняя обработка + ИначеЕсли ВРег(РасширениеФайла) = "ERF" Тогда + // внешний отчет + Иначе + Предупреждение(НСтр("ru = 'Невозможно определить тип файла по расширению'")); + Возврат Ложь; + КонецЕсли; + + Если НЕ ЗарегистрироватьОбработку(АдресВоВременномХранилище, ИмяФайла, РасширениеФайла) Тогда + Возврат Ложь; + КонецЕсли; + Иначе + Возврат Ложь; + КонецЕсли; + + КонецЕсли; + + Модифицированность = Истина; + РегистрацияОбработки = Истина; + + Возврат Истина; + +КонецФункции + +&НаКлиенте +Функция РедактированиеРасписанияРегламентногоЗадания(Расписание) + + Если Расписание = Неопределено Тогда + + Расписание = Новый РасписаниеРегламентногоЗадания; + + КонецЕсли; + + Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); + + // открываем диалог для редактирования Расписания + Если Диалог.ОткрытьМодально() Тогда + + Расписание = Диалог.Расписание; + + КонецЕсли; + + Возврат Расписание; + +КонецФункции + +&НаКлиенте +Процедура УстановитьРасписание(ТекущиеДанные, Отказ = Ложь) + + Если ТекущиеДанные.Расписание.Количество() > 0 Тогда + Расписание = ТекущиеДанные.Расписание.Получить(0).Значение; + Иначе + Расписание = Неопределено; + КонецЕсли; + + Расписание = РедактированиеРасписанияРегламентногоЗадания(Расписание); + + ТекущиеДанные.Расписание.Очистить(); + ТекущиеДанные.Расписание.Добавить(Расписание); + + ТекущиеДанные.РасписаниеПредставление = Строка(Расписание); + + Если ТекущиеДанные.РасписаниеПредставление = ПредставлениеПустогоРасписания() Тогда + ТекущиеДанные.РасписаниеПредставление = стрРасписаниеНеЗадано(); + ТекущиеДанные.Использование = Ложь; + Отказ = Истина; + Иначе + ТекущиеДанные.Использование = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция ПредставлениеПустогоРасписания() + + Возврат Строка(Новый РасписаниеРегламентногоЗадания); + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция стрРасписаниеНеЗадано() + + Возврат НСтр("ru = 'Расписание не задано'"); + +КонецФункции + +&НаКлиенте +Процедура НастроитьБыстрыйДоступ(Команда) + + ТекущиеДанные = Элементы.КомандыОбработки.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + НастроитьБыстрыйДоступОбщийОбработчик(ТекущиеДанные); + +КонецПроцедуры + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + + Если ДополнительныеОтчетыИОбработки.ПроверитьНазначаемаяОбработка(Объект.Вид) Тогда + + Если НЕ Объект.ИспользоватьДляФормыОбъекта И НЕ Объект.ИспользоватьДляФормыСписка Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Необходимо указать использование обработки, как минимум для одной формы'"),,,"Объект.ИспользоватьДляФормыОбъекта", Отказ); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция ПолучитьСтрокуПредставленияПользователейСБыстрымДоступом(ЧислоПользователейСБыстрымДоступом) + + Если ЧислоПользователейСБыстрымДоступом = 0 Тогда + + БыстрыйДоступПредставление = НСтр("ru = 'Команды нет в быстром доступе'"); + + Иначе + + ПоследняяЦифра = Число(Прав(Строка(ЧислоПользователейСБыстрымДоступом),1)); + + Если ПоследняяЦифра = 1 Тогда + БыстрыйДоступПредставление = НСтр("ru = '%1 пользователь'"); + ИначеЕсли ПоследняяЦифра = 2 Или ПоследняяЦифра = 3 Или ПоследняяЦифра = 4 Тогда + БыстрыйДоступПредставление = НСтр("ru = '%1 пользователя'"); + Иначе + БыстрыйДоступПредставление = НСтр("ru = '%1 пользователей'"); + КонецЕсли; + + БыстрыйДоступПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(БыстрыйДоступПредставление, Строка(ЧислоПользователейСБыстрымДоступом)) + + КонецЕсли; + + Возврат БыстрыйДоступПредставление; + +КонецФункции diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Help/ru.html b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Help/ru.html new file mode 100644 index 000000000..44c676d65 --- /dev/null +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Help/ru.html @@ -0,0 +1,18 @@ + +

В зависимости от назначения, обработки подразделяются на следующие виды:

+
  • Обработки заполнение объекта +
  • Обработки создания объектов на основании +
  • Печатные формы +
  • Отчеты +
  • Дополнительные отчеты +
  • Дополнительные обработки

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

+

Каждая обработка может поставлять одну или несколько команд.

+

Технически, дополнительные отчеты и обработки могут быть вызваны из конфигурации тремя способами:

+
  • Открытие формы - при этом открывается форма обработки +
  • Вызов клиентского метода - при этом вызывается метод в клиентском контексте +
  • Вызов серверного метода - при этом вызывается метод в серверном контексте

 

+

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

+
  • Используется - обработка доступна для использования +
  • Не используется - обработка не доступна для использования +
  • Режим отладки - обработка доступна для использования только пользователю с ролью "Добавление и изменение дополнительных обработок" или ролью "Полные права"

 

+

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

\ 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..cc4ec1861 --- /dev/null +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ManagerModule.bsl @@ -0,0 +1,110 @@ +//////////////////////////////////////////////////////////////////////////////// +// Блок экспортных функций + +Процедура ОбновитьСведенияПоРасписанию(ДополнительнаяОбработка, Команда, Расписание, Использование, Отказ) Экспорт + + // получаем регламентное задание по идентификатору, если объект не находим, то создаем новый + РегламентноеЗаданиеОбъект = ПолучитьРегламентноеЗадание(Команда.РегламентноеЗаданиеGUID); + + // обновляем свойства РЗ + УстановитьПараметрыРегламентногоЗадания(РегламентноеЗаданиеОбъект, Расписание, Использование, ДополнительнаяОбработка.Ссылка, Команда); + + // записываем измененное задание + ЗаписатьРегламентноеЗадание(Отказ, РегламентноеЗаданиеОбъект); + + //запоминаем GUID регл. задания в реквизите объекта + Команда.РегламентноеЗаданиеGUID = РегламентноеЗаданиеОбъект.УникальныйИдентификатор; + +КонецПроцедуры + +Процедура УдалитьРегламентноеЗадание(РегламентноеЗаданиеGUID) Экспорт + + РегламентноеЗаданиеОбъект = НайтиРегламентноеЗадание(РегламентноеЗаданиеGUID); + + Если РегламентноеЗаданиеОбъект <> Неопределено Тогда + УстановитьПривилегированныйРежим(Истина); + РегламентноеЗаданиеОбъект.Удалить(); + КонецЕсли; + +КонецПроцедуры + +Функция НайтиРегламентноеЗадание(УникальныйИдентификаторЗадания) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Попытка + ТекущееРегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(УникальныйИдентификаторЗадания); + Исключение + ТекущееРегламентноеЗадание = Неопределено; + КонецПопытки; + + Возврат ТекущееРегламентноеЗадание; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Блок служебных функций + +Процедура УстановитьПараметрыРегламентногоЗадания(РегламентноеЗаданиеОбъект, Расписание, Использование, Ссылка, Команда) + + ПараметыРЗ = Новый Массив; + ПараметыРЗ.Добавить(Команда.Идентификатор); + ПараметыРЗ.Добавить(Ссылка); + + НаименованиеРегламентногоЗадания = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Запуск обработок: %1'"), + СокрЛП(Команда.Представление) ); + + РегламентноеЗаданиеОбъект.Наименование = Лев(НаименованиеРегламентногоЗадания, 120); + РегламентноеЗаданиеОбъект.Использование = Использование; + РегламентноеЗаданиеОбъект.Параметры = ПараметыРЗ; + + РегламентноеЗаданиеОбъект.Расписание = Расписание; + +КонецПроцедуры + +// Выполняет запись регламентного задания +// +// Параметры: +// Отказ - Булево - флаг отказа. Если в процессе выполнения процедуры были обнаружены ошибки, +// то флаг отказа устанавливается в значение Истина +// РегламентноеЗаданиеОбъект - объект регламентного задания, которое необходимо записать +// +Процедура ЗаписатьРегламентноеЗадание(Отказ, РегламентноеЗаданиеОбъект) + + УстановитьПривилегированныйРежим(Истина); + + Попытка + + // записываем задание + РегламентноеЗаданиеОбъект.Записать(); + + Исключение + НСтрока = НСтр("ru = 'Произошла ошибка при сохранении регламентного задания + |Подробное описание ошибки: %1'"); + + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтрока, + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщения, , , , Отказ); + КонецПопытки; + +КонецПроцедуры + +Функция ПолучитьРегламентноеЗадание(РегламентноеЗаданиеGUID) + + УстановитьПривилегированныйРежим(Истина); + + РегламентноеЗаданиеОбъект = НайтиРегламентноеЗадание(РегламентноеЗаданиеGUID); + + // при необходимости создаем регл. задание + Если РегламентноеЗаданиеОбъект = Неопределено Тогда + + РегламентноеЗаданиеОбъект = РегламентныеЗадания.СоздатьРегламентноеЗадание("ЗапускДополнительныхОбработок"); + + КонецЕсли; + + Возврат РегламентноеЗаданиеОбъект; + +КонецФункции diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl new file mode 100644 index 000000000..64de8ad8c --- /dev/null +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl @@ -0,0 +1,346 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ОБЪЕКТА + +Процедура ПередЗаписью(Отказ) + + Если НЕ ЭтоНовый() Тогда + + ОбъектВИБ = Ссылка.ПолучитьОбъект(); + + Если Вид <> ОбъектВИБ.Вид Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Нельзя менять вид дополнительного отчета или обработки, после записи объекта информационную базу.'"),,,, + Отказ); + КонецЕсли; + + КонецЕсли; + + Если ПометкаУдаления Тогда + Публикация = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.НеИспользуется; + КонецЕсли; + + Если ЭтоГруппа Тогда + + // группы не обрабатываем + + ИначеЕсли ДополнительныеОтчетыИОбработки.ПроверитьНазначаемаяОбработка(Вид) Тогда + + ИмяРесурса = ПолучитьИмяРесурсаПоВидуОбработки(Вид); + + Если ЭтоНовый() Тогда + ПредыдущееНазначение = Новый ТаблицаЗначений; + ПредыдущееНазначение.Колонки.Добавить("ПолноеИмяОбъектаМетаданных", Новый ОписаниеТипов("Строка")); + Иначе + ПредыдущееНазначение = ОбъектВИБ.Назначение; + КонецЕсли; + + Таблица = СверткаПоПолю(ПредыдущееНазначение, Назначение, "ПолноеИмяОбъектаМетаданных", "Строка"); + + Удаленные = Таблица.НайтиСтроки(Новый Структура("Признак", -1)); + Добавленные = Таблица.НайтиСтроки(Новый Структура("Признак", 1)); + Оставшиеся = Таблица.НайтиСтроки(Новый Структура("Признак", 0)); + + Если ПредыдущееНазначение.Количество() > 0 Тогда + + МассивУдаляемых = Новый Массив; + + Для Каждого УдаленныйЭлемент Из Удаленные Цикл + МассивУдаляемых.Добавить(УдаленныйЭлемент.ПолноеИмяОбъектаМетаданных); + КонецЦикла; + + Если ОбъектВИБ.ИспользоватьДляФормыОбъекта Тогда + СвернутьРегистрДоступностиОтчетовИОбработок(МассивУдаляемых, Ссылка, Вид, ИмяРесурса, "ФормаОбъекта"); + КонецЕсли; + + Если ОбъектВИБ.ИспользоватьДляФормыСписка Тогда + СвернутьРегистрДоступностиОтчетовИОбработок(МассивУдаляемых, Ссылка, Вид, ИмяРесурса, "ФормаСписка"); + КонецЕсли; + + КонецЕсли; // ПредыдущееНазначение.Количество() > 0 + + Если Оставшиеся.Количество() > 0 Тогда + + Если НЕ ОбъектВИБ.ИспользоватьДляФормыОбъекта И ИспользоватьДляФормыОбъекта Тогда // включаем + Для Каждого СтрокаНазначение Из Оставшиеся Цикл + УстановитьДоступностьКоманды(СтрокаНазначение.ПолноеИмяОбъектаМетаданных, "ФормаОбъекта", ИмяРесурса, Истина); + КонецЦикла; + ИначеЕсли ОбъектВИБ.ИспользоватьДляФормыОбъекта И НЕ ИспользоватьДляФормыОбъекта Тогда + МассивОсвобождаемых = Новый Массив; + Для Каждого ОсвобождаемыйЭлемент Из Оставшиеся Цикл + МассивОсвобождаемых.Добавить(ОсвобождаемыйЭлемент.ПолноеИмяОбъектаМетаданных); + КонецЦикла; + СвернутьРегистрДоступностиОтчетовИОбработок(МассивОсвобождаемых, Ссылка, Вид, ИмяРесурса, "ФормаОбъекта"); + КонецЕсли; + + Если НЕ ОбъектВИБ.ИспользоватьДляФормыСписка И ИспользоватьДляФормыСписка Тогда // включаем + Для Каждого СтрокаНазначение Из Оставшиеся Цикл + УстановитьДоступностьКоманды(СтрокаНазначение.ПолноеИмяОбъектаМетаданных, "ФормаСписка", ИмяРесурса, Истина); + КонецЦикла; + ИначеЕсли ОбъектВИБ.ИспользоватьДляФормыСписка И НЕ ИспользоватьДляФормыСписка Тогда + МассивОсвобождаемых = Новый Массив; + Для Каждого ОсвобождаемыйЭлемент Из Оставшиеся Цикл + МассивОсвобождаемых.Добавить(ОсвобождаемыйЭлемент.ПолноеИмяОбъектаМетаданных); + КонецЦикла; + СвернутьРегистрДоступностиОтчетовИОбработок(МассивОсвобождаемых, Ссылка, Вид, ИмяРесурса, "ФормаСписка"); + КонецЕсли; + + КонецЕсли; + + Если Добавленные.Количество() > 0 Тогда + + Если ИспользоватьДляФормыОбъекта Тогда + Для Каждого СтрокаНазначение Из Добавленные Цикл + УстановитьДоступностьКоманды(СтрокаНазначение.ПолноеИмяОбъектаМетаданных, "ФормаОбъекта", ИмяРесурса, Истина); + КонецЦикла; + КонецЕсли; + + Если ИспользоватьДляФормыСписка Тогда + Для Каждого СтрокаНазначение Из Добавленные Цикл + УстановитьДоступностьКоманды(СтрокаНазначение.ПолноеИмяОбъектаМетаданных, "ФормаСписка", ИмяРесурса, Истина); + КонецЦикла; + КонецЕсли; + + КонецЕсли; + + ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда + + ТаблицаКоманд = Неопределено; + + Если ДополнительныеСвойства.Свойство("КомандыОбработки", ТаблицаКоманд) Тогда + + // переносим данные о регламентных заданиях в командах в объект + // и обновляем регламентные задания, если требуется + Для Каждого ЭлементКоманда Из ТаблицаКоманд Цикл + + Если ЭлементКоманда.Расписание.Количество() > 0 Тогда + Расписание = ЭлементКоманда.Расписание.Получить(0).Значение; + Иначе + Расписание = ПредставлениеПустогоРасписания(); + КонецЕсли; + + КомандаВОбъекте = Команды.НайтиСтроки(Новый Структура("Идентификатор", ЭлементКоманда.Идентификатор))[0]; + + Если Строка(Расписание) = ПредставлениеПустогоРасписания() Тогда // возможно было удалено регламентное задание + Если ЗначениеЗаполнено(КомандаВОбъекте.РегламентноеЗаданиеGUID) Тогда + Справочники.ДополнительныеОтчетыИОбработки.УдалитьРегламентноеЗадание(КомандаВОбъекте.РегламентноеЗаданиеGUID); + КомандаВОбъекте.РегламентноеЗаданиеGUID = ""; + КонецЕсли; + Иначе + Справочники.ДополнительныеОтчетыИОбработки.ОбновитьСведенияПоРасписанию( + ЭтотОбъект, КомандаВОбъекте, Расписание, ЭлементКоманда.Использование, Отказ); + КонецЕсли; + + КонецЦикла; // Для Каждого ЭлементКоманда Из ТаблицаКоманд Цикл + + КонецЕсли; // Если ДополнительныеСвойства.Свойство("КомандыОбработки", ТаблицаКоманд) Тогда + + КонецЕсли; + +КонецПроцедуры + +Процедура ПриЗаписи(Отказ) + + ТаблицаКоманд = Неопределено; + + Если ДополнительныеСвойства.Свойство("КомандыОбработки", ТаблицаКоманд) Тогда + + УстановитьПривилегированныйРежим(Истина); + + Для Каждого ЭлементКоманда Из ТаблицаКоманд Цикл + + НаборЗаписей = РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ДополнительныйОтчетИлиОбработка.Установить(Ссылка); + НаборЗаписей.Отбор.ИдентификаторКоманды.Установить(ЭлементКоманда.Идентификатор); + + Для Каждого ЭлементПользователь Из ЭлементКоманда.БыстрыйСписокДоступа Цикл + Запись = НаборЗаписей.Добавить(); + Запись.ДополнительныйОтчетИлиОбработка = Ссылка; + Запись.ИдентификаторКоманды = ЭлементКоманда.Идентификатор; + Запись.Пользователь = ЭлементПользователь.Значение; + Запись.Доступно = Истина; + КонецЦикла; + + НаборЗаписей.Записать(Истина); + + КонецЦикла; + + УстановитьПривилегированныйРежим(Ложь); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПередУдалением(Отказ) + + Если ЭтоГруппа Тогда + + // группы не обрабатываем + + ИначеЕсли ДополнительныеОтчетыИОбработки.ПроверитьНазначаемаяОбработка(Вид) Тогда + + ИмяРесурса = ПолучитьИмяРесурсаПоВидуОбработки(Вид); + + МассивУдаляемых = Новый Массив; + + Для Каждого ЭлементНазначение ИЗ Назначение Цикл + МассивУдаляемых.Добавить(ЭлементНазначение.ПолноеИмяОбъектаМетаданных); + КонецЦикла; + + Если ИспользоватьДляФормыОбъекта Тогда + СвернутьРегистрДоступностиОтчетовИОбработок(МассивУдаляемых, Ссылка, Вид, ИмяРесурса, "ФормаОбъекта"); + КонецЕсли; + + Если ИспользоватьДляФормыСписка Тогда + СвернутьРегистрДоступностиОтчетовИОбработок(МассивУдаляемых, Ссылка, Вид, ИмяРесурса, "ФормаСписка"); + КонецЕсли; + + Иначе + + Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда + + Для Каждого ЭлементКоманда Из Команды Цикл + + Справочники.ДополнительныеОтчетыИОбработки.УдалитьРегламентноеЗадание(ЭлементКоманда.РегламентноеЗаданиеGUID); + + КонецЦикла; + + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Процедура ПриКопировании(ОбъектКопирования) + + РегламентноеЗаданиеGUID = ""; + +КонецПроцедуры + +Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) + + РегламентноеЗаданиеGUID = ""; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ + +Функция СверткаПоПолю(Таблица1, Таблица2, ИмяПоля, ИмяТипаПоля) + + Таблица = ПолучитьТаблицуСравнения(ИмяПоля, ИмяТипаПоля); + + Для Каждого ЭлементПолноеИмя Из Таблица1.ВыгрузитьКолонку(ИмяПоля) Цикл + НоваяСтрока = Таблица.Добавить(); + НоваяСтрока[ИмяПоля] = ЭлементПолноеИмя; + НоваяСтрока.Признак = -1; + КонецЦикла; + + Для Каждого ЭлементПолноеИмя Из Таблица2.ВыгрузитьКолонку(ИмяПоля) Цикл + НоваяСтрока = Таблица.Добавить(); + НоваяСтрока[ИмяПоля] = ЭлементПолноеИмя; + НоваяСтрока.Признак = +1; + КонецЦикла; + + Таблица.Свернуть(ИмяПоля, "Признак"); + + Возврат Таблица; + +КонецФункции + +Функция ПолучитьТаблицуСравнения(ИмяКолонки, ИмяТипа) + + ТаблицаЗначений = Новый ТаблицаЗначений; + + ТаблицаЗначений.Колонки.Добавить(ИмяКолонки, Новый ОписаниеТипов(ИмяТипа)); + ТаблицаЗначений.Колонки.Добавить("Признак", Новый ОписаниеТипов("Число")); + + Возврат ТаблицаЗначений; + +КонецФункции + +Процедура УстановитьДоступностьКоманды(ПолноеИмяОбъектаМетаданных, ТипФормы, ИмяРесурса, Значение) + + УстановитьПривилегированныйРежим(Истина); + + МенеджерЗаписи = РегистрыСведений.НазначениеДополнительныхОбработок.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ТипОбъекта = ПолноеИмяОбъектаМетаданных; + МенеджерЗаписи.ТипФормы = ТипФормы; + МенеджерЗаписи.Прочитать(); + МенеджерЗаписи.ТипОбъекта = ПолноеИмяОбъектаМетаданных; + МенеджерЗаписи.ТипФормы = ТипФормы; + МенеджерЗаписи[ИмяРесурса] = Значение; + МенеджерЗаписи.Записать(Истина); + +КонецПроцедуры + +Процедура СвернутьРегистрДоступностиОтчетовИОбработок(МассивУдаляемых, Ссылка, Вид, ИмяРесурса, ТипФормы) + + Если МассивУдаляемых.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ТекстЗапроса = " + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | НазначениеВО.ПолноеИмяОбъектаМетаданных КАК ПолноеИмяОбъектаМетаданных + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки.Назначение КАК НазначениеВО + | СОЕДИНЕНИЕ + | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки + | ПО НазначениеВО.Ссылка = ДополнительныеОтчетыИОбработки.Ссылка + |ГДЕ + | НазначениеВО.ПолноеИмяОбъектаМетаданных В (&НаборИмен) + | И ДополнительныеОтчетыИОбработки.Ссылка <> &Ссылка + | И ДополнительныеОтчетыИОбработки.Вид = &Вид"; + + Если ТипФормы = "ФормаОбъекта" Тогда + ТекстЗапроса = ТекстЗапроса + " + | И ДополнительныеОтчетыИОбработки.ИспользоватьДляФормыОбъекта"; + ИначеЕсли ТипФормы = "ФормаСписка" Тогда + ТекстЗапроса = ТекстЗапроса + " + | И ДополнительныеОтчетыИОбработки.ИспользоватьДляФормыСписка"; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.Параметры.Вставить("НаборИмен", МассивУдаляемых); + Запрос.Параметры.Вставить("Ссылка", Ссылка); + Запрос.Параметры.Вставить("Вид", Вид); + + ИменаРазрешенных = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ПолноеИмяОбъектаМетаданных"); + + Для Каждого ПолноеИмяОбъектаМетаданных Из МассивУдаляемых Цикл + Если ИменаРазрешенных.Найти(ПолноеИмяОбъектаМетаданных) = Неопределено Тогда + УстановитьДоступностьКоманды(ПолноеИмяОбъектаМетаданных, ТипФормы, ИмяРесурса, Ложь); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьИмяРесурсаПоВидуОбработки(Вид) + + ИмяРесурса = Неопределено; + + Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта Тогда + ИмяРесурса = "ИспользоватьЗаполнениеОбъекта"; + КонецЕсли; + + Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет Тогда + ИмяРесурса = "ИспользоватьОтчеты"; + КонецЕсли; + + Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма Тогда + ИмяРесурса = "ИспользоватьПечатныеФормы"; + КонецЕсли; + + Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.СозданиеСвязанныхОбъектов Тогда + ИмяРесурса = "ИспользоватьСозданиеСвязанныхОбъектов"; + КонецЕсли; + + Возврат ИмяРесурса; + +КонецФункции + +Функция ПредставлениеПустогоРасписания() + + Возврат Строка(Новый РасписаниеРегламентногоЗадания); + +КонецФункции diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo new file mode 100644 index 000000000..3666b74e8 --- /dev/null +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo @@ -0,0 +1,508 @@ + + + + + + + + + + ДополнительныеОтчетыИОбработки + + ru + Дополнительные отчеты и обработки + + true + Catalog.ДополнительныеОтчетыИОбработки.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Catalog.ДополнительныеОтчетыИОбработки.EmptyRef + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + + + ru + + + Managed + Use + true + 2 + true + 100 + String + Variable + AsDescription + InDialog + BothWays + Catalog.ДополнительныеОтчетыИОбработки.Form.ФормаЭлемента + Catalog.ДополнительныеОтчетыИОбработки.Form.ФормаСписка + + БезопасныйРежим + + ru + Безопасный режим + + + Boolean + + + ru + Вызывать обработку в безопасном режиме. В безопасном режиме запрещены COM; загрузка внешних компонент; запуск внешних приложений и команд операционной системы; доступ к файловой системе, кроме временных файлов; доступ к интернет. + + + + + Use + Use + + + Версия + + ru + Версия + + + String + + 10 + + + + + + Use + Use + + + Вид + + ru + Вид + + + EnumRef.ВидыДополнительныхОтчетовИОбработок + + + + + Index + Use + + + ИмяФайла + + ru + Имя файла + + + String + + + + + + Use + Use + + + Информация + + ru + Информация + + + String + + + + + + Use + Use + + + ИспользоватьДляФормыОбъекта + + ru + Использовать для формы объекта + + + Boolean + + + + + Index + Use + + + ИспользоватьДляФормыСписка + + ru + Использовать для формы списка + + + Boolean + + + + + Index + Use + + + Комментарий + + ru + Комментарий + + + String + + + + + + Use + Use + + + Ответственный + + ru + Ответственный + + + CatalogRef.Пользователи + + + + ShowError + + Use + Use + + + Публикация + + ru + Публикация + + + EnumRef.ВариантыПубликацииДополнительныхОтчетовИОбработок + + + + ShowError + true + + Enum.ВариантыПубликацииДополнительныхОтчетовИОбработок.EnumValue.РежимОтладки + + Use + Use + + + ХранилищеОбработки + + ru + Хранилище обработки + + + ValueStorage + + + + + Use + + + + + + + Команды + + ru + Команды + + + Use + LineNumber + + Use + + + + + ВариантЗапуска + + ru + Вариант запуска + + + EnumRef.СпособыВызоваДополнительныхОбработок + + + + Use + Use + + + Идентификатор + + ru + Идентификатор + + + String + + 100 + + + + + Use + Use + + + ПоказыватьОповещение + + ru + Показывать оповещение + + + Boolean + + + + Use + + + Представление + + ru + Представление + + + String + + + + + Use + Use + + + Модификатор + + ru + Модификатор + + + String + + + + + Use + + + РегламентноеЗаданиеGUID + + ru + Регламентное задание GUID + + + UUID + + + + Use + + + + + + + + Назначение + + ru + Назначение + + + Use + LineNumber + + Use + + + + + ПолноеИмяОбъектаМетаданных + + ru + Полное имя объекта метаданных + + Полное имя объекта метаданных + + String + + 200 + + + + + Use + Use + + + + + + + + Разделы + + ru + Разделы + + + Use + LineNumber + + Use + + + + + ИмяРаздела + + ru + Имя раздела + + + String + + 100 + + + + + Use + Use + + + + БыстрыйДоступКДополнительнымОтчетамИОбработкам + + ru + Быстрый доступ к дополнительным отчетам и обработкам + + PersonalComputer + MobileDevice + + + ПодборРазделов + + ru + Разделы командного интерфейса + + 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 new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбора/Form.form new file mode 100644 index 000000000..d12bc3597 --- /dev/null +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбора/Form.form @@ -0,0 +1,249 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 4 + + <key>ru</key> + <value>Значение</value> + + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + ValueChoice + СписокВыборЗначения + + + Selection + СписокВыбор + + + СписокСтрокаПоиска + 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 + + HierarchicalList + true + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.IsFolder + +
true
+ + Catalog.ЗначенияСвойствОбъектов + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбора/Module.bsl new file mode 100644 index 000000000..37778d9c0 --- /dev/null +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбора/Module.bsl @@ -0,0 +1,49 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Владелец = Неопределено; + + Если Параметры.Отбор.Свойство("_Владелец", Владелец) И ЗначениеЗаполнено(Владелец) Тогда + Параметры.Отбор.Удалить("_Владелец"); + Параметры.Отбор.Вставить("Владелец", Владелец); + КонецЕсли; + + Если Параметры.Отбор.Свойство("Владелец", Владелец) И ЗначениеЗаполнено(Владелец) Тогда + Элементы.Наименование.Заголовок = Владелец.Наименование; + КонецЕсли; + + ЗаголовокСтрока = СтрПолучитьСтроку(Владелец.СклоненияПредмета, 2); + + Если ПустаяСтрока(ЗаголовокСтрока) Тогда + Заголовок = НСтр("ru = 'Выберите значение'"); + Иначе + Заголовок = ЗаголовокСтрока; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ПроверитьВозможностьВыбора(Элемент, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка) + + ПроверитьВозможностьВыбора(Элемент, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьВозможностьВыбора(Элемент, СтандартнаяОбработка) + + Если Элемент.ТекущиеДанные <> Неопределено И Элемент.ТекущиеДанные.ЭтоГруппа Тогда + СтандартнаяОбработка = Ложь; + Предупреждение(НСтр("ru = 'Выбор групп значений не поддерживается'")); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..784796455 --- /dev/null +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,20 @@ + + + + + ЭтоГруппа + Equal + true + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбораГруппы/Form.form b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбораГруппы/Form.form new file mode 100644 index 000000000..203c6189e --- /dev/null +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаВыбораГруппы/Form.form @@ -0,0 +1,239 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + Copy + Create + CreateFolder + + Наименование + 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 + + Tree + true + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + Auto + Auto + ExpandTopLevel + true + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + Folders + + true + true + true + + + + ФормаКоманднаяПанель + -1 + Left + true + + Copy + Create + CreateFolder + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.ЗначенияСвойствОбъектов + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..36fe7b35a --- /dev/null +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form @@ -0,0 +1,236 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 4 + + <key>ru</key> + <value>Значение</value> + + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 7 + + СписокСтрокаПоискаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 8 + true + + Список + + true + + + + СписокСостояниеПросмотра + 10 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 11 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 13 + + СписокУправлениеПоискомРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 14 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.ЗначенияСвойствОбъектов + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..3c82d19bb --- /dev/null +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,16 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Владелец = Неопределено; + СодержитЗначения = Ложь; + + Если Параметры.Отбор.Свойство("Владелец", Владелец) Тогда + СодержитЗначения = Владелец.ТипЗначения.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")); + КонецЕсли; + + Если Не СодержитЗначения Тогда + Элементы.Список.ТолькоПросмотр = Истина; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..0bcb4ebc9 --- /dev/null +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,237 @@ + + + + Владелец + 3 + true + true + + true + + + Объект.Owner + + + ВладелецРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + ВладелецКонтекстноеМеню + 4 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Группа1 + 9 + + Наименование + 1 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Вес + 7 + true + true + + true + + + Объект.Вес + + + ВесРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + ВесКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + Группа1РасширеннаяПодсказка + 12 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Родитель + 5 + true + true + + true + + + Объект.Parent + + + РодительРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + РодительКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ЗначенияСвойствОбъектов + + + true + + + true + +
true
+ true +
+ + + + + + + AfterWriteAtServer + ПослеЗаписиНаСервере + + +
diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..f63563caa --- /dev/null +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,42 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ВладелецЗначенияСвойства = Справочники.ЗначенияСвойствОбъектов.ПустаяСсылка(); + + Если Объект.Ссылка = Справочники.ЗначенияСвойствОбъектов.ПустаяСсылка() Тогда + Если Параметры.ЗначениеКопирования = Справочники.ЗначенияСвойствОбъектов.ПустаяСсылка() Тогда + ВладелецЗначенияСвойства = Параметры.ЗначенияЗаполнения.Владелец; + Иначе + ВладелецЗначенияСвойства = Параметры.ЗначениеКопирования.Владелец; + КонецЕсли; + Иначе + ВладелецЗначенияСвойства = Объект.Ссылка.Владелец; + КонецЕсли; + + ИмяСвойства = СокрЛП(СтрПолучитьСтроку(ВладелецЗначенияСвойства.СклоненияПредмета, 1)); + + Если ПустаяСтрока(ИмяСвойства) Тогда + ИмяСвойства = ВладелецЗначенияСвойства.Наименование; + КонецЕсли; + + Если Объект.Ссылка = Справочники.ЗначенияСвойствОбъектов.ПустаяСсылка() Тогда // создание нового + Заголовок = ИмяСвойства + " (" + НСтр("ru = 'создание'") + ")"; + Иначе + Заголовок = Объект.Наименование + " (" + ИмяСвойства + ")"; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + + ИмяСвойства = СокрЛП(СтрПолучитьСтроку(Объект.Владелец.СклоненияПредмета, 1)); + + Если ПустаяСтрока(ИмяСвойства) Тогда + ИмяСвойства = Объект.Владелец.Наименование; + КонецЕсли; + + Заголовок = Объект.Наименование + " (" + ИмяСвойства + ")"; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Help/ru.html b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Help/ru.html new file mode 100644 index 000000000..5712b1152 --- /dev/null +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Help/ru.html @@ -0,0 +1,3 @@ + +

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

+

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

\ No newline at end of file diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ЗначенияСвойствОбъектов.mdo b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ЗначенияСвойствОбъектов.mdo new file mode 100644 index 000000000..0c892695c --- /dev/null +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ЗначенияСвойствОбъектов.mdo @@ -0,0 +1,199 @@ + + + + + + + + + + ЗначенияСвойствОбъектов + + ru + Значения свойств объектов + + true + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + + ru + Свойство + + + ru + Свойство + + true + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.EmptyRef + + ShowError + Use + + + + + Use + Parent + + ru + Группа + + true + + Catalog.ЗначенияСвойствОбъектов.EmptyRef + + + Отбор.Владелец + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Owner + + Use + + + + + Use + Description + + ru + Значение + + + ru + Значение свойства + + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + + + ru + + + Managed + Use + true + 2 + true + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения + 100 + String + AsDescription + InDialog + BothWays + Catalog.ЗначенияСвойствОбъектов.Form.ФормаЭлемента + Catalog.ЗначенияСвойствОбъектов.Form.ФормаЭлемента + Catalog.ЗначенияСвойствОбъектов.Form.ФормаСписка + Catalog.ЗначенияСвойствОбъектов.Form.ФормаВыбора + Catalog.ЗначенияСвойствОбъектов.Form.ФормаВыбораГруппы + + Вес + + ru + Вес + + + Number + + 10 + 2 + + + + + + Use + Use + + + ФормаВыбора + + ru + Форма выбора + + PersonalComputer + MobileDevice + + + ФормаВыбораГруппы + + ru + Форма выбора группы + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..ce8d012ee --- /dev/null +++ b/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,450 @@ + + + + Группа + 75 + + Наименование + 1 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 156 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + 42 + true + true + true + true + true + Normal + + + + НомерТекущегоГода + 73 + true + true + + true + + + НомерТекущегоГода + + + OnChange + НомерТекущегоГодаПриИзменении + + + НомерТекущегоГодаРасширеннаяПодсказка + 158 + Label + true + true + + Left + + + + НомерТекущегоГодаКонтекстноеМеню + 74 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 155 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Календарь + 148 + true + true + + true + + + Календарь + + None + + КалендарьРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + + КалендарьКонтекстноеМеню + 149 + true + + CalendarField + Enter + true + Left + true + + + OnPeriodOutput + КалендарьПриВыводеПериода + + + Selection + КалендарьВыбор + + 70 + true + 21 + true + true + true + true + + + 1 + + 4 + 3 + + + + Декорация + 151 + + <key>ru</key> + <value>Для редактирования рабочих и выходных дней календаря используйте двойной щелчок левой кнопкой мыши</value> + + true + true + + true + + + ДекорацияРасширеннаяПодсказка + 162 + Label + true + true + + Left + + + + ДекорацияКонтекстноеМеню + 152 + true + + Label + true + true + false + + 47 + 90 + 175 + + + Left + + + + ФормаКоманднаяПанель + -1 + + ЗаполнитьКалендарь + 72 + true + true + + true + + false + + ЗаполнитьКалендарьРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + Form.Command.ЗаполнитьКалендарь + Normal + Auto + true + true + UserCmds + Auto + + + ЗаполнитьПоКалендарю + 150 + true + true + + true + + false + + ЗаполнитьПоКалендарюРасширеннаяПодсказка + 154 + Label + true + true + + Left + + + Form.Command.ЗаполнитьПоКалендарю + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + ChoiceProcessing + ОбработкаВыбора + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.Календари + + + true + + + true + +
true
+ true +
+ + НомерТекущегоГода + + <key>ru</key> + <value>Год</value> + + 3 + + Number + + 4 + true + + + + true + + + true + + ShowError + + + Календарь + + <key>ru</key> + <value>Календарь</value> + + 4 + + Date + + Date + + + + true + + + true + + + + ТаблицаРегистра + + <key>ru</key> + <value>Таблица регистра</value> + + 2 + + ValueList + + + true + + + true + + + + + + + НомерПредыдущегоГода + + <key>ru</key> + <value>Номер предыдущего года</value> + + 5 + + Number + + 4 + true + + + + true + + + true + + + + ЗаполнитьКалендарь + + <key>ru</key> + <value>Заполнить календарь</value> + + 1 + + ru + Заполнить календарь за указанный на форме год по пятидневной рабочей неделе без учета праздников + + + true + + + + ЗаполнитьКалендарь + + + true + Auto + Auto + + + ЗаполнитьПоКалендарю + + <key>ru</key> + <value>Заполнить по календарю</value> + + 2 + + ru + Заполнить календарь за указанный на форме год по выбранному календарю + + + true + + + + ЗаполнитьПоКалендарю + + + true + Auto + Auto + + + + + 0 + + + + + + + + OnWriteAtServer + ПриЗаписиНаСервере + + +
diff --git a/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..b45002881 --- /dev/null +++ b/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,189 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ + +// Функция читает данные календарного графика за указанный год +// +&НаСервереБезКонтекста +Функция ПрочитатьКалендарныйГрафик(Календарь, НомерГода) + + Возврат Справочники.Календари.ПрочитатьДанныеГрафикаИзРегистра(Календарь, НомерГода); + +КонецФункции + +// Процедура записывает данные календарного графика за указанный год +// +&НаСервере +Процедура ЗаписатьКалендарныйГрафик(Знач НомерГода, Знач ТекущийОбъект = Неопределено) + + Если ТекущийОбъект = Неопределено Тогда + ТекущийОбъект = РеквизитФормыВЗначение("Объект"); + КонецЕсли; + + Справочники.Календари.ЗаписатьДанныеГрафикаВРегистр(ТекущийОбъект.Ссылка, НомерГода, ТаблицаРегистра); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +// Процедура - обработчик события "ПриСозданииНаСервере" формы +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + НомерТекущегоГода = Год(ТекущаяДата()); + НомерПредыдущегоГода = НомерТекущегоГода; + + Элементы.Календарь.НачалоПериодаОтображения = Дата(НомерТекущегоГода, 1, 1); + Элементы.Календарь.КонецПериодаОтображения = Дата(НомерТекущегоГода, 12, 31); + + Если Не ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда + СсылкаНаКалендарь = Объект.Ссылка; + Иначе + СсылкаНаКалендарь = Параметры.ЗначениеКопирования; + КонецЕсли; + + ТаблицаРегистра.ЗагрузитьЗначения(Справочники.Календари.ПрочитатьДанныеГрафикаИзРегистра(СсылкаНаКалендарь, НомерТекущегоГода)); + +КонецПроцедуры + +// Процедура - обработчик события "ПриЗаписиНаСервере" формы +// +&НаСервере +Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + Перем НомерГода; + + Если Не ПараметрыЗаписи.Свойство("НомерГода", НомерГода) Тогда + НомерГода = НомерТекущегоГода; + КонецЕсли; + + ЗаписатьКалендарныйГрафик(НомерГода, ТекущийОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаВыбора(РезультатВыбора, ИсточникВыбора) + + Если ТипЗнч(РезультатВыбора) = Тип("СправочникСсылка.Календари") Тогда + ТаблицаРегистра.ЗагрузитьЗначения(ПрочитатьКалендарныйГрафик(РезультатВыбора, НомерТекущегоГода)); + + Элементы.Календарь.Обновить(); + КонецЕсли; + + Возврат; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ДЕЙСТВИЯ КОМАНДНЫХ ПАНЕЛЕЙ ФОРМЫ + +// Процедура - обработчик действия команды "ЗаполнитьКалендарь" +// +&НаКлиенте +Процедура ЗаполнитьКалендарь() + + ТаблицаРегистра.Очистить(); + + Для Месяц = 1 По 12 Цикл + Для НомерДня = 1 По День(КонецМесяца(Дата(НомерТекущегоГода, Месяц, 1))) Цикл + ДатаКалендаря = Дата(НомерТекущегоГода, Месяц, НомерДня); + + Если ДеньНедели(ДатаКалендаря) = 6 Или ДеньНедели(ДатаКалендаря) = 7 Тогда + Продолжить; + КонецЕсли; + + ТаблицаРегистра.Добавить(ДатаКалендаря); + КонецЦикла; + КонецЦикла; + + Элементы.Календарь.Обновить(); + +КонецПроцедуры + +// Процедура - обработчик действия команды "ЗаполнитьПоКалендарю" +// +&НаКлиенте +Процедура ЗаполнитьПоКалендарю(Команда) + + ОткрытьФорму("Справочник.Календари.ФормаВыбора", , ЭтаФорма, КлючУникальности); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +// Процедура - обработчик события "ПриИзменении" элемента формы "НомерТекущегоГода" +// +&НаКлиенте +Процедура НомерТекущегоГодаПриИзменении(Элемент) + + Если НомерТекущегоГода < 1900 Тогда + НомерТекущегоГода = НомерПредыдущегоГода; + Возврат; + КонецЕсли; + + Если Модифицированность Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Записать измененные данные за %1 год?'"), Формат(НомерПредыдущегоГода, "ЧГ=0")); + + Если Вопрос(ТекстСообщения, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда + Если Объект.Ссылка.Пустая() Тогда + Записать(Новый Структура("НомерГода", НомерПредыдущегоГода)); + Иначе + ЗаписатьКалендарныйГрафик(НомерПредыдущегоГода); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + НомерПредыдущегоГода = НомерТекущегоГода; + + Элементы.Календарь.НачалоПериодаОтображения = Дата(НомерТекущегоГода, 1, 1); + Элементы.Календарь.КонецПериодаОтображения = Дата(НомерТекущегоГода, 12, 31); + + ТаблицаРегистра.ЗагрузитьЗначения(ПрочитатьКалендарныйГрафик(Объект.Ссылка, НомерТекущегоГода)); + + Модифицированность = Ложь; + + Элементы.Календарь.Обновить(); + +КонецПроцедуры + +// Процедура - обработчик события "ПриВыводеПериода" элемента формы "Календарь" +// +&НаКлиенте +Процедура КалендарьПриВыводеПериода(Элемент, ОформлениеПериода) + + Для Каждого СтрокаОформленияПериода Из ОформлениеПериода.Даты Цикл + СтрокаТаблицыРегистра = ТаблицаРегистра.НайтиПоЗначению(СтрокаОформленияПериода.Дата); + + Если СтрокаТаблицыРегистра = Неопределено Тогда + СтрокаОформленияПериода.ЦветТекста = WebЦвета.Красный; + Иначе + СтрокаОформленияПериода.ЦветТекста = WebЦвета.Черный; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Процедура - обработчик события "Выбор" элемента формы "Календарь" +// +&НаКлиенте +Процедура КалендарьВыбор(Элемент, ВыбраннаяДата) + + СтрокаТаблицыРегистра = ТаблицаРегистра.НайтиПоЗначению(ВыбраннаяДата); + + Если СтрокаТаблицыРегистра = Неопределено Тогда + ТаблицаРегистра.Добавить(ВыбраннаяДата); + Иначе + ТаблицаРегистра.Удалить(СтрокаТаблицыРегистра); + КонецЕсли; + + Если Не Модифицированность Тогда + Модифицированность = Истина; + КонецЕсли; + + Элемент.Обновить(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ diff --git a/SSL/src/Catalogs/Календари/ManagerModule.bsl b/SSL/src/Catalogs/Календари/ManagerModule.bsl new file mode 100644 index 000000000..bdd9afcb0 --- /dev/null +++ b/SSL/src/Catalogs/Календари/ManagerModule.bsl @@ -0,0 +1,72 @@ +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Функция читает данные календаря из регистра +// +// Параметры +// Календарь - Ссылка на текущий элемент справочника +// НомерГода - Номер года, за который необходимо прочитать календарь +// +// Возвращаемое значение +// СписокЗначений - список значений, в котором хранятся даты, входящие в календарь +// +Функция ПрочитатьДанныеГрафикаИзРегистра(Календарь, НомерГода) Экспорт + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Календарь", Календарь); + Запрос.УстановитьПараметр("ТекущийГод", НомерГода); + Запрос.Текст = + "ВЫБРАТЬ + | КалендарныеГрафики.ДатаГрафика КАК ДатаКалендаря + |ИЗ + | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики + |ГДЕ + | КалендарныеГрафики.Календарь = &Календарь + | И КалендарныеГрафики.Год = &ТекущийГод + | И КалендарныеГрафики.ДеньВключенВГрафик"; + + Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ДатаКалендаря"); + +КонецФункции + +// Процедура записывает данные графика в регистр +// +// Параметры +// Календарь - Ссылка на текущий элемент справочника +// НомерГода - Номер года, за который необходимо записать календарь +// СписокДат - список значений, в котором указано, какие даты входят в календарь +// +// Возвращаемое значение +// Нет +// +Процедура ЗаписатьДанныеГрафикаВРегистр(Календарь, НомерГода, СписокДат) Экспорт + + НаборЗаписей = РегистрыСведений.КалендарныеГрафики.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Календарь.Установить(Календарь); + НаборЗаписей.Отбор.Год.Установить(НомерГода); + + КоличествоРабочихДнейСНачалаГода = 0; + + Для НомерМесяца = 1 По 12 Цикл + Для НомерДня = 1 По День(КонецМесяца(Дата(НомерГода, НомерМесяца, 1))) Цикл + ДатаГрафика = Дата(НомерГода, НомерМесяца, НомерДня); + + СтрокаТаблицыРегистра = СписокДат.НайтиПоЗначению(ДатаГрафика); + + Если СтрокаТаблицыРегистра <> Неопределено Тогда + КоличествоРабочихДнейСНачалаГода = КоличествоРабочихДнейСНачалаГода + 1; + КонецЕсли; + + Строка = НаборЗаписей.Добавить(); + Строка.Календарь = Календарь; + Строка.Год = НомерГода; + Строка.ДатаГрафика = ДатаГрафика; + Строка.ДеньВключенВГрафик = СтрокаТаблицыРегистра <> Неопределено; + Строка.КоличествоДнейВГрафикеСНачалаГода = КоличествоРабочихДнейСНачалаГода; + КонецЦикла; + КонецЦикла; + + НаборЗаписей.Записать(Истина); + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/Календари/ObjectModule.bsl b/SSL/src/Catalogs/Календари/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Catalogs/Календари/Календари.mdo b/SSL/src/Catalogs/Календари/Календари.mdo new file mode 100644 index 000000000..b2fefe940 --- /dev/null +++ b/SSL/src/Catalogs/Календари/Календари.mdo @@ -0,0 +1,123 @@ + + + + + + + + + + Календари + + ru + Календари + + true + Catalog.Календари.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + Managed + Use + + ru + Календарь + + + ru + Календари работы логистических центров, складов, поставщиков и покупателей. + + true + 2 + true + 100 + String + AsDescription + InDialog + BothWays + Catalog.Календари.Form.ФормаЭлемента + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/Attributes/ДеревоСвойств/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/Attributes/ДеревоСвойств/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..fd24cca66 --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/Attributes/ДеревоСвойств/ExtInfo/ListSettings.dcss @@ -0,0 +1,45 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + + + + Ref + + + + + Выбран + Equal + true + + + + + false + ЦветФона + web:Linen + + + false + ЦветТекста + web:LightGray + + + Шрифт + + + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/ConditionalAppearance.dcssca b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/ConditionalAppearance.dcssca new file mode 100644 index 000000000..cb65743f8 --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/ConditionalAppearance.dcssca @@ -0,0 +1,23 @@ + + + + + + ДеревоСвойствСсылка + + + + + ДеревоСвойств.Выбран + Equal + true + + + + + Шрифт + + + + + diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/Form.form b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/Form.form new file mode 100644 index 000000000..1a218b09f --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/Form.form @@ -0,0 +1,582 @@ + + + + ДеревоСвойств + 2 + true + true + + true + + + ДеревоСвойств + + true + false + None + + ДеревоСвойствСсылка + 16 + true + true + + true + + + ДеревоСвойств.Ref + + + ДеревоСвойствСсылкаРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ДеревоСвойствСсылкаКонтекстноеМеню + 17 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ДеревоСвойствКоманднаяПанель + 4 + + ДобавитьСвойство + 7 + true + true + + true + + false + + ДобавитьСвойствоРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Form.Command.ДобавитьСвойствоВНабор + Auto + true + true + true + UserCmds + Auto + + + Создать + 8 + true + true + + true + + false + + СоздатьРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.Item.ДеревоСвойств.StandardCommand.Create + Normal + Auto + true + true + UserCmds + Auto + + + СоздатьГруппу + 9 + true + true + + true + + false + + СоздатьГруппуРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + Form.Item.ДеревоСвойств.StandardCommand.CreateFolder + Normal + Auto + true + true + UserCmds + Auto + + + Изменить + 10 + true + true + + true + + false + + ИзменитьРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Form.Item.ДеревоСвойств.StandardCommand.Change + Normal + Auto + true + true + UserCmds + Auto + + + Скопировать + 11 + true + true + + true + + false + + СкопироватьРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + Form.Item.ДеревоСвойств.StandardCommand.Copy + Normal + Auto + true + true + UserCmds + Auto + + + ДеревоСвойствСправка + 19 + true + true + + true + + + ДеревоСвойствСправкаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + ДеревоСвойствВыбор + + + BeforeAddRow + ДеревоСвойствПередНачаломДобавления + + + OnActivateRow + ДеревоСвойствПриАктивизацииСтроки + + + BeforeRowChange + ДеревоСвойствПередНачаломИзменения + + + ДеревоСвойствСтрокаПоиска + 27 + + ДеревоСвойствСтрокаПоискаРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ДеревоСвойствСтрокаПоискаКонтекстноеМеню + 28 + true + + ДеревоСвойств + + true + + + + ДеревоСвойствСостояниеПросмотра + 30 + + ДеревоСвойствСостояниеПросмотраРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ДеревоСвойствСостояниеПросмотраКонтекстноеМеню + 31 + true + + ViewStatusAddition + ДеревоСвойств + + true + + + + ДеревоСвойствУправлениеПоиском + 33 + + ДеревоСвойствУправлениеПоискомРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ДеревоСвойствУправлениеПоискомКонтекстноеМеню + 34 + true + + SearchControlAddition + ДеревоСвойств + + true + + + + ДеревоСвойствРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ДеревоСвойствКонтекстноеМеню + 3 + true + + Tree + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + true + + ДеревоСвойств.DefaultPicture + + + CommonPicture.ДополнительныеРеквизитыСведения + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + + + + Комментарий + 12 + true + true + + true + + + Комментарий + + Top + + КомментарийРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 13 + true + + InputField + true + Enter + true + Left + true + + true + 2 + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ДеревоСвойств + + <key>ru</key> + <value>Дерево свойств</value> + + 1 + + DynamicList + + + true + + + true + + + ДеревоСвойств.Выбран + + + ДеревоСвойств.Комментарий + + + ДеревоСвойств.НомерКартинкиСведения + + + ВЫБРАТЬ + Основная.Ссылка, + ВЫБОР + КОГДА Основная.Ссылка В (&масВыбранных) + ТОГДА ИСТИНА + ИНАЧЕ ЛОЖЬ + КОНЕЦ КАК Выбран, + ВЫБОР + КОГДА Основная.ЭтоГруппа + ТОГДА 0 + КОГДА Основная.ЭтоДополнительноеСведение + ТОГДА 2 + ИНАЧЕ 1 + КОНЕЦ + ВЫБОР + КОГДА Основная.ПометкаУдаления + ТОГДА 3 + ИНАЧЕ 0 + КОНЕЦ КАК НомерКартинкиСведения, + Основная.ЭтоГруппа, + Основная.Комментарий КАК Комментарий, + Основная.ЭтоДополнительноеСведение КАК ЭтоДополнительноеСведение +ИЗ + ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Основная + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения + true + true + true + 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 + + ValueList + + + true + + + true + + + + + + + ДобавитьСвойствоВНабор + + <key>ru</key> + <value>Добавить в набор</value> + + 1 + + ru + Добавить доп.реквизит/сведение в набор + + + true + + + + ДобавитьСвойствоВНабор + + + TextPicture + Auto + Auto + + + МассивВыбранных + + + + ЭтоДополнительноеСведение + + Boolean + + + + + + + diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/Module.bsl b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/Module.bsl new file mode 100644 index 000000000..35a9f8b5d --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ПодборСвойств/Module.bsl @@ -0,0 +1,170 @@ +//////////////////////////////////////////////////////////////////////////////// +// Процедуры - обработчики событий формы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СписокВыбранных.ЗагрузитьЗначения(Параметры.МасВыбранных); + + ЭтоДополнительноеСведение = Параметры.ЭтоДополнительноеСведение; + + Если ЭтоДополнительноеСведение Тогда + Заголовок = НСтр("ru = 'Подбор дополнительных сведений'"); + Иначе + Заголовок = НСтр("ru = 'Подбор дополнительных реквизитов'"); + КонецЕсли; + + ДеревоСвойств.Параметры.УстановитьЗначениеПараметра("масВыбранных", Параметры.МасВыбранных); + + ЭлементОтбора = ДеревоСвойств.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЭтоДополнительноеСведение"); + + Если ЭтоДополнительноеСведение Тогда + ЭлементОтбора.ПравоеЗначение = Истина; + Иначе + ЭлементОтбора.ПравоеЗначение = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + УстановитьКомментарий(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ЗаписаноДополнительноеСвойство" Тогда + + Элементы.ДеревоСвойств.Обновить(); + + ТекущиеДанные = Элементы.ДеревоСвойств.ТекущиеДанные; + Если ТекущиеДанные <> Неопределено И ТекущиеДанные.Ссылка = Источник Тогда + Комментарий = Параметр.Комментарий; + КонецЕсли; + + ИначеЕсли ИмяСобытия = "ИзменилсяНаборВыбранных" И Источник = ЭтаФорма.ВладелецФормы Тогда + Для Каждого Элемент Из Параметр.МассивСвойств Цикл + Найденное = СписокВыбранных.НайтиПоЗначению(Элемент); + Если Параметр.Операция = "Добавление" И Найденное = Неопределено Тогда + СписокВыбранных.Добавить(Элемент); + ИначеЕсли Параметр.Операция = "Удаление" И Найденное <> Неопределено Тогда + СписокВыбранных.Удалить(Найденное); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ДеревоСвойств.Параметры.УстановитьЗначениеПараметра("масВыбранных", СписокВыбранных.ВыгрузитьЗначения()); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры - обработчики событий табличной части формы + +&НаКлиенте +Процедура ДеревоСвойствПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + // Для групп оставим стандартную обработку + Если Группа = Истина Тогда + Возврат; + ИначеЕсли Копирование И (Элементы.ДеревоСвойств.ТекущиеДанные.НомерКартинкиСведения % 3 = 0) Тогда + Возврат; + КонецЕсли; + + Отказ = Истина; + ПараметрыОткрытия = Новый Структура; + + ПараметрыОткрытия.Вставить("ОткрываетсяИзНабораСвойств", Истина); + + Если Копирование Тогда + ПараметрыОткрытия.Вставить("Копируемый", Элементы.ДеревоСвойств.ТекущаяСтрока); + Иначе + ПараметрыОткрытия.Вставить("Родитель", Родитель); + ПараметрыОткрытия.Вставить("ЭтоДополнительноеСведение", ЭтоДополнительноеСведение); + КонецЕсли; + + ОткрытьФорму("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Форма.ФормаЭлемента", ПараметрыОткрытия); + +КонецПроцедуры + +&НаКлиенте +Процедура ДеревоСвойствПередНачаломИзменения(Элемент, Отказ) + + Отказ = Истина; + Если Элементы.ДеревоСвойств.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + Если (Элементы.ДеревоСвойств.ТекущиеДанные.НомерКартинкиСведения % 3 = 0) Тогда + ИмяФормыПВХ = "ФормаГруппы"; + Иначе + ИмяФормыПВХ = "ФормаЭлемента"; + КонецЕсли; + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("Ключ", Элементы.ДеревоСвойств.ТекущаяСтрока); + ПараметрыОткрытия.Вставить("ОткрываетсяИзНабораСвойств", Истина); + ОткрытьФорму("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Форма." + ИмяФормыПВХ, ПараметрыОткрытия); + +КонецПроцедуры + +&НаКлиенте +Процедура ДеревоСвойствПриАктивизацииСтроки(Элемент) + + УстановитьКомментарий(); + +КонецПроцедуры + +&НаКлиенте +Процедура ДеревоСвойствВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ВыполнитьПодборСвойств(); + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьСвойствоВНабор(Команда) + + ВыполнитьПодборСвойств(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьПодборСвойств() + + Если Элементы.ДеревоСвойств.ВыделенныеСтроки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + МасДобавляемыеСвойства = Новый Массив; + + Для Каждого ВыделенаяСтрока ИЗ Элементы.ДеревоСвойств.ВыделенныеСтроки Цикл + Свойство = Элементы.ДеревоСвойств.ДанныеСтроки(ВыделенаяСтрока).Ссылка; + МасДобавляемыеСвойства.Добавить(Свойство); + КонецЦикла; + + Результат = Новый Структура("ЭтоДополнительноеСведение, МассивДобавляемых", + ЭтоДополнительноеСведение, + МасДобавляемыеСвойства); + + Оповестить("ПодборСвойствВНабор", Результат); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Служебные процедуры и функции + +&НаКлиенте +Процедура УстановитьКомментарий() + + Если Элементы.ДеревоСвойств.ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Комментарий = Элементы.ДеревоСвойств.ТекущиеДанные.Комментарий; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Form.form new file mode 100644 index 000000000..e8ff64207 --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Form.form @@ -0,0 +1,239 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + Copy + Create + CreateFolder + Delete + MoveItem + + Наименование + 4 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 7 + + СписокСтрокаПоискаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 8 + true + + Список + + true + + + + СписокСостояниеПросмотра + 10 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 11 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 13 + + СписокУправлениеПоискомРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 14 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
+ None + false + + ФормаКоманднаяПанель + -1 + Left + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.НаборыДополнительныхРеквизитовИСведений + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаГруппы/Form.form b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаГруппы/Form.form new file mode 100644 index 000000000..ce668ba34 --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаГруппы/Form.form @@ -0,0 +1,512 @@ + + + + Наименование + 1 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 2 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ДополнительныеРеквизиты + 10 + true + true + + true + + + Объект.ДополнительныеРеквизиты + + Top + + НомерСтроки + 13 + true + true + + true + + + Объект.ДополнительныеРеквизиты.LineNumber + + + НомерСтрокиРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + НомерСтрокиКонтекстноеМеню + 14 + true + + LabelField + Auto + true + Left + true + + true + true + + + + Свойство + 15 + true + true + + true + + + Объект.ДополнительныеРеквизиты.Свойство + + + СвойствоРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + СвойствоКонтекстноеМеню + 16 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + ДополнительныеРеквизитыКоманднаяПанель + 12 + Left + true + + + ДополнительныеРеквизитыСтрокаПоиска + 27 + + ДополнительныеРеквизитыСтрокаПоискаРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ДополнительныеРеквизитыСтрокаПоискаКонтекстноеМеню + 28 + true + + ДополнительныеРеквизиты + + true + + + + ДополнительныеРеквизитыСостояниеПросмотра + 30 + + ДополнительныеРеквизитыСостояниеПросмотраРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ДополнительныеРеквизитыСостояниеПросмотраКонтекстноеМеню + 31 + true + + ViewStatusAddition + ДополнительныеРеквизиты + + true + + + + ДополнительныеРеквизитыУправлениеПоиском + 33 + + ДополнительныеРеквизитыУправлениеПоискомРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ДополнительныеРеквизитыУправлениеПоискомКонтекстноеМеню + 34 + true + + SearchControlAddition + ДополнительныеРеквизиты + + true + + + + ДополнительныеРеквизитыРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ДополнительныеРеквизитыКонтекстноеМеню + 11 + true + + HierarchicalList + 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 + +
+ + ДополнительныеСведения + 17 + true + true + + true + + + Объект.ДополнительныеСведения + + Top + + НомерСтроки1 + 20 + true + true + + true + + + Объект.ДополнительныеСведения.LineNumber + + + НомерСтроки1РасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + НомерСтроки1КонтекстноеМеню + 21 + true + + LabelField + Auto + true + Left + true + + true + true + + + + Свойство1 + 22 + true + true + + true + + + Объект.ДополнительныеСведения.Свойство + + + Свойство1РасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + Свойство1КонтекстноеМеню + 23 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + ДополнительныеСведенияКоманднаяПанель + 19 + Left + true + + + ДополнительныеСведенияСтрокаПоиска + 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 + + + + ДополнительныеСведенияКонтекстноеМеню + 18 + true + + HierarchicalList + 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 + +
+ + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + Write + WriteAndClose + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.НаборыДополнительныхРеквизитовИСведений + + + true + + + true + +
true
+ true +
+ + + + + + Folders + +
diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаГруппы/Module.bsl b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаГруппы/Module.bsl new file mode 100644 index 000000000..9bdf4620e --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаГруппы/Module.bsl @@ -0,0 +1,18 @@ +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Перем ПерваяЧастьИмени, ВтораяЧастьИмени; + + ТолькоПросмотр = Истина; + + Справочники.НаборыДополнительныхРеквизитовИСведений.ПолучитьЧастиИмени(Объект.Ссылка, ПерваяЧастьИмени, ВтораяЧастьИмени); + + Если НЕ Справочники.НаборыДополнительныхРеквизитовИСведений.ИспользуютсяДопРеквизиты(ПерваяЧастьИмени, ВтораяЧастьИмени) Тогда + Элементы.ДополнительныеРеквизиты.Видимость = Ложь; + КонецЕсли; + + Если НЕ Справочники.НаборыДополнительныхРеквизитовИСведений.ИспользуютсяДопСведения(ПерваяЧастьИмени, ВтораяЧастьИмени) Тогда + Элементы.ДополнительныеСведения.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..adb6c31a7 --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Form.form @@ -0,0 +1,244 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + Copy + Create + Delete + MoveItem + SetDeletionMark + + Наименование + 4 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 7 + + СписокСтрокаПоискаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 8 + true + + Список + + true + + + + СписокСостояниеПросмотра + 10 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 11 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 13 + + СписокУправлениеПоискомРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 14 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.DefaultPicture + + + Style.BorderColor + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
+ Top + true + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.НаборыДополнительныхРеквизитовИСведений + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..dc8854946 --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,897 @@ + + + + Наименование + 1 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТаблицыСвойств + 71 + + ТабРеквизиты + 22 + + <key>ru</key> + <value>Дополнительные реквизиты</value> + + + true + true + + true + + + ТабРеквизиты + + false + Top + Add + CancelSearch + Change + Copy + EndEdit + Find + SelectAll + + Свойство1 + 25 + true + true + + true + + + ТабРеквизиты.Свойство + + + Свойство1РасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + Свойство1КонтекстноеМеню + 26 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТабРеквизитыКоманднаяПанель + 24 + + ТабРеквизитыПодборДопРеквизитов + 69 + true + true + + true + + + ТабРеквизитыПодборДопРеквизитовРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + Form.Command.ПодборДопРеквизитов + Normal + Auto + true + true + UserCmds + Auto + + + Удалить + 60 + true + true + + true + + false + + УдалитьРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + Form.Item.ТабРеквизиты.StandardCommand.Delete + Normal + PictureAndText + true + true + UserCmds + Auto + + + ПереместитьВверх + 61 + true + true + + true + + false + + ПереместитьВверхРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + Form.Item.ТабРеквизиты.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + ПереместитьВниз + 62 + true + true + + true + + false + + ПереместитьВнизРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + Form.Item.ТабРеквизиты.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + ТабРеквизитыВыбор + + + BeforeAddRow + ТабРеквизитыПередНачаломДобавления + + + BeforeDeleteRow + ТабРеквизитыПередУдалением + + + ТабРеквизитыСтрокаПоиска + 80 + + ТабРеквизитыСтрокаПоискаРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + ТабРеквизитыСтрокаПоискаКонтекстноеМеню + 81 + true + + ТабРеквизиты + + true + + + + ТабРеквизитыСостояниеПросмотра + 83 + + ТабРеквизитыСостояниеПросмотраРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + ТабРеквизитыСостояниеПросмотраКонтекстноеМеню + 84 + true + + ViewStatusAddition + ТабРеквизиты + + true + + + + ТабРеквизитыУправлениеПоиском + 86 + + ТабРеквизитыУправлениеПоискомРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + ТабРеквизитыУправлениеПоискомКонтекстноеМеню + 87 + true + + SearchControlAddition + ТабРеквизиты + + true + + + + ТабРеквизитыРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ТабРеквизитыКонтекстноеМеню + 23 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + None + None + None + true + + + + ТабСведения + 27 + + <key>ru</key> + <value>Дополнительные сведения</value> + + + true + true + + true + + + ТабСведения + + false + Top + Add + CancelSearch + Change + Copy + EndEdit + Find + + Свойство2 + 30 + true + true + + true + + + ТабСведения.Свойство + + + Свойство2РасширеннаяПодсказка + 113 + Label + true + true + + Left + + + + Свойство2КонтекстноеМеню + 31 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТабСведенияКоманднаяПанель + 29 + + ТабСведенияПодборДопСведений + 70 + true + true + + true + + + ТабСведенияПодборДопСведенийРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + Form.Command.ПодборДопСведений + Normal + Auto + true + true + UserCmds + Auto + + + Удалить1 + 63 + true + true + + true + + false + + Удалить1РасширеннаяПодсказка + 100 + Label + true + true + + Left + + + Form.Item.ТабСведения.StandardCommand.Delete + Normal + PictureAndText + true + true + UserCmds + Auto + + + ПереместитьВверх1 + 64 + true + true + + true + + false + + ПереместитьВверх1РасширеннаяПодсказка + 101 + Label + true + true + + Left + + + Form.Item.ТабСведения.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + ПереместитьВниз1 + 65 + true + true + + true + + false + + ПереместитьВниз1РасширеннаяПодсказка + 102 + Label + true + true + + Left + + + Form.Item.ТабСведения.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + ТабСведенияВыбор + + + BeforeAddRow + ТабСведенияПередНачаломДобавления + + + BeforeDeleteRow + ТабСведенияПередУдалением + + + ТабСведенияСтрокаПоиска + 104 + + ТабСведенияСтрокаПоискаРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + + ТабСведенияСтрокаПоискаКонтекстноеМеню + 105 + true + + ТабСведения + + true + + + + ТабСведенияСостояниеПросмотра + 107 + + ТабСведенияСостояниеПросмотраРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + ТабСведенияСостояниеПросмотраКонтекстноеМеню + 108 + true + + ViewStatusAddition + ТабСведения + + true + + + + ТабСведенияУправлениеПоиском + 110 + + ТабСведенияУправлениеПоискомРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + + ТабСведенияУправлениеПоискомКонтекстноеМеню + 111 + true + + SearchControlAddition + ТабСведения + + true + + + + ТабСведенияРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + + ТабСведенияКонтекстноеМеню + 28 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + None + None + None + true + + + true + true + + true + + + <key>ru</key> + <value>Таблицы свойств</value> + + + ru + Таблицы свойств + + + ТаблицыСвойствРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.НаборыДополнительныхРеквизитовИСведений + + + true + + + true + +
true
+ true +
+ + ТабРеквизиты + + <key>ru</key> + <value>Таб реквизиты</value> + + 3 + + ValueTable + + + true + + + true + + true + + Свойство + + <key>ru</key> + <value>Свойство</value> + + 1 + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + true + + + true + + + + + ТабСведения + + <key>ru</key> + <value>Таб сведения</value> + + 4 + + ValueTable + + + true + + + true + + true + + Свойство + + <key>ru</key> + <value>Свойство</value> + + 1 + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + 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> + + 8 + + Boolean + + + true + + + true + + + + ПодборДопРеквизитов + + <key>ru</key> + <value>Подбор</value> + + 1 + + ru + Подбор доп реквизитов + + + true + + + + ПодборДопРеквизитов + + + Auto + Auto + + + ПодборДопСведений + + <key>ru</key> + <value>Подбор</value> + + 2 + + ru + Подбор доп сведений + + + true + + + + ПодборДопСведений + + + Auto + Auto + + + + + + + + AfterWrite + ПослеЗаписи + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + +
diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..f69652cfb --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,369 @@ +//////////////////////////////////////////////////////////////////////////////// +// Процедуры - обработчики событий формы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ////////////////////////////////////////////////////////////////////////////// + // Поддержка раздельной настройки доп. реквизитов и доп. сведений + // + + Перем ПерваяЧастьИмени, ВтораяЧастьИмени; + + Если Объект.Предопределенный Тогда + Элементы.Наименование.ТолькоПросмотр = Истина; + КонецЕсли; + + Если Объект.Ссылка.Предопределенный И Объект.Ссылка.Родитель = Справочники.НаборыДополнительныхРеквизитовИСведений.ПустаяСсылка() Тогда + СсылкаПредопределенного = Объект.Ссылка; + Иначе + СсылкаПредопределенного = Объект.Ссылка.Родитель; + КонецЕсли; + + Если СсылкаПредопределенного = Справочники.НаборыДополнительныхРеквизитовИСведений.ПустаяСсылка() Тогда + ВызватьИсключение НСтр("ru = 'Не найден владелец свойств!'"); + КонецЕсли; + + Справочники.НаборыДополнительныхРеквизитовИСведений.ПолучитьЧастиИмени(СсылкаПредопределенного, ПерваяЧастьИмени, ВтораяЧастьИмени); + ИспользоватьДопРеквизиты = Справочники.НаборыДополнительныхРеквизитовИСведений.ИспользуютсяДопРеквизиты(ПерваяЧастьИмени, ВтораяЧастьИмени); + ИспользоватьДопСведения = Справочники.НаборыДополнительныхРеквизитовИСведений.ИспользуютсяДопСведения(ПерваяЧастьИмени, ВтораяЧастьИмени); + + Если НЕ ИспользоватьДопРеквизиты И НЕ ИспользоватьДопСведения Тогда + Отказ = Истина; + ВызватьИсключение НСтр("ru = 'Использование свойств не определено!'"); + КонецЕсли; + + Если НЕ ИспользоватьДопРеквизиты Тогда + Элементы.ТабРеквизиты.Видимость = Ложь; + Элементы.ТабСведения.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + ИначеЕсли НЕ ИспользоватьДопСведения Тогда + Элементы.ТабСведения.Видимость = Ложь; + Элементы.ТабРеквизиты.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + КонецЕсли; + + Если ИспользоватьДопРеквизиты Тогда + Для Каждого ДополнительныйРеквизит Из Объект.ДополнительныеРеквизиты Цикл + Если НЕ ДополнительныйРеквизит.Свойство.ЭтоДополнительноеСведение Тогда + ТабРеквизиты.Добавить().Свойство = ДополнительныйРеквизит.Свойство; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если ИспользоватьДопСведения Тогда + Для Каждого ДополнительноеСведение Из Объект.ДополнительныеСведения Цикл + Если ДополнительноеСведение.Свойство.ЭтоДополнительноеСведение Тогда + ТабСведения.Добавить().Свойство = ДополнительноеСведение.Свойство; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + // + ////////////////////////////////////////////////////////////////////////////// + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект) + + ТекущийОбъект.ДополнительныеРеквизиты.Очистить(); + ТекущийОбъект.ДополнительныеСведения.Очистить(); + + Если ИспользоватьДопРеквизиты Тогда + Для Каждого ДополнительныйРеквизит Из ТабРеквизиты Цикл + ТекущийОбъект.ДополнительныеРеквизиты.Добавить().Свойство = ДополнительныйРеквизит.Свойство; + КонецЦикла; + КонецЕсли; + + Если ИспользоватьДопСведения Тогда + Для каждого ДополнительноеСведение Из ТабСведения Цикл + ТекущийОбъект.ДополнительныеСведения.Добавить().Свойство = ДополнительноеСведение.Свойство; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + Оповестить("ИзмененНаборСвойств", Объект.Ссылка); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + ///////////////////////////////////////////////////////// + // При записи свойства необходимо перенести свойство в + // соответствующую группу и обновить поле комментария, + // при необходимости + + Если ИмяСобытия = "ЗаписаноДополнительноеСвойство" Тогда + ПроверитьСоставыТаблицПослеЗаписиСвойства(Параметр.ЭтоДополнительноеСведение, Источник); + + ИначеЕсли ИмяСобытия = "ПодборСвойствВНабор" Тогда + + МассивДобавляемых = Новый Массив; + + Если Параметр.ЭтоДополнительноеСведение Тогда + Таблица = ТабСведения; + Иначе + Таблица = ТабРеквизиты + КонецЕсли; + + Для Каждого Добавляемый Из Параметр.МассивДобавляемых Цикл + Отбор = Новый Структура("Свойство", Добавляемый); + Если Таблица.НайтиСтроки(Отбор).Количество() = 0 Тогда + МассивДобавляемых.Добавить(Добавляемый); + КонецЕсли; + КонецЦикла; + + Если МассивДобавляемых.Количество() > 0 Тогда + ДобавитьСвойства(МассивДобавляемых); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры - обработчики команд табличных частей формы + +&НаКлиенте +Процедура ТабРеквизитыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + Отказ = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура ТабСведенияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + Отказ = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура ТабРеквизитыПередУдалением(Элемент, Отказ) + + ТабСвойстваПередУдалением(Элемент, ТабРеквизиты); + +КонецПроцедуры + +&НаКлиенте +Процедура ТабСведенияПередУдалением(Элемент, Отказ) + + ТабСвойстваПередУдалением(Элемент, ТабСведения); + +КонецПроцедуры + +&НаКлиенте +Процедура ТабСвойстваПередУдалением(Элемент, ТаблицаСвойств) + + МассивУдаляемыхСвойств = Новый Массив; + + Для Каждого ВыдСтрока Из Элемент.ВыделенныеСтроки Цикл + Свойство = Элемент.ДанныеСтроки(ВыдСтрока).Свойство; + МассивУдаляемыхСвойств.Добавить(Свойство); + Строки = ТаблицаСвойств.НайтиСтроки(Новый Структура("Свойство", Свойство)); + ТаблицаСвойств.Удалить(Строки[0]); + КонецЦикла; + + Если МассивУдаляемыхСвойств.Количество() > 0 Тогда + ОповеститьОбИзмененииНабора("Удаление", МассивУдаляемыхСвойств); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ТабСведенияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ТаблицаВыбор(Элемент, ВыбраннаяСтрока, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ТабРеквизитыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ТаблицаВыбор(Элемент, ВыбраннаяСтрока, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ПодборДопРеквизитов(Команда) + ВызватьФормуПодбора(Ложь); +КонецПроцедуры + +&НаКлиенте +Процедура ПодборДопСведений(Команда) + ВызватьФормуПодбора(Истина); +КонецПроцедуры + +&НаКлиенте +Процедура ВызватьФормуПодбора(ЭтоДополнительноеСведение) + + СтруктрураПараметров = Новый Структура; + СтруктрураПараметров.Вставить("ЭтоДополнительноеСведение", ЭтоДополнительноеСведение); + + МасВыбранных = Новый Массив; + + Если ЭтоДополнительноеСведение Тогда + Для Каждого ЭлементСтр Из ТабСведения Цикл + МасВыбранных.Добавить(ЭлементСтр.Свойство); + КонецЦикла; + Иначе + Для Каждого ЭлементСтр Из ТабРеквизиты Цикл + МасВыбранных.Добавить(ЭлементСтр.Свойство); + КонецЦикла; + КонецЕсли; + СтруктрураПараметров.Вставить("МасВыбранных", МасВыбранных); + + ОткрытьФорму("Справочник.НаборыДополнительныхРеквизитовИСведений.Форма.ПодборСвойств", СтруктрураПараметров, ЭтаФорма, УникальныйИдентификатор); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Служебные процедуры и функции + +&НаКлиенте +Процедура ОповеститьОбИзмененииНабора(Операция, МассивСвойств) + + Оповестить("ИзменилсяНаборВыбранных", + Новый Структура("Операция,МассивСвойств", + Операция, + МассивСвойств), + ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьСоставыТаблицПослеЗаписиСвойства(ЭтоДополнительноеСведение, ДопСвойствоСсылка) + + // Определим, из какой таблицы в какую возможно может потребоваться переносить доп. свойство + Если ЭтоДополнительноеСведение Тогда + Таблица1 = ТабСведения; + Таблица2 = ТабРеквизиты; + Иначе + Таблица1 = ТабРеквизиты; + Таблица2 = ТабСведения; + КонецЕсли; + + // Проверим, входит ли свойство в таблицу, из которой нужно переносить + Свойство = ДопСвойствоСсылка; + Строки = Таблица2.НайтиСтроки(Новый Структура("Свойство", Свойство)); + Если Строки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + // Удалим из одной таблицы + Индекс = Таблица2.Индекс(Строки[0]); + Таблица2.Удалить(Индекс); + + // Добавим в другую + новСтр = Таблица1.Добавить(); + новСтр.Свойство = Свойство; + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьСвойства(масДобавлять) + + масР = Новый Массив; + Для Каждого Стр Из ТабРеквизиты Цикл + масР.Добавить(Стр.Свойство); + КонецЦикла; + + масС = Новый Массив; + Для Каждого Стр Из ТабСведения Цикл + масС.Добавить(Стр.Свойство); + КонецЦикла; + + ОбщийМассивСвойств = Новый Массив; + + Если ПроизвестиДобавлениеВыделенныхСвойств(масДобавлять, масР, масС) Тогда + Модифицированность = Истина; + + Для Каждого Свойство Из масР Цикл + новСтр = ТабРеквизиты.Добавить(); + новСтр.Свойство = Свойство; + ОбщийМассивСвойств.Добавить(Свойство); + КонецЦикла; + + Для Каждого Свойство Из масС Цикл + новСтр = ТабСведения.Добавить(); + новСтр.Свойство = Свойство; + ОбщийМассивСвойств.Добавить(Свойство); + КонецЦикла; + + ОповеститьОбИзмененииНабора("Добавление", ОбщийМассивСвойств); + + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПроизвестиДобавлениеВыделенныхСвойств(масСсылок, масР, масС) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ДополнительныеРеквизитыИСведения.Ссылка КАК Свойство + |ПОМЕСТИТЬ Временная + |ИЗ + | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения + |ГДЕ + | (ДополнительныеРеквизитыИСведения.Ссылка В (&масР) + | ИЛИ ДополнительныеРеквизитыИСведения.Ссылка В (&масС)) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ДополнительныеРеквизитыИСведения.Ссылка, + | ДополнительныеРеквизитыИСведения.ЭтоДополнительноеСведение + |ИЗ + | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения + | ЛЕВОЕ СОЕДИНЕНИЕ Временная КАК Временная + | ПО ДополнительныеРеквизитыИСведения.Ссылка = Временная.Свойство + |ГДЕ + | ДополнительныеРеквизитыИСведения.Ссылка В ИЕРАРХИИ(&масСсылок) + | И (НЕ ДополнительныеРеквизитыИСведения.ЭтоГруппа) + | И Временная.Свойство ЕСТЬ NULL + | И (НЕ ДополнительныеРеквизитыИСведения.ПометкаУдаления) + | + |УПОРЯДОЧИТЬ ПО + | ДополнительныеРеквизитыИСведения.Наименование"; + + Запрос.УстановитьПараметр("масСсылок", масСсылок); + Запрос.УстановитьПараметр("масР", масР); + Запрос.УстановитьПараметр("масС", масС); + + Выборка = Запрос.Выполнить().Выбрать(); + + масР.Очистить(); + масС.Очистить(); + + Если Выборка.Количество() = 0 Тогда + Возврат Ложь; + КонецЕсли; + + Пока Выборка.Следующий() Цикл + + Если Выборка.ЭтоДополнительноеСведение Тогда + масС.Добавить(Выборка.Ссылка); + Иначе + масР.Добавить(Выборка.Ссылка); + КонецЕсли; + + КонецЦикла; + + Возврат Истина; + +КонецФункции + +&НаКлиенте +Процедура ТаблицаВыбор(Элемент, ВыбраннаяСтрока, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("ОткрываетсяИзНабораСвойств", Истина); + ПараметрыОткрытия.Вставить("Ключ", Элемент.ДанныеСтроки(ВыбраннаяСтрока).Свойство); + + ОткрытьФорму("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Форма.ФормаЭлемента", ПараметрыОткрытия); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Help/ru.html b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Help/ru.html new file mode 100644 index 000000000..e9bf51ffb --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Help/ru.html @@ -0,0 +1,7 @@ + +

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

+

Примечание:

+
+

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

+

См. также:

+ \ 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..52cfd041d --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl @@ -0,0 +1,35 @@ +Функция ИспользуютсяДопРеквизиты(ПерваяЧастьИмени, ВтораяЧастьИмени) Экспорт + + МетаданныеВладельцаСвойств = Метаданные.НайтиПоПолномуИмени(ПерваяЧастьИмени+"."+ВтораяЧастьИмени); + + Если МетаданныеВладельцаСвойств = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Если МетаданныеВладельцаСвойств.ТабличныеЧасти.Найти("ДополнительныеРеквизиты") = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +Функция ИспользуютсяДопСведения(ПерваяЧастьИмени, ВтораяЧастьИмени) Экспорт + + Если Метаданные.ОбщиеКоманды.Найти("ДополнительныеСведения") = Неопределено + ИЛИ НЕ Метаданные.ОбщиеКоманды.ДополнительныеСведения.ТипПараметраКоманды.СодержитТип(Тип(ПерваяЧастьИмени+"Ссылка."+ВтораяЧастьИмени)) Тогда + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +Процедура ПолучитьЧастиИмени(Ссылка, ПерваяЧастьИмени, ВтораяЧастьИмени) Экспорт + + ИмяПредопределенного = Справочники.НаборыДополнительныхРеквизитовИСведений.ПолучитьИмяПредопределенного(Ссылка); + Позиция = Найти(ИмяПредопределенного, "_"); + ПерваяЧастьИмени = Лев(ИмяПредопределенного, Позиция - 1); + ВтораяЧастьИмени = Прав(ИмяПредопределенного, СтрДлина(ИмяПредопределенного) - Позиция); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ObjectModule.bsl b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ObjectModule.bsl new file mode 100644 index 000000000..9d52add67 --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ObjectModule.bsl @@ -0,0 +1,104 @@ +Процедура ПередЗаписью(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если Не ЭтоГруппа Тогда + + // Удалим дубли и пустые строки + ВыбранныеСвойства = Новый Соответствие; + УдаляемыеСвойства = Новый Массив; + + // Дополнительные реквизиты + Для каждого ДополнительныйРеквизит Из ДополнительныеРеквизиты Цикл + + Если ДополнительныйРеквизит.Свойство.Пустая() ИЛИ ВыбранныеСвойства.Получить(ДополнительныйРеквизит.Свойство) <> Неопределено Тогда + + УдаляемыеСвойства.Добавить(ДополнительныйРеквизит); + + Иначе + + ВыбранныеСвойства.Вставить(ДополнительныйРеквизит.Свойство, Истина); + + КонецЕсли; + + КонецЦикла; + + Для каждого УдаляемоеСвойство Из УдаляемыеСвойства Цикл + + ДополнительныеРеквизиты.Удалить(УдаляемоеСвойство); + + КонецЦикла; + + ВыбранныеСвойства.Очистить(); + УдаляемыеСвойства.Очистить(); + + // Дополнительные сведения + Для каждого ДополнительноеСведение Из ДополнительныеСведения Цикл + + Если ДополнительноеСведение.Свойство.Пустая() ИЛИ ВыбранныеСвойства.Получить(ДополнительноеСведение.Свойство) <> Неопределено Тогда + + УдаляемыеСвойства.Добавить(ДополнительноеСведение); + + Иначе + + ВыбранныеСвойства.Вставить(ДополнительноеСведение.Свойство, Истина); + + КонецЕсли; + + КонецЦикла; + + Для каждого УдаляемоеСвойство Из УдаляемыеСвойства Цикл + + ДополнительныеСведения.Удалить(УдаляемоеСвойство); + + КонецЦикла; + + ИначеЕсли Предопределенный Тогда + + // Для корневого набора соберем все свойства связанных наборов + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Родитель", Ссылка); + + // Дополнительные реквизиты + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ДополнительныеРеквизиты.Свойство КАК Свойство + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК ДополнительныеРеквизиты + |ГДЕ + | ДополнительныеРеквизиты.Ссылка.Родитель = &Родитель + | И ДополнительныеРеквизиты.Свойство.ЭтоДополнительноеСведение = ЛОЖЬ"; + + ДополнительныеРеквизиты.Загрузить(Запрос.Выполнить().Выгрузить()); + + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ДополнительныеСведения.Свойство КАК Свойство + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения КАК ДополнительныеСведения + |ГДЕ + | ДополнительныеСведения.Ссылка.Родитель = &Родитель + | И ДополнительныеСведения.Свойство.ЭтоДополнительноеСведение = ИСТИНА"; + + ДополнительныеСведения.Загрузить(Запрос.Выполнить().Выгрузить()); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПриЗаписи() + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если ЗначениеЗаполнено(Родитель) Тогда + ОсновнойОбъект = Родитель.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(ОсновнойОбъект.Ссылка); + ОсновнойОбъект.Записать(); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/НаборыДополнительныхРеквизитовИСведений.mdo b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/НаборыДополнительныхРеквизитовИСведений.mdo new file mode 100644 index 000000000..7d0a6fdaf --- /dev/null +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/НаборыДополнительныхРеквизитовИСведений.mdo @@ -0,0 +1,266 @@ + + + + + + + + + + НаборыДополнительныхРеквизитовИСведений + + ru + Наборы дополнительных реквизитов и сведений + + true + Catalog.НаборыДополнительныхРеквизитовИСведений.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ru + Набор свойств + + + ru + Наименование набора свойств + + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + true + + + ru + + + Managed + Use + + ru + Набор дополнительных реквизитов и сведений + + + ru + Наборы дополнительных реквизитов и сведений + + true + 2 + true + 100 + String + AsDescription + + + Справочник_ПапкиФайлов + Доп. свойства справочника "Папки файлов" + + + + + + Справочник_Файлы + Доп. свойства справочника "Файлы" + + + + + + InDialog + BothWays + Catalog.НаборыДополнительныхРеквизитовИСведений.Form.ФормаЭлемента + Catalog.НаборыДополнительныхРеквизитовИСведений.Form.ФормаГруппы + Catalog.НаборыДополнительныхРеквизитовИСведений.Form.ФормаСписка + Catalog.НаборыДополнительныхРеквизитовИСведений.Form.ФормаВыбора + + + + + + ДополнительныеРеквизиты + + ru + Дополнительные реквизиты + + + Use + LineNumber + + Use + + + + + Свойство + + ru + Свойство + + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + + DontUse + Use + Use + Index + Use + + ForFolderAndItem + + + + + + + ДополнительныеСведения + + ru + Дополнительные сведения + + + Use + LineNumber + + Use + + + + + Свойство + + ru + Свойство + + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + + DontUse + Use + Use + Index + Use + + ForFolderAndItem + + + ПодборСвойств + + ru + Подбор свойств + + PersonalComputer + MobileDevice + + + ФормаВыбора + + ru + Форма выбора + + PersonalComputer + MobileDevice + + + ФормаГруппы + + ru + Форма группы + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/НазначенияСертификатовЭЦП/Templates/НазначенияСертификатов/Template.txt b/SSL/src/Catalogs/НазначенияСертификатовЭЦП/Templates/НазначенияСертификатов/Template.txt new file mode 100644 index 000000000..f3d72a9fb --- /dev/null +++ b/SSL/src/Catalogs/НазначенияСертификатовЭЦП/Templates/НазначенияСертификатов/Template.txt @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SSL/src/Catalogs/НазначенияСертификатовЭЦП/НазначенияСертификатовЭЦП.mdo b/SSL/src/Catalogs/НазначенияСертификатовЭЦП/НазначенияСертификатовЭЦП.mdo new file mode 100644 index 000000000..8d8984c75 --- /dev/null +++ b/SSL/src/Catalogs/НазначенияСертификатовЭЦП/НазначенияСертификатовЭЦП.mdo @@ -0,0 +1,116 @@ + + + + + + + + + + НазначенияСертификатовЭЦП + + ru + Назначения сертификатов ЭЦП + + true + Catalog.НазначенияСертификатовЭЦП.StandardAttribute.Description + Catalog.НазначенияСертификатовЭЦП.StandardAttribute.Code + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + Managed + Use + 2 + true + 45 + 150 + String + Variable + true + true + InDialog + BothWays + + НазначенияСертификатов + + ru + Назначения сертификатов + + TextDocument + + diff --git a/SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..0341b11da --- /dev/null +++ b/SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,242 @@ + + + + Код + 1 + true + true + + true + + + Объект.Code + + + КодРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ОсновнаяГруппировка + 10 + + Наименование + 3 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Префикс + 6 + true + true + + true + + + Объект.Префикс + + + ПрефиксРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ПрефиксКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Основная группировка</value> + + + ru + Основная группировка + + + ОсновнаяГруппировкаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаКонтактнаяИнформация + 5 + true + true + + true + + + <key>ru</key> + <value>Адреса, телефоны</value> + + + ru + Группа контактная информация + + + ГруппаКонтактнаяИнформацияРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.Организации + + + true + + + true + +
true
+ true +
+ + + + + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + +
diff --git a/SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..c121078bd --- /dev/null +++ b/SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,37 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + // Обработчик подсистемы "Контактная информация" + УправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтаФорма, Объект, "ГруппаКонтактнаяИнформация"); + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект) + + // Обработчик подсистемы "Контактная информация" + УправлениеКонтактнойИнформацией.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект, Отказ); + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ПОДСИСТЕМЫ "КОНТАКТНАЯ ИНФОРМАЦИЯ" + +&НаКлиенте +Процедура Подключаемый_КонтактнаяИнформацияПриИзменении(Элемент) + + УправлениеКонтактнойИнформациейКлиент.ПредставлениеПриИзменении(ЭтаФорма, Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_КонтактнаяИнформацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + УправлениеКонтактнойИнформациейКлиент.ПредставлениеНачалоВыбора(ЭтаФорма, Элемент, Модифицированность, СтандартнаяОбработка); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Организации/ObjectModule.bsl b/SSL/src/Catalogs/Организации/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Catalogs/Организации/Организации.mdo b/SSL/src/Catalogs/Организации/Организации.mdo new file mode 100644 index 000000000..9e5cfd7d6 --- /dev/null +++ b/SSL/src/Catalogs/Организации/Организации.mdo @@ -0,0 +1,349 @@ + + + + + + + + + + Организации + + ru + Организации + + Организации + true + Catalog.Организации.StandardAttribute.Description + Catalog.Организации.StandardAttribute.Code + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + Managed + Use + + ru + Организация + + 2 + true + 9 + 150 + String + Variable + true + true + AsDescription + InDialog + BothWays + Catalog.Организации.Form.ФормаЭлемента + + Префикс + + ru + Префикс + + + String + + 2 + + + + ru + Используется при нумерации документов. В начало каждого номера документов данной организации добавляется не более двух буквенных символов. + + + + + Use + Use + + + + + + + КонтактнаяИнформация + + ru + Контактная информация + + + Use + LineNumber + + Use + + + + + Тип + + ru + Тип + + + EnumRef.ТипыКонтактнойИнформации + + + + Use + Use + + + Вид + + ru + Вид + + + CatalogRef.ВидыКонтактнойИнформации + + + + Use + Use + + + Представление + + ru + Представление + + + String + + + + + Use + Use + + + ЗначенияПолей + + ru + Значения полей + + + String + + + + + Use + Use + + + Страна + + ru + Страна + + + String + + 100 + + + + + Use + Index + Use + + + Регион + + ru + Регион + + + String + + 50 + + + + + Use + Index + Use + + + Город + + ru + Город + + + String + + 50 + + + + + Use + Index + Use + + + АдресЭП + + ru + Адрес ЭП + + + String + + 100 + + + + + Use + Index + Use + + + ДоменноеИмяСервера + + ru + Доменное имя сервера + + + String + + 100 + + + + + Use + Index + Use + + + НомерТелефона + + ru + Номер телефона + + + String + + 20 + + + + + Use + Index + Use + + + НомерТелефонаБезКодов + + ru + Номер телефона без кодов + + + String + + 20 + + + + + Use + Index + Use + + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Form.form new file mode 100644 index 000000000..df1503b77 --- /dev/null +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Form.form @@ -0,0 +1,243 @@ + + + + <key>ru</key> + <value>Выбор папки</value> + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 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 + + Tree + true + true + 40 + true + true + 10 + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + Auto + Auto + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + CancelSearch + Find + HierarchicalList + List + ListSettings + Tree + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.ПапкиФайлов + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Module.bsl new file mode 100644 index 000000000..c7b6bcd63 --- /dev/null +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Module.bsl @@ -0,0 +1,7 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если Параметры.Свойство("ТекущаяПапка") Тогда + Элементы.Список.ТекущаяСтрока = Параметры.ТекущаяПапка; + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..2d8beb39a --- /dev/null +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,490 @@ + + + + ОсновнаяКоманднаяПанель + 1 + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + CommandBar + + Left + Form + + + + Код + 2 + true + true + + + Объект.Code + + + КодРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 3 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Наименование + 4 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Родитель + 6 + + <key>ru</key> + <value>В папке</value> + + true + true + + true + + + Объект.Parent + + + OnChange + РодительПриИзменении + + + РодительРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + РодительКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ПолныйПуть + 28 + true + true + + true + + + ПолныйПуть + + + ПолныйПутьРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + ПолныйПутьКонтекстноеМеню + 29 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Описание + 8 + true + true + + true + + + Объект.Описание + + + ОписаниеРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Ответственный + 10 + true + true + + true + + + Объект.Ответственный + + + ОтветственныйРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ОтветственныйКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ДатаСоздания + 12 + true + true + + true + + + Объект.ДатаСоздания + + + ДатаСозданияРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ДатаСозданияКонтекстноеМеню + 13 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + РабочийКаталог + 26 + true + true + + true + + + РабочийКаталог + + + РабочийКаталогРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + РабочийКаталогКонтекстноеМеню + 27 + true + + InputField + Enter + true + Left + true + + + StartChoice + РабочийКаталогВладельцаНачалоВыбора + + + Clearing + РабочийКаталогВладельцаОчистка + + true + true + true + true + true + true + true + Normal + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ПапкиФайлов + + + true + + + true + +
true
+ true +
+ + РабочийКаталог + + <key>ru</key> + <value>Рабочий каталог</value> + + 2 + + String + + + + true + + + true + + + + ПолныйПуть + + <key>ru</key> + <value>Полный путь</value> + + 3 + + String + + + + true + + + true + + + + + + 0 + + true + + + + + + + + AfterWriteAtServer + ПослеЗаписиНаСервере + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + +
diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..cfe3dba34 --- /dev/null +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,165 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("Родитель") Тогда + Объект.Родитель = Параметры.Родитель; + КонецЕсли; + + РабочийКаталог = РаботаСФайлами.ПолучитьРабочийКаталог(Объект.Ссылка); + + // Обработчик подсистемы "Свойства" + УправлениеСвойствами.ПриСозданииНаСервере(ЭтаФорма, Объект, ""); + + ОбновитьПолныйПуть(); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьПолныйПуть() + + ПапкаРодитель = Объект.Родитель; + ПолныйПуть = ""; + Пока Не ПапкаРодитель.Пустая() Цикл + + ПолныйПуть = Строка(ПапкаРодитель) + "\" + ПолныйПуть; + ПапкаРодитель = ПапкаРодитель.Родитель; + + КонецЦикла; + + ПолныйПуть = ПолныйПуть + Строка(Объект.Ссылка); + + Если Не ПустаяСтрока(ПолныйПуть) Тогда + ПолныйПуть = """" + ПолныйПуть + """"; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + // Обработчик подсистемы "Свойства" + Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтаФорма, ИмяСобытия, Параметр) Тогда + ОбновитьЭлементыДополнительныхРеквизитов(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект) + + // Обработчик подсистемы "Свойства" + УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ПОДСИСТЕМЫ СВОЙСТВ + +&НаКлиенте +Процедура Подключаемый_РедактироватьСоставСвойств() + + УправлениеСвойствамиКлиент.РедактироватьСоставСвойств(ЭтаФорма, Объект.Ссылка); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьЭлементыДополнительныхРеквизитов() + + УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтаФорма, РеквизитФормыВЗначение("Объект")); + +КонецПроцедуры + +&НаКлиенте +Процедура РабочийКаталогВладельцаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Если Объект.Ссылка.Пустая() Тогда + Если Записать() = Ложь Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + ОчиститьСообщения(); + + Каталог = ""; + Режим = РежимДиалогаВыбораФайла.ВыборКаталога; + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); + ДиалогОткрытияФайла.Каталог = РабочийКаталог; + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.Фильтр = Фильтр; + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите каталог'"); + Если ДиалогОткрытияФайла.Выбрать() Тогда + + ИмяКаталога = ДиалогОткрытияФайла.Каталог; + ФайловыеФункцииКлиентСервер.ДобавитьСлешЕслиНужно(ИмяКаталога); + + // Создать каталог для файлов + Попытка + СоздатьКаталог(ИмяКаталога); + ИмяКаталогаТестовое = ИмяКаталога + "ПроверкаДоступа\"; + СоздатьКаталог(ИмяКаталогаТестовое); + УдалитьФайлы(ИмяКаталогаТестовое); + Исключение + // нет прав на создание каталога, или такой путь отсутствует + + ТекстОшибки + = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неверный путь или отсутствуют права на запись в каталог ""%1""'"), + ИмяКаталога); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "РабочийКаталог"); + Возврат; + КонецПопытки; + + РабочийКаталог = ИмяКаталога; + РаботаСФайлами.СохранитьРабочийКаталог(Объект.Ссылка, РабочийКаталог); + + КонецЕсли; + + ОбновитьОтображениеДанных(); + +КонецПроцедуры + +&НаКлиенте +Процедура РабочийКаталогВладельцаОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + РодительСсылка = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Объект.Ссылка, "Родитель"); + РабочийКаталогРодителя = РаботаСФайлами.ПолучитьРабочийКаталог(РодительСсылка); + + РабочийКаталогЭтойПапки = РаботаСФайлами.ПолучитьРабочийКаталог(Объект.Ссылка); + РабочийКаталогУнаследованный = РабочийКаталогРодителя + Объект.Наименование + "\"; + + Если ПустаяСтрока(РабочийКаталогРодителя) Тогда + РабочийКаталог = ""; + РаботаСФайлами.ОчиститьРабочийКаталог(Объект.Ссылка); + ИначеЕсли РабочийКаталогУнаследованный <> РабочийКаталогЭтойПапки Тогда + РабочийКаталог = РабочийКаталогУнаследованный; + РаботаСФайлами.СохранитьРабочийКаталог(Объект.Ссылка, РабочийКаталог); + КонецЕсли; + + ОбновитьОтображениеДанных(); + +КонецПроцедуры + +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + РабочийКаталог = РаботаСФайлами.ПолучитьРабочийКаталог(Объект.Ссылка); +КонецПроцедуры + + +&НаКлиенте +Процедура РодительПриИзменении(Элемент) + + ОбновитьПолныйПуть(); + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/ПапкиФайлов/Help/ru.html b/SSL/src/Catalogs/ПапкиФайлов/Help/ru.html new file mode 100644 index 000000000..573d5209e --- /dev/null +++ b/SSL/src/Catalogs/ПапкиФайлов/Help/ru.html @@ -0,0 +1,7 @@ + +

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

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

 

+

Папкам можно назначать различные права доступа (команда "Права доступа" в карточке папки).

+

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

\ No newline at end of file diff --git a/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl b/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl new file mode 100644 index 000000000..d3096cc6b --- /dev/null +++ b/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl @@ -0,0 +1,154 @@ + + +Процедура ПередЗаписью(Отказ) + Если НЕ ОбменДанными.Загрузка Тогда + + ПометкаИБ = ПометкаУдаленияВИБ(); + Если ПометкаУдаления И Не ПометкаИБ Тогда + + // Проверка права "Пометка на удаление". + Если НЕ РаботаСФайламиПереопределяемый.ПометкаУдаленияРазрешена(Ссылка) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'У вас нет права ""Пометка на удаление"" папки файлов ""%1"".'"), + Строка(Ссылка)); + КонецЕсли; + КонецЕсли; + + Если ПометкаУдаления <> ПометкаИБ И Не Ссылка.Пустая() Тогда + // Отбираем файлы и пытаемся поставить им пометку удаления + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Файлы.Ссылка, + | Файлы.Редактирует + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.ВладелецФайла = &Ссылка"; + + Запрос.УстановитьПараметр("Ссылка", Ссылка); + + Результат = Запрос.Выполнить(); + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + Если Не Выборка.Редактирует.Пустая() Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Папку %1 нельзя удалить, т.к. она содержит файл ""%2"", занятый для редактирования.'"), + Строка(Ссылка), + Строка(Выборка.Ссылка)); + КонецЕсли; + + ФайлОбъект = Выборка.Ссылка.ПолучитьОбъект(); + ФайлОбъект.Заблокировать(); + ФайлОбъект.УстановитьПометкуУдаления(ПометкаУдаления); + КонецЦикла; + КонецЕсли; + + ДополнительныеСвойства.Вставить("ПрошлыйЭтоНовый", ЭтоНовый()); + + Если НЕ ЭтоНовый() Тогда + + Если Наименование <> Ссылка.Наименование Тогда // переименована папка + РабочийКаталогЭтойПапки = РаботаСФайлами.ПолучитьРабочийКаталог(Ссылка); + РабочийКаталог = РаботаСФайлами.ПолучитьРабочийКаталог(Ссылка.Родитель); + Если РабочийКаталог <> "" Тогда + + // Добавляем слэш в конце, если его нет + Если Прав(РабочийКаталог,1) <> "\" Тогда + РабочийКаталог = РабочийКаталог + "\"; + КонецЕсли; + + РабочийКаталогУнаследованныйПрежний = РабочийКаталог + Ссылка.Наименование + "\"; + Если РабочийКаталогУнаследованныйПрежний = РабочийКаталогЭтойПапки Тогда + РабочийКаталог = РабочийКаталог + Наименование + "\"; + РаботаСФайлами.СохранитьРабочийКаталог(Ссылка, РабочийКаталог); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если Родитель <> Ссылка.Родитель Тогда // перенесли папку в другую папку + РабочийКаталогЭтойПапки = РаботаСФайлами.ПолучитьРабочийКаталог(Ссылка); + РабочийКаталог = РаботаСФайлами.ПолучитьРабочийКаталог(Ссылка.Родитель); + РабочийКаталогНовый = РаботаСФайлами.ПолучитьРабочийКаталог(Родитель); + Если РабочийКаталог <> "" ИЛИ РабочийКаталогНовый <> "" Тогда + + РабочийКаталогУнаследованныйПрежний = РабочийКаталог; + + Если РабочийКаталог <> "" Тогда + РабочийКаталогУнаследованныйПрежний = РабочийКаталогУнаследованныйПрежний + Ссылка.Наименование + "\"; + КонецЕсли; + + Если РабочийКаталогУнаследованныйПрежний = РабочийКаталогЭтойПапки Тогда // рабочий каталог автоформируется от родителя + + Если РабочийКаталогНовый <> "" Тогда + РабочийКаталогНовый = РабочийКаталогНовый + Наименование + "\"; + РаботаСФайлами.СохранитьРабочийКаталог(Ссылка, РабочийКаталогНовый); + Иначе + РаботаСФайлами.ОчиститьРабочийКаталог(Ссылка); + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; +КонецПроцедуры + +Процедура ПриЗаписи(Отказ) + Если НЕ ОбменДанными.Загрузка Тогда + + Если ДополнительныеСвойства.ПрошлыйЭтоНовый Тогда + РабочийКаталогВладельца = РаботаСФайлами.ПолучитьРабочийКаталог(Родитель); + Если РабочийКаталогВладельца <> "" Тогда + + // Добавляем слэш в конце, если его нет + Если Прав(РабочийКаталогВладельца,1) <> "\" Тогда + РабочийКаталогВладельца = РабочийКаталогВладельца + "\"; + КонецЕсли; + + РабочийКаталогВладельца = РабочийКаталогВладельца + Наименование + "\"; + РаботаСФайлами.СохранитьРабочийКаталог(Ссылка, РабочийКаталогВладельца); + КонецЕсли; + КонецЕсли; + + КонецЕсли; +КонецПроцедуры + +Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) + ДатаСоздания = ТекущаяДата(); + Ответственный = ОбщегоНазначения.ТекущийПользователь(); +КонецПроцедуры + +// Возвращает текущее значение пометки удаления в информационной базе +Функция ПометкаУдаленияВИБ() + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ПапкиФайлов.ПометкаУдаления + |ИЗ + | Справочник.ПапкиФайлов КАК ПапкиФайлов + |ГДЕ + | ПапкиФайлов.Ссылка = &Ссылка"; + + Запрос.УстановитьПараметр("Ссылка", Ссылка); + + Результат = Запрос.Выполнить(); + + Если Не Результат.Пустой() Тогда + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + Возврат Выборка.ПометкаУдаления; + КонецЕсли; + + Возврат Неопределено; +КонецФункции + +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + Если НЕ РаботаСФайламиКлиентСервер.ИмяПапкиИлиФайлаСостоитИзДопустимыхСимволовДляФайловойСистемы(Наименование) Тогда + Отказ = Истина; + + Текст = НСтр("ru = 'Наименование папки содержит запрещенные символы ( \ / : * ? "" < > | .. )'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст, ЭтотОбъект, "Наименование"); + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/Catalogs/ПапкиФайлов/ПапкиФайлов.mdo b/SSL/src/Catalogs/ПапкиФайлов/ПапкиФайлов.mdo new file mode 100644 index 000000000..b1ca6e096 --- /dev/null +++ b/SSL/src/Catalogs/ПапкиФайлов/ПапкиФайлов.mdo @@ -0,0 +1,278 @@ + + + + + + + + + + ПапкиФайлов + + ru + Папки + + Структура папок для хранения файлов + Catalog.ПапкиФайлов.StandardAttribute.Description + Catalog.ПапкиФайлов.StandardAttribute.Code + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + + ru + Папка + + true + + Catalog.ПапкиФайлов.EmptyRef + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + + + Use + + + + Use + true + + + ru + + + Managed + Use + + ru + Папка + + + ru + Папки + + + ru + Папки файлов + + true + HierarchyOfItems + 2 + true + 9 + 150 + String + Variable + true + true + AsDescription + + + Шаблоны + Шаблоны файлов + + 000000001 + + + + InDialog + Catalog.ПапкиФайлов.Form.ФормаЭлемента + Catalog.ПапкиФайлов.Form.ФормаВыбора + + Описание + + ru + Описание + + + String + + + true + + + + Use + Use + + + Ответственный + + ru + Ответственный + + + CatalogRef.Пользователи + + + + DontUse + Use + + Catalog.Пользователи.EmptyRef + + Use + Use + + + ДатаСоздания + + ru + Дата создания + + + Date + + + + + + 0001-01-01T00:00:00 + + Use + Use + + + + + + + ДополнительныеРеквизиты + + ru + Дополнительные реквизиты + + + Use + LineNumber + + Use + + + + + Свойство + + ru + Свойство + + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + ru + Дополнительный реквизит + + + + DontUse + Use + Use + Use + + + Значение + + ru + Значение + + + Characteristic.ДополнительныеРеквизитыИСведения + + + ru + Значение доп. реквизита + + + + DontUse + Use + Use + Use + + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + + ФормаВыбора + + ru + Форма выбора + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/Пользователи/Commands/ПользователиИБ/CommandModule.bsl b/SSL/src/Catalogs/Пользователи/Commands/ПользователиИБ/CommandModule.bsl new file mode 100644 index 000000000..0f7dc31a5 --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Commands/ПользователиИБ/CommandModule.bsl @@ -0,0 +1,20 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ПараметрыФормы = Новый Структура; + + Если ТипЗнч(ПараметрыВыполненияКоманды.Источник) = Тип("УправляемаяФорма") Тогда + + Если ПараметрыВыполненияКоманды.Источник.ИмяФормы = "Справочник.Пользователи.Форма.ФормаСписка" Тогда + ПараметрыФормы.Вставить("Отбор", "Пользователи"); + + ИначеЕсли ПараметрыВыполненияКоманды.Источник.ИмяФормы = "Справочник.ВнешниеПользователи.Форма.ФормаСписка" Тогда + ПараметрыФормы.Вставить("Отбор", "ВнешниеПользователи"); + + КонецЕсли; + КонецЕсли; + + ОткрытьФорму("Справочник.Пользователи.Форма.ПользователиИБ", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/ConditionalAppearance.dcssca b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/ConditionalAppearance.dcssca new file mode 100644 index 000000000..c54f61fe6 --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/ConditionalAppearance.dcssca @@ -0,0 +1,119 @@ + + + + + + ПолноеИмя + + + Имя + + + АутентификацияСтандартная + + + АутентификацияОС + + + ПользовательОС + + + + + ПользователиИнфБазы.КодПроблемы + Equal + 0 + + + + + ЦветТекста + style:SpecialTextColor + + + + + + + ПолноеИмя + + + + + ПользователиИнфБазы.КодПроблемы + Equal + 1 + + + + + ЦветТекста + style:SpecialTextColor + + + + + + + ПолноеИмя + + + Имя + + + АутентификацияСтандартная + + + АутентификацияОС + + + ПользовательОС + + + + + ПользователиИнфБазы.КодПроблемы + Equal + 3 + + + + + ЦветТекста + web:LightSlateGray + + + + + + + ПолноеИмя + + + Имя + + + АутентификацияСтандартная + + + АутентификацияОС + + + ПользовательОС + + + + + ПользователиИнфБазы.ПометкаУдаления + Equal + true + + + + + ЦветТекста + web:LightSlateGray + + + + diff --git a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Form.form new file mode 100644 index 000000000..e88495fd3 --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Form.form @@ -0,0 +1,1339 @@ + + + + Предупреждение + 27 + + КартинкаПредупреждение + 25 + + <key>ru</key> + <value>Картинка предупреждение</value> + + true + true + + true + + + КартинкаПредупреждениеРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + КартинкаПредупреждениеКонтекстноеМеню + 26 + true + + 4 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + + + + ТекстПредупреждения + 28 + + <key>ru</key> + <value>Некоторые пользователи информационной базы не записаны в справочник +или их полное имя не совпадает с записанным.</value> + + true + true + + true + + + ТекстПредупрежденияРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + ТекстПредупрежденияКонтекстноеМеню + 29 + true + + Label + true + true + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Предупреждение</value> + + 3 + false + + ПредупреждениеРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ПредставлениеОтбора + 22 + true + true + + true + + + ПредставлениеОтбора + + + OnChange + ПредставлениеОтбораПриИзменении + + + ПредставлениеОтбораРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + ПредставлениеОтбораКонтекстноеМеню + 23 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПредставлениеОтбораНачалоВыбора + + 50 + true + true + false + true + true + true + true + + + ru + Все + + + Все + + + + + ru + Добавленные, измененные или удаленные с помощью Конфигуратора + + + НеправильноЗаписанные + + + + + ru + Без пользователя информационной базы + + + БезПользователяИБ + + + + + ru + Пользователи + + + Пользователи + + + + + ru + Внешние пользователи + + + ВнешниеПользователи + + + Normal + + + + ПользователиИнфБазы + 1 + true + true + + true + + + ПользователиИнфБазы + + false + None + Add + Change + Copy + CopyToClipboard + EndEdit + MoveDown + MoveUp + OutputList + + ПолноеИмя + 6 + true + true + + true + + + ПользователиИнфБазы.ПолноеИмя + + + ru + Полное имя пользователя информационной базы + + + ПолноеИмяРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + ПолноеИмяКонтекстноеМеню + 7 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + Normal + + + + Имя + 8 + true + true + + true + + + ПользователиИнфБазы.Имя + + + ru + Имя пользователя информационной базы + + + ИмяРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + ИмяКонтекстноеМеню + 9 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + Normal + + + + АутентификацияСтандартная + 10 + true + true + + true + + + ПользователиИнфБазы.АутентификацияСтандартная + + + ru + Аутентификация 1С:Предприятия + + + АутентификацияСтандартнаяРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + АутентификацияСтандартнаяКонтекстноеМеню + 11 + true + + CheckBoxField + true + Center + Auto + true + Left + true + + + + АутентификацияОС + 12 + true + true + + true + + + ПользователиИнфБазы.АутентификацияОС + + + ru + Аутентификация операционной системы + + + АутентификацияОСРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + АутентификацияОСКонтекстноеМеню + 13 + true + + CheckBoxField + true + Center + Auto + true + Left + true + + + + ПользовательОС + 14 + true + true + + true + + + ПользователиИнфБазы.ПользовательОС + + + ru + Пользователь операционной системы + + + ПользовательОСРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + ПользовательОСКонтекстноеМеню + 15 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + Normal + + + + ЭтоПользователь + 37 + true + true + + + ПользователиИнфБазы.ЭтоПользователь + + + ЭтоПользовательРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + ЭтоПользовательКонтекстноеМеню + 38 + true + + CheckBoxField + Auto + true + Left + true + + + + ЭтоВнешнийПользователь + 35 + true + true + + + ПользователиИнфБазы.ЭтоВнешнийПользователь + + + ЭтоВнешнийПользовательРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + ЭтоВнешнийПользовательКонтекстноеМеню + 36 + true + + CheckBoxField + Auto + true + Left + true + + + + Ссылка + 44 + true + true + + + ПользователиИнфБазы.Ссылка + + + СсылкаРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 45 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПометкаУдаления + 42 + true + true + + + ПользователиИнфБазы.ПометкаУдаления + + + ПометкаУдаленияРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + ПометкаУдаленияКонтекстноеМеню + 43 + true + + CheckBoxField + Auto + true + Left + true + + + None + + ПользователиИнфБазыКоманднаяПанель + 3 + Left + true + + + Selection + ПользователиИнфБазыВыбор + + + BeforeDeleteRow + ПользователиИнфБазыПередУдалением + + + OnActivateRow + ПользователиИнфБазыПриАктивизацииСтроки + + + ПользователиИнфБазыСтрокаПоиска + 65 + + ПользователиИнфБазыСтрокаПоискаРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + + ПользователиИнфБазыСтрокаПоискаКонтекстноеМеню + 66 + true + + ПользователиИнфБазы + + true + + + + ПользователиИнфБазыСостояниеПросмотра + 68 + + ПользователиИнфБазыСостояниеПросмотраРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + + ПользователиИнфБазыСостояниеПросмотраКонтекстноеМеню + 69 + true + + ViewStatusAddition + ПользователиИнфБазы + + true + + + + ПользователиИнфБазыУправлениеПоиском + 71 + + ПользователиИнфБазыУправлениеПоискомРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + ПользователиИнфБазыУправлениеПоискомКонтекстноеМеню + 72 + true + + SearchControlAddition + ПользователиИнфБазы + + true + + + + ПользователиИнфБазыРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + ПользователиИнфБазыКонтекстноеМеню + 2 + + КонтекстноеМенюПользователиИнфБазыИзменить + 48 + true + true + + true + + false + + КонтекстноеМенюПользователиИнфБазыИзменитьРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + Form.Command.Изменить + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюПользователиИнфБазыОбновить + 39 + true + true + + true + + false + + КонтекстноеМенюПользователиИнфБазыОбновитьРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + Form.Command.Обновить + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюПользователиИнфБазыУдалить + 41 + true + false + + true + + false + + КонтекстноеМенюПользователиИнфБазыУдалитьРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + Form.Item.ПользователиИнфБазы.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + true + true + Row +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + true + Auto + Auto + true + true + true + true + + ПользователиИнфБазы.Картинка + + + CommonPicture.ПиктограммыПользователя + + None + None + None + true + +
+ + ФормаКоманднаяПанель + -1 + + ПользователиИнфБазыИзменить + 18 + true + true + + true + + false + + ПользователиИнфБазыИзменитьРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + Form.Command.Изменить + Normal + Auto + true + true + UserCmds + Auto + + + ПользователиИнфБазыУдалить + 40 + true + false + + true + + false + + ПользователиИнфБазыУдалитьРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + Form.Item.ПользователиИнфБазы.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + ПользователиИнфБазыОбновить + 31 + true + true + + true + + false + + ПользователиИнфБазыОбновитьРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + Form.Command.Обновить + Normal + Auto + true + true + UserCmds + Auto + + + ПользователиИнфБазыНайти + 20 + true + true + + true + + false + + ПользователиИнфБазыНайтиРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + Form.Item.ПользователиИнфБазы.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ПользователиИнфБазыОтменитьПоиск + 21 + true + true + + true + + false + + ПользователиИнфБазыОтменитьПоискРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + Form.Item.ПользователиИнфБазы.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + ПользователиИнфБазыСортироватьПоВозрастанию + 33 + true + true + + true + + false + + ПользователиИнфБазыСортироватьПоВозрастаниюРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + Form.Item.ПользователиИнфБазы.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ПользователиИнфБазыСортироватьПоУбыванию + 34 + true + true + + true + + false + + ПользователиИнфБазыСортироватьПоУбываниюРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + Form.Item.ПользователиИнфБазы.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ПользователиИнфБазы + + <key>ru</key> + <value>Пользователи инф базы</value> + + 1 + + ValueTable + + + true + + + true + + + Картинка + + <key>ru</key> + <value>Картинка</value> + + 1 + + Number + + 2 + 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>Аутентификация 1С</value> + + 4 + + Boolean + + + true + + + true + + + + АутентификацияОС + + <key>ru</key> + <value>Аутентификация ОС</value> + + 5 + + Boolean + + + true + + + true + + + + ПользовательОС + + <key>ru</key> + <value>Пользователь ОС</value> + + 6 + + String + + + + true + + + true + + + + КодПроблемы + + <key>ru</key> + <value>Код проблемы</value> + + 8 + + Number + + 1 + true + + + + true + + + true + + + + ИдентификаторПользователяИБ + + <key>ru</key> + <value>Идентификатор пользователя ИБ</value> + + 7 + + UUID + + + true + + + true + + + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 9 + + CatalogRef.ВнешниеПользователи + CatalogRef.Пользователи + + + true + + + true + + + + ПометкаУдаления + + <key>ru</key> + <value>Пометка удаления</value> + + 10 + + Boolean + + + true + + + true + + + + ЭтоВнешнийПользователь + + <key>ru</key> + <value>Это внешний пользователь</value> + + 11 + + Boolean + + + true + + + true + + + + ЭтоПользователь + + <key>ru</key> + <value>Это пользователь</value> + + 12 + + Boolean + + + true + + + true + + + + + ПредставлениеОтбора + + <key>ru</key> + <value>Отбор</value> + + 3 + + String + + + + true + + + true + + + + Отбор + + <key>ru</key> + <value>Отбор</value> + + 4 + + String + + + + true + + + true + + + + Обновить + + <key>ru</key> + <value>Обновить</value> + + 5 + + ru + Обновить + + + true + + F5 + + StdPicture.Refresh + + + + Обновить + + + Auto + Auto + + + Изменить + + <key>ru</key> + <value>Изменить</value> + + 1 + + ru + Изменить + + + true + + F2 + + StdPicture.Change + + + + Изменить + + + Auto + Auto + + + Отбор + + String + + + + + + + +
diff --git a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Help/ru.html b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Help/ru.html new file mode 100644 index 000000000..f0493b71d --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Help/ru.html @@ -0,0 +1,10 @@ + +

Назначение формы "Пользователи информационной базы".

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

 

+

 

\ No newline at end of file diff --git a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Module.bsl new file mode 100644 index 000000000..d7ba79602 --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Module.bsl @@ -0,0 +1,334 @@ +// Поле ПользователиИБ.КодПроблемы +// 0 - пользовательИБ не записан в справочник +// 1 - ПолноеИмя отличается от Наименования +// 2 - пользовательИБ не найден +// 3 - пользовательИБ пустой УИД +// 4 - все в порядке +// для кодов 0,1 красная подсветка +// для кодов 2,3 серая подсветка +// + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьПривилегированныйРежим(Истина); + + Если НЕ Пользователи.ЭтоПолноправныйПользовательИБ() Тогда + ВызватьИсключение(НСтр("ru = 'Нет полных прав доступа!'")); + КонецЕсли; + + Отбор = "Все"; + ПредставлениеОтбора = Элементы.ПредставлениеОтбора.СписокВыбора[0].Представление; + + Если НЕ Константы.ИспользоватьВнешнихПользователей.Получить() Тогда + Элементы.ПредставлениеОтбора.СписокВыбора.Удалить(Элементы.ПредставлениеОтбора.СписокВыбора[4]); + Элементы.ПредставлениеОтбора.СписокВыбора.Удалить(Элементы.ПредставлениеОтбора.СписокВыбора[3]); + + ИначеЕсли Параметры.Отбор = "Пользователи" Тогда + Отбор = "Пользователи"; + ПредставлениеОтбора = Элементы.ПредставлениеОтбора.СписокВыбора[3].Представление; + + ИначеЕсли Параметры.Отбор = "ВнешниеПользователи" Тогда + Отбор = "ВнешниеПользователи"; + ПредставлениеОтбора = Элементы.ПредставлениеОтбора.СписокВыбора[4].Представление; + КонецЕсли; + + ЗаполнитьПользователейИБ(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ДобавленПользовательИБ" ИЛИ + ИмяСобытия = "ИзмененПользовательИБ" ИЛИ + ИмяСобытия = "УдаленПользовательИБ" ИЛИ + ИмяСобытия = "ОчищенаСвязьСНесуществущимПользователемИБ" Тогда + + ЗаполнитьПользователейИБ(); + КонецЕсли; + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий команд и элементов формы +// + +&НаКлиенте +Процедура Изменить(Команда) + + ОткрытьПользователяПоСсылке(); + +КонецПроцедуры + +&НаКлиенте +Процедура Обновить(Команда) + + ЗаполнитьПользователейИБ(); + +КонецПроцедуры + + +&НаКлиенте +Процедура ПредставлениеОтбораПриИзменении(Элемент) + + Если НЕ ЗначениеЗаполнено(ПредставлениеОтбора) Тогда + Отбор = "Все"; + ПредставлениеОтбора = Элементы.ПредставлениеОтбора.СписокВыбора.НайтиПоЗначению(Отбор).Представление; + КонецЕсли; + + ЗаполнитьПользователейИБ(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ВыбранныйЭлемент = ВыбратьИзСписка(Элементы.ПредставлениеОтбора.СписокВыбора, Элемент, Элементы.ПредставлениеОтбора.СписокВыбора.НайтиПоЗначению(Отбор)); + + Если ВыбранныйЭлемент <> Неопределено Тогда + + Отбор = ВыбранныйЭлемент.Значение; + ПредставлениеОтбора = ВыбранныйЭлемент.Представление; + + ПредставлениеОтбораПриИзменении(Элемент); + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ПользователиИнфБазыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ОткрытьПользователяПоСсылке(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПользователиИнфБазыПриАктивизацииСтроки(Элемент) + + МожноУдалить = Элементы.ПользователиИнфБазы.ТекущиеДанные <> Неопределено И + Элементы.ПользователиИнфБазы.ТекущиеДанные.КодПроблемы = 0; + + Элементы.ПользователиИнфБазыУдалить.Доступность = МожноУдалить; + Элементы.КонтекстноеМенюПользователиИнфБазыУдалить.Доступность = МожноУдалить; + +КонецПроцедуры + +&НаКлиенте +Процедура ПользователиИнфБазыПередУдалением(Элемент, Отказ) + + Если Элементы.ПользователиИнфБазы.ТекущиеДанные.КодПроблемы = 0 Тогда + Если Вопрос(НСтр("ru = 'Удалить пользователя информационной базы?'"), РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда + УдалитьПользователяИБ(Элементы.ПользователиИнфБазы.ТекущиеДанные.ИдентификаторПользователяИБ, Отказ); + Иначе + Отказ = Истина; + КонецЕсли; + Иначе + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции формы +// + +&НаСервере +Процедура ЗаполнитьПользователейИБ(ПриСозданииФормы = Ложь) + + ПользователиИнфБазы.Очистить(); + ЕстьНеправильноЗаписанные = Ложь; + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | Пользователи.Ссылка, + | Пользователи.Наименование, + | Пользователи.ИдентификаторПользователяИБ, + | Пользователи.ПометкаУдаления, + | ЛОЖЬ КАК ЭтоВнешнийПользователь, + | ИСТИНА КАК ЭтоПользователь + |ИЗ + | Справочник.Пользователи КАК Пользователи + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ВнешниеПользователи.Ссылка, + | ВнешниеПользователи.Наименование, + | ВнешниеПользователи.ИдентификаторПользователяИБ, + | ВнешниеПользователи.ПометкаУдаления, + | ИСТИНА, + | ЛОЖЬ + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи"); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Выборка.ИдентификаторПользователяИБ); + + НоваяСтрока = ПользователиИнфБазы.Добавить(); + + НоваяСтрока.КодПроблемы = 4; + НоваяСтрока.Ссылка = Выборка.Ссылка; + НоваяСтрока.ПолноеИмя = Выборка.Наименование; + НоваяСтрока.ПометкаУдаления = Выборка.ПометкаУдаления; + НоваяСтрока.ЭтоПользователь = Выборка.ЭтоПользователь; + НоваяСтрока.ЭтоВнешнийПользователь = Выборка.ЭтоВнешнийПользователь; + + Если ПользовательИБ = Неопределено Тогда + НоваяСтрока.КодПроблемы = ?(ЗначениеЗаполнено(Выборка.ИдентификаторПользователяИБ), 2, 3); + ЕстьНеправильноЗаписанные = ЕстьНеправильноЗаписанные ИЛИ ЗначениеЗаполнено(Выборка.ИдентификаторПользователяИБ); + Иначе + НоваяСтрока.Имя = ПользовательИБ.Имя; + НоваяСтрока.АутентификацияСтандартная = ПользовательИБ.АутентификацияСтандартная; + НоваяСтрока.АутентификацияОС = ПользовательИБ.АутентификацияОС; + НоваяСтрока.ПользовательОС = ПользовательИБ.ПользовательОС; + НоваяСтрока.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор; + + Если Выборка.Наименование <> ПользовательИБ.ПолноеИмя Тогда // рассогласование по полному имени + НоваяСтрока.КодПроблемы = 1; + ЕстьНеправильноЗаписанные = Истина; + КонецЕсли; + КонецЕсли; + + НоваяСтрока.Картинка = ПолучитьНомерКартинкиПоСостоянию(НоваяСтрока.КодПроблемы, НоваяСтрока.ПометкаУдаления, Выборка.ЭтоВнешнийПользователь); + + КонецЦикла; + + ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); + + Для Каждого ПользовательИБ Из ПользователиИБ Цикл + + Если ПользователиИнфБазы.НайтиСтроки(Новый Структура("ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор)).Количество() = 0 Тогда + // этого пользователя ИБ нет в справочнике + НоваяСтрока = ПользователиИнфБазы.Добавить(); + НоваяСтрока.КодПроблемы = 0; + НоваяСтрока.ПолноеИмя = ПользовательИБ.ПолноеИмя; + НоваяСтрока.Имя = ПользовательИБ.Имя; + НоваяСтрока.АутентификацияСтандартная = ПользовательИБ.АутентификацияСтандартная; + НоваяСтрока.АутентификацияОС = ПользовательИБ.АутентификацияОС; + НоваяСтрока.ПользовательОС = ПользовательИБ.ПользовательОС; + НоваяСтрока.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор; + НоваяСтрока.Картинка = ПолучитьНомерКартинкиПоСостоянию(НоваяСтрока.КодПроблемы, НоваяСтрока.ПометкаУдаления, Ложь); + ЕстьНеправильноЗаписанные = Истина; + КонецЕсли; + + КонецЦикла; + + Если ПриСозданииФормы И ЕстьНеправильноЗаписанные Тогда + Отбор = "НеправильноЗаписанные"; + ПредставлениеОтбора = Элементы.ПредставлениеОтбора.СписокВыбора[1].Представление; + КонецЕсли; + + УдаляемыеСтроки = Новый Массив; + Если Отбор = "Пользователи" Тогда + УдаляемыеСтроки.Добавить(ПользователиИнфБазы.НайтиСтроки(Новый Структура("ЭтоПользователь", Ложь))); + + ИначеЕсли Отбор = "ВнешниеПользователи" Тогда + УдаляемыеСтроки.Добавить(ПользователиИнфБазы.НайтиСтроки(Новый Структура("ЭтоВнешнийПользователь", Ложь))); + + ИначеЕсли Отбор = "НеправильноЗаписанные" Тогда + УдаляемыеСтроки.Добавить(ПользователиИнфБазы.НайтиСтроки(Новый Структура("КодПроблемы", 3))); + УдаляемыеСтроки.Добавить(ПользователиИнфБазы.НайтиСтроки(Новый Структура("КодПроблемы", 4))); + + ИначеЕсли Отбор = "БезПользователяИБ" Тогда + УдаляемыеСтроки.Добавить(ПользователиИнфБазы.НайтиСтроки(Новый Структура("КодПроблемы", 0))); + УдаляемыеСтроки.Добавить(ПользователиИнфБазы.НайтиСтроки(Новый Структура("КодПроблемы", 1))); + УдаляемыеСтроки.Добавить(ПользователиИнфБазы.НайтиСтроки(Новый Структура("КодПроблемы", 4))); + КонецЕсли; + + Для каждого Строки Из УдаляемыеСтроки Цикл + Для каждого Строка Из Строки Цикл + ПользователиИнфБазы.Удалить(ПользователиИнфБазы.Индекс(Строка)); + КонецЦикла; + КонецЦикла; + + ПользователиИнфБазы.Сортировать("ПометкаУдаления Возр, КодПроблемы Возр"); + + Элементы.Предупреждение.Видимость = ЕстьНеправильноЗаписанные; + +КонецПроцедуры + +&НаСервере +Функция ПолучитьНомерКартинкиПоСостоянию(Знач КодПроблемы, Знач ПометкаУдаления, Знач ЭтоВнешнийПользователь) + + НомерКартинки = -1; + + Если КодПроблемы = 1 ИЛИ КодПроблемы = 0 Тогда + НомерКартинки = 5; + КонецЕсли; + + Если ПометкаУдаления Тогда + Если КодПроблемы = 2 ИЛИ КодПроблемы = 3 ИЛИ КодПроблемы = 4 Тогда + НомерКартинки = 0; + КонецЕсли; + Иначе + Если КодПроблемы = 4 Тогда + НомерКартинки = 1; + ИначеЕсли КодПроблемы = 2 ИЛИ КодПроблемы = 3 Тогда + НомерКартинки = 4; + КонецЕсли; + КонецЕсли; + + Если НомерКартинки >= 0 И ЭтоВнешнийПользователь Тогда + НомерКартинки = НомерКартинки + 6; + КонецЕсли; + + Возврат НомерКартинки; + +КонецФункции + + +&НаСервере +Процедура УдалитьПользователяИБ(ИдентификаторПользователяИБ, Отказ) + + ОписаниеОшибки = ""; + Если НЕ Пользователи.УдалитьПользователяИБ(ИдентификаторПользователяИБ, ОписаниеОшибки) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки, , , , Отказ); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьПользователяПоСсылке() + + ТекущиеДанные = Элементы.ПользователиИнфБазы.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТекущиеДанные.КодПроблемы = 0 Тогда + Предупреждение(НСтр("ru = 'Данному пользователю информационной базы не сопоставлен элемент справочника. + | + |Для создания пользователя информационной базы, + |связанного с пользователем или внешним пользователем применяйте флажок + |""Доступ к информационной базе разрешен"" в соответствующей форме элемента.'")); + + Отказ = Ложь; + ПользователиИнфБазыПередУдалением(Элементы.ПользователиИнфБазы, Отказ); + Если НЕ Отказ Тогда + ПользователиИнфБазы.Удалить(ТекущиеДанные); + КонецЕсли; + Иначе + ОткрытьФорму(?(ТекущиеДанные.ЭтоВнешнийПользователь, + "Справочник.ВнешниеПользователи.ФормаОбъекта", + "Справочник.Пользователи.ФормаОбъекта"), + Новый Структура("Ключ", ТекущиеДанные.Ссылка)); + КонецЕсли; + +КонецПроцедуры + + + + diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Form.form new file mode 100644 index 000000000..a324aa307 --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Form.form @@ -0,0 +1,686 @@ + + + + ГруппаСпискаДоменовИПользователей + 2 + + ТаблицаДоменов + 5 + + <key>ru</key> + <value>Домен</value> + + true + true + + true + + + СписокДоменов + + false + Top + + Домены + 11 + + <key>ru</key> + <value>Домены</value> + + true + true + + true + + + СписокДоменов.ИмяДомена + + + ДоменыРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + ДоменыКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + None + + ТаблицаДоменовКоманднаяПанель + 7 + Left + true + + + OnActivateRow + ТаблицаДоменовПриАктивизацииСтроки + + + ТаблицаДоменовСтрокаПоиска + 24 + + ТаблицаДоменовСтрокаПоискаРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ТаблицаДоменовСтрокаПоискаКонтекстноеМеню + 25 + true + + ТаблицаДоменов + + true + + + + ТаблицаДоменовСостояниеПросмотра + 27 + + ТаблицаДоменовСостояниеПросмотраРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ТаблицаДоменовСостояниеПросмотраКонтекстноеМеню + 28 + true + + ViewStatusAddition + ТаблицаДоменов + + true + + + + ТаблицаДоменовУправлениеПоиском + 30 + + ТаблицаДоменовУправлениеПоискомРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ТаблицаДоменовУправлениеПоискомКонтекстноеМеню + 31 + true + + SearchControlAddition + ТаблицаДоменов + + true + + + + ТаблицаДоменовРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + ТаблицаДоменовКонтекстноеМеню + 6 + true + + true + true + true + true + 40 + true + true + 4 + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + + Style.BorderColor + + None + None + None + true + + + + ТаблицаПользователейДомена + 8 + + <key>ru</key> + <value>Пользователь</value> + + true + true + + true + + + СписокПользователейТекущегоДомена + + false + Top + + Пользователи + 13 + + <key>ru</key> + <value>Пользователи</value> + + true + true + + true + + + СписокПользователейТекущегоДомена.ИмяПользователя + + + ПользователиРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ПользователиКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + None + + ТаблицаПользователейДоменаКоманднаяПанель + 10 + Left + true + + + Selection + ТаблицаПользователейДоменаВыбор + + + ТаблицаПользователейДоменаСтрокаПоиска + 44 + + ТаблицаПользователейДоменаСтрокаПоискаРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ТаблицаПользователейДоменаСтрокаПоискаКонтекстноеМеню + 45 + true + + ТаблицаПользователейДомена + + true + + + + ТаблицаПользователейДоменаСостояниеПросмотра + 47 + + ТаблицаПользователейДоменаСостояниеПросмотраРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + ТаблицаПользователейДоменаСостояниеПросмотраКонтекстноеМеню + 48 + true + + ViewStatusAddition + ТаблицаПользователейДомена + + true + + + + ТаблицаПользователейДоменаУправлениеПоиском + 50 + + ТаблицаПользователейДоменаУправлениеПоискомРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ТаблицаПользователейДоменаУправлениеПоискомКонтекстноеМеню + 51 + true + + SearchControlAddition + ТаблицаПользователейДомена + + true + + + + ТаблицаПользователейДоменаРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ТаблицаПользователейДоменаКонтекстноеМеню + 9 + true + + true + true + true + true + 40 + true + true + 4 + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + + Style.BorderColor + + None + None + None + true + + + true + true + + true + + + ГруппаСпискаДоменовИПользователейРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Кнопки + 17 + true + true + + true + + + <key>ru</key> + <value>Кнопки</value> + + + ru + Кнопки + + + КнопкиРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Ок + 16 + true + true + + true + + false + + ОкРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.Command.КомандаОк + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Отмена + 15 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Справка + 18 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + 50 + 14 + DontBlock + true + 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> + + 3 + + ValueTable + + + true + + + true + + + ИмяПользователя + + <key>ru</key> + <value>Имя пользователя</value> + + 1 + + String + + + + true + + + true + + + + + ТаблицаДоменовИПользователей + + <key>ru</key> + <value>Таблица доменов и пользователей</value> + + 2 + + + true + + + true + + + + КомандаОк + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + Выбрать пользователя Windows + + + true + + + + КомандаОкВыполнить + + + Auto + Auto + + + + + + diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Help/ru.html b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Help/ru.html new file mode 100644 index 000000000..b79849b01 --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Help/ru.html @@ -0,0 +1,2 @@ + +

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

\ No newline at end of file diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Module.bsl new file mode 100644 index 000000000..3bdaf0dcf --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Module.bsl @@ -0,0 +1,91 @@ +//////////////////////////////////////////////////////////////////////////////// +// МОДУЛЬ ФОРМЫ ВЫБОРА ПОЛЬЗОВАТЕЛЯ WINDOWS // +//////////////////////////////////////////////////////////////////////////////// + +// Процедура обработчик события "ПриОткрытии" формы +// +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + #Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда + ТаблицаДоменовИПользователей = ПользователиОС(); + #ИначеЕсли ТонкийКлиент Тогда + ТаблицаДоменовИПользователей = Новый ФиксированныйМассив (ПользователиОС()); + #КонецЕсли + + ЗаполнитьСписокДоменов(); + +КонецПроцедуры + +// Процедура заполняет список доменов +// +&НаКлиенте +Процедура ЗаполнитьСписокДоменов () + + СписокДоменов.Очистить(); + + Для Каждого Запись Из ТаблицаДоменовИПользователей Цикл + Домен = СписокДоменов.Добавить(); + Домен.ИмяДомена = Запись.ИмяДомена; + КонецЦикла; + +КонецПроцедуры + +// Процедура обработчик события ПриАктивизации строки таблицы доменов +// +&НаКлиенте +Процедура ТаблицаДоменовПриАктивизацииСтроки(Элемент) + + ИмяДомена = Элемент.ТекущиеДанные.ИмяДомена; + + Для Каждого Запись Из ТаблицаДоменовИПользователей Цикл + Если Запись.ИмяДомена = ИмяДомена Тогда + СписокПользователейТекущегоДомена.Очистить(); + Для Каждого Пользователь Из Запись.Пользователи Цикл + ПользовательДомена = СписокПользователейТекущегоДомена.Добавить(); + ПользовательДомена.ИмяПользователя = Пользователь; + КонецЦикла; + Прервать; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Процедура обработчик события ПриВыборе строки таблицы пользователей. +// Формирует строку для использования аутентификации пользователя Windows. +// +&НаКлиенте +Процедура ТаблицаПользователейДоменаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СкомпоноватьРезультатИЗакрытьФорму(); + +КонецПроцедуры + +// Обработчик события нажатия на кнопку "Выбрать пользователя Windows" формы. +// Проверяет, что пользователь выбран и если так, то закрывает форму со строкой +// window-аутентификации для выбранного пользователя. +// +&НаКлиенте +Процедура КомандаОкВыполнить() + + ИмяДомена = Элементы.ТаблицаДоменов.ТекущиеДанные.ИмяДомена; + ИмяПользователя = Элементы.ТаблицаПользователейДомена.ТекущиеДанные.ИмяПользователя; + + Если СокрЛП(ИмяДомена) <> "" И СокрЛП(ИмяПользователя) <> "" Тогда + СкомпоноватьРезультатИЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +// Процедура компонует результат выбора в виде строки \\ДОМЕН\ИМЯ_ПОЛЬЗОВАТЕЛЯ_ДОМЕНА +// и закрывает форму, возвращая это значение, в качестве результата работы формы. +// +&НаКлиенте +Процедура СкомпоноватьРезультатИЗакрытьФорму() + + ИмяДомена = Элементы.ТаблицаДоменов.ТекущиеДанные.ИмяДомена; + ИмяПользователя = Элементы.ТаблицаПользователейДомена.ТекущиеДанные.ИмяПользователя; + СтрокаПользователяWindows = "\\" + ИмяДомена + "\" + ИмяПользователя; + Закрыть(СтрокаПользователяWindows); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораРолей/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораРолей/Form.form new file mode 100644 index 000000000..f8ba72a9d --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораРолей/Form.form @@ -0,0 +1,1683 @@ + + + + СпособОтображения + 33 + + СписокРолей + 35 + + Роли + 48 + true + true + + true + + + Роли + + true + false + None + Add + Change + Choose + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + OutputList + SelectAll + + РолиСиноним + 53 + true + true + + true + + + Роли.Синоним + + + РолиСинонимРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + РолиСинонимКонтекстноеМеню + 54 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + РолиСинонимыПодсистем + 84 + true + true + + + Роли.СинонимыПодсистем + + + РолиСинонимыПодсистемРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + + РолиСинонимыПодсистемКонтекстноеМеню + 85 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + РолиИмя + 51 + true + true + + + Роли.Имя + + + РолиИмяРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + + РолиИмяКонтекстноеМеню + 52 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + РолиИменаПодсистем + 82 + true + true + + + Роли.ИменаПодсистем + + + РолиИменаПодсистемРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + РолиИменаПодсистемКонтекстноеМеню + 83 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + РолиКоманднаяПанель + 50 + Left + true + + + ValueChoice + РолиВыборЗначения + + + OnActivateRow + РолиПриАктивизацииСтроки + + + РолиСтрокаПоиска + 100 + + РолиСтрокаПоискаРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + + РолиСтрокаПоискаКонтекстноеМеню + 101 + true + + Роли + + true + + + + РолиСостояниеПросмотра + 103 + + РолиСостояниеПросмотраРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + РолиСостояниеПросмотраКонтекстноеМеню + 104 + true + + ViewStatusAddition + Роли + + true + + + + РолиУправлениеПоиском + 106 + + РолиУправлениеПоискомРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + + РолиУправлениеПоискомКонтекстноеМеню + 107 + true + + SearchControlAddition + Роли + + true + + + + РолиРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + + РолиКонтекстноеМеню + 49 + + КонтекстноеМенюРолиВыбрать + 73 + true + true + + true + + false + + КонтекстноеМенюРолиВыбратьРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + Form.Command.Выбрать + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиСортироватьСписокПоВозрастанию + 69 + true + true + + true + + false + + КонтекстноеМенюРолиСортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиСортироватьСписокПоУбыванию + 70 + true + true + + true + + false + + КонтекстноеМенюРолиСортироватьСписокПоУбываниюРасширеннаяПодсказка + 96 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиНайти + 86 + true + true + + true + + false + + КонтекстноеМенюРолиНайтиРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиОтменитьПоиск + 87 + true + true + + true + + false + + КонтекстноеМенюРолиОтменитьПоискРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + true + + true + 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>Список ролей</value> + + + ru + Список ролей + + + СписокРолейРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + Page + + auto + +
+ + РолиПодсистем + 34 + + ПодсистемыИРоли + 81 + + Подсистемы + 36 + true + true + + true + + + Подсистемы + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + HierarchicalList + List + MoveDown + MoveUp + OutputList + SelectAll + Tree + + ПодсистемыСиноним + 41 + true + true + + true + + + Подсистемы.Синоним + + + ПодсистемыСинонимРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + + ПодсистемыСинонимКонтекстноеМеню + 42 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПодсистемыИмя + 39 + true + true + + + Подсистемы.Имя + + + ПодсистемыИмяРасширеннаяПодсказка + 141 + Label + true + true + + Left + + + + ПодсистемыИмяКонтекстноеМеню + 40 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + ПодсистемыКоманднаяПанель + 38 + Left + + + OnActivateRow + ПодсистемыПриАктивизацииСтроки + + + ПодсистемыСтрокаПоиска + 130 + + ПодсистемыСтрокаПоискаРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + + ПодсистемыСтрокаПоискаКонтекстноеМеню + 131 + true + + Подсистемы + + true + + + + ПодсистемыСостояниеПросмотра + 133 + + ПодсистемыСостояниеПросмотраРасширеннаяПодсказка + 135 + Label + true + true + + Left + + + + ПодсистемыСостояниеПросмотраКонтекстноеМеню + 134 + true + + ViewStatusAddition + Подсистемы + + true + + + + ПодсистемыУправлениеПоиском + 136 + + ПодсистемыУправлениеПоискомРасширеннаяПодсказка + 138 + Label + true + true + + Left + + + + ПодсистемыУправлениеПоискомКонтекстноеМеню + 137 + true + + SearchControlAddition + Подсистемы + + true + + + + ПодсистемыРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + + ПодсистемыКонтекстноеМеню + 37 + + КонтекстноеМенюПодсистемыСортироватьСписокПоВозрастанию + 43 + true + true + + true + + false + + КонтекстноеМенюПодсистемыСортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + Form.Item.Подсистемы.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюПодсистемыСортироватьСписокПоУбыванию + 44 + true + true + + true + + false + + КонтекстноеМенюПодсистемыСортироватьСписокПоУбываниюРасширеннаяПодсказка + 128 + Label + true + true + + Left + + + Form.Item.Подсистемы.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + + true + + Tree + 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 +
+ + РолиТекущейПодсистемы + 1 + true + true + + true + + + РолиТекущейПодсистемы + + true + false + None + Add + CancelSearch + Change + Choose + Copy + CopyToClipboard + Delete + EndEdit + Find + MoveDown + MoveUp + OutputList + + РолиТекущейПодсистемыСиноним + 76 + true + true + + true + + + РолиТекущейПодсистемы.Синоним + + + РолиТекущейПодсистемыСинонимРасширеннаяПодсказка + 164 + Label + true + true + + Left + + + + РолиТекущейПодсистемыСинонимКонтекстноеМеню + 77 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + РолиТекущейПодсистемыИмя + 74 + true + true + + + РолиТекущейПодсистемы.Имя + + + РолиТекущейПодсистемыИмяРасширеннаяПодсказка + 166 + Label + true + true + + Left + + + + РолиТекущейПодсистемыИмяКонтекстноеМеню + 75 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + РолиТекущейПодсистемыКоманднаяПанель + 3 + Left + + + ValueChoice + РолиТекущейПодсистемыВыборЗначения + + + OnActivateRow + РолиТекущейПодсистемыПриАктивизацииСтроки + + + РолиТекущейПодсистемыСтрокаПоиска + 155 + + РолиТекущейПодсистемыСтрокаПоискаРасширеннаяПодсказка + 157 + Label + true + true + + Left + + + + РолиТекущейПодсистемыСтрокаПоискаКонтекстноеМеню + 156 + true + + РолиТекущейПодсистемы + + true + + + + РолиТекущейПодсистемыСостояниеПросмотра + 158 + + РолиТекущейПодсистемыСостояниеПросмотраРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + + РолиТекущейПодсистемыСостояниеПросмотраКонтекстноеМеню + 159 + true + + ViewStatusAddition + РолиТекущейПодсистемы + + true + + + + РолиТекущейПодсистемыУправлениеПоиском + 161 + + РолиТекущейПодсистемыУправлениеПоискомРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + + РолиТекущейПодсистемыУправлениеПоискомКонтекстноеМеню + 162 + true + + SearchControlAddition + РолиТекущейПодсистемы + + true + + + + РолиТекущейПодсистемыРасширеннаяПодсказка + 154 + Label + true + true + + Left + + + + РолиТекущейПодсистемыКонтекстноеМеню + 2 + + КонтекстноеМенюРолиТекущейПодсистемыВыбрать + 11 + true + true + + true + + false + + КонтекстноеМенюРолиТекущейПодсистемыВыбратьРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + Form.Command.Выбрать + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиТекущейПодсистемыСортироватьСписокПоВозрастанию + 45 + true + true + + true + + false + + КонтекстноеМенюРолиТекущейПодсистемыСортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 152 + Label + true + true + + Left + + + Form.Item.РолиТекущейПодсистемы.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиТекущейПодсистемыСортироватьСписокПоУбыванию + 46 + true + true + + true + + false + + КонтекстноеМенюРолиТекущейПодсистемыСортироватьСписокПоУбываниюРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + Form.Item.РолиТекущейПодсистемы.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + + + true + true + true + true + true +
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>Подсистемы и роли</value> + + + ПодсистемыИРолиРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + +
+ + ПоказыватьРолиПодчиненныхПодсистем + 79 + true + true + + true + + + ПоказыватьРолиПодчиненныхПодсистем + + Right + + OnChange + ПоказыватьРолиПодчиненныхПодсистемПриИзменении + + + ПоказыватьРолиПодчиненныхПодсистемРасширеннаяПодсказка + 176 + Label + true + true + + Left + + + + ПоказыватьРолиПодчиненныхПодсистемКонтекстноеМеню + 80 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Роли подсистем</value> + + + РолиПодсистемРасширеннаяПодсказка + 125 + Label + true + true + + Left + + + Page + + Vertical + auto + +
+ true + true + + true + + + <key>ru</key> + <value>Способ отображения</value> + + + СпособОтображенияРасширеннаяПодсказка + 92 + Label + true + true + + Left + + + Pages + + Auto + +
+ + ФормаКоманднаяПанель + -1 + + Выбрать + 10 + true + true + + true + + false + + ВыбратьРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + Form.Command.Выбрать + PictureAndText + true + true + true + UserCmds + Auto + + + ПоказатьПодсистемы + 78 + true + true + + true + + false + + ПоказатьПодсистемыРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + Form.Command.ПоказатьПодсистемы + Normal + Auto + true + true + UserCmds + Auto + + + ИзменитьФорму + 21 + true + true + + true + + false + + ИзменитьФормуРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 47 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + DontBlock + Use + 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 + + String + + + + true + + + true + + + + СинонимыПодсистем + + <key>ru</key> + <value>Подсистемы</value> + + 4 + + String + + + + true + + + true + + + + + Подсистемы + + <key>ru</key> + <value>Подсистемы</value> + + 2 + + ValueTree + + + true + + + true + + + Имя + + <key>ru</key> + <value>Имя подсистемы</value> + + 1 + + String + + + + true + + + true + + + + Синоним + + <key>ru</key> + <value>Подсистема</value> + + 2 + + String + + + + true + + + true + + + + ПолноеИмя + + <key>ru</key> + <value>Полное имя</value> + + 3 + + String + + + + true + + + true + + + + + РолиТекущейПодсистемы + + <key>ru</key> + <value>Роли и подсистемы</value> + + 5 + + ValueTable + + + 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> + + 3 + + Boolean + + + true + + + true + + + ПоказыватьРолиПодчиненныхПодсистем + + + + ПоказыватьПодсистемы + + <key>ru</key> + <value>Показывать подсистемы</value> + + 4 + + Boolean + + + true + + + true + + + ПоказыватьПодсистемы + + + + РежимПодбора + + <key>ru</key> + <value>Режим подбора</value> + + 6 + + Boolean + + + true + + + true + + + + ТекущаяРоль + + <key>ru</key> + <value>Текущая роль</value> + + 7 + + String + + + + true + + + true + + + + Выбрать + + <key>ru</key> + <value>Выбрать</value> + + 1 + + ru + Выбрать + + + true + + + StdPicture.ChooseValue + + + + Выбрать + + + Auto + Auto + + + ПоказатьПодсистемы + + <key>ru</key> + <value>Показать подсистемы</value> + + 2 + + ru + Показать подсистемы + + + true + + + + ПоказатьПодсистемы + + + Auto + Auto + + + + + +
diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораРолей/Help/ru.html b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораРолей/Help/ru.html new file mode 100644 index 000000000..59bdf104c --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораРолей/Help/ru.html @@ -0,0 +1,6 @@ + +

Форма позволяет выбрать или подобрать разрешенные действия (роли).

+

Список разрешенных действий (ролей) - это список синонимов ролей (как они заданы в конфигураторе), отсортированный по возрастанию.

+

При подборе ролей в профиль может понадобиться:

1) увидеть имена ролей (как они заданы в конфигураторе);
для этого нужно включить обычно скрытое поле "Имя роли" с помощью команды "Изменить форму";

2) отобрать роли по подсистемам;
для этого нужно включить обычно скрытое поле "Имена подсистем" или "Синонимы подсистем" с помощью команды "Изменить форму",
и далее используя команду "Найти" сделать отбор ролей одинаковых подсистем.

+

 

+

 

\ No newline at end of file diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораРолей/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораРолей/Module.bsl new file mode 100644 index 000000000..6d64063e5 --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораРолей/Module.bsl @@ -0,0 +1,256 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + РежимПодбора = Параметры.ЗакрыватьПриВыборе = Ложь; + + Если РежимПодбора Тогда + Заголовок = НСтр("ru = 'Подбор разрешенных действий (ролей)'"); + Элементы.Роли.МножественныйВыбор = Истина; + Элементы.Роли.РежимВыделения = РежимВыделенияТаблицы.Множественный; + Элементы.РолиТекущейПодсистемы.МножественныйВыбор = Истина; + Элементы.РолиТекущейПодсистемы.РежимВыделения = РежимВыделенияТаблицы.Множественный; + Иначе + Заголовок = НСтр("ru = 'Выбор разрешенного действия (роли)'"); + КонецЕсли; + + ДеревоПодсистем = ПользователиСерверПовтИсп.ДеревоПодсистем(); + ДеревоПодсистем.Строки.Сортировать("Синоним Возр", Истина); + ЗначениеВДанныеФормы(ДеревоПодсистем, Подсистемы); + + ВсеРоли = ПользователиСерверПовтИсп.ВсеРоли(); + + Для каждого Строка Из ВсеРоли Цикл + Если ВРег(Строка.Имя) = ВРег("ПолныеПрава") Тогда + Продолжить; + КонецЕсли; + + // Заполнение ролей + НоваяСтрока = Роли.Добавить(); + НоваяСтрока.Имя = Строка.Имя; + НоваяСтрока.Синоним = Строка.Синоним; + НоваяСтрока.ИменаПодсистем = Строка.ИменаПодсистем; + НоваяСтрока.СинонимыПодсистем = Строка.СинонимыПодсистем; + + КонецЦикла; + Роли.Сортировать("Синоним Возр"); + + Параметры.Свойство("ТекущаяСтрока", ТекущаяРоль); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ПриИзмененииТекущейРоли(); + +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + + ПоказыватьПодсистемы = Настройки["ПоказыватьПодсистемы"]; + Элементы.СпособОтображения.ТекущаяСтраница = ?(ПоказыватьПодсистемы, Элементы.РолиПодсистем, Элементы.СписокРолей); + Элементы.ПоказатьПодсистемы.Пометка = ПоказыватьПодсистемы; + + ПоказыватьРолиПодчиненныхПодсистем = Настройки["ПоказыватьРолиПодчиненныхПодсистем"]; + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий команд и элементов формы +// + +&НаКлиенте +Процедура Выбрать(Команда) + + Если Элементы.СпособОтображения.ТекущаяСтраница = Элементы.РолиПодсистем Тогда + ВыделенныеСтроки = Элементы.РолиТекущейПодсистемы.ВыделенныеСтроки; + Коллекция = РолиТекущейПодсистемы; + Иначе + ВыделенныеСтроки = Элементы.Роли.ВыделенныеСтроки; + Коллекция = Роли; + КонецЕсли; + + Если ВыделенныеСтроки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Если ВыделенныеСтроки.Количество() > 1 ИЛИ РежимПодбора Тогда + ЗначениеВыбора = Новый Массив; + Для каждого Идентификатор Из ВыделенныеСтроки Цикл + ЗначениеВыбора.Добавить(Коллекция.НайтиПоИдентификатору(Идентификатор).Имя); + КонецЦикла; + + Иначе + ЗначениеВыбора = Коллекция.НайтиПоИдентификатору(ВыделенныеСтроки[0]).Имя; + КонецЕсли; + + ОповеститьОВыборе(ЗначениеВыбора); + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьПодсистемы(Команда) + + ПоказыватьПодсистемы = НЕ ПоказыватьПодсистемы; + + Элементы.СпособОтображения.ТекущаяСтраница = ?(ПоказыватьПодсистемы, Элементы.РолиПодсистем, Элементы.СписокРолей); + Элементы.ПоказатьПодсистемы.Пометка = ПоказыватьПодсистемы; + +КонецПроцедуры + + +&НаКлиенте +Процедура РолиВыборЗначения(Элемент, Значение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Если ТипЗнч(Значение) = Тип("Массив") Тогда + ЗначениеВыбора = Новый Массив; + Для каждого Идентификатор Из Значение Цикл + ЗначениеВыбора.Добавить(Роли.НайтиПоИдентификатору(Идентификатор).Имя); + КонецЦикла; + + Иначе + ЗначениеВыбора = Роли.НайтиПоИдентификатору(Значение).Имя; + КонецЕсли; + + ОповеститьОВыборе(ЗначениеВыбора); + +КонецПроцедуры + +&НаКлиенте +Процедура РолиПриАктивизацииСтроки(Элемент) + + Если Элемент.ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ТекущаяРоль = Элемент.ТекущиеДанные.Имя; + + ПриИзмененииТекущейРоли(); + +КонецПроцедуры + + +&НаКлиенте +Процедура ПодсистемыПриАктивизацииСтроки(Элемент) + + // Заполнение ролей подсистемы. + РолиТекущейПодсистемы.Очистить(); + + Если Элемент.ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Для каждого СтрокаРоли Из Роли Цикл + Если Найти(", " + СтрокаРоли.ИменаПодсистем + ", ", ", " + Элемент.ТекущиеДанные.ПолноеИмя + ?(ПоказыватьРолиПодчиненныхПодсистем, "", ", ")) > 0 Тогда + + НоваяСтрока = РолиТекущейПодсистемы.Добавить(); + НоваяСтрока.Имя = СтрокаРоли.Имя; + НоваяСтрока.Синоним = СтрокаРоли.Синоним; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказыватьРолиПодчиненныхПодсистемПриИзменении(Элемент) + + ПодсистемыПриАктивизацииСтроки(Элементы.Подсистемы); + +КонецПроцедуры + + +&НаКлиенте +Процедура РолиТекущейПодсистемыВыборЗначения(Элемент, Значение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Если ТипЗнч(Значение) = Тип("Массив") Тогда + ЗначениеВыбора = Новый Массив; + Для каждого Идентификатор Из Значение Цикл + ЗначениеВыбора.Добавить(РолиТекущейПодсистемы.НайтиПоИдентификатору(Идентификатор).Имя); + КонецЦикла; + + Иначе + ЗначениеВыбора = РолиТекущейПодсистемы.НайтиПоИдентификатору(Значение).Имя; + КонецЕсли; + + ОповеститьОВыборе(ЗначениеВыбора); + +КонецПроцедуры + +&НаКлиенте +Процедура РолиТекущейПодсистемыПриАктивизацииСтроки(Элемент) + + Если Элемент.ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ТекущаяРоль = Элемент.ТекущиеДанные.Имя; + + ПриИзмененииТекущейРоли(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции формы +// + +&НаКлиенте +Процедура ПриИзмененииТекущейРоли() + + Если НЕ ЗначениеЗаполнено(ТекущаяРоль) Тогда + Возврат; + КонецЕсли; + + НайденныеСтроки = Роли.НайтиСтроки(Новый Структура("Имя", ТекущаяРоль)); + Если НайденныеСтроки.Количество() > 0 Тогда + Если Элементы.Роли.ТекущаяСтрока <> НайденныеСтроки[0].ПолучитьИдентификатор() Тогда + Элементы.Роли.ТекущаяСтрока = НайденныеСтроки[0].ПолучитьИдентификатор(); + КонецЕсли; + СтрокаРоли = НайденныеСтроки[0]; + + НайденныеСтроки = РолиТекущейПодсистемы.НайтиСтроки(Новый Структура("Имя", ТекущаяРоль)); + Если НайденныеСтроки.Количество() > 0 Тогда + Если Элементы.РолиТекущейПодсистемы.ТекущаяСтрока <> НайденныеСтроки[0].ПолучитьИдентификатор() Тогда + Элементы.РолиТекущейПодсистемы.ТекущаяСтрока = НайденныеСтроки[0].ПолучитьИдентификатор(); + КонецЕсли; + ИначеЕсли ТекущаяПодсистемаРолиУстановлена(СтрокаРоли, Подсистемы.ПолучитьЭлементы()) Тогда + ПодсистемыПриАктивизацииСтроки(Элементы.Подсистемы); + НайденныеСтроки = РолиТекущейПодсистемы.НайтиСтроки(Новый Структура("Имя", ТекущаяРоль)); + Если Элементы.РолиТекущейПодсистемы.ТекущаяСтрока <> НайденныеСтроки[0].ПолучитьИдентификатор() Тогда + Элементы.РолиТекущейПодсистемы.ТекущаяСтрока = НайденныеСтроки[0].ПолучитьИдентификатор(); + КонецЕсли; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ТекущаяПодсистемаРолиУстановлена(СтрокаРоли, ЭлементыПодсистем) + + Для каждого ЭлементПодсистемы Из ЭлементыПодсистем Цикл + Если Найти(", " + СтрокаРоли.ИменаПодсистем + ", ", ", " + ЭлементПодсистемы.ПолноеИмя + ", ") > 0 Тогда + Если Элементы.Подсистемы.ТекущаяСтрока <> ЭлементПодсистемы.ПолучитьИдентификатор() Тогда + Элементы.Подсистемы.ТекущаяСтрока = ЭлементПодсистемы.ПолучитьИдентификатор(); + КонецЕсли; + Возврат Истина; + КонецЕсли; + Если ТекущаяПодсистемаРолиУстановлена(СтрокаРоли, ЭлементПодсистемы.ПолучитьЭлементы()) Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..31e6269dc --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss @@ -0,0 +1,23 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + Предопределенный + Desc + + + Наименование + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ПользователиСписок/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ПользователиСписок/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..342de596b --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ПользователиСписок/ExtInfo/ListSettings.dcss @@ -0,0 +1,25 @@ + + + + + false + ПометкаУдаления + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + Наименование + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..22355dd24 --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form @@ -0,0 +1,1012 @@ + + + + Группа + 24 + + ГруппыПользователей + 25 + true + true + + true + + + ГруппыПользователей + + false + None + CopyToClipboard + Delete + OutputList + + НаименованиеГруппы + 30 + true + true + + true + + + ГруппыПользователей.Description + + + НаименованиеГруппыРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + НаименованиеГруппыКонтекстноеМеню + 31 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + ГруппыПользователейКоманднаяПанель + 27 + Left + true + + + ValueChoice + ГруппыПользователейВыборЗначения + + + BeforeAddRow + ГруппыПользователейПередНачаломДобавления + + + OnActivateRow + ГруппыПользователейПриАктивизацииСтроки + + + ГруппыПользователейСтрокаПоиска + 80 + + ГруппыПользователейСтрокаПоискаРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + ГруппыПользователейСтрокаПоискаКонтекстноеМеню + 81 + true + + ГруппыПользователей + + true + + + + ГруппыПользователейСостояниеПросмотра + 83 + + ГруппыПользователейСостояниеПросмотраРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + ГруппыПользователейСостояниеПросмотраКонтекстноеМеню + 84 + true + + ViewStatusAddition + ГруппыПользователей + + true + + + + ГруппыПользователейУправлениеПоиском + 86 + + ГруппыПользователейУправлениеПоискомРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + ГруппыПользователейУправлениеПоискомКонтекстноеМеню + 87 + true + + SearchControlAddition + ГруппыПользователей + + true + + + + ГруппыПользователейРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ГруппыПользователейКонтекстноеМеню + 26 + true + + Tree + true + true + true + true + true + Row + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + true + + ГруппыПользователей.НомерКартинки + + + CommonPicture.ПиктограммыПользователя + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + + + + ПользователиСписок + 48 + true + true + + true + + + ПользователиСписок + + false + None + CopyToClipboard + Delete + OutputList + + Наименование + 51 + + <key>ru</key> + <value>Пользователь</value> + + true + true + + true + + + ПользователиСписок.Description + + + НаименованиеРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 52 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + ПользователиСписокКоманднаяПанель + 50 + Left + true + + + ValueChoice + ПользователиСписокВыборЗначения + + + BeforeAddRow + ПользователиСписокПередНачаломДобавления + + + ПользователиСписокСтрокаПоиска + 100 + + ПользователиСписокСтрокаПоискаРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + + ПользователиСписокСтрокаПоискаКонтекстноеМеню + 101 + true + + ПользователиСписок + + true + + + + ПользователиСписокСостояниеПросмотра + 103 + + ПользователиСписокСостояниеПросмотраРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + ПользователиСписокСостояниеПросмотраКонтекстноеМеню + 104 + true + + ViewStatusAddition + ПользователиСписок + + true + + + + ПользователиСписокУправлениеПоиском + 106 + + ПользователиСписокУправлениеПоискомРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + + ПользователиСписокУправлениеПоискомКонтекстноеМеню + 107 + true + + SearchControlAddition + ПользователиСписок + + true + + + + ПользователиСписокРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + + ПользователиСписокКонтекстноеМеню + 49 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + ПользователиСписок.НомерКартинки + + + CommonPicture.ПиктограммыПользователя + + 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 + Группа + + + ГруппаРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + LeftNarrowest + Auto + Auto + + + + ГруппаПоказыватьПользователейДочернихГрупп + 58 + + ГруппаНельзяУстановитьСвойство + 60 + + ПоказыватьВсехПользователей + 61 + + <key>ru</key> + <value>Все пользователи</value> + + true + true + + true + + + ПоказыватьВсехПользователейРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + + ПоказыватьВсехПользователейКонтекстноеМеню + 62 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа нельзя установить свойство</value> + + + ru + Группа нельзя установить свойство + + + ГруппаНельзяУстановитьСвойствоРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ГруппаУстановитьСвойство + 59 + + ВыбиратьИерархически + 56 + true + true + + true + + + ВыбиратьИерархически + + Right + + OnChange + ВыбиратьИерархическиПриИзменении + + + ВыбиратьИерархическиРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + + ВыбиратьИерархическиКонтекстноеМеню + 57 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Группа установить свойство</value> + + + ru + Группа установить свойство + + + ГруппаУстановитьСвойствоРасширеннаяПодсказка + 122 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Группа показывать пользователей дочерних групп</value> + + + ru + Группа показывать пользователей дочерних групп + + + ГруппаПоказыватьПользователейДочернихГруппРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + Pages + + Auto + + + + ФормаКоманднаяПанель + -1 + + ВыбратьГруппуПользователей + 68 + + <key>ru</key> + <value>Выбрать группу</value> + + true + true + + true + + false + + ВыбратьГруппуПользователейРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + Form.Item.ГруппыПользователей.StandardCommand.Choose + Normal + PictureAndText + true + true + UserCmds + + StdPicture.ChooseValue + + Auto + + + ВыбратьПользователя + 69 + + <key>ru</key> + <value>Выбрать</value> + + true + true + + true + + false + + ВыбратьПользователяРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + Form.Item.ПользователиСписок.StandardCommand.Choose + Normal + Auto + true + true + UserCmds + Auto + + + СоздатьПользователя + 54 + true + true + + true + + false + + СоздатьПользователяРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Form.Item.ПользователиСписок.StandardCommand.Create + Normal + Auto + true + true + UserCmds + Auto + + + СоздатьГруппуПользователей + 55 + true + true + + true + + false + + СоздатьГруппуПользователейРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + Form.Command.СоздатьГруппуПользователей + Normal + Auto + true + true + UserCmds + Auto + + + КоманднаяПанельПользователи + 53 + + ПользователиИБ + 6 + true + true + + true + + false + + ПользователиИБРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + Catalog.Пользователи.Command.ПользователиИБ + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель пользователи</value> + + + ru + Командная панель пользователи + + + КоманднаяПанельПользователиРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + + Form + + + + ФормаСправка + 70 + true + true + + true + + + ФормаСправкаРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + Create + 90 + DontBlock + Use + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ПользователиСписок + + <key>ru</key> + <value>Пользователи список</value> + + 1 + + DynamicList + + + true + + + true + +
true
+ + ВЫБРАТЬ + Пользователи.Ссылка, + Пользователи.ПометкаУдаления, + Пользователи.Предопределенный, + Пользователи.Наименование, + ВЫБОР + КОГДА Пользователи.ПометкаУдаления + ТОГДА 0 + КОГДА Пользователи.ИдентификаторПользователяИБ = &ПустойУникальныйИдентификатор + ТОГДА 4 + ИНАЧЕ 1 + КОНЕЦ КАК НомерКартинки +ИЗ + Справочник.Пользователи КАК Пользователи +ГДЕ + (&ВыбиратьИерархически + И ИСТИНА В + (ВЫБРАТЬ + ИСТИНА + ИЗ + РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + ГДЕ + СоставГруппПользователей.Пользователь = Пользователи.Ссылка + И СоставГруппПользователей.ГруппаПользователей = &ГруппаПользователей) + ИЛИ (НЕ &ВыбиратьИерархически) + И ИСТИНА В + (ВЫБРАТЬ + ИСТИНА + ИЗ + Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав + ГДЕ + ГруппыПользователейСостав.Пользователь = Пользователи.Ссылка + И ГруппыПользователейСостав.Ссылка = &ГруппаПользователей)) + Catalog.Пользователи + true + true + true + true + true + +
+ + ГруппыПользователей + + <key>ru</key> + <value>Группы пользователей</value> + + 2 + + DynamicList + + + true + + + true + + + ГруппыПользователей.Parent + + + ВЫБРАТЬ + СправочникГруппыПользователей.Ссылка, + СправочникГруппыПользователей.ПометкаУдаления, + СправочникГруппыПользователей.Предопределенный, + СправочникГруппыПользователей.Родитель, + СправочникГруппыПользователей.Наименование, + ВЫБОР + КОГДА СправочникГруппыПользователей.ПометкаУдаления + ТОГДА 2 + ИНАЧЕ 3 + КОНЕЦ КАК НомерКартинки +ИЗ + Справочник.ГруппыПользователей КАК СправочникГруппыПользователей + Catalog.ГруппыПользователей + true + true + true + true + true + + + + ВыбиратьИерархически + + <key>ru</key> + <value>Показывать пользователей дочерних групп</value> + + 3 + + Boolean + + + true + + + true + + + ВыбиратьИерархически + + + + ГруппаПользователейВсеПользователи + + <key>ru</key> + <value>Группа пользователей все пользователи</value> + + 4 + + CatalogRef.ГруппыПользователей + + + true + + + true + + + + СоздатьГруппуПользователей + + <key>ru</key> + <value>Создать группу пользователей</value> + + 3 + + ru + Создать группу пользователей + + + true + + + StdPicture.CreateFolder + + + + СоздатьГруппуПользователей + + + Auto + Auto + + + ВыборГруппПользователей + + Boolean + + + + ЗакрыватьПриВыборе + + + + + + + +
diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..3d28da8c1 --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,216 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ТипЗнч(Параметры.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыПользователей") Тогда + Элементы.ГруппыПользователей.ТекущаяСтрока = Параметры.ТекущаяСтрока; + Иначе + ТекущийЭлемент = Элементы.ПользователиСписок; + Элементы.ГруппыПользователей.ТекущаяСтрока = Справочники.ГруппыПользователей.ВсеПользователи; + ОбновитьЗначениеПараметраКомпоновкиДанных(ПользователиСписок, "ГруппаПользователей", Справочники.ГруппыПользователей.ВсеПользователи); + ОбновитьЗначениеПараметраКомпоновкиДанных(ПользователиСписок, "ВыбиратьИерархически", Истина); + КонецЕсли; + + // Настройка постоянных данных для списка пользователей + ОбновитьЗначениеПараметраКомпоновкиДанных(ПользователиСписок, "ПустойУникальныйИдентификатор", Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); + ГруппаПользователейВсеПользователи = Справочники.ГруппыПользователей.ВсеПользователи; + + Если НЕ ПравоДоступа("Добавление", Метаданные.Справочники.ГруппыПользователей) Тогда + Элементы.СоздатьГруппуПользователей.Видимость = Ложь; + КонецЕсли; + Если НЕ ПравоДоступа("Добавление", Метаданные.Справочники.Пользователи) Тогда + Элементы.СоздатьПользователя.Видимость = Ложь; + КонецЕсли; + + Если Параметры.РежимВыбора Тогда + + Если Элементы.Найти("ПользователиИБ") <> Неопределено Тогда + Элементы.ПользователиИБ.Видимость = Ложь; + КонецЕсли; + + // Отбор не помеченных на удаление + ПользователиСписок.Отбор.Элементы[0].Использование = Истина; + + Элементы.ПользователиСписок.РежимВыбора = Истина; + Элементы.ГруппыПользователей.РежимВыбора = Параметры.ВыборГруппПользователей; + Элементы.ВыбратьГруппуПользователей.Видимость = Параметры.ВыборГруппПользователей; + Элементы.ВыбратьПользователя.КнопкаПоУмолчанию = НЕ Параметры.ВыборГруппПользователей; + + Если Параметры.ЗакрыватьПриВыборе = Ложь Тогда + // Режим подбора + Элементы.ПользователиСписок.МножественныйВыбор = Истина; + Элементы.ПользователиСписок.РежимВыделения = РежимВыделенияТаблицы.Множественный; + + Если Параметры.ВыборГруппПользователей Тогда + Заголовок = НСтр("ru = 'Подбор пользователей и групп'"); + Элементы.ВыбратьПользователя.Заголовок = НСтр("ru = 'Выбрать пользователей'"); + + Элементы.ВыбратьГруппуПользователей.Заголовок = НСтр("ru = 'Выбрать группы'"); + + Элементы.ГруппыПользователей.МножественныйВыбор = Истина; + Элементы.ГруппыПользователей.РежимВыделения = РежимВыделенияТаблицы.Множественный; + Иначе + Заголовок = НСтр("ru = 'Подбор пользователей'"); + КонецЕсли; + Иначе + Если Параметры.ВыборГруппПользователей Тогда + Заголовок = НСтр("ru = 'Выбор пользователя или группы'"); + Элементы.ВыбратьПользователя.Заголовок = НСтр("ru = 'Выбрать пользователя'"); + Иначе + Заголовок = НСтр("ru = 'Выбор пользователя'"); + КонецЕсли; + КонецЕсли; + Иначе + Элементы.ВыбратьПользователя.Видимость = Ложь; + Элементы.ВыбратьГруппуПользователей.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ОбновитьСодержимоеФормыПриИзмененииГруппы(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ИзмененСоставГруппыПользователей" Тогда + Если Параметр = Элементы.ГруппыПользователей.ТекущаяСтрока Тогда + Элементы.ПользователиСписок.Обновить(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + + Если Настройки[ВыбиратьИерархически] = Неопределено Тогда + ВыбиратьИерархически = Истина; + КонецЕсли; + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий команд и элементов формы +// + +&НаКлиенте +Процедура СоздатьГруппуПользователей(Команда) + + Элементы.ГруппыПользователей.ДобавитьСтроку(); + +КонецПроцедуры + + +&НаКлиенте +Процедура ГруппыПользователейПриАктивизацииСтроки(Элемент) + + ОбновитьСодержимоеФормыПриИзмененииГруппы(); + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПользователейВыборЗначения(Элемент, Значение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ОповеститьОВыборе(Значение); + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПользователейПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Если НЕ Копирование Тогда + Отказ = Истина; + ПараметрыФормы = Новый Структура; + + Если ЗначениеЗаполнено(Элементы.ГруппыПользователей.ТекущаяСтрока) Тогда + + ПараметрыФормы.Вставить("ЗначенияЗаполнения", Новый Структура("Родитель", Элементы.ГруппыПользователей.ТекущаяСтрока)); + КонецЕсли; + + ОткрытьФорму("Справочник.ГруппыПользователей.ФормаОбъекта", ПараметрыФормы, Элементы.ГруппыПользователей); + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ПользователиСписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ОповеститьОВыборе(Значение); + +КонецПроцедуры + +&НаКлиенте +Процедура ПользователиСписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Отказ = Истина; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ГруппаНовогоПользователя", Элементы.ГруппыПользователей.ТекущаяСтрока); + + Если Копирование И Элемент.ТекущиеДанные <> Неопределено Тогда + ПараметрыФормы.Вставить("ЗначениеКопирования", Элемент.ТекущаяСтрока); + КонецЕсли; + + ОткрытьФорму("Справочник.Пользователи.ФормаОбъекта", ПараметрыФормы, Элементы.ПользователиСписок); + +КонецПроцедуры + + +&НаКлиенте +Процедура ВыбиратьИерархическиПриИзменении(Элемент) + + ОбновитьСодержимоеФормыПриИзмененииГруппы(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции формы +// + +&НаКлиенте +Процедура ОбновитьСодержимоеФормыПриИзмененииГруппы() + + Если Элементы.ГруппыПользователей.ТекущаяСтрока = ГруппаПользователейВсеПользователи Тогда + + Элементы.ГруппаПоказыватьПользователейДочернихГрупп.ТекущаяСтраница = Элементы.ГруппаНельзяУстановитьСвойство; + ОбновитьЗначениеПараметраКомпоновкиДанных(ПользователиСписок, "ВыбиратьИерархически", Истина); + Иначе + Элементы.ГруппаПоказыватьПользователейДочернихГрупп.ТекущаяСтраница = Элементы.ГруппаУстановитьСвойство; + ОбновитьЗначениеПараметраКомпоновкиДанных(ПользователиСписок, "ВыбиратьИерархически", ВыбиратьИерархически); + КонецЕсли; + + ОбновитьЗначениеПараметраКомпоновкиДанных(ПользователиСписок, "ГруппаПользователей", Элементы.ГруппыПользователей.ТекущаяСтрока); + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура ОбновитьЗначениеПараметраКомпоновкиДанных(Знач ВладелецПараметров, Знач ИмяПараметра, Знач ЗначениеПараметра) + + Для каждого Параметр Из ВладелецПараметров.Параметры.Элементы Цикл + Если Строка(Параметр.Параметр) = ИмяПараметра Тогда + Если Параметр.Использование И Параметр.Значение = ЗначениеПараметра Тогда + Возврат; + КонецЕсли; + Прервать; + КонецЕсли; + КонецЦикла; + + ВладелецПараметров.Параметры.УстановитьЗначениеПараметра(ИмяПараметра, ЗначениеПараметра); + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..c6a4ffab0 --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,3124 @@ + + + + ПолноеИмяОбработкаНесоответствия + 164 + + ПолноеИмяКартинкаПредупреждения + 165 + + <key>ru</key> + <value>Полное имя картинка предупреждения</value> + + true + true + + true + + + ПолноеИмяКартинкаПредупрежденияРасширеннаяПодсказка + 178 + Label + true + true + + Left + + + + ПолноеИмяКартинкаПредупрежденияКонтекстноеМеню + 166 + true + + 5 + true + 3 + true + false + false + + + CommonPicture.Предупреждение32 + + + + + ПолноеИмяПояснениеИКоманда + 167 + + ПолноеИмяПояснениеНесоответствия + 168 + + <key>ru</key> + <value>Полное имя пользователя информационной базы "%1" +не соответствует заданному в поле <Полное имя:></value> + + true + true + + true + + + ru + Предупреждение: при записи полное имя пользователя информационной базы будет обновлено заданным + + + ПолноеИмяПояснениеНесоответствияРасширеннаяПодсказка + 180 + Label + true + true + + Left + + + + ПолноеИмяПояснениеНесоответствияКонтекстноеМеню + 169 + true + + Label + true + true + true + false + + Left + Center + + + + ПолноеИмяВыполнитьСинхронизацию + 170 + true + true + + true + + false + + ПолноеИмяВыполнитьСинхронизациюРасширеннаяПодсказка + 181 + Label + true + true + + Left + + + UsualButton + Form.Command.ПолноеИмяВыполнитьСинхронизацию + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Полное имя пояснение и команда</value> + + + ПолноеИмяПояснениеИКомандаРасширеннаяПодсказка + 179 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Полное имя обработка несоответствия</value> + + true + + ПолноеИмяОбработкаНесоответствияРасширеннаяПодсказка + 177 + Label + true + true + + Left + + + UsualGroup + + Auto + StrongSeparation + true + true + Auto + Auto + + + + СвязьОбработкаНесоответствия + 171 + + СвязьКартинкаПредупреждения + 172 + + <key>ru</key> + <value>Связь картинка предупреждения</value> + + true + true + + true + + + СвязьКартинкаПредупрежденияРасширеннаяПодсказка + 183 + Label + true + true + + Left + + + + СвязьКартинкаПредупрежденияКонтекстноеМеню + 173 + true + + 5 + true + 3 + true + false + false + + + CommonPicture.Предупреждение32 + + + + + СвязьПояснениеНесоответствия + 175 + + <key>ru</key> + <value>Пользователь связан с несуществующим пользователем информационной базы (ИБ). +Чтобы установить связь с новым пользователем ИБ, включите флажок "Доступ к информационной базе разрешен". +Чтобы очистить связь оставьте флажок выключенным.</value> + + true + true + + true + + + СвязьПояснениеНесоответствияРасширеннаяПодсказка + 184 + Label + true + true + + Left + + + + СвязьПояснениеНесоответствияКонтекстноеМеню + 176 + true + + Label + true + 3 + true + true + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Связь обработка несоответствия</value> + + true + + СвязьОбработкаНесоответствияРасширеннаяПодсказка + 182 + Label + true + true + + Left + + + UsualGroup + + Auto + StrongSeparation + true + true + Auto + Auto + + + + Наименование + 49 + true + true + + true + + + Объект.Description + + + OnChange + НаименованиеПриИзменении + + + НаименованиеРасширеннаяПодсказка + 185 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 50 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ДоступКИнформационнойБазеРазрешен + 99 + true + true + + true + + + ДоступКИнформационнойБазеРазрешен + + Right + + OnChange + ДоступКИнформационнойБазеРазрешенПриИзменении + + + ДоступКИнформационнойБазеРазрешенРасширеннаяПодсказка + 187 + Label + true + true + + Left + + + + ДоступКИнформационнойБазеРазрешенКонтекстноеМеню + 100 + true + + CheckBoxField + Enter + true + Left + true + + + + Страницы + 70 + + СвойстваПользователяИБ + 65 + + ОсновныеСвойства + 75 + + ПользовательИнфБазыИмя + 95 + true + true + + true + + + ПользовательИнфБазыИмя + + + ПользовательИнфБазыИмяРасширеннаяПодсказка + 192 + Label + true + true + + Left + + + + ПользовательИнфБазыИмяКонтекстноеМеню + 96 + true + + InputField + Enter + true + Left + true + + 26 + true + true + false + true + true + true + true + Normal + + + + СвойстваАутентификации1СПредприятия + 10 + + ПользовательИнфБазыАутентификацияСтандартная + 19 + true + true + + true + + + ПользовательИнфБазыАутентификацияСтандартная + + Right + + OnChange + ПользовательИнфБазыАутентификацияСтандартнаяПриИзменении + + + ПользовательИнфБазыАутентификацияСтандартнаяРасширеннаяПодсказка + 195 + Label + true + true + + Left + + + + ПользовательИнфБазыАутентификацияСтандартнаяКонтекстноеМеню + 20 + true + + CheckBoxField + Enter + true + Left + true + Left + + + + Пароль + 21 + true + true + + true + + + Пароль + + + OnChange + ПарольПриИзменении + + + ПарольРасширеннаяПодсказка + 197 + Label + true + true + + Left + + + + ПарольКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + Left + + 14 + true + true + false + true + true + true + true + + Style.BorderColor + + Normal + + + + ПодтверждениеПароля + 23 + true + true + + true + + + ПодтверждениеПароля + + + OnChange + ПарольПриИзменении + + + ПодтверждениеПароляРасширеннаяПодсказка + 199 + Label + true + true + + Left + + + + ПодтверждениеПароляКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + Left + + 14 + true + true + false + true + true + true + true + + Style.BorderColor + + Normal + + + + ПользовательИнфБазыЗапрещеноИзменятьПароль + 51 + true + true + + true + + + ПользовательИнфБазыЗапрещеноИзменятьПароль + + Left + + ПользовательИнфБазыЗапрещеноИзменятьПарольРасширеннаяПодсказка + 201 + Label + true + true + + Left + + + + ПользовательИнфБазыЗапрещеноИзменятьПарольКонтекстноеМеню + 52 + true + + CheckBoxField + Enter + true + Left + true + + + + ПользовательИнфБазыПоказыватьВСпискеВыбора + 25 + true + true + + true + + + ПользовательИнфБазыПоказыватьВСпискеВыбора + + Left + + ПользовательИнфБазыПоказыватьВСпискеВыбораРасширеннаяПодсказка + 203 + Label + true + true + + Left + + + + ПользовательИнфБазыПоказыватьВСпискеВыбораКонтекстноеМеню + 26 + true + + CheckBoxField + Enter + true + Left + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Аутентификация 1С:Предприятия</value> + + 32 + false + + СвойстваАутентификации1СПредприятияРасширеннаяПодсказка + 194 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + СвойстваАутентификацииОС + 11 + + ПользовательИнфБазыАутентификацияОС + 27 + true + true + + true + + + ПользовательИнфБазыАутентификацияОС + + Right + + OnChange + ПользовательИнфБазыАутентификацияОСПриИзменении + + + ПользовательИнфБазыАутентификацияОСРасширеннаяПодсказка + 206 + Label + true + true + + Left + + + + ПользовательИнфБазыАутентификацияОСКонтекстноеМеню + 28 + true + + CheckBoxField + Enter + true + Left + true + Left + + + + ПользовательИнфБазыПользовательОС + 29 + true + true + + true + + + ПользовательИнфБазыПользовательОС + + Left + + ПользовательИнфБазыПользовательОСРасширеннаяПодсказка + 208 + Label + true + true + + Left + + + + ПользовательИнфБазыПользовательОСКонтекстноеМеню + 30 + true + + InputField + Enter + true + Left + true + Left + + + StartChoice + ПользовательИнфБазыПользовательОСНачалоВыбора + + 20 + true + true + false + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Аутентификация операционной системы</value> + + 32 + false + + СвойстваАутентификацииОСРасширеннаяПодсказка + 205 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + СвойстваДополнительные + 91 + + ПредставлениеЯзыка + 33 + true + true + + true + + + ПредставлениеЯзыка + + + ПредставлениеЯзыкаРасширеннаяПодсказка + 211 + Label + true + true + + Left + + + + ПредставлениеЯзыкаКонтекстноеМеню + 34 + true + + InputField + Enter + true + Left + true + Left + + 19 + true + true + false + true + true + true + + Style.BorderColor + + Normal + + + + ПредставлениеРежимаЗапуска + 89 + true + true + + true + + + ПредставлениеРежимаЗапуска + + + ПредставлениеРежимаЗапускаРасширеннаяПодсказка + 213 + Label + true + true + + Left + + + + ПредставлениеРежимаЗапускаКонтекстноеМеню + 90 + true + + InputField + Enter + true + Left + true + + 19 + true + true + false + true + true + true + true + + + ru + Авто + + + Авто + + + + + ru + Обычное приложение + + + Обычное приложение + + + + + ru + Управляемое приложение + + + Управляемое приложение + + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Свойства дополнительные</value> + + 32 + false + + СвойстваДополнительныеРасширеннаяПодсказка + 210 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Equal + Auto + Auto + + + true + true + + true + + true + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + true + Role.ПолныеПрава + + + + <key>ru</key> + <value>Основные свойства</value> + + + ОсновныеСвойстваРасширеннаяПодсказка + 191 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ОтображениеРолей + 103 + + ТолькоВыбранныеРоли + 104 + + Роли + 105 + + <key>ru</key> + <value>Разрешенные действия (роли)</value> + + + System.DefaultGUIFont + true + false + false + false + + true + true + + true + + + Роли + + false + None + CancelSearch + Copy + CopyToClipboard + EndEdit + Find + OutputList + + СинонимРоли + 159 + + <key>ru</key> + <value>Разрешенное действие (роль)</value> + + true + true + + true + + + Роли.СинонимРоли + + + ru + Синоним роли, как он задан в конфигураторе + + + OnChange + СинонимРолиПриИзменении + + + СинонимРолиРасширеннаяПодсказка + 241 + Label + true + true + + Left + + + + СинонимРолиКонтекстноеМеню + 160 + true + + InputField + true + Enter + true + Left + true + + + AutoComplete + СинонимРолиАвтоПодбор + + + StartChoice + СинонимРолиНачалоВыбора + + + TextEditEnd + СинонимРолиОкончаниеВводаТекста + + + ChoiceProcessing + СинонимРолиОбработкаВыбора + + true + true + true + true + true + true + true + Normal + + + + РолиКоманднаяПанель + 107 + + РолиПодобрать + 117 + true + true + + true + + false + + РолиПодобратьРасширеннаяПодсказка + 223 + Label + true + true + + Left + + + Form.Command.ПодобратьРоли + Normal + Auto + true + true + UserCmds + Auto + + + РолиДобавить + 118 + true + true + + true + + false + + РолиДобавитьРасширеннаяПодсказка + 224 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + РолиУдалить + 120 + true + true + + true + + false + + РолиУдалитьРасширеннаяПодсказка + 225 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + РолиПереместитьВверх + 121 + true + true + + true + + false + + РолиПереместитьВверхРасширеннаяПодсказка + 226 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + РолиПереместитьВниз + 122 + true + true + + true + + false + + РолиПереместитьВнизРасширеннаяПодсказка + 227 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + РолиСортироватьСписокПоВозрастанию + 123 + true + true + + true + + false + + РолиСортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 228 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + РолиСортироватьСписокПоУбыванию + 124 + true + true + + true + + false + + РолиСортироватьСписокПоУбываниюРасширеннаяПодсказка + 229 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + РолиПоказатьСредиВсехВыбранныеРоли + 125 + true + true + + true + + false + + РолиПоказатьСредиВсехВыбранныеРолиРасширеннаяПодсказка + 230 + Label + true + true + + Left + + + Form.Command.ПоказатьТолькоВыбранныеРоли + Normal + Auto + true + true + UserCmds + true + Auto + + Left + + + OnEditEnd + РолиПриОкончанииРедактирования + + + ChoiceProcessing + РолиОбработкаВыбора + + + OnChange + РолиПриИзменении + + + РолиСтрокаПоиска + 232 + + РолиСтрокаПоискаРасширеннаяПодсказка + 234 + Label + true + true + + Left + + + + РолиСтрокаПоискаКонтекстноеМеню + 233 + true + + Роли + + true + + + + РолиСостояниеПросмотра + 235 + + РолиСостояниеПросмотраРасширеннаяПодсказка + 237 + Label + true + true + + Left + + + + РолиСостояниеПросмотраКонтекстноеМеню + 236 + true + + ViewStatusAddition + Роли + + true + + + + РолиУправлениеПоиском + 238 + + РолиУправлениеПоискомРасширеннаяПодсказка + 240 + Label + true + true + + Left + + + + РолиУправлениеПоискомКонтекстноеМеню + 239 + true + + SearchControlAddition + Роли + + true + + + + РолиРасширеннаяПодсказка + 231 + Label + true + true + + Left + + + + РолиКонтекстноеМеню + 106 + + КонтекстноеМенюРолиПодобрать + 110 + true + true + + true + + false + + КонтекстноеМенюРолиПодобратьРасширеннаяПодсказка + 217 + Label + true + true + + Left + + + Form.Command.ПодобратьРоли + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиДобавить + 111 + true + true + + true + + false + + КонтекстноеМенюРолиДобавитьРасширеннаяПодсказка + 218 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиУдалить + 113 + true + true + + true + + false + + КонтекстноеМенюРолиУдалитьРасширеннаяПодсказка + 219 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиПереместитьВверх + 114 + true + true + + true + + false + + КонтекстноеМенюРолиПереместитьВверхРасширеннаяПодсказка + 220 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиПереместитьВниз + 115 + true + true + + true + + false + + КонтекстноеМенюРолиПереместитьВнизРасширеннаяПодсказка + 221 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиВыделитьВсе + 116 + true + true + + true + + false + + КонтекстноеМенюРолиВыделитьВсеРасширеннаяПодсказка + 222 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.SelectAll + Normal + Auto + true + true + UserCmds + Auto + + + 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>Только выбранные роли</value> + + + ТолькоВыбранныеРолиРасширеннаяПодсказка + 216 + Label + true + true + + Left + + + Page + + Vertical + auto + +
+ + СредиВсехВыбранныеРоли + 126 + + ТаблицаРолей + 127 + true + true + + true + + + ТаблицаРолей + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + OutputList + SelectAll + + ТаблицаРолейПометка + 147 + true + true + + true + + + ТаблицаРолей.Пометка + + None + + OnChange + ТаблицаРолейПометкаПриИзменении + + + ТаблицаРолейПометкаРасширеннаяПодсказка + 271 + Label + true + true + + Left + + + + ТаблицаРолейПометкаКонтекстноеМеню + 148 + true + + CheckBoxField + Auto + true + Left + true + + + + ТаблицаРолейСиноним + 149 + true + true + + true + + + ТаблицаРолей.Синоним + + + ru + Синоним роли, как он задан в конфигураторе + + + ТаблицаРолейСинонимРасширеннаяПодсказка + 273 + Label + true + true + + Left + + + + ТаблицаРолейСинонимКонтекстноеМеню + 150 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейСинонимыПодсистем + 151 + true + true + + + ТаблицаРолей.СинонимыПодсистем + + + ru + Синонимы подсистем, в которые входит роль + + + ТаблицаРолейСинонимыПодсистемРасширеннаяПодсказка + 275 + Label + true + true + + Left + + + + ТаблицаРолейСинонимыПодсистемКонтекстноеМеню + 152 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейИмя + 153 + true + true + + + ТаблицаРолей.Имя + + + ru + Имя роли, как оно задано в конфигураторе + + + ТаблицаРолейИмяРасширеннаяПодсказка + 277 + Label + true + true + + Left + + + + ТаблицаРолейИмяКонтекстноеМеню + 154 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейИменаПодсистем + 155 + true + true + + + ТаблицаРолей.ИменаПодсистем + + + ru + Имена подсистем, в которые входит роль + + + ТаблицаРолейИменаПодсистемРасширеннаяПодсказка + 279 + Label + true + true + + Left + + + + ТаблицаРолейИменаПодсистемКонтекстноеМеню + 156 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейКоманднаяПанель + 129 + + ТаблицаРолейУстановитьФлажки + 140 + true + true + + true + + false + + ТаблицаРолейУстановитьФлажкиРасширеннаяПодсказка + 254 + Label + true + true + + Left + + + Form.Command.УстановитьФлажки + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРолейСнятьФлажки + 141 + true + true + + true + + false + + ТаблицаРолейСнятьФлажкиРасширеннаяПодсказка + 255 + Label + true + true + + Left + + + Form.Command.СнятьФлажки + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРолейНайти + 142 + true + true + + true + + false + + ТаблицаРолейНайтиРасширеннаяПодсказка + 256 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейОтменитьПоиск + 143 + true + true + + true + + false + + ТаблицаРолейОтменитьПоискРасширеннаяПодсказка + 257 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейСортироватьСписокПоВозрастанию + 144 + true + true + + true + + false + + ТаблицаРолейСортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 258 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейСортироватьСписокПоУбыванию + 145 + true + true + + true + + false + + ТаблицаРолейСортироватьСписокПоУбываниюРасширеннаяПодсказка + 259 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейПоказатьТолькоВыбранныеРоли + 146 + true + true + + true + + false + + ТаблицаРолейПоказатьТолькоВыбранныеРолиРасширеннаяПодсказка + 260 + Label + true + true + + Left + + + Form.Command.ПоказатьТолькоВыбранныеРоли + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + ТаблицаРолейСтрокаПоиска + 262 + + ТаблицаРолейСтрокаПоискаРасширеннаяПодсказка + 264 + Label + true + true + + Left + + + + ТаблицаРолейСтрокаПоискаКонтекстноеМеню + 263 + true + + ТаблицаРолей + + true + + + + ТаблицаРолейСостояниеПросмотра + 265 + + ТаблицаРолейСостояниеПросмотраРасширеннаяПодсказка + 267 + Label + true + true + + Left + + + + ТаблицаРолейСостояниеПросмотраКонтекстноеМеню + 266 + true + + ViewStatusAddition + ТаблицаРолей + + true + + + + ТаблицаРолейУправлениеПоиском + 268 + + ТаблицаРолейУправлениеПоискомРасширеннаяПодсказка + 270 + Label + true + true + + Left + + + + ТаблицаРолейУправлениеПоискомКонтекстноеМеню + 269 + true + + SearchControlAddition + ТаблицаРолей + + true + + + + ТаблицаРолейРасширеннаяПодсказка + 261 + Label + true + true + + Left + + + + ТаблицаРолейКонтекстноеМеню + 128 + + КонтекстноеМенюТаблицаРолейНайти + 158 + true + true + + true + + false + + КонтекстноеМенюТаблицаРолейНайтиРасширеннаяПодсказка + 252 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюТаблицаРолейОтменитьПоиск + 157 + true + true + + true + + false + + КонтекстноеМенюТаблицаРолейОтменитьПоискРасширеннаяПодсказка + 253 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + true + + 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>Среди всех выбранные роли</value> + + + СредиВсехВыбранныеРолиРасширеннаяПодсказка + 251 + Label + true + true + + Left + + + Page + + Vertical + auto + +
+ true + true + + true + + + <key>ru</key> + <value>Отображение ролей</value> + + + ОтображениеРолейРасширеннаяПодсказка + 215 + Label + true + true + + Left + + + Pages + + Auto + +
+ true + true + + true + + + <key>ru</key> + <value>Свойства пользователя информационной базы</value> + + + СвойстваПользователяИБРасширеннаяПодсказка + 190 + Label + true + true + + Left + + + Page + + auto + +
+ + КонтактнаяИнформация + 71 + true + true + + true + + + <key>ru</key> + <value>Адреса, телефоны</value> + + + КонтактнаяИнформацияРасширеннаяПодсказка + 289 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы</value> + + + СтраницыРасширеннаяПодсказка + 189 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + +
+ + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + + FillCheckProcessingAtServer + ОбработкаПроверкиЗаполненияНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + LockOwner + Use + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.Пользователи + + + true + + + true + +
true
+ true +
+ + ПользовательИнфБазыАутентификацияСтандартная + + <key>ru</key> + <value>Аутентификация 1С:Предприятия</value> + + 2 + + Boolean + + + true + + + true + + true + + + Пароль + + <key>ru</key> + <value>Пароль</value> + + 3 + + String + + + + true + + + true + + true + + + ПодтверждениеПароля + + <key>ru</key> + <value>Подтверждение пароля</value> + + 4 + + String + + + + true + + + true + + true + + + ПользовательИнфБазыПароль + + <key>ru</key> + <value>Пользователь инф базы пароль</value> + + 5 + + + true + + + true + + true + + + ПользовательИнфБазыПоказыватьВСпискеВыбора + + <key>ru</key> + <value>Показывать в списке выбора</value> + + 6 + + Boolean + + + true + + + true + + true + + + ПользовательИнфБазыАутентификацияОС + + <key>ru</key> + <value>Аутентификация операционной системы</value> + + 7 + + Boolean + + + true + + + true + + true + + + ПользовательИнфБазыПользовательОС + + <key>ru</key> + <value>Пользователь</value> + + 8 + + String + + + + true + + + true + + true + + + ПредставлениеЯзыка + + <key>ru</key> + <value>Язык</value> + + 10 + + String + + + + true + + + true + + true + + + Роли + + <key>ru</key> + <value>Роли</value> + + 11 + + ValueTable + + + true + + true + Role.ПолныеПрава + + + + 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> + + 13 + + Boolean + + + true + + + true + + true + + + ПредставлениеРежимаЗапуска + + <key>ru</key> + <value>Режима запуска</value> + + 15 + + String + + + + true + + + true + + true + + + ПользовательИнфБазыИмя + + <key>ru</key> + <value>Имя</value> + + 16 + + String + + + + true + + + true + + true + + + ДоступКИнформационнойБазеРазрешен + + <key>ru</key> + <value>Доступ к информационной базе разрешен</value> + + 17 + + Boolean + + + true + + + true + + true + + + ПользовательИнфБазыПолноеИмя + + <key>ru</key> + <value>Пользователь инф базы полное имя</value> + + 14 + + + true + + + true + + true + + + ПользовательИБСуществует + + <key>ru</key> + <value>Пользователь ИБСуществует</value> + + 23 + + Boolean + + + true + + + true + + true + + + СписокВыбораРолей + + <key>ru</key> + <value>Список выбора ролей</value> + + 12 + + ValueList + + + true + + + true + + + + + + + ТаблицаРолей + + <key>ru</key> + <value>Таблица ролей</value> + + 25 + + ValueTable + + + true + + + true + + true + + Имя + + <key>ru</key> + <value>Имя роли</value> + + 1 + + String + + + + true + + + true + + + + Синоним + + <key>ru</key> + <value>Разрешенное действие (роль)</value> + + 2 + + String + + + + true + + + true + + + + ИменаПодсистем + + <key>ru</key> + <value>Имена подсистем</value> + + 3 + + String + + + + true + + + true + + + + СинонимыПодсистем + + <key>ru</key> + <value>Подсистемы</value> + + 4 + + String + + + + true + + + true + + + + Пометка + + <key>ru</key> + <value>Пометка</value> + + 5 + + Boolean + + + true + + + true + + + + + ПоказатьТолькоВыбранныеРоли + + <key>ru</key> + <value>Показать только выбранные роли</value> + + 26 + + Boolean + + + true + + + true + + + ПоказатьТолькоВыбранныеРоли + + + + ГруппаНовогоПользователя + + <key>ru</key> + <value>Группа нового пользователя</value> + + 21 + + CatalogRef.ГруппыПользователей + + + true + + + true + + + + ДействияВФорме + + <key>ru</key> + <value>Действия в форме</value> + + 22 + + + true + + + true + + + + СтарыйИдентификаторПользователяИБ + + <key>ru</key> + <value>Старый идентификатор пользователя ИБ</value> + + 9 + + UUID + + + true + + + true + + + + ТекущееНаименование + + <key>ru</key> + <value>Текущее наименование</value> + + 20 + + String + + + + true + + + true + + + + ЕстьСвязьСНесуществующимПользователемИБ + + <key>ru</key> + <value>Есть связь с несуществующим пользователем ИБ</value> + + 18 + + Boolean + + + true + + + true + + + + ПодобратьРоли + + <key>ru</key> + <value>Подобрать</value> + + 2 + + ru + Подобрать роли + + + true + + + + ПодобратьРоли + + + true + Auto + Auto + + + ПоказатьТолькоВыбранныеРоли + + <key>ru</key> + <value>Показать только выбранные роли</value> + + 3 + + ru + Показать только выбранные роли + + + true + + + CommonPicture.ПоказатьТолькоВыбранныеРоли + + + + ПоказатьТолькоВыбранныеРоли + + + Picture + Auto + Auto + + + СнятьФлажки + + <key>ru</key> + <value>Снять флажки</value> + + 5 + + ru + Снять флажки + + + true + + + StdPicture.UncheckAll + + + + СнятьФлажки + + + true + Auto + Auto + + + УстановитьФлажки + + <key>ru</key> + <value>Установить флажки</value> + + 6 + + ru + Установить флажки + + + true + + + StdPicture.CheckAll + + + + УстановитьФлажки + + + true + Auto + Auto + + + ПолноеИмяВыполнитьСинхронизацию + + <key>ru</key> + <value>Задать полное имя, как у пользователя информационной базы</value> + + 1 + + ru + Предупреждение: при записи полное имя пользователя информационной базы будет обновлено заданным + + + true + + + CommonPicture.ПользователиВыполнитьСинхронизацию + + + + ПолноеИмяВыполнитьСинхронизацию + + + TextPicture + true + Auto + Auto + + + ГруппаНовогоПользователя + + CatalogRef.ГруппыПользователей + + + + ИдентификаторПользователяИБ + + UUID + + + + + + 0 + + + + + + + + AfterWrite + ПослеЗаписи + + + AfterWriteAtServer + ПослеЗаписиНаСервере + + + BeforeWrite + ПередЗаписью + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + + OnWriteAtServer + ПриЗаписиНаСервере + + +
diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Help/ru.html new file mode 100644 index 000000000..132bd51ca --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Help/ru.html @@ -0,0 +1,3 @@ + +

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

+

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

\ No newline at end of file diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..4d8460c40 --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,1067 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + //** Установка начальных значений + // перед загрузкой данных из настроек на сервере + // для случая, когда данные ещё не были записаны и не загружаются + ПоказатьТолькоВыбранныеРоли = (Элементы.ОтображениеРолей.ТекущаяСтраница = Элементы.ТолькоВыбранныеРоли); + + //** Заполнение постоянных данных + + ПодготовитьСписокВыбораИТаблицуРолей(); + + // Заполнение списка выбора языка + Для каждого МетаданныеЯзыка ИЗ Метаданные.Языки Цикл + Элементы.ПредставлениеЯзыка.СписокВыбора.Добавить(МетаданныеЯзыка.Синоним); + КонецЦикла; + + //** Подготовка к интерактивным действиям с учетом сценариев открытия формы + + УстановитьДействияСРолями(); + + УстановитьПривилегированныйРежим(Истина); + + Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда + // Создание нового элемента + Если Параметры.ГруппаНовогоПользователя <> Справочники.ГруппыПользователей.ВсеПользователи Тогда + ГруппаНовогоПользователя = Параметры.ГруппаНовогоПользователя; + КонецЕсли; + Если ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда + // Копирование элемента + Объект.Наименование = ""; + ПрочитатьПользователяИБ(ЗначениеЗаполнено(Параметры.ЗначениеКопирования.ИдентификаторПользователяИБ)); + Иначе + // Добавление элемента + Объект.ИдентификаторПользователяИБ = Параметры.ИдентификаторПользователяИБ; + // Чтение начальных значений свойств пользователя ИБ + ПрочитатьПользователяИБ(); + КонецЕсли; + Иначе + // Открытие существующего элемента + ПрочитатьПользователяИБ(); + КонецЕсли; + + УстановитьПривилегированныйРежим(Ложь); + + ОпределитьДействияВФорме(); + + ОпределитьНесоответствияПользователяСПользователемИБ(); + + //** Установка постоянной доступности свойств + Элементы.КонтактнаяИнформация.Видимость = ЗначениеЗаполнено(ДействияВФорме.КонтактнаяИнформация); + Элементы.СвойстваПользователяИБ.Видимость = ЗначениеЗаполнено(ДействияВФорме.СвойстваПользователяИБ); + Элементы.ОтображениеРолей.Видимость = ЗначениеЗаполнено(ДействияВФорме.Роли); + + ТолькоПросмотр = ТолькоПросмотр ИЛИ + ДействияВФорме.Роли <> "Редактирование" И + ДействияВФорме.КонтактнаяИнформация <> "Редактирование" И + НЕ ( ДействияВФорме.СвойстваПользователяИБ = "РедактированиеВсех" ИЛИ + ДействияВФорме.СвойстваПользователяИБ = "РедактированиеСвоих" ) И + ДействияВФорме.СвойстваЭлемента <> "Редактирование"; + + УстановитьТолькоПросмотрРолей(ДействияВФорме.Роли <> "Редактирование"); + + ПометитьРолиПоСписку(); + + //** Обработчик подсистемы "Контактная информация" + УправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтаФорма, Объект, "КонтактнаяИнформация"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + #Если ВебКлиент Тогда + Элементы.ПользовательИнфБазыПользовательОС.КнопкаВыбора = Ложь; + #КонецЕсли + + УстановитьДоступностьСвойств(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗаписью(Отказ) + + ОчиститьСообщения(); + + Если ДействияВФорме.Роли = "Редактирование" И Роли.Количество() = 0 Тогда + + Если Вопрос(НСтр("ru = 'Пользователю информационной базы не установлено ни одной роли. Продолжить?'"), + РежимДиалогаВопрос.ДаНет, + , + , + НСтр("ru = 'Запись пользователя информационной базы'")) = КодВозвратаДиалога.Нет Тогда + Отказ = Истина; + КонецЕсли; + КонецЕсли; + + Если ТребуетсяСоздатьПервогоАдминистратора() Тогда + ТекстВопроса = НСтр("ru = 'Первый пользователь информационной базы должен иметь полные права. + |Роль будет добавлена автоматически. Продолжить?'"); + ПользователиКлиентПереопределяемый.ТекстВопросаПередЗаписьюПервогоАдминистратора(ТекстВопроса); + Если Вопрос(ТекстВопроса, + РежимДиалогаВопрос.ДаНет, + , + , + НСтр("ru = 'Запись пользователя информационной базы'")) = КодВозвратаДиалога.Нет Тогда + Отказ = Истина; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + Если ТребуетсяСоздатьПервогоАдминистратора() Тогда + ПараметрыЗаписи.Вставить("ЗаписьПервогоАдминистратора"); + КонецЕсли; + + Если ДействияВФорме.СвойстваЭлемента <> "Редактирование" Тогда + ЗаполнитьЗначенияСвойств(ТекущийОбъект, ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ТекущийОбъект.Ссылка, "Наименование, ПометкаУдаления")); + КонецЕсли; + + ТекущийОбъект.ДополнительныеСвойства.Вставить("ГруппаНовогоПользователя", ГруппаНовогоПользователя); + + Если ДоступКИнформационнойБазеРазрешен Тогда + + Если Элементы.ПолноеИмяПояснениеНесоответствия.Видимость Тогда + ПользовательИнфБазыПолноеИмя = Объект.Наименование; + КонецЕсли; + + ЗаписатьПользователяИБ(ТекущийОбъект, Отказ); + Если НЕ Отказ Тогда + Если ТекущийОбъект.ИдентификаторПользователяИБ <> СтарыйИдентификаторПользователяИБ Тогда + ПараметрыЗаписи.Вставить("ДобавленПользовательИБ", ТекущийОбъект.ИдентификаторПользователяИБ); + Иначе + ПараметрыЗаписи.Вставить("ИзмененПользовательИБ", ТекущийОбъект.ИдентификаторПользователяИБ); + КонецЕсли + КонецЕсли; + + ИначеЕсли НЕ ЕстьСвязьСНесуществующимПользователемИБ ИЛИ + ДействияВФорме.СвойстваПользователяИБ = "РедактированиеВсех" Тогда + + ТекущийОбъект.ИдентификаторПользователяИБ = Неопределено; + КонецЕсли; + + // Обработчик подсистемы "Контактная информация" + Если НЕ Отказ И ДействияВФорме.КонтактнаяИнформация = "Редактирование" Тогда + УправлениеКонтактнойИнформацией.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект, Отказ); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + Если НЕ ДоступКИнформационнойБазеРазрешен И ПользовательИБСуществует Тогда + УдалитьПользователяИБ(Отказ); + Если НЕ Отказ Тогда + ПараметрыЗаписи.Вставить("УдаленПользовательИБ", СтарыйИдентификаторПользователяИБ); + КонецЕсли; + КонецЕсли; + + Если ПараметрыЗаписи.Свойство("ЗаписьПервогоАдминистратора") Тогда + УстановитьПривилегированныйРежим(Истина); + ПользователиПереопределяемый.ПриЗаписиПервогоАдминистратора(Объект.Ссылка); + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + + Если ТекущийОбъект.ДополнительныеСвойства.Свойство("ЕстьОшибки") Тогда + ПараметрыЗаписи.Вставить("ЕстьОшибки"); + КонецЕсли; + + ПрочитатьПользователяИБ(); + + ОпределитьНесоответствияПользователяСПользователемИБ(ПараметрыЗаписи); + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + Если ПараметрыЗаписи.Свойство("ДобавленПользовательИБ") Тогда + Оповестить("ДобавленПользовательИБ", ПараметрыЗаписи.ДобавленПользовательИБ, ЭтаФорма); + + ИначеЕсли ПараметрыЗаписи.Свойство("ИзмененПользовательИБ") Тогда + Оповестить("ИзмененПользовательИБ", ПараметрыЗаписи.ИзмененПользовательИБ, ЭтаФорма); + + ИначеЕсли ПараметрыЗаписи.Свойство("УдаленПользовательИБ") Тогда + Оповестить("УдаленПользовательИБ", ПараметрыЗаписи.УдаленПользовательИБ, ЭтаФорма); + + ИначеЕсли ПараметрыЗаписи.Свойство("ОчищенаСвязьСНесуществущимПользователемИБ") Тогда + Оповестить("ОчищенаСвязьСНесуществущимПользователемИБ", ПараметрыЗаписи.ОчищенаСвязьСНесуществущимПользователемИБ, ЭтаФорма); + КонецЕсли; + + Если ПараметрыЗаписи.Свойство("ЕстьОшибки") Тогда + Предупреждение(НСтр("ru = 'При записи возникли ошибки (см. журнал регистрации)'")); + КонецЕсли; + + Если ЗначениеЗаполнено(ГруппаНовогоПользователя) Тогда + ОповеститьОбИзменении(ГруппаНовогоПользователя); + Оповестить("ИзмененСоставГруппыПользователей", ГруппаНовогоПользователя, ЭтаФорма); + ГруппаНовогоПользователя = Неопределено; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + + Если ДоступКИнформационнойБазеРазрешен Тогда + + ОбработкаПроверкиЗаполненияСпискаРолей(Отказ); + + Если НЕ Отказ И ПустаяСтрока(ПользовательИнфБазыИмя) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Не заполнено имя пользователя информационной базы.'"), , + "ПользовательИнфБазыИмя", , + Отказ); + КонецЕсли; + + Если НЕ Отказ И ПользовательИнфБазыПароль <> Неопределено И Пароль <> ПодтверждениеПароля Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Пароль и подтверждение пароля не совпадают.'"), , + "Пароль", , + Отказ); + Возврат; + КонецЕсли; + + Если НЕ Отказ И НЕ ПустаяСтрока(ПользовательИнфБазыПользовательОС) Тогда + УстановитьПривилегированныйРежим(Истина); + Попытка + ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя(); + ПользовательИБ.ПользовательОС = ПользовательИнфБазыПользовательОС; + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Пользователь ОС должен быть в формате + |\\ИмяДомена\ИмяПользователя'"), , + "ПользовательИнфБазыПользовательОС", , + Отказ); + КонецПопытки; + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + КонецЕсли; + + Если Отказ Тогда + ПроверяемыеРеквизиты.Очистить(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + + Если Настройки["ПоказатьТолькоВыбранныеРоли"] = Ложь Тогда + Элементы.ОтображениеРолей.ТекущаяСтраница = Элементы.СредиВсехВыбранныеРоли; + Иначе + Элементы.ОтображениеРолей.ТекущаяСтраница = Элементы.ТолькоВыбранныеРоли; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий команд и элементов формы +// + +&НаКлиенте +Процедура ПолноеИмяВыполнитьСинхронизацию(Команда) + + Объект.Наименование = ПользовательИнфБазыПолноеИмя; + Элементы.ПолноеИмяОбработкаНесоответствия.Видимость = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура НаименованиеПриИзменении(Элемент) + + // Если ПолноеИмя определено, то его нужно обновлять. + // Прим.: неопределенное ПолноеИмя или другое свойство + // не учитывается при записи пользователя ИБ + // ПолноеИмя определено только для вида + // интерактивных действий "БезОграничения" + Если ПользовательИнфБазыПолноеИмя <> Неопределено Тогда + ПользовательИнфБазыПолноеИмя = Объект.Наименование; + КонецЕсли; + + Если НЕ ПользовательИБСуществует И ДоступКИнформационнойБазеРазрешен Тогда + ПользовательИнфБазыИмя = ПолучитьКраткоеИмяПользователяИБ(Объект.Наименование); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ДоступКИнформационнойБазеРазрешенПриИзменении(Элемент) + + Если НЕ ПользовательИБСуществует И ДоступКИнформационнойБазеРазрешен Тогда + ПользовательИнфБазыИмя = ПолучитьКраткоеИмяПользователяИБ(Объект.Наименование); + ПользовательИнфБазыПолноеИмя = Объект.Наименование; + КонецЕсли; + + УстановитьДоступностьСвойств(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПользовательИнфБазыАутентификацияСтандартнаяПриИзменении(Элемент) + + УстановитьДоступностьСвойств(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПарольПриИзменении(Элемент) + + ПользовательИнфБазыПароль = Пароль; + +КонецПроцедуры + +&НаКлиенте +Процедура ПользовательИнфБазыАутентификацияОСПриИзменении(Элемент) + + УстановитьДоступностьСвойств(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПользовательИнфБазыПользовательОСНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + #Если НЕ ВебКлиент Тогда + Результат = ОткрытьФормуМодально("Справочник.Пользователи.Форма.ФормаВыбораПользователяОС"); + + Если ТипЗнч(Результат) = Тип("Строка") Тогда + ПользовательИнфБазыПользовательОС = Результат; + КонецЕсли; + #КонецЕсли + +КонецПроцедуры + +//** Для работы интерфейса ролей + +&НаКлиенте +Процедура ПодобратьРоли(Команда) + + ОткрытьФорму("Справочник.Пользователи.Форма.ФормаВыбораРолей", Новый Структура("ЗакрыватьПриВыборе", Ложь), Элементы.Роли); + +КонецПроцедуры + +&НаКлиенте +Процедура РолиПриИзменении(Элемент) + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаКлиенте +Процедура РолиПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаКлиенте +Процедура РолиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + ДобавитьВыбранныеРоли(ВыбранноеЗначение); + +КонецПроцедуры + + +&НаКлиенте +Процедура СинонимРолиПриИзменении(Элемент) + + Если ЗначениеЗаполнено(Элементы.Роли.ТекущиеДанные.СинонимРоли) Тогда + Элементы.Роли.ТекущиеДанные.СинонимРоли = СписокВыбораРолей.НайтиПоЗначению(Элементы.Роли.ТекущиеДанные.Роль).Представление; + Иначе + Элементы.Роли.ТекущиеДанные.Роль = ""; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + НачальноеЗначение = ?(Элементы.Роли.ТекущиеДанные = Неопределено, Неопределено, Элементы.Роли.ТекущиеДанные.Роль); + ОткрытьФорму("Справочник.Пользователи.Форма.ФормаВыбораРолей", Новый Структура("ТекущаяСтрока", НачальноеЗначение), Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Элементы.Роли.ТекущиеДанные.Роль = ВыбранноеЗначение; + Элементы.Роли.ТекущиеДанные.СинонимРоли = СписокВыбораРолей.НайтиПоЗначению(Элементы.Роли.ТекущиеДанные.Роль).Представление; + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = СформироватьДанныеВыбораРолей(Текст); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = СформироватьДанныеВыбораРолей(Текст); + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ТаблицаРолейПометкаПриИзменении(Элемент) + + СтрокаТаблицы = Элементы.ТаблицаРолей.ТекущиеДанные; + + НайденныеРоли = Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)); + + Если СтрокаТаблицы.Пометка Тогда + Если НайденныеРоли.Количество() = 0 Тогда + Строка = Роли.Добавить(); + Строка.Роль = СтрокаТаблицы.Имя; + Строка.СинонимРоли = СтрокаТаблицы.Синоним; + КонецЕсли; + ИначеЕсли НайденныеРоли.Количество() > 0 Тогда + Роли.Удалить(НайденныеРоли[0]); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьТолькоВыбранныеРоли(Команда) + + ПоказатьТолькоВыбранныеРоли = НЕ ПоказатьТолькоВыбранныеРоли; + + Элементы.ОтображениеРолей.ТекущаяСтраница = ?(ПоказатьТолькоВыбранныеРоли, Элементы.ТолькоВыбранныеРоли, Элементы.СредиВсехВыбранныеРоли); + ТекущийЭлемент = ?(ПоказатьТолькоВыбранныеРоли, Элементы.Роли, Элементы.ТаблицаРолей); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьФлажки(Команда) + + УстановитьФлажкиНаСервере(); + +КонецПроцедуры + +&НаКлиенте +Процедура СнятьФлажки(Команда) + + СнятьФлажкиНаСервере(); + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции формы +// + +&НаСервере +Функция ТребуетсяСоздатьПервогоАдминистратора() + + УстановитьПривилегированныйРежим(Истина); + + Если ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() = 0 Тогда + // + Если ПользователиПереопределяемый.ЗапретРедактированияРолей() + ИЛИ Роли.НайтиСтроки(Новый Структура("Роль", "ПолныеПрава")).Количество() = 0 Тогда + // + Возврат Истина; + КонецЕсли; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +&НаСервере +Процедура ОпределитьДействияВФорме() + + ДействияВФорме = Новый Структура; + ДействияВФорме.Вставить("Роли", ""); // "", "Просмотр", "Редактирование" + ДействияВФорме.Вставить("КонтактнаяИнформация", ""); // "", "Просмотр", "Редактирование" + ДействияВФорме.Вставить("СвойстваПользователяИБ", ""); // "", "ПросмотрВсех", "РедактированиеВсех", "РедактированиеСвоих" + ДействияВФорме.Вставить("СвойстваЭлемента", ""); // "", "Просмотр", "Редактирование" + + Если Пользователи.ЭтоПолноправныйПользовательИБ() Тогда + // Администратор + ДействияВФорме.Роли = "Редактирование"; + ДействияВФорме.КонтактнаяИнформация = "Редактирование"; + ДействияВФорме.СвойстваПользователяИБ = "РедактированиеВсех"; + ДействияВФорме.СвойстваЭлемента = "Редактирование"; + + ИначеЕсли ЗначениеЗаполнено(ОбщегоНазначения.ТекущийПользователь()) И + Объект.Ссылка = ОбщегоНазначения.ТекущийПользователь() Тогда + // Свои свойства + ДействияВФорме.Роли = ""; + ДействияВФорме.КонтактнаяИнформация = "Редактирование"; + ДействияВФорме.СвойстваПользователяИБ = "РедактированиеСвоих"; + ДействияВФорме.СвойстваЭлемента = "Просмотр"; + Иначе + // Чужие свойства + ДействияВФорме.Роли = ""; + ДействияВФорме.КонтактнаяИнформация = ""; + ДействияВФорме.СвойстваПользователяИБ = ""; + ДействияВФорме.СвойстваЭлемента = "Просмотр"; + КонецЕсли; + + ПользователиПереопределяемый.ИзменитьДействияВФорме(Объект.Ссылка, ДействияВФорме); + + // Проверка имен действий в форме + Если Найти(", Просмотр, Редактирование,", ", " + ДействияВФорме.Роли + ",") = 0 Тогда + ДействияВФорме.Роли = ""; + ИначеЕсли ПользователиПереопределяемый.ЗапретРедактированияРолей() Тогда + ДействияВФорме.Роли = "Просмотр"; + КонецЕсли; + Если Найти(", Просмотр, Редактирование,", ", " + ДействияВФорме.КонтактнаяИнформация + ",") = 0 Тогда + ДействияВФорме.КонтактнаяИнформация = ""; + КонецЕсли; + Если Найти(", ПросмотрВсех, РедактированиеВсех, РедактированиеСвоих,", ", " + ДействияВФорме.СвойстваПользователяИБ + ",") = 0 Тогда + ДействияВФорме.СвойстваПользователяИБ = ""; + КонецЕсли; + Если Найти(", Просмотр, Редактирование,", ", " + ДействияВФорме.СвойстваЭлемента + ",") = 0 Тогда + ДействияВФорме.СвойстваЭлемента = ""; + КонецЕсли; + +КонецПроцедуры + +//** Чтение, запись, удаление, расчет краткого имени пользователя ИБ, проверка несоответствия + +&НаСервере +Процедура ПрочитатьПользователяИБ(ПриКопированииЭлемента = Ложь, ТолькоРоли = Ложь) + + УстановитьПривилегированныйРежим(Истина); + + ПрочитанныеРоли = Неопределено; + + Если ТолькоРоли Тогда + Пользователи.ПрочитатьПользователяИБ(Объект.ИдентификаторПользователяИБ, , ПрочитанныеРоли); + ЗаполнитьРоли(ПрочитанныеРоли); + Возврат; + КонецЕсли; + + Пароль = ""; + ПодтверждениеПароля = ""; + ПрочитанныеСвойства = Неопределено; + СтарыйИдентификаторПользователяИБ = Неопределено; + ПользовательИБСуществует = Ложь; + ДоступКИнформационнойБазеРазрешен = Ложь; + + // Заполнение начальных значений свойств пользователяИБ у пользователя. + Пользователи.ПрочитатьПользователяИБ(Неопределено, ПрочитанныеСвойства, ПрочитанныеРоли); + ПрочитанныеСвойства.ПользовательИнфБазыПоказыватьВСпискеВыбора = НЕ Константы.ИспользоватьВнешнихПользователей.Получить(); + ЗаполнитьЗначенияСвойств(ЭтаФорма, ПрочитанныеСвойства); + ПользовательИнфБазыАутентификацияСтандартная = Истина; + + Если ПриКопированииЭлемента Тогда + + Если Пользователи.ПрочитатьПользователяИБ(Параметры.ЗначениеКопирования.ИдентификаторПользователяИБ, ПрочитанныеСвойства, ПрочитанныеРоли) Тогда + // Т.к. у скопированного пользователя есть связь с пользователемИБ, + // то устанавливается будущая связь и у нового пользователя. + ДоступКИнформационнойБазеРазрешен = Истина; + // Т.к. пользовательИБ скопированного пользователя прочитан, + // то копируются свойства и роли пользователяИБ. + ЗаполнитьЗначенияСвойств(ЭтаФорма, + ПрочитанныеСвойства, + "ПользовательИнфБазыАутентификацияСтандартная, + |ПользовательИнфБазыЗапрещеноИзменятьПароль, + |ПользовательИнфБазыПоказыватьВСпискеВыбора, + |ПользовательИнфБазыАутентификацияОС"); + КонецЕсли; + Объект.ИдентификаторПользователяИБ = Неопределено; + Иначе + Если Пользователи.ПрочитатьПользователяИБ(Объект.ИдентификаторПользователяИБ, ПрочитанныеСвойства, ПрочитанныеРоли) Тогда + + ПользовательИБСуществует = Истина; + ДоступКИнформационнойБазеРазрешен = Истина; + СтарыйИдентификаторПользователяИБ = Объект.ИдентификаторПользователяИБ; + + ЗаполнитьЗначенияСвойств(ЭтаФорма, + ПрочитанныеСвойства, + "ПользовательИнфБазыИмя, + |ПользовательИнфБазыПолноеИмя, + |ПользовательИнфБазыАутентификацияСтандартная, + |ПользовательИнфБазыПоказыватьВСпискеВыбора, + |ПользовательИнфБазыЗапрещеноИзменятьПароль, + |ПользовательИнфБазыАутентификацияОС, + |ПользовательИнфБазыПользовательОС"); + + Если ПрочитанныеСвойства.ПользовательИнфБазыПарольУстановлен Тогда + Пароль = "**********"; + ПодтверждениеПароля = "**********"; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + ЗаполнитьПредставлениеРежимаЗапуска(ПрочитанныеСвойства.ПользовательИнфБазыРежимЗапуска); + ЗаполнитьПредставлениеЯзыка(ПрочитанныеСвойства.ПользовательИнфБазыЯзык); + ЗаполнитьРоли(ПрочитанныеРоли); + +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьПользователяИБ(ТекущийОбъект, Отказ) + + // Восстановление действий в форме, если они изменены на клиенте + ОпределитьДействияВФорме(); + + Если НЕ (ДействияВФорме.СвойстваПользователяИБ = "РедактированиеВсех" ИЛИ + ДействияВФорме.СвойстваПользователяИБ = "РедактированиеСвоих" )Тогда + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + НовыеСвойства = Неопределено; + НовыеРоли = Неопределено; + + // Чтение старых свойств/заполнение начальных свойств пользователяИБ у пользователя. + Пользователи.ПрочитатьПользователяИБ(ТекущийОбъект.ИдентификаторПользователяИБ, НовыеСвойства); + + Если ДействияВФорме.СвойстваПользователяИБ = "РедактированиеВсех" Тогда + ЗаполнитьЗначенияСвойств(НовыеСвойства, ЭтаФорма); + НовыеСвойства.ПользовательИнфБазыРежимЗапуска = ПолучитьВыбранныйРежимЗапуска(); + Иначе + ЗаполнитьЗначенияСвойств(НовыеСвойства, + ЭтаФорма, + "ПользовательИнфБазыИмя, + |ПользовательИнфБазыПароль"); + КонецЕсли; + НовыеСвойства.ПользовательИнфБазыЯзык = ПолучитьВыбранныйЯзык(); + + Если ДействияВФорме.Роли = "Редактирование" Тогда + НовыеРоли = Роли.Выгрузить().ВыгрузитьКолонку("Роль"); + КонецЕсли; + + // Попытка записи пользователя ИБ + ОписаниеОшибки = ""; + Если Пользователи.ЗаписатьПользователяИБ(ТекущийОбъект.ИдентификаторПользователяИБ, НовыеСвойства, НовыеРоли, НЕ ПользовательИБСуществует, ОписаниеОшибки) Тогда + Если НЕ ПользовательИБСуществует Тогда + ТекущийОбъект.ИдентификаторПользователяИБ = НовыеСвойства.ПользовательИнфБазыУникальныйИдентификатор; + ПользовательИБСуществует = Истина; + КонецЕсли; + Иначе + Отказ = Истина; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция УдалитьПользователяИБ(Отказ) + + УстановитьПривилегированныйРежим(Истина); + + ОписаниеОшибки = ""; + Если НЕ Пользователи.УдалитьПользователяИБ(СтарыйИдентификаторПользователяИБ, ОписаниеОшибки) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки, , , , Отказ); + КонецЕсли; + +КонецФункции + +&НаКлиенте +Функция ПолучитьКраткоеИмяПользователяИБ(Знач ПолноеИмя) + + КраткоеИмя = ""; + ПервыйПроходЦикла = Истина; + + Пока Истина Цикл + Если НЕ ПервыйПроходЦикла Тогда + КраткоеИмя = КраткоеИмя + ВРег(Лев(ПолноеИмя, 1)); + КонецЕсли; + ПозицияПробела = Найти(ПолноеИмя, " "); + Если ПозицияПробела = 0 Тогда + Если ПервыйПроходЦикла Тогда + КраткоеИмя = ПолноеИмя; + КонецЕсли; + Прервать; + КонецЕсли; + + Если ПервыйПроходЦикла Тогда + КраткоеИмя = Лев(ПолноеИмя, ПозицияПробела - 1); + КонецЕсли; + + ПолноеИмя = Прав(ПолноеИмя, СтрДлина(ПолноеИмя) - ПозицияПробела); + + ПервыйПроходЦикла = Ложь; + КонецЦикла; + + КраткоеИмя = СтрЗаменить(КраткоеИмя, " ", ""); + + Возврат КраткоеИмя; + +КонецФункции + +&НаСервере +Процедура ОпределитьНесоответствияПользователяСПользователемИБ(ПараметрыЗаписи = Неопределено) Экспорт + + //** Проверка соответствия свойства "ПолноеИмя" пользователяИБ и свойства "Наименование" пользователя + + Если НЕ (ДействияВФорме.СвойстваЭлемента = "Редактирование" И + ДействияВФорме.СвойстваПользователяИБ = "РедактированиеВсех") Тогда + // Прочитанное ПолноеИмя пользователя не может быть изменено, если не совпадает + ПользовательИнфБазыПолноеИмя = Неопределено; + КонецЕсли; + + Если НЕ ПользовательИБСуществует ИЛИ + ПользовательИнфБазыПолноеИмя = Неопределено ИЛИ + ПользовательИнфБазыПолноеИмя = Объект.Наименование Тогда + + Элементы.ПолноеИмяОбработкаНесоответствия.Видимость = Ложь; + + ИначеЕсли ЗначениеЗаполнено(Объект.Ссылка) Тогда + + Элементы.ПолноеИмяПояснениеНесоответствия.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + Элементы.ПолноеИмяПояснениеНесоответствия.Заголовок, + ПользовательИнфБазыПолноеИмя); + Иначе + Объект.Наименование = ПользовательИнфБазыПолноеИмя; + Элементы.ПолноеИмяОбработкаНесоответствия.Видимость = Ложь; + КонецЕсли; + + //** Определение связи с несуществующим пользователем ИБ + ЕстьНоваяСвязьСНесуществующимПользователемИБ = НЕ ПользовательИБСуществует И ЗначениеЗаполнено(Объект.ИдентификаторПользователяИБ); + Если ПараметрыЗаписи <> Неопределено + И ЕстьСвязьСНесуществующимПользователемИБ + И НЕ ЕстьНоваяСвязьСНесуществующимПользователемИБ Тогда + + ПараметрыЗаписи.Вставить("ОчищенаСвязьСНесуществущимПользователемИБ", Объект.Ссылка); + КонецЕсли; + ЕстьСвязьСНесуществующимПользователемИБ = ЕстьНоваяСвязьСНесуществующимПользователемИБ; + + Если ДействияВФорме.СвойстваПользователяИБ <> "РедактированиеВсех" Тогда + // Связь не может быть изменена + Элементы.СвязьОбработкаНесоответствия.Видимость = Ложь; + Иначе + Элементы.СвязьОбработкаНесоответствия.Видимость = ЕстьСвязьСНесуществующимПользователемИБ; + КонецЕсли; + +КонецПроцедуры + +//** Начальное заполнение, проверка заполнения, доступность свойств + +&НаСервере +Процедура ЗаполнитьПредставлениеРежимаЗапуска(РежимЗапуска) + + Если РежимЗапуска = "Авто" Тогда + ПредставлениеРежимаЗапуска = НСтр("ru = 'Авто'"); + + ИначеЕсли РежимЗапуска = "ОбычноеПриложение" Тогда + ПредставлениеРежимаЗапуска = НСтр("ru = 'Обычное приложение'"); + + ИначеЕсли РежимЗапуска = "УправляемоеПриложение" Тогда + ПредставлениеРежимаЗапуска = НСтр("ru = 'Управляемое приложение'"); + Иначе + ПредставлениеРежимаЗапуска = ""; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция ПолучитьВыбранныйРежимЗапуска() + + Если ПредставлениеРежимаЗапуска = НСтр("ru = 'Авто'") Тогда + Возврат "Авто"; + + ИначеЕсли ПредставлениеРежимаЗапуска = НСтр("ru = 'Обычное приложение'") Тогда + Возврат "ОбычноеПриложение"; + + ИначеЕсли ПредставлениеРежимаЗапуска = НСтр("ru = 'Управляемое приложение'") Тогда + Возврат "УправляемоеПриложение"; + + КонецЕсли; + + Возврат ""; + +КонецФункции + +&НаСервере +Процедура ЗаполнитьПредставлениеЯзыка(Язык) + + ПредставлениеЯзыка = ""; + + Для каждого МетаданныеЯзыка ИЗ Метаданные.Языки Цикл + + Если МетаданныеЯзыка.Имя = Язык Тогда + ПредставлениеЯзыка = МетаданныеЯзыка.Синоним; + Прервать; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Функция ПолучитьВыбранныйЯзык() + + Для каждого МетаданныеЯзыка ИЗ Метаданные.Языки Цикл + + Если МетаданныеЯзыка.Синоним = ПредставлениеЯзыка Тогда + Возврат МетаданныеЯзыка.Имя; + КонецЕсли; + КонецЦикла; + + Возврат ""; + +КонецФункции + +&НаСервере +Процедура ЗаполнитьРоли(ПрочитанныеРоли) + + Роли.Очистить(); + + Для каждого Роль Из ПрочитанныеРоли Цикл + НоваяСтрока = Роли.Добавить(); + НоваяСтрока.Роль = Роль; + НоваяСтрока.СинонимРоли = ТаблицаРолей.НайтиСтроки(Новый Структура("Имя", Роль))[0].Синоним; + КонецЦикла; + + Роли.Сортировать("СинонимРоли"); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьСвойств() + + Элементы.Наименование.ТолькоПросмотр = ДействияВФорме.СвойстваЭлемента <> "Редактирование"; + Элементы.ДоступКИнформационнойБазеРазрешен.ТолькоПросмотр = ДействияВФорме.СвойстваПользователяИБ <> "РедактированиеВсех"; + Элементы.СвойстваПользователяИБ.ТолькоПросмотр = ДействияВФорме.СвойстваПользователяИБ = "ПросмотрВсех"; + Элементы.ПользовательИнфБазыАутентификацияСтандартная.ТолькоПросмотр = ДействияВФорме.СвойстваПользователяИБ <> "РедактированиеВсех"; + Элементы.Пароль.ТолькоПросмотр = ПользовательИнфБазыЗапрещеноИзменятьПароль; + Элементы.ПодтверждениеПароля.ТолькоПросмотр = ПользовательИнфБазыЗапрещеноИзменятьПароль; + Элементы.ПользовательИнфБазыЗапрещеноИзменятьПароль.ТолькоПросмотр = ДействияВФорме.СвойстваПользователяИБ <> "РедактированиеВсех"; + Элементы.ПользовательИнфБазыПоказыватьВСпискеВыбора.ТолькоПросмотр = ДействияВФорме.СвойстваПользователяИБ <> "РедактированиеВсех"; + Элементы.ПользовательИнфБазыАутентификацияОС.ТолькоПросмотр = ДействияВФорме.СвойстваПользователяИБ <> "РедактированиеВсех"; + Элементы.ПользовательИнфБазыПользовательОС.ТолькоПросмотр = ДействияВФорме.СвойстваПользователяИБ <> "РедактированиеВсех"; + Элементы.ПредставлениеРежимаЗапуска.ТолькоПросмотр = ДействияВФорме.СвойстваПользователяИБ <> "РедактированиеВсех"; + + Элементы.ОсновныеСвойства.Доступность = ДоступКИнформационнойБазеРазрешен; + Элементы.ОтображениеРолей.Доступность = ДоступКИнформационнойБазеРазрешен; + Элементы.ПользовательИнфБазыИмя.АвтоОтметкаНезаполненного = ДоступКИнформационнойБазеРазрешен; + + Элементы.Пароль.Доступность = ПользовательИнфБазыАутентификацияСтандартная; + Элементы.ПодтверждениеПароля.Доступность = ПользовательИнфБазыАутентификацияСтандартная; + Элементы.ПользовательИнфБазыЗапрещеноИзменятьПароль.Доступность = ПользовательИнфБазыАутентификацияСтандартная; + Элементы.ПользовательИнфБазыПоказыватьВСпискеВыбора.Доступность = ПользовательИнфБазыАутентификацияСтандартная; + + Элементы.ПользовательИнфБазыПользовательОС.Доступность = ПользовательИнфБазыАутентификацияОС; + +КонецПроцедуры + +//** Для работы интерфейса ролей + +&НаСервере +Процедура УстановитьДействияСРолями() + + ЗапретРедактирования = ПользователиПереопределяемый.ЗапретРедактированияРолей(); + + // ** ТолькоВыбранныеРоли + // Основное меню + Элементы.РолиПодобрать.Видимость = НЕ ЗапретРедактирования; + Элементы.РолиДобавить.Видимость = НЕ ЗапретРедактирования; + Элементы.РолиУдалить.Видимость = НЕ ЗапретРедактирования; + Элементы.РолиПереместитьВверх.Видимость = НЕ ЗапретРедактирования; + Элементы.РолиПереместитьВниз.Видимость = НЕ ЗапретРедактирования; + Элементы.РолиСортироватьСписокПоВозрастанию.Видимость = НЕ ЗапретРедактирования; + Элементы.РолиСортироватьСписокПоУбыванию.Видимость = НЕ ЗапретРедактирования; + // Контекстное меню + Элементы.КонтекстноеМенюРолиПодобрать.Видимость = НЕ ЗапретРедактирования; + Элементы.КонтекстноеМенюРолиДобавить.Видимость = НЕ ЗапретРедактирования; + Элементы.КонтекстноеМенюРолиУдалить.Видимость = НЕ ЗапретРедактирования; + Элементы.КонтекстноеМенюРолиПереместитьВверх.Видимость = НЕ ЗапретРедактирования; + Элементы.КонтекстноеМенюРолиПереместитьВниз.Видимость = НЕ ЗапретРедактирования; + + // ** СредиВсехВыбранныеРоли + // Основное меню + Элементы.ТаблицаРолейУстановитьФлажки.Видимость = НЕ ЗапретРедактирования; + Элементы.ТаблицаРолейСнятьФлажки.Видимость = НЕ ЗапретРедактирования; + Элементы.ТаблицаРолейСортироватьСписокПоВозрастанию.Видимость = НЕ ЗапретРедактирования; + Элементы.ТаблицаРолейСортироватьСписокПоУбыванию.Видимость = НЕ ЗапретРедактирования; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьФлажкиНаСервере() + + Для каждого СтрокаТаблицы Из ТаблицаРолей Цикл + + СтрокаТаблицы.Пометка = Истина; + + НайденныеРоли = Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)); + Если НайденныеРоли.Количество() = 0 Тогда + Строка = Роли.Добавить(); + Строка.Роль = СтрокаТаблицы.Имя; + Строка.СинонимРоли = СтрокаТаблицы.Синоним; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура СнятьФлажкиНаСервере() + + Для каждого СтрокаТаблицы Из ТаблицаРолей Цикл + + СтрокаТаблицы.Пометка = Ложь; + + НайденныеРоли = Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)); + Если НайденныеРоли.Количество() > 0 Тогда + Роли.Удалить(НайденныеРоли[0]); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьВыбранныеРоли(ВыбранныеРоли) + + Для каждого Значение Из ВыбранныеРоли Цикл + + ЭлементСписка = СписокВыбораРолей.НайтиПоЗначению(Значение); + Если ЭлементСписка <> Неопределено Тогда + + Если Роли.НайтиСтроки(Новый Структура("Роль", Значение)).Количество() = 0 Тогда + + Строка = Роли.Добавить(); + Строка.Роль = ЭлементСписка.Значение; + Строка.СинонимРоли = ЭлементСписка.Представление; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаСервере +Процедура ПодготовитьСписокВыбораИТаблицуРолей() + + ВсеРоли = ПользователиСерверПовтИсп.ВсеРоли(); + ВсеРоли.Сортировать("Синоним"); + + Для каждого Строка Из ВсеРоли Цикл + // Заполнение списка выбора + СписокВыбораРолей.Добавить(Строка.Имя, Строка.Синоним); + // Заполнение таблицы ролей + СтрокаТаблицы = ТаблицаРолей.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Строка); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьТолькоПросмотрРолей(Знач ТолькоПросмотрРолей) + + Элементы.Роли.ТолькоПросмотр = ТолькоПросмотрРолей; + Элементы.ТаблицаРолей.ТолькоПросмотр = ТолькоПросмотрРолей; + + Элементы.РолиПодобрать.Доступность = НЕ ТолькоПросмотрРолей; + Элементы.КонтекстноеМенюРолиПодобрать.Доступность = НЕ ТолькоПросмотрРолей; + Элементы.ТаблицаРолейУстановитьФлажки.Доступность = НЕ ТолькоПросмотрРолей; + Элементы.ТаблицаРолейСнятьФлажки.Доступность = НЕ ТолькоПросмотрРолей; + +КонецПроцедуры + +&НаСервере +Процедура ПометитьРолиПоСписку() + + Для каждого СтрокаТаблицы Из ТаблицаРолей Цикл + + СтрокаТаблицы.Пометка = Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)).Количество() > 0; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Функция СформироватьДанныеВыбораРолей(Текст) + + Список = СписокВыбораРолей.Скопировать(); + + НомерЭлемента = Список.Количество()-1; + Пока НомерЭлемента >= 0 Цикл + Если ВРег(Лев(Список[НомерЭлемента].Представление, СтрДлина(Текст))) <> ВРег(Текст) Тогда + Список.Удалить(НомерЭлемента); + КонецЕсли; + НомерЭлемента = НомерЭлемента - 1; + КонецЦикла; + + Возврат Список; + +КонецФункции + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияСпискаРолей(Отказ) + + // Проверка незаполненных и повторяющихся ролей. + НомерСтроки = Роли.Количество()-1; + Пока НЕ Отказ И НомерСтроки >= 0 Цикл + + ТекущаяСтрока = Роли.Получить(НомерСтроки); + + // Проверка заполнения значения. + Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.СинонимРоли) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Роль не заполнена!'"), + , + "Роли[" + Формат(НомерСтроки, "ЧГ=0") + "].СинонимРоли", + , + Отказ); + Возврат; + КонецЕсли; + + // Проверка наличия повторяющихся значений. + НайденныеЗначения = Роли.НайтиСтроки(Новый Структура("Роль", ТекущаяСтрока.Роль)); + Если НайденныеЗначения.Количество() > 1 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Роль повторяется!'"), + , + "Роли[" + Формат(НомерСтроки, "ЧГ=0") + "].СинонимРоли", + , + Отказ); + Возврат; + КонецЕсли; + + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + +КонецПроцедуры + + +//** Для работы подсистемы КонтактнаяИнформация + +&НаКлиенте +Процедура Подключаемый_КонтактнаяИнформацияПриИзменении(Элемент) + + УправлениеКонтактнойИнформациейКлиент.ПредставлениеПриИзменении(ЭтаФорма, Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_КонтактнаяИнформацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + УправлениеКонтактнойИнформациейКлиент.ПредставлениеНачалоВыбора(ЭтаФорма, Элемент, Модифицированность, СтандартнаяОбработка); + +КонецПроцедуры + + diff --git a/SSL/src/Catalogs/Пользователи/Help/ru.html b/SSL/src/Catalogs/Пользователи/Help/ru.html new file mode 100644 index 000000000..90df9717b --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Help/ru.html @@ -0,0 +1,6 @@ + +

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

+

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

+

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

+

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

+

 

\ No newline at end of file diff --git a/SSL/src/Catalogs/Пользователи/ObjectModule.bsl b/SSL/src/Catalogs/Пользователи/ObjectModule.bsl new file mode 100644 index 000000000..79b16499b --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/ObjectModule.bsl @@ -0,0 +1,58 @@ + +Процедура ПередЗаписью(Отказ) + + Если ИдентификаторПользователяИБ <> Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") И + Пользователи.ПользовательПоИдентификаторуСуществует(ИдентификаторПользователяИБ, Ссылка) Тогда + + ВызватьИсключение(НСтр("ru = 'Один пользователь информационной базы + |может быть связан только с одним пользователем или внешним пользователем!'")); + КонецЕсли; + + //Если ОбменДанными.Загрузка Тогда + // Возврат; + //КонецЕсли; + +КонецПроцедуры + +Процедура ПриЗаписи(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + МенеджерЗаписи = РегистрыСведений.СоставГруппПользователей.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ГруппаПользователей = Ссылка; + МенеджерЗаписи.Пользователь = Ссылка; + МенеджерЗаписи.Прочитать(); + Если НЕ МенеджерЗаписи.Выбран() Тогда + МенеджерЗаписи.ГруппаПользователей = Ссылка; + МенеджерЗаписи.Пользователь = Ссылка; + МенеджерЗаписи.Записать(); + // Обновление состава автоматической группы "Все пользователи". + Пользователи.ОбновитьСоставГруппПользователей(Справочники.ГруппыПользователей.ВсеПользователи); + + Если ДополнительныеСвойства.Свойство("ГруппаНовогоПользователя") И + ЗначениеЗаполнено(ДополнительныеСвойства.ГруппаНовогоПользователя) Тогда + + ОбъектГруппы = ДополнительныеСвойства.ГруппаНовогоПользователя.ПолучитьОбъект(); + ОбъектГруппы.Состав.Добавить().Пользователь = Ссылка; + ОбъектГруппы.Записать(); + Пользователи.ОбновитьСоставГруппПользователей(ОбъектГруппы.Ссылка); + КонецЕсли; + КонецЕсли; + + +КонецПроцедуры + +Процедура ПередУдалением(Отказ) + + Если Пользователи.ПользовательИБСуществует(ИдентификаторПользователяИБ) Тогда + ОписаниеОшибки = ""; + Если НЕ Пользователи.УдалитьПользователяИБ(ИдентификаторПользователяИБ, ОписаниеОшибки) Тогда + ВызватьИсключение(ОписаниеОшибки); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Пользователи/Пользователи.mdo b/SSL/src/Catalogs/Пользователи/Пользователи.mdo new file mode 100644 index 000000000..00c9a4c5d --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Пользователи.mdo @@ -0,0 +1,441 @@ + + + + + + + + + + Пользователи + + ru + Пользователи + + true + Catalog.Пользователи.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + + ru + В группе + + + ru + Группа, которой принадлежит пользователь + + true + + Catalog.Пользователи.EmptyRef + + Use + + + + + Use + Description + + ru + Полное имя + + + ru + Представление пользователя в интерфейсе, +обычно: Фамилия Имя Отчество + + + ShowError + Use + + + + + Use + Code + + ru + Пользователь + + + ru + Имя учетной записи пользователя информационной базы + + + + + Use + + + + Use + + + ru + + + Managed + Use + + ru + Пользователь + + 2 + 100 + String + Variable + AsDescription + InDialog + BothWays + Catalog.Пользователи.Form.ФормаЭлемента + Catalog.Пользователи.Form.ФормаСписка + Catalog.Пользователи.Form.ФормаСписка + + ИдентификаторПользователяИБ + + ru + Идентификатор пользователя ИБ + + Требуется для сопоставления элемента справочника Пользователи пользователю ИБ + + UUID + + + + + Use + + + + + + + КонтактнаяИнформация + + ru + Контактная информация + + + Use + LineNumber + + Use + + + + + Тип + + ru + Тип + + + EnumRef.ТипыКонтактнойИнформации + + + + Use + Use + + + Вид + + ru + Вид + + + CatalogRef.ВидыКонтактнойИнформации + + + + Use + Use + + + Представление + + ru + Представление + + + String + + + + + Use + Use + + + ЗначенияПолей + + ru + Значения полей + + + String + + + + + Use + Use + + + Страна + + ru + Страна + + + String + + 100 + + + + + Use + Index + Use + + + Регион + + ru + Регион + + + String + + 50 + + + + + Use + Index + Use + + + Город + + ru + Город + + + String + + 50 + + + + + Use + Index + Use + + + АдресЭП + + ru + Адрес ЭП + + + String + + 100 + + + + + Use + Index + Use + + + ДоменноеИмяСервера + + ru + Доменное имя сервера + + + String + + 100 + + + + + Use + Index + Use + + + НомерТелефона + + ru + Номер телефона + + + String + + 20 + + + + + Use + Index + Use + + + НомерТелефонаБезКодов + + ru + Номер телефона без кодов + + + String + + 20 + + + + + Use + Index + Use + + + + ФормаЭлемента + + ru + Форма элемента + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаВыбораРолей + + ru + Форма выбора ролей + + + + ru + + + PersonalComputer + MobileDevice + + + ПользователиИБ + + ru + Пользователи информационной базы + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаВыбораПользователяОС + + ru + Выбор пользователя операционной системы + + + + ru + + + PersonalComputer + MobileDevice + + + ПользователиИБ + + ru + Пользователи информационной базы + + NavigationPanelOrdinary + Auto + + ru + Пользователи информационной базы + + + diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..13bfeeebb --- /dev/null +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,20 @@ + + + + + Ссылка + NotEqual + Справочник.ПрофилиГруппДоступа.Администратор + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбора/Form.form new file mode 100644 index 000000000..1140470c8 --- /dev/null +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбора/Form.form @@ -0,0 +1,229 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 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 + + HierarchicalList + true + true + true + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
+ + ФормаКоманднаяПанель + -1 + Left + true + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.ПрофилиГруппДоступа + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..7e636e1f7 --- /dev/null +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,21 @@ + + + + + false + Ссылка + NotEqual + Справочник.ПрофилиГруппДоступа.Администратор + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..4ec511699 --- /dev/null +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Form.form @@ -0,0 +1,239 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 4 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 7 + + СписокСтрокаПоискаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 8 + true + + Список + + true + + + + СписокСостояниеПросмотра + 10 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 11 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 13 + + СписокУправлениеПоискомРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 14 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + true + true +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + 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 + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.ПрофилиГруппДоступа + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Help/ru.html b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Help/ru.html new file mode 100644 index 000000000..ad01c5b37 --- /dev/null +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Help/ru.html @@ -0,0 +1,4 @@ + +

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

+

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

+

 

\ No newline at end of file diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..5b1e4e8fc --- /dev/null +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,8 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Список.Отбор.Элементы[0].Использование = НЕ (УправлениеДоступом.ЕстьРоль("ПолныеПрава") ИЛИ + УправлениеДоступом.ЕстьРоль("ДобавлениеИзменениеПользователейИГруппДоступа")); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/ConditionalAppearance.dcssca b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/ConditionalAppearance.dcssca new file mode 100644 index 000000000..02d0c5cc0 --- /dev/null +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/ConditionalAppearance.dcssca @@ -0,0 +1,26 @@ + + + + + + ВидыДоступаВидДоступа + + + ВидыДоступаПредустановленный + + + + + Объект.ВидыДоступа.ЗначенияЗаданы + Equal + true + + + + + Шрифт + + + + + diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..f55556df6 --- /dev/null +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,3779 @@ + + + + Наименование + 3 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 192 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Родитель + 189 + true + true + + true + + + Объект.Parent + + + РодительРасширеннаяПодсказка + 194 + Label + true + true + + Left + + + + РодительКонтекстноеМеню + 190 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Доступ + 6 + + ОтображениеРолей + 97 + + ТолькоВыбранныеРоли + 98 + + Роли + 7 + + <key>ru</key> + <value>Разрешенные действия (роли)</value> + + + System.DefaultGUIFont + true + false + false + false + + true + true + + true + + + Объект.Роли + + false + None + CancelSearch + Copy + CopyToClipboard + EndEdit + Find + OutputList + + СинонимРоли + 95 + + <key>ru</key> + <value>Разрешенное действие (роль)</value> + + true + true + + true + + + Объект.Роли.СинонимРоли + + + ru + Синоним роли, как он задан в конфигураторе + + + OnChange + СинонимРолиПриИзменении + + + СинонимРолиРасширеннаяПодсказка + 223 + Label + true + true + + Left + + + + СинонимРолиКонтекстноеМеню + 96 + true + + InputField + true + Enter + true + Left + true + + + AutoComplete + СинонимРолиАвтоПодбор + + + StartChoice + СинонимРолиНачалоВыбора + + + TextEditEnd + СинонимРолиОкончаниеВводаТекста + + + ChoiceProcessing + СинонимРолиОбработкаВыбора + + true + true + true + true + true + true + true + Normal + + + + РолиКоманднаяПанель + 9 + + РолиПодобрать + 53 + true + true + + true + + false + + РолиПодобратьРасширеннаяПодсказка + 205 + Label + true + true + + Left + + + Form.Command.ПодобратьРоли + Normal + Auto + true + true + UserCmds + Auto + + + РолиДобавить + 61 + true + true + + true + + false + + РолиДобавитьРасширеннаяПодсказка + 206 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + РолиУдалить + 63 + true + true + + true + + false + + РолиУдалитьРасширеннаяПодсказка + 207 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + РолиПереместитьВверх + 64 + true + true + + true + + false + + РолиПереместитьВверхРасширеннаяПодсказка + 208 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + РолиПереместитьВниз + 65 + true + true + + true + + false + + РолиПереместитьВнизРасширеннаяПодсказка + 209 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + РолиСортироватьСписокПоВозрастанию + 66 + true + true + + true + + false + + РолиСортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 210 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + РолиСортироватьСписокПоУбыванию + 67 + true + true + + true + + false + + РолиСортироватьСписокПоУбываниюРасширеннаяПодсказка + 211 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + РолиПоказатьСредиВсехВыбранныеРоли + 120 + true + true + + true + + false + + РолиПоказатьСредиВсехВыбранныеРолиРасширеннаяПодсказка + 212 + Label + true + true + + Left + + + Form.Command.ПоказатьТолькоВыбранныеРоли + Normal + Auto + true + true + UserCmds + true + Auto + + Left + + + OnEditEnd + РолиПриОкончанииРедактирования + + + ChoiceProcessing + РолиОбработкаВыбора + + + OnChange + РолиПриИзменении + + + РолиСтрокаПоиска + 214 + + РолиСтрокаПоискаРасширеннаяПодсказка + 216 + Label + true + true + + Left + + + + РолиСтрокаПоискаКонтекстноеМеню + 215 + true + + Роли + + true + + + + РолиСостояниеПросмотра + 217 + + РолиСостояниеПросмотраРасширеннаяПодсказка + 219 + Label + true + true + + Left + + + + РолиСостояниеПросмотраКонтекстноеМеню + 218 + true + + ViewStatusAddition + Роли + + true + + + + РолиУправлениеПоиском + 220 + + РолиУправлениеПоискомРасширеннаяПодсказка + 222 + Label + true + true + + Left + + + + РолиУправлениеПоискомКонтекстноеМеню + 221 + true + + SearchControlAddition + Роли + + true + + + + РолиРасширеннаяПодсказка + 213 + Label + true + true + + Left + + + + РолиКонтекстноеМеню + 8 + + КонтекстноеМенюРолиПодобрать + 68 + true + true + + true + + false + + КонтекстноеМенюРолиПодобратьРасширеннаяПодсказка + 199 + Label + true + true + + Left + + + Form.Command.ПодобратьРоли + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиДобавить + 69 + true + true + + true + + false + + КонтекстноеМенюРолиДобавитьРасширеннаяПодсказка + 200 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиУдалить + 71 + true + true + + true + + false + + КонтекстноеМенюРолиУдалитьРасширеннаяПодсказка + 201 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиПереместитьВверх + 72 + true + true + + true + + false + + КонтекстноеМенюРолиПереместитьВверхРасширеннаяПодсказка + 202 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиПереместитьВниз + 73 + true + true + + true + + false + + КонтекстноеМенюРолиПереместитьВнизРасширеннаяПодсказка + 203 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюРолиВыделитьВсе + 74 + true + true + + true + + false + + КонтекстноеМенюРолиВыделитьВсеРасширеннаяПодсказка + 204 + Label + true + true + + Left + + + Form.Item.Роли.StandardCommand.SelectAll + Normal + Auto + true + true + UserCmds + Auto + + + 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>Только выбранные роли</value> + + + ТолькоВыбранныеРолиРасширеннаяПодсказка + 198 + Label + true + true + + Left + + + Page + + Vertical + auto + +
+ + СредиВсехВыбранныеРоли + 99 + + ТаблицаРолей + 100 + true + true + + true + + + ТаблицаРолей + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + OutputList + SelectAll + + ТаблицаРолейПометка + 111 + true + true + + true + + + ТаблицаРолей.Пометка + + None + + OnChange + ТаблицаРолейПометкаПриИзменении + + + ТаблицаРолейПометкаРасширеннаяПодсказка + 253 + Label + true + true + + Left + + + + ТаблицаРолейПометкаКонтекстноеМеню + 112 + true + + CheckBoxField + Auto + true + Left + true + + + + ТаблицаРолейСиноним + 105 + true + true + + true + + + ТаблицаРолей.Синоним + + + ru + Синоним роли, как он задан в конфигураторе + + + ТаблицаРолейСинонимРасширеннаяПодсказка + 255 + Label + true + true + + Left + + + + ТаблицаРолейСинонимКонтекстноеМеню + 106 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейСинонимыПодсистем + 109 + true + true + + + ТаблицаРолей.СинонимыПодсистем + + + ru + Синонимы подсистем, в которые входит роль + + + ТаблицаРолейСинонимыПодсистемРасширеннаяПодсказка + 257 + Label + true + true + + Left + + + + ТаблицаРолейСинонимыПодсистемКонтекстноеМеню + 110 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейИмя + 103 + true + true + + + ТаблицаРолей.Имя + + + ru + Имя роли, как оно задано в конфигураторе + + + ТаблицаРолейИмяРасширеннаяПодсказка + 259 + Label + true + true + + Left + + + + ТаблицаРолейИмяКонтекстноеМеню + 104 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейИменаПодсистем + 107 + true + true + + + ТаблицаРолей.ИменаПодсистем + + + ru + Имена подсистем в которые входит роль + + + ТаблицаРолейИменаПодсистемРасширеннаяПодсказка + 261 + Label + true + true + + Left + + + + ТаблицаРолейИменаПодсистемКонтекстноеМеню + 108 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаРолейКоманднаяПанель + 102 + + ТаблицаРолейУстановитьФлажки + 122 + true + true + + true + + false + + ТаблицаРолейУстановитьФлажкиРасширеннаяПодсказка + 236 + Label + true + true + + Left + + + Form.Command.УстановитьФлажки + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРолейСнятьФлажки + 121 + true + true + + true + + false + + ТаблицаРолейСнятьФлажкиРасширеннаяПодсказка + 237 + Label + true + true + + Left + + + Form.Command.СнятьФлажки + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРолейНайти + 115 + true + true + + true + + false + + ТаблицаРолейНайтиРасширеннаяПодсказка + 238 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейОтменитьПоиск + 116 + true + true + + true + + false + + ТаблицаРолейОтменитьПоискРасширеннаяПодсказка + 239 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейСортироватьСписокПоВозрастанию + 117 + true + true + + true + + false + + ТаблицаРолейСортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 240 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейСортироватьСписокПоУбыванию + 118 + true + true + + true + + false + + ТаблицаРолейСортироватьСписокПоУбываниюРасширеннаяПодсказка + 241 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ТаблицаРолейПоказатьТолькоВыбранныеРоли + 119 + true + true + + true + + false + + ТаблицаРолейПоказатьТолькоВыбранныеРолиРасширеннаяПодсказка + 242 + Label + true + true + + Left + + + Form.Command.ПоказатьТолькоВыбранныеРоли + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + ТаблицаРолейСтрокаПоиска + 244 + + ТаблицаРолейСтрокаПоискаРасширеннаяПодсказка + 246 + Label + true + true + + Left + + + + ТаблицаРолейСтрокаПоискаКонтекстноеМеню + 245 + true + + ТаблицаРолей + + true + + + + ТаблицаРолейСостояниеПросмотра + 247 + + ТаблицаРолейСостояниеПросмотраРасширеннаяПодсказка + 249 + Label + true + true + + Left + + + + ТаблицаРолейСостояниеПросмотраКонтекстноеМеню + 248 + true + + ViewStatusAddition + ТаблицаРолей + + true + + + + ТаблицаРолейУправлениеПоиском + 250 + + ТаблицаРолейУправлениеПоискомРасширеннаяПодсказка + 252 + Label + true + true + + Left + + + + ТаблицаРолейУправлениеПоискомКонтекстноеМеню + 251 + true + + SearchControlAddition + ТаблицаРолей + + true + + + + ТаблицаРолейРасширеннаяПодсказка + 243 + Label + true + true + + Left + + + + ТаблицаРолейКонтекстноеМеню + 101 + + КонтекстноеМенюТаблицаРолейНайти + 131 + true + true + + true + + false + + КонтекстноеМенюТаблицаРолейНайтиРасширеннаяПодсказка + 234 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюТаблицаРолейОтменитьПоиск + 132 + true + true + + true + + false + + КонтекстноеМенюТаблицаРолейОтменитьПоискРасширеннаяПодсказка + 235 + Label + true + true + + Left + + + Form.Item.ТаблицаРолей.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + true + + 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>Среди всех выбранные роли</value> + + + СредиВсехВыбранныеРолиРасширеннаяПодсказка + 233 + Label + true + true + + Left + + + Page + + Vertical + auto + +
+ true + true + + true + + + <key>ru</key> + <value>Отображение ролей</value> + + + ОтображениеРолейРасширеннаяПодсказка + 197 + Label + true + true + + Left + + + Pages + + Auto + +
+ + ВидыИЗначенияДоступа + 137 + + ВидыДоступа + 22 + + <key>ru</key> + <value>Виды доступа</value> + + + System.DefaultGUIFont + true + false + false + false + + true + true + + true + + + Объект.ВидыДоступа + + false + None + CancelSearch + Change + Copy + CopyToClipboard + EndEdit + Find + OutputList + + ВидыДоступаВидДоступа + 27 + true + true + + true + + + Объект.ВидыДоступа.ВидДоступа + + + OnChange + ВидыДоступаВидДоступаПриИзменении + + + ВидыДоступаВидДоступаРасширеннаяПодсказка + 293 + Label + true + true + + Left + + + + ВидыДоступаВидДоступаКонтекстноеМеню + 28 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ВидыДоступаИспользование + 187 + true + true + + true + + + Объект.ВидыДоступа.Использование + + + ru + "Предустановленный" - доступ по виду запрещен, + разрешенные значения задаются в профиле, + а не в группах доступа + +"Вначале все разрешены" - в новых группах доступа + для вида доступа устанавливается "Разрешены" + + + OnChange + ВидыДоступаИспользованиеПриИзменении + + + ВидыДоступаИспользованиеРасширеннаяПодсказка + 295 + Label + true + true + + Left + + + + ВидыДоступаИспользованиеКонтекстноеМеню + 188 + true + + InputField + Auto + true + Left + true + + + Clearing + ВидыДоступаИспользованиеОчистка + + true + true + true + true + false + true + true + true + + + ru + Вначале все запрешены + + + Вначале все запрешены + + + + + ru + Вначале все разрешены + + + Вначале все разрешены + + + + + ru + Предустановленный + + + Предустановленный + + + Normal + + + + ВидыДоступаКоманднаяПанель + 24 + + ВидыДоступаДобавить + 54 + true + true + + true + + false + + ВидыДоступаДобавитьРасширеннаяПодсказка + 277 + Label + true + true + + Left + + + Form.Item.ВидыДоступа.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + ВидыДоступаУдалить + 56 + true + true + + true + + false + + ВидыДоступаУдалитьРасширеннаяПодсказка + 278 + Label + true + true + + Left + + + Form.Item.ВидыДоступа.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + ВидыДоступаПереместитьВверх + 57 + true + true + + true + + false + + ВидыДоступаПереместитьВверхРасширеннаяПодсказка + 279 + Label + true + true + + Left + + + Form.Item.ВидыДоступа.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + ВидыДоступаПереместитьВниз + 58 + true + true + + true + + false + + ВидыДоступаПереместитьВнизРасширеннаяПодсказка + 280 + Label + true + true + + Left + + + Form.Item.ВидыДоступа.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + ВидыДоступаСортироватьСписокПоВозрастанию + 59 + true + true + + true + + false + + ВидыДоступаСортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 281 + Label + true + true + + Left + + + Form.Item.ВидыДоступа.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ВидыДоступаСортироватьСписокПоУбыванию + 60 + true + true + + true + + false + + ВидыДоступаСортироватьСписокПоУбываниюРасширеннаяПодсказка + 282 + Label + true + true + + Left + + + Form.Item.ВидыДоступа.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + Left + + + BeforeAddRow + ВидыДоступаПередНачаломДобавления + + + BeforeDeleteRow + ВидыДоступаПередУдалением + + + OnActivateRow + ВидыДоступаПриАктивизацииСтроки + + + OnChange + ВидыДоступаПриИзменении + + + ВидыДоступаСтрокаПоиска + 284 + + ВидыДоступаСтрокаПоискаРасширеннаяПодсказка + 286 + Label + true + true + + Left + + + + ВидыДоступаСтрокаПоискаКонтекстноеМеню + 285 + true + + ВидыДоступа + + true + + + + ВидыДоступаСостояниеПросмотра + 287 + + ВидыДоступаСостояниеПросмотраРасширеннаяПодсказка + 289 + Label + true + true + + Left + + + + ВидыДоступаСостояниеПросмотраКонтекстноеМеню + 288 + true + + ViewStatusAddition + ВидыДоступа + + true + + + + ВидыДоступаУправлениеПоиском + 290 + + ВидыДоступаУправлениеПоискомРасширеннаяПодсказка + 292 + Label + true + true + + Left + + + + ВидыДоступаУправлениеПоискомКонтекстноеМеню + 291 + true + + SearchControlAddition + ВидыДоступа + + true + + + + ВидыДоступаРасширеннаяПодсказка + 283 + Label + true + true + + Left + + + + ВидыДоступаКонтекстноеМеню + 23 + + КонтекстноеМенюВидыДоступаДобавить + 123 + true + true + + true + + false + + КонтекстноеМенюВидыДоступаДобавитьРасширеннаяПодсказка + 272 + Label + true + true + + Left + + + Form.Item.ВидыДоступа.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюВидыДоступаУдалить + 125 + true + true + + true + + false + + КонтекстноеМенюВидыДоступаУдалитьРасширеннаяПодсказка + 273 + Label + true + true + + Left + + + Form.Item.ВидыДоступа.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюВидыДоступаПереместитьВверх + 126 + true + true + + true + + false + + КонтекстноеМенюВидыДоступаПереместитьВверхРасширеннаяПодсказка + 274 + Label + true + true + + Left + + + Form.Item.ВидыДоступа.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюВидыДоступаПереместитьВниз + 127 + true + true + + true + + false + + КонтекстноеМенюВидыДоступаПереместитьВнизРасширеннаяПодсказка + 275 + Label + true + true + + Left + + + Form.Item.ВидыДоступа.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюВидыДоступаВыделитьВсе + 130 + true + true + + true + + false + + КонтекстноеМенюВидыДоступаВыделитьВсеРасширеннаяПодсказка + 276 + Label + true + true + + Left + + + Form.Item.ВидыДоступа.StandardCommand.SelectAll + Normal + Auto + true + true + UserCmds + Auto + + + true + true + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + None + None + None + true + +
+ + ЗначенияДоступаПоВидуДоступа + 138 + + НадписьВидДоступа + 139 + true + true + + true + + + НадписьВидДоступа + + None + Ctrl+S + + НадписьВидДоступаРасширеннаяПодсказка + 306 + Label + true + true + + Left + + + + НадписьВидДоступаКонтекстноеМеню + 140 + true + + LabelField + Enter + true + Left + true + + true + true + + System.DefaultGUIFont + true + false + false + false + + + + + ТипыВидовДоступа + 141 + + ПредустановленныйВидДоступа + 142 + + ЗначенияДоступа + 143 + true + true + + true + + + ЗначенияДоступа + + false + None + CopyToClipboard + EndEdit + OutputList + SelectAll + + НомерСтроки + 178 + true + true + + true + + + ЗначенияДоступа.НомерСтроки + + + НомерСтрокиРасширеннаяПодсказка + 328 + Label + true + true + + Left + + + + НомерСтрокиКонтекстноеМеню + 179 + true + + LabelField + Auto + true + Left + true + + true + true + + + + ЗначениеДоступа + 180 + true + true + + true + + + ЗначенияДоступа.ЗначениеДоступа + + + ru + Например, для +вида доступа "Хозяйственные операции" +значение "Выдача денежных средств подотчетнику" + + + ЗначениеДоступаРасширеннаяПодсказка + 330 + Label + true + true + + Left + + + + ЗначениеДоступаКонтекстноеМеню + 181 + true + + InputField + true + Enter + true + Left + true + + + AutoComplete + ЗначениеДоступаАвтоПодбор + + + StartChoice + ЗначениеДоступаНачалоВыбора + + + Clearing + ЗначениеДоступаОчистка + + + TextEditEnd + ЗначениеДоступаОкончаниеВводаТекста + + + ChoiceProcessing + ЗначениеДоступаОбработкаВыбора + + true + true + true + true + Items + true + true + true + Normal + + + + ЗначенияДоступаКоманднаяПанель + 145 + + ЗначенияДоступаДобавить + 155 + true + true + + true + + false + + ЗначенияДоступаДобавитьРасширеннаяПодсказка + 312 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + ЗначенияДоступаУдалить + 156 + true + true + + true + + false + + ЗначенияДоступаУдалитьРасширеннаяПодсказка + 313 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + ЗначенияДоступаПереместитьВверх + 159 + true + true + + true + + false + + ЗначенияДоступаПереместитьВверхРасширеннаяПодсказка + 314 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + ЗначенияДоступаПереместитьВниз + 160 + true + true + + true + + false + + ЗначенияДоступаПереместитьВнизРасширеннаяПодсказка + 315 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + СортироватьСписокПоВозрастанию + 161 + true + true + + true + + false + + СортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 316 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СортироватьСписокПоУбыванию + 162 + true + true + + true + + false + + СортироватьСписокПоУбываниюРасширеннаяПодсказка + 317 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + Left + + + OnStartEdit + ЗначенияДоступаПриНачалеРедактирования + + + OnChange + ЗначенияДоступаПриИзменении + + + ЗначенияДоступаСтрокаПоиска + 319 + + ЗначенияДоступаСтрокаПоискаРасширеннаяПодсказка + 321 + Label + true + true + + Left + + + + ЗначенияДоступаСтрокаПоискаКонтекстноеМеню + 320 + true + + ЗначенияДоступа + + true + + + + ЗначенияДоступаСостояниеПросмотра + 322 + + ЗначенияДоступаСостояниеПросмотраРасширеннаяПодсказка + 324 + Label + true + true + + Left + + + + ЗначенияДоступаСостояниеПросмотраКонтекстноеМеню + 323 + true + + ViewStatusAddition + ЗначенияДоступа + + true + + + + ЗначенияДоступаУправлениеПоиском + 325 + + ЗначенияДоступаУправлениеПоискомРасширеннаяПодсказка + 327 + Label + true + true + + Left + + + + ЗначенияДоступаУправлениеПоискомКонтекстноеМеню + 326 + true + + SearchControlAddition + ЗначенияДоступа + + true + + + + ЗначенияДоступаРасширеннаяПодсказка + 318 + Label + true + true + + Left + + + + ЗначенияДоступаКонтекстноеМеню + 144 + + КонтекстноеМенюЗначенияДоступаДобавить + 152 + true + true + + true + + false + + КонтекстноеМенюЗначенияДоступаДобавитьРасширеннаяПодсказка + 310 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюЗначенияДоступаУдалить + 154 + true + true + + true + + false + + КонтекстноеМенюЗначенияДоступаУдалитьРасширеннаяПодсказка + 311 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + 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>Предустановленный вид доступа</value> + + + ПредустановленныйВидДоступаРасширеннаяПодсказка + 309 + Label + true + true + + Left + + + Page + + Vertical + +
+ + ВидДоступаЧерезПраваПоЗначениямДоступа + 163 + + КартинкаИнформации + 165 + + <key>ru</key> + <value>Картинка информации</value> + + true + true + + true + + + КартинкаИнформацииРасширеннаяПодсказка + 341 + Label + true + true + + Left + + + + КартинкаИнформацииКонтекстноеМеню + 166 + true + + 3 + true + 3 + true + false + false + false + + + CommonPicture.Информация32 + + AutoSize + + + + ТекстИнформации + 167 + + <key>ru</key> + <value>Для этого вида доступа +в профилях и группах доступа +разрешенные значения не настраиваются</value> + + true + true + + true + + + ТекстИнформацииРасширеннаяПодсказка + 342 + Label + true + true + + Left + + + + ТекстИнформацииКонтекстноеМеню + 168 + true + + Label + 29 + true + 3 + true + false + false + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Вид доступа через права по значениям доступа</value> + + + ВидДоступаЧерезПраваПоЗначениямДоступаРасширеннаяПодсказка + 340 + Label + true + true + + Left + + + Page + + + + ОбычныйВидДоступа + 182 + + КартинкаИнформацииОбычногоВидаДоступа + 183 + true + true + + true + + + КартинкаИнформацииОбычногоВидаДоступаРасширеннаяПодсказка + 344 + Label + true + true + + Left + + + + КартинкаИнформацииОбычногоВидаДоступаКонтекстноеМеню + 184 + true + + 3 + true + 3 + true + false + false + false + + + CommonPicture.Информация32 + + AutoSize + + + + ТекстИнформацииОбычногоВидаДоступа + 185 + + <key>ru</key> + <value>Для обычного вида доступа +разрешенные значения настраиваются +в группах доступа</value> + + true + true + + true + + + ТекстИнформацииОбычногоВидаДоступаРасширеннаяПодсказка + 345 + Label + true + true + + Left + + + + ТекстИнформацииОбычногоВидаДоступаКонтекстноеМеню + 186 + true + + Label + 29 + true + 3 + true + false + false + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Обычный вид доступа</value> + + + ОбычныйВидДоступаРасширеннаяПодсказка + 343 + Label + true + true + + Left + + + Page + + + true + true + + true + + + <key>ru</key> + <value>Типы видов доступа</value> + + + ru + Типы видов доступа + + + ТипыВидовДоступаРасширеннаяПодсказка + 308 + Label + true + true + + Left + + + Pages + + Auto + +
+ true + true + + true + + + <key>ru</key> + <value>Значения доступа по виду доступа</value> + + + ru + Значения доступа по виду доступа + + + ЗначенияДоступаПоВидуДоступаРасширеннаяПодсказка + 305 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + +
+ true + true + + true + + + <key>ru</key> + <value>Виды и значения доступа</value> + + + ВидыИЗначенияДоступаРасширеннаяПодсказка + 271 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + +
+ true + true + + true + + + <key>ru</key> + <value>Доступ</value> + + + ru + Доступ + + + ДоступРасширеннаяПодсказка + 196 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + +
+ + Комментарий + 47 + true + true + + true + + + Объект.Комментарий + + + КомментарийРасширеннаяПодсказка + 346 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 48 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + + ВосстановитьПоНачальномуЗаполнению + 46 + true + true + + true + + false + + ВосстановитьПоНачальномуЗаполнениюРасширеннаяПодсказка + 191 + Label + true + true + + Left + + + Form.Command.ВосстановитьПоНачальномуЗаполнению + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + + FillCheckProcessingAtServer + ОбработкаПроверкиЗаполненияНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + LockOwner + Use + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ПрофилиГруппДоступа + + + true + + + true + +
true
+ true + + + Объект.ВидыДоступа + + + ТекущийТипЗначенияДоступа + + <key>ru</key> + <value>Текущий тип значения доступа</value> + + 1 + + AnyRef + + + true + + + true + + + + ЗначенияЗаданы + + <key>ru</key> + <value>Значения заданы</value> + + 2 + + Boolean + + + true + + + true + + + + Использование + + <key>ru</key> + <value>Использование</value> + + 3 + + String + + + + true + + + true + + + + + + Объект.Роли + + + СинонимРоли + + <key>ru</key> + <value>Синоним роли</value> + + 1 + + String + + + + true + + + true + + + +
+ + СписокВыбораРолей + + <key>ru</key> + <value>Список выбора ролей</value> + + 2 + + ValueList + + + true + + + true + + + + + + + ВидыДоступаИспользуемыеВсегда + + <key>ru</key> + <value>Виды доступа используемые всегда</value> + + 4 + + ValueList + + + true + + + true + + + + + + + ТаблицаРолей + + <key>ru</key> + <value>Таблица ролей</value> + + 3 + + ValueTable + + + true + + + true + + + Имя + + <key>ru</key> + <value>Имя роли</value> + + 1 + + String + + + + true + + + true + + + + Синоним + + <key>ru</key> + <value>Разрешенное действие (роль)</value> + + 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> + + 5 + + Boolean + + + true + + + true + + + ПоказатьТолькоВыбранныеРоли + + + + ЗначенияДоступа + + <key>ru</key> + <value>Значения и группы значений доступа</value> + + 6 + + ValueTable + + + true + + + true + + true + + ЗначениеДоступа + + <key>ru</key> + <value>Разрешенное значение</value> + + 1 + + Characteristic.ВидыДоступа + + + true + + + true + + + + НомерСтроки + + <key>ru</key> + <value>N</value> + + 3 + + Number + + 4 + true + + + + true + + + true + + + + + НадписьВидДоступа + + <key>ru</key> + <value>Надпись вид доступа</value> + + 7 + + String + + + + true + + + true + + + + ЗначенияЗадаются + + <key>ru</key> + <value>Значения задаются</value> + + 8 + + Boolean + + + true + + + true + + + + ВидыДоступаЧерезПраваПоЗначениямДоступа + + <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 + + + + + ТребуетсяОбновитьГруппыДоступаПрофиля + + <key>ru</key> + <value>Требуется обновить группы доступа профиля</value> + + 21 + + Boolean + + + true + + + true + + + + ОбъектЗаписывался + + <key>ru</key> + <value>Объект записывался</value> + + 14 + + Boolean + + + true + + + true + + + + ПереименованныеРоли + + <key>ru</key> + <value>Переименованные роли</value> + + 22 + + ValueTable + + + true + + + true + + + СтароеИмяРоли + + <key>ru</key> + <value>Старое имя роли</value> + + 1 + + String + + + + true + + + true + + + + НовоеИмяРоли + + <key>ru</key> + <value>Новое имя роли</value> + + 2 + + String + + + + true + + + true + + + + + ВосстановитьПоНачальномуЗаполнению + + <key>ru</key> + <value>Восстановить по начальному заполнению</value> + + 1 + + ru + Восстановить профиль по начальному заполнению (только для профилей поставляемых с прикладным решением) + + + true + + + + ВосстановитьПоНачальномуЗаполнению + + + Auto + Auto + + + ПодобратьРоли + + <key>ru</key> + <value>Подобрать</value> + + 2 + + ru + Подобрать роли + + + true + + + + ПодобратьРоли + + + true + Auto + Auto + + + ПоказатьТолькоВыбранныеРоли + + <key>ru</key> + <value>Показать только выбранные роли</value> + + 4 + + true + + + CommonPicture.ПоказатьТолькоВыбранныеРоли + + + + ПоказатьТолькоВыбранныеРоли + + + Picture + Auto + Auto + + + УстановитьФлажки + + <key>ru</key> + <value>Установить флажки</value> + + 5 + + true + + + StdPicture.CheckAll + + + + УстановитьФлажки + + + true + Auto + Auto + + + СнятьФлажки + + <key>ru</key> + <value>Снять флажки</value> + + 6 + + true + + + StdPicture.UncheckAll + + + + СнятьФлажки + + + true + Auto + Auto + + + + + + + + AfterWrite + ПослеЗаписи + + + AfterWriteAtServer + ПослеЗаписиНаСервере + + + OnReadAtServer + ПриЧтенииНаСервере + + + BeforeWrite + ПередЗаписью + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + +
diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..511a80854 --- /dev/null +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,976 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + //** Установка начальных значений + // перед загрузкой данных из настроек на сервере + // для случая, когда данные ещё не были записаны и не загружаются + ПоказатьТолькоВыбранныеРоли = (Элементы.ОтображениеРолей.ТекущаяСтраница = Элементы.ТолькоВыбранныеРоли); + + //** Подготовка постоянных коллекций + + ПодготовитьСписокВыбораИТаблицуРолей(); + + // Заполнение списка всегда используемых видов доступа (для исключения при выборе) + Для каждого СвойстваВидаДоступа Из УправлениеДоступом.СвойстваВидаДоступа().НайтиСтроки(Новый Структура("ВидДоступаИспользуетсяВсегда", Истина)) Цикл + ВидыДоступаИспользуемыеВсегда.Добавить(СвойстваВидаДоступа.ВидДоступа); + КонецЦикла; + + // Заполнение списка видов доступа через права по значениям доступа + Для каждого СвойстваВидаДоступа Из УправлениеДоступом.СвойстваВидаДоступа().НайтиСтроки(Новый Структура("ВидДоступаЧерезПраваПоЗначениямДоступа", Истина)) Цикл + ВидыДоступаЧерезПраваПоЗначениямДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа); + КонецЦикла; + + // Заполнение типов значений доступа всех видов доступа + Для каждого СвойстваВидаДоступа Из УправлениеДоступом.СвойстваВидаДоступа() Цикл + Для каждого Тип Из СвойстваВидаДоступа.ВидДоступа.ТипЗначения.Типы() Цикл + МассивТипов = Новый Массив; + МассивТипов.Добавить(Тип); + ОписаниеТипа = Новый ОписаниеТипов(МассивТипов); + + МетаданныеТипа = Метаданные.НайтиПоТипу(Тип); + Если Метаданные.Перечисления.Найти(МетаданныеТипа.Имя) = МетаданныеТипа Тогда + ПредставлениеТипа = МетаданныеТипа.Представление(); + Иначе + ПредставлениеТипа = ?(ЗначениеЗаполнено(МетаданныеТипа.ПредставлениеОбъекта), МетаданныеТипа.ПредставлениеОбъекта, МетаданныеТипа.Представление()); + КонецЕсли; + + НоваяСтрока = ТипыЗначенийДоступаВидовДоступа.Добавить(); + НоваяСтрока.ВидДоступа = СвойстваВидаДоступа.ВидДоступа; + НоваяСтрока.ТипЗначенияДоступа = ОписаниеТипа.ПривестиЗначение(Неопределено); + НоваяСтрока.ПредставлениеТипа = ПредставлениеТипа; + КонецЦикла; + КонецЦикла; + + ВидДоступаПользователи = ПланыВидовХарактеристик.ВидыДоступа.Пользователи; + ВидДоступаВнешниеПользователи = ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи; + + ИспользоватьВнешнихПользователей = ВнешниеПользователи.ИспользоватьВнешнихПользователей(); + + //** Заполнение изменяемых коллекций + + // При создании копированием + Если Объект.Роли.Количество() > 0 И НЕ ЗначениеЗаполнено(Объект.Роли[0].СинонимРоли) Тогда + ЗаполнитьСинонимыТабличнойЧастиРоли(); + ЗаполнитьСвойстваВидовДоступаВФорме(); + КонецЕсли; + + // Удаление роли ПолныеПрава из списка выбора и таблицы ролей + СписокВыбораРолей.Удалить(СписокВыбораРолей.НайтиПоЗначению("ПолныеПрава")); + ТаблицаРолей.Удалить(ТаблицаРолей.НайтиСтроки(Новый Структура("Имя", "ПолныеПрава"))[0]); + + //** Установка постоянной доступности свойств + + // Определение необходимости настройки ограничений доступа + Если НЕ УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда + Элементы.ВидыИЗначенияДоступа.Видимость = Ложь; + КонецЕсли; + + // Определение прав восстановления по начальному заполнению + Элементы.ВосстановитьПоНачальномуЗаполнению.Видимость = УправлениеДоступом.ЕстьРоль("ПолныеПрава"); + + // Определение возможности восстановления по начальному заполнению + Если Объект.Ссылка.Пустая() Тогда + Элементы.ВосстановитьПоНачальномуЗаполнению.Доступность = Ложь; + Иначе + Элементы.ВосстановитьПоНачальномуЗаполнению.Доступность = УправлениеДоступом.ЕстьНачальноеЗаполнениеПрофиляГруппДоступа(Объект.Ссылка); + КонецЕсли; + + // Определение возможности редактирования элементов формы (перезапись доступна) + ЭтоПрофильАдминистратор = ТолькоПросмотр ИЛИ Объект.Ссылка = Справочники.ПрофилиГруппДоступа.Администратор; + + Элементы.Наименование.ТолькоПросмотр = ЭтоПрофильАдминистратор; + + // Настройка редактирования видов доступа + Элементы.ВидыДоступа.ТолькоПросмотр = ЭтоПрофильАдминистратор; + Элементы.ВидыДоступаДобавить.Доступность = НЕ ЭтоПрофильАдминистратор; + Элементы.КонтекстноеМенюВидыДоступаДобавить.Доступность = НЕ ЭтоПрофильАдминистратор; + + УстановитьТолькоПросмотрРолей(ЭтоПрофильАдминистратор); + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + + ЗаполнитьСинонимыТабличнойЧастиРоли(); + ЗаполнитьСвойстваВидовДоступаВФорме(); + ОбновитьГруппыДоступаПрофиля = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) + + Если ТребуетсяОбновитьГруппыДоступаПрофиля Тогда + КодОтвета = Вопрос(ТекстВопросаОбновитьГруппыДоступаПрофиля(), РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Нет); + Если КодОтвета = КодВозвратаДиалога.Отмена Тогда + Отказ = Истина; + Возврат; + ИначеЕсли КодОтвета = КодВозвратаДиалога.Да Тогда + ПараметрыЗаписи.Вставить("ОбновитьГруппыДоступаПрофиля"); + КонецЕсли; + КонецЕсли; + + // Сохранение значений из таблицы формы в табличную часть объекта. + ПоместитьЗаполнитьДанные(ТекущийВидДоступа); + + ПроверкаЗаполненияВидовИЗначенийДоступа(Отказ); + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + Если ПараметрыЗаписи.Свойство("ОбновитьГруппыДоступаПрофиля") Тогда + ТекущийОбъект.ДополнительныеСвойства.Вставить("ОбновитьГруппыДоступаПрофиля"); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + + Если ТекущийОбъект.ДополнительныеСвойства.Свойство("ЕстьОшибки") Тогда + ПараметрыЗаписи.Вставить("ЕстьОшибки"); + КонецЕсли; + + ЗаполнитьСинонимыТабличнойЧастиРоли(); + ЗаполнитьСвойстваВидовДоступаВФорме(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + Если ПараметрыЗаписи.Свойство("ЕстьОшибки") Тогда + Предупреждение(НСтр("ru = 'При записи возникли ошибки (см. журнал регистрации)'")); + КонецЕсли; + + ОбъектЗаписывался = Истина; + + Если ПереименованныеРоли.Количество() > 0 Тогда + ТекстВопроса = НСтр("ru = 'Переименовать следующие роли во всех профилях?'")+ Символы.ПС; + Для каждого ПереименованнаяРоль Из ПереименованныеРоли Цикл + ТекстВопроса = ТекстВопроса + Символы.ПС + ПереименованнаяРоль.СтароеИмяРоли + " -> " + ПереименованнаяРоль.НовоеИмяРоли; + КонецЦикла; + Если Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда + ОбновитьПереименованныеРоли(); + КонецЕсли; + ПереименованныеРоли.Очистить(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + + ОбработкаПроверкиЗаполненияСпискаРолей(Отказ); + + Если Отказ Тогда + ПроверяемыеРеквизиты.Очистить(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + + Если Настройки["ПоказатьТолькоВыбранныеРоли"] = Ложь Тогда + Элементы.ОтображениеРолей.ТекущаяСтраница = Элементы.СредиВсехВыбранныеРоли; + Иначе + Элементы.ОтображениеРолей.ТекущаяСтраница = Элементы.ТолькоВыбранныеРоли; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий команд и элементов формы +// + +&НаКлиенте +Процедура ВосстановитьПоНачальномуЗаполнению(Команда) + + Если Модифицированность ИЛИ ОбъектЗаписывался Тогда + Предупреждение(НСтр("ru = 'Для выполнения команды требуется переоткрыть форму!'")); + + ИначеЕсли Вопрос(НСтр("ru = 'Заменить содержимое профиля содержимым начального заполнения?'"), РежимДиалогаВопрос.ОКОтмена) = КодВозвратаДиалога.ОК Тогда + КодОтвета = Вопрос(ТекстВопросаОбновитьГруппыДоступаПрофиля(), РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Нет); + Если КодОтвета <> КодВозвратаДиалога.Отмена Тогда + УправлениеДоступом.НачальноеЗаполнениеПрофилейГруппДоступа(Объект.Ссылка, КодОтвета = КодВозвратаДиалога.Да, Ложь); + КонецЕсли; + Прочитать(); + КонецЕсли; + +КонецПроцедуры + +//** Для работы интерфейса ролей + +&НаКлиенте +Процедура ПодобратьРоли(Команда) + + ОткрытьФорму("Справочник.Пользователи.Форма.ФормаВыбораРолей", Новый Структура("ЗакрыватьПриВыборе", Ложь), Элементы.Роли); + +КонецПроцедуры + +&НаКлиенте +Процедура РолиПриИзменении(Элемент) + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаКлиенте +Процедура РолиПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаКлиенте +Процедура РолиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + ДобавитьВыбранныеРоли(ВыбранноеЗначение); + +КонецПроцедуры + + +&НаКлиенте +Процедура СинонимРолиПриИзменении(Элемент) + + Если ЗначениеЗаполнено(Элементы.Роли.ТекущиеДанные.СинонимРоли) Тогда + Элементы.Роли.ТекущиеДанные.СинонимРоли = СписокВыбораРолей.НайтиПоЗначению(Элементы.Роли.ТекущиеДанные.Роль).Представление; + Иначе + Элементы.Роли.ТекущиеДанные.Роль = ""; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + НачальноеЗначение = ?(Элементы.Роли.ТекущиеДанные = Неопределено, Неопределено, Элементы.Роли.ТекущиеДанные.Роль); + ОткрытьФорму("Справочник.Пользователи.Форма.ФормаВыбораРолей", Новый Структура("ТекущаяСтрока", НачальноеЗначение), Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Если Найти(Элементы.Роли.ТекущиеДанные.СинонимРоли, "?") > 0 Тогда + НайденныеСтроки = ПереименованныеРоли.НайтиСтроки(Новый Структура ("СтароеИмяРоли", Элементы.Роли.ТекущиеДанные.Роль)); + Если НайденныеСтроки.Количество() > 0 Тогда + Строка = НайденныеСтроки[0]; + Иначе + Строка = ПереименованныеРоли.Добавить(); + КонецЕсли; + Строка.СтароеИмяРоли = Элементы.Роли.ТекущиеДанные.Роль; + Строка.НовоеИмяРоли = ВыбранноеЗначение; + КонецЕсли; + + Элементы.Роли.ТекущиеДанные.Роль = ВыбранноеЗначение; + Элементы.Роли.ТекущиеДанные.СинонимРоли = СписокВыбораРолей.НайтиПоЗначению(Элементы.Роли.ТекущиеДанные.Роль).Представление; + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = СформироватьДанныеВыбораРолей(Текст); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СинонимРолиОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = СформироватьДанныеВыбораРолей(Текст); + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ТаблицаРолейПометкаПриИзменении(Элемент) + + СтрокаТаблицы = Элементы.ТаблицаРолей.ТекущиеДанные; + + НайденныеРоли = Объект.Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)); + + Если СтрокаТаблицы.Пометка Тогда + Если НайденныеРоли.Количество() = 0 Тогда + Строка = Объект.Роли.Добавить(); + Строка.Роль = СтрокаТаблицы.Имя; + Строка.СинонимРоли = СтрокаТаблицы.Синоним; + КонецЕсли; + ИначеЕсли НайденныеРоли.Количество() > 0 Тогда + Объект.Роли.Удалить(НайденныеРоли[0]); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьТолькоВыбранныеРоли(Команда) + + ПоказатьТолькоВыбранныеРоли = НЕ ПоказатьТолькоВыбранныеРоли; + + Элементы.ОтображениеРолей.ТекущаяСтраница = ?(ПоказатьТолькоВыбранныеРоли, Элементы.ТолькоВыбранныеРоли, Элементы.СредиВсехВыбранныеРоли); + ТекущийЭлемент = ?(ПоказатьТолькоВыбранныеРоли, Элементы.Роли, Элементы.ТаблицаРолей); + + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьФлажки(Команда) + + УстановитьФлажкиНаСервере(); + +КонецПроцедуры + +&НаКлиенте +Процедура СнятьФлажки(Команда) + + СнятьФлажкиНаСервере(); + +КонецПроцедуры + + +&НаКлиенте +Процедура ВидыДоступаПриИзменении(Элемент) + + ТребуетсяОбновитьГруппыДоступаПрофиля = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаПриАктивизацииСтроки(Элемент) + + ПриИзмененииТекущегоВидаДоступа(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Отказ = Копирование; + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаПередУдалением(Элемент, Отказ) + + ЗначенияДоступа.Очистить(); + + ТекущийВидДоступа = Неопределено; + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаВидДоступаПриИзменении(Элемент) + + Если ВидыДоступаИспользуемыеВсегда.НайтиПоЗначению(Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа) <> Неопределено Тогда + Предупреждение(СтрЗаменить(НСтр("ru = 'Вид доступа ""%1"" не требуется выбирать. + |По нему ограничение всегда выполняется.'"), "%1", Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа)); + Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа = Неопределено; + КонецЕсли; + + ПриИзмененииТекущегоВидаДоступа(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаИспользованиеПриИзменении(Элемент) + + Элементы.ВидыДоступа.ТекущиеДанные.Предустановленный = Элементы.ВидыДоступа.ТекущиеДанные.Использование = "Предустановленный"; + Элементы.ВидыДоступа.ТекущиеДанные.ДоступРазрешен = Элементы.ВидыДоступа.ТекущиеДанные.Использование = "Вначале все разрешены"; + + ПриИзмененииТекущегоВидаДоступа(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаИспользованиеОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + + +&НаКлиенте +Процедура ЗначенияДоступаПриИзменении(Элемент) + + ТребуетсяОбновитьГруппыДоступаПрофиля = Истина; + + Объект.ВидыДоступа.НайтиСтроки(Новый Структура("ВидДоступа", ТекущийВидДоступа))[0].ЗначенияЗаданы = ЗначенияДоступа.Количество() <> 0; + + ТекущийНомер = 1; + Для каждого Строка Из ЗначенияДоступа Цикл + Строка.НомерСтроки = ТекущийНомер; + ТекущийНомер = ТекущийНомер + 1; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначенияДоступаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) + + Если НоваяСтрока Тогда + Элемент.ТекущиеДанные.НомерСтроки = ЗначенияДоступа.Количество(); + КонецЕсли; + + Если Элемент.ТекущиеДанные.ЗначениеДоступа = Неопределено Тогда + Элемент.ТекущиеДанные.ЗначениеДоступа = ТекущиеТипыЗначенийДоступа[0].Значение; + КонецЕсли; + + Элементы.ЗначениеДоступа.КнопкаОчистки = ТекущийТипЗначенияДоступа <> Неопределено + И ТекущиеТипыЗначенийДоступа.Количество() > 1; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + Если НЕ ВыбранТипЗначенияДоступа(ТекущиеТипыЗначенийДоступа) Тогда + СтандартнаяОбработка = Ложь; + Возврат; + КонецЕсли; + + ТекущиеДанные = Элементы.ЗначенияДоступа.ТекущиеДанные; + + Если НЕ ЗначениеЗаполнено(ТекущиеДанные.ЗначениеДоступа) + И ТекущиеДанные.ЗначениеДоступа <> ТекущийТипЗначенияДоступа Тогда + + ТекущиеДанные.ЗначениеДоступа = ТекущийТипЗначенияДоступа; + КонецЕсли; + + Элементы.ЗначениеДоступа.КнопкаОчистки = ТекущийТипЗначенияДоступа <> Неопределено + И ТекущиеТипыЗначенийДоступа.Количество() > 1; + + Если ТекущийТипЗначенияДоступа = ПользовательПустаяСсылка ИЛИ + ТекущийТипЗначенияДоступа = ГруппаПользователейПустаяСсылка Тогда + + СтандартнаяОбработка = Ложь; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ТекущаяСтрока", Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа); + ПараметрыФормы.Вставить("ВыборГруппПользователей", Истина); + ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элемент); + + ИначеЕсли ТекущийТипЗначенияДоступа = ВнешнийПользовательПустаяСсылка ИЛИ + ТекущийТипЗначенияДоступа = ГруппаВнешнихПользователейПустаяСсылка Тогда + + СтандартнаяОбработка = Ложь; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ТекущаяСтрока", Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа); + ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); + ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, Элемент); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + Если ВыбранноеЗначение = Тип("СправочникСсылка.Пользователи") ИЛИ + ВыбранноеЗначение = Тип("СправочникСсылка.ГруппыПользователей") Тогда + + СтандартнаяОбработка = Ложь; + НачальноеЗначение = Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа; + ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", Новый Структура("ВыборГруппПользователей, ТекущаяСтрока", Истина, НачальноеЗначение), Элемент); + + ИначеЕсли ВыбранноеЗначение = Тип("СправочникСсылка.ВнешниеПользователи") ИЛИ + ВыбранноеЗначение = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда + + СтандартнаяОбработка = Ложь; + НачальноеЗначение = Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа; + ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", Новый Структура("ВыборГруппВнешнихПользователей, ТекущаяСтрока", Истина, НачальноеЗначение), Элемент); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ТекущийТипЗначенияДоступа = Неопределено; + + Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа = ТекущиеТипыЗначенийДоступа[0].Значение; + Элементы.ЗначениеДоступа.КнопкаОчистки = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + + Если ТекущийВидДоступа = ВидДоступаВнешниеПользователи ИЛИ ТекущийВидДоступа = ВидДоступаПользователи Тогда + ДанныеВыбора = Пользователи.СформироватьДанныеВыбораПользователя(Текст, , ТекущийВидДоступа = ВидДоступаВнешниеПользователи, ТекущийВидДоступа <> ВидДоступаПользователи); + Иначе + ДанныеВыбора = УправлениеДоступом.СформироватьДанныеВыбораЗначенияДоступа(Текст, ТекущийВидДоступа, Ложь); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + + Если ТекущийВидДоступа = ВидДоступаВнешниеПользователи ИЛИ ТекущийВидДоступа = ВидДоступаПользователи Тогда + ДанныеВыбора = Пользователи.СформироватьДанныеВыбораПользователя(Текст, , ТекущийВидДоступа = ВидДоступаВнешниеПользователи, ТекущийВидДоступа <> ВидДоступаПользователи); + Иначе + ДанныеВыбора = УправлениеДоступом.СформироватьДанныеВыбораЗначенияДоступа(Текст, ТекущийВидДоступа, Ложь); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции формы +// + +&НаСервере +Процедура ОбновитьПереименованныеРоли() + + УправлениеДоступом.ОбновитьПереименованныеРоли(РеквизитФормыВЗначение("ПереименованныеРоли")); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверкаЗаполненияВидовИЗначенийДоступа(Отказ) + + // Проверка незаполненных и повторяющихся видов доступа. + НомерСтрокиВидовДоступа = Объект.ВидыДоступа.Количество()-1; + Пока НЕ Отказ И НомерСтрокиВидовДоступа >= 0 Цикл + + ТекущаяСтрокаВидовДоступа = Объект.ВидыДоступа.Получить(НомерСтрокиВидовДоступа); + + // Проверка заполнения значения. + Если НЕ ЗначениеЗаполнено(ТекущаяСтрокаВидовДоступа.ВидДоступа) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Вид доступа не заполнен!'"), + , + "Объект.ВидыДоступа[" + Формат(НомерСтрокиВидовДоступа, "ЧГ=0") + "].ВидДоступа", + , + Отказ); + Возврат; + КонецЕсли; + + // Проверка наличия повторяющихся значений. + НайденныеЗначения = Объект.ВидыДоступа.НайтиСтроки(Новый Структура("ВидДоступа", ТекущаяСтрокаВидовДоступа.ВидДоступа)); + Если НайденныеЗначения.Количество() > 1 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Вид доступа повторяется!'"), + , + "Объект.ВидыДоступа[" + Формат(НомерСтрокиВидовДоступа, "ЧГ=0") + "].ВидДоступа", + , + Отказ); + Возврат; + КонецЕсли; + + // Проверка незаполненных и повторяющихся видов доступа. + ЗначенияДоступаВидаДоступа = Объект.ЗначенияДоступа.НайтиСтроки(Новый Структура("ВидДоступа", ТекущаяСтрокаВидовДоступа.ВидДоступа)); + НомерСтроки = ЗначенияДоступаВидаДоступа.Количество()-1; + + Пока НЕ Отказ И НомерСтроки >= 0 Цикл + + ТекущаяСтрока = ЗначенияДоступаВидаДоступа.Получить(НомерСтроки); + + // Проверка заполнения значения. + Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.ЗначениеДоступа) Тогда + Элементы.ВидыДоступа.ТекущаяСтрока = ТекущаяСтрокаВидовДоступа.ПолучитьИдентификатор(); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Значение не заполнено!'"), + , + "ЗначенияДоступа[" + Формат(НомерСтроки, "ЧГ=0") + "].ЗначениеДоступа", + , + Отказ); + Возврат; + КонецЕсли; + + // Проверка наличия повторяющихся значений. + НайденныеЗначения = Объект.ЗначенияДоступа.НайтиСтроки(Новый Структура("ВидДоступа, ЗначениеДоступа", ТекущаяСтрокаВидовДоступа.ВидДоступа, ТекущаяСтрока.ЗначениеДоступа)); + Если НайденныеЗначения.Количество() > 1 Тогда + Элементы.ВидыДоступа.ТекущаяСтрока = ТекущаяСтрокаВидовДоступа.ПолучитьИдентификатор(); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Значение повторяется!'"), + , + "ЗначенияДоступа[" + Формат(НомерСтроки, "ЧГ=0") + "].ЗначениеДоступа", + , + Отказ); + Возврат; + КонецЕсли; + + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + + НомерСтрокиВидовДоступа = НомерСтрокиВидовДоступа - 1; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриИзмененииТекущегоВидаДоступа() + + ЗначенияЗадаются = Ложь; + + ТекущиеДанные = Элементы.ВидыДоступа.ТекущиеДанные; + + Если ТекущиеДанные <> Неопределено Тогда + + ПоместитьЗаполнитьДанные(ТекущиеДанные.ВидДоступа); + + Если ВидыДоступаЧерезПраваПоЗначениямДоступа.НайтиПоЗначению(ТекущиеДанные.ВидДоступа) = Неопределено Тогда + ЗначенияЗадаются = ТекущиеДанные.Предустановленный; + Элементы.ТипыВидовДоступа.ТекущаяСтраница = ?(ЗначенияЗадаются, Элементы.ПредустановленныйВидДоступа, Элементы.ОбычныйВидДоступа); + Иначе + Элементы.ТипыВидовДоступа.ТекущаяСтраница = Элементы.ВидДоступаЧерезПраваПоЗначениямДоступа; + КонецЕсли; + ОбновитьНадписьВидДоступа(ЗначенияЗадаются); + КонецЕсли; + + Если НЕ ЗначенияЗадаются Тогда + ЗначенияДоступа.Очистить(); + Если ТекущиеДанные <> Неопределено Тогда + ТекущиеДанные.ЗначенияЗаданы = Ложь; + КонецЕсли; + КонецЕсли; + + Элементы.ЗначенияДоступа.Доступность = ЗначенияЗадаются; + Элементы.ЗначенияДоступа.КоманднаяПанель.ПодчиненныеЭлементы.ЗначенияДоступаДобавить.Доступность = ЗначенияЗадаются; + Элементы.ЗначениеДоступа.ЦветТекстаЗаголовка = ?(ЗначенияЗадаются, Новый Цвет, Новый Цвет(167, 144, 79)); + +КонецПроцедуры + +&НаКлиенте +Функция ОбновитьНадписьВидДоступа(ЗначенияЗадаются = Истина) + + НадписьВидДоступа = Строка(Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа) + " " + + ?(ЗначенияЗадаются, + ?(Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа = ВидДоступаПользователи, + НСтр("ru = '(список разрешенных, текущий пользователь всегда разрешен)'"), + ?(Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа = ВидДоступаВнешниеПользователи, + НСтр("ru = '(список разрешенных, текущий внешний пользователь всегда разрешен)'"), + НСтр("ru = '(список разрешенных)'") + ) + ), + "" ); + +КонецФункции + +&НаКлиенте +Процедура ПоместитьЗаполнитьДанные(НовыйВидДоступа) + + Если ЗначениеЗаполнено(ТекущийВидДоступа) Тогда + + Отбор = Новый Структура("ВидДоступа", ТекущийВидДоступа); + + НайденныеСтроки = Объект.ВидыДоступа.НайтиСтроки(Отбор); + Если НайденныеСтроки.Количество() > 0 Тогда + НайденныеСтроки[0].ТекущийТипЗначенияДоступа = ТекущийТипЗначенияДоступа; + КонецЕсли; + + // Установка значений и групп старого вида доступа. + СтрокиУдалить = Объект.ЗначенияДоступа.НайтиСтроки(Отбор); + Для каждого СтрокаУдалить Из СтрокиУдалить Цикл + Объект.ЗначенияДоступа.Удалить(Объект.ЗначенияДоступа.Индекс(СтрокаУдалить)); + КонецЦикла; + Для каждого Строка Из ЗначенияДоступа Цикл + НоваяСтрока = Объект.ЗначенияДоступа.Добавить(); + НоваяСтрока.ВидДоступа = ТекущийВидДоступа; + НоваяСтрока.ЗначениеДоступа = Строка.ЗначениеДоступа; + КонецЦикла; + КонецЕсли; + + ЗначенияДоступа.Очистить(); + ТекущийТипЗначенияДоступа = Неопределено; + Если ЗначениеЗаполнено(НовыйВидДоступа) Тогда + + Отбор = Новый Структура("ВидДоступа", НовыйВидДоступа); + + ОписаниеВидаДоступа = Объект.ВидыДоступа.НайтиСтроки(Отбор)[0]; + ТекущийТипЗначенияДоступа = ОписаниеВидаДоступа.ТекущийТипЗначенияДоступа; + + // Получение значений и групп значений нового вида доступа. + ТекущийНомер = 1; + СтрокиТЧ = Объект.ЗначенияДоступа.НайтиСтроки(Отбор); + Для каждого СтрокаТЧ Из СтрокиТЧ Цикл + НоваяСтрока = ЗначенияДоступа.Добавить(); + НоваяСтрока.ЗначениеДоступа = СтрокаТЧ.ЗначениеДоступа; + НоваяСтрока.НомерСтроки = ТекущийНомер; + ТекущийНомер = ТекущийНомер + 1; + КонецЦикла; + КонецЕсли; + + ТекущийВидДоступа = НовыйВидДоступа; + Элементы.ЗначенияДоступа.Доступность = ЗначениеЗаполнено(ТекущийВидДоступа); + + ОписаниеВидаДоступа = Объект.ВидыДоступа.НайтиСтроки(Новый Структура("ВидДоступа", ТекущийВидДоступа)); + ТекущийТипЗначенияДоступа = ?(ОписаниеВидаДоступа.Количество() = 0, Неопределено, ОписаниеВидаДоступа[0].ТекущийТипЗначенияДоступа); + ТекущиеТипыЗначенийДоступа = Новый СписокЗначений; + Для каждого ОписаниеТипаВидаДоступа Из ТипыЗначенийДоступаВидовДоступа.НайтиСтроки(Новый Структура("ВидДоступа", ТекущийВидДоступа)) Цикл + ТекущиеТипыЗначенийДоступа.Добавить(ОписаниеТипаВидаДоступа.ТипЗначенияДоступа, ОписаниеТипаВидаДоступа.ПредставлениеТипа); + КонецЦикла; + Если ТекущиеТипыЗначенийДоступа.Количество() = 0 Тогда + ТекущиеТипыЗначенийДоступа.Добавить(Неопределено, НСтр("ru = 'Неопределено'")); + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Функция ВыбранТипЗначенияДоступа(Знач ТипыЗначенияДоступа) + + Если ТекущийТипЗначенияДоступа <> Неопределено Тогда + + Возврат Истина; + + ИначеЕсли ТипыЗначенияДоступа.Количество() = 1 Тогда + + ТекущийТипЗначенияДоступа = ТипыЗначенияДоступа[0].Значение; + Возврат Истина; + + ИначеЕсли ТипыЗначенияДоступа.Количество() > 0 Тогда + + Если ТипыЗначенияДоступа.Количество() = 2 Тогда + + Если ТипыЗначенияДоступа.НайтиПоЗначению(ПользовательПустаяСсылка) <> Неопределено + И ТипыЗначенияДоступа.НайтиПоЗначению(ГруппаПользователейПустаяСсылка) <> Неопределено Тогда + + ТекущийТипЗначенияДоступа = ПользовательПустаяСсылка; + Возврат Истина; + КонецЕсли; + + Если ТипыЗначенияДоступа.НайтиПоЗначению(ВнешнийПользовательПустаяСсылка) <> Неопределено + И ТипыЗначенияДоступа.НайтиПоЗначению(ГруппаВнешнихПользователейПустаяСсылка) <> Неопределено Тогда + + ТекущийТипЗначенияДоступа = ВнешнийПользовательПустаяСсылка; + Возврат Истина; + КонецЕсли; + КонецЕсли; + + Элемент = ТипыЗначенияДоступа.ВыбратьЭлемент(НСтр("ru = 'Выбор типа данных'"), ТипыЗначенияДоступа[0]); + Если Элемент <> Неопределено Тогда + ТекущийТипЗначенияДоступа = Элемент.Значение; + Возврат Истина; + КонецЕсли; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +&НаСервере +Процедура ЗаполнитьСвойстваВидовДоступаВФорме() + + Для каждого Строка Из Объект.ВидыДоступа Цикл + // Установка наличия заданных значений по видам доступа. + Строка.ЗначенияЗаданы = Объект.ЗначенияДоступа.НайтиСтроки(Новый Структура("ВидДоступа", Строка.ВидДоступа)).Количество() <> 0; + Если Строка.Предустановленный Тогда + Строка.Использование = "Предустановленный"; + Иначе + Строка.Использование = ?(Строка.ДоступРазрешен, "Вначале все разрешены", "Вначале все запрещены"); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + + +&НаКлиенте +Функция ТекстВопросаОбновитьГруппыДоступаПрофиля() + + Возврат НСтр("ru = 'Обновить группы доступа, использующие этот профиль? + | + |1. Удалить лишние виды доступа и заданные для них значения доступа. + | + |2. Добавить недостающие виды доступа.'"); +КонецФункции + +//** Для работы интерфейса ролей + +&НаСервере +Процедура УстановитьФлажкиНаСервере() + + Для каждого СтрокаТаблицы Из ТаблицаРолей Цикл + + СтрокаТаблицы.Пометка = Истина; + + НайденныеРоли = Объект.Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)); + Если НайденныеРоли.Количество() = 0 Тогда + Строка = Объект.Роли.Добавить(); + Строка.Роль = СтрокаТаблицы.Имя; + Строка.СинонимРоли = СтрокаТаблицы.Синоним; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура СнятьФлажкиНаСервере() + + Для каждого СтрокаТаблицы Из ТаблицаРолей Цикл + + СтрокаТаблицы.Пометка = Ложь; + + НайденныеРоли = Объект.Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)); + Если НайденныеРоли.Количество() > 0 Тогда + Объект.Роли.Удалить(НайденныеРоли[0]); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьВыбранныеРоли(ВыбранныеРоли) + + Для каждого Значение Из ВыбранныеРоли Цикл + + ЭлементСписка = СписокВыбораРолей.НайтиПоЗначению(Значение); + Если ЭлементСписка <> Неопределено Тогда + + Если Объект.Роли.НайтиСтроки(Новый Структура("Роль", Значение)).Количество() = 0 Тогда + + Строка = Объект.Роли.Добавить(); + Строка.Роль = ЭлементСписка.Значение; + Строка.СинонимРоли = ЭлементСписка.Представление; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + ПометитьРолиПоСписку(); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСинонимыТабличнойЧастиРоли() + + ВсеРоли = ПользователиСерверПовтИсп.ВсеРоли(); + + Для каждого Строка Из Объект.Роли Цикл + + НайденнаяСтрока = ВсеРоли.Найти(Строка.Роль, "Имя"); + Строка.СинонимРоли = ?(НайденнаяСтрока = Неопределено, "? " + Строка.Роль, НайденнаяСтрока.Синоним); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ПодготовитьСписокВыбораИТаблицуРолей() + + ВсеРоли = ПользователиСерверПовтИсп.ВсеРоли(); + ВсеРоли.Сортировать("Синоним"); + + Для каждого Строка Из ВсеРоли Цикл + // Заполнение списка выбора + СписокВыбораРолей.Добавить(Строка.Имя, Строка.Синоним); + // Заполнение таблицы ролей + СтрокаТаблицы = ТаблицаРолей.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Строка); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьТолькоПросмотрРолей(Знач ТолькоПросмотрРолей) + + Элементы.Роли.ТолькоПросмотр = ТолькоПросмотрРолей; + Элементы.ТаблицаРолей.ТолькоПросмотр = ТолькоПросмотрРолей; + + Элементы.РолиПодобрать.Доступность = НЕ ТолькоПросмотрРолей; + Элементы.КонтекстноеМенюРолиПодобрать.Доступность = НЕ ТолькоПросмотрРолей; + Элементы.ТаблицаРолейУстановитьФлажки.Доступность = НЕ ТолькоПросмотрРолей; + Элементы.ТаблицаРолейСнятьФлажки.Доступность = НЕ ТолькоПросмотрРолей; + +КонецПроцедуры + +&НаСервере +Процедура ПометитьРолиПоСписку() + + Для каждого СтрокаТаблицы Из ТаблицаРолей Цикл + + СтрокаТаблицы.Пометка = Объект.Роли.НайтиСтроки(Новый Структура("Роль", СтрокаТаблицы.Имя)).Количество() > 0; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Функция СформироватьДанныеВыбораРолей(Текст) + + Список = СписокВыбораРолей.Скопировать(); + + НомерЭлемента = Список.Количество()-1; + Пока НомерЭлемента >= 0 Цикл + Если ВРег(Лев(Список[НомерЭлемента].Представление, СтрДлина(Текст))) <> ВРег(Текст) Тогда + Список.Удалить(НомерЭлемента); + КонецЕсли; + НомерЭлемента = НомерЭлемента - 1; + КонецЦикла; + + Возврат Список; + +КонецФункции + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияСпискаРолей(Отказ) + + // Проверка незаполненных и повторяющихся ролей. + НомерСтроки = Объект.Роли.Количество()-1; + Пока НЕ Отказ И НомерСтроки >= 0 Цикл + + ТекущаяСтрока = Объект.Роли.Получить(НомерСтроки); + + // Проверка заполнения значения. + Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.СинонимРоли) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Роль не заполнена!'"), + , + "Объект.Роли[" + Формат(НомерСтроки, "ЧГ=0") + "].СинонимРоли", + , + Отказ); + Возврат; + КонецЕсли; + + // Проверка наличия повторяющихся значений. + НайденныеЗначения = Объект.Роли.НайтиСтроки(Новый Структура("Роль", ТекущаяСтрока.Роль)); + Если НайденныеЗначения.Количество() > 1 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Роль повторяется!'"), + , + "Объект.Роли[" + Формат(НомерСтроки, "ЧГ=0") + "].СинонимРоли", + , + Отказ); + Возврат; + КонецЕсли; + + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + +КонецПроцедуры + + + + + + + + + + + + diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Help/ru.html b/SSL/src/Catalogs/ПрофилиГруппДоступа/Help/ru.html new file mode 100644 index 000000000..42ce6a5ec --- /dev/null +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Help/ru.html @@ -0,0 +1,9 @@ + +

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

+

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

+

Профили используются при создании групп доступа.

+

Подход к проектированию профилей описан в документации.

+

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

+

 

+

Особенности справочника "Профили групп доступа".

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

2. Роль ПолныеПрава не нужно добавлять в профили, т.к. она "отключает" все ограничения и профиль содержащий такую роль "вырождается" в профиль Администратор.

+

 

\ 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..e69de29bb diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl new file mode 100644 index 000000000..6c113200c --- /dev/null +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl @@ -0,0 +1,125 @@ + +// Обработчик ПередЗаписью обновляет табличную часть ТаблицыРолей в соответствии с составом ролей. +// Перед обновлением, обработчик проверяет наличие ролей в конфигурации и +// исключает из списка роль "Полные права". +// +Процедура ПередЗаписью(Отказ) + + // Заполнение множества возможных пустых ссылок, используемых как типы ссылок. + Если Ссылка = Справочники.ПрофилиГруппДоступа.Администратор Тогда + ТипыСсылок.Загрузить(УправлениеДоступомСерверПовтИсп.ТипыСсылок()); + ИначеЕсли ТипыСсылок.Количество() <> 0 Тогда + ТипыСсылок.Очистить(); + КонецЕсли; + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если НЕ ЭтоГруппа Тогда + + Если Ссылка = Справочники.ПрофилиГруппДоступа.Администратор Тогда + ТаблицыРолей.Очистить(); + Иначе + УправлениеДоступом.ЗаполнитьТаблицыРолейПрофиляГруппДоступа(ЭтотОбъект); + КонецЕсли; + + // Проверка наличия ролей в конфигурации. + НомерСтроки = Роли.Количество() - 1; + Пока НомерСтроки >= 0 Цикл + Если Метаданные.Роли.Найти(Роли[НомерСтроки].Роль) = Неопределено Тогда + ЗаписьЖурналаРегистрации(НСтр("ru = 'Управление доступом.Роль не найдена в метаданных'"), + УровеньЖурналаРегистрации.Ошибка, , , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru= 'При записи профиля групп доступа <%1> роль <%2> не найдена в метаданных!'"), + Ссылка, + Роли[НомерСтроки].Роль), + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + Если НЕ ДополнительныеСвойства.Свойство("ЕстьОшибки") Тогда + ДополнительныеСвойства.Вставить("ЕстьОшибки"); + КонецЕсли; + ИначеЕсли ВРег(Роли[НомерСтроки].Роль) = ВРег("ПолныеПрава") И + Ссылка <> Справочники.ПрофилиГруппДоступа.Администратор Тогда + Роли.Удалить(НомерСтроки); + КонецЕсли; + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + + // Удаление всегда используемых видов доступа. + ВидыДоступаИспользуемыеВсегда = УправлениеДоступом.СвойстваВидаДоступа().НайтиСтроки(Новый Структура("ВидДоступаИспользуетсяВсегда", Истина)); + Для каждого СвойстваВидаДоступа Из ВидыДоступаИспользуемыеВсегда Цикл + Для каждого Строка ИЗ ВидыДоступа.НайтиСтроки(Новый Структура("ВидДоступа", СвойстваВидаДоступа.ВидДоступа)) Цикл + ВидыДоступа.Удалить(Строка); + КонецЦикла; + КонецЦикла; + + Если НЕ ДополнительныеСвойства.Свойство("НеОбновлятьРеквизитПоставляемыйПрофильИзменен") Тогда + Если Ссылка = Справочники.ПрофилиГруппДоступа.Администратор Тогда + ПоставляемыйПрофильИзменен = Ложь; + Иначе + ПоставляемыйПрофильИзменен = УправлениеДоступом.ПоставляемыйПрофильИзменен(ЭтотОбъект); + КонецЕсли; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Обработчик ПриЗаписи обновляет +// - РегистрСведений.ТаблицыГруппДоступа; +// - роли пользователей групп доступа с текущим профилем. +// +Процедура ПриЗаписи(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если НЕ ЭтоГруппа Тогда + + Если ДополнительныеСвойства.Свойство("ОбновитьГруппыДоступаПрофиля") Тогда + УправлениеДоступом.ОбновитьГруппыДоступаПрофиля(Ссылка, Ложь); + КонецЕсли; + + // Обновление таблиц и значений групп доступа. + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ГруппыДоступа.Ссылка + |ИЗ + | Справочник.ГруппыДоступа КАК ГруппыДоступа + |ГДЕ + | ГруппыДоступа.Профиль = &Профиль + | И (НЕ ГруппыДоступа.ЭтоГруппа)"); + Запрос.УстановитьПараметр("Профиль", Ссылка); + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + УправлениеДоступом.ОбновитьТаблицыГруппДоступа(Выборка.Ссылка); + УправлениеДоступом.ЗаписатьЗначенияГруппДоступа(Выборка.Ссылка); + КонецЦикла; + + Если НЕ ДополнительныеСвойства.Свойство("НеОбновлятьРолиПользователей") Тогда + // Обновление ролей пользователей. + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПользователиИГруппыПользователей.ЗначениеДоступа КАК Пользователь + |ИЗ + | РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ПО (ПользователиИГруппыПользователей.ВидДоступа В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи))) + | И (ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ) + | И ПользователиИГруппыПользователей.ГруппаДоступа = ГруппыДоступаПользователи.Пользователь + | И (ГруппыДоступаПользователи.Ссылка.Профиль = &Профиль) + | И (ТИПЗНАЧЕНИЯ(ПользователиИГруппыПользователей.ЗначениеДоступа) = ТИП(Справочник.Пользователи) + | ИЛИ ТИПЗНАЧЕНИЯ(ПользователиИГруппыПользователей.ЗначениеДоступа) = ТИП(Справочник.ВнешниеПользователи))"); + Запрос.УстановитьПараметр("Профиль", Ссылка); + ПользователиПрофиля = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Пользователь"); + + ЕстьОшибки = Ложь; + УправлениеДоступом.ОбновитьРолиПользователей(ПользователиПрофиля, ЕстьОшибки); + Если ЕстьОшибки И НЕ ДополнительныеСвойства.Свойство("ЕстьОшибки") Тогда + ДополнительныеСвойства.Вставить("ЕстьОшибки"); + КонецЕсли; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo b/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo new file mode 100644 index 000000000..1bb461660 --- /dev/null +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo @@ -0,0 +1,516 @@ + + + + + + + + + + ПрофилиГруппДоступа + + ru + Профили групп доступа + + true + Catalog.ПрофилиГруппДоступа.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + + + ru + + + Managed + Use + + ru + Профиль групп доступа + + true + 2 + true + 150 + String + AsDescription + + + Администратор + Администратор + + + + + + InDialog + BothWays + Catalog.ПрофилиГруппДоступа.Form.ФормаЭлемента + Catalog.ПрофилиГруппДоступа.Form.ФормаСписка + Catalog.ПрофилиГруппДоступа.Form.ФормаВыбора + + Комментарий + + ru + Комментарий + + + String + + + + + + Use + Use + + + ПоставляемыйПрофильИзменен + + ru + Поставляемый профиль изменен + + + Boolean + + + + + Use + Use + + + + + + + Роли + + ru + Разрешенные действия (роли) + + + Use + LineNumber + + Use + + + + + Роль + + ru + Разрешенное действие (роль) + + + String + + 150 + + + + + ShowError + Use + Index + Use + + + + + + + + ВидыДоступа + + ru + Виды доступа + + + Use + LineNumber + + Use + + + + + ВидДоступа + + ru + Вид доступа + + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + ru + Возможный "разрез" +ограничения прав доступа +в заданном списке ролей + + + + ShowError + Use + Index + Use + + + Предустановленный + + ru + Предустановленный + + + Boolean + + + ru + Доступ по предустановленному +виду запрещен, +разрешенные значения +задаются в профиле, +а не в группах доступа + + + + Use + Use + + + ДоступРазрешен + + ru + Доступ разрешен + + + Boolean + + + ru + Начальная разрешенность или запрещенность всех значений доступа для вида доступа + + + + Use + Use + + + + + + + + ЗначенияДоступа + + ru + Значения доступа + + + Use + LineNumber + + Use + + + + + ВидДоступа + + ru + Вид доступа + + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + + Use + Index + Use + + + ЗначениеДоступа + + ru + Значение доступа + + + Characteristic.ВидыДоступа + + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ЗначенияДоступа.Attribute.ВидДоступа + + Use + Index + Use + + + + + + + + ТаблицыРолей + + ru + Таблицы ролей + + + Use + LineNumber + + Use + + + + + Роль + + ru + Роль + + + String + + 150 + + + + + Use + Index + + + Таблица + + ru + Таблица + + + String + + 150 + + + + + Use + Index + + + Добавление + + ru + Добавление + + + Boolean + + + + Use + + + Изменение + + ru + Изменение + + + Boolean + + + + Use + + + Удаление + + ru + Удаление + + + Boolean + + + + Use + + + ТипТаблицы + + ru + Тип таблицы + + + AnyRef + + + + Use + Index + + + + + + + + ТипыСсылок + + ru + Типы ссылок + + + Use + LineNumber + + Use + + + + + ТипТаблицы + + ru + Тип таблицы + + + AnyRef + + + + Use + Index + + + Таблица + + ru + Таблица + + + String + + 150 + + + + + Use + Index + + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + + + 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 new file mode 100644 index 000000000..f279d2a07 --- /dev/null +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,31 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + + + + + ЕстьИсполнители + Equal + false + + + + + ЦветТекста + style:РольБезИсполнителей + + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Form.form new file mode 100644 index 000000000..31db149a5 --- /dev/null +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Form.form @@ -0,0 +1,326 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + None + + Наименование + 4 + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Код + 6 + true + true + + true + + + Список.Code + + + КодРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Комментарий + 8 + true + true + + true + + + Список.Комментарий + + + КомментарийРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 9 + true + + LabelField + Enter + true + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 11 + + СписокСтрокаПоискаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 12 + true + + Список + + true + + + + СписокСостояниеПросмотра + 14 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 15 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 17 + + СписокУправлениеПоискомРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 18 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + true + MultiRow +
true
+ 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 + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + ВЫБРАТЬ + СправочникРолиИсполнителей.Ссылка, + СправочникРолиИсполнителей.ПометкаУдаления, + СправочникРолиИсполнителей.Предопределенный, + СправочникРолиИсполнителей.Код, + СправочникРолиИсполнителей.Наименование, + СправочникРолиИсполнителей.ИспользуетсяБезОбъектовАдресации, + СправочникРолиИсполнителей.ИспользуетсяСОбъектамиАдресации, + СправочникРолиИсполнителей.ТипыОсновногоОбъектаАдресации, + СправочникРолиИсполнителей.ТипыДополнительногоОбъектаАдресации, + СправочникРолиИсполнителей.Комментарий, + ВЫБОР + КОГДА СправочникРолиИсполнителей.ИспользуетсяСОбъектамиАдресации + ТОГДА ИСТИНА + КОГДА СправочникРолиИсполнителей.Ссылка В + (ВЫБРАТЬ ПЕРВЫЕ 1 + РегистрСведений.ИсполнителиЗадач.РольИсполнителя.Ссылка + ИЗ + РегистрСведений.ИсполнителиЗадач + ГДЕ + РегистрСведений.ИсполнителиЗадач.РольИсполнителя = СправочникРолиИсполнителей.Ссылка) + ТОГДА ИСТИНА + ИНАЧЕ ЛОЖЬ + КОНЕЦ КАК ЕстьИсполнители +ИЗ + Справочник.РолиИсполнителей КАК СправочникРолиИсполнителей + Catalog.РолиИсполнителей + true + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..f279d2a07 --- /dev/null +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,31 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + + + + + ЕстьИсполнители + Equal + false + + + + + ЦветТекста + style:РольБезИсполнителей + + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..25dcafe7c --- /dev/null +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Form.form @@ -0,0 +1,326 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 4 + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Код + 6 + true + true + + true + + + Список.Code + + + КодРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Комментарий + 8 + true + true + + true + + + Список.Комментарий + + + КомментарийРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 9 + true + + LabelField + Enter + true + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 11 + + СписокСтрокаПоискаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 12 + true + + Список + + true + + + + СписокСостояниеПросмотра + 14 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 15 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 17 + + СписокУправлениеПоискомРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 18 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + 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 + +
+ + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + ВЫБРАТЬ + СправочникРолиИсполнителей.Ссылка, + СправочникРолиИсполнителей.ПометкаУдаления, + СправочникРолиИсполнителей.Предопределенный, + СправочникРолиИсполнителей.Код, + СправочникРолиИсполнителей.Наименование, + СправочникРолиИсполнителей.ИспользуетсяБезОбъектовАдресации, + СправочникРолиИсполнителей.ИспользуетсяСОбъектамиАдресации, + СправочникРолиИсполнителей.ТипыОсновногоОбъектаАдресации, + СправочникРолиИсполнителей.ТипыДополнительногоОбъектаАдресации, + СправочникРолиИсполнителей.Комментарий, + ВЫБОР + КОГДА СправочникРолиИсполнителей.ИспользуетсяСОбъектамиАдресации + ТОГДА ИСТИНА + КОГДА СправочникРолиИсполнителей.Ссылка В + (ВЫБРАТЬ ПЕРВЫЕ 1 + РегистрСведений.ИсполнителиЗадач.РольИсполнителя.Ссылка + ИЗ + РегистрСведений.ИсполнителиЗадач + ГДЕ + РегистрСведений.ИсполнителиЗадач.РольИсполнителя = СправочникРолиИсполнителей.Ссылка) + ТОГДА ИСТИНА + ИНАЧЕ ЛОЖЬ + КОНЕЦ КАК ЕстьИсполнители +ИЗ + Справочник.РолиИсполнителей КАК СправочникРолиИсполнителей + Catalog.РолиИсполнителей + true + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..1a94785a7 --- /dev/null +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,446 @@ + + + + ГруппаШапка + 24 + + Наименование + 3 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Код + 1 + true + true + + true + + + Объект.Code + + + КодРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + 8 + true + true + true + true + true + Normal + + + true + true + + true + + + ГруппаШапкаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаАдресации + 23 + + ИспользуетсяБезКонтекстаДругихИзмеренийАдресации + 5 + true + true + + true + + + Объект.ИспользуетсяБезОбъектовАдресации + + Right + + ru + Роль может назначаться исполнителям без указания других объектов адресации (основного или дополнительного). + + + ИспользуетсяБезКонтекстаДругихИзмеренийАдресацииРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ИспользуетсяБезКонтекстаДругихИзмеренийАдресацииКонтекстноеМеню + 6 + true + + CheckBoxField + Enter + true + Left + true + + + + ИспользуетсяВКонтекстеДругихИзмеренийАдресации + 7 + true + true + + true + + + Объект.ИспользуетсяСОбъектамиАдресации + + Right + + ru + Роль может назначаться исполнителям с указанием определенных объектов адресации. + + + OnChange + ИспользуетсяВКонтекстеДругихИзмеренийАдресацииПриИзменении + + + ИспользуетсяВКонтекстеДругихИзмеренийАдресацииРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ИспользуетсяВКонтекстеДругихИзмеренийАдресацииКонтекстноеМеню + 8 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаТипыОбъектовАдресации + 22 + + ТипыОсновногоОбъектаАдресации + 18 + true + true + + true + + + Объект.ТипыОсновногоОбъектаАдресации + + + ТипыОсновногоОбъектаАдресацииРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + ТипыОсновногоОбъектаАдресацииКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТипыДополнительногоОбъектаАдресации + 20 + true + true + + true + + + Объект.ТипыДополнительногоОбъектаАдресации + + + ТипыДополнительногоОбъектаАдресацииРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ТипыДополнительногоОбъектаАдресацииКонтекстноеМеню + 21 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + ГруппаТипыОбъектовАдресацииРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Адресация роли</value> + + + ГруппаАдресацииРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаКомментарий + 27 + + Комментарий + 25 + true + true + + true + + + Объект.Комментарий + + + КомментарийРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 26 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + ГруппаКомментарийРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.РолиИсполнителей + + + true + + + true + +
true
+ true +
+ + + + + +
diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..f1324cb48 --- /dev/null +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,20 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Элементы.ГруппаАдресации.Доступность = НЕ Объект.Предопределенный; + Если НЕ Объект.Предопределенный Тогда + Элементы.ГруппаТипыОбъектовАдресации.Доступность = Объект.ИспользуетсяСОбъектамиАдресации; + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ИспользуетсяВКонтекстеДругихИзмеренийАдресацииПриИзменении(Элемент) + Элементы.ГруппаТипыОбъектовАдресации.Доступность = Объект.ИспользуетсяСОбъектамиАдресации; +КонецПроцедуры + diff --git a/SSL/src/Catalogs/РолиИсполнителей/Help/ru.html b/SSL/src/Catalogs/РолиИсполнителей/Help/ru.html new file mode 100644 index 000000000..7f148cfe5 --- /dev/null +++ b/SSL/src/Catalogs/РолиИсполнителей/Help/ru.html @@ -0,0 +1,26 @@ + +

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

+

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

+

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

+

+ + + + + + + + + + + + + + + + +
Роль исполнителяОсновной объект адресации
(тип, значение)
Дополнительный объект адресации
(тип, значение)
ПользовательПояснение
Координатор выполнения задач--Федоров К.Федоров К. получает уведомления по всем просроченным и зависшим задачам, кроме тех, которые поступают Иванову И. и Петрову А.
Координатор выполнения задачСтруктурное подразделение,
Отдел бухгалтерии
-Иванов И.Федоров К. получает уведомления по всем просроченным и зависшим задачам по структурному поздразделению "Отдел бухгалтерии", кроме тех, которые поступают Петрову А.*
Координатор выполнения задачСтруктурное подразделение,
Отдел бухгалтерии
Проект,
Проект по внедрению системы бухучета
Петров А.Петров А. получает уведомления по всем просроченным и зависшим задачам по структурному поздразделению "Отдел бухгалтерии" и проекту "Проект по внедрению системы бухучета".*

* если исключить Иванова И. и Петрова А. из роли "Координатор выполнения задач", то Федоров К. будет получать уведомления также и по их объектам адресации.

+

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

+

См. также: 

+ \ No newline at end of file diff --git a/SSL/src/Catalogs/РолиИсполнителей/ObjectModule.bsl b/SSL/src/Catalogs/РолиИсполнителей/ObjectModule.bsl new file mode 100644 index 000000000..de565b1ec --- /dev/null +++ b/SSL/src/Catalogs/РолиИсполнителей/ObjectModule.bsl @@ -0,0 +1,39 @@ + + +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + + Если НЕ ИспользуетсяСОбъектамиАдресации И НЕ ИспользуетсяБезОбъектовАдресации Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='Нужно указать допустимые способы назначения исполнителей на роль: совместно с объектами адресации, без них или обоими способами.'"), + ЭтотОбъект, "ИспользуетсяБезОбъектовАдресации",,Отказ); + Возврат; + КонецЕсли; + + Если НЕ ИспользуетсяСОбъектамиАдресации Тогда + Возврат; + КонецЕсли; + + ЗаданыТипыОсновногоОбъектаАдресации = ТипыОсновногоОбъектаАдресации <> Неопределено И НЕ ТипыОсновногоОбъектаАдресации.Пустая(); + Если НЕ ЗаданыТипыОсновногоОбъектаАдресации Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='Не указаны типы основного объекта адресации.'"), + ЭтотОбъект, "ТипыОсновногоОбъектаАдресации",,Отказ); + КонецЕсли; + +КонецПроцедуры + + +Процедура ПриЗаписи(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если ТипыОсновногоОбъектаАдресации <> Неопределено И ТипыОсновногоОбъектаАдресации.Пустая() Тогда + ТипыОсновногоОбъектаАдресации = Неопределено; + КонецЕсли; + + Если ТипыДополнительногоОбъектаАдресации <> Неопределено И ТипыДополнительногоОбъектаАдресации.Пустая() Тогда + ТипыДополнительногоОбъектаАдресации = Неопределено; + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/РолиИсполнителей/РолиИсполнителей.mdo b/SSL/src/Catalogs/РолиИсполнителей/РолиИсполнителей.mdo new file mode 100644 index 000000000..28e7f071e --- /dev/null +++ b/SSL/src/Catalogs/РолиИсполнителей/РолиИсполнителей.mdo @@ -0,0 +1,249 @@ + + + + + + + + + + РолиИсполнителей + + ru + Роли исполнителей + + true + Catalog.РолиИсполнителей.StandardAttribute.Description + Catalog.РолиИсполнителей.StandardAttribute.Code + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + + + Use + + + + Use + true + + + ru + + + Managed + Use + + ru + Роль исполнителя + + 2 + true + 9 + 150 + String + Variable + AsDescription + + + ОтветственныйЗаКонтрольИсполнения + Координатор выполнения задач + + 000000001 + + + + InDialog + BothWays + Catalog.РолиИсполнителей.Form.ФормаЭлемента + Catalog.РолиИсполнителей.Form.ФормаСписка + Catalog.РолиИсполнителей.Form.ФормаВыбора + + ИспользуетсяБезОбъектовАдресации + + ru + Используется без объектов адресации + + Роль может назначаться исполнителям без указания других объектов адресации (основного или дополнительного) + + Boolean + + + + true + + true + + Use + Use + + + ИспользуетсяСОбъектамиАдресации + + ru + Используется с объектами адресации + + Роль может назначаться исполнителям с указанием определенных объектов адресации + + Boolean + + + + true + + Use + Use + + + ТипыОсновногоОбъектаАдресации + + ru + Типы основного объекта адресации + + + ChartOfCharacteristicTypesRef.ОбъектыАдресацииЗадач + + + + true + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.ВсеОбъектыАдресации + + Index + Use + Use + + + ТипыДополнительногоОбъектаАдресации + + ru + Типы дополнительного объекта адресации + + + ChartOfCharacteristicTypesRef.ОбъектыАдресацииЗадач + + + + true + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.ВсеОбъектыАдресации + + Index + Use + Use + + + Комментарий + + ru + Комментарий + + + String + + + true + + + + Use + Use + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаВыбора + + ru + Форма выбора + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..dbee6028e --- /dev/null +++ b/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,275 @@ + + + + Группа + 11 + + Код + 1 + true + true + + true + + + Объект.Code + + + КодРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + КодАльфа2 + 7 + true + true + + true + + + Объект.КодАльфа2 + + + КодАльфа2РасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + КодАльфа2КонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + 2 + true + true + false + true + true + true + Normal + + + + КодАльфа3 + 9 + true + true + + true + + + Объект.КодАльфа3 + + + КодАльфа3РасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + КодАльфа3КонтекстноеМеню + 10 + true + + InputField + Enter + true + Left + true + + 3 + true + true + false + true + true + true + Normal + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Наименование + 3 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + НаименованиеПолное + 5 + + <key>ru</key> + <value>Полное</value> + + true + true + + true + + + Объект.НаименованиеПолное + + + НаименованиеПолноеРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + НаименованиеПолноеКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.СтраныМира + + + true + + + true + +
true
+ true +
+ + + + + +
diff --git a/SSL/src/Catalogs/СтраныМира/Templates/Классификатор/Template.txt b/SSL/src/Catalogs/СтраныМира/Templates/Классификатор/Template.txt new file mode 100644 index 000000000..96c417ac8 --- /dev/null +++ b/SSL/src/Catalogs/СтраныМира/Templates/Классификатор/Template.txt @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SSL/src/Catalogs/СтраныМира/СтраныМира.mdo b/SSL/src/Catalogs/СтраныМира/СтраныМира.mdo new file mode 100644 index 000000000..28a129cb5 --- /dev/null +++ b/SSL/src/Catalogs/СтраныМира/СтраныМира.mdo @@ -0,0 +1,217 @@ + + + + + + + + + + СтраныМира + + ru + Страны мира + + true + Catalog.СтраныМира.StandardAttribute.Description + Catalog.СтраныМира.StandardAttribute.Code + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + + ShowError + Use + + + + + Use + Parent + + Use + + + + + Use + Description + + ru + Наименование + + Наименование + + ru + Краткое наименование страны мира + + + ShowError + Use + + + + + Use + Code + + ru + Код + + Код + + ru + Числовой код страны по ОКСМ + + + Use + + + + Use + Managed + Use + 1 + true + 3 + 60 + String + Variable + true + AsDescription + + + Россия + РОССИЯ + + 643 + + + + BothWays + BothWays + Catalog.СтраныМира.Form.ФормаЭлемента + + НаименованиеПолное + + ru + Наименование полное + + + String + + 100 + + + + ru + Полное наименование страны мира + + + + + Use + Use + + + КодАльфа2 + + ru + Код альфа-2 + + + String + + 2 + + + + ru + Двузначный буквенный код альфа-2 страны по ОКСМ + + + + + Use + Use + + + КодАльфа3 + + ru + Код альфа-3 + + + String + + 3 + + + + ru + Трехзначный буквенный код альфа-3 страны по ОКСМ + + + + + Use + Use + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + + Классификатор + + ru + Классификатор + + TextDocument + + diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..09fd93e5f --- /dev/null +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,55 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + Наименование + Asc + + + ФлагИспользования + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + + + + + ИспользоватьРегламентноеЗадание + Equal + true + + + + + Шрифт + + + + + + + + + ФлагИспользования + Equal + true + + + + + ЦветФона + web:Azure + + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Form.form b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Form.form new file mode 100644 index 000000000..7e3befa28 --- /dev/null +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Form.form @@ -0,0 +1,939 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + None + + ФлагИспользованияЗагрузки + 23 + + <key>ru</key> + <value>Загрузка</value> + + true + true + + true + + + Список.ФлагИспользованияЗагрузки + + + ФлагИспользованияЗагрузкиРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + ФлагИспользованияЗагрузкиКонтекстноеМеню + 24 + true + + CheckBoxField + Enter + true + Left + true + + + + ФлагИспользованияВыгрузки + 21 + + <key>ru</key> + <value>Выгрузка</value> + + true + true + + true + + + Список.ФлагИспользованияВыгрузки + + + ФлагИспользованияВыгрузкиРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + ФлагИспользованияВыгрузкиКонтекстноеМеню + 22 + true + + CheckBoxField + Enter + true + Left + true + + + + Наименование + 4 + + <key>ru</key> + <value>Сценарий обмена данными</value> + + true + true + + true + + + Список.Description + + + НаименованиеРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + Selection + СписокВыбор + + + СписокСтрокаПоиска + 48 + + СписокСтрокаПоискаРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 49 + true + + Список + + true + + + + СписокСостояниеПросмотра + 51 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 52 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 54 + + СписокУправлениеПоискомРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 55 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + + ГруппаКнопокВключенияЗагрузкиВыгрузкиДанных + 25 + + СписокКонтекстноеМенюВключитьОтключитьЗагрузку + 27 + true + true + + true + + + СписокКонтекстноеМенюВключитьОтключитьЗагрузкуРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + Form.Command.ВключитьОтключитьЗагрузку + Normal + Auto + true + true + UserCmds + Auto + + + ФормаВключитьОтключитьВыгрузку + 26 + true + true + + true + + + ФормаВключитьОтключитьВыгрузкуРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + Form.Command.ВключитьОтключитьВыгрузку + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа кнопок включения загрузки выгрузки данных</value> + + + ru + Группа кнопок включения загрузки выгрузки данных + + + ГруппаКнопокВключенияЗагрузкиВыгрузкиДанныхРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + + + СписокКонтекстноеМенюГруппаКнопок + 18 + + СписокКонтекстноеМенюВключитьОтключитьРегламентноеЗадание + 16 + true + true + + true + + + СписокКонтекстноеМенюВключитьОтключитьРегламентноеЗаданиеРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + Form.Command.ВключитьОтключитьРегламентноеЗадание + Normal + Auto + true + true + UserCmds + Auto + + + СписокКонтекстноеМенюОткрытьСценарийОбменаДанными + 19 + true + true + + true + + + СписокКонтекстноеМенюОткрытьСценарийОбменаДаннымиРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Список контекстное меню группа кнопок</value> + + + ru + Список контекстное меню группа кнопок + + + СписокКонтекстноеМенюГруппаКнопокРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + + true + + true + true + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + false + 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 + + ВключитьОтключитьВыгрузкуЗагрузку + 28 + + ФормаВключитьОтключитьЗагрузкуВыгрузку + 31 + + <key>ru</key> + <value>Загрузка и выгрузка</value> + + true + true + + true + + + ФормаВключитьОтключитьЗагрузкуВыгрузкуРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.Command.ВключитьОтключитьЗагрузкуВыгрузку + Normal + Auto + true + true + UserCmds + Auto + + + ФормаВключитьОтключитьЗагрузку + 29 + + <key>ru</key> + <value>Загрузка</value> + + true + true + + true + + + ФормаВключитьОтключитьЗагрузкуРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.Command.ВключитьОтключитьЗагрузку + Normal + Auto + true + true + UserCmds + Auto + + + ФормаВключитьОтключитьВыгрузку1 + 30 + + <key>ru</key> + <value>Выгрузка</value> + + true + true + + true + + + ФормаВключитьОтключитьВыгрузку1РасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.Command.ВключитьОтключитьВыгрузку + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Включить/Отключить</value> + + + ru + Включить или отключить загрузку и выгрузку данных + + + ВключитьОтключитьВыгрузкуЗагрузкуРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + Создать + 13 + true + true + + true + + + СоздатьРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.Command.СоздатьСценарийОбменаДанными + Normal + Auto + true + true + UserCmds + Auto + + + ИзменитьСценарийОбменаДанными + 14 + true + true + + true + + + ИзменитьСценарийОбменаДаннымиРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.Command.ИзменитьСценарийОбменаДанными + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаКнопок + 17 + + ФормаВключитьОтключитьРегламентноеЗадание + 15 + true + true + + true + + + ФормаВключитьОтключитьРегламентноеЗаданиеРасширеннаяПодсказка + 39 + 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 + + + + + + ФормаЗакрыть + 20 + true + true + + true + + + ФормаЗакрытьРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + PictureAndText + true + true + UserCmds + Auto + + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + CancelSearch + Find + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.ФлагНестандартногоИспользования + + + Список.Ref + + + Список.ИспользоватьРегламентноеЗадание + + + Список.ФлагИспользования + + + Список.ФлагИспользованияВыгрузки + + + Список.ФлагИспользованияЗагрузки + +
true
+ + ВЫБРАТЬ + СценарииОбменовДанными.Ссылка, + СценарииОбменовДанными.ИспользоватьРегламентноеЗадание, + СценарииОбменовДанными.Наименование, + ЕСТЬNULL(ВложенныйЗапрос.ФлагИспользования, Ложь) КАК ФлагИспользования, + ЕСТЬNULL(ВложенныйЗапрос.ФлагИспользованияЗагрузки, Ложь) КАК ФлагИспользованияЗагрузки, + ЕСТЬNULL(ВложенныйЗапрос.ФлагИспользованияВыгрузки, Ложь) КАК ФлагИспользованияВыгрузки +ИЗ + Справочник.СценарииОбменовДанными КАК СценарииОбменовДанными +ЛЕВОЕ СОЕДИНЕНИЕ + (ВЫБРАТЬ + СценарииОбменовДаннымиНастройкиОбмена.Ссылка, + СценарииОбменовДаннымиНастройкиОбмена.Ссылка.ИспользоватьРегламентноеЗадание, + СценарииОбменовДаннымиНастройкиОбмена.Ссылка.Наименование, + МАКСИМУМ(ВЫБОР КОГДА СценарииОбменовДаннымиНастройкиОбмена.УзелИнформационнойБазы = &УзелИнформационнойБазы + ТОГДА Истина + ИНАЧЕ Ложь + КОНЕЦ) КАК ФлагИспользования, + МАКСИМУМ(ВЫБОР КОГДА СценарииОбменовДаннымиНастройкиОбмена.УзелИнформационнойБазы = &УзелИнформационнойБазы + И СценарииОбменовДаннымиНастройкиОбмена.ВыполняемоеДействие = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ЗагрузкаДанных) + ТОГДА Истина + ИНАЧЕ Ложь + КОНЕЦ) КАК ФлагИспользованияЗагрузки, + МАКСИМУМ(ВЫБОР КОГДА СценарииОбменовДаннымиНастройкиОбмена.УзелИнформационнойБазы = &УзелИнформационнойБазы + И СценарииОбменовДаннымиНастройкиОбмена.ВыполняемоеДействие = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ВыгрузкаДанных) + ТОГДА Истина + ИНАЧЕ Ложь + КОНЕЦ) КАК ФлагИспользованияВыгрузки + ИЗ + Справочник.СценарииОбменовДанными.НастройкиОбмена КАК СценарииОбменовДаннымиНастройкиОбмена + ГДЕ + НЕ СценарииОбменовДаннымиНастройкиОбмена.Ссылка.ПометкаУдаления + СГРУППИРОВАТЬ ПО + СценарииОбменовДаннымиНастройкиОбмена.Ссылка, + СценарииОбменовДаннымиНастройкиОбмена.Ссылка.ИспользоватьРегламентноеЗадание, + СценарииОбменовДаннымиНастройкиОбмена.Ссылка.Наименование + ) КАК ВложенныйЗапрос +ПО ВложенныйЗапрос.Ссылка = СценарииОбменовДанными.Ссылка +ГДЕ + НЕ СценарииОбменовДанными.ПометкаУдаления +УПОРЯДОЧИТЬ ПО + СценарииОбменовДанными.Наименование + + true + true + true + true + +
+ + СоздатьСценарийОбменаДанными + + <key>ru</key> + <value>Добавить</value> + + 1 + + ru + Создать новое расписание выполнения обмена + + + true + + + StdPicture.CreateListItem + + + + Создать + + + TextPicture + Auto + Auto + + + ИзменитьСценарийОбменаДанными + + <key>ru</key> + <value>Изменить</value> + + 2 + + ru + Изменить расписание выполнения обмена + + + true + + + StdPicture.Change + + + + ИзменитьСценарийОбменаДанными + + + Auto + Auto + + + ВключитьОтключитьРегламентноеЗадание + + <key>ru</key> + <value>Включить/отключить расписание</value> + + 3 + + ru + Включить/отключить расписание выполнения обмена данными + + + true + + + StdPicture.ScheduledJob + + + + ВключитьОтключитьРегламентноеЗадание + + + Auto + Auto + + + ВключитьОтключитьВыгрузку + + <key>ru</key> + <value>Включить/отключить выгрузку</value> + + 5 + + ru + Включить/отключить выгрузку данных по выбранному сценарию + + + true + + + + ВключитьОтключитьВыгрузку + + + Auto + Auto + + + ВключитьОтключитьЗагрузку + + <key>ru</key> + <value>Включить/отключить загрузку</value> + + 6 + + ru + Включить/отключить загрузку данных по выбранному сценарию + + + true + + + + ВключитьОтключитьЗагрузку + + + Auto + Auto + + + ВключитьОтключитьЗагрузкуВыгрузку + + <key>ru</key> + <value>Включить отключить загрузку выгрузку</value> + + 4 + + ru + Включить или отключить загрузку и выгрузку данных + + + true + + + + ВключитьОтключитьЗагрузкуВыгрузку + + + Auto + Auto + + + УзелИнформационнойБазы + + ExchangePlanRef + + true + + + + + + +
diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl new file mode 100644 index 000000000..628c84b41 --- /dev/null +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl @@ -0,0 +1,191 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Список.Параметры.Элементы[0].Значение = Параметры.УзелИнформационнойБазы; + Список.Параметры.Элементы[0].Использование = Истина; + + Заголовок = НСтр("ru = 'Настройка сценариев обменов данными для: [УзелИнформационнойБазы]'"); + Заголовок = СтрЗаменить(Заголовок, "[УзелИнформационнойБазы]", Строка(Параметры.УзелИнформационнойБазы)); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ЗаписанСценарийОбменаДанными" Тогда + + Элементы.Список.Обновить(); + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура Создать(Команда) + + ПараметрыФормы = Новый Структура("УзелИнформационнойБазы", Параметры.УзелИнформационнойБазы); + + ОткрытьФормуМодально("Справочник.СценарииОбменовДанными.ФормаОбъекта", ПараметрыФормы, ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьСценарийОбменаДанными(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Ключ", ТекущиеДанные.Ссылка); + + ОткрытьФормуМодально("Справочник.СценарииОбменовДанными.ФормаОбъекта", ПараметрыФормы, ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ВключитьОтключитьРегламентноеЗадание(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ВключитьОтключитьРегламентноеЗаданиеНаСервере(ТекущиеДанные.Ссылка); + +КонецПроцедуры + +&НаКлиенте +Процедура ВключитьОтключитьВыгрузку(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ВключитьОтключитьВыгрузкуНаСервере(ТекущиеДанные.ФлагИспользованияВыгрузки, ТекущиеДанные.Ссылка); + +КонецПроцедуры + +&НаКлиенте +Процедура ВключитьОтключитьЗагрузку(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ВключитьОтключитьЗагрузкуНаСервере(ТекущиеДанные.ФлагИспользованияЗагрузки, ТекущиеДанные.Ссылка); + +КонецПроцедуры + +&НаКлиенте +Процедура ВключитьОтключитьЗагрузкуВыгрузку(Команда) + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ВключитьОтключитьЗагрузкуВыгрузкуНаСервере(ТекущиеДанные.ФлагИспользованияЗагрузки ИЛИ ТекущиеДанные.ФлагИспользованияВыгрузки, ТекущиеДанные.Ссылка); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ТекущиеДанные = Элементы.Список.ДанныеСтроки(ВыбраннаяСтрока); + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Поле = Элементы.ФлагИспользованияЗагрузки Тогда + + ВключитьОтключитьЗагрузкуНаСервере(ТекущиеДанные.ФлагИспользованияЗагрузки, ТекущиеДанные.Ссылка); + + ИначеЕсли Поле = Элементы.ФлагИспользованияВыгрузки Тогда + + ВключитьОтключитьВыгрузкуНаСервере(ТекущиеДанные.ФлагИспользованияВыгрузки, ТекущиеДанные.Ссылка); + + ИначеЕсли Поле = Элементы.Наименование Тогда + + ИзменитьСценарийОбменаДанными(Неопределено); + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ВключитьОтключитьРегламентноеЗаданиеНаСервере(Ссылка) + + НастройкаОбъект = Ссылка.ПолучитьОбъект(); + НастройкаОбъект.ИспользоватьРегламентноеЗадание = Не НастройкаОбъект.ИспользоватьРегламентноеЗадание; + НастройкаОбъект.Записать(); + + // обновляем данные списка + Элементы.Список.Обновить(); + +КонецПроцедуры + +&НаСервере +Процедура ВключитьОтключитьВыгрузкуНаСервере(Знач ФлагИспользованияВыгрузки, Знач СценарийОбменаДанными) + + Если ФлагИспользованияВыгрузки Тогда + + Справочники.СценарииОбменовДанными.УдалитьВыгрузкуВСценарииОбменаДанными(СценарийОбменаДанными, Параметры.УзелИнформационнойБазы); + + Иначе + + Справочники.СценарииОбменовДанными.ДобавитьВыгрузкуВСценарииОбменаДанными(СценарийОбменаДанными, Параметры.УзелИнформационнойБазы); + + КонецЕсли; + + Элементы.Список.Обновить(); + +КонецПроцедуры + +&НаСервере +Процедура ВключитьОтключитьЗагрузкуНаСервере(Знач ФлагИспользованияЗагрузки, Знач СценарийОбменаДанными) + + Если ФлагИспользованияЗагрузки Тогда + + Справочники.СценарииОбменовДанными.УдалитьЗагрузкуВСценарииОбменаДанными(СценарийОбменаДанными, Параметры.УзелИнформационнойБазы); + + Иначе + + Справочники.СценарииОбменовДанными.ДобавитьЗагрузкуВСценарииОбменаДанными(СценарийОбменаДанными, Параметры.УзелИнформационнойБазы); + + КонецЕсли; + + Элементы.Список.Обновить(); + +КонецПроцедуры + +&НаСервере +Процедура ВключитьОтключитьЗагрузкуВыгрузкуНаСервере(Знач ФлагИспользования, Знач СценарийОбменаДанными) + + ВключитьОтключитьЗагрузкуНаСервере(ФлагИспользования, СценарийОбменаДанными); + + ВключитьОтключитьВыгрузкуНаСервере(ФлагИспользования, СценарийОбменаДанными); + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..cf7d239ee --- /dev/null +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form @@ -0,0 +1,476 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + ИспользоватьРегламентноеЗадание + 8 + true + true + + true + + + Список.ИспользоватьРегламентноеЗадание + + None + + ИспользоватьРегламентноеЗаданиеРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ИспользоватьРегламентноеЗаданиеКонтекстноеМеню + 9 + true + + PictureField + Enter + true + Left + true + + 2 + true + true + true + + StdPicture.ScheduledJob + + + + 1 + + + + + Наименование + 4 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 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 + + + + СписокРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + + СписокКонтекстноеМенюВключитьОтключитьРегламентноеЗадание + 13 + true + true + + true + + + СписокКонтекстноеМенюВключитьОтключитьРегламентноеЗаданиеРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + Form.Command.ВключитьОтключитьРегламентноеЗадание + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
+ + ФормаКоманднаяПанель + -1 + + ФормаВключитьОтключитьРегламентноеЗадание + 12 + true + true + + true + + + ФормаВключитьОтключитьРегламентноеЗаданиеРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + Form.Command.ВключитьОтключитьРегламентноеЗадание + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.СценарииОбменовДанными + true + true + true + true + +
+ + ВключитьОтключитьРегламентноеЗадание + + <key>ru</key> + <value>Включить / отключить выполнение обмена по расписанию</value> + + 1 + + ru + Включить / отключить выполнение обмена по расписанию + + + + Role.Администрирование + + + Role.БазовыеПрава + + + Role.ВыводНаПринтерФайлБуферОбмена + + + Role.ВыполнениеОбменовДанными + + + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ДобавлениеИзменениеДополнительныхОтчетовИОбработок + + + Role.ИзменениеДополнительныхСведений + + + Role.ДобавлениеИзменениеЗаданий + + + true + Role.ДобавлениеИзменениеОбменовДанными + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеРолейИсполнителей + + + Role.ДобавлениеИзменениеФизическихЛиц + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИзменениеВыполнениеЗадач + + + Role.ИзменениеМакетовПечатныхФорм + + + Role.ИзменениеТекущегоВнешнегоПользователя + + + Role.ИзменениеТекущегоПользователя + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ИспользованиеДополнительныхОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + Role.ПолныеПрава + + + Role.ПроверкаДоступныхОбновленийКонфигурации + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеВнешнихПользователей + + + Role.ЧтениеДополнительныхСведений + + + Role.ЧтениеЗаданий + + + Role.ЧтениеЗадач + + + Role.ЧтениеОтветовНаВопросыАнкет + + + Role.ЧтениеПерсональныхДанныхФизическихЛиц + + + + StdPicture.ScheduledJob + + + + ВключитьОтключитьРегламентноеЗадание + + + Auto + Auto + + + + + + +
diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..55e675849 --- /dev/null +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,36 @@ + +&НаКлиенте +Процедура ВключитьОтключитьРегламентноеЗадание(Команда) + + ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки; + + Если ВыделенныеСтроки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + + ВключитьОтключитьРегламентноеЗаданиеНаСервере(ВыделенныеСтроки, Не ТекущиеДанные.ИспользоватьРегламентноеЗадание); + +КонецПроцедуры + +&НаСервере +Процедура ВключитьОтключитьРегламентноеЗаданиеНаСервере(ВыделенныеСтроки, ИспользоватьРегламентноеЗадание) + + Для Каждого ДанныеСтроки ИЗ ВыделенныеСтроки Цикл + + Если ДанныеСтроки.ПометкаУдаления Тогда + Продолжить; + КонецЕсли; + + НастройкаОбъект = ДанныеСтроки.Ссылка.ПолучитьОбъект(); + НастройкаОбъект.ИспользоватьРегламентноеЗадание = ИспользоватьРегламентноеЗадание; + НастройкаОбъект.Записать(); + + КонецЦикла; + + // обновляем данные списка + Элементы.Список.Обновить(); + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..379e3fe89 --- /dev/null +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,1063 @@ + + + + Группа + 103 + + Наименование + 3 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Код + 101 + true + true + + true + + + КодРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 102 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 128 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ОбменПоРасписанию + 22 + + ИспользоватьРегламентноеЗадание + 24 + + <key>ru</key> + <value>Использовать расписание</value> + + true + true + + true + + + Объект.ИспользоватьРегламентноеЗадание + + Right + + OnChange + ИспользоватьРегламентноеЗаданиеПриИзменении + + + ИспользоватьРегламентноеЗаданиеРасширеннаяПодсказка + 134 + Label + true + true + + Left + + + + ИспользоватьРегламентноеЗаданиеКонтекстноеМеню + 25 + true + + CheckBoxField + Enter + true + Left + true + + + + НастроитьРасписаниеРегламентногоЗадания + 62 + true + true + + true + + false + + НастроитьРасписаниеРегламентногоЗаданияРасширеннаяПодсказка + 136 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастроитьРасписаниеРегламентногоЗадания + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Обмен по расписанию</value> + + + ru + Обмен по расписанию + + 70 + false + + ОбменПоРасписаниюРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Состав + 104 + + СоставРасписания + 5 + true + true + + true + + + Объект.НастройкиОбмена + + false + None + + НастройкиОбменаНомерСтроки + 108 + true + true + + true + + + Объект.НастройкиОбмена.LineNumber + + + НастройкиОбменаНомерСтрокиРасширеннаяПодсказка + 150 + Label + true + true + + Left + + + + НастройкиОбменаНомерСтрокиКонтекстноеМеню + 109 + true + + LabelField + Auto + true + Left + true + + true + true + + + + КолонкиУзлаИнформационнойБазы + 122 + + НастройкиОбменаРезультатВыполненияОбмена + 123 + true + true + + true + + + Объект.НастройкиОбмена.РезультатВыполненияОбмена + + None + + НастройкиОбменаРезультатВыполненияОбменаРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + + НастройкиОбменаРезультатВыполненияОбменаКонтекстноеМеню + 124 + true + + PictureField + Auto + true + Left + true + + true + true + true + true + + CommonPicture.СостояниеОбменаДанными + + + + 1 + + + + + НастройкиОбменаУзелИнформационнойБазы + 112 + true + true + + true + + + Объект.НастройкиОбмена.УзелИнформационнойБазы + + + НастройкиОбменаУзелИнформационнойБазыРасширеннаяПодсказка + 155 + Label + true + true + + Left + + + + НастройкиОбменаУзелИнформационнойБазыКонтекстноеМеню + 113 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Колонки узла информационной базы</value> + + + ru + Колонки узла информационной базы + + + КолонкиУзлаИнформационнойБазыРасширеннаяПодсказка + 152 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + НастройкиОбменаВидТранспортаОбмена + 114 + true + true + + true + + + Объект.НастройкиОбмена.ВидТранспортаОбмена + + + НастройкиОбменаВидТранспортаОбменаРасширеннаяПодсказка + 157 + Label + true + true + + Left + + + + НастройкиОбменаВидТранспортаОбменаКонтекстноеМеню + 115 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + НастройкиОбменаВыполняемоеДействие + 116 + true + true + + true + + + Объект.НастройкиОбмена.ВыполняемоеДействие + + + НастройкиОбменаВыполняемоеДействиеРасширеннаяПодсказка + 159 + Label + true + true + + Left + + + + НастройкиОбменаВыполняемоеДействиеКонтекстноеМеню + 117 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + НастройкиОбменаКоличествоЭлементовВТранзакции + 118 + true + true + + true + + + Объект.НастройкиОбмена.КоличествоЭлементовВТранзакции + + + НастройкиОбменаКоличествоЭлементовВТранзакцииРасширеннаяПодсказка + 161 + Label + true + true + + Left + + + + НастройкиОбменаКоличествоЭлементовВТранзакцииКонтекстноеМеню + 119 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + СоставРасписанияКоманднаяПанель + 7 + Left + true + + + СоставРасписанияСтрокаПоиска + 141 + + СоставРасписанияСтрокаПоискаРасширеннаяПодсказка + 143 + Label + true + true + + Left + + + + СоставРасписанияСтрокаПоискаКонтекстноеМеню + 142 + true + + СоставРасписания + + true + + + + СоставРасписанияСостояниеПросмотра + 144 + + СоставРасписанияСостояниеПросмотраРасширеннаяПодсказка + 146 + Label + true + true + + Left + + + + СоставРасписанияСостояниеПросмотраКонтекстноеМеню + 145 + true + + ViewStatusAddition + СоставРасписания + + true + + + + СоставРасписанияУправлениеПоиском + 147 + + СоставРасписанияУправлениеПоискомРасширеннаяПодсказка + 149 + Label + true + true + + Left + + + + СоставРасписанияУправлениеПоискомКонтекстноеМеню + 148 + true + + SearchControlAddition + СоставРасписания + + true + + + + СоставРасписанияРасширеннаяПодсказка + 140 + Label + true + true + + Left + + + + СоставРасписанияКонтекстноеМеню + 6 + + НастройкиТранспорта + 86 + true + true + + true + + false + + НастройкиТранспортаРасширеннаяПодсказка + 138 + Label + true + true + + Left + + + Form.Command.НастройкиТранспорта + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСоставРасписанияПерейтиВЖурналРегистрации + 126 + true + true + + true + + false + + КонтекстноеМенюСоставРасписанияПерейтиВЖурналРегистрацииРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + Form.Command.ПерейтиВЖурналРегистрации + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + true + true + MultiRow + Row +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + None + None + None + true + +
+ true + true + + true + + + <key>ru</key> + <value>Состав настройки обмена</value> + + + ru + Состав + + + СоставРасширеннаяПодсказка + 137 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + +
+ + Дополнительно + 107 + + Комментарий + 30 + true + true + + true + + + Объект.Комментарий + + + КомментарийРасширеннаяПодсказка + 172 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 31 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Дополнительно</value> + + + ru + Дополнительно + + + ДополнительноРасширеннаяПодсказка + 171 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ВыполнитьОбмен + 125 + true + true + + true + + false + + ВыполнитьОбменРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + Form.Command.ВыполнитьОбмен + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + + OnClose + ПриЗакрытии + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.СценарииОбменовДанными + + + true + + + true + +
true
+ true + + + Объект.НастройкиОбмена + + + РезультатВыполненияОбмена + + <key>ru</key> + <value>Результат выполнения обмена</value> + + 1 + + Number + + 1 + true + + + + true + + + true + + + +
+ + РасписаниеРегламентногоЗадания + + <key>ru</key> + <value>Расписание регламентного задания</value> + + 2 + + + true + + + true + + + + НастроитьРасписаниеРегламентногоЗадания + + <key>ru</key> + <value>Расписание выполнения обмена</value> + + 1 + + ru + Настроить расписание регламентного задания + + + true + + + StdPicture.SetTime + + + + НастроитьРасписаниеРегламентногоЗаданияВыполнить + + + Auto + Auto + + + НастройкиТранспорта + + <key>ru</key> + <value>Настройки транспорта</value> + + 2 + + ru + Открыть настройки транспорта для текущей строки настройки + + + true + + + CommonPicture.ПараметрыОбменаДанными + + + + НастройкиТранспортаВыполнить + + + TextPicture + Auto + Auto + + + ВыполнитьОбмен + + <key>ru</key> + <value>Выполнить обмен</value> + + 3 + + ru + Выполнить обмен + + + true + + + CommonPicture.ВыполнитьЗапускОбменаДанными + + + + ВыполнитьОбмен + + + TextPicture + Auto + Auto + + + ПерейтиВЖурналРегистрации + + <key>ru</key> + <value>События обмена данных</value> + + 5 + + ru + Перейти в журнал регистрации событий обмена данных + + + true + + + StdPicture.EventLog + + + + ПерейтиВЖурналРегистрации + + + Auto + Auto + + + + + 0 + Added + + Items.СоставРасписания.CurrentData.УзелИнформационнойБазы + + + true + + + + 0 + Added + + Items.СоставРасписания.CurrentData.УзелИнформационнойБазы + + 3 + + true + + + + 0 + Added + + Items.СоставРасписания.CurrentData.УзелИнформационнойБазы + + 1 + + true + + + + 0 + Added + + Items.СоставРасписания.CurrentData.УзелИнформационнойБазы + + 2 + + true + + + + + + + + AfterWrite + ПослеЗаписи + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + +
diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..3468256d3 --- /dev/null +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,276 @@ +&НаКлиенте +Перем мПредставлениеПустогоРасписания; + +&НаКлиенте +Перем мНомерСтроки; + +&НаКлиенте +Перем мКоличествоСтрок; + +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЭтоНовый = (Объект.Ссылка.Пустая()); + + УзелИнформационнойБазы = Неопределено; + + Если ЭтоНовый + И Параметры.Свойство("УзелИнформационнойБазы", УзелИнформационнойБазы) Тогда + + Справочники.СценарииОбменовДанными.ДобавитьЗагрузкуВСценарииОбменаДанными(Объект, УзелИнформационнойБазы); + Справочники.СценарииОбменовДанными.ДобавитьВыгрузкуВСценарииОбменаДанными(Объект, УзелИнформационнойБазы); + + Наименование = НСтр("ru = 'Сценарий обмена для [УзелИнформационнойБазы]'"); + Объект.Наименование = СтрЗаменить(Наименование, "[УзелИнформационнойБазы]", Строка(УзелИнформационнойБазы)); + + РасписаниеРегламентногоЗадания = Справочники.СценарииОбменовДанными.РасписаниеРегламентногоЗаданияПоУмолчанию(); + + Объект.ИспользоватьРегламентноеЗадание = Истина; + + Иначе + + // получаем расписание из самого регламентного задания + // если РЗ не задано, то расписание = Неопределено и будет создано на клиенте в момент редактирования расписания + РасписаниеРегламентногоЗадания = Справочники.СценарииОбменовДанными.ПолучитьРасписаниеВыполненияОбменаДанными(Объект.Ссылка); + + КонецЕсли; + + Если Не ЭтоНовый Тогда + + ОбновитьСостояниеОбменовДанными(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + мПредставлениеПустогоРасписания = Строка(Новый РасписаниеРегламентногоЗадания); + + ОбновитьПредставлениеРасписания(); + + УстановитьДоступностьГиперСсылкиНастройкиРасписания(); + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект) + + Справочники.СценарииОбменовДанными.ОбновитьДанныеРегламентногоЗадания(Отказ, РасписаниеРегламентногоЗадания, ТекущийОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + Оповестить("ЗаписанСценарийОбменаДанными"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии() + + Оповестить("ЗакрытаФормаСценарияОбменаДанными"); + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ВыполнитьОбмен(Команда) + + ЭтоНовый = (Объект.Ссылка.Пустая()); + + Если Модифицированность ИЛИ ЭтоНовый Тогда + + Записать(); + + КонецЕсли; + + мНомерСтроки = 1; + мКоличествоСтрок = Объект.НастройкиОбмена.Количество(); + + ПодключитьОбработчикОжидания("ВыполнитьОбменДаннымиНаКлиенте", 0.1, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьРасписаниеРегламентногоЗаданияВыполнить() + + РедактированиеРасписанияРегламентногоЗадания(); + + ОбновитьПредставлениеРасписания(); + +КонецПроцедуры + +&НаКлиенте +Процедура НастройкиТранспортаВыполнить() + + ТекущиеДанные = Элементы.СоставРасписания.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + ИначеЕсли Не ЗначениеЗаполнено(ТекущиеДанные.УзелИнформационнойБазы) Тогда + Возврат; + КонецЕсли; + + Отбор = Новый Структура("Узел", ТекущиеДанные.УзелИнформационнойБазы); + ЗначенияЗаполнения = Новый Структура("Узел", ТекущиеДанные.УзелИнформационнойБазы); + + ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, ЗначенияЗаполнения, "НастройкиТранспортаОбмена", ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ИспользоватьРегламентноеЗаданиеПриИзменении(Элемент) + + УстановитьДоступностьГиперСсылкиНастройкиРасписания(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПерейтиВЖурналРегистрации(Команда) + + ТекущиеДанные = Элементы.СоставРасписания.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(ТекущиеДанные.УзелИнформационнойБазы, + ЭтаФорма, + ТекущиеДанные.ВыполняемоеДействие); + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура РедактированиеРасписанияРегламентногоЗадания() + + // если расписание не инициализировано в форме на сервере, то создаем новое + Если РасписаниеРегламентногоЗадания = Неопределено Тогда + + РасписаниеРегламентногоЗадания = Новый РасписаниеРегламентногоЗадания; + + КонецЕсли; + + Диалог = Новый ДиалогРасписанияРегламентногоЗадания(РасписаниеРегламентногоЗадания); + + // открываем диалог для редактирования Расписания + Если Диалог.ОткрытьМодально() Тогда + + РасписаниеРегламентногоЗадания = Диалог.Расписание; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьПредставлениеРасписания() + + ПредставлениеРасписания = Строка(РасписаниеРегламентногоЗадания); + + Если ПредставлениеРасписания = мПредставлениеПустогоРасписания Тогда + + ПредставлениеРасписания = НСтр("ru = 'Расписание не задано'"); + + КонецЕсли; + + Элементы.НастроитьРасписаниеРегламентногоЗадания.Заголовок = ПредставлениеРасписания; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьГиперСсылкиНастройкиРасписания() + + Элементы.НастроитьРасписаниеРегламентногоЗадания.Доступность = Объект.ИспользоватьРегламентноеЗадание; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьОбменДаннымиНаКлиенте() + + Если мНомерСтроки > мКоличествоСтрок Тогда // выход из рекурсии + ВыводитьПрогрессор = (мКоличествоСтрок > 1); + Состояние(НСтр("ru = 'Обмен данными выполнен.'"), ?(ВыводитьПрогрессор, 100, Неопределено)); + Возврат; // выходим + КонецЕсли; + + ТекущиеДанные = Объект.НастройкиОбмена[мНомерСтроки - 1]; + + // значение прогрессора + ВыводитьПрогрессор = (мКоличествоСтрок > 1); + + СтрокаСообщения = НСтр("ru = 'Выполняется [ВыполняемоеДействие] для [УзелИнформационнойБазы]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ВыполняемоеДействие]", Строка(ТекущиеДанные.ВыполняемоеДействие)); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[УзелИнформационнойБазы]", Строка(ТекущиеДанные.УзелИнформационнойБазы)); + + Прогресс = Окр(100 * (мНомерСтроки -1) / ?(мКоличествоСтрок = 0, 1, мКоличествоСтрок)); + Состояние(СтрокаСообщения, ?(ВыводитьПрогрессор, Прогресс, Неопределено)); + + // запускаем выполнение обмена по строке настройки + ВыполнитьОбменДаннымиПоСтрокеНастройки(мНомерСтроки); + + ОбработкаПрерыванияПользователя(); + + мНомерСтроки = мНомерСтроки + 1; + + // рекурсивно вызываем эту процедуру + ПодключитьОбработчикОжидания("ВыполнитьОбменДаннымиНаКлиенте", 0.1, Истина); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьСостояниеОбменовДанными() + + ТекстЗапроса = " + |ВЫБРАТЬ + | СценарииОбменовДаннымиНастройкиОбмена.УзелИнформационнойБазы, + | СценарииОбменовДаннымиНастройкиОбмена.ВидТранспортаОбмена, + | СценарииОбменовДаннымиНастройкиОбмена.ВыполняемоеДействие, + | СценарииОбменовДаннымиНастройкиОбмена.КоличествоЭлементовВТранзакции, + | ВЫБОР + | КОГДА СостояниеОбменовДанными.РезультатВыполненияОбмена ЕСТЬ NULL + | ТОГДА 0 + | КОГДА СостояниеОбменовДанными.РезультатВыполненияОбмена = ЗНАЧЕНИЕ(Перечисление.РезультатыВыполненияОбмена.Предупреждение_СообщениеОбменаБылоРанееПринято) + | ТОГДА 3 + | КОГДА СостояниеОбменовДанными.РезультатВыполненияОбмена = ЗНАЧЕНИЕ(Перечисление.РезультатыВыполненияОбмена.Выполнено) + | ТОГДА 2 + | ИНАЧЕ 1 + | КОНЕЦ КАК РезультатВыполненияОбмена + |ИЗ + | Справочник.СценарииОбменовДанными.НастройкиОбмена КАК СценарииОбменовДаннымиНастройкиОбмена + |ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеОбменовДанными КАК СостояниеОбменовДанными + | ПО СостояниеОбменовДанными.УзелИнформационнойБазы = СценарииОбменовДаннымиНастройкиОбмена.УзелИнформационнойБазы + | И СостояниеОбменовДанными.ДействиеПриОбмене = СценарииОбменовДаннымиНастройкиОбмена.ВыполняемоеДействие + |ГДЕ + | СценарииОбменовДаннымиНастройкиОбмена.Ссылка = &Ссылка + |УПОРЯДОЧИТЬ ПО + | СценарииОбменовДаннымиНастройкиОбмена.НомерСтроки ВОЗР + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); + + Объект.НастройкиОбмена.Загрузить(Запрос.Выполнить().Выгрузить()); + +КонецПроцедуры + +&НаСервере +Процедура ВыполнитьОбменДаннымиПоСтрокеНастройки(Знач Индекс) + + // запускаем выполнение обмена + ОбменДаннымиСервер.ВыполнитьОбменДаннымиПоСценариюОбменаДанными(Объект.Ссылка, Индекс); + + // обновляем данных табличной части сценария обмена + ОбновитьСостояниеОбменовДанными(); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl new file mode 100644 index 000000000..240ceb966 --- /dev/null +++ b/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl @@ -0,0 +1,353 @@ + +Функция РасписаниеРегламентногоЗаданияПоУмолчанию() Экспорт + + Месяцы = Новый Массив; + Месяцы.Добавить(1); + Месяцы.Добавить(2); + Месяцы.Добавить(3); + Месяцы.Добавить(4); + Месяцы.Добавить(5); + Месяцы.Добавить(6); + Месяцы.Добавить(7); + Месяцы.Добавить(8); + Месяцы.Добавить(9); + Месяцы.Добавить(10); + Месяцы.Добавить(11); + Месяцы.Добавить(12); + + ДниНедели = Новый Массив; + ДниНедели.Добавить(1); + ДниНедели.Добавить(2); + ДниНедели.Добавить(3); + ДниНедели.Добавить(4); + ДниНедели.Добавить(5); + ДниНедели.Добавить(6); + ДниНедели.Добавить(7); + + Расписание = Новый РасписаниеРегламентногоЗадания; + Расписание.ДниНедели = ДниНедели; + Расписание.ПериодПовтораВТечениеДня = 900; // 15 минут + Расписание.ПериодПовтораДней = 1; // каждый день + Расписание.Месяцы = Месяцы; + + Возврат Расписание; +КонецФункции + +// Возвращает ссылку на узел плана обмена, которая указана в первой строке настройки выполнения обмена +// +// Параметры: +// НастройкаВыполненияОбмена - СправочникСсылка.СценарииОбменовДанными - настройка обмена из которой необходимо получить узел плана обмена +// +// Возвращаемое значение: +// +// ПланОбменаСсылка - ссылка на узел плана обмена, которая указана в первой строке настройки выполнения обмена; +// если строк нет, то возвращается Неопределено. +// +Функция ПолучитьУзелИнформационнойБазыИзПервойСтрокиНастройки(НастройкаВыполненияОбмена) Экспорт + + // возвращаемое значение функции + УзелИнформационнойБазы = Неопределено; + + Если НастройкаВыполненияОбмена.Пустая() Тогда + Возврат УзелИнформационнойБазы; + КонецЕсли; + + ТекстЗапроса = " + |ВЫБРАТЬ ПЕРВЫЕ 1 + | НастройкиВыполненияОбменаНастройкиОбмена.УзелИнформационнойБазы КАК УзелИнформационнойБазы + |ИЗ + | Справочник.СценарииОбменовДанными.НастройкиОбмена КАК НастройкиВыполненияОбменаНастройкиОбмена + |ГДЕ + | НастройкиВыполненияОбменаНастройкиОбмена.Ссылка = &Ссылка + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Ссылка", НастройкаВыполненияОбмена); + + РезультатЗапроса = Запрос.Выполнить(); + + Если Не РезультатЗапроса.Пустой() Тогда + + Выборка = РезультатЗапроса.Выбрать(); + Выборка.Следующий(); + + УзелИнформационнойБазы = Выборка.УзелИнформационнойБазы; + + КонецЕсли; + + Возврат УзелИнформационнойБазы; +КонецФункции + +// Получает расписание регл. задания. Если регл. задание не задано, то возвращает пустое расписание (по умолчанию) +Функция ПолучитьРасписаниеВыполненияОбменаДанными(НастройкаВыполненияОбмена) Экспорт + + РегламентноеЗаданиеОбъект = ОбменДаннымиСервер.НайтиРегламентноеЗаданиеПоПараметру(НастройкаВыполненияОбмена.РегламентноеЗаданиеGUID); + + Если РегламентноеЗаданиеОбъект <> Неопределено Тогда + + РасписаниеРегламентногоЗадания = РегламентноеЗаданиеОбъект.Расписание; + + Иначе + + РасписаниеРегламентногоЗадания = Новый РасписаниеРегламентногоЗадания; + + КонецЕсли; + + Возврат РасписаниеРегламентногоЗадания; + +КонецФункции + +Процедура ОбновитьДанныеРегламентногоЗадания(Отказ, РасписаниеРегламентногоЗадания, ТекущийОбъект) Экспорт + + // получаем регламентное задание по идентификатору, если объект не находим, то создаем новый + РегламентноеЗаданиеОбъект = СоздатьРегламентноеЗаданиеПриНеобходимости(Отказ, ТекущийОбъект); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + // обновляем свойства РЗ + УстановитьПараметрыРегламентногоЗадания(РегламентноеЗаданиеОбъект, РасписаниеРегламентногоЗадания, ТекущийОбъект); + + // записываем измененное задание + ЗаписатьРегламентноеЗадание(Отказ, РегламентноеЗаданиеОбъект); + + //запоминаем GUID регл. задания в реквизите объекта + ТекущийОбъект.РегламентноеЗаданиеGUID = Строка(РегламентноеЗаданиеОбъект.УникальныйИдентификатор); + +КонецПроцедуры + +Функция СоздатьРегламентноеЗаданиеПриНеобходимости(Отказ, ТекущийОбъект) + + РегламентноеЗаданиеОбъект = ОбменДаннымиСервер.НайтиРегламентноеЗаданиеПоПараметру(ТекущийОбъект.РегламентноеЗаданиеGUID); + + // при необходимости создаем регл. задание + Если РегламентноеЗаданиеОбъект = Неопределено Тогда + + РегламентноеЗаданиеОбъект = РегламентныеЗадания.СоздатьРегламентноеЗадание("ВыполнениеОбменаДанными"); + + КонецЕсли; + + Возврат РегламентноеЗаданиеОбъект; + +КонецФункции + +Процедура УстановитьПараметрыРегламентногоЗадания(РегламентноеЗаданиеОбъект, РасписаниеРегламентногоЗадания, ТекущийОбъект) + + ПараметрыРегламентногоЗадания = Новый Массив; + ПараметрыРегламентногоЗадания.Добавить(ТекущийОбъект.Ссылка); + + НаименованиеРегламентногоЗадания = НСтр("ru = 'Выполнение обмена по настройке: [Наименование]'"); + НаименованиеРегламентногоЗадания = СтрЗаменить(НаименованиеРегламентногоЗадания, "[Наименование]", СокрЛП(ТекущийОбъект.Наименование)); + + РегламентноеЗаданиеОбъект.Наименование = Лев(НаименованиеРегламентногоЗадания, 120); + РегламентноеЗаданиеОбъект.Использование = ТекущийОбъект.ИспользоватьРегламентноеЗадание; + РегламентноеЗаданиеОбъект.Параметры = ПараметрыРегламентногоЗадания; + + // обновляем расписание, если оно было изменено + Если РасписаниеРегламентногоЗадания <> Неопределено Тогда + РегламентноеЗаданиеОбъект.Расписание = РасписаниеРегламентногоЗадания; + КонецЕсли; + +КонецПроцедуры + +// Выполняет запись регламентного задания +// +// Параметры: +// Отказ - Булево - флаг отказа. Если в процессе выполнения процедуры были обнаружены ошибки, +// то флаг отказа устанавливается в значение Истина +// РегламентноеЗаданиеОбъект - объект регламентного задания, которое необходимо записать +// +Процедура ЗаписатьРегламентноеЗадание(Отказ, РегламентноеЗаданиеОбъект) + + УстановитьПривилегированныйРежим(Истина); + + Попытка + + // записываем задание + РегламентноеЗаданиеОбъект.Записать(); + + Исключение + + СтрокаСообщения = НСтр("ru = 'Произошла ошибка при сохранении расписания выполнения обменов. + |Подробное описание ошибки: [ОписаниеОшибки]'"); + // + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОписаниеОшибки]", КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбменДаннымиСервер.СообщитьОбОшибке(СтрокаСообщения, Отказ); + + КонецПопытки; + +КонецПроцедуры + +// + +Процедура УдалитьВыгрузкуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы) Экспорт + + УдалитьСтрокуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ВыгрузкаДанных); + +КонецПроцедуры + +Процедура УдалитьЗагрузкуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы) Экспорт + + УдалитьСтрокуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + +КонецПроцедуры + +Процедура ДобавитьВыгрузкуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы) Экспорт + + НадоЗаписатьОбъект = Ложь; + + Если ТипЗнч(СценарийОбменаДанными) = Тип("СправочникСсылка.СценарииОбменовДанными") Тогда + + СценарийОбменаДанными = СценарийОбменаДанными.ПолучитьОбъект(); + + НадоЗаписатьОбъект = Истина; + + КонецЕсли; + + ВидТранспортаОбмена = РегистрыСведений.НастройкиТранспортаОбмена.ВидТранспортаСообщенийОбменаПоУмолчанию(УзелИнформационнойБазы); + + НастройкиОбмена = СценарийОбменаДанными.НастройкиОбмена; + + // добавляем выгрузку данных в цикле + МаксимальныйИндекс = НастройкиОбмена.Количество() - 1; + + Для Индекс = 0 По МаксимальныйИндекс Цикл + + ОбратныйИндекс = МаксимальныйИндекс - Индекс; + + СтрокаТаблицы = НастройкиОбмена[ОбратныйИндекс]; + + Если СтрокаТаблицы.ВыполняемоеДействие = Перечисления.ДействияПриОбмене.ВыгрузкаДанных Тогда // последняя строка выгрузки + + НоваяСтрока = НастройкиОбмена.Вставить(ОбратныйИндекс + 1); + + НоваяСтрока.УзелИнформационнойБазы = УзелИнформационнойБазы; + НоваяСтрока.ВидТранспортаОбмена = ВидТранспортаОбмена; + НоваяСтрока.ВыполняемоеДействие = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; + НоваяСтрока.КоличествоЭлементовВТранзакции = 0; + + Прервать; + КонецЕсли; + + КонецЦикла; + + // если в цикле строка выгрузки не была добавлена, то вставляем строку в конец таблицы + Отбор = Новый Структура("УзелИнформационнойБазы, ВыполняемоеДействие", УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ВыгрузкаДанных); + Если НастройкиОбмена.НайтиСтроки(Отбор).Количество() = 0 Тогда + + НоваяСтрока = НастройкиОбмена.Добавить(); + + НоваяСтрока.УзелИнформационнойБазы = УзелИнформационнойБазы; + НоваяСтрока.ВидТранспортаОбмена = ВидТранспортаОбмена; + НоваяСтрока.ВыполняемоеДействие = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; + НоваяСтрока.КоличествоЭлементовВТранзакции = 0; + + КонецЕсли; + + Если НадоЗаписатьОбъект Тогда + + // записываем изменения в объекте + СценарийОбменаДанными.Записать(); + + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьЗагрузкуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы) Экспорт + + НадоЗаписатьОбъект = Ложь; + + Если ТипЗнч(СценарийОбменаДанными) = Тип("СправочникСсылка.СценарииОбменовДанными") Тогда + + СценарийОбменаДанными = СценарийОбменаДанными.ПолучитьОбъект(); + + НадоЗаписатьОбъект = Истина; + + КонецЕсли; + + ВидТранспортаОбмена = РегистрыСведений.НастройкиТранспортаОбмена.ВидТранспортаСообщенийОбменаПоУмолчанию(УзелИнформационнойБазы); + + НастройкиОбмена = СценарийОбменаДанными.НастройкиОбмена; + + // добавляем загрузку данных в цикле + Для каждого СтрокаТаблицы Из НастройкиОбмена Цикл + + Если СтрокаТаблицы.ВыполняемоеДействие = Перечисления.ДействияПриОбмене.ЗагрузкаДанных Тогда // первая строка загрузки + + НоваяСтрока = НастройкиОбмена.Вставить(НастройкиОбмена.Индекс(СтрокаТаблицы)); + + НоваяСтрока.УзелИнформационнойБазы = УзелИнформационнойБазы; + НоваяСтрока.ВидТранспортаОбмена = ВидТранспортаОбмена; + НоваяСтрока.ВыполняемоеДействие = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; + НоваяСтрока.КоличествоЭлементовВТранзакции = 0; + + Прервать; + КонецЕсли; + + КонецЦикла; + + // если в цикле строка загрузки не была добавлена, то вставляем строку в начало таблицы + Отбор = Новый Структура("УзелИнформационнойБазы, ВыполняемоеДействие", УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + Если НастройкиОбмена.НайтиСтроки(Отбор).Количество() = 0 Тогда + + НоваяСтрока = НастройкиОбмена.Вставить(0); + + НоваяСтрока.УзелИнформационнойБазы = УзелИнформационнойБазы; + НоваяСтрока.ВидТранспортаОбмена = ВидТранспортаОбмена; + НоваяСтрока.ВыполняемоеДействие = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; + НоваяСтрока.КоличествоЭлементовВТранзакции = 0; + + КонецЕсли; + + Если НадоЗаписатьОбъект Тогда + + // записываем изменения в объекте + СценарийОбменаДанными.Записать(); + + КонецЕсли; + +КонецПроцедуры + +// + +Процедура УдалитьСтрокуВСценарииОбменаДанными(СценарийОбменаДанными, УзелИнформационнойБазы, ДействиеПриОбмене) + + НадоЗаписатьОбъект = Ложь; + + Если ТипЗнч(СценарийОбменаДанными) = Тип("СправочникСсылка.СценарииОбменовДанными") Тогда + + СценарийОбменаДанными = СценарийОбменаДанными.ПолучитьОбъект(); + + НадоЗаписатьОбъект = Истина; + + КонецЕсли; + + НастройкиОбмена = СценарийОбменаДанными.НастройкиОбмена; + + МаксимальныйИндекс = НастройкиОбмена.Количество() - 1; + + Для Индекс = 0 По МаксимальныйИндекс Цикл + + ОбратныйИндекс = МаксимальныйИндекс - Индекс; + + СтрокаТаблицы = НастройкиОбмена[ОбратныйИндекс]; + + Если СтрокаТаблицы.УзелИнформационнойБазы = УзелИнформационнойБазы + И СтрокаТаблицы.ВыполняемоеДействие = ДействиеПриОбмене Тогда + + НастройкиОбмена.Удалить(ОбратныйИндекс); + + КонецЕсли; + + КонецЦикла; + + Если НадоЗаписатьОбъект Тогда + + // записываем изменения в объекте + СценарийОбменаДанными.Записать(); + + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/ObjectModule.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/ObjectModule.bsl new file mode 100644 index 000000000..874e40120 --- /dev/null +++ b/SSL/src/Catalogs/СценарииОбменовДанными/ObjectModule.bsl @@ -0,0 +1,70 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ОБЪЕКТА + +Процедура ПередЗаписью(Отказ) + + // объекты данного типа не должны мигрировать при обмене + ОбменДанными.Получатели.Очистить(); + + Если ПометкаУдаления Тогда + + ИспользоватьРегламентноеЗадание = Ложь; + + КонецЕсли; + +КонецПроцедуры + +Процедура ПриЗаписи(Отказ) + + // удаляем регламентное задание при необходимости + Если ПометкаУдаления Тогда + + УдалитьРегламентноеЗадание(Отказ); + + КонецЕсли; + + ОбновитьПовторноИспользуемыеЗначения(); + +КонецПроцедуры + +Процедура ПриКопировании(ОбъектКопирования) + + РегламентноеЗаданиеGUID = ""; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +// Выполняет удаление регламентного задания +// +// Параметры: +// Отказ - Булево - флаг отказа. Если в процессе выполнения процедуры были обнаружены ошибки, +// то флаг отказа устанавливается в значение Истина +// РегламентноеЗаданиеОбъект - объект регламентного задания, которое необходимо удалить +// +Процедура УдалитьРегламентноеЗадание(Отказ) + + УстановитьПривилегированныйРежим(Истина); + + // определяем регламентное задание + РегламентноеЗаданиеОбъект = ОбменДаннымиСервер.НайтиРегламентноеЗаданиеПоПараметру(РегламентноеЗаданиеGUID); + + Если РегламентноеЗаданиеОбъект <> Неопределено Тогда + + Попытка + РегламентноеЗаданиеОбъект.Удалить(); + Исключение + СтрокаСообщения = НСтр("ru = 'Ошибка при удалении регламентного задания: [ОписаниеОшибки]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОписаниеОшибки]", КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ОбменДаннымиСервер.СообщитьОбОшибке(СтрокаСообщения, Отказ); + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры + + + + diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/СценарииОбменовДанными.mdo b/SSL/src/Catalogs/СценарииОбменовДанными/СценарииОбменовДанными.mdo new file mode 100644 index 000000000..5e5903ed8 --- /dev/null +++ b/SSL/src/Catalogs/СценарииОбменовДанными/СценарииОбменовДанными.mdo @@ -0,0 +1,268 @@ + + + + + + + + + + СценарииОбменовДанными + + ru + Сценарии обменов данными + + true + Catalog.СценарииОбменовДанными.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + Use + + + + + Use + Code + + Use + + + + Use + Managed + Use + + ru + Сценарий обмена данными + + 2 + true + 150 + String + Variable + AsDescription + InDialog + BothWays + Catalog.СценарииОбменовДанными.Form.ФормаЭлемента + Catalog.СценарииОбменовДанными.Form.ФормаСписка + + ИспользоватьРегламентноеЗадание + + ru + Использовать регламентное задание + + + Boolean + + + + + Use + Use + + + Комментарий + + ru + Комментарий + + + String + + + + + + Use + Use + + + РегламентноеЗаданиеGUID + + ru + Регламентное задание GUID + + + String + + 40 + + + + + + Use + Use + + + + + + + НастройкиОбмена + + ru + Настройки обмена + + + Use + LineNumber + + Use + + + + + УзелИнформационнойБазы + + ru + Узел информационной базы + + + ExchangePlanRef + + + + ShowError + Use + Use + + + ВидТранспортаОбмена + + ru + Вид транспорта обмена + + + EnumRef.ВидыТранспортаСообщенийОбмена + + + + ShowError + Use + Use + + + ВыполняемоеДействие + + ru + Выполняемое действие + + + EnumRef.ДействияПриОбмене + + + + ShowError + Use + Use + + + КоличествоЭлементовВТранзакции + + ru + Количество элементов в транзакции + + + Number + + 10 + true + + + + + Use + Use + + + + ФормаСписка + + ru + Форма списка + + 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 new file mode 100644 index 000000000..4b86f1264 --- /dev/null +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,19 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + ПорядокЗаполнения + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..a116ad564 --- /dev/null +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form @@ -0,0 +1,419 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 4 + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ПорядокЗаполнения + 6 + true + true + + true + + + Список.ПорядокЗаполнения + + + ПорядокЗаполненияРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ПорядокЗаполненияКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + МаксимальныйРазмер + 12 + + <key>ru</key> + <value>Максимальный размер (Мб)</value> + + true + true + + true + + + Список.МаксимальныйРазмер + + + МаксимальныйРазмерРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + МаксимальныйРазмерКонтекстноеМеню + 13 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ПолныйПутьWindows + 14 + + <key>ru</key> + <value>Полный путь Microsoft Windows</value> + + true + true + + true + + + Список.ПолныйПутьWindows + + + ПолныйПутьWindowsРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ПолныйПутьWindowsКонтекстноеМеню + 15 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ПолныйПутьLinux + 16 + + <key>ru</key> + <value>Полный путь Linux</value> + + true + true + + true + + + Список.ПолныйПутьLinux + + + ПолныйПутьLinuxРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ПолныйПутьLinuxКонтекстноеМеню + 17 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Комментарий + 10 + true + true + + true + + + Список.Комментарий + + + КомментарийРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + true + 1 + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 19 + + СписокСтрокаПоискаРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 20 + true + + Список + + true + + + + СписокСостояниеПросмотра + 22 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 23 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 25 + + СписокУправлениеПоискомРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 26 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
+ + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.ТомаХраненияФайлов + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..07ae1e3a3 --- /dev/null +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,535 @@ + + + + ГруппаКодИНаименование + 12 + + Наименование + 3 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + Код + 1 + true + true + + true + + + Объект.Code + + true + + КодРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 2 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа код и наименование</value> + + + ru + Группа код и наименование + + + ГруппаКодИНаименованиеРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаПути + 11 + + ПолныйПутьWindows + 5 + + <key>ru</key> + <value>Для сервера 1С:Предприятия под управлением Microsoft Windows, (вида "\\servername\resource")</value> + + true + true + + true + + + Объект.ПолныйПутьWindows + + Top + + ПолныйПутьWindowsРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + ПолныйПутьWindowsКонтекстноеМеню + 6 + true + + InputField + + ru + Меняя путь тома, вы потеряете возможность доступа к уже созданным на этом томе файлам + + Auto + true + Left + true + + true + true + true + false + true + true + true + Normal + + + + ПолныйПутьLinux + 23 + + <key>ru</key> + <value>Для сервера 1С:Предприятия под управлением Linux</value> + + true + true + + true + + + Объект.ПолныйПутьLinux + + Top + + ПолныйПутьLinuxРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + ПолныйПутьLinuxКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Полный путь</value> + + + ru + Группа пути + + + ГруппаПутиРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + StrongSeparation + true + true + auto + Auto + Auto + + + + Порядок + 7 + true + true + + true + + + Объект.ПорядокЗаполнения + + + ПорядокРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ПорядокКонтекстноеМеню + 8 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаМаксимальныйРазмер + 19 + + МаксимальныйРазмер + 17 + + <key>ru</key> + <value>Максимальный размер, Мб</value> + + true + true + + true + + + Объект.МаксимальныйРазмер + + + МаксимальныйРазмерРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + МаксимальныйРазмерКонтекстноеМеню + 18 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ТекущийРазмер + 20 + true + true + + true + + + ТекущийРазмер + + + ТекущийРазмерРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + ТекущийРазмерКонтекстноеМеню + 21 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа максимальный размер</value> + + + ru + Группа максимальный размер + + + ГруппаМаксимальныйРазмерРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Комментарий + 13 + true + true + + true + + + Объект.Комментарий + + + КомментарийРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ТомаХраненияФайлов + + + true + + + true + +
true
+ true +
+ + ТекущийРазмер + + <key>ru</key> + <value>Текущий размер, Мб</value> + + 2 + + Number + + 10 + + + + true + + + true + + + + + + FilterCriterion.ФайлыВТоме.StandardCommand.OpenByValue + + true + + + + + + + + BeforeWrite + ПередЗаписью + + +
diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html new file mode 100644 index 000000000..b55c73755 --- /dev/null +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html @@ -0,0 +1,3 @@ + +

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

+

После этого в пути к тому указываем folder, например /home/shared

\ No newline at end of file diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..151b4aecb --- /dev/null +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,70 @@ +// Находит максимальный порядок среди томов +&НаСервере +Функция НайтиМаксимальныйПорядок() + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | МАКСИМУМ(Тома.ПорядокЗаполнения) КАК МаксимальныйНомер + |ИЗ + | Справочник.ТомаХраненияФайлов КАК Тома"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Если Выборка.МаксимальныйНомер = Null Тогда + Возврат 0; + Иначе + Возврат Число(Выборка.МаксимальныйНомер); + КонецЕсли; + КонецЕсли; + + Возврат 0; +КонецФункции // НайтиМаксимальныйПорядок + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если Объект.Ссылка.Пустая() Тогда + Объект.ПорядокЗаполнения = НайтиМаксимальныйПорядок() + 1; + КонецЕсли; + + Если НЕ Объект.Ссылка.Пустая() Тогда + Элементы.ПолныйПутьLinux.ОтображениеПредупрежденияПриРедактировании = ОтображениеПредупрежденияПриРедактировании.Отображать; + Элементы.ПолныйПутьWindows.ОтображениеПредупрежденияПриРедактировании = ОтображениеПредупрежденияПриРедактировании.Отображать; + + ТекущийРазмерВБайтах = РаботаСФайлами.ПодсчитатьРазмерФайловНаТоме(Объект.Ссылка); + ТекущийРазмер = ТекущийРазмерВБайтах / (1024 * 1024); + КонецЕсли; + + ТипПлатформыСервера = РаботаСФайламиПовтИсп.ТипПлатформыСервера(); + Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда + Элементы.ПолныйПутьWindows.АвтоОтметкаНезаполненного = Истина; + Иначе + Элементы.ПолныйПутьLinux.АвтоОтметкаНезаполненного = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) + + // Добавляем слэш в конце, если его нет + Если Не ПустаяСтрока(Объект.ПолныйПутьWindows) Тогда + Если Прав(Объект.ПолныйПутьWindows, 1) <> "\" Тогда + Объект.ПолныйПутьWindows = Объект.ПолныйПутьWindows + "\"; + КонецЕсли; + + Если Прав(Объект.ПолныйПутьWindows, 2) = "\\" Тогда + Объект.ПолныйПутьWindows = Лев(Объект.ПолныйПутьWindows, СтрДлина(Объект.ПолныйПутьWindows) - 1); + КонецЕсли; + КонецЕсли; + + // Добавляем слэш в конце, если его нет + Если Не ПустаяСтрока(Объект.ПолныйПутьLinux) Тогда + Если Прав(Объект.ПолныйПутьLinux, 1) <> "\" Тогда + Объект.ПолныйПутьLinux = Объект.ПолныйПутьLinux + "\"; + КонецЕсли; + + Если Прав(Объект.ПолныйПутьLinux, 2) = "\\" Тогда + Объект.ПолныйПутьLinux = Лев(Объект.ПолныйПутьLinux, СтрДлина(Объект.ПолныйПутьLinux) - 1); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html b/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html new file mode 100644 index 000000000..67f946e23 --- /dev/null +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html @@ -0,0 +1,12 @@ + +

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

+

Для каждого тома необходимо указать его наименование, порядок заполнения и UNC-путь к каталогу тома для сервера под управлением Microsoft Windows и/или путь к каталогу для сервера под управлением Linux.

+

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

+

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

+

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

+

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

+

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

+

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

+

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

\ No newline at end of file diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl b/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl new file mode 100644 index 000000000..fa84174e0 --- /dev/null +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl @@ -0,0 +1,103 @@ + +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + Если Не НомерПорядкаУникален(ПорядокЗаполнения, Ссылка) Тогда + Отказ = Истина; + + ТекстОшибки = НСтр("ru = 'Порядок заполнения не уникален - в системе уже есть том с таким порядком'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ЭтотОбъект, "ПорядокЗаполнения"); + КонецЕсли; + + Если ПустаяСтрока(ПолныйПутьWindows) И ПустаяСтрока(ПолныйПутьLinux) Тогда + ТекстОшибки = НСтр("ru = 'Не заполнен полный путь'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ЭтотОбъект, "ПолныйПутьWindows"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ЭтотОбъект, "ПолныйПутьLinux"); + Возврат; + КонецЕсли; + + Если Не ПустаяСтрока(ПолныйПутьWindows) И (Лев(ПолныйПутьWindows, 2) <> "\\" ИЛИ Найти(ПолныйПутьWindows, ":") <> 0) Тогда + Отказ = Истина; + + ТекстОшибки = НСтр("ru = 'Путь к тому должен быть в формате UNC (\\servername\resource) '"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ЭтотОбъект, "ПолныйПутьWindows"); + + Возврат; + КонецЕсли; + + ИмяПоляСПолнымПутем = ""; + Попытка + ПолныйПутьТома = ""; + + ТипПлатформыСервера = РаботаСФайламиПовтИсп.ТипПлатформыСервера(); + + Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда + ПолныйПутьТома = ПолныйПутьWindows; + ИмяПоляСПолнымПутем = "ПолныйПутьWindows"; + Иначе + ПолныйПутьТома = ПолныйПутьLinux; + ИмяПоляСПолнымПутем = "ПолныйПутьLinux"; + КонецЕсли; + + ИмяКаталогаТестовое = ПолныйПутьТома + "ПроверкаДоступа\"; + СоздатьКаталог(ИмяКаталогаТестовое); + УдалитьФайлы(ИмяКаталогаТестовое); + Исключение + Отказ = Истина; + + ТекстОшибки = НСтр("ru = 'Путь к тому некорректен: '"); + Информация = ИнформацияОбОшибке(); + Если Информация.Причина <> Неопределено Тогда + ТекстОшибки = ТекстОшибки + Информация.Причина.Описание; + + Если Информация.Причина.Причина <> Неопределено Тогда + ТекстОшибки = ТекстОшибки + ": " + Информация.Причина.Причина.Описание; + КонецЕсли; + Иначе + ТекстОшибки = ТекстОшибки + Информация.Описание; + КонецЕсли; + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ЭтотОбъект, ИмяПоляСПолнымПутем); + + КонецПопытки; + + Если МаксимальныйРазмер <> 0 Тогда + ТекущийРазмерВБайтах = 0; + Если Не Ссылка.Пустая() Тогда + ТекущийРазмерВБайтах = РаботаСФайлами.ПодсчитатьРазмерФайловНаТоме(Ссылка); + КонецЕсли; + ТекущийРазмер = ТекущийРазмерВБайтах / (1024 * 1024); + + Если МаксимальныйРазмер < ТекущийРазмер Тогда + Отказ = Истина; + + ТекстОшибки = НСтр("ru = 'Максимальный размер тома меньше, чем текущий размер'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ЭтотОбъект, "МаксимальныйРазмер"); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Возвращает Ложь, если есть том с таким порядком +Функция НомерПорядкаУникален(ПорядокЗаполнения, СсылкаНаТом) + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | КОЛИЧЕСТВО(Тома.ПорядокЗаполнения) КАК Количество + |ИЗ + | Справочник.ТомаХраненияФайлов КАК Тома + |ГДЕ + | Тома.ПорядокЗаполнения = &ПорядокЗаполнения + |И Тома.Ссылка <> &СсылкаНаТом"; + + Запрос.Параметры.Вставить("ПорядокЗаполнения", ПорядокЗаполнения); + Запрос.Параметры.Вставить("СсылкаНаТом", СсылкаНаТом); + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Если Выборка.Количество = 0 Тогда + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + Возврат Истина; +КонецФункции // НайтиМаксимальныйНомерВерсии diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/ТомаХраненияФайлов.mdo b/SSL/src/Catalogs/ТомаХраненияФайлов/ТомаХраненияФайлов.mdo new file mode 100644 index 000000000..436295261 --- /dev/null +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/ТомаХраненияФайлов.mdo @@ -0,0 +1,237 @@ + + + + + + + + + + ТомаХраненияФайлов + + ru + Тома хранения файлов + + Каталоги на диске для хранения файлов + true + Catalog.ТомаХраненияФайлов.StandardAttribute.Description + Catalog.ТомаХраненияФайлов.StandardAttribute.Code + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + true + + + ru + + + Managed + Use + + ru + Том хранения файлов + + 2 + true + 9 + 25 + String + Variable + true + true + AsDescription + InDialog + BothWays + Catalog.ТомаХраненияФайлов.Form.ФормаЭлемента + Catalog.ТомаХраненияФайлов.Form.ФормаСписка + + Комментарий + + ru + Комментарий + + Описание тома + + String + + + true + + + + Use + Use + + + МаксимальныйРазмер + + ru + Максимальный размер + + Максимальный размер файлов на томе, в Мб + + Number + + 10 + + + + + + Use + Use + + + ПолныйПутьLinux + + ru + Полный путь linux + + Полный путь - относительный + + String + + + + + + Use + Use + + + ПолныйПутьWindows + + ru + Полный путь windows + + Полный путь в UNC формате + + String + + + + + + Use + Use + + + ПорядокЗаполнения + + ru + Порядок заполнения + + Определяет порядок заполнения томов - начинаем с наименьшего + + Number + + 3 + true + + + + + + Index + Use + Use + + + ФормаЭлемента + + ru + Форма элемента + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Commands/ПроверкаУчетнойЗаписи/CommandModule.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Commands/ПроверкаУчетнойЗаписи/CommandModule.bsl new file mode 100644 index 000000000..d0d1d48f7 --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Commands/ПроверкаУчетнойЗаписи/CommandModule.bsl @@ -0,0 +1,7 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + РаботаСПочтовымиСообщениямиКлиент.ПроверитьУчетнуюЗапись(ПараметрКоманды); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Form.form new file mode 100644 index 000000000..f929e6df1 --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Form.form @@ -0,0 +1,1485 @@ + + + + НастройкаПортовСервера + 24 + + Порты + 26 + + ПортPOP3 + 12 + true + true + + true + + + ПортPOP3 + + + ПортPOP3РасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + ПортPOP3КонтекстноеМеню + 13 + true + + InputField + Enter + true + Left + true + + 6 + true + true + false + true + true + true + Normal + + + + ПортSMTP + 14 + true + true + + true + + + ПортSMTP + + Left + + ПортSMTPРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + ПортSMTPКонтекстноеМеню + 15 + true + + InputField + Enter + true + Left + true + + 6 + true + true + false + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Порты</value> + + + ru + Порты + + + ПортыРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаУстановитьПоУмолчанию + 60 + + УстановитьПортыПоУмолчанию + 25 + true + true + + true + + false + + УстановитьПортыПоУмолчаниюРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + Form.Command.УстановитьПортыПоУмолчанию + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа установить по умолчанию</value> + + + ru + Группа установить по умолчанию + + + ГруппаУстановитьПоУмолчаниюРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Порты сервера</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + Настройка портов сервера + + + НастройкаПортовСервераРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + auto + Auto + Auto + + + + Дополнительно + 55 + + ГруппаPOP3Аутентификация + 56 + + СпособPOP3Аутентификации + 48 + true + true + + true + + + СпособPOP3Аутентификации + + + СпособPOP3АутентификацииРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + СпособPOP3АутентификацииКонтекстноеМеню + 49 + true + + InputField + Enter + true + Left + true + + 16 + true + true + true + false + true + true + true + + + ru + APOP + + + Enum.СпособыPOP3Аутентификации.EnumValue.APOP + + + + + ru + Cram MD5 + + + Enum.СпособыPOP3Аутентификации.EnumValue.CramMD5 + + + + + ru + Обычная + + + Enum.СпособыPOP3Аутентификации.EnumValue.Обычная + + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа POP3 аутентификация</value> + + + ru + Группа POP3 аутентификация + + + ГруппаPOP3АутентификацияРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + + ГруппаОставлятьКопииСообщенийНаСервере + 54 + + ОставлятьКопииСообщенийНаСервере + 52 + true + true + + true + + + ОставлятьКопииСообщенийНаСервере + + Right + + OnChange + ОставлятьКопииСообщенийНаСервереПриИзменении + + + ОставлятьКопииСообщенийНаСервереРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + + ОставлятьКопииСообщенийНаСервереКонтекстноеМеню + 53 + true + + CheckBoxField + Enter + true + Left + true + + + + ОставлятьКопииСообщенийЧислоДней + 50 + + <key>ru</key> + <value>Удалять собщения с сервера через n дней</value> + + true + true + + true + + + ОставлятьКопииСообщенийЧислоДней + + + ru + Оставлять копии сообщений на сервере + + + ОставлятьКопииСообщенийЧислоДнейРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ОставлятьКопииСообщенийЧислоДнейКонтекстноеМеню + 51 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + + 1 + + + 600 + + Normal + + + true + true + + true + + + ГруппаОставлятьКопииСообщенийНаСервереРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаДлительностьОжидания + 57 + + ДлительностьОжиданияСервера + 28 + true + true + + true + + + ДлительностьОжиданияСервера + + + ДлительностьОжиданияСервераРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + ДлительностьОжиданияСервераКонтекстноеМеню + 29 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа длительность ожидания</value> + + + ru + Группа длительность ожидания + + + ГруппаДлительностьОжиданияРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + СерверИсходящейПочты + 16 + + SMTPАутентификацияУстановлена + 22 + true + true + + true + + + SMTPАутентификацияУстановлена + + Right + + OnChange + SMTPАутентификацияУстановленаПриИзменении + + + SMTPАутентификацияУстановленаРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + SMTPАутентификацияУстановленаКонтекстноеМеню + 23 + true + + CheckBoxField + Enter + true + Left + true + + + + SMTPАутентификация + 38 + true + true + + true + + + SMTPАутентификация + + None + + OnChange + SMTPАутентификацияПриИзменении + + + SMTPАутентификацияРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + + SMTPАутентификацияКонтекстноеМеню + 39 + true + + RadioButtonField + Left + Enter + true + Left + true + + 1 + + + ru + Аналогично серверу входящей почты + + + Enum.ВариантыSMTPАутентификации.EnumValue.АналогичноPOP3 + + + + + ru + Задать параметры аутентификации + + + Enum.ВариантыSMTPАутентификации.EnumValue.ЗадаетсяПараметрами + + + + + ru + Зайти на сервер входящей почты перед отправкой + + + Enum.ВариантыSMTPАутентификации.EnumValue.POP3ПередSMTP + + + Vertical + + + + ГруппаАутентификацияSMTP + 40 + + ГруппаПустаяСтраница + 44 + + ПустоеПоле + 45 + true + true + + true + + + ПустойРеквизит + + None + + ПустоеПолеРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + + ПустоеПолеКонтекстноеМеню + 46 + true + + LabelField + Enter + true + Left + true + + 20 + true + true + false + + + true + true + + true + + + <key>ru</key> + <value>Группа пустая страница</value> + + + ru + Группа пустая страница + + + ГруппаПустаяСтраницаРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ГруппаПараметры + 1 + + ПользовательSMTP + 4 + true + true + + true + + + ПользовательSMTP + + + ПользовательSMTPРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + + ПользовательSMTPКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + 15 + true + true + true + true + true + true + Normal + + + + ПарольSMTP + 2 + true + true + + true + + + ПарольSMTP + + + ПарольSMTPРасширеннаяПодсказка + 96 + Label + true + true + + Left + + + + ПарольSMTPКонтекстноеМеню + 3 + true + + InputField + Enter + true + Left + true + + 15 + true + true + true + true + true + true + true + Normal + + + + СпособSMTPАутентификации + 6 + true + true + + true + + + СпособSMTPАутентификации + + + СпособSMTPАутентификацииРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + + СпособSMTPАутентификацииКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + 15 + true + true + true + true + true + true + true + + + ru + CramMD5 + + + Enum.СпособыSMTPАутентификации.EnumValue.CramMD5 + + + + + ru + Login + + + Enum.СпособыSMTPАутентификации.EnumValue.Login + + + + + ru + Plain + + + Enum.СпособыSMTPАутентификации.EnumValue.Plain + + + + + ru + По умолчанию + + + Enum.СпособыSMTPАутентификации.EnumValue.ПоУмолчанию + + + Normal + + + true + true + + true + + + <key>ru</key> + <value>STMP аутентификация</value> + + + ru + Требуется STMP аутентификация + + + ГруппаПараметрыРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Группа аутентификация SMTP</value> + + + ru + Группа аутентификация SMTP + + + ГруппаАутентификацияSMTPРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Сервер исходящей почты</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + Сервер исходящей почты + + + СерверИсходящейПочтыРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Дополнительно</value> + + + ru + Дополнительно + + + ДополнительноРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ОК + 8 + true + true + + true + + false + + ОКРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + Form.Command.ЗаполнитьДопПараметрыИВернуться + Auto + true + true + true + UserCmds + Auto + + + Отмена + 10 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 9 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + СпособSMTPАутентификации + + <key>ru</key> + <value>Способ SMTP аутентификации</value> + + 1 + + EnumRef.СпособыSMTPАутентификации + + + true + + + true + + + + ПользовательSMTP + + <key>ru</key> + <value>Пользователь SMTP</value> + + 2 + + String + + + + true + + + true + + + + ПарольSMTP + + <key>ru</key> + <value>Пароль SMTP</value> + + 3 + + String + + + + true + + + true + + + + ПортSMTP + + <key>ru</key> + <value>SMTP-сервер</value> + + 4 + + String + + + + true + + + true + + + + ПортPOP3 + + <key>ru</key> + <value>POP3-сервер</value> + + 5 + + String + + + + true + + + true + + + + СпособPOP3Аутентификации + + <key>ru</key> + <value>POP3 аутентификация</value> + + 6 + + EnumRef.СпособыPOP3Аутентификации + + + true + + + true + + + + SMTPАутентификацияУстановлена + + <key>ru</key> + <value>SMTP серверу требуется проверка подлинности</value> + + 7 + + Boolean + + + true + + + true + + + + ДлительностьОжиданияСервера + + <key>ru</key> + <value>Длительность ожидания сервера (сек)</value> + + 8 + + Number + + 3 + true + + + + true + + + true + + ShowError + + + ОставлятьКопииСообщенийЧислоДней + + <key>ru</key> + <value>Оставлять копии сообщений</value> + + 9 + + Number + + 3 + true + + + + true + + + true + + + + Подпись + + <key>ru</key> + <value>Подпись</value> + + 11 + + String + + + + true + + + true + + + + SMTPАутентификация + + <key>ru</key> + <value>SMTPАутентификация</value> + + 13 + + EnumRef.ВариантыSMTPАутентификации + + + true + + + true + + + + ПодписьДлительностьОжидания + + <key>ru</key> + <value>Подпись длительность ожидания</value> + + 14 + + String + + + + true + + + true + + + + ПустойРеквизит + + <key>ru</key> + <value>Пустой реквизит</value> + + 15 + + String + + + + true + + + true + + + + ОставлятьКопииСообщенийНаСервере + + <key>ru</key> + <value>Оставлять копии сообщений на сервере</value> + + 10 + + Boolean + + + true + + + true + + + + СписокSMTPАутентификация_СП + + <key>ru</key> + <value>Список значений перечислений SMTPАутентификация. Используется для оптимизации обращений к перечислению SMTPАутентификация.</value> + + 12 + + ValueList + + + true + + + true + + + + + + + СписокСпособSMTPАутентификации_СП + + <key>ru</key> + <value>Список способ SMTPАутентификации СП</value> + + 16 + + ValueList + + + true + + + true + + + + + + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 17 + + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + + true + + + true + + + + ЗаполнитьДопПараметрыИВернуться + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + Сохранить параметры и вернуться к основной форме + + + true + + + + ЗаполнитьДопПараметрыИВернутьсяВыполнить + + + Auto + Auto + + + УстановитьПортыПоУмолчанию + + <key>ru</key> + <value>Установить по умолчанию</value> + + 2 + + ru + Установить порты по умолчанию + + + true + + + + УстановитьПортыПоУмолчаниюВыполнить + + + Auto + Auto + + + Ссылка + + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + + + + + + diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Help/ru.html b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Help/ru.html new file mode 100644 index 000000000..808096f90 --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Help/ru.html @@ -0,0 +1,15 @@ + +

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

+
  • Общие +
    • POP3 аутентификация - настройка аутентификации на сервере POP3 (сервер входящих сообщений)
  • Сервер исходящей почты - настройка аутентификации на сервере SMTP +
    • SMTP серверу требуется проверка подлинности - если флаг установлен, серверу SMTP требуется дополнительная проверка подлинности, при этом появляется возможность выбора способа аутентификации: +
      • Аналогично серверу входящей почты - параметры аутентификации (пользователь и пароль) берутся из параметров аутентификации для сервера входящей почты, при этом тип SMTP аутентификации указывается "по умолчанию" +
      • Задать параметры аутентификации - параметры аутентификации задаются вручную: +
        • Пользователь SMTP +
        • Пароль SMTP +
        • Тип аутентификации на SMTP сервере
      • Зайти на сервер входящей почты перед отправкой
  • Дополнительно - настройка портов сервера POP3 и сервера SMTP, времени ожидания успешного завершения операции, а так же число дней по истечению которых сообщение необходимо удалять с сервера +
    • Настройка портов сервера / POP3-Сервер - порт сервера POP3 +
    • Настройка портов сервера / SMTP-Сервер - порт сервера SMTP +
    • Длительность ожидания сервера - определяет время ожидания удачного исполнения операции в секундах +
    • Оставлять копии сообщений на сервере - определяет необходимость оставлять сообщения на сервере +
      • оставлять копии сообщений <дней> - число дней, которое сообщение будет храниться на сервере.
        Сообщения с истекшим сроком хранения удаляются при попытке получить новые сообщения, при этом они не передаются, как часть входящих сообщений.
\ No newline at end of file diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Module.bsl new file mode 100644 index 000000000..fa892f5de --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Module.bsl @@ -0,0 +1,309 @@ +//////////////////////////////////////////////////////////////////////////////// +// МОДУЛЬ ФОРМЫ ЭЛЕМЕНТА СПРАВОЧНИКА УЧЕТНЫЕ ЗАПИСИ ЭЛЕКТРОННОЙ ПОЧТЫ // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ ОБРАБОТЧИКОВ СОБЫТИЙ ФОРМЫ И ЭЛЕМЕНТОВ ФОРМЫ +// + +// Обработчик события "при создании на сервере" формы +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Ссылка = Параметры.Ссылка; + + Заполнить_СписокSMTPАутентификация_СП(); + Заполнить_СписокСпособSMTPАутентификации_СП(); + + УчетнаяЗаписьСтруктура = Параметры.УчетнаяЗаписьСтруктура; + + ДлительностьОжиданияСервера = УчетнаяЗаписьСтруктура.ВремяОжидания; + + ОставлятьКопииСообщенийНаСервере = УчетнаяЗаписьСтруктура.ОставлятьКопииСообщенийНаСервере; + ОставлятьКопииСообщенийЧислоДней = УчетнаяЗаписьСтруктура.ПериодХраненияСообщенийНаСервере; + + ПортSMTP = УчетнаяЗаписьСтруктура.ПортSMTP; + ПортPOP3 = УчетнаяЗаписьСтруктура.ПортPOP3; + + СпособPOP3Аутентификации = УчетнаяЗаписьСтруктура.СпособPOP3Аутентификации; + + СпособSMTPАутентификации = УчетнаяЗаписьСтруктура.СпособSMTPАутентификации; + ПользовательSMTP = УчетнаяЗаписьСтруктура.ПользовательSMTP; + ПарольSMTP = УчетнаяЗаписьСтруктура.ПарольSMTP; + + SMTPАутентификация = УчетнаяЗаписьСтруктура.SMTPАутентификация; + + SMTPАутентификацияУстановлена = ?(SMTPАутентификация = Перечисления.ВариантыSMTPАутентификации.НеЗадано, Ложь, Истина); + + ПодготовитьФорму(); + +КонецПроцедуры + +// Обработчик события "при изменении" элемента формы "SMTPАутентификация". +// Вызывает процедуру обновления группы дополнительных параметров +// аутентификации. +// +&НаКлиенте +Процедура SMTPАутентификацияПриИзменении(Элемент) + + УстановитьДополнительныеПараметрыПоSMTPАутентификации(); + +КонецПроцедуры + +// Обработчик события "при изменении" элемента формы "ТребуетсяДополнительнаяSMTPАутентификация". +// Устанавливает параметры аутентификации "по умолчанию", а так же +// снимает их при снятии флага необходимости дополнительной SMTP аутентификации. +// +&НаКлиенте +Процедура SMTPАутентификацияУстановленаПриИзменении(Элемент) + + Если SMTPАутентификацияУстановлена Тогда + Элементы.SMTPАутентификация.Доступность = Истина; + СпособSMTPАутентификации = ?(СпособSMTPАутентификации = СпособSMTPАутентификации_БезАутентификации(), + СпособSMTPАутентификации_ПоУмолчанию(), + СпособSMTPАутентификации); + SMTPАутентификация = SMTPАутентификация_АналогичноPOP3(); + УстановитьДополнительныеПараметрыПоSMTPАутентификации(); + Иначе + Элементы.SMTPАутентификация.Доступность = Ложь; + SMTPАутентификация = SMTPАутентификация_НеЗадано(); + СпособSMTPАутентификации = СпособSMTPАутентификации_БезАутентификации(); + УстановитьДополнительныеПараметрыПоSMTPАутентификации(); + КонецЕсли; + +КонецПроцедуры + + +// Обработчик события нажатия на кнопку "УстановитьПортыПоУмолчанию". +// Устанавливает порты POP3 и SMTP серверов по умолчанию: +// для SMTP - 25, для POP3 - 110. +// +&НаКлиенте +Процедура УстановитьПортыПоУмолчаниюВыполнить() + + ПортSMTP = 25; + ПортPOP3 = 110; + +КонецПроцедуры + +// Обработчик события "при изменении" элемента формы "ОставлятьКопииСообщенийНаСервере". +// +&НаКлиенте +Процедура ОставлятьКопииСообщенийНаСервереПриИзменении(Элемент) + + Если ОставлятьКопииСообщенийНаСервере Тогда + Элементы.ОставлятьКопииСообщенийЧислоДней.Доступность = Истина; + Иначе + Элементы.ОставлятьКопииСообщенийЧислоДней.Доступность = Ложь; + КонецЕсли; + +КонецПроцедуры + +// Обработчик события нажатия на кнопку "ЗаполнитьДопПараметрыИВернуться". +// Выполняет проверку корректности значений реквизитов формы и возвращает +// управление в вызывающую среду с дополнительными заполненными параметрами +// учетной записи. +// +&НаКлиенте +Процедура ЗаполнитьДопПараметрыИВернутьсяВыполнить() + + Если SMTPАутентификацияУстановлена + И SMTPАутентификация <> SMTPАутентификация_АналогичноPOP3() + И SMTPАутентификация <> SMTPАутентификация_ЗадаетсяПараметрами() + И SMTPАутентификация <> SMTPАутентификация_POP3ПередSMTP() Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Необходимо выбрать способ SMTP аутентификации'"), , + "SMTPАутентификация"); + Возврат; + КонецЕсли; + + Оповестить("УстановкаДополнительныхПараметровУчетнойЗаписи", ЗаполнитьДополнительныеПараметры(), Ссылка); + + Закрыть(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ СЕРВИСНЫХ ФУНКЦИЙ +// + +// Функция, формирующая параметры настроек перед передачей их в вызывающую среду. +// +// Возвращаемое значение: +// структура +// ключ "ПортSMTP", значение - число, порт SMTP +// ключ "ПортPOP3", значение - число, порт POP3 +// ключ "ОставлятьКопииСообщенийНаСервере" - булево - признак того, что необходимо оставлять на сервере сообщения +// ключ "ПериодХраненияСообщенийНаСервере" - число - число дней, которое сообщение должно храниться на сервере +// ключ "ДлительностьОжиданияСервера", значение - число секунд ожидания успешного выполнения операции на сервере +// ключ "SMTPАутентификация", Перечисление.SMTPАутентификация +// ключ "ПользовательSMTP", значение - строка, имя пользователя SMTP аутентификации +// ключ "ПарольSMTP", значение - строка, пароль SMTP аутентификации +// ключ "СпособSMTPАутентификации"*, Перечисление.СпособSMTPАутентификации +// +// ключ "СпособPOP3Аутентификации" - Перечисление.СпособPOP3Аутентификации +// +// *- при аутентификации "АналогичноPOP3" тип аутентификации не устанавливается, +// тем не менее происходит его копирование +// +// Все поля, при любых параметрах аутентификации заполняются. Таким образом в вызывающей +// среде остается только взять их как есть без дополнительной обработки. +// +&НаКлиенте +Функция ЗаполнитьДополнительныеПараметры() + + Результат = Новый Структура; + + Результат.Вставить("ПортSMTP", ПортSMTP); + Результат.Вставить("ПортPOP3", ПортPOP3); + + Результат.Вставить("ОставлятьКопииСообщенийНаСервере", ОставлятьКопииСообщенийНаСервере); + ОставлятьКопииСообщенийЧислоДней = ?(ОставлятьКопииСообщенийНаСервере, + ОставлятьКопииСообщенийЧислоДней, + 0); + Результат.Вставить("ПериодХраненияСообщенийНаСервере", ОставлятьКопииСообщенийЧислоДней); + + Результат.Вставить("ДлительностьОжиданияСервера", ДлительностьОжиданияСервера); + + Если SMTPАутентификацияУстановлена Тогда + Результат.Вставить("SMTPАутентификация", SMTPАутентификация); + Если SMTPАутентификация = (SMTPАутентификация_ЗадаетсяПараметрами()) Тогда + Результат.Вставить("ПользовательSMTP", ПользовательSMTP); + Результат.Вставить("ПарольSMTP", ПарольSMTP); + Результат.Вставить("СпособSMTPАутентификации", СпособSMTPАутентификации); + Иначе + Результат.Вставить("ПользовательSMTP", ""); + Результат.Вставить("ПарольSMTP", ""); + Результат.Вставить("СпособSMTPАутентификации", СпособSMTPАутентификации_БезАутентификации()); + КонецЕсли; + Иначе + Результат.Вставить("SMTPАутентификация", SMTPАутентификация_НеЗадано()); + Результат.Вставить("ПользовательSMTP", ""); + Результат.Вставить("ПарольSMTP", ""); + Результат.Вставить("СпособSMTPАутентификации", СпособSMTPАутентификации_БезАутентификации()); + КонецЕсли; + + Результат.Вставить("СпособPOP3Аутентификации", СпособPOP3Аутентификации); + + Возврат Результат; + +КонецФункции + +// Подготавливает форму к использованию - заполняет всевозможные +// списки выбора, устаенавливает доступность элементов, значения +// по умолчанию. Не заполняет реквизиты формы по переданным параметрам. +// +&НаСервере +Процедура ПодготовитьФорму() + + Если SMTPАутентификацияУстановлена Тогда + Элементы.SMTPАутентификация.Доступность = Истина; + Иначе + Элементы.SMTPАутентификация.Доступность = Ложь; + КонецЕсли; + + Если ОставлятьКопииСообщенийНаСервере Тогда + Элементы.ОставлятьКопииСообщенийЧислоДней.Доступность = Истина; + Иначе + Элементы.ОставлятьКопииСообщенийЧислоДней.Доступность = Ложь; + КонецЕсли; + + Элементы.ГруппаАутентификацияSMTP.ТекущаяСтраница = ?(SMTPАутентификация = Перечисления.ВариантыSMTPАутентификации.ЗадаетсяПараметрами, + Элементы.ГруппаПараметры, + Элементы.ГруппаПустаяСтраница); + +КонецПроцедуры + +// Процедура устанавливает видимость парметров аутентификации +// для выбора способа аутентификации "ЗаданыПараметры". +// +&НаКлиенте +Процедура УстановитьДополнительныеПараметрыПоSMTPАутентификации() + + Элементы.ГруппаАутентификацияSMTP.ТекущаяСтраница = + ?(SMTPАутентификация = SMTPАутентификация_ЗадаетсяПараметрами(), + Элементы.ГруппаПараметры, + Элементы.ГруппаПустаяСтраница); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// БЛОК СЛУЖЕБНЫХ ФУНКЦИЙ ДЛЯ ОПТИМИЗАЦИИ ОБРАЩЕНИЯ К ПЕРЕЧИСЛЕНИЯМ +// - SMTPАутентификация +// - СпособPOP3Аутентификации +// - СпособSMTPАутентификации +// ИЗ КЛИЕНТСКИХ ПРОЦЕДУР +// + +&НаСервере +Функция Заполнить_СписокSMTPАутентификация_СП() + + СписокSMTPАутентификация_СП.Добавить(Перечисления.ВариантыSMTPАутентификации.POP3ПередSMTP, + "POP3ПередSMTP"); + СписокSMTPАутентификация_СП.Добавить(Перечисления.ВариантыSMTPАутентификации.АналогичноPOP3, + "АналогичноPOP3"); + СписокSMTPАутентификация_СП.Добавить(Перечисления.ВариантыSMTPАутентификации.ЗадаетсяПараметрами, + "ЗадаетсяПараметрами"); + СписокSMTPАутентификация_СП.Добавить(Перечисления.ВариантыSMTPАутентификации.НеЗадано, + "НеЗадано"); + +КонецФункции + +&НаКлиенте +Функция SMTPАутентификация_POP3ПередSMTP() + + Возврат СписокSMTPАутентификация_СП[0].Значение; + +КонецФункции + +&НаКлиенте +Функция SMTPАутентификация_АналогичноPOP3() + + Возврат СписокSMTPАутентификация_СП[1].Значение; + +КонецФункции + +&НаКлиенте +Функция SMTPАутентификация_ЗадаетсяПараметрами() + + Возврат СписокSMTPАутентификация_СП[2].Значение; + +КонецФункции + +&НаКлиенте +Функция SMTPАутентификация_НеЗадано() + + Возврат СписокSMTPАутентификация_СП[3].Значение; + +КонецФункции + +&НаСервере +Функция Заполнить_СписокСпособSMTPАутентификации_СП() + + СписокСпособSMTPАутентификации_СП.Добавить(Перечисления.СпособыSMTPАутентификации.CramMD5, + "CramMD5"); + СписокСпособSMTPАутентификации_СП.Добавить(Перечисления.СпособыSMTPАутентификации.Login, + "Login"); + СписокСпособSMTPАутентификации_СП.Добавить(Перечисления.СпособыSMTPАутентификации.Plain, + "Plain"); + СписокСпособSMTPАутентификации_СП.Добавить(Перечисления.СпособыSMTPАутентификации.БезАутентификации, + "БезАутентификации"); + СписокСпособSMTPАутентификации_СП.Добавить(Перечисления.СпособыSMTPАутентификации.ПоУмолчанию, + "ПоУмолчанию"); + +КонецФункции + +&НаКлиенте +Функция СпособSMTPАутентификации_БезАутентификации() + + Возврат СписокСпособSMTPАутентификации_СП[3].Значение; + +КонецФункции + +&НаКлиенте +Функция СпособSMTPАутентификации_ПоУмолчанию() + + Возврат СписокСпособSMTPАутентификации_СП[4].Значение; + +КонецФункции diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..31f1a12b2 --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form @@ -0,0 +1,325 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 4 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + 30 + true + true + true + true + true + true + Normal + + + + ИмяПользователя + 6 + + <key>ru</key> + <value>Имя пользователя</value> + + true + true + + true + + + Список.ИмяПользователя + + + ИмяПользователяРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ИмяПользователяКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + 20 + true + true + true + true + true + Normal + + + + АдресЭлектроннойПочты + 8 + + <key>ru</key> + <value>Адрес электронной почты</value> + + true + true + + true + + + Список.АдресЭлектроннойПочты + + + АдресЭлектроннойПочтыРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + АдресЭлектроннойПочтыКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + 20 + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 11 + + СписокСтрокаПоискаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 12 + true + + Список + + true + + + + СписокСостояниеПросмотра + 14 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 15 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 17 + + СписокУправлениеПоискомРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 18 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
true
+ 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
+ + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
true
+ + Catalog.УчетныеЗаписиЭлектроннойПочты + true + true + true + true + +
+ + + + + +
diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..ff7469fee --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,932 @@ + + + + Наименование + 1 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Объект.Description + + Left + + ru + Наименование учетной записи + + + НаименованиеРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 2 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + Normal + + + + ОбщаяГруппировка + 49 + + Основное + 35 + + СведенияОПользователе + 31 + + ИмяПользователя + 3 + + <key>ru</key> + <value>Имя </value> + + true + true + + true + + + Объект.ИмяПользователя + + + ИмяПользователяРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + ИмяПользователяКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + 15 + true + true + false + true + true + true + Normal + + + + АдресЭлектроннойПочты + 5 + + <key>ru</key> + <value>Почтовый адрес</value> + + true + true + + true + + + Объект.АдресЭлектроннойПочты + + + АдресЭлектроннойПочтыРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + АдресЭлектроннойПочтыКонтекстноеМеню + 6 + true + + InputField + true + Enter + true + Left + true + + 15 + true + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Сведения о пользователе</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + Сведения о пользователе + + + СведенияОПользователеРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + ПользовательПароль + 40 + + Пользователь + 15 + true + true + + true + + + Объект.Пользователь + + + ПользовательРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + ПользовательКонтекстноеМеню + 16 + true + + InputField + true + Enter + true + Left + true + + 15 + true + true + false + true + true + true + true + Normal + + + + Пароль + 17 + true + true + + true + + + Объект.Пароль + + + ПарольРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + ПарольКонтекстноеМеню + 18 + true + + InputField + Enter + true + Left + true + + 15 + true + true + false + true + true + true + true + Normal + + + + ЗапомнитьПароль + 36 + true + true + + true + + + ЗапомнитьПароль + + Right + + ru + Запомнить пароль в учетной записи + + + ЗапомнитьПарольРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + + ЗапомнитьПарольКонтекстноеМеню + 37 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Аутентификация</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + ыв + + + ПользовательПарольРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Основное</value> + + + ru + Основное + + + ОсновноеРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Аутентификация + 27 + + СведенияОСервере + 28 + + POP3Сервер + 9 + true + true + + true + + + Объект.POP3Сервер + + + POP3СерверРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + POP3СерверКонтекстноеМеню + 10 + true + + InputField + Enter + true + Left + true + + 15 + true + true + false + true + true + true + Normal + + + + SMTPСервер + 7 + true + true + + true + + + Объект.SMTPСервер + + + SMTPСерверРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + SMTPСерверКонтекстноеМеню + 8 + true + + InputField + true + Enter + true + Left + true + + 15 + true + true + false + true + true + true + true + Normal + + + + ДополнительныеНастройкиСервераПочты + 50 + true + true + + true + + false + + ДополнительныеНастройкиСервераПочтыРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + Hyperlink + Form.Command.ДополнительныеНастройки + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Сведения о сервере почты</value> + + + System.DefaultGUIFont + true + false + false + false + + + СведенияОСервереРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + ДополнительныеПараметрыУчетнойЗаписи + 57 + + ИспользованиеУчетнойЗаписи + 58 + + ИспользоватьДляОтправки + 51 + true + true + + true + + + Объект.ИспользоватьДляОтправки + + Right + + ИспользоватьДляОтправкиРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + ИспользоватьДляОтправкиКонтекстноеМеню + 52 + true + + CheckBoxField + Enter + true + Left + true + + + + ИспользоватьДляПолучения + 53 + true + true + + true + + + Объект.ИспользоватьДляПолучения + + Right + + ИспользоватьДляПолученияРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + ИспользоватьДляПолученияКонтекстноеМеню + 54 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Использование учетной записи</value> + + + ru + Использование учетной записи + + + ИспользованиеУчетнойЗаписиРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + UsualGroup + + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ВПредставлениеВключатьИмяПользователя + 55 + true + true + + true + + + Объект.ВПредставлениеВключатьИмяПользователя + + Right + + ВПредставлениеВключатьИмяПользователяРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + ВПредставлениеВключатьИмяПользователяКонтекстноеМеню + 56 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Дополнительные параметры учетной записи</value> + + + ru + Дополнительные параметры учетной записи + + + ДополнительныеПараметрыУчетнойЗаписиРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Аутентификация</value> + + + System.DefaultGUIFont + true + false + false + false + + true + + АутентификацияРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Общая группировка</value> + + + ru + Общая группировка + + + ОбщаяГруппировкаРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ОтветственныйЗаОбработкуПисем + 59 + + <key>ru</key> + <value>Ответственный</value> + + true + true + + true + + + Объект.ОтветственныйЗаОбработкуПисем + + + ОтветственныйЗаОбработкуПисемРасширеннаяПодсказка + 92 + Label + true + true + + Left + + + + ОтветственныйЗаОбработкуПисемКонтекстноеМеню + 60 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.УчетныеЗаписиЭлектроннойПочты + + + true + + + true + +
true
+ true +
+ + ЗапомнитьПароль + + <key>ru</key> + <value>Запомнить пароль</value> + + 2 + + Boolean + + + true + + + true + + + + ДополнительныеНастройки + + <key>ru</key> + <value>Дополнительные настройки сервера почты</value> + + 2 + + ru + Редактировать дополнительные настройки почтового сервера + + + true + + + + ДополнительныеНастройкиВыполнить + + + Auto + Auto + + + + + + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + +
diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html new file mode 100644 index 000000000..55177be48 --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html @@ -0,0 +1,11 @@ + +

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

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

    +
  • POP3 сервер - адрес POP3 сервера (сервера входящих сообщений) +
  • SMTP сервер - адрес SMTP сервера (сервера исходящих сообщений)
  • Аутентификация:

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

    +

    Флажок "Учетная запись используется только для отправки сообщений" устанавливается для тех системных учетных записей, которые предназначены только для рассылки системных сообщений.

    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..0446a054d --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,87 @@ +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ ОБРАБОТЧИКОВ СОБЫТИЙ ФОРМЫ И ЭЛЕМЕНТОВ ФОРМЫ +// + +// Обработчик события "при создании на сервере" формы +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Объект.Пароль) Тогда + ЗапомнитьПароль = Истина; + КонецЕсли; + + // Если используется только подсистема работы с почтовыми сообщениями + // скрываем неиспользуемые элементы + Если Метаданные.ОбщиеМодули.Найти("УправлениеЭлектроннойПочтой") = Неопределено Тогда + Элементы.ВПредставлениеВключатьИмяПользователя.Видимость = Ложь; + КонецЕсли; + + Если Объект.Ссылка.Пустая() Тогда + Объект.ИспользоватьДляОтправки = Истина; + Объект.ИспользоватьДляПолучения = Истина; + КонецЕсли; + +КонецПроцедуры + +// Обработчик события "перед записью на сервере" формы +// +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект) + + Если НЕ ЗапомнитьПароль Тогда + ТекущийОбъект.Пароль = ""; + КонецЕсли; + + Если Объект.SMTPАутентификация <> Перечисления.ВариантыSMTPАутентификации.ЗадаетсяПараметрами Тогда + Объект.ПользовательSMTP = ""; + Объект.ПарольSMTP = ""; + КонецЕсли; + +КонецПроцедуры + +// Обработчик события нажатия на кнопку "Дополнительно" формы +// +&НаКлиенте +Процедура ДополнительныеНастройкиВыполнить() + + УчетнаяЗаписьСтруктура = Новый Структура; + УчетнаяЗаписьСтруктура.Вставить("ВремяОжидания", Объект.ВремяОжидания); + УчетнаяЗаписьСтруктура.Вставить("ОставлятьКопииСообщенийНаСервере", Объект.ОставлятьКопииСообщенийНаСервере); + УчетнаяЗаписьСтруктура.Вставить("ПериодХраненияСообщенийНаСервере", Объект.ПериодХраненияСообщенийНаСервере); + УчетнаяЗаписьСтруктура.Вставить("ПользовательSMTP", Объект.ПользовательSMTP); + УчетнаяЗаписьСтруктура.Вставить("ПарольSMTP", Объект.ПарольSMTP); + УчетнаяЗаписьСтруктура.Вставить("ПортPOP3", Объект.ПортPOP3); + УчетнаяЗаписьСтруктура.Вставить("ПортSMTP", Объект.ПортSMTP); + УчетнаяЗаписьСтруктура.Вставить("SMTPАутентификация", Объект.SMTPАутентификация); + УчетнаяЗаписьСтруктура.Вставить("СпособSMTPАутентификации", Объект.СпособSMTPАутентификации); + УчетнаяЗаписьСтруктура.Вставить("СпособPOP3Аутентификации", Объект.СпособPOP3Аутентификации); + + ПараметрыВызова = Новый Структура("Ссылка, УчетнаяЗаписьСтруктура", Объект.Ссылка, УчетнаяЗаписьСтруктура); + + ОткрытьФорму("Справочник.УчетныеЗаписиЭлектроннойПочты.Форма.ДополнительныеСвойстваУчетнойЗаписи", ПараметрыВызова); + + +КонецПроцедуры + +// Обрабатывает оповещение, от формы настройки дополнительных свойств учетной записи, +// содержащее некоторые настройки учетной записи. +// +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "УстановкаДополнительныхПараметровУчетнойЗаписи" И Источник = Объект.Ссылка Тогда + Объект.ВремяОжидания = Параметр.ДлительностьОжиданияСервера; + Объект.ОставлятьКопииСообщенийНаСервере = Параметр.ОставлятьКопииСообщенийНаСервере; + Объект.ПериодХраненияСообщенийНаСервере = Параметр.ПериодХраненияСообщенийНаСервере; + Объект.ПользовательSMTP = Параметр.ПользовательSMTP; + Объект.ПарольSMTP = Параметр.ПарольSMTP; + Объект.ПортPOP3 = Параметр.ПортPOP3; + Объект.ПортSMTP = Параметр.ПортSMTP; + Объект.SMTPАутентификация = Параметр.SMTPАутентификация; + Объект.СпособSMTPАутентификации = Параметр.СпособSMTPАутентификации; + Объект.СпособPOP3Аутентификации = Параметр.СпособPOP3Аутентификации; + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Help/ru.html b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Help/ru.html new file mode 100644 index 000000000..91d460b8b --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Help/ru.html @@ -0,0 +1,3 @@ + +

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

    +

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

    \ 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..e69de29bb diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl new file mode 100644 index 000000000..07358547d --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl @@ -0,0 +1,24 @@ + +Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) + + ЗаполнитьОбъектЗначениямиПоУмолчанию(); + +КонецПроцедуры + +Процедура ЗаполнитьОбъектЗначениямиПоУмолчанию() Экспорт + + ИмяПользователя = "1С:Предприятие"; + SMTPАутентификация = Перечисления.ВариантыSMTPАутентификации.НеЗадано; + ИспользоватьДляПолучения = Ложь; + ОставлятьКопииСообщенийНаСервере = Ложь; + ПериодХраненияСообщенийНаСервере = 0; + ВремяОжидания = 30; + SMTPАутентификация = Перечисления.ВариантыSMTPАутентификации.НеЗадано; + СпособSMTPАутентификации = Перечисления.СпособыSMTPАутентификации.БезАутентификации; + СпособPOP3Аутентификации = Перечисления.СпособыPOP3Аутентификации.Обычная; + ПользовательSMTP = ""; + ПарольSMTP = ""; + ПортPOP3 = 110; + ПортSMTP = 25; + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo new file mode 100644 index 000000000..56b146fea --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo @@ -0,0 +1,613 @@ + + + + + + + + + + УчетныеЗаписиЭлектроннойПочты + + ru + Учетные записи электронной почты + + true + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ru + Наименование учетной записи + + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + + + ru + + + Managed + Use + + ru + Учетная запись электронной почты + + 2 + true + 50 + String + AsDescription + + + СистемнаяУчетнаяЗаписьЭлектроннойПочты + Системная учетная запись + + + + + + InDialog + BothWays + Catalog.УчетныеЗаписиЭлектроннойПочты.Form.ФормаЭлемента + Catalog.УчетныеЗаписиЭлектроннойПочты.Form.ФормаСписка + + ИмяПользователя + + ru + Имя пользователя + + + String + + 100 + + + + ru + Адресат учетной записи. От его имени будут отсылаться почтовые сообщения. Например "Иван Петров". + + + + + Index + Use + Use + + + АдресЭлектроннойПочты + + ru + Адрес электронной почты + + + String + + 256 + + + + ru + Адрес электронной почты в формате пользователь@сервер + + + + ShowError + + Use + Use + + + SMTPСервер + + ru + Сервер исходящей почты (SMTP) + + + String + + + + ru + Адрес SMTP сервера + + + + + Use + Use + + + POP3Сервер + + ru + Сервер входящей почты (POP3) + + + String + + + + ru + Адрес POP3 сервера + + + + + Use + Use + + + ПортSMTP + + ru + Порт SMTP + + + Number + + 5 + + + + ru + Порт SMTP (необязательное поле) + + + + + 0 + + Use + Use + + + ПортPOP3 + + ru + Порт POP3 + + + Number + + 5 + + + + ru + Порт POP3 (необязательное поле) + + + + + 0 + + Use + Use + + + Пользователь + + ru + Пользователь + + + String + + + + ru + Имя пользователя для доступа на POP3 сервер (логин) + + + + + Use + Use + + + Пароль + + ru + Пароль + + + String + + + true + + ru + Пароль для доступа на SMTP/POP3 сервер + + + + + Use + Use + + + SMTPАутентификация + + ru + SMTP аутентификация + + + EnumRef.ВариантыSMTPАутентификации + + + ru + Применяемые параметры SMTP аутентификации + + + + Use + DontUse + + Enum.ВариантыSMTPАутентификации.EmptyRef + + Use + Use + + + СпособSMTPАутентификации + + ru + Способ SMTP аутентификации + + + EnumRef.СпособыSMTPАутентификации + + + ru + Способ аутентификации на сервере SMTP + + + + Use + DontUse + + Enum.СпособыSMTPАутентификации.EmptyRef + + Use + Use + + + ПользовательSMTP + + ru + Пользователь SMTP + + + String + + + + ru + Имя пользователя для дополнительной аутентификации на SMTP сервере + + + + + Use + Use + + + ПарольSMTP + + ru + Пароль SMTP + + + String + + + true + + ru + Имя пользователя для дополнительной аутентификации на SMTP сервере + + + + + Use + Use + + + СпособPOP3Аутентификации + + ru + Способ POP3 аутентификации + + + EnumRef.СпособыPOP3Аутентификации + + + ru + Способ аутентификации на POP3 сервере + + + + Use + DontUse + + Enum.СпособыPOP3Аутентификации.EmptyRef + + Use + Use + + + ВремяОжидания + + ru + Длительность ожидания сервера (сек) + + + Number + + 3 + + + + ru + Длительность ожидания сервера до разрыва соединения + + + + ShowError + true + + 30 + + Use + Use + + + ОставлятьКопииСообщенийНаСервере + + ru + Оставлять копии сообщений на сервере + + + Boolean + + + ru + Требуется оставлять копии сообщений на сервере + + + + + Use + Use + + + ПериодХраненияСообщенийНаСервере + + ru + Период хранения сообщений на сервере + + + Number + + 3 + true + + + + ru + Число дней, которое должны храниться сообщения на сервере. Вычисляется как разница между текущей датой и датой когда сообщение было отправлено. + + + + + 0 + + Use + Use + + + ИспользоватьДляОтправки + + ru + Использовать для отправки + + + Boolean + + + ru + Использовать учетную запись для отправки почтовых сообщений + + + + + Index + Use + Use + + + ИспользоватьДляПолучения + + ru + Использовать для получения + + + Boolean + + + ru + Использовать учетную запись для получения почтовых сообщений + + + + + Index + Use + Use + + + ВПредставлениеВключатьИмяПользователя + + ru + В представление включать имя пользователя + + + Boolean + + + ru + В представление учетной записи включать имя пользователя + + + + + Use + Use + + + ОтветственныйЗаОбработкуПисем + + ru + Ответственный за обработку писем (по умолчанию) + + + CatalogRef.Пользователи + + + ru + Ответственный за обработку писем + + + + + Catalog.Пользователи.EmptyRef + + Use + Use + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаЭлемента + + ru + Редактирование учетной записи электронной почты + + + + ru + + + PersonalComputer + MobileDevice + + + ДополнительныеСвойстваУчетнойЗаписи + + ru + Дополнительные свойства сервера почты + + + + ru + + + PersonalComputer + MobileDevice + + + ПроверкаУчетнойЗаписи + + ru + Проверка учетной записи + + FormCommandBarImportant + + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + true + Auto + + diff --git a/SSL/src/Catalogs/Файлы/Commands/ВсеФайлы/CommandModule.bsl b/SSL/src/Catalogs/Файлы/Commands/ВсеФайлы/CommandModule.bsl new file mode 100644 index 000000000..a89f175f3 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Commands/ВсеФайлы/CommandModule.bsl @@ -0,0 +1,5 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + ОткрытьФорму("Справочник.Файлы.ФормаСписка", , ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Commands/ЗанятыеФайлы/CommandModule.bsl b/SSL/src/Catalogs/Файлы/Commands/ЗанятыеФайлы/CommandModule.bsl new file mode 100644 index 000000000..a633334a0 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Commands/ЗанятыеФайлы/CommandModule.bsl @@ -0,0 +1,11 @@ +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОткрытьФорму( + "Справочник.Файлы.Форма.РедактируемыеФайлы", + , + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Commands/ПапкиФайлов/CommandModule.bsl b/SSL/src/Catalogs/Файлы/Commands/ПапкиФайлов/CommandModule.bsl new file mode 100644 index 000000000..22a3b3efa --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Commands/ПапкиФайлов/CommandModule.bsl @@ -0,0 +1,11 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + ОткрытьФорму( + "Справочник.Файлы.Форма.ХранилищеФайлов", + , + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ВРабочемКаталогеБолееНовыйФайл/Form.form b/SSL/src/Catalogs/Файлы/Forms/ВРабочемКаталогеБолееНовыйФайл/Form.form new file mode 100644 index 000000000..2b2b6b3de --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ВРабочемКаталогеБолееНовыйФайл/Form.form @@ -0,0 +1,649 @@ + + + + ГруппаСообщение + 20 + + ДекорацияИконка + 21 + + <key>ru</key> + <value>Декорация иконка</value> + + true + true + + true + + + ДекорацияИконкаРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + ДекорацияИконкаКонтекстноеМеню + 22 + true + + 4 + true + 2 + true + false + false + false + + + CommonPicture.Предупреждение32 + + + + + Сообщение + 14 + true + true + + true + + + Сообщение + + None + + СообщениеРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + СообщениеКонтекстноеМеню + 15 + true + + LabelField + Enter + true + Left + true + + 65 + true + 2 + true + + + true + true + + true + + + <key>ru</key> + <value>Группа сообщение</value> + + + ru + Группа сообщение + + + ГруппаСообщениеРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + UsualGroup + + Auto + StrongSeparation + true + true + Auto + Auto + + + + ГруппаФайл + 16 + + ДекорацияПодписьФайла + 17 + + <key>ru</key> + <value>Файл на локальном компьютере</value> + + true + true + + true + + + ДекорацияПодписьФайлаРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + ДекорацияПодписьФайлаКонтекстноеМеню + 18 + true + + Label + true + true + false + + Left + + + + ГруппаФайлИКнопка + 19 + + Файл + 1 + + <key>ru</key> + <value>Файл на локальном компьютере</value> + + true + true + + true + + + Файл + + None + + ФайлРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + ФайлКонтекстноеМеню + 2 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ОткрытьКаталог + 13 + true + true + + true + + false + + ОткрытьКаталогРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + UsualButton + Form.Command.ОткрытьКаталог + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа файл и кнопка</value> + + + ru + Группа файл и кнопка + + + ГруппаФайлИКнопкаРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа файл</value> + + + ru + Группа файл + + + ГруппаФайлРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ВремяИзмененияНаСервере + 5 + true + true + + true + + + ВремяИзмененияНаСервере + + + ВремяИзмененияНаСервереРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ВремяИзмененияНаСервереКонтекстноеМеню + 6 + true + + LabelField + true + Enter + true + Left + true + + true + true + + + + Группа + 12 + + ВремяИзмененияВРабочемКаталоге + 7 + true + true + + true + + + ВРабочемКаталоге + + + ВремяИзмененияВРабочемКаталогеРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + ВремяИзмененияВРабочемКаталогеКонтекстноеМеню + 8 + true + + LabelField + true + Enter + true + Left + true + + true + true + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Открыть + 9 + true + true + + true + + false + + ОткрытьРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Form.Command.ОткрытьСуществующий + Auto + true + true + true + UserCmds + Auto + + + Перезаписать + 10 + true + true + + true + + false + + ПерезаписатьРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + Form.Command.ВзятьССервера + Normal + Auto + true + true + UserCmds + Auto + + + Отмена + 11 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Файл + + <key>ru</key> + <value>Файл</value> + + 1 + + String + + + + true + + + true + + + + ВремяИзмененияНаСервере + + <key>ru</key> + <value>Время изменения в информационной базе</value> + + 2 + + Date + + + + true + + + true + + + + ВРабочемКаталоге + + <key>ru</key> + <value>Время изменения в рабочем каталоге</value> + + 3 + + Date + + + + true + + + true + + + + Сообщение + + <key>ru</key> + <value>Сообщение</value> + + 4 + + String + + + + true + + + true + + + + ОткрытьСуществующий + + <key>ru</key> + <value>Открыть существующий</value> + + 1 + + ru + Открыть существующий + + + true + + + + ОткрытьСуществующий + + + Auto + Auto + + + ВзятьССервера + + <key>ru</key> + <value>Взять с сервера</value> + + 2 + + ru + Взять с сервера и перезаписать + + + true + + + + Перезаписать + + + Auto + Auto + + + ОткрытьКаталог + + <key>ru</key> + <value>Открыть каталог</value> + + 3 + + ru + Открыть каталог + + + true + + + CommonPicture.Папка + + + + ОткрытьКаталог + + + Picture + Auto + Auto + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ВРабочемКаталогеБолееНовыйФайл/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ВРабочемКаталогеБолееНовыйФайл/Module.bsl new file mode 100644 index 000000000..270bb4b86 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ВРабочемКаталогеБолееНовыйФайл/Module.bsl @@ -0,0 +1,23 @@ +&НаКлиенте +Процедура ОткрытьСуществующий(Команда) + Закрыть(КодВозвратаДиалога.Да); +КонецПроцедуры + +&НаКлиенте +Процедура Перезаписать(Команда) + Закрыть(КодВозвратаДиалога.Нет); +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ВРабочемКаталоге = Параметры.ВРабочемКаталоге; + ВремяИзмененияНаСервере = Параметры.ВремяИзмененияНаСервере; + Файл = Параметры.Файл; + Сообщение = Параметры.Сообщение; + Заголовок = Параметры.Заголовок; +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКаталог(Команда) + РаботаСФайламиКлиент.ОткрытьПроводникСФайлом(Файл); +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ВводПароляСОписаниями/Form.form b/SSL/src/Catalogs/Файлы/Forms/ВводПароляСОписаниями/Form.form new file mode 100644 index 000000000..c9d309403 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ВводПароляСОписаниями/Form.form @@ -0,0 +1,325 @@ + + + + <key>ru</key> + <value>Введите пароль</value> + + + Пароль + 3 + true + true + + true + + + Пароль + + true + + ПарольРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ПарольКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаФайл + 10 + + Файл + 8 + true + true + + true + + + Файл + + + ФайлРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ФайлКонтекстноеМеню + 9 + true + + InputField + true + Enter + true + Left + true + + true + true + true + false + true + true + true + Normal + + + + ПредставленияСертификатов + 6 + true + true + + true + + + ПредставленияСертификатов + + + ПредставленияСертификатовРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + ПредставленияСертификатовКонтекстноеМеню + 7 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа файл</value> + + + ru + Группа файл + + + ГруппаФайлРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 5 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 2 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + 40 + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + 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 + + CatalogRef.Файлы + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ВводПароляСОписаниями/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ВводПароляСОписаниями/Help/ru.html new file mode 100644 index 000000000..3f7f75a66 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ВводПароляСОписаниями/Help/ru.html @@ -0,0 +1,7 @@ + +

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

    +

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

    +

     

    +

    См. также:

    +
    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ВводПароляСОписаниями/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ВводПароляСОписаниями/Module.bsl new file mode 100644 index 000000000..3b026e1b0 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ВводПароляСОписаниями/Module.bsl @@ -0,0 +1,25 @@ + +&НаКлиенте +Процедура ОК(Команда) + ВозвратПароль = Пароль; + + Если ПустаяСтрока(Пароль) И НЕ ПустаяСтрока(Элементы.Пароль.ТекстРедактирования) Тогда + ВозвратПароль = Элементы.Пароль.ТекстРедактирования; + КонецЕсли; + + Закрыть(ВозвратПароль); +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Заголовок = Параметры.Заголовок; + Файл = Параметры.Файл; + + Если Параметры.Свойство("ПредставленияСертификатов") Тогда + ПредставленияСертификатов = Параметры.ПредставленияСертификатов; + Иначе + Элементы.ПредставленияСертификатов.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборСертификатаЭЦПДляШифрования/Form.form b/SSL/src/Catalogs/Файлы/Forms/ВыборСертификатаЭЦПДляШифрования/Form.form new file mode 100644 index 000000000..d96edd5a7 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборСертификатаЭЦПДляШифрования/Form.form @@ -0,0 +1,596 @@ + + + + <key>ru</key> + <value>Выбор сертификатов для шифрования</value> + + + ТаблицаСертификатов + 3 + + <key>ru</key> + <value>Сертификаты ЭЦП</value> + + true + true + + true + + + ТаблицаСертификатов + + Top + Change + Copy + CopyToClipboard + + ТаблицаСертификатовПометка + 21 + true + true + + true + + + ТаблицаСертификатов.Пометка + + None + + ТаблицаСертификатовПометкаРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ТаблицаСертификатовПометкаКонтекстноеМеню + 22 + true + + CheckBoxField + Auto + true + Left + true + + + + ТаблицаСертификатовКомуВыдан + 6 + true + true + + true + + + ТаблицаСертификатов.КомуВыдан + + + ТаблицаСертификатовКомуВыданРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + ТаблицаСертификатовКомуВыданКонтекстноеМеню + 7 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСертификатовКемВыдан + 8 + true + true + + true + + + ТаблицаСертификатов.КемВыдан + + + ТаблицаСертификатовКемВыданРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + ТаблицаСертификатовКемВыданКонтекстноеМеню + 9 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСертификатовДействителенДо + 10 + true + true + + true + + + ТаблицаСертификатов.ДействителенДо + + + ТаблицаСертификатовДействителенДоРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ТаблицаСертификатовДействителенДоКонтекстноеМеню + 11 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСертификатовНазначение + 12 + true + true + + true + + + ТаблицаСертификатов.Назначение + + + ТаблицаСертификатовНазначениеРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ТаблицаСертификатовНазначениеКонтекстноеМеню + 13 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + ТаблицаСертификатовКоманднаяПанель + 5 + Left + true + + + Selection + ТаблицаСертификатовВыбор + + + ТаблицаСертификатовСтрокаПоиска + 26 + + ТаблицаСертификатовСтрокаПоискаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ТаблицаСертификатовСтрокаПоискаКонтекстноеМеню + 27 + true + + ТаблицаСертификатов + + true + + + + ТаблицаСертификатовСостояниеПросмотра + 29 + + ТаблицаСертификатовСостояниеПросмотраРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + ТаблицаСертификатовСостояниеПросмотраКонтекстноеМеню + 30 + true + + ViewStatusAddition + ТаблицаСертификатов + + true + + + + ТаблицаСертификатовУправлениеПоиском + 32 + + ТаблицаСертификатовУправлениеПоискомРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ТаблицаСертификатовУправлениеПоискомКонтекстноеМеню + 33 + true + + SearchControlAddition + ТаблицаСертификатов + + true + + + + ТаблицаСертификатовРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ТаблицаСертификатовКонтекстноеМеню + 4 + + ТаблицаСертификатовКонтекстноеМенюОткрытьСертификат + 20 + true + true + + true + + + ТаблицаСертификатовКонтекстноеМенюОткрытьСертификатРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + Form.Command.ОткрытьСертификат + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + true + Row +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + +
    + + ФормаКоманднаяПанель + -1 + + ФормаВыбрать + 14 + true + true + + true + + + ФормаВыбратьРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Form.Command.Выбрать + Auto + true + true + true + UserCmds + Auto + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + ТаблицаСертификатов + + <key>ru</key> + <value>Таблица сертификатов</value> + + 2 + + 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 + + Date + + Date + + + + 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> + + 6 + + 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/Catalogs/Файлы/Forms/ВыборСертификатаЭЦПДляШифрования/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ВыборСертификатаЭЦПДляШифрования/Help/ru.html new file mode 100644 index 000000000..4365fadd0 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборСертификатаЭЦПДляШифрования/Help/ru.html @@ -0,0 +1,8 @@ + +

    Выбо сертификатов ЭЦП для шифрования

    +

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

    +

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

    +

     

    +

    См. также:

    +
    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборСертификатаЭЦПДляШифрования/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ВыборСертификатаЭЦПДляШифрования/Module.bsl new file mode 100644 index 000000000..afa6d0d31 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборСертификатаЭЦПДляШифрования/Module.bsl @@ -0,0 +1,72 @@ +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + МассивСтруктурСертификатов = Параметры.МассивСтруктурСертификатов; + + Для Каждого СтруктураСертификата Из МассивСтруктурСертификатов Цикл + НоваяСтрока = ТаблицаСертификатов.Добавить(); + + НоваяСтрока.КомуВыдан = СтруктураСертификата.КомуВыдан; + НоваяСтрока.КемВыдан = СтруктураСертификата.КемВыдан; + НоваяСтрока.ДействителенДо = СтруктураСертификата.ДействителенДо; + НоваяСтрока.Отпечаток = СтруктураСертификата.Отпечаток; + + Если СтруктураСертификата.Свойство("Пометка") Тогда + НоваяСтрока.Пометка = СтруктураСертификата.Пометка; + КонецЕсли; + + НовоеНазначение = ""; + ОбщегоНазначения.ЗаполнитьНазначениеСертификата(СтруктураСертификата.Назначение, НовоеНазначение); + НоваяСтрока.Назначение = НовоеНазначение; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаСертификатовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + ОбработкаВыбора(); +КонецПроцедуры + +&НаКлиенте +Процедура Выбрать(Команда) + ОбработкаВыбора(); +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаВыбора() + + МассивВозврата = Новый Массив; + Для Каждого СтрокаТаблицыЗначений Из ТаблицаСертификатов Цикл + Если СтрокаТаблицыЗначений.Пометка Тогда + ВыбранныйСертификат = ЭлектронноЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(СтрокаТаблицыЗначений.Отпечаток); + МассивВозврата.Добавить(ВыбранныйСертификат); + КонецЕсли; + КонецЦикла; + + Если МассивВозврата.Количество() = 0 Тогда + Предупреждение(НСтр("ru = 'Не выбран ни один сертификат.'")); + Возврат; + КонецЕсли; + + Закрыть(МассивВозврата); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСертификат(Команда) + + ТекущиеДанные = Элементы.ТаблицаСертификатов.ТекущиеДанные; + Если Не ТекущиеДанные = Неопределено Тогда + + ВыбранныйСертификат = ЭлектронноЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ТекущиеДанные.Отпечаток); + + СтруктураСертификата = ЭлектронноЦифроваяПодписьКлиент.ЗаполнитьСтруктуруСертификата(ВыбранныйСертификат); + Если СтруктураСертификата <> Неопределено Тогда + ПараметрыФормы = Новый Структура("СтруктураСертификата, Отпечаток", СтруктураСертификата, ТекущиеДанные.Отпечаток); + СтруктураВозврата = ОткрытьФормуМодально("Общаяформа.ФормаСертификатаЭЦП", ПараметрыФормы); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Form.form b/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Form.form new file mode 100644 index 000000000..bc77b3690 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Form.form @@ -0,0 +1,362 @@ + + + + <key>ru</key> + <value>Введите пароль</value> + + + СохранятьСРасшифровкой + 8 + true + true + + true + + + СохранятьСРасшифровкой + + Top + + OnChange + СохранятьСРасшифровкойПриИзменении + + + СохранятьСРасшифровкойРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СохранятьСРасшифровкойКонтекстноеМеню + 9 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Сохранить шифрованный файл + + + 0 + + + + + ru + Расшифровать и сохранить + + + 1 + + + Vertical + + + + ГруппаШифрование + 10 + + Пароль + 3 + true + true + + true + + + Пароль + + true + + ПарольРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ПарольКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ПредставленияСертификатов + 6 + true + true + + true + + + ПредставленияСертификатов + + + ПредставленияСертификатовРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + ПредставленияСертификатовКонтекстноеМеню + 7 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа шифрование</value> + + + ru + Группа шифрование + + + ГруппаШифрованиеРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 5 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 2 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + 40 + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + 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 + + 10 + + + + true + + + true + + + + РасширениеДляЗашифрованныхФайлов + + <key>ru</key> + <value>Расширение для зашифрованных файлов</value> + + 4 + + String + + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Help/ru.html new file mode 100644 index 000000000..86bdeb12a --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Help/ru.html @@ -0,0 +1,8 @@ + +

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

    +

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

    +

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

    +

     

    +

    См. также:

    +
    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Module.bsl new file mode 100644 index 000000000..7d8c26680 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Module.bsl @@ -0,0 +1,37 @@ + +&НаКлиенте +Процедура ОК(Команда) + ВозвратПароль = Пароль; + + Если ПустаяСтрока(Пароль) И НЕ ПустаяСтрока(Элементы.Пароль.ТекстРедактирования) Тогда + ВозвратПароль = Элементы.Пароль.ТекстРедактирования; + КонецЕсли; + + СтруктураВозврата = Новый Структура("Пароль, СохранятьСРасшифровкой, РасширениеДляЗашифрованныхФайлов", + ВозвратПароль, СохранятьСРасшифровкой, РасширениеДляЗашифрованныхФайлов); + Закрыть(СтруктураВозврата); +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СохранятьСРасшифровкой = 1; + Заголовок = Параметры.Заголовок; + + Если Параметры.Свойство("ПредставленияСертификатов") Тогда + ПредставленияСертификатов = Параметры.ПредставленияСертификатов; + Иначе + Элементы.ПредставленияСертификатов.Видимость = Ложь; + КонецЕсли; + + РасширениеДляЗашифрованныхФайлов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "РасширениеДляЗашифрованныхФайлов"); + Если ПустаяСтрока(РасширениеДляЗашифрованныхФайлов) Тогда + РасширениеДляЗашифрованныхФайлов = "p7m"; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СохранятьСРасшифровкойПриИзменении(Элемент) + Элементы.Пароль.Доступность = (СохранятьСРасшифровкой = 1); +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборУстройстваСканирования/Form.form b/SSL/src/Catalogs/Файлы/Forms/ВыборУстройстваСканирования/Form.form new file mode 100644 index 000000000..99500478f --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборУстройстваСканирования/Form.form @@ -0,0 +1,170 @@ + + + + ИмяУстройства + 1 + + <key>ru</key> + <value>Имя сканера</value> + + true + true + + true + + + ИмяУстройства + + + ИмяУстройстваРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ИмяУстройстваКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ЗаписатьИЗакрыть + 3 + true + true + + true + + false + + ЗаписатьИЗакрытьРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + Auto + true + true + true + UserCmds + Auto + + + Отмена + 4 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnOpen + ПриОткрытии + + DontBlock + true + true + true + Vertical + true + true + UseIfNecessary + auto + true + + ИмяУстройства + + <key>ru</key> + <value>Имя устройства</value> + + 1 + + String + + + + true + + + true + + ShowError + + + ЗаписатьИЗакрыть + + <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..e34c75fb3 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборУстройстваСканирования/Module.bsl @@ -0,0 +1,31 @@ + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + Если РаботаСоСканеромКлиент.ПроинициализироватьКомпоненту() Тогда + + МассивУстройств = РаботаСоСканеромКлиент.ПолучитьУстройства(); + Для Каждого Строка Из МассивУстройств Цикл + Элементы.ИмяУстройства.СписокВыбора.Добавить(Строка); + КонецЦикла; + + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + МассивСтруктур = Новый Массив; + + СистемнаяИнформация = Новый СистемнаяИнформация(); + ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "НастройкиСканирования/ИмяУстройства"); + Элемент.Вставить("Настройка", ИдентификаторКлиента); + Элемент.Вставить("Значение", ИмяУстройства); + МассивСтруктур.Добавить(Элемент); + + ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур); + Закрыть(Элемент); + + ОбновитьПовторноИспользуемыеЗначения(); +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Form.form b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Form.form new file mode 100644 index 000000000..33fc645e2 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Form.form @@ -0,0 +1,800 @@ + + + + УстановитьКомпонентуСканирования + 11 + true + true + + true + + false + + УстановитьКомпонентуСканированияРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + UsualButton + Form.Command.УстановитьКомпонентуСканирования + Normal + Auto + true + true + UserCmds + Auto + + + ВерсияКомпонентыСканирования + 12 + true + true + + true + + + ВерсияКомпонентыСканирования + + + ВерсияКомпонентыСканированияРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ВерсияКомпонентыСканированияКонтекстноеМеню + 13 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПоказыватьДиалогСканера + 1 + true + true + + true + + + ПоказыватьДиалогСканера + + Right + + ПоказыватьДиалогСканераРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ПоказыватьДиалогСканераКонтекстноеМеню + 2 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаНастройки + 24 + + ИмяУстройства + 4 + + <key>ru</key> + <value>Имя сканера</value> + + true + true + + true + + + ИмяУстройства + + + OnChange + ИмяУстройстваПриИзменении + + + ИмяУстройстваРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ИмяУстройстваКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + + ChoiceProcessing + ИмяУстройстваОбработкаВыбора + + true + true + true + true + true + true + true + Normal + + + + ФорматСканированногоИзображения + 18 + true + true + + true + + + ФорматСканированногоИзображения + + + ФорматСканированногоИзображенияРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + ФорматСканированногоИзображенияКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Разрешение + 14 + true + true + + true + + + Разрешение + + + РазрешениеРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + РазрешениеКонтекстноеМеню + 15 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Цветность + 16 + true + true + + true + + + Цветность + + + ЦветностьРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ЦветностьКонтекстноеМеню + 17 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Поворот + 20 + + <key>ru</key> + <value>Поворот изображения</value> + + true + true + + true + + + Поворот + + + ПоворотРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ПоворотКонтекстноеМеню + 21 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + РазмерБумаги + 22 + true + true + + true + + + РазмерБумаги + + + РазмерБумагиРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + РазмерБумагиКонтекстноеМеню + 23 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + УстановитьСтандартныеНастройки + 25 + true + true + + true + + false + + УстановитьСтандартныеНастройкиРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + UsualButton + Form.Command.УстановитьСтандартныеНастройки + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа настройки</value> + + + ru + Группа настройки + + + ГруппаНастройкиРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ОткрытьНомераОтсканированныхФайлов + 10 + true + true + + true + + false + + ОткрытьНомераОтсканированныхФайловРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + UsualButton + Form.Command.ОткрытьНомераОтсканированныхФайлов + Normal + Auto + true + true + UserCmds + Auto + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ОК + 7 + true + true + + true + + false + + ОКРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 8 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 9 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + 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> + + 4 + + String + + + + true + + + true + + + + Разрешение + + <key>ru</key> + <value>Разрешение</value> + + 5 + + EnumRef.РазрешенияСканированногоИзображения + + + true + + + true + + + + Цветность + + <key>ru</key> + <value>Цветность</value> + + 6 + + EnumRef.ЦветностиИзображения + + + true + + + true + + + + ФорматСканированногоИзображения + + <key>ru</key> + <value>Формат сканированного изображения</value> + + 3 + + EnumRef.ФорматыСканированногоИзображения + + + true + + + true + + + + Поворот + + <key>ru</key> + <value>Поворот</value> + + 7 + + EnumRef.ПоворотИзображения + + + true + + + true + + + + РазмерБумаги + + <key>ru</key> + <value>Размер бумаги</value> + + 8 + + EnumRef.РазмерыБумаги + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 2 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + ОткрытьНомераОтсканированныхФайлов + + <key>ru</key> + <value>Открыть номера отсканированных файлов</value> + + 3 + + ru + Открыть номера отсканированных файлов + + + true + + + + ОткрытьНомераОтсканированныхФайлов + + + Auto + Auto + + + УстановитьКомпонентуСканирования + + <key>ru</key> + <value>Установить компоненту сканирования</value> + + 4 + + ru + Установить компоненту сканирования + + + true + + + + УстановитьКомпонентуСканирования + + + Auto + Auto + + + УстановитьСтандартныеНастройки + + <key>ru</key> + <value>Установить стандартные настройки</value> + + 1 + + ru + Установить стандартные настройки + + + true + + + + УстановитьСтандартныеНастройки + + + Auto + Auto + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Help/ru.html new file mode 100644 index 000000000..7cf901a24 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Help/ru.html @@ -0,0 +1,10 @@ + +

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

    +

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

    +

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

    +

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

    +

    Разрешение - позволяет выбрать разрешение сканирования (DPI). Список доступных разрешений зависит от выбранного сканера.

    +

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

    +

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

    +

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

    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Module.bsl new file mode 100644 index 000000000..1942de94b --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Module.bsl @@ -0,0 +1,220 @@ +&НаКлиенте +Процедура ОК(Команда) + МассивСтруктур = Новый Массив; + + СистемнаяИнформация = Новый СистемнаяИнформация(); + ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "НастройкиСканирования/ПоказыватьДиалогСканера"); + Элемент.Вставить("Настройка", ИдентификаторКлиента); + Элемент.Вставить("Значение", ПоказыватьДиалогСканера); + МассивСтруктур.Добавить(Элемент); + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "НастройкиСканирования/ИмяУстройства"); + Элемент.Вставить("Настройка", ИдентификаторКлиента); + Элемент.Вставить("Значение", ИмяУстройства); + МассивСтруктур.Добавить(Элемент); + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "НастройкиСканирования/ФорматСканированногоИзображения"); + Элемент.Вставить("Настройка", ИдентификаторКлиента); + Элемент.Вставить("Значение", ФорматСканированногоИзображения); + МассивСтруктур.Добавить(Элемент); + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "НастройкиСканирования/Разрешение"); + Элемент.Вставить("Настройка", ИдентификаторКлиента); + Элемент.Вставить("Значение", Разрешение); + МассивСтруктур.Добавить(Элемент); + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "НастройкиСканирования/Цветность"); + Элемент.Вставить("Настройка", ИдентификаторКлиента); + Элемент.Вставить("Значение", Цветность); + МассивСтруктур.Добавить(Элемент); + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "НастройкиСканирования/Поворот"); + Элемент.Вставить("Настройка", ИдентификаторКлиента); + Элемент.Вставить("Значение", Поворот); + МассивСтруктур.Добавить(Элемент); + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "НастройкиСканирования/РазмерБумаги"); + Элемент.Вставить("Настройка", ИдентификаторКлиента); + Элемент.Вставить("Значение", РазмерБумаги); + МассивСтруктур.Добавить(Элемент); + + ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур); + Закрыть(); + + ОбновитьПовторноИспользуемыеЗначения(); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьНомераОтсканированныхФайлов(Команда) + ОткрытьФорму("РегистрСведений.НомераСканированныхФайлов.ФормаСписка"); +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + ОбновитьСостояние(); +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьСостояние() + + Элементы.ИмяУстройства.Доступность = Ложь; + Элементы.ФорматСканированногоИзображения.Доступность = Ложь; + Элементы.Разрешение.Доступность = Ложь; + Элементы.Цветность.Доступность = Ложь; + Элементы.Поворот.Доступность = Ложь; + Элементы.РазмерБумаги.Доступность = Ложь; + Элементы.УстановитьСтандартныеНастройки.Доступность = Ложь; + + Если РаботаСоСканеромКлиент.ПроинициализироватьКомпоненту() Тогда + + Элементы.УстановитьКомпонентуСканирования.Видимость = Ложь; + ВерсияКомпонентыСканирования = РаботаСоСканеромКлиент.ВерсияКомпонентыСканирования(); + + Если РаботаСоСканеромКлиент.ДоступнаКомандаСканировать() Тогда + + Элементы.ИмяУстройства.Доступность = Истина; + + Элементы.ИмяУстройства.СписокВыбора.Очистить(); + МассивУстройств = РаботаСоСканеромКлиент.ПолучитьУстройства(); + Для Каждого Строка Из МассивУстройств Цикл + Элементы.ИмяУстройства.СписокВыбора.Добавить(Строка); + КонецЦикла; + + Если Не ПустаяСтрока(ИмяУстройства) Тогда + + Элементы.ФорматСканированногоИзображения.Доступность = Истина; + Элементы.Разрешение.Доступность = Истина; + Элементы.Цветность.Доступность = Истина; + Элементы.УстановитьСтандартныеНастройки.Доступность = Истина; + + Если Разрешение.Пустая() ИЛИ Цветность.Пустая() Тогда + РазрешениеЧисло = РаботаСоСканеромКлиент.ПолучитьНастройку(ИмяУстройства, "XRESOLUTION"); + ЦветностьЧисло = РаботаСоСканеромКлиент.ПолучитьНастройку(ИмяУстройства, "PIXELTYPE"); + ПоворотЧисло = РаботаСоСканеромКлиент.ПолучитьНастройку(ИмяУстройства, "ROTATION"); + РазмерБумагиЧисло = РаботаСоСканеромКлиент.ПолучитьНастройку(ИмяУстройства, "SUPPORTEDSIZES"); + + Элементы.Поворот.Доступность = (ПоворотЧисло <> -1); + Элементы.РазмерБумаги.Доступность = (РазмерБумагиЧисло <> -1); + + РаботаСФайлами.ПреобразоватьПараметрыСканераВПеречисления(РазрешениеЧисло, ЦветностьЧисло, ПоворотЧисло, РазмерБумагиЧисло, + Разрешение, Цветность, Поворот, РазмерБумаги); + РаботаСоСканеромКлиент.СохранитьВНастройкахПараметрыСканера(Разрешение, Цветность, Поворот, РазмерБумаги); + Иначе + Элементы.Поворот.Доступность = Не Поворот.Пустая(); + Элементы.РазмерБумаги.Доступность = Не РазмерБумаги.Пустая(); + КонецЕсли; + + КонецЕсли; + Иначе + Элементы.ИмяУстройства.Доступность = Ложь; + КонецЕсли; + + Иначе + ВерсияКомпонентыСканирования = НСтр("ru= 'Компонента сканирования не установлена'"); + Элементы.ИмяУстройства.Доступность = Ложь; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьКомпонентуСканирования(Команда) + РаботаСоСканеромКлиент.УстановитьКомпоненту(); + ОбновитьСостояние(); +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.КомпонентаУстановлена Тогда + Элементы.УстановитьКомпонентуСканирования.Видимость = Ложь; + КонецЕсли; + + ИдентификаторКлиента = Параметры.ИдентификаторКлиента; + + ПоказыватьДиалогСканера = + ХранилищеОбщихНастроек.Загрузить("НастройкиСканирования/ПоказыватьДиалогСканера", ИдентификаторКлиента); + Если ПоказыватьДиалогСканера = Неопределено Тогда + ПоказыватьДиалогСканера = Истина; + ХранилищеОбщихНастроек.Сохранить("НастройкиСканирования/ПоказыватьДиалогСканера", ИдентификаторКлиента, ПоказыватьДиалогСканера); + КонецЕсли; + + ИмяУстройства = + ХранилищеОбщихНастроек.Загрузить("НастройкиСканирования/ИмяУстройства", ИдентификаторКлиента); + Если ИмяУстройства = Неопределено Тогда + ИмяУстройства = ""; + ХранилищеОбщихНастроек.Сохранить("НастройкиСканирования/ИмяУстройства", ИдентификаторКлиента, ИмяУстройства); + КонецЕсли; + + ФорматСканированногоИзображения = + ХранилищеОбщихНастроек.Загрузить("НастройкиСканирования/ФорматСканированногоИзображения", ИдентификаторКлиента); + Если ФорматСканированногоИзображения.Пустая() Тогда + ФорматСканированногоИзображения = Перечисления.ФорматыСканированногоИзображения.PNG; + ХранилищеОбщихНастроек.Сохранить("НастройкиСканирования/ФорматСканированногоИзображения", ИдентификаторКлиента, ФорматСканированногоИзображения); + КонецЕсли; + + Разрешение = ХранилищеОбщихНастроек.Загрузить("НастройкиСканирования/Разрешение", ИдентификаторКлиента); + Цветность = ХранилищеОбщихНастроек.Загрузить("НастройкиСканирования/Цветность", ИдентификаторКлиента); + + Поворот = ХранилищеОбщихНастроек.Загрузить("НастройкиСканирования/Поворот", ИдентификаторКлиента); + РазмерБумаги = ХранилищеОбщихНастроек.Загрузить("НастройкиСканирования/РазмерБумаги", ИдентификаторКлиента); + +КонецПроцедуры + +&НаКлиенте +Процедура ИмяУстройстваПриИзменении(Элемент) + ПрочитатьНастройкиСканера(); +КонецПроцедуры + +&НаКлиенте +Процедура ИмяУстройстваОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + Если ИмяУстройства = ВыбранноеЗначение Тогда // ничего не изменилось - ничего не делаем + СтандартнаяОбработка = Ложь; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПрочитатьНастройкиСканера() + + Элементы.ФорматСканированногоИзображения.Доступность = Не ПустаяСтрока(ИмяУстройства); + Элементы.Разрешение.Доступность = Не ПустаяСтрока(ИмяУстройства); + Элементы.Цветность.Доступность = Не ПустаяСтрока(ИмяУстройства); + Элементы.УстановитьСтандартныеНастройки.Доступность = Не ПустаяСтрока(ИмяУстройства); + + Если Не ПустаяСтрока(ИмяУстройства) Тогда + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идет сбор сведений о сканере ""%1""...'"), ИмяУстройства); + Состояние(ТекстСообщения); + + РазрешениеЧисло = РаботаСоСканеромКлиент.ПолучитьНастройку(ИмяУстройства, "XRESOLUTION"); + ЦветностьЧисло = РаботаСоСканеромКлиент.ПолучитьНастройку(ИмяУстройства, "PIXELTYPE"); + ПоворотЧисло = РаботаСоСканеромКлиент.ПолучитьНастройку(ИмяУстройства, "ROTATION"); + РазмерБумагиЧисло = РаботаСоСканеромКлиент.ПолучитьНастройку(ИмяУстройства, "SUPPORTEDSIZES"); + + Элементы.Поворот.Доступность = (ПоворотЧисло <> -1); + Элементы.РазмерБумаги.Доступность = (РазмерБумагиЧисло <> -1); + + РаботаСФайлами.ПреобразоватьПараметрыСканераВПеречисления(РазрешениеЧисло, ЦветностьЧисло, ПоворотЧисло, РазмерБумагиЧисло, + Разрешение, Цветность, Поворот, РазмерБумаги); + + Состояние(); + + Иначе + Элементы.Поворот.Доступность = Ложь; + Элементы.РазмерБумаги.Доступность = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьСтандартныеНастройки(Команда) + ПрочитатьНастройкиСканера(); +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/РазмерФайлаВРабочемКаталогеОтличается/Form.form b/SSL/src/Catalogs/Файлы/Forms/РазмерФайлаВРабочемКаталогеОтличается/Form.form new file mode 100644 index 000000000..91b6c0a3b --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/РазмерФайлаВРабочемКаталогеОтличается/Form.form @@ -0,0 +1,423 @@ + + + + Сообщение + 14 + true + true + + true + + + Сообщение + + None + + СообщениеРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + СообщениеКонтекстноеМеню + 15 + true + + LabelField + Enter + true + Left + true + + 95 + true + 1 + true + + + + Группа + 12 + + Файл + 1 + true + true + + true + + + Файл + + + ФайлРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ФайлКонтекстноеМеню + 2 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ОткрытьКаталог + 13 + true + true + + true + + false + + ОткрытьКаталогРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + UsualButton + Form.Command.ОткрытьКаталог + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + РазмерФайлаНаСервере + 5 + true + true + + true + + + РазмерФайлаНаСервере + + + РазмерФайлаНаСервереРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + РазмерФайлаНаСервереКонтекстноеМеню + 6 + true + + LabelField + true + Enter + true + Left + true + + true + true + + + + РазмерВРабочемКаталоге + 7 + true + true + + true + + + РазмерВРабочемКаталоге + + + РазмерВРабочемКаталогеРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + РазмерВРабочемКаталогеКонтекстноеМеню + 8 + true + + LabelField + true + Enter + true + Left + true + + true + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Да + 17 + true + true + + true + + false + + ДаРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.StandardCommand.Yes + Normal + Auto + true + true + UserCmds + Auto + + + Нет + 18 + true + true + + true + + false + + НетРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Form.StandardCommand.No + Normal + Auto + true + true + UserCmds + Auto + + + Отмена + 11 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Файл + + <key>ru</key> + <value>Файл</value> + + 1 + + String + + + + true + + + true + + + + РазмерФайлаНаСервере + + <key>ru</key> + <value>Размер файла на сервере</value> + + 2 + + Number + + 9 + + + + true + + + true + + + + РазмерВРабочемКаталоге + + <key>ru</key> + <value>Размер в рабочем каталоге</value> + + 3 + + Number + + 9 + + + + true + + + true + + + + Сообщение + + <key>ru</key> + <value>Сообщение</value> + + 4 + + String + + + + true + + + true + + + + ОткрытьКаталог + + <key>ru</key> + <value>Открыть каталог</value> + + 3 + + ru + Открыть каталог + + + true + + + CommonPicture.Папка + + + + ОткрытьКаталог + + + Picture + Auto + Auto + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/РазмерФайлаВРабочемКаталогеОтличается/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/РазмерФайлаВРабочемКаталогеОтличается/Module.bsl new file mode 100644 index 000000000..cdc9a4119 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/РазмерФайлаВРабочемКаталогеОтличается/Module.bsl @@ -0,0 +1,12 @@ +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + РазмерВРабочемКаталоге = Параметры.РазмерВРабочемКаталоге; + РазмерФайлаНаСервере = Параметры.РазмерФайлаНаСервере; + Файл = Параметры.Файл; + Сообщение = Параметры.Сообщение; +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКаталог(Команда) + РаботаСФайламиКлиент.ОткрытьПроводникСФайлом(Файл); +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Attributes/СписокФайлов/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Attributes/СписокФайлов/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Attributes/СписокФайлов/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Form.form b/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Form.form new file mode 100644 index 000000000..8463a2498 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Form.form @@ -0,0 +1,1044 @@ + + + + <key>ru</key> + <value>Редактируемые файлы</value> + + + ОсновнаяКоманднаяПанель + 1 + + ОткрытьФайл + 53 + true + true + + true + + false + + ОткрытьФайлРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + Form.Command.ОткрытьФайл + Normal + Auto + true + true + UserCmds + Auto + + + ЗакончитьРедактирование + 52 + true + true + + true + + false + + ЗакончитьРедактированиеРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + Form.Command.ЗакончитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + + Изменить + 20 + + <key>ru</key> + <value>Открыть карточку</value> + + true + true + + true + + false + + ИзменитьРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Change + Normal + PictureAndText + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + CommandBar + + Left + + + + Список + 6 + true + true + + true + + + СписокФайлов + + true + false + None + + Группа + 26 + + Картинка + 7 + true + true + + true + + + СписокФайлов.ИндексКартинки + + None + + КартинкаРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + КартинкаКонтекстноеМеню + 3 + true + + PictureField + Enter + true + Left + true + Left + + 2 + true + 1 + true + true + true + + CommonPicture.ПиктограммыФайлов + + + 1 + + + + + Наименование + 9 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + СписокФайлов.Description + + true + + НаименованиеРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + Описание + 13 + true + true + + true + + + СписокФайлов.Описание + + + ОписаниеРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + Left + + true + 1 + true + true + true + true + + Style.BorderColor + + Normal + + + + ТекущаяВерсияРазмер + 61 + + <key>ru</key> + <value>Размер (Кб)</value> + + true + true + + true + + + СписокФайлов.Размер + + + ru + Размер текущей версии + + + ТекущаяВерсияРазмерРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + + ТекущаяВерсияРазмерКонтекстноеМеню + 62 + true + + LabelField + Enter + true + Left + true + + true + true + + ru + ЧЦ=10; ЧН=0 + + + + None + + СписокКоманднаяПанель + 15 + Left + true + + + Selection + СписокВыбор + + + BeforeAddRow + СписокПередНачаломДобавления + + + OnActivateRow + СписокПриАктивизацииСтроки + + + СписокСтрокаПоиска + 79 + + СписокСтрокаПоискаРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 80 + true + + Список + + true + + + + СписокСостояниеПросмотра + 82 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 83 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 85 + + СписокУправлениеПоискомРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 86 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + + КонтекстноеМенюСписокОткрытьФайл + 54 + true + true + + true + + false + + КонтекстноеМенюСписокОткрытьФайлРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + Form.Command.ОткрытьФайл + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокЗакончитьРедактирование + 55 + true + true + + true + + false + + КонтекстноеМенюСписокЗакончитьРедактированиеРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + Form.Command.ЗакончитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСохранитьИзменения + 57 + true + true + + true + + false + + КонтекстноеМенюСписокСохранитьИзмененияРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + Form.Command.СохранитьИзменения + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокОткрытьКаталогФайла + 58 + true + true + + true + + false + + КонтекстноеМенюСписокОткрытьКаталогФайлаРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + Form.Command.ОткрытьКаталогФайла + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСохранитьКак + 59 + true + true + + true + + false + + КонтекстноеМенюСписокСохранитьКакРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + Form.Command.СохранитьКак + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокОсвободить + 56 + + <key>ru</key> + <value>Отменить редактирование</value> + + true + true + + true + + false + + КонтекстноеМенюСписокОсвободитьРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Form.Command.Освободить + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокОбновитьИзФайлаНаДиске + 63 + true + true + + true + + false + + КонтекстноеМенюСписокОбновитьИзФайлаНаДискеРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + Form.Command.ОбновитьИзФайлаНаДиске + Normal + Auto + true + true + UserCmds + Auto + + + ОбщиеКоманды + 60 + + ВывестиСписок + 24 + true + true + + true + + false + + ВывестиСписокРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + InAdditionalSubmenu + + + ОбщаяКоманда_ДополнительныеСведения + 41 + true + true + + true + + + Items.Список.CurrentData.Ref + + false + + ОбщаяКоманда_ДополнительныеСведенияРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + CommonCommand.ДополнительныеСведения + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Общие команды</value> + + + ru + Общие команды + + + ОбщиеКомандыРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + + + + true + true + 40 + true + true + 10 + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + + Style.BorderColor + + None + None + None + true + + true + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + true + + true + +
    + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + СписокФайлов + + <key>ru</key> + <value>Список файлов</value> + + 1 + + DynamicList + + + true + + + true + + + СписокФайлов.АвторТекущейВерсии + + + СписокФайлов.Автор + + + СписокФайлов.Редактирует + + + СписокФайлов.ХранитьВерсии + +
    true
    + + ВЫБРАТЬ РАЗРЕШЕННЫЕ + Файлы.Код, + Файлы.Редактирует, + Файлы.ИндексКартинки, + Файлы.Наименование, + Файлы.Описание, + Файлы.Ссылка, + Файлы.ХранитьВерсии, + Файлы.ВладелецФайла, + Файлы.ТекущаяВерсияРазмер/1024 КАК Размер, + Файлы.ТекущаяВерсияАвтор КАК Автор +ИЗ + Справочник.Файлы КАК Файлы +ГДЕ + Файлы.Редактирует = &Редактирует + Catalog.Файлы + true + true + true + true + true + +
    + + ОткрытьФайл + + <key>ru</key> + <value>Открыть файл</value> + + 1 + + ru + Открыть файл для просмотра + + + true + + F4 + + CommonPicture.КартинкаОткрыть + + + + ОткрытьФайл + + + TextPicture + Auto + Auto + + + ЗакончитьРедактирование + + <key>ru</key> + <value>Закончить редактирование</value> + + 2 + + ru + Сохранить и освободить файл в информационной базе + + + true + + + CommonPicture.КартинкаЗакончитьРедактирование + + + + ЗакончитьРедактирование + + + TextPicture + Auto + Auto + + + Освободить + + <key>ru</key> + <value>Освободить</value> + + 3 + + ru + Освободить занятый файл + + + true + + + CommonPicture.КартинкаОсвободить + + + + Освободить + + + TextPicture + Auto + Auto + + + СохранитьИзменения + + <key>ru</key> + <value>Сохранить изменения</value> + + 4 + + ru + Сохранить изменения + + + true + + + CommonPicture.КартинкаОпубликовать + + + + СохранитьИзменения + + + Auto + Auto + + + ОткрытьКаталогФайла + + <key>ru</key> + <value>Открыть каталог файла</value> + + 5 + + ru + Открыть каталог файла + + + true + + + CommonPicture.Папка + + + + ОткрытьКаталогФайла + + + TextPicture + Auto + Auto + + + СохранитьКак + + <key>ru</key> + <value>Сохранить как...</value> + + 6 + + ru + Сохранить файл на диск или другое устройство + + + true + + + CommonPicture.КартинкаСохранитьКак + + + + СохранитьКак + + + TextPicture + Auto + Auto + + + ОбновитьИзФайлаНаДиске + + <key>ru</key> + <value>Обновить из файла на диске...</value> + + 7 + + ru + Обновить из файла на диске + + + true + + + + ОбновитьИзФайлаНаДиске + + + Auto + Auto + + + + + + + СписокКонтекстноеМеню + +
    diff --git a/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Help/ru.html new file mode 100644 index 000000000..abe70d957 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Help/ru.html @@ -0,0 +1,3 @@ + +

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

    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Module.bsl new file mode 100644 index 000000000..cf5dd1cf0 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/РедактируемыеФайлы/Module.bsl @@ -0,0 +1,156 @@ + +// Обработка события Выбор у списка +// +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + РаботаСФайламиКлиент.ОткрытьФайл( + РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(ВыбраннаяСтрока, Неопределено, УникальныйИдентификатор)); + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Пользователь = ОбщегоНазначения.ТекущийПользователь(); + СписокФайлов.Параметры.УстановитьЗначениеПараметра("Редактирует", Пользователь); + + ПоказыватьКолонкуРазмер = РаботаСФайлами.ПолучитьПоказыватьКолонкуРазмер(); + Если ПоказыватьКолонкуРазмер = Ложь Тогда + Элементы.ТекущаяВерсияРазмер.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + Отказ = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура ЗакончитьРедактирование(Команда) + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + РедактируетТекущийПользователь = Истина; + КомандыРаботыСФайлами.ЗакончитьРедактирование( + Элементы.Список.ТекущаяСтрока, + УникальныйИдентификатор, + Элементы.Список.ТекущиеДанные.ХранитьВерсии, + РедактируетТекущийПользователь, + Элементы.Список.ТекущиеДанные.Редактирует, + Элементы.Список.ТекущиеДанные.Автор); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФайл(Команда) + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, Неопределено, УникальныйИдентификатор); + КомандыРаботыСФайлами.Открыть(ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура Освободить(Команда) + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + РедактируетТекущийПользователь = Истина; + КомандыРаботыСФайлами.ОсвободитьФайл( + Элементы.Список.ТекущаяСтрока, + Элементы.Список.ТекущиеДанные.ХранитьВерсии, + РедактируетТекущийПользователь, + Элементы.Список.ТекущиеДанные.Редактирует); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьИзменения(Команда) + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + КомандыРаботыСФайлами.ОпубликоватьФайл( + Элементы.Список.ТекущаяСтрока, + УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКаталогФайла(Команда) + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия( + Элементы.Список.ТекущаяСтрока, Неопределено, УникальныйИдентификатор); + + КомандыРаботыСФайлами.ОткрытьКаталогФайла(ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьКак(Команда) + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляСохранения( + Элементы.Список.ТекущаяСтрока, + Неопределено, + УникальныйИдентификатор); + + КомандыРаботыСФайлами.СохранитьКак(ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИзФайлаНаДиске(Команда) + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИРабочийКаталог(Элементы.Список.ТекущаяСтрока); + КомандыРаботыСФайлами.ОбновитьИзФайлаНаДиске(ДанныеФайла, УникальныйИдентификатор); +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьКомманд(Доступность) + Элементы.ЗакончитьРедактирование.Доступность = Доступность; + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокЗакончитьРедактирование.Доступность = Доступность; + + Элементы.ОткрытьФайл.Доступность = Доступность; + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокОткрытьФайл.Доступность = Доступность; + + Элементы.Изменить.Доступность = Доступность; + + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокСохранитьИзменения.Доступность = Доступность; + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокОткрытьКаталогФайла.Доступность = Доступность; + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокСохранитьКак.Доступность = Доступность; + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокОсвободить.Доступность = Доступность; + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокОбновитьИзФайлаНаДиске.Доступность = Доступность; +КонецПроцедуры + +&НаКлиенте +Процедура СписокПриАктивизацииСтроки(Элемент) + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + УстановитьДоступностьКомманд(Ложь); + Иначе + УстановитьДоступностьКомманд(Истина); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Form.form b/SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Form.form new file mode 100644 index 000000000..cf7002730 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Form.form @@ -0,0 +1,543 @@ + + + + <key>ru</key> + <value>Режим сохранения файла</value> + + + ГруппаСообщение + 18 + + ДекорацияИконка + 19 + + <key>ru</key> + <value>Декорация иконка</value> + + true + true + + true + + + ДекорацияИконкаРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ДекорацияИконкаКонтекстноеМеню + 20 + true + + 4 + true + 2 + true + false + false + false + + + CommonPicture.Предупреждение32 + + + + + Сообщение + 3 + true + true + + true + + + Сообщение + + None + + СообщениеРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + СообщениеКонтекстноеМеню + 4 + true + + LabelField + Enter + true + Left + true + + 65 + true + 2 + true + false + + + true + true + + true + + + <key>ru</key> + <value>Группа сообщение</value> + + + ru + Группа сообщение + + + ГруппаСообщениеРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + UsualGroup + + Auto + StrongSeparation + true + true + Auto + Auto + + + + ГруппаФайл + 13 + + ДекорацияПодписьФайла + 15 + + <key>ru</key> + <value>Файл на локальном компьютере:</value> + + true + true + + true + + + ДекорацияПодписьФайлаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ДекорацияПодписьФайлаКонтекстноеМеню + 16 + true + + Label + true + true + false + + Left + + + + ГруппаФайлИКнопка + 17 + + Файл + 8 + true + true + + true + + + Файл + + None + + ФайлРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ФайлКонтекстноеМеню + 9 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ОткрытьКаталог + 14 + true + true + + true + + false + + ОткрытьКаталогРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + UsualButton + Form.Command.ОткрытьКаталог + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа файл и кнопка</value> + + + ru + Группа файл и кнопка + + + ГруппаФайлИКнопкаРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа файл</value> + + + ru + Группа файл + + + ГруппаФайлРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + РежимСозданияФайла + 5 + + <key>ru</key> + <value>Выберите режим сохранения файла</value> + + true + true + + true + + + РежимСозданияФайла + + Top + + РежимСозданияФайлаРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + РежимСозданияФайлаКонтекстноеМеню + 6 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + На основе файла на локальном компьютере (рекомендуется) + + + 1 + + + + + ru + На основе файла в информационной базе + + + 0 + + + Vertical + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ОК + 12 + true + true + + true + + false + + ОКРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 11 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Сообщение + + <key>ru</key> + <value>Сообщение</value> + + 2 + + String + + + + true + + + true + + + + РежимСозданияФайла + + <key>ru</key> + <value>Режим создания файла</value> + + 3 + + Number + + 10 + + + + true + + + true + + + + Файл + + <key>ru</key> + <value>Файл</value> + + 4 + + String + + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + ОткрытьКаталог + + <key>ru</key> + <value>Открыть каталог</value> + + 2 + + ru + Открыть каталог файла + + + true + + + CommonPicture.Папка + + + + ОткрытьКаталог + + + Picture + Auto + Auto + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Module.bsl new file mode 100644 index 000000000..18d3ce360 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/РежимСозданияФайлаДляСохранитьКак/Module.bsl @@ -0,0 +1,18 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Файл = Параметры.Файл; + Сообщение = Параметры.Сообщение; + + РежимСозданияФайла = 1; +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + Закрыть(РежимСозданияФайла); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКаталог(Команда) + РаботаСФайламиКлиент.ОткрытьПроводникСФайлом(Файл); +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/РезультатСканирования/Form.form b/SSL/src/Catalogs/Файлы/Forms/РезультатСканирования/Form.form new file mode 100644 index 000000000..fbfb72546 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/РезультатСканирования/Form.form @@ -0,0 +1,460 @@ + + + + <key>ru</key> + <value>Изображение</value> + + + Картинка + 6 + true + true + + true + + + АдресКартинки + + None + + КартинкаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + КартинкаКонтекстноеМеню + 7 + true + + PictureField + Enter + true + Left + true + + true + true + true + true + AutoSize + + ru + Подождите. Идет сканирование... + + + + 1 + + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Принять + 3 + true + true + + true + + false + + ПринятьРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + Form.Command.Принять + Auto + true + true + true + UserCmds + Auto + + + Пересканировать + 5 + true + true + + true + + false + + ПересканироватьРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + Form.Command.Пересканировать + Normal + Auto + true + true + UserCmds + Auto + + + Отмена + 4 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnOpen + ПриОткрытии + + + ExternalEvent + ВнешнееСобытие + + + OnCreateAtServer + ПриСозданииНаСервере + + + OnClose + ПриЗакрытии + + 80 + 30 + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + 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 + + AnyRef + + + true + + + true + + + + ИмяФайла + + <key>ru</key> + <value>Имя файла</value> + + 4 + + String + + + + true + + + true + + + + НеОткрыватьКарточкуПослеСозданияИзФайла + + <key>ru</key> + <value>Не открывать карточку после создания из файла</value> + + 5 + + + true + + + true + + + + ФорматКартинки + + <key>ru</key> + <value>Формат картинки</value> + + 6 + + String + + + + true + + + true + + + + Разрешение + + <key>ru</key> + <value>Разрешение</value> + + 7 + + Number + + 10 + + + + true + + + true + + + + Цветность + + <key>ru</key> + <value>Цветность</value> + + 8 + + Number + + 10 + + + + true + + + true + + + + Поворот + + <key>ru</key> + <value>Поворот</value> + + 9 + + Number + + 10 + + + + true + + + true + + + + РазмерБумаги + + <key>ru</key> + <value>Размер бумаги</value> + + 10 + + Number + + 10 + + + + true + + + true + + + + ПоказыватьДиалогСканера + + <key>ru</key> + <value>Показывать диалог сканера</value> + + 11 + + Boolean + + + true + + + true + + + + ИмяУстройстваСканирования + + <key>ru</key> + <value>Имя устройства сканирования</value> + + 12 + + String + + + + true + + + true + + + + Принять + + <key>ru</key> + <value>Принять</value> + + 1 + + ru + Принять + + + true + + + + Принять + + + Auto + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Отмена + + + true + + + + Отмена + + + Auto + Auto + + + Пересканировать + + <key>ru</key> + <value>Пересканировать</value> + + 3 + + ru + Пересканировать + + + true + + + + Пересканировать + + + Auto + Auto + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/РезультатСканирования/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/РезультатСканирования/Module.bsl new file mode 100644 index 000000000..515cd36af --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/РезультатСканирования/Module.bsl @@ -0,0 +1,202 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("ВладелецФайла") Тогда + ВладелецФайла = Параметры.ВладелецФайла; + КонецЕсли; + + ИдентификаторКлиента = Параметры.ИдентификаторКлиента; + + Если Параметры.Свойство("НеОткрыватьКарточкуПослеСозданияИзФайла") Тогда + НеОткрыватьКарточкуПослеСозданияИзФайла = Параметры.НеОткрыватьКарточкуПослеСозданияИзФайла; + КонецЕсли; + + Номер = РаботаСФайлами.ПолучитьНовыйНомерДляСканирования(ВладелецФайла); + ИмяФайла = Формат(Номер, "ЧЦ=9; ЧВН=; ЧГ=0"); + + ФорматСканированногоИзображения = + ХранилищеОбщихНастроек.Загрузить("НастройкиСканирования/ФорматСканированногоИзображения", ИдентификаторКлиента); + Если ФорматСканированногоИзображения = Неопределено Тогда + ФорматСканированногоИзображения = Перечисления.ФорматыСканированногоИзображения.PNG; + ХранилищеОбщихНастроек.Сохранить("НастройкиСканирования/ФорматСканированногоИзображения", ИдентификаторКлиента, ФорматСканированногоИзображения); + КонецЕсли; + ФорматКартинки = Строка(ФорматСканированногоИзображения); + + РазрешениеПеречисление = ХранилищеОбщихНастроек.Загрузить("НастройкиСканирования/Разрешение", ИдентификаторКлиента); + ЦветностьПеречисление = ХранилищеОбщихНастроек.Загрузить("НастройкиСканирования/Цветность", ИдентификаторКлиента); + + ПоворотПеречисление = ХранилищеОбщихНастроек.Загрузить("НастройкиСканирования/Поворот", ИдентификаторКлиента); + РазмерБумагиПеречисление = ХранилищеОбщихНастроек.Загрузить("НастройкиСканирования/РазмерБумаги", ИдентификаторКлиента); + + ПоказыватьДиалогСканераЗагрузка = + ХранилищеОбщихНастроек.Загрузить("НастройкиСканирования/ПоказыватьДиалогСканера", ИдентификаторКлиента); + Если ПоказыватьДиалогСканераЗагрузка = Неопределено Тогда + ПоказыватьДиалогСканераЗагрузка = Истина; + ХранилищеОбщихНастроек.Сохранить("НастройкиСканирования/ПоказыватьДиалогСканера", ИдентификаторКлиента, ПоказыватьДиалогСканераЗагрузка); + КонецЕсли; + ПоказыватьДиалогСканера = ПоказыватьДиалогСканераЗагрузка; + + ИмяУстройства = + ХранилищеОбщихНастроек.Загрузить("НастройкиСканирования/ИмяУстройства", ИдентификаторКлиента); + Если ИмяУстройства = Неопределено Тогда + ИмяУстройства = ""; + ХранилищеОбщихНастроек.Сохранить("НастройкиСканирования/ИмяУстройства", ИдентификаторКлиента, ИмяУстройства); + КонецЕсли; + ИмяУстройстваСканирования = ИмяУстройства; + + Разрешение = -1; + Если РазрешениеПеречисление = Перечисления.РазрешенияСканированногоИзображения.dpi200 Тогда + Разрешение = 200; + ИначеЕсли РазрешениеПеречисление = Перечисления.РазрешенияСканированногоИзображения.dpi300 Тогда + Разрешение = 300; + ИначеЕсли РазрешениеПеречисление = Перечисления.РазрешенияСканированногоИзображения.dpi600 Тогда + Разрешение = 600; + ИначеЕсли РазрешениеПеречисление = Перечисления.РазрешенияСканированногоИзображения.dpi1200 Тогда + Разрешение = 1200; + КонецЕсли; + + Цветность = -1; + Если ЦветностьПеречисление = Перечисления.ЦветностиИзображения.Монохромное Тогда + Цветность = 0; + ИначеЕсли ЦветностьПеречисление = Перечисления.ЦветностиИзображения.ГрадацииСерого Тогда + Цветность = 1; + ИначеЕсли ЦветностьПеречисление = Перечисления.ЦветностиИзображения.Цветное Тогда + Цветность = 2; + КонецЕсли; + + Поворот = 0; + Если ПоворотПеречисление = Перечисления.ПоворотИзображения.НетПоворота Тогда + Поворот = 0; + ИначеЕсли ПоворотПеречисление = Перечисления.ПоворотИзображения.ВправоНа90 Тогда + Поворот = 90; + ИначеЕсли ПоворотПеречисление = Перечисления.ПоворотИзображения.ВправоНа180 Тогда + Поворот = 180; + ИначеЕсли ПоворотПеречисление = Перечисления.ПоворотИзображения.ВлевоНа90 Тогда + Поворот = 270; + КонецЕсли; + + РазмерБумаги = 0; + Если РазмерБумагиПеречисление = Перечисления.РазмерыБумаги.НеЗадано Тогда + РазмерБумаги = 0; + ИначеЕсли РазмерБумагиПеречисление = Перечисления.РазмерыБумаги.A3 Тогда + РазмерБумаги = 11; + ИначеЕсли РазмерБумагиПеречисление = Перечисления.РазмерыБумаги.A4 Тогда + РазмерБумаги = 1; + ИначеЕсли РазмерБумагиПеречисление = Перечисления.РазмерыБумаги.A5 Тогда + РазмерБумаги = 5; + ИначеЕсли РазмерБумагиПеречисление = Перечисления.РазмерыБумаги.B4 Тогда + РазмерБумаги = 6; + ИначеЕсли РазмерБумагиПеречисление = Перечисления.РазмерыБумаги.B5 Тогда + РазмерБумаги = 2; + ИначеЕсли РазмерБумагиПеречисление = Перечисления.РазмерыБумаги.B6 Тогда + РазмерБумаги = 7; + ИначеЕсли РазмерБумагиПеречисление = Перечисления.РазмерыБумаги.C4 Тогда + РазмерБумаги = 14; + ИначеЕсли РазмерБумагиПеречисление = Перечисления.РазмерыБумаги.C5 Тогда + РазмерБумаги = 15; + ИначеЕсли РазмерБумагиПеречисление = Перечисления.РазмерыБумаги.C6 Тогда + РазмерБумаги = 16; + ИначеЕсли РазмерБумагиПеречисление = Перечисления.РазмерыБумаги.USLetter Тогда + РазмерБумаги = 3; + ИначеЕсли РазмерБумагиПеречисление = Перечисления.РазмерыБумаги.USLegal Тогда + РазмерБумаги = 4; + ИначеЕсли РазмерБумагиПеречисление = Перечисления.РазмерыБумаги.USExecutive Тогда + РазмерБумаги = 10; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если Не РаботаСоСканеромКлиент.ПроинициализироватьКомпоненту() Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + ПоказыватьДиалог = ПоказыватьДиалогСканера; + ВыбранноеУстройство = ИмяУстройстваСканирования; + + Если ВыбранноеУстройство = "" Тогда + НастройкаИмя = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВыборУстройстваСканирования"); + Если ТипЗнч(НастройкаИмя) = Тип("Структура") Тогда + ВыбранноеУстройство = НастройкаИмя.Значение; + КонецЕсли; + + Если ВыбранноеУстройство = "" Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + КонецЕсли; + + Если Разрешение = -1 ИЛИ Цветность = -1 ИЛИ Поворот = -1 ИЛИ РазмерБумаги = -1 Тогда + + Разрешение = РаботаСоСканеромКлиент.ПолучитьНастройку(ВыбранноеУстройство, "XRESOLUTION"); + Цветность = РаботаСоСканеромКлиент.ПолучитьНастройку(ВыбранноеУстройство, "PIXELTYPE"); + Поворот = РаботаСоСканеромКлиент.ПолучитьНастройку(ВыбранноеУстройство, "ROTATION"); + РазмерБумаги = РаботаСоСканеромКлиент.ПолучитьНастройку(ВыбранноеУстройство, "SUPPORTEDSIZES"); + + СистемнаяИнформация = Новый СистемнаяИнформация(); + ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; + + РаботаСФайлами.ПреобразоватьИСохранитьПараметрыСканера(Разрешение, Цветность, + Поворот, РазмерБумаги, ИдентификаторКлиента); + КонецЕсли; + + ИмяФайлаКартинки = ""; + Элементы.Принять.Доступность = Ложь; + + КомпонентаTwain.НачатьСканирование(ПоказыватьДиалог, ВыбранноеУстройство, ФорматКартинки, Разрешение, Цветность, Поворот, РазмерБумаги); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии() + Если АдресКартинки <> "" Тогда + УдалитьИзВременногоХранилища(АдресКартинки); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура Отмена(Команда) + УдалитьФайлы(ПутьКФайлу); + Закрыть(); +КонецПроцедуры + +&НаКлиенте +Процедура Пересканировать(Команда) + УдалитьФайлы(ПутьКФайлу); + Если АдресКартинки <> "" Тогда + УдалитьИзВременногоХранилища(АдресКартинки); + КонецЕсли; + АдресКартинки = ""; + + ПоказыватьДиалог = ПоказыватьДиалогСканера; + ВыбранноеУстройство = ИмяУстройстваСканирования; + + КомпонентаTwain.НачатьСканирование(ПоказыватьДиалог, ВыбранноеУстройство, ФорматКартинки, Разрешение, Цветность, Поворот, РазмерБумаги); +КонецПроцедуры + +&НаКлиенте +Процедура Принять(Команда) + Закрыть(); + РаботаСФайламиКлиент.СоздатьДокументНаОсновеФайла(ПутьКФайлу, ВладелецФайла, ЭтаФорма, НеОткрыватьКарточкуПослеСозданияИзФайла, ИмяФайла); + УдалитьФайлы(ПутьКФайлу); +КонецПроцедуры + +&НаКлиенте +Процедура ВнешнееСобытие(Источник, Событие, Данные) + + Если Источник = "TWAIN" И Событие = "ImageAcquired" Тогда + + ИмяФайлаКартинки = Данные; + Элементы.Принять.Доступность = Истина; + + ПутьКФайлу = ИмяФайлаКартинки; + + ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу); + АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор); + + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Attributes/СписокФайлов/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Attributes/СписокФайлов/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Attributes/СписокФайлов/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Form.form b/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Form.form new file mode 100644 index 000000000..c914e1204 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Form.form @@ -0,0 +1,1257 @@ + + + + КоманднаяПанель + 1 + + ОткрытьФайл + 53 + true + true + + true + + false + + ОткрытьФайлРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Form.Command.ОткрытьФайл + Normal + Auto + true + true + UserCmds + Auto + + + ЗакончитьРедактирование + 52 + true + true + + true + + false + + ЗакончитьРедактированиеРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + Form.Command.ЗакончитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + + Изменить + 20 + + <key>ru</key> + <value>Открыть карточку</value> + + true + true + + true + + false + + ИзменитьРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Change + Normal + PictureAndText + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + ru + Командная панель + + + КоманднаяПанельРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + CommandBar + + Left + + + + СообщениеЗаголовок + 64 + true + true + + true + + + СообщениеЗаголовок + + None + + СообщениеЗаголовокРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + СообщениеЗаголовокКонтекстноеМеню + 65 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Список + 6 + true + true + + true + + + СписокФайлов + + true + false + None + + Группа + 26 + + Картинка + 7 + true + true + + true + + + СписокФайлов.ИндексКартинки + + None + + КартинкаРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + + КартинкаКонтекстноеМеню + 3 + true + + PictureField + Enter + true + Left + true + Left + + 2 + true + 1 + true + true + true + + CommonPicture.ПиктограммыФайлов + + + 1 + + + + + Наименование + 9 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + СписокФайлов.Description + + true + + НаименованиеРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + Left + + 40 + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + Описание + 13 + true + true + + true + + + СписокФайлов.Описание + + + ОписаниеРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + Left + + true + 1 + true + true + true + true + + Style.BorderColor + + Normal + + + None + + СписокКоманднаяПанель + 15 + Left + true + + + Selection + СписокВыбор + + + BeforeAddRow + СписокПередНачаломДобавления + + + СписокСтрокаПоиска + 89 + + СписокСтрокаПоискаРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 90 + true + + Список + + true + + + + СписокСостояниеПросмотра + 92 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 93 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 95 + + СписокУправлениеПоискомРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 96 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + + КонтекстноеМенюСписокОткрытьФайл + 54 + true + true + + true + + false + + КонтекстноеМенюСписокОткрытьФайлРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + Form.Command.ОткрытьФайл + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокЗакончитьРедактирование + 55 + true + true + + true + + false + + КонтекстноеМенюСписокЗакончитьРедактированиеРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + Form.Command.ЗакончитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСохранитьИзменения + 57 + true + true + + true + + false + + КонтекстноеМенюСписокСохранитьИзмененияРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + Form.Command.СохранитьИзменения + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокОткрытьКаталогФайла + 58 + true + true + + true + + false + + КонтекстноеМенюСписокОткрытьКаталогФайлаРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + Form.Command.ОткрытьКаталогФайла + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСохранитьКак + 59 + true + true + + true + + false + + КонтекстноеМенюСписокСохранитьКакРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + Form.Command.СохранитьКак + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокОсвободить + 56 + + <key>ru</key> + <value>Отменить редактирование</value> + + true + true + + true + + false + + КонтекстноеМенюСписокОсвободитьРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + Form.Command.Освободить + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокОбновитьИзФайлаНаДиске + 63 + true + true + + true + + false + + КонтекстноеМенюСписокОбновитьИзФайлаНаДискеРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + Form.Command.ОбновитьИзФайлаНаДиске + Normal + Auto + true + true + UserCmds + Auto + + + ОбщиеКоманды + 60 + + ВывестиСписок + 24 + true + true + + true + + false + + ВывестиСписокРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + InAdditionalSubmenu + + + ОбщаяКоманда_ДополнительныеСведения + 41 + true + true + + true + + + Items.Список.CurrentData.Ref + + false + + ОбщаяКоманда_ДополнительныеСведенияРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + CommonCommand.ДополнительныеСведения + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Общие команды</value> + + + ru + Общие команды + + + ОбщиеКомандыРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + + + true + true + 8 + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + + Style.BorderColor + + None + None + None + true + + true + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + true + + true + +
    + + СообщениеВопрос + 66 + true + true + + true + + + СообщениеВопрос + + None + + СообщениеВопросРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + + СообщениеВопросКонтекстноеМеню + 67 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ОсновнаяКоманднаяПанель + 68 + + Да + 69 + + <key>ru</key> + <value>Да</value> + + true + true + + true + + false + + ДаРасширеннаяПодсказка + 116 + Label + true + true + + Left + + + Form.StandardCommand.Yes + Auto + true + true + true + UserCmds + Auto + + + Нет + 70 + + <key>ru</key> + <value>Нет</value> + + true + true + + true + + false + + НетРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + Form.StandardCommand.No + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 71 + + <key>ru</key> + <value>Справка</value> + + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 118 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Основная командная панель</value> + + + ru + Основная командная панель + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + 60 + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + СписокФайлов + + <key>ru</key> + <value>Список файлов</value> + + 1 + + DynamicList + + + true + + + true + + + СписокФайлов.Редактирует + + + СписокФайлов.ХранитьВерсии + +
    true
    + + ВЫБРАТЬ РАЗРЕШЕННЫЕ + Файлы.Код, + Файлы.Редактирует, + Файлы.ИндексКартинки, + Файлы.Наименование, + Файлы.Описание, + Файлы.Ссылка, + Файлы.ХранитьВерсии, + Файлы.ВладелецФайла +ИЗ + Справочник.Файлы КАК Файлы +ГДЕ + Файлы.Редактирует <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + Catalog.Файлы + true + true + true + true + true + +
    + + СообщениеВопрос + + <key>ru</key> + <value>Сообщение вопрос</value> + + 2 + + String + + + + true + + + true + + + + СообщениеЗаголовок + + <key>ru</key> + <value>Сообщение заголовок</value> + + 3 + + String + + + + true + + + true + + + + ОткрытьФайл + + <key>ru</key> + <value>Открыть файл</value> + + 1 + + ru + Открыть файл для просмотра + + + true + + + CommonPicture.КартинкаОткрыть + + + + ОткрытьФайл + + + TextPicture + Auto + Auto + + + ЗакончитьРедактирование + + <key>ru</key> + <value>Закончить редактирование</value> + + 2 + + ru + Сохранить и освободить файл в информационной базе + + + true + + + CommonPicture.КартинкаЗакончитьРедактирование + + + + ЗакончитьРедактирование + + + TextPicture + Auto + Auto + + + Освободить + + <key>ru</key> + <value>Освободить</value> + + 3 + + ru + Освободить занятый файл + + + true + + + CommonPicture.КартинкаОсвободить + + + + Освободить + + + TextPicture + Auto + Auto + + + СохранитьИзменения + + <key>ru</key> + <value>Сохранить изменения</value> + + 4 + + ru + Сохранить изменения + + + true + + + CommonPicture.КартинкаОпубликовать + + + + СохранитьИзменения + + + Auto + Auto + + + ОткрытьКаталогФайла + + <key>ru</key> + <value>Открыть каталог файла</value> + + 5 + + ru + Открыть каталог файла + + + true + + + CommonPicture.Папка + + + + ОткрытьКаталогФайла + + + TextPicture + Auto + Auto + + + СохранитьКак + + <key>ru</key> + <value>Сохранить как...</value> + + 6 + + ru + Сохранить файл на диск или другое устройство + + + true + + + CommonPicture.КартинкаСохранитьКак + + + + СохранитьКак + + + TextPicture + Auto + Auto + + + ОбновитьИзФайлаНаДиске + + <key>ru</key> + <value>Обновить из файла на диске...</value> + + 7 + + ru + Обновить из файла на диске + + + true + + + + ОбновитьИзФайлаНаДиске + + + Auto + Auto + + + Заголовок + + String + + + + + СообщениеВопрос + + String + + + + + СообщениеЗаголовок + + String + + + + + ВладелецФайла + + AnyRef + + + + Редактирует + + CatalogRef.Пользователи + + + + + + + + СписокКонтекстноеМеню + +
    diff --git a/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Help/ru.html new file mode 100644 index 000000000..abe70d957 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Help/ru.html @@ -0,0 +1,3 @@ + +

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

    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Module.bsl new file mode 100644 index 000000000..25638dff8 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/СписокЗанятыхСВопросом/Module.bsl @@ -0,0 +1,140 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СообщениеВопрос = Параметры.СообщениеВопрос; + СообщениеЗаголовок = Параметры.СообщениеЗаголовок; + Заголовок = Параметры.Заголовок; + + Если ЗначениеЗаполнено(Параметры.ВладелецФайла) Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + СписокФайлов.Отбор, "ВладелецФайла", Параметры.ВладелецФайла); + КонецЕсли; + + Если ЗначениеЗаполнено(Параметры.Редактирует) Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + СписокФайлов.Отбор, "Редактирует", Параметры.Редактирует); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + РаботаСФайламиКлиент.ОткрытьФайл( + РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(ВыбраннаяСтрока, Неопределено, УникальныйИдентификатор)); + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + Отказ = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ЗаконченоРедактирование" Тогда + Элементы.Список.Обновить(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакончитьРедактирование(Команда) + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + РедактируетТекущийПользователь = Истина; + КомандыРаботыСФайлами.ЗакончитьРедактирование( + Элементы.Список.ТекущаяСтрока, + УникальныйИдентификатор, + Элементы.Список.ТекущиеДанные.ХранитьВерсии, + РедактируетТекущийПользователь, + Элементы.Список.ТекущиеДанные.Редактирует); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФайл(Команда) + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, Неопределено, УникальныйИдентификатор); + КомандыРаботыСФайлами.Открыть(ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура Освободить(Команда) + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + РедактируетТекущийПользователь = Истина; + КомандыРаботыСФайлами.ОсвободитьФайл( + Элементы.Список.ТекущаяСтрока, + Элементы.Список.ТекущиеДанные.ХранитьВерсии, + РедактируетТекущийПользователь, + Элементы.Список.ТекущиеДанные.Редактирует); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьИзменения(Команда) + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + КомандыРаботыСФайлами.ОпубликоватьФайл( + Элементы.Список.ТекущаяСтрока, + УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКаталогФайла(Команда) + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия( + Элементы.Список.ТекущаяСтрока, Неопределено, УникальныйИдентификатор); + + КомандыРаботыСФайлами.ОткрытьКаталогФайла(ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьКак(Команда) + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляСохранения( + Элементы.Список.ТекущаяСтрока, + Неопределено, + УникальныйИдентификатор); + + КомандыРаботыСФайлами.СохранитьКак(ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИзФайлаНаДиске(Команда) + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИРабочийКаталог(Элементы.Список.ТекущаяСтрока); + КомандыРаботыСФайлами.ОбновитьИзФайлаНаДиске(ДанныеФайла, УникальныйИдентификатор); +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/СписокФайловВЛокальномКэшеФайлов/Form.form b/SSL/src/Catalogs/Файлы/Forms/СписокФайловВЛокальномКэшеФайлов/Form.form new file mode 100644 index 000000000..4c2e4a901 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/СписокФайловВЛокальномКэшеФайлов/Form.form @@ -0,0 +1,941 @@ + + + + <key>ru</key> + <value>Список файлов в основном рабочем каталоге</value> + + + ОсновнаяКоманднаяПанель + 1 + + УдалитьИзЛокальногоКэшаФайлов + 12 + true + true + + true + + false + + УдалитьИзЛокальногоКэшаФайловРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.Command.УдалитьИзЛокальногоКэшаФайлов + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + ЗакончитьРедактирвоание + 25 + true + true + + true + + false + + ЗакончитьРедактирвоаниеРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.Command.ЗакончитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + + Освободить + 13 + true + true + + true + + false + + ОсвободитьРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Form.Command.Освободить + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + ОткрытьКаталогФайла + 20 + true + true + + true + + false + + ОткрытьКаталогФайлаРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Form.Command.ОткрытьКаталогФайла + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + CommandBar + + Left + Form + + + + СписокФайлов + 2 + true + true + + true + + + СписокФайлов + + false + None + + ИмяИКартинка + 19 + + Картинка + 4 + true + true + + true + + + СписокФайлов.ИндексКартинки + + None + + КартинкаРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + КартинкаКонтекстноеМеню + 5 + true + + PictureField + Enter + true + Left + true + Left + + 2 + true + 1 + true + true + true + + CommonPicture.ПиктограммыФайлов + + + 1 + + + + + ИмяФайла + 6 + + <key>ru</key> + <value>Файл</value> + + true + true + + true + + + СписокФайлов.ИмяФайла + + + ИмяФайлаРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ИмяФайлаКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Имя и картинка</value> + + + ru + Имя и картинка + + + ИмяИКартинкаРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + Размер + 8 + + <key>ru</key> + <value>Размер</value> + + true + true + + true + + + СписокФайлов.Размер + + + РазмерРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + РазмерКонтекстноеМеню + 9 + true + + InputField + Right + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ДатаИзмененияФайла + 10 + + <key>ru</key> + <value>Дата изменения</value> + + true + true + + true + + + СписокФайлов.ДатаИзмененияФайла + + + ДатаИзмененияФайлаРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ДатаИзмененияФайлаКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + НаРедактирование + 17 + true + true + + true + + + СписокФайлов.НаРедактирование + + + НаРедактированиеРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + НаРедактированиеКонтекстноеМеню + 18 + true + + CheckBoxField + true + Enter + true + Left + true + + + None + + СписокФайловКоманднаяПанель + 16 + Left + true + + + СписокФайловСтрокаПоиска + 36 + + СписокФайловСтрокаПоискаРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + СписокФайловСтрокаПоискаКонтекстноеМеню + 37 + true + + СписокФайлов + + true + + + + СписокФайловСостояниеПросмотра + 39 + + СписокФайловСостояниеПросмотраРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + СписокФайловСостояниеПросмотраКонтекстноеМеню + 40 + true + + ViewStatusAddition + СписокФайлов + + true + + + + СписокФайловУправлениеПоиском + 42 + + СписокФайловУправлениеПоискомРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + СписокФайловУправлениеПоискомКонтекстноеМеню + 43 + true + + SearchControlAddition + СписокФайлов + + true + + + + СписокФайловРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + СписокФайловКонтекстноеМеню + 3 + + КонтекстноеМенюСписокФайловУдалитьИзЛокальногоКэшаФайлов + 21 + true + true + + true + + false + + КонтекстноеМенюСписокФайловУдалитьИзЛокальногоКэшаФайловРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Form.Command.УдалитьИзЛокальногоКэшаФайлов + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокФайловЗакончитьРедактирвоание + 24 + true + true + + true + + false + + КонтекстноеМенюСписокФайловЗакончитьРедактирвоаниеРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.Command.ЗакончитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокФайловОсвободить + 22 + true + true + + true + + false + + КонтекстноеМенюСписокФайловОсвободитьРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.Command.Освободить + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокФайловОткрытьКаталогФайла + 23 + true + true + + true + + false + + КонтекстноеМенюСписокФайловОткрытьКаталогФайлаРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.Command.ОткрытьКаталогФайла + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + 80 + true + true + 11 + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + + Style.BorderColor + + None + None + None + true + +
    + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + 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 + + Number + + + + true + + + true + + + + ДатаИзмененияФайла + + <key>ru</key> + <value>Дата изменения файла</value> + + 3 + + Date + + + + true + + + true + + + + ИндексКартинки + + <key>ru</key> + <value>Индекс картинки</value> + + 4 + + Number + + 10 + + + + true + + + true + + + + Версия + + <key>ru</key> + <value>Версия</value> + + 5 + + CatalogRef.ВерсииФайлов + + + true + + + true + + + + Редактирует + + <key>ru</key> + <value>Редактирует</value> + + 6 + + CatalogRef.Пользователи + + + true + + + true + + + + НаРедактирование + + <key>ru</key> + <value>На редактирование</value> + + 7 + + Boolean + + + true + + + true + + + + + СписокЗначенийФайловВРегистре + + <key>ru</key> + <value>Список значений файлов в регистре</value> + + 2 + + ValueList + + + 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 + + + + + +
    diff --git a/SSL/src/Catalogs/Файлы/Forms/СписокФайловВЛокальномКэшеФайлов/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/СписокФайловВЛокальномКэшеФайлов/Help/ru.html new file mode 100644 index 000000000..a9eb75181 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/СписокФайловВЛокальномКэшеФайлов/Help/ru.html @@ -0,0 +1,4 @@ + +

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

    +

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

    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/СписокФайловВЛокальномКэшеФайлов/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/СписокФайловВЛокальномКэшеФайлов/Module.bsl new file mode 100644 index 000000000..96157eaf4 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/СписокФайловВЛокальномКэшеФайлов/Module.bsl @@ -0,0 +1,130 @@ +&НаКлиенте +Процедура ЗаполнитьСписокФайловВФорме() + РаботаСФайламиКлиент.ПроинициализироватьПутьКРабочемуКаталогу(); + ПутьКЛокальномуКэшуФайлов = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + СписокФайлов.Очистить(); + + Для Каждого Строка Из СписокЗначенийФайловВРегистре Цикл + + ПолныйПуть = ПутьКЛокальномуКэшуФайлов + Строка.Значение.ЧастичныйПуть; + Файл = Новый Файл(ПолныйПуть); + Если Файл.Существует() Тогда + НоваяСтрока = СписокФайлов.Добавить(); + + ДатаФайлаВКеше = Строка.Значение.ДатаМодификацииУниверсальная; + ОбщегоНазначенияКлиент.ПреобразоватьЗимнееВремяКТекущему(ДатаФайлаВКеше); + НоваяСтрока.ДатаИзмененияФайла = ДатаФайлаВКеше; + + НоваяСтрока.ИмяФайла = Строка.Значение.ПолноеНаименование; + НоваяСтрока.ИндексКартинки = Строка.Значение.ИндексКартинки; + НоваяСтрока.Размер = Строка.Значение.Размер; + НоваяСтрока.Версия = Строка.Значение.Ссылка; + НоваяСтрока.Редактирует = Строка.Значение.Редактирует; + НоваяСтрока.НаРедактирование = НЕ Строка.Значение.НаЧтение; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + ЗаполнитьСписокФайловВФорме(); +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьПоСсылке(СсылкаДляУдаления) + КоличествоЭлементов = СписокФайлов.Количество(); + + Для Номер = 0 По КоличествоЭлементов - 1 Цикл + Строка = СписокФайлов[Номер]; + Ссылка = Строка.Версия; + Если Ссылка = СсылкаДляУдаления Тогда + СписокФайлов.Удалить(Номер); + Возврат; + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура ОсвободитьВыполнить() + МассивСсылок = Новый Массив; + Для Каждого Элемент Из Элементы.СписокФайлов.ВыделенныеСтроки Цикл + ДанныеСтроки = Элементы.СписокФайлов.ДанныеСтроки(Элемент); + Ссылка = ДанныеСтроки.Версия; + МассивСсылок.Добавить(Ссылка); + КонецЦикла; + + Для Каждого Ссылка Из МассивСсылок Цикл + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(Неопределено, Ссылка); + + // Проверяем возможность освобождения + СтрокаОшибки = ""; + Если Не РаботаСФайламиКлиент.ВозможностьОсвободитьФайл(ДанныеФайла.Ссылка, ДанныеФайла.РедактируетТекущийПользователь, ДанныеФайла.Редактирует, СтрокаОшибки) Тогда + Предупреждение(СтрокаОшибки); + Продолжить; + КонецЕсли; + + РаботаСФайламиКлиент.ОсвободитьФайл(ДанныеФайла.Ссылка); + КонецЦикла; + + ЗаполнитьСписокФайлов(); + ЗаполнитьСписокФайловВФорме(); +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСписокФайлов() + + СписокФайловВРегистре = РаботаСФайлами.СписокФайловВРегистре(); + СписокЗначенийФайловВРегистре.Очистить(); + + Для Каждого Строка Из СписокФайловВРегистре Цикл + СписокЗначенийФайловВРегистре.Добавить(Строка); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ЗаполнитьСписокФайлов(); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКаталогФайлаВыполнить() + Если Элементы.СписокФайлов.ТекущиеДанные <> Неопределено Тогда + Ссылка = Элементы.СписокФайлов.ТекущиеДанные.Версия; + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(Неопределено, Ссылка); + РаботаСФайламиКлиент.КаталогФайла(ДанныеФайла); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьИзЛокальногоКэшаФайлов(Команда) + МассивСсылок = Новый Массив; + Для Каждого НомерЦикла Из Элементы.СписокФайлов.ВыделенныеСтроки Цикл + ДанныеСтроки = Элементы.СписокФайлов.ДанныеСтроки(НомерЦикла); + Ссылка = ДанныеСтроки.Версия; + Если ДанныеСтроки.НаРедактирование = Ложь Тогда // Если не занят текущим пользователем + МассивСсылок.Добавить(Ссылка); + КонецЕсли; + КонецЦикла; + + Для Каждого Ссылка Из МассивСсылок Цикл + ФайловыеФункцииКлиент.УдалитьФайлИзРабочегоКаталога(Ссылка); + УдалитьПоСсылке(Ссылка); + КонецЦикла; + + Элементы.СписокФайлов.Обновить(); +КонецПроцедуры + +&НаКлиенте +Процедура ЗакончитьРедактирование(Команда) + Если Элементы.СписокФайлов.ТекущиеДанные <> Неопределено Тогда + Ссылка = Элементы.СписокФайлов.ТекущиеДанные.Версия; + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(Неопределено, Ссылка); + КомандыРаботыСФайлами.ЗакончитьРедактирование(ДанныеФайла.Ссылка, УникальныйИдентификатор); + ЗаполнитьСписокФайлов(); + ЗаполнитьСписокФайловВФорме(); + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФайлСуществует/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФайлСуществует/Form.form new file mode 100644 index 000000000..eb520ef6b --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФайлСуществует/Form.form @@ -0,0 +1,321 @@ + + + + ТекстСообщения + 2 + true + true + + true + + + ТекстСообщения + + None + + ТекстСообщенияРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ТекстСообщенияКонтекстноеМеню + 3 + true + + LabelField + Enter + true + Left + true + Left + + 50 + true + 4 + true + true + true + + + + ПрименитьДляВсех + 4 + + <key>ru</key> + <value>Применить ко всем файлам</value> + + true + true + + true + + + ПрименитьДляВсех + + Right + + ПрименитьДляВсехРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ПрименитьДляВсехКонтекстноеМеню + 5 + true + + CheckBoxField + Enter + true + Left + true + Left + + + + ОсновнаяКоманднаяПанель + 1 + + Перезаписать + 6 + true + true + + true + + false + + ПерезаписатьРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + Form.Command.Перезаписать + Normal + Auto + true + true + UserCmds + Auto + + + Пропустить + 7 + true + true + + true + + false + + ПропуститьРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + Form.Command.Пропустить + Normal + Auto + true + true + UserCmds + Auto + + + Прервать + 8 + true + true + + true + + false + + ПрерватьРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + Form.Command.Прервать + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + true + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + CommandBar + + Right + Form + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + Cancel + Close + Help + No + OK + RestoreValues + SaveValues + Yes + DontBlock + DefaultButton + true + true + true + Vertical + true + UseIfNecessary + auto + true + + ТекстСообщения + + <key>ru</key> + <value>Текст сообщения</value> + + 1 + + String + + + + true + + + true + + + + ПрименитьДляВсех + + <key>ru</key> + <value>Применить для всех</value> + + 2 + + Boolean + + + true + + + true + + + + Перезаписать + + <key>ru</key> + <value>Перезаписать</value> + + 1 + + ru + Перезаписать + + + true + + + + ПерезаписатьВыполнить + + + Auto + Auto + + + Пропустить + + <key>ru</key> + <value>Пропустить</value> + + 2 + + ru + Пропустить + + + true + + + + ПропуститьВыполнить + + + Auto + Auto + + + Прервать + + <key>ru</key> + <value>Прервать</value> + + 3 + + ru + Прервать + + + true + + + + ПрерватьВыполнить + + + Auto + Auto + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФайлСуществует/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФайлСуществует/Module.bsl new file mode 100644 index 000000000..c3196b806 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФайлСуществует/Module.bsl @@ -0,0 +1,27 @@ + +&НаКлиенте +Процедура ПерезаписатьВыполнить() + Закрыть(КодВозвратаДиалога.Да); +КонецПроцедуры + +&НаКлиенте +Процедура ПропуститьВыполнить() + Закрыть(КодВозвратаДиалога.Пропустить); +КонецПроцедуры + +&НаКлиенте +Процедура ПрерватьВыполнить() + Закрыть(КодВозвратаДиалога.Прервать); +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьКнопкуУмолчания(ДействиеПоУмолчанию) Экспорт + Если ДействиеПоУмолчанию = "" или ДействиеПоУмолчанию = КодВозвратаДиалога.Пропустить Тогда + Элементы.Пропустить.КнопкаПоУмолчанию = Истина; + ИначеЕсли ДействиеПоУмолчанию = КодВозвратаДиалога.Да Тогда + Элементы.Перезаписать.КнопкаПоУмолчанию = Истина; + ИначеЕсли ДействиеПоУмолчанию = КодВозвратаДиалога.Прервать Тогда + Элементы.Прервать.КнопкаПоУмолчанию = Истина; + КонецЕсли; +КонецПроцедуры // УстановитьКнопкуУмолчания() + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Form.form new file mode 100644 index 000000000..bfc166513 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Form.form @@ -0,0 +1,395 @@ + + + + <key>ru</key> + <value>Сохранение версии файла</value> + + + ПолноеНаименование + 10 + true + true + + true + + + Файл + + None + + ПолноеНаименованиеРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + ПолноеНаименованиеКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + true + true + + + + КомментарийКВерсии + 2 + true + true + + true + + + КомментарийКВерсии + + true + + КомментарийКВерсииРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + КомментарийКВерсииКонтекстноеМеню + 3 + true + + InputField + Enter + true + Left + true + Left + + true + 5 + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + СоздатьНовуюВерсию + 4 + + <key>ru</key> + <value>Создать новую версию (рекомендуется)</value> + + true + true + + true + + + СоздатьНовуюВерсию + + Right + + СоздатьНовуюВерсиюРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СоздатьНовуюВерсиюКонтекстноеМеню + 5 + true + + CheckBoxField + Enter + true + Left + true + Left + + + + ОсновнаяКоманднаяПанель + 1 + + OK + 6 + true + true + + true + + false + + OKРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Закрыть + 9 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Справка + 8 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + 30 + 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 + + Boolean + + + true + + + true + + + + Файл + + <key>ru</key> + <value>Файл</value> + + 3 + + CatalogRef.Файлы + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Отмена + + + true + + + + Отмена + + + Auto + Auto + + + ФайлСсылка + + CatalogRef.Файлы + + true + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Help/ru.html new file mode 100644 index 000000000..4f1f7d256 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Help/ru.html @@ -0,0 +1,5 @@ + +

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

    +

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

    +

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

    +

     

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Module.bsl new file mode 100644 index 000000000..226bb94f4 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Module.bsl @@ -0,0 +1,31 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Файл = Параметры.ФайлСсылка; + + Если Файл.ХранитьВерсии Тогда + СоздатьНовуюВерсию = Истина; + Иначе + СоздатьНовуюВерсию = Ложь; + Элементы.СоздатьНовуюВерсию.Доступность = Ложь; + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ОК(Команда) + СтруктураВозврата = Новый Структура("КомментарийКВерсии, СоздатьНовуюВерсию, КодВозврата", + КомментарийКВерсии, СоздатьНовуюВерсию, КодВозвратаДиалога.ОК); + Закрыть(СтруктураВозврата); +КонецПроцедуры + + +&НаКлиенте +Процедура Отмена(Команда) + СтруктураВозврата = Новый Структура("КомментарийКВерсии, СоздатьНовуюВерсию, КодВозврата", + КомментарийКВерсии, СоздатьНовуюВерсию, КодВозвратаДиалога.Отмена); + Закрыть(СтруктураВозврата); +КонецПроцедуры + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Form.form new file mode 100644 index 000000000..1b4c94e1e --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Form.form @@ -0,0 +1,483 @@ + + + + СообщениеЗаголовок + 2 + true + true + + true + + + СообщениеЗаголовок + + None + + СообщениеЗаголовокРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + СообщениеЗаголовокКонтекстноеМеню + 3 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Файлы + 4 + true + true + + true + + + Файлы + + false + None + + Представление + 9 + true + true + + true + + + Файлы.Presentation + + + ПредставлениеРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ПредставлениеКонтекстноеМеню + 10 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + ФайлыКоманднаяПанель + 6 + Left + true + + + Selection + ФайлыВыбор + + + ФайлыСтрокаПоиска + 20 + + ФайлыСтрокаПоискаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ФайлыСтрокаПоискаКонтекстноеМеню + 21 + true + + Файлы + + true + + + + ФайлыСостояниеПросмотра + 23 + + ФайлыСостояниеПросмотраРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ФайлыСостояниеПросмотраКонтекстноеМеню + 24 + true + + ViewStatusAddition + Файлы + + true + + + + ФайлыУправлениеПоиском + 26 + + ФайлыУправлениеПоискомРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ФайлыУправлениеПоискомКонтекстноеМеню + 27 + true + + SearchControlAddition + Файлы + + true + + + + ФайлыРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ФайлыКонтекстноеМеню + 5 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + + Файлы.Picture + + None + None + None + true + + + СообщениеВопрос + 11 + true + true + + true + + + СообщениеВопрос + + None + + СообщениеВопросРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + СообщениеВопросКонтекстноеМеню + 12 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ОсновнаяКоманднаяПанель + 13 + + Да + 14 + + <key>ru</key> + <value>Да</value> + + true + true + + true + + false + + ДаРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + Form.StandardCommand.Yes + Auto + true + true + true + UserCmds + Auto + + + Нет + 15 + + <key>ru</key> + <value>Нет</value> + + true + true + + true + + false + + НетРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + Form.StandardCommand.No + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 16 + + <key>ru</key> + <value>Справка</value> + + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ru + Основная командная панель + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + 55 + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Файлы + + <key>ru</key> + <value>Файлы</value> + + 1 + + ValueList + + + true + + + true + + + + + + + СообщениеЗаголовок + + <key>ru</key> + <value>Сообщение заголовок</value> + + 2 + + String + + + + true + + + true + + + + СообщениеВопрос + + <key>ru</key> + <value>Сообщение вопрос</value> + + 3 + + String + + + + true + + + true + + + + СообщениеВопрос + + String + + + + + СообщениеЗаголовок + + String + + + + + Файлы + + ValueList + + + + Заголовок + + String + + + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Module.bsl new file mode 100644 index 000000000..97ec815a1 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Module.bsl @@ -0,0 +1,26 @@ + +&НаКлиенте +Процедура ФайлыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ВыбраннаяСтрока = Файлы[ВыбраннаяСтрока].Значение; + + КакОткрывать = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ДействиеПоДвойномуЩелчкуМыши; + Если КакОткрывать = "ОткрыватьКарточку" Тогда + Параметы = Новый Структура("Ключ", ВыбраннаяСтрока); + ОткрытьФормуМодально("Справочник.Файлы.ФормаОбъекта", Параметы); + Возврат; + КонецЕсли; + + РаботаСФайламиКлиент.ОткрытьФайл(РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(ВыбраннаяСтрока, Неопределено, УникальныйИдентификатор)); + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + СообщениеВопрос = Параметры.СообщениеВопрос; + СообщениеЗаголовок = Параметры.СообщениеЗаголовок; + Заголовок = Параметры.Заголовок; + Файлы = Параметры.Файлы; +КонецПроцедуры + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Form.form new file mode 100644 index 000000000..fdf37d559 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Form.form @@ -0,0 +1,234 @@ + + + + Информация + 5 + true + true + + true + + + Информация + + None + + ИнформацияРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ИнформацияКонтекстноеМеню + 6 + true + + LabelField + Enter + true + Left + true + + 75 + true + 3 + true + + + + ПрименитьКоВсем + 3 + true + true + + true + + + ПрименитьКоВсем + + Right + + ПрименитьКоВсемРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ПрименитьКоВсемКонтекстноеМеню + 4 + true + + CheckBoxField + Enter + true + Left + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Да + 1 + true + true + + true + + false + + ДаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + Form.Command.Да + Auto + true + true + true + UserCmds + Auto + + + Нет + 2 + true + true + + true + + false + + НетРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + Form.Command.Нет + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + 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 + + + Нет + + <key>ru</key> + <value>Нет</value> + + 2 + + 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..d2461b504 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Module.bsl @@ -0,0 +1,20 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Информация = Параметры.Информация; + Заголовок = Параметры.Заголовок; +КонецПроцедуры + +&НаКлиенте +Процедура Да(Команда) + СтруктураВозврата = Новый Структура("ПрименитьКоВсем, КодВозврата", + ПрименитьКоВсем, КодВозвратаДиалога.Да); + Закрыть(СтруктураВозврата); +КонецПроцедуры + +&НаКлиенте +Процедура Нет(Команда) + СтруктураВозврата = Новый Структура("ПрименитьКоВсем, КодВозврата", + ПрименитьКоВсем, КодВозвратаДиалога.Нет); + Закрыть(СтруктураВозврата); +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаИмпорта/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаИмпорта/Form.form new file mode 100644 index 000000000..7486d506f --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаИмпорта/Form.form @@ -0,0 +1,392 @@ + + + + <key>ru</key> + <value>Предупреждение при импорте файлов</value> + + + Сообщение + 14 + true + true + + true + + + Сообщение + + None + + СообщениеРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + СообщениеКонтекстноеМеню + 15 + true + + LabelField + Enter + true + Left + true + + true + 3 + true + false + + + + ФайлыБольшие + 4 + true + true + + true + + + ФайлыБольшие + + false + None + + Значение + 16 + true + true + + true + + + ФайлыБольшие.Value + + + ЗначениеРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ЗначениеКонтекстноеМеню + 17 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + ФайлыБольшиеКоманднаяПанель + 8 + Left + true + + + ФайлыБольшиеСтрокаПоиска + 21 + + ФайлыБольшиеСтрокаПоискаРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + ФайлыБольшиеСтрокаПоискаКонтекстноеМеню + 22 + true + + ФайлыБольшие + + true + + + + ФайлыБольшиеСостояниеПросмотра + 24 + + ФайлыБольшиеСостояниеПросмотраРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ФайлыБольшиеСостояниеПросмотраКонтекстноеМеню + 25 + true + + ViewStatusAddition + ФайлыБольшие + + true + + + + ФайлыБольшиеУправлениеПоиском + 27 + + ФайлыБольшиеУправлениеПоискомРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ФайлыБольшиеУправлениеПоискомКонтекстноеМеню + 28 + true + + SearchControlAddition + ФайлыБольшие + + true + + + + ФайлыБольшиеРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ФайлыБольшиеКонтекстноеМеню + 7 + true + + true + true + true + true + 40 + true + true + 4 + true + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + None + None + None + true + + + ОсновнаяКоманднаяПанель + 1 + + OK + 11 + true + true + + true + + false + + OKРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + Form.StandardCommand.OK + Auto + true + true + true + UserCmds + Auto + + + Отмена + 12 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 13 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + 70 + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ФайлыБольшие + + <key>ru</key> + <value>Файлы большие</value> + + 3 + + ValueList + + + true + + + true + + + + + + + Сообщение + + <key>ru</key> + <value>Сообщение</value> + + 1 + + String + + + + true + + + true + + + + ФайлыБольшие + + ValueList + + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаИмпорта/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаИмпорта/Help/ru.html new file mode 100644 index 000000000..9f74775d7 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаИмпорта/Help/ru.html @@ -0,0 +1 @@ +Предельно допустимый размера файлов можно увеличить в настройках системы.  \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаИмпорта/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаИмпорта/Module.bsl new file mode 100644 index 000000000..5486d4be0 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаИмпорта/Module.bsl @@ -0,0 +1,33 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ФайлыБольшие = Параметры.ФайлыБольшие; + + МаксимальныйРазмерФайла = Цел(Константы.МаксимальныйРазмерФайла.Получить() / (1024 * 1024)); + + Сообщение = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Внимание! + |Некоторые файлы превышают предельный размер (%1 Мб) и не будут добавлены в хранилище. + |Продолжить импорт?'"), + Строка(МаксимальныйРазмерФайла) ); + + Если Параметры.Свойство("РежимЗагрузки") Тогда + Если Параметры.РежимЗагрузки Тогда + + Сообщение = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Внимание! + |Некоторые файлы превышают предельный размер (%1 Мб) и не будут добавлены в хранилище. + |Продолжить загрузку файлов?'"), + Строка(МаксимальныйРазмерФайла) ); + + КонецЕсли; + КонецЕсли; + + Если Параметры.Свойство("Заголовок") Тогда + Заголовок = Параметры.Заголовок; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаОбУстановкеРасширенияРаботыСФайлами/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаОбУстановкеРасширенияРаботыСФайлами/Form.form new file mode 100644 index 000000000..31f64c9b0 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаОбУстановкеРасширенияРаботыСФайлами/Form.form @@ -0,0 +1,256 @@ + + + + <key>ru</key> + <value>Установка расширения работы с файлами</value> + + + ДекорацияПояснение + 6 + + <key>ru</key> + <value>Для удобной работы с файловыми функциями предлагается установить расширение работы с файлами. Установить и подключить?</value> + + true + true + + true + + + ДекорацияПояснениеРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + ДекорацияПояснениеКонтекстноеМеню + 7 + true + + Label + true + 2 + true + false + false + + Left + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + УстановитьСейчас + 8 + true + true + + true + + false + + УстановитьСейчасРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + Form.Command.УстановитьСейчас + Auto + true + true + true + UserCmds + Auto + + + УстановитьПозже + 9 + true + true + + true + + false + + УстановитьПозжеРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.Command.УстановитьПозже + Normal + Auto + true + true + UserCmds + Auto + + + НеУстанавливать + 10 + true + true + + true + + false + + НеУстанавливатьРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + Form.Command.НеУстанавливать + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + 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 + + + НеУстанавливать + + <key>ru</key> + <value>Нет, не напоминать больше</value> + + 3 + + ru + Не устанавливать + + + true + + + + НеУстанавливать + + + Auto + Auto + + + ЗакрытьФорму + + <key>ru</key> + <value>Закрыть</value> + + 4 + + 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..feff690a6 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаОбУстановкеРасширенияРаботыСФайлами/Module.bsl @@ -0,0 +1,32 @@ + +&НаКлиенте +Процедура НеУстанавливать(Команда) + Закрыть(Ложь); // не предлагать +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьПозже(Команда) + Закрыть(Истина); // предлагать позже - в другом сеансе +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьСейчас(Команда) + УстановитьРасширениеРаботыСФайлами(); + Закрыть(Ложь); // не предлагать +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму(Команда) + Закрыть(Истина); // предлагать позже - в другом сеансе +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("Сообщение") Тогда + Если Параметры.Сообщение <> Неопределено Тогда + Элементы.ДекорацияПояснение.Заголовок = Параметры.Сообщение + НСтр("ru = ' Установить и подключить?'"); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Группы/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Группы/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..24f91d64c --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Группы/ExtInfo/ListSettings.dcss @@ -0,0 +1,20 @@ + + + + + Ссылка + InHierarchy + Справочник.ПапкиФайлов.Шаблоны + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Form.form new file mode 100644 index 000000000..80442b162 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Form.form @@ -0,0 +1,986 @@ + + + + <key>ru</key> + <value>Выбор файла</value> + + + ОсновнаяКоманднаяПанель + 18 + + Выбрать + 35 + true + true + + true + + false + + ВыбратьРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Choose + Auto + true + true + true + UserCmds + Auto + + + Изменить + 33 + true + true + + true + + false + + ИзменитьРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Change + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 30 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Основная командная панель</value> + + + ru + Основная командная панель + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + CommandBar + + Left + + + + ГруппаСписки + 29 + + Папки + 11 + true + true + + true + + + Группы + + false + None + + КартинкаИНаименованиеПапок + 36 + + ИндексКартинки + 37 + true + true + + true + + + Группы.ИндексКартинки + + + ИндексКартинкиРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + ИндексКартинкиКонтекстноеМеню + 38 + true + + PictureField + Enter + true + Left + true + + true + true + true + true + + CommonPicture.Папки + + + + 1 + + + + + Папка + 14 + + <key>ru</key> + <value>Папка</value> + + true + true + + true + + + Группы.Description + + + ПапкаРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + ПапкаКонтекстноеМеню + 15 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Картинка и наименование папок</value> + + + ru + Картинка и наименование папок + + + КартинкаИНаименованиеПапокРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + None + + ПапкиКоманднаяПанель + 13 + Left + true + + + OnActivateRow + ГруппыПриАктивизацииСтроки + + + ПапкиСтрокаПоиска + 47 + + ПапкиСтрокаПоискаРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + ПапкиСтрокаПоискаКонтекстноеМеню + 48 + true + + Папки + + true + + + + ПапкиСостояниеПросмотра + 50 + + ПапкиСостояниеПросмотраРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ПапкиСостояниеПросмотраКонтекстноеМеню + 51 + true + + ViewStatusAddition + Папки + + true + + + + ПапкиУправлениеПоиском + 53 + + ПапкиУправлениеПоискомРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + ПапкиУправлениеПоискомКонтекстноеМеню + 54 + true + + SearchControlAddition + Папки + + true + + + + ПапкиРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ПапкиКонтекстноеМеню + 12 + true + + Tree + true + true + true + 24 + true + true + true + Row + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + Auto + Auto + true + true + true + true + + Style.BorderColor + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + + + + Список + 2 + true + true + + true + + + Список + + true + false + None + + КартинкаИНаименование + 34 + + Картинка + 25 + true + true + + true + + + Список.ИндексКартинки + + None + + КартинкаРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + КартинкаКонтекстноеМеню + 26 + true + + PictureField + Enter + true + Left + true + Left + + 2 + true + 1 + true + true + true + + CommonPicture.ПиктограммыФайлов + + + 1 + + + + + Наименование + 5 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Картинка и наименование</value> + + + ru + Картинка и наименование + + + КартинкаИНаименованиеРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + Описание + 31 + true + true + + true + + + Список.Описание + + + ОписаниеРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 32 + true + + InputField + Enter + true + Left + true + + true + 1 + true + false + true + true + true + Normal + + + + Автор + 21 + true + true + + true + + + Список.Автор + + + АвторРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ДатаСоздания + 23 + true + true + + true + + + Список.ДатаСоздания + + + ДатаСозданияРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + ДатаСозданияКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Ссылка + 39 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 40 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 4 + Left + true + + + СписокСтрокаПоиска + 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 + + + + СписокРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 3 + true + + HierarchicalList + true + true + true + 48 + true + true + true + true + Row +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + true + + Style.BorderColor + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
    + true + true + + true + + + ru + Группа списки + + + ГруппаСпискиРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + LeftNarrowest + Auto + Auto + +
    + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + ВЫБРАТЬ + Файлы.Ссылка, + Файлы.ПометкаУдаления, + Файлы.Предопределенный, + Файлы.Код, + Файлы.Наименование, + Файлы.Автор, + Файлы.ДатаСоздания, + Файлы.ХранитьВерсии, + Файлы.Редактирует, + Файлы.ТекущаяВерсия, + Файлы.ИндексКартинки, + Файлы.Описание, + Файлы.ПолноеНаименование, + Файлы.ВладелецФайла +ИЗ + Справочник.Файлы КАК Файлы +ГДЕ + Файлы.ВладелецФайла = &Владелец + И Файлы.ПометкаУдаления = Ложь + Catalog.Файлы + true + true + true + true + true + +
    + + Группы + + <key>ru</key> + <value>Группы</value> + + 2 + + DynamicList + + + true + + + true + + + ВЫБРАТЬ + СправочникПапкиФайлов.Ссылка, + СправочникПапкиФайлов.ПометкаУдаления, + СправочникПапкиФайлов.Предопределенный, + СправочникПапкиФайлов.Родитель, + СправочникПапкиФайлов.Код, + СправочникПапкиФайлов.Наименование, + СправочникПапкиФайлов.Описание, + СправочникПапкиФайлов.Ответственный, + СправочникПапкиФайлов.ДатаСоздания, + СправочникПапкиФайлов.ДополнительныеРеквизиты, + Выбор + Когда ПометкаУдаления = Истина Тогда 1 + Иначе 0 + Конец как ИндексКартинки +ИЗ + Справочник.ПапкиФайлов КАК СправочникПапкиФайлов + Catalog.ПапкиФайлов + true + true + true + true + true + + + + Параметр1 + + CatalogRef.ПапкиФайлов + + + + + + + +
    diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Module.bsl new file mode 100644 index 000000000..cc00167fb --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Module.bsl @@ -0,0 +1,47 @@ +&НаКлиенте +Процедура ГруппыПриАктивизацииСтроки(Элемент) + ПодключитьОбработчикОжидания("ОбработкаОжидания", 0.2, Истина); +КонецПроцедуры + +// Процедура обновляет список Файлов +&НаКлиенте +Процедура ОбработкаОжидания() + + Если Элементы.Папки.ТекущаяСтрока <> Неопределено Тогда + Список.Параметры.УстановитьЗначениеПараметра("Владелец", Элементы.Папки.ТекущаяСтрока); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("ВладелецФайла") Тогда + Список.Параметры.УстановитьЗначениеПараметра( + "Владелец", Параметры.ВладелецФайла); + + Если ТипЗнч(Параметры.ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") Тогда + Элементы.Папки.ТекущаяСтрока = Параметры.ВладелецФайла; + Элементы.Папки.ВыделенныеСтроки.Очистить(); + Элементы.Папки.ВыделенныеСтроки.Добавить(Элементы.Папки.ТекущаяСтрока); + Иначе + Элементы.Папки.Видимость = Ложь; + КонецЕсли; + Иначе + Если Параметры.Свойство("ВыборШаблона") И Параметры.ВыборШаблона Тогда + Элементы.Папки.ТекущаяСтрока = Справочники.ПапкиФайлов.Шаблоны; + Элементы.Папки.ВыделенныеСтроки.Очистить(); + Элементы.Папки.ВыделенныеСтроки.Добавить(Элементы.Папки.ТекущаяСтрока); + Иначе + Группы.Отбор.Элементы.Очистить(); + КонецЕсли; + + Список.Параметры.УстановитьЗначениеПараметра("Владелец", Элементы.Папки.ТекущаяСтрока); + КонецЕсли; + + Если Параметры.Свойство("ТекущаяСтрока") Тогда + Элементы.Папки.ТекущаяСтрока = Параметры.ТекущаяСтрока; + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/ConditionalAppearance.dcssca b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/ConditionalAppearance.dcssca new file mode 100644 index 000000000..bfc1db6cb --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/ConditionalAppearance.dcssca @@ -0,0 +1,32 @@ + + + + + + ТаблицаПодписейАвторПодписи + + + ТаблицаПодписейДатаПодписи + + + ТаблицаПодписейКомментарий + + + ТаблицаПодписейСтатус + + + + + ТаблицаПодписей.Неверна + Equal + true + + + + + ЦветТекста + style:SpecialTextColor + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/Form.form new file mode 100644 index 000000000..2ee318628 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/Form.form @@ -0,0 +1,708 @@ + + + + <key>ru</key> + <value>Выберите подписи для сохранения</value> + + + ТаблицаПодписей + 34 + true + true + + true + + + ТаблицаПодписей + + None + + ТаблицаПодписейПометка + 59 + true + true + + true + + + ТаблицаПодписей.Пометка + + None + + ТаблицаПодписейПометкаРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + ТаблицаПодписейПометкаКонтекстноеМеню + 60 + true + + CheckBoxField + Auto + true + Left + true + + + + ТаблицаПодписейАвторПодписи + 37 + true + true + + true + + + ТаблицаПодписей.КомуВыданСертификат + + + ТаблицаПодписейАвторПодписиРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + ТаблицаПодписейАвторПодписиКонтекстноеМеню + 38 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + Normal + + + + ТаблицаПодписейДатаПодписи + 39 + true + true + + true + + + ТаблицаПодписей.ДатаПодписи + + + ТаблицаПодписейДатаПодписиРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + ТаблицаПодписейДатаПодписиКонтекстноеМеню + 40 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + Normal + + + + ТаблицаПодписейКомментарий + 41 + true + true + + true + + + ТаблицаПодписей.Комментарий + + + ТаблицаПодписейКомментарийРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + ТаблицаПодписейКомментарийКонтекстноеМеню + 42 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + Normal + + + None + + ТаблицаПодписейКоманднаяПанель + 36 + Left + true + + + ТаблицаПодписейСтрокаПоиска + 65 + + ТаблицаПодписейСтрокаПоискаРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + + ТаблицаПодписейСтрокаПоискаКонтекстноеМеню + 66 + true + + ТаблицаПодписей + + true + + + + ТаблицаПодписейСостояниеПросмотра + 68 + + ТаблицаПодписейСостояниеПросмотраРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + + ТаблицаПодписейСостояниеПросмотраКонтекстноеМеню + 69 + true + + ViewStatusAddition + ТаблицаПодписей + + true + + + + ТаблицаПодписейУправлениеПоиском + 71 + + ТаблицаПодписейУправлениеПоискомРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + ТаблицаПодписейУправлениеПоискомКонтекстноеМеню + 72 + true + + SearchControlAddition + ТаблицаПодписей + + true + + + + ТаблицаПодписейРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + ТаблицаПодписейКонтекстноеМеню + 35 + true + + 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 + +
    + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 33 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 61 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + 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 + + Date + + + + 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 + + CatalogRef.ВерсииФайлов + + + 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 + + Boolean + + + true + + + true + + + + ИндексКартинки + + <key>ru</key> + <value>Индекс картинки</value> + + 9 + + Number + + 10 + + + + true + + + true + + + + УстановившийПодпись + + <key>ru</key> + <value>Установивший подпись</value> + + 11 + + CatalogRef.Пользователи + + + true + + + true + + + + Пометка + + <key>ru</key> + <value>Пометка</value> + + 12 + + Boolean + + + true + + + true + + + + ИмяФайлаПодписи + + <key>ru</key> + <value>Имя файла подписи</value> + + 13 + + String + + + + true + + + true + + + + + ВыполнитьПроверку + + <key>ru</key> + <value>Выполнить проверку</value> + + 2 + + Boolean + + + true + + + true + + + + Подписан + + <key>ru</key> + <value>Подписан</value> + + 3 + + Boolean + + + true + + + true + + + + ОбъектПроверки + + <key>ru</key> + <value>Объект проверки</value> + + 4 + + AnyRef + + + true + + + true + + + + ОбъектСсылка + + <key>ru</key> + <value>Объект ссылка</value> + + 5 + + AnyRef + + + true + + + true + + + + УникальныйИдентификаторВызывающейФормы + + <key>ru</key> + <value>Уникальный идентификатор вызывающей формы</value> + + 6 + + UUID + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + + + +
    diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/Help/ru.html new file mode 100644 index 000000000..97fc82400 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/Help/ru.html @@ -0,0 +1,8 @@ + +

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

    +

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

    +

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

    +

     

    +

    См. также:

    +
    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/Module.bsl new file mode 100644 index 000000000..fb08a4d01 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПодписей/Module.bsl @@ -0,0 +1,88 @@ +&НаСервере +Процедура ЗаполнитьСписокПодписейОдногоОбъекта(ТекущийОбъект) + + Если ТекущийОбъект.Подписан Тогда + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ЭлектронноЦифровыеПодписи.КомуВыданСертификат КАК КомуВыданСертификат, + | ЭлектронноЦифровыеПодписи.ДатаПодписи КАК ДатаПодписи, + | ЭлектронноЦифровыеПодписи.Комментарий КАК Комментарий, + | ЭлектронноЦифровыеПодписи.Подпись КАК Подпись, + | ЭлектронноЦифровыеПодписи.Отпечаток КАК Отпечаток, + | ЭлектронноЦифровыеПодписи.УстановившийПодпись КАК УстановившийПодпись, + | ЭлектронноЦифровыеПодписи.НомерСтроки КАК НомерСтроки, + | ЭлектронноЦифровыеПодписи.ИмяФайлаПодписи КАК ИмяФайлаПодписи + |ИЗ + | Справочник.ВерсииФайлов.ЭлектронноЦифровыеПодписи КАК ЭлектронноЦифровыеПодписи + |ГДЕ + | ЭлектронноЦифровыеПодписи.Ссылка = &ОбъектСсылка"; + + Запрос.Параметры.Вставить("ОбъектСсылка", ТекущийОбъект); + ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); + + Пока ВыборкаЗапроса.Следующий() Цикл + НоваяСтрока = ТаблицаПодписей.Добавить(); + НоваяСтрока.КомуВыданСертификат = ВыборкаЗапроса.КомуВыданСертификат; + НоваяСтрока.ДатаПодписи = ВыборкаЗапроса.ДатаПодписи; + НоваяСтрока.Комментарий = ВыборкаЗапроса.Комментарий; + НоваяСтрока.Объект = ОбъектСсылка; + НоваяСтрока.Отпечаток = ВыборкаЗапроса.Отпечаток; + НоваяСтрока.УстановившийПодпись = ВыборкаЗапроса.УстановившийПодпись; + НоваяСтрока.ИмяФайлаПодписи = ВыборкаЗапроса.ИмяФайлаПодписи; + НоваяСтрока.Неверна = Ложь; + НоваяСтрока.ИндексКартинки = -1; + НоваяСтрока.Пометка = Истина; + + ДвоичныеДанные = ВыборкаЗапроса.Подпись.Получить(); + НоваяСтрока.АдресПодписи = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторВызывающейФормы); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСписокПодписей() + + ТаблицаПодписей.Очистить(); + ЗаполнитьСписокПодписейОдногоОбъекта(ОбъектСсылка); + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ОбъектСсылка = Параметры.Объект; + ОбъектПроверки = ОбъектСсылка; + + Подписан = ОбъектСсылка.Подписан; + УникальныйИдентификаторВызывающейФормы = Параметры.УникальныйИдентификатор; + + Если ТипЗнч(ОбъектСсылка) = Тип("СправочникСсылка.Файлы") Тогда + ОбъектСсылка = ОбъектСсылка.ТекущаяВерсия; + КонецЕсли; + + ЗаполнитьСписокПодписей(); + +КонецПроцедуры + + +&НаКлиенте +Процедура ОК(Команда) + + МассивВозврата = Новый Массив; + + Для Каждого Строка Из ТаблицаПодписей Цикл + Если Строка.Пометка Тогда + + СтруктураВозврата = Новый Структура("АдресПодписи, КомуВыданСертификат, ИмяФайлаПодписи", + Строка.АдресПодписи, Строка.КомуВыданСертификат, Строка.ИмяФайлаПодписи); + МассивВозврата.Добавить(СтруктураВозврата); + + КонецЕсли; + КонецЦикла; + + Закрыть(МассивВозврата); + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПутиКАрхивуФайловТомов/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПутиКАрхивуФайловТомов/Form.form new file mode 100644 index 000000000..e1a3d28de --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПутиКАрхивуФайловТомов/Form.form @@ -0,0 +1,243 @@ + + + + <key>ru</key> + <value>Размещение файлов</value> + + + ГруппаПутьФайловойБазы + 1 + + ПутьКАрхивуWindows + 2 + + <key>ru</key> + <value>Для сервера 1С:Предприятия под управлением Microsoft Windows, (вида "\\servername\resource\files.zip")</value> + + true + true + + true + + + ПутьКАрхивуWindows + + Top + + ПутьКАрхивуWindowsРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ПутьКАрхивуWindowsКонтекстноеМеню + 3 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПутьКАрхивуLinux + 4 + + <key>ru</key> + <value>Для сервера 1С:Предприятия под управлением Linux</value> + + true + true + + true + + + ПутьКАрхивуLinux + + Top + + ПутьКАрхивуLinuxРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ПутьКАрхивуLinuxКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Путь к архиву с файлами начального образа</value> + + + ru + Группа путь файловой базы + + + ГруппаПутьФайловойБазыРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + StrongSeparation + true + true + auto + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Разместить + 6 + true + true + + true + + false + + РазместитьРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + Form.Command.Разместить + Auto + true + true + true + UserCmds + Auto + + Right + true + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + ПутьКАрхивуWindows + + <key>ru</key> + <value>Путь к архиву windows</value> + + 1 + + String + + + + true + + + true + + + + ПутьКАрхивуLinux + + <key>ru</key> + <value>Путь к архиву linux</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..e1e1011c3 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораПутиКАрхивуФайловТомов/Module.bsl @@ -0,0 +1,28 @@ + +&НаКлиенте +Процедура Разместить(Команда) + + ОчиститьСообщения(); + + Если ПустаяСтрока(ПутьКАрхивуWindows) И ПустаяСтрока(ПутьКАрхивуLinux) Тогда + Текст = НСтр("ru = 'Укажите полное имя архива с файлами начального образа (файл *.zip)'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст, , "ПутьКАрхивуWindows"); + Возврат; + КонецЕсли; + + Если Не ПустаяСтрока(ПутьКАрхивуWindows) И (Лев(ПутьКАрхивуWindows, 2) <> "\\" ИЛИ Найти(ПутьКАрхивуWindows, ":") <> 0) Тогда + ТекстОшибки = НСтр("ru = 'Путь к архиву с файлами начального образа должен быть в формате UNC (\\servername\resource) '"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "ПутьКАрхивуWindows"); + Возврат; + КонецЕсли; + + + Состояние(НСтр("ru = 'Обмен данными'", "ru"), , + НСтр("ru = 'Осуществляется размещение файлов из архива с файлами начального образа...'", "ru"), + БиблиотекаКартинок.СоздатьНачальныйОбраз); + + ОбменФайлами.ДобавитьФайлыВТома(ПутьКАрхивуWindows, ПутьКАрхивуLinux); + + Предупреждение(НСтр("ru = 'Размещение файлов из архива с файлами начального образа успешно завершено'")); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Form.form new file mode 100644 index 000000000..a77ef4252 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Form.form @@ -0,0 +1,428 @@ + + + + <key>ru</key> + <value>Как открыть файл?</value> + + + Группа + 8 + + КакОткрывать + 1 + + <key>ru</key> + <value>Выберите режим открытия файла</value> + + true + true + + true + + + КакОткрывать + + Top + + КакОткрыватьРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + КакОткрыватьКонтекстноеМеню + 2 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Только для просмотра + + + 0 + + + + + ru + Для редактирования + + + 1 + + + Vertical + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаИнформация + 13 + + ДекорацияКартинка + 11 + true + true + + true + + + ДекорацияКартинкаРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + ДекорацияКартинкаКонтекстноеМеню + 12 + true + + 2 + true + 2 + true + false + + + CommonPicture.Информация + + + + + ДекорацияНадпись + 14 + + <key>ru</key> + <value>Совет - для редактирования файла удобно использовать кнопку F4.</value> + + true + true + + true + + + ДекорацияНадписьРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ДекорацияНадписьКонтекстноеМеню + 15 + true + + Label + true + 2 + true + false + + Left + + + true + true + + true + + + ru + Группа информация + + + ГруппаИнформацияРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + UsualGroup + + Auto + StrongSeparation + true + true + Auto + Auto + + + + БольшеНеСпрашивать + 6 + true + true + + true + + + БольшеНеСпрашивать + + Right + + БольшеНеСпрашиватьРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + БольшеНеСпрашиватьКонтекстноеМеню + 7 + true + + CheckBoxField + Enter + true + Left + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + OK + 3 + true + true + + true + + false + + OKРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Отмена + 4 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 5 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + 43 + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + КакОткрывать + + <key>ru</key> + <value>Как открывать</value> + + 1 + + Number + + 10 + + + + true + + + true + + + + БольшеНеСпрашивать + + <key>ru</key> + <value>Больше не спрашивать</value> + + 2 + + Boolean + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Отмена + + + true + + + + Отмена + + + Auto + Auto + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Help/ru.html new file mode 100644 index 000000000..f258481bd --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Help/ru.html @@ -0,0 +1,10 @@ + +

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

    +
    • клавишу Enter  +
    • двойной щелчок левой кнопкой мыши +
    • команду "Открыть файл"

     

    +

    Варианты открытия файла:

    +

    + + +
    Только для просмотраФайл не будет помечен как занятый Вами для редактирования и откроется внешним приложением в режиме "только просмотр"
    Для редактированияФайл будет помечен как занятый Вами для редактирования и откроется внешним приложением с возможностью внесения и сохранения изменений

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Module.bsl new file mode 100644 index 000000000..388e04363 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Module.bsl @@ -0,0 +1,17 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + БольшеНеСпрашивать = Ложь; +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + СтруктураВозврата = Новый Структура("БольшеНеСпрашивать, КакОткрывать", + БольшеНеСпрашивать, КакОткрывать); + Закрыть(СтруктураВозврата); +КонецПроцедуры + +&НаКлиенте +Процедура Отмена(Команда) + Закрыть(КодВозвратаДиалога.Отмена); +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаГруповаяОперацияНаПапке/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаГруповаяОперацияНаПапке/Form.form new file mode 100644 index 000000000..90f284b2a --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаГруповаяОперацияНаПапке/Form.form @@ -0,0 +1,189 @@ + + + + Информация + 5 + true + true + + true + + + Информация + + None + + ИнформацияРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ИнформацияКонтекстноеМеню + 6 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СУчетомПодпапок + 3 + true + true + + true + + + СУчетомПодпапок + + Right + + СУчетомПодпапокРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + СУчетомПодпапокКонтекстноеМеню + 4 + true + + CheckBoxField + Enter + true + Left + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ОК + 1 + true + true + + true + + false + + ОКРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + Form.StandardCommand.OK + Auto + true + true + true + UserCmds + Auto + + + Отмена + 2 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + 30 + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + СУчетомПодпапок + + <key>ru</key> + <value>С учетом подпапок</value> + + 1 + + Boolean + + + true + + + true + + + + Информация + + <key>ru</key> + <value>Информация</value> + + 2 + + String + + + + true + + + true + + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаГруповаяОперацияНаПапке/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаГруповаяОперацияНаПапке/Module.bsl new file mode 100644 index 000000000..f37ac6495 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаГруповаяОперацияНаПапке/Module.bsl @@ -0,0 +1,7 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Информация = Параметры.Информация; + Заголовок = Параметры.Заголовок; + СУчетомПодпапок = Параметры.СУчетомПодпапок; +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/ConditionalAppearance.dcssca b/SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/ConditionalAppearance.dcssca new file mode 100644 index 000000000..63007769f --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/ConditionalAppearance.dcssca @@ -0,0 +1,43 @@ + + + + + + ПодписиПутьКФайлу + + + + + Подписи.ПутьКФайлу + Equal + + + + + + ОтметкаНезаполненного + true + + + + + + + ПодписиАвторПодписи + + + + + Подписи.АвторПодписи + Equal + Справочник.ФизическиеЛица.ПустаяСсылка + + + + + ОтметкаНезаполненного + true + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/Form.form new file mode 100644 index 000000000..17d47e391 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/Form.form @@ -0,0 +1,385 @@ + + + + <key>ru</key> + <value>Добавление ЭЦП из файла</value> + + + Подписи + 1 + true + true + + true + + + Подписи + + None + CancelSearch + Change + Copy + CopyToClipboard + EndEdit + Find + MoveDown + MoveUp + OutputList + SortListAsc + SortListDesc + + ПодписиПутьКФайлу + 4 + true + true + + true + + + Подписи.ПутьКФайлу + + + ПодписиПутьКФайлуРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ПодписиПутьКФайлуКонтекстноеМеню + 5 + true + + InputField + Auto + true + Left + true + + + StartChoice + ПодписиПутьКФайлуНачалоВыбора + + true + true + true + true + true + true + true + Normal + + + + ПодписиКомментарий + 9 + true + true + + true + + + Подписи.Комментарий + + + ПодписиКомментарийРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ПодписиКомментарийКонтекстноеМеню + 10 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПодписиКоманднаяПанель + 3 + Left + true + + + ПодписиСтрокаПоиска + 15 + + ПодписиСтрокаПоискаРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + ПодписиСтрокаПоискаКонтекстноеМеню + 16 + true + + Подписи + + true + + + + ПодписиСостояниеПросмотра + 18 + + ПодписиСостояниеПросмотраРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ПодписиСостояниеПросмотраКонтекстноеМеню + 19 + true + + ViewStatusAddition + Подписи + + true + + + + ПодписиУправлениеПоиском + 21 + + ПодписиУправлениеПоискомРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + ПодписиУправлениеПоискомКонтекстноеМеню + 22 + true + + SearchControlAddition + Подписи + + true + + + + ПодписиРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + ПодписиКонтекстноеМеню + 2 + true + + 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 + +
    + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 8 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 11 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Подписи + + <key>ru</key> + <value>Подписи</value> + + 1 + + ValueTable + + + true + + + true + + ShowError + + ПутьКФайлу + + <key>ru</key> + <value>Файл ЭЦП</value> + + 1 + + String + + + + true + + + true + + + + Комментарий + + <key>ru</key> + <value>Комментарий</value> + + 3 + + String + + + + true + + + true + + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + + + +
    diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/Help/ru.html new file mode 100644 index 000000000..9a1c57a7a --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/Help/ru.html @@ -0,0 +1,7 @@ + +

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

    +

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

    +

     

    +

    См. также:

    +
    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/Module.bsl new file mode 100644 index 000000000..99431f704 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаДобавленияПодписиИзФайла/Module.bsl @@ -0,0 +1,55 @@ + +&НаКлиенте +Процедура ПодписиПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если РасширениеПодключено Тогда + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + ДиалогОткрытияФайла.ПолноеИмяФайла = Элементы.Подписи.ТекущиеДанные.ПутьКФайлу; + Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.Фильтр = Фильтр; + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файлы'"); + Если ДиалогОткрытияФайла.Выбрать() Тогда + Элементы.Подписи.ТекущиеДанные.ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + // тут проверяем что все заполнено + ОчиститьСообщения(); + + МассивВозврата = Новый Массив; + ЕстьОшибкиЗаполнения = Ложь; + + Если Подписи.Количество() = 0 Тогда + ТекстОшибки = НСтр("ru = 'Не указано ни одного файла подписи'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "Подписи"); + Возврат; + КонецЕсли; + + Для Каждого Строка Из Подписи Цикл + + Если ПустаяСтрока(Строка.ПутьКФайлу) Тогда + ТекстОшибки = НСтр("ru = 'Не заполнен путь к файлу подписи'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "Подписи"); + ЕстьОшибкиЗаполнения = Истина; + КонецЕсли; + + Запись = Новый Структура("ПутьКФайлу, Комментарий", + Строка.ПутьКФайлу, Строка.Комментарий); + + МассивВозврата.Добавить(Запись); + КонецЦикла; + + Если НЕ ЕстьОшибкиЗаполнения Тогда + Закрыть(МассивВозврата); + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Form.form new file mode 100644 index 000000000..2e0776a68 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Form.form @@ -0,0 +1,548 @@ + + + + <key>ru</key> + <value>Импорт каталога</value> + + + ВыбранныйКаталог + 23 + + <key>ru</key> + <value>Каталог на диске</value> + + true + true + + true + + + Каталог + + + ВыбранныйКаталогРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + ВыбранныйКаталогКонтекстноеМеню + 24 + true + + InputField + true + Enter + true + Left + true + Left + + + StartChoice + ВыбранныйКаталогНачалоВыбора + + true + true + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Папка + 14 + + <key>ru</key> + <value>Папка</value> + + true + true + + true + + + ПапкаДляДобавления + + + ПапкаРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ПапкаКонтекстноеМеню + 15 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + false + true + true + true + true + true + + Style.BorderColor + + Normal + + + + УдалятьПослеДобавления + 3 + true + true + + true + + + УдалятьФайлыПослеДобавления + + Right + + УдалятьПослеДобавленияРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + УдалятьПослеДобавленияКонтекстноеМеню + 10 + true + + CheckBoxField + Enter + true + Left + true + Left + + + + ГруппаСвойствФайлов + 25 + + Описание + 2 + + <key>ru</key> + <value>Описание для создаваемых файлов</value> + + true + true + + true + + + Описание + + + ОписаниеРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + Left + + true + 4 + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ХранитьВерсии + 21 + true + true + + true + + + ХранитьВерсии + + Right + + ХранитьВерсииРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ХранитьВерсииКонтекстноеМеню + 22 + true + + CheckBoxField + Enter + true + Left + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа свойств файлов</value> + + + ru + Группа свойств файлов + + + ГруппаСвойствФайловРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ОсновнаяКоманднаяПанель + 1 + + Импорт + 4 + + <key>ru</key> + <value>Импорт</value> + + true + true + + true + + false + + ИмпортРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + Form.Command.Импорт + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Закрыть + 26 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + CommandBar + + Right + Form + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + 60 + 15 + LockOwner + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + 1 + + String + + + + true + + + true + +
    true
    + true +
    + + Описание + + <key>ru</key> + <value>Описание</value> + + 3 + + String + + + + true + + + true + + + + УдалятьФайлыПослеДобавления + + <key>ru</key> + <value>Удалять файлы после добавления</value> + + 4 + + Boolean + + + true + + + true + + + + ВыборКаталогов + + <key>ru</key> + <value>Выбор каталогов</value> + + 6 + + Boolean + + + true + + + true + + + + ХранитьВерсии + + <key>ru</key> + <value>Хранить версии</value> + + 5 + + Boolean + + + true + + + true + + + + Каталог + + <key>ru</key> + <value>Каталог</value> + + 8 + + String + + + + true + + + true + + + + ПапкаДляДобавления + + <key>ru</key> + <value>Папка для добавления</value> + + 2 + + CatalogRef.ПапкиФайлов + + + true + + + true + + + + Импорт + + <key>ru</key> + <value>Выполнить импорт</value> + + 1 + + ru + Импорт + + + true + + + + ИмпортВыполнить + + + Auto + Auto + + + + + +
    diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Help/ru.html new file mode 100644 index 000000000..b2d9859d5 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Help/ru.html @@ -0,0 +1,9 @@ + +

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

    +
    1. +
      Выберите папку
      +
    2. +
      Выполните команду контекстного меню папки "Импорт"
      +
    3. +
      Укажите каталог на диске и следуйте инструкциям программы

     

    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Module.bsl new file mode 100644 index 000000000..1f69183aa --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Module.bsl @@ -0,0 +1,98 @@ + +// Обработка события ПриОткрытии формы +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ВыборКаталогов = Истина; + ХранитьВерсии = Истина; + +КонецПроцедуры + +// Обработка нажатия на кнопку Импорт +// +&НаКлиенте +Процедура ИмпортВыполнить() + + Если ПустаяСтрока(Каталог) Тогда + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не выбран каталог для импорта!'"), , "Каталог"); + Возврат; + + КонецЕсли; + + Если ПапкаДляДобавления.Пустая() Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Укажите папку!'"), , "ПапкаДляДобавления"); + Возврат; + КонецЕсли; + + ВыбранныеФайлы = Новый СписокЗначений; + ВыбранныеФайлы.Добавить(Каталог); + + ПсевдоФайловаяСистема = Новый Соответствие; // соответствие путь к директории - файлы и папки в ней + ДобавленныеФайлы = Новый Массив; + + ПапкаДляДобавленияТекущая = ФайловыеФункцииКлиент.ИмпортФайловВыполнить( + ПапкаДляДобавления, + ВыбранныеФайлы, + Описание, + ХранитьВерсии, + УдалятьФайлыПослеДобавления, + Истина, + УникальныйИдентификатор, + ПсевдоФайловаяСистема, + ДобавленныеФайлы); + + Закрыть(); + + Оповестить("ИмпортКаталоговЗавершен", ПапкаДляДобавленияТекущая); + +КонецПроцедуры + +// Обработка события НачалоВыбора у поля Папка +// +&НаКлиенте +Процедура ВыбранныйКаталогНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + #Если НЕ ВебКлиент Тогда + Режим = РежимДиалогаВыбораФайла.ВыборКаталога; + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); + + ДиалогОткрытияФайла.Каталог = Каталог; + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.Фильтр = Фильтр; + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите каталог'"); + Если ДиалогОткрытияФайла.Выбрать() Тогда + + Если ВыборКаталогов = Истина Тогда + + Каталог = ДиалогОткрытияФайла.Каталог; + + КонецЕсли; + + КонецЕсли; + + СтандартнаяОбработка = Ложь; + #КонецЕсли +КонецПроцедуры + + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если НЕ Параметры.Свойство("КаталогНаДиске") Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Данная обработка вызывается из других процедур конфигурации. Вручную ее вызывать запрещено.'")); + Отказ = Истина; + Возврат; + КонецЕсли; + + Если Параметры.КаталогНаДиске <> Неопределено Тогда + Каталог = Параметры.КаталогНаДиске; + КонецЕсли; + + Если Параметры.ПапкаДляДобавления <> Неопределено Тогда + ПапкаДляДобавления = Параметры.ПапкаДляДобавления; + КонецЕсли; +КонецПроцедуры + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Form.form new file mode 100644 index 000000000..fbf4ced45 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Form.form @@ -0,0 +1,946 @@ + + + + <key>ru</key> + <value>Импорт файлов</value> + + + Группа + 19 + + Заголовок + 26 + + НадписьФайлы + 27 + + <key>ru</key> + <value>Файлы</value> + + true + true + + true + + + НадписьФайлы + + + НадписьФайлыРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + НадписьФайлыКонтекстноеМеню + 28 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ВыбратьФайлы + 8 + + <key>ru</key> + <value>Выбрать...</value> + + true + true + + true + + false + + ВыбратьФайлыРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + UsualButton + Form.Command.ВыбратьФайлы + Normal + Auto + 10 + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + ru + Заголовок + + + ЗаголовокРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ВыбранныеФайлы + 16 + true + true + + true + + + ВыбранныеФайлы + + false + None + Add + Change + Copy + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + КартинкаИНаименование + 29 + + ВыбранныеФайлыИндексКартинки + 30 + true + true + + true + + + ВыбранныеФайлы.ИндексКартинки + + + ВыбранныеФайлыИндексКартинкиРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ВыбранныеФайлыИндексКартинкиКонтекстноеМеню + 31 + true + + PictureField + Auto + true + Left + true + + true + true + true + true + + CommonPicture.ПиктограммыФайлов + + + + 1 + + + + + ВыбранныеФайлыПуть + 32 + true + true + + true + + + ВыбранныеФайлы.Путь + + + ВыбранныеФайлыПутьРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ВыбранныеФайлыПутьКонтекстноеМеню + 33 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Картинка и наименование</value> + + + ru + Картинка и наименование + + + КартинкаИНаименованиеРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + None + + ВыбранныеФайлыКоманднаяПанель + 18 + Left + true + + + BeforeAddRow + ВыбранныеФайлыПередНачаломДобавления + + + ВыбранныеФайлыСтрокаПоиска + 40 + + ВыбранныеФайлыСтрокаПоискаРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + ВыбранныеФайлыСтрокаПоискаКонтекстноеМеню + 41 + true + + ВыбранныеФайлы + + true + + + + ВыбранныеФайлыСостояниеПросмотра + 43 + + ВыбранныеФайлыСостояниеПросмотраРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + ВыбранныеФайлыСостояниеПросмотраКонтекстноеМеню + 44 + true + + ViewStatusAddition + ВыбранныеФайлы + + true + + + + ВыбранныеФайлыУправлениеПоиском + 46 + + ВыбранныеФайлыУправлениеПоискомРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ВыбранныеФайлыУправлениеПоискомКонтекстноеМеню + 47 + true + + SearchControlAddition + ВыбранныеФайлы + + true + + + + ВыбранныеФайлыРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + ВыбранныеФайлыКонтекстноеМеню + 17 + true + + true + true + true + 50 + true + true + 8 + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + + Style.BorderColor + + None + None + None + true + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ПапкаДляДобавления + 14 + + <key>ru</key> + <value>Папка</value> + + true + true + + true + + + ПапкаДляДобавления + + + ПапкаДляДобавленияРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + ПапкаДляДобавленияКонтекстноеМеню + 15 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + УдалятьПослеДобавления + 3 + true + true + + true + + + УдалятьФайлыПослеДобавления + + Right + + УдалятьПослеДобавленияРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + УдалятьПослеДобавленияКонтекстноеМеню + 10 + true + + CheckBoxField + Enter + true + Left + true + Left + + + + Описание + 2 + + <key>ru</key> + <value>Описание для создаваемых файлов</value> + + true + true + + true + + + Комментарий + + + ОписаниеРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + Left + + true + 3 + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ХранитьВерсии + 21 + true + true + + true + + + ХранитьВерсии + + Right + + ХранитьВерсииРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + ХранитьВерсииКонтекстноеМеню + 22 + true + + CheckBoxField + Enter + true + Left + true + Left + + + + ОсновнаяКоманднаяПанель + 1 + + Добавить + 4 + true + true + + true + + false + + ДобавитьРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + Form.Command.Добавить + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Отмена + 20 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + CommandBar + + Right + Form + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + 1 + + String + + + + true + + + true + +
    true
    + true +
    + + ВыбранныеФайлы + + <key>ru</key> + <value>Выбранные файлы</value> + + 2 + + ValueTable + + + true + + + true + + ShowError + + Путь + + <key>ru</key> + <value>Путь</value> + + 1 + + String + + + + true + + + true + + + + ИндексКартинки + + <key>ru</key> + <value>Индекс картинки</value> + + 2 + + Number + + 10 + + + + true + + + true + + + + + Комментарий + + <key>ru</key> + <value>Комментарий</value> + + 3 + + String + + + + true + + + true + + + + УдалятьФайлыПослеДобавления + + <key>ru</key> + <value>Удалять файлы после добавления</value> + + 4 + + Boolean + + + true + + + true + + + + Рекурсивно + + <key>ru</key> + <value>Рекурсивно</value> + + 7 + + Boolean + + + true + + + true + + + + ХранитьВерсии + + <key>ru</key> + <value>Хранить версии</value> + + 5 + + Boolean + + + true + + + true + + + + НадписьФайлы + + <key>ru</key> + <value>Надпись файлы</value> + + 8 + + String + + + + true + + + true + + + + ПапкаДляДобавления + + <key>ru</key> + <value>Папка для добавления</value> + + 6 + + CatalogRef.ПапкиФайлов + + + true + + + true + + + + ВладелецФайлов + + <key>ru</key> + <value>Владелец файлов</value> + + 9 + + + 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/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Help/ru.html new file mode 100644 index 000000000..949979628 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Help/ru.html @@ -0,0 +1,3 @@ + +

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

    +

    См. также: Импорт каталога.

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Module.bsl new file mode 100644 index 000000000..4c9f72c83 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Module.bsl @@ -0,0 +1,121 @@ + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + ХранитьВерсии = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьВыполнить() + + ОчиститьСообщения(); + + ПоляНеЗаполнены = Ложь; + + Если ВыбранныеФайлы.Количество() = 0 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Нет файлов для добавления!'"), , "ВыбранныеФайлы"); + ПоляНеЗаполнены = Истина; + КонецЕсли; + + ВладелецФайловДляДобавления = ВладелецФайлов; + Если ТипЗнч(ВладелецФайлов) = Тип("СправочникСсылка.ПапкиФайлов") Тогда + ВладелецФайловДляДобавления = ПапкаДляДобавления; + КонецЕсли; + + Если ВладелецФайловДляДобавления.Пустая() Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Укажите папку!'"), , "ПапкаДляДобавления"); + ПоляНеЗаполнены = Истина; + КонецЕсли; + + Если ПоляНеЗаполнены = Истина Тогда + Возврат; + КонецЕсли; + + ПсевдоФайловаяСистема = Новый Соответствие; // соответствие путь к директории - файлы и папки в ней + + ВыбранныеФайлыСписокЗначений = Новый СписокЗначений; + Для Каждого СтрокаСписка Из ВыбранныеФайлы Цикл + ВыбранныеФайлыСписокЗначений.Добавить(СтрокаСписка.Путь); + КонецЦикла; + + ДобавленныеФайлы = Новый Массив; + + ФайловыеФункцииКлиент.ИмпортФайловВыполнить( + ВладелецФайловДляДобавления, + ВыбранныеФайлыСписокЗначений, + Комментарий, + ХранитьВерсии, + УдалятьФайлыПослеДобавления, + Ложь, // Ложь - нерекурсивно + УникальныйИдентификатор, + ПсевдоФайловаяСистема, + ДобавленныеФайлы); + + Закрыть(); + + ПараметрКоманды = Неопределено; + Если ДобавленныеФайлы.Количество() > 0 Тогда + Индекс = ДобавленныеФайлы.Количество() - 1; + ПараметрКоманды = ДобавленныеФайлы[Индекс].ФайлСсылка; + КонецЕсли; + + Оповестить("ИмпортФайловЗавершен", ПараметрКоманды,); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьФайлыВыполнить() + #Если НЕ ВебКлиент Тогда + Режим = РежимДиалогаВыбораФайла.Открытие; + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.Фильтр = Фильтр; + ДиалогОткрытияФайла.МножественныйВыбор = Истина; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файлы'"); + Если ДиалогОткрытияФайла.Выбрать() Тогда + ВыбранныеФайлы.Очистить(); + + МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; + Для Каждого ИмяФайла Из МассивФайлов Цикл + ФайлПеренесенный = Новый Файл(ИмяФайла); + НовыйЭлемент = ВыбранныеФайлы.Добавить(); + НовыйЭлемент.Путь = ИмяФайла; + НовыйЭлемент.ИндексКартинки = РаботаСФайламиКлиентСервер.ПолучитьИндексПиктограммыФайла(ФайлПеренесенный.Расширение); + КонецЦикла; + КонецЕсли; + #КонецЕсли +КонецПроцедуры + +&НаКлиенте +Процедура ВыбранныеФайлыПередНачаломДобавления(Элемент, Отказ, Копирование) + Отказ = Истина; +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если НЕ Параметры.Свойство("ПапкаДляДобавления") Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Данная обработка вызывается из других процедур конфигурации. Вручную ее вызывать запрещено.'")); + Отказ = Истина; + Возврат; + КонецЕсли; + + Если Параметры.ПапкаДляДобавления <> Неопределено Тогда + ВладелецФайлов = Параметры.ПапкаДляДобавления; + Если ТипЗнч(ВладелецФайлов) = Тип("СправочникСсылка.ПапкиФайлов") Тогда + ПапкаДляДобавления = ВладелецФайлов; + Иначе + Элементы.ПапкаДляДобавления.Видимость = Ложь; + КонецЕсли; + КонецЕсли; + + Если Параметры.МассивИменФайлов <> Неопределено Тогда + Для Каждого ПутьФайла Из Параметры.МассивИменФайлов Цикл + ФайлПеренесенный = Новый Файл(ПутьФайла); + НовыйЭлемент = ВыбранныеФайлы.Добавить(); + НовыйЭлемент.Путь = ПутьФайла; + НовыйЭлемент.ИндексКартинки = РаботаСФайламиКлиентСервер.ПолучитьИндексПиктограммыФайла(ФайлПеренесенный.Расширение); + КонецЦикла; + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Form.form new file mode 100644 index 000000000..550833ba7 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Form.form @@ -0,0 +1,167 @@ + + + + <key>ru</key> + <value>Подсказка</value> + + + ТекстНапоминания + 4 + true + true + + true + + + ТекстНапоминания + + None + + ТекстНапоминанияРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ТекстНапоминанияКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + 35 + true + 10 + true + + + + ПоказыватьНапоминаниеПриРедактировании + 2 + true + true + + true + + + БольшеНеПоказывать + + Right + + ПоказыватьНапоминаниеПриРедактированииРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ПоказыватьНапоминаниеПриРедактированииКонтекстноеМеню + 3 + true + + CheckBoxField + Enter + true + Left + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Закрыть + 1 + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + Form.StandardCommand.OK + PictureAndText + true + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + 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 + + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Module.bsl new file mode 100644 index 000000000..bb35ea4f7 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Module.bsl @@ -0,0 +1,8 @@ +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ТекстНапоминания = + НСтр("ru = 'Сейчас Вам будет предложено выбрать файл для того, чтобы поместить его в информационную базу и закончить редактирование. + |Найдите нужный файл в том каталоге, который Вы указывали ранее при начале редактирования.'"); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПриРедактировании/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПриРедактировании/Form.form new file mode 100644 index 000000000..4902826e5 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПриРедактировании/Form.form @@ -0,0 +1,251 @@ + + + + <key>ru</key> + <value>Подсказка</value> + + + Внимание + 6 + true + true + + true + + + СтрокаВнимание + + None + + ВниманиеРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ВниманиеКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + System.DefaultGUIFont + true + false + false + false + + + + + ТекстНапоминания + 4 + true + true + + true + + + ТекстНапоминания + + None + + ТекстНапоминанияРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ТекстНапоминанияКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + 35 + true + 10 + true + + + + ПоказыватьНапоминаниеПриРедактировании + 2 + true + true + + true + + + БольшеНеПоказывать + + Right + + ПоказыватьНапоминаниеПриРедактированииРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ПоказыватьНапоминаниеПриРедактированииКонтекстноеМеню + 3 + true + + CheckBoxField + Enter + true + Left + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Закрыть + 1 + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + Form.StandardCommand.OK + PictureAndText + true + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + 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> + + 3 + + String + + + + true + + + true + + + + КартинкаВнимание + + <key>ru</key> + <value>Картинка внимание</value> + + 4 + + String + + + + true + + + true + + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПриРедактировании/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПриРедактировании/Module.bsl new file mode 100644 index 000000000..0bc0dae6b --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПриРедактировании/Module.bsl @@ -0,0 +1,25 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СтрокаВнимание = НСтр("ru = 'Внимание!'"); + + ТекстНапоминания = + НСтр("ru = 'Сейчас браузер предложит Вам открыть или сохранить файл: + |1. Нажмите кнопку ""Сохранить""(""Save"") + |2. Выберите каталог для сохранения файла и запомните его – эта информация понадобится в дальнейшем для редактирования и возврата файла на сервер. + |3. Для редактирования файла перейдите в выбранный ранее каталог, найдите там нужный файл и откройте его.'"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СисИнфо = Новый СистемнаяИнформация; + + Если Найти(СисИнфо.ИнформацияПрограммыПросмотра, "Firefox") <> 0 Тогда + ТекстНапоминания = ТекстНапоминания + Символы.ПС + Символы.ПС + + НСтр("ru = '(По умолчанию браузер Mozilla Firefox автоматически сохраняет файлы в каталоге ""Мои документы"")'"); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Form.form new file mode 100644 index 000000000..90f80811a --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Form.form @@ -0,0 +1,260 @@ + + + + <key>ru</key> + <value>Создание нового файла</value> + + + РежимСоздания + 2 + + <key>ru</key> + <value>Создать новый файл</value> + + true + true + + true + + + РежимСоздания + + Top + + РежимСозданияРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + РежимСозданияКонтекстноеМеню + 3 + true + + RadioButtonField + Enter + true + Left + true + Left + + 1 + + + ru + Из шаблона + + + 1 + + + + + ru + Из файла на диске + + + 2 + + + Vertical + + + + ОсновнаяКоманднаяПанель + 1 + + СоздатьФайл + 4 + + <key>ru</key> + <value>Создать</value> + + true + true + + true + + false + + СоздатьФайлРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + Form.Command.СоздатьФайл + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Отмена + 8 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 9 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + CommandBar + + Right + Form + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + 30 + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + РежимСоздания + + <key>ru</key> + <value>Режим создания</value> + + 1 + + Number + + 1 + true + + + + true + + + true + + + + СоздатьФайл + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + Создать файл + + + true + + + + СоздатьФайлВыполнить + + + Auto + Auto + + + ГруппаСоздания + + CatalogRef.ПапкиФайлов + + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Help/ru.html new file mode 100644 index 000000000..eef794a6c --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Help/ru.html @@ -0,0 +1,6 @@ + +

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

    + + +
    Из шаблонаНовый файл будет создан на основе выбранного шаблона 
    Из файлаНовый файл будет создан из существующего на локальном или сетевом диске файла

     

    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Module.bsl new file mode 100644 index 000000000..226e6b0cf --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Module.bsl @@ -0,0 +1,14 @@ + +&НаКлиенте +Процедура СоздатьФайлВыполнить() + Закрыть(КодВозвратаДиалога.Да); +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если Параметры.Свойство("ДоступнаКомандаСканировать") Тогда + Если Параметры.ДоступнаКомандаСканировать Тогда + Элементы.РежимСоздания.СписокВыбора.Добавить(3, "Со сканера"); + КонецЕсли; + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Form.form new file mode 100644 index 000000000..6a81650a9 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Form.form @@ -0,0 +1,130 @@ + + + + <key>ru</key> + <value>Ошибки импорта файлов</value> + + + ОсновнаяКоманднаяПанель + 1 + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + CommandBar + + Left + Form + + + + Отчет + 2 + true + true + + true + + + Отчет + + None + + ОтчетРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + + ОтчетКонтекстноеМеню + 3 + true + + SpreadsheetDocumentField + Enter + true + Left + true + Left + + + Selection + ОтчетВыбор + + 50 + true + 10 + true + true + true + true + true + Special + ScrollAlways + ScrollAlways + Auto + true + true + true + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + 80 + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Отчет + + <key>ru</key> + <value>Отчет</value> + + 1 + + SpreadsheetDocument + + + true + + + true + + + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Module.bsl new file mode 100644 index 000000000..a8e1939ed --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Module.bsl @@ -0,0 +1,20 @@ + +&НаКлиенте +Процедура ОтчетВыбор(Элемент, Область, СтандартнаяОбработка) + + #Если Не ВебКлиент Тогда + Если Найти(Область.Текст, ":\") > 0 ИЛИ Найти(Область.Текст, ":/") > 0 Тогда // Путь к файлу + РаботаСФайламиКлиент.ОткрытьПроводникСФайлом(Область.Текст); + КонецЕсли; + #КонецЕсли + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Отчет = РаботаСФайлами.ИмпортФайловСформироватьОтчет(Параметры.МассивИменФайловСОшибками); + + Если Параметры.Свойство("Заголовок") Тогда + Заголовок = Параметры.Заголовок; + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаОтчетаОСохранении/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаОтчетаОСохранении/Form.form new file mode 100644 index 000000000..62aa09d77 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаОтчетаОСохранении/Form.form @@ -0,0 +1,120 @@ + + + + <key>ru</key> + <value>Файлы сохранены</value> + + + Текст + 2 + true + true + + true + + + Текст + + None + + ТекстРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + + ТекстКонтекстноеМеню + 3 + true + + InputField + true + Enter + true + Left + true + + 70 + true + 10 + true + true + true + true + true + true + Normal + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаЗакрыть + 1 + true + true + + true + + + ФормаЗакрытьРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + Form.StandardCommand.Close + true + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Текст + + <key>ru</key> + <value>Текст</value> + + 1 + + String + + + + true + + + true + + + + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаОтчетаОСохранении/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаОтчетаОСохранении/Module.bsl new file mode 100644 index 000000000..c6c17dc4f --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаОтчетаОСохранении/Module.bsl @@ -0,0 +1,5 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Текст = Параметры.Текст; +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form new file mode 100644 index 000000000..6c60d75a2 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form @@ -0,0 +1,962 @@ + + + + <key>ru</key> + <value>Импорт файлов</value> + + + Группа + 19 + + Заголовок + 26 + + НадписьФайлы + 27 + + <key>ru</key> + <value>Файлы</value> + + true + true + + true + + + НадписьФайлы + + + НадписьФайлыРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + НадписьФайлыКонтекстноеМеню + 28 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + ru + Заголовок + + + ЗаголовокРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ДеревоФайлов + 31 + true + true + + true + + + ДеревоФайлов + + false + None + + КартинкаИНаименование + 40 + + ДеревоФайловПометка + 41 + true + true + + true + + + ДеревоФайлов.Пометка + + + OnChange + ДеревоФайловПометкаПриИзменении + + + ДеревоФайловПометкаРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + ДеревоФайловПометкаКонтекстноеМеню + 42 + true + + CheckBoxField + Auto + true + Left + true + + + + ДеревоФайловИндексКартинки + 38 + true + true + + true + + + ДеревоФайлов.ИндексКартинки + + + ДеревоФайловИндексКартинкиРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + ДеревоФайловИндексКартинкиКонтекстноеМеню + 39 + true + + PictureField + Auto + true + Left + true + + true + true + true + true + + CommonPicture.ПиктограммыФайлов + + + + 1 + + + + + ДеревоФайловИмяФайла + 34 + true + true + + true + + + ДеревоФайлов.ИмяФайла + + + ДеревоФайловИмяФайлаРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + ДеревоФайловИмяФайлаКонтекстноеМеню + 35 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + КартинкаИНаименованиеРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + None + + ДеревоФайловКоманднаяПанель + 33 + Left + true + + + ДеревоФайловСтрокаПоиска + 48 + + ДеревоФайловСтрокаПоискаРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ДеревоФайловСтрокаПоискаКонтекстноеМеню + 49 + true + + ДеревоФайлов + + true + + + + ДеревоФайловСостояниеПросмотра + 51 + + ДеревоФайловСостояниеПросмотраРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ДеревоФайловСостояниеПросмотраКонтекстноеМеню + 52 + true + + ViewStatusAddition + ДеревоФайлов + + true + + + + ДеревоФайловУправлениеПоиском + 54 + + ДеревоФайловУправлениеПоискомРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + ДеревоФайловУправлениеПоискомКонтекстноеМеню + 55 + true + + SearchControlAddition + ДеревоФайлов + + true + + + + ДеревоФайловРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ДеревоФайловКонтекстноеМеню + 32 + true + + Tree + 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 + + + ГруппаРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ПапкаДляДобавления + 14 + + <key>ru</key> + <value>Папка</value> + + true + true + + true + + + ПапкаДляДобавленияРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + + ПапкаДляДобавленияКонтекстноеМеню + 15 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + УдалятьПослеДобавления + 3 + true + true + + true + + + УдалятьФайлыПослеДобавления + + Right + + УдалятьПослеДобавленияРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + УдалятьПослеДобавленияКонтекстноеМеню + 10 + true + + CheckBoxField + Enter + true + Left + true + Left + + + + РеквизитыФайлов + 25 + + Описание + 2 + + <key>ru</key> + <value>Описание для создаваемых файлов</value> + + true + true + + true + + + Комментарий + + + ОписаниеРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ХранитьВерсии + 21 + true + true + + true + + + ХранитьВерсии + + Right + + ХранитьВерсииРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ХранитьВерсииКонтекстноеМеню + 22 + true + + CheckBoxField + Enter + true + Left + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Реквизиты файлов</value> + + + ru + Реквизиты файлов + + + РеквизитыФайловРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ОсновнаяКоманднаяПанель + 1 + + Добавить + 4 + true + true + + true + + false + + ДобавитьРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + Form.Command.Добавить + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Отмена + 20 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + CommandBar + + Right + Form + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + 1 + + + true + + + true + +
    true
    + true +
    + + Комментарий + + <key>ru</key> + <value>Комментарий</value> + + 3 + + String + + + + true + + + true + + + + УдалятьФайлыПослеДобавления + + <key>ru</key> + <value>Удалять файлы после добавления</value> + + 4 + + Boolean + + + true + + + true + + + + Рекурсивно + + <key>ru</key> + <value>Рекурсивно</value> + + 7 + + Boolean + + + true + + + true + + + + ХранитьВерсии + + <key>ru</key> + <value>Хранить версии</value> + + 5 + + Boolean + + + true + + + true + + + + НадписьФайлы + + <key>ru</key> + <value>Надпись файлы</value> + + 8 + + String + + + + true + + + true + + + + СписокИменФайлов + + <key>ru</key> + <value>Список имен файлов</value> + + 6 + + ValueList + + + true + + + true + + + + + + + ДеревоФайлов + + <key>ru</key> + <value>Дерево файлов</value> + + 9 + + ValueTree + + + 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 + + 10 + + + + true + + + true + + + + Пометка + + <key>ru</key> + <value>Пометка</value> + + 4 + + Boolean + + + true + + + true + + + + + ПапкаДляДобавления + + <key>ru</key> + <value>Папка для добавления</value> + + 2 + + CatalogRef.ПапкиФайлов + + + 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..9357f2360 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Module.bsl @@ -0,0 +1,167 @@ +&НаКлиенте +Процедура ЗаполнитьСписокФайлов(ПутьФайла, Знач ЭлементыДерева, ЭлементВерхнегоУровня) + ФайлПеренесенный = Новый Файл(ПутьФайла); + + НовыйЭлемент = ЭлементыДерева.Добавить(); + НовыйЭлемент.ПолныйПуть = ФайлПеренесенный.ПолноеИмя; + НовыйЭлемент.ИмяФайла = ФайлПеренесенный.Имя; + НовыйЭлемент.Пометка = Истина; + + Если ФайлПеренесенный.Расширение = "" Тогда + НовыйЭлемент.ИндексКартинки = 2; // папка + Иначе + НовыйЭлемент.ИндексКартинки = РаботаСФайламиКлиентСервер.ПолучитьИндексПиктограммыФайла(ФайлПеренесенный.Расширение); + КонецЕсли; + + Если ФайлПеренесенный.ЭтоКаталог() Тогда + + Путь = ФайлПеренесенный.ПолноеИмя + "\"; + + Если ЭлементВерхнегоУровня = Истина Тогда + Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идет сбор информации о каталоге ""%1"". + |Пожалуйста, подождите.'"), Путь )); + КонецЕсли; + + НайденныеФайлы = НайтиФайлы(Путь, "*.*"); + + ФайлСортированные = Новый Массив; + + // папки сперва + Для Каждого ФайлВложенный Из НайденныеФайлы Цикл + Если ФайлВложенный.ЭтоКаталог() Тогда + ФайлСортированные.Добавить(ФайлВложенный.ПолноеИмя); + КонецЕсли; + КонецЦикла; + + // потом файлы + Для Каждого ФайлВложенный Из НайденныеФайлы Цикл + Если НЕ ФайлВложенный.ЭтоКаталог() Тогда + ФайлСортированные.Добавить(ФайлВложенный.ПолноеИмя); + КонецЕсли; + КонецЦикла; + + Для Каждого ФайлВложенный Из ФайлСортированные Цикл + ЗаполнитьСписокФайлов(ФайлВложенный, НовыйЭлемент.ПолучитьЭлементы(), Ложь); + КонецЦикла; + + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + #Если ВебКлиент Тогда + Предупреждение(НСтр("ru = 'В Веб-клиенте импорт файлов не поддерживается. Используйте команду ""Создать"" в списке файлов.'")); + Отказ = Истина; + Возврат; + #КонецЕсли + + ХранитьВерсии = Истина; + + Для Каждого ПутьФайла Из СписокИменФайлов Цикл + ЗаполнитьСписокФайлов(ПутьФайла, ДеревоФайлов.ПолучитьЭлементы(), Истина); + КонецЦикла; + + Состояние(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьФайловуюСистему(ПсевдоФайловаяСистема, ЭлементДерева) + Если ЭлементДерева.Пометка = Истина Тогда + ДочерниеЭлементы = ЭлементДерева.ПолучитьЭлементы(); + Если ДочерниеЭлементы.Количество() <> 0 Тогда + + ФайлыИПодпапки = Новый Массив; + Для Каждого ФайлВложенный Из ДочерниеЭлементы Цикл + ЗаполнитьФайловуюСистему(ПсевдоФайловаяСистема, ФайлВложенный); + + Если ФайлВложенный.Пометка = Истина Тогда + ФайлыИПодпапки.Добавить(ФайлВложенный.ПолныйПуть); + КонецЕсли; + КонецЦикла; + + ПсевдоФайловаяСистема.Вставить(ЭлементДерева.ПолныйПуть, ФайлыИПодпапки); + КонецЕсли; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьВыполнить() + + ОчиститьСообщения(); + + ПоляНеЗаполнены = Ложь; + + ПсевдоФайловаяСистема = Новый Соответствие; // соответствие путь к директории - файлы и папки в ней + + ВыбранныеФайлы = Новый СписокЗначений; + Для Каждого файлВложенный Из ДеревоФайлов.ПолучитьЭлементы() Цикл + Если файлВложенный.Пометка = Истина Тогда + ВыбранныеФайлы.Добавить(файлВложенный.ПолныйПуть); + КонецЕсли; + КонецЦикла; + + Для Каждого файлВложенный Из ДеревоФайлов.ПолучитьЭлементы() Цикл + ЗаполнитьФайловуюСистему(ПсевдоФайловаяСистема, файлВложенный); + КонецЦикла; + + Если ВыбранныеФайлы.Количество() = 0 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Нет файлов для добавления!'"), , "ВыбранныеФайлы"); + ПоляНеЗаполнены = Истина; + КонецЕсли; + + Если ПапкаДляДобавления.Пустая() Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Укажите папку!'"), , "ПапкаДляДобавления"); + ПоляНеЗаполнены = Истина; + КонецЕсли; + + Если ПоляНеЗаполнены = Истина Тогда + Возврат; + КонецЕсли; + + ДобавленныеФайлы = Новый Массив; + + ФайловыеФункцииКлиент.ИмпортФайловВыполнить( + ПапкаДляДобавления, + ВыбранныеФайлы, + Комментарий, + ХранитьВерсии, + УдалятьФайлыПослеДобавления, + Истина, // Истина - рекурсивно + УникальныйИдентификатор, + ПсевдоФайловаяСистема, + ДобавленныеФайлы); + + Закрыть(); + + Оповестить("ИмпортКаталоговЗавершен",,); + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ПапкаДляДобавления = Параметры.ПапкаДляДобавления; + + Для Каждого путьФайла Из Параметры.МассивИменФайлов Цикл + СписокИменФайлов.Добавить(путьФайла); + КонецЦикла; + +КонецПроцедуры + +// рекурсивно ставит пометку всем дочерним элементам +&НаКлиенте +Процедура УстановитьПометку(ЭлементДерева, Пометка) + ДочерниеЭлементы = ЭлементДерева.ПолучитьЭлементы(); + + Для Каждого ФайлВложенный Из ДочерниеЭлементы Цикл + ФайлВложенный.Пометка = Пометка; + УстановитьПометку(ФайлВложенный, Пометка); + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура ДеревоФайловПометкаПриИзменении(Элемент) + ЭлементДанных = ДеревоФайлов.НайтиПоИдентификатору(Элементы.ДеревоФайлов.ТекущаяСтрока); + УстановитьПометку(ЭлементДанных, ЭлементДанных.Пометка); +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Группы/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Группы/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..24f91d64c --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Группы/ExtInfo/ListSettings.dcss @@ -0,0 +1,20 @@ + + + + + Ссылка + InHierarchy + Справочник.ПапкиФайлов.Шаблоны + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Form.form new file mode 100644 index 000000000..9b1eca48c --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Form.form @@ -0,0 +1,940 @@ + + + + <key>ru</key> + <value>Подбор файлов</value> + + + ГруппаСписки + 29 + + Папки + 11 + true + true + + true + + + Группы + + false + None + + КартинкаИНаименованиеПапок + 36 + + ИндексКартинки + 37 + true + true + + true + + + Группы.ИндексКартинки + + + ИндексКартинкиРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + ИндексКартинкиКонтекстноеМеню + 38 + true + + PictureField + Enter + true + Left + true + + true + true + true + true + + CommonPicture.Папки + + + + 1 + + + + + Папка + 14 + + <key>ru</key> + <value>Папка</value> + + true + true + + true + + + Группы.Description + + + ПапкаРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + ПапкаКонтекстноеМеню + 15 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Картинка и наименование папок</value> + + + ru + Картинка и наименование папок + + + КартинкаИНаименованиеПапокРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + None + + ПапкиКоманднаяПанель + 13 + Left + true + + + OnActivateRow + ГруппыПриАктивизацииСтроки + + + ПапкиСтрокаПоиска + 47 + + ПапкиСтрокаПоискаРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + ПапкиСтрокаПоискаКонтекстноеМеню + 48 + true + + Папки + + true + + + + ПапкиСостояниеПросмотра + 50 + + ПапкиСостояниеПросмотраРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ПапкиСостояниеПросмотраКонтекстноеМеню + 51 + true + + ViewStatusAddition + Папки + + true + + + + ПапкиУправлениеПоиском + 53 + + ПапкиУправлениеПоискомРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + ПапкиУправлениеПоискомКонтекстноеМеню + 54 + true + + SearchControlAddition + Папки + + true + + + + ПапкиРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ПапкиКонтекстноеМеню + 12 + true + + Tree + true + true + true + 24 + true + true + true + Row + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + Auto + Auto + true + true + true + true + + Style.BorderColor + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + + + + Список + 2 + true + true + + true + + + Список + + true + false + None + + КартинкаИНаименование + 34 + + Картинка + 25 + true + true + + true + + + Список.ИндексКартинки + + None + + КартинкаРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + КартинкаКонтекстноеМеню + 26 + true + + PictureField + Enter + true + Left + true + Left + + 2 + true + 1 + true + true + true + + CommonPicture.ПиктограммыФайлов + + + 1 + + + + + Наименование + 5 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Картинка и наименование</value> + + + ru + Картинка и наименование + + + КартинкаИНаименованиеРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + Описание + 31 + true + true + + true + + + Список.Описание + + + ОписаниеРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 32 + true + + InputField + Enter + true + Left + true + + true + 1 + true + false + true + true + true + Normal + + + + Автор + 21 + true + true + + true + + + Список.Автор + + + АвторРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ДатаСоздания + 23 + true + true + + true + + + Список.ДатаСоздания + + + ДатаСозданияРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + ДатаСозданияКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Ссылка + 41 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 42 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 4 + Left + true + + + ValueChoice + СписокВыборЗначения + + + СписокСтрокаПоиска + 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 + + + + СписокРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 3 + true + + HierarchicalList + true + true + true + 48 + true + true + true + true + Row +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + true + + Style.BorderColor + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
    + true + true + + true + + + ru + Группа списки + + + ГруппаСпискиРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + LeftNarrowest + Auto + Auto + +
    + + ФормаКоманднаяПанель + -1 + + Выбрать + 39 + true + true + + true + + false + + ВыбратьРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + Form.StandardCommand.Choose + Auto + true + true + true + UserCmds + Auto + + + Справка + 40 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + CancelSearch + Change + Copy + Create + CustomizeForm + Delete + Find + ListSettings + OutputList + Refresh + SetDeletionMark + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + ВЫБРАТЬ + Файлы.Ссылка, + Файлы.ПометкаУдаления, + Файлы.Предопределенный, + Файлы.Код, + Файлы.Наименование, + Файлы.Автор, + Файлы.ДатаСоздания, + Файлы.ХранитьВерсии, + Файлы.Редактирует, + Файлы.ТекущаяВерсия, + Файлы.ИндексКартинки, + Файлы.Описание, + Файлы.ПолноеНаименование, + Файлы.ВладелецФайла +ИЗ + Справочник.Файлы КАК Файлы +ГДЕ + Файлы.ВладелецФайла = &Владелец + И Файлы.ПометкаУдаления = Ложь + Catalog.Файлы + true + true + true + true + true + +
    + + Группы + + <key>ru</key> + <value>Группы</value> + + 2 + + DynamicList + + + true + + + true + + + ВЫБРАТЬ + СправочникПапкиФайлов.Ссылка, + СправочникПапкиФайлов.ПометкаУдаления, + СправочникПапкиФайлов.Предопределенный, + СправочникПапкиФайлов.Родитель, + СправочникПапкиФайлов.Код, + СправочникПапкиФайлов.Наименование, + СправочникПапкиФайлов.Описание, + СправочникПапкиФайлов.Ответственный, + СправочникПапкиФайлов.ДатаСоздания, + СправочникПапкиФайлов.ДополнительныеРеквизиты, + Выбор + Когда ПометкаУдаления = Истина Тогда 1 + Иначе 0 + Конец как ИндексКартинки +ИЗ + Справочник.ПапкиФайлов КАК СправочникПапкиФайлов + Catalog.ПапкиФайлов + true + true + true + true + true + + + + Параметр1 + + CatalogRef.ПапкиФайлов + + + + + + + +
    diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Module.bsl new file mode 100644 index 000000000..0aa61d4b9 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Module.bsl @@ -0,0 +1,57 @@ +&НаКлиенте +Процедура ГруппыПриАктивизацииСтроки(Элемент) + ПодключитьОбработчикОжидания("ОбработкаОжидания", 0.2, Истина); +КонецПроцедуры + +// Процедура обновляет список Файлов +&НаКлиенте +Процедура ОбработкаОжидания() + + Если Элементы.Папки.ТекущаяСтрока <> Неопределено Тогда + Список.Параметры.УстановитьЗначениеПараметра("Владелец", Элементы.Папки.ТекущаяСтрока); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("ВладелецФайла") Тогда + Список.Параметры.УстановитьЗначениеПараметра( + "Владелец", Параметры.ВладелецФайла); + + Если ТипЗнч(Параметры.ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") Тогда + Элементы.Папки.ТекущаяСтрока = Параметры.ВладелецФайла; + Элементы.Папки.ВыделенныеСтроки.Очистить(); + Элементы.Папки.ВыделенныеСтроки.Добавить(Элементы.Папки.ТекущаяСтрока); + Иначе + Элементы.Папки.Видимость = Ложь; + КонецЕсли; + Иначе + Если Параметры.Свойство("ВыборШаблона") И Параметры.ВыборШаблона Тогда + Элементы.Папки.ТекущаяСтрока = Справочники.ПапкиФайлов.Шаблоны; + Элементы.Папки.ВыделенныеСтроки.Очистить(); + Элементы.Папки.ВыделенныеСтроки.Добавить(Элементы.Папки.ТекущаяСтрока); + Иначе + Группы.Отбор.Элементы.Очистить(); + КонецЕсли; + + Список.Параметры.УстановитьЗначениеПараметра("Владелец", Элементы.Папки.ТекущаяСтрока); + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура СписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка) + + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + + Параметр = Новый Структура; + Параметр.Вставить("ФайлСсылка", ФайлСсылка); + + ОповеститьОВыборе(Параметр); + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..c6e4fb805 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,21 @@ + + + + + false + DeletionMark + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..03ca3b97d --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Form.form @@ -0,0 +1,1140 @@ + + + + <key>ru</key> + <value>Все файлы</value> + + + Список + 10 + true + true + + true + + + Список + + false + None + Copy + Create + + КартинкаИНаименование + 45 + + Картинка + 25 + true + true + + true + + + Список.ИндексКартинки + + + КартинкаРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + КартинкаКонтекстноеМеню + 26 + true + + PictureField + Enter + Left + true + Left + + 2 + true + 1 + true + true + true + + CommonPicture.ПиктограммыФайлов + + + 1 + + + + + Наименование + 17 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + + НаименованиеРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 18 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + КартинкаИНаименованиеРасширеннаяПодсказка + 104 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + ВладелецФайла + 70 + true + true + + true + + + Список.ВладелецФайла + + + ВладелецФайлаРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + ВладелецФайлаКонтекстноеМеню + 71 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Автор + 21 + true + true + + true + + + Список.Автор + + + АвторРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ДатаСоздания + 23 + + <key>ru</key> + <value>Создан</value> + + true + true + + true + + + Список.ДатаСоздания + + + ДатаСозданияРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + + ДатаСозданияКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТекущаяВерсияРасширение + 72 + + <key>ru</key> + <value>Расширение</value> + + true + true + + true + + + Список.ТекущаяВерсияРасширение + + + ТекущаяВерсияРасширениеРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + ТекущаяВерсияРасширениеКонтекстноеМеню + 73 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ТекущаяВерсияРазмер + 39 + + <key>ru</key> + <value>Размер (Кб)</value> + + true + true + + true + + + Список.ТекущаяВерсияРазмер + + + ТекущаяВерсияРазмерРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + + ТекущаяВерсияРазмерКонтекстноеМеню + 40 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Редактирует + 29 + true + true + + true + + + Список.Редактирует + + + РедактируетРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + + РедактируетКонтекстноеМеню + 30 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Описание + 27 + true + true + + + Список.Описание + + + ОписаниеРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 28 + true + + InputField + Enter + true + Left + true + + true + 1 + true + true + true + true + Normal + + + + ТекущаяВерсияНомерВерсии + 78 + + <key>ru</key> + <value>Номер текущей версии</value> + + true + true + + + Список.ТекущаяВерсияНомерВерсии + + + ТекущаяВерсияНомерВерсииРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + + ТекущаяВерсияНомерВерсииКонтекстноеМеню + 79 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ТекущаяВерсияАвтор + 35 + + <key>ru</key> + <value>Отредактировал</value> + + true + true + + + Список.ТекущаяВерсияАвтор + + + ТекущаяВерсияАвторРасширеннаяПодсказка + 125 + Label + true + true + + Left + + + + ТекущаяВерсияАвторКонтекстноеМеню + 36 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТекущаяВерсияТом + 74 + + <key>ru</key> + <value>Том</value> + + true + true + + + Список.ТекущаяВерсияТом + + + ТекущаяВерсияТомРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + + ТекущаяВерсияТомКонтекстноеМеню + 75 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ТекущаяВерсияПутьКФайлу + 76 + + <key>ru</key> + <value>Путь к файлу на томе</value> + + true + true + + + Список.ТекущаяВерсияПутьКФайлу + + + ТекущаяВерсияПутьКФайлуРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + + ТекущаяВерсияПутьКФайлуКонтекстноеМеню + 77 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Ссылка + 84 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 85 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 12 + Left + true + + + Selection + СписокВыбор + + + BeforeAddRow + СписокПередНачаломДобавления + + + OnActivateRow + СписокПриАктивизацииСтроки + + + СписокСтрокаПоиска + 95 + + СписокСтрокаПоискаРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 96 + true + + Список + + true + + + + СписокСостояниеПросмотра + 98 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 99 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 101 + + СписокУправлениеПоискомРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 102 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 11 + + КонтекстноеМенюСписокПросмотреть + 80 + true + true + + true + + false + + КонтекстноеМенюСписокПросмотретьРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + Form.Command.Просмотреть + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокОсвободить + 83 + true + true + + true + + false + + КонтекстноеМенюСписокОсвободитьРасширеннаяПодсказка + 92 + Label + true + true + + Left + + + Form.Command.Освободить + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСохранитьКак + 81 + true + true + + true + + false + + КонтекстноеМенюСписокСохранитьКакРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + Form.Command.СохранитьКак + Normal + Auto + true + true + UserCmds + Auto + + true + + HierarchicalList + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
    + + ФормаКоманднаяПанель + -1 + + ГруппаКомандФайлов + 67 + + Просмотреть + 69 + true + true + + true + + false + + ПросмотретьРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + Form.Command.Просмотреть + Normal + Auto + true + true + UserCmds + Auto + + + Освободить + 82 + true + true + + true + + false + + ОсвободитьРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + Form.Command.Освободить + Normal + Auto + true + true + UserCmds + Auto + + + СохранитьКак + 59 + + <key>ru</key> + <value>Сохранить как...</value> + + true + true + + true + + false + + СохранитьКакРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + Form.Command.СохранитьКак + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Группа команд файлов</value> + + + ru + Группа команд файлов + + + ГруппаКомандФайловРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + + + ГруппаКомандФормы + 68 + true + true + + true + + + <key>ru</key> + <value>Группа команд формы</value> + + + ru + Группа команд формы + + + ГруппаКомандФормыРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + Form + + + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + Copy + Create + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.Ref + + + Список.Редактирует + + + Список.РедактируетТекущийПользователь + + + Список.ХранитьВерсии + +
    true
    + + ВЫБРАТЬ + Файлы.Код, + Файлы.Редактирует, + Файлы.ДатаСоздания, + Файлы.ТекущаяВерсияРазмер, + Файлы.Автор, + Файлы.ТекущаяВерсияДатаСоздания, + ВЫБОР + КОГДА Файлы.ПометкаУдаления = ИСТИНА + ТОГДА Файлы.ИндексКартинки + 1 + ИНАЧЕ Файлы.ИндексКартинки + КОНЕЦ КАК ИндексКартинки, + Файлы.Наименование, + Файлы.Описание, + Файлы.Ссылка, + Файлы.ТекущаяВерсияАвтор, + Файлы.ПометкаУдаления, + Файлы.ХранитьВерсии, + ВЫБОР + КОГДА Файлы.Редактирует = &ТекущийПользователь + ТОГДА ИСТИНА + ИНАЧЕ ЛОЖЬ + КОНЕЦ КАК РедактируетТекущийПользователь, + Файлы.ВладелецФайла, + Файлы.ТекущаяВерсияРасширение, + Файлы.ТекущаяВерсияНомерВерсии, + Файлы.ТекущаяВерсияТом, + Файлы.ТекущаяВерсияПутьКФайлу +ИЗ + Справочник.Файлы КАК Файлы + Catalog.Файлы + true + true + true + true + +
    + + Просмотреть + + <key>ru</key> + <value>Просмотреть</value> + + 1 + + ru + Открыть файл для просмотра + + + true + + + CommonPicture.КартинкаОткрыть + + + + Просмотреть + + + TextPicture + Auto + Auto + + + СохранитьКак + + <key>ru</key> + <value>Сохранить как...</value> + + 2 + + ru + Сохранить файл на диск или другое устройство + + + true + + + CommonPicture.КартинкаСохранитьКак + + + + СохранитьКак + + + TextPicture + Auto + Auto + + + Освободить + + <key>ru</key> + <value>Отменить редактирование</value> + + 3 + + ru + Освободить занятый файл + + + true + + + CommonPicture.КартинкаОсвободить + + + + Освободить + + + TextPicture + Auto + Auto + + + + + + +
    diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..1d4d101fe --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,102 @@ + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + РаботаСФайламиКлиент.ОткрытьФайл( + РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, Неопределено, УникальныйИдентификатор)); +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + Отказ = Истина; +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Список.Параметры.УстановитьЗначениеПараметра( + "ТекущийПользователь", ОбщегоНазначения.ТекущийПользователь()); + + РаботаСФайлами.ЗаполнитьУсловноеОформлениеСпискаФайлов(Список); +КонецПроцедуры + +// Доступны файловые команды - есть хотя бы одна строка в списке и выделена не группировка +&НаКлиенте +Функция ФайловыеКомандыДоступны() + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Если ТипЗнч(Элементы.Список.ТекущаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +&НаКлиенте +Процедура Просмотреть(Команда) + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, Неопределено, УникальныйИдентификатор); + КомандыРаботыСФайлами.Открыть(ДанныеФайла); +КонецПроцедуры + + +&НаКлиенте +Процедура СохранитьКак(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляСохранения(Элементы.Список.ТекущаяСтрока, Неопределено, УникальныйИдентификатор); + КомандыРаботыСФайлами.СохранитьКак(ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура Освободить(Команда) + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + КомандыРаботыСФайлами.ОсвободитьФайл( + Элементы.Список.ТекущаяСтрока, + Элементы.Список.ТекущиеДанные.ХранитьВерсии, + Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, + Элементы.Список.ТекущиеДанные.Редактирует); + + УстановитьДоступностьФайловыхКомманд(); +КонецПроцедуры + +&НаКлиенте +Процедура СписокПриАктивизацииСтроки(Элемент) + УстановитьДоступностьФайловыхКомманд(); +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьФайловыхКомманд() + + Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда + + Если ТипЗнч(Элементы.Список.ТекущаяСтрока) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + + УстановитьДоступностьКомманд(Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, + Элементы.Список.ТекущиеДанные.Редактирует); + КонецЕсли; + + КонецЕсли; +КонецПроцедуры + + +&НаКлиенте +Процедура УстановитьДоступностьКомманд(РедактируетТекущийПользователь, Редактирует) + Элементы.Освободить.Доступность = Не Редактирует.Пустая(); + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокОсвободить.Доступность = Не Редактирует.Пустая(); +КонецПроцедуры + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..c6e4fb805 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,21 @@ + + + + + false + DeletionMark + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Form.form new file mode 100644 index 000000000..f8a229c9a --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Form.form @@ -0,0 +1,2543 @@ + + + + <key>ru</key> + <value>Файлы</value> + + + Список + 10 + true + true + + true + + + Список + + false + None + + Подписан + 91 + + <key>ru</key> + <value>Подписан</value> + + true + true + + true + + + Список.Подписан + + None + + ru + Подписан + + + ПодписанРасширеннаяПодсказка + 170 + Label + true + true + + Left + + + + ПодписанКонтекстноеМеню + 92 + true + + PictureField + Enter + true + + CommonPicture.Подписан + + Left + true + + true + true + true + true + + CommonPicture.Подписан + + + + 1 + + + + + Зашифрован + 93 + + <key>ru</key> + <value>Зашифрован</value> + + true + true + + true + + + Список.Зашифрован + + None + + ru + Зашифрован + + + ЗашифрованРасширеннаяПодсказка + 172 + Label + true + true + + Left + + + + ЗашифрованКонтекстноеМеню + 94 + true + + PictureField + Enter + true + + CommonPicture.Зашифрован + + Left + true + + true + true + true + true + + CommonPicture.Зашифрован + + + + 1 + + + + + КартинкаИНаименование + 45 + + Картинка + 25 + true + true + + true + + + Список.ИндексКартинки + + + КартинкаРасширеннаяПодсказка + 175 + Label + true + true + + Left + + + + КартинкаКонтекстноеМеню + 26 + true + + PictureField + Enter + Left + true + Left + + 2 + true + 1 + true + true + true + + CommonPicture.ПиктограммыФайлов + + + 1 + + + + + Наименование + 17 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + + НаименованиеРасширеннаяПодсказка + 177 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 18 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + КартинкаИНаименованиеРасширеннаяПодсказка + 174 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + Описание + 27 + true + true + + true + + + Список.Описание + + + ОписаниеРасширеннаяПодсказка + 179 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 28 + true + + InputField + Enter + true + Left + true + + true + 1 + true + true + true + true + Normal + + + + ДатаСоздания + 23 + + <key>ru</key> + <value>Создан</value> + + true + true + + true + + + Список.ДатаСоздания + + + ДатаСозданияРасширеннаяПодсказка + 181 + Label + true + true + + Left + + + + ДатаСозданияКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Автор + 21 + true + true + + true + + + Список.Автор + + + АвторРасширеннаяПодсказка + 183 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Редактирует + 29 + true + true + + + Список.Редактирует + + + РедактируетРасширеннаяПодсказка + 185 + Label + true + true + + Left + + + + РедактируетКонтекстноеМеню + 30 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТекущаяВерсияРазмер + 39 + + <key>ru</key> + <value>Размер</value> + + true + true + + + Список.ТекущаяВерсияРазмер + + + ТекущаяВерсияРазмерРасширеннаяПодсказка + 187 + Label + true + true + + Left + + + + ТекущаяВерсияРазмерКонтекстноеМеню + 40 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТекущаяВерсияАвтор + 35 + + <key>ru</key> + <value>Отредактировал</value> + + true + true + + + Список.ТекущаяВерсияАвтор + + + ТекущаяВерсияАвторРасширеннаяПодсказка + 189 + Label + true + true + + Left + + + + ТекущаяВерсияАвторКонтекстноеМеню + 36 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТекущаяВерсияДатаСоздания + 37 + + <key>ru</key> + <value>Отредактирован</value> + + true + true + + + Список.ТекущаяВерсияДатаСоздания + + + ТекущаяВерсияДатаСозданияРасширеннаяПодсказка + 191 + Label + true + true + + Left + + + + ТекущаяВерсияДатаСозданияКонтекстноеМеню + 38 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ХранитьВерсии + 63 + true + true + + + Список.ХранитьВерсии + + + ХранитьВерсииРасширеннаяПодсказка + 193 + Label + true + true + + Left + + + + ХранитьВерсииКонтекстноеМеню + 64 + true + + CheckBoxField + Enter + true + Left + true + + + + РедактируетТекущийПользователь + 65 + true + true + + + Список.РедактируетТекущийПользователь + + + РедактируетТекущийПользовательРасширеннаяПодсказка + 195 + Label + true + true + + Left + + + + РедактируетТекущийПользовательКонтекстноеМеню + 66 + true + + CheckBoxField + Enter + true + Left + true + + + + Ссылка + 89 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 197 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 90 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 12 + Left + true + + + DragCheck + СписокПроверкаПеретаскивания + + + Selection + СписокВыбор + + + BeforeAddRow + СписокПередНачаломДобавления + + + OnActivateRow + СписокПриАктивизацииСтроки + + + Drag + СписокПеретаскивание + + + СписокСтрокаПоиска + 161 + + СписокСтрокаПоискаРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 162 + true + + Список + + true + + + + СписокСостояниеПросмотра + 164 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 166 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 165 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 167 + + СписокУправлениеПоискомРасширеннаяПодсказка + 169 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 168 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 11 + + КонтекстноеМенюСписокОткрытьФайл + 78 + true + true + + true + + false + + КонтекстноеМенюСписокОткрытьФайлРасширеннаяПодсказка + 142 + Label + true + true + + Left + + + Form.Command.ОткрытьФайл + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокРедактировать + 79 + true + true + + true + + false + + КонтекстноеМенюСписокРедактироватьРасширеннаяПодсказка + 143 + Label + true + true + + Left + + + Form.Command.Редактировать + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокЗакончитьРедактирование + 80 + true + true + + true + + false + + КонтекстноеМенюСписокЗакончитьРедактированиеРасширеннаяПодсказка + 144 + Label + true + true + + Left + + + Form.Command.ЗакончитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокЗанять + 81 + true + true + + true + + false + + КонтекстноеМенюСписокЗанятьРасширеннаяПодсказка + 145 + Label + true + true + + Left + + + Form.Command.Занять + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСохранитьИзменения + 82 + true + true + + true + + false + + КонтекстноеМенюСписокСохранитьИзмененияРасширеннаяПодсказка + 146 + Label + true + true + + Left + + + Form.Command.СохранитьИзменения + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокОткрытьКаталогФайла + 83 + true + true + + true + + false + + КонтекстноеМенюСписокОткрытьКаталогФайлаРасширеннаяПодсказка + 147 + Label + true + true + + Left + + + Form.Command.ОткрытьКаталогФайла + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСохранитьКак + 84 + true + true + + true + + false + + КонтекстноеМенюСписокСохранитьКакРасширеннаяПодсказка + 148 + Label + true + true + + Left + + + Form.Command.СохранитьКак + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокОсвободить + 85 + true + true + + true + + false + + КонтекстноеМенюСписокОсвободитьРасширеннаяПодсказка + 149 + Label + true + true + + Left + + + Form.Command.Освободить + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаКомандИмпорта + 86 + + КонтекстноеМенюСписокИмпортФайлов + 87 + true + true + + true + + false + + КонтекстноеМенюСписокИмпортФайловРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + Form.Command.ИмпортФайлов + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа команд импорта</value> + + + ru + Группа команд импорта + + + ГруппаКомандИмпортаРасширеннаяПодсказка + 150 + Label + true + true + + Left + + + + + + ФормаЭЦПИШифрованиеКонтекстное + 104 + + ФормаГруппаЭЦПКонтекст + 105 + + ФормаПодписатьКонтекст + 106 + true + true + + true + + + ФормаПодписатьКонтекстРасширеннаяПодсказка + 154 + Label + true + true + + Left + + + Form.Command.Подписать + Normal + Auto + true + true + UserCmds + Auto + + + ФормаДобавитьЭЦПИзФайлаКонтекст + 108 + true + true + + true + + + ФормаДобавитьЭЦПИзФайлаКонтекстРасширеннаяПодсказка + 155 + Label + true + true + + Left + + + Form.Command.ДобавитьЭЦПИзФайла + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСохранитьВместеСЭЦПКонтекст + 109 + true + true + + true + + + ФормаСохранитьВместеСЭЦПКонтекстРасширеннаяПодсказка + 156 + Label + true + true + + Left + + + Form.Command.СохранитьВместеСЭЦП + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>ЭЦП</value> + + + ru + Форма группа ЭЦП + + + ФормаГруппаЭЦПКонтекстРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + + + + ФормаГруппаШифрованиеКонтекст + 110 + + ФормаЗашифроватьКонтекст + 111 + true + true + + true + + + ФормаЗашифроватьКонтекстРасширеннаяПодсказка + 158 + Label + true + true + + Left + + + Form.Command.Зашифровать + Normal + Auto + true + true + UserCmds + Auto + + + ФормаРасшифроватьКонтекст + 112 + true + true + + true + + + ФормаРасшифроватьКонтекстРасширеннаяПодсказка + 159 + Label + true + true + + Left + + + Form.Command.Расшифровать + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Шифрование</value> + + + ru + Форма группа шифрование + + + ФормаГруппаШифрованиеКонтекстРасширеннаяПодсказка + 157 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>ЭЦП и шифрование</value> + + + ru + Форма ЭЦПИШифрование + + + ФормаЭЦПИШифрованиеКонтекстноеРасширеннаяПодсказка + 152 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + true + + HierarchicalList + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + true + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
    + + ФормаКоманднаяПанель + -1 + + ГруппаКомандФайлов + 77 + + СоздатьФайл + 47 + + <key>ru</key> + <value>Создать</value> + + true + true + + true + + false + + СоздатьФайлРасширеннаяПодсказка + 114 + Label + true + true + + Left + + + Form.Command.СоздатьФайл + Normal + Auto + true + true + UserCmds + Auto + + + ОткрытьФайл + 73 + true + true + + true + + false + + ОткрытьФайлРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + Form.Command.ОткрытьФайл + Normal + Auto + true + true + UserCmds + Auto + + + Редактировать + 74 + true + true + + true + + false + + РедактироватьРасширеннаяПодсказка + 116 + Label + true + true + + Left + + + Form.Command.Редактировать + Normal + Auto + true + true + UserCmds + Auto + + + ЗакончитьРедактирование + 67 + true + true + + true + + false + + ЗакончитьРедактированиеРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + Form.Command.ЗакончитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + + Занять + 68 + true + true + + true + + false + + ЗанятьРасширеннаяПодсказка + 118 + Label + true + true + + Left + + + Form.Command.Занять + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ОткрытьКаталогФайла + 72 + true + true + + true + + false + + ОткрытьКаталогФайлаРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + Form.Command.ОткрытьКаталогФайла + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Освободить + 71 + + <key>ru</key> + <value>Отменить редактирование</value> + + true + true + + true + + false + + ОсвободитьРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + Form.Command.Освободить + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьИзменения + 75 + true + true + + true + + false + + СохранитьИзмененияРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + Form.Command.СохранитьИзменения + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьКак + 76 + true + true + + true + + false + + СохранитьКакРасширеннаяПодсказка + 122 + Label + true + true + + Left + + + Form.Command.СохранитьКак + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИмпортФайлов + 88 + true + true + + true + + false + + ИмпортФайловРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + Form.Command.ИмпортФайлов + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Группа команд файлов</value> + + + ru + Группа команд файлов + + + ГруппаКомандФайловРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + + + + ФормаЭЦПИШифрование + 103 + + ФормаГруппаЭЦП + 95 + + ФормаПодписать + 101 + true + true + + true + + + ФормаПодписатьРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + Form.Command.Подписать + Normal + Auto + true + true + UserCmds + Auto + + + ФормаДобавитьЭЦПИзФайла + 99 + true + true + + true + + + ФормаДобавитьЭЦПИзФайлаРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + Form.Command.ДобавитьЭЦПИзФайла + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСохранитьВместеСЭЦП + 102 + true + true + + true + + + ФормаСохранитьВместеСЭЦПРасширеннаяПодсказка + 128 + Label + true + true + + Left + + + Form.Command.СохранитьВместеСЭЦП + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>ЭЦП</value> + + + ru + Форма группа ЭЦП + + + ФормаГруппаЭЦПРасширеннаяПодсказка + 125 + Label + true + true + + Left + + + + + + ФормаГруппаШифрование + 96 + + ФормаЗашифровать + 97 + true + true + + true + + + ФормаЗашифроватьРасширеннаяПодсказка + 130 + Label + true + true + + Left + + + Form.Command.Зашифровать + Normal + Auto + true + true + UserCmds + Auto + + + ФормаРасшифровать + 98 + true + true + + true + + + ФормаРасшифроватьРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + Form.Command.Расшифровать + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Шифрование</value> + + + ru + Форма группа шифрование + + + ФормаГруппаШифрованиеРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>ЭЦП и шифрование</value> + + + ru + Форма ЭЦПИШифрование + + + ФормаЭЦПИШифрованиеРасширеннаяПодсказка + 124 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + Скопировать + 50 + true + true + + true + + false + + СкопироватьРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Copy + Normal + Auto + true + true + UserCmds + Auto + + + Изменить + 49 + true + true + + true + + false + + ИзменитьРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Change + Normal + Auto + true + true + UserCmds + Auto + + + ПометитьНаУдаление_СнятьПометку + 51 + true + true + + true + + false + + ПометитьНаУдаление_СнятьПометкуРасширеннаяПодсказка + 134 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.SetDeletionMark + Normal + Auto + true + true + UserCmds + Auto + + + Найти + 52 + true + true + + true + + false + + НайтиРасширеннаяПодсказка + 135 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ОтменитьПоиск + 53 + true + true + + true + + false + + ОтменитьПоискРасширеннаяПодсказка + 136 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + НастройкаОтображенияДанных + 54 + true + true + + true + + false + + НастройкаОтображенияДанныхРасширеннаяПодсказка + 137 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.ListSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ВывестиСписок + 55 + true + true + + true + + false + + ВывестиСписокРасширеннаяПодсказка + 138 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Обновить + 56 + true + true + + true + + false + + ОбновитьРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Refresh + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИзменитьФорму + 60 + true + true + + true + + false + + ИзменитьФормуРасширеннаяПодсказка + 140 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 57 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 141 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.Зашифрован + + + Список.Подписан + + + Список.Редактирует + + + Список.РедактируетТекущийПользователь + + + Список.ХранитьВерсии + +
    true
    + + ВЫБРАТЬ + Файлы.Код, + Файлы.Редактирует, + Файлы.ДатаСоздания, + Файлы.ТекущаяВерсияРазмер, + Файлы.Автор, + Файлы.ТекущаяВерсияДатаСоздания, + ВЫБОР + КОГДА Файлы.ПометкаУдаления = ИСТИНА + ТОГДА Файлы.ИндексКартинки + 1 + ИНАЧЕ Файлы.ИндексКартинки + КОНЕЦ КАК ИндексКартинки, + Файлы.Наименование, + Файлы.Описание, + Файлы.Ссылка, + Файлы.ТекущаяВерсияАвтор, + Файлы.ПометкаУдаления, + Файлы.ХранитьВерсии, + ВЫБОР + КОГДА Файлы.Редактирует = &ТекущийПользователь + ТОГДА ИСТИНА + ИНАЧЕ ЛОЖЬ + КОНЕЦ КАК РедактируетТекущийПользователь, + Файлы.Зашифрован, + Файлы.Подписан +ИЗ + Справочник.Файлы КАК Файлы +ГДЕ + Файлы.ВладелецФайла = &Владелец + Catalog.Файлы + true + true + true + true + true + +
    + + СоздатьФайл + + <key>ru</key> + <value>Создать файл</value> + + 1 + + ru + Создать файл + + + true + + + StdPicture.AddListItem + + + + СоздатьФайлВыполнить + + + TextPicture + Auto + Auto + + + ЗакончитьРедактирование + + <key>ru</key> + <value>Закончить редактирование</value> + + 2 + + ru + Сохранить и освободить файл в информационной базе + + + true + + + CommonPicture.КартинкаЗакончитьРедактирование + + + + ЗакончитьРедактирование + + + TextPicture + Auto + Auto + + + Занять + + <key>ru</key> + <value>Занять</value> + + 3 + + ru + Пометить файл как занятый для редактирования + + + true + + + CommonPicture.КартинкаЗанять + + + + Занять + + + TextPicture + Auto + Auto + + + Освободить + + <key>ru</key> + <value>Освободить</value> + + 5 + + ru + Освободить занятый файл + + + true + + + CommonPicture.КартинкаОсвободить + + + + Освободить + + + TextPicture + Auto + Auto + + + ОткрытьКаталогФайла + + <key>ru</key> + <value>Открыть каталог файла</value> + + 6 + + ru + Открыть каталог файла + + + true + + + + ОткрытьКаталогФайла + + + Auto + Auto + + + ОткрытьФайл + + <key>ru</key> + <value>Просмотреть</value> + + 7 + + ru + Открыть файл для просмотра + + + true + + + CommonPicture.КартинкаОткрыть + + + + ОткрытьФайл + + + Picture + Auto + Auto + + + Редактировать + + <key>ru</key> + <value>Редактировать</value> + + 8 + + ru + Занять файл и открыть для редактирования + + + true + + F4 + + CommonPicture.КартинкаРедактировать + + + + Редактировать + + + TextPicture + Auto + Auto + + + СохранитьИзменения + + <key>ru</key> + <value>Сохранить изменения</value> + + 9 + + ru + Сохранить измененный файл в информационной базе + + + true + + + CommonPicture.КартинкаОпубликовать + + + + СохранитьИзменения + + + TextPicture + Auto + Auto + + + СохранитьКак + + <key>ru</key> + <value>Сохранить как...</value> + + 10 + + ru + Сохранить файл на диск или другое устройство + + + true + + + CommonPicture.КартинкаСохранитьКак + + + + СохранитьКак + + + TextPicture + Auto + Auto + + + ИмпортФайлов + + <key>ru</key> + <value>Импорт файлов...</value> + + 4 + + ru + Импорт файлов + + + true + + + + ИмпортФайлов + + + Auto + Auto + + + ДобавитьЭЦПИзФайла + + <key>ru</key> + <value>Добавить ЭЦП из файла</value> + + 11 + + ru + Добавить ЭЦПИз файла + + + true + + + + ДобавитьЭЦПИзФайла + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + Подписать + + <key>ru</key> + <value>Подписать</value> + + 13 + + ru + Подписать + + + true + + + CommonPicture.Подписан + + + + Подписать + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + Расшифровать + + <key>ru</key> + <value>Расшифровать</value> + + 14 + + ru + Расшифровать + + + true + + + + Расшифровать + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + СохранитьВместеСЭЦП + + <key>ru</key> + <value>Сохранить вместе с ЭЦП</value> + + 15 + + ru + Сохранить вместе СЭЦП + + + true + + + + СохранитьВместеСЭЦП + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + Зашифровать + + <key>ru</key> + <value>Зашифровать</value> + + 16 + + ru + Зашифровать + + + true + + + CommonPicture.Зашифрован + + + + Зашифровать + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + + + + +
    diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Module.bsl new file mode 100644 index 000000000..acbfd5bbc --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Module.bsl @@ -0,0 +1,407 @@ + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + РаботаСФайламиКлиент.ОткрытьФайл( + РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(ВыбраннаяСтрока, Неопределено, УникальныйИдентификатор)); +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + ФайлОснование = Элементы.Список.ТекущаяСтрока; + + Если Не Копирование Тогда + + Отказ = Истина; + Попытка + ВладелецФайла = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); + РаботаСФайламиКлиент.СозданиеНовогоФайла(ВладелецФайла.Значение, ЭтаФорма); + Исключение + Инфо = ИнформацияОбОшибке(); + Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка создания нового Файла: ""%1""'"), + Инфо.Описание) ); + КонецПопытки; + + Иначе + + ВладелецФайла = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); + РаботаСФайламиКлиент.СкопироватьФайл(ВладелецФайла.Значение, ФайлОснование); + Отказ = Истина; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ИмпортФайловЗавершен" Тогда + Элементы.Список.Обновить(); + + Если Параметр <> Неопределено Тогда + Элементы.Список.ТекущаяСтрока = Параметр; + КонецЕсли; + КонецЕсли; + + Если ИмяСобытия = "СозданФайл" Тогда + + Если Параметр <> Неопределено Тогда + + ВладелецФайлаСписка = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); + + ВладелецФайла = Неопределено; + Если Параметр.Свойство("Владелец", ВладелецФайла) Тогда + Если ВладелецФайла = ВладелецФайлаСписка.Значение Тогда + Элементы.Список.Обновить(); + + ФайлСозданный = Неопределено; + Если Параметр.Свойство("Файл", ФайлСозданный) Тогда + Элементы.Список.ТекущаяСтрока = ФайлСозданный; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если ИмяСобытия = "ДанныеФайлаИзменены" Тогда + Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда + УстановитьДоступностьФайловыхКомманд(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если Параметры.Свойство("ЗаголовокФормы") Тогда + Заголовок = Параметры.ЗаголовокФормы; + КонецЕсли; + + Если Параметры.Свойство("ВладелецФайла") Тогда + Список.Параметры.УстановитьЗначениеПараметра( + "Владелец", Параметры.ВладелецФайла); + КонецЕсли; + + Список.Параметры.УстановитьЗначениеПараметра( + "ТекущийПользователь", ОбщегоНазначения.ТекущийПользователь()); + + РаботаСФайлами.ЗаполнитьУсловноеОформлениеСпискаФайлов(Список); + + Если РаботаСФайлами.ПолучитьИспользоватьЭлектронноЦифровыеПодписиИШифрование() = Ложь Тогда + Элементы.Подписан.Видимость = Ложь; + Элементы.Зашифрован.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьФайлВыполнить() + + Попытка + ВладелецФайла = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); + РаботаСФайламиКлиент.СозданиеНовогоФайла(ВладелецФайла.Значение, ЭтаФорма); + Исключение + Инфо = ИнформацияОбОшибке(); + Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка создания нового файла: ""%1""'"), + Инфо.Описание ) ); + КонецПопытки; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакончитьРедактирование(Команда) + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + КомандыРаботыСФайлами.ЗакончитьРедактирование( + Элементы.Список.ТекущаяСтрока, + УникальныйИдентификатор, + Элементы.Список.ТекущиеДанные.ХранитьВерсии, + Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, + Элементы.Список.ТекущиеДанные.Редактирует); + + УстановитьДоступностьФайловыхКомманд(); + +КонецПроцедуры + +&НаКлиенте +Процедура Занять(Команда) + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + КомандыРаботыСФайлами.Занять(Элементы.Список.ТекущаяСтрока); + + УстановитьДоступностьФайловыхКомманд(); + +КонецПроцедуры + +&НаКлиенте +Процедура Освободить(Команда) + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + КомандыРаботыСФайлами.ОсвободитьФайл( + Элементы.Список.ТекущаяСтрока, + Элементы.Список.ТекущиеДанные.ХранитьВерсии, + Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, + Элементы.Список.ТекущиеДанные.Редактирует); + + УстановитьДоступностьФайловыхКомманд(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКаталогФайла(Команда) + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, Неопределено, УникальныйИдентификатор); + КомандыРаботыСФайлами.ОткрытьКаталогФайла(ДанныеФайла); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФайл(Команда) + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(Элементы.Список.ТекущаяСтрока, Неопределено, УникальныйИдентификатор); + КомандыРаботыСФайлами.Открыть(ДанныеФайла); +КонецПроцедуры + +&НаКлиенте +Процедура Редактировать(Команда) + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + КомандыРаботыСФайлами.Редактировать(Элементы.Список.ТекущаяСтрока); + + УстановитьДоступностьФайловыхКомманд(); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьИзменения(Команда) + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + КомандыРаботыСФайлами.ОпубликоватьФайл( + Элементы.Список.ТекущаяСтрока, + УникальныйИдентификатор); + КонецПроцедуры + +&НаКлиенте +Процедура СохранитьКак(Команда) + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляСохранения(Элементы.Список.ТекущаяСтрока, Неопределено, УникальныйИдентификатор); + КомандыРаботыСФайлами.СохранитьКак(ДанныеФайла); +КонецПроцедуры + +&НаКлиенте +Процедура СписокПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + СтандартнаяОбработка = Ложь; +КонецПроцедуры + +&НаКлиенте +Процедура СписокПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + СтандартнаяОбработка = Ложь; + + ВладелецФайла = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); + ВладелецФайлаСписка = ВладелецФайла.Значение; + + Если ВладелецФайлаСписка.Пустая() Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиКлиент.ОбработкаПеретаскиванияВЛинейныйСписок(ПараметрыПеретаскивания, ВладелецФайлаСписка, ЭтаФорма); +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьФайловыхКомманд() + + Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда + + Если ТипЗнч(Элементы.Список.ТекущаяСтрока) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + + УстановитьДоступностьКомманд(Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, + Элементы.Список.ТекущиеДанные.Редактирует, Элементы.Список.ТекущиеДанные.Подписан, + Элементы.Список.ТекущиеДанные.Зашифрован); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьКомманд(РедактируетТекущийПользователь, Редактирует, Подписан, Зашифрован) + + Элементы.ЗакончитьРедактирование.Доступность = РедактируетТекущийПользователь; + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокЗакончитьРедактирование.Доступность = РедактируетТекущийПользователь; + + Элементы.СохранитьИзменения.Доступность = РедактируетТекущийПользователь; + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокСохранитьИзменения.Доступность = РедактируетТекущийПользователь; + + Элементы.Освободить.Доступность = Не Редактирует.Пустая(); + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокОсвободить.Доступность = Не Редактирует.Пустая(); + + Элементы.Занять.Доступность = Редактирует.Пустая() И НЕ (Подписан ИЛИ Зашифрован); + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокЗанять.Доступность = Редактирует.Пустая() И НЕ (Подписан ИЛИ Зашифрован); + + Элементы.Редактировать.Доступность = НЕ (Подписан ИЛИ Зашифрован); + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокРедактировать.Доступность = НЕ (Подписан ИЛИ Зашифрован); + + Элементы.ФормаПодписать.Доступность = Редактирует.Пустая(); + Элементы.ФормаПодписатьКонтекст.Доступность = Редактирует.Пустая(); + + Элементы.ФормаСохранитьВместеСЭЦП.Доступность = Подписан; + Элементы.ФормаСохранитьВместеСЭЦПКонтекст.Доступность = Подписан; + + Элементы.ФормаЗашифровать.Доступность = Редактирует.Пустая() И НЕ Зашифрован; + Элементы.ФормаЗашифроватьКонтекст.Доступность = Редактирует.Пустая() И НЕ Зашифрован; + + Элементы.ФормаРасшифровать.Доступность = Зашифрован; + Элементы.ФормаРасшифроватьКонтекст.Доступность = Зашифрован; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПриАктивизацииСтроки(Элемент) + Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда + УстановитьДоступностьФайловыхКомманд(); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ИмпортФайлов(Команда) + #Если Не ВебКлиент Тогда + + // заранее выбираем файлы (до открытия диалога импорта) + Режим = РежимДиалогаВыбораФайла.Открытие; + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.Фильтр = Фильтр; + ДиалогОткрытияФайла.МножественныйВыбор = Истина; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файлы'"); + Если ДиалогОткрытияФайла.Выбрать() Тогда + МассивИменФайлов = Новый Массив; + + МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; + Для Каждого ИмяФайла Из МассивФайлов Цикл + МассивИменФайлов.Добавить(ИмяФайла); + КонецЦикла; + + ВладелецФайла = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); + ПараметрыИмпорта = Новый Структура("ПапкаДляДобавления, МассивИменФайлов", ВладелецФайла.Значение, МассивИменФайлов); + ОткрытьФорму("Справочник.Файлы.Форма.ФормаИмпортаФайлов", ПараметрыИмпорта); + КонецЕсли; + #Иначе + Предупреждение(НСтр("ru = 'В Веб-клиенте импорт файлов не поддерживается. Используйте команду ""Создать"" в списке файлов.'")); + #КонецЕсли +КонецПроцедуры + +&НаКлиенте +Процедура Подписать(Команда) + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИРабочийКаталог(Элементы.Список.ТекущаяСтрока); + + ДанныеДляЗанесенияВРегистр = Неопределено; + + Если КомандыРаботыСФайлами.СформироватьПодписьФайла(ДанныеФайла, ДанныеДляЗанесенияВРегистр) Тогда + + ЭлектронноЦифроваяПодпись.ЗанестиИнформациюОднойПодписи(ДанныеДляЗанесенияВРегистр); + Оповестить("ПрисоединенныйФайлПодписан", ДанныеФайла.Владелец); + ОповеститьОбИзменении(ДанныеФайла.Ссылка); + КонецЕсли; + + УстановитьДоступностьФайловыхКомманд(); +КонецПроцедуры + +&НаКлиенте +Процедура Зашифровать(Команда) + ОбъектСсылка = Элементы.Список.ТекущаяСтрока; + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИКоличествоВерсий(Элементы.Список.ТекущаяСтрока); + + МассивДанныхДляЗанесенияВБазу = Новый Массив; + МассивАдресов = Новый Массив; + МассивОтпечатков = Новый Массив; + + Если НЕ КомандыРаботыСФайлами.Зашифровать(ДанныеФайла, УникальныйИдентификатор, + МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, МассивАдресов) Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиКлиент.ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяРабочегоКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + Зашифровать = Истина; + РаботаСФайлами.ЗанестиИнформациюОШифровании(ОбъектСсылка, Зашифровать, МассивДанныхДляЗанесенияВБазу, + УникальныйИдентификатор, + ИмяРабочегоКаталога, МассивФайловВРабочемКаталогеДляУдаления, МассивОтпечатков, МассивАдресов); + + РаботаСФайламиКлиент.ИнформироватьОШифровании(МассивФайловВРабочемКаталогеДляУдаления, + ДанныеФайла.Владелец, ОбъектСсылка); + + УстановитьДоступностьФайловыхКомманд(); +КонецПроцедуры + +&НаКлиенте +Процедура Расшифровать(Команда) + ОбъектСсылка = Элементы.Список.ТекущаяСтрока; + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИКоличествоВерсий(Элементы.Список.ТекущаяСтрока); + + МассивДанныхДляЗанесенияВБазу = Новый Массив; + МассивАдресов = Новый Массив; + + Если НЕ КомандыРаботыСФайлами.Расшифровать(ДанныеФайла, УникальныйИдентификатор, + МассивДанныхДляЗанесенияВБазу, МассивАдресов) Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиКлиент.ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяРабочегоКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + Зашифровать = Ложь; + МассивОтпечатков = Новый Массив; + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + РаботаСФайлами.ЗанестиИнформациюОШифровании(ОбъектСсылка, Зашифровать, МассивДанныхДляЗанесенияВБазу, + УникальныйИдентификатор, + ИмяРабочегоКаталога, МассивФайловВРабочемКаталогеДляУдаления, МассивОтпечатков, МассивАдресов); + + РаботаСФайламиКлиент.ИнформироватьОРасшифровании( + ДанныеФайла.Владелец, ОбъектСсылка); + + УстановитьДоступностьФайловыхКомманд(); +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьЭЦПИзФайла(Команда) + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИРабочийКаталог(Элементы.Список.ТекущаяСтрока); + КомандыРаботыСФайлами.ДобавитьЭЦПИзФайла(ДанныеФайла, УникальныйИдентификатор); + УстановитьДоступностьФайловыхКомманд(); +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьВместеСЭЦП(Команда) + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляСохранения(Элементы.Список.ТекущаяСтрока); + КомандыРаботыСФайлами.СохранитьВместеСЭЦП(ДанныеФайла, УникальныйИдентификатор); + УстановитьДоступностьФайловыхКомманд(); +КонецПроцедуры + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаШифрования/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаШифрования/Form.form new file mode 100644 index 000000000..c7a577bc5 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаШифрования/Form.form @@ -0,0 +1,636 @@ + + + + <key>ru</key> + <value>Зашифровать</value> + + + ТаблицаСертификатов + 3 + + <key>ru</key> + <value>Сертификаты ЭЦП</value> + + true + true + + true + + + ТаблицаСертификатов + + Top + Change + Copy + CopyToClipboard + + ТаблицаСертификатовПометка + 21 + true + true + + true + + + ТаблицаСертификатов.Пометка + + None + + ТаблицаСертификатовПометкаРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ТаблицаСертификатовПометкаКонтекстноеМеню + 22 + true + + CheckBoxField + Auto + true + Left + true + + + + ТаблицаСертификатовКомуВыдан + 6 + true + true + + true + + + ТаблицаСертификатов.КомуВыдан + + + ТаблицаСертификатовКомуВыданРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ТаблицаСертификатовКомуВыданКонтекстноеМеню + 7 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСертификатовКемВыдан + 8 + true + true + + true + + + ТаблицаСертификатов.КемВыдан + + + ТаблицаСертификатовКемВыданРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + ТаблицаСертификатовКемВыданКонтекстноеМеню + 9 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСертификатовДействителенДо + 10 + true + true + + true + + + ТаблицаСертификатов.ДействителенДо + + + ТаблицаСертификатовДействителенДоРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + ТаблицаСертификатовДействителенДоКонтекстноеМеню + 11 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСертификатовНазначение + 12 + true + true + + true + + + ТаблицаСертификатов.Назначение + + + ТаблицаСертификатовНазначениеРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ТаблицаСертификатовНазначениеКонтекстноеМеню + 13 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + ТаблицаСертификатовКоманднаяПанель + 5 + Left + true + + + ТаблицаСертификатовСтрокаПоиска + 27 + + ТаблицаСертификатовСтрокаПоискаРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ТаблицаСертификатовСтрокаПоискаКонтекстноеМеню + 28 + true + + ТаблицаСертификатов + + true + + + + ТаблицаСертификатовСостояниеПросмотра + 30 + + ТаблицаСертификатовСостояниеПросмотраРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ТаблицаСертификатовСостояниеПросмотраКонтекстноеМеню + 31 + true + + ViewStatusAddition + ТаблицаСертификатов + + true + + + + ТаблицаСертификатовУправлениеПоиском + 33 + + ТаблицаСертификатовУправлениеПоискомРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ТаблицаСертификатовУправлениеПоискомКонтекстноеМеню + 34 + true + + SearchControlAddition + ТаблицаСертификатов + + true + + + + ТаблицаСертификатовРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ТаблицаСертификатовКонтекстноеМеню + 4 + + ТаблицаСертификатовКонтекстноеМенюОткрытьСертификат + 20 + true + true + + true + + + ТаблицаСертификатовКонтекстноеМенюОткрытьСертификатРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + Form.Command.ОткрытьСертификат + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + Row +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + +
    + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаВыбрать + 14 + true + true + + true + + + ФормаВыбратьРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Form.Command.Выбрать + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 17 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + ТаблицаСертификатов + + <key>ru</key> + <value>Таблица сертификатов</value> + + 2 + + 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 + + Date + + Date + + + + 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> + + 6 + + String + + + + true + + + true + + + + + ОбъектСсылка + + <key>ru</key> + <value>Объект ссылка</value> + + 3 + + CatalogRef.Файлы + + + 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/Catalogs/Файлы/Forms/ФормаШифрования/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаШифрования/Help/ru.html new file mode 100644 index 000000000..44315007f --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаШифрования/Help/ru.html @@ -0,0 +1,8 @@ + +

    Шифрование

    +

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

    +

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

    +

     

    +

    См. также:

    +
    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаШифрования/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаШифрования/Module.bsl new file mode 100644 index 000000000..963d8dfd0 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаШифрования/Module.bsl @@ -0,0 +1,73 @@ +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + МассивСтруктурСертификатов = Параметры.МассивСтруктурСертификатов; + + Если Параметры.Свойство("ОбъектСсылка") Тогда + ОбъектСсылка = Параметры.ОбъектСсылка; + КонецЕсли; + + Заголовок = НСтр("ru = 'Зашифровать ""'") + Строка(ОбъектСсылка) + """"; + + Для Каждого СтруктураСертификата Из МассивСтруктурСертификатов Цикл + НоваяСтрока = ТаблицаСертификатов.Добавить(); + + НоваяСтрока.КомуВыдан = СтруктураСертификата.КомуВыдан; + НоваяСтрока.КемВыдан = СтруктураСертификата.КемВыдан; + НоваяСтрока.ДействителенДо = СтруктураСертификата.ДействителенДо; + НоваяСтрока.Отпечаток = СтруктураСертификата.Отпечаток; + + Если СтруктураСертификата.Свойство("Пометка") Тогда + НоваяСтрока.Пометка = СтруктураСертификата.Пометка; + КонецЕсли; + + НовоеНазначение = ""; + ОбщегоНазначения.ЗаполнитьНазначениеСертификата(СтруктураСертификата.Назначение, НовоеНазначение); + НоваяСтрока.Назначение = НовоеНазначение; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура Выбрать(Команда) + ОбработкаВыбора(); +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаВыбора() + + МассивВозврата = Новый Массив; + Для Каждого СтрокаТаблицыЗначений Из ТаблицаСертификатов Цикл + Если СтрокаТаблицыЗначений.Пометка Тогда + ВыбранныйСертификат = ЭлектронноЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(СтрокаТаблицыЗначений.Отпечаток); + МассивВозврата.Добавить(ВыбранныйСертификат); + КонецЕсли; + КонецЦикла; + + Если МассивВозврата.Количество() = 0 Тогда + Предупреждение(НСтр("ru = 'Не выбран ни один сертификат.'")); + Возврат; + КонецЕсли; + + Закрыть(МассивВозврата); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСертификат(Команда) + + ТекущиеДанные = Элементы.ТаблицаСертификатов.ТекущиеДанные; + Если Не ТекущиеДанные = Неопределено Тогда + + ВыбранныйСертификат = ЭлектронноЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ТекущиеДанные.Отпечаток); + + СтруктураСертификата = ЭлектронноЦифроваяПодписьКлиент.ЗаполнитьСтруктуруСертификата(ВыбранныйСертификат); + Если СтруктураСертификата <> Неопределено Тогда + ПараметрыФормы = Новый Структура("СтруктураСертификата, Отпечаток", СтруктураСертификата, ТекущиеДанные.Отпечаток); + СтруктураВозврата = ОткрытьФормуМодально("Общаяформа.ФормаСертификатаЭЦП", ПараметрыФормы); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Form.form new file mode 100644 index 000000000..6fd85bca6 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Form.form @@ -0,0 +1,495 @@ + + + + <key>ru</key> + <value>Экспорт папки</value> + + + Группа + 34 + + ПапкаДляЭкспорта + 2 + + <key>ru</key> + <value>Укажите каталог, в который будет производиться копирование файлов</value> + + true + true + + true + + + ПапкаДляЭкспорта + + Top + + OnChange + ПапкаДляЭкспортаПриИзменении + + + ПапкаДляЭкспортаРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ПапкаДляЭкспортаКонтекстноеМеню + 3 + true + + InputField + Enter + true + Left + true + Left + + + StartChoice + ПапкаДляЭкспортаНачалоВыбора + + + Opening + ПапкаДляЭкспортаОткрытие + + true + true + true + false + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + КоманднаяПанель + 30 + + Выгрузить + 33 + true + true + + true + + false + + ВыгрузитьРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + Form.Command.Экспорт + Auto + true + true + true + UserCmds + Auto + + + Отмена + 32 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 31 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + ru + Командная панель + + + КоманднаяПанельРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСоздании + + 50 + LockOwner + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + 1 + + + true + + + true + +
    true
    + true +
    + + ДеревоФайлов + + <key>ru</key> + <value>Дерево файлов</value> + + 2 + + ValueTree + + + true + + + true + + + НаименованиеПапки + + <key>ru</key> + <value>Наименование папки</value> + + 1 + + String + + + + true + + + true + + + + ТекущаяВерсия + + <key>ru</key> + <value>Текущая версия</value> + + 2 + + CatalogRef.ВерсииФайлов + + + 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 + + Number + + 10 + + + + true + + + true + + + + ДатаМодификацииУниверсальная + + <key>ru</key> + <value>Дата модификации универсальная</value> + + 7 + + Date + + + + true + + + true + + + + Папка + + <key>ru</key> + <value>Папка</value> + + 6 + + CatalogRef.ПапкиФайлов + + + 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 + + CatalogRef.ПапкиФайлов + + + true + + + true + + + + РасширениеДляЗашифрованныхФайлов + + <key>ru</key> + <value>Расширение для зашифрованных файлов</value> + + 6 + + String + + + + true + + + true + + + + Экспорт + + <key>ru</key> + <value>Экспорт</value> + + 1 + + ru + Экспорт + + + true + + + + ВыгрузитьВыполнить + + + Auto + Auto + + + ПапкаЭкспорта + + CatalogRef.ПапкиФайлов + + + + + + +
    diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Help/ru.html new file mode 100644 index 000000000..ecf9d0c08 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Help/ru.html @@ -0,0 +1,2 @@ + +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Module.bsl new file mode 100644 index 000000000..9fa34eb52 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Module.bsl @@ -0,0 +1,433 @@ +&НаКлиенте +Процедура ВыгрузитьВыполнить() + #Если НЕ ВебКлиент Тогда + // Проверим - каталог выгрузки существует? если нет - создадим + КаталогВыгрузки = Новый Файл(ПапкаДляЭкспорта); + + Если не КаталогВыгрузки.Существует() Тогда + + Попытка + + СоздатьКаталог(ПапкаДляЭкспорта); + + Исключение + + ИнфоОшибка = ИнформацияОбОшибке(); + Предупреждение(НСтр("ru = 'Не удалось создать папку выгрузки.'") + Символы.ВК + НСтр("ru = 'Причина:'") + ИнфоОшибка.Описание); + Возврат; + + КонецПопытки; + + КонецЕсли; + + Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется экспорт папки ""%1""... + |Пожалуйста, подождите.'"), + Строка(ЧтоСохраняем) )); + // Получим список выгружаемых файлов + СформироватьДеревоФайлов(ЧтоСохраняем); + + // Заранее создадим форму, чтобы потом не тратить на это время + ФормаВопроса = ПолучитьФорму("Справочник.Файлы.Форма.ФайлСуществует"); + + // А теперь начнем выгрузку + ЕщеНеВстретилиВыгружаемуюПапку = Истина; + Успех = ОбойтиДеревоФайлов(ФормаВопроса, ДеревоФайлов, ПапкаДляЭкспорта, Ложь, "", ЕщеНеВстретилиВыгружаемуюПапку, ЧтоСохраняем); + + ФормаВопроса = Неопределено; + + Если Успех Тогда + СохраняемыйПуть = ПапкаДляЭкспорта; + + ИмяПапки = Строка(ЧтоСохраняем) + "\"; + КонецПути = Прав(ПапкаДляЭкспорта, СтрДлина(ИмяПапки)); + + Если КонецПути = ИмяПапки Тогда + СохраняемыйПуть = Лев(ПапкаДляЭкспорта, СтрДлина(ПапкаДляЭкспорта) - СтрДлина(ИмяПапки)); + КонецЕсли; + + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ИмяПапкиВыгрузки", "ИмяПапкиВыгрузки", СохраняемыйПуть); + + Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Экспорт папки ""%1"" в каталог на диске ""%2"" успешно завершен!'"), + Строка(ЧтоСохраняем), Строка(ПапкаДляЭкспорта) ) ); + + Закрыть(); + + КонецЕсли; + #КонецЕсли +КонецПроцедуры + +&НаКлиенте +Процедура ПапкаДляЭкспортаПриИзменении(Элемент) + ПапкаДляЭкспорта = ФайловыеФункцииКлиент.НормализоватьКаталог(ПапкаДляЭкспорта); +КонецПроцедуры + +&НаКлиенте +Процедура ПапкаДляЭкспортаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + #Если НЕ ВебКлиент Тогда + // Откроем окно выбора папки сохранения + СтандартнаяОбработка = Ложь; + ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); + ВыборФайла.МножественныйВыбор = Ложь; + ВыборФайла.Каталог = ПапкаДляЭкспорта; + Если ВыборФайла.Выбрать() Тогда + ПапкаДляЭкспорта = ФайловыеФункцииКлиент.НормализоватьКаталог(ВыборФайла.Каталог); + КонецЕсли; + #КонецЕсли +КонецПроцедуры + +&НаСервере +Процедура ПриСоздании(Отказ, СтандартнаяОбработка) + + Если Параметры.ПапкаЭкспорта <> Неопределено Тогда + ЧтоСохраняем = Параметры.ПапкаЭкспорта; + КонецЕсли; + + РасширениеДляЗашифрованныхФайлов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "РасширениеДляЗашифрованныхФайлов"); + Если ПустаяСтрока(РасширениеДляЗашифрованныхФайлов) Тогда + РасширениеДляЗашифрованныхФайлов = "p7m"; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура СформироватьДеревоФайлов(ПапкаРодитель) Экспорт + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Файлы.ВладелецФайла КАК Папка, + | Файлы.ВладелецФайла.Наименование КАК НаименованиеПапки, + | Файлы.ТекущаяВерсия, + | Файлы.ПолноеНаименование КАК ПолноеНаименование, + | Файлы.ТекущаяВерсия.Расширение КАК Расширение, + | Файлы.ТекущаяВерсия.Размер КАК Размер, + | Файлы.ТекущаяВерсия.ДатаМодификацииУниверсальная КАК ДатаМодификацииУниверсальная, + | Файлы.Ссылка, + | Файлы.ПометкаУдаления, + | Файлы.Зашифрован + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.ВладелецФайла В ИЕРАРХИИ(&Ссылка) + | И Файлы.ТекущаяВерсия <> ЗНАЧЕНИЕ(Справочник.ВерсииФайлов.ПустаяСсылка) + | И Файлы.ПометкаУдаления = ЛОЖЬ + |ИТОГИ ПО + | Папка ИЕРАРХИЯ"; + Запрос.Параметры.Вставить("Ссылка", ПапкаРодитель); + Результат = Запрос.Выполнить(); + ТаблицаВыгрузки = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); + ЗначениеВРеквизитФормы(ТаблицаВыгрузки, "ДеревоФайлов"); +КонецПроцедуры + +// Рекурсивная функция, которая собственно и выгружает файлы на локальный диск +// +// Параметры: +// ФормаВопроса - объект типа "УправляемаяФорма", который содержит ссылку на +// созданную в памяти форму вопроса о перезаписи файла с флажком +// "Для всех". Создается для того, чтобы не тратить время на +// регулярное создание формы внутри рекурсивного цикла. +// ТаблицаФайлов - дерево значений с выгружаемыми файлами. +// БазовыйКаталогСохранения - строка с именем папки, в которую сохраняются файлы. +// В ней воссоздается структура папок (как в дереве файлов) +// при необходимости. +// ДляВсехФайлов - тип Булево +// Истина: пользователь выбрал действие при перезаписи файла и +// установил флажок "Для всех". Больше вопросов не задаем. +// Ложь: в каждом случае существования файла на диске, с тем же +// именем, что и в информационной базе будем задавать вопрос. +// БазовоеДействия - тип КодВозвратаДиалога +// при выполнении одного действия для всех конфликтов при +// записи файла (параметр ДляВсехФайлов = Истина) выполняется +// действие, заданное этим параметром). +// .Да - перезаписать +// .Пропустить - пропустить файл +// .Прервать - прервать выгрузку +// +// Возвращаемое значение: +// Истина - можно продолжать выгрузку / выгрузка завершена успешно +// Ложь - действие завершено с ошибками / выгрузка завершена с ошибками +&НаКлиенте +Функция ОбойтиДеревоФайлов(ФормаВопроса, ТаблицаФайлов, Знач БазовыйКаталогСохранения, ДляВсехФайлов = Ложь, БазовоеДействие = "", ЕщеНеВстретилиВыгружаемуюПапку, РодительскаяПапка) + #Если НЕ ВебКлиент Тогда + + Если БазовоеДействие = "" Тогда + // По умолчанию сделаем минимальный вред + БазовоеДействие = КодВозвратаДиалога.Пропустить; + КонецЕсли; + + Для Каждого ЗаписьФайла из ТаблицаФайлов.ПолучитьЭлементы() Цикл + + Если ЕщеНеВстретилиВыгружаемуюПапку = Истина Тогда + Если ЗаписьФайла.Папка = ЧтоСохраняем Тогда + ЕщеНеВстретилиВыгружаемуюПапку = Ложь; + КонецЕсли; + КонецЕсли; + + Если ЕщеНеВстретилиВыгружаемуюПапку = Истина Тогда + Если Не ОбойтиДеревоФайлов(ФормаВопроса, ЗаписьФайла, БазовыйКаталогСохранения, ДляВсехФайлов, БазовоеДействие, ЕщеНеВстретилиВыгружаемуюПапку, ЗаписьФайла.Папка) Тогда + Возврат Ложь; + КонецЕсли; + + Продолжить; + КонецЕсли; + + // Сформируем путь к каталогу и пойдем дальше. Создавать каталоги будем + БазовыйКаталогСохраненияФайла = БазовыйКаталогСохранения; + Если (ЗаписьФайла.Папка <> ЧтоСохраняем) И ЗаписьФайла.ТекущаяВерсия.Пустая() Тогда + Если РодительскаяПапка <> ЗаписьФайла.Папка Тогда + БазовыйКаталогСохраненияФайла = БазовыйКаталогСохраненияФайла + ЗаписьФайла.НаименованиеПапки + "\"; + КонецЕсли; + КонецЕсли; + + // Проверим наличие базового каталога: если нет - создадим + Папка = Новый Файл(БазовыйКаталогСохраненияФайла); + Если Не Папка.Существует() Тогда + Пока Истина Цикл + Попытка + СоздатьКаталог(БазовыйКаталогСохраненияФайла); + Прервать; + Исключение + // По какой-то причине каталог не создался ... + инфоОшибка = ИнформацияОбОшибке(); + + стрТекст = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка создания папки ""%1"". + |Причина: %2'"), + БазовыйКаталогСохраненияФайла, + ?(инфоОшибка.Причина = Неопределено, "Неопределено", инфоОшибка.Причина.Описание) ); + + Результат = Вопрос(стрТекст, РежимДиалогаВопрос.ПрерватьПовторитьПропустить, , КодВозвратаДиалога.Повторить); + Если Результат = КодВозвратаДиалога.Прервать Тогда + // Просто выйдем с ошибкой + Возврат Ложь; + ИначеЕсли Результат = КодВозвратаДиалога.Пропустить Тогда + // Пропустим данную ветку дерева и пойдем дальше + Возврат Истина; + Иначе + // Попробуем повторить создание папки + Продолжить; + КонецЕсли; + КонецПопытки; + КонецЦикла; + КонецЕсли; + + + // только в том случае, если в этой папке есть хоть один файл + ДочерниеЭлементы = ЗаписьФайла.ПолучитьЭлементы(); + Если ДочерниеЭлементы.Количество() <> 0 Тогда + имяГруппы = БазовыйКаталогСохраненияФайла; + Если Не ОбойтиДеревоФайлов(ФормаВопроса, ЗаписьФайла, имяГруппы, ДляВсехФайлов, БазовоеДействие, ЕщеНеВстретилиВыгружаемуюПапку, ЗаписьФайла.Папка) Тогда + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + Если ЗаписьФайла.ТекущаяВерсия <> NULL и ЗаписьФайла.ТекущаяВерсия.Пустая() Тогда + // Это элемент справочника Файлы без файла - пропустим + Продолжить; + КонецЕсли; + + // Пишем файл в базовый каталог + ИмяФайлаСРасширением = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ЗаписьФайла.ПолноеНаименование, ЗаписьФайла.Расширение); + Если ЗаписьФайла.Зашифрован Тогда + ИмяФайлаСРасширением = ИмяФайлаСРасширением + "." + РасширениеДляЗашифрованныхФайлов; + КонецЕсли; + ПолноеИмяФайла = БазовыйКаталогСохраненияФайла + ИмяФайлаСРасширением; + + // Проверка возможности записи файла + Результат = КодВозвратаДиалога.Отмена; + Пока Истина Цикл + ФайлНаДиске = Новый Файл(ПолноеИмяФайла); + Если ФайлНаДиске.Существует() и ФайлНаДиске.ЭтоКаталог() Тогда + ТекстВопроса = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Вместо файла ""%1"" существует папка с таким же именем. Повторить экспорт этого файла?'"), + ПолноеИмяФайла ); + + Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ПовторитьОтмена, ,КодВозвратаДиалога.Отмена); + Если Результат = КодВозвратаДиалога.Повторить Тогда + + // Данный файл игнорируем + Продолжить; + КонецЕсли; + Иначе + + // Файла нет - идем дальше + Результат = КодВозвратаДиалога.Повторить; + КонецЕсли; + Прервать; + КонецЦикла; + Если Результат = КодВозвратаДиалога.Отмена Тогда + + // Игнорируем файл с именем как у папки + Продолжить; + КонецЕсли; + Результат = КодВозвратаДиалога.Нет; + + // Спросим, а что делать с текущим файлом + Если ФайлНаДиске.Существует() Тогда + + // Если у файла стоит R|O и время изменения меньше, чем в информационной базе - просто перепишем + Если ФайлНаДиске.ПолучитьТолькоЧтение() и ФайлНаДиске.ПолучитьВремяИзменения() <= ЗаписьФайла.ДатаМодификацииУниверсальная Тогда + Результат = КодВозвратаДиалога.Да; + Иначе + Если Не ДляВсехФайлов Тогда + Текст = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В папке ""%1"" + |существует файл ""%2"" + |размер существующего файла = %3 байт, дата изменения %4. + |размер сохраняемого файла = %5 байт, дата изменения %6. + |Перезаписать существующий файл файлом из системы?'"), + БазовыйКаталогСохраненияФайла, + ИмяФайлаСРасширением, + ФайлНаДиске.Размер(), + ФайлНаДиске.ПолучитьВремяИзменения(), + ЗаписьФайла.Размер, + ЗаписьФайла.ДатаМодификацииУниверсальная ); + + ФормаВопроса.ТекстСообщения = Текст; + ФормаВопроса.ПрименитьДляВсех = ДляВсехФайлов; + ФормаВопроса.УстановитьКнопкуУмолчания(БазовоеДействие); + + // Да - перезаписать + // Пропустить - пропустить файл + // Прервать - прервать выгрузку + Результат = ФормаВопроса.ОткрытьМодально(); + ДляВсехФайлов = ФормаВопроса.ПрименитьДляВсех; + БазовоеДействие = Результат; + Иначе + Результат = БазовоеДействие; + КонецЕсли; + Если Результат = КодВозвратаДиалога.Прервать Тогда + + // Прерываем выгрузку + Возврат Ложь; + ИначеЕсли Результат = КодВозвратаДиалога.Пропустить Тогда + + // Пропускаем этот файл + Продолжить; + КонецЕсли; + КонецЕсли; + Иначе + + // Файла нет, спрашивать не будем + Результат = КодВозвратаДиалога.Да; + КонецЕсли; + + // Если можно - запишем файл в файловую систему + Если Результат = КодВозвратаДиалога.Да Тогда + Пока Истина Цикл + Попытка + ФайлНаДиске = Новый Файл(ПолноеИмяФайла); + Если ФайлНаДиске.Существует() Тогда + + // Снимем флаг R|O для возможности удаления + ФайлНаДиске.УстановитьТолькоЧтение(Ложь); + КонецЕсли; + + // Всегда удалим и потом создадим заново + УдалитьФайлы(ПолноеИмяФайла); + + РазмерВМб = ЗаписьФайла.Размер / (1024 * 1024); + + // Обновим индикатор прогресса + НадписьПодробнее = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сохраняется на диск файл ""%1"" (%2 Мб)...'"), + ФайлНаДиске.Имя, + ?(РазмерВМб >= 1, Формат(РазмерВМб, "ЧДЦ=0"), Формат(РазмерВМб, "ЧДЦ=1; ЧН=0")) ); + + Состояние( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Экспорт папки ""%1""'"), ЗаписьФайла.НаименованиеПапки), + , + НадписьПодробнее, + БиблиотекаКартинок.Информация32); + + // Запишем файл заново + стрАдрес = РаботаСФайлами.ПолучитьНавигационнуюСсылкуДляОткрытия(ЗаписьФайла.ТекущаяВерсия, УникальныйИдентификатор); + ПолучитьФайл(стрАдрес, ПолноеИмяФайла, Ложь); + + // для варианта с хранением файлов на диске (на сервере) удаляем файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(стрАдрес) Тогда + УдалитьИзВременногоХранилища(стрАдрес); + КонецЕсли; + + ФайлНаДиске = Новый Файл(ПолноеИмяФайла); + + // Сделаем файл только для чтения + ФайлНаДиске.УстановитьТолькоЧтение(Истина); + + ДатаСоздаваемогоФайлаНаДиске = ЗаписьФайла.ДатаМодификацииУниверсальная; + ОбщегоНазначенияКлиент.ПреобразоватьЗимнееВремяКТекущему(ДатаСоздаваемогоФайлаНаДиске); + + // Поставим время модифицикации - как в информационной базе + ФайлНаДиске.УстановитьВремяИзменения(ДатаСоздаваемогоФайлаНаДиске); + Прервать; + Исключение + + // По какой-то случилась файловая ошибка при записи файла и изменении его атрибутов ... + инфоОшибка = ИнформацияОбОшибке(); + стрТекст = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка записи файла ""%1"". + |Причина: %2'"), + ПолноеИмяФайла, + ?(инфоОшибка.Причина = Неопределено, "Неопределено", инфоОшибка.Причина.Описание) ); + + Результат = Вопрос(стрТекст, РежимДиалогаВопрос.ПрерватьПовторитьПропустить, , КодВозвратаДиалога.Повторить); + Если Результат = КодВозвратаДиалога.Прервать Тогда + + // Просто выйдем с ошибкой + Возврат Ложь; + ИначеЕсли Результат = КодВозвратаДиалога.Пропустить Тогда + + // Пропустим этот файл и пойдем дальше + Прервать; + Иначе + + // Попробуем повторить создание папки + Продолжить; + КонецЕсли; + КонецПопытки; + КонецЦикла; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + + #КонецЕсли +КонецФункции // ОбойтиДеревоФайлов() + +&НаКлиенте +Процедура ПапкаДляЭкспортаОткрытие(Элемент, СтандартнаяОбработка) + #Если НЕ ВебКлиент Тогда + + // Здесь откроем папку для просмотра - вдруг что-то сделать понадобиться + СтандартнаяОбработка = Ложь; + Если Не ПустаяСтрока(ПапкаДляЭкспорта) Тогда + Файл = Новый Файл(ПапкаДляЭкспорта); + Если Файл.Существует() Тогда + ЗапуститьПриложение(ПапкаДляЭкспорта); + Иначе + Предупреждение(НСтр("ru = 'Невозможно открыть папку выгрузки. Возможно, папка еще не создана.'")); + КонецЕсли; + КонецЕсли; + + #КонецЕсли +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + #Если ВебКлиент Тогда + Предупреждение(НСтр("ru = 'В Веб-клиенте экспорт каталогов не поддерживается.'")); + Отказ = Истина; + Возврат; + #КонецЕсли + + // Установим в качестве папки выгрузки Мои Документы + // или ту папку, в которую выгружали файлы последний раз + ПапкаДляЭкспорта = ФайловыеФункцииКлиент.КаталогПоследнейВыгрузки() + Строка(ЧтоСохраняем) + "\"; +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/ConditionalAppearance.dcssca b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/ConditionalAppearance.dcssca new file mode 100644 index 000000000..8b531023e --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/ConditionalAppearance.dcssca @@ -0,0 +1,32 @@ + + + + + + ТаблицаПодписейКомуВыданСертификат + + + ТаблицаПодписейСтатус + + + ТаблицаПодписейДатаПодписи + + + ТаблицаПодписейКомментарий + + + + + ТаблицаПодписей.Неверна + Equal + true + + + + + ЦветТекста + style:SpecialTextColor + + + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..a5455719a --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,3053 @@ + + + + ГруппаОсновная + 145 + + ГруппаОсновныеДанные + 45 + + ПолноеНаименование + 43 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Объект.ПолноеНаименование + + Top + + OnChange + ПолноеНаименованиеПриИзменении + + + ПолноеНаименованиеРасширеннаяПодсказка + 229 + Label + true + true + + Left + + + + ПолноеНаименованиеКонтекстноеМеню + 44 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Описание + 5 + true + true + + true + + + Объект.Описание + + Top + + ru + Описание файла + + + ОписаниеРасширеннаяПодсказка + 231 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 23 + true + + InputField + Enter + true + Left + true + Left + + true + 3 + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа основные данные</value> + + + ru + Группа основные данные + + + ГруппаОсновныеДанныеРасширеннаяПодсказка + 228 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаКоманды + 136 + + ОткрытьФайл + 137 + true + true + + true + + false + + ОткрытьФайлРасширеннаяПодсказка + 234 + Label + true + true + + Left + + + UsualButton + Form.Command.ОткрытьФайл + Normal + Auto + true + true + UserCmds + Auto + + + Редактировать + 138 + true + true + + true + + false + + РедактироватьРасширеннаяПодсказка + 235 + Label + true + true + + Left + + + UsualButton + Form.Command.Редактировать + Normal + Auto + true + true + UserCmds + Auto + + + ЗакончитьРедактирование + 139 + true + true + + true + + false + + ЗакончитьРедактированиеРасширеннаяПодсказка + 236 + Label + true + true + + Left + + + UsualButton + Form.Command.ЗакончитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + + СохранитьИзменения + 142 + true + true + + true + + false + + СохранитьИзмененияРасширеннаяПодсказка + 237 + Label + true + true + + Left + + + UsualButton + Form.Command.СохранитьИзменения + Normal + Auto + true + true + UserCmds + Auto + + + ОткрытьКаталогФайла + 143 + true + true + + true + + false + + ОткрытьКаталогФайлаРасширеннаяПодсказка + 238 + Label + true + true + + Left + + + UsualButton + Form.Command.ОткрытьКаталогФайла + Normal + Auto + true + true + UserCmds + Auto + + + СохранитьКак + 144 + true + true + + true + + false + + СохранитьКакРасширеннаяПодсказка + 239 + Label + true + true + + Left + + + UsualButton + Form.Command.СохранитьКак + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа команды</value> + + + ru + Группа команды + + + ГруппаКомандыРасширеннаяПодсказка + 233 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа основная</value> + + + ru + Группа основная + + + ГруппаОсновнаяРасширеннаяПодсказка + 227 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаДополнительныеДанныеСтраницы + 187 + + ГруппаСведенияОФайле + 188 + + ГруппаСведения + 112 + + ДатаСоздания + 113 + + <key>ru</key> + <value>Создан</value> + + true + true + + true + + + Объект.ДатаСоздания + + + ДатаСозданияРасширеннаяПодсказка + 243 + Label + true + true + + Left + + + + ДатаСозданияКонтекстноеМеню + 114 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Автор + 115 + true + true + + true + + + Объект.Автор + + + АвторРасширеннаяПодсказка + 245 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 116 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + false + true + true + true + Normal + + + + Редактирует + 117 + true + true + + true + + + Объект.Редактирует + + + РедактируетРасширеннаяПодсказка + 247 + Label + true + true + + Left + + + + РедактируетКонтекстноеМеню + 118 + true + + InputField + true + Enter + true + Left + true + + true + true + false + true + true + true + Normal + + + + Владелец + 119 + true + true + + true + + + Объект.ВладелецФайла + + + OnChange + ВладелецПриИзменении + + + ВладелецРасширеннаяПодсказка + 249 + Label + true + true + + Left + + + + ВладелецКонтекстноеМеню + 120 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + Normal + + + + ТекущаяВерсияРасширение + 123 + true + true + + true + + + Объект.ТекущаяВерсия.Расширение + + + ТекущаяВерсияРасширениеРасширеннаяПодсказка + 253 + Label + true + true + + Left + + + + ТекущаяВерсияРасширениеКонтекстноеМеню + 124 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Сведения о файле</value> + + + ru + Группа сведения + + + ГруппаСведенияРасширеннаяПодсказка + 242 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаВерсия + 125 + + ТекущаяВерсияНомер + 126 + + <key>ru</key> + <value>Номер</value> + + true + true + + true + + + Объект.ТекущаяВерсия.НомерВерсии + + + ТекущаяВерсияНомерРасширеннаяПодсказка + 256 + Label + true + true + + Left + + + + ТекущаяВерсияНомерКонтекстноеМеню + 127 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТекущаяВерсияАвтор + 128 + true + true + + true + + + Объект.ТекущаяВерсия.Автор + + + ТекущаяВерсияАвторРасширеннаяПодсказка + 258 + Label + true + true + + Left + + + + ТекущаяВерсияАвторКонтекстноеМеню + 129 + true + + InputField + Enter + true + Left + true + + true + true + true + false + true + true + true + Normal + + + + ТекущаяВерсияДатаСоздания + 130 + + <key>ru</key> + <value>Дата</value> + + true + true + + true + + + Объект.ТекущаяВерсия.ДатаСоздания + + + ТекущаяВерсияДатаСозданияРасширеннаяПодсказка + 260 + Label + true + true + + Left + + + + ТекущаяВерсияДатаСозданияКонтекстноеМеню + 131 + true + + InputField + Enter + true + Left + true + + true + true + true + false + true + true + true + Normal + + + + ТекущаяВерсияРазмер + 132 + true + true + + true + + + Объект.ТекущаяВерсия.Размер + + + ТекущаяВерсияРазмерРасширеннаяПодсказка + 262 + Label + true + true + + Left + + + + ТекущаяВерсияРазмерКонтекстноеМеню + 133 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Текущая версия</value> + + + ru + Группа версия + + + ГруппаВерсияРасширеннаяПодсказка + 255 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + StrongSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Сведения о файле</value> + + + ru + Группа сведения о файле + + + ГруппаСведенияОФайлеРасширеннаяПодсказка + 241 + Label + true + true + + Left + + + Page + + auto + + + + ГруппаЭЦП + 189 + + ТаблицаПодписей + 190 + true + true + + true + + + ТаблицаПодписей + + None + + ТаблицаПодписейКомуВыданСертификат + 193 + true + true + + true + + + ТаблицаПодписей.КомуВыданСертификат + + + ТаблицаПодписейКомуВыданСертификатРасширеннаяПодсказка + 283 + Label + true + true + + Left + + + + ТаблицаПодписейКомуВыданСертификатКонтекстноеМеню + 194 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаПодписейДатаПодписи + 195 + true + true + + true + + + ТаблицаПодписей.ДатаПодписи + + + ТаблицаПодписейДатаПодписиРасширеннаяПодсказка + 285 + Label + true + true + + Left + + + + ТаблицаПодписейДатаПодписиКонтекстноеМеню + 196 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаПодписейКомментарий + 197 + true + true + + true + + + ТаблицаПодписей.Комментарий + + + ТаблицаПодписейКомментарийРасширеннаяПодсказка + 287 + Label + true + true + + Left + + + + ТаблицаПодписейКомментарийКонтекстноеМеню + 198 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаПодписейСтатус + 199 + true + true + + true + + + ТаблицаПодписей.Статус + + + ТаблицаПодписейСтатусРасширеннаяПодсказка + 289 + Label + true + true + + Left + + + + ТаблицаПодписейСтатусКонтекстноеМеню + 200 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаПодписейКоманднаяПанель + 192 + + ТаблицаПодписейПодписать + 215 + true + true + + true + + + ТаблицаПодписейПодписатьРасширеннаяПодсказка + 267 + Label + true + true + + Left + + + Form.Command.Подписать + Normal + true + true + UserCmds + Auto + + + ТаблицаПодписейОткрытьСертификат + 201 + true + true + + true + + + ТаблицаПодписейОткрытьСертификатРасширеннаяПодсказка + 268 + Label + true + true + + Left + + + Form.Command.ОткрытьСертификат + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаПодписейПроверить + 202 + true + true + + true + + + ТаблицаПодписейПроверитьРасширеннаяПодсказка + 269 + Label + true + true + + Left + + + Form.Command.Проверить + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаПодписейПроверитьВсе + 203 + true + true + + true + + + ТаблицаПодписейПроверитьВсеРасширеннаяПодсказка + 270 + Label + true + true + + Left + + + Form.Command.ПроверитьВсе + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаПодписейСохранить + 204 + true + true + + true + + + ТаблицаПодписейСохранитьРасширеннаяПодсказка + 271 + Label + true + true + + Left + + + Form.Command.Сохранить + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаПодписейУдалить + 205 + true + true + + true + + + ТаблицаПодписейУдалитьРасширеннаяПодсказка + 272 + Label + true + true + + Left + + + Form.Command.Удалить + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + ТаблицаПодписейВыбор + + + ТаблицаПодписейСтрокаПоиска + 274 + + ТаблицаПодписейСтрокаПоискаРасширеннаяПодсказка + 276 + Label + true + true + + Left + + + + ТаблицаПодписейСтрокаПоискаКонтекстноеМеню + 275 + true + + ТаблицаПодписей + + true + + + + ТаблицаПодписейСостояниеПросмотра + 277 + + ТаблицаПодписейСостояниеПросмотраРасширеннаяПодсказка + 279 + Label + true + true + + Left + + + + ТаблицаПодписейСостояниеПросмотраКонтекстноеМеню + 278 + true + + ViewStatusAddition + ТаблицаПодписей + + true + + + + ТаблицаПодписейУправлениеПоиском + 280 + + ТаблицаПодписейУправлениеПоискомРасширеннаяПодсказка + 282 + Label + true + true + + Left + + + + ТаблицаПодписейУправлениеПоискомКонтекстноеМеню + 281 + true + + SearchControlAddition + ТаблицаПодписей + + true + + + + ТаблицаПодписейРасширеннаяПодсказка + 273 + Label + true + true + + Left + + + + ТаблицаПодписейКонтекстноеМеню + 191 + true + + true + true + true + true + true + true + MultiRow + Row +
    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>ЭЦП</value> + + + ru + Группа ЭЦП + + + ГруппаЭЦПРасширеннаяПодсказка + 266 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + + ГруппаШифрование + 206 + + СертификатыШифрования + 207 + true + true + + true + + + СертификатыШифрования + + None + + СертификатыШифрованияПредставление + 212 + true + true + + true + + + СертификатыШифрования.Представление + + None + + СертификатыШифрованияПредставлениеРасширеннаяПодсказка + 311 + Label + true + true + + Left + + + + СертификатыШифрованияПредставлениеКонтекстноеМеню + 213 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + СертификатыШифрованияКоманднаяПанель + 209 + + СертификатыШифрованияОткрытьСертификатШифрования + 214 + true + true + + true + + + СертификатыШифрованияОткрытьСертификатШифрованияРасширеннаяПодсказка + 300 + Label + true + true + + Left + + + Form.Command.ОткрытьСертификатШифрования + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + СертификатыШифрованияВыбор + + + СертификатыШифрованияСтрокаПоиска + 302 + + СертификатыШифрованияСтрокаПоискаРасширеннаяПодсказка + 304 + Label + true + true + + Left + + + + СертификатыШифрованияСтрокаПоискаКонтекстноеМеню + 303 + true + + СертификатыШифрования + + true + + + + СертификатыШифрованияСостояниеПросмотра + 305 + + СертификатыШифрованияСостояниеПросмотраРасширеннаяПодсказка + 307 + Label + true + true + + Left + + + + СертификатыШифрованияСостояниеПросмотраКонтекстноеМеню + 306 + true + + ViewStatusAddition + СертификатыШифрования + + true + + + + СертификатыШифрованияУправлениеПоиском + 308 + + СертификатыШифрованияУправлениеПоискомРасширеннаяПодсказка + 310 + Label + true + true + + Left + + + + СертификатыШифрованияУправлениеПоискомКонтекстноеМеню + 309 + true + + SearchControlAddition + СертификатыШифрования + + true + + + + СертификатыШифрованияРасширеннаяПодсказка + 301 + Label + true + true + + Left + + + + СертификатыШифрованияКонтекстноеМеню + 208 + true + + true + true + true + true + true + true + MultiRow + Row + 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 + Группа шифрование + + + ГруппаШифрованиеРасширеннаяПодсказка + 299 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Группа дополнительные данные страницы</value> + + + ru + Группа дополнительные данные страницы + + + ГруппаДополнительныеДанныеСтраницыРасширеннаяПодсказка + 240 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + +
    + + ФормаКоманднаяПанель + -1 + + ОтменитьРедактирование + 141 + true + true + + true + + false + + ОтменитьРедактированиеРасширеннаяПодсказка + 216 + Label + true + true + + Left + + + Form.Command.ОтменитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Занять + 140 + true + true + + true + + false + + ЗанятьРасширеннаяПодсказка + 217 + Label + true + true + + Left + + + Form.Command.Занять + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ОбновитьИзФайлаНаДиске + 146 + true + true + + true + + false + + ОбновитьИзФайлаНаДискеРасширеннаяПодсказка + 218 + Label + true + true + + Left + + + Form.Command.ОбновитьИзФайлаНаДиске + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ФормаЭЦПИШифрование + 155 + + ФормаГруппаЭЦП + 147 + + ФормаПодписать + 148 + true + true + + true + + + ФормаПодписатьРасширеннаяПодсказка + 221 + Label + true + true + + Left + + + Form.Command.Подписать + Normal + Auto + true + true + UserCmds + Auto + + + ФормаДобавитьЭЦПИзФайла + 152 + true + true + + true + + + ФормаДобавитьЭЦПИзФайлаРасширеннаяПодсказка + 222 + Label + true + true + + Left + + + Form.Command.ДобавитьЭЦПИзФайла + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСохранитьВместеСЭЦП + 154 + true + true + + true + + + ФормаСохранитьВместеСЭЦПРасширеннаяПодсказка + 223 + Label + true + true + + Left + + + Form.Command.СохранитьВместеСЭЦП + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>ЭЦП</value> + + + ru + Форма группа ЭЦП + + + ФормаГруппаЭЦПРасширеннаяПодсказка + 220 + Label + true + true + + Left + + + + + + ФормаГруппаШифрование + 149 + + ФормаЗашифровать + 150 + true + true + + true + + + ФормаЗашифроватьРасширеннаяПодсказка + 225 + Label + true + true + + Left + + + Form.Command.Зашифровать + Normal + Auto + true + true + UserCmds + Auto + + + ФормаРасшифровать + 151 + true + true + + true + + + ФормаРасшифроватьРасширеннаяПодсказка + 226 + Label + true + true + + Left + + + Form.Command.Расшифровать + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Шифрование</value> + + + ru + Форма группа шифрование + + + ФормаГруппаШифрованиеРасширеннаяПодсказка + 224 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>ЭЦП и шифрование</value> + + + ru + Форма ЭЦПИШифрование + + + ФормаЭЦПИШифрованиеРасширеннаяПодсказка + 219 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + 70 + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.Файлы + + + true + + + true + + + Объект.ТекстХранилище + +
    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> + + 5 + + Boolean + + + true + + + true + + + + ДанныеФайла + + <key>ru</key> + <value>Данные файла</value> + + 6 + + + true + + + true + + + + РежимСоздания + + <key>ru</key> + <value>Режим создания</value> + + 7 + + String + + + + true + + + true + + + + ФайлРедактировался + + <key>ru</key> + <value>Файл редактировался</value> + + 9 + + Boolean + + + true + + + true + + + + НаименованиеДоЗаписи + + <key>ru</key> + <value>Наименование до записи</value> + + 4 + + String + + + + true + + + true + + + + ДанныеФайлаКорректны + + <key>ru</key> + <value>Данные файла корректны</value> + + 8 + + Boolean + + + true + + + true + + + + ФайлОснованиеПодписан + + <key>ru</key> + <value>Файл основание подписан</value> + + 10 + + Boolean + + + true + + + true + + + + КопироватьПодписиЭЦП + + <key>ru</key> + <value>Копировать подписи ЭЦП</value> + + 11 + + Boolean + + + true + + + true + + + + ТаблицаПодписей + + <key>ru</key> + <value>Таблица подписей</value> + + 13 + + ValueTable + + + true + + + true + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + + КомуВыданСертификат + + <key>ru</key> + <value>Автор подписи</value> + + 1 + + String + + + + true + + + true + + + + ДатаПодписи + + <key>ru</key> + <value>Дата подписи</value> + + 2 + + Date + + + + 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 + + CatalogRef.ВерсииФайлов + + + 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 + + Boolean + + + true + + + true + + + + ИндексКартинки + + <key>ru</key> + <value>Индекс картинки</value> + + 9 + + Number + + 10 + + + + true + + + true + + + + УстановившийПодпись + + <key>ru</key> + <value>Установивший подпись</value> + + 11 + + CatalogRef.Пользователи + + + true + + + true + + + + НомерСтроки + + <key>ru</key> + <value>Номер строки</value> + + 10 + + Number + + 10 + + + + true + + + true + + + + + СертификатыШифрования + + <key>ru</key> + <value>Сертификаты шифрования</value> + + 12 + + 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 + + ru + Записать + + + true + + Ctrl+S + + StdPicture.Write + + + + ЗаписатьВыполнить + + + Picture + Auto + Auto + + + Скопировать + + <key>ru</key> + <value>Скопировать</value> + + 4 + + ru + Скопировать + + + true + + + StdPicture.CloneObject + + + + СкопироватьВыполнить + + + Auto + Auto + + + ОткрытьФайл + + <key>ru</key> + <value>Просмотреть</value> + + 2 + + ru + Открыть файл для просмотра + + + true + + + CommonPicture.КартинкаОткрыть + + + + ОткрытьФайлВыполнить + + + TextPicture + Auto + Auto + + + Редактировать + + <key>ru</key> + <value>Редактировать</value> + + 5 + + ru + Открыть файл для редактирования + + + true + + + CommonPicture.КартинкаРедактировать + + + + Редактировать + + + TextPicture + true + Auto + Auto + + + Занять + + <key>ru</key> + <value>Занять</value> + + 6 + + ru + Пометить файл как занятый для редактирования + + + true + + + CommonPicture.КартинкаЗанять + + + + Занять + + + TextPicture + true + Auto + Auto + + + ОтменитьРедактирование + + <key>ru</key> + <value>Отменить редактирование</value> + + 7 + + ru + Освободить занятый файл + + + true + + + CommonPicture.КартинкаОсвободить + + + + ОтменитьРедактирование + + + TextPicture + true + Auto + Auto + + + СохранитьИзменения + + <key>ru</key> + <value>Сохранить изменения</value> + + 8 + + ru + Сохранить измененный файл в информационной базе + + + true + + + CommonPicture.КартинкаОпубликовать + + + + СохранитьИзменения + + + TextPicture + true + Auto + Auto + + + ОткрытьКаталогФайла + + <key>ru</key> + <value>Открыть каталог файла</value> + + 9 + + ru + Открыть каталог файла + + + true + + + CommonPicture.Папка + + + + ОткрытьКаталогФайла + + + TextPicture + Auto + Auto + + + СохранитьКак + + <key>ru</key> + <value>Сохранить как...</value> + + 10 + + ru + Сохранить файл на диск или другое устройство + + + true + + + CommonPicture.КартинкаСохранитьКак + + + + СохранитьКак + + + TextPicture + Auto + Auto + + + ЗакончитьРедактирование + + <key>ru</key> + <value>Закончить редактирование</value> + + 11 + + ru + Сохранить и освободить файл в информационной базе + + + true + + + CommonPicture.КартинкаЗакончитьРедактирование + + + + ЗакончитьРедактирование + + + TextPicture + true + Auto + Auto + + + ОбновитьИзФайлаНаДиске + + <key>ru</key> + <value>Обновить из файла на диске</value> + + 12 + + ru + Обновить из файла на диске + + + true + + + + ОбновитьИзФайлаНаДиске + + + Text + Auto + Auto + + + Подписать + + <key>ru</key> + <value>Подписать</value> + + 13 + + ru + Подписать + + + true + + + CommonPicture.Подписан + + + + Подписать + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + Зашифровать + + <key>ru</key> + <value>Зашифровать</value> + + 14 + + ru + Зашифровать + + + true + + + CommonPicture.Зашифрован + + + + Зашифровать + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + Расшифровать + + <key>ru</key> + <value>Расшифровать</value> + + 15 + + ru + Расшифровать + + + true + + + + Расшифровать + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + ДобавитьЭЦПИзФайла + + <key>ru</key> + <value>Добавить ЭЦП из файла</value> + + 16 + + ru + Добавить ЭЦП из файла + + + true + + + + ДобавитьЭЦПИзФайла + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + СохранитьВместеСЭЦП + + <key>ru</key> + <value>Сохранить вместе с ЭЦП</value> + + 18 + + ru + Сохранить вместе с ЭЦП + + + true + + + + СохранитьВместеСЭЦП + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + ОткрытьСертификат + + <key>ru</key> + <value>Открыть сертификат</value> + + 17 + + ru + Открыть сертификат + + + true + + + + ОткрытьСертификат + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + Проверить + + <key>ru</key> + <value>Проверить</value> + + 19 + + ru + Проверить + + + true + + + + Проверить + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + ПроверитьВсе + + <key>ru</key> + <value>Проверить все</value> + + 20 + + ru + Проверить все + + + true + + + + ПроверитьВсе + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + Сохранить + + <key>ru</key> + <value>Сохранить</value> + + 21 + + ru + Сохранить + + + true + + + + Сохранить + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + Удалить + + <key>ru</key> + <value>Удалить</value> + + 22 + + ru + Удалить + + + true + + + + Удалить + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + ОткрытьСертификатШифрования + + <key>ru</key> + <value>Открыть сертификат</value> + + 1 + + ru + Открыть сертификат + + + true + + + + ОткрытьСертификатШифрования + + + Auto + Auto + + + ФайлОснование + + CatalogRef.Файлы + + true + + + ВладелецФайла + + CatalogRef.ПапкиФайлов + + true + + + + + 0 + 2 + + true + + + + 0 + + true + + + + 0 + + true + + + + 0 + 1 + + true + + + + 0 + + true + + + + 0 + + true + + + + + + + + AfterWrite + ПослеЗаписи + + + AfterWriteAtServer + ПослеЗаписиНаСервере + + + BeforeWrite + ПередЗаписью + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + +
    diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Help/ru.html new file mode 100644 index 000000000..306d24938 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Help/ru.html @@ -0,0 +1,11 @@ + +

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

    +

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

    +

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

    +

     

    +

    См. также:

    +

     

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..70e72fd1b --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,1120 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + УстановитьДоступностьЭлементовФормы(); + + НаименованиеДоЗаписи = Объект.Наименование; + + Если Не Параметры.ФайлОснование.Пустая() И ФайлОснованиеПодписан Тогда + + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" подписан. + | Копирование сведений об ЭЦП в новый файл сделает его недоступным для изменения. + | Скопировать в новый файл сведения об ЭЦП?'"), + Строка(Параметры.ФайлОснование)); + + Ответ = Вопрос(Текст, РежимДиалогаВопрос.ДаНет); + + Если Ответ = КодВозвратаДиалога.Да Тогда + КопироватьПодписиЭЦП = Истина; + КонецЕсли; + КонецЕсли; + + УстановитьДоступностьКомандСпискаЭЦП(); + +КонецПроцедуры + +// Функция предназначена для копирования последней версии +// из Файла-источника в Файл-приемник +// Параметры: +// Приемник - ссылка на "Файл" куда копируется прилинкованный Файл +// Источник - ссылка на "Файл" откуда копируется прилинкованный Файл +&НаСервере +Функция СоздатьКопиюВерсии(Приемник, Источник, КопироватьПодписиЭЦП) + + Если Не Источник.ТекущаяВерсия.Пустая() Тогда + + Версия = РаботаСФайлами.СоздатьВерсию( + ТекущаяДата(), + УниверсальноеВремя(ТекущаяДата()), + Приемник, + Объект.Наименование, + Источник.ТекущаяВерсия.Размер, + Источник.ТекущаяВерсия.Расширение, + Источник.ТекущаяВерсия.ФайлХранилище, + Источник.ТекущаяВерсия.ТекстХранилище, + Ложь, + Источник.ТекущаяВерсия); + + // Обновим форму Файла (ведь запись может произойти и не при закрытии формы) + Объект.ТекущаяВерсия = Версия.Ссылка; + + // Обновим запись в информационной базе + РаботаСФайлами.ОбновитьВерсиюВФайле(Приемник, Версия, Источник.ТекущаяВерсия.ТекстХранилище, УникальныйИдентификатор); + + Если КопироватьПодписиЭЦП Тогда + + ФайлОбъект = Объект.Ссылка.ПолучитьОбъект(); + ФайлОбъект.Подписан = Истина; + ФайлОбъект.Записать(); + + ВерсияОбъект = Объект.ТекущаяВерсия.ПолучитьОбъект(); + + Для Каждого Строка Из Источник.ТекущаяВерсия.ЭлектронноЦифровыеПодписи Цикл + НоваяСтрока = ВерсияОбъект.ЭлектронноЦифровыеПодписи.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); + КонецЦикла; + + ВерсияОбъект.Подписан = Истина; + ВерсияОбъект.Записать(); + + ПрочитатьИЗаполнитьПодписи(); + + КонецЕсли; + + КонецЕсли; + +КонецФункции // СоздатьКопиюВерсии() + +// Устанавливает доступность команд и элементов формы +&НаКлиенте +Процедура УстановитьДоступностьЭлементовФормы() + + ДоступныДействияСФайлом = Не Объект.ТекущаяВерсия.Пустая() И Не Объект.Ссылка.Пустая(); + + Элементы.ХранитьВерсии.Доступность = ДоступныДействияСФайлом И Не Объект.ПометкаУдаления; + Элементы.ОтменитьРедактирование.Доступность = Не Объект.Редактирует.Пустая(); + Элементы.ОткрытьКаталогФайла.Доступность = ДоступныДействияСФайлом; + Элементы.СохранитьКак.Доступность = ДоступныДействияСФайлом; + + Элементы.Редактировать.Доступность = НЕ Объект.Подписан; + Элементы.ЗакончитьРедактирование.Доступность = Не Объект.Редактирует.Пустая(); + Элементы.ПолноеНаименование.ТолькоПросмотр = НЕ Объект.Редактирует.Пустая(); + Элементы.Занять.Доступность = Объект.Редактирует.Пустая() И (ДоступныДействияСФайлом) И НЕ Объект.Подписан; + Элементы.СохранитьИзменения.Доступность = Не Объект.Редактирует.Пустая(); + + Элементы.ОбновитьИзФайлаНаДиске.Доступность = ДоступныДействияСФайлом И НЕ Объект.Подписан; + + Элементы.ФормаПодписать.Доступность = (ДоступныДействияСФайлом И Объект.Редактирует.Пустая()) ИЛИ НЕ ДоступныДействияСФайлом; + Элементы.ФормаЗашифровать.Доступность = (ДоступныДействияСФайлом И Объект.Редактирует.Пустая() И НЕ Объект.Зашифрован) ИЛИ НЕ ДоступныДействияСФайлом; + + Элементы.ФормаДобавитьЭЦПИзФайла.Доступность = ДоступныДействияСФайлом И Объект.Редактирует.Пустая(); + Элементы.ФормаСохранитьВместеСЭЦП.Доступность = ДоступныДействияСФайлом И Объект.Подписан; + Элементы.ФормаРасшифровать.Доступность = ДоступныДействияСФайлом И Объект.Зашифрован; + +КонецПроцедуры + +&НаКлиенте +Процедура ПолноеНаименованиеПриИзменении(Элемент) + Объект.ПолноеНаименование = СокрЛП(Объект.ПолноеНаименование); + Попытка + ФайловыеФункцииКлиент.КорректноеИмяФайла(Объект.ПолноеНаименование, Истина); + Исключение + Информация = ИнформацияОбОшибке(); + Предупреждение(Информация.Описание); + КонецПопытки; + + Объект.Наименование = СокрЛП(Объект.ПолноеНаименование); +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьВыполнить() + Записать(); + Прочитать(); +КонецПроцедуры + +&НаКлиенте +Процедура СкопироватьВыполнить() + + РаботаСФайламиКлиент.СкопироватьФайл(Объект.ВладелецФайла, Объект.Ссылка); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +// Процедура - обработчик события "ПриСоздании". +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ДанныеФайлаКорректны = Ложь; + + Если Параметры.Свойство("РежимСоздания") Тогда + РежимСоздания = Параметры.РежимСоздания; + КонецЕсли; + + Если Параметры.Свойство("НовыйФайл") Тогда + НовыйФайл = Параметры.НовыйФайл; + КонецЕсли; + + Если Параметры.Ключ = Неопределено Или Параметры.Ключ.Пустая() Тогда + + НовыйФайл = Истина; + + Если Параметры.ЗначениеКопирования.Пустая() Тогда + Объект.ВладелецФайла = Параметры.ВладелецФайла; + Иначе + Объект.ТекущаяВерсия = Справочники.ВерсииФайлов.ПустаяСсылка(); + Параметры.ФайлОснование = Параметры.ЗначениеКопирования; + КонецЕсли; + + КонецЕсли; + + ДокОснование = Параметры.ФайлОснование; + Если Не ДокОснование.Пустая() Тогда + + Объект.ПолноеНаименование = ДокОснование.ПолноеНаименование; + Объект.Наименование = Объект.ПолноеНаименование; + Объект.ХранитьВерсии = ДокОснование.ХранитьВерсии; + + КонецЕсли; + + Если Не Объект.Ссылка.Пустая() Тогда + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(Объект.Ссылка); + ДанныеФайлаКорректны = Истина; + КонецЕсли; + + ТипВладельца = ТипЗнч(Объект.ВладелецФайла); + Элементы.Владелец.Заголовок = ТипВладельца; + + НовыйФайлЗаписан = Ложь; + + // Обработчик подсистемы "Свойства" + УправлениеСвойствами.ПриСозданииНаСервере(ЭтаФорма, Объект, ""); + + Если Параметры.Свойство("КарточкаОткрытаПослеСозданияФайла") Тогда + Если Параметры.КарточкаОткрытаПослеСозданияФайла Тогда + + Попытка + ЗаблокироватьДанныеФормыДляРедактирования(); + Исключение + КонецПопытки; + + КонецЕсли; + КонецЕсли; + + Если ТипЗнч(Объект.ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") Тогда + ОбновитьПолныйПуть(); + КонецЕсли; + + Если Не Параметры.ФайлОснование.Пустая() Тогда + ФайлОснованиеПодписан = Параметры.ФайлОснование.Подписан; + КонецЕсли; + + Если РаботаСФайлами.ПолучитьИспользоватьЭлектронноЦифровыеПодписиИШифрование() = Ложь Тогда + Элементы.ГруппаДополнительныеДанныеСтраницы.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; + Иначе + ЗаполнитьСписокПодписей(); + ЗаполнитьСписокШифрования(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСписокШифрования() + + СертификатыШифрования.Очистить(); + + Если Объект.Зашифрован Тогда + МассивСертификатовШифрования = РаботаСФайлами.ПолучитьМассивСертификатовШифрования(Объект.Ссылка); + Для Каждого СтруктураСертификата Из ДанныеФайла.МассивСертификатовШифрования Цикл + НоваяСтрока = СертификатыШифрования.Добавить(); + НоваяСтрока.Представление = СтруктураСертификата.Представление; + НоваяСтрока.Отпечаток = СтруктураСертификата.Отпечаток; + КонецЦикла; + КонецЕсли; + + ТекстЗаголовка = НСтр("ru = 'Зашифрован для'"); + Если СертификатыШифрования.Количество() <> 0 Тогда + ТекстЗаголовка = ТекстЗаголовка + " (" + Строка(СертификатыШифрования.Количество()) + ")"; + КонецЕсли; + Элементы.ГруппаШифрование.Заголовок = ТекстЗаголовка; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСписокПодписей() + + ТаблицаПодписей.Очистить(); + + Если Объект.Подписан Тогда + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ЭлектронноЦифровыеПодписи.КомуВыданСертификат КАК КомуВыданСертификат, + | ЭлектронноЦифровыеПодписи.ДатаПодписи КАК ДатаПодписи, + | ЭлектронноЦифровыеПодписи.Комментарий КАК Комментарий, + | ЭлектронноЦифровыеПодписи.Подпись КАК Подпись, + | ЭлектронноЦифровыеПодписи.Отпечаток КАК Отпечаток, + | ЭлектронноЦифровыеПодписи.УстановившийПодпись КАК УстановившийПодпись, + | ЭлектронноЦифровыеПодписи.НомерСтроки КАК НомерСтроки + |ИЗ + | Справочник.ВерсииФайлов.ЭлектронноЦифровыеПодписи КАК ЭлектронноЦифровыеПодписи + |ГДЕ + | ЭлектронноЦифровыеПодписи.Ссылка = &ОбъектСсылка"; + + Запрос.Параметры.Вставить("ОбъектСсылка", Объект.ТекущаяВерсия); + ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); + + Пока ВыборкаЗапроса.Следующий() Цикл + НоваяСтрока = ТаблицаПодписей.Добавить(); + + НоваяСтрока.КомуВыданСертификат = ВыборкаЗапроса.КомуВыданСертификат; + НоваяСтрока.ДатаПодписи = ВыборкаЗапроса.ДатаПодписи; + НоваяСтрока.Комментарий = ВыборкаЗапроса.Комментарий; + НоваяСтрока.Объект = Объект.ТекущаяВерсия; + НоваяСтрока.Отпечаток = ВыборкаЗапроса.Отпечаток; + НоваяСтрока.НомерСтроки = ВыборкаЗапроса.НомерСтроки; + НоваяСтрока.УстановившийПодпись = ВыборкаЗапроса.УстановившийПодпись; + НоваяСтрока.Неверна = Ложь; + НоваяСтрока.ИндексКартинки = -1; + + ДвоичныеДанные = ВыборкаЗапроса.Подпись.Получить(); + НоваяСтрока.АдресПодписи = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор); + КонецЦикла; + КонецЕсли; + + ТекстЗаголовка = НСтр("ru = 'ЭЦП'"); + Если ТаблицаПодписей.Количество() <> 0 Тогда + ТекстЗаголовка = ТекстЗаголовка + " (" + Строка(ТаблицаПодписей.Количество()) + ")"; + КонецЕсли; + Элементы.ГруппаЭЦП.Заголовок = ТекстЗаголовка; + +КонецПроцедуры + + +&НаСервере +Процедура ОбновитьПолныйПуть() + + Если ТипЗнч(Объект.ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") Тогда + + ПапкаРодитель = Объект.ВладелецФайла; + + ПолныйПуть = ""; + + Пока Не ПапкаРодитель.Пустая() Цикл + + Если Не ПустаяСтрока(ПолныйПуть) Тогда + ПолныйПуть = "\" + ПолныйПуть; + КонецЕсли; + + ПолныйПуть = Строка(ПапкаРодитель) + ПолныйПуть; + ПапкаРодитель = ПапкаРодитель.Родитель; + + КонецЦикла; + + Элементы.Владелец.Подсказка = ПолныйПуть; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Если ФайлРедактировался И РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ТекущийПользователь = Объект.Редактирует Тогда + Ответ = Вопрос(НСтр("ru = 'Файл занят вами для редактирования. Закрыть карточку?'"), РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет); + Если Ответ = КодВозвратаДиалога.Нет Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + КонецЕсли; + + Если РежимСоздания = "ИзШаблона" Тогда + СтрокаВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Открыть файл ""%1"" для редактирования?'"), + СокрЛП(Объект.ПолноеНаименование) ); + + Если НовыйФайл И НовыйФайлЗаписан И (Не ФайлРедактировался) И Вопрос(СтрокаВопроса, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Да) = КодВозвратаДиалога.Да Тогда + РаботаСФайламиКлиент.РедактироватьФайлПоСсылке(Объект.Ссылка, УникальныйИдентификатор); + ОповеститьОбИзменении(Объект.Ссылка); + Оповестить("ДанныеФайлаИзменены", Объект.Ссылка); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСОбытия = "ФайлОткрыт" И Параметр = Объект.Ссылка Тогда + НовыйФайл = Ложь; + КонецЕсли; + + Если ИмяСобытия = "ФайлРедактировался" И Параметр = Объект.Ссылка Тогда + ФайлРедактировался = Истина; + КонецЕсли; + + Если ИмяСобытия = "ФайлРедактировался" И Параметр = Объект.Ссылка Тогда + ФайлРедактировался = Истина; + КонецЕсли; + + Если ИмяСобытия = "ОбъектПодписан" И Параметр = Объект.Ссылка Тогда + Прочитать(); + КонецЕсли; + + Если ИмяСобытия = "АктивнаяВерсияИзменена" И Параметр = Объект.Ссылка Тогда + Прочитать(); + КонецЕсли; + + // Обработчик подсистемы "Свойства" + Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтаФорма, ИмяСобытия, Параметр) Тогда + ОбновитьЭлементыДополнительныхРеквизитов(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗаписью(Отказ) + Объект.Наименование = Объект.ПолноеНаименование; +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект) + + // Обработчик подсистемы "Свойства" + УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект); + + Если НаименованиеДоЗаписи <> ТекущийОбъект.Наименование Тогда + Если ТекущийОбъект.ТекущаяВерсия.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + РаботаСФайлами.ПереименоватьФайлВерсииНаДиске(ТекущийОбъект.ТекущаяВерсия, НаименованиеДоЗаписи, ТекущийОбъект.Наименование); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект) + Если НовыйФайл Тогда + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(Объект.Ссылка); + ДанныеФайлаКорректны = Истина; + КонецЕсли; + + Если Не Параметры.ФайлОснование.Пустая() И Объект.ТекущаяВерсия.Пустая() Тогда + СоздатьКопиюВерсии(Объект.Ссылка, Параметры.ФайлОснование, КопироватьПодписиЭЦП); + Модифированность = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи() + Если НовыйФайл Тогда + НовыйФайлЗаписан = Истина; + Прочитать(); + + ПараметрыОповещения = Новый Структура("Владелец, Файл", Объект.ВладелецФайла, Объект.Ссылка); + Оповестить("СозданФайл", ПараметрыОповещения); + + Иначе + Если НаименованиеДоЗаписи <> Объект.Наименование Тогда + // в кеше обновить файл + РаботаСФайламиКлиент.ОбновитьИнформациюВРабочемКаталоге(Объект.ТекущаяВерсия, Объект.Наименование); + НаименованиеДоЗаписи = Объект.Наименование; + КонецЕсли; + КонецЕсли; + + УстановитьДоступностьЭлементовФормы(); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФайлВыполнить() + + Если Объект.Ссылка.Пустая() Тогда + Записать(); + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(Объект.Ссылка, Неопределено, + УникальныйИдентификатор); + + КомандыРаботыСФайлами.Открыть(ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура Редактировать(Команда) + + Если Объект.Ссылка.Пустая() Тогда + Записать(); + КонецЕсли; + + Если Модифицированность Тогда + Записать(); + КонецЕсли; + КомандыРаботыСФайлами.Редактировать(Объект.Ссылка, УникальныйИдентификатор); + Прочитать(); + УстановитьДоступностьЭлементовФормы(); + +КонецПроцедуры + +// получить данные файла, если нужно +&НаКлиенте +Процедура ПолучитьДанныеФайлаЕслиНекорректны() + Если ДанныеФайла = Неопределено ИЛИ НЕ ДанныеФайлаКорректны Тогда + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(Объект.Ссылка); + ДанныеФайлаКорректны = Истина; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ЗакончитьРедактирование(Команда) + Если Модифицированность Тогда + Записать(); + КонецЕсли; + + ПолучитьДанныеФайлаЕслиНекорректны(); + + КомандыРаботыСФайлами.ЗакончитьРедактирование( + ДанныеФайла.Ссылка, + УникальныйИдентификатор, + ДанныеФайла.ХранитьВерсии, + ДанныеФайла.РедактируетТекущийПользователь, + ДанныеФайла.Редактирует); + + Прочитать(); + УстановитьДоступностьЭлементовФормы(); +КонецПроцедуры + +&НаКлиенте +Процедура Занять(Команда) + Если Модифицированность Тогда + Записать(); + КонецЕсли; + КомандыРаботыСФайлами.Занять(Объект.Ссылка, УникальныйИдентификатор); + Прочитать(); + УстановитьДоступностьЭлементовФормы(); +КонецПроцедуры + +&НаКлиенте +Процедура ОтменитьРедактирование(Команда) + Если Модифицированность Тогда + Записать(); + КонецЕсли; + + ПолучитьДанныеФайлаЕслиНекорректны(); + + КомандыРаботыСФайлами.ОсвободитьФайл( + ДанныеФайла.Ссылка, + ДанныеФайла.ХранитьВерсии, + ДанныеФайла.РедактируетТекущийПользователь, + ДанныеФайла.Редактирует, + УникальныйИдентификатор); + + Прочитать(); + УстановитьДоступностьЭлементовФормы(); +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьИзменения(Команда) + Если Модифицированность Тогда + Записать(); + КонецЕсли; + + КомандыРаботыСФайлами.ОпубликоватьФайл(Объект.Ссылка, УникальныйИдентификатор); + + Прочитать(); + УстановитьДоступностьЭлементовФормы(); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКаталогФайла(Команда) + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(Объект.Ссылка, Неопределено, УникальныйИдентификатор); + КомандыРаботыСФайлами.ОткрытьКаталогФайла(ДанныеФайла); +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьКак(Команда) + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляСохранения(Объект.Ссылка, Неопределено, УникальныйИдентификатор); + КомандыРаботыСФайлами.СохранитьКак(ДанныеФайла); +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИзФайлаНаДиске(Команда) + Если Модифицированность Тогда + Записать(); + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(Объект.Ссылка); + КомандыРаботыСФайлами.ОбновитьИзФайлаНаДиске(ДанныеФайла, УникальныйИдентификатор); + Прочитать(); +КонецПроцедуры + +&НаСервере +Процедура ПрочитатьИЗаполнитьПодписи() + Прочитать(); + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(Объект.Ссылка); + ДанныеФайлаКорректны = Истина; + ЗаполнитьСписокПодписей(); +КонецПроцедуры + +&НаКлиенте +Процедура Подписать(Команда) + + Если Объект.Ссылка.Пустая() Тогда + + ТекстВопроса = НСтр("ru = 'Данные еще не записаны. + |Выполнение действия ""Подписать"" возможно только после записи данных. + |Данные будут записаны.'"); + Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); + + Если Результат <> КодВозвратаДиалога.ОК Тогда + Возврат; + КонецЕсли; + + Если Не Записать() Тогда + Возврат; + КонецЕсли; + + ПоказатьОповещениеПользователя( + "Создание:", + ПолучитьНавигационнуюСсылку(Объект.Ссылка), + Строка(Объект.Ссылка), + БиблиотекаКартинок.Информация32); + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(Объект.Ссылка); + + ДанныеДляЗанесенияВРегистр = Неопределено; + Если КомандыРаботыСФайлами.СформироватьПодписьФайла(ДанныеФайла, ДанныеДляЗанесенияВРегистр) Тогда + + ПодписатьЭЦПСервер(ДанныеДляЗанесенияВРегистр); + + ЭлектронноЦифроваяПодписьКлиент.ИнформироватьОПодписанииОбъекта(ДанныеФайла.Ссылка); + Оповестить("ПрисоединенныйФайлПодписан", ДанныеФайла.Владелец); + УстановитьДоступностьЭлементовФормы(); + УстановитьДоступностьКомандСпискаЭЦП(); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПодписатьЭЦПСервер(ДанныеДляЗанесенияВРегистр) + + ЭлектронноЦифроваяПодпись.ЗанестиИнформациюОднойПодписи(ДанныеДляЗанесенияВРегистр); + ПрочитатьИЗаполнитьПодписи(); + +КонецПроцедуры + +&НаКлиенте +Процедура Зашифровать(Команда) + + Если Объект.Ссылка.Пустая() Тогда + + ТекстВопроса = НСтр("ru = 'Данные еще не записаны. + |Выполнение действия ""Зашифровать"" возможно только после записи данных. + |Данные будут записаны.'"); + Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); + + Если Результат <> КодВозвратаДиалога.ОК Тогда + Возврат; + КонецЕсли; + + Если Не Записать() Тогда + Возврат; + КонецЕсли; + + ПоказатьОповещениеПользователя( + "Создание:", + ПолучитьНавигационнуюСсылку(Объект.Ссылка), + Строка(Объект.Ссылка), + БиблиотекаКартинок.Информация32); + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИКоличествоВерсий(Объект.Ссылка); + + МассивДанныхДляЗанесенияВБазу = Новый Массив; + МассивАдресов = Новый Массив; + МассивОтпечатков = Новый Массив; + + Если НЕ КомандыРаботыСФайлами.Зашифровать(ДанныеФайла, УникальныйИдентификатор, + МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, МассивАдресов) Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиКлиент.ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяРабочегоКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + ЗашифроватьСервер(МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, МассивАдресов, + МассивФайловВРабочемКаталогеДляУдаления, + ИмяРабочегоКаталога); + + РаботаСФайламиКлиент.ИнформироватьОШифровании(МассивФайловВРабочемКаталогеДляУдаления, + ДанныеФайла.Владелец, Объект.Ссылка); + + УстановитьДоступностьЭлементовФормы(); + +КонецПроцедуры + +&НаСервере +Процедура ЗашифроватьСервер(МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, МассивАдресов, + МассивФайловВРабочемКаталогеДляУдаления, + ИмяРабочегоКаталога) + + Зашифровать = Истина; + + РаботаСФайлами.ЗанестиИнформациюОШифровании(Объект.Ссылка, Зашифровать, МассивДанныхДляЗанесенияВБазу, + УникальныйИдентификатор, + ИмяРабочегоКаталога, МассивФайловВРабочемКаталогеДляУдаления, МассивОтпечатков, МассивАдресов); + + Прочитать(); + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(Объект.Ссылка); + ЗаполнитьСписокШифрования(); + + СсылкаВладелецФайла = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Объект.Ссылка, "ВладелецФайла"); + +КонецПроцедуры + +&НаКлиенте +Процедура Расшифровать(Команда) + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИКоличествоВерсий(Объект.Ссылка); + + МассивДанныхДляЗанесенияВБазу = Новый Массив; + МассивАдресов = Новый Массив; + + Если НЕ КомандыРаботыСФайлами.Расшифровать(ДанныеФайла, УникальныйИдентификатор, + МассивДанныхДляЗанесенияВБазу, МассивАдресов) Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиКлиент.ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяРабочегоКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, МассивАдресов, + ИмяРабочегоКаталога); + + РаботаСФайламиКлиент.ИнформироватьОРасшифровании( + ДанныеФайла.Владелец, Объект.Ссылка); + + УстановитьДоступностьЭлементовФормы(); + +КонецПроцедуры + +&НаСервере +Процедура РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, МассивАдресов, + ИмяРабочегоКаталога) + + Зашифровать = Ложь; + МассивОтпечатков = Новый Массив; + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + РаботаСФайлами.ЗанестиИнформациюОШифровании(Объект.Ссылка, Зашифровать, МассивДанныхДляЗанесенияВБазу, + УникальныйИдентификатор, + ИмяРабочегоКаталога, МассивФайловВРабочемКаталогеДляУдаления, МассивОтпечатков, МассивАдресов); + + Прочитать(); + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(Объект.Ссылка); + ЗаполнитьСписокШифрования(); + + СсылкаВладелецФайла = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Объект.Ссылка, "ВладелецФайла"); + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьЭЦПИзФайла(Команда) + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(Объект.Ссылка); + + Если КомандыРаботыСФайлами.ДобавитьЭЦПИзФайла(ДанныеФайла, УникальныйИдентификатор) Тогда + УстановитьДоступностьЭлементовФормы(); + ЗаполнитьСписокПодписей(); + УстановитьДоступностьКомандСпискаЭЦП(); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьВместеСЭЦП(Команда) + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляСохранения(Объект.Ссылка); + КомандыРаботыСФайлами.СохранитьВместеСЭЦП(ДанныеФайла, УникальныйИдентификатор); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСертификат(Команда) + ОткрытьСертификатВыполнить(); +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьОднуПодпись(ДанныеСтроки, МенеджерКриптографии, Пароль) + + РасширениеПодключеноКрипто = ПодключитьРасширениеРаботыСКриптографией(); + + АдресПодписи = ДанныеСтроки.АдресПодписи; + + СтруктураВозврата = РаботаСФайлами.ПолучитьДанныеФайлаИДвоичныеДанные(Объект.Ссылка, + Неопределено, АдресПодписи); + ДвоичныеДанныеФайла = СтруктураВозврата.ДвоичныеДанные; + ДвоичныеДанныеПодписи = СтруктураВозврата.ДвоичныеДанныеПодписи; + + Попытка + Если Объект.Зашифрован Тогда + МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Пароль; + ДвоичныеДанныеФайла = МенеджерКриптографии.Расшифровать(ДвоичныеДанныеФайла); + КонецЕсли; + + МенеджерКриптографии.ПроверитьПодпись(ДвоичныеДанныеФайла, ДвоичныеДанныеПодписи); + + ДанныеСтроки.Статус = НСтр("ru = 'Верна'"); + ДанныеСтроки.Неверна = Ложь; + Исключение + ДанныеСтроки.Статус = НСтр("ru = 'Неверна. '"); + Инфо = ИнформацияОбОшибке(); + Если Инфо.Причина <> Неопределено Тогда + ДанныеСтроки.Статус = ДанныеСтроки.Статус + Инфо.Причина.Описание; + КонецЕсли; + ДанныеСтроки.Неверна = Истина; + КонецПопытки; + +КонецПроцедуры + +&НаСервере +Процедура ПроверитьОднуПодписьНаСервере(ДанныеСтроки, МенеджерКриптографии) + + АдресПодписи = ДанныеСтроки.АдресПодписи; + ДвоичныеДанныеФайла = Неопределено; + ДвоичныеДанныеПодписи = Неопределено; + + Если ТипЗнч(ДанныеСтроки.Объект) = Тип("СправочникСсылка.ВерсииФайлов") Тогда + + ВерсияСсылка = ДанныеСтроки.Объект; + СтруктураВозврата = РаботаСФайлами.ПолучитьДанныеФайлаИДвоичныеДанные(, ВерсияСсылка, АдресПодписи); + ДвоичныеДанныеФайла = СтруктураВозврата.ДвоичныеДанные; + ДвоичныеДанныеПодписи = СтруктураВозврата.ДвоичныеДанныеПодписи; + + КонецЕсли; + + Попытка + МенеджерКриптографии.ПроверитьПодпись(ДвоичныеДанныеФайла, ДвоичныеДанныеПодписи); + + ДанныеСтроки.Статус = НСтр("ru = 'Верна'"); + ДанныеСтроки.Неверна = Ложь; + Исключение + ДанныеСтроки.Статус = НСтр("ru = 'Неверна. '"); + Инфо = ИнформацияОбОшибке(); + Если Инфо.Причина <> Неопределено Тогда + ДанныеСтроки.Статус = ДанныеСтроки.Статус + Инфо.Причина.Описание; + КонецЕсли; + ДанныеСтроки.Неверна = Истина; + КонецПопытки; + +КонецПроцедуры + +&НаСервере +Процедура ПроверитьНаСервере() + + УстановитьПривилегированныйРежим(Истина); + ПровайдерЭЦП = Константы.ПровайдерЭЦП.Получить(); + ПутьМодуляКриптографии = РаботаСФайламиПовтИсп.ПутьМодуляКриптографии(); + ТипПровайдераЭЦП = Константы.ТипПровайдераЭЦП.Получить(); + АлгоритмПодписи = Константы.АлгоритмПодписи.Получить(); + АлгоритмХеширования = Константы.АлгоритмХеширования.Получить(); + АлгоритмШифрования = Константы.АлгоритмШифрования.Получить(); + УстановитьПривилегированныйРежим(Ложь); + + МенеджерКриптографии = Новый МенеджерКриптографии(ПровайдерЭЦП, ПутьМодуляКриптографии, ТипПровайдераЭЦП); + МенеджерКриптографии.АлгоритмПодписи = АлгоритмПодписи; + МенеджерКриптографии.АлгоритмХеширования = АлгоритмХеширования; + МенеджерКриптографии.АлгоритмШифрования = АлгоритмШифрования; + + Для Каждого Элемент Из Элементы.ТаблицаПодписей.ВыделенныеСтроки Цикл + ДанныеСтроки = ТаблицаПодписей.НайтиПоИдентификатору(Элемент); + + Если ДанныеСтроки.Объект <> Неопределено И (НЕ ДанныеСтроки.Объект.Пустая()) Тогда + ПроверитьОднуПодписьНаСервере(ДанныеСтроки, МенеджерКриптографии); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ПроверитьВсеНаСервере() + + УстановитьПривилегированныйРежим(Истина); + ПровайдерЭЦП = Константы.ПровайдерЭЦП.Получить(); + ПутьМодуляКриптографии = РаботаСФайламиПовтИсп.ПутьМодуляКриптографии(); + ТипПровайдераЭЦП = Константы.ТипПровайдераЭЦП.Получить(); + АлгоритмПодписи = Константы.АлгоритмПодписи.Получить(); + АлгоритмХеширования = Константы.АлгоритмХеширования.Получить(); + АлгоритмШифрования = Константы.АлгоритмШифрования.Получить(); + УстановитьПривилегированныйРежим(Ложь); + + МенеджерКриптографии = Новый МенеджерКриптографии(ПровайдерЭЦП, ПутьМодуляКриптографии, ТипПровайдераЭЦП); + МенеджерКриптографии.АлгоритмПодписи = АлгоритмПодписи; + МенеджерКриптографии.АлгоритмХеширования = АлгоритмХеширования; + МенеджерКриптографии.АлгоритмШифрования = АлгоритмШифрования; + + Для Каждого Строка Из ТаблицаПодписей Цикл + Если Строка.Объект <> Неопределено И (НЕ Строка.Объект.Пустая()) Тогда + ПроверитьОднуПодписьНаСервере(Строка, МенеджерКриптографии); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьПарольДляРасшифровки(Пароль) + Пароль = ""; + + Если Объект.Зашифрован Тогда + + ПредставленияСертификатов = ""; + Для Каждого СтруктураСертификата Из ДанныеФайла.МассивСертификатовШифрования Цикл + + Отпечаток = СтруктураСертификата.Отпечаток; + + ТолькоВЛичномХранилище = Истина; + Сертификат = ЭлектронноЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище); + Если Сертификат <> Неопределено Тогда // тут собираем только личные сертификаты - с закрытым ключом + Если НЕ ПустаяСтрока(ПредставленияСертификатов) Тогда + ПредставленияСертификатов = ПредставленияСертификатов + Символы.ПС; + КонецЕсли; + ПредставленияСертификатов = ПредставленияСертификатов + СтруктураСертификата.Представление; + КонецЕсли; + + КонецЦикла; + + Пароль = ""; + ЗаголовокФормы = НСтр("ru = 'Введите пароль для расшифровки'"); + ПараметрыФормы = Новый Структура("Заголовок, ПредставленияСертификатов, Файл", + ЗаголовокФормы, ПредставленияСертификатов, Объект.Ссылка); + КодВозврата = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВводПароляСОписаниями", ПараметрыФормы); + Если ТипЗнч(КодВозврата) = Тип("Строка") Тогда + Пароль = КодВозврата; + Иначе + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + Возврат Истина; +КонецФункции + +&НаКлиенте +Процедура Проверить(Команда) + + ВыполнятьПроверкуЭЦПНаСервере = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ВыполнятьПроверкуЭЦПНаСервере; + + Если ВыполнятьПроверкуЭЦПНаСервере И НЕ Объект.Зашифрован Тогда + ПроверитьНаСервере(); + Иначе + + ПолучитьДанныеФайлаЕслиНекорректны(); + + РасширениеПодключеноФайл = ПодключитьРасширениеРаботыСФайлами(); + РасширениеПодключеноКрипто = ПодключитьРасширениеРаботыСКриптографией(); + + МенеджерКриптографии = ЭлектронноЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + + Пароль = ""; + Если Не ПолучитьПарольДляРасшифровки(Пароль) Тогда + Возврат; + КонецЕсли; + + Для Каждого Элемент Из Элементы.ТаблицаПодписей.ВыделенныеСтроки Цикл + ДанныеСтроки = Элементы.ТаблицаПодписей.ДанныеСтроки(Элемент); + + Если ДанныеСтроки.Объект <> Неопределено И (НЕ ДанныеСтроки.Объект.Пустая()) Тогда + ПроверитьОднуПодпись(ДанныеСтроки, МенеджерКриптографии, Пароль); + КонецЕсли; + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьВсе(Команда) + + ВыполнятьПроверкуЭЦПНаСервере = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ВыполнятьПроверкуЭЦПНаСервере; + + Если ВыполнятьПроверкуЭЦПНаСервере И НЕ Объект.Зашифрован Тогда + ПроверитьВсеНаСервере(); + Иначе + + МенеджерКриптографии = ЭлектронноЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + + Пароль = ""; + Если Не ПолучитьПарольДляРасшифровки(Пароль) Тогда + Возврат; + КонецЕсли; + + Для Каждого Строка Из ТаблицаПодписей Цикл + Если Строка.Объект <> Неопределено И (НЕ Строка.Объект.Пустая()) Тогда + ПроверитьОднуПодпись(Строка, МенеджерКриптографии, Пароль); + КонецЕсли; + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Сохранить(Команда) + + Если Элементы.ТаблицаПодписей.ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Элементы.ТаблицаПодписей.ТекущиеДанные.Объект <> Неопределено И (НЕ Элементы.ТаблицаПодписей.ТекущиеДанные.Объект.Пустая()) Тогда + + АдресПодписи = Элементы.ТаблицаПодписей.ТекущиеДанные.АдресПодписи; + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если РасширениеПодключено Тогда + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); + Фильтр = НСтр("ru = 'Все файлы(*.p7s)|*.p7s'"); + ДиалогОткрытияФайла.Фильтр = Фильтр; + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файл для сохранения подписи'"); + + Если ДиалогОткрытияФайла.Выбрать() Тогда + + ПолныйПутьПодписи = ДиалогОткрытияФайла.ПолноеИмяФайла; + + Файл = Новый Файл(ПолныйПутьПодписи); + ПередаваемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(ПолныйПутьПодписи, АдресПодписи); + ПередаваемыеФайлы.Добавить(Описание); + + ПутьКФайлу = Файл.Путь; + Если Прав(ПутьКФайлу,1) <> "\" Тогда + ПутьКФайлу = ПутьКФайлу + "\"; + КонецЕсли; + + // Сохраним Файл из БД на диск + ПолучитьФайлы(ПередаваемыеФайлы,, ПутьКФайлу, Ложь); + + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Подпись сохранена в файл ""%1""'"), + ДиалогОткрытияФайла.ПолноеИмяФайла); + Состояние(Текст); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура УдалитьПодписиИОбновитьСписок(РеквизитПодписанИзменен) + + МассивВыделенныеСтроки = Новый Массив; + Для Каждого Элемент Из Элементы.ТаблицаПодписей.ВыделенныеСтроки Цикл + ДанныеСтроки = ТаблицаПодписей.НайтиПоИдентификатору(Элемент); + + Если ДанныеСтроки.Объект <> Неопределено И (НЕ ДанныеСтроки.Объект.Пустая()) Тогда + СтруктураПодписи = Новый Структура("Объект, НомерСтроки, УстановившийПодпись", + ДанныеСтроки.Объект, ДанныеСтроки.НомерСтроки, ДанныеСтроки.УстановившийПодпись); + МассивВыделенныеСтроки.Добавить(СтруктураПодписи); + КонецЕсли; + КонецЦикла; + + ЭлектронноЦифроваяПодпись.УдалитьПодписи(МассивВыделенныеСтроки, РеквизитПодписанИзменен); + ЗаполнитьСписокПодписей(); + +КонецПроцедуры + + +&НаКлиенте +Процедура Удалить(Команда) + + Если Вопрос(НСтр("ru = 'Удалить выделенные подписи?'"), РежимДиалогаВопрос.ДаНет) <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + РеквизитПодписанИзменен = Ложь; + УдалитьПодписиИОбновитьСписок(РеквизитПодписанИзменен); + + Если РеквизитПодписанИзменен Тогда + ОповеститьОбИзменении(Объект.Ссылка); + Прочитать(); + КонецЕсли; + + Оповестить("ПрисоединенныйФайлПодписан", Объект.ВладелецФайла); + + УстановитьДоступностьКомандСпискаЭЦП(); + УстановитьДоступностьЭлементовФормы(); + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ПОДСИСТЕМЫ СВОЙСТВ + +&НаКлиенте +Процедура Подключаемый_РедактироватьСоставСвойств() + + УправлениеСвойствамиКлиент.РедактироватьСоставСвойств(ЭтаФорма, Объект.Ссылка); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьЭлементыДополнительныхРеквизитов() + + УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтаФорма, РеквизитФормыВЗначение("Объект")); + +КонецПроцедуры + +&НаКлиенте +Процедура ВладелецПриИзменении(Элемент) + + ОбновитьПолныйПуть(); + +КонецПроцедуры + + +&НаКлиенте +Процедура ТаблицаПодписейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + ОткрытьСертификатВыполнить(); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСертификатВыполнить() + ЭлектронноЦифроваяПодписьКлиент.ОткрытьСертификат(Элементы.ТаблицаПодписей.ТекущиеДанные); +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьКомандСпискаЭЦП() + + ЕстьПодписи = (ТаблицаПодписей.Количество() <> 0); + + Элементы.ТаблицаПодписейПроверить.Доступность = ЕстьПодписи; + Элементы.ТаблицаПодписейПроверитьВсе.Доступность = ЕстьПодписи; + Элементы.ТаблицаПодписейОткрытьСертификат.Доступность = ЕстьПодписи; + Элементы.ТаблицаПодписейУдалить.Доступность = ЕстьПодписи; + Элементы.ТаблицаПодписейСохранить.Доступность = ЕстьПодписи; + +КонецПроцедуры + +&НаКлиенте +Процедура СертификатыШифрованияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + ОткрытьСертификатШифрованияВыполнить(); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСертификатШифрования(Команда) + ОткрытьСертификатШифрованияВыполнить(); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСертификатШифрованияВыполнить() + + Если Элементы.СертификатыШифрования.ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + РасширениеПодключеноФайл = ПодключитьРасширениеРаботыСФайлами(); + РасширениеПодключеноКрипто = ПодключитьРасширениеРаботыСКриптографией(); + + Отпечаток = Элементы.СертификатыШифрования.ТекущиеДанные.Отпечаток; + + СтруктураСертификата = ЭлектронноЦифроваяПодписьКлиент.ЗаполнитьСтруктуруСертификатаПоОтпечатку(Отпечаток); + Если СтруктураСертификата <> Неопределено Тогда + ПараметрыФормы = Новый Структура("СтруктураСертификата, Отпечаток", СтруктураСертификата, Отпечаток); + СтруктураВозврата = ОткрытьФормуМодально("Общаяформа.ФормаСертификатаЭЦП", ПараметрыФормы); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Папки/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Папки/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..c6e4fb805 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Папки/ExtInfo/ListSettings.dcss @@ -0,0 +1,21 @@ + + + + + false + DeletionMark + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..c6e4fb805 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,21 @@ + + + + + false + DeletionMark + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Form.form b/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Form.form new file mode 100644 index 000000000..3a500a1af --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Form.form @@ -0,0 +1,3497 @@ + + + + <key>ru</key> + <value>Файлы</value> + + + Группа + 29 + + Папки + 24 + true + true + + true + + + Папки + + false + None + ListSettings + OutputList + + Папка + 27 + + <key>ru</key> + <value>Папки</value> + + true + true + + true + + + Папки.Description + + + ПапкаРасширеннаяПодсказка + 183 + Label + true + true + + Left + + + + ПапкаКонтекстноеМеню + 28 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + None + + ПапкиКоманднаяПанель + 26 + Left + true + + + DragCheck + ПапкиПроверкаПеретаскивания + + + OnActivateRow + ПапкиПриАктивизацииСтроки + + + Drag + ПапкиПеретаскивание + + + ПапкиСтрокаПоиска + 174 + + ПапкиСтрокаПоискаРасширеннаяПодсказка + 176 + Label + true + true + + Left + + + + ПапкиСтрокаПоискаКонтекстноеМеню + 175 + true + + Папки + + true + + + + ПапкиСостояниеПросмотра + 177 + + ПапкиСостояниеПросмотраРасширеннаяПодсказка + 179 + Label + true + true + + Left + + + + ПапкиСостояниеПросмотраКонтекстноеМеню + 178 + true + + ViewStatusAddition + Папки + + true + + + + ПапкиУправлениеПоиском + 180 + + ПапкиУправлениеПоискомРасширеннаяПодсказка + 182 + Label + true + true + + Left + + + + ПапкиУправлениеПоискомКонтекстноеМеню + 181 + true + + SearchControlAddition + Папки + + true + + + + ПапкиРасширеннаяПодсказка + 173 + Label + true + true + + Left + + + + ПапкиКонтекстноеМеню + 25 + + ПапкиКонтекстноеМенюСоздать + 140 + + <key>ru</key> + <value>Создать новую папку</value> + + true + true + + true + + + ПапкиКонтекстноеМенюСоздатьРасширеннаяПодсказка + 166 + Label + true + true + + Left + + + Form.Item.Папки.StandardCommand.Create + Normal + Auto + true + true + UserCmds + + StdPicture.CreateFolder + + Auto + + + ПапкиКонтекстноеМенюСтандартные + 139 + true + true + + true + + + <key>ru</key> + <value>Папки контекстное меню стандартные</value> + + + ru + Папки контекстное меню стандартные + + + ПапкиКонтекстноеМенюСтандартныеРасширеннаяПодсказка + 167 + Label + true + true + + Left + + + + Item.Папки + + + + ПапкиКонтекстноеМенюКопироватьВБуферОбмена + 141 + true + true + + true + + + ПапкиКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка + 168 + Label + true + true + + Left + + + Form.Item.Папки.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаИмпорт + 114 + + КонтекстноеМенюПапкиИмпортФайлов + 63 + true + true + + true + + false + + КонтекстноеМенюПапкиИмпортФайловРасширеннаяПодсказка + 170 + Label + true + true + + Left + + + Form.Command.ИмпортФайлов + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюПапкиИмпортПапки + 82 + true + true + + true + + false + + КонтекстноеМенюПапкиИмпортПапкиРасширеннаяПодсказка + 171 + Label + true + true + + Left + + + Form.Command.ИмпортПапки + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюПапкиЭкспортПапки + 64 + true + true + + true + + false + + КонтекстноеМенюПапкиЭкспортПапкиРасширеннаяПодсказка + 172 + Label + true + true + + Left + + + Form.Command.ЭкспортПапки + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа импорт</value> + + + ru + Группа импорт + + + ГруппаИмпортРасширеннаяПодсказка + 169 + Label + true + true + + Left + + + + + + Tree + true + true + 10 + true + true + 4 + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + Auto + Auto + ExpandTopLevel + true + true + true + true + + Папки.ИндексКартинки + + + CommonPicture.Папки + + + Style.BorderColor + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + + + + Список + 6 + true + true + + true + + + Список + + true + false + None + Delete + ListSettings + OutputList + Refresh + + Подписан + 117 + + <key>ru</key> + <value>Подписан</value> + + true + true + + true + + + Список.Подписан + + None + + ru + Подписан + + + ПодписанРасширеннаяПодсказка + 228 + Label + true + true + + Left + + + + ПодписанКонтекстноеМеню + 118 + true + + PictureField + Enter + true + + CommonPicture.Подписан + + Left + true + + true + true + true + true + + CommonPicture.Подписан + + + + 1 + + + + + Зашифрован + 121 + + <key>ru</key> + <value>Зашифрован</value> + + true + true + + true + + + Список.Зашифрован + + None + + ru + Зашифрован + + + ЗашифрованРасширеннаяПодсказка + 230 + Label + true + true + + Left + + + + ЗашифрованКонтекстноеМеню + 122 + true + + PictureField + Enter + true + + CommonPicture.Зашифрован + + Left + true + + true + true + true + true + + CommonPicture.Зашифрован + + + + 1 + + + + + КартинкаИНаименование + 30 + + Картинка + 7 + true + true + + true + + + Список.ИндексКартинки + + + КартинкаРасширеннаяПодсказка + 233 + Label + true + true + + Left + + + + КартинкаКонтекстноеМеню + 5 + true + + PictureField + Enter + Left + true + Left + + 2 + true + 1 + true + true + true + + CommonPicture.ПиктограммыФайлов + + + 1 + + + + + Наименование + 9 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 235 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + КартинкаИНаименованиеРасширеннаяПодсказка + 232 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + Описание + 8 + true + true + + true + + + Список.Описание + + + ОписаниеРасширеннаяПодсказка + 237 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 13 + true + + InputField + Enter + true + Left + true + Left + + true + 1 + true + true + true + true + + Style.BorderColor + + Normal + + + + Редактирует + 18 + true + true + + true + + + Список.Редактирует + + + РедактируетРасширеннаяПодсказка + 239 + Label + true + true + + Left + + + + РедактируетКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ТекущаяВерсияКод + 31 + + <key>ru</key> + <value>Версия</value> + + true + true + + true + + + Список.ТекущаяВерсияНомерВерсии + + + ru + Номер версии + + + ТекущаяВерсияКодРасширеннаяПодсказка + 241 + Label + true + true + + Left + + + + ТекущаяВерсияКодКонтекстноеМеню + 32 + true + + InputField + Enter + true + Left + true + + 4 + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ТекущаяВерсияДатаСоздания + 14 + + <key>ru</key> + <value>Дата</value> + + true + true + + true + + + Список.ТекущаяВерсияДатаСоздания + + + ru + Дата реадктирования версии + + + ТекущаяВерсияДатаСозданияРасширеннаяПодсказка + 243 + Label + true + true + + Left + + + + ТекущаяВерсияДатаСозданияКонтекстноеМеню + 15 + true + + InputField + Enter + true + Left + true + Left + + 8 + true + true + + ru + ДФ=dd.MM.yyyy + + + ru + ДФ=dd.MM.yyyy + + true + true + true + + Style.BorderColor + + Normal + + + + ТекущаяВерсияАвтор + 55 + + <key>ru</key> + <value>Отредактировал</value> + + true + true + + true + + + Список.ТекущаяВерсияАвтор + + + ТекущаяВерсияАвторРасширеннаяПодсказка + 245 + Label + true + true + + Left + + + + ТекущаяВерсияАвторКонтекстноеМеню + 56 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТекущаяВерсияРазмер + 88 + + <key>ru</key> + <value>Размер (Кб)</value> + + true + true + + true + + + Список.Размер + + + ru + Размер текущей версии + + + ТекущаяВерсияРазмерРасширеннаяПодсказка + 247 + Label + true + true + + Left + + + + ТекущаяВерсияРазмерКонтекстноеМеню + 89 + true + + LabelField + Enter + true + Left + true + + true + true + + ru + ЧЦ=10; ЧН=0 + + + + + Автор + 20 + + <key>ru</key> + <value>Автор</value> + + true + true + + true + + + Список.Автор + + + АвторРасширеннаяПодсказка + 249 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 21 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ХранитьВерсии + 59 + true + true + + + Список.ХранитьВерсии + + + ХранитьВерсииРасширеннаяПодсказка + 251 + Label + true + true + + Left + + + + ХранитьВерсииКонтекстноеМеню + 60 + true + + CheckBoxField + Enter + true + Left + true + + + + РедактируетТекущийПользователь + 61 + true + true + + + Список.РедактируетТекущийПользователь + + + РедактируетТекущийПользовательРасширеннаяПодсказка + 253 + Label + true + true + + Left + + + + РедактируетТекущийПользовательКонтекстноеМеню + 62 + true + + CheckBoxField + Enter + true + Left + true + + + + Ссылка + 115 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 255 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 116 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 23 + Left + true + + + DragCheck + СписокПроверкаПеретаскивания + + + Selection + СписокВыбор + + + BeforeAddRow + СписокПередНачаломДобавления + + + OnActivateRow + СписокПриАктивизацииСтроки + + + Drag + СписокПеретаскивание + + + BeforeRowChange + СписокПередНачаломИзменения + + + СписокСтрокаПоиска + 219 + + СписокСтрокаПоискаРасширеннаяПодсказка + 221 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 220 + true + + Список + + true + + + + СписокСостояниеПросмотра + 222 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 224 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 223 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 225 + + СписокУправлениеПоискомРасширеннаяПодсказка + 227 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 226 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 218 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 4 + + КонтекстноеМенюСписокСоздать + 96 + true + true + + true + + false + + КонтекстноеМенюСписокСоздатьРасширеннаяПодсказка + 193 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Create + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаСтандартныхКоманд + 95 + true + true + + true + + + <key>ru</key> + <value>Группа стандартных команд</value> + + + ru + Группа стандартных команд + + + ГруппаСтандартныхКомандРасширеннаяПодсказка + 194 + Label + true + true + + Left + + + + Item.Список + + + + ГруппаКопировать + 97 + + КонтекстноеМенюСписокКопироватьВБуферОбмена + 98 + true + true + + true + + false + + КонтекстноеМенюСписокКопироватьВБуферОбменаРасширеннаяПодсказка + 196 + Label + true + true + + Left + + + Form.Item.Папки.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа копировать</value> + + + ru + Группа копировать + + + ГруппаКопироватьРасширеннаяПодсказка + 195 + Label + true + true + + Left + + + + + + КонтекстноеМенюСписокОткрытьФайл + 65 + true + true + + true + + false + + КонтекстноеМенюСписокОткрытьФайлРасширеннаяПодсказка + 197 + Label + true + true + + Left + + + Form.Command.ОткрытьФайл + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокРедактировать + 66 + true + true + + true + + false + + КонтекстноеМенюСписокРедактироватьРасширеннаяПодсказка + 198 + Label + true + true + + Left + + + Form.Command.Редактировать + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокЗакончитьРедактирование + 67 + true + true + + true + + false + + КонтекстноеМенюСписокЗакончитьРедактированиеРасширеннаяПодсказка + 199 + Label + true + true + + Left + + + Form.Command.ЗакончитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокЗанять + 68 + true + true + + true + + false + + КонтекстноеМенюСписокЗанятьРасширеннаяПодсказка + 200 + Label + true + true + + Left + + + Form.Command.Занять + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСохранитьИзменения + 70 + true + true + + true + + false + + КонтекстноеМенюСписокСохранитьИзмененияРасширеннаяПодсказка + 201 + Label + true + true + + Left + + + Form.Command.СохранитьИзменения + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокОткрытьКаталогФайла + 71 + true + true + + true + + false + + КонтекстноеМенюСписокОткрытьКаталогФайлаРасширеннаяПодсказка + 202 + Label + true + true + + Left + + + Form.Command.ОткрытьКаталогФайла + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСохранитьКак + 72 + true + true + + true + + false + + КонтекстноеМенюСписокСохранитьКакРасширеннаяПодсказка + 203 + Label + true + true + + Left + + + Form.Command.СохранитьКак + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокОсвободить + 69 + + <key>ru</key> + <value>Отменить редактирование</value> + + true + true + + true + + false + + КонтекстноеМенюСписокОсвободитьРасширеннаяПодсказка + 204 + Label + true + true + + Left + + + Form.Command.Освободить + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокПеренестиВРаздел + 83 + true + true + + true + + false + + КонтекстноеМенюСписокПеренестиВРазделРасширеннаяПодсказка + 205 + Label + true + true + + Left + + + Form.Command.ПеренестиВПапку + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокОбновитьИзФайлаНаДиске + 91 + true + true + + true + + false + + КонтекстноеМенюСписокОбновитьИзФайлаНаДискеРасширеннаяПодсказка + 206 + Label + true + true + + Left + + + Form.Command.ОбновитьИзФайлаНаДиске + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаКомандИмпорта + 94 + + КонтекстноеМенюСписокИмпортФайлов + 93 + true + true + + true + + false + + КонтекстноеМенюСписокИмпортФайловРасширеннаяПодсказка + 208 + Label + true + true + + Left + + + Form.Command.ИмпортФайлов + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокИмпортПапки + 92 + true + true + + true + + false + + КонтекстноеМенюСписокИмпортПапкиРасширеннаяПодсказка + 209 + Label + true + true + + Left + + + Form.Command.ИмпортПапки + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа команд импорта</value> + + + ru + Группа команд импорта + + + ГруппаКомандИмпортаРасширеннаяПодсказка + 207 + Label + true + true + + Left + + + + + + ФормаЭЦПИШифрованиеКонтекстное + 130 + + ФормаГруппаЭЦПКонтекст + 131 + + ФормаПодписатьКонтекст + 132 + true + true + + true + + + ФормаПодписатьКонтекстРасширеннаяПодсказка + 212 + Label + true + true + + Left + + + Form.Command.Подписать + Normal + Auto + true + true + UserCmds + Auto + + + ФормаДобавитьЭЦПИзФайлаКонтекст + 134 + true + true + + true + + + ФормаДобавитьЭЦПИзФайлаКонтекстРасширеннаяПодсказка + 213 + Label + true + true + + Left + + + Form.Command.ДобавитьЭЦПИзФайла + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСохранитьВместеСЭЦПКонтекст + 135 + true + true + + true + + + ФормаСохранитьВместеСЭЦПКонтекстРасширеннаяПодсказка + 214 + Label + true + true + + Left + + + Form.Command.СохранитьВместеСЭЦП + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>ЭЦП</value> + + + ru + Форма группа ЭЦП + + + ФормаГруппаЭЦПКонтекстРасширеннаяПодсказка + 211 + Label + true + true + + Left + + + + + + ФормаГруппаШифрованиеКонтекст + 136 + + ФормаЗашифроватьКонтекст + 137 + true + true + + true + + + ФормаЗашифроватьКонтекстРасширеннаяПодсказка + 216 + Label + true + true + + Left + + + Form.Command.Зашифровать + Normal + Auto + true + true + UserCmds + Auto + + + ФормаРасшифроватьКонтекст + 138 + true + true + + true + + + ФормаРасшифроватьКонтекстРасширеннаяПодсказка + 217 + Label + true + true + + Left + + + Form.Command.Расшифровать + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Шифрование</value> + + + ru + Форма группа шифрование + + + ФормаГруппаШифрованиеКонтекстРасширеннаяПодсказка + 215 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>ЭЦП и шифрование</value> + + + ru + Форма ЭЦПИШифрование + + + ФормаЭЦПИШифрованиеКонтекстноеРасширеннаяПодсказка + 210 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + Tree + true + true + 48 + true + true + 10 + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + true + + Style.BorderColor + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
    + true + true + + true + + + ГруппаРасширеннаяПодсказка + 165 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + +
    + + ГруппаПоиск + 53 + + Поиск + 51 + + <key>ru</key> + <value>Быстрый поиск файлов и папок</value> + + true + true + + true + + + СтрокаПоиска + + + OnChange + ПоискПриИзменении + + + ПоискРасширеннаяПодсказка + 266 + Label + true + true + + Left + + + + ПоискКонтекстноеМеню + 52 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + Normal + + + + Найти + 54 + true + true + + true + + false + + НайтиРасширеннаяПодсказка + 268 + Label + true + true + + Left + + + UsualButton + Form.Command.Найти + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ru + Группа поиск + + false + + ГруппаПоискРасширеннаяПодсказка + 265 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + СоздатьФайл + 87 + true + true + + true + + false + + СоздатьФайлРасширеннаяПодсказка + 142 + Label + true + true + + Left + + + Form.Command.СоздатьФайл + Normal + Auto + true + true + UserCmds + Auto + + + Создать + 86 + true + true + + true + + false + + СоздатьРасширеннаяПодсказка + 143 + Label + true + true + + Left + + + Form.Command.СоздатьПапку + Normal + Picture + true + true + UserCmds + + StdPicture.CreateFolder + + Auto + + + ГруппаКомандФайлов + 74 + + ОткрытьФайл + 73 + true + true + + true + + false + + ОткрытьФайлРасширеннаяПодсказка + 145 + Label + true + true + + Left + + + Form.Command.ОткрытьФайл + Normal + Picture + true + true + UserCmds + Auto + + + Редактировать + 75 + true + true + + true + + false + + РедактироватьРасширеннаяПодсказка + 146 + Label + true + true + + Left + + + Form.Command.Редактировать + Normal + PictureAndText + true + true + UserCmds + Auto + + + ЗакончитьРедактирование + 76 + true + true + + true + + false + + ЗакончитьРедактированиеРасширеннаяПодсказка + 147 + Label + true + true + + Left + + + Form.Command.ЗакончитьРедактирование + Normal + PictureAndText + true + true + UserCmds + Auto + + + Занять + 77 + true + true + + true + + false + + ЗанятьРасширеннаяПодсказка + 148 + Label + true + true + + Left + + + Form.Command.Занять + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ОткрытьКаталогФайла + 80 + true + true + + true + + false + + ОткрытьКаталогФайлаРасширеннаяПодсказка + 149 + Label + true + true + + Left + + + Form.Command.ОткрытьКаталогФайла + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Освободить + 78 + + <key>ru</key> + <value>Отменить редактирование</value> + + true + true + + true + + false + + ОсвободитьРасширеннаяПодсказка + 150 + Label + true + true + + Left + + + Form.Command.Освободить + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьИзменения + 79 + true + true + + true + + false + + СохранитьИзмененияРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + Form.Command.СохранитьИзменения + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьКак + 81 + true + true + + true + + false + + СохранитьКакРасширеннаяПодсказка + 152 + Label + true + true + + Left + + + Form.Command.СохранитьКак + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ПеренестиВРаздел + 84 + true + true + + true + + false + + ПеренестиВРазделРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + Form.Command.ПеренестиВПапку + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ОбновитьИзФайлаНаДиске + 90 + true + true + + true + + false + + ОбновитьИзФайлаНаДискеРасширеннаяПодсказка + 154 + Label + true + true + + Left + + + Form.Command.ОбновитьИзФайлаНаДиске + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Группа команд файлов</value> + + + ru + Группа команд файлов + + + ГруппаКомандФайловРасширеннаяПодсказка + 144 + Label + true + true + + Left + + + + + + ФормаЭЦПИШифрование + 129 + + ФормаГруппаЭЦП + 119 + + ФормаПодписать + 120 + true + true + + true + + + ФормаПодписатьРасширеннаяПодсказка + 157 + Label + true + true + + Left + + + Form.Command.Подписать + Normal + Auto + true + true + UserCmds + Auto + + + ФормаДобавитьЭЦПИзФайла + 127 + true + true + + true + + + ФормаДобавитьЭЦПИзФайлаРасширеннаяПодсказка + 158 + Label + true + true + + Left + + + Form.Command.ДобавитьЭЦПИзФайла + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСохранитьВместеСЭЦП + 128 + true + true + + true + + + ФормаСохранитьВместеСЭЦПРасширеннаяПодсказка + 159 + Label + true + true + + Left + + + Form.Command.СохранитьВместеСЭЦП + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>ЭЦП</value> + + + ru + Форма группа ЭЦП + + + ФормаГруппаЭЦПРасширеннаяПодсказка + 156 + Label + true + true + + Left + + + + + + ФормаГруппаШифрование + 124 + + ФормаЗашифровать + 123 + true + true + + true + + + ФормаЗашифроватьРасширеннаяПодсказка + 161 + Label + true + true + + Left + + + Form.Command.Зашифровать + Normal + Auto + true + true + UserCmds + Auto + + + ФормаРасшифровать + 125 + true + true + + true + + + ФормаРасшифроватьРасширеннаяПодсказка + 162 + Label + true + true + + Left + + + Form.Command.Расшифровать + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Шифрование</value> + + + ru + Форма группа шифрование + + + ФормаГруппаШифрованиеРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>ЭЦП и шифрование</value> + + + ru + Форма ЭЦПИШифрование + + + ФормаЭЦПИШифрованиеРасширеннаяПодсказка + 155 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + ГруппаКомандФормы + 85 + + ИспользоватьИерархию + 99 + true + true + + true + + false + + ИспользоватьИерархиюРасширеннаяПодсказка + 164 + Label + true + true + + Left + + + Form.Command.ИспользоватьИерархию + Normal + Picture + true + true + UserCmds + true + + CommonPicture.ИерархическийСписок + + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа команд формы</value> + + + ru + Группа команд формы + + + ГруппаКомандФормыРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + + Form + + + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + + OnClose + ПриЗакрытии + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + Create + DontBlock + Use + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.ГлавныйФайл + + + Список.Автор + + + Список.ВладелецФайла + + + Список.Зашифрован + + + Список.Подписан + + + Список.Редактирует + + + Список.РедактируетТекущийПользователь + + + Список.ХранитьВерсии + +
    true
    + + ВЫБРАТЬ + Файлы.Код, + Файлы.Редактирует, + Файлы.ДатаСоздания, + Файлы.ТекущаяВерсияНомерВерсии, + Файлы.ТекущаяВерсияРазмер / 1024 КАК Размер, + Файлы.Автор, + Файлы.ТекущаяВерсияДатаСоздания, + ВЫБОР + КОГДА Файлы.ПометкаУдаления = ИСТИНА + ТОГДА Файлы.ИндексКартинки + 1 + ИНАЧЕ Файлы.ИндексКартинки + КОНЕЦ КАК ИндексКартинки, + Файлы.Наименование, + ПОДСТРОКА(Файлы.Описание, 0, 140) КАК Описание, + Файлы.Ссылка, + Файлы.ТекущаяВерсияАвтор, + Файлы.ПометкаУдаления, + Файлы.ХранитьВерсии, + Файлы.ВладелецФайла, + ВЫБОР + КОГДА Файлы.Редактирует = &ТекущийПользователь + ТОГДА ИСТИНА + ИНАЧЕ ЛОЖЬ + КОНЕЦ КАК РедактируетТекущийПользователь, + Файлы.Подписан, + Файлы.Зашифрован +ИЗ + Справочник.Файлы КАК Файлы +ГДЕ + (Файлы.ВладелецФайла = &Владелец + ИЛИ (НЕ &ИспользоватьИерархию) + И Файлы.ВладелецФайла ССЫЛКА Справочник.ПапкиФайлов) + Catalog.Файлы + true + true + true + true + true + +
    + + Папки + + <key>ru</key> + <value>Папки</value> + + 3 + + DynamicList + + + true + + + true + + + Папки.ИндексКартинки + + + ВЫБРАТЬ + ПапкиФайлов.Ссылка, + ПапкиФайлов.ПометкаУдаления, + ПапкиФайлов.Предопределенный, + ПапкиФайлов.Родитель, + ПапкиФайлов.Код, + ПапкиФайлов.Наименование, + ПапкиФайлов.Описание, + ПапкиФайлов.Ответственный, + ПапкиФайлов.ДатаСоздания, + ПапкиФайлов.Представление, + Выбор + Когда ПометкаУдаления = Истина Тогда 1 + Иначе 0 + Конец как ИндексКартинки +ИЗ + Справочник.ПапкиФайлов КАК ПапкиФайлов + Catalog.ПапкиФайлов + true + true + true + true + true + + + + СтрокаПоиска + + <key>ru</key> + <value>Строка поиска</value> + + 2 + + String + + + + true + + + true + + + + ПапкаПриОткрытии + + <key>ru</key> + <value>Папка при открытии</value> + + 4 + + CatalogRef.ПапкиФайлов + + + 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> + + 7 + + ru + Экспорт папки + + + true + + + StdPicture.Write + + + + ЭкспортПапкиВыполнить + + + Auto + Auto + + + Найти + + <key>ru</key> + <value>Найти</value> + + 2 + + ru + Найти файлы или папки по названию или коду + + + true + + + + НайтиВыполнить + + + Picture + Auto + Auto + + + СоздатьФайл + + <key>ru</key> + <value>Создать</value> + + 3 + + ru + Создать новый файл (Ins) + + + true + + + StdPicture.CreateListItem + + + + СоздатьФайлВыполнить + + + TextPicture + Auto + Auto + + + СоздатьПапку + + <key>ru</key> + <value>Создать новую папку</value> + + 4 + + ru + Создать новую папку (Ins) + + + true + + + StdPicture.CreateFolder + + + + СоздатьПапкуВыполнить + + + Auto + Auto + + + ЗакончитьРедактирование + + <key>ru</key> + <value>Закончить редактирование</value> + + 5 + + ru + Сохранить и освободить файл в информационной базе + + + true + + + CommonPicture.КартинкаЗакончитьРедактирование + + + + ЗакончитьРедактирование + + + TextPicture + Auto + Auto + + + Занять + + <key>ru</key> + <value>Занять</value> + + 6 + + ru + Пометить файл как занятый для редактирования + + + true + + + CommonPicture.КартинкаЗанять + + + + Занять + + + TextPicture + Auto + Auto + + + Освободить + + <key>ru</key> + <value>Освободить</value> + + 8 + + ru + Освободить занятый файл + + + true + + + CommonPicture.КартинкаОсвободить + + + + Освободить + + + TextPicture + Auto + Auto + + + ОткрытьКаталогФайла + + <key>ru</key> + <value>Открыть каталог файла</value> + + 9 + + ru + Открыть каталог файла + + + true + + + + ОткрытьКаталогФайла + + + TextPicture + Auto + Auto + + + ОткрытьФайл + + <key>ru</key> + <value>Просмотреть</value> + + 10 + + ru + Открыть файл для просмотра + + + true + + + CommonPicture.КартинкаОткрыть + + + + ОткрытьФайлВыполнить + + + TextPicture + Auto + Auto + + + Редактировать + + <key>ru</key> + <value>Редактировать</value> + + 11 + + ru + Занять файл и открыть для редактирования + + + true + + F4 + + CommonPicture.КартинкаРедактировать + + + + Редактировать + + + TextPicture + Auto + Auto + + + СохранитьИзменения + + <key>ru</key> + <value>Сохранить изменения</value> + + 12 + + ru + Сохранить измененный файл в информационной базе + + + true + + + CommonPicture.КартинкаОпубликовать + + + + СохранитьИзменения + + + TextPicture + Auto + Auto + + + СохранитьКак + + <key>ru</key> + <value>Сохранить как...</value> + + 13 + + ru + Сохранить файл на диск или другое устройство + + + true + + + CommonPicture.КартинкаСохранитьКак + + + + СохранитьКак + + + TextPicture + Auto + Auto + + + ИмпортПапки + + <key>ru</key> + <value>Импорт каталога...</value> + + 14 + + ru + Импорт каталога + + + true + + + + ИмпортПапки + + + Auto + Auto + + + ПеренестиВПапку + + <key>ru</key> + <value>Перенести в папку</value> + + 15 + + ru + Перенести в папку + + + true + + + + ПеренестиВПапку + + + Auto + Auto + + + ОбновитьИзФайлаНаДиске + + <key>ru</key> + <value>Обновить из файла на диске...</value> + + 16 + + ru + Обновить из файла на диске + + + true + + + + ОбновитьИзФайлаНаДиске + + + Text + Auto + Auto + + + ИспользоватьИерархию + + <key>ru</key> + <value>Использовать иерархию</value> + + 17 + + ru + Использовать иерархию + + + true + + + + ИспользоватьИерархию + + + Auto + Auto + + + Подписать + + <key>ru</key> + <value>Подписать</value> + + 18 + + ru + Подписать + + + true + + + CommonPicture.Подписан + + + + Подписать + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + Зашифровать + + <key>ru</key> + <value>Зашифровать</value> + + 19 + + ru + Зашифровать + + + true + + + CommonPicture.Зашифрован + + + + Зашифровать + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + Расшифровать + + <key>ru</key> + <value>Расшифровать</value> + + 20 + + ru + Расшифровать + + + true + + + + Расшифровать + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + ДобавитьЭЦПИзФайла + + <key>ru</key> + <value>Добавить ЭЦП из файла</value> + + 22 + + ru + Добавить ЭЦПИз файла + + + true + + + + ДобавитьЭЦПИзФайла + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + СохранитьВместеСЭЦП + + <key>ru</key> + <value>Сохранить вместе с ЭЦП</value> + + 23 + + ru + Сохранить вместе СЭЦП + + + true + + + + СохранитьВместеСЭЦП + + + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Auto + Auto + + + + + + 0 + FormCommandBarImportant + 0 + + + + +
    diff --git a/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Help/ru.html new file mode 100644 index 000000000..118495214 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Help/ru.html @@ -0,0 +1,5 @@ + +

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

    +

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

    +

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

    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Module.bsl new file mode 100644 index 000000000..62ad97943 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Module.bsl @@ -0,0 +1,988 @@ +&НаКлиенте +Перем ПерваяАктивизация; + + +&НаКлиенте +Процедура ИмпортФайловВыполнить() + #Если Не ВебКлиент Тогда + + // заранее выбираем файлы (до открытия диалога импорта) + Режим = РежимДиалогаВыбораФайла.Открытие; + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.Фильтр = Фильтр; + ДиалогОткрытияФайла.МножественныйВыбор = Истина; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файлы'"); + Если ДиалогОткрытияФайла.Выбрать() Тогда + МассивИменФайлов = Новый Массив; + + МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; + Для Каждого ИмяФайла Из МассивФайлов Цикл + МассивИменФайлов.Добавить(ИмяФайла); + КонецЦикла; + + ПараметрыИмпорта = Новый Структура("ПапкаДляДобавления, МассивИменФайлов", Элементы.Папки.ТекущаяСтрока, МассивИменФайлов); + ОткрытьФорму("Справочник.Файлы.Форма.ФормаИмпортаФайлов", ПараметрыИмпорта); + КонецЕсли; + #Иначе + Предупреждение(НСтр("ru = 'В Веб-клиенте импорт файлов не поддерживается. Используйте команду ""Создать"" в списке файлов.'")); + #КонецЕсли +КонецПроцедуры + +&НаКлиенте +Процедура ИмпортПапки(Команда) + #Если Не ВебКлиент Тогда + + // заранее выбираем каталог на диске (до открытия диалога импорта) + Каталог = ""; + Режим = РежимДиалогаВыбораФайла.ВыборКаталога; + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.Фильтр = Фильтр; + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите каталог'"); + Если ДиалогОткрытияФайла.Выбрать() Тогда + КаталогНаДиске = ДиалогОткрытияФайла.Каталог; + ПараметрыИмпорта = Новый Структура("ПапкаДляДобавления, КаталогНаДиске", Элементы.Папки.ТекущаяСтрока, КаталогНаДиске); + ОткрытьФорму("Справочник.Файлы.Форма.ФормаИмпортаПапки", ПараметрыИмпорта); + КонецЕсли; + #Иначе + Предупреждение(НСтр("ru = 'В Веб-клиенте импорт папок не поддерживается. Используйте команду ""Создать"" в списке файлов.'")); + #КонецЕсли +КонецПроцедуры + +// Обработка события "Выбор" у "Список" +// +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Если ТипЗнч(ВыбраннаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Возврат; + КонецЕсли; + + + СтандартнаяОбработка = Ложь; + + КакОткрывать = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ДействиеПоДвойномуЩелчкуМыши; + + Если КакОткрывать = "ОткрыватьКарточку" Тогда + ОткрытьЗначение(ВыбраннаяСтрока); + Возврат; + КонецЕсли; + + РаботаСФайламиКлиент.ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + Если ИмяКаталога = Неопределено ИЛИ ПустаяСтрока(ИмяКаталога) Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия(ВыбраннаяСтрока, Неопределено, УникальныйИдентификатор); + + // Если уже занят для редактирования, то не спрашивать - сразу открывать + Если ДанныеФайла.Редактирует.Пустая() Тогда + СпрашиватьРежимРедактированияПриОткрытииФайла = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().СпрашиватьРежимРедактированияПриОткрытииФайла; + Если СпрашиватьРежимРедактированияПриОткрытииФайла = Истина Тогда + + Результат = ОткрытьФормуМодально("Справочник.Файлы.Форма.ФормаВыбораРежимаОткрытия"); + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + БольшеНеСпрашивать = Результат.БольшеНеСпрашивать; + Если БольшеНеСпрашивать = Истина Тогда + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("НастройкиОткрытияФайлов", "СпрашиватьРежимРедактированияПриОткрытииФайла", Ложь); + ОбновитьПовторноИспользуемыеЗначения(); + КонецЕсли; + + КакОткрывать = Результат.КакОткрывать; + Если КакОткрывать = 1 Тогда + РаботаСФайламиКлиент.РедактироватьФайл(ДанныеФайла, УникальныйИдентификатор); + ОповеститьОбИзменении(ДанныеФайла.Ссылка); + УстановитьДоступностьФайловыхКомманд(); + Возврат; + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, УникальныйИдентификатор); + +КонецПроцедуры + +// Обработка события "ПередНачаломДобавления" у "Список" +// +&НаКлиенте +Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Если Элементы.Папки.ТекущаяСтрока = Неопределено Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + Если Элементы.Папки.ТекущаяСтрока.Пустая() Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + ВладелецФайла = Элементы.Папки.ТекущаяСтрока; + ФайлОснование = Элементы.Список.ТекущаяСтрока; + + Отказ = Истина; + + Если Не Копирование Тогда + + Попытка + РаботаСФайламиКлиент.СозданиеНовогоФайла(ВладелецФайла, ЭтаФорма); + Исключение + Инфо = ИнформацияОбОшибке(); + Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка создания нового файла: %1'"), + Инфо.Описание )); + КонецПопытки; + + Иначе + + РаботаСФайламиКлиент.СкопироватьФайл(ВладелецФайла, ФайлОснование); + + КонецЕсли; + +КонецПроцедуры + +// Обработка события "ПриАктивизацииСтроки" у "Папки" +&НаКлиенте +Процедура ПапкиПриАктивизацииСтроки(Элемент) + + Если Элементы.Папки.ТекущаяСтрока = Неопределено ИЛИ Элементы.Папки.ТекущаяСтрока.Пустая() Тогда + Элементы.СоздатьФайл.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокСоздать.Доступность = Ложь; + Иначе + Элементы.СоздатьФайл.Доступность = Истина; + Элементы.КонтекстноеМенюСписокСоздать.Доступность = Истина; + КонецЕсли; + + Если ПерваяАктивизация = Истина ИЛИ ПерваяАктивизация = Неопределено Тогда + ПерваяАктивизация = Ложь; + Возврат; + КонецЕсли; + + Если Элементы.Папки.ТекущаяСтрока <> Неопределено Тогда + ПодключитьОбработчикОжидания("ОбработкаОжидания", 0.2, Истина); + КонецЕсли; + +КонецПроцедуры + +// Процедура обновляет правый список +&НаКлиенте +Процедура ОбработкаОжидания() + Если Элементы.Папки.ТекущаяСтрока <> Список.Параметры.Элементы.Найти("Владелец").Значение Тогда + Список.Параметры.УстановитьЗначениеПараметра( + "Владелец", Элементы.Папки.ТекущаяСтрока); + КонецЕсли; +КонецПроцедуры + +// Процедура обеспечивает вызов механизма экспорта папки в файловую систему +&НаКлиенте +Процедура ЭкспортПапкиВыполнить() + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПапкаЭкспорта", Элементы.Папки.ТекущаяСтрока); + ОткрытьФорму("Справочник.Файлы.Форма.ФормаЭкспортаПапки", ПараметрыФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "ИмпортФайловЗавершен" Тогда + Элементы.Список.Обновить(); + + Если Параметр <> Неопределено Тогда + Элементы.Список.ТекущаяСтрока = Параметр; + КонецЕсли; + КонецЕсли; + + Если ИмяСобытия = "ИмпортКаталоговЗавершен" Тогда + Элементы.Папки.Обновить(); + Элементы.Список.Обновить(); + + Если Параметр <> Неопределено Тогда + Элементы.Папки.ТекущаяСтрока = Параметр; + КонецЕсли; + КонецЕсли; + + Если ИмяСобытия = "СозданФайл" Тогда + + Если Параметр <> Неопределено Тогда + ВладелецФайла = Неопределено; + Если Параметр.Свойство("Владелец", ВладелецФайла) Тогда + Если ВладелецФайла = Элементы.Папки.ТекущаяСтрока Тогда + Элементы.Список.Обновить(); + + ФайлСозданный = Неопределено; + Если Параметр.Свойство("Файл", ФайлСозданный) Тогда + Элементы.Список.ТекущаяСтрока = ФайлСозданный; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если ИмяСобытия = "ДанныеФайлаИзменены" Тогда + УстановитьДоступностьФайловыхКомманд(); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура НайтиВыполнить() + Если СтрокаПоиска = "" Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не указан текст для поиска.'"), , "СтрокаПоиска"); + Возврат; + КонецЕсли; + + НайтиФайлыИлиПапки(); +КонецПроцедуры + +&НаКлиенте +Процедура ПоискПриИзменении(Элемент) + НайтиФайлыИлиПапки(); +КонецПроцедуры + +&НаКлиенте +Процедура НайтиФайлыИлиПапки() + + Если СтрокаПоиска = "" Тогда + Возврат; + КонецЕсли; + + Результат = НайтиФайлыИлиПапкиСервер(); + Если Результат = "НичегоНеНайдено" Тогда + Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось найти файл или папку, наименование или код которого содержит ""%1"".'"), + СтрокаПоиска )); + Иначе + Если Результат = "НайденФайл" Тогда + ТекущийЭлемент = Элементы.Список; + Иначе + Если Результат = "НайденаПапка" Тогда + ТекущийЭлемент = Элементы.Папки; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Элементы.Папки.Обновить(); + Элементы.Список.Обновить(); +КонецПроцедуры + +&НаСервере +Функция СтрЗаменитьСпецсимволом(Строка, Символ, Спецсимвол) + СтрокаНовая = СтрЗаменить(Строка, Символ, СпецСимвол + Символ); + Возврат СтрокаНовая; +КонецФункции + +&НаСервере +Функция НайтиФайлыИлиПапкиСервер() + + Перем НайденныйФайл; + Перем НайденнаяПапка; + + Найдено = Ложь; + + Запрос = Новый Запрос; + + СтрокаПоискаНовая = СтрокаПоиска; + + СпецСимвол = "|"; + СтрокаПоискаНовая = СтрЗаменитьСпецсимволом(СтрокаПоискаНовая, "[", СпецСимвол); + СтрокаПоискаНовая = СтрЗаменитьСпецсимволом(СтрокаПоискаНовая, "]", СпецСимвол); + + Запрос.Параметры.Вставить("Строка", "%" + СтрокаПоискаНовая + "%"); + + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 + | Файлы.Ссылка + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.ПолноеНаименование ПОДОБНО &Строка СПЕЦСИМВОЛ ""|"""; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + НайденныйФайл = Выборка.Ссылка; + Найдено = Истина; + КонецЕсли; + + Если Не Найдено Тогда + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 + | Файлы.Ссылка + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.Код ПОДОБНО &Строка"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + НайденныйФайл = Выборка.Ссылка; + Найдено = Истина; + КонецЕсли; + КонецЕсли; + + Если Не Найдено Тогда + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 + | ПапкиФайлов.Ссылка + |ИЗ + | Справочник.ПапкиФайлов КАК ПапкиФайлов + |ГДЕ + | ПапкиФайлов.Наименование ПОДОБНО &Строка"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + НайденнаяПапка = Выборка.Ссылка; + Найдено = Истина; + КонецЕсли; + КонецЕсли; + + Если Не Найдено Тогда + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 + | ПапкиФайлов.Ссылка + |ИЗ + | Справочник.ПапкиФайлов КАК ПапкиФайлов + |ГДЕ + | ПапкиФайлов.Код ПОДОБНО &Строка"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + НайденнаяПапка = Выборка.Ссылка; + Найдено = Истина; + КонецЕсли; + КонецЕсли; + + Если НайденныйФайл <> Неопределено Тогда + Элементы.Папки.ТекущаяСтрока = НайденныйФайл.ВладелецФайла; + Список.Параметры.УстановитьЗначениеПараметра("Владелец", Элементы.Папки.ТекущаяСтрока); + Элементы.Список.ТекущаяСтрока = НайденныйФайл.Ссылка; + Возврат "НайденФайл"; + КонецЕсли; + + Если НайденнаяПапка <> Неопределено Тогда + Элементы.Папки.ТекущаяСтрока = НайденнаяПапка; + Возврат "НайденаПапка"; + КонецЕсли; + + Возврат "НичегоНеНайдено"; +КонецФункции + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ПапкаПриОткрытии = ХранилищеНастроекДанныхФорм.Загрузить("ХранилищеФайлов", "ТекущаяПапка"); + + Если ПапкаПриОткрытии = Справочники.ПапкиФайлов.ПустаяСсылка() Тогда + ПапкаПриОткрытии = ПредопределенноеЗначение("Справочник.ПапкиФайлов.Шаблоны"); + Иначе + ПапкаПриОткрытииОбъект = Неопределено; + Попытка + ПапкаПриОткрытииОбъект = ПапкаПриОткрытии.ПолучитьОбъект(); + Исключение + КонецПопытки; + + Если ПапкаПриОткрытииОбъект = Неопределено Тогда + ПапкаПриОткрытии = ПредопределенноеЗначение("Справочник.ПапкиФайлов.Шаблоны"); + КонецЕсли; + КонецЕсли; + + Элементы.Папки.ТекущаяСтрока = ПапкаПриОткрытии; + + Список.Параметры.УстановитьЗначениеПараметра( + "Владелец", ПапкаПриОткрытии); + Список.Параметры.УстановитьЗначениеПараметра( + "ТекущийПользователь", ОбщегоНазначения.ТекущийПользователь()); + + РаботаСФайлами.ЗаполнитьУсловноеОформлениеСпискаФайлов(Список); + + ПоказыватьКолонкуРазмер = РаботаСФайлами.ПолучитьПоказыватьКолонкуРазмер(); + Если ПоказыватьКолонкуРазмер = Ложь Тогда + Элементы.ТекущаяВерсияРазмер.Видимость = Ложь; + КонецЕсли; + + ИспользоватьИерархию = Истина; + УстановитьИерархию(ИспользоватьИерархию); + + Если РаботаСФайлами.ПолучитьИспользоватьЭлектронноЦифровыеПодписиИШифрование() = Ложь Тогда + Элементы.Подписан.Видимость = Ложь; + Элементы.Зашифрован.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии() + Если ПапкаПриОткрытии <> Элементы.Папки.ТекущаяСтрока Тогда + ПриЗакрытииНаСервере(); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПриЗакрытииНаСервере() + ХранилищеНастроекДанныхФорм.Сохранить( + "ХранилищеФайлов", + "ТекущаяПапка", + Элементы.Папки.ТекущаяСтрока); +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьФайлВыполнить() + + Попытка + РаботаСФайламиКлиент.СозданиеНовогоФайла(Элементы.Папки.ТекущаяСтрока, ЭтаФорма); + Исключение + Инфо = ИнформацияОбОшибке(); + Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка создания нового файла: ""%1""'"), + Инфо.Описание )); + КонецПопытки; + +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьПапкуВыполнить() + + ПараметрыСозданияПапки = Новый Структура("Родитель", Элементы.Папки.ТекущаяСтрока); + ОткрытьФорму("Справочник.ПапкиФайлов.ФормаОбъекта", ПараметрыСозданияПапки, Элементы.Папки); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + СтандартнаяОбработка = Ложь; +КонецПроцедуры + +&НаКлиенте +Процедура СписокПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + СтандартнаяОбработка = Ложь; + + Если Элементы.Папки.ТекущаяСтрока = Неопределено Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + Если Элементы.Папки.ТекущаяСтрока.Пустая() Тогда + Возврат; + КонецЕсли; + + МассивИменФайлов = Новый Массив; + ЭтоДрагДропФайловИзвне = Ложь; + + Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") И ПараметрыПеретаскивания.Значение.ЭтоФайл() = Истина Тогда + РаботаСФайламиКлиент.СоздатьДокументНаОсновеФайла(ПараметрыПеретаскивания.Значение.ПолноеИмя, Элементы.Папки.ТекущаяСтрока, ЭтаФорма); + ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") Тогда + ЭтоДрагДропФайловИзвне = Истина; + МассивИменФайлов.Добавить(ПараметрыПеретаскивания.Значение.ПолноеИмя); + ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда + + Если ПараметрыПеретаскивания.Значение.Количество() >= 1 И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Файл") Тогда + ЭтоДрагДропФайловИзвне = Истина; + Для Каждого ФайлПринятый Из ПараметрыПеретаскивания.Значение Цикл + МассивИменФайлов.Добавить(ФайлПринятый.ПолноеИмя); + КонецЦикла; + КонецЕсли; + + КонецЕсли; + + Если ЭтоДрагДропФайловИзвне = Истина Тогда + ПараметрыИмпорта = Новый Структура("ПапкаДляДобавления, МассивИменФайлов", Элементы.Папки.ТекущаяСтрока, МассивИменФайлов); + ОткрытьФорму("Справочник.Файлы.Форма.ФормаПеретаскивания", ПараметрыИмпорта); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПапкиПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + СтандартнаяОбработка = Ложь; +КонецПроцедуры + +&НаКлиенте +Процедура ПапкиПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + СтандартнаяОбработка = Ложь; + + МассивИменФайлов = Новый Массив; + ЭтоДрагДропФайловИзвне = Ложь; + + Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") И ПараметрыПеретаскивания.Значение.ЭтоФайл() = Истина Тогда + РаботаСФайламиКлиент.СоздатьДокументНаОсновеФайла(ПараметрыПеретаскивания.Значение.ПолноеИмя, Элементы.Папки.ТекущаяСтрока, ЭтаФорма); + ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") Тогда + ЭтоДрагДропФайловИзвне = Истина; + МассивИменФайлов.Добавить(ПараметрыПеретаскивания.Значение.ПолноеИмя); + ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда + + Если ПараметрыПеретаскивания.Значение.Количество() >= 1 И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Файл") Тогда + ЭтоДрагДропФайловИзвне = Истина; + Для Каждого ФайлПринятый Из ПараметрыПеретаскивания.Значение Цикл + МассивИменФайлов.Добавить(ФайлПринятый.ПолноеИмя); + КонецЦикла; + КонецЕсли; + + Если ПараметрыПеретаскивания.Значение.Количество() >= 1 И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("СправочникСсылка.Файлы") Тогда + Если РаботаСФайлами.УстановитьВладельцаФайла(ПараметрыПеретаскивания.Значение, Строка) = Истина Тогда + Элементы.Папки.Обновить(); + Элементы.Список.Обновить(); + + Если ПараметрыПеретаскивания.Значение.Количество() = 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 = 'Выбор папки'"), Элементы.Папки.ТекущаяСтрока); + Результат = ОткрытьФормуМодально("Справочник.ПапкиФайлов.ФормаВыбора", ПараметрыОткрытияФормы); + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки; + РаботаСФайламиКлиент.ПеренестиФайлыВПапку(ВыделенныеСтроки, Результат); + Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл + Оповестить("ДанныеФайлаИзменены", ВыделеннаяСтрока); + КонецЦикла; + Элементы.Список.Обновить(); +КонецПроцедуры + +&НаКлиенте +Процедура Подписать(Команда) + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИРабочийКаталог(Элементы.Список.ТекущаяСтрока); + + ДанныеДляЗанесенияВРегистр = Неопределено; + Если КомандыРаботыСФайлами.СформироватьПодписьФайла(ДанныеФайла, ДанныеДляЗанесенияВРегистр) Тогда + + ЭлектронноЦифроваяПодпись.ЗанестиИнформациюОднойПодписи(ДанныеДляЗанесенияВРегистр); + + ЭлектронноЦифроваяПодписьКлиент.ИнформироватьОПодписанииОбъекта(ДанныеФайла.Ссылка); + Оповестить("ПрисоединенныйФайлПодписан", ДанныеФайла.Владелец); + КонецЕсли; + + УстановитьДоступностьФайловыхКомманд(); + +КонецПроцедуры + +&НаКлиенте +Процедура Зашифровать(Команда) + ОбъектСсылка = Элементы.Список.ТекущаяСтрока; + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИКоличествоВерсий(ОбъектСсылка); + + МассивДанныхДляЗанесенияВБазу = Новый Массив; + МассивАдресов = Новый Массив; + МассивОтпечатков = Новый Массив; + + Если НЕ КомандыРаботыСФайлами.Зашифровать(ДанныеФайла, УникальныйИдентификатор, + МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, МассивАдресов) Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиКлиент.ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяРабочегоКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + ЗашифроватьСервер(МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, МассивАдресов, + МассивФайловВРабочемКаталогеДляУдаления, + ИмяРабочегоКаталога, ОбъектСсылка); + + РаботаСФайламиКлиент.ИнформироватьОШифровании(МассивФайловВРабочемКаталогеДляУдаления, + ДанныеФайла.Владелец, ОбъектСсылка); + + УстановитьДоступностьФайловыхКомманд(); + +КонецПроцедуры + +&НаСервере +Процедура ЗашифроватьСервер(МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, МассивАдресов, + МассивФайловВРабочемКаталогеДляУдаления, + ИмяРабочегоКаталога, ОбъектСсылка) + + Зашифровать = Истина; + РаботаСФайлами.ЗанестиИнформациюОШифровании(ОбъектСсылка, Зашифровать, МассивДанныхДляЗанесенияВБазу, + УникальныйИдентификатор, + ИмяРабочегоКаталога, МассивФайловВРабочемКаталогеДляУдаления, МассивОтпечатков, МассивАдресов); + + СсылкаВладелецФайла = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ОбъектСсылка, "ВладелецФайла"); + +КонецПроцедуры + +&НаКлиенте +Процедура Расшифровать(Команда) + ОбъектСсылка = Элементы.Список.ТекущаяСтрока; + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИКоличествоВерсий(ОбъектСсылка); + + МассивДанныхДляЗанесенияВБазу = Новый Массив; + МассивАдресов = Новый Массив; + + Если НЕ КомандыРаботыСФайлами.Расшифровать(ДанныеФайла, УникальныйИдентификатор, + МассивДанныхДляЗанесенияВБазу, МассивАдресов) Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиКлиент.ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяРабочегоКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, МассивАдресов, + ИмяРабочегоКаталога, ОбъектСсылка); + + РаботаСФайламиКлиент.ИнформироватьОРасшифровании( + ДанныеФайла.Владелец, ОбъектСсылка); + + УстановитьДоступностьФайловыхКомманд(); + +КонецПроцедуры + +&НаСервере +Процедура РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, МассивАдресов, + ИмяРабочегоКаталога, ОбъектСсылка) + + Зашифровать = Ложь; + МассивОтпечатков = Новый Массив; + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + РаботаСФайлами.ЗанестиИнформациюОШифровании(ОбъектСсылка, Зашифровать, МассивДанныхДляЗанесенияВБазу, + УникальныйИдентификатор, + ИмяРабочегоКаталога, МассивФайловВРабочемКаталогеДляУдаления, МассивОтпечатков, МассивАдресов); + + СсылкаВладелецФайла = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ОбъектСсылка, "ВладелецФайла"); + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьЭЦПИзФайла(Команда) + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИРабочийКаталог(Элементы.Список.ТекущаяСтрока); + КомандыРаботыСФайлами.ДобавитьЭЦПИзФайла(ДанныеФайла, УникальныйИдентификатор); + УстановитьДоступностьФайловыхКомманд(); +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьВместеСЭЦП(Команда) + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляСохранения(Элементы.Список.ТекущаяСтрока); + КомандыРаботыСФайлами.СохранитьВместеСЭЦП(ДанныеФайла, УникальныйИдентификатор); +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + Если ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентПодMacOS() Тогда + Элементы.ФормаЭЦПИШифрование.Видимость = Ложь; + Элементы.ФормаЭЦПИШифрованиеКонтекстное.Видимость = Ложь; + КонецЕсли; +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// КОНЕЦ ПРОЦЕДУР - ОБРАБОТЧИКОВ КОМАНД РАБОТЫ С ФАЙЛАМИ diff --git a/SSL/src/Catalogs/Файлы/Help/ru.html b/SSL/src/Catalogs/Файлы/Help/ru.html new file mode 100644 index 000000000..9053e93a6 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Help/ru.html @@ -0,0 +1,29 @@ + +

    +

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

    +

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

    +

    +

    Для создания нового файла

    +
    • Откройте список файлов; +
    • Выберите нужную папку;  +
    • Нажмите клавишу Insert или используйте команду " Создать"; +
    • Выберите способ создания - "из шаблона", "из файла на диске" или "Со сканера".

     

    +

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

    +

    +

    Работа с файлами

    +

    +

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

    +

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

     

    +

    Примечание: Если файл зашифрован, полнотекстовый поиск по его содержимому не работает.

    +

    См. также:

    +
    +

    Версии файлов
    Импорт файлов
    Импорт каталогов
    Экспорт папки
    Папки
    Общая информация о формах

    \ 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..e69de29bb diff --git a/SSL/src/Catalogs/Файлы/ObjectModule.bsl b/SSL/src/Catalogs/Файлы/ObjectModule.bsl new file mode 100644 index 000000000..81a057131 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/ObjectModule.bsl @@ -0,0 +1,165 @@ + +Перем ЗаписьПодписанногоОбъекта Экспорт; + + +// Обработка события ПередЗаписью +// +Процедура ПередЗаписью(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ВладелецФайла) Тогда + ВызватьИсключение НСтр("ru = 'Нельзя записать файл с пустым полем Владелец.'"); + КонецЕсли; + + Если НЕ ПривилегированныйРежим() И ЗаписьПодписанногоОбъекта <> Истина Тогда + + Если ЗначениеЗаполнено(Ссылка) Тогда + + СсылкаПодписан = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Ссылка, "Подписан"); + Если Подписан И СсылкаПодписан Тогда + ВызватьИсключение НСтр("ru = 'Подписанный файл нельзя редактировать.'"); + КонецЕсли; + + СсылкаЗашифрован = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Ссылка, "Зашифрован"); + Если Зашифрован И СсылкаЗашифрован И Подписан И НЕ СсылкаПодписан Тогда + ВызватьИсключение НСтр("ru = 'Зашифрованный файл нельзя подписывать.'"); + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Если Не ЭтоНовый() Тогда + + Если Не ТекущаяВерсия.Пустая() Тогда + + // Сменим индекс картинки, возможно, появилась версия или сменился индекс картинки у версии + РеквизитыТекущейВерсии = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ТекущаяВерсия, + "ИндексКартинки, Размер, ДатаСоздания, Автор, Расширение, НомерВерсии, Том, ПутьКФайлу, Код, ПолноеНаименование"); + + ИндексКартинки = РеквизитыТекущейВерсии.ИндексКартинки; + + // копируем реквизиты для ускорения работы RLS + ТекущаяВерсияРазмер = РеквизитыТекущейВерсии.Размер; + ТекущаяВерсияДатаСоздания = РеквизитыТекущейВерсии.ДатаСоздания; + ТекущаяВерсияАвтор = РеквизитыТекущейВерсии.Автор; + ТекущаяВерсияРасширение = РеквизитыТекущейВерсии.Расширение; + ТекущаяВерсияНомерВерсии = РеквизитыТекущейВерсии.НомерВерсии; + ТекущаяВерсияТом = РеквизитыТекущейВерсии.Том; + ТекущаяВерсияПутьКФайлу = РеквизитыТекущейВерсии.ПутьКФайлу; + ТекущаяВерсияКод = РеквизитыТекущейВерсии.Код; + + // Проверим равенство имени файла и его текущей версии + // Если имена отличаются - имя у версии должно стать как у карточки с файлом + Если РеквизитыТекущейВерсии.ПолноеНаименование <> ПолноеНаименование Тогда + Объект = ТекущаяВерсия.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка); + Если Объект <> Неопределено Тогда + УстановитьПривилегированныйРежим(Истина); + Объект.ПолноеНаименование = ПолноеНаименование; + Объект.Записать(); + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + КонецЕсли; + Иначе + ИндексКартинки = РаботаСФайламиКлиентСервер.ПолучитьИндексПиктограммыФайла(Неопределено); + КонецЕсли; + + Если ПометкаУдаления И Не ПометкаУдаленияВИБ() Тогда + + // Проверка права "Пометка на удаление". + Если НЕ РаботаСФайламиПереопределяемый.ПометкаУдаленияРазрешена(ВладелецФайла) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'У вас нет права ""Пометка на удаление"" файла ""%1"".'"), + Строка(Ссылка)); + КонецЕсли; + + // Попытка установить пометку удаления + Если Не Редактирует.Пустая() Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Нельзя удалить файл ""%1"", т.к. он занят для редактирования пользователем ""%2"".'"), + ПолноеНаименование, + Строка(Редактирует) ); + КонецЕсли; + + КонецЕсли; + + НаименованиеВИБ = НаименованиеВИБ(); + Если ПолноеНаименование <> НаименованиеВИБ Тогда + Если Не Редактирует.Пустая() Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Нельзя переименовать файл ""%1"", т.к. он занят для редактирования пользователем ""%2"".'"), + НаименованиеВИБ, + Строка(Редактирует) ); + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + + Наименование = СокрЛП(ПолноеНаименование); +КонецПроцедуры + +// Возвращает текущее значение пометки удаления в информационной базе +Функция ПометкаУдаленияВИБ() + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Файлы.ПометкаУдаления + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.Ссылка = &Ссылка"; + + Запрос.УстановитьПараметр("Ссылка", Ссылка); + + Результат = Запрос.Выполнить(); + + Если Не Результат.Пустой() Тогда + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + Возврат Выборка.ПометкаУдаления; + КонецЕсли; + + Возврат Неопределено; +КонецФункции + +// Возвращает текущее значение наименования в информационной базе +Функция НаименованиеВИБ() + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Файлы.ПолноеНаименование + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.Ссылка = &Ссылка"; + + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Результат = Запрос.Выполнить(); + + Если Не Результат.Пустой() Тогда + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + Возврат Выборка.ПолноеНаименование; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) + Если ЭтоНовый() Тогда + ДатаСоздания = ТекущаяДата(); + ХранитьВерсии = Истина; + ИндексКартинки = РаботаСФайламиКлиентСервер.ПолучитьИндексПиктограммыФайла(Неопределено); + + Автор = ОбщегоНазначения.ТекущийПользователь(); + ДатаСоздания = ТекущаяДата(); + КонецЕсли; +КонецПроцедуры + diff --git a/SSL/src/Catalogs/Файлы/Templates/МакетОтчета/Template.mxlx b/SSL/src/Catalogs/Файлы/Templates/МакетОтчета/Template.mxlx new file mode 100644 index 000000000..3256664ea --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Templates/МакетОтчета/Template.mxlx @@ -0,0 +1,119 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 2 + + 0 + + 1 + + + + 1 + + 2 + + + + + 9bb67b5f-5e3e-459e-98c5-618e04892d9b + 1 + + 0 + + 3 + + + + + 1 + + 9bb67b5f-5e3e-459e-98c5-618e04892d9b + + + 4 + Описание + + + + + + 2 + + 5 + + + 6 + Название + + + + + 7 + Ошибка + + + + + true + 8 + 3 + 3 + + Заголовок + + Rows + 1 + 1 + -1 + -1 + 9bb67b5f-5e3e-459e-98c5-618e04892d9b + + + + Строка + + Rows + 2 + 2 + -1 + -1 + + + + + 465 + + + 491 + + + 383 + + + 0 + Parameter + + + 96 + + + Parameter + + + Wrap + Parameter + + + 72 + + \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Файлы.mdo b/SSL/src/Catalogs/Файлы/Файлы.mdo new file mode 100644 index 000000000..4295c46a6 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Файлы.mdo @@ -0,0 +1,1115 @@ + + + + + + + + + + Файлы + + ru + Файлы + + Файлы в папках + Catalog.Файлы.StandardAttribute.Description + Catalog.Файлы.StandardAttribute.Code + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + Catalog.ПапкиФайлов.EmptyRef + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ru + Краткое наименование + + + Use + + + + + Use + Code + + + + Use + + + + Use + true + + + ru + + + Managed + Use + + ru + Файл + + 2 + true + 9 + 150 + String + Variable + true + true + AsDescription + InDialog + BothWays + Catalog.Файлы.Form.ФормаЭлемента + Catalog.Файлы.Form.ФормаСписка + Catalog.Файлы.Form.ФормаВыбора + + Автор + + ru + Автор + + Автор - пользователь, добавивший файл + + CatalogRef.Пользователи + + + + ShowError + DontUse + Use + + Catalog.Пользователи.EmptyRef + + Index + Use + Use + + + ВладелецФайла + + ru + Владелец + + + CatalogRef.ПапкиФайлов + + + + + Catalog.ПапкиФайлов.EmptyRef + + Index + Use + Use + + + ДатаСоздания + + ru + Дата создания + + Дата добавления файла в базу + + Date + + + + + ShowError + + 0001-01-01T00:00:00 + + Index + Use + Use + + + Зашифрован + + ru + Зашифрован + + Зашифрован + + Boolean + + + + + Use + Use + + + ИндексКартинки + + ru + Индекс картинки + + Индекс иконки, соответствующей расширению файла, для показа в списке + + Number + + 10 + + + + + + 0 + + Use + + + Описание + + ru + Описание + + Описание файла + + String + + + true + + + + Use + Use + + + Подписан + + ru + Подписан + + + Boolean + + + + + Use + Use + + + ПолноеНаименование + + ru + Полное наименование + + Полное наименование (длиной до 256 символов) + + String + + 256 + + + + + ShowError + + + + Index + Use + ForFolderAndItem + Use + + + Редактирует + + ru + Редактирует + + Пользователь, занявший файл для редактирования + + CatalogRef.Пользователи + + + ru + Кто редактирует файл сейчас + + + + DontUse + Use + + Catalog.Пользователи.EmptyRef + + Index + Use + Use + + + ТекстХранилище + + ru + Текст + + Текст, извлеченный из файла - для полнотекстового поиска + + ValueStorage + + + + + Use + Use + + + ТекущаяВерсия + + ru + Текущая версия + + Активная версия + + CatalogRef.ВерсииФайлов + + + + DontUse + Use + + Catalog.ВерсииФайлов.EmptyRef + + Index + Use + Use + + + ТекущаяВерсияАвтор + + ru + Текущая версия автор + + Автор - пользователь, создавший версию + + CatalogRef.Пользователи + + + + DontUse + Use + + Catalog.Пользователи.EmptyRef + + Use + Use + + + ТекущаяВерсияДатаСоздания + + ru + Текущая версия дата создания + + Дата создания версии + + Date + + + + + + 0001-01-01T00:00:00 + + Index + Use + Use + + + ТекущаяВерсияКод + + ru + Текущая версия код + + + String + + 9 + + + + + + Use + Use + + + ТекущаяВерсияНомерВерсии + + ru + Текущая версия номер версии + + + Number + + 5 + + + + ru + Номер версии + + + + + Use + Use + + + ТекущаяВерсияПутьКФайлу + + ru + Текущая версия путь к файлу + + Дополнительный путь к файлу на диске (в случае если ТипХраненияФайла - на диске) + + String + + + + + + Use + Use + + + ТекущаяВерсияРазмер + + ru + Текущая версия размер + + Размер файла версии + + Number + + 10 + + + + + + 0 + + Index + Use + Use + + + ТекущаяВерсияРасширение + + ru + Текущая версия расширение + + Расширение файла версии + + String + + 10 + + + + + + Index + Use + Use + + + ТекущаяВерсияТом + + ru + Текущая версия том + + Ссылка на том (в случае если ТипХраненияФайла - на диске) + + CatalogRef.ТомаХраненияФайлов + + + + + Index + Use + Use + + + ХранитьВерсии + + ru + Хранить версии + + Хранить версии - если Ложь, у файла всегда одна версия - активная + + Boolean + + + + + Use + Use + + + + + + + ДополнительныеРеквизиты + + ru + Дополнительные реквизиты + + + Use + LineNumber + + Use + + + + + Свойство + + ru + Свойство + + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + ru + Дополнительный реквизит + + + + DontUse + Use + Use + Use + + + Значение + + ru + Значение + + + Characteristic.ДополнительныеРеквизитыИСведения + + + ru + Значение доп. реквизита + + + + DontUse + Use + Use + Use + + + + + + + + СертификатыШифрования + + ru + Сертификаты шифрования + + + Use + LineNumber + + Use + + + + + Отпечаток + + ru + Отпечаток + + + String + + 255 + + + + + Use + + + Представление + + ru + Представление + + + String + + + + + Use + Use + + + + ВводПароляСОписаниями + + ru + Ввод пароля с описаниями + + + + ru + + + PersonalComputer + MobileDevice + + + ВРабочемКаталогеБолееНовыйФайл + + ru + В рабочем каталоге более новый файл + + PersonalComputer + MobileDevice + + + ВыборСертификатаЭЦПДляШифрования + + ru + Выбор сертификата ЭЦПДля шифрования + + + + ru + + + PersonalComputer + MobileDevice + + + ВыборСохраненияШифрованногоФайла + + ru + Выбор сохранения шифрованного файла + + + + ru + + + PersonalComputer + MobileDevice + + + ВыборУстройстваСканирования + + ru + Выбор устройства сканирования + + PersonalComputer + MobileDevice + + + НастройкаСканирования + + ru + Настройка сканирования + + + + ru + + + PersonalComputer + MobileDevice + + + РазмерФайлаВРабочемКаталогеОтличается + + ru + Размер файла в рабочем каталоге отличается + + PersonalComputer + MobileDevice + + + РедактируемыеФайлы + + ru + Редактируемые файлы + + true + + + ru + + + PersonalComputer + MobileDevice + + + РежимСозданияФайлаДляСохранитьКак + + ru + Режим создания файла для сохранить как + + PersonalComputer + MobileDevice + + + РезультатСканирования + + ru + Результат сканирования + + PersonalComputer + MobileDevice + + + СписокЗанятыхСВопросом + + ru + Список занятых с вопросом + + true + + + ru + + + PersonalComputer + MobileDevice + + + СписокФайловВЛокальномКэшеФайлов + + ru + Список файлов в локальном кэше файлов + + true + + + ru + + + PersonalComputer + MobileDevice + + + ФайлСуществует + + ru + Файл существует + + PersonalComputer + MobileDevice + + + ФормаВозвратаФайла + + ru + Комментарий к версии + + true + + + ru + + + PersonalComputer + MobileDevice + + + ФормаВопроса + + ru + Форма вопроса + + PersonalComputer + MobileDevice + + + ФормаВопросаЗакончитьРедактирование + + ru + Форма вопроса закончить редактирование + + PersonalComputer + MobileDevice + + + ФормаВопросаИмпорта + + ru + Сообщение о файлах, чей размер превышает допустимый + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаВопросаОбУстановкеРасширенияРаботыСФайлами + + ru + Форма вопроса об установке расширения работы с файлами + + PersonalComputer + MobileDevice + + + ФормаВыбора + + ru + Форма выбора + + PersonalComputer + MobileDevice + + + ФормаВыбораПодписей + + ru + Форма выбора подписей + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаВыбораПутиКАрхивуФайловТомов + + ru + Форма выбора пути к архиву файлов томов + + PersonalComputer + MobileDevice + + + ФормаВыбораРежимаОткрытия + + ru + Форма выбора режима открытия + + true + + + ru + + + PersonalComputer + MobileDevice + + + ФормаГруповаяОперацияНаПапке + + ru + Форма груповая операция на папке + + PersonalComputer + MobileDevice + + + ФормаДобавленияПодписиИзФайла + + ru + Форма добавления подписи из файла + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаИмпортаПапки + + ru + Импорт каталога + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаИмпортаФайлов + + ru + Импорт файлов + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаНапоминанияПередПоместитьФайл + + ru + Форма напоминания перед поместить файл + + PersonalComputer + MobileDevice + + + ФормаНапоминанияПриРедактировании + + ru + Форма напоминания при редактировании + + PersonalComputer + MobileDevice + + + ФормаНового + + ru + Форма нового + + true + + + ru + + + PersonalComputer + MobileDevice + + + ФормаОтчета + + ru + Форма отчета + + PersonalComputer + MobileDevice + + + ФормаОтчетаОСохранении + + ru + Форма отчета о сохранении + + PersonalComputer + MobileDevice + + + ФормаПеретаскивания + + ru + Форма перетаскивания + + PersonalComputer + MobileDevice + + + ФормаПодбора + + ru + Форма подбора + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаСпискаПрисоединенныхФайлов + + ru + Форма списка присоединенных файлов + + PersonalComputer + MobileDevice + + + ФормаШифрования + + ru + Форма шифрования + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаЭкспортаПапки + + ru + Форма экспорта папки + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаЭлемента + + ru + Карточка файла + + true + + + ru + + + PersonalComputer + MobileDevice + + + ХранилищеФайлов + + ru + Хранилище файлов + + true + + + ru + + + PersonalComputer + MobileDevice + + + МакетОтчета + + ru + Макет отчета + + + + ВсеФайлы + + ru + Все файлы + + NavigationPanelOrdinary + Auto + + + ЗанятыеФайлы + + ru + Редактируемые файлы + + NavigationPanelOrdinary + Auto + + + ПапкиФайлов + + ru + Файлы + + Открывает форму списка файлов в папках + NavigationPanelOrdinary + Auto + + diff --git a/SSL/src/Catalogs/ФизическиеЛица/Help/ru.html b/SSL/src/Catalogs/ФизическиеЛица/Help/ru.html new file mode 100644 index 000000000..9ffba2c70 --- /dev/null +++ b/SSL/src/Catalogs/ФизическиеЛица/Help/ru.html @@ -0,0 +1,16 @@ + +

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

    +

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

    +

     

    +

    Для каждого физического лица есть возможность указать его личные данные, такие как:

    +
    • +

      пол

      +
    • +

      дата рождения

      +
    • +

      информация о документе, удостоверяющем личность

     

    +

    См. также:

    + \ No newline at end of file diff --git a/SSL/src/Catalogs/ФизическиеЛица/ФизическиеЛица.mdo b/SSL/src/Catalogs/ФизическиеЛица/ФизическиеЛица.mdo new file mode 100644 index 000000000..459e697af --- /dev/null +++ b/SSL/src/Catalogs/ФизическиеЛица/ФизическиеЛица.mdo @@ -0,0 +1,170 @@ + + + + + + + + + + ФизическиеЛица + + ru + Физические лица + + true + Catalog.ФизическиеЛица.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + + ru + Группа физ. лиц + + + ru + Группа физических лиц + + true + + Catalog.ФизическиеЛица.EmptyRef + + Use + + + + + Use + Description + + ru + ФИО + + + ru + Фамилия, имя, отчество + + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + true + + + ru + + + Managed + Use + + ru + Физическое лицо + + true + 2 + true + 50 + String + AsDescription + BothWays + BothWays + + ДатаРождения + + ru + Дата рождения + + + Date + + Date + + + + + + 0001-01-01T00:00:00 + + Use + Use + + + Пол + + ru + Пол + + + EnumRef.ПолФизическогоЛица + + + + + Enum.ПолФизическогоЛица.EmptyRef + + Use + Use + + diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form new file mode 100644 index 000000000..81106b009 --- /dev/null +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form @@ -0,0 +1,3074 @@ + + + + <key>ru</key> + <value>Мастер табличного вопроса</value> + + + Формулировка + 141 + true + true + + true + + + Формулировка + + Left + + OnChange + ФормулировкаПриИзменении + + + ФормулировкаРасширеннаяПодсказка + 147 + Label + true + true + + Left + + + + ФормулировкаКонтекстноеМеню + 142 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ИнформацияШапка + 128 + true + true + + true + + + ИнформацияШапка + + None + + ИнформацияШапкаРасширеннаяПодсказка + 149 + Label + true + true + + Left + + + + ИнформацияШапкаКонтекстноеМеню + 129 + true + + LabelField + Enter + true + Left + true + + true + true + + System.DefaultGUIFont + 9.0 + true + false + false + false + + + + + Страницы + 1 + + СтраницаТипТабличногоВопроса + 2 + + ТипТабличногоВопроса + 3 + true + true + + true + + + ТипТабличногоВопроса + + None + + OnChange + ТипТабличногоВопросаПриИзменении + + + ТипТабличногоВопросаРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + + ТипТабличногоВопросаКонтекстноеМеню + 4 + true + + RadioButtonField + Enter + true + Left + true + + 1 + 1 + Vertical + + + + СтраницыТипТабличногоВопросаКартинки + 79 + + СтраницаКартинкаСоставной + 80 + + КартинкаСоставной + 81 + + <key>ru</key> + <value>Картинка составной</value> + + true + true + + true + + + КартинкаСоставнойРасширеннаяПодсказка + 157 + Label + true + true + + Left + + + + КартинкаСоставнойКонтекстноеМеню + 82 + true + + true + true + true + true + false + + + CommonPicture.ПревьюТабличногоВопросаСоставной + + + + true + true + + true + + + <key>ru</key> + <value>Страница картинка составной</value> + + + ru + Страница картинка составной + + + СтраницаКартинкаСоставнойРасширеннаяПодсказка + 156 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаКартинкаОтветыВСтроках + 83 + + КартинкаОтветыВСтроках + 84 + + <key>ru</key> + <value>Картинка ответы в строках</value> + + true + true + + true + + + КартинкаОтветыВСтрокахРасширеннаяПодсказка + 159 + Label + true + true + + Left + + + + КартинкаОтветыВСтрокахКонтекстноеМеню + 85 + true + + true + true + true + true + false + + + CommonPicture.ПревьюТабличногоВопросаОтветыВСтроках + + + + true + true + + true + + + <key>ru</key> + <value>Страница картинка ответы в строках</value> + + + ru + Страница картинка ответы в строках + + + СтраницаКартинкаОтветыВСтрокахРасширеннаяПодсказка + 158 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаКартинкаОтветыВКолонках + 86 + + КартинкаОтветыВКолонках + 87 + + <key>ru</key> + <value>Картинка ответы в колонках</value> + + true + true + + true + + + КартинкаОтветыВКолонкахРасширеннаяПодсказка + 161 + Label + true + true + + Left + + + + КартинкаОтветыВКолонкахКонтекстноеМеню + 88 + true + + true + true + true + true + false + + + CommonPicture.ПревьюТабличногоВопросаОтветыВКолонках + + + + true + true + + true + + + <key>ru</key> + <value>Страница картинка ответы в колонках</value> + + + ru + Страница картинка ответы в колонках + + + СтраницаКартинкаОтветыВКолонкахРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаКартинкаОтветыВСтрокахИКолонках + 89 + + КартинкаОтветыВСтрокахИКолонках + 90 + + <key>ru</key> + <value>Картинка ответы в строках и колонках</value> + + true + true + + true + + + КартинкаОтветыВСтрокахИКолонкахРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + + КартинкаОтветыВСтрокахИКолонкахКонтекстноеМеню + 91 + true + + true + true + true + true + false + + + CommonPicture.ПревьюТабличногоВопросаОтветыСтрокиИКолонки + + + + true + true + + true + + + <key>ru</key> + <value>Страница картинка ответы в строках и колонках</value> + + + ru + Страница картинка ответы в строках и колонках + + + СтраницаКартинкаОтветыВСтрокахИКолонкахРасширеннаяПодсказка + 162 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаКартинкаПустая + 92 + + КартинкаПустая + 93 + + <key>ru</key> + <value>Картинка пустая</value> + + true + true + + true + + + КартинкаПустаяРасширеннаяПодсказка + 165 + Label + true + true + + Left + + + + КартинкаПустаяКонтекстноеМеню + 94 + true + + true + true + false + + + true + true + + true + + + <key>ru</key> + <value>Страница картинка пустая</value> + + + ru + Страница картинка пустая + + + СтраницаКартинкаПустаяРасширеннаяПодсказка + 164 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы тип табличного вопроса картинки</value> + + + ru + Страницы тип табличного вопроса картинки + + + СтраницыТипТабличногоВопросаКартинкиРасширеннаяПодсказка + 155 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница тип табличного вопроса</value> + + + ru + Страница тип табличного вопроса + + + СтраницаТипТабличногоВопросаРасширеннаяПодсказка + 152 + Label + true + true + + Left + + + Page + + auto + + + + СтраницаПредопределенныеОтветыВСтрокахИКолонках + 13 + + ГруппаОбщаяОтветыВСтрокахИКолонках + 67 + + ГруппаСоставКолонокОтветыВСтрокахИКолонках + 20 + + ВопросКолонкаОтветыСтрокахИКолонках + 14 + true + true + + true + + + ПредставлениеВопросаДляКолонок + + None + + ВопросКолонкаОтветыСтрокахИКолонкахРасширеннаяПодсказка + 169 + Label + true + true + + Left + + + + ВопросКолонкаОтветыСтрокахИКолонкахКонтекстноеМеню + 15 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ОтветыКолонкиОтветыВСтрокахИКолонках + 22 + true + true + + true + + + Ответы + + false + None + + ОтветыКолонкиОтветыВСтрокахИКолонкахОтвет + 117 + true + true + + true + + + Ответы.Ответ + + + ОтветыКолонкиОтветыВСтрокахИКолонкахОтветРасширеннаяПодсказка + 182 + Label + true + true + + Left + + + + ОтветыКолонкиОтветыВСтрокахИКолонкахОтветКонтекстноеМеню + 118 + true + + InputField + Auto + true + Left + true + + + StartChoice + ОтветыКолонкиОтветыВСтрокахИКолонкахОтветНачалоВыбора + + true + true + true + true + true + true + Normal + + + ВопросДляКолонок + + + + + + ОтветыКолонкиОтветыВСтрокахИКолонкахКоманднаяПанель + 24 + + ЗаполнитьКолонкиВариантыОтветовОтветыСтрокахИКолонках + 145 + true + true + + true + + false + + ЗаполнитьКолонкиВариантыОтветовОтветыСтрокахИКолонкахРасширеннаяПодсказка + 171 + Label + true + true + + Left + + + Form.Command.ЗаполнитьВариантыОтветовОтветыКолонки + Normal + Picture + true + true + UserCmds + + StdPicture.Next + + Auto + InCommandBarAndInAdditionalSubmenu + + Left + true + + + BeforeAddRow + ОтветыКолонкиОтветыВСтрокахИКолонкахПередНачаломДобавления + + + OnChange + ОтветыКолонкиОтветыВСтрокахИКолонкахПриИзменении + + + ОтветыКолонкиОтветыВСтрокахИКолонкахСтрокаПоиска + 173 + + ОтветыКолонкиОтветыВСтрокахИКолонкахСтрокаПоискаРасширеннаяПодсказка + 175 + Label + true + true + + Left + + + + ОтветыКолонкиОтветыВСтрокахИКолонкахСтрокаПоискаКонтекстноеМеню + 174 + true + + ОтветыКолонкиОтветыВСтрокахИКолонках + + true + + + + ОтветыКолонкиОтветыВСтрокахИКолонкахСостояниеПросмотра + 176 + + ОтветыКолонкиОтветыВСтрокахИКолонкахСостояниеПросмотраРасширеннаяПодсказка + 178 + Label + true + true + + Left + + + + ОтветыКолонкиОтветыВСтрокахИКолонкахСостояниеПросмотраКонтекстноеМеню + 177 + true + + ViewStatusAddition + ОтветыКолонкиОтветыВСтрокахИКолонках + + true + + + + ОтветыКолонкиОтветыВСтрокахИКолонкахУправлениеПоиском + 179 + + ОтветыКолонкиОтветыВСтрокахИКолонкахУправлениеПоискомРасширеннаяПодсказка + 181 + Label + true + true + + Left + + + + ОтветыКолонкиОтветыВСтрокахИКолонкахУправлениеПоискомКонтекстноеМеню + 180 + true + + SearchControlAddition + ОтветыКолонкиОтветыВСтрокахИКолонках + + true + + + + ОтветыКолонкиОтветыВСтрокахИКолонкахРасширеннаяПодсказка + 172 + Label + true + true + + Left + + + + ОтветыКолонкиОтветыВСтрокахИКолонкахКонтекстноеМеню + 23 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + true + true + None + None + None + true + + + true + true + + true + + + <key>ru</key> + <value>Состав колонок</value> + + + ru + Группа состав колонок ответы в строках и колонках + + + ГруппаСоставКолонокОтветыВСтрокахИКолонкахРасширеннаяПодсказка + 168 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаСоставСтрокОтветыВСтрокахИКолонках + 21 + + ВопросСтрокаОтветыВСтрокахИКолонках + 16 + + <key>ru</key> + <value>Вопрос для строк</value> + + true + true + + true + + + ПредставлениеВопросаДляСтрок + + None + + ВопросСтрокаОтветыВСтрокахИКолонкахРасширеннаяПодсказка + 193 + Label + true + true + + Left + + + + ВопросСтрокаОтветыВСтрокахИКолонкахКонтекстноеМеню + 17 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ОтветыСтрокиОтветыВСтрокахИКолонках + 27 + true + true + + true + + + Ответы + + false + None + + ОтветыСтрокиОтветыВСтрокахИКолонкахОтвет + 121 + true + true + + true + + + Ответы.Ответ + + + ОтветыСтрокиОтветыВСтрокахИКолонкахОтветРасширеннаяПодсказка + 206 + Label + true + true + + Left + + + + ОтветыСтрокиОтветыВСтрокахИКолонкахОтветКонтекстноеМеню + 122 + true + + InputField + Auto + true + Left + true + + + StartChoice + ОтветыСтрокиОтветыВСтрокахИКолонкахОтветНачалоВыбора + + true + true + true + true + true + true + Normal + + + ВопросДляСтрок + + + + + + ОтветыСтрокиОтветыВСтрокахИКолонкахКоманднаяПанель + 29 + + ЗаполнитьСтрокиВариантыОтветовОтветыСтрокиИКолонки + 146 + true + true + + true + + false + + ЗаполнитьСтрокиВариантыОтветовОтветыСтрокиИКолонкиРасширеннаяПодсказка + 195 + Label + true + true + + Left + + + Form.Command.ЗаполнитьВариантыОтветовОтветыСтроки + Normal + Picture + true + true + UserCmds + + StdPicture.Next + + Auto + InCommandBarAndInAdditionalSubmenu + + Left + true + + + BeforeAddRow + ОтветыСтрокиОтветыВСтрокахИКолонкахПередНачаломДобавления + + + OnChange + ОтветыСтрокиОтветыВСтрокахИКолонкахПриИзменении + + + ОтветыСтрокиОтветыВСтрокахИКолонкахСтрокаПоиска + 197 + + ОтветыСтрокиОтветыВСтрокахИКолонкахСтрокаПоискаРасширеннаяПодсказка + 199 + Label + true + true + + Left + + + + ОтветыСтрокиОтветыВСтрокахИКолонкахСтрокаПоискаКонтекстноеМеню + 198 + true + + ОтветыСтрокиОтветыВСтрокахИКолонках + + true + + + + ОтветыСтрокиОтветыВСтрокахИКолонкахСостояниеПросмотра + 200 + + ОтветыСтрокиОтветыВСтрокахИКолонкахСостояниеПросмотраРасширеннаяПодсказка + 202 + Label + true + true + + Left + + + + ОтветыСтрокиОтветыВСтрокахИКолонкахСостояниеПросмотраКонтекстноеМеню + 201 + true + + ViewStatusAddition + ОтветыСтрокиОтветыВСтрокахИКолонках + + true + + + + ОтветыСтрокиОтветыВСтрокахИКолонкахУправлениеПоиском + 203 + + ОтветыСтрокиОтветыВСтрокахИКолонкахУправлениеПоискомРасширеннаяПодсказка + 205 + Label + true + true + + Left + + + + ОтветыСтрокиОтветыВСтрокахИКолонкахУправлениеПоискомКонтекстноеМеню + 204 + true + + SearchControlAddition + ОтветыСтрокиОтветыВСтрокахИКолонках + + true + + + + ОтветыСтрокиОтветыВСтрокахИКолонкахРасширеннаяПодсказка + 196 + Label + true + true + + Left + + + + ОтветыСтрокиОтветыВСтрокахИКолонкахКонтекстноеМеню + 28 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + true + true + None + None + None + true + + + true + true + + true + + + <key>ru</key> + <value>Состав строк</value> + + + ru + Группа состав строк ответы в строках и колонках + + + ГруппаСоставСтрокОтветыВСтрокахИКолонкахРасширеннаяПодсказка + 192 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа общая ответы в строках и колонках</value> + + + ru + Группа общая ответы в строках и колонках + + + ГруппаОбщаяОтветыВСтрокахИКолонкахРасширеннаяПодсказка + 167 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + ru + Страница предопределенные ответы в строках и колонках + + + СтраницаПредопределенныеОтветыВСтрокахИКолонкахРасширеннаяПодсказка + 166 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаВопросы + 34 + + ГруппаВопросы + 68 + + Вопросы + 136 + true + true + + true + + + Вопросы + + false + None + + ВопросыВопрос + 139 + + <key>ru</key> + <value>Вопрос</value> + + true + true + + true + + + Вопросы.ЭлементарныйВопрос + + + OnChange + ВопросыПриИзменении + + + ВопросыВопросРасширеннаяПодсказка + 228 + Label + true + true + + Left + + + + ВопросыВопросКонтекстноеМеню + 140 + true + + InputField + Auto + true + Left + true + + + ChoiceProcessing + ВопросыВопросОбработкаВыбора + + true + true + true + Items + true + true + true + Normal + + + + ВопросыКоманднаяПанель + 138 + Left + true + + + OnChange + ВопросыПриИзменении + + + ВопросыСтрокаПоиска + 219 + + ВопросыСтрокаПоискаРасширеннаяПодсказка + 221 + Label + true + true + + Left + + + + ВопросыСтрокаПоискаКонтекстноеМеню + 220 + true + + Вопросы + + true + + + + ВопросыСостояниеПросмотра + 222 + + ВопросыСостояниеПросмотраРасширеннаяПодсказка + 224 + Label + true + true + + Left + + + + ВопросыСостояниеПросмотраКонтекстноеМеню + 223 + true + + ViewStatusAddition + Вопросы + + true + + + + ВопросыУправлениеПоиском + 225 + + ВопросыУправлениеПоискомРасширеннаяПодсказка + 227 + Label + true + true + + Left + + + + ВопросыУправлениеПоискомКонтекстноеМеню + 226 + true + + SearchControlAddition + Вопросы + + true + + + + ВопросыРасширеннаяПодсказка + 218 + Label + true + true + + Left + + + + ВопросыКонтекстноеМеню + 137 + true + + 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>Вопросы:</value> + + + ru + Группа вопросы + + true + + ГруппаВопросыРасширеннаяПодсказка + 217 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + +
    + true + true + + true + + + <key>ru</key> + <value>Страница вопросы</value> + + + СтраницаВопросыРасширеннаяПодсказка + 216 + Label + true + true + + Left + + + Page + + auto + +
    + + СтраницаПредопределенныеОтветыВКолонках + 33 + + ГруппаСоставКолонокОтветыВКолонках + 47 + + ВопросКолонкаОтветыВКолонках + 40 + true + true + + true + + + ПредставлениеВопросаДляКолонок + + None + + ВопросКолонкаОтветыВКолонкахРасширеннаяПодсказка + 240 + Label + true + true + + Left + + + + ВопросКолонкаОтветыВКолонкахКонтекстноеМеню + 41 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ОтветыКолонкиОтветыВКолонках + 42 + true + true + + true + + + Ответы + + false + None + + ОтветыКолонкиОтветыВКолонкахОтвет + 113 + true + true + + true + + + Ответы.Ответ + + + ОтветыКолонкиОтветыВКолонкахОтветРасширеннаяПодсказка + 253 + Label + true + true + + Left + + + + ОтветыКолонкиОтветыВКолонкахОтветКонтекстноеМеню + 114 + true + + InputField + Auto + true + Left + true + + + StartChoice + ОтветыКолонкиОтветыВКолонкахОтветНачалоВыбора + + true + true + true + true + true + true + Normal + + + ВопросДляКолонок + + + + + + ОтветыКолонкиОтветыВКолонкахКоманднаяПанель + 44 + + ЗаполнитьВариантыОтветовОтветыКолонки + 144 + true + true + + true + + false + + ЗаполнитьВариантыОтветовОтветыКолонкиРасширеннаяПодсказка + 242 + Label + true + true + + Left + + + Form.Command.ЗаполнитьВариантыОтветовОтветыКолонки + Normal + Picture + true + true + UserCmds + + StdPicture.Next + + Auto + InCommandBarAndInAdditionalSubmenu + + Left + true + + + BeforeAddRow + ОтветыКолонкиОтветыВКолонкахПередНачаломДобавления + + + OnChange + ОтветыКолонкиОтветыВКолонкахПриИзменении + + + ОтветыКолонкиОтветыВКолонкахСтрокаПоиска + 244 + + ОтветыКолонкиОтветыВКолонкахСтрокаПоискаРасширеннаяПодсказка + 246 + Label + true + true + + Left + + + + ОтветыКолонкиОтветыВКолонкахСтрокаПоискаКонтекстноеМеню + 245 + true + + ОтветыКолонкиОтветыВКолонках + + true + + + + ОтветыКолонкиОтветыВКолонкахСостояниеПросмотра + 247 + + ОтветыКолонкиОтветыВКолонкахСостояниеПросмотраРасширеннаяПодсказка + 249 + Label + true + true + + Left + + + + ОтветыКолонкиОтветыВКолонкахСостояниеПросмотраКонтекстноеМеню + 248 + true + + ViewStatusAddition + ОтветыКолонкиОтветыВКолонках + + true + + + + ОтветыКолонкиОтветыВКолонкахУправлениеПоиском + 250 + + ОтветыКолонкиОтветыВКолонкахУправлениеПоискомРасширеннаяПодсказка + 252 + Label + true + true + + Left + + + + ОтветыКолонкиОтветыВКолонкахУправлениеПоискомКонтекстноеМеню + 251 + true + + SearchControlAddition + ОтветыКолонкиОтветыВКолонках + + true + + + + ОтветыКолонкиОтветыВКолонкахРасширеннаяПодсказка + 243 + Label + true + true + + Left + + + + ОтветыКолонкиОтветыВКолонкахКонтекстноеМеню + 43 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + true + true + None + None + None + true + + + + ВопросДляКолонок + 125 + true + + true + + + ВопросДляКолонок + + + ВопросДляКолонокРасширеннаяПодсказка + 263 + Label + true + true + + Left + + + + ВопросДляКолонокКонтекстноеМеню + 126 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Состав колонок</value> + + + ru + Группа состав колонок ответы в колонках + + + ГруппаСоставКолонокОтветыВКолонкахРасширеннаяПодсказка + 239 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница предопределенные ответы в колонках</value> + + + ru + Страница предопределенные ответы в колонках + + + СтраницаПредопределенныеОтветыВКолонкахРасширеннаяПодсказка + 238 + Label + true + true + + Left + + + Page + + auto + + + + СтраницаПредопределенныеОтветыВСтроках + 32 + + ГруппаСоставСтрокОтветыВСтроках + 53 + + ВопросСтрокаОтветыВСтроках + 59 + true + true + + true + + + ПредставлениеВопросаДляСтрок + + None + + ВопросСтрокаОтветыВСтрокахРасширеннаяПодсказка + 267 + Label + true + true + + Left + + + + ВопросСтрокаОтветыВСтрокахКонтекстноеМеню + 60 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ОтветыСтрокиОтветыВСтроках + 54 + true + true + + true + + + Ответы + + false + None + + ОтветыСтрокиОтветыВСтрокахОтвет + 107 + true + true + + true + + + Ответы.Ответ + + + ОтветыСтрокиОтветыВСтрокахОтветРасширеннаяПодсказка + 280 + Label + true + true + + Left + + + + ОтветыСтрокиОтветыВСтрокахОтветКонтекстноеМеню + 108 + true + + InputField + Auto + true + Left + true + + + StartChoice + ОтветыСтрокиОтветыВСтрокахОтветНачалоВыбора + + true + true + true + true + true + true + Normal + + + ВопросДляСтрок + + + + + + ОтветыСтрокиОтветыВСтрокахКоманднаяПанель + 56 + + ЗаполнитьВариантыОтветовОтветыСтроки + 143 + true + true + + true + + false + + ЗаполнитьВариантыОтветовОтветыСтрокиРасширеннаяПодсказка + 269 + Label + true + true + + Left + + + Form.Command.ЗаполнитьВариантыОтветовОтветыСтроки + Normal + Picture + true + true + UserCmds + + StdPicture.Next + + Auto + InCommandBarAndInAdditionalSubmenu + + Left + true + + + BeforeAddRow + ОтветыСтрокиОтветыВСтрокахПередНачаломДобавления + + + OnChange + ОтветыСтрокиОтветыВСтрокахПриИзменении + + + ОтветыСтрокиОтветыВСтрокахСтрокаПоиска + 271 + + ОтветыСтрокиОтветыВСтрокахСтрокаПоискаРасширеннаяПодсказка + 273 + Label + true + true + + Left + + + + ОтветыСтрокиОтветыВСтрокахСтрокаПоискаКонтекстноеМеню + 272 + true + + ОтветыСтрокиОтветыВСтроках + + true + + + + ОтветыСтрокиОтветыВСтрокахСостояниеПросмотра + 274 + + ОтветыСтрокиОтветыВСтрокахСостояниеПросмотраРасширеннаяПодсказка + 276 + Label + true + true + + Left + + + + ОтветыСтрокиОтветыВСтрокахСостояниеПросмотраКонтекстноеМеню + 275 + true + + ViewStatusAddition + ОтветыСтрокиОтветыВСтроках + + true + + + + ОтветыСтрокиОтветыВСтрокахУправлениеПоиском + 277 + + ОтветыСтрокиОтветыВСтрокахУправлениеПоискомРасширеннаяПодсказка + 279 + Label + true + true + + Left + + + + ОтветыСтрокиОтветыВСтрокахУправлениеПоискомКонтекстноеМеню + 278 + true + + SearchControlAddition + ОтветыСтрокиОтветыВСтроках + + true + + + + ОтветыСтрокиОтветыВСтрокахРасширеннаяПодсказка + 270 + Label + true + true + + Left + + + + ОтветыСтрокиОтветыВСтрокахКонтекстноеМеню + 55 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + true + true + None + None + None + true + + + + ВопросДляСтрок + 123 + true + + true + + + ВопросДляСтрок + + + ВопросДляСтрокРасширеннаяПодсказка + 290 + Label + true + true + + Left + + + + ВопросДляСтрокКонтекстноеМеню + 124 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Состав строк:</value> + + + ru + Группа состав строк ответы в строках + + + ГруппаСоставСтрокОтветыВСтрокахРасширеннаяПодсказка + 266 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Состав строк:</value> + + + ru + Страница предопределенные ответы в строках + + + СтраницаПредопределенныеОтветыВСтрокахРасширеннаяПодсказка + 265 + Label + true + true + + Left + + + Page + + auto + + + + СтраницаРезультирущаяТаблица + 70 + + РезультирующаяТаблица + 76 + true + true + + true + + + РезультирующаяТаблица + + false + None + None + + РезультирующаяТаблицаКоманднаяПанель + 78 + Left + true + + + РезультирующаяТаблицаСтрокаПоиска + 294 + + РезультирующаяТаблицаСтрокаПоискаРасширеннаяПодсказка + 296 + Label + true + true + + Left + + + + РезультирующаяТаблицаСтрокаПоискаКонтекстноеМеню + 295 + true + + РезультирующаяТаблица + + true + + + + РезультирующаяТаблицаСостояниеПросмотра + 297 + + РезультирующаяТаблицаСостояниеПросмотраРасширеннаяПодсказка + 299 + Label + true + true + + Left + + + + РезультирующаяТаблицаСостояниеПросмотраКонтекстноеМеню + 298 + true + + ViewStatusAddition + РезультирующаяТаблица + + true + + + + РезультирующаяТаблицаУправлениеПоиском + 300 + + РезультирующаяТаблицаУправлениеПоискомРасширеннаяПодсказка + 302 + Label + true + true + + Left + + + + РезультирующаяТаблицаУправлениеПоискомКонтекстноеМеню + 301 + true + + SearchControlAddition + РезультирующаяТаблица + + true + + + + РезультирующаяТаблицаРасширеннаяПодсказка + 293 + Label + true + true + + Left + + + + РезультирующаяТаблицаКонтекстноеМеню + 77 + true + + true + 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>Страница результирущая таблица</value> + + + ru + Страница результирущая таблица + + + СтраницаРезультирущаяТаблицаРасширеннаяПодсказка + 292 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + true + true + + true + + + <key>ru</key> + <value>Страницы</value> + + + ru + Страницы + + false + + СтраницыРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + Pages + + Auto + +
    + + ИнформацияПодвал + 130 + true + true + + true + + + ИнформацияПодвал + + None + + ИнформацияПодвалРасширеннаяПодсказка + 311 + Label + true + true + + Left + + + + ИнформацияПодвалКонтекстноеМеню + 131 + true + + LabelField + Enter + true + Left + true + + true + true + + System.DefaultGUIFont + 9.0 + true + false + false + false + + + + + ГруппаКнопки + 10 + + Кнопка + 135 + true + true + + true + + false + + КнопкаРасширеннаяПодсказка + 314 + Label + true + true + + Left + + + UsualButton + Form.StandardCommand.Help + Normal + true + true + UserCmds + Auto + + + Декорация + 133 + true + true + + true + + + ДекорацияРасширеннаяПодсказка + 315 + Label + true + true + + Left + + + + ДекорацияКонтекстноеМеню + 134 + true + + Label + true + true + true + false + + Left + + + + КнопкаНазад + 127 + + <key>ru</key> + <value><<Назад</value> + + true + true + + true + + false + + КнопкаНазадРасширеннаяПодсказка + 316 + Label + true + true + + Left + + + UsualButton + Form.Command.ПредыдущаяСтраница + Normal + true + true + UserCmds + Auto + + + КнопкаВперед + 12 + + <key>ru</key> + <value>Вперед>></value> + + true + true + + true + + false + + КнопкаВпередРасширеннаяПодсказка + 317 + Label + true + true + + 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 + + true + true + + true + + + ru + Группа кнопки + + true + + ГруппаКнопкиРасширеннаяПодсказка + 313 + Label + true + true + + Left + + + UsualGroup + + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + CustomizeForm + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ТипТабличногоВопроса + + <key>ru</key> + <value>Тип табличного вопроса</value> + + 1 + + EnumRef.ТипыТабличныхВопросов + + + true + + + true + + + + ПредопределеныеЗначенияНеобходимыеНаКлиенте + + <key>ru</key> + <value>Предопределеные значения необходимые на клиенте</value> + + 7 + + ValueList + + + true + + + true + + + + + + + Вопросы + 10 + + ValueTable + + + true + + + true + + + ЭлементарныйВопрос + + <key>ru</key> + <value>Элементарный вопрос</value> + + 1 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Представление</value> + + 2 + + String + + 150 + + + + true + + + true + + + + Формулировка + + <key>ru</key> + <value>Формулировка</value> + + 3 + + String + + 500 + + + + true + + + true + + + + ТипОтвета + + <key>ru</key> + <value>Тип ответа</value> + + 4 + + EnumRef.ТипыОтветовНаВопрос + + + true + + + true + + + + + РезультирующаяТаблица + + <key>ru</key> + <value>Результирующая таблица</value> + + 8 + + ValueTable + + + true + + + true + + + + Ответы + + <key>ru</key> + <value>Ответы</value> + + 2 + + ValueTable + + + true + + + true + + + ЭлементарныйВопрос + + <key>ru</key> + <value>Элементарный вопрос</value> + + 1 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + Ответ + + <key>ru</key> + <value>Ответ</value> + + 2 + + Characteristic.ВопросыДляАнкетирования + + + true + + + true + + + + + ПредставлениеВопросаДляСтрок + + <key>ru</key> + <value>Представление вопроса для строк</value> + + 3 + + String + + 150 + + + + true + + + true + + + + ПредставлениеВопросаДляКолонок + + <key>ru</key> + <value>Представление вопроса для колонок</value> + + 4 + + String + + + + true + + + true + + + + ВопросДляКолонок + + <key>ru</key> + <value>Вопрос для колонок</value> + + 5 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + ВопросДляСтрок + + <key>ru</key> + <value>Вопрос для строк</value> + + 6 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + ИнформацияШапка + + <key>ru</key> + <value>Информация шапка</value> + + 9 + + String + + + + true + + + true + + + + ИнформацияПодвал + + <key>ru</key> + <value>Информация подвал</value> + + 11 + + String + + + + true + + + true + + + + Формулировка + + <key>ru</key> + <value>Формулировка</value> + + 12 + + String + + 300 + + + + 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 + + + + + +
    diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Help/ru.html b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Help/ru.html new file mode 100644 index 000000000..ba87da601 --- /dev/null +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Help/ru.html @@ -0,0 +1,20 @@ + +

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

    +

     

    +

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

    +

     

    +
    • Составной табличный вопрос +
    • Табличный вопрос с предопределенными ответами в колонках +
    • Табличный вопрос с предопределенными ответами в строках +
    • Табличный вопрос с предопределенными ответами в строках и колонках

     

    +

    Составной табличный вопрос:

    +

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

    +

     

    +

    Табличный вопрос с предопределенными ответами в строках:

    +

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

    +

     

    +

    Табличный вопрос с предопределенными ответами в колонках:

    +

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

    +

     

    +

    Табличный вопрос с предопределенными ответами в строках и колонках:

    +

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl new file mode 100644 index 000000000..93ca82d94 --- /dev/null +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl @@ -0,0 +1,750 @@ +&НаКлиенте +Перем ЗначенияПеречисленияТипыТабличныхВопросов; +&НаКлиенте +Перем ЗначенияПустыеСсылки; +&НаКлиенте +Перем ЗначенияПеречисленияТипыОтветовНаВопрос; + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ + +&НаКлиенте +Процедура УстановитьИнформационныеНадписи() + + ТекущаяСтраница = Элементы.Страницы.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.СтраницаРезультирущаяТаблица Тогда + ИнформацияШапка = НСтр("ru='Результирующая таблица:'"); + ИнформацияПодвал = НСтр("ru='Нажмите Готово для окончания редактирования.'"); + Элементы.КнопкаВперед.Заголовок = НСтр("ru='Готово'"); + Иначе + Элементы.КнопкаВперед.Заголовок = НСтр("ru='Вперед>>'"); + Если ТекущаяСтраница = Элементы.СтраницаВопросы Тогда + Если ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.Составной Тогда + ИнформацияШапка = НСтр("ru='Подбор вопросов. Укажите хотя бы один вопрос:'"); + ИнформацияПодвал = НСтр("ru='Нажмите Вперед для просмотра получившейся таблицы.'"); + ИначеЕсли ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + ИнформацияШапка =НСтр("ru='Подбор вопросов. Укажите три вопроса:'"); + ИнформацияПодвал =НСтр("ru='Нажмите Вперед для подбора предопределенных ответов.'"); + Иначе + ИнформацияШапка =НСтр("ru='Подбор вопросов. Укажите как минимум два вопроса:'"); + ИнформацияПодвал =НСтр("ru='Нажмите Вперед для подбора предопределенных ответов.'"); + КонецЕсли; + ИначеЕсли ТекущаяСтраница = Элементы.СтраницаТипТабличногоВопроса Тогда + ИнформацияШапка = НСтр("ru='Выбор типа табличного вопроса:'"); + ИнформацияПодвал = НСтр("ru='Нажмите Вперед для подбора вопросов:'"); + Иначе + ИнформацияШапка = НСтр("ru='Подбор предопределенных ответов:'"); + ИнформацияПодвал = НСтр("ru='Нажмите Вперед для просмотра получившейся таблицы:'"); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры +// Управляет доступностью реквизитов формы +&НаКлиенте +Процедура УправлениеДоступностью() + + ТекущаяСтраница = Элементы.Страницы.ТекущаяСтраница; + + Элементы.КнопкаНазад.Доступность = (НЕ ТекущаяСтраница = Элементы.СтраницаТипТабличногоВопроса); + + Если ТекущаяСтраница = Элементы.СтраницаПредопределенныеОтветыВСтрокахИКолонках Тогда + + Если НЕ ВсеОтветыЗаполнены() Тогда + Элементы.КнопкаВперед.Доступность = Ложь; + Возврат; + КонецЕсли; + + Элементы.ЗаполнитьКолонкиВариантыОтветовОтветыСтрокахИКолонках.Доступность = (Вопросы[1].ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.НесколькоВариантовИз + Или Вопросы[1].ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.ОдинВариантИз); + + Элементы.ЗаполнитьСтрокиВариантыОтветовОтветыСтрокиИКолонки.Доступность = (Вопросы[0].ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.НесколькоВариантовИз + Или Вопросы[0].ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.ОдинВариантИз); + + Если Ответы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ВопросДляКолонок)).Количество() > 0 + И Ответы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ВопросДляСтрок)).Количество() > 0 Тогда + + Элементы.КнопкаВперед.Доступность = Истина; + + Иначе + + Элементы.КнопкаВперед.Доступность = Ложь; + + КонецЕсли; + + ИначеЕсли ТекущаяСтраница = Элементы.СтраницаПредопределенныеОтветыВСтроках Тогда + + Элементы.ЗаполнитьВариантыОтветовОтветыСтроки.Доступность = (Вопросы[0].ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.НесколькоВариантовИз + Или Вопросы[0].ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.ОдинВариантИз); + + Если НЕ ВсеОтветыЗаполнены() Тогда + Элементы.КнопкаВперед.Доступность = Ложь; + Возврат; + КонецЕсли; + + Элементы.КнопкаВперед.Доступность = (Ответы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ВопросДляСтрок)).Количество() > 0); + + ИначеЕсли ТекущаяСтраница = Элементы.СтраницаПредопределенныеОтветыВКолонках Тогда + + Элементы.ЗаполнитьВариантыОтветовОтветыКолонки.Доступность = (Вопросы[0].ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.НесколькоВариантовИз + Или Вопросы[0].ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.ОдинВариантИз); + + Если НЕ ВсеОтветыЗаполнены() Тогда + Элементы.КнопкаВперед.Доступность = Ложь; + Возврат; + КонецЕсли; + + Элементы.КнопкаВперед.Доступность = (Ответы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ВопросДляКолонок)).Количество() > 0); + + ИначеЕсли ТекущаяСтраница = Элементы.СтраницаТипТабличногоВопроса Тогда + + Элементы.КнопкаВперед.Доступность = ТипТабличногоВопроса <> ЗначенияПеречисленияТипыТабличныхВопросов.ПустаяСсылка; + + Если ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.Составной Тогда + + Элементы.СтраницыТипТабличногоВопросаКартинки.ТекущаяСтраница = Элементы.СтраницаКартинкаСоставной; + + ИначеЕсли ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда + + Элементы.СтраницыТипТабличногоВопросаКартинки.ТекущаяСтраница = Элементы.СтраницаКартинкаОтветыВСтроках; + + ИначеЕсли ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда + + Элементы.СтраницыТипТабличногоВопросаКартинки.ТекущаяСтраница = Элементы.СтраницаКартинкаОтветыВКолонках; + + ИначеЕсли ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + + Элементы.СтраницыТипТабличногоВопросаКартинки.ТекущаяСтраница = Элементы.СтраницаКартинкаОтветыВСтрокахИКолонках; + + Иначе + + Элементы.СтраницыТипТабличногоВопросаКартинки.ТекущаяСтраница = Элементы.СтраницаКартинкаПустая; + + КонецЕсли; + + ИначеЕсли ТекущаяСтраница = Элементы.СтраницаВопросы Тогда + + Если Вопросы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ЗначенияПустыеСсылки.ВопросыДляАнкетирования)).Количество() <> 0 Тогда + Элементы.КнопкаВперед.Доступность = Ложь; + Возврат; + КонецЕсли; + + Если ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.Составной Тогда + + Элементы.КнопкаВперед.Доступность = (Вопросы.Количество() > 0); + + ИначеЕсли ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда + + Элементы.КнопкаВперед.Доступность = (Вопросы.Количество() > 1); + + ИначеЕсли ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда + + Элементы.КнопкаВперед.Доступность = (Вопросы.Количество() > 1); + + ИначеЕсли ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + + Элементы.КнопкаВперед.Доступность = (Вопросы.Количество() = 3); + + КонецЕсли; + + ИначеЕсли ТекущаяСтраница = Элементы.СтраницаРезультирущаяТаблица Тогда + + Элементы.КнопкаВперед.Доступность = ЗначениеЗаполнено(Формулировка); + + КонецЕсли; + +КонецПроцедуры // УправлениеДоступностью() + +// Проверяет, все ли ответы заполнены +// +// Возвращаемое значение: +// Булево - Истина если все ответы заполнены +// +&НаКлиенте +Функция ВсеОтветыЗаполнены() + + Для каждого Ответ Из Ответы Цикл + + Если НЕ ЗначениеЗаполнено(Ответ.Ответ) Тогда + Возврат Ложь; + КонецЕсли; + + КонецЦикла; + + Возврат Истина; + +КонецФункции // () + +// Процедура получает необходмые значения предопределенных значений, +// необходимых на клиенте. +&НаСервере +Процедура ПолучениеПредопределенныхЗначенийНеобходимыхНаКлиенте() + + ПеречислениеТипыТабличныхВопросов = Анкетирование.ПолучитьСтруктуруЗначенияПеречисления("ТипыТабличныхВопросов",Истина); + ПредопределеныеЗначенияНеобходимыеНаКлиенте.Вставить(0,ПеречислениеТипыТабличныхВопросов); + + СтруктураПустыеСсылки = Новый Структура(); + СтруктураПустыеСсылки.Вставить("ВопросыДляАнкетирования",ПланыВидовХарактеристик.ВопросыДляАнкетирования.ПустаяСсылка()); + ПредопределеныеЗначенияНеобходимыеНаКлиенте.Вставить(1,СтруктураПустыеСсылки); + + ПеречислениеТипыОтветовНаВопрос = Анкетирование.ПолучитьСтруктуруЗначенияПеречисления("ТипыОтветовНаВопрос",Истина); + ПредопределеныеЗначенияНеобходимыеНаКлиенте.Вставить(2,ПеречислениеТипыОтветовНаВопрос); + + +КонецПроцедуры // ПредопределеныеЗначенияНеобходимыеНаКлиенте() + +// Процедура обрабатывает начало выбора из списков, и устанавливает отборы в формах выбора +&НаКлиенте +Процедура НачалоВыбораСписков(Элемент,СтандартнаяОбработка,ОписаниеДоступныхТипов) + + Если ТипЗнч(ЭтаФорма[Элемент.СвязьПоТипу.ПутьКДанным]) = Тип("ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования") Тогда + + Если ОписаниеДоступныхТипов.СодержитТип(Тип("СправочникСсылка.ВариантыОтветовАнкет")) И (ОписаниеДоступныхТипов.Типы().Количество() = 1 ) Тогда + + СтандартнаяОбработка = ЛОЖЬ; + + МассивОтбора = Новый Массив; + МассивОтбора.Добавить(АнкетированиеКлиент.СоздатьСтруктуруПараметраОтбора(Тип("ЭлементОтбораКомпоновкиДанных"),"Владелец",ВидСравненияКомпоновкиДанных.Равно,ЭтаФорма[Элемент.СвязьПоТипу.ПутьКДанным])); + МассивОтбора.Добавить(АнкетированиеКлиент.СоздатьСтруктуруПараметраОтбора(Тип("ЭлементОтбораКомпоновкиДанных"),"ПометкаУдаления",ВидСравненияКомпоновкиДанных.Равно,ЛОЖЬ)); + + ОткрытьФорму("Справочник.ВариантыОтветовАнкет.Форма.ФормаВыбора",Новый Структура("МассивОтбора",МассивОтбора),Элемент); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры // () + +// Процедура очищает таблицу ответов, от ответов, родительский вопрос которых +// не входит в МассивВопросов, выступающий в качестве параметра +&НаКлиенте +Процедура ОчиститьСписокОтветовЕслиНеобходимо(МассивВопросов) + + УдаляемыеОтветы = Новый Массив; + + Для каждого Ответ Из Ответы Цикл + + Если МассивВопросов.Найти(Ответ.ЭлементарныйВопрос) = Неопределено Тогда + УдаляемыеОтветы.Добавить(Ответ); + КонецЕсли; + + КонецЦикла; + + Для каждого УдаляемыйОтвет Из УдаляемыеОтветы Цикл + Ответы.Удалить(УдаляемыйОтвет); + КонецЦикла; + +КонецПроцедуры // ОчиститьПодчиненныйСписокЕслиНеобходимо() + + // Устанавливает нужную страницу формирвания структуры табличного вопроса в зависимости от + // выбранного типа табличного вопроса +&НаКлиенте +Процедура УстановитьСтраницуОтветы() + + + МассивВопросовДляКоторыйДолжныБытьОтветы = Новый Массив; + + Если ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + + Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаПредопределенныеОтветыВСтрокахИКолонках; + ПредставлениеВопросаДляСтрок = Вопросы[0].Формулировка; + ВопросДляСтрок = Вопросы[0].ЭлементарныйВопрос; + ПредставлениеВопросаДляКолонок = Вопросы[1].Формулировка; + ВопросДляКолонок = Вопросы[1].ЭлементарныйВопрос; + + МассивВопросовДляКоторыйДолжныБытьОтветы.Добавить(ВопросДляСтрок); + МассивВопросовДляКоторыйДолжныБытьОтветы.Добавить(ВопросДляКолонок); + + ИначеЕсли ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда + + Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаПредопределенныеОтветыВСтроках; + ПредставлениеВопросаДляСтрок = Вопросы[0].Формулировка; + ВопросДляСтрок = Вопросы[0].ЭлементарныйВопрос; + + МассивВопросовДляКоторыйДолжныБытьОтветы.Добавить(ВопросДляСтрок); + + ИначеЕсли ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда + + Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаПредопределенныеОтветыВКолонках; + ПредставлениеВопросаДляКолонок = Вопросы[0].Формулировка; + ВопросДляКолонок = Вопросы[0].ЭлементарныйВопрос; + + МассивВопросовДляКоторыйДолжныБытьОтветы.Добавить(ВопросДляКолонок); + + КонецЕсли; + + ОчиститьСписокОтветовЕслиНеобходимо(МассивВопросовДляКоторыйДолжныБытьОтветы); + УстановитьОтборы(); + +КонецПроцедуры // () + +// Формирует результирующую таблицу вопроса +&НаСервере +Процедура СформироватьРезультирующуюТаблицу() + + Анкетирование.ОбновитьПревьюТабличныйВопрос(РеквизитФормыВЗначение("Вопросы"),Ответы,ТипТабличногоВопроса,ЭтаФорма,"РезультирующаяТаблица",""); + +КонецПроцедуры // () + +// Формирует структуру возврата для передачи в форму владельца +&НаКлиенте +Функция СформироватьСтруктуруПараметровДляПередачиВладельцу() + + СтруктураПараметров = Новый Структура; + СтруктураПараметров.Вставить("ТипТабличногоВопроса",ТипТабличногоВопроса); + + ВопросыКВозврату = Новый Массив; + Для каждого СтрокаТаблицы Из Вопросы Цикл + ВопросыКВозврату.Добавить(СтрокаТаблицы.ЭлементарныйВопрос); + КонецЦикла; + СтруктураПараметров.Вставить("Вопросы",ВопросыКВозврату); + СтруктураПараметров.Вставить("Ответы" ,Ответы); + СтруктураПараметров.Вставить("Формулировка",Формулировка); + + Возврат СтруктураПараметров; + +КонецФункции // () + +// Обрабатывает параметры формы владельца +// +&НаСервере +Процедура ОбработатьПараметрыФормыВладельца() + + Формулировка = Параметры.Формулировка; + + Если НЕ Параметры.ТипТабличногоВопроса.Пустая() Тогда + ТипТабличногоВопроса = Параметры.ТипТабличногоВопроса; + Иначе + ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной; + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ + | Вопросы.ЭлементарныйВопрос, + | Вопросы.НомерСтроки + |ПОМЕСТИТЬ ЭлементарныеВопросы + |ИЗ + | &Вопросы КАК Вопросы + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ЭлементарныеВопросы.ЭлементарныйВопрос КАК ЭлементарныйВопрос, + | ЕСТЬNULL(ВопросыДляАнкетирования.Представление, """""""") КАК Представление, + | ЕСТЬNULL(ВопросыДляАнкетирования.Формулировка, """""""") КАК Формулировка, + | ЕСТЬNULL(ВопросыДляАнкетирования.ТипОтвета, """") КАК ТипОтвета + |ИЗ + | ЭлементарныеВопросы КАК ЭлементарныеВопросы + | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования + | ПО ЭлементарныеВопросы.ЭлементарныйВопрос = ВопросыДляАнкетирования.Ссылка + | + |УПОРЯДОЧИТЬ ПО + | ЭлементарныеВопросы.НомерСтроки"; + + Запрос.УстановитьПараметр("Вопросы",Параметры.СоставТабличногоВопроса.Выгрузить()); + + Результат = Запрос.Выполнить(); + Если НЕ Результат.Пустой() Тогда; + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + + НоваяСтрока = Вопросы.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока,Выборка); + + КонецЦикла; + КонецЕсли; + + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(Параметры.ПредопределенныеОтветы,Ответы); + +КонецПроцедуры // ОбработатьПараметрыФормыВладельца() + +// Устанавливает отборы в элементы форм, предназначенные для +// составления списка предопределенных ответов +&НаКлиенте +Процедура УстановитьОтборы() + + Если ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + + Элементы.ОтветыКолонкиОтветыВСтрокахИКолонках.ОтборСтрок = Новый ФиксированнаяСтруктура("ЭлементарныйВопрос",ВопросДляКолонок); + Элементы.ОтветыСтрокиОтветыВСтрокахИКолонках.ОтборСтрок = Новый ФиксированнаяСтруктура("ЭлементарныйВопрос",ВопросДляСтрок); + + ИначеЕсли ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда + + Элементы.ОтветыСтрокиОтветыВСтроках.ОтборСтрок = Новый ФиксированнаяСтруктура("ЭлементарныйВопрос",ВопросДляСтрок); + + ИначеЕсли ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда + + Элементы.ОтветыКолонкиОтветыВКолонках.ОтборСтрок = Новый ФиксированнаяСтруктура("ЭлементарныйВопрос",ВопросДляКолонок); + + КонецЕсли; + +КонецПроцедуры // УстановитьОтборы() + +// Вызывается при изменении элементов форма, связанных с таблицей ответов +// Параметры +// Элемент - ТаблицаФормы - ЭлементКоторыйВызвал изменение +&НаКлиенте +Процедура ПриИзмененииОтветов(Элемент) + + УправлениеДоступностью(); + УстановитьОтборы(); + Элемент.Обновить(); + +КонецПроцедуры // () + +&НаКлиенте +Процедура ОбработатьЭлементПодбораОтветовПослеДобавления(Элемент,ДобавленнаяСтрока) + + Элемент.ТекущаяСтрока = ДобавленнаяСтрока.ПолучитьИдентификатор(); + УстановитьОтборы(); + Элемент.Обновить(); + УправлениеДоступностью(); + +КонецПроцедуры // + +&НаКлиенте +Функция ДобавлениеОтветаИнтерактивно(Элемент,Копирование,НомерОпорногоВопроса) + + Если Копирование Тогда + + НоваяСтрока = Ответы.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока,Элемент.ТекущиеДанные); + + Иначе + + Если Вопросы.Количество() >= НомерОпорногоВопроса+1 Тогда + + НоваяСтрока = Ответы.Добавить(); + НоваяСтрока.ЭлементарныйВопрос = Вопросы[НомерОпорногоВопроса].ЭлементарныйВопрос; + + Иначе + Возврат Неопределено; + КонецЕсли; + + КонецЕсли; + + + Возврат НоваяСтрока; + +КонецФункции + +&НаКлиенте +Процедура ЗакончитьРедактированиеИЗакрыть() + + Если ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.Составной Тогда + Ответы.Очистить(); + КонецЕсли; + + Оповестить("ОкончаниеРедактированияПараметровТабличногоВопроса",СформироватьСтруктуруПараметровДляПередачиВладельцу()); + Закрыть(); + +КонецПроцедуры + +// Очищает ответы и заполняет их вариантами ответов +// +// Параметры +// ЭлементарныйВопрос - ПланВидовХарактеристик.ВопросыДляАнкетирования - вопрос для которого будут заполнены его варианты ответов +// +&НаСервере +Процедура ОчиститьЗаполнитьВариантыОтветов(ЭлементарныйВопрос) + + Если Не ЗначениеЗаполнено(ЭлементарныйВопрос) Тогда + Возврат; + КонецЕсли; + + НайденныеСтроки = Ответы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ЭлементарныйВопрос)); + Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл + Ответы.Удалить(Ответы.Индекс(НайденнаяСтрока)); + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ВариантыОтветовАнкет.Ссылка КАК Ответ + |ИЗ + | Справочник.ВариантыОтветовАнкет КАК ВариантыОтветовАнкет + |ГДЕ + | ВариантыОтветовАнкет.Владелец = &ЭлементарныйВопрос + | И (НЕ ВариантыОтветовАнкет.ПометкаУдаления) + | + |УПОРЯДОЧИТЬ ПО + | ВариантыОтветовАнкет.РеквизитДопУпорядочивания"; + + Запрос.УстановитьПараметр("ЭлементарныйВопрос",ЭлементарныйВопрос); + + Результат = Запрос.Выполнить(); + Если Не Результат.Пустой() Тогда + + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + НоваяСтрока = Ответы.Добавить(); + НоваяСтрока.ЭлементарныйВопрос = ЭлементарныйВопрос; + НоваяСтрока.Ответ = Выборка.Ответ; + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры // () + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ЗначенияПеречисленияТипыТабличныхВопросов = ПредопределеныеЗначенияНеобходимыеНаКлиенте.Получить(0).Значение; + ЗначенияПустыеСсылки = ПредопределеныеЗначенияНеобходимыеНаКлиенте.Получить(1).Значение; + ЗначенияПеречисленияТипыОтветовНаВопрос = ПредопределеныеЗначенияНеобходимыеНаКлиенте.Получить(2).Значение; + + УправлениеДоступностью(); + УстановитьИнформационныеНадписи(); + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + //получим предопределенные значения, которые нам понадобятся на клиенты + ПолучениеПредопределенныхЗначенийНеобходимыхНаКлиенте(); + + //Установим список выбора для типа табличного вопроса + Для каждого ЭлементМетаданных Из Метаданные.Перечисления.ТипыТабличныхВопросов.ЗначенияПеречисления Цикл + Элементы.ТипТабличногоВопроса.СписокВыбора.Добавить(Перечисления.ТипыТабличныхВопросов[ЭлементМетаданных.Имя],ЭлементМетаданных.Синоним); + КонецЦикла; + + //Установим первую страницу + Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаТипТабличногоВопроса; + + //Примем параметры формы владельца + ОбработатьПараметрыФормыВладельца(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// КОМАНДЫ ФОРМЫ + +&НаКлиенте +Процедура СледующаяСтраница(Команда) + + ТекущаяСтраница = Элементы.Страницы.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.СтраницаТипТабличногоВопроса Тогда + + Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаВопросы; + + ИначеЕсли (ТекущаяСтраница = Элементы.СтраницаВопросы) И (ТипТабличногоВопроса <> ЗначенияПеречисленияТипыТабличныхВопросов.Составной) Тогда + + УстановитьСтраницуОтветы(); + + ИначеЕсли ТекущаяСтраница = Элементы.СтраницаРезультирущаяТаблица Тогда + + ЗакончитьРедактированиеИЗакрыть(); + + Иначе + + СформироватьРезультирующуюТаблицу(); + Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаРезультирущаяТаблица; + + КонецЕсли; + + УправлениеДоступностью(); + УстановитьИнформационныеНадписи(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредыдущаяСтраница(Команда) + + Если Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаРезультирущаяТаблица Тогда + + Если ТипТабличногоВопроса = ЗначенияПеречисленияТипыТабличныхВопросов.Составной Тогда + Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаВопросы; + Иначе + УстановитьСтраницуОтветы(); + КонецЕсли; + + ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаВопросы Тогда + + Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаТипТабличногоВопроса; + + Иначе + + Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаВопросы; + + КонецЕсли; + + УправлениеДоступностью(); + УстановитьИнформационныеНадписи(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьВариантыОтветовОтветыВСтроках(Команда) + + ОчиститьЗаполнитьВариантыОтветов(ВопросДляСтрок); + УстановитьОтборы(); + УправлениеДоступностью(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьВариантыОтветовОтветыВКолонках(Команда) + + ОчиститьЗаполнитьВариантыОтветов(ВопросДляКолонок); + УстановитьОтборы(); + УправлениеДоступностью(); + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ТипТабличногоВопросаПриИзменении(Элемент) + + УправлениеДоступностью(); + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// КОМАНДЫ ФОРМЫ +&НаКлиенте +Процедура ВопросыВопросОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Если ВыбранноеЗначение = Неопределено Тогда + Возврат; + КонецЕсли; + + РеквизитыВопрос = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ВыбранноеЗначение,"Представление,Формулировка,ЭтоГруппа,ТипОтвета"); + Если РеквизитыВопрос.ЭтоГруппа Тогда + Возврат; + КонецЕсли; + + ТекЭлемент = Вопросы.НайтиПоИдентификатору(Элементы.Вопросы.ТекущаяСтрока); + ТекЭлемент.ЭлементарныйВопрос = ВыбранноеЗначение; + + ТекЭлемент.Представление = РеквизитыВопрос.Представление; + ТекЭлемент.Формулировка = РеквизитыВопрос.Формулировка; + ТекЭлемент.ТипОтвета = РеквизитыВопрос.ТипОтвета; + + УправлениеДоступностью(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтветыСтрокиОтветыВСтрокахПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Отказ = Истина; + + НоваяСтрока = ДобавлениеОтветаИнтерактивно(Элемент,Копирование,0); + ОбработатьЭлементПодбораОтветовПослеДобавления(Элемент,НоваяСтрока); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтветыКолонкиОтветыВКолонкахПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Отказ = Истина; + + НоваяСтрока = ДобавлениеОтветаИнтерактивно(Элемент,Копирование,0); + ОбработатьЭлементПодбораОтветовПослеДобавления(Элемент,НоваяСтрока); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтветыКолонкиОтветыВСтрокахИКолонкахОтветНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + НачалоВыбораСписков(Элемент,СтандартнаяОбработка,ОбщегоНазначения.ПолучитьЗначениеРеквизита(ВопросДляКолонок,"ТипЗначения")); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтветыСтрокиОтветыВСтрокахОтветНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + НачалоВыбораСписков(Элемент,СтандартнаяОбработка,ОбщегоНазначения.ПолучитьЗначениеРеквизита(ВопросДляСтрок,"ТипЗначения")); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтветыСтрокиОтветыВСтрокахИКолонкахОтветНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + НачалоВыбораСписков(Элемент,СтандартнаяОбработка,ОбщегоНазначения.ПолучитьЗначениеРеквизита(ВопросДляСтрок,"ТипЗначения")); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтветыКолонкиОтветыВКолонкахОтветНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + НачалоВыбораСписков(Элемент,СтандартнаяОбработка,ОбщегоНазначения.ПолучитьЗначениеРеквизита(ВопросДляКолонок,"ТипЗначения")); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтветыКолонкиОтветыВСтрокахИКолонкахПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Отказ = Истина; + + НоваяСтрока = ДобавлениеОтветаИнтерактивно(Элемент,Копирование,1); + ОбработатьЭлементПодбораОтветовПослеДобавления(Элемент,НоваяСтрока); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтветыСтрокиОтветыВСтрокахИКолонкахПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Отказ = Истина; + + НоваяСтрока = ДобавлениеОтветаИнтерактивно(Элемент,Копирование,0); + ОбработатьЭлементПодбораОтветовПослеДобавления(Элемент,НоваяСтрока); + +КонецПроцедуры + +&НаКлиенте +Процедура ВопросыПриИзменении(Элемент) + + УправлениеДоступностью(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтветыКолонкиОтветыВСтрокахИКолонкахПриИзменении(Элемент) + + ПриИзмененииОтветов(Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтветыСтрокиОтветыВСтрокахИКолонкахПриИзменении(Элемент) + + ПриИзмененииОтветов(Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтветыКолонкиОтветыВКолонкахПриИзменении(Элемент) + + ПриИзмененииОтветов(Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтветыСтрокиОтветыВСтрокахПриИзменении(Элемент) + + ПриИзмененииОтветов(Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура ФормулировкаПриИзменении(Элемент) + + Если Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаРезультирущаяТаблица Тогда + + Элементы.КнопкаВперед.Доступность = ЗначениеЗаполнено(Формулировка); + + КонецЕсли; + +КонецПроцедуры + + \ No newline at end of file diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form new file mode 100644 index 000000000..55c37c890 --- /dev/null +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form @@ -0,0 +1,532 @@ + + + + <key>ru</key> + <value>Вопрос шаблона анкеты</value> + + + ЭлементарныйВопрос + 3 + true + true + + true + + + ЭлементарныйВопрос + + + OnChange + ЭлементарныйВопросПриИзменении + + + ЭлементарныйВопросРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + ЭлементарныйВопросКонтекстноеМеню + 4 + true + + InputField + true + Enter + true + Left + true + + + StartChoice + ЭлементарныйВопросНачалоВыбора + + + ChoiceProcessing + ЭлементарныйВопросОбработкаВыбора + + true + true + true + Items + true + true + true + true + Normal + + + + Формулировка + 1 + true + true + + true + + + Формулировка + + + ФормулировкаРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + ФормулировкаКонтекстноеМеню + 2 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаВысотаОбязательный + 5 + + Обязательный + 6 + true + true + + true + + + Обязательный + + Left + + ОбязательныйРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ОбязательныйКонтекстноеМеню + 7 + true + + CheckBoxField + Enter + true + Left + true + + + + ВысотаЭлементаФормулировкиВопроса + 13 + true + true + + true + + + ВысотаЭлементаФормулировкиВопроса + + + ru + О - высота устанавливается автоматически, значение отличное от нуля задает высоту элемента в явном виде + + + ВысотаЭлементаФормулировкиВопросаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ВысотаЭлементаФормулировкиВопросаКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа высота обязательный</value> + + + ru + Группа высота обязательный + + false + + ГруппаВысотаОбязательныйРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаКнопки + 8 + + Декорация + 9 + true + true + + true + + + ДекорацияРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ДекорацияКонтекстноеМеню + 10 + true + + Label + true + true + true + false + + Left + + + + КнопкаГотово + 11 + + <key>ru</key> + <value>Готово</value> + + true + true + + true + + false + + КнопкаГотовоРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + UsualButton + Form.Command.ПеренестиВШаблон + Auto + true + true + true + UserCmds + Auto + + + Закрыть + 12 + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + UsualButton + Form.StandardCommand.Close + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа кнопки</value> + + + ru + Группа кнопки + + + ГруппаКнопкиРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ЭлементарныйВопрос + + <key>ru</key> + <value>Элементарный вопрос</value> + + 1 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + Формулировка + + <key>ru</key> + <value>Формулировка</value> + + 2 + + String + + 300 + + + + true + + + true + + + + Обязательный + + <key>ru</key> + <value>Обязательный</value> + + 3 + + Boolean + + + true + + + true + + + + ТипСтрокиДерева + + <key>ru</key> + <value>Тип строки дерева</value> + + 4 + + String + + 20 + + + + true + + + true + + + + ТипВопроса + + <key>ru</key> + <value>Тип вопроса</value> + + 5 + + EnumRef.ТипыВопросовШаблонаАнкеты + + + true + + + true + + + + ПредопределеныеЗначенияНеобходимыеНаКлиенте + + <key>ru</key> + <value>Предопределеные значения необходимые на клиенте</value> + + 6 + + ValueList + + + true + + + true + + + + + + + ВысотаЭлементаФормулировкиВопроса + + <key>ru</key> + <value>Высота элемента формулировки вопроса</value> + + 7 + + Number + + 2 + true + + + + 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..10d0496a5 --- /dev/null +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Module.bsl @@ -0,0 +1,137 @@ +&НаКлиенте +Перем ЗначенияПеречисленияТипыВопросовШаблонаАнкеты; +&НаКлиенте +Перем ЗначенияПеречисленияТипыОтветовНаВопрос; + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ +// Формирует структуру параметров для передачи в форму владельца +&НаКлиенте +Функция СформироватьСтруктуруПараметровДляПередачиВладельцу() + + СтруктураВозврата = Новый Структура; + СтруктураВозврата.Вставить("Обязательный",Обязательный); + СтруктураВозврата.Вставить("Формулировка",Формулировка); + СтруктураВозврата.Вставить("ЭлементарныйВопрос",ЭлементарныйВопрос); + СтруктураВозврата.Вставить("ВысотаЭлементаФормулировкиВопроса",ВысотаЭлементаФормулировкиВопроса); + + Возврат СтруктураВозврата; + +КонецФункции // + + +// Процедура получает необходмые значения предопределенных значений, +// необходимых на клиенте. + &НаСервере +Процедура ПолучениеПредопределенныхЗначенийНеобходимыхНаКлиенте() + + ПеречислениеТипыВопросовШаблонаАнкеты = Анкетирование.ПолучитьСтруктуруЗначенияПеречисления("ТипыВопросовШаблонаАнкеты",Истина); + ПредопределеныеЗначенияНеобходимыеНаКлиенте.Вставить(0,ПеречислениеТипыВопросовШаблонаАнкеты); + + ПеречислениеТипыОтветовНаВопрос = Анкетирование.ПолучитьСтруктуруЗначенияПеречисления("ТипыОтветовНаВопрос"); + ПредопределеныеЗначенияНеобходимыеНаКлиенте.Вставить(1,ПеречислениеТипыОтветовНаВопрос); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗаполнитьЗначенияСвойств(ЭтаФорма,Параметры); + Если ТипСтрокиДерева = "Раздел" Тогда + + Элементы.ГруппаВысотаОбязательный.Видимость = Ложь; + Элементы.ЭлементарныйВопрос.Видимость = Ложь; + Элементы.Формулировка.Заголовок = "Имя раздела"; + Заголовок = "Раздел шаблона анкеты"; + + КонецЕсли; + + ПолучениеПредопределенныхЗначенийНеобходимыхНаКлиенте(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ЗначенияПеречисленияТипыВопросовШаблонаАнкеты = ПредопределеныеЗначенияНеобходимыеНаКлиенте.Получить(0).Значение; + ЗначенияПеречисленияТипыОтветовНаВопрос = ПредопределеныеЗначенияНеобходимыеНаКлиенте.Получить(1).Значение; + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// КОМАНДЫ ФОРМЫ + +&НаКлиенте +Процедура ПеренестиВШаблон(Команда) + + Отказ = Ложь; + + Если Не ЗначениеЗаполнено(Формулировка) Тогда + Отказ = Истина; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = ' Не заполнена формулировка'"),,"Формулировка"); + КонецЕсли; + + Если ТипСтрокиДерева = "Вопрос" И (Не ЗначениеЗаполнено(ЭлементарныйВопрос)) Тогда + Отказ = Истина; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = ' Не указан элементарный вопрос'"),,"ЭлементарныйВопрос"); + КонецЕсли; + + Если Отказ Тогда + Возврат; + КонецЕсли; + + Оповестить("ОкочаниеРедактированияПараметровСтрокиШаблонаАнкеты",СформироватьСтруктуруПараметровДляПередачиВладельцу()); + Закрыть(); + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ЭлементарныйВопросПриИзменении(Элемент) + + Если ПустаяСтрока(Формулировка) И ЗначениеЗаполнено(ЭлементарныйВопрос) Тогда + Формулировка = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ЭлементарныйВопрос,"Формулировка"); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЭлементарныйВопросНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + Если ТипВопроса = ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.ВопросСУсловием Тогда + + СтандартнаяОбработка = ЛОЖЬ; + + МассивОтбора = Новый Массив; + МассивОтбора.Добавить(АнкетированиеКлиент.СоздатьСтруктуруПараметраОтбора(Тип("ЭлементОтбораКомпоновкиДанных"),"ТипОтвета",ВидСравненияКомпоновкиДанных.Равно,ЗначенияПеречисленияТипыОтветовНаВопрос.Булево)); + МассивОтбора.Добавить(АнкетированиеКлиент.СоздатьСтруктуруПараметраОтбора(Тип("ЭлементОтбораКомпоновкиДанных"),"ПометкаУдаления",ВидСравненияКомпоновкиДанных.Равно,ЛОЖЬ)); + + ОткрытьФорму("ПланВидовХарактеристик.ВопросыДляАнкетирования.Форма.ФормаВыбора",Новый Структура("МассивОтбора",МассивОтбора),Элемент); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЭлементарныйВопросОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + РеквзитыВопрос = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ВыбранноеЗначение,"ЭтоГруппа,ТипОтвета"); + + Если РеквзитыВопрос.ЭтоГруппа Тогда + СтандартнаяОбработка = Ложь; + Возврат; + КонецЕсли; + + Если ТипВопроса = ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.ВопросСУсловием + И РеквзитыВопрос.ТипОтвета <> ЗначенияПеречисленияТипыОтветовНаВопрос.Булево Тогда + СтандартнаяОбработка = Ложь; + Возврат; + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..d11ddf966 --- /dev/null +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Form.form @@ -0,0 +1,264 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 4 + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Код + 6 + true + true + + true + + + Список.Code + + + КодРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 9 + + СписокСтрокаПоискаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 10 + true + + Список + + true + + + + СписокСостояниеПросмотра + 12 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 13 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 15 + + СписокУправлениеПоискомРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 16 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + Catalog.ШаблоныАнкет + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/ConditionalAppearance.dcssca b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/ConditionalAppearance.dcssca new file mode 100644 index 000000000..25fcfd052 --- /dev/null +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/ConditionalAppearance.dcssca @@ -0,0 +1,81 @@ + + + + + + ДеревоАнкетыОбязательный + + + + + ДеревоАнкеты.ТипСтроки + NotEqual + Вопрос + + + + + ЦветФона + web:Gainsboro + + + ЦветТекста + web:Gainsboro + + + + + + + ДеревоАнкетыОбязательный + + + + + ДеревоАнкеты.ТипВопроса + Equal + Перечисление.ТипыВопросовШаблонаАнкеты.Табличный + + + + + ЦветФона + web:Gainsboro + + + ЦветТекста + web:Gainsboro + + + + + + + ДеревоАнкетыФормулировка + + + + + ДеревоАнкеты.ТипСтроки + NotEqual + Корень + + + ДеревоАнкеты.Формулировка + Equal + + + + + + ОтметкаНезаполненного + true + + + false + Текст + 123 + + + + diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..1ac780072 --- /dev/null +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,2549 @@ + + + + НаименованиеКод + 5 + + Наименование + 3 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + Код + 1 + true + true + + true + + + Объект.Code + + + КодРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 2 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Наименование код</value> + + + ru + Наименование код + + + НаименованиеКодРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ОсновныеСтраницы + 6 + + Заголовки + 8 + + Заголовок + 9 + true + true + + true + + + Объект.Заголовок + + + ЗаголовокРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + ЗаголовокКонтекстноеМеню + 10 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Вступление + 11 + true + true + + true + + + Объект.Вступление + + + ВступлениеРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + ВступлениеКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + Заключение + 13 + true + true + + true + + + Объект.Заключение + + + ЗаключениеРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + ЗаключениеКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Заголовки</value> + + + ru + Заголовки + + + ЗаголовкиРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ДеревоАнкеты + 7 + + ИнформацияДерево + 70 + true + true + + true + + + ИнформацияДерево + + None + + ИнформацияДеревоРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + + ИнформацияДеревоКонтекстноеМеню + 71 + true + + LabelField + Enter + true + Left + true + + true + true + + System.DefaultGUIFont + 9.0 + true + false + false + false + + + + + ФормаДереваАнкеты + 15 + true + true + + true + + + ДеревоАнкеты + + false + None + + КартинкаПолныйКод + 18 + + ДеревоАнкетыПолныйКод + 72 + true + true + + true + + + ДеревоАнкеты.ПолныйКод + + None + + ДеревоАнкетыПолныйКодРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + + ДеревоАнкетыПолныйКодКонтекстноеМеню + 73 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДеревоАнкетыФормулировка + 23 + + <key>ru</key> + <value>Вопросы:</value> + + true + true + + true + + + ДеревоАнкеты.Формулировка + + + ДеревоАнкетыФормулировкаРасширеннаяПодсказка + 125 + Label + true + true + + Left + + + + ДеревоАнкетыФормулировкаКонтекстноеМеню + 24 + true + + InputField + Auto + true + Left + true + + true + true + false + true + true + true + Normal + + + + ДеревоАнкетыКодКартинки + 21 + true + true + + true + + + ДеревоАнкеты.КодКартинки + + None + + ДеревоАнкетыКодКартинкиРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + + ДеревоАнкетыКодКартинкиКонтекстноеМеню + 22 + true + + PictureField + Auto + true + Left + true + + true + true + true + true + + + 1 + + + + true + true + + true + + + <key>ru</key> + <value>Наименование</value> + + + ru + Наименование + + + КартинкаПолныйКодРасширеннаяПодсказка + 122 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + ДеревоАнкетыОбязательный + 25 + true + true + + true + + + ДеревоАнкеты.Обязательный + + + ДеревоАнкетыОбязательныйРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + + ДеревоАнкетыОбязательныйКонтекстноеМеню + 26 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + Normal + + + + ДеревоАнкетыЗаметки + 75 + true + true + + true + + + ДеревоАнкеты.Заметки + + + ДеревоАнкетыЗаметкиРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + + ДеревоАнкетыЗаметкиКонтекстноеМеню + 76 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаДереваАнкетыКоманднаяПанель + 17 + + ФормаДереваАнкетыДобавить + 68 + true + true + + true + + false + + ФормаДереваАнкетыДобавитьРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + Form.Item.ФормаДереваАнкеты.StandardCommand.Add + Normal + Picture + true + true + UserCmds + Auto + + + ДеревоАнкетыКоманднаяПанельДобавитьРаздел + 29 + true + true + + true + + false + + ДеревоАнкетыКоманднаяПанельДобавитьРазделРасширеннаяПодсказка + 104 + Label + true + true + + Left + + + Form.Command.ДобавитьРаздел + Normal + Auto + true + true + UserCmds + Auto + + + ДеревоАнкетыКоманднаяПанельДобавитьВопрос + 30 + true + true + + true + + false + + ДеревоАнкетыКоманднаяПанельДобавитьВопросРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + Form.Command.ДобавитьПростойВопрос + Normal + Auto + true + true + UserCmds + Auto + + + ДеревоАнкетыКоманднаяПанельДобавитьТабличныйВопрос + 64 + true + true + + true + + false + + ДеревоАнкетыКоманднаяПанельДобавитьТабличныйВопросРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + Form.Command.ДобавитьТабличныйВопрос + Normal + Auto + true + true + UserCmds + Auto + + + ДеревоАнкетыКоманднаяПанельДобавитьВопросСУсловием + 63 + true + true + + true + + false + + ДеревоАнкетыКоманднаяПанельДобавитьВопросСУсловиемРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + Form.Command.ДобавитьВопросСУсловием + Normal + Auto + true + true + UserCmds + Auto + + + ДеревоАнкетыКоманднаяПанельРедактировать + 65 + true + true + + true + + false + + ДеревоАнкетыКоманднаяПанельРедактироватьРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + Form.Item.ФормаДереваАнкеты.StandardCommand.Change + Normal + Auto + true + true + UserCmds + Auto + + + ДеревоАнкетыКоманднаяПанельПереместитьВверх + 31 + true + true + + true + + false + + ДеревоАнкетыКоманднаяПанельПереместитьВверхРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + Form.Item.ФормаДереваАнкеты.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + ДеревоАнкетыКоманднаяПанельПереместитьВниз + 32 + true + true + + true + + false + + ДеревоАнкетыКоманднаяПанельПереместитьВнизРасширеннаяПодсказка + 110 + Label + true + true + + Left + + + Form.Item.ФормаДереваАнкеты.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + ДеревоАнкетыКоманднаяПанельУдалить + 38 + true + true + + true + + false + + ДеревоАнкетыКоманднаяПанельУдалитьРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + Form.Item.ФормаДереваАнкеты.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + Left + + + DragCheck + ФормаДереваАнкетыПроверкаПеретаскивания + + + Selection + ФормаДереваАнкетыВыбор + + + BeforeAddRow + ФормаДереваАнкетыПередНачаломДобавления + + + BeforeDeleteRow + ФормаДереваАнкетыПередУдалением + + + OnActivateRow + ФормаДереваАнкетыПриАктивизацииСтроки + + + DragStart + ФормаДереваАнкетыНачалоПеретаскивания + + + Drag + ФормаДереваАнкетыПеретаскивание + + + BeforeRowChange + ФормаДереваАнкетыПередНачаломИзменения + + + DragEnd + ФормаДереваАнкетыОкончаниеПеретаскивания + + + OnChange + ФормаДереваАнкетыПриИзменении + + + ФормаДереваАнкетыСтрокаПоиска + 113 + + ФормаДереваАнкетыСтрокаПоискаРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + ФормаДереваАнкетыСтрокаПоискаКонтекстноеМеню + 114 + true + + ФормаДереваАнкеты + + true + + + + ФормаДереваАнкетыСостояниеПросмотра + 116 + + ФормаДереваАнкетыСостояниеПросмотраРасширеннаяПодсказка + 118 + Label + true + true + + Left + + + + ФормаДереваАнкетыСостояниеПросмотраКонтекстноеМеню + 117 + true + + ViewStatusAddition + ФормаДереваАнкеты + + true + + + + ФормаДереваАнкетыУправлениеПоиском + 119 + + ФормаДереваАнкетыУправлениеПоискомРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + + ФормаДереваАнкетыУправлениеПоискомКонтекстноеМеню + 120 + true + + SearchControlAddition + ФормаДереваАнкеты + + true + + + + ФормаДереваАнкетыРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + + ФормаДереваАнкетыКонтекстноеМеню + 16 + + КонтекстноеМенюФормаДереваАнкетыДобавить + 69 + true + true + + true + + false + + КонтекстноеМенюФормаДереваАнкетыДобавитьРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + Form.Item.ФормаДереваАнкеты.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + ДеревоАнкетыКонтекстноеМенюДобавитьРаздел + 33 + true + true + + true + + false + + ДеревоАнкетыКонтекстноеМенюДобавитьРазделРасширеннаяПодсказка + 96 + Label + true + true + + Left + + + Form.Command.ДобавитьРаздел + Normal + Auto + true + true + UserCmds + + StdPicture.CreateFolder + + Auto + + + ДеревоАнкетыКонтекстноеМенюДобавитьВопрос + 34 + true + true + + true + + false + + ДеревоАнкетыКонтекстноеМенюДобавитьВопросРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + Form.Command.ДобавитьПростойВопрос + Normal + Auto + true + true + UserCmds + + StdPicture.DataCompositionNewGroup + + Auto + + + ДеревоАнкетыКонтекстноеМенюДобавитьВопросСУсловием + 67 + true + true + + true + + false + + ДеревоАнкетыКонтекстноеМенюДобавитьВопросСУсловиемРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + Form.Command.ДобавитьВопросСУсловием + Normal + Auto + true + true + UserCmds + + StdPicture.DataCompositionNewNestedScheme + + Auto + + + ДеревоАнкетыКонтекстноеМенюДобавитьТабличныйВопрос + 66 + true + true + + true + + false + + ДеревоАнкетыКонтекстноеМенюДобавитьТабличныйВопросРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + Form.Command.ДобавитьТабличныйВопрос + Normal + Auto + true + true + UserCmds + + StdPicture.DataCompositionNewTable + + Auto + + + ДеревоАнкетыКонтекстноеМенюПереместитьВверх + 35 + true + true + + true + + false + + ДеревоАнкетыКонтекстноеМенюПереместитьВверхРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + Form.Item.ФормаДереваАнкеты.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + ДеревоАнкетыКонтекстноеМенюПереместитьВниз + 36 + true + true + + true + + false + + ДеревоАнкетыКонтекстноеМенюПереместитьВнизРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + Form.Item.ФормаДереваАнкеты.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + ДеревоАнкетыКонтекстноеМенюУдалить + 37 + true + true + + true + + false + + ДеревоАнкетыКонтекстноеМенюУдалитьРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + Form.Item.ФормаДереваАнкеты.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + Tree + true + true + true + true + true + Row +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + + ДеревоАнкеты.КодКартинки + + + CommonPicture.КоллекцияКартинокДеревоАнкеты + + None + None + None + true +
    + + СтраницыИнформация + 43 + + СтраницаИнформация + 48 + + Информация + 52 + true + true + + true + + + Информация + + None + + ИнформацияРасширеннаяПодсказка + 143 + Label + true + true + + Left + + + + ИнформацияКонтекстноеМеню + 53 + true + + LabelField + true + Enter + true + Left + true + + true + 3 + true + + System.DefaultGUIFont + MS Shell Dlg + 10.0 + true + false + false + false + + + + true + true + + true + + + <key>ru</key> + <value>Страница информация</value> + + + ru + Страница информация + + + СтраницаИнформацияРасширеннаяПодсказка + 142 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаПустаяТаблица + 57 + + ПустаяТаблица + 58 + true + true + + true + + + ПустаяТаблица + + false + None + + ПустаяТаблицаПустаяКолонка + 61 + true + true + + true + + + ПустаяТаблица.ПустаяКолонка + + + ПустаяТаблицаПустаяКолонкаРасширеннаяПодсказка + 156 + Label + true + true + + Left + + + + ПустаяТаблицаПустаяКолонкаКонтекстноеМеню + 62 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПустаяТаблицаКоманднаяПанель + 60 + Left + true + + + ПустаяТаблицаСтрокаПоиска + 147 + + ПустаяТаблицаСтрокаПоискаРасширеннаяПодсказка + 149 + Label + true + true + + Left + + + + ПустаяТаблицаСтрокаПоискаКонтекстноеМеню + 148 + true + + ПустаяТаблица + + true + + + + ПустаяТаблицаСостояниеПросмотра + 150 + + ПустаяТаблицаСостояниеПросмотраРасширеннаяПодсказка + 152 + Label + true + true + + Left + + + + ПустаяТаблицаСостояниеПросмотраКонтекстноеМеню + 151 + true + + ViewStatusAddition + ПустаяТаблица + + true + + + + ПустаяТаблицаУправлениеПоиском + 153 + + ПустаяТаблицаУправлениеПоискомРасширеннаяПодсказка + 155 + Label + true + true + + Left + + + + ПустаяТаблицаУправлениеПоискомКонтекстноеМеню + 154 + true + + SearchControlAddition + ПустаяТаблица + + true + + + + ПустаяТаблицаРасширеннаяПодсказка + 146 + Label + true + true + + Left + + + + ПустаяТаблицаКонтекстноеМеню + 59 + true + + 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>Страница пустая таблица</value> + + + ru + Страница пустая таблица + + + СтраницаПустаяТаблицаРасширеннаяПодсказка + 145 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + true + true + + true + + + <key>ru</key> + <value>Страницы информация</value> + + + СтраницыИнформацияРасширеннаяПодсказка + 141 + Label + true + true + + Left + + + Pages + + Auto + +
    + true + true + + true + + + <key>ru</key> + <value>Вопросы анкеты</value> + + + ru + Дерево анкеты + + + ДеревоАнкетыРасширеннаяПодсказка + 92 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + true + true + + true + + + <key>ru</key> + <value>Основные страницы</value> + + + ru + Основные страницы + + + ОсновныеСтраницыРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + +
    + + РедактированиеШаблонаЗавершено + 39 + true + true + + true + + + Объект.РедактированиеШаблонаЗавершено + + Right + + РедактированиеШаблонаЗавершеноРасширеннаяПодсказка + 166 + Label + true + true + + Left + + + + РедактированиеШаблонаЗавершеноКонтекстноеМеню + 40 + true + + CheckBoxField + Enter + true + Left + true + + + + ФормаКоманднаяПанель + -1 + + ОткрытьФормуЗаполненияАнкеты + 74 + + <key>ru</key> + <value>Форма заполнения</value> + + true + true + + true + + false + + ОткрытьФормуЗаполненияАнкетыРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + Form.Command.ОткрытьФормуЗаполненияАнкеты + Normal + Auto + true + true + UserCmds + Auto + + + ЗакончитьРедактирование + 54 + true + true + + true + + false + + ЗакончитьРедактированиеРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + Form.Command.ЗакончитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + CatalogObject.ШаблоныАнкет + + + true + + + true + +
    true
    + true +
    + + ДеревоАнкеты + + <key>ru</key> + <value>Дерево анкеты</value> + + 2 + + ValueTree + + + true + + + true + + + КодКартинки + + <key>ru</key> + <value>Код картинки</value> + + 1 + + Number + + 10 + true + + + + true + + + true + + + + Наименование + + <key>ru</key> + <value>Наименование</value> + + 2 + + String + + 300 + + + + true + + + true + + + + ТипСтроки + + <key>ru</key> + <value>Тип строки</value> + + 3 + + String + + 10 + + + + true + + + true + + + + ЭлементарныйВопрос + + <key>ru</key> + <value>Вопросы</value> + + 5 + + String + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + + true + + + true + + + + Обязательный + + <key>ru</key> + <value>Обязательный</value> + + 6 + + Boolean + String + + + + true + + + true + + + + ТипВопроса + + <key>ru</key> + <value>Тип вопроса</value> + + 7 + + EnumRef.ТипыВопросовШаблонаАнкеты + + + true + + + true + + + + ТипОтвета + + <key>ru</key> + <value>Тип ответа</value> + + 8 + + EnumRef.ТипыОтветовНаВопрос + + + true + + + true + + + + ТипТабличногоВопроса + + <key>ru</key> + <value>Тип табличного вопроса</value> + + 4 + + EnumRef.ТипыТабличныхВопросов + + + true + + + true + + + + СоставТабличногоВопроса + + <key>ru</key> + <value>Состав табличного вопроса</value> + + 9 + + ValueTable + + + true + + + true + + + + ПредопределенныеОтветы + + <key>ru</key> + <value>Предопределенные ответы</value> + + 10 + + ValueTable + + + true + + + true + + + + КлючСтроки + + <key>ru</key> + <value>Ключ строки</value> + + 11 + + UUID + + + true + + + true + + + + Длина + + <key>ru</key> + <value>Длина</value> + + 12 + + Number + + 10 + true + + + + true + + + true + + + + МинимальноеЗначение + + <key>ru</key> + <value>Минимальное значение</value> + + 13 + + Number + + 15 + + + + true + + + true + + + + МаксимальноеЗначение + + <key>ru</key> + <value>Максимальное значение</value> + + 14 + + Number + + 15 + + + + true + + + true + + + + ТипЗначения + + <key>ru</key> + <value>Тип значения</value> + + 15 + + TypeDescription + + + true + + + true + + + + ТребуетсяКомментарий + + <key>ru</key> + <value>Требуется комментарий</value> + + 16 + + Boolean + + + true + + + true + + + + ПояснениеКомментария + + <key>ru</key> + <value>Пояснение комментария</value> + + 17 + + String + + 150 + + + + true + + + true + + + + ВопросШаблона + + <key>ru</key> + <value>Вопрос шаблона</value> + + 18 + + CatalogRef.ВопросыШаблонаАнкеты + + + true + + + true + + + + ПолныйКод + 19 + + String + + 100 + + + + true + + + true + + + + Формулировка + + <key>ru</key> + <value>Формулировка</value> + + 20 + + String + + 300 + + + + true + + + true + + + + Точность + + <key>ru</key> + <value>Точность</value> + + 21 + + Number + + 1 + true + + + + true + + + true + + + + ВысотаЭлементаФормулировкиВопроса + + <key>ru</key> + <value>Высота элемента формулировки вопроса</value> + + 22 + + Number + + 2 + true + + + + true + + + true + + + + Заметки + + <key>ru</key> + <value>Заметки</value> + + 23 + + String + + + + true + + + true + + + + + ДеревоАнкеты.СоставТабличногоВопроса + + + ЭлементарныйВопрос + + <key>ru</key> + <value>Элементарный вопрос</value> + + 1 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + НомерСтроки + + <key>ru</key> + <value>Номер строки</value> + + 2 + + Number + + 10 + + + + true + + + true + + + + + + ДеревоАнкеты.ПредопределенныеОтветы + + + Ответ + + <key>ru</key> + <value>Ответ</value> + + 3 + + Characteristic.ВопросыДляАнкетирования + + + true + + + true + + + + ЭлементарныйВопрос + + <key>ru</key> + <value>Элементарный вопрос</value> + + 1 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + НомерСтроки + + <key>ru</key> + <value>Номер строки</value> + + 2 + + Number + + 10 + + + + true + + + true + + + + + + ПредопределеныеЗначенияНеобходимыеНаКлиенте + + <key>ru</key> + <value>Предопределеные значения необходимые на клиенте</value> + + 3 + + ValueList + + + true + + + true + + + + + + + Информация + 4 + + String + + 300 + + + + 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> + + 6 + + String + + + + true + + + true + + + + ПоДанномуШаблонуЕстьАнкеты + + <key>ru</key> + <value>По данному шаблону есть анкеты</value> + + 7 + + Boolean + + + true + + + true + + + + ДобавитьРаздел + + <key>ru</key> + <value>Добавить раздел</value> + + 1 + + ru + Добавить раздел + + + true + + Ctrl+F9 + + CommonPicture.ДобавитьРазделАнкеты + + + + ДобавитьРаздел + + + Auto + Auto + + + ДобавитьПростойВопрос + + <key>ru</key> + <value>Добавить простой вопрос</value> + + 2 + + ru + Добавить простой вопрос + + + true + + Shift+F6 + + CommonPicture.ДобавитьПростойВопрос + + + + ДобавитьПростойВопрос + + + Auto + Auto + + + ЗакончитьРедактирование + + <key>ru</key> + <value>Закончить редактирование</value> + + 4 + + ru + Закончить редактирование + + + true + + + + ЗакончитьРедактирование + + + Auto + Auto + + + ДобавитьВопросСУсловием + + <key>ru</key> + <value>Добавить условный вопрос</value> + + 5 + + ru + Добавить условный вопрос + + + true + + Shift+F8 + + CommonPicture.ДобавитьУсловныйВопрос + + + + ДобавитьВопросСУсловием + + + Auto + Auto + + + ДобавитьТабличныйВопрос + + <key>ru</key> + <value>Добавить табличный вопрос</value> + + 6 + + ru + Добавить табличный вопрос + + + true + + Shift+F7 + + CommonPicture.ДобавитьТабличныйВопрос + + + + ДобавитьТабличныйВопрос + + + Auto + Auto + + + ОткрытьФормуЗаполненияАнкеты + + <key>ru</key> + <value>Открыть форму заполнения анкеты</value> + + 7 + + ru + Открыть форму заполнения анкеты + + + true + + + + ОткрытьФормуЗаполненияАнкеты + + + Auto + Auto + + + + + Catalog.ВопросыШаблонаАнкеты.StandardCommand.OpenByValue + + + + + + + + AfterWrite + ПослеЗаписи + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + + OnWriteAtServer + ПриЗаписиНаСервере + + +
    diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..c3e363460 --- /dev/null +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,958 @@ +&НаКлиенте +Перем ЗначенияПеречисленияТипыВопросовШаблонаАнкеты; +&НаКлиенте +Перем ЗначенияПеречисленияТипыТабличныхВопросов; +&НаКлиенте +Перем ЗначенияПеречисленияТипыОтветовНаВопрос; +&НаКлиенте +Перем ЗначенияПустыеСсылки; + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ + +// Добавляет новую строку в дерево формы +// Родитель - СтрокаДереваАнкеты - элемент дерева значений формы, от которого отращивается новая ветка +// ТипСтроки - Строка - Тип строки дерева +// Возвращаемое значение: +// Строка - новая строка дерева +// +&НаКлиенте +Функция ДобавитьСтрокуДеревоАнкеты(Родитель,ТипСтроки,ТипВопроса = Неопределено) + + ЭлементыДерева = Родитель.ПолучитьЭлементы(); + НоваяСтрока = ЭлементыДерева.Добавить(); + + НоваяСтрока.ТипСтроки = ТипСтроки; + НоваяСтрока.Обязательный = ЛОЖЬ; + НоваяСтрока.КлючСтроки = Новый УникальныйИдентификатор; + + Если ТипСтроки = "Вопрос" Тогда + + НоваяСтрока.ТипВопроса = ТипВопроса; + НоваяСтрока.КодКартинки = Анкетирование.ПолучитьКодКартинкиШаблонаАнкеты(ЛОЖЬ,ТипВопроса); + НоваяСтрока.ЭлементарныйВопрос = ?(ТипВопроса = ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.Табличный,"",ЗначенияПустыеСсылки.ВопросыДляАнкетирования); + НоваяСтрока.Обязательный = ?(ТипВопроса = ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.Табличный,"",Ложь); + + Иначе + + НоваяСтрока.ТипВопроса = ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.ПустаяСсылка; + НоваяСтрока.КодКартинки = Анкетирование.ПолучитьКодКартинкиШаблонаАнкеты(ИСТИНА); + НоваяСтрока.ЭлементарныйВопрос = ""; + НоваяСтрока.Обязательный = ""; + + КонецЕсли; + + АнкетированиеКлиентСервер.СформироватьНумерациюДерева(ДеревоАнкеты); + Элементы.ФормаДереваАнкеты.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор(); + + Модифицированность = Истина; + Элементы.ФормаДереваАнкеты.ИзменитьСтроку(); + + Возврат НоваяСтрока; + +КонецФункции // ДобавитьСтрокуДеревоАнкеты() + +// Процедура получает необходмые значения предопределенных значений, +// необходимых на клиенте. +&НаСервере +Процедура ПолучениеПредопределенныхЗначенийНеобходимыхНаКлиенте() + + ПеречислениеТипыВопросовШаблонаАнкеты = Анкетирование.ПолучитьСтруктуруЗначенияПеречисления("ТипыВопросовШаблонаАнкеты",Истина); + ПредопределеныеЗначенияНеобходимыеНаКлиенте.Вставить(0,ПеречислениеТипыВопросовШаблонаАнкеты); + + ПеречислениеТипыТабличныхВопросов = Анкетирование.ПолучитьСтруктуруЗначенияПеречисления("ТипыТабличныхВопросов",Истина); + ПредопределеныеЗначенияНеобходимыеНаКлиенте.Вставить(1,ПеречислениеТипыТабличныхВопросов); + + ПеречислениеТипыОтветовНаВопрос = Анкетирование.ПолучитьСтруктуруЗначенияПеречисления("ТипыОтветовНаВопрос"); + ПредопределеныеЗначенияНеобходимыеНаКлиенте.Вставить(2,ПеречислениеТипыОтветовНаВопрос); + + СтруктураПустыеСсылки = Новый Структура(); + СтруктураПустыеСсылки.Вставить("ВопросыДляАнкетирования",ПланыВидовХарактеристик.ВопросыДляАнкетирования.ПустаяСсылка()); + ПредопределеныеЗначенияНеобходимыеНаКлиенте.Вставить(3,СтруктураПустыеСсылки); + +КонецПроцедуры // ПредопределеныеЗначенияНеобходимыеНаКлиенте() + +&НаСервере +Процедура ЗаписатьДеревоШаблонаАнкеты(СтрокаДереваРодитель,УровеньРекурсии,СправочникРодитель = Неопределено) + + Счётчик = 0; + + //запишем новые + Для каждого СтрокаДерева Из СтрокаДереваРодитель.Строки Цикл + + Счётчик = Счётчик + 1; + СпрСсылка = ДобавитьЭлементСправочникаВопросШаблонаАнкеты(СтрокаДерева,?(УровеньРекурсии = 1,Счётчик,Неопределено),СправочникРодитель); + + Если СтрокаДерева.Строки.Количество() > 0 Тогда + Если СтрокаДерева.ТипСтроки = "Раздел" Тогда + ЗаписатьДеревоШаблонаАнкеты(СтрокаДерева,УровеньРекурсии+1,СпрСсылка); + Иначе + Для каждого СтрокаПодчиненныйВопрос Из СтрокаДерева.Строки Цикл + ДобавитьЭлементСправочникаВопросШаблонаАнкеты(СтрокаПодчиненныйВопрос,Неопределено,СправочникРодитель,СпрСсылка); + КонецЦикла; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // ЗаписатьДеревоШаблонаАнкеты() + +&НаСервере +Функция ДобавитьЭлементСправочникаВопросШаблонаАнкеты(СтрокаДерева,Код = Неопределено,СправочникРодитель = Неопределено,ВопросРодитель = Неопределено) + + Если СтрокаДерева.ТипСтроки = "Раздел" Тогда + + СпрОбъект = Справочники.ВопросыШаблонаАнкеты.СоздатьГруппу(); + + Иначе + + СпрОбъект = Справочники.ВопросыШаблонаАнкеты.СоздатьЭлемент(); + СпрОбъект.ТипВопроса = СтрокаДерева.ТипВопроса; + СпрОбъект.ЭлементарныйВопрос = СтрокаДерева.ЭлементарныйВопрос; + СпрОбъект.ТипТабличногоВопроса = СтрокаДерева.ТипТабличногоВопроса; + СпрОбъект.Обязательный = СтрокаДерева.Обязательный; + СпрОбъект.РодительВопрос = ?(ВопросРодитель = Неопределено, Справочники.ВопросыШаблонаАнкеты.ПустаяСсылка(),ВопросРодитель); + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(СтрокаДерева.СоставТабличногоВопроса,СпрОбъект.СоставТабличногоВопроса); + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(СтрокаДерева.ПредопределенныеОтветы,СпрОбъект.ПредопределенныеОтветы); + СпрОбъект.ВысотаЭлементаФормулировкиВопроса = СтрокаДерева.ВысотаЭлементаФормулировкиВопроса; + + КонецЕсли; + + Если Код <> Неопределено Тогда + СпрОбъект.Код = Код; + КонецЕсли; + СпрОбъект.Наименование = СтрокаДерева.Формулировка; + СпрОбъект.Заметки = СтрокаДерева.Заметки; + СпрОбъект.Формулировка = СтрокаДерева.Формулировка; + СпрОбъект.Родитель = ?(СправочникРодитель = Неопределено,Справочники.ВопросыШаблонаАнкеты.ПустаяСсылка(),СправочникРодитель); + СпрОбъект.Владелец = Объект.Ссылка; + + СпрОбъект.Записать(); + + Возврат СпрОбъект.Ссылка; + +КонецФункции // () + +// Обрабатывает результат работы мастера табличных вопросов +// +// Параметры +// ТекущиеДанные -ДанныеФормыЭлементДерева - текущая данные дерева шаблона +// Параметр - Структура - результаты работы формы мастера табличного вопроса +// +&НаКлиенте +Процедура ОбработатьРезультатРаботыМастераТабличныхВопросов(ТекущиеДанные,Параметр,ТекущаяСтрока) + + ТекущиеДанные.СоставТабличногоВопроса.Очистить(); + ТекущиеДанные.ПредопределенныеОтветы.Очистить(); + + ТекущиеДанные.ТипТабличногоВопроса = Параметр.ТипТабличногоВопроса; + ТекущиеДанные.Наименование = Параметр.Формулировка; + ТекущиеДанные.Формулировка = Параметр.Формулировка; + ТекущиеДанные.ЭлементарныйВопрос = Параметр.Формулировка; + ТекущиеДанные.Обязательный = ""; + + НомерСтроки = 1; + Для каждого Вопрос Из Параметр.Вопросы Цикл + + НоваяСтрока = ТекущиеДанные.СоставТабличногоВопроса.Добавить(); + НоваяСтрока.ЭлементарныйВопрос = Вопрос; + НоваяСтрока.НомерСтроки = НомерСтроки; + + НомерСтроки = НомерСтроки + 1; + + КонецЦикла; + + Для каждого Ответ Из Параметр.Ответы Цикл + ЗаполнитьЗначенияСвойств(ТекущиеДанные.ПредопределенныеОтветы.Добавить(),Ответ); + КонецЦикла; + + ОбработатьПревьюТабличногоВопроса(ТекущаяСтрока); + УстановитьУсловноеОформлениеФормы(); + +КонецПроцедуры + +&НаСервере +Процедура ОбработатьПревьюТабличногоВопроса(ТекущаяСтрока) + + ДанныеДереваАнкеты = ДеревоАнкеты.НайтиПоИдентификатору(ТекущаяСтрока); + Если ДанныеДереваАнкеты = Неопределено Тогда + Возврат; + КонецЕсли; + + ДобавитьСтраницуПревьюТабличногоВопроса(ДанныеДереваАнкеты.ТипТабличногоВопроса, + ДанныеДереваАнкеты.СоставТабличногоВопроса.Выгрузить(), + ДанныеДереваАнкеты.ПредопределенныеОтветы.Выгрузить(), + ДанныеДереваАнкеты.КлючСтроки); + +КонецПроцедуры // () + +&НаСервере +Процедура ДобавитьСтраницуПревьюТабличногоВопроса(ТипТабличногоВопроса,СоставТабличногоВопроса,ПредопределенныеОтветы,КлючСтроки) + + ДобавляемыеРеквизиты = Новый Массив; + ИмяТаблицы = "ПревьюТабличногоВопроса_" + СтрЗаменить(Строка(КлючСтроки),"-","_"); + + Если Элементы.Найти("Страница_" + ИмяТаблицы) = Неопределено Тогда + + ЭлементСтраница = Элементы.Добавить("Страница_" + ИмяТаблицы,Тип("ГруппаФормы"),Элементы.СтраницыИнформация); + ЭлементСтраница.Вид = ВидГруппыФормы.Страница; + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяТаблицы,Новый ОписаниеТипов("ТаблицаЗначений"))); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Формулировка_" + ИмяТаблицы,Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(150)))); + + ИзменитьРеквизиты(ДобавляемыеРеквизиты); + + Элемент = Элементы.Добавить("Формулировка_" + ИмяТаблицы,Тип("ПолеФормы"),ЭлементСтраница); + Элемент.ПутьКДанным = "Формулировка_" + ИмяТаблицы; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Элемент.Шрифт = Новый Шрифт("MS Shell Dlg",10,Истина); + + Элемент = Элементы.Добавить(ИмяТаблицы,Тип("ТаблицаФормы"),ЭлементСтраница); + Элемент.ТолькоПросмотр = Истина; + Элемент.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; + Элемент.ПутьКДанным = ИмяТаблицы; + + КонецЕсли; + + Анкетирование.ОбновитьПревьюТабличныйВопрос(СоставТабличногоВопроса,ПредопределенныеОтветы,ТипТабличногоВопроса,ЭтаФорма,ИмяТаблицы,КлючСтроки); + +КонецПроцедуры // ДобавитьСтраницуПревьюТабличногоВопроса() + +//Устанавливает условное оформеление формы +&НаСервере +Процедура УстановитьУсловноеОформлениеФормы(); + + ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + + ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоАнкеты.ТипСтроки"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно; + ЭлементОтбораДанных.Использование = Истина; + ЭлементОтбораДанных.ПравоеЗначение = "Вопрос"; + + ПолеОформления = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); + ПолеОформления.Использование = Истина; + ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ДеревоАнкетыОбязательный"); + + ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона",WebЦвета.СеребристоСерый); + +КонецПроцедуры // () + +&НаСервере +Процедура ОпределитьЕстьЛиДанномуШаблонуАнкеты() + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 + | Анкета.Ссылка + |ИЗ + | Документ.Анкета КАК Анкета + |ГДЕ + | (НЕ Анкета.ПометкаУдаления) + | И Анкета.Опрос В + | (ВЫБРАТЬ + | НазначениеОпросов.Ссылка + | ИЗ + | Документ.НазначениеОпросов КАК НазначениеОпросов + | ГДЕ + | НазначениеОпросов.ШаблонАнкеты = &ШаблонАнкеты)"; + + Запрос.УстановитьПараметр("ШаблонАнкеты",Объект.Ссылка); + + Если НЕ Запрос.Выполнить().Пустой() Тогда + + ПоДанномуШаблонуЕстьАнкеты = Истина; + + Иначе + + ПоДанномуШаблонуЕстьАнкеты = Ложь; + + КонецЕсли; + + УстановитьПривилегированныйРежим(Ложь); + +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьРодителяДеревоАнкеты(ТекущийРодитель,МожетБытьКорнем,ТипВопроса = Неопределено) + + Если МожетБытьКорнем Тогда + + Пока (ТекущийРодитель.ТипСтроки <> "Корень") И (ТекущийРодитель.ТипСтроки <> "Раздел") Цикл + ТекущийРодитель = ТекущийРодитель.ПолучитьРодителя(); + Если ТекущийРодитель = Неопределено Тогда + Возврат ДеревоАнкеты.ПолучитьЭлементы()[0]; + КонецЕсли; + КонецЦикла; + + Иначе + + Пока (ТекущийРодитель.ТипСтроки <> "Раздел") + И ((ТекущийРодитель.ТипСтроки = "Вопрос") И (НЕ ТекущийРодитель.ТипВопроса = ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.ВопросСУсловием) + ИЛИ (ТекущийРодитель.ТипСтроки = "Вопрос" И ТекущийРодитель.ТипВопроса = ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.ВопросСУсловием И ТипВопроса = ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.ВопросСУсловием)) Цикл + + ТекущийРодитель = ТекущийРодитель.ПолучитьРодителя(); + + КонецЦикла + + КонецЕсли; + + Возврат ТекущийРодитель; + +КонецФункции // () + +// Добавляет вопрос в шаблон анкеты +// +// Параметры +// ТекущиеДанные - ДанныеФормыЭлементДерева - данные текущей строки дерева +// ТипВопроса - Перечисления.ТипыВопросовШаблонаАнкет - тип добавляемого вопроса +// +&НаКлиенте +Процедура ДобавитьВопрос(ТекущиеДанные,ТипВопроса) + + Родитель = ПолучитьРодителяДеревоАнкеты(ТекущиеДанные,Ложь,ТипВопроса); + Если Родитель.ТипСтроки = "Корень" Тогда + Предупреждение("Вопросы нельзя добавлять в корень анкеты.",15,"Ошибка добавления"); + Возврат; + КонецЕсли; + ДобавитьСтрокуДеревоАнкеты(Родитель,"Вопрос",ТипВопроса); + +КонецПроцедуры // ДобавитьВопрос()() + +&НаКлиенте +Процедура ОбновитьИнформациюТабличныйВопрос(ТекущиеДанные) + + СтрокаКлюч = СтрЗаменить(Строка(ТекущиеДанные.КлючСтроки),"-","_"); + ИмяТаблицы = "ПревьюТабличногоВопроса_" + СтрокаКлюч; + ИмяРеквизита = "Формулировка_" + ИмяТаблицы; + Попытка + ЭтаФорма[ИмяРеквизита] = СформироватьСтрокуФормулировкиДляПревью(ТекущиеДанные); + Исключение + КонецПопытки; + +КонецПроцедуры // () + +// Формирует строку с представлением вопроса для отображения в страницах превью +// +// Параметры +// ТекущиеДанные - ДанныеФормыЭлементДерева - данные строки дерева +// +// Возвращаемое значение: +// Строка - возвращаемая строка +// +&НаКлиенте +Функция СформироватьСтрокуФормулировкиДляПревью(ТекущиеДанные) + + Возврат ТекущиеДанные.ПолныйКод + " " + ТекущиеДанные.Формулировка; + +КонецФункции // СформироватьСтрокуФормулировкиДляПревью()() + +&НаКлиенте +Процедура ОпределитьДоступностьДереваШаблона() + + НовыйЭлемент = Объект.Ссылка.Пустая(); + НедоступностьРедактирования = (НовыйЭлемент Или Объект.РедактированиеШаблонаЗавершено ИЛИ ПоДанномуШаблонуЕстьАнкеты); + + Элементы.ДеревоАнкеты.ТолькоПросмотр = НедоступностьРедактирования; + Элементы.ФормаДереваАнкеты.ТолькоПросмотр = НедоступностьРедактирования; + Элементы.ЗакончитьРедактирование.Доступность = НЕ НедоступностьРедактирования; + Элементы.ФормаДереваАнкеты.КоманднаяПанель.Доступность = НЕ НедоступностьРедактирования; + Элементы.ФормаДереваАнкеты.КонтекстноеМеню.Доступность = НЕ НедоступностьРедактирования; + Элементы.РедактированиеШаблонаЗавершено.Доступность = (НЕ НовыйЭлемент) И (НЕ ПоДанномуШаблонуЕстьАнкеты); + Элементы.КонтекстноеМенюФормаДереваАнкетыДобавить.Доступность = НЕ НедоступностьРедактирования; + Элементы.ДеревоАнкетыКонтекстноеМенюДобавитьРаздел.Доступность = НЕ НедоступностьРедактирования; + Элементы.ДеревоАнкетыКонтекстноеМенюПереместитьВверх.Доступность = НЕ НедоступностьРедактирования; + Элементы.ДеревоАнкетыКонтекстноеМенюПереместитьВниз.Доступность = НЕ НедоступностьРедактирования; + Элементы.ДеревоАнкетыКонтекстноеМенюДобавитьВопрос.Доступность = НЕ НедоступностьРедактирования; + Элементы.ДеревоАнкетыКонтекстноеМенюДобавитьВопросСУсловием.Доступность = НЕ НедоступностьРедактирования; + Элементы.ДеревоАнкетыКонтекстноеМенюДобавитьТабличныйВопрос.Доступность = НЕ НедоступностьРедактирования; + + Если НовыйЭлемент Тогда + ИнформацияДерево = НСтр("ru = 'Для редактирования вопросов необходимо записать шаблон анкеты'"); + Иначе + ИнформацияДерево = НСтр("ru = 'Дерево редактирования вопросов шаблона анкеты'"); + КонецЕсли; + +КонецПроцедуры // () + +&НаКлиенте +Процедура УстановитьНедоступностьРедактирования() + + Если Объект.РедактированиеШаблонаЗавершено ИЛИ ПоДанномуШаблонуЕстьАнкеты Тогда + + ТолькоПросмотр = Истина; + Элементы.ДеревоАнкеты.ТолькоПросмотр = Истина; + Элементы.ФормаДереваАнкеты.ТолькоПросмотр = Истина; + Элементы.ФормаДереваАнкеты.КоманднаяПанель.Доступность = Ложь; + Элементы.ДеревоАнкетыКонтекстноеМенюДобавитьРаздел.Доступность = Ложь; + Элементы.ДеревоАнкетыКонтекстноеМенюПереместитьВверх.Доступность = Ложь; + Элементы.ДеревоАнкетыКонтекстноеМенюПереместитьВниз.Доступность = Ложь; + Элементы.ДеревоАнкетыКонтекстноеМенюДобавитьВопрос.Доступность = Ложь; + Элементы.ДеревоАнкетыКонтекстноеМенюДобавитьВопросСУсловием.Доступность = Ложь; + Элементы.ДеревоАнкетыКонтекстноеМенюДобавитьТабличныйВопрос.Доступность = Ложь; + Элементы.ЗакончитьРедактирование.Доступность = Ложь; + + КонецЕсли; + +КонецПроцедуры // + +&НаКлиенте +Процедура ОткрытьФормуПростыхВопросов(ТекущиеДанные) + + СтруктураПараметры = Новый Структура; + СтруктураПараметры.Вставить("ТипСтрокиДерева",ТекущиеДанные.ТипСтроки); + СтруктураПараметры.Вставить("ЭлементарныйВопрос",ТекущиеДанные.ЭлементарныйВопрос); + СтруктураПараметры.Вставить("Обязательный",ТекущиеДанные.Обязательный); + СтруктураПараметры.Вставить("ТипВопроса",ТекущиеДанные.ТипВопроса); + СтруктураПараметры.Вставить("Формулировка",ТекущиеДанные.Формулировка); + СтруктураПараметры.Вставить("ЗакрыватьПриВыборе",Истина); + СтруктураПараметры.Вставить("ЗакрыватьПриЗакрытииВладельца",Истина); + СтруктураПараметры.Вставить("ТолькоПросмотр",Ложь); + СтруктураПараметры.Вставить("ВысотаЭлементаФормулировкиВопроса",ТекущиеДанные.ВысотаЭлементаФормулировкиВопроса); + + ОткрытьФорму("Справочник.ШаблоныАнкет.Форма.ФормаПростыхВопросов",СтруктураПараметры,ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФормуМастераТабличныхВопросов(ТекущиеДанные) + + СтруктураПараметры = Новый Структура; + СтруктураПараметры.Вставить("ТипТабличногоВопроса",ТекущиеДанные.ТипТабличногоВопроса); + СтруктураПараметры.Вставить("СоставТабличногоВопроса",ТекущиеДанные.СоставТабличногоВопроса); + СтруктураПараметры.Вставить("ПредопределенныеОтветы",ТекущиеДанные.ПредопределенныеОтветы); + СтруктураПараметры.Вставить("Формулировка",ТекущиеДанные.Формулировка); + + ОткрытьФорму("Справочник.ШаблоныАнкет.Форма.ФормаМастераТабличныхВопросов",СтруктураПараметры,ЭтаФорма); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +//КОМАНДЫ ФОРМЫ + +//Устанавливает флаг окончания редактирования шаблона анкеты +//и записывет анкету +&НаКлиенте +Процедура ЗакончитьРедактирование(Команда) + + Объект.РедактированиеШаблонаЗавершено = Истина; + Записать(); + + Если Модифицированность Тогда + Объект.РедактированиеШаблонаЗавершено = Ложь; + Иначе + УстановитьНедоступностьРедактирования(); + КонецЕсли; + +КонецПроцедуры + +//Добавляет раздел в дерево шаблона анкеты +&НаКлиенте +Процедура ДобавитьРаздел(Команда) + + ТекущиеДанные = Элементы.ФормаДереваАнкеты.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Родитель = ПолучитьРодителяДеревоАнкеты(ТекущиеДанные,Истина); + ДобавитьСтрокуДеревоАнкеты(Родитель,"Раздел"); + +КонецПроцедуры + +//Добавляет простой вопрос в дерево шаблона анкеты +&НаКлиенте +Процедура ДобавитьПростойВопрос(Команда) + + ТекущиеДанные = Элементы.ФормаДереваАнкеты.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ДобавитьВопрос(ТекущиеДанные,ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.Простой); + +КонецПроцедуры + +//Добавляет вопрос с условием в шаблон анкеты +&НаКлиенте +Процедура ДобавитьВопросСУсловием(Команда) + + ТекущиеДанные = Элементы.ФормаДереваАнкеты.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ДобавитьВопрос(ТекущиеДанные,ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.ВопросСУсловием); + +КонецПроцедуры + +//Добавляетм табличный вопрос в шаблон анкеты +&НаКлиенте +Процедура ДобавитьТабличныйВопрос(Команда) + + ТекущиеДанные = Элементы.ФормаДереваАнкеты.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ДобавитьВопрос(ТекущиеДанные,ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.Табличный); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФормуЗаполненияАнкеты(Команда) + + Если Объект.Ссылка.Пустая() Тогда + Возврат; + КонецЕсли; + + Если Модифицированность Тогда + Если Вопрос(Нстр("ru = 'Шаблон анкеты был модифицирован. + |Для корректного отображения изменений шаблон необходимо записать. + |Записать?'"),РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Да,Нстр("ru = 'Записать?'")) = КодВозвратаДиалога.Да Тогда + Записать(); + КонецЕсли; + КонецЕсли; + + СтруктураПараметры = Новый Структура; + СтруктураПараметры.Вставить("ШаблонАнкеты",Объект.Ссылка); + ОткрытьФорму("ОбщаяФорма.МастерАнкетыПоРазделам",СтруктураПараметры,ЭтаФорма); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ,СтандартнаяОбработка) + + Анкетирование.УстановитьКорневойЭлементДереваАнкеты(ДеревоАнкеты); + ПолучениеПредопределенныхЗначенийНеобходимыхНаКлиенте(); + Анкетирование.ЗаполнитьДеревоШаблонаАнкеты(ЭтаФорма,"ДеревоАнкеты",Объект.Ссылка); + АнкетированиеКлиентСервер.СформироватьНумерациюДерева(ДеревоАнкеты); + УстановитьУсловноеОформлениеФормы(); + ОпределитьЕстьЛиДанномуШаблонуАнкеты(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ЗначенияПеречисленияТипыВопросовШаблонаАнкеты = ПредопределеныеЗначенияНеобходимыеНаКлиенте.Получить(0).Значение; + ЗначенияПеречисленияТипыТабличныхВопросов = ПредопределеныеЗначенияНеобходимыеНаКлиенте.Получить(1).Значение; + ЗначенияПеречисленияТипыОтветовНаВопрос = ПредопределеныеЗначенияНеобходимыеНаКлиенте.Получить(2).Значение; + ЗначенияПустыеСсылки = ПредопределеныеЗначенияНеобходимыеНаКлиенте.Получить(3).Значение; + + Элементы.ФормаДереваАнкеты.Развернуть(ДеревоАнкеты.ПолучитьЭлементы()[0].ПолучитьИдентификатор(),Ложь); + + Если Объект.РедактированиеШаблонаЗавершено ИЛИ ПоДанномуШаблонуЕстьАнкеты Тогда + УстановитьНедоступностьРедактирования(); + Иначе + ОпределитьДоступностьДереваШаблона(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + Анкетирование.УдалитьВопросыШаблонаАнкеты(Объект.Ссылка); + ДеревоШаблонаАнкеты = РеквизитФормыВЗначение("ДеревоАнкеты"); + + ЗаписатьДеревоШаблонаАнкеты(ДеревоШаблонаАнкеты.Строки[0],1); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + ТекущиеДанные = Элементы.ФормаДереваАнкеты.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ИмяСобытия = "ОкончаниеРедактированияПараметровТабличногоВопроса" Тогда + + ОбработатьРезультатРаботыМастераТабличныхВопросов(ТекущиеДанные,Параметр,Элементы.ФормаДереваАнкеты.ТекущаяСтрока); + ОбновитьИнформациюТабличныйВопрос(ТекущиеДанные); + Модифицированность = Истина; + + ИначеЕсли ИмяСобытия = "ОкочаниеРедактированияПараметровСтрокиШаблонаАнкеты" Тогда + + ЗаполнитьЗначенияСвойств(ТекущиеДанные,Параметр); + Модифицированность = Истина; + Информация = СформироватьСтрокуФормулировкиДляПревью(ТекущиеДанные); + Если ТекущиеДанные.ТипСтроки <> "Вопрос" Тогда + ТекущиеДанные.Обязательный = Неопределено; + КонецЕсли; + + ИначеЕсли ИмяСобытия = "ОкончаниеРедактированияТекста" Тогда + + НайденнаяСтрока = ДеревоАнкеты.НайтиПоИдентификатору(Параметр.НомерСтроки); + Если НайденнаяСтрока <> Неопределено Тогда + НайденнаяСтрока.Заметки = Параметр.Текст; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + ДеревоШаблонаАнкеты = РеквизитФормыВЗначение("ДеревоАнкеты"); + + Если ДеревоШаблонаАнкеты.Строки[0].Строки.Найти("","Формулировка",Истина) <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не все формулировки или имена разделов заполнены.'"),,"ДеревоАнкеты"); + Отказ = Истина; + КонецЕсли; + + + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("ЭлементарныйВопрос",ПланыВидовХарактеристик.ВопросыДляАнкетирования.ПустаяСсылка()); + СтруктураОтбора.Вставить("ТипСтроки","Вопрос"); + + НайденныеСтроки = ДеревоШаблонаАнкеты.Строки[0].Строки.НайтиСтроки(СтруктураОтбора,Истина); + Если НайденныеСтроки.Количество() <> 0 Тогда + Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл + Если НайденнаяСтрока.ТипВопроса <> Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не все вопросы заполнены.'"),,"ДеревоАнкеты"); + Отказ = Истина; + Прервать; + + КонецЕсли; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ФормаДереваАнкетыПередУдалением(Элемент, Отказ) + + ТекущиеДанные = Элементы.ФормаДереваАнкеты.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТекущиеДанные.ТипСтроки = "Корень" Тогда + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ФормаДереваАнкетыПриАктивизацииСтроки(Элемент) + + ТекущиеДанные = Элементы.ФормаДереваАнкеты.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + СтраницаПревьюТабличногоВопроса = Элементы.Найти("Страница_ПревьюТабличногоВопроса_" + СтрЗаменить(Строка(ТекущиеДанные.КлючСтроки),"-","_")); + Если СтраницаПревьюТабличногоВопроса <> Неопределено Тогда + Элементы.СтраницыИнформация.ТекущаяСтраница = СтраницаПревьюТабличногоВопроса; + Иначе + Информация = СформироватьСтрокуФормулировкиДляПревью(ТекущиеДанные); + Элементы.СтраницыИнформация.ТекущаяСтраница = Элементы.СтраницаИнформация; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ФормаДереваАнкетыПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + + Если (Строка = Неопределено) ИЛИ (ПараметрыПеретаскивания.Значение = Неопределено) Тогда + Возврат; + КонецЕсли; + + СтандартнаяОбработка = Ложь; + + Если ТипЗнч(ПараметрыПеретаскивания.Значение) <> Тип("Число") Тогда + ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; + Возврат; + КонецЕсли; + + СтрокаНазначение = ДеревоАнкеты.НайтиПоИдентификатору(Строка); + СтрокаПеретаскивание = ДеревоАнкеты.НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение); + + Если (СтрокаПеретаскивание.ТипСтроки = "Раздел") И (СтрокаНазначение.ТипСтроки = "Вопрос") Тогда + ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; + ИначеЕсли (СтрокаПеретаскивание.ТипСтроки = "Вопрос") И (СтрокаНазначение.ТипСтроки = "Корень") Тогда + ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; + ИначеЕсли (СтрокаПеретаскивание.ТипСтроки = "Раздел") И (СтрокаНазначение.ТипСтроки = "Раздел") Тогда + Если СтрокаПеретаскивание.ВопросШаблона = СтрокаНазначение.ВопросШаблона Тогда + ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; + Возврат; + КонецЕсли; + Родитель = СтрокаНазначение.ПолучитьРодителя(); + Пока Родитель.ТипСтроки <> "Корень" Цикл + Если Родитель = СтрокаПеретаскивание Тогда + ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; + Возврат; + Иначе + Родитель = Родитель.ПолучитьРодителя(); + КонецЕсли; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ФормаДереваАнкетыНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка) + + Если Элементы.ФормаДереваАнкеты.ТолькоПросмотр Тогда + СтандартнаяОбработка = Ложь; + ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; + КонецЕсли; + + СтрокаПеретаскивание = ДеревоАнкеты.НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение); + Если ТипЗнч(СтрокаПеретаскивание) = Тип("Неопределено") Тогда + СтандартнаяОбработка = Ложь; + ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; + Иначе + Если СтрокаПеретаскивание.ТипСтроки = "Корень" Тогда + СтандартнаяОбработка = Ложь; + ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ФормаДереваАнкетыПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + + СтрокаНазначение = ДеревоАнкеты.НайтиПоИдентификатору(Строка); + СтрокаПеретаскивание = ДеревоАнкеты.НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение); + + Если (СтрокаПеретаскивание.ТипСтроки = "Вопрос") И (СтрокаНазначение.ТипСтроки = "Вопрос") Тогда + + //Вопрос без условия перетаскиваем на вопрос с условием + Если СтрокаПеретаскивание.ТипВопроса <> ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.ВопросСУсловием + И СтрокаНазначение.ТипВопроса = ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.ВопросСУсловием Тогда + + СтандартнаяОбработка = Ложь; + ПеретащитьЭлементДерева(СтрокаНазначение,СтрокаПеретаскивание,Ложь); + + Модифицированность = Истина; + + ИначеЕсли СтрокаПеретаскивание.ПолучитьРодителя() <> СтрокаНазначение.ПолучитьРодителя() Тогда + + СтандартнаяОбработка = Ложь; + ПеретащитьЭлементДерева(СтрокаНазначение,СтрокаПеретаскивание,Истина); + + Модифицированность = Истина; + + КонецЕсли; + + ИначеЕсли (СтрокаПеретаскивание.ТипСтроки = "Вопрос") И (СтрокаНазначение.ТипСтроки = "Раздел") Тогда + + Если СтрокаПеретаскивание.ПолучитьРодителя() <> СтрокаНазначение Тогда + + СтандартнаяОбработка = Ложь; + ПеретащитьЭлементДерева(СтрокаНазначение,СтрокаПеретаскивание,Ложь); + + Модифицированность = Истина; + + КонецЕсли; + + ИначеЕсли (СтрокаПеретаскивание.ТипСтроки = "Раздел") И (СтрокаНазначение.ТипСтроки = "Раздел") Тогда + + Если СтрокаПеретаскивание.ПолучитьРодителя() <> СтрокаНазначение Тогда + + СтандартнаяОбработка = Ложь; + ПеретащитьЭлементДерева(СтрокаНазначение,СтрокаПеретаскивание,Ложь); + + Модифицированность = Истина; + + ИначеЕсли СтрокаПеретаскивание.ПолучитьРодителя() <> СтрокаНазначение.ПолучитьРодителя() Тогда + + СтандартнаяОбработка = Ложь; + ПеретащитьЭлементДерева(СтрокаНазначение,СтрокаПеретаскивание,Истина); + + Модифицированность = Истина; + + КонецЕсли; + + ИначеЕсли (СтрокаПеретаскивание.ТипСтроки = "Раздел") И (СтрокаНазначение.ТипСтроки = "Вопрос") Тогда + + Если (СтрокаПеретаскивание.ПолучитьРодителя() <> СтрокаНазначение.ПолучитьРодителя()) И (СтрокаНазначение.ПолучитьРодителя() <> СтрокаПеретаскивание)Тогда + + СтандартнаяОбработка = Ложь; + ПеретащитьЭлементДерева(СтрокаНазначение,СтрокаПеретаскивание,Истина); + + Модифицированность = Истина; + + КонецЕсли; + + ИначеЕсли ((СтрокаПеретаскивание.ТипСтроки = "Раздел") ИЛИ (СтрокаПеретаскивание.ТипСтроки = "Вопрос")) И (СтрокаНазначение.ТипСтроки = "Корень") Тогда + + СтандартнаяОбработка = Ложь; + ПеретащитьЭлементДерева(СтрокаНазначение,СтрокаПеретаскивание,Ложь); + + Модифицированность = Истина; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПеретащитьЭлементДерева(СтрокаНазначение,СтрокаПеретаскивание,ИспользоватьРодителяСтрокиНазначения = ЛОЖЬ,УдалятьПослеДобавления = Истина); + + Если ИспользоватьРодителяСтрокиНазначения Тогда + НоваяСтрока = СтрокаНазначение.ПолучитьРодителя().ПолучитьЭлементы().Добавить(); + Иначе + НоваяСтрока = СтрокаНазначение.ПолучитьЭлементы().Добавить(); + КонецЕсли; + + ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаПеретаскивание,,"СоставТабличногоВопроса,ПредопределенныеОтветы"); + Если СтрокаПеретаскивание.ТипВопроса = ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.Табличный Тогда + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(СтрокаПеретаскивание.СоставТабличногоВопроса,НоваяСтрока.СоставТабличногоВопроса); + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(СтрокаПеретаскивание.ПредопределенныеОтветы,НоваяСтрока.ПредопределенныеОтветы); + КонецЕсли; + + Для каждого Элемент Из СтрокаПеретаскивание.ПолучитьЭлементы() Цикл + ПеретащитьЭлементДерева(НоваяСтрока,Элемент,Ложь,Ложь); + КонецЦикла; + + Если УдалятьПослеДобавления Тогда + СтрокаПеретаскивание.ПолучитьРодителя().ПолучитьЭлементы().Удалить(СтрокаПеретаскивание); + КонецЕсли; + + Если ИспользоватьРодителяСтрокиНазначения Тогда + Элементы.ФормаДереваАнкеты.Развернуть(СтрокаНазначение.ПолучитьРодителя().ПолучитьИдентификатор(),Ложь); + Иначе + Элементы.ФормаДереваАнкеты.Развернуть(СтрокаНазначение.ПолучитьИдентификатор(),Ложь); + КонецЕсли; + +КонецПроцедуры //) + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + ОпределитьДоступностьДереваШаблона(); + Если Объект.РедактированиеШаблонаЗавершено Тогда + ТолькоПросмотр = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ФормаДереваАнкетыПриИзменении(Элемент) + + Модифицированность = Истина; + АнкетированиеКлиентСервер.СформироватьНумерациюДерева(ДеревоАнкеты); + +КонецПроцедуры + +&НаКлиенте +Процедура ФормаДереваАнкетыПередНачаломИзменения(Элемент, Отказ) + + Отказ = Истина; + + ТекущиеДанные = Элемент.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТекущиеДанные.ТипСтроки = "Корень" Тогда + Отказ = Истина; + Возврат; + ИначеЕсли ТекущиеДанные.ТипСтроки = "Раздел" + ИЛИ (ТекущиеДанные.ТипСтроки = "Вопрос" И ТекущиеДанные.ТипВопроса <> ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.Табличный ) Тогда + + ОткрытьФормуПростыхВопросов(ТекущиеДанные); + + ИначеЕсли ТекущиеДанные.ТипСтроки = "Вопрос" И ТекущиеДанные.ТипВопроса = ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.Табличный Тогда + + ОткрытьФормуМастераТабличныхВопросов(ТекущиеДанные); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ФормаДереваАнкетыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Отказ = Истина; + + СписокВыбора = Новый СписокЗначений; + СписокВыбора.Добавить("Раздел"); + СписокВыбора.Добавить("Простой вопрос"); + СписокВыбора.Добавить("Условный вопрос"); + СписокВыбора.Добавить("Табличный вопрос"); + + ВыбранноеЗначение = СписокВыбора.ВыбратьЭлемент("Выберите тип добавляемого элемента.",СписокВыбора[0]); + Если НЕ ВыбранноеЗначение = Неопределено Тогда + + Если ВыбранноеЗначение.Значение = "Раздел" Тогда + + ДобавитьРаздел(Команды.ДобавитьРаздел); + + ИначеЕсли ВыбранноеЗначение.Значение = "Простой вопрос" Тогда + + ДобавитьПростойВопрос(Команды.ДобавитьПростойВопрос) + + ИначеЕсли ВыбранноеЗначение.Значение = "Условный вопрос" Тогда + + ДобавитьВопросСУсловием(Команды.ДобавитьВопросСУсловием) + + ИначеЕсли ВыбранноеЗначение.Значение = "Табличный вопрос" Тогда + + ДобавитьТабличныйВопрос(Команды.ДобавитьТабличныйВопрос); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ФормаДереваАнкетыОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка) + + АнкетированиеКлиентСервер.СформироватьНумерациюДерева(ДеревоАнкеты); + +КонецПроцедуры + +&НаКлиенте +Процедура ФормаДереваАнкетыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Если Элементы.ФормаДереваАнкеты.ТолькоПросмотр Тогда + Возврат; + КонецЕсли; + + ТекущиеДанные = Элемент.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если (Поле.Имя = "ДеревоАнкетыЗаметки") И (ТекущиеДанные.ТипСтроки <> "Корень") Тогда + ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияМногострочногоТекста( Элемент.ДанныеСтроки(ВыбраннаяСтрока).Заметки, + Элемент.ДанныеСтроки(ВыбраннаяСтрока).Заметки, + Модифицированность, + Нстр("ru='Заметки'")); + Иначе + Если ТекущиеДанные.ТипСтроки = "Корень" Тогда + Отказ = Истина; + Возврат; + ИначеЕсли ТекущиеДанные.ТипСтроки = "Раздел" + ИЛИ (ТекущиеДанные.ТипСтроки = "Вопрос" И ТекущиеДанные.ТипВопроса <> ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.Табличный ) Тогда + + ОткрытьФормуПростыхВопросов(ТекущиеДанные); + + ИначеЕсли ТекущиеДанные.ТипСтроки = "Вопрос" И ТекущиеДанные.ТипВопроса = ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.Табличный Тогда + + ОткрытьФормуМастераТабличныхВопросов(ТекущиеДанные); + + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + + \ No newline at end of file diff --git a/SSL/src/Catalogs/ШаблоныАнкет/ObjectModule.bsl b/SSL/src/Catalogs/ШаблоныАнкет/ObjectModule.bsl new file mode 100644 index 000000000..fc3423443 --- /dev/null +++ b/SSL/src/Catalogs/ШаблоныАнкет/ObjectModule.bsl @@ -0,0 +1,123 @@ + +Процедура ПриКопировании(ОбъектКопирования) + + Попытка + + НачатьТранзакцию(); + + УстановитьСсылкуНового(Справочники.ШаблоныАнкет.ПолучитьСсылку()); + РедактированиеШаблонаЗавершено = Ложь; + Записать(); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ВопросыШаблонаАнкеты.Ссылка КАК Ссылка, + | ВопросыШаблонаАнкеты.ПометкаУдаления, + | ВопросыШаблонаАнкеты.Предопределенный, + | ВопросыШаблонаАнкеты.Владелец, + | ВопросыШаблонаАнкеты.Родитель, + | ВопросыШаблонаАнкеты.ЭтоГруппа, + | ВопросыШаблонаАнкеты.Код КАК Код, + | ВопросыШаблонаАнкеты.Наименование, + | ВопросыШаблонаАнкеты.Обязательный, + | ВопросыШаблонаАнкеты.ТипВопроса, + | ВопросыШаблонаАнкеты.ТипТабличногоВопроса, + | ВопросыШаблонаАнкеты.ЭлементарныйВопрос, + | ВопросыШаблонаАнкеты.РодительВопрос, + | ВопросыШаблонаАнкеты.СоставТабличногоВопроса.( + | ЭлементарныйВопрос КАК ЭлементарныйВопрос, + | НомерСтроки + | ), + | ВопросыШаблонаАнкеты.ПредопределенныеОтветы.( + | ЭлементарныйВопрос КАК ЭлементарныйВопрос, + | Ответ, + | НомерСтроки + | ), + | ВопросыШаблонаАнкеты.Формулировка, + | ВопросыШаблонаАнкеты.ВысотаЭлементаФормулировкиВопроса + |ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + |ГДЕ + | ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты + | + |УПОРЯДОЧИТЬ ПО + | Ссылка ИЕРАРХИЯ, + | Код"; + + Запрос.УстановитьПараметр("ШаблонАнкеты",ОбъектКопирования.Ссылка); + + Результат = Запрос.Выполнить(); + Если Результат.Пустой() Тогда + Возврат; + КонецЕсли; + + Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); + + ДобавитьЭлементыСправочникаВопросыШаблонаАнкеты(Выборка); + + Исключение + + ОтменитьТранзакцию(); + Возврат; + + КонецПопытки; + + ЗафиксироватьТранзакцию(); + +КонецПроцедуры + +Процедура ДобавитьЭлементыСправочникаВопросыШаблонаАнкеты(Выборка,Родитель = Неопределено) + + ВопросыСУсловием = Новый Соответствие; + + Пока Выборка.Следующий() Цикл + + Если Выборка.ЭтоГруппа Тогда + + НовыйЭлемент = Справочники.ВопросыШаблонаАнкеты.СоздатьГруппу(); + ЗаполнитьЗначенияСвойств(НовыйЭлемент,Выборка,"Наименование,Код,Формулировка"); + + Иначе + + НовыйЭлемент = Справочники.ВопросыШаблонаАнкеты.СоздатьЭлемент(); + + СсылкаНового = Справочники.ВопросыШаблонаАнкеты.ПолучитьСсылку(); + НовыйЭлемент.УстановитьСсылкуНового(СсылкаНового); + + ЗаполнитьЗначенияСвойств(НовыйЭлемент,Выборка,,"Владелец,Родитель,СоставТабличногоВопроса,ПредопределенныеОтветы,Код,РодительВопрос,ВысотаЭлементаФормулировкиВопроса"); + СоставТабличногоВопроса = Выборка.СоставТабличногоВопроса.Выгрузить(); + СоставТабличногоВопроса.Сортировать("НомерСтроки Возр"); + НовыйЭлемент.СоставТабличногоВопроса.Загрузить(СоставТабличногоВопроса); + ПредопределенныеОтветы = Выборка.ПредопределенныеОтветы.Выгрузить(); + ПредопределенныеОтветы.Сортировать("НомерСтроки Возр"); + НовыйЭлемент.ПредопределенныеОтветы.Загрузить(ПредопределенныеОтветы); + + Если Выборка.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.ВопросСУсловием Тогда + ВопросыСУсловием.Вставить(Выборка.Ссылка,СсылкаНового); + КонецЕсли; + + Если НЕ Выборка.РодительВопрос.Пустая() Тогда + НовыйЭлемент.РодительВопрос = ВопросыСУсловием.Получить(Выборка.РодительВопрос); + КонецЕсли; + + КонецЕсли; + + НовыйЭлемент.Владелец = Ссылка; + НовыйЭлемент.Родитель = ?(Родитель = Неопределено,Справочники.ВопросыШаблонаАнкеты.ПустаяСсылка(),Родитель); + НовыйЭлемент.Записать(); + + + ПодчиненнаяВыборка = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); + Если ПодчиненнаяВыборка.Количество() > 0 Тогда + ДобавитьЭлементыСправочникаВопросыШаблонаАнкеты(ПодчиненнаяВыборка,НовыйЭлемент.Ссылка); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + + + + + + diff --git a/SSL/src/Catalogs/ШаблоныАнкет/ШаблоныАнкет.mdo b/SSL/src/Catalogs/ШаблоныАнкет/ШаблоныАнкет.mdo new file mode 100644 index 000000000..0b323b724 --- /dev/null +++ b/SSL/src/Catalogs/ШаблоныАнкет/ШаблоныАнкет.mdo @@ -0,0 +1,223 @@ + + + + + + + + + + ШаблоныАнкет + + ru + Шаблоны анкет + + true + Catalog.ШаблоныАнкет.StandardAttribute.Description + Catalog.ШаблоныАнкет.StandardAttribute.Code + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + Managed + Use + + ru + Шаблон анкеты + + true + 2 + true + 9 + 100 + String + Variable + true + true + AsDescription + InDialog + BothWays + Catalog.ШаблоныАнкет.Form.ФормаЭлемента + Catalog.ШаблоныАнкет.Form.ФормаСписка + + Заголовок + + ru + Заголовок + + + String + + 250 + + + + + ShowError + + Use + Use + + + Вступление + + ru + Вступление + + + String + + + + + + Use + Use + + + Заключение + + ru + Заключение + + + String + + + + + + Use + Use + + + РедактированиеШаблонаЗавершено + + ru + Редактирование шаблона завершено + + + Boolean + + + + + Use + Use + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + + ФормаМастераТабличныхВопросов + + ru + Форма мастера табличных вопросов + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаПростыхВопросов + + ru + Форма простых вопросов + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..e498f6e52 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,23 @@ + + + + + Ссылка + NotInList + + + -1 + + + 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/ФормаВыбора/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Form.form new file mode 100644 index 000000000..187e2146a --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Form.form @@ -0,0 +1,239 @@ + + + + Список + 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 +
    true
    + 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 + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + ChartOfCharacteristicTypes.ВидыДоступа + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Module.bsl new file mode 100644 index 000000000..bb93b7c9d --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Module.bsl @@ -0,0 +1,22 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьПривилегированныйРежим(Истина); + + СкрытыеВидыДоступа = Новый СписокЗначений; + + ВидыДоступаИспользуемыеВсегдаСвойства = УправлениеДоступом.СвойстваВидаДоступа().НайтиСтроки(Новый Структура("ВидДоступаИспользуетсяВсегда", Истина)); + Для каждого СвойстваВидаДоступа Из ВидыДоступаИспользуемыеВсегдаСвойства Цикл + + СкрытыеВидыДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа); + КонецЦикла; + + Если НЕ ВнешниеПользователи.ИспользоватьВнешнихПользователей() Тогда + + СкрытыеВидыДоступа.Добавить(ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи); + КонецЕсли; + + Список.Отбор.Элементы[0].ПравоеЗначение = СкрытыеВидыДоступа; + +КонецПроцедуры diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..e498f6e52 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,23 @@ + + + + + Ссылка + NotInList + + + -1 + + + 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/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..387d57a68 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Form.form @@ -0,0 +1,288 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + Change + Copy + Create + SetDeletionMark + + Наименование + 4 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + + НаименованиеРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТипЗначения + 13 + + <key>ru</key> + <value>Тип значения или группы</value> + + true + true + + true + + + Список.ValueType + + + ru + Имя справочника значения доступа или группы доступа + + + ТипЗначенияРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + ТипЗначенияКонтекстноеМеню + 14 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 16 + + СписокСтрокаПоискаРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 17 + true + + Список + + true + + + + СписокСостояниеПросмотра + 19 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 20 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 22 + + СписокУправлениеПоискомРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 23 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + 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 + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + ChartOfCharacteristicTypes.ВидыДоступа + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..baf5d24fe --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,24 @@ + + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьПривилегированныйРежим(Истина); + + СкрытыеВидыДоступа = Новый СписокЗначений; + + ВидыДоступаИспользуемыеВсегдаСвойства = УправлениеДоступом.СвойстваВидаДоступа().НайтиСтроки(Новый Структура("ВидДоступаИспользуетсяВсегда", Истина)); + Для каждого СвойстваВидаДоступа Из ВидыДоступаИспользуемыеВсегдаСвойства Цикл + + СкрытыеВидыДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа); + КонецЦикла; + + Если НЕ ВнешниеПользователи.ИспользоватьВнешнихПользователей() Тогда + + СкрытыеВидыДоступа.Добавить(ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи); + КонецЕсли; + + Список.Отбор.Элементы[0].ПравоеЗначение = СкрытыеВидыДоступа; + +КонецПроцедуры + diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаЭлемента/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..0637be9c2 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,135 @@ + + + + Наименование + 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 +
    + + + + + +
    diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ObjectModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ObjectModule.bsl new file mode 100644 index 000000000..be94ba383 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ObjectModule.bsl @@ -0,0 +1,10 @@ + +// Обработчик события ПередЗаписью предотвращает изменение видов доступа, +// которые должны изменятся только в режиме конфигурирования. +// +Процедура ПередЗаписью(Отказ) + + ВызватьИсключение(НСтр("ru = 'Изменение видов доступа выполняется только через конфигуратор! + |Удаление допустимо.'")); + +КонецПроцедуры diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ВидыДоступа.mdo b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ВидыДоступа.mdo new file mode 100644 index 000000000..fdc277883 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ВидыДоступа.mdo @@ -0,0 +1,203 @@ + + + + + + + + + + + ВидыДоступа + + ru + Виды доступа + + true + ChartOfCharacteristicTypes.ВидыДоступа.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + ValueType + + + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Parent + true + + Use + + + + + Use + Predefined + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + Ref + + Use + + + + DontUse + Managed + Use + + ru + Вид доступа + + + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + CatalogRef.ГруппыПользователей + CatalogRef.Пользователи + + true + 50 + WithinSubordination + AsDescription + + + ВнешниеПользователи + Внешние пользователи + + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + + + + ДополнительныеСведения + Дополнительные сведения + + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + CatalogRef.ГруппыПользователей + CatalogRef.Пользователи + + + + Пользователи + Пользователи + + CatalogRef.ГруппыПользователей + CatalogRef.Пользователи + + + + ПравоДобавления + Право добавления + + CatalogRef.Пользователи + + + + ПравоИзменения + Право изменения + + CatalogRef.Пользователи + + + + ПравоЧтения + Право чтения + + CatalogRef.Пользователи + + + + УчетныеЗаписиЭлектроннойПочты + Учетные записи электронной почты + + CatalogRef.ВнешниеПользователи + 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/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + 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/ФормаВыбора/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Form.form new file mode 100644 index 000000000..4d861bb3a --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Form.form @@ -0,0 +1,272 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Код + 4 + true + true + + true + + + Список.Code + + true + + КодРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 5 + true + + LabelField + Enter + true + true + Left + true + + true + true + + + + Наименование + 6 + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 7 + true + + LabelField + Enter + true + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 9 + + СписокСтрокаПоискаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 10 + true + + Список + + true + + + + СписокСостояниеПросмотра + 12 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 13 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 15 + + СписокУправлениеПоискомРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 16 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + Tree + true + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + 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 + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Module.bsl new file mode 100644 index 000000000..6f871f604 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Module.bsl @@ -0,0 +1,9 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Анкетирование.УстановитьПараметрыОтбораФормуВыбора(Параметры,Список.Отбор); + +КонецПроцедуры + + diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + 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/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..7d89afc03 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form @@ -0,0 +1,305 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Код + 4 + true + true + + true + + + Список.Code + + true + + КодРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 5 + true + + LabelField + Enter + true + true + Left + true + + true + true + + + + Наименование + 6 + true + true + + true + + + Список.Description + + true + + НаименованиеРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 7 + true + + LabelField + Enter + true + true + Left + true + + true + true + + + + Формулировка + 8 + true + true + + true + + + Список.Формулировка + + true + + ФормулировкаРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ФормулировкаКонтекстноеМеню + 9 + true + + LabelField + Enter + true + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 11 + + СписокСтрокаПоискаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 12 + true + + Список + + true + + + + СписокСостояниеПросмотра + 14 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 15 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 17 + + СписокУправлениеПоискомРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 18 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Attributes/ВариантыОтветов/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Attributes/ВариантыОтветов/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..47e7d6fec --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Attributes/ВариантыОтветов/ExtInfo/ListSettings.dcss @@ -0,0 +1,19 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + РеквизитДопУпорядочивания + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..b4e465b2a --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,1671 @@ + + + + НаименованиеКод + 17 + + Наименование + 3 + true + true + + true + + + Объект.Description + + + OnChange + НаименованиеПриИзменении + + + НаименованиеРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + Код + 1 + true + true + + true + + + Объект.Code + + + КодРасширеннаяПодсказка + 96 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 2 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + ru + Наименование код + + + НаименованиеКодРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Родитель + 5 + true + true + + true + + + Объект.Parent + + + РодительРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + + РодительКонтекстноеМеню + 6 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + Представление + 7 + true + true + + true + + + Объект.Формулировка + + + ПредставлениеРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + + ПредставлениеКонтекстноеМеню + 8 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + Комментарий + 18 + + ТребуетсяКомментарий + 11 + true + true + + true + + + Объект.ТребуетсяКомментарий + + + OnChange + ТребуетсяКомментарийПриИзменении + + + ТребуетсяКомментарийРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + + ТребуетсяКомментарийКонтекстноеМеню + 12 + true + + CheckBoxField + Auto + true + Left + true + + + + ПояснениеКомментария + 13 + true + true + + true + + + Объект.ПояснениеКомментария + + + ПояснениеКомментарияРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + ПояснениеКомментарияКонтекстноеМеню + 14 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + ru + Комментарий + + + КомментарийРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ТипЗаполнение + 19 + + ТипОтвета + 9 + true + true + + true + + + ТипОтвета + + + OnChange + ТипОтветаПриИзменении + + + ТипОтветаРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + + ТипОтветаКонтекстноеМеню + 10 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ЗаполнятьАвтоматически + 15 + true + + true + + + Объект.ЗаполнятьАвтоматически + + + ЗаполнятьАвтоматическиРасширеннаяПодсказка + 110 + Label + true + true + + Left + + + + ЗаполнятьАвтоматическиКонтекстноеМеню + 16 + true + + CheckBoxField + Auto + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Тип заполнение</value> + + + ru + Тип заполнение + + + ТипЗаполнениеРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ЗависимыеПараметры + 20 + + СтраницаЧисло + 21 + + РеквизитыЧисла + 84 + + Длина + 75 + true + true + + true + + + Объект.Длина + + + OnChange + ДлинаПриИзменении + + + ДлинаРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + ДлинаКонтекстноеМеню + 76 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Точность + 82 + true + true + + true + + + Объект.Точность + + + OnChange + ТочностьПриИзменении + + + ТочностьРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + + ТочностьКонтекстноеМеню + 83 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + МинимальноеЗначение + 24 + true + true + + true + + + Объект.МинимальноеЗначение + + + МинимальноеЗначениеРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + + МинимальноеЗначениеКонтекстноеМеню + 25 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + МаксимальноеЗначение + 26 + true + true + + true + + + Объект.МаксимальноеЗначение + + + МаксимальноеЗначениеРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + + МаксимальноеЗначениеКонтекстноеМеню + 27 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Реквизиты числа</value> + + + ru + Реквизиты числа + + + РеквизитыЧислаРасширеннаяПодсказка + 114 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + АгрегироватьСуммуВОтчетах + 85 + true + true + + true + + + Объект.АгрегироватьСуммуВОтчетах + + Right + + АгрегироватьСуммуВОтчетахРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + + АгрегироватьСуммуВОтчетахКонтекстноеМеню + 86 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Страница число</value> + + + ru + Страница число + + + СтраницаЧислоРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаСтрока + 72 + + ДлинаСтроки + 91 + true + true + + true + + + ДлинаСтроки + + + ДлинаСтрокиРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + + ДлинаСтрокиКонтекстноеМеню + 92 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + + 0 + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Страница строка</value> + + + ru + Страница строка + + + СтраницаСтрокаРасширеннаяПодсказка + 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 + Label + true + true + + Left + + + Page + + auto + + + + ВариантыОтветов + 33 + + ВариантыОтветовИнформация + 77 + + ИнформацияВариантыОтветов + 80 + true + true + + true + + + ИнформацияВариантыОтветов + + None + + ИнформацияВариантыОтветовРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + + ИнформацияВариантыОтветовКонтекстноеМеню + 81 + true + + LabelField + Enter + true + Left + true + + true + true + + System.DefaultGUIFont + 9.0 + true + false + false + false + + + + true + true + + true + + + <key>ru</key> + <value>Варианты ответов информация</value> + + true + false + + ВариантыОтветовИнформацияРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + LeftNarrowest + Auto + Auto + + + + ТаблицаВариантыОтветов + 55 + true + true + + true + + + ВариантыОтветов + + false + None + + Владелец + 70 + false + + true + + + ВариантыОтветов.Owner + + + ВладелецРасширеннаяПодсказка + 147 + Label + true + true + + Left + + + + ВладелецКонтекстноеМеню + 71 + true + + LabelField + true + Left + true + + true + true + + + + ВариантыОтветовРеквизитДопУпорядочивания + 89 + true + true + + true + + + ВариантыОтветов.РеквизитДопУпорядочивания + + + ВариантыОтветовРеквизитДопУпорядочиванияРасширеннаяПодсказка + 149 + Label + true + true + + Left + + + + ВариантыОтветовРеквизитДопУпорядочиванияКонтекстноеМеню + 90 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Ответ + 58 + + <key>ru</key> + <value>Ответ</value> + + true + true + + true + + + ВариантыОтветов.Description + + + ОтветРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + + ОтветКонтекстноеМеню + 59 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТребуетОткрытогоОтвета + 64 + true + true + + true + + + ВариантыОтветов.ТребуетОткрытогоОтвета + + + ТребуетОткрытогоОтветаРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + + ТребуетОткрытогоОтветаКонтекстноеМеню + 65 + true + + CheckBoxField + Auto + true + Left + true + + + + ТаблицаВариантыОтветовКоманднаяПанель + 57 + + ТаблицаВариантыОтветовПереместитьВариантОтветаВверх + 87 + true + true + + true + + false + + ТаблицаВариантыОтветовПереместитьВариантОтветаВверхРасширеннаяПодсказка + 135 + Label + true + true + + Left + + + Form.Command.ПереместитьВариантОтветаВверх + Normal + Auto + true + true + UserCmds + + StdPicture.MoveUp + + Auto + + + ТаблицаВариантыОтветовПереместитьВариантОтветаВниз + 88 + true + true + + true + + false + + ТаблицаВариантыОтветовПереместитьВариантОтветаВнизРасширеннаяПодсказка + 136 + Label + true + true + + Left + + + Form.Command.ПереместитьВариантОтветаВниз + Normal + Auto + true + true + UserCmds + + StdPicture.MoveDown + + Auto + + Left + true + + + Selection + ТаблицаВариантыОтветовВыбор + + + BeforeAddRow + ТаблицаВариантыОтветовПередНачаломДобавления + + + BeforeRowChange + ТаблицаВариантыОтветовПередНачаломИзменения + + + ТаблицаВариантыОтветовСтрокаПоиска + 138 + + ТаблицаВариантыОтветовСтрокаПоискаРасширеннаяПодсказка + 140 + Label + true + true + + Left + + + + ТаблицаВариантыОтветовСтрокаПоискаКонтекстноеМеню + 139 + true + + ТаблицаВариантыОтветов + + true + + + + ТаблицаВариантыОтветовСостояниеПросмотра + 141 + + ТаблицаВариантыОтветовСостояниеПросмотраРасширеннаяПодсказка + 143 + Label + true + true + + Left + + + + ТаблицаВариантыОтветовСостояниеПросмотраКонтекстноеМеню + 142 + true + + ViewStatusAddition + ТаблицаВариантыОтветов + + true + + + + ТаблицаВариантыОтветовУправлениеПоиском + 144 + + ТаблицаВариантыОтветовУправлениеПоискомРасширеннаяПодсказка + 146 + Label + true + true + + Left + + + + ТаблицаВариантыОтветовУправлениеПоискомКонтекстноеМеню + 145 + true + + SearchControlAddition + ТаблицаВариантыОтветов + + true + + + + ТаблицаВариантыОтветовРасширеннаяПодсказка + 137 + Label + true + true + + Left + + + + ТаблицаВариантыОтветовКонтекстноеМеню + 56 + true + + true + true + true + true + true + Row +
    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 + +
    + true + true + + true + + + <key>ru</key> + <value>Варианты ответов</value> + + + ru + Варианты ответов + + + ВариантыОтветовРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + + ЗначениеИнформационнойБазы + 48 + true + true + + true + + + <key>ru</key> + <value>Значение информационной базы</value> + + + ru + Значение информационной базы + + + ЗначениеИнформационнойБазыРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + Пустая + 51 + + Декорация + 52 + true + true + + true + + + ДекорацияРасширеннаяПодсказка + 165 + Label + true + true + + Left + + + + ДекорацияКонтекстноеМеню + 53 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Пустая</value> + + + ru + Пустая + + + ПустаяРасширеннаяПодсказка + 164 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Зависимые параметры</value> + + + ru + Зависимые параметры + + + ЗависимыеПараметрыРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + Pages + + Auto + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + ChartOfCharacteristicTypesObject.ВопросыДляАнкетирования + + + true + + + true + +
    true
    + true +
    + + ВариантыОтветов + + <key>ru</key> + <value>Варианты ответов</value> + + 3 + + DynamicList + + + true + + + true + + + ВариантыОтветов.Description + + + ВариантыОтветов.Ref + + + ВариантыОтветов.РеквизитДопУпорядочивания + + + ВариантыОтветов.ТребуетОткрытогоОтвета + + + Catalog.ВариантыОтветовАнкет + true + true + true + true + + + + ПредопределеныеЗначенияНеобходимыеНаКлиенте + + <key>ru</key> + <value>Предопределеные значения необходимые на клиенте</value> + + 4 + + ValueList + + + true + + + true + + + + + + + ТипОтвета + + <key>ru</key> + <value>Тип ответа</value> + + 2 + + EnumRef.ТипыОтветовНаВопрос + TypeDescription + + + true + + + true + + + + ИнформацияВариантыОтветов + + <key>ru</key> + <value>Информация варианты ответов</value> + + 6 + + String + + + + true + + + true + + + + ДлинаСтроки + + <key>ru</key> + <value>Длина строки</value> + + 5 + + Number + + 4 + true + + + + true + + + true + + + + ПереместитьВариантОтветаВверх + + <key>ru</key> + <value>Переместить вариант ответа вверх</value> + + 1 + + ru + Переместить вариант ответа вверх + + + true + + + StdPicture.MoveUp + + + + ПереместитьЭлементВверх + + + Auto + Auto + + + ПереместитьВариантОтветаВниз + + <key>ru</key> + <value>Переместить вариант ответа вниз</value> + + 2 + + ru + Переместить вариант ответа вниз + + + true + + + StdPicture.MoveDown + + + + ПереместитьЭлементВниз + + + Auto + Auto + + + + + + + + AfterWrite + ПослеЗаписи + + + BeforeWrite + ПередЗаписью + + +
    diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..d641ae153 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,338 @@ +&НаКлиенте +Перем ЗначенияПеречисленияТипыОтветовНаВопрос; + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ + +// Управляет видимостью страниц и элементов формы +&НаКлиенте +Процедура УправлениеВидимостью() + + ВозможенКомментарий = НЕ (Объект.ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.НесколькоВариантовИз ИЛИ Объект.ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.Текст); + Элементы.ТребуетсяКомментарий.Доступность = ВозможенКомментарий; + Элементы.Комментарий.Доступность = ВозможенКомментарий; + Если НЕ ВозможенКомментарий Тогда + Объект.ТребуетсяКомментарий = Ложь; + Объект.ПояснениеКомментария = ""; + КонецЕсли; + ДоступностьНеобходимостьПояснениеКомментария(); + Элементы.ЗаполнятьАвтоматически.Видимость = Объект.Предопределенный; + + + Если Объект.ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.Строка Тогда + + Элементы.ЗависимыеПараметры.ТекущаяСтраница = Элементы.СтраницаСтрока; + + ИначеЕсли Объект.ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.Число Тогда + + Элементы.ЗависимыеПараметры.ТекущаяСтраница = Элементы.СтраницаЧисло; + + ИначеЕсли Объект.ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.ЗначениеИнформационнойБазы Тогда + + Элементы.ЗависимыеПараметры.ТекущаяСтраница = Элементы.Пустая; + + ИначеЕсли Объект.ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.ВидКонтактнойИнформации Тогда + + Элементы.ЗависимыеПараметры.ТекущаяСтраница = Элементы.КонтактнаяИнформация; + + ИначеЕсли Объект.ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.ОдинВариантИз + ИЛИ Объект.ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.НесколькоВариантовИз Тогда + + Элементы.ЗависимыеПараметры.ТекущаяСтраница = Элементы.ВариантыОтветов; + + ДоступностьТаблицыВариантыОтветов(); + + Иначе + + + Элементы.ЗависимыеПараметры.ТекущаяСтраница = Элементы.Пустая; + + КонецЕсли; + + +КонецПроцедуры // УправлениеВидимостью() + +&НаКлиенте +Процедура ДоступностьНеобходимостьПояснениеКомментария() + + Элементы.ПояснениеКомментария.АвтоОтметкаНезаполненного = Объект.ТребуетсяКомментарий; + Элементы.ПояснениеКомментария.ТолькоПросмотр = НЕ Объект.ТребуетсяКомментарий; + + ОтключитьОтметкуНезаполненного(); + +КонецПроцедуры // ДоступностьНеобходимостьПояснениеКомментария() + +&НаКлиенте +Процедура ДоступностьТаблицыВариантыОтветов() + + Если Объект.Ссылка.Пустая() Тогда + Элементы.ТаблицаВариантыОтветов.ТолькоПросмотр = Истина; + ИнформацияВариантыОтветов = НСтр("ru = 'Для редактирования вариантов ответов необходимо записать вопрос для анкетирования'"); + Иначе + Элементы.ТаблицаВариантыОтветов.ТолькоПросмотр = Ложь; + ИнформацияВариантыОтветов = НСтр("ru = 'Варианты ответов на вопрос:'"); + КонецЕсли; + + Если ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.ОдинВариантИз Тогда + Элементы.ТребуетОткрытогоОтвета.Видимость = Ложь; + ИначеЕсли ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.НесколькоВариантовИз Тогда + Элементы.ТребуетОткрытогоОтвета.Видимость = Истина; + КонецЕсли; + +КонецПроцедуры // ВидимостьТаблицыВариантыОтветов() + +&НаКлиенте +Процедура ОткрытьФормуЭлементаСправочникаВопросыОтветовАнкет(Элемент,РежимДобавления) + + СтруктураПараметров = Новый Структура; + СтруктураПараметров.Вставить("Владелец",Объект.Ссылка); + СтруктураПараметров.Вставить("ТипОтвета",Объект.ТипОтвета); + + Если Не РежимДобавления Тогда + ТекущиеДанные = Элементы.ТаблицаВариантыОтветов.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + СтруктураПараметров.Вставить("Ключ",ТекущиеДанные.Ссылка); + КонецЕсли; + + ОткрытьФорму("Справочник.ВариантыОтветовАнкет.Форма.ФормаЭлемента",СтруктураПараметров,Элемент); + +КонецПроцедуры // () + +// Процедура получает необходмые значения предопределенных значений, +// необходимых на клиенте. +&НаСервере +Процедура ПолучениеПредопределенныхЗначенийНеобходимыхНаКлиенте() + + ПеречислениеТипыОтветовНаВопрос = Анкетирование.ПолучитьСтруктуруЗначенияПеречисления("ТипыОтветовНаВопрос"); + ПредопределеныеЗначенияНеобходимыеНаКлиенте.Вставить(0,ПеречислениеТипыОтветовНаВопрос); + +КонецПроцедуры // ПредопределеныеЗначенияНеобходимыеНаКлиенте() + +&НаСервере +Процедура УстановитьТипОтвета() + + Для каждого ЗначениеПеречисления Из ПредопределеныеЗначенияНеобходимыеНаКлиенте.Получить(0).Значение Цикл + + Если ЗначениеПеречисления.Значение = Перечисления.ТипыОтветовНаВопрос.ЗначениеИнформационнойБазы Тогда + + Для каждого ДоступныйТип Из РеквизитФормыВЗначение("Объект").Метаданные().Тип.Типы() Цикл + + Если ДоступныйТип = Тип("Строка") ИЛИ ДоступныйТип = Тип("Булево") ИЛИ ДоступныйТип = Тип("Число") ИЛИ ДоступныйТип = Тип("Дата") ИЛИ ДоступныйТип = Тип("СправочникСсылка.ВариантыОтветовАнкет") Тогда + Продолжить; + КонецЕсли; + + МассивТипов = Новый Массив; + МассивТипов.Добавить(ДоступныйТип); + Элементы.ТипОтвета.СписокВыбора.Добавить(Новый ОписаниеТипов(МассивТипов)); + + КонецЦикла; + + Иначе + Элементы.ТипОтвета.СписокВыбора.Добавить(ЗначениеПеречисления.Значение); + КонецЕсли; + + КонецЦикла; + + Если Объект.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ЗначениеИнформационнойБазы Тогда + + ТипОтвета = Объект.ТипЗначения; + + Иначе + + ТипОтвета = Объект.ТипОтвета; + + КонецЕсли; + + +КонецПроцедуры // () + +// Устанавливает точность числового ответа в зависимости от выбранной длины +// +&НаКлиенте +Процедура УстановитьТочностьВЗависимостиОтДлиныЧисла() + + Если Объект.Длина > 15 Тогда + Объект.Длина = 15; + КонецЕсли; + + Если Объект.Длина = 0 Тогда + Объект.Точность = 0; + ИначеЕсли Объект.Длина <= Объект.Точность Тогда + Объект.Точность = Объект.Длина - 1; + КонецЕсли; + + Если Объект.Точность > 3 Тогда + Объект.Точность = 3; + КонецЕсли; + + Если (Объект.Длина - Объект.Точность) > 12 Тогда + Объект.Длина = Объект.Точность + 12; + КонецЕсли; +КонецПроцедуры // () + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ЗначенияПеречисленияТипыОтветовНаВопрос = ПредопределеныеЗначенияНеобходимыеНаКлиенте.Получить(0).Значение; + УправлениеВидимостью(); + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + //установим отбор по владельцу на динамическом списке справочника "Варианты ответов анкет" + ЭлементОтбораДанных = ВариантыОтветов.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Владелец"); + ЭлементОтбораДанных.Использование = Истина; + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбораДанных.ПравоеЗначение = Объект.Ссылка; + + ПолучениеПредопределенныхЗначенийНеобходимыхНаКлиенте(); + УстановитьТипОтвета(); + + Если ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Строка Тогда + ДлинаСтроки = Объект.Длина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) + + Если Объект.ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.Число Тогда + + Если Объект.МинимальноеЗначение > Объект.МаксимальноеЗначение Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Минимально допустимое значение не может быть больше чем максимальное.'"),, + "Объект.МинимальноеЗначение"); + Отказ = Истина; + КонецЕсли; + + ИначеЕсли Объект.ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.Строка Тогда + + Объект.Длина = ДлинаСтроки; + Если ДлинаСтроки = 0 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не заполнено значение длины строки.'"),,"ДлинаСтроки"); + Отказ = Истина; + КонецЕсли; + + ИначеЕсли Объект.ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.Текст Тогда + + Объект.Длина = 1024; + + КонецЕсли; + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ТипОтветаПриИзменении(Элемент) + + Если ТипЗнч(ТипОтвета) = Тип("ПеречислениеСсылка.ТипыОтветовНаВопрос") Тогда + + Объект.ТипОтвета = ТипОтвета; + + ИначеЕсли ТипЗнч(ТипОтвета) = Тип("ОписаниеТипов") Тогда + + Объект.ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.ЗначениеИнформационнойБазы; + Объект.ТипЗначения = ТипОтвета; + + КонецЕсли; + + УправлениеВидимостью(); + + Если Объект.ТипОтвета = ЗначенияПеречисленияТипыОтветовНаВопрос.Число Тогда + УстановитьТочностьВЗависимостиОтДлиныЧисла(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + ДоступностьТаблицыВариантыОтветов(); + ВариантыОтветов.Отбор.Элементы[0].ПравоеЗначение = Объект.Ссылка; + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаВариантыОтветовПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Отказ = Истина; + ОткрытьФормуЭлементаСправочникаВопросыОтветовАнкет(Элемент,Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ТребуетсяКомментарийПриИзменении(Элемент) + + ДоступностьНеобходимостьПояснениеКомментария(); + +КонецПроцедуры + +&НаКлиенте +Процедура НаименованиеПриИзменении(Элемент) + + Если ПустаяСтрока(Объект.Формулировка) Тогда + + Объект.Формулировка = Объект.Наименование; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаВариантыОтветовПередНачаломИзменения(Элемент, Отказ) + + Отказ = Истина; + ОткрытьФормуЭлементаСправочникаВопросыОтветовАнкет(Элемент,Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаВариантыОтветовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ОткрытьФормуЭлементаСправочникаВопросыОтветовАнкет(Элемент,Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ДлинаПриИзменении(Элемент) + + УстановитьТочностьВЗависимостиОтДлиныЧисла(); + +КонецПроцедуры + +&НаКлиенте +Процедура ТочностьПриИзменении(Элемент) + + УстановитьТочностьВЗависимостиОтДлиныЧисла(); + +КонецПроцедуры + + //////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ПОДСИСТЕМЫ НАСТРОЙКИ ПОРЯДКА ЭЛЕМЕНТОВ ДЛЯ ПОДЧИНЕННОГО СПРАВОЧНИКА +// ВАРИАНТЫ ОТВЕТОВ АНКЕТ + +&НаКлиенте +Процедура ПереместитьЭлементВверх(Команда) + + НастройкаПорядкаЭлементовКлиент.ПереместитьЭлементВверхВыполнить(ВариантыОтветов, Элементы.ТаблицаВариантыОтветов); + +КонецПроцедуры + +&НаКлиенте +Процедура ПереместитьЭлементВниз(Команда) + + НастройкаПорядкаЭлементовКлиент.ПереместитьЭлементВнизВыполнить(ВариантыОтветов, Элементы.ТаблицаВариантыОтветов); + +КонецПроцедуры + diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ObjectModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ObjectModule.bsl new file mode 100644 index 000000000..0cd002644 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ObjectModule.bsl @@ -0,0 +1,127 @@ + +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + + + Если ЭтоГруппа Тогда + Возврат; + КонецЕсли; + + Если ТребуетсяКомментарий Тогда + + ПроверяемыеРеквизиты.Добавить("ПояснениеКомментария"); + + КонецЕсли; + + Если (ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Строка) + ИЛИ ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Число Тогда + + ПроверяемыеРеквизиты.Добавить("Длина"); + + ИначеЕсли ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ЗначениеИнформационнойБазы Тогда + + ПроверяемыеРеквизиты.Добавить("ТипЗначения"); + + + ИначеЕсли ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ВидКонтактнойИнформации Тогда + + ПроверяемыеРеквизиты.Добавить("ВидКонтактнойИнформации"); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПередЗаписью(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если Не ЭтоГруппа Тогда + ОчиститьНенужныеРеквизиты(); + УстановкаТипаПВХ(); + КонецЕсли; + +КонецПроцедуры + +// Процедура очищает значения ненужных реквизитов, +// Такая ситуация возникает, когда пользователь изменяет тип ответа при редактировании. +Процедура ОчиститьНенужныеРеквизиты() + + Если (ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.ВидКонтактнойИнформации) + И (НЕ ВидКонтактнойИнформации.Пустая()) Тогда + + ВидКонтактнойИнформации = Справочники.ВидыКонтактнойИнформации.ПустаяСсылка(); + + КонецЕсли; + + Если ((ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.Число) И (ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.Строка) И (ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.Текст)) + И (Длина <> 0)Тогда + + Длина = 0; + + КонецЕсли; + + Если (ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.Число) Тогда + + МинимальноеЗначение = 0; + МаксимальноеЗначение = 0; + АгрегироватьСуммуВОтчетах = Ложь; + + КонецЕсли; + + Если ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда + ТребуетсяКомментарий = Ложь; + ПояснениеКомментария = ""; + КонецЕсли; + +КонецПроцедуры // () + +//Устанавливает тип значения ПВХ в зависимости от типа ответа +Процедура УстановкаТипаПВХ() + + ТипыОтветовНаВопрос = Перечисления.ТипыОтветовНаВопрос; + + // Квалификаторы + КЧ = Новый КвалификаторыЧисла(?(Длина = 0,15,Длина),Точность); + КС = Новый КвалификаторыСтроки(Длина); + КД = Новый КвалификаторыДаты(ЧастиДаты.Дата); + + // Описание типов + ОписаниеТиповЧисло = Новый ОписаниеТипов("Число",,КЧ); + ОписаниеТиповСтрока = Новый ОписаниеТипов("Строка", , КС); + ОписаниеТиповДата = Новый ОписаниеТипов("Дата",КД , , ); + ОписаниеТиповБулево = Новый ОписаниеТипов("Булево"); + ОписаниеТиповВО = Новый ОписаниеТипов("СправочникСсылка.ВариантыОтветовАнкет"); + + Если ТипОтвета = ТипыОтветовНаВопрос.Строка Тогда + + ТипЗначения = ОписаниеТиповСтрока; + + ИначеЕсли ТипОтвета = ТипыОтветовНаВопрос.Текст Тогда + + ТипЗначения = ОписаниеТиповСтрока; + + ИначеЕсли ТипОтвета = ТипыОтветовНаВопрос.Число Тогда + + ТипЗначения = ОписаниеТиповЧисло; + + ИначеЕсли ТипОтвета = ТипыОтветовНаВопрос.Дата Тогда + + ТипЗначения = ОписаниеТиповДата; + + ИначеЕсли ТипОтвета = ТипыОтветовНаВопрос.Булево Тогда + + ТипЗначения = ОписаниеТиповБулево; + + ИначеЕсли ТипОтвета = ТипыОтветовНаВопрос.ВидКонтактнойИнформации Тогда + + ТипЗначения = ОписаниеТиповСтрока; + + ИначеЕсли ТипОтвета =ТипыОтветовНаВопрос.ОдинВариантИз + ИЛИ ТипОтвета = ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда + + ТипЗначения = ОписаниеТиповВО; + + КонецЕсли; + +КонецПроцедуры // УстановкаТипаПВХ()() \ No newline at end of file diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ВопросыДляАнкетирования.mdo b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ВопросыДляАнкетирования.mdo new file mode 100644 index 000000000..2260dc1ca --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ВопросыДляАнкетирования.mdo @@ -0,0 +1,358 @@ + + + + + + + + + + + ВопросыДляАнкетирования + + ru + Вопросы для анкетирования + + true + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.Description + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.Code + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + ValueType + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Parent + true + + Use + + + + + Use + Predefined + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + Ref + + Use + + + + DontUse + Managed + Use + + ru + Вопрос для анкетирования + + Catalog.ВариантыОтветовАнкет + + Boolean + String + Date + Number + CatalogRef.ВариантыОтветовАнкет + + 15 + 3 + + + 1024 + + + Date + + + true + true + 9 + Variable + 100 + true + true + AsDescription + InDialog + BothWays + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Form.ФормаЭлемента + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Form.ФормаСписка + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Form.ФормаВыбора + + Формулировка + + ru + Формулировка + + + String + + 300 + + + true + + + ShowError + + Use + Use + + + ТипОтвета + + ru + Тип ответа + + + EnumRef.ТипыОтветовНаВопрос + + + + ShowError + + Enum.ТипыОтветовНаВопрос.EmptyRef + + Index + Use + Use + + + ТребуетсяКомментарий + + ru + Требуется комментарий + + + Boolean + + + + + Use + Use + + + ПояснениеКомментария + + ru + Пояснение комментария + + + String + + 150 + + + + + + Use + Use + + + ЗаполнятьАвтоматически + + ru + Заполнять автоматически + + + Boolean + + + + + Use + Use + + + Длина + + ru + Длина + + + Number + + 10 + true + + + + + + 0 + + Use + Use + + + МинимальноеЗначение + + ru + Минимальное значение + + + Number + + 15 + + + + + + 0 + + Use + Use + + + МаксимальноеЗначение + + ru + Максимальное значение + + + Number + + 15 + + + + + + 0 + + Use + Use + + + ВидКонтактнойИнформации + + ru + Вид контактной информации + + + CatalogRef.ВидыКонтактнойИнформации + + + + + Catalog.ВидыКонтактнойИнформации.EmptyRef + + Use + Use + + + Точность + + ru + Точность + + + Number + + 1 + true + + + + + + Use + Use + + + АгрегироватьСуммуВОтчетах + + ru + Агрегировать сумму в отчетах + + + Boolean + + + + + Use + Use + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + + ФормаВыбора + + ru + Форма выбора + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаГруппы/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаГруппы/Form.form new file mode 100644 index 000000000..a20282f73 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаГруппы/Form.form @@ -0,0 +1,170 @@ + + + + Наименование + 1 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Родитель + 3 + true + true + + true + + + Объект.Parent + + + РодительРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + РодительКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Комментарий + 5 + true + true + + true + + + Объект.Комментарий + + Left + + КомментарийРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + + StartChoice + КомментарийНачалоВыбора + + true + 2 + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + ChartOfCharacteristicTypesObject.ДополнительныеРеквизитыИСведения + + + true + + + true + +
    true
    + true +
    + + + + + + Folders + +
    diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаГруппы/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаГруппы/Module.bsl new file mode 100644 index 000000000..59b7cbba9 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаГруппы/Module.bsl @@ -0,0 +1,7 @@ + +&НаКлиенте +Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияКомментария(Элемент.ТекстРедактирования, Объект.Комментарий, Модифицированность); + +КонецПроцедуры diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаПоискаСсылокНаПВХ/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаПоискаСсылокНаПВХ/Form.form new file mode 100644 index 000000000..59bcd6cd2 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаПоискаСсылокНаПВХ/Form.form @@ -0,0 +1,441 @@ + + + + ГруппаСтраницы + 1 + + СтраницаСсылокНеНайдено + 2 + + ГруппаТекстПояснения + 12 + + ТекстПояснения + 14 + + <key>ru</key> + <value>Ссылок на свойство в информационной базе не найдено (свойство не используется). +Изменения типа значения и пометки удаления свойства разрешены.</value> + + true + true + + true + + + ТекстПоясненияРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ТекстПоясненияКонтекстноеМеню + 15 + true + + Label + true + 3 + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа текст пояснения</value> + + + ru + Группа текст пояснения + + + ГруппаТекстПоясненияРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаКнопокПояснения + 13 + + ОК + 16 + + <key>ru</key> + <value>ОК</value> + + true + true + + true + + false + + ОКРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + Form.Command.РазрешитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа кнопок пояснения</value> + + + ru + Группа кнопок пояснения + + + ГруппаКнопокПоясненияРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Страница ссылок не найдено</value> + + + ru + Страница ссылок не найдено + + + СтраницаСсылокНеНайденоРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + Page + + Vertical + + + + СтраницаНайденыСсылки + 3 + + ГруппаТекстПредупреждения + 10 + + ТекстПредупреждения + 6 + + <key>ru</key> + <value>Внимание! Дополнительное свойство уже используется в информационной базе. +Изменение типа может привести к потере значений уже установленных свойств. +Вы уверены, что хотите разрешить редактирование тип значения свойства +и пометку на удаление?</value> + + true + true + + true + + + ТекстПредупрежденияРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ТекстПредупрежденияКонтекстноеМеню + 7 + true + + Label + true + 3 + true + false + + Left + Top + + + true + true + + true + + + <key>ru</key> + <value>Группа текст предупреждения</value> + + + ru + Группа текст предупреждения + + + ГруппаТекстПредупрежденияРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаКнопок + 8 + + РазрешитьРедактирование + 9 + true + true + + true + + false + + РазрешитьРедактированиеРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.Command.РазрешитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + + Отмена + 11 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ru + Группа кнопок + + + ГруппаКнопокРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Страница найдены ссылки</value> + + + ru + Страница найдены ссылки + + + СтраницаНайденыСсылкиРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Page + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Группа страницы</value> + + + ru + Группа страницы + + + ГруппаСтраницыРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Pages + + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + РазрешитьРедактирование + + <key>ru</key> + <value>Разрешить редактирование</value> + + 1 + + ru + Разрешить редактирование + + + true + + + + РазрешитьРедактирование + + + Auto + Auto + + + Ссылка + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + + + + + diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаПоискаСсылокНаПВХ/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаПоискаСсылокНаПВХ/Module.bsl new file mode 100644 index 000000000..d45700bbd --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаПоискаСсылокНаПВХ/Module.bsl @@ -0,0 +1,22 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ЗапретРедактированияРеквизитовОбъектов.ПроверитьНаОбъектыИмеютсяСсылкиВИБ(Параметры.Ссылка) Тогда + Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаНайденыСсылки; + Элементы.РазрешитьРедактирование.КнопкаПоУмолчанию = Истина; + Иначе + Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаСсылокНеНайдено; + Элементы.ОК.КнопкаПоУмолчанию = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура РазрешитьРедактирование(Команда) + + Результат = Новый Массив; + Результат.Добавить("ТипЗначения"); + Закрыть(Результат); + +КонецПроцедуры diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаРедактированияСпискаНаборов/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаРедактированияСпискаНаборов/Form.form new file mode 100644 index 000000000..cbddd0169 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаРедактированияСпискаНаборов/Form.form @@ -0,0 +1,473 @@ + + + + <key>ru</key> + <value>Наборы</value> + + + ДеревоНаборов + 1 + true + true + + true + + + ДеревоНаборов + + false + None + + Группа + 8 + + Выбран + 4 + true + true + + true + + + ДеревоНаборов.Выбран + + None + + OnChange + ВыбранПриИзменении + + + ВыбранРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ВыбранКонтекстноеМеню + 5 + true + + CheckBoxField + Enter + true + Left + true + + true + + + + Набор + 6 + true + true + + true + + + ДеревоНаборов.Набор + + + НаборРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + НаборКонтекстноеМеню + 7 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + None + + ДеревоНаборовКоманднаяПанель + 3 + Left + true + + + ДеревоНаборовСтрокаПоиска + 14 + + ДеревоНаборовСтрокаПоискаРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ДеревоНаборовСтрокаПоискаКонтекстноеМеню + 15 + true + + ДеревоНаборов + + true + + + + ДеревоНаборовСостояниеПросмотра + 17 + + ДеревоНаборовСостояниеПросмотраРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ДеревоНаборовСостояниеПросмотраКонтекстноеМеню + 18 + true + + ViewStatusAddition + ДеревоНаборов + + true + + + + ДеревоНаборовУправлениеПоиском + 20 + + ДеревоНаборовУправлениеПоискомРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ДеревоНаборовУправлениеПоискомКонтекстноеМеню + 21 + true + + SearchControlAddition + ДеревоНаборов + + true + + + + ДеревоНаборовРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ДеревоНаборовКонтекстноеМеню + 2 + true + + Tree + true + true + true +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + None + None + None + true +
    + + ФормаКоманднаяПанель + -1 + + Завершить + 9 + true + true + + true + + false + + ЗавершитьРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + Form.Command.Завершить + Normal + Auto + true + true + UserCmds + Auto + + + Отмена + 10 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ДеревоНаборов + + <key>ru</key> + <value>Дерево наборов</value> + + 1 + + ValueTree + + + true + + + true + + true + + Выбран + + <key>ru</key> + <value>Выбран</value> + + 1 + + Number + + 1 + + + + true + + + true + + + + Набор + + <key>ru</key> + <value>Набор</value> + + 2 + + CatalogRef.НаборыДополнительныхРеквизитовИСведений + + + true + + + true + + + + Наименование + + <key>ru</key> + <value>Наименование</value> + + 3 + + String + + + + true + + + true + + + + + БылаНажатаКлавишаЗакрытия + + <key>ru</key> + <value>Была нажата клавиша закрытия</value> + + 2 + + Boolean + + + true + + + true + + + + Завершить + + <key>ru</key> + <value>Завершить</value> + + 1 + + ru + Завершить + + + true + + + StdPicture.Write + + + + ЗавершитьВыполнить + + + TextPicture + Auto + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Отмена + + + true + + + StdPicture.Close + + + + ОтменаВыполнить + + + TextPicture + Auto + Auto + + + ВыбранныеНаборы + + ValueList + + + + ЭтоДополнительноеСведение + + Boolean + + + + + + +
    diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаРедактированияСпискаНаборов/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаРедактированияСпискаНаборов/Module.bsl new file mode 100644 index 000000000..3266383bd --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаРедактированияСпискаНаборов/Module.bsl @@ -0,0 +1,195 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Перем ПерваяЧастьИмени, ВтораяЧастьИмени; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | 0 КАК Выбран, + | НаборыДополнительныхРеквизитовИСведений.Ссылка КАК Набор, + | НаборыДополнительныхРеквизитовИСведений.Наименование + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений КАК НаборыДополнительныхРеквизитовИСведений + | + |УПОРЯДОЧИТЬ ПО + | Ссылка ИЕРАРХИЯ + |АВТОУПОРЯДОЧИВАНИЕ"; + + Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); + + МассивУдаляемыхСтрок = Новый Массив; + + Для Каждого СтрокаДерева Из Дерево.Строки Цикл + Справочники.НаборыДополнительныхРеквизитовИСведений.ПолучитьЧастиИмени(СтрокаДерева.Набор, ПерваяЧастьИмени, ВтораяЧастьИмени); + + Если Параметры.ЭтоДополнительноеСведение + И НЕ Справочники.НаборыДополнительныхРеквизитовИСведений.ИспользуютсяДопСведения(ПерваяЧастьИмени, ВтораяЧастьИмени) Тогда + МассивУдаляемыхСтрок.Добавить(СтрокаДерева); + ИначеЕсли НЕ Параметры.ЭтоДополнительноеСведение + И НЕ Справочники.НаборыДополнительныхРеквизитовИСведений.ИспользуютсяДопРеквизиты(ПерваяЧастьИмени, ВтораяЧастьИмени) Тогда + МассивУдаляемыхСтрок.Добавить(СтрокаДерева); + КонецЕсли; + КонецЦикла; + + Для Каждого ЭлементУдаляемаяСтрока Из МассивУдаляемыхСтрок Цикл + Дерево.Строки.Удалить(ЭлементУдаляемаяСтрока); + КонецЦикла; + + ВыбранныеНаборы = Параметры.ВыбранныеНаборы; + Для Каждого Набор Из ВыбранныеНаборы Цикл + Стр = Дерево.Строки.Найти(Набор.Значение, "Набор", Истина); + Если Стр <> Неопределено Тогда + Стр.Выбран = Истина; + КонецЕсли; + КонецЦикла; + + Для Каждого Стр Из Дерево.Строки Цикл + ПроверитьФлагУСтроки(Стр); + КонецЦикла; + + ЗначениеВРеквизитФормы(Дерево, "ДеревоНаборов"); + + БылаНажатаКлавишаЗакрытия = Ложь; + +КонецПроцедуры + +&НаКлиенте +Функция ПроверитьМожноЗакрытьФорму() + + Если Модифицированность И Не БылаНажатаКлавишаЗакрытия Тогда + Если Вопрос(НСтр("ru = 'Отказаться от изменений?'"), РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ВыбранПриИзменении(Элемент) + + текДанные = Элементы.ДеревоНаборов.ТекущиеДанные; + Если текДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если текДанные.Выбран = 2 Тогда + текДанные.Выбран = 0; + КонецЕсли; + + Строки = текДанные.ПолучитьЭлементы(); + УстановитьФлагПодчиненнымСтрокам(Строки, текДанные.Выбран); + + текЭлемент = текДанные.ПолучитьРодителя(); + Пока текЭлемент <> Неопределено Цикл + + Есть0 = Ложь; + Есть1 = Ложь; + Есть2 = Ложь; + + Для Каждого Стр Из текЭлемент.ПолучитьЭлементы() Цикл + Есть0 = Есть0 ИЛИ (Стр.Выбран = 0); + Есть1 = Есть1 ИЛИ (Стр.Выбран = 1); + Есть2 = Есть2 ИЛИ (Стр.Выбран = 2); + КонецЦикла; + + Если Не Есть1 И Не Есть2 Тогда + текЭлемент.Выбран = 0; + ИначеЕсли Не Есть2 И Не Есть0 Тогда + текЭлемент.Выбран = 1; + Иначе + текЭлемент.Выбран = 2; + КонецЕсли; + + текЭлемент = текЭлемент.ПолучитьРодителя(); + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтменаВыполнить() + + БылаНажатаКлавишаЗакрытия = Ложь; + Если ПроверитьМожноЗакрытьФорму() Тогда + Закрыть(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершитьВыполнить() + + БылаНажатаКлавишаЗакрытия = Истина; + + ВыбранныеНаборы = Новый СписокЗначений; + ЗаполнитьВыбранныеНаборы(ВыбранныеНаборы, ДеревоНаборов.ПолучитьЭлементы()); + + Если ПроверитьМожноЗакрытьФорму() Тогда + Закрыть(ВыбранныеНаборы); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ + +&НаКлиенте +Процедура ЗаполнитьВыбранныеНаборы(ВыбранныеНаборы, Строки) + + Для Каждого Стр Из Строки Цикл + подчСтроки = Стр.ПолучитьЭлементы(); + Если подчСтроки.Количество() <> 0 Тогда + ЗаполнитьВыбранныеНаборы(ВыбранныеНаборы, подчСтроки); + ИначеЕсли Стр.Выбран Тогда + ВыбранныеНаборы.Добавить(Стр.Набор, Стр.Наименование); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ПроверитьФлагУСтроки(СтрокаДерева) + + Если СтрокаДерева.Строки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Есть0 = Ложь; + Есть1 = Ложь; + Есть2 = Ложь; + + Для Каждого Стр Из СтрокаДерева.Строки Цикл + ПроверитьФлагУСтроки(Стр); + Есть0 = Есть0 ИЛИ (Стр.Выбран = 0); + Есть1 = Есть1 ИЛИ (Стр.Выбран = 1); + Есть2 = Есть2 ИЛИ (Стр.Выбран = 2); + КонецЦикла; + + Если Не Есть1 И Не Есть2 Тогда + СтрокаДерева.Выбран = 0; + ИначеЕсли Не Есть2 И Не Есть0 Тогда + СтрокаДерева.Выбран = 1; + Иначе + СтрокаДерева.Выбран = 2; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьФлагПодчиненнымСтрокам(Строки, Флаг) + + Для Каждого Стр Из Строки Цикл + Стр.Выбран = Флаг; + УстановитьФлагПодчиненнымСтрокам(Стр.ПолучитьЭлементы(), Флаг) + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + 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/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..64b5e0d3a --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form @@ -0,0 +1,277 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 4 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + + НаименованиеРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТипЗначения + 6 + + <key>ru</key> + <value>Тип значения</value> + + true + true + + true + + + Список.ValueType + + true + + ТипЗначенияРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ТипЗначенияКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 9 + + СписокСтрокаПоискаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 10 + true + + Список + + true + + + + СписокСостояниеПросмотра + 12 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 13 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 15 + + СписокУправлениеПоискомРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 16 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..c8d9fad8d --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,906 @@ + + + + Родитель + 3 + true + true + + true + + + Объект.Parent + + + РодительРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + РодительКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Наименование + 1 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ЭтоДополнительноеСведениеРеквизит + 20 + true + true + + true + + + ЭтоДополнительноеСведениеРеквизит + + None + + OnChange + ЭтоДополнительноеСведениеРеквизитПриИзменении + + + ЭтоДополнительноеСведениеРеквизитРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + ЭтоДополнительноеСведениеРеквизитКонтекстноеМеню + 21 + true + + RadioButtonField + Enter + true + Left + true + + 2 + + + ru + Доп. реквизит + + + 0 + + + + + ru + Доп. сведение + + + 1 + + + Vertical + + + + ТипЗначенияФормат + 43 + + ТипЗначения + 5 + true + true + + true + + + Объект.ValueType + + + OnChange + ТипЗначенияПриИзменении + + + ТипЗначенияРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + ТипЗначенияКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + РедактироватьФорматЗначения + 37 + true + true + + true + + + РедактироватьФорматЗначенияРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + Hyperlink + Form.Command.РедактироватьФорматЗначения + Normal + Auto + 30 + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Тип значения формат</value> + + + ru + Тип значения формат + + + ТипЗначенияФорматРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + UsualGroup + + Auto + WeakSeparation + true + true + Auto + Auto + + + + ГруппаМногострочность + 38 + + ГруппаМногострочноеПолеВводаНастройки + 46 + + МногострочноеПолеВвода + 39 + true + true + + true + + + МногострочноеПолеВвода + + Right + + МногострочноеПолеВводаРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + МногострочноеПолеВводаКонтекстноеМеню + 40 + true + + CheckBoxField + Enter + true + Left + true + + + + МногострочноеПолеВводаЧисло + 41 + + <key>ru</key> + <value> строк</value> + + true + true + + true + + + МногострочноеПолеВводаЧисло + + Right + + OnChange + МногострочноеПолеВводаЧислоПриИзменении + + + МногострочноеПолеВводаЧислоРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + МногострочноеПолеВводаЧислоКонтекстноеМеню + 42 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + + 1 + + + 10 + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа многострочное поле ввода настройки</value> + + + ru + Группа многострочное поле ввода настройки + + + ГруппаМногострочноеПолеВводаНастройкиРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа многострочность</value> + + + ru + Группа многострочность + + + ГруппаМногострочностьРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Подсказка + 30 + true + true + + true + + + Объект.Подсказка + + + ПодсказкаРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + + ПодсказкаКонтекстноеМеню + 31 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ГруппаСклонения + 32 + + ЕдинственноеЧислоПредмета + 33 + true + true + + true + + + ЕдинственноеЧислоПредмета + + + ЕдинственноеЧислоПредметаРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + ЕдинственноеЧислоПредметаКонтекстноеМеню + 34 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + МножественноеЧислоПредмета + 35 + true + true + + true + + + МножественноеЧислоПредмета + + + МножественноеЧислоПредметаРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + МножественноеЧислоПредметаКонтекстноеМеню + 36 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Представление предмета для пользователя при открытии и выборе значения</value> + + + ГруппаСклоненияРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Комментарий + 28 + true + true + + true + + + Объект.Комментарий + + Left + + КомментарийРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 29 + true + + InputField + Enter + true + Left + true + + + StartChoice + КомментарийНачалоВыбора + + true + 2 + true + true + true + true + true + true + true + Normal + + + + РедактироватьСписокНаборов + 27 + true + true + + true + + false + + РедактироватьСписокНаборовРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + Hyperlink + Form.Command.РедактироватьСписокНаборов + Normal + Auto + true + true + UserCmds + Auto + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + ChartOfCharacteristicTypesObject.ДополнительныеРеквизитыИСведения + + + true + + + true + +
    true
    + true +
    + + ЭтоДополнительноеСведениеРеквизит + + <key>ru</key> + <value>Это дополнительное сведение реквизит</value> + + 3 + + Number + + 1 + + + + true + + + true + + true + + + спсНаборов + + <key>ru</key> + <value>Спс наборов</value> + + 2 + + ValueList + + + true + + + true + + + + + + + ОткрываетсяИзНабораСвойств + + <key>ru</key> + <value>Открывается из набора свойств</value> + + 4 + + Boolean + + + true + + + true + + + + МножественноеЧислоПредмета + + <key>ru</key> + <value>Представление списка</value> + + 5 + + String + + + + true + + + true + + + + ЕдинственноеЧислоПредмета + + <key>ru</key> + <value>Представление объекта</value> + + 6 + + String + + + + true + + + true + + + + МногострочноеПолеВвода + + <key>ru</key> + <value>Многострочное поле ввода</value> + + 7 + + Boolean + + + true + + + true + + + + МногострочноеПолеВводаЧисло + + <key>ru</key> + <value>Многострочное поле ввода число</value> + + 8 + + Number + + 2 + true + + + + true + + + true + + + + РедактироватьСписокНаборов + + <key>ru</key> + <value>Редактировать список наборов</value> + + 1 + + ru + Редактировать список наборов + + + true + + + + РедактироватьСписокНаборовВыполнить + + + Auto + Auto + + + РедактироватьФорматЗначения + + <key>ru</key> + <value>Формат</value> + + 2 + + ru + Формат значения будет использован при редактировании свойства пользователем + + + true + + + + РедактироватьФорматЗначения + + + Auto + Auto + + + ОткрываетсяИзНабораСвойств + + Boolean + + + + Родитель + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + + Копируемый + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + + ЭтоДополнительноеСведение + + Boolean + + + + + + + + + AfterWrite + ПослеЗаписи + + + AfterWriteAtServer + ПослеЗаписиНаСервере + + + BeforeWrite + ПередЗаписью + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + + OnWriteAtServer + ПриЗаписиНаСервере + + +
    diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..041bff9eb --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,461 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + // Обработчик подсистемы запрета редактирования реквизитов объектов + ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтаФорма); + + ОбновитьСоставЭлементовФормы(); + + ЕдинственноеЧислоПредмета = СтрПолучитьСтроку(Объект.СклоненияПредмета, 1); + МножественноеЧислоПредмета = СтрПолучитьСтроку(Объект.СклоненияПредмета, 2); + + ОткрываетсяИзНабораСвойств = Параметры.ОткрываетсяИзНабораСвойств; + + Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда + + Если Параметры.ОткрываетсяИзНабораСвойств Тогда + Если ЗначениеЗаполнено(Параметры.Копируемый) Тогда + Объект.Наименование = Параметры.Копируемый.Наименование; + Объект.Родитель = Параметры.Копируемый.Родитель; + Объект.ЭтоДополнительноеСведение = Параметры.Копируемый.ЭтоДополнительноеСведение; + Иначе + Если ЗначениеЗаполнено(Параметры.Родитель) Тогда + Объект.Родитель = ?(Параметры.Родитель.ЭтоГруппа, Параметры.Родитель, Параметры.Родитель.Родитель); + КонецЕсли; + Объект.ЭтоДополнительноеСведение = Параметры.ЭтоДополнительноеСведение; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + ЭтоДополнительноеСведениеРеквизит = Объект.ЭтоДополнительноеСведение; + + Если ЗначениеЗаполнено(Объект.Ссылка) Тогда + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ДополнительныеРеквизиты.Ссылка КАК Набор, + | ДополнительныеРеквизиты.Ссылка.Наименование + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК ДополнительныеРеквизиты + |ГДЕ + | ДополнительныеРеквизиты.Свойство = &Свойство + | И (НЕ ДополнительныеРеквизиты.Ссылка.ЭтоГруппа) + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ДополнительныеСведения.Ссылка, + | ДополнительныеСведения.Ссылка.Наименование + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения КАК ДополнительныеСведения + |ГДЕ + | ДополнительныеСведения.Свойство = &Свойство + | И (НЕ ДополнительныеСведения.Ссылка.ЭтоГруппа)"); + + Запрос.УстановитьПараметр("Свойство", Объект.Ссылка); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + спсНаборов.Добавить(Выборка.Набор, Выборка.Наименование); + КонецЦикла; + + КонецЕсли; + + ОбновитьНадписьОНаборах(); + + УстановитьЗаголовокКнопкиФормата(Элементы.РедактироватьФорматЗначения, ПустаяСтрока(Объект.ФорматСвойства)); + + Если Объект.МногострочноеПолеВвода > 0 Тогда + МногострочноеПолеВвода = Истина; + МногострочноеПолеВводаЧисло = Объект.МногострочноеПолеВвода; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗаписью(Отказ) + + Если Объект.ТипЗначения.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")) + И (ПустаяСтрока(ЕдинственноеЧислоПредмета) ИЛИ ПустаяСтрока(МножественноеЧислоПредмета)) Тогда + Если Вопрос(НСтр("ru = 'Для значений типа ""Значения свойств объектов"" рекомендуется задать склонения предмета. + |Продолжить с незаполнеными склонениями предмета?'"), + РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + КонецЕсли; + + // Проверим, есть ли с таким же наименованием свойство + Если ЕстьСТакимЖеНаименованием(Объект.Наименование, Объект.Ссылка) Тогда + Если Вопрос(НСтр("ru = 'С указанным наименованием уже был введен ранее доп.реквизит/сведение. + |Продолжить запись?'"), + РежимДиалогаВопрос.ОКОтмена) = КодВозвратаДиалога.Отмена Тогда + Отказ = Истина; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + Если Объект.ТипЗначения.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")) Тогда + ТекущийОбъект.СклоненияПредмета = ЕдинственноеЧислоПредмета + Символы.ПС + МножественноеЧислоПредмета; + Иначе + ТекущийОбъект.СклоненияПредмета = ""; + КонецЕсли; + + Если (НЕ Объект.ЭтоДополнительноеСведение) + И + (Объект.ТипЗначения.СодержитТип(Тип("Число")) + ИЛИ Объект.ТипЗначения.СодержитТип(Тип("Дата")) + ИЛИ Объект.ТипЗначения.СодержитТип(Тип("Булево")) + )Тогда + // + Иначе + ТекущийОбъект.ФорматСвойства = ""; + КонецЕсли; + + ТекущийОбъект.МногострочноеПолеВвода = 0; + + Если НЕ Объект.ЭтоДополнительноеСведение И + Объект.ТипЗначения.СодержитТип(Тип("Строка")) И Объект.ТипЗначения.Типы().Количество() = 1 Тогда + Если МногострочноеПолеВвода Тогда + ТекущийОбъект.МногострочноеПолеВвода = МногострочноеПолеВводаЧисло; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект) + + Если ОткрываетсяИзНабораСвойств Тогда + + Возврат; + + КонецЕсли; + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ДополнительныеРеквизиты.Ссылка КАК Набор, + | ЛОЖЬ КАК ВходитВНабор, + | ЛОЖЬ КАК ДополнительноеСведение + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК ДополнительныеРеквизиты + |ГДЕ + | ((НЕ ДополнительныеРеквизиты.Ссылка В (&ВключенВНаборы)) + | ИЛИ &ЭтоДополнительноеСведение) + | И (НЕ ДополнительныеРеквизиты.Ссылка.ЭтоГруппа) + | И ДополнительныеРеквизиты.Свойство = &Свойство + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ДополнительныеСведения.Ссылка, + | ЛОЖЬ, + | ИСТИНА + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения КАК ДополнительныеСведения + |ГДЕ + | ((НЕ ДополнительныеСведения.Ссылка В (&ВключенВНаборы)) + | ИЛИ (НЕ &ЭтоДополнительноеСведение)) + | И (НЕ ДополнительныеСведения.Ссылка.ЭтоГруппа) + | И ДополнительныеСведения.Свойство = &Свойство + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | НаборыДополнительныхРеквизитовИСведений.Ссылка, + | ИСТИНА, + | &ЭтоДополнительноеСведение + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений КАК НаборыДополнительныхРеквизитовИСведений + |ГДЕ + | НаборыДополнительныхРеквизитовИСведений.Ссылка В(&ВключенВНаборы) + | И (НЕ НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты.Ссылка В + | (ВЫБРАТЬ РАЗЛИЧНЫЕ + | ДополнительныеРеквизиты.Ссылка КАК Набор + | ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК ДополнительныеРеквизиты + | ГДЕ + | ДополнительныеРеквизиты.Ссылка В (&ВключенВНаборы) + | И (НЕ ДополнительныеРеквизиты.Ссылка.ЭтоГруппа) + | И ДополнительныеРеквизиты.Свойство = &Свойство + | И (НЕ &ЭтоДополнительноеСведение) + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ РАЗЛИЧНЫЕ + | ДополнительныеСведения.Ссылка КАК Набор + | ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения КАК ДополнительныеСведения + | ГДЕ + | ДополнительныеСведения.Ссылка В (&ВключенВНаборы) + | И (НЕ ДополнительныеСведения.Ссылка.ЭтоГруппа) + | И ДополнительныеСведения.Свойство = &Свойство + | И &ЭтоДополнительноеСведение))"); + + Запрос.Параметры.Вставить("Свойство", ТекущийОбъект.Ссылка); + Запрос.Параметры.Вставить("ЭтоДополнительноеСведение", ТекущийОбъект.ЭтоДополнительноеСведение); + Запрос.Параметры.Вставить("ВключенВНаборы", спсНаборов); + + РезультатЗапроса = Запрос.Выполнить(); + Выборка = РезультатЗапроса.Выбрать(); + + Пока Выборка.Следующий() Цикл + + НаборСвойств = Выборка.Набор.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(Выборка.Набор); + + Если Выборка.ВходитВНабор Тогда + + Если Выборка.ДополнительноеСведение Тогда + + НаборСвойств.ДополнительныеСведения.Добавить().Свойство = ТекущийОбъект.Ссылка; + + Иначе + + НаборСвойств.ДополнительныеРеквизиты.Добавить().Свойство = ТекущийОбъект.Ссылка; + + КонецЕсли; + + Иначе + + Если Выборка.ДополнительноеСведение Тогда + + НаборСвойств.ДополнительныеСведения.Удалить(НаборСвойств.ДополнительныеСведения.Найти(ТекущийОбъект.Ссылка, "Свойство")); + + Иначе + + НаборСвойств.ДополнительныеРеквизиты.Удалить(НаборСвойств.ДополнительныеРеквизиты.Найти(ТекущийОбъект.Ссылка, "Свойство")); + + КонецЕсли; + + КонецЕсли; + + НаборСвойств.Записать(); + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + СтруктураОповещения = Новый Структура; + СтруктураОповещения.Вставить("ЭтоДополнительноеСведение", Объект.ЭтоДополнительноеСведение); + СтруктураОповещения.Вставить("Комментарий", Объект.Комментарий); + + Оповестить("ЗаписаноДополнительноеСвойство", СтруктураОповещения, Объект.Ссылка); + +КонецПроцедуры + +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + + // Обработчик подсистемы запрета редактирования реквизитов объектов + ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_РазрешитьРедактированиеРеквизитовОбъекта(Команда) + + Если Не Объект.Ссылка.Пустая() Тогда + Результат = ОткрытьФормуМодально("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Форма.ФормаПоискаСсылокНаПВХ", Новый Структура("Ссылка", Объект.Ссылка)); + Если ТипЗнч(Результат) = Тип("Массив") И Результат.Количество() > 0 Тогда + ЗапретРедактированияРеквизитовОбъектовКлиент.УстановитьДоступностьЭлементовФормы(ЭтаФорма, Результат); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура РедактироватьФорматЗначения(Команда) + + Конструктор = Новый КонструкторФорматнойСтроки(Объект.ФорматСвойства); + + Конструктор.ДоступныеТипы = Объект.ТипЗначения; + + Если Конструктор.ОткрытьМодально() Тогда + Объект.ФорматСвойства = Конструктор.Текст; + УстановитьЗаголовокКнопкиФормата(Элементы.РедактироватьФорматЗначения, ПустаяСтрока(Объект.ФорматСвойства)); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияКомментария(Элемент.ТекстРедактирования, Объект.Комментарий, Модифицированность); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ЭтоДополнительноеСведениеРеквизитПриИзменении(Элемент) + + Объект.ЭтоДополнительноеСведение = ЭтоДополнительноеСведениеРеквизит; + + ОбновитьСоставЭлементовФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура РедактироватьСписокНаборовВыполнить() + + ОткрытьСписокНаборов(); + +КонецПроцедуры + +&НаКлиенте +Процедура ТипЗначенияПриИзменении(Элемент) + + Если НЕ Объект.ТипЗначения.СодержитТип(Тип("Число")) + И НЕ Объект.ТипЗначения.СодержитТип(Тип("Дата")) + И НЕ Объект.ТипЗначения.СодержитТип(Тип("Булево")) Тогда + Объект.ФорматСвойства = ""; + УстановитьЗаголовокКнопкиФормата(Элементы.РедактироватьФорматЗначения, Истина); + КонецЕсли; + + Если Объект.ТипЗначения.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")) + ИЛИ Объект.ТипЗначения.СодержитТип(Тип("Число")) + ИЛИ Объект.ТипЗначения.СодержитТип(Тип("Дата")) + ИЛИ Объект.ТипЗначения.СодержитТип(Тип("Булево")) + ИЛИ Объект.ТипЗначения.СодержитТип(Тип("Строка")) Тогда + ОбновитьСоставЭлементовФормы(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура МногострочноеПолеВводаЧислоПриИзменении(Элемент) + + МногострочноеПолеВвода = Истина; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ + +&НаСервере +Процедура ОбновитьСоставЭлементовФормы() + + Если Объект.ТипЗначения.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")) Тогда + Элементы.ГруппаСклонения.Видимость = Истина; + Иначе + Элементы.ГруппаСклонения.Видимость = Ложь; + КонецЕсли; + + Если (НЕ Объект.ЭтоДополнительноеСведение) + И + (Объект.ТипЗначения.СодержитТип(Тип("Число")) + ИЛИ Объект.ТипЗначения.СодержитТип(Тип("Дата")) + ИЛИ Объект.ТипЗначения.СодержитТип(Тип("Булево")) + )Тогда + + Элементы.РедактироватьФорматЗначения.Видимость = Истина; + Иначе + Элементы.РедактироватьФорматЗначения.Видимость = Ложь; + КонецЕсли; + + Если (НЕ Объект.ЭтоДополнительноеСведение) + И Объект.ТипЗначения.СодержитТип(Тип("Строка")) + И Объект.ТипЗначения.Типы().Количество() = 1 Тогда + Элементы.ГруппаМногострочность.Видимость = Истина; + Иначе + Элементы.ГруппаМногострочность.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура УстановитьЗаголовокКнопкиФормата(КнопкаФормы, ФорматНеУстановлен) + + Если ФорматНеУстановлен Тогда + КнопкаФормы.Заголовок = НСтр("ru = 'Формат по умолчанию'"); + Иначе + КнопкаФормы.Заголовок = НСтр("ru = 'Формат установлен'"); + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ЕстьСТакимЖеНаименованием(Наименование, Ссылка) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | 1 + |ИЗ + | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения + |ГДЕ + | ДополнительныеРеквизитыИСведения.Наименование = &Наименование + | И ДополнительныеРеквизитыИСведения.Ссылка <> &Ссылка"; + + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.УстановитьПараметр("Наименование", Наименование); + + Возврат НЕ Запрос.Выполнить().Пустой(); + +КонецФункции + +&НаСервере +Процедура ОбновитьНадписьОНаборах() + + Колво = спсНаборов.Количество(); + Если Колво = 0 Тогда + ИнформационнаяНадпись = НСтр("ru = 'Не входит ни в один набор'"); + ИначеЕсли Колво = 1 Тогда + ИнформационнаяНадпись = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Входит в набор: %1'"), спсНаборов[0].Представление); + Иначе + СтрНаборы = СокрЛП(ЧислоПрописью(Колво, "НД=Ложь", "набор,набора,наборов,м,,,,,0")); + Пока Истина Цикл + Поз = Найти(СтрНаборы, " "); + Если Поз = 0 Тогда + Прервать; + КонецЕсли; + СтрНаборы =СокрЛП(Сред(СтрНаборы, Поз+1)); + КонецЦикла; + + ИнформационнаяНадпись = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Входит в %1 %2'"), Колво, СтрНаборы ); + КонецЕсли; + + Элементы.РедактироватьСписокНаборов.Заголовок = ИнформационнаяНадпись; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСписокНаборов() + + Если ОткрываетсяИзНабораСвойств Тогда + Предупреждение(НСтр("ru = 'Свойство открыто из формы набора. + |Редактирование списка наборов по свойству не производится!'")); + Возврат; + КонецЕсли; + + ПараметрыОткрытия = Новый Структура("ВыбранныеНаборы,ЭтоДополнительноеСведение", спсНаборов, Объект.ЭтоДополнительноеСведение); + + Результат = ОткрытьФормуМодально("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Форма.ФормаРедактированияСпискаНаборов", ПараметрыОткрытия); + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Модифицированность = Истина; + спсНаборов = Результат; + ОбновитьНадписьОНаборах(); + +КонецПроцедуры + diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Help/ru.html b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Help/ru.html new file mode 100644 index 000000000..578c0b3f1 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Help/ru.html @@ -0,0 +1,7 @@ + +

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

    +

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

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

     

    +

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

    +

    Для удобства, дополнительные свойства могут быть объединены в группы свойств.

    \ No newline at end of file diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl new file mode 100644 index 000000000..0379ac5ae --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl @@ -0,0 +1,10 @@ + +Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт + + Результат = Новый Массив; + + Результат.Добавить("ТипЗначения"); + + Возврат Результат; + +КонецФункции diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ДополнительныеРеквизитыИСведения.mdo b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ДополнительныеРеквизитыИСведения.mdo new file mode 100644 index 000000000..1fda483f9 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ДополнительныеРеквизитыИСведения.mdo @@ -0,0 +1,298 @@ + + + + + + + + + + + ДополнительныеРеквизитыИСведения + + ru + Дополнительные реквизиты и сведения + + true + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + ValueType + + ShowError + Use + + + + + Use + Description + + ru + Наименование дополнительного реквизита (сведения) + + + ShowError + Use + + + + + Use + Code + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Parent + + ru + Группа свойств + + true + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.EmptyRef + + Use + + + + + Use + Predefined + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + Ref + + Use + + + + DontUse + true + + + ru + + + Managed + Use + + ru + Дополнительный реквизит / сведение + + Catalog.ЗначенияСвойствОбъектов + + Boolean + CatalogRef.ЗначенияСвойствОбъектов + String + Date + Number + + 15 + 3 + + + 1024 + + + + true + true + 100 + AsDescription + InDialog + BothWays + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.Form.ФормаЭлемента + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.Form.ФормаГруппы + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.Form.ФормаСписка + + Комментарий + + ru + Комментарий + + + String + + + + ru + Комментарий используется при настройке наборов доп. реквизитов и сведений + + + + + Use + ForFolderAndItem + Use + + + Подсказка + + ru + Подсказка + + + String + + + + ru + Показывается пользователю при редактировании свойства + + + + + Use + Use + + + СклоненияПредмета + + ru + Склонения предмета + + + String + + + + + + Use + Use + + + ФорматСвойства + + ru + Формат свойства + + + String + + + + + + Use + + + ЭтоДополнительноеСведение + + ru + Это дополнительное сведение + + + Boolean + + + ru + Реквизит является дополнительным сведением + + + + + Index + Use + Use + + + МногострочноеПолеВвода + + ru + Многострочное поле ввода + + + Number + + 2 + true + + + + + + Use + Use + + + ФормаГруппы + + ru + Форма группы + + PersonalComputer + MobileDevice + + + ФормаПоискаСсылокНаПВХ + + ru + Форма поиска ссылок на ПВХ + + PersonalComputer + MobileDevice + + + ФормаРедактированияСпискаНаборов + + ru + Форма редактирования списка наборов + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + 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/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..ff75bfc6a --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form @@ -0,0 +1,275 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Наименование + 6 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Description + + + НаименованиеРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТипЗначения + 8 + + <key>ru</key> + <value>Тип значения</value> + + true + true + + true + + + Список.ValueType + + true + + ТипЗначенияРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ТипЗначенияКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 11 + + СписокСтрокаПоискаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 12 + true + + Список + + true + + + + СписокСостояниеПросмотра + 14 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 15 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 17 + + СписокУправлениеПоискомРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 18 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + 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 + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаЭлемента/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..0d2666020 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,119 @@ + + + + Наименование + 3 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТипЗначения + 5 + true + true + + true + + + Объект.ValueType + + + ТипЗначенияРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ТипЗначенияКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + ChartOfCharacteristicTypesObject.ОбъектыАдресацииЗадач + + + true + + + true + +
    true
    + true +
    + + + + + +
    diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Help/ru.html b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Help/ru.html new file mode 100644 index 000000000..640fe8f52 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Help/ru.html @@ -0,0 +1,3 @@ + +

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

    +

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

    \ No newline at end of file diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ObjectModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ОбъектыАдресацииЗадач.mdo b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ОбъектыАдресацииЗадач.mdo new file mode 100644 index 000000000..e510a4a75 --- /dev/null +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ОбъектыАдресацииЗадач.mdo @@ -0,0 +1,146 @@ + + + + + + + + + + + ОбъектыАдресацииЗадач + + ru + Объекты адресации задач + + true + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + ValueType + true + + + + ShowError + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Parent + true + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.EmptyRef + + Use + + + + + Use + Predefined + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + Ref + + Use + + + + DontUse + + + ru + + + Managed + Use + + CatalogRef.Организации + + true + 100 + AsDescription + + + ВсеОбъектыАдресации + Все объекты адресации + + CatalogRef.Организации + + + + InDialog + BothWays + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.Form.ФормаЭлемента + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.Form.ФормаСписка + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/CommandGroups/ВыполнениеОбменаДанными/ВыполнениеОбменаДанными.mdo b/SSL/src/CommandGroups/ВыполнениеОбменаДанными/ВыполнениеОбменаДанными.mdo new file mode 100644 index 000000000..2bbec5530 --- /dev/null +++ b/SSL/src/CommandGroups/ВыполнениеОбменаДанными/ВыполнениеОбменаДанными.mdo @@ -0,0 +1,13 @@ + + + ВыполнениеОбменаДанными + + ru + Выполнение обмена данными + + Auto + + CommonPicture.ВыполнитьЗапускОбменаДанными + + FormCommandBar + diff --git a/SSL/src/CommandGroups/ПараметрыОбменаДанными/ПараметрыОбменаДанными.mdo b/SSL/src/CommandGroups/ПараметрыОбменаДанными/ПараметрыОбменаДанными.mdo new file mode 100644 index 000000000..0bdbe74e6 --- /dev/null +++ b/SSL/src/CommandGroups/ПараметрыОбменаДанными/ПараметрыОбменаДанными.mdo @@ -0,0 +1,13 @@ + + + ПараметрыОбменаДанными + + ru + Параметры обмена данными + + Auto + + CommonPicture.ПараметрыОбменаДанными + + FormCommandBar + diff --git a/SSL/src/CommandGroups/Печать/Печать.mdo b/SSL/src/CommandGroups/Печать/Печать.mdo new file mode 100644 index 000000000..33e4aff90 --- /dev/null +++ b/SSL/src/CommandGroups/Печать/Печать.mdo @@ -0,0 +1,15 @@ + + + Печать + + ru + Печать + + Печать + Auto + + ru + Печать + + FormCommandBar + diff --git a/SSL/src/CommonCommands/ВнешнийПользовательОбъектаАвторизации/CommandModule.bsl b/SSL/src/CommonCommands/ВнешнийПользовательОбъектаАвторизации/CommandModule.bsl new file mode 100644 index 000000000..9e8584172 --- /dev/null +++ b/SSL/src/CommonCommands/ВнешнийПользовательОбъектаАвторизации/CommandModule.bsl @@ -0,0 +1,20 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + НайденныйВнешнийПользователь = Неопределено; + ПараметрыФормы = Новый Структура; + ЕстьПравоДобавленияВнешнегоПользователя = Ложь; + + Если ВнешниеПользователи.ОбъектАвторизацииИспользуется(ПараметрКоманды, , НайденныйВнешнийПользователь, ЕстьПравоДобавленияВнешнегоПользователя) Тогда + ПараметрыФормы.Вставить("Ключ", НайденныйВнешнийПользователь); + ИначеЕсли ЕстьПравоДобавленияВнешнегоПользователя Тогда + ПараметрыФормы.Вставить("ОбъектАвторизацииНовогоВнешнегоПользователя", ПараметрКоманды); + Иначе + Предупреждение(НСтр("ru = 'Доступ к информационной базе запрещен и не предоставлялся.'")); + Возврат; + КонецЕсли; + + ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаОбъекта", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ВнешнийПользовательОбъектаАвторизации/ВнешнийПользовательОбъектаАвторизации.mdo b/SSL/src/CommonCommands/ВнешнийПользовательОбъектаАвторизации/ВнешнийПользовательОбъектаАвторизации.mdo new file mode 100644 index 000000000..253f07f87 --- /dev/null +++ b/SSL/src/CommonCommands/ВнешнийПользовательОбъектаАвторизации/ВнешнийПользовательОбъектаАвторизации.mdo @@ -0,0 +1,10 @@ + + + ВнешнийПользовательОбъектаАвторизации + + ru + Внешний доступ + + FormCommandBarImportant + Auto + diff --git a/SSL/src/CommonCommands/ВыполнитьОбменДанными/CommandModule.bsl b/SSL/src/CommonCommands/ВыполнитьОбменДанными/CommandModule.bsl new file mode 100644 index 000000000..25e245757 --- /dev/null +++ b/SSL/src/CommonCommands/ВыполнитьОбменДанными/CommandModule.bsl @@ -0,0 +1,7 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОбменДаннымиКлиент.ВыполнитьОбменДаннымиОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды.Источник); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ВыполнитьОбменДанными/ВыполнитьОбменДанными.mdo b/SSL/src/CommonCommands/ВыполнитьОбменДанными/ВыполнитьОбменДанными.mdo new file mode 100644 index 000000000..8edcd7e00 --- /dev/null +++ b/SSL/src/CommonCommands/ВыполнитьОбменДанными/ВыполнитьОбменДанными.mdo @@ -0,0 +1,13 @@ + + + ВыполнитьОбменДанными + + ru + Выполнить + + CommandGroup.ВыполнениеОбменаДанными + Auto + + StdPicture.GenerateReport + + diff --git a/SSL/src/CommonCommands/ВыполнитьОбменДаннымиИнтерактивно/CommandModule.bsl b/SSL/src/CommonCommands/ВыполнитьОбменДаннымиИнтерактивно/CommandModule.bsl new file mode 100644 index 000000000..548eca40b --- /dev/null +++ b/SSL/src/CommonCommands/ВыполнитьОбменДаннымиИнтерактивно/CommandModule.bsl @@ -0,0 +1,7 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОбменДаннымиКлиент.ОткрытьПомощникСопоставленияОбъектовОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды.Источник); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ВыполнитьОбменДаннымиИнтерактивно/ВыполнитьОбменДаннымиИнтерактивно.mdo b/SSL/src/CommonCommands/ВыполнитьОбменДаннымиИнтерактивно/ВыполнитьОбменДаннымиИнтерактивно.mdo new file mode 100644 index 000000000..cf6d3ebca --- /dev/null +++ b/SSL/src/CommonCommands/ВыполнитьОбменДаннымиИнтерактивно/ВыполнитьОбменДаннымиИнтерактивно.mdo @@ -0,0 +1,13 @@ + + + ВыполнитьОбменДаннымиИнтерактивно + + ru + Выполнить интерактивно + + CommandGroup.ВыполнениеОбменаДанными + Auto + + StdPicture.SyncContents + + diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта/CommandModule.bsl b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта/CommandModule.bsl new file mode 100644 index 000000000..3c3cdf37a --- /dev/null +++ b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта/CommandModule.bsl @@ -0,0 +1,10 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ДополнительныеОтчетыИОбработкиКлиент.ОткрытьФормуКомандДополнительныхОтчетовИОбработок( + ПараметрКоманды, + ПараметрыВыполненияКоманды, + ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта()); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта.mdo b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта.mdo new file mode 100644 index 000000000..01ef1c598 --- /dev/null +++ b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта.mdo @@ -0,0 +1,16 @@ + + + ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта + + ru + Заполнение... + + FormCommandBarImportant + Multiple + true + Auto + + ru + Перейти к списку дополнительных обработок для заполнения объекта + + diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиОтчеты/CommandModule.bsl b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиОтчеты/CommandModule.bsl new file mode 100644 index 000000000..06c072254 --- /dev/null +++ b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиОтчеты/CommandModule.bsl @@ -0,0 +1,10 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ДополнительныеОтчетыИОбработкиКлиент.ОткрытьФормуКомандДополнительныхОтчетовИОбработок( + ПараметрКоманды, + ПараметрыВыполненияКоманды, + ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет()); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиОтчеты/ДополнительныеОтчетыИОбработкиОтчеты.mdo b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиОтчеты/ДополнительныеОтчетыИОбработкиОтчеты.mdo new file mode 100644 index 000000000..19f0b6269 --- /dev/null +++ b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиОтчеты/ДополнительныеОтчетыИОбработкиОтчеты.mdo @@ -0,0 +1,15 @@ + + + ДополнительныеОтчетыИОбработкиОтчеты + + ru + Отчеты... + + FormCommandBarImportant + Multiple + Auto + + ru + Перейти к списку дополнительных отчетов + + diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиПечатныеФормы/CommandModule.bsl b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиПечатныеФормы/CommandModule.bsl new file mode 100644 index 000000000..006ef3275 --- /dev/null +++ b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиПечатныеФормы/CommandModule.bsl @@ -0,0 +1,10 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ДополнительныеОтчетыИОбработкиКлиент.ОткрытьФормуКомандДополнительныхОтчетовИОбработок( + ПараметрКоманды, + ПараметрыВыполненияКоманды, + ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма()); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиПечатныеФормы/ДополнительныеОтчетыИОбработкиПечатныеФормы.mdo b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиПечатныеФормы/ДополнительныеОтчетыИОбработкиПечатныеФормы.mdo new file mode 100644 index 000000000..690da1c3a --- /dev/null +++ b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиПечатныеФормы/ДополнительныеОтчетыИОбработкиПечатныеФормы.mdo @@ -0,0 +1,15 @@ + + + ДополнительныеОтчетыИОбработкиПечатныеФормы + + ru + Дополнительные печатные формы... + + CommandGroup.Печать + Multiple + Auto + + ru + Перейти к списку дополнительных печатных форм + + diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/CommandModule.bsl b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/CommandModule.bsl new file mode 100644 index 000000000..51a086b35 --- /dev/null +++ b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/CommandModule.bsl @@ -0,0 +1,10 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ДополнительныеОтчетыИОбработкиКлиент.ОткрытьФормуКомандДополнительныхОтчетовИОбработок( + ПараметрКоманды, + ПараметрыВыполненияКоманды, + ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиСозданиеСвязанныхОбъектов()); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов.mdo b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов.mdo new file mode 100644 index 000000000..c7ae3a535 --- /dev/null +++ b/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов.mdo @@ -0,0 +1,16 @@ + + + ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов + + ru + Создание связанных объектов... + + FormCommandBarCreateBasedOn + Multiple + true + Auto + + ru + Перейти к списку дополнительных обработок для создания связанных объектов + + diff --git a/SSL/src/CommonCommands/ДополнительныеСведения/CommandModule.bsl b/SSL/src/CommonCommands/ДополнительныеСведения/CommandModule.bsl new file mode 100644 index 000000000..5be6e939f --- /dev/null +++ b/SSL/src/CommonCommands/ДополнительныеСведения/CommandModule.bsl @@ -0,0 +1,12 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + Если ПараметрКоманды = Неопределено Тогда + Возврат; + КонецЕсли; + + ПараметрыФормыРедактированияЗначенийСвойств = Новый Структура("Ссылка", ПараметрКоманды); + ОткрытьФорму("ОбщаяФорма.РедактированиеЗначенийСвойств", ПараметрыФормыРедактированияЗначенийСвойств, , ПараметрКоманды); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ДополнительныеСведения/ДополнительныеСведения.mdo b/SSL/src/CommonCommands/ДополнительныеСведения/ДополнительныеСведения.mdo new file mode 100644 index 000000000..8a1a85ce6 --- /dev/null +++ b/SSL/src/CommonCommands/ДополнительныеСведения/ДополнительныеСведения.mdo @@ -0,0 +1,17 @@ + + + ДополнительныеСведения + + ru + Дополнительные сведения + + FormCommandBarImportant + + CatalogRef.ПапкиФайлов + CatalogRef.Файлы + + Picture + + CommonPicture.ДополнительныеСведения + + diff --git a/SSL/src/CommonCommands/ЗадачиПоБизнесПроцессу/CommandModule.bsl b/SSL/src/CommonCommands/ЗадачиПоБизнесПроцессу/CommandModule.bsl new file mode 100644 index 000000000..85239f7c9 --- /dev/null +++ b/SSL/src/CommonCommands/ЗадачиПоБизнесПроцессу/CommandModule.bsl @@ -0,0 +1,9 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + ОткрытьФорму("Задача.ЗадачаИсполнителя.Форма.ЗадачиПоБизнесПроцессу", + Новый Структура("ЗначениеОтбора", ПараметрКоманды), + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Источник.КлючУникальности, + ПараметрыВыполненияКоманды.Окно); +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ЗадачиПоБизнесПроцессу/ЗадачиПоБизнесПроцессу.mdo b/SSL/src/CommonCommands/ЗадачиПоБизнесПроцессу/ЗадачиПоБизнесПроцессу.mdo new file mode 100644 index 000000000..fd1b7c8f8 --- /dev/null +++ b/SSL/src/CommonCommands/ЗадачиПоБизнесПроцессу/ЗадачиПоБизнесПроцессу.mdo @@ -0,0 +1,17 @@ + + + ЗадачиПоБизнесПроцессу + + ru + Задачи бизнес-процесса + + Задача выбранного бизнес-процесса + FormNavigationPanelGoTo + + BusinessProcessRef.Задание + + Auto + + StdPicture.Task + + diff --git a/SSL/src/CommonCommands/ЗадачиПоПредмету/CommandModule.bsl b/SSL/src/CommonCommands/ЗадачиПоПредмету/CommandModule.bsl new file mode 100644 index 000000000..9d33bd5fe --- /dev/null +++ b/SSL/src/CommonCommands/ЗадачиПоПредмету/CommandModule.bsl @@ -0,0 +1,9 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + ОткрытьФорму("Задача.ЗадачаИсполнителя.Форма.ЗадачиПоПредмету", + Новый Структура("ЗначениеОтбора", ПараметрКоманды), + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Источник.КлючУникальности, + ПараметрыВыполненияКоманды.Окно); +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ЗадачиПоПредмету/ЗадачиПоПредмету.mdo b/SSL/src/CommonCommands/ЗадачиПоПредмету/ЗадачиПоПредмету.mdo new file mode 100644 index 000000000..bfbb3aa0e --- /dev/null +++ b/SSL/src/CommonCommands/ЗадачиПоПредмету/ЗадачиПоПредмету.mdo @@ -0,0 +1,18 @@ + + + ЗадачиПоПредмету + + ru + Задачи + + Задачи, созданные на основании выбранного предмета + FormNavigationPanelGoTo + Auto + + ru + Связанные задачи + + + StdPicture.Task + + diff --git a/SSL/src/CommonCommands/ИсторияИзменений/CommandModule.bsl b/SSL/src/CommonCommands/ИсторияИзменений/CommandModule.bsl new file mode 100644 index 000000000..b9467baa6 --- /dev/null +++ b/SSL/src/CommonCommands/ИсторияИзменений/CommandModule.bsl @@ -0,0 +1,25 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + Если ПараметрКоманды = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда + Если ПараметрКоманды.Количество() = 0 Тогда + Возврат; + КонецЕсли; + СсылкаНаОБъект = ПараметрКоманды[0]; + Иначе + СсылкаНаОБъект = ПараметрКоманды; + КонецЕсли; + + СписокВерсий = ОткрытьФорму("РегистрСведений.ВерсииОбъектов.Форма.ВыборХранимыхВерсий", + Новый Структура("Ссылка", СсылкаНаОбъект), + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры + diff --git a/SSL/src/CommonCommands/ИсторияИзменений/ИсторияИзменений.mdo b/SSL/src/CommonCommands/ИсторияИзменений/ИсторияИзменений.mdo new file mode 100644 index 000000000..33ceb3726 --- /dev/null +++ b/SSL/src/CommonCommands/ИсторияИзменений/ИсторияИзменений.mdo @@ -0,0 +1,17 @@ + + + ИсторияИзменений + + ru + История изменений + + FormNavigationPanelSeeAlso + PictureAndText + + ru + Перейти к отчету по версиям объекта + + + CommonPicture.ИсторияВерсий + + diff --git a/SSL/src/CommonCommands/КартаМаршрутаБизнесПроцесса/CommandModule.bsl b/SSL/src/CommonCommands/КартаМаршрутаБизнесПроцесса/CommandModule.bsl new file mode 100644 index 000000000..aae00d146 --- /dev/null +++ b/SSL/src/CommonCommands/КартаМаршрутаБизнесПроцесса/CommandModule.bsl @@ -0,0 +1,9 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + ОткрытьФорму("Обработка.КартаМаршрутаБизнесПроцесса.Форма", + Новый Структура("БизнесПроцесс", ПараметрКоманды), + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); +КонецПроцедуры diff --git a/SSL/src/CommonCommands/КартаМаршрутаБизнесПроцесса/КартаМаршрутаБизнесПроцесса.mdo b/SSL/src/CommonCommands/КартаМаршрутаБизнесПроцесса/КартаМаршрутаБизнесПроцесса.mdo new file mode 100644 index 000000000..7ad157b89 --- /dev/null +++ b/SSL/src/CommonCommands/КартаМаршрутаБизнесПроцесса/КартаМаршрутаБизнесПроцесса.mdo @@ -0,0 +1,20 @@ + + + КартаМаршрутаБизнесПроцесса + + ru + Карта маршрута + + FormCommandBarImportant + + BusinessProcessRef.Задание + + Auto + + ru + Открыть карту маршрута бизнес-процесса + + + StdPicture.BusinessProcessObject + + diff --git a/SSL/src/CommonCommands/НастроитьПараметрыТранспортаСообщенийОбмена/CommandModule.bsl b/SSL/src/CommonCommands/НастроитьПараметрыТранспортаСообщенийОбмена/CommandModule.bsl new file mode 100644 index 000000000..9e5898bc2 --- /dev/null +++ b/SSL/src/CommonCommands/НастроитьПараметрыТранспортаСообщенийОбмена/CommandModule.bsl @@ -0,0 +1,10 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + Отбор = Новый Структура("Узел", ПараметрКоманды); + ЗначенияЗаполнения = Новый Структура("Узел", ПараметрКоманды); + + ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, ЗначенияЗаполнения, "НастройкиТранспортаОбмена", ПараметрыВыполненияКоманды.Источник); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/НастроитьПараметрыТранспортаСообщенийОбмена/НастроитьПараметрыТранспортаСообщенийОбмена.mdo b/SSL/src/CommonCommands/НастроитьПараметрыТранспортаСообщенийОбмена/НастроитьПараметрыТранспортаСообщенийОбмена.mdo new file mode 100644 index 000000000..286576025 --- /dev/null +++ b/SSL/src/CommonCommands/НастроитьПараметрыТранспортаСообщенийОбмена/НастроитьПараметрыТранспортаСообщенийОбмена.mdo @@ -0,0 +1,14 @@ + + + НастроитьПараметрыТранспортаСообщенийОбмена + + ru + Настроить параметры транспорта сообщений обмена + + CommandGroup.ПараметрыОбменаДанными + Auto + + ru + Настройки параметров транспорта + + diff --git a/SSL/src/CommonCommands/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты/CommandModule.bsl b/SSL/src/CommonCommands/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты/CommandModule.bsl new file mode 100644 index 000000000..bb196fad7 --- /dev/null +++ b/SSL/src/CommonCommands/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты/CommandModule.bsl @@ -0,0 +1,8 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОткрытьФормуМодально("Справочник.УчетныеЗаписиЭлектроннойПочты.ФормаОбъекта", + Новый Структура("Ключ", РаботаСПочтовымиСообщениями.ПолучитьСистемнуюУчетнуюЗапись())); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты.mdo b/SSL/src/CommonCommands/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты.mdo new file mode 100644 index 000000000..7f5563d64 --- /dev/null +++ b/SSL/src/CommonCommands/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты/НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты.mdo @@ -0,0 +1,14 @@ + + + НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты + + ru + Настройка системной учетной записи электронной почты + + ActionsPanelTools + Auto + + ru + Открыть форму настройки системной учетной записи + + diff --git a/SSL/src/CommonCommands/ОбменДаннымиРазместитьФайлыВТомах/CommandModule.bsl b/SSL/src/CommonCommands/ОбменДаннымиРазместитьФайлыВТомах/CommandModule.bsl new file mode 100644 index 000000000..a99db5ae4 --- /dev/null +++ b/SSL/src/CommonCommands/ОбменДаннымиРазместитьФайлыВТомах/CommandModule.bsl @@ -0,0 +1,12 @@ +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + Если Не ОбменФайлами.ЕстьТомаХраненияФайлов() Тогда + Предупреждение(НСтр("ru = 'Не указаны тома хранения файлов. Добавьте хотя бы один том перед выполнением команды.'")); + Возврат; + КонецЕсли; + + ОткрытьФормуМодально("Справочник.Файлы.Форма.ФормаВыбораПутиКАрхивуФайловТомов"); + +КонецПроцедуры + diff --git a/SSL/src/CommonCommands/ОбменДаннымиРазместитьФайлыВТомах/ОбменДаннымиРазместитьФайлыВТомах.mdo b/SSL/src/CommonCommands/ОбменДаннымиРазместитьФайлыВТомах/ОбменДаннымиРазместитьФайлыВТомах.mdo new file mode 100644 index 000000000..cdc929055 --- /dev/null +++ b/SSL/src/CommonCommands/ОбменДаннымиРазместитьФайлыВТомах/ОбменДаннымиРазместитьФайлыВТомах.mdo @@ -0,0 +1,14 @@ + + + ОбменДаннымиРазместитьФайлыВТомах + + ru + Разместить файлы начального образа + + ActionsPanelTools + Auto + + ru + Разместить файлы из архива файлов начального образа + + diff --git a/SSL/src/CommonCommands/ОткрытьПравилаКонвертацииОбъектов/CommandModule.bsl b/SSL/src/CommonCommands/ОткрытьПравилаКонвертацииОбъектов/CommandModule.bsl new file mode 100644 index 000000000..0f721ba0c --- /dev/null +++ b/SSL/src/CommonCommands/ОткрытьПравилаКонвертацииОбъектов/CommandModule.bsl @@ -0,0 +1,16 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + // вызов сервера + ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(ПараметрКоманды); + + // вызов сервера + ВидПравил = ПредопределенноеЗначение("Перечисление.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов"); + + Отбор = Новый Структура("ИмяПланаОбмена, ВидПравил", ИмяПланаОбмена, ВидПравил); + ЗначенияЗаполнения = Новый Структура("ИмяПланаОбмена, ВидПравил", ИмяПланаОбмена, ВидПравил); + + ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, ЗначенияЗаполнения, "ПравилаДляОбменаДанными", ПараметрыВыполненияКоманды.Источник); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ОткрытьПравилаКонвертацииОбъектов/ОткрытьПравилаКонвертацииОбъектов.mdo b/SSL/src/CommonCommands/ОткрытьПравилаКонвертацииОбъектов/ОткрытьПравилаКонвертацииОбъектов.mdo new file mode 100644 index 000000000..917a9f534 --- /dev/null +++ b/SSL/src/CommonCommands/ОткрытьПравилаКонвертацииОбъектов/ОткрытьПравилаКонвертацииОбъектов.mdo @@ -0,0 +1,10 @@ + + + ОткрытьПравилаКонвертацииОбъектов + + ru + Открыть правила конвертации объектов + + CommandGroup.ПараметрыОбменаДанными + Auto + diff --git a/SSL/src/CommonCommands/ОткрытьПравилаРегистрацииОбъектов/CommandModule.bsl b/SSL/src/CommonCommands/ОткрытьПравилаРегистрацииОбъектов/CommandModule.bsl new file mode 100644 index 000000000..4fa118916 --- /dev/null +++ b/SSL/src/CommonCommands/ОткрытьПравилаРегистрацииОбъектов/CommandModule.bsl @@ -0,0 +1,16 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + // вызов сервера + ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(ПараметрКоманды); + + // вызов сервера + ВидПравил = ПредопределенноеЗначение("Перечисление.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов"); + + Отбор = Новый Структура("ИмяПланаОбмена, ВидПравил", ИмяПланаОбмена, ВидПравил); + ЗначенияЗаполнения = Новый Структура("ИмяПланаОбмена, ВидПравил", ИмяПланаОбмена, ВидПравил); + + ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, ЗначенияЗаполнения, "ПравилаДляОбменаДанными", ПараметрыВыполненияКоманды.Источник); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ОткрытьПравилаРегистрацииОбъектов/ОткрытьПравилаРегистрацииОбъектов.mdo b/SSL/src/CommonCommands/ОткрытьПравилаРегистрацииОбъектов/ОткрытьПравилаРегистрацииОбъектов.mdo new file mode 100644 index 000000000..59a056e3f --- /dev/null +++ b/SSL/src/CommonCommands/ОткрытьПравилаРегистрацииОбъектов/ОткрытьПравилаРегистрацииОбъектов.mdo @@ -0,0 +1,10 @@ + + + ОткрытьПравилаРегистрацииОбъектов + + ru + Открыть правила регистрации объектов + + CommandGroup.ПараметрыОбменаДанными + Auto + diff --git a/SSL/src/CommonCommands/ОткрытьСценарииОбменовДанными/CommandModule.bsl b/SSL/src/CommonCommands/ОткрытьСценарииОбменовДанными/CommandModule.bsl new file mode 100644 index 000000000..7466cd9e1 --- /dev/null +++ b/SSL/src/CommonCommands/ОткрытьСценарииОбменовДанными/CommandModule.bsl @@ -0,0 +1,8 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ПараметрыФормы = Новый Структура("УзелИнформационнойБазы", ПараметрКоманды); + ОткрытьФорму("Справочник.СценарииОбменовДанными.Форма.НастройкаРасписанияОбменовДанными", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ОткрытьСценарииОбменовДанными/ОткрытьСценарииОбменовДанными.mdo b/SSL/src/CommonCommands/ОткрытьСценарииОбменовДанными/ОткрытьСценарииОбменовДанными.mdo new file mode 100644 index 000000000..87c358c48 --- /dev/null +++ b/SSL/src/CommonCommands/ОткрытьСценарииОбменовДанными/ОткрытьСценарииОбменовДанными.mdo @@ -0,0 +1,10 @@ + + + ОткрытьСценарииОбменовДанными + + ru + Сценарии обменов данными + + FormNavigationPanelImportant + Auto + diff --git a/SSL/src/CommonCommands/ОткрытьФормуУправленияОбменамиДанных/CommandModule.bsl b/SSL/src/CommonCommands/ОткрытьФормуУправленияОбменамиДанных/CommandModule.bsl new file mode 100644 index 000000000..c1e13b383 --- /dev/null +++ b/SSL/src/CommonCommands/ОткрытьФормуУправленияОбменамиДанных/CommandModule.bsl @@ -0,0 +1,10 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОткрытьФорму("ОбщаяФорма.УправлениеОбменамиДанных", , + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ОткрытьФормуУправленияОбменамиДанных/ОткрытьФормуУправленияОбменамиДанных.mdo b/SSL/src/CommonCommands/ОткрытьФормуУправленияОбменамиДанных/ОткрытьФормуУправленияОбменамиДанных.mdo new file mode 100644 index 000000000..2dbc18889 --- /dev/null +++ b/SSL/src/CommonCommands/ОткрытьФормуУправленияОбменамиДанных/ОткрытьФормуУправленияОбменамиДанных.mdo @@ -0,0 +1,10 @@ + + + ОткрытьФормуУправленияОбменамиДанных + + ru + Обмены данными + + NavigationPanelOrdinary + Auto + diff --git a/SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных/CommandModule.bsl b/SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных/CommandModule.bsl new file mode 100644 index 000000000..6a61a0f22 --- /dev/null +++ b/SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных/CommandModule.bsl @@ -0,0 +1,6 @@ +&НаКлиенте +Процедура ОбработкаКоманды(УзелИнформационнойБазы, ПараметрыВыполненияКоманды) + + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанных(УзелИнформационнойБазы, ПараметрыВыполненияКоманды, "ВыгрузкаДанных"); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных/ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных.mdo b/SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных/ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных.mdo new file mode 100644 index 000000000..30de221c2 --- /dev/null +++ b/SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных/ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных.mdo @@ -0,0 +1,13 @@ + + + ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + + ru + События выгрузки данных + + FormNavigationPanelGoTo + PictureAndText + + StdPicture.EventLog + + diff --git a/SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных/CommandModule.bsl b/SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных/CommandModule.bsl new file mode 100644 index 000000000..90dcca42a --- /dev/null +++ b/SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных/CommandModule.bsl @@ -0,0 +1,6 @@ +&НаКлиенте +Процедура ОбработкаКоманды(УзелИнформационнойБазы, ПараметрыВыполненияКоманды) + + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанных(УзелИнформационнойБазы, ПараметрыВыполненияКоманды, "ЗагрузкаДанных"); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных/ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных.mdo b/SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных/ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных.mdo new file mode 100644 index 000000000..47f31637e --- /dev/null +++ b/SSL/src/CommonCommands/ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных/ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных.mdo @@ -0,0 +1,13 @@ + + + ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + + ru + События загрузки данных + + FormNavigationPanelGoTo + PictureAndText + + StdPicture.EventLog + + diff --git a/SSL/src/CommonCommands/ПерсональнаяНастройкаПроксиСервера/CommandModule.bsl b/SSL/src/CommonCommands/ПерсональнаяНастройкаПроксиСервера/CommandModule.bsl new file mode 100644 index 000000000..2f2ad21e8 --- /dev/null +++ b/SSL/src/CommonCommands/ПерсональнаяНастройкаПроксиСервера/CommandModule.bsl @@ -0,0 +1,8 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОткрытьФорму("ОбщаяФорма.ПараметрыПроксиСервера", + Новый Структура("НастройкаПроксиНаКлиенте", Истина)); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ПерсональнаяНастройкаПроксиСервера/ПерсональнаяНастройкаПроксиСервера.mdo b/SSL/src/CommonCommands/ПерсональнаяНастройкаПроксиСервера/ПерсональнаяНастройкаПроксиСервера.mdo new file mode 100644 index 000000000..e6aaf2f02 --- /dev/null +++ b/SSL/src/CommonCommands/ПерсональнаяНастройкаПроксиСервера/ПерсональнаяНастройкаПроксиСервера.mdo @@ -0,0 +1,10 @@ + + + ПерсональнаяНастройкаПроксиСервера + + ru + Персональная настройка прокси сервера + + NavigationPanelOrdinary + Auto + diff --git a/SSL/src/CommonCommands/ПраваВнешнегоПользователяПоЗначениямДоступа/CommandModule.bsl b/SSL/src/CommonCommands/ПраваВнешнегоПользователяПоЗначениямДоступа/CommandModule.bsl new file mode 100644 index 000000000..5e4eb64e9 --- /dev/null +++ b/SSL/src/CommonCommands/ПраваВнешнегоПользователяПоЗначениямДоступа/CommandModule.bsl @@ -0,0 +1,12 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + Если ПараметрКоманды = Неопределено Тогда + Возврат; + КонецЕсли; + + ОткрытьФормуМодально("ОбщаяФорма.ПраваПоЗначениямДоступа", Новый Структура("СсылкаНаОбъект", ПараметрКоманды)); + +КонецПроцедуры + diff --git a/SSL/src/CommonCommands/ПраваВнешнегоПользователяПоЗначениямДоступа/ПраваВнешнегоПользователяПоЗначениямДоступа.mdo b/SSL/src/CommonCommands/ПраваВнешнегоПользователяПоЗначениямДоступа/ПраваВнешнегоПользователяПоЗначениямДоступа.mdo new file mode 100644 index 000000000..5ab77c7db --- /dev/null +++ b/SSL/src/CommonCommands/ПраваВнешнегоПользователяПоЗначениямДоступа/ПраваВнешнегоПользователяПоЗначениямДоступа.mdo @@ -0,0 +1,18 @@ + + + ПраваВнешнегоПользователяПоЗначениямДоступа + + ru + Права доступа + + FormCommandBarImportant + + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + + PictureAndText + + ru + Установить права доступа к объектам + + diff --git a/SSL/src/CommonCommands/ПраваПоЗначениюДоступа/CommandModule.bsl b/SSL/src/CommonCommands/ПраваПоЗначениюДоступа/CommandModule.bsl new file mode 100644 index 000000000..5e4eb64e9 --- /dev/null +++ b/SSL/src/CommonCommands/ПраваПоЗначениюДоступа/CommandModule.bsl @@ -0,0 +1,12 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + Если ПараметрКоманды = Неопределено Тогда + Возврат; + КонецЕсли; + + ОткрытьФормуМодально("ОбщаяФорма.ПраваПоЗначениямДоступа", Новый Структура("СсылкаНаОбъект", ПараметрКоманды)); + +КонецПроцедуры + diff --git a/SSL/src/CommonCommands/ПраваПоЗначениюДоступа/ПраваПоЗначениюДоступа.mdo b/SSL/src/CommonCommands/ПраваПоЗначениюДоступа/ПраваПоЗначениюДоступа.mdo new file mode 100644 index 000000000..f53a8871f --- /dev/null +++ b/SSL/src/CommonCommands/ПраваПоЗначениюДоступа/ПраваПоЗначениюДоступа.mdo @@ -0,0 +1,14 @@ + + + ПраваПоЗначениюДоступа + + ru + Права доступа + + FormCommandBarImportant + PictureAndText + + ru + Установить права доступа к объекту + + diff --git a/SSL/src/CommonCommands/ПраваПользователяПоЗначениямДоступа/CommandModule.bsl b/SSL/src/CommonCommands/ПраваПользователяПоЗначениямДоступа/CommandModule.bsl new file mode 100644 index 000000000..5e4eb64e9 --- /dev/null +++ b/SSL/src/CommonCommands/ПраваПользователяПоЗначениямДоступа/CommandModule.bsl @@ -0,0 +1,12 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + Если ПараметрКоманды = Неопределено Тогда + Возврат; + КонецЕсли; + + ОткрытьФормуМодально("ОбщаяФорма.ПраваПоЗначениямДоступа", Новый Структура("СсылкаНаОбъект", ПараметрКоманды)); + +КонецПроцедуры + diff --git a/SSL/src/CommonCommands/ПраваПользователяПоЗначениямДоступа/ПраваПользователяПоЗначениямДоступа.mdo b/SSL/src/CommonCommands/ПраваПользователяПоЗначениямДоступа/ПраваПользователяПоЗначениямДоступа.mdo new file mode 100644 index 000000000..384502e92 --- /dev/null +++ b/SSL/src/CommonCommands/ПраваПользователяПоЗначениямДоступа/ПраваПользователяПоЗначениямДоступа.mdo @@ -0,0 +1,18 @@ + + + ПраваПользователяПоЗначениямДоступа + + ru + Права доступа + + FormCommandBarImportant + + CatalogRef.ГруппыПользователей + CatalogRef.Пользователи + + PictureAndText + + ru + Установить права доступа к объектам + + diff --git a/SSL/src/CommonCommands/ПрисоединенныеФайлы/CommandModule.bsl b/SSL/src/CommonCommands/ПрисоединенныеФайлы/CommandModule.bsl new file mode 100644 index 000000000..3c405e0cc --- /dev/null +++ b/SSL/src/CommonCommands/ПрисоединенныеФайлы/CommandModule.bsl @@ -0,0 +1,16 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + Параметры = Новый Структура; + Параметры.Вставить("ВладелецФайла", ПараметрКоманды); + Заголовок = НСтр("ru = 'Присоединенные файлы'"); + Параметры.Вставить("ЗаголовокФормы", Заголовок); + + ОткрытьФорму( + "Справочник.Файлы.Форма.ФормаСпискаПрисоединенныхФайлов", + Параметры, + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/ПрисоединенныеФайлы/ПрисоединенныеФайлы.mdo b/SSL/src/CommonCommands/ПрисоединенныеФайлы/ПрисоединенныеФайлы.mdo new file mode 100644 index 000000000..53cc47a44 --- /dev/null +++ b/SSL/src/CommonCommands/ПрисоединенныеФайлы/ПрисоединенныеФайлы.mdo @@ -0,0 +1,10 @@ + + + ПрисоединенныеФайлы + + ru + Присоединенные файлы + + FormNavigationPanelGoTo + Auto + diff --git a/SSL/src/CommonCommands/РедактированиеМакетовПечатныхФорм/CommandModule.bsl b/SSL/src/CommonCommands/РедактированиеМакетовПечатныхФорм/CommandModule.bsl new file mode 100644 index 000000000..3337f929c --- /dev/null +++ b/SSL/src/CommonCommands/РедактированиеМакетовПечатныхФорм/CommandModule.bsl @@ -0,0 +1,9 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.МакетыПечатныхФорм", + Новый Структура("Фильтр", ПараметрКоманды), + ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/РедактированиеМакетовПечатныхФорм/РедактированиеМакетовПечатныхФорм.mdo b/SSL/src/CommonCommands/РедактированиеМакетовПечатныхФорм/РедактированиеМакетовПечатныхФорм.mdo new file mode 100644 index 000000000..07a11b3d8 --- /dev/null +++ b/SSL/src/CommonCommands/РедактированиеМакетовПечатныхФорм/РедактированиеМакетовПечатныхФорм.mdo @@ -0,0 +1,10 @@ + + + РедактированиеМакетовПечатныхФорм + + ru + Перейти к управлению макетами печатных форм + + CommandGroup.Печать + Auto + diff --git a/SSL/src/CommonCommands/РолеваяАдресацияПоОбъекту/CommandModule.bsl b/SSL/src/CommonCommands/РолеваяАдресацияПоОбъекту/CommandModule.bsl new file mode 100644 index 000000000..661dba8f5 --- /dev/null +++ b/SSL/src/CommonCommands/РолеваяАдресацияПоОбъекту/CommandModule.bsl @@ -0,0 +1,9 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + ОткрытьФорму("РегистрСведений.ИсполнителиЗадач.Форма.АдресацияПоОбъекту", + Новый Структура("ОсновнойОбъектАдресации", ПараметрКоманды), + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); +КонецПроцедуры diff --git a/SSL/src/CommonCommands/РолеваяАдресацияПоОбъекту/РолеваяАдресацияПоОбъекту.mdo b/SSL/src/CommonCommands/РолеваяАдресацияПоОбъекту/РолеваяАдресацияПоОбъекту.mdo new file mode 100644 index 000000000..1ffab688d --- /dev/null +++ b/SSL/src/CommonCommands/РолеваяАдресацияПоОбъекту/РолеваяАдресацияПоОбъекту.mdo @@ -0,0 +1,20 @@ + + + РолеваяАдресацияПоОбъекту + + ru + Роли и исполнители + + FormNavigationPanelGoTo + + CatalogRef.Организации + + PictureAndText + + ru + Назначить исполнителей на роли бизнес-процессов + + + StdPicture.User + + diff --git a/SSL/src/CommonCommands/СозданиеНачальногоОбразаСФайлами/CommandModule.bsl b/SSL/src/CommonCommands/СозданиеНачальногоОбразаСФайлами/CommandModule.bsl new file mode 100644 index 000000000..aeea029ef --- /dev/null +++ b/SSL/src/CommonCommands/СозданиеНачальногоОбразаСФайлами/CommandModule.bsl @@ -0,0 +1,6 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + ПараметрыФормы = Новый Структура("Узел", ПараметрКоманды); + ОткрытьФорму("ОбщаяФорма.СозданиеНачальногоОбразаСФайлами", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); +КонецПроцедуры diff --git a/SSL/src/CommonCommands/СозданиеНачальногоОбразаСФайлами/СозданиеНачальногоОбразаСФайлами.mdo b/SSL/src/CommonCommands/СозданиеНачальногоОбразаСФайлами/СозданиеНачальногоОбразаСФайлами.mdo new file mode 100644 index 000000000..f97d015ff --- /dev/null +++ b/SSL/src/CommonCommands/СозданиеНачальногоОбразаСФайлами/СозданиеНачальногоОбразаСФайлами.mdo @@ -0,0 +1,13 @@ + + + СозданиеНачальногоОбразаСФайлами + + ru + Создание начального образа с файлами + + FormCommandBarImportant + Picture + + StdPicture.CreateInitialImage + + diff --git a/SSL/src/CommonCommands/СписокРеспондента/CommandModule.bsl b/SSL/src/CommonCommands/СписокРеспондента/CommandModule.bsl new file mode 100644 index 000000000..b5e021232 --- /dev/null +++ b/SSL/src/CommonCommands/СписокРеспондента/CommandModule.bsl @@ -0,0 +1,10 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОткрытьФорму("Обработка.СписокРеспондента.Форма",, + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/СписокРеспондента/СписокРеспондента.mdo b/SSL/src/CommonCommands/СписокРеспондента/СписокРеспондента.mdo new file mode 100644 index 000000000..9770b72a3 --- /dev/null +++ b/SSL/src/CommonCommands/СписокРеспондента/СписокРеспондента.mdo @@ -0,0 +1,14 @@ + + + СписокРеспондента + + ru + Анкеты и опросы + + NavigationPanelOrdinary + Auto + + ru + Анкеты и опросы + + diff --git a/SSL/src/CommonCommands/СтруктураПодчиненности/CommandModule.bsl b/SSL/src/CommonCommands/СтруктураПодчиненности/CommandModule.bsl new file mode 100644 index 000000000..82cf8120c --- /dev/null +++ b/SSL/src/CommonCommands/СтруктураПодчиненности/CommandModule.bsl @@ -0,0 +1,15 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + Если ЗначениеЗаполнено(ПараметрКоманды) Тогда + + ОткрытьФорму("ОбщаяФорма.СтруктураПодчиненности",Новый Структура("ОбъектОтбора", ПараметрКоманды), + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Источник.КлючУникальности, + ПараметрыВыполненияКоманды.Окно); + + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/CommonCommands/СтруктураПодчиненности/СтруктураПодчиненности.mdo b/SSL/src/CommonCommands/СтруктураПодчиненности/СтруктураПодчиненности.mdo new file mode 100644 index 000000000..d3c4b6aac --- /dev/null +++ b/SSL/src/CommonCommands/СтруктураПодчиненности/СтруктураПодчиненности.mdo @@ -0,0 +1,10 @@ + + + СтруктураПодчиненности + + ru + Структура подчиненности + + FormNavigationPanelGoTo + Auto + diff --git a/SSL/src/CommonCommands/УстановитьРасширениеРаботыСФайлами/CommandModule.bsl b/SSL/src/CommonCommands/УстановитьРасширениеРаботыСФайлами/CommandModule.bsl new file mode 100644 index 000000000..bb295bfd5 --- /dev/null +++ b/SSL/src/CommonCommands/УстановитьРасширениеРаботыСФайлами/CommandModule.bsl @@ -0,0 +1,7 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + УстановитьРасширениеРаботыСФайлами(); + +КонецПроцедуры diff --git a/SSL/src/CommonCommands/УстановитьРасширениеРаботыСФайлами/УстановитьРасширениеРаботыСФайлами.mdo b/SSL/src/CommonCommands/УстановитьРасширениеРаботыСФайлами/УстановитьРасширениеРаботыСФайлами.mdo new file mode 100644 index 000000000..b45cbc1fc --- /dev/null +++ b/SSL/src/CommonCommands/УстановитьРасширениеРаботыСФайлами/УстановитьРасширениеРаботыСФайлами.mdo @@ -0,0 +1,14 @@ + + + УстановитьРасширениеРаботыСФайлами + + ru + Установить расширение работы с файлами в Веб-клиенте + + ActionsPanelTools + Auto + + ru + установить расширение работы с файлами в Веб-клиенте + + diff --git a/SSL/src/CommonForms/ВводАдреса/Form.form b/SSL/src/CommonForms/ВводАдреса/Form.form new file mode 100644 index 000000000..a48b3efbd --- /dev/null +++ b/SSL/src/CommonForms/ВводАдреса/Form.form @@ -0,0 +1,1715 @@ + + + + <key>ru</key> + <value>Ввод адреса</value> + + + Панель + 64 + + Классификатор + 67 + true + true + + true + + false + + КлассификаторРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Form.Command.Классификатор + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + КомандаОчистить + 68 + true + true + + true + + false + + КомандаОчиститьРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + Form.Command.КомандаОчистить + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + ПанельРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + CommandBar + + Left + Form + + + + ГруппаСтранаИКод + 69 + + Страна + 40 + true + true + + true + + + Страна + + + OnChange + СтранаПриИзменении + + + СтранаРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + СтранаКонтекстноеМеню + 41 + true + + InputField + Enter + true + Left + true + + 6 + true + true + true + false + true + true + true + + Style.BorderColor + + Normal + + + + КодСтраны + 70 + true + false + + true + + + Страна.Code + + None + + КодСтраныРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + КодСтраныКонтекстноеМеню + 71 + true + + LabelField + Enter + true + Left + true + + true + true + + System.DefaultGUIFont + true + false + false + false + + + + true + true + + true + + + ГруппаСтранаИКодРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Индекс + 15 + true + true + + true + + + Индекс + + true + + OnChange + ИндексПриИзменении + + + ИндексРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + ИндексКонтекстноеМеню + 16 + true + + InputField + Enter + true + Left + true + + 6 + true + true + false + true + true + true + + Style.BorderColor + + Normal + + + + Регион + 17 + true + true + + true + + + Регион + + Left + + OnChange + ПолеПриИзменении + + + РегионРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + РегионКонтекстноеМеню + 18 + true + + InputField + Enter + true + Left + true + + + AutoComplete + ПолеАвтоПодбор + + + StartChoice + ПолеНачалоВыбора + + + TextEditEnd + ПолеОкончаниеВводаТекста + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Район + 19 + true + true + + true + + + Район + + + OnChange + ПолеПриИзменении + + + РайонРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + РайонКонтекстноеМеню + 20 + true + + InputField + Enter + true + Left + true + + + AutoComplete + ПолеАвтоПодбор + + + StartChoice + ПолеНачалоВыбора + + + TextEditEnd + ПолеОкончаниеВводаТекста + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Город + 21 + true + true + + true + + + Город + + + OnChange + ПолеПриИзменении + + + ГородРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + ГородКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + + + AutoComplete + ПолеАвтоПодбор + + + StartChoice + ПолеНачалоВыбора + + + TextEditEnd + ПолеОкончаниеВводаТекста + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + НаселенныйПункт + 23 + true + true + + true + + + НаселенныйПункт + + + OnChange + ПолеПриИзменении + + + НаселенныйПунктРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + НаселенныйПунктКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + + + AutoComplete + ПолеАвтоПодбор + + + StartChoice + ПолеНачалоВыбора + + + TextEditEnd + ПолеОкончаниеВводаТекста + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Улица + 25 + true + true + + true + + + Улица + + + OnChange + ПолеПриИзменении + + + УлицаРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + УлицаКонтекстноеМеню + 26 + true + + InputField + Enter + true + Left + true + + + AutoComplete + ПолеАвтоПодбор + + + StartChoice + ПолеНачалоВыбора + + + TextEditEnd + ПолеОкончаниеВводаТекста + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ГруппаДомКорпусКвартира + 27 + + ГруппаТипы + 48 + + ТипДома + 28 + true + true + + true + + + ТипДома + + true + None + + OnChange + ПолеПриИзменении + + + ТипДомаРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + + ТипДомаКонтекстноеМеню + 29 + true + + InputField + Enter + true + Left + true + + true + true + true + false + true + true + true + + + дом + + + + + владение + + + + Web.Cream + + Normal + + + + ТипКорпуса + 32 + true + true + + true + + + ТипКорпуса + + true + None + + OnChange + ПолеПриИзменении + + + ТипКорпусаРасширеннаяПодсказка + 96 + Label + true + true + + Left + + + + ТипКорпусаКонтекстноеМеню + 33 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + + корпус + + + + + строение + + + + Web.Cream + + + Style.BorderColor + + Normal + + + + ТипКвартиры + 36 + true + true + + true + + + ТипКвартиры + + true + None + + OnChange + ПолеПриИзменении + + + ТипКвартирыРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + + ТипКвартирыКонтекстноеМеню + 37 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + + кв. + + + + + оф. + + + + Web.Cream + + + Style.BorderColor + + Normal + + + true + true + + true + + 10 + false + + ГруппаТипыРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаЗначения + 49 + + Дом + 30 + true + true + + true + + + Дом + + None + + OnChange + ПолеПриИзменении + + + ДомРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + + ДомКонтекстноеМеню + 31 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + + Style.BorderColor + + Normal + + + + Корпус + 34 + true + true + + true + + + Корпус + + None + + OnChange + ПолеПриИзменении + + + КорпусРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + + КорпусКонтекстноеМеню + 35 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + + Style.BorderColor + + Normal + + + + Квартира + 38 + true + true + + true + + + Квартира + + None + + OnChange + ПолеПриИзменении + + + КвартираРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + КвартираКонтекстноеМеню + 39 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + ГруппаЗначенияРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + ru + Группа дом корпус квартира + + false + + ГруппаДомКорпусКвартираРасширеннаяПодсказка + 92 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ПредставлениеСВидом + 52 + true + true + + true + + + ПредставлениеСВидом + + None + + ПредставлениеСВидомРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + + ПредставлениеСВидомКонтекстноеМеню + 53 + true + + LabelField + Enter + true + Left + true + + true + 3 + true + + System.DefaultGUIFont + true + false + false + false + + + + + ПанельКнопок + 6 + + КомандаОК + 7 + true + true + + true + + false + + КомандаОКРасширеннаяПодсказка + 110 + Label + true + true + + Left + + + Form.Command.КомандаОК + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + КомандаОтмена + 8 + true + true + + true + + false + + КомандаОтменаРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + Form.Command.КомандаОтмена + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + <key>ru</key> + <value>Панель кнопок</value> + + + ru + Панель кнопок + + + ПанельКнопокРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Индекс + + <key>ru</key> + <value>Индекс</value> + + 4 + + String + + 6 + + + + true + + + true + + true + + + Регион + + <key>ru</key> + <value>Регион</value> + + 5 + + String + + + + true + + + true + + true + + + Район + + <key>ru</key> + <value>Район</value> + + 6 + + String + + + + true + + + true + + true + + + Город + + <key>ru</key> + <value>Город</value> + + 7 + + String + + + + true + + + true + + true + + + НаселенныйПункт + + <key>ru</key> + <value>Нас. пункт</value> + + 8 + + String + + + + true + + + true + + true + + + Улица + + <key>ru</key> + <value>Улица</value> + + 9 + + String + + + + true + + + true + + true + + + ТипДома + + <key>ru</key> + <value>Тип дома</value> + + 10 + + String + + + + true + + + true + + true + + + Дом + + <key>ru</key> + <value>Дом</value> + + 11 + + String + + 8 + + + + true + + + true + + true + + + ТипКорпуса + + <key>ru</key> + <value>Тип корпуса</value> + + 12 + + String + + + + true + + + true + + true + + + Корпус + + <key>ru</key> + <value>Корпус</value> + + 13 + + String + + 8 + + + + true + + + true + + true + + + ТипКвартиры + + <key>ru</key> + <value>Тип квартиры</value> + + 14 + + String + + + + true + + + true + + true + + + Квартира + + <key>ru</key> + <value>Квартира</value> + + 15 + + String + + 8 + + + + true + + + true + + true + + + Страна + + <key>ru</key> + <value>Страна</value> + + 16 + + CatalogRef.СтраныМира + + + true + + + true + + true + + + Представление + + <key>ru</key> + <value>Представление</value> + + 17 + + String + + + + true + + + true + + true + + + ПредставлениеСВидом + + <key>ru</key> + <value>Представление с видом</value> + + 3 + + String + + + + true + + + true + + + + НаименованиеВида + + <key>ru</key> + <value>Наименование вида</value> + + 18 + + String + + + + true + + + true + + + + БылиНажатыКнопкиЗакрытия + + <key>ru</key> + <value>Были нажаты кнопки закрытия</value> + + 1 + + Boolean + + + true + + + true + + + + ИспользуютсяКлассификаторы + + <key>ru</key> + <value>Используются классификаторы</value> + + 20 + + Boolean + + + true + + + true + + + + СтранаРоссия + + <key>ru</key> + <value>Страна россия</value> + + 21 + + CatalogRef.СтраныМира + + + true + + + true + + + + НаименованиеСтраны + + <key>ru</key> + <value>Наименование страны</value> + + 2 + + String + + + + true + + + true + + + + КодСтраны + + <key>ru</key> + <value>Код страны</value> + + 19 + + String + + + + true + + + true + + + + ЗначенияПолей + + <key>ru</key> + <value>Значения полей</value> + + 22 + + ValueList + + + 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 + + + StdPicture.InputFieldClear + + + + КомандаОчиститьВыполнить + + + Auto + Auto + + + Классификатор + + <key>ru</key> + <value>Загрузить адресный классификатор</value> + + 4 + + ru + Загрузить адресный классификатор + + + true + + + + КлассификаторВыполнить + + + Auto + Auto + + + Представление + + String + + + + + Вид + + CatalogRef.ВидыКонтактнойИнформации + + + + БылиВнесеныИзменения + + Boolean + + + + ЗначенияПолей + + ValueList + + + + АдресТолькоРоссийский + + Boolean + + + + РедактированиеТолькоВДиалоге + + Boolean + + + + Заголовок + + String + + + + + + + + diff --git a/SSL/src/CommonForms/ВводАдреса/Module.bsl b/SSL/src/CommonForms/ВводАдреса/Module.bsl new file mode 100644 index 000000000..e62a91c46 --- /dev/null +++ b/SSL/src/CommonForms/ВводАдреса/Module.bsl @@ -0,0 +1,476 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ИспользуютсяКлассификаторы = УправлениеКонтактнойИнформациейКлассификаторы.ИспользуютсяКлассификаторы(); + + Если Не ИспользуютсяКлассификаторы Тогда + Элементы.Классификатор.Видимость = Ложь; + КонецЕсли; + + ПрочитатьЗначенияПараметров(); + + ПредставлениеСВидом = НаименованиеВида + ": " + Представление; + Заголовок = НаименованиеВида; + + СтранаРоссия = Справочники.СтраныМира.Россия; + + Если Параметры.АдресТолькоРоссийский Тогда + Страна = СтранаРоссия; + Элементы.Страна.Доступность = Ложь; + + Иначе + + + Если Не ПустаяСтрока(КодСтраны) ИЛИ Не ПустаяСтрока(НаименованиеСтраны) Тогда + // если задан код или наименование страны, то найдем страну + НайтиСтрануПоКодуИлиНаименованию(); + Иначе + Страна = СтранаРоссия; + КонецЕсли; + КонецЕсли; + + Если НЕ ПустаяСтрока(Параметры.Заголовок) Тогда + АвтоЗаголовок = Ложь; + Заголовок = Параметры.Заголовок; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ПроверитьТипыПолей(); + ПроверитьКнопкиВыбора(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Если Модифицированность И Не БылиНажатыКнопкиЗакрытия Тогда + + ТекстВопроса = НСтр("ru = 'Даные были изменены. Отказаться от изменений?'"); + + Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); + + Если Ответ = КодВозвратаДиалога.Отмена Тогда + Отказ = Истина; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + + + +//////////////////////////////////////////////////////////////////////////////// +// СТРАНА + +&НаКлиенте +Процедура СтранаПриИзменении(Элемент) + + Если Не ЗначениеЗаполнено(Страна) Тогда + Страна = СтранаРоссия; + КонецЕсли; + + ЗаполнитьКодИНаименованиеСтраны(); + + СформироватьПредставление(); + ПроверитьКнопкиВыбора(); + +КонецПроцедуры + + + +//////////////////////////////////////////////////////////////////////////////// +// ИНДЕКС + +&НаКлиенте +Процедура ИндексПриИзменении(Элемент) + + Если (Страна = СтранаРоссия) И ИспользуютсяКлассификаторы Тогда + Если Не ПустаяСтрока(Индекс) И (СтрДлина(Индекс) = 6) И ПустаяСтрока(Регион) И ПустаяСтрока(Район) И ПустаяСтрока(Город) И ПустаяСтрока(НаселенныйПункт) И ПустаяСтрока(Улица) Тогда + ПоИндексуВосстановитьДанные(); + КонецЕсли; + КонецЕсли; + + СформироватьПредставление(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПоИндексуВосстановитьДанные() + + Результат = УправлениеКонтактнойИнформациейКлассификаторы.НайтиЗаписиВАКПоИндексу(Индекс); + + Найдено = Результат.Количество; + + Если Найдено = 0 Тогда + Возврат; + + ИначеЕсли Найдено > 1 Тогда + // откроем форму выбора + + ПараметрыФормыПоиска = Новый Структура; + ПараметрыФормыПоиска.Вставить("НайденныйРегион", Результат.НайденныйРегион); + ПараметрыФормыПоиска.Вставить("НайденныйРайон", Результат.НайденныйРайон); + ПараметрыФормыПоиска.Вставить("АдресВХранилище", Результат.АдресВХранилище); + + КодАдресногоЭлемента = ОткрытьФормуМодально("ОбщаяФорма.ПоискПоИндексу", ПараметрыФормыПоиска); + Если КодАдресногоЭлемента = Неопределено Тогда + Возврат; + КонецЕсли; + + Результат = Новый Структура; + УправлениеКонтактнойИнформациейКлассификаторы.ПоКодуАдресногоЭлементаВСтруктуруПолучитьЕгоКомпоненты(КодАдресногоЭлемента, Результат); + + КонецЕсли; + + Регион = Результат.Регион; + Район = Результат.Район; + Город = Результат.Город; + НаселенныйПункт = Результат.НаселенныйПункт; + Улица = Результат.Улица; + + #Если Не ВебКлиент Тогда + Если Не ПустаяСтрока(Улица) Тогда + ТекущийЭлемент = Элементы.Улица; + ИначеЕсли Не ПустаяСтрока(НаселенныйПункт) Тогда + ТекущийЭлемент = Элементы.НаселенныйПункт; + ИначеЕсли Не ПустаяСтрока(Город) Тогда + ТекущийЭлемент = Элементы.Город; + ИначеЕсли Не ПустаяСтрока(Район) Тогда + ТекущийЭлемент = Элементы.Район; + ИначеЕсли Не ПустаяСтрока(Регион) Тогда + ТекущийЭлемент = Элементы.Регион; + КонецЕсли; + #КонецЕсли + +КонецПроцедуры + + + +//////////////////////////////////////////////////////////////////////////////// +// КНОПКИ ОК И ЗАКРЫТЬ + +&НаКлиенте +Процедура КомандаОтменаВыполнить() + + БылиНажатыКнопкиЗакрытия = Истина; + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура КомандаОКВыполнить() + + БылиНажатыКнопкиЗакрытия = Истина; + Закрыть(ПолучитьРезультатРедактирования()); + +КонецПроцедуры + +&НаКлиенте +Процедура КлассификаторВыполнить() + + УправлениеКонтактнойИнформациейКлассификаторыКлиент.ЗагрузитьАдресныйКлассификатор(); + +КонецПроцедуры + +&НаКлиенте +Процедура КомандаОчиститьВыполнить() + + Модифицированность = Истина; + + Страна = СтранаРоссия; + СтранаПриИзменении(Элементы.Страна); + + Индекс = ""; + Регион = ""; + Район = ""; + Город = ""; + НаселенныйПункт = ""; + Улица = ""; + Дом = ""; + Квартира = ""; + ТипДома = Элементы.ТипДома.СписокВыбора[0].Значение; + ТипКорпуса = Элементы.ТипКорпуса.СписокВыбора[0].Значение; + ТипКвартиры = Элементы.ТипКвартиры.СписокВыбора[0].Значение; + + СформироватьПредставление(); + +КонецПроцедуры + + + +//////////////////////////////////////////////////////////////////////////////// +// ОБЩИЕ СОБЫТИЯ ПОЛЕЙ ВВОДА + +&НаКлиенте +Процедура ПолеПриИзменении(Элемент) + + ПроверитьТипыПолей(); + Если ИспользуютсяКлассификаторы И (Страна = СтранаРоссия) И ПустаяСтрока(Индекс) Тогда + Индекс = УправлениеКонтактнойИнформациейКлассификаторы.ПолучитьИндекс(Регион, Район, Город, НаселенныйПункт, Улица, Дом, Корпус); + КонецЕсли; + + СформироватьПредставление(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + Если (Не ИспользуютсяКлассификаторы) ИЛИ (Страна <> СтранаРоссия) Тогда + Возврат; + КонецЕсли; + + Пар = Новый Структура("Регион,Район,Город,НаселенныйПункт,Улица,Уровень", Регион, Район, Город, НаселенныйПункт, Улица, ПолучитьУровеньЭлемента(Элемент)); + + Результат = ОткрытьФормуМодально("РегистрСведений.АдресныйКлассификатор.Форма.ФормаВыбора", Пар); + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + ЭтаФорма[Элемент.Имя] = СокрЛП(Результат.Наименование + " " + Результат.Сокращение); + ПолеПриИзменении(Элемент); + Модифицированность = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура ПолеАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + ОбработкаАвтоПодбораИОкончанияВвода(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолеОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + ОбработкаАвтоПодбораИОкончанияВвода(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаАвтоПодбораИОкончанияВвода(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + Если (Не ИспользуютсяКлассификаторы) ИЛИ (ПустаяСтрока(Текст)) ИЛИ (Страна <> СтранаРоссия) Тогда + Возврат; + КонецЕсли; + + УровеньЭлемента = ПолучитьУровеньЭлемента(Элемент); + Результат = УправлениеКонтактнойИнформациейКлассификаторы.АвтоПодборТекстВАдресномЭлементе(Текст, Регион, Район, Город, НаселенныйПункт, УровеньЭлемента); + + Если Результат <> Неопределено Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = Результат; + КонецЕсли; + +КонецПроцедуры + + + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ И ПРОЦЕДУРЫ + +&НаКлиенте +Функция ПолучитьУровеньЭлемента(Элемент) + + Если Элемент = Элементы.Регион Тогда + Возврат 1; + + ИначеЕсли Элемент = Элементы.Район Тогда + Возврат 2; + + ИначеЕсли Элемент = Элементы.Город Тогда + Возврат 3; + + ИначеЕсли Элемент = Элементы.НаселенныйПункт Тогда + Возврат 4; + + ИначеЕсли Элемент = Элементы.Улица Тогда + Возврат 5; + + Иначе + Возврат 0; + КонецЕсли; + +КонецФункции + +&НаКлиенте +Процедура СформироватьПредставление() + + Представление = ""; + + Если Страна <> СтранаРоссия Тогда + ДополнитьПредставлениеАдреса(НаименованиеСтраны, ", "); + КонецЕсли; + ДополнитьПредставлениеАдреса(СокрЛП(Индекс), ", "); + ДополнитьПредставлениеАдреса(СокрЛП(Регион), ", "); + ДополнитьПредставлениеАдреса(СокрЛП(Район), ", "); + ДополнитьПредставлениеАдреса(СокрЛП(Город), ", "); + ДополнитьПредставлениеАдреса(СокрЛП(НаселенныйПункт), ", "); + ДополнитьПредставлениеАдреса(СокрЛП(Улица), ", "); + ДополнитьПредставлениеАдреса(СокрЛП(Дом), ", " + ТипДома + " № "); + ДополнитьПредставлениеАдреса(СокрЛП(Корпус), ", " + ТипКорпуса + " "); + ДополнитьПредставлениеАдреса(СокрЛП(Квартира), ", " + ТипКвартиры + " "); + + Если СтрДлина(Представление) > 2 Тогда + Представление = Сред(Представление, 3); + КонецЕсли; + + ПредставлениеСВидом = НаименованиеВида + ": " + Представление; + +КонецПроцедуры + +&НаСервере +Процедура ПрочитатьЗначенияПараметров() + + Представление = Параметры.Представление; + НаименованиеВида = Строка(Параметры.Вид); + + Для Каждого ЭлементАдреса Из Параметры.ЗначенияПолей Цикл + ЭтаФорма[ЭлементАдреса.Представление] = ЭлементАдреса.Значение; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьЗначениеПоля(Значение, ИмяПоля) + + Если ЗначениеЗаполнено(Значение) Тогда + ЗначенияПолей.Добавить(Значение, ИмяПоля); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьРезультатРедактирования() + + ЗначенияПолей.Очистить(); + ДобавитьЗначениеПоля(Индекс, "Индекс"); + ДобавитьЗначениеПоля(Регион, "Регион"); + ДобавитьЗначениеПоля(Район, "Район"); + ДобавитьЗначениеПоля(Город, "Город"); + ДобавитьЗначениеПоля(НаселенныйПункт, "НаселенныйПункт"); + ДобавитьЗначениеПоля(Улица, "Улица"); + ДобавитьЗначениеПоля(Дом, "Дом"); + ДобавитьЗначениеПоля(Корпус, "Корпус"); + ДобавитьЗначениеПоля(Квартира, "Квартира"); + ДобавитьЗначениеПоля(НаименованиеСтраны, "Страна"); + ДобавитьЗначениеПоля(КодСтраны, "КодСтраны"); + + Если Не ПустаяСтрока(Дом) Тогда + ДобавитьЗначениеПоля(ТипДома, "ТипДома"); + КонецЕсли; + Если Не ПустаяСтрока(Корпус) Тогда + ДобавитьЗначениеПоля(ТипКорпуса, "ТипКорпуса"); + КонецЕсли; + Если Не ПустаяСтрока(Квартира) Тогда + ДобавитьЗначениеПоля(ТипКвартиры, "ТипКвартиры"); + КонецЕсли; + + Результат = Новый Структура; + Результат.Вставить("ЗначенияПолей", ЗначенияПолей); + Результат.Вставить("Представление", Представление); + + Возврат Результат; + +КонецФункции + +//Процедура дополняет представление адреса строкой +&НаКлиенте +Процедура ДополнитьПредставлениеАдреса(Дополнение, СтрокаКонкатенации) + + Если Дополнение <> "" Тогда + Представление = Представление + СтрокаКонкатенации + Дополнение; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьТипыПолей() + + ТипДома = ?(ЗначениеЗаполнено(ТипДома), ТипДома, Элементы.ТипДома.СписокВыбора[0].Значение); + ТипКорпуса = ?(ЗначениеЗаполнено(ТипКорпуса), ТипКорпуса, Элементы.ТипКорпуса.СписокВыбора[0].Значение); + ТипКвартиры = ?(ЗначениеЗаполнено(ТипКвартиры), ТипКвартиры, Элементы.ТипКвартиры.СписокВыбора[0].Значение); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьКнопкиВыбора() + + ЕстьКнопки = ИспользуютсяКлассификаторы И (Страна = СтранаРоссия); + + Элементы.Регион.КнопкаВыбора = ЕстьКнопки; + Элементы.Район.КнопкаВыбора = ЕстьКнопки; + Элементы.Город.КнопкаВыбора = ЕстьКнопки; + Элементы.НаселенныйПункт.КнопкаВыбора = ЕстьКнопки; + Элементы.Улица.КнопкаВыбора = ЕстьКнопки; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьКодИНаименованиеСтраны() + + ЗначенияРеквизитов = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(Страна, "Код, Наименование"); + КодСтраны = ЗначенияРеквизитов.Код; + НаименованиеСтраны = ЗначенияРеквизитов.Наименование; + +КонецПроцедуры + +&НаСервере +Процедура НайтиСтрануПоКодуИлиНаименованию() + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("КодСтраны", КодСтраны); + Запрос.УстановитьПараметр("НаименованиеСтраны", НаименованиеСтраны); + + Если ПустаяСтрока(КодСтраны) ИЛИ ПустаяСтрока(НаименованиеСтраны) Тогда + Запрос.Текст = + "ВЫБРАТЬ + | СтраныМира.Ссылка КАК Страна + |ИЗ + | Справочник.СтраныМира КАК СтраныМира + |ГДЕ + | СтраныМира.Код = &КодСтраны"; + Если ПустаяСтрока(КодСтраны) Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "Код", "Наименование"); + КонецЕсли; + + Иначе + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | Страны.Ссылка КАК Страна + |ИЗ + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | СтраныМира.Ссылка КАК Ссылка, + | 1 КАК Порядок + | ИЗ + | Справочник.СтраныМира КАК СтраныМира + | ГДЕ + | СтраныМира.Код = &КодСтраны + | + | ОБЪЕДИНИТЬ + | + | ВЫБРАТЬ ПЕРВЫЕ 1 + | СтраныМира.Ссылка, + | 2 + | ИЗ + | Справочник.СтраныМира КАК СтраныМира + | ГДЕ + | СтраныМира.Наименование = &НаименованиеСтраны) КАК Страны + | + |УПОРЯДОЧИТЬ ПО + | Страны.Порядок"; + + КонецЕсли; + + Выборка = Запрос.Выполнить().Выбрать(); + Страна = ?(Выборка.Следующий(), Выборка.Страна, Справочники.СтраныМира.ПустаяСсылка()); + +КонецПроцедуры diff --git a/SSL/src/CommonForms/ВводАдреса/ВводАдреса.mdo b/SSL/src/CommonForms/ВводАдреса/ВводАдреса.mdo new file mode 100644 index 000000000..d4f10f4a6 --- /dev/null +++ b/SSL/src/CommonForms/ВводАдреса/ВводАдреса.mdo @@ -0,0 +1,10 @@ + + + ВводАдреса + + ru + Ввод адреса + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonForms/ВводТелефона/Form.form b/SSL/src/CommonForms/ВводТелефона/Form.form new file mode 100644 index 000000000..56d787786 --- /dev/null +++ b/SSL/src/CommonForms/ВводТелефона/Form.form @@ -0,0 +1,672 @@ + + + + ПредставлениеСВидом + 16 + true + true + + true + + + ПредставлениеСВидом + + None + + ПредставлениеСВидомРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ПредставлениеСВидомКонтекстноеМеню + 17 + true + + LabelField + Enter + true + Left + true + + true + true + + System.DefaultGUIFont + true + false + false + false + + + + + КодСтраны + 1 + + <key>ru</key> + <value>Код &страны</value> + + true + true + + true + + + КодСтраны + + + OnChange + ПолеПриИзменении + + + КодСтраныРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + КодСтраныКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + ##### + true + true + true + + Style.BorderColor + + Normal + + + + КодГорода + 3 + + <key>ru</key> + <value>&Код города</value> + + true + true + + true + + + КодГорода + + Left + + OnChange + ПолеПриИзменении + + + КодГородаРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + КодГородаКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + ####### + true + true + true + + Style.BorderColor + + Normal + + + + НомерТелефона + 5 + + <key>ru</key> + <value>&Номер телефона</value> + + true + true + + true + + + НомерТелефона + + true + Left + + OnChange + ПолеПриИзменении + + + НомерТелефонаРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + НомерТелефонаКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Добавочный + 7 + + <key>ru</key> + <value>&Добавочный номер</value> + + true + true + + true + + + Добавочный + + Left + + OnChange + ПолеПриИзменении + + + ДобавочныйРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ДобавочныйКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + ##### + true + true + true + + Style.BorderColor + + Normal + + + + Комментарий + 18 + true + true + + true + + + Комментарий + + + OnChange + ПолеПриИзменении + + + КомментарийРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + Группа + 13 + + КомандаОК + 14 + true + true + + true + + false + + КомандаОКРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.Command.КомандаОК + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + КомандаОтмена + 15 + true + true + + true + + false + + КомандаОтменаРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.Command.КомандаОтмена + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + КодСтраны + + <key>ru</key> + <value>Код страны</value> + + 1 + + String + + + + true + + + true + + true + + + КодГорода + + <key>ru</key> + <value>Код города</value> + + 2 + + String + + + + true + + + true + + true + + + НомерТелефона + + <key>ru</key> + <value>Номер телефона</value> + + 3 + + String + + + + true + + + true + + true + + + Добавочный + + <key>ru</key> + <value>Добавочный</value> + + 4 + + String + + + + true + + + true + + true + + + Представление + + <key>ru</key> + <value>Представление</value> + + 5 + + String + + + + true + + + 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 + + Boolean + + + true + + + true + + + + Комментарий + + <key>ru</key> + <value>Комментарий</value> + + 9 + + String + + + + true + + + true + + + + КомандаОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + КомандаОКВыполнить + + + Auto + Auto + + + КомандаОтмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Закрыть + + + true + + + + КомандаОтменаВыполнить + + + Auto + Auto + + + ЗначенияПолей + + ValueList + + + + Представление + + String + + + + + Вид + + CatalogRef.ВидыКонтактнойИнформации + + + + БылиВнесеныИзменения + + Boolean + + + + Заголовок + + String + + + + + + + + diff --git a/SSL/src/CommonForms/ВводТелефона/Module.bsl b/SSL/src/CommonForms/ВводТелефона/Module.bsl new file mode 100644 index 000000000..711c30e57 --- /dev/null +++ b/SSL/src/CommonForms/ВводТелефона/Module.bsl @@ -0,0 +1,101 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ + +&НаСервере +Процедура ПрочитатьЗначенияПараметров() + + Представление = Параметры.Представление; + НаименованиеВида = Строка(Параметры.Вид); + + Для Каждого ЭлементТелефона Из Параметры.ЗначенияПолей Цикл + ЭтаФорма[ЭлементТелефона.Представление] = ЭлементТелефона.Значение; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьЗначенияПараметров() + + ЗначенияПолей = Новый СписокЗначений; + ЗначенияПолей.Добавить(КодСтраны, "КодСтраны"); + ЗначенияПолей.Добавить(КодГорода, "КодГорода"); + ЗначенияПолей.Добавить(НомерТелефона, "НомерТелефона"); + ЗначенияПолей.Добавить(Добавочный, "Добавочный"); + ЗначенияПолей.Добавить(Комментарий, "Комментарий"); + + Результат = Новый Структура; + Результат.Вставить("ЗначенияПолей", ЗначенияПолей); + Результат.Вставить("Представление", Представление); + + Возврат Результат; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ПрочитатьЗначенияПараметров(); + + ПредставлениеСВидом = НаименованиеВида + ": " + Представление; + Заголовок = НаименованиеВида; + + БылиНажатыКнопкиЗакрытия = Ложь; + + Если НЕ ПустаяСтрока(Параметры.Заголовок) Тогда + АвтоЗаголовок = Ложь; + Заголовок = Параметры.Заголовок; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Если Модифицированность И Не БылиНажатыКнопкиЗакрытия Тогда + + ТекстВопроса = НСтр("ru = 'Даные были изменены. Отказаться от изменений?'"); + + Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); + + Если Ответ = КодВозвратаДиалога.Отмена Тогда + Отказ = Истина; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ПолеПриИзменении(Элемент) + + Если Не ПустаяСтрока(КодСтраны) И Лев(КодСтраны, 1) <> "+" Тогда + КодСтраны = "+" + КодСтраны; + КонецЕсли; + + Представление = УправлениеКонтактнойИнформациейКлиент.СформироватьПредставлениеТелефона(КодСтраны, КодГорода, НомерТелефона, Добавочный, Комментарий); + ПредставлениеСВидом = НаименованиеВида + ": " + Представление; + +КонецПроцедуры + +&НаКлиенте +Процедура КомандаОКВыполнить() + + БылиНажатыКнопкиЗакрытия = Истина; + Закрыть(ПолучитьЗначенияПараметров()); + +КонецПроцедуры + +&НаКлиенте +Процедура КомандаОтменаВыполнить() + + БылиНажатыКнопкиЗакрытия = Истина; + Закрыть(); + +КонецПроцедуры + diff --git a/SSL/src/CommonForms/ВводТелефона/ВводТелефона.mdo b/SSL/src/CommonForms/ВводТелефона/ВводТелефона.mdo new file mode 100644 index 000000000..881e85dea --- /dev/null +++ b/SSL/src/CommonForms/ВводТелефона/ВводТелефона.mdo @@ -0,0 +1,11 @@ + + + ВводТелефона + + ru + Ввод телефона + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Form.form b/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Form.form new file mode 100644 index 000000000..7103d4cb5 --- /dev/null +++ b/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Form.form @@ -0,0 +1,257 @@ + + + + <key>ru</key> + <value>Установка расширения работы с файлами</value> + + + ДекорацияПояснение + 6 + + <key>ru</key> + <value>Для удобной работы с файловыми функциями предлагается установить расширение работы с файлами. +Установить и подключить?</value> + + true + true + + true + + + ДекорацияПояснениеРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + ДекорацияПояснениеКонтекстноеМеню + 7 + true + + Label + true + 2 + true + false + false + + Left + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + УстановитьСейчас + 8 + true + true + + true + + false + + УстановитьСейчасРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + Form.Command.УстановитьСейчас + Auto + true + true + true + UserCmds + Auto + + + УстановитьПозже + 9 + true + true + + true + + false + + УстановитьПозжеРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.Command.УстановитьПозже + Normal + Auto + true + true + UserCmds + Auto + + + НеУстанавливать + 10 + true + true + + true + + false + + НеУстанавливатьРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + Form.Command.НеУстанавливать + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + 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 + + + НеУстанавливать + + <key>ru</key> + <value>Нет, не напоминать больше</value> + + 3 + + ru + Не устанавливать + + + true + + + + НеУстанавливать + + + Auto + Auto + + + ЗакрытьФорму + + <key>ru</key> + <value>Закрыть</value> + + 4 + + ru + Закрыть + + + true + + + + ЗакрытьФорму + + + Auto + Auto + + + + + + diff --git a/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Module.bsl b/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Module.bsl new file mode 100644 index 000000000..980375a59 --- /dev/null +++ b/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Module.bsl @@ -0,0 +1,32 @@ + +&НаКлиенте +Процедура НеУстанавливать(Команда) + Закрыть(Ложь); // не предлагать +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьПозже(Команда) + Закрыть(Истина); // предлагать позже - в другом сеансе +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьСейчас(Команда) + УстановитьРасширениеРаботыСФайлами(); + Закрыть(Ложь); // не предлагать +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму(Команда) + Закрыть(Истина); // предлагать позже - в другом сеансе +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("Сообщение") Тогда + Если Параметры.Сообщение <> Неопределено Тогда + Элементы.ДекорацияПояснение.Заголовок = Параметры.Сообщение + Символы.ПС + НСтр("ru = ' Установить и подключить?'"); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/ВопросОбУстановкеРасширенияРаботыСФайлами.mdo b/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/ВопросОбУстановкеРасширенияРаботыСФайлами.mdo new file mode 100644 index 000000000..dd00fc5bf --- /dev/null +++ b/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/ВопросОбУстановкеРасширенияРаботыСФайлами.mdo @@ -0,0 +1,11 @@ + + + ВопросОбУстановкеРасширенияРаботыСФайлами + + ru + Вопрос об установке расширения работы с файлами + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/ВсеОтчеты/ConditionalAppearance.dcssca b/SSL/src/CommonForms/ВсеОтчеты/ConditionalAppearance.dcssca new file mode 100644 index 000000000..4acdbafe0 --- /dev/null +++ b/SSL/src/CommonForms/ВсеОтчеты/ConditionalAppearance.dcssca @@ -0,0 +1,86 @@ + + + + false + + + ОтображениеВаринтов + + + + + ДеревоНастройкиВидимостиВариантов.Использование + Equal + true + + + ДеревоНастройкиВидимостиВариантов.Автор + Filled + + + + + ЦветТекста + #0000AE + + + false + Шрифт + + + + + + + + ОтображениеВаринтов + + + + + ДеревоНастройкиВидимостиВариантов.Название + Filled + + + ДеревоНастройкиВидимостиВариантов.Автор + NotFilled + + + + + Шрифт + + + + + + false + + + ОтображениеВаринтовСписок + + + + + СписокНастройкиВидимостиВариантов.Использование + Equal + true + + + СписокНастройкиВидимостиВариантов.Автор + Filled + + + + + ЦветТекста + #0000AE + + + false + Шрифт + + + + + diff --git a/SSL/src/CommonForms/ВсеОтчеты/Form.form b/SSL/src/CommonForms/ВсеОтчеты/Form.form new file mode 100644 index 000000000..a19a8eb03 --- /dev/null +++ b/SSL/src/CommonForms/ВсеОтчеты/Form.form @@ -0,0 +1,1764 @@ + + + + <key>ru</key> + <value>Все отчеты</value> + + + ГруппаСтранициПредставаления + 27 + + ГруппаДерево + 28 + + ОтображениеВаринтов + 3 + true + true + + true + + + ДеревоНастройкиВидимостиВариантов + + None + + ОтображениеВаринтовГруппаОтчет + 59 + + ОтображениеВаринтовКартинка + 57 + true + true + + true + + + ДеревоНастройкиВидимостиВариантов.Картинка + + None + + ОтображениеВаринтовКартинкаРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + ОтображениеВаринтовКартинкаКонтекстноеМеню + 58 + true + + PictureField + Auto + true + Left + true + + true + true + true + true + true + + + 1 + + + + + ОтображениеВаринтовНазвание + 8 + + <key>ru</key> + <value>Отчет</value> + + true + true + + true + + + ДеревоНастройкиВидимостиВариантов.Название + + + ОтображениеВаринтовНазваниеРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + ОтображениеВаринтовНазваниеКонтекстноеМеню + 9 + true + + InputField + true + Auto + true + Left + true + + 10 + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Отчет</value> + + + ru + Отображение варинтов группа отчет + + + ОтображениеВаринтовГруппаОтчетРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + ОтображениеВаринтовАвтор + 12 + true + true + + true + + + ДеревоНастройкиВидимостиВариантов.Автор + + + ОтображениеВаринтовАвторРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + ОтображениеВаринтовАвторКонтекстноеМеню + 13 + true + + InputField + true + Auto + true + Left + true + + 10 + true + true + true + true + true + true + Normal + + + Top + + ОтображениеВаринтовКоманднаяПанель + 5 + Left + + + Selection + ОтображениеВаринтовВыбор + + + OnActivateRow + ОтображениеВаринтовПриАктивизацииСтроки + + + ОтображениеВаринтовСтрокаПоиска + 76 + + ОтображениеВаринтовСтрокаПоискаРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + ОтображениеВаринтовСтрокаПоискаКонтекстноеМеню + 77 + true + + ОтображениеВаринтов + + true + + + + ОтображениеВаринтовСостояниеПросмотра + 79 + + ОтображениеВаринтовСостояниеПросмотраРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + ОтображениеВаринтовСостояниеПросмотраКонтекстноеМеню + 80 + true + + ViewStatusAddition + ОтображениеВаринтов + + true + + + + ОтображениеВаринтовУправлениеПоиском + 82 + + ОтображениеВаринтовУправлениеПоискомРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + ОтображениеВаринтовУправлениеПоискомКонтекстноеМеню + 83 + true + + SearchControlAddition + ОтображениеВаринтов + + true + + + + ОтображениеВаринтовРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + + ОтображениеВаринтовКонтекстноеМеню + 4 + + ФормаОткрыть + 15 + true + true + + true + + + ФормаОткрытьРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Form.Command.Открыть + Normal + Auto + true + true + UserCmds + Auto + + + ФормаИспользовать + 16 + true + true + + true + + + ФормаИспользоватьРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + Form.Command.Использовать + Normal + Auto + true + true + UserCmds + Auto + + + Tree + true + true + true + 20 + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + ExpandAllLevels + true + true + None + None + None + true +
    + + ГруппаОписание + 21 + + КартинкаИнфо + 22 + + <key>ru</key> + <value>Картинка инфо</value> + + true + true + + true + + + КартинкаИнфоРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + + КартинкаИнфоКонтекстноеМеню + 23 + true + + 2 + true + 1 + true + false + false + + + CommonPicture.Информация + + + + + ОтображениеВаринтовОписание + 10 + true + true + + true + + + Items.ОтображениеВаринтов.CurrentData.Описание + + None + + ОтображениеВаринтовОписаниеРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + + ОтображениеВаринтовОписаниеКонтекстноеМеню + 11 + true + + LabelField + true + Auto + true + Left + true + + true + 2 + true + true + true + + + true + true + + true + + + <key>ru</key> + <value>Группа описание</value> + + + ru + Группа описание + + + ГруппаОписаниеРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа дерево</value> + + + ru + Группа дерево + + + ГруппаДеревоРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + + ГруппаСписок + 29 + + ОтображениеВаринтовСписок + 30 + true + true + + true + + + СписокНастройкиВидимостиВариантов + + None + + ОтображениеВаринтовСписокГруппаЯчейка + 62 + + ОтображениеВаринтовСписокКартинка + 60 + true + true + + true + + + СписокНастройкиВидимостиВариантов.Картинка + + + ОтображениеВаринтовСписокКартинкаРасширеннаяПодсказка + 118 + Label + true + true + + Left + + + + ОтображениеВаринтовСписокКартинкаКонтекстноеМеню + 61 + true + + PictureField + true + Auto + Left + true + + true + true + true + true + + + 1 + + + + + ОтображениеВаринтовСписокНазвание + 51 + + <key>ru</key> + <value>Отчет</value> + + true + true + + true + + + СписокНастройкиВидимостиВариантов.Название + + + ОтображениеВаринтовСписокНазваниеРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + + ОтображениеВаринтовСписокНазваниеКонтекстноеМеню + 52 + true + + InputField + true + Auto + true + Left + true + + 10 + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Отображение варинтов список группа ячейка</value> + + + ru + Отображение варинтов список группа ячейка + + + ОтображениеВаринтовСписокГруппаЯчейкаРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + ОтображениеВаринтовСписокАвтор + 53 + true + true + + true + + + СписокНастройкиВидимостиВариантов.Автор + + + ОтображениеВаринтовСписокАвторРасширеннаяПодсказка + 122 + Label + true + true + + Left + + + + ОтображениеВаринтовСписокАвторКонтекстноеМеню + 54 + true + + InputField + true + Auto + true + Left + true + + 10 + true + true + true + true + true + true + Normal + + + Top + + ОтображениеВаринтовСписокКоманднаяПанель + 32 + Left + + + Selection + ОтображениеВаринтовВыбор + + + OnActivateRow + ОтображениеВаринтовСписокПриАктивизацииСтроки + + + ОтображениеВаринтовСписокСтрокаПоиска + 108 + + ОтображениеВаринтовСписокСтрокаПоискаРасширеннаяПодсказка + 110 + Label + true + true + + Left + + + + ОтображениеВаринтовСписокСтрокаПоискаКонтекстноеМеню + 109 + true + + ОтображениеВаринтовСписок + + true + + + + ОтображениеВаринтовСписокСостояниеПросмотра + 111 + + ОтображениеВаринтовСписокСостояниеПросмотраРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + + ОтображениеВаринтовСписокСостояниеПросмотраКонтекстноеМеню + 112 + true + + ViewStatusAddition + ОтображениеВаринтовСписок + + true + + + + ОтображениеВаринтовСписокУправлениеПоиском + 114 + + ОтображениеВаринтовСписокУправлениеПоискомРасширеннаяПодсказка + 116 + Label + true + true + + Left + + + + ОтображениеВаринтовСписокУправлениеПоискомКонтекстноеМеню + 115 + true + + SearchControlAddition + ОтображениеВаринтовСписок + + true + + + + ОтображениеВаринтовСписокРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + + ОтображениеВаринтовСписокКонтекстноеМеню + 31 + + ФормаОткрытьСписок + 37 + true + true + + true + + + ФормаОткрытьСписокРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + Form.Command.Открыть + Normal + Auto + true + true + UserCmds + Auto + + + ФормаИспользоватьСписок + 38 + true + true + + true + + + ФормаИспользоватьСписокРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + Form.Command.Использовать + Normal + Auto + true + true + UserCmds + Auto + + + true + true + true + 20 + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + ExpandAllLevels + true + true + true + true + None + None + None + true + +
    + + ГруппаОписаниеДляСписка + 45 + + КартинкаИнфоДляСписка + 46 + + <key>ru</key> + <value>Картинка инфо</value> + + true + true + + true + + + КартинкаИнфоДляСпискаРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + + КартинкаИнфоДляСпискаКонтекстноеМеню + 47 + true + + 2 + true + 1 + true + false + false + + + CommonPicture.Информация + + + + + ОтображениеВаринтовОписаниеДляСписка + 48 + true + true + + true + + + Items.ОтображениеВаринтовСписок.CurrentData.Описание + + None + + ОтображениеВаринтовОписаниеДляСпискаРасширеннаяПодсказка + 134 + Label + true + true + + Left + + + + ОтображениеВаринтовОписаниеДляСпискаКонтекстноеМеню + 49 + true + + LabelField + true + Auto + true + Left + true + + true + 2 + true + true + true + + + true + true + + true + + + <key>ru</key> + <value>Группа описание</value> + + + ru + Группа описание + + + ГруппаОписаниеДляСпискаРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа список</value> + + + ru + Группа список + + + ГруппаСписокРасширеннаяПодсказка + 104 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + true + true + + true + + + <key>ru</key> + <value>Группа страници представаления</value> + + + ru + Группа страници представаления + + + ГруппаСтранициПредставаленияРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + Pages + + Auto + +
    + Top + true + + ФормаКоманднаяПанель + -1 + + ФормаОткрытьКП + 20 + true + true + + true + + + ФормаОткрытьКПРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + Form.Command.Открыть + Auto + true + true + true + UserCmds + Auto + + + ФормаНайти + 55 + true + false + + true + + + ФормаНайтиРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + Form.Item.ОтображениеВаринтовСписок.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ФормаОтменитьПоиск + 56 + true + false + + true + + + ФормаОтменитьПоискРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + Form.Item.ОтображениеВаринтовСписок.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + ФормаРазделы + 50 + true + true + + true + + + ФормаРазделыРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + Form.Command.Разделы + Normal + Auto + true + true + UserCmds + true + Auto + + + ФормаИспользоватьКП + 19 + + <key>ru</key> + <value>Быстрый доступ</value> + + true + true + + true + + + ФормаИспользоватьКПРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + Form.Command.Использовать + Normal + Auto + true + true + UserCmds + Auto + + + ФормаЗакрыть + 14 + true + true + + true + + + ФормаЗакрытьРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + PictureAndText + true + true + UserCmds + Auto + + + ФормаСправка + 63 + true + true + + true + + + ФормаСправкаРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + + OnClose + ПриЗакрытии + + 55 + DontBlock + true + true + Vertical + LeftWidest + true + true + true + UseIfNecessary + auto + true + + СписокПодсистем + + <key>ru</key> + <value>Список подсистем</value> + + 1 + + ValueList + + + true + + + true + + + + + + + СписокКлючей + + <key>ru</key> + <value>Список ключей</value> + + 2 + + ValueList + + + true + + + true + + + + + + + ДеревоНастройкиВидимостиВариантов + + <key>ru</key> + <value>Дерево настройки видимости вариантов</value> + + 3 + + ValueTree + + + true + + + true + + + Использование + + <key>ru</key> + <value>Использование</value> + + 1 + + Boolean + + + true + + + true + + + + Название + + <key>ru</key> + <value>Название</value> + + 2 + + String + + 500 + + + + true + + + true + + + + Описание + + <key>ru</key> + <value>Описание</value> + + 3 + + String + + + + true + + + true + + + + Автор + + <key>ru</key> + <value>Автор</value> + + 4 + + CatalogRef.Пользователи + + + true + + + true + + + + Ключ + + <key>ru</key> + <value>Полный ключ варианта</value> + + 6 + + String + + + + true + + + true + + + + НазваниеЭлемента + + <key>ru</key> + <value>Название элемента</value> + + 5 + + String + + + + true + + + true + + + + Идентификатор + + <key>ru</key> + <value>Идентификатор</value> + + 7 + + Number + + 4 + + + + true + + + true + + + + Картинка + + <key>ru</key> + <value>Картинка</value> + + 8 + + Picture + + + true + + + true + + + + + СписокНастройкиВидимостиВариантов + + <key>ru</key> + <value>Список настройки видимости вариантов</value> + + 4 + + ValueTable + + + true + + + true + + + Использование + + <key>ru</key> + <value>Использование</value> + + 1 + + Boolean + + + true + + + true + + + + Название + + <key>ru</key> + <value>Название</value> + + 2 + + String + + 500 + + + + true + + + true + + + + Описание + + <key>ru</key> + <value>Описание</value> + + 3 + + String + + + + true + + + true + + + + Автор + + <key>ru</key> + <value>Автор</value> + + 4 + + CatalogRef.Пользователи + + + true + + + true + + + + Ключ + + <key>ru</key> + <value>Полный ключ варианта</value> + + 6 + + String + + + + true + + + true + + + + НазваниеЭлемента + + <key>ru</key> + <value>Название элемента</value> + + 5 + + String + + + + true + + + true + + + + Идентификатор + + <key>ru</key> + <value>Идентификатор</value> + + 7 + + Number + + 4 + + + + true + + + true + + + + Картинка + + <key>ru</key> + <value>Картинка</value> + + 8 + + Picture + + + true + + + true + + + + + Закрепить + + <key>ru</key> + <value>Закрепить</value> + + 5 + + Picture + + + true + + + true + + + + Открепить + + <key>ru</key> + <value>Открепить</value> + + 6 + + Picture + + + true + + + true + + + + Открыть + + <key>ru</key> + <value>Открыть</value> + + 2 + + ru + Открыть + + + true + + + + ОткрытьОтчет + + + Auto + Auto + + + Использовать + + <key>ru</key> + <value>Быстрый доступ</value> + + 3 + + ru + Включить/отключить быстрый доступ отчета + + + true + + + + Использовать + + + Auto + Auto + + + Разделы + + <key>ru</key> + <value>Разделы</value> + + 5 + + ru + Показывать разделы панели + + + true + + + + Разделы + + + Auto + Auto + + + АдрессПараметровВызова + + String + + + + + ДопВариантыОтчета + + ValueList + + + + НеВыводить + + ValueList + + + + Подсистемы + + ValueList + String + + 500 + + + + + ИмяФормы + + String + + + + + + + +
    diff --git a/SSL/src/CommonForms/ВсеОтчеты/Help/ru.html b/SSL/src/CommonForms/ВсеОтчеты/Help/ru.html new file mode 100644 index 000000000..fbb919b4d --- /dev/null +++ b/SSL/src/CommonForms/ВсеОтчеты/Help/ru.html @@ -0,0 +1,5 @@ + +

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

    +

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

    +

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

    +

     

    \ 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..6aa35f6f8 --- /dev/null +++ b/SSL/src/CommonForms/ВсеОтчеты/Module.bsl @@ -0,0 +1,603 @@ +Перем СоответсвиеВариантовГруппировке, СоответсвиеВариантовНомеруСортировки, СписокОтчетов; +Перем ПараметрыВызова, СтрокаФиксированнаяГруппировка, ТаблицаВариантов; + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ТипЗнч(Параметры.Подсистемы) = Тип("СписокЗначений") тогда + ПутиПодсистемы = Параметры.Подсистемы; + Иначе + ПутиПодсистемы = Новый СписокЗначений; + ПутиПодсистемы.Добавить(Параметры.Подсистемы); + КонецЕсли; + + Закрепить = БиблиотекаКартинок.ЗакрепитьВариантОтчета; + Открепить = БиблиотекаКартинок.ОткрепитьВариантОтчета; + + ЭтаФорма.Заголовок = Параметры.ИмяФормы; + + ГруппироватьВарианты = Истина; + + СписокОтчетов = ВариантыОтчетовПереопределяемый.СписокОтчетовПоддерживаемыхПодсистемой(); + + ДеревоПодсистем = Новый ДеревоЗначений; + ДеревоПодсистем.Колонки.Добавить("Подсистема"); + ДеревоПодсистем.Колонки.Добавить("Название"); + + // Сделаем список отчетов + СписокПодсистем = ВариантыОтчетов.ПолучитьСписокПодсистем(ПутиПодсистемы, ДеревоПодсистем); + + Если СписокПодсистем.Количество() = 0 тогда + Возврат; + КонецЕсли; + + МаксимальнаяДлинна = 0; + + Для каждого ЭлементСпПодсистема из СписокПодсистем Цикл + МаксимальнаяДлинна = Макс(СтрДлина(ЭлементСпПодсистема.Значение), МаксимальнаяДлинна); + КонецЦикла; + + + // Получить вариантов отчетов с разделами + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетов.КлючОбъекта + ""\"" + ВариантыОтчетов.КлючВарианта КАК Ключ, + | ВариантыОтчетов.Наименование КАК Представление, + | ВариантыОтчетов.Описание, + | ВариантыОтчетов.Видимость, + | ВариантыОтчетов.Наименование КАК Сортировка, + | ВариантыОтчетов.ТипВариантаОтчета, + | ВариантыОтчетов.Администратор, + | ВариантыОтчетовПодсистемы.Подсистема + |ИЗ + | Справочник.ВариантыОтчетов.Подсистемы КАК ВариантыОтчетовПодсистемы + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов КАК ВариантыОтчетов + | ПО ВариантыОтчетовПодсистемы.Ссылка = ВариантыОтчетов.Ссылка + |ГДЕ + | (НЕ ВариантыОтчетов.ПометкаУдаления) + | И ВЫРАЗИТЬ(ВариантыОтчетовПодсистемы.Подсистема КАК Строка("+Формат(МаксимальнаяДлинна, "ЧГ=0")+"))В (&Подсистемы) + | И ВариантыОтчетов.КлючОбъекта В (&СписокОтчетов) + | + |УПОРЯДОЧИТЬ ПО + | Сортировка"; + + Запрос = Новый Запрос(ТЗ); + Запрос.УстановитьПараметр("Подсистемы", СписокПодсистем); + Запрос.УстановитьПараметр("СписокОтчетов", СписокОтчетов); + УстановитьПривилегированныйРежим(истина); + ТаблицаВариантов = Запрос.Выполнить().Выгрузить(); + УстановитьПривилегированныйРежим(ложь); + + // роли вариантов + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетов.КлючОбъекта + ""\"" + ВариантыОтчетов.КлючВарианта КАК Ключ, + | ВариантыОтчетовНастройкаВидимости.Пользователь, + | НЕ ВариантыОтчетов.Видимость КАК Видимость + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов.НастройкаВидимости КАК ВариантыОтчетовНастройкаВидимости + | ПО ВариантыОтчетов.Ссылка = ВариантыОтчетовНастройкаВидимости.Ссылка + |ГДЕ + | (НЕ ВариантыОтчетов.ПометкаУдаления) + | И ВариантыОтчетов.КлючОбъекта + ""\"" + ВариантыОтчетов.КлючВарианта В (&Ключи) + | И ВариантыОтчетов.КлючОбъекта В (&СписокОтчетов) + | И (ВариантыОтчетовНастройкаВидимости.Пользователь = Пользователь)"; + + Запрос.Текст = ТЗ; + Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь); + Запрос.УстановитьПараметр("Ключи", ТаблицаВариантов.ВыгрузитьКолонку("Ключ")); + УстановитьПривилегированныйРежим(истина); + ТаблицаПользователей = Запрос.Выполнить().Выгрузить(); + УстановитьПривилегированныйРежим(ложь); + + ТаблицаВариантов.Колонки.Добавить("Группировка", Новый ОписаниеТипов(,, Новый КвалификаторыСтроки())); + + СписокГруппировок = Новый ТаблицаЗначений; + СписокГруппировок.Колонки.Добавить("Группировка"); + СписокГруппировок.Колонки.Добавить("ГруппировкаПредставление"); + + Для каждого СтрокаПодсистемы из ДеревоПодсистем.Строки Цикл + ДанныеГруппировки = СписокГруппировок.Добавить(); + ДанныеГруппировки.Группировка = СтрокаПодсистемы.Подсистема; + ДанныеГруппировки.ГруппировкаПредставление = ""; + Для каждого СтрокаГруппировки из СтрокаПодсистемы.Строки Цикл + ДанныеГруппировки = СписокГруппировок.Добавить(); + ДанныеГруппировки.Группировка = СтрокаГруппировки.Подсистема; + ДанныеГруппировки.ГруппировкаПредставление = СтрокаГруппировки.Название; + КонецЦикла; + КонецЦикла; + + // создадим дерево вариантов + + ГруппировкиВариантов = Новый Соответствие; + + ГруппировкиВариантовСмТакже = Новый СписокЗначений; + + СгруппированныйСписокВариантовОтчетов = Новый ДеревоЗначений; + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("Ключ"); + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("Представление"); + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("Описание"); + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("Группировка"); + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("ГруппировкаПредставление"); + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("Сортировка"); + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("Видимость"); + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("Администратор"); + + Если ГруппироватьВарианты тогда + Для каждого ГруппировкаВар из СписокГруппировок Цикл + Если Найти(ГруппировкаВар.Группировка, "СмТакже") > 0 тогда + Продолжить; + КонецЕсли; + СтрокаГруппировкиОтчета = СгруппированныйСписокВариантовОтчетов.Строки.Добавить(); + СтрокаГруппировкиОтчета.Группировка = ГруппировкаВар.Группировка; + СтрокаГруппировкиОтчета.ГруппировкаПредставление = ГруппировкаВар.ГруппировкаПредставление; + ГруппировкиВариантов.Вставить(ГруппировкаВар.Группировка, СтрокаГруппировкиОтчета); + КонецЦикла; + КонецЕсли; + + СтрокаГруппировкиОтчета = СгруппированныйСписокВариантовОтчетов.Строки.Добавить(); + СтрокаГруппировкиОтчета.Группировка = "ПрочиеИПользовательскиеВариантыОтчета"; + СтрокаГруппировкиОтчета.ГруппировкаПредставление = НСТр("ru = 'Прочие'"); + ГруппировкиВариантов.Вставить("ПрочиеИПользовательскиеВариантыОтчета", СтрокаГруппировкиОтчета); + СтрокаФиксированнаяГруппировка = СтрокаГруппировкиОтчета; + + СтрокаГруппировкиОтчета = СгруппированныйСписокВариантовОтчетов.Строки.Добавить(); + СтрокаГруппировкиОтчета.Группировка = "СмТакже"; + СтрокаГруппировкиОтчета.ГруппировкаПредставление = НСТр("ru = 'См. также'"); + ГруппировкиВариантов.Вставить("СмТакже", СтрокаГруппировкиОтчета); + СтрокаГруппировкаСмТакже = СтрокаГруппировкиОтчета; + + + // Составим список отчетов + СоответсвиеВариантовГруппировке = Новый Соответствие; + СоответсвиеВариантовНомеруСортировки = Новый Соответствие; + + Для каждого СтрокаВариантаОтчета из ТаблицаВариантов Цикл + + Если НЕ ГруппироватьВарианты или НЕ ЗначениеЗаполнено(СтрокаВариантаОтчета.Подсистема ) тогда + СтрокаВариантаОтчета.Группировка = "ПрочиеИПользовательскиеВариантыОтчета"; + СоответсвиеВариантовГруппировке.Вставить(СтрокаВариантаОтчета.Ключ, "ПрочиеИПользовательскиеВариантыОтчета"); + Иначе + Если Найти(СтрокаВариантаОтчета.Подсистема, "СмТакже") > 0 тогда + СтрокаВариантаОтчета.Группировка = "СмТакже"; + ИначеЕсли СтрокаВариантаОтчета.Подсистема = СтрокаВариантаОтчета.Подсистема тогда + Для каждого ГруппировкаВараинта из ГруппировкиВариантов Цикл + Если СтрокаВариантаОтчета.Подсистема = ГруппировкаВараинта.Ключ тогда + СтрокаВариантаОтчета.Группировка = ГруппировкаВараинта.Ключ; + КонецЕсли; + КонецЦикла; + СоответсвиеВариантовГруппировке.Вставить(СтрокаВариантаОтчета.Ключ, СтрокаВариантаОтчета.Подсистема); + КонецЕсли; + КонецЕсли; + + СоответсвиеВариантовНомеруСортировки.Вставить(СтрокаВариантаОтчета.Ключ, СтрокаВариантаОтчета.Сортировка); + КонецЦикла; + + Для каждого СтрокаВарианта из ТаблицаВариантов Цикл + Видимость = СтрокаВарианта.Видимость; + СтрокиПользователи = ТаблицаПользователей.НайтиСтроки(Новый Структура("Ключ, Пользователь", СтрокаВарианта.Ключ, ПараметрыСеанса.ТекущийПользователь)); + Для каждого СтрокаПользователи из СтрокиПользователи Цикл + Видимость = СтрокаПользователи.Видимость; + КонецЦикла; + ДобавитьВариантыОтчета(ГруппировкиВариантов, СтрокаВарианта.Ключ, СтрокаВарианта.Представление, СтрокаВарианта.Описание, СтрокаВарианта.ТипВариантаОтчета, СтрокаВарианта.Группировка, Видимость, СтрокаВарианта.Администратор); + КонецЦикла; + + Для каждого СтрокаГруппирвоки из СгруппированныйСписокВариантовОтчетов.Строки Цикл + + Если СтрокаГруппирвоки.Строки.Количество() > 0 тогда + + Если СтрокаГруппирвоки.ГруппировкаПредставление = "" тогда + ЭлементыГруппы = ДеревоНастройкиВидимостиВариантов.ПолучитьЭлементы(); + ИмяГруппировки = СтрокаГруппирвоки.Группировка; + ИмяГруппировки = СтрЗаменить(ИмяГруппировки, ".", "_Точка_"); + ИмяГруппировки = СтрЗаменить(ИмяГруппировки, "\", "_Слэш_"); + ИмяГруппировки = СтрЗаменить(ИмяГруппировки, "-", "_Тирэ_"); + Иначе + ЭлементГруппирвоки = ДеревоНастройкиВидимостиВариантов.ПолучитьЭлементы().Добавить(); + ЭлементГруппирвоки.Название = СтрокаГруппирвоки.ГруппировкаПредставление; + ЭлементыГруппы = ЭлементГруппирвоки.ПолучитьЭлементы(); + ИмяГруппировки = СтрокаГруппирвоки.Группировка; + ИмяГруппировки = СтрЗаменить(ИмяГруппировки, ".", "_Точка_"); + ИмяГруппировки = СтрЗаменить(ИмяГруппировки, "\", "_Слэш_"); + ИмяГруппировки = СтрЗаменить(ИмяГруппировки, "-", "_Тирэ_"); + + КонецЕсли; + + ИмяГруппировки = "_ГруппаРаздела_" + ИмяГруппировки; + + Для каждого СтрокаВарианта из СтрокаГруппирвоки.Строки Цикл + + ИмяОтчета = СтрокаВарианта.Ключ; + + ПозицияВарианта = Найти(ИмяОтчета, "\"); + ИмяОтчета = Лев(ИмяОтчета, ПозицияВарианта-1); + ИмяОтчета = СтрЗаменить(ИмяОтчета, "Отчет.", ""); + + Отчет = Метаданные.Отчеты.Найти(ИмяОтчета); + Если Отчет = Неопределено тогда + Продолжить; + КонецЕсли; + + ЕстьПравоПросмотра = ПравоДоступа("Просмотр", Отчет); + Если НЕ ЕстьПравоПросмотра тогда + Продолжить; + КонецЕсли; + + ПараметрыФО = Новый Структура(""); + + ДоступенПоФоОпциям = ложь; + СодержитсяВФО = ложь; + Для каждого ФО из Метаданные.ФункциональныеОпции Цикл + + Если ФО.Состав.Найти(Отчет) = Неопределено тогда + Продолжить; + КонецЕсли; + + СодержитсяВФО = Истина; + + ЗначениеФО = ПолучитьФункциональнуюОпцию(ФО.Имя, ПараметрыФО); + Если ТипЗнч(ЗначениеФО) = Тип("Булево") тогда + Если ЗначениеФО тогда + ДоступенПоФоОпциям = истина; + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если СодержитсяВФО И НЕ ДоступенПоФоОпциям тогда + Продолжить; + КонецЕсли; + + Элемент = ЭлементыГруппы.Добавить(); + Элемент.Использование = СтрокаВарианта.Видимость; + Элемент.Название = СтрокаВарианта.Представление; + Элемент.Описание = СтрокаВарианта.Описание; + Элемент.Автор = СтрокаВарианта.Администратор; + Элемент.Ключ = СтрокаВарианта.Ключ; + Если Элемент.Использование тогда + Элемент.Картинка = Закрепить; + Иначе + Элемент.Картинка = Открепить; + КонецЕсли; + + Ключ = СтрокаВарианта.Ключ; + Ключ = СтрЗаменить(Ключ, ".", "_Точка_"); + Ключ = СтрЗаменить(Ключ, "\", "_Слэш_"); + Ключ = СтрЗаменить(Ключ, "-", "_Тирэ_"); + Элемент.НазваниеЭлемента = Ключ + ИмяГруппировки; + + ЭлементСтроки = СписокНастройкиВидимостиВариантов.Добавить(); + ЭлементСтроки.Использование = СтрокаВарианта.Видимость; + ЭлементСтроки.Название = СтрокаВарианта.Представление; + ЭлементСтроки.Описание = СтрокаВарианта.Описание; + ЭлементСтроки.Автор = СтрокаВарианта.Администратор; + ЭлементСтроки.Ключ = СтрокаВарианта.Ключ; + ЭлементСтроки.Идентификатор = Элемент.ПолучитьИдентификатор(); + Элемент.Идентификатор = ЭлементСтроки.ПолучитьИдентификатор(); + + Если ЭлементСтроки.Использование тогда + ЭлементСтроки.Картинка = Закрепить; + Иначе + ЭлементСтроки.Картинка = Открепить; + КонецЕсли; + + Ключ = СтрокаВарианта.Ключ; + Ключ = СтрЗаменить(Ключ, ".", "_Точка_"); + Ключ = СтрЗаменить(Ключ, "\", "_Слэш_"); + Ключ = СтрЗаменить(Ключ, "-", "_Тирэ_"); + Элемент.НазваниеЭлемента = Ключ + ИмяГруппировки; + + КонецЦикла; + + КонецЕсли; + КонецЦикла; + + МассивНаУдаление = Новый Массив; + + Для каждого СтрокаГруппировки из ДеревоНастройкиВидимостиВариантов.ПолучитьЭлементы() Цикл + Если СтрокаГруппировки.ПолучитьЭлементы().Количество() = 0 и СтрокаГруппировки.Ключ = "" тогда + МассивНаУдаление.Добавить(СтрокаГруппировки); + КонецЕсли; + КонецЦикла; + + Для каждого СтрокаНаУдаление из МассивНаУдаление Цикл + ДеревоНастройкиВидимостиВариантов.ПолучитьЭлементы().Удалить(СтрокаНаУдаление); + КонецЦикла; + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ПолучитьСписокОбъектовОтчетов(Массив,Подсистема) + + ДобавитьВСписокОтчетыПодсистемы(Массив, Подсистема); + + Для каждого ОбъектПодсистемы из Подсистема.Подсистемы Цикл + ПолучитьСписокОбъектовОтчетов(Массив, ОбъектПодсистемы); + КонецЦикла + +КонецПроцедуры + +Процедура ДобавитьВСписокОтчетыПодсистемы(Массив, Подсистема) + + Для каждого Объект из Подсистема.Состав Цикл + ПолноеИмя = Объект.ПолноеИмя(); + Если Найти(ПолноеИмя, "Отчет.") = 0 + или СписокОтчетов.НайтиПоЗначению(ПолноеИмя) = Неопределено + или Параметры.НеВыводить.НайтиПоЗначению(ПолноеИмя) <> Неопределено + тогда + Продолжить; + КонецЕсли; + Массив.Добавить(ПолноеИмя); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьВариантыОтчета(ГруппировкиВариантов, Ключ, Представление, Описание, ТипВарианта, ГруппировкаРаздела, Видимость, Администратор) + + Если ГруппировкаРаздела <> Неопределено тогда + Если ГруппировкиВариантов[ГруппировкаРаздела].Строки.НайтиСтроки(Новый Структура("Ключ", Ключ)).Количество() > 0 тогда + Возврат; + КонецЕсли; + СтрокаВариантаОтчета = ГруппировкиВариантов[ГруппировкаРаздела].Строки.Добавить(); + Иначе + Если СтрокаФиксированнаяГруппировка.Строки.НайтиСтроки(Новый Структура("Ключ", Ключ)).Количество() > 0 тогда + Возврат; + КонецЕсли; + СтрокаВариантаОтчета = СтрокаФиксированнаяГруппировка.Строки.Добавить(); + КонецЕсли; + Если ТипВарианта = Перечисления.ТипыВариантовОтчетов.Отчет тогда + СтрокаВариантаОтчета.Ключ = Ключ+"_Отчет_"; + Иначе + СтрокаВариантаОтчета.Ключ = Ключ; + КонецЕсли; + СтрокаВариантаОтчета.Представление = Представление; + СтрокаВариантаОтчета.Описание = Описание; + СтрокаВариантаОтчета.Видимость = Видимость; + СтрокаВариантаОтчета.Администратор = Администратор; + НомерСортировки = СоответсвиеВариантовНомеруСортировки[Ключ]; + СтрокаВариантаОтчета.Сортировка = ?(НомерСортировки <> Неопределено, НомерСортировки, "ЯЯ9999999999999"); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтображениеВаринтовПриАктивизацииСтроки(Элемент) + + Если Элемент.ТекущиеДанные <> Неопределено И Элемент.ТекущиеДанные.Использование тогда + Элементы.ФормаИспользовать.Пометка = Истина; + Элементы.ФормаИспользоватьКП.Пометка = Истина; + Элементы.ФормаИспользоватьСписок.Пометка = Истина; + Иначе + Элементы.ФормаИспользовать.Пометка = ложь; + Элементы.ФормаИспользоватьКП.Пометка = ложь; + Элементы.ФормаИспользоватьСписок.Пометка = ложь; + КонецЕсли; + + Если Элемент.ТекущиеДанные <> Неопределено И Элемент.ТекущиеДанные.Ключ = "" тогда + Элементы.ФормаИспользовать.Доступность = ложь; + Элементы.ФормаИспользоватьКП.Доступность = ложь; + Элементы.ФормаОткрыть.Доступность = ложь; + Элементы.ФормаОткрытьКП.Доступность = ложь; + Элементы.ФормаОткрытьСписок.Доступность = ложь; + Элементы.ФормаИспользоватьСписок.Доступность = ложь; + Иначе + Элементы.ФормаИспользовать.Доступность = Истина; + Элементы.ФормаИспользоватьКП.Доступность = Истина; + Элементы.ФормаОткрыть.Доступность = Истина; + Элементы.ФормаОткрытьКП.Доступность = Истина; + Элементы.ФормаОткрытьСписок.Доступность = Истина; + Элементы.ФормаИспользоватьСписок.Доступность = Истина; + КонецЕсли; + + Если Элемент.ТекущиеДанные <> Неопределено тогда + Ключ = Элемент.ТекущиеДанные.Ключ; + Элементы.ОтображениеВаринтовСписок.ТекущаяСтрока = Элемент.ТекущиеДанные.Идентификатор; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Использовать(Команда) + + Если Элементы.ОтображениеВаринтов.ТекущиеДанные = Неопределено тогда + Возврат; + КонецЕсли; + + СписокКлючейВариантов = Новый СписокЗначений; + Если Элементы.ОтображениеВаринтов.ВыделенныеСтроки.Количество() > 0 тогда + Для каждого ИндексСтроки из Элементы.ОтображениеВаринтов.ВыделенныеСтроки Цикл + ТекущиеДанные = ДеревоНастройкиВидимостиВариантов.НайтиПоИдентификатору(ИндексСтроки); + Если СписокКлючейВариантов.НайтиПоЗначению(ТекущиеДанные.Ключ) = Неопределено тогда + СписокКлючейВариантов.Добавить(ТекущиеДанные.Ключ); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если Элементы.ОтображениеВаринтовСписок.ВыделенныеСтроки.Количество() > 0 тогда + Для каждого ИндексСтроки из Элементы.ОтображениеВаринтовСписок.ВыделенныеСтроки Цикл + ТекущиеДанные = СписокНастройкиВидимостиВариантов.НайтиПоИдентификатору(ИндексСтроки); + Если СписокКлючейВариантов.НайтиПоЗначению(ТекущиеДанные.Ключ) = Неопределено тогда + СписокКлючейВариантов.Добавить(ТекущиеДанные.Ключ); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если СписокКлючейВариантов.Количество() > 0 тогда + + Для каждого СтрокаДерева из ДеревоНастройкиВидимостиВариантов.ПолучитьЭлементы() Цикл + + Если СтрокаДерева.Ключ <> "" тогда + Если СписокКлючейВариантов.НайтиПоЗначению(СтрокаДерева.Ключ) <> Неопределено тогда + ТекущиеДанные = СтрокаДерева; + ТекущиеДанные.Использование = НЕ Элементы.ФормаИспользоватьКП.Пометка; + Если ТекущиеДанные.Использование тогда + ТекущиеДанные.Картинка = Закрепить; + Иначе + ТекущиеДанные.Картинка = Открепить; + КонецЕсли; + КонецЕсли; + Иначе + УстановитьДоступностьПодчиненныхВариантов(СтрокаДерева, НЕ Элементы.ФормаИспользоватьКП.Пометка, СписокКлючейВариантов); + КонецЕсли; + КонецЦикла; + + Для каждого СтрокаСписка из СписокНастройкиВидимостиВариантов Цикл + Если СписокКлючейВариантов.НайтиПоЗначению(СтрокаСписка.Ключ) <> Неопределено тогда + ТекущиеДанные = СтрокаСписка; + ТекущиеДанные.Использование = НЕ Элементы.ФормаИспользоватьКП.Пометка; + Если ТекущиеДанные.Использование тогда + ТекущиеДанные.Картинка = Закрепить; + Иначе + ТекущиеДанные.Картинка = Открепить; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если ТекущиеДанные <> Неопределено И ТекущиеДанные.Использование тогда + Элементы.ФормаИспользовать.Пометка = Истина; + Элементы.ФормаИспользоватьКП.Пометка = Истина; + Элементы.ФормаИспользоватьСписок.Пометка = Истина; + Иначе + Элементы.ФормаИспользовать.Пометка = ложь; + Элементы.ФормаИспользоватьКП.Пометка = ложь; + Элементы.ФормаИспользоватьСписок.Пометка = ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьПодчиненныхВариантов(СтрокаДерева, Использование, СписокКлючейВариантов) + + Для каждого ПодчиненнаяСтрокаДерева из СтрокаДерева.ПолучитьЭлементы() Цикл + + Если ПодчиненнаяСтрокаДерева.Ключ <> "" тогда + Если СписокКлючейВариантов.НайтиПоЗначению(ПодчиненнаяСтрокаДерева.Ключ) <> Неопределено тогда + ТекущиеДанные = ПодчиненнаяСтрокаДерева; + ТекущиеДанные.Использование = Использование; + Если ТекущиеДанные.Использование тогда + ТекущиеДанные.Картинка = Закрепить; + Иначе + ТекущиеДанные.Картинка = Открепить; + КонецЕсли; + КонецЕсли; + Иначе + УстановитьДоступностьПодчиненныхВариантов(ПодчиненнаяСтрокаДерева, Использование, СписокКлючейВариантов); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОтчет(Команда) + + Ключ = Элементы.ОтображениеВаринтов.ТекущиеДанные.Ключ; + + Если СокрЛП(Ключ) = "" тогда + Возврат; + КонецЕсли; + + ПозицияВарианта = Найти(Ключ, "\"); + ИмяОтчета = Лев(Ключ, ПозицияВарианта-1); + КлючВарианта = Прав(Ключ, СтрДлина(Ключ)-ПозицияВарианта); + + ПараметрыОтчета = Новый Структура("КлючВарианта", КлючВарианта); + + СтандартнаяОбработка = истина; + + ВариантыОтчетовКлиентПереопределяемый.ПередОткрытиемФормыОтчета(Ключ, ПараметрыОтчета, СтандартнаяОбработка); + + Если СтандартнаяОбработка тогда + ОткрытьФорму(ИмяОтчета + ".Форма", ПараметрыОтчета, Ключ); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии() + + СписокКлючейВарианта = Новый СписокЗначений; + СписокЭлементовУправления = Новый СписокЗначений; + + Для каждого СтрокаГруппировки из ДеревоНастройкиВидимостиВариантов.ПолучитьЭлементы() Цикл + Если СтрокаГруппировки.Ключ <> "" тогда + КлючОбъекта = СтрокаГруппировки.Ключ; + ПозицияВарианта = Найти(КлючОбъекта, "\"); + ИмяОтчета = Лев(КлючОбъекта, ПозицияВарианта-1); + КлючВарианта = Прав(КлючОбъекта, СтрДлина(КлючОбъекта)-ПозицияВарианта); + СписокКлючейВарианта.Добавить(КлючОбъекта, , СтрокаГруппировки.Использование); + СписокЭлементовУправления.Добавить(СтрокаГруппировки.НазваниеЭлемента, , СтрокаГруппировки.Использование); + Иначе + Для каждого ЭлементЗначение из СтрокаГруппировки.ПолучитьЭлементы() Цикл + КлючОбъекта = ЭлементЗначение.Ключ; + ПозицияВарианта = Найти(КлючОбъекта, "\"); + ИмяОтчета = Лев(КлючОбъекта, ПозицияВарианта-1); + КлючВарианта = Прав(КлючОбъекта, СтрДлина(КлючОбъекта)-ПозицияВарианта); + СписокКлючейВарианта.Добавить(КлючОбъекта, , ЭлементЗначение.Использование); + СписокЭлементовУправления.Добавить(ЭлементЗначение.НазваниеЭлемента, , ЭлементЗначение.Использование); + КонецЦикла; + КонецЕсли; + КонецЦикла; + + ОповеститьОВыборе(Новый Структура("СписокВариантов, СписокЭлементов", СписокКлючейВарианта, СписокЭлементовУправления)); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтображениеВаринтовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Ключ = Элементы.ОтображениеВаринтов.ТекущиеДанные.Ключ; + Если СокрЛП(Ключ) = "" тогда + Возврат; + КонецЕсли; + + ПозицияВарианта = Найти(Ключ, "\"); + ИмяОтчета = Лев(Ключ, ПозицияВарианта-1); + КлючВарианта = Прав(Ключ, СтрДлина(Ключ)-ПозицияВарианта); + + ПараметрыОтчета = Новый Структура("КлючВарианта", КлючВарианта); + + СтандартнаяОбработка = истина; + + ВариантыОтчетовКлиентПереопределяемый.ПередОткрытиемФормыОтчета(Ключ, ПараметрыОтчета, СтандартнаяОбработка); + + Если СтандартнаяОбработка тогда + ОткрытьФорму(ИмяОтчета + ".Форма", ПараметрыОтчета, Ключ); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Разделы(Команда) + + Если Элементы.ФормаРазделы.Пометка тогда + Элементы.ФормаРазделы.Пометка = ложь; + Элементы.ГруппаСтранициПредставаления.ТекущаяСтраница = Элементы.ГруппаСписок; + Элементы.ФормаНайти.Доступность = Истина; + Элементы.ФормаОтменитьПоиск.Доступность = Истина; + Элементы.ОтображениеВаринтовСписок.ОтборСтрок = Неопределено; + Иначе + Элементы.ФормаРазделы.Пометка = истина; + Элементы.ГруппаСтранициПредставаления.ТекущаяСтраница = Элементы.ГруппаДерево; + Элементы.ФормаНайти.Доступность = Ложь; + Элементы.ФормаОтменитьПоиск.Доступность = Ложь; + Элементы.ОтображениеВаринтовСписок.ОтборСтрок = Новый ФиксированнаяСтруктура; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтображениеВаринтовСписокПриАктивизацииСтроки(Элемент) + + Если Элемент.ТекущиеДанные <> Неопределено тогда + Ключ = Элемент.ТекущиеДанные.Ключ; + Элементы.ОтображениеВаринтов.ТекущаяСтрока = Элемент.ТекущиеДанные.Идентификатор; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonForms/ВсеОтчеты/ВсеОтчеты.mdo b/SSL/src/CommonForms/ВсеОтчеты/ВсеОтчеты.mdo new file mode 100644 index 000000000..4f877251e --- /dev/null +++ b/SSL/src/CommonForms/ВсеОтчеты/ВсеОтчеты.mdo @@ -0,0 +1,16 @@ + + + ВсеОтчеты + + ru + Все отчеты + + Настрйока состава варинатов отчетов + + + ru + + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form new file mode 100644 index 000000000..431ac8810 --- /dev/null +++ b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form @@ -0,0 +1,629 @@ + + + + ДеревоОбъектовМетаданных + 1 + true + true + + true + + + ДеревоОбъектовМетаданных + + false + None + Add + Change + Copy + Delete + EndEdit + HierarchicalList + List + MoveDown + MoveUp + SelectAll + SortListAsc + SortListDesc + Tree + + Группа + 12 + + Пометка + 8 + + <key>ru</key> + <value>Пометка</value> + + true + true + + true + + + ДеревоОбъектовМетаданных.Пометка + + None + + OnChange + ПометкаПриИзменении + + + ПометкаРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ПометкаКонтекстноеМеню + 9 + true + + CheckBoxField + Enter + true + Left + true + + true + + + + Картинка + 10 + true + true + + true + + + ДеревоОбъектовМетаданных.Картинка + + None + + КартинкаРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + КартинкаКонтекстноеМеню + 11 + true + + PictureField + Enter + true + Left + true + + 2 + true + 1 + true + + 1 + + + + + Представление + 6 + + <key>ru</key> + <value>Объект метаданных</value> + + true + true + + true + + + ДеревоОбъектовМетаданных.Представление + + + ПредставлениеРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ПредставлениеКонтекстноеМеню + 7 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + None + + ДеревоОбъектовМетаданныхКоманднаяПанель + 3 + Left + true + + + ДеревоОбъектовМетаданныхСтрокаПоиска + 20 + + ДеревоОбъектовМетаданныхСтрокаПоискаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ДеревоОбъектовМетаданныхСтрокаПоискаКонтекстноеМеню + 21 + true + + ДеревоОбъектовМетаданных + + true + + + + ДеревоОбъектовМетаданныхСостояниеПросмотра + 23 + + ДеревоОбъектовМетаданныхСостояниеПросмотраРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ДеревоОбъектовМетаданныхСостояниеПросмотраКонтекстноеМеню + 24 + true + + ViewStatusAddition + ДеревоОбъектовМетаданных + + true + + + + ДеревоОбъектовМетаданныхУправлениеПоиском + 26 + + ДеревоОбъектовМетаданныхУправлениеПоискомРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ДеревоОбъектовМетаданныхУправлениеПоискомКонтекстноеМеню + 27 + true + + SearchControlAddition + ДеревоОбъектовМетаданных + + true + + + + ДеревоОбъектовМетаданныхРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ДеревоОбъектовМетаданныхКонтекстноеМеню + 2 + true + + Tree + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + ExpandTopLevel + true + true + None + None + None + true + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Выбрать + 13 + true + true + + true + + false + + ВыбратьРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + Form.Command.Выбрать + Auto + true + true + true + UserCmds + Auto + + + Закрыть + 14 + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.Command.Закрыть + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 15 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ДеревоОбъектовМетаданных + + <key>ru</key> + <value>Дерево объектов метаданных</value> + + 1 + + ValueTree + + + true + + + true + + + Имя + + <key>ru</key> + <value>Имя</value> + + 1 + + String + + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Представление</value> + + 2 + + String + + + + true + + + true + + + + Пометка + + <key>ru</key> + <value>Пометка</value> + + 3 + + Number + + 1 + true + + + + true + + + true + + + + Картинка + + <key>ru</key> + <value>Картинка</value> + + 4 + + Picture + + + true + + + true + + + + ПолноеИмя + + <key>ru</key> + <value>Полное имя</value> + + 5 + + String + + + + true + + + true + + + + ЭтоОбъектМетаданных + + <key>ru</key> + <value>Это объект метаданных</value> + + 6 + + Boolean + + + true + + + true + + + + + ВыбранныеОбъектыМетаданных + + <key>ru</key> + <value>Выбранные объекты метаданных</value> + + 2 + + ValueList + + + true + + + true + + + + + + + Выбрать + + <key>ru</key> + <value>Выбрать</value> + + 1 + + ru + Выбрать + + + true + + + + ВыбратьВыполнить + + + Auto + Auto + + + Закрыть + + <key>ru</key> + <value>Закрыть</value> + + 2 + + ru + Закрыть + + + true + + + + ЗакрытьВыполнить + + + Auto + Auto + + + ВыбранныеОбъектыМетаданных + + ValueList + + + + УникальныйИдентификаторИсточник + + UUID + + true + + + КоллекцииВыбираемыхОбъектовМетаданных + + ValueList + + + + ФильтрПоОбъектамМетаданных + + ValueList + + + + + + + diff --git a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl new file mode 100644 index 000000000..cf43d2301 --- /dev/null +++ b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl @@ -0,0 +1,412 @@ +//////////////////////////////////////////////////////////////////////////////// +// ИСПОЛЬЗОВАНИЕ ФОРМЫ // +// +// Форма предназначена для выбора объектов метаданных конфигурации и передачи +// выбранных их списка в вызывающую среду. +// +// Параметры вызова: +// КоллекцииВыбираемыхОбъектовМетаданных - СписокЗначений - фактически фильтр +// по типам объектов метаданных, которые могут быть выбраны. +// Например: +// ФильтрПоСсылочнымМетаданным = Новый СписокЗначений; +// ФильтрПоСсылочнымМетаданным.Добавить("Справочники"); +// ФильтрПоСсылочнымМетаданным.Добавить("Документы"); +// Позволяет выбирать только объекты метаданных справочники и документы +// ВыбранныеОбъектыМетаданных - СписокЗначений - уже выбранные объекты метаданных. +// В дереве метаданных такие объекты будут отмечены флажком выбора. +// Может быть полезным для установки объектов метаданных выбора по умолчанию +// или переустановки уже установленного списка +// + +/////////////////////////////////////////////////////////////////////////////// +// БЛОК ОБРАБОТЧИКОВ СОБЫТИЙ // +/////////////////////////////////////////////////////////////////////////////// + +// Процедура обработчик события ПриСозданииНаСервере формы +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ВыбранныеОбъектыМетаданных.ЗагрузитьЗначения(Параметры.ВыбранныеОбъектыМетаданных.ВыгрузитьЗначения()); + + Если Параметры.ФильтрПоОбъектамМетаданных.Количество() > 0 Тогда + Параметры.КоллекцииВыбираемыхОбъектовМетаданных.Очистить(); + Для Каждого ОбъектМетаданныхПолноеИмя Из Параметры.ФильтрПоОбъектамМетаданных Цикл + ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(Метаданные.НайтиПоПолномуИмени(ОбъектМетаданныхПолноеИмя)); + Если Параметры.КоллекцииВыбираемыхОбъектовМетаданных.НайтиПоЗначению(ИмяБазовогоТипа) = Неопределено Тогда + Параметры.КоллекцииВыбираемыхОбъектовМетаданных.Добавить(ИмяБазовогоТипа); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ДеревоОбъектовМетаданныхЗаполнить(); + +КонецПроцедуры + +// Процедура обработчик события нажатия на кнопку формы "Выбрать" +// +&НаКлиенте +Процедура ВыбратьВыполнить() + + ВыбранныеОбъектыМетаданных.Очистить(); + + ПолучениеДанных(); + + Оповестить("ВыборОбъектовМетаданных", ВыбранныеОбъектыМетаданных, Параметры.УникальныйИдентификаторИсточник); + + Закрыть(); + +КонецПроцедуры + +// Обработчик события нажатия на кнопку формы "Закрыть" +// +&НаКлиенте +Процедура ЗакрытьВыполнить() + + Закрыть(); + +КонецПроцедуры + +// Процедура обработчик события нажатия на поле "Пометка" дерева формы +// +&НаКлиенте +Процедура ПометкаПриИзменении(Элемент) + + ТекущиеДанные = ТекущийЭлемент.ТекущиеДанные; + Если ТекущиеДанные.Пометка = 2 Тогда + ТекущиеДанные.Пометка = 0; + КонецЕсли; + ПометитьВложенныеЭлементы(ТекущиеДанные); + ПометитьЭлементыРодителей(ТекущиеДанные); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////// +// БЛОК ВСПОМОГАТЕЛЬНЫЙ ФУНКЦИЙ // +/////////////////////////////////////////////////////////////////////////////// + +// Процедура заполняет дерево значений объектов конфигурации. +// Если список значений "Параметры.КоллекцииВыбираемыхОбъектовМетаданных" не пуст, тогда +// дерево будет ограничено переданным списком коллекций объектов метаданных. +// Если объекты метаданных в сформированном дереве будут найдены в списке значений +// "Параметры.ВыбранныеОбъектыМетаданных", тогда они будут помечены, как выбранные. +// +&НаСервере +Процедура ДеревоОбъектовМетаданныхЗаполнить() + + КоллекцииОбъектовМетаданных = Новый ТаблицаЗначений; + КоллекцииОбъектовМетаданных.Колонки.Добавить("Имя"); + КоллекцииОбъектовМетаданных.Колонки.Добавить("Синоним"); + КоллекцииОбъектовМетаданных.Колонки.Добавить("Картинка"); + КоллекцииОбъектовМетаданных.Колонки.Добавить("КартинкаОбъекта"); + КоллекцииОбъектовМетаданных.Колонки.Добавить("ЭтоКоллекцияОбщие"); + + КоллекцииОбъектовМетаданных_НоваяСтрока("Подсистемы", "Подсистемы", 35, 36, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ОбщиеМодули", "Общие модули", 37, 38, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ПараметрыСеанса", "Параметры сеанса", 39, 40, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("Роли", "Роли", 41, 42, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ПланыОбмена", "Планы обмена", 43, 44, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("КритерииОтбора", "Критерии отбора", 45, 46, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ПодпискиНаСобытия", "Подписки на события", 47, 48, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("РегламентныеЗадания", "Регламентные задания", 49, 50, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ФункциональныеОпции", "Функциональные опции", 51, 52, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ПараметрыФункциональныхОпций", "Параметры функциональных опций", 53, 54, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ХранилищаНастроек", "Хранилища настроек", 55, 56, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ОбщиеФормы", "Общие формы", 57, 58, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ОбщиеКоманды", "Общие команды", 59, 60, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ГруппыКоманд", "Группы команд", 61, 62, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("Интерфейсы", "Интерфейсы", 63, 64, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ОбщиеМакеты", "Общие макеты", 65, 66, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ОбщиеКартинки", "Общие картинки", 67, 68, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ПакетыXDTO", "XDTO-пакеты", 69, 70, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("WebСервисы", "Web-сервисы", 71, 72, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("WSСсылки", "WS-ссылки", 73, 74, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("Стили", "Стили", 75, 76, Истина, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("Языки", "Языки", 77, 78, Истина, КоллекцииОбъектовМетаданных); + + КоллекцииОбъектовМетаданных_НоваяСтрока("Константы", "Константы", БиблиотекаКартинок.Константа, БиблиотекаКартинок.Константа, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("Справочники", "Справочники", БиблиотекаКартинок.Справочник, БиблиотекаКартинок.Справочник, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("Документы", "Документы", БиблиотекаКартинок.Документ, БиблиотекаКартинок.ДокументОбъект, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ЖурналыДокументов", "Журналы документов", БиблиотекаКартинок.ЖурналДокументов, БиблиотекаКартинок.ЖурналДокументов, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("Перечисления", "Перечисления", БиблиотекаКартинок.Перечисление, БиблиотекаКартинок.Перечисление, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("Отчеты", "Отчеты", БиблиотекаКартинок.Отчет, БиблиотекаКартинок.Отчет, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("Обработки", "Обработки", БиблиотекаКартинок.Обработка, БиблиотекаКартинок.Обработка, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ПланыВидовХарактеристик", "Планы видов характеристик", БиблиотекаКартинок.ПланВидовХарактеристик, БиблиотекаКартинок.ПланВидовХарактеристикОбъект, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ПланыСчетов", "Планы счетов", БиблиотекаКартинок.ПланСчетов, БиблиотекаКартинок.ПланСчетовОбъект, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("ПланыВидовРасчета", "Планы видов характеристик", БиблиотекаКартинок.ПланВидовХарактеристик, БиблиотекаКартинок.ПланВидовХарактеристикОбъект, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("РегистрыСведений", "Регистры сведений", БиблиотекаКартинок.РегистрСведений, БиблиотекаКартинок.РегистрСведений, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("РегистрыНакопления", "Регистры накопления", БиблиотекаКартинок.РегистрНакопления, БиблиотекаКартинок.РегистрНакопления, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("РегистрыБухгалтерии", "Регистры бухгалтерии", БиблиотекаКартинок.РегистрБухгалтерии, БиблиотекаКартинок.РегистрБухгалтерии, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("РегистрыРасчета", "Регистры расчета", БиблиотекаКартинок.РегистрРасчета, БиблиотекаКартинок.РегистрРасчета, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("БизнесПроцессы", "Бизнес-процессы", БиблиотекаКартинок.БизнесПроцесс, БиблиотекаКартинок.БизнесПроцессОбъект, Ложь, КоллекцииОбъектовМетаданных); + КоллекцииОбъектовМетаданных_НоваяСтрока("Задачи", "Задачи", БиблиотекаКартинок.Задача, БиблиотекаКартинок.ЗадачаОбъект, Ложь, КоллекцииОбъектовМетаданных); + + // Создание предопределенных элементов. + ЭлементКонфигурация = НоваяСтрокаДерева(Метаданные.Имя, "", Метаданные.Синоним, 79, ДеревоОбъектовМетаданных); + ЭлементОбщие = НоваяСтрокаДерева("Общие", "", "Общие", 0, ЭлементКонфигурация); + + // Заполнение дерева объектов метаданных. + Для каждого Строка ИЗ КоллекцииОбъектовМетаданных Цикл + Если Параметры.КоллекцииВыбираемыхОбъектовМетаданных.Количество() = 0 ИЛИ + Параметры.КоллекцииВыбираемыхОбъектовМетаданных.НайтиПоЗначению(Строка.Имя) <> Неопределено Тогда + ВыводКоллекцииОбъектовМетаданных(Строка.Имя, + "", + Строка.Синоним, + Строка.Картинка, + Строка.КартинкаОбъекта, + ?(Строка.ЭтоКоллекцияОбщие, ЭлементОбщие, ЭлементКонфигурация), + ?(Строка.Имя = "Подсистемы", Метаданные.Подсистемы, Неопределено)); + КонецЕсли; + КонецЦикла; + + Если ЭлементОбщие.ПолучитьЭлементы().Количество() = 0 Тогда + ЭлементКонфигурация.ПолучитьЭлементы().Удалить(ЭлементОбщие); + КонецЕсли; + +КонецПроцедуры + +// Функция, добавляющая одну строку в дерево значений формы - дерево, +// а так же заполняющая полный набор строк из метаданных по переданному параметру +// Если параметр Подсистемы заполнен, то вызывается рекурсивно из за того, +// что подсистемы могут содержать подсистемы +// Парметры: +// Имя - имя родительского элемента +// Синоним - синоним родительского элемента +// Пометка - Булево, начальная пометка коллекции или объекта метаданных. +// Картинка - код картинки родительского элемента +// КартинкаОбъекта - код картинки подэлемента +// Родитель - ссылка на элемента дерева значений который является корнем +// для добавляемого элемента +// Подсистемы - если заполнен то содержит значение Метаданные.Подсистемы +// т.е. коллекцию элементов +// +// Возвращаемое значение: +// +// +&НаСервере +Функция ВыводКоллекцииОбъектовМетаданных(Имя, ПолноеИмя, Синоним, Картинка, КартинкаОбъекта, Родитель = Неопределено, Подсистемы = Неопределено) + + НоваяСтрока = НоваяСтрокаДерева(Имя, ПолноеИмя, Синоним, Картинка, Родитель, Подсистемы <> Неопределено И Подсистемы <> Метаданные.Подсистемы); + + Если Подсистемы = Неопределено Тогда + Для каждого ЭлементКоллекцииМетаданных ИЗ Метаданные[Имя] Цикл + Если Параметры.ФильтрПоОбъектамМетаданных.НайтиПоЗначению(ЭлементКоллекцииМетаданных.ПолноеИмя()) = Неопределено Тогда + Продолжить; + КонецЕсли; + НоваяСтрокаДерева(ЭлементКоллекцииМетаданных.Имя, + ЭлементКоллекцииМетаданных.ПолноеИмя(), + ЭлементКоллекцииМетаданных.Синоним, + КартинкаОбъекта, + НоваяСтрока, + Истина); + КонецЦикла; + Иначе + Для каждого ЭлементКоллекцииМетаданных ИЗ Подсистемы Цикл + ВыводКоллекцииОбъектовМетаданных(ЭлементКоллекцииМетаданных.Имя, + ЭлементКоллекцииМетаданных.ПолноеИмя(), + ЭлементКоллекцииМетаданных.Синоним, + Картинка, + КартинкаОбъекта, + НоваяСтрока, + ЭлементКоллекцииМетаданных.Подсистемы); + КонецЦикла; + КонецЕсли; + + Возврат НоваяСтрока; + +КонецФункции + +// Добавляет новую строку в дерево формы +// Имя - имя элемента +// Синоним - синоним элемента +// Картинка - код картинки +// Родитель - элемент дерева значений формы, от которого отращивается новая ветка +// +// Возвращаемое значение: +// ДанныеФормыЭлементДерево - отрощенная ветвь дерева +// +&НаСервере +Функция НоваяСтрокаДерева(Имя, ПолноеИмя, Синоним, Картинка, Родитель, ЭтоОбъектМетаданных = Ложь) + + Коллекция = Родитель.ПолучитьЭлементы(); + НоваяСтрока = Коллекция.Добавить(); + НоваяСтрока.Имя = Имя; + НоваяСтрока.Представление = ?(ЗначениеЗаполнено(Синоним), Синоним, Имя); + НоваяСтрока.Пометка = ?(Параметры.ВыбранныеОбъектыМетаданных.НайтиПоЗначению(ПолноеИмя) = Неопределено, 0, 1); + НоваяСтрока.Картинка = Картинка; + НоваяСтрока.ПолноеИмя = ПолноеИмя; + НоваяСтрока.ЭтоОбъектМетаданных = ЭтоОбъектМетаданных; + + Возврат НоваяСтрока; + +КонецФункции + +// Добавляет новую строку в таблицу значений видов объектов метаданных +// конфигурации +// +// Параметры: +// Имя - имя объекта метаданных или вида объекта метаданных +// Синоним - синоним объекта метаданных +// Картинка - картинка поставленная в соответствие объекту метаданных +// или виду объекта метаданных +// ЭтоКоллекцияОбщие - признак того, что текущий элемент содержит подэлементы +// +&НаСервере +Процедура КоллекцииОбъектовМетаданных_НоваяСтрока(Имя, Синоним, Картинка, КартинкаОбъекта, ЭтоКоллекцияОбщие, Таб) + + НоваяСтрока = Таб.Добавить(); + НоваяСтрока.Имя = Имя; + НоваяСтрока.Синоним = Синоним; + НоваяСтрока.Картинка = Картинка; + НоваяСтрока.КартинкаОбъекта = КартинкаОбъекта; + НоваяСтрока.ЭтоКоллекцияОбщие = ЭтоКоллекцияОбщие; + +КонецПроцедуры + +// Процедура рекурсивно устанавливает/снимает пометку для родителей передваемого элемента. +// +// Параметры: +// Элемент - ДанныеФормыКоллекцияЭлементовДерева +// +&НаКлиенте +Процедура ПометитьЭлементыРодителей(Элемент) + + Родитель = Элемент.ПолучитьРодителя(); + + Если Родитель = Неопределено Тогда + Возврат; + КонецЕсли; + + Если НЕ Родитель.ЭтоОбъектМетаданных Тогда + + ЭлементыРодителя = Родитель.ПолучитьЭлементы(); + Если ЭлементыРодителя.Количество() = 0 Тогда + Родитель.Пометка = 0; + ИначеЕсли Элемент.Пометка = 2 Тогда + Родитель.Пометка = 2; + Иначе + Родитель.Пометка = ЗначениеПометкиЭлементов(ЭлементыРодителя); + КонецЕсли; + + КонецЕсли; + + ПометитьЭлементыРодителей(Родитель); + +КонецПроцедуры + +&НаКлиенте +Функция ЗначениеПометкиЭлементов(ЭлементыРодителя) + + ЕстьПомеченые = Ложь; + ЕстьНепомеченные = Ложь; + + Для каждого ЭлементРодителя Из ЭлементыРодителя Цикл + + Если ЭлементРодителя.Пометка = 2 ИЛИ (ЕстьПомеченые И ЕстьНепомеченные) Тогда + ЕстьПомеченые = Истина; + ЕстьНепомеченные = Истина; + Прервать; + ИначеЕсли ЭлементРодителя.ЭтоОбъектМетаданных Тогда + ЕстьПомеченые = ЕстьПомеченые ИЛИ ЭлементРодителя.Пометка; + ЕстьНепомеченные = ЕстьНепомеченные ИЛИ НЕ ЭлементРодителя.Пометка; + Иначе + ВложенныеЭлементы = ЭлементРодителя.ПолучитьЭлементы(); + Если ВложенныеЭлементы.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + ЗначениеПометкиВложенныхЭлементов = ЗначениеПометкиЭлементов(ВложенныеЭлементы); + ЕстьПомеченые = ЕстьПомеченые ИЛИ ЭлементРодителя.Пометка ИЛИ ЗначениеПометкиВложенныхЭлементов; + ЕстьНепомеченные = ЕстьНепомеченные ИЛИ НЕ ЭлементРодителя.Пометка ИЛИ НЕ ЗначениеПометкиВложенныхЭлементов; + КонецЕсли; + КонецЦикла; + + Возврат ?(ЕстьПомеченые И ЕстьНепомеченные, 2, ?(ЕстьПомеченые, 1, 0)); + +КонецФункции + +// Процедура НачальнаяПометкаКоллекций устанавливает пометку для коллекций +// объектов метаданных, которые не имеют объектов метаданных (истина) и +// которые имеют объекты метаданных с заданной пометкой. +// +// Параметры: +// Элемент - ДанныеФормыКоллекцияЭлементовДерева +// +&НаКлиенте +Процедура НачальнаяПометкаКоллекций(Родитель = Неопределено) + + Если Родитель = Неопределено Тогда + Родитель = ДеревоОбъектовМетаданных.ПолучитьЭлементы()[0]; + КонецЕсли; + + Если НЕ Родитель.ЭтоОбъектМетаданных Тогда + + ВложенныеЭлементы = Родитель.ПолучитьЭлементы(); + + Если ВложенныеЭлементы.Количество() = 0 Тогда + Родитель.Пометка = 0; + ИначеЕсли ВложенныеЭлементы[0].ЭтоОбъектМетаданных Тогда + ПометитьЭлементыРодителей(ВложенныеЭлементы[0]); + Иначе + Для каждого ВложенныйЭлемент ИЗ ВложенныеЭлементы Цикл + НачальнаяПометкаКоллекций(ВложенныйЭлемент); + КонецЦикла; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Процедура рекурсивно устанавливает/снимает пометку для вложенных элементов начиная +// с передваемого элемента. +// +// Параметры: +// Элемент - ДанныеФормыКоллекцияЭлементовДерева +// +&НаКлиенте +Процедура ПометитьВложенныеЭлементы(Элемент) + + ВложенныеЭлементы = Элемент.ПолучитьЭлементы(); + + Если ВложенныеЭлементы.Количество() = 0 Тогда + Если НЕ Элемент.ЭтоОбъектМетаданных Тогда + Элемент.Пометка = 0; + КонецЕсли; + Иначе + Для Каждого ВложенныйЭлемент ИЗ ВложенныеЭлементы Цикл + ВложенныйЭлемент.Пометка = Элемент.Пометка; + ПометитьВложенныеЭлементы(ВложенныйЭлемент); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +// Процедура для заполнения списка выбранных элементов дерева +// Рекурсивно просматривает все дерево элементов и в случае, если элемент +// выбран добавляет его ПолноеИмя в список выбранных. +// +// Родитель - ДанныеФормыЭлементДерева +// +&НаСервере +Процедура ПолучениеДанных(Родитель = Неопределено) + + Родитель = ?(Родитель = Неопределено, ДеревоОбъектовМетаданных, Родитель); + + КоллекцияЭлементов = Родитель.ПолучитьЭлементы(); + + Для каждого Элемент ИЗ КоллекцияЭлементов Цикл + Если Элемент.Пометка И НЕ ПустаяСтрока(Элемент.ПолноеИмя) Тогда + ВыбранныеОбъектыМетаданных.Добавить(Элемент.ПолноеИмя); + КонецЕсли; + ПолучениеДанных(Элемент); + КонецЦикла; + +КонецПроцедуры + + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + НачальнаяПометкаКоллекций(); + +КонецПроцедуры + diff --git a/SSL/src/CommonForms/ВыборОбъектовМетаданных/ВыборОбъектовМетаданных.mdo b/SSL/src/CommonForms/ВыборОбъектовМетаданных/ВыборОбъектовМетаданных.mdo new file mode 100644 index 000000000..36cdecf2c --- /dev/null +++ b/SSL/src/CommonForms/ВыборОбъектовМетаданных/ВыборОбъектовМетаданных.mdo @@ -0,0 +1,10 @@ + + + ВыборОбъектовМетаданных + + ru + Выбор объектов метаданных + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonForms/ВыборСертификатаЭЦПДляПодписи/Form.form b/SSL/src/CommonForms/ВыборСертификатаЭЦПДляПодписи/Form.form new file mode 100644 index 000000000..d227c1f37 --- /dev/null +++ b/SSL/src/CommonForms/ВыборСертификатаЭЦПДляПодписи/Form.form @@ -0,0 +1,711 @@ + + + + <key>ru</key> + <value>Установка ЭЦП</value> + + + ТаблицаСертификатов + 3 + + <key>ru</key> + <value>Сертификаты ЭЦП</value> + + true + true + + true + + + ТаблицаСертификатов + + Top + Change + Copy + CopyToClipboard + + ТаблицаСертификатовКомуВыдан + 6 + true + true + + true + + + ТаблицаСертификатов.КомуВыдан + + + ТаблицаСертификатовКомуВыданРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ТаблицаСертификатовКомуВыданКонтекстноеМеню + 7 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСертификатовКемВыдан + 8 + true + true + + true + + + ТаблицаСертификатов.КемВыдан + + + ТаблицаСертификатовКемВыданРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ТаблицаСертификатовКемВыданКонтекстноеМеню + 9 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСертификатовДействителенДо + 10 + true + true + + true + + + ТаблицаСертификатов.ДействителенДо + + + ТаблицаСертификатовДействителенДоРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ТаблицаСертификатовДействителенДоКонтекстноеМеню + 11 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСертификатовНазначение + 12 + true + true + + true + + + ТаблицаСертификатов.Назначение + + + ТаблицаСертификатовНазначениеРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + ТаблицаСертификатовНазначениеКонтекстноеМеню + 13 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + ТаблицаСертификатовКоманднаяПанель + 5 + Left + true + + + Selection + ТаблицаСертификатовВыбор + + + ТаблицаСертификатовСтрокаПоиска + 25 + + ТаблицаСертификатовСтрокаПоискаРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + ТаблицаСертификатовСтрокаПоискаКонтекстноеМеню + 26 + true + + ТаблицаСертификатов + + true + + + + ТаблицаСертификатовСостояниеПросмотра + 28 + + ТаблицаСертификатовСостояниеПросмотраРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ТаблицаСертификатовСостояниеПросмотраКонтекстноеМеню + 29 + true + + ViewStatusAddition + ТаблицаСертификатов + + true + + + + ТаблицаСертификатовУправлениеПоиском + 31 + + ТаблицаСертификатовУправлениеПоискомРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + ТаблицаСертификатовУправлениеПоискомКонтекстноеМеню + 32 + true + + SearchControlAddition + ТаблицаСертификатов + + true + + + + ТаблицаСертификатовРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ТаблицаСертификатовКонтекстноеМеню + 4 + + ТаблицаСертификатовКонтекстноеМенюОткрытьСертификат + 20 + true + true + + true + + + ТаблицаСертификатовКонтекстноеМенюОткрытьСертификатРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Form.Command.ОткрытьСертификат + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + Row +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + +
    + + Пароль + 18 + true + true + + true + + + Пароль + + + ПарольРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ПарольКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + + 20 + true + true + false + true + true + true + true + true + Normal + + + + Комментарий + 1 + true + true + + true + + + Комментарий + + + КомментарийРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + Normal + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаВыбрать + 14 + true + true + + true + + + ФормаВыбратьРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.Command.Выбрать + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 17 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Комментарий + + <key>ru</key> + <value>Комментарий к подписи</value> + + 1 + + String + + + + true + + + true + + + + ТаблицаСертификатов + + <key>ru</key> + <value>Таблица сертификатов</value> + + 2 + + 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 + + Date + + Date + + + + true + + + true + + + + Назначение + + <key>ru</key> + <value>Назначение</value> + + 4 + + String + + + + true + + + true + + + + Отпечаток + + <key>ru</key> + <value>Отпечаток</value> + + 6 + + String + + + + true + + + true + + + + + ОбъектСсылка + + <key>ru</key> + <value>Объект ссылка</value> + + 3 + + CatalogRef.Файлы + + + true + + + true + + + + Пароль + + <key>ru</key> + <value>Пароль</value> + + 4 + + String + + + + true + + + true + + + + Выбрать + + <key>ru</key> + <value>Подписать</value> + + 1 + + ru + Подписать + + + true + + + + Выбрать + + + Auto + Auto + + + ОткрытьСертификат + + <key>ru</key> + <value>Открыть сертификат</value> + + 2 + + ru + Открыть сертификат + + + true + + + + ОткрытьСертификат + + + Auto + Auto + + + + + +
    diff --git a/SSL/src/CommonForms/ВыборСертификатаЭЦПДляПодписи/Help/ru.html b/SSL/src/CommonForms/ВыборСертификатаЭЦПДляПодписи/Help/ru.html new file mode 100644 index 000000000..d809f4b24 --- /dev/null +++ b/SSL/src/CommonForms/ВыборСертификатаЭЦПДляПодписи/Help/ru.html @@ -0,0 +1,10 @@ + +

    Установка ЭЦП

    +

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

    +

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

    +

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

    +

    Файл будет подписан с использованием указанного сертификата ЭЦП.

    +

     

    +

    См. также:

    +
    +

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

    \ 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..e757b764d --- /dev/null +++ b/SSL/src/CommonForms/ВыборСертификатаЭЦПДляПодписи/Module.bsl @@ -0,0 +1,75 @@ +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + МассивСтруктурСертификатов = Параметры.МассивСтруктурСертификатов; + + Если Параметры.Свойство("ОбъектСсылка") Тогда + ОбъектСсылка = Параметры.ОбъектСсылка; + КонецЕсли; + + Заголовок = НСтр("ru = 'Подписать ""'") + Строка(ОбъектСсылка) + """"; + + Для Каждого СтруктураСертификата Из МассивСтруктурСертификатов Цикл + НоваяСтрока = ТаблицаСертификатов.Добавить(); + + НоваяСтрока.КомуВыдан = СтруктураСертификата.КомуВыдан; + НоваяСтрока.КемВыдан = СтруктураСертификата.КемВыдан; + НоваяСтрока.ДействителенДо = СтруктураСертификата.ДействителенДо; + НоваяСтрока.Отпечаток = СтруктураСертификата.Отпечаток; + + НовоеНазначение = ""; + ОбщегоНазначения.ЗаполнитьНазначениеСертификата(СтруктураСертификата.Назначение, НовоеНазначение); + НоваяСтрока.Назначение = НовоеНазначение; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаСертификатовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + ОбработкаВыбора(); +КонецПроцедуры + +&НаКлиенте +Процедура Выбрать(Команда) + ОбработкаВыбора(); +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаВыбора() + + ТекущиеДанные = Элементы.ТаблицаСертификатов.ТекущиеДанные; + Если Не ТекущиеДанные = Неопределено Тогда + + ВозвратПароль = Пароль; + + Если ПустаяСтрока(Пароль) И НЕ ПустаяСтрока(Элементы.Пароль.ТекстРедактирования) Тогда + ВозвратПароль = Элементы.Пароль.ТекстРедактирования; + КонецЕсли; + + ВыбранныйСертификат = ЭлектронноЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ТекущиеДанные.Отпечаток); + СтруктураВозврата = Новый Структура("Сертификат, Комментарий, Пароль", + ВыбранныйСертификат, Комментарий, ВозвратПароль); + + Закрыть(СтруктураВозврата); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСертификат(Команда) + + ТекущиеДанные = Элементы.ТаблицаСертификатов.ТекущиеДанные; + Если Не ТекущиеДанные = Неопределено Тогда + + ВыбранныйСертификат = ЭлектронноЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ТекущиеДанные.Отпечаток); + + СтруктураСертификата = ЭлектронноЦифроваяПодписьКлиент.ЗаполнитьСтруктуруСертификата(ВыбранныйСертификат); + Если СтруктураСертификата <> Неопределено Тогда + ПараметрыФормы = Новый Структура("СтруктураСертификата, Отпечаток", СтруктураСертификата, ТекущиеДанные.Отпечаток); + СтруктураВозврата = ОткрытьФормуМодально("Общаяформа.ФормаСертификатаЭЦП", ПараметрыФормы); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonForms/ВыборСертификатаЭЦПДляПодписи/ВыборСертификатаЭЦПДляПодписи.mdo b/SSL/src/CommonForms/ВыборСертификатаЭЦПДляПодписи/ВыборСертификатаЭЦПДляПодписи.mdo new file mode 100644 index 000000000..3230e427f --- /dev/null +++ b/SSL/src/CommonForms/ВыборСертификатаЭЦПДляПодписи/ВыборСертификатаЭЦПДляПодписи.mdo @@ -0,0 +1,16 @@ + + + ВыборСертификатаЭЦПДляПодписи + + ru + Выбор сертификата ЭЦПДля подписи + + + + ru + + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/ВыполнениеОбменаДанными/Form.form b/SSL/src/CommonForms/ВыполнениеОбменаДанными/Form.form new file mode 100644 index 000000000..384b2a224 --- /dev/null +++ b/SSL/src/CommonForms/ВыполнениеОбменаДанными/Form.form @@ -0,0 +1,1179 @@ + + + + <key>ru</key> + <value>Обмен с информационной базой</value> + + + ВидТранспортаСообщенийОбмена + 7 + true + true + + true + + + ВидТранспортаСообщенийОбмена + + Top + + OnChange + ВидТранспортаСообщенийОбменаПриИзменении + + + ВидТранспортаСообщенийОбменаРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + ВидТранспортаСообщенийОбменаКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + false + true + true + true + true + Normal + + + + ОткрытьКаталогОбменаИнформацией + 57 + true + true + + true + + false + + ОткрытьКаталогОбменаИнформациейРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + Hyperlink + Form.Command.ОткрытьКаталогОбменаИнформацией + Normal + Auto + true + true + UserCmds + Auto + + + НастроитьПараметрыТранспортаСообщенийОбмена + 45 + true + true + + true + + false + + НастроитьПараметрыТранспортаСообщенийОбменаРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастроитьПараметрыТранспортаСообщенийОбмена + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаОсновная + 49 + + ГруппаЗагрузкиДанных + 13 + + СтраницыСтатусаЗагрузкиДанных + 23 + + СтатусЗагрузкиНеопределено + 24 + + КартинкаНеопределено + 41 + + <key>ru</key> + <value>Картинка неопределено</value> + + true + true + + true + + + КартинкаНеопределеноРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + КартинкаНеопределеноКонтекстноеМеню + 42 + true + + 2 + true + 1 + true + false + + + true + true + + true + + + <key>ru</key> + <value>Статус загрузки неопределено</value> + + + ru + Статус загрузки неопределено + + + СтатусЗагрузкиНеопределеноРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтатусЗагрузкиУспех + 25 + + КартинкаУспех + 27 + + <key>ru</key> + <value>Картинка успех</value> + + true + true + + true + + + КартинкаУспехРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + + КартинкаУспехКонтекстноеМеню + 28 + true + + 2 + true + 1 + true + false + + + CommonPicture.СостояниеОбменаДаннымиУспех + + + + true + true + + true + + + <key>ru</key> + <value>Статус загрузки успех</value> + + + ru + Статус загрузки неопределено + + + СтатусЗагрузкиУспехРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтатусЗагрузкиОшибка + 26 + + КартинкаОшибка + 29 + + <key>ru</key> + <value>Картинка ошибка</value> + + true + true + + true + + + КартинкаОшибкаРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + + КартинкаОшибкаКонтекстноеМеню + 30 + true + + 2 + true + 1 + true + false + + + CommonPicture.СостояниеОбменаДаннымиОшибка + + + + true + true + + true + + + <key>ru</key> + <value>Статус загрузки ошибка</value> + + + ru + Статус загрузки неопределено + + + СтатусЗагрузкиОшибкаРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтатусЗагрузкиПредупреждение + 54 + + КартинкаПредупреждение1 + 55 + + <key>ru</key> + <value>Картинка ошибка</value> + + true + true + + true + + + КартинкаПредупреждение1РасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + КартинкаПредупреждение1КонтекстноеМеню + 56 + true + + 2 + true + 1 + true + false + + + CommonPicture.Внимание + + + + true + true + + true + + + <key>ru</key> + <value>Статус загрузки предупреждение</value> + + + ru + Статус загрузки неопределено + + + СтатусЗагрузкиПредупреждениеРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы статуса загрузки данных</value> + + + ru + Страницы статуса загрузки данных + + + СтраницыСтатусаЗагрузкиДанныхРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + Pages + + Auto + + + + ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + 44 + + <key>ru</key> + <value>События загрузки данных</value> + + true + true + + true + + false + + ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанныхРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + Hyperlink + Form.Command.ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа загрузки данных</value> + + + ru + Группа загрузки данных + + + ГруппаЗагрузкиДанныхРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаВыгрузкиДанных + 14 + + СтраницыСтатусаВыгрузкиДанных + 31 + + СтатусВыгрузкиНеопределено + 32 + + КартинкаНеопределено1 + 39 + + <key>ru</key> + <value>Картинка неопределено</value> + + true + true + + true + + + КартинкаНеопределено1РасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + КартинкаНеопределено1КонтекстноеМеню + 40 + true + + 2 + true + 1 + true + false + + + true + true + + true + + + <key>ru</key> + <value>Статус выгрузки неопределено</value> + + + ru + Статус загрузки неопределено + + + СтатусВыгрузкиНеопределеноРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтатусВыгрузкиУспех + 33 + + КартинкаУспех1 + 34 + + <key>ru</key> + <value>Картинка успех</value> + + true + true + + true + + + КартинкаУспех1РасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + КартинкаУспех1КонтекстноеМеню + 35 + true + + 2 + true + 1 + true + false + + + CommonPicture.СостояниеОбменаДаннымиУспех + + + + true + true + + true + + + <key>ru</key> + <value>Статус выгрузки успех</value> + + + ru + Статус загрузки неопределено + + + СтатусВыгрузкиУспехРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтатусВыгрузкиОшибка + 36 + + КартинкаОшибка1 + 37 + + <key>ru</key> + <value>Картинка ошибка</value> + + true + true + + true + + + КартинкаОшибка1РасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + КартинкаОшибка1КонтекстноеМеню + 38 + true + + 2 + true + 1 + true + false + + + CommonPicture.СостояниеОбменаДаннымиОшибка + + + + true + true + + true + + + <key>ru</key> + <value>Статус выгрузки ошибка</value> + + + ru + Статус загрузки неопределено + + + СтатусВыгрузкиОшибкаРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтатусВыгрузкиПредупреждение + 51 + + КартинкаПредупреждение + 52 + + <key>ru</key> + <value>Картинка ошибка</value> + + true + true + + true + + + КартинкаПредупреждениеРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + КартинкаПредупреждениеКонтекстноеМеню + 53 + true + + 2 + true + 1 + true + false + + + CommonPicture.Внимание + + + + true + true + + true + + + <key>ru</key> + <value>Статус выгрузки предупреждение</value> + + + ru + Статус загрузки неопределено + + + СтатусВыгрузкиПредупреждениеРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы статуса выгрузки данных</value> + + + ru + Страницы статуса выгрузки данных + + + СтраницыСтатусаВыгрузкиДанныхРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + Pages + + Auto + + + + ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + 43 + + <key>ru</key> + <value>События выгрузки данных</value> + + true + true + + true + + false + + ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанныхРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + Hyperlink + Form.Command.ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа выгрузки данных</value> + + + ru + Группа загрузки данных + + + ГруппаВыгрузкиДанныхРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа основная</value> + + + ru + Группа основная + + + ГруппаОсновнаяРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ВыполнитьОбменДанными + 10 + true + true + + true + + false + + ВыполнитьОбменДаннымиРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + Form.Command.ВыполнитьОбменДанными + Auto + true + true + true + UserCmds + Auto + + + Закрыть + 50 + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + PictureAndText + true + true + UserCmds + Auto + + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + 70 + DontBlock + Use + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + 1 + + String + + + + true + + + true + +
    true
    +
    + + УзелИнформационнойБазы + + <key>ru</key> + <value>Обмен с информационной базой</value> + + 2 + + ExchangePlanRef + + + true + + + true + + + + ВидТранспортаСообщенийОбмена + + <key>ru</key> + <value>Укажите способ обмена данными</value> + + 5 + + EnumRef.ВидыТранспортаСообщенийОбмена + + + true + + + true + + + + РезультатЗагрузкиДанных + 6 + + String + + + + true + + + true + + + + РезультатВыгрузкиДанных + 7 + + String + + + + true + + + true + + + + ВыполнитьОбменДанными + + <key>ru</key> + <value>Выполнить обмен</value> + + 2 + + ru + Выполнить обмен данными + + + true + + + CommonPicture.ВыполнитьЗапускОбменаДанными + + + + ВыполнитьОбменДанными + + + TextPicture + 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 + + + CommonPicture.ПараметрыОбменаДанными + + + + НастроитьПараметрыТранспортаСообщенийОбмена + + + TextPicture + Auto + Auto + + + ОткрытьКаталогОбменаИнформацией + + <key>ru</key> + <value>Открыть каталог обмена информацией</value> + + 1 + + ru + Открыть каталог обмена информацией + + + true + + + StdPicture.OpenFile + + + + ОткрытьКаталогОбменаИнформацией + + + TextPicture + Auto + Auto + + + + + +
    diff --git a/SSL/src/CommonForms/ВыполнениеОбменаДанными/Help/ru.html b/SSL/src/CommonForms/ВыполнениеОбменаДанными/Help/ru.html new file mode 100644 index 000000000..899282225 --- /dev/null +++ b/SSL/src/CommonForms/ВыполнениеОбменаДанными/Help/ru.html @@ -0,0 +1,5 @@ + +

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

    +

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

    +

    По гиперссылке «Настроить параметры транспорта сообщений обмена» открывается форма для задания и проверки параметров транспорта сообщений обмена.

    +

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

    \ 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..f9f3de246 --- /dev/null +++ b/SSL/src/CommonForms/ВыполнениеОбменаДанными/Module.bsl @@ -0,0 +1,255 @@ +&НаКлиенте +Перем ПолеСтраницыСтатусаЗагрузкиДанных; + +&НаКлиенте +Перем ПолеСтраницыСтатусаВыгрузкиДанных; + +&НаКлиенте +Перем ПолеЗаголовкиГиперссылокЗагрузкиДанных; + +&НаКлиенте +Перем ПолеЗаголовкиГиперссылокВыгрузкиДанных; + +&НаКлиенте +Перем ПолеОтказ; + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УзелИнформационнойБазы = Параметры.УзелИнформационнойБазы; + + Если Не ЗначениеЗаполнено(УзелИнформационнойБазы) Тогда + ОбменДаннымиСервер.СообщитьОбОшибке(НСтр("ru = 'Не заданы параметры формы. Форма не может быть открыта.'"), Отказ); + Возврат; + КонецЕсли; + + // получаем вид транспорта сообщений обмена по умолчанию для узла; + // если значение по умолчанию не задано, то устанавливаем значение FILE + ВидТранспортаСообщенийОбмена = РегистрыСведений.НастройкиТранспортаОбмена.ВидТранспортаСообщенийОбменаПоУмолчанию(УзелИнформационнойБазы); + Если Не ЗначениеЗаполнено(ВидТранспортаСообщенийОбмена) Тогда + ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FILE; + КонецЕсли; + + ОбменДаннымиСервер.ЗаполнитьСписокВыбораДоступнымиВидамиТранспорта(УзелИнформационнойБазы, Элементы.ВидТранспортаСообщенийОбмена); + + ПолучитьСостояниеОбменовДанными(); + + // устанавливаем заголовок формы + Заголовок = НСтр("ru = 'Обмен с информационной базой: [УзелИнформационнойБазы]'"); + Заголовок = СтрЗаменить(Заголовок, "[УзелИнформационнойБазы]", Строка(УзелИнформационнойБазы)); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ОбновитьОтображениеЭлементовФормы(); + + УстановитьДоступностьКнопкиОткрытияКаталогаОбмена(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ВыполнитьОбменДанными(Команда) + + ПолеОтказ = Ложь; + + // выполняем загрузку данных + ПодключитьОбработчикОжидания("ВыполнитьЗагрузкуДанныхНаКлиенте", 0.1, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных(Команда) + + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(УзелИнформационнойБазы, ЭтаФорма, "ВыгрузкаДанных"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных(Команда) + + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(УзелИнформационнойБазы, ЭтаФорма, "ЗагрузкаДанных"); + +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьПараметрыТранспортаСообщенийОбмена(Команда) + + Отбор = Новый Структура("Узел", УзелИнформационнойБазы); + ЗначенияЗаполнения = Новый Структура("Узел", УзелИнформационнойБазы); + + ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, ЗначенияЗаполнения, "НастройкиТранспортаОбмена", ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКаталогОбменаИнформацией(Команда) + + // Вызов сервера без контекста + ИмяКаталога = ПолучитьИмяКаталогаНаСервере(ВидТранспортаСообщенийОбмена, УзелИнформационнойБазы); + + Если ПустаяСтрока(ИмяКаталога) Тогда + Предупреждение(НСтр("ru = 'Каталог обмена информацией не задан!'")); + Возврат; + КонецЕсли; + + // открываем каталог в приложении explorer + ЗапуститьПриложение(ИмяКаталога); + +КонецПроцедуры + +&НаКлиенте +Процедура ВидТранспортаСообщенийОбменаПриИзменении(Элемент) + + УстановитьДоступностьКнопкиОткрытияКаталогаОбмена(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ПолучитьСостояниеОбменовДанными() + + СостояниеОбменовДанными = РегистрыСведений.СостояниеОбменовДанными.СостояниеОбменовДаннымиДляУзлаИнформационнойБазы(УзелИнформационнойБазы); + + ЗаполнитьЗначенияСвойств(ЭтаФорма, СостояниеОбменовДанными, "РезультатЗагрузкиДанных, РезультатВыгрузкиДанных"); + +КонецПроцедуры + +&НаСервере +Процедура ВыполнитьЗагрузкуДанныхНаСервере(Отказ) + + // запускаем выполнение обмена + ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, Истина, Ложь, ВидТранспортаСообщенийОбмена); + + // обновляем данные формы + ПолучитьСостояниеОбменовДанными(); + +КонецПроцедуры + +&НаСервере +Процедура ВыполнитьВыгрузкуДанныхНаСервере(Отказ) + + // запускаем выполнение обмена + ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, Ложь, Истина, ВидТранспортаСообщенийОбмена); + + // обновляем данные формы + ПолучитьСостояниеОбменовДанными(); + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьИмяКаталогаНаСервере(ВидТранспортаСообщенийОбмена, УзелИнформационнойБазы) + + Возврат РегистрыСведений.НастройкиТранспортаОбмена.ИмяКаталогаОбменаИнформацией(ВидТранспортаСообщенийОбмена, УзелИнформационнойБазы); + +КонецФункции + +&НаКлиенте +Процедура ОбновитьОтображениеЭлементовФормы() + + Элементы.СтраницыСтатусаЗагрузкиДанных.ТекущаяСтраница = Элементы[СтраницыСтатусаЗагрузкиДанных()[РезультатЗагрузкиДанных]]; + Элементы.СтраницыСтатусаВыгрузкиДанных.ТекущаяСтраница = Элементы[СтраницыСтатусаВыгрузкиДанных()[РезультатВыгрузкиДанных]]; + + Элементы.ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных.Заголовок = ЗаголовкиГиперссылокЗагрузкиДанных()[РезультатЗагрузкиДанных]; + Элементы.ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных.Заголовок = ЗаголовкиГиперссылокВыгрузкиДанных()[РезультатВыгрузкиДанных]; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьЗагрузкуДанныхНаКлиенте() + + Состояние(НСтр("ru = 'Выполняется загрузка данных...'")); + + // выполняем загрузку данных + ВыполнитьЗагрузкуДанныхНаСервере(ПолеОтказ); + + ОбновитьОтображениеЭлементовФормы(); + + Оповестить("ВыполненОбменДанными"); + + // выполняем выгрузку данных + ПодключитьОбработчикОжидания("ВыполнитьВыгрузкуДанныхНаКлиенте", 0.1, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьВыгрузкуДанныхНаКлиенте() + + Состояние(НСтр("ru = 'Выполняется выгрузка данных...'")); + + // выполняем выгрузку данных + ВыполнитьВыгрузкуДанныхНаСервере(ПолеОтказ); + + ОбновитьОтображениеЭлементовФормы(); + + Оповестить("ВыполненОбменДанными"); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьКнопкиОткрытияКаталогаОбмена() + + Элементы.ОткрытьКаталогОбменаИнформацией.Доступность = Не (ВидТранспортаСообщенийОбмена = ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.EMAIL")); + +КонецПроцедуры + +// + +&НаКлиенте +Функция СтраницыСтатусаЗагрузкиДанных() + + Если ТипЗнч(ПолеСтраницыСтатусаЗагрузкиДанных) <> Тип("Структура") Тогда + + ПолеСтраницыСтатусаЗагрузкиДанных = ОбменДаннымиКлиент.СтраницыСтатусаЗагрузкиДанных(); + + КонецЕсли; + + Возврат ПолеСтраницыСтатусаЗагрузкиДанных; + +КонецФункции + +&НаКлиенте +Функция СтраницыСтатусаВыгрузкиДанных() + + Если ТипЗнч(ПолеСтраницыСтатусаВыгрузкиДанных) <> Тип("Структура") Тогда + + ПолеСтраницыСтатусаВыгрузкиДанных = ОбменДаннымиКлиент.СтраницыСтатусаВыгрузкиДанных(); + + КонецЕсли; + + Возврат ПолеСтраницыСтатусаВыгрузкиДанных; +КонецФункции + +&НаКлиенте +Функция ЗаголовкиГиперссылокЗагрузкиДанных() + + Если ТипЗнч(ПолеЗаголовкиГиперссылокЗагрузкиДанных) <> Тип("Структура") Тогда + + ПолеЗаголовкиГиперссылокЗагрузкиДанных = ОбменДаннымиКлиент.ЗаголовкиГиперссылокЗагрузкиДанных(); + + КонецЕсли; + + Возврат ПолеЗаголовкиГиперссылокЗагрузкиДанных; + +КонецФункции + +&НаКлиенте +Функция ЗаголовкиГиперссылокВыгрузкиДанных() + + Если ТипЗнч(ПолеЗаголовкиГиперссылокВыгрузкиДанных) <> Тип("Структура") Тогда + + ПолеЗаголовкиГиперссылокВыгрузкиДанных = ОбменДаннымиКлиент.ЗаголовкиГиперссылокВыгрузкиДанных(); + + КонецЕсли; + + Возврат ПолеЗаголовкиГиперссылокВыгрузкиДанных; +КонецФункции diff --git a/SSL/src/CommonForms/ВыполнениеОбменаДанными/ВыполнениеОбменаДанными.mdo b/SSL/src/CommonForms/ВыполнениеОбменаДанными/ВыполнениеОбменаДанными.mdo new file mode 100644 index 000000000..3f77482ac --- /dev/null +++ b/SSL/src/CommonForms/ВыполнениеОбменаДанными/ВыполнениеОбменаДанными.mdo @@ -0,0 +1,15 @@ + + + ВыполнениеОбменаДанными + + ru + Выполнение обмена данными + + + + ru + + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form new file mode 100644 index 000000000..37d893f09 --- /dev/null +++ b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form @@ -0,0 +1,655 @@ + + + + Обработки + 15 + true + true + + true + + + Обработки + + false + None + Add + Change + Copy + Delete + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + ОбработкиПредставление + 26 + true + true + + true + + + Обработки.Представление + + + ОбработкиПредставлениеРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ОбработкиПредставлениеКонтекстноеМеню + 27 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + ОбработкиКоманднаяПанель + 17 + Left + true + + + Selection + ОбработкиВыбор + + + ОбработкиСтрокаПоиска + 39 + + ОбработкиСтрокаПоискаРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ОбработкиСтрокаПоискаКонтекстноеМеню + 40 + true + + Обработки + + true + + + + ОбработкиСостояниеПросмотра + 42 + + ОбработкиСостояниеПросмотраРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ОбработкиСостояниеПросмотраКонтекстноеМеню + 43 + true + + ViewStatusAddition + Обработки + + true + + + + ОбработкиУправлениеПоиском + 45 + + ОбработкиУправлениеПоискомРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ОбработкиУправлениеПоискомКонтекстноеМеню + 46 + true + + SearchControlAddition + Обработки + + true + + + + ОбработкиРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ОбработкиКонтекстноеМеню + 16 + true + + true + true + true + true + true + true + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + + + + НастроитьСписокБыстрогоДоступа + 35 + true + true + + true + + false + + НастроитьСписокБыстрогоДоступаРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастроитьСписокБыстрогоДоступа + Normal + Auto + true + true + UserCmds + Auto + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ВыполнитьОбработку + 28 + true + true + + true + + true + false + + ВыполнитьОбработкуРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.Command.ВыполнитьОбработку + Auto + true + true + true + UserCmds + Auto + + + Отмена + 29 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + 80 + 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 + + CatalogRef.ДополнительныеОтчетыИОбработки + + + 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 + + String + + + + true + + + true + + + + ВариантЗапуска + + <key>ru</key> + <value>Вариант запуска</value> + + 5 + + String + + + + true + + + true + + + + ПоказыватьОповещение + + <key>ru</key> + <value>Показывать оповещение</value> + + 6 + + Boolean + + + true + + + true + + + + Модификатор + + <key>ru</key> + <value>Модификатор</value> + + 7 + + String + + + + true + + + true + + + + + ОбъектыНазначения + + <key>ru</key> + <value>Объекты назначения</value> + + 2 + + ValueList + + + true + + + true + + + + + + + ВидОбработок + + <key>ru</key> + <value>Вид обработок</value> + + 3 + + EnumRef.ВидыДополнительныхОтчетовИОбработок + + + true + + + true + + + + ВидОбработокСтрока + + <key>ru</key> + <value>Вид обработок строка</value> + + 10 + + String + + + + true + + + true + + + + ЭтоГлобальныеОбработки + + <key>ru</key> + <value>Это глобальные обработки</value> + + 4 + + Boolean + + + true + + + true + + + + ЭтоНазначаемыеОбработки + + <key>ru</key> + <value>Это назначаемые обработки</value> + + 6 + + Boolean + + + 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> + + 5 + + Boolean + + + true + + + true + + + + ВыполнитьОбработку + + <key>ru</key> + <value>Выполнить</value> + + 4 + + ru + Выполнить обработку + + + true + + + StdPicture.GenerateReport + + + + ВыполнитьОбработку + + + TextPicture + Auto + Auto + + + НастроитьСписокБыстрогоДоступа + + <key>ru</key> + <value>Настроить список моих отчетов и обработок</value> + + 1 + + ru + Настроить список быстрого доступа + + + true + + + + Настроить + + + Auto + Auto + + + ОбъектыНазначения + + ValueList + + + + Вид + + String + + + + + ИмяРаздела + + String + + + + + ИмяФормы + + String + + + + + + + + diff --git a/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Module.bsl b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Module.bsl new file mode 100644 index 000000000..74f8c885e --- /dev/null +++ b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Module.bsl @@ -0,0 +1,210 @@ +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ИмяРаздела = Параметры.ИмяРаздела; + + ВидОбработокСтрока = Параметры.Вид; + + Если ВидОбработокСтрока = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта() Тогда + Заголовок = НСтр("ru = 'Команды заполнения объектов'"); + ИначеЕсли ВидОбработокСтрока = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет() Тогда + Заголовок = НСтр("ru = 'Отчеты'"); + ИначеЕсли ВидОбработокСтрока = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма() Тогда + Заголовок = НСтр("ru = 'Дополнительные печатные формы'"); + ИначеЕсли ВидОбработокСтрока = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиСозданиеСвязанныхОбъектов() Тогда + Заголовок = НСтр("ru = 'Команды создания связанных объектов'"); + ИначеЕсли ВидОбработокСтрока = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка() Тогда + Заголовок = НСтр("ru = 'Дополнительные обработки ('") + ДополнительныеОтчетыИОбработки.ПолучитьИмяРабочегоМеста(ИмяРаздела) + ")"; + ИначеЕсли ВидОбработокСтрока = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет()Тогда + Заголовок = НСтр("ru = 'Дополнительные отчеты ('") + ДополнительныеОтчетыИОбработки.ПолучитьИмяРабочегоМеста(ИмяРаздела) + ")"; + КонецЕсли; + + ВидОбработок = ДополнительныеОтчетыИОбработки.ПолучитьВидОбработкиПоСтроковомуПредставлениюВида(ВидОбработокСтрока); + + Если ВидОбработок = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет + ИЛИ ВидОбработок = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет Тогда + Элементы.НастроитьСписокБыстрогоДоступа.Заголовок = НСтр("ru = 'Настроить список моих отчетов'"); + Иначе + Элементы.НастроитьСписокБыстрогоДоступа.Заголовок = НСтр("ru = 'Настроить список моих обработок'"); + КонецЕсли; + + ЭтоГлобальныеОбработки = ДополнительныеОтчетыИОбработки.ПроверитьГлобальнаяОбработка(ВидОбработок); + + ЭтоНазначаемыеОбработки = ДополнительныеОтчетыИОбработки.ПроверитьНазначаемаяОбработка(ВидОбработок); + + Если ЭтоНазначаемыеОбработки Тогда + + Элементы.НастроитьСписокБыстрогоДоступа.Видимость = Ложь; + + ОбъектыНазначения.ЗагрузитьЗначения(Параметры.ОбъектыНазначения.ВыгрузитьЗначения()); + ОбНазначенияСсылка = ОбъектыНазначения.Получить(0).Значение; + МетаданныеОбНазначения = ОбъектыНазначения.Получить(0).Значение.Метаданные(); + + ПолноеИмяОбъектаМетаданных = МетаданныеОбНазначения.ПолноеИмя(); + + ЭтоФормаОбъекта = ДополнительныеОтчетыИОбработки.ЭтоФормаОбъекта(ПолноеИмяОбъектаМетаданных, Параметры.ИмяФормы); + + КонецЕсли; + + ЗаполнитьТаблицуОбработок(); + +КонецПроцедуры + +&НаСервере +Функция ПолучитьДоступныеКоманды(ЭтоНазначаемыеОбработки) + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + + ТекстЗапроса = " + |ВЫБРАТЬ + | ДополнительныеОтчетыИОбработкиКоманды.Представление КАК Представление, + | ДополнительныеОтчетыИОбработкиКоманды.Идентификатор КАК Идентификатор, + | ДополнительныеОтчетыИОбработкиКоманды.ПоказыватьОповещение КАК ПоказыватьОповещение, + | ДополнительныеОтчетыИОбработкиКоманды.Модификатор КАК Модификатор, + | ВЫБОР + | КОГДА ДополнительныеОтчетыИОбработкиКоманды.ВариантЗапуска = ЗНАЧЕНИЕ(Перечисление.СпособыВызоваДополнительныхОбработок.ВызовКлиентскогоМетода) + | ТОГДА ""ВызовКлиентскогоМетода"" + | КОГДА ДополнительныеОтчетыИОбработкиКоманды.ВариантЗапуска = ЗНАЧЕНИЕ(Перечисление.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода) + | ТОГДА ""ВызовСерверногоМетода"" + | КОГДА ДополнительныеОтчетыИОбработкиКоманды.ВариантЗапуска = ЗНАЧЕНИЕ(Перечисление.СпособыВызоваДополнительныхОбработок.ОткрытиеФормы) + | ТОГДА ""ОткрытиеФормы"" + | КОНЕЦ КАК ВариантЗапуска, + | ДополнительныеОтчетыИОбработки.Ссылка КАК Ссылка, + | ДополнительныеОтчетыИОбработки.БезопасныйРежим КАК БезопасныйРежим + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки + | СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Команды КАК ДополнительныеОтчетыИОбработкиКоманды + | ПО ДополнительныеОтчетыИОбработкиКоманды.Ссылка = ДополнительныеОтчетыИОбработки.Ссылка"; + + Если ЭтоНазначаемыеОбработки Тогда + ТекстЗапроса = ТекстЗапроса + " + | СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Назначение КАК ДополнительныеОтчетыИОбработкиНазначение + | ПО ДополнительныеОтчетыИОбработкиНазначение.Ссылка = ДополнительныеОтчетыИОбработки.Ссылка"; + Иначе + ТекстЗапроса = ТекстЗапроса + " + | СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Разделы КАК ДополнительныеОтчетыИОбработкиРазделы + | ПО ДополнительныеОтчетыИОбработкиРазделы.Ссылка = ДополнительныеОтчетыИОбработки.Ссылка + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПользовательскиеНастройкиДоступаКОбработкам КАК ПользовательскиеНастройкиДоступаКОбработкам + | ПО ПользовательскиеНастройкиДоступаКОбработкам.ДополнительныйОтчетИлиОбработка = ДополнительныеОтчетыИОбработки.Ссылка + | И ПользовательскиеНастройкиДоступаКОбработкам.ИдентификаторКоманды = ДополнительныеОтчетыИОбработкиКоманды.Идентификатор + | И ПользовательскиеНастройкиДоступаКОбработкам.Пользователь = &Пользователь"; + Запрос.Параметры.Вставить("Пользователь", ОбщегоНазначения.ТекущийПользователь()); + КонецЕсли; + + ////////////////////////// + // блок наложения фильтров + + ТекстЗапроса = ТекстЗапроса + " + |ГДЕ + | ДополнительныеОтчетыИОбработки.Вид = &ВидОбработок + | И НЕ ДополнительныеОтчетыИОбработки.ПометкаУдаления + | И ( + | ДополнительныеОтчетыИОбработки.Публикация = ЗНАЧЕНИЕ(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется)"; + + Если РольДоступна(Метаданные.Роли.ДобавлениеИзменениеДополнительныхОтчетовИОбработок) + ИЛИ РольДоступна(Метаданные.Роли.ПолныеПрава) Тогда + ТекстЗапроса = ТекстЗапроса + " + | ИЛИ ДополнительныеОтчетыИОбработки.Публикация = ЗНАЧЕНИЕ(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.РежимОтладки)"; + КонецЕсли; + + ТекстЗапроса = ТекстЗапроса + " + | )"; + + Если ЭтоНазначаемыеОбработки Тогда + ТекстЗапроса = ТекстЗапроса + " + | И ДополнительныеОтчетыИОбработкиНазначение.ПолноеИмяОбъектаМетаданных ПОДОБНО &ПолноеИмяОбъектаМетаданных"; + + Запрос.Параметры.Вставить("ПолноеИмяОбъектаМетаданных", ПолноеИмяОбъектаМетаданных); + + Если ЭтоФормаОбъекта Тогда + ТекстЗапроса = ТекстЗапроса + " + | И ДополнительныеОтчетыИОбработки.ИспользоватьДляФормыОбъекта"; + Иначе + ТекстЗапроса = ТекстЗапроса + " + | И ДополнительныеОтчетыИОбработки.ИспользоватьДляФормыСписка"; + КонецЕсли; + + Иначе + ТекстЗапроса = ТекстЗапроса + " + | И ДополнительныеОтчетыИОбработкиРазделы.ИмяРаздела = &ИмяРаздела + | И ПользовательскиеНастройкиДоступаКОбработкам.Доступно"; + Запрос.Параметры.Вставить("ИмяРаздела", ИмяРаздела); + КонецЕсли; + + Запрос.Текст = ТекстЗапроса; + + Запрос.Параметры.Вставить("ВидОбработок", ВидОбработок); + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +&НаКлиенте +Процедура ОбработкиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ВыполнитьОбработкуПоПараметрам(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьОбработку(Команда) + + ВыполнитьОбработкуПоПараметрам() + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьОбработкуПоПараметрам() + + ТекущиеДанные = Элементы.Обработки.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ЭтоГлобальныеОбработки Тогда + ОбъектыНазначенияМассив = Неопределено; + Иначе + ОбъектыНазначенияМассив = ОбъектыНазначения.ВыгрузитьЗначения(); + КонецЕсли; + + ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьОбработку( + ТекущиеДанные.Ссылка, + ВидОбработокСтрока, + ТекущиеДанные.Идентификатор, + ТекущиеДанные.БезопасныйРежим, + ТекущиеДанные.ВариантЗапуска, + ТекущиеДанные.ПоказыватьОповещение, + ТекущиеДанные.Модификатор, + ОбъектыНазначенияМассив); + + Закрыть(); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьТаблицуОбработок() + + ЗначениеВРеквизитФормы(ПолучитьДоступныеКоманды(ЭтоНазначаемыеОбработки), "Обработки"); + +КонецПроцедуры + +&НаКлиенте +Процедура Настроить(Команда) + + Результат = ОткрытьФормуМодально("ОбщаяФорма.НастройкаМоихОтчетовИОбработок", + Новый Структура("ВидОбработок,ЭтоГлобальныеОбработки,ТекущийРаздел", + ВидОбработок, + ЭтоГлобальныеОбработки, + ИмяРаздела + ) ); + + Если ТипЗнч(Результат) = Тип("Булево") Тогда + ЗаполнитьТаблицуОбработок(); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo new file mode 100644 index 000000000..d528fd25d --- /dev/null +++ b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo @@ -0,0 +1,10 @@ + + + ДополнительныеОтчетыИОбработки + + ru + Дополнительные отчеты и обработки + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonForms/МастерАнкетыПоРазделам/ConditionalAppearance.dcssca b/SSL/src/CommonForms/МастерАнкетыПоРазделам/ConditionalAppearance.dcssca new file mode 100644 index 000000000..30535e63b --- /dev/null +++ b/SSL/src/CommonForms/МастерАнкетыПоРазделам/ConditionalAppearance.dcssca @@ -0,0 +1,23 @@ + + + + + + Поле + + + + + 1 + Equal + 1 + + + + + ЦветФона + style:FormBackColor + + + + diff --git a/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form b/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form new file mode 100644 index 000000000..fa050210e --- /dev/null +++ b/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form @@ -0,0 +1,2226 @@ + + + + ГруппаКнопкиШапка + 69 + + СкрытьПоказатьДеревоРазделов + 68 + + <key>ru</key> + <value>Показать разделы:</value> + + true + true + + true + + false + + СкрытьПоказатьДеревоРазделовРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + UsualButton + Form.Command.СкрытьПоказатьДеревоРазделов + Normal + Auto + true + true + UserCmds + Auto + + + ДекорацияКнопкиШапка + 70 + true + true + + true + + + ДекорацияКнопкиШапкаРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + + ДекорацияКнопкиШапкаКонтекстноеМеню + 71 + true + + Label + true + true + true + false + + Left + + + + ПредыдущийРаздел + 72 + + <key>ru</key> + <value><< Назад</value> + + true + true + + true + + false + + ПредыдущийРазделРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + UsualButton + Form.Command.ПредыдущийРаздел + Normal + Auto + true + true + UserCmds + Auto + + + СледующийРаздел + 73 + + <key>ru</key> + <value>Далее >></value> + + true + true + + true + + false + + СледующийРазделРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + UsualButton + Form.Command.СледующийРаздел + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ГруппаКнопкиШапкаРасширеннаяПодсказка + 96 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ДеревоФормаЗаполнения + 48 + + ГруппаДеревоРазделов + 50 + + ДеревоРазделов + 53 + true + true + + true + + + ДеревоРазделов + + false + None + Add + Change + Copy + Delete + EndEdit + HierarchicalList + List + MoveDown + MoveUp + OutputList + SortListAsc + SortListDesc + Tree + + ГруппаПолныйКодНаименование + 62 + + ДеревоРазделовНаименование + 56 + + <key>ru</key> + <value>Раздел</value> + + true + true + + true + + + ДеревоРазделов.Формулировка + + Top + + ДеревоРазделовНаименованиеРасширеннаяПодсказка + 116 + Label + true + true + + Left + + + + ДеревоРазделовНаименованиеКонтекстноеМеню + 57 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Раздел</value> + + + ru + Раздел + + + ГруппаПолныйКодНаименованиеРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + ДеревоРазделовКоманднаяПанель + 55 + Left + + + Selection + ДеревоРазделовВыбор + + + ДеревоРазделовСтрокаПоиска + 106 + + ДеревоРазделовСтрокаПоискаРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + + ДеревоРазделовСтрокаПоискаКонтекстноеМеню + 107 + true + + ДеревоРазделов + + true + + + + ДеревоРазделовСостояниеПросмотра + 109 + + ДеревоРазделовСостояниеПросмотраРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + + ДеревоРазделовСостояниеПросмотраКонтекстноеМеню + 110 + true + + ViewStatusAddition + ДеревоРазделов + + true + + + + ДеревоРазделовУправлениеПоиском + 112 + + ДеревоРазделовУправлениеПоискомРасширеннаяПодсказка + 114 + Label + true + true + + Left + + + + ДеревоРазделовУправлениеПоискомКонтекстноеМеню + 113 + true + + SearchControlAddition + ДеревоРазделов + + true + + + + ДеревоРазделовРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + ДеревоРазделовКонтекстноеМеню + 54 + + КонтекстноеМенюДеревоРазделовВыборРаздела + 75 + + <key>ru</key> + <value>Перейти</value> + + true + true + + true + + false + + КонтекстноеМенюДеревоРазделовВыборРазделаРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + Form.Command.ВыборРаздела + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюДеревоРазделовКопировать + 76 + true + true + + true + + false + + КонтекстноеМенюДеревоРазделовКопироватьРасширеннаяПодсказка + 104 + Label + true + true + + Left + + + Form.Item.ДеревоРазделов.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + + + Tree + true + true + true + true + Row + 1 + 1 + UseAlways + AutoUse + true + true + false + false + true + Auto + Auto + ExpandAllLevels + true + true + + ДеревоРазделов.КодКартинки + + + CommonPicture.КоллекцияКартинокДеревоАнкеты + + None + None + None + true + + true + true + + true + + + <key>ru</key> + <value>Группа дерево разделов</value> + + 25 + true + + ГруппаДеревоРазделовРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаСтраницыФормаЗаполнения + 78 + + СтраницаОжидание + 79 + + ГруппаОжиданиеОтступ + 86 + + ДекорацияОжиданиеОтступ + 88 + true + true + + true + + + ДекорацияОжиданиеОтступРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + + ДекорацияОжиданиеОтступКонтекстноеМеню + 89 + true + + Label + true + 5 + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа ожидание отступ</value> + + + ru + Группа ожидание отступ + + + ГруппаОжиданиеОтступРасширеннаяПодсказка + 128 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаОжиданиеЭлементы + 87 + + ДекорацияОжиданиеЭлементы + 80 + + <key>ru</key> + <value>Декорация ожидание элементы</value> + + true + true + + true + + + ДекорацияОжиданиеЭлементыРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + + ДекорацияОжиданиеЭлементыКонтекстноеМеню + 81 + true + + 20 + true + true + false + + + + КартинкаДлительныйПроцесс + 82 + true + true + + true + + + КартинкаДлительныйПроцессРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + + КартинкаДлительныйПроцессКонтекстноеМеню + 83 + true + + 5 + true + 2 + true + false + false + + + CommonPicture.Информация32 + + + + + НадписьПодождите + 84 + + <key>ru</key> + <value>Подождите пожалуйста…. +Открывается раздел анкеты</value> + + true + true + + true + + + НадписьПодождитеРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + + НадписьПодождитеКонтекстноеМеню + 85 + true + + Label + 20 + true + 2 + true + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Группа ожидание элементы</value> + + + ru + Группа ожидание элементы + + + ГруппаОжиданиеЭлементыРасширеннаяПодсказка + 130 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница ожидание</value> + + + ru + Страница ожидание + + false + false + + СтраницаОжиданиеРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ГруппаТелоАнкеты + 64 + + НадписьВступление + 66 + true + true + + true + + + НадписьВступлениеРасширеннаяПодсказка + 135 + Label + true + true + + Left + + + + НадписьВступлениеКонтекстноеМеню + 67 + true + + Label + true + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа тело анкеты</value> + + + ru + Группа тело анкеты + + true + + ГруппаТелоАнкетыРасширеннаяПодсказка + 134 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Группа страницы форма заполнения</value> + + + ГруппаСтраницыФормаЗаполненияРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Дерево форма заполнения</value> + + + ru + Дерево форма заполнения + + + ДеревоФормаЗаполненияРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + LeftNarrowest + Auto + Auto + + + + ГруппаКнопкиПодвал + 90 + + ДекорацияКнопкиПодвал + 91 + true + true + + true + + + ДекорацияКнопкиПодвалРасширеннаяПодсказка + 137 + Label + true + true + + Left + + + + ДекорацияКнопкиПодвалКонтекстноеМеню + 92 + true + + Label + true + true + true + false + + Left + + + + ПредыдущийРазделПодвал + 93 + + <key>ru</key> + <value> << Назад </value> + + true + true + + true + + false + + ПредыдущийРазделПодвалРасширеннаяПодсказка + 138 + Label + true + true + + Left + + + UsualButton + Form.Command.ПредыдущийРаздел + Normal + Auto + true + true + UserCmds + Auto + + + СледующийРазделПодвал + 94 + + <key>ru</key> + <value>Далее >></value> + + true + true + + true + + false + + СледующийРазделПодвалРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + UsualButton + Form.Command.СледующийРаздел + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа кнопки подвал</value> + + + ГруппаКнопкиПодвалРасширеннаяПодсказка + 136 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + Top + true + + ФормаКоманднаяПанель + -1 + + Закрыть + 77 + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + Auto + true + true + UserCmds + Auto + + Left + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ШаблонАнкеты + + <key>ru</key> + <value>Шаблон анкеты</value> + + 1 + + CatalogRef.ШаблоныАнкет + + + true + + + true + + + + ТаблицаВопросовРаздела + + <key>ru</key> + <value>Таблица вопросов раздела</value> + + 3 + + ValueTable + + + true + + + true + + + Наименование + + <key>ru</key> + <value>Наименование</value> + + 2 + + String + + 150 + + + + true + + + true + + + + ЭлементарныйВопрос + + <key>ru</key> + <value>Элементарный вопрос</value> + + 5 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + Обязательный + + <key>ru</key> + <value>Обязательный</value> + + 6 + + Boolean + + + true + + + true + + + + ТипВопроса + + <key>ru</key> + <value>Тип вопроса</value> + + 7 + + EnumRef.ТипыВопросовШаблонаАнкеты + + + true + + + true + + + + ТипОтвета + + <key>ru</key> + <value>Тип ответа</value> + + 8 + + EnumRef.ТипыОтветовНаВопрос + + + true + + + true + + + + ТипТабличногоВопроса + + <key>ru</key> + <value>Тип табличного вопроса</value> + + 4 + + EnumRef.ТипыТабличныхВопросов + + + true + + + true + + + + СоставТабличногоВопроса + + <key>ru</key> + <value>Состав табличного вопроса</value> + + 9 + + ValueTable + + + true + + + true + + + + ПредопределенныеОтветы + + <key>ru</key> + <value>Предопределенные ответы</value> + + 10 + + ValueTable + + + true + + + true + + + + КлючСтроки + + <key>ru</key> + <value>Ключ строки</value> + + 11 + + UUID + + + true + + + true + + + + Длина + + <key>ru</key> + <value>Длина</value> + + 12 + + Number + + 10 + true + + + + true + + + true + + + + МаксимальноеЗначение + + <key>ru</key> + <value>Максимальное значение</value> + + 13 + + Number + + 15 + + + + true + + + true + + + + МинимальноеЗначение + + <key>ru</key> + <value>Минимальное значение</value> + + 14 + + Number + + 15 + + + + true + + + true + + + + ТипЗначения + + <key>ru</key> + <value>Тип значения</value> + + 15 + + TypeDescription + + + true + + + true + + + + ТребуетсяКомментарий + + <key>ru</key> + <value>Требуется комментарий</value> + + 16 + + Boolean + + + true + + + true + + + + ПояснениеКомментария + + <key>ru</key> + <value>Пояснение комментария</value> + + 17 + + String + + 150 + + + + true + + + true + + + + ВопросШаблона + + <key>ru</key> + <value>Вопрос шаблона</value> + + 18 + + CatalogRef.ВопросыШаблонаАнкеты + + + true + + + true + + + + ПолныйКод + + <key>ru</key> + <value>Полный код</value> + + 19 + + String + + 100 + + + + true + + + true + + + + Формулировка + + <key>ru</key> + <value>Формулировка</value> + + 20 + + String + + 300 + + + + true + + + true + + + + Точность + + <key>ru</key> + <value>Точность</value> + + 21 + + Number + + 1 + + + + true + + + true + + + + ВысотаЭлементаФормулировкиВопроса + + <key>ru</key> + <value>Высота элемента формулировки вопроса</value> + + 22 + + Number + + 2 + true + + + + true + + + true + + + + ТипСтроки + + <key>ru</key> + <value>Тип строки</value> + + 1 + + String + + 10 + + + + true + + + true + + + + РодительВопрос + + <key>ru</key> + <value>Родитель вопрос</value> + + 3 + + CatalogRef.ВопросыШаблонаАнкеты + + + true + + + true + + + + + ТаблицаВопросовРаздела.СоставТабличногоВопроса + + + ЭлементарныйВопрос + + <key>ru</key> + <value>Элементарный вопрос</value> + + 1 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + НомерСтроки + + <key>ru</key> + <value>Номер строки</value> + + 2 + + Number + + 10 + + + + true + + + true + + + + + + ТаблицаВопросовРаздела.ПредопределенныеОтветы + + + Ответ + + <key>ru</key> + <value>Ответ</value> + + 1 + + Characteristic.ВопросыДляАнкетирования + + + true + + + true + + + + ЭлементарныйВопрос + + <key>ru</key> + <value>Элементарный вопрос</value> + + 2 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + НомерСтроки + + <key>ru</key> + <value>Номер строки</value> + + 3 + + Number + + 10 + + + + true + + + true + + + + + + ПодчиненныеВопросы + + <key>ru</key> + <value>Подчиненные вопросы</value> + + 2 + + ValueTable + + + true + + + true + + + Вопрос + + <key>ru</key> + <value>Вопрос</value> + + 1 + + String + + 36 + + + + true + + + true + + + + Подчиненные + + <key>ru</key> + <value>Подчиненные</value> + + 2 + + 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> + + 4 + + ValueTable + + + true + + + true + + + Вопрос + + <key>ru</key> + <value>Вопрос</value> + + 1 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + Ответ + + <key>ru</key> + <value>Ответ</value> + + 2 + + CatalogRef.ВариантыОтветовАнкет + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Представление</value> + + 3 + + String + + 150 + + + + true + + + true + + + + ТребуетОткрытогоОтвета + + <key>ru</key> + <value>Требует открытого ответа</value> + + 4 + + Boolean + + + true + + + true + + + + + ДобавленныеДинамическиРеквизиты + + <key>ru</key> + <value>Добавленные динамически реквизиты</value> + + 5 + + ValueList + + + true + + + true + + + + String + + + + + + ВопросыПредставлениеТипы + + <key>ru</key> + <value>Вопросы представление типы</value> + + 6 + + ValueTable + + + true + + + true + + + Вопрос + + <key>ru</key> + <value>Вопрос</value> + + 1 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + Формулировка + + <key>ru</key> + <value>Формулировка</value> + + 2 + + String + + 500 + + + + true + + + true + + + + Тип + + <key>ru</key> + <value>Тип</value> + + 3 + + TypeDescription + + + true + + + true + + + + ТипОтвета + + <key>ru</key> + <value>Тип ответа</value> + + 4 + + EnumRef.ТипыОтветовНаВопрос + + + true + + + true + + + + МинимальноеЗначение + + <key>ru</key> + <value>Минимальное значение</value> + + 5 + + Number + + 15 + + + + true + + + true + + + + МаксимальноеЗначение + + <key>ru</key> + <value>Максимальное значение</value> + + 6 + + Number + + 15 + + + + true + + + true + + + + + ДеревоРазделов + + <key>ru</key> + <value>Дерево разделов</value> + + 7 + + ValueTree + + + true + + + true + + + Формулировка + + <key>ru</key> + <value>Формулировка</value> + + 1 + + String + + 150 + + + + true + + + true + + + + ПолныйКод + + <key>ru</key> + <value>Полный код</value> + + 3 + + String + + 100 + + + + true + + + true + + + + КодКартинки + + <key>ru</key> + <value>Код картинки</value> + + 4 + + Number + + 1 + + + + true + + + true + + + + ТипСтроки + + <key>ru</key> + <value>Тип строки</value> + + 5 + + String + + 20 + + + + true + + + true + + + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 6 + + CatalogRef.ВопросыШаблонаАнкеты + + + true + + + true + + + + КоличествоВопросов + + <key>ru</key> + <value>Количество вопросов</value> + + 2 + + Number + + 10 + + + + true + + + true + + + + + Вступление + + <key>ru</key> + <value>Вступление</value> + + 8 + + 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> + + 11 + + String + + 200 + + + + true + + + true + + + + НомерТекущегоРаздела + + <key>ru</key> + <value>Номер текущего раздела</value> + + 12 + + Number + + 10 + true + + + + 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 + + + + + + diff --git a/SSL/src/CommonForms/МастерАнкетыПоРазделам/Module.bsl b/SSL/src/CommonForms/МастерАнкетыПоРазделам/Module.bsl new file mode 100644 index 000000000..f97fd3e1f --- /dev/null +++ b/SSL/src/CommonForms/МастерАнкетыПоРазделам/Module.bsl @@ -0,0 +1,201 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ + + // Отвечает за построение формы заполнения + &НаСервере + Процедура ПостроениеФормыСогласноРаздела() + + //определение выбранного раздела + ТекущиеДанныеДеревоРазделов = ДеревоРазделов.НайтиПоИдентификатору(Элементы.ДеревоРазделов.ТекущаяСтрока); + Если ТекущиеДанныеДеревоРазделов = Неопределено Тогда + Возврат; + КонецЕсли; + + НомерТекущегоРаздела = Элементы.ДеревоРазделов.ТекущаяСтрока; + Анкетирование.ПостроениеФормыЗаполненияПоРазделу(ЭтаФорма,ТекущиеДанныеДеревоРазделов); + Анкетирование.СформироватьТаблицуПодчиненияВопросов(ЭтаФорма); + + Элементы.ПредыдущийРазделПодвал.Видимость = (ТаблицаВопросовРаздела.Количество() > 0); + Элементы.СледующийРазделПодвал.Видимость = (ТаблицаВопросовРаздела.Количество() > 0); + + КонецПроцедуры // () + + // Начинает процесс построения формы заполнения согласно разделам + &НаКлиенте + Процедура ВыполнитьПостроениеФормыЗаполнения() + + Элементы.ГруппаСтраницыФормаЗаполнения.ТекущаяСтраница = Элементы.СтраницаОжидание; + ПодключитьОбработчикОжидания("ОкончаниеПостроенияФормыЗаполнения",0.1,Истина); + + КонецПроцедуры // + +// Заканчивает формирование формы заполнения анкеты + &НаКлиенте + Процедура ОкончаниеПостроенияФормыЗаполнения() + + ПостроениеФормыСогласноРаздела(); + УправлениеДоступностьюПодчиненныеВопросы(); + Элементы.ГруппаСтраницыФормаЗаполнения.ТекущаяСтраница = Элементы.ГруппаТелоАнкеты; + УправлениеДоступностьюКнопкиНавигацияРазделов(); + + КонецПроцедуры // () + + // Отвечает за доступность кнопок навигации по разделам + &НаКлиенте + Процедура УправлениеДоступностьюКнопкиНавигацияРазделов() + + Элементы.ПредыдущийРаздел.Доступность = (Элементы.ДеревоРазделов.ТекущаяСтрока <> 0); + Элементы.ПредыдущийРазделПодвал.Доступность = (Элементы.ДеревоРазделов.ТекущаяСтрока > 0); + Элементы.СледующийРаздел.Доступность = (ДеревоРазделов.НайтиПоИдентификатору(Элементы.ДеревоРазделов.ТекущаяСтрока + 1) <> Неопределено); + Элементы.СледующийРазделПодвал.Доступность = (ДеревоРазделов.НайтиПоИдентификатору(Элементы.ДеревоРазделов.ТекущаяСтрока + 1) <> Неопределено); + + КонецПроцедуры + + // Изменяет текущий раздел + &НаКлиенте + Процедура ИзменитьРаздел(Направление) + + Элементы.ДеревоРазделов.ТекущаяСтрока = НомерТекущегоРаздела + ?(Направление = "Вперед",1,-1); + НомерТекущегоРаздела = НомерТекущегоРаздела + ?(Направление = "Вперед",1,-1); + ТекущиеДанныеДеревоРазделов = ДеревоРазделов.НайтиПоИдентификатору(Элементы.ДеревоРазделов.ТекущаяСтрока); + Если ТекущиеДанныеДеревоРазделов.КоличествоВопросов = 0 И ТекущиеДанныеДеревоРазделов.ТипСтроки = "Раздел" Тогда + ИзменитьРаздел(Направление); + КонецЕсли; + ВыполнитьПостроениеФормыЗаполнения(); + +КонецПроцедуры // + +// Изменяет видимость дерева разделов +&НаКлиенте +Процедура ИзменитьВидимостьДеревоРазделов() + + Элементы.ГруппаДеревоРазделов.Видимость = НЕ Элементы.ГруппаДеревоРазделов.Видимость; + Элементы.СкрытьПоказатьДеревоРазделов.Заголовок = ?(Элементы.ГруппаДеревоРазделов.Видимость,"Скрыть разделы","Показать разделы"); + Элементы.ДекорацияОжиданиеЭлементы.Ширина = ?(Элементы.ГруппаДеревоРазделов.Видимость,20,45); + +КонецПроцедуры + +//Управляет доступностью элементов формы +&НаКлиенте +Процедура УправлениеДоступностьюПодчиненныеВопросы() + + Для каждого ЭлементКоллекции Из ПодчиненныеВопросы Цикл + + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(ЭлементКоллекции.Вопрос); + + Для каждого ПодчиненныйВопрос Из ЭлементКоллекции.Подчиненные Цикл + + Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса].ТолькоПросмотр = (НЕ ЭтаФорма[ИмяВопроса]); + Если СтрЧислоВхождений(ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса,"Реквизит") = 0 Тогда + + //У флажка и переключателя нет свойства АвтоотметкаНезаполенного. + Попытка + Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса].АвтоотметкаНезаполненного = (ЭтаФорма[ИмяВопроса] И ПодчиненныйВопрос.Обязательный); + Исключение + КонецПопытки; + + КонецЕсли; + КонецЦикла; + КонецЦикла; + +КонецПроцедуры // УправлениеДоступностью() + +//////////////////////////////////////////////////////////////////////////////// +// КОМАНДЫ ФОРМЫ + +&НаКлиенте +Процедура СкрытьПоказатьДеревоРазделов(Команда) + + ИзменитьВидимостьДеревоРазделов(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредыдущийРаздел(Команда) + + ИзменитьРаздел("Назад"); + +КонецПроцедуры + +&НаКлиенте +Процедура СледующийРаздел(Команда) + + ИзменитьРаздел("Вперед"); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыборРаздела(Команда) + + ВыполнитьПостроениеФормыЗаполнения(); + УправлениеДоступностьюКнопкиНавигацияРазделов(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +// Устанавливает значения реквзитов формы, определенных в шаблоне анкеты +// +&НаСервере +Процедура УстановитьЗначенияРеквзитовФормыСогласноШаблонаАнкеты() + + РеквизитыШаблонАнкеты = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ШаблонАнкеты,"Заголовок,Вступление,Заключение"); + ЗаполнитьЗначенияСвойств(ЭтаФорма,РеквизитыШаблонАнкеты); + +КонецПроцедуры // () + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("ШаблонАнкеты") = Ложь Тогда + Отказ = Истина; + Возврат; + Иначе + ШаблонАнкеты = Параметры.ШаблонАнкеты; + КонецЕсли; + + УстановитьЗначенияРеквзитовФормыСогласноШаблонаАнкеты(); + Анкетирование.УстановитьЭлементДереваРазделовАнкетыВступлениеЗаключение(ДеревоРазделов,"Вступление"); + Анкетирование.ЗаполнитьДеревоРазделов(ЭтаФорма,ДеревоРазделов); + Анкетирование.УстановитьЭлементДереваРазделовАнкетыВступлениеЗаключение(ДеревоРазделов,"Заключение"); + АнкетированиеКлиентСервер.СформироватьНумерациюДерева(ДеревоРазделов,Истина); + + Элементы.ДеревоРазделов.ТекущаяСтрока = 0; + ПостроениеФормыСогласноРаздела(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Элементы.ГруппаСтраницыФормаЗаполнения.ТекущаяСтраница = Элементы.ГруппаТелоАнкеты; + УправлениеДоступностьюКнопкиНавигацияРазделов(); + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +//Обработчик выбора раздела на дереве +&НаКлиенте +Процедура ДеревоРазделовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ТекущиеДанные = Элементы.ДеревоРазделов.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ВыполнитьПостроениеФормыЗаполнения(); + УправлениеДоступностьюКнопкиНавигацияРазделов(); + +КонецПроцедуры + +//Обработчик события ПриИзменении для вопросов с условием + &НаКлиенте +Процедура Подключаемый_ПриИзмененииВопросовСУсловием(Элемент) + + УправлениеДоступностьюПодчиненныеВопросы(); + +КонецПроцедуры // () + \ No newline at end of file diff --git a/SSL/src/CommonForms/МастерАнкетыПоРазделам/МастерАнкетыПоРазделам.mdo b/SSL/src/CommonForms/МастерАнкетыПоРазделам/МастерАнкетыПоРазделам.mdo new file mode 100644 index 000000000..84ae237c9 --- /dev/null +++ b/SSL/src/CommonForms/МастерАнкетыПоРазделам/МастерАнкетыПоРазделам.mdo @@ -0,0 +1,10 @@ + + + МастерАнкетыПоРазделам + + ru + Мастер анкеты по разделам + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonForms/НастройкаЛокальногоКэшаФайлов/Form.form b/SSL/src/CommonForms/НастройкаЛокальногоКэшаФайлов/Form.form new file mode 100644 index 000000000..daeb20f26 --- /dev/null +++ b/SSL/src/CommonForms/НастройкаЛокальногоКэшаФайлов/Form.form @@ -0,0 +1,761 @@ + + + + <key>ru</key> + <value>Настройка основного рабочего каталога</value> + + + ГруппаРасположение + 26 + + ПутьКЛокальномуКэшуФайлов + 4 + + <key>ru</key> + <value>Расположение</value> + + true + true + + true + + + ПутьКЛокальномуКэшуФайлов + + + ПутьКЛокальномуКэшуФайловРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + ПутьКЛокальномуКэшуФайловКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + Left + + + StartChoice + ПутьКЛокальномуКэшуФайловНачалоВыбора + + 48 + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ПутьКРабочемуКаталогуПоУмолчанию + 27 + true + true + + true + + false + + ПутьКРабочемуКаталогуПоУмолчаниюРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + UsualButton + Form.Command.ПутьКРабочемуКаталогуПоУмолчанию + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ru + Группа расположение + + + ГруппаРасположениеРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + МаксимальныйРазмерЛокальногоКэшаФайлов + 2 + + <key>ru</key> + <value>Максимальный размер (Мб)</value> + + true + true + + true + + + МаксимальныйРазмерЛокальногоКэшаФайлов + + + МаксимальныйРазмерЛокальногоКэшаФайловРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + МаксимальныйРазмерЛокальногоКэшаФайловКонтекстноеМеню + 3 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов + 24 + + <key>ru</key> + <value>Подтверждать при удалении из основного рабочего каталога</value> + + true + true + + true + + + ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов + + Right + + ПодтверждатьПриУдаленииИзЛокальногоКэшаФайловРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ПодтверждатьПриУдаленииИзЛокальногоКэшаФайловКонтекстноеМеню + 25 + true + + CheckBoxField + Enter + true + Left + true + + + + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования + 16 + true + true + + true + + + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования + + Right + + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактированияРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактированияКонтекстноеМеню + 17 + true + + CheckBoxField + Enter + true + Left + true + + + + СейчасВЛокальномКэшеФайлов + 18 + + КоличествоСуммарное + 11 + + <key>ru</key> + <value>Файлов</value> + + true + true + + true + + + КоличествоСуммарное + + + КоличествоСуммарноеРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + КоличествоСуммарноеКонтекстноеМеню + 12 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + РазмерФайловВРабочемКаталоге + 9 + + <key>ru</key> + <value>Общий объем (Мб)</value> + + true + true + + true + + + РазмерФайловВРабочемКаталоге + + + РазмерФайловВРабочемКаталогеРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + РазмерФайловВРабочемКаталогеКонтекстноеМеню + 10 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Текущее состояние:</value> + + + ru + Текущее состояние: + + + СейчасВЛокальномКэшеФайловРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + + СписокФайлов + 14 + true + true + + true + + false + + СписокФайловРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + UsualButton + Form.Command.СписокФайлов + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + ОчиститьРабочийКаталог + 13 + true + true + + true + + false + + ОчиститьРабочийКаталогРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + UsualButton + Form.Command.ОчиститьЛокальныйКэшФайлов + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ОК + 21 + true + true + + true + + false + + ОКРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 22 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + МаксимальныйРазмерЛокальногоКэшаФайлов + + <key>ru</key> + <value>Максимальный размер локального кэша файлов</value> + + 1 + + Number + + 10 + + + + true + + + true + + + + ПутьКЛокальномуКэшуФайлов + + <key>ru</key> + <value>Путь к локальному кэшу файлов</value> + + 2 + + String + + + + true + + + true + + + + РазмерФайловВРабочемКаталоге + + <key>ru</key> + <value>Размер</value> + + 3 + + Number + + 10 + + + + true + + + true + + + + КоличествоСуммарное + + <key>ru</key> + <value>Количество суммарное</value> + + 4 + + Number + + 10 + + + + true + + + true + + + + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования + + <key>ru</key> + <value>Удалять файлы при завершении редактирования</value> + + 5 + + Boolean + + + true + + + true + + + + ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов + + <key>ru</key> + <value>Подтверждать при удалении из локального кэша файлов</value> + + 6 + + Boolean + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + СохранитьВыполнить + + + Auto + Auto + + + ОчиститьЛокальныйКэшФайлов + + <key>ru</key> + <value>Очистить основной рабочий каталог</value> + + 3 + + ru + Очистить основной рабочий каталог + + + true + + + + ОчиститьЛокальныйКэшФайлов + + + Picture + Auto + Auto + + + СписокФайлов + + <key>ru</key> + <value>Открыть список файлов...</value> + + 4 + + ru + Список файлов + + + true + + + + СписокФайловВыполнить + + + Auto + Auto + + + Обновить + + <key>ru</key> + <value>Обновить</value> + + 5 + + ru + Обновить + + + true + + + StdPicture.Refresh + + + + ОбновитьВыполнить + + + Auto + Auto + + + ПутьКРабочемуКаталогуПоУмолчанию + + <key>ru</key> + <value>Путь к рабочему каталогу по умолчанию</value> + + 2 + + ru + Восстановить значение по умолчанию + + + true + + + CommonPicture.РабочийКаталогПоУмолчанию + + + + ПутьКРабочемуКаталогуПоУмолчанию + + + Picture + Auto + Auto + + + + + + diff --git a/SSL/src/CommonForms/НастройкаЛокальногоКэшаФайлов/Help/ru.html b/SSL/src/CommonForms/НастройкаЛокальногоКэшаФайлов/Help/ru.html new file mode 100644 index 000000000..518a521d3 --- /dev/null +++ b/SSL/src/CommonForms/НастройкаЛокальногоКэшаФайлов/Help/ru.html @@ -0,0 +1,10 @@ + +

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

    +

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

     

    \ 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..b090b5f5b --- /dev/null +++ b/SSL/src/CommonForms/НастройкаЛокальногоКэшаФайлов/Module.bsl @@ -0,0 +1,231 @@ +&НаСервере +Процедура ОбновитьПараметрыНаСервере() + + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЛокальныйКэшФайлов", "УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования"); + Если УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = Неопределено Тогда + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = Ложь; + КонецЕсли; + + ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЛокальныйКэшФайлов", "ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов"); + Если ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов = Неопределено Тогда + ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов = Ложь; + КонецЕсли; + + МаксРазмер = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЛокальныйКэшФайлов", "МаксимальныйРазмерЛокальногоКэшаФайлов"); + Если МаксРазмер = Неопределено Тогда + МаксРазмер = 100*1024*1024; // 100 мб + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ЛокальныйКэшФайлов", "МаксимальныйРазмерЛокальногоКэшаФайлов", МаксРазмер); + КонецЕсли; + МаксимальныйРазмерЛокальногоКэшаФайлов = МаксРазмер / 1048576; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьПараметрыНаКлиенте() + РаботаСФайламиКлиент.ПроинициализироватьПутьКРабочемуКаталогу(); + ПутьКЛокальномуКэшуФайлов = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + #Если НЕ ВебКлиент Тогда + МассивФайлов = НайтиФайлы(ПутьКЛокальномуКэшуФайлов, "*.*"); + РазмерФайловВРабочемКаталоге = 0; + КоличествоСуммарное = 0; + ФайловыеФункцииКлиент.ОбходФайловРазмер(ПутьКЛокальномуКэшуФайлов, МассивФайлов, РазмерФайловВРабочемКаталоге, КоличествоСуммарное); + + РазмерФайловВРабочемКаталоге = РазмерФайловВРабочемКаталоге / 1048576; + #КонецЕсли +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьПараметры() + ОбновитьПараметрыНаСервере(); + ОбновитьПараметрыНаКлиенте(); +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьВыполнить() + МассивСтруктур = Новый Массив; + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "ЛокальныйКэшФайлов"); + Элемент.Вставить("Настройка", "ПутьКЛокальномуКэшуФайлов"); + Элемент.Вставить("Значение", ПутьКЛокальномуКэшуФайлов); + МассивСтруктур.Добавить(Элемент); + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "ЛокальныйКэшФайлов"); + Элемент.Вставить("Настройка", "МаксимальныйРазмерЛокальногоКэшаФайлов"); + Элемент.Вставить("Значение", МаксимальныйРазмерЛокальногоКэшаФайлов * 1048576); + МассивСтруктур.Добавить(Элемент); + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "ЛокальныйКэшФайлов"); + Элемент.Вставить("Настройка", "УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования"); + Элемент.Вставить("Значение", УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования); + МассивСтруктур.Добавить(Элемент); + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "ЛокальныйКэшФайлов"); + Элемент.Вставить("Настройка", "ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов"); + Элемент.Вставить("Значение", ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов); + МассивСтруктур.Добавить(Элемент); + + РаботаСФайлами.ХранилищеОбщихНастроекСохранитьМассивИПараметрСеансаРабочийКаталог(МассивСтруктур, ПутьКЛокальномуКэшуФайлов); + + ОбновитьПовторноИспользуемыеЗначения(); + РаботаСФайламиКлиент.ПроинициализироватьПутьКРабочемуКаталогу(); + + Закрыть(); +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если НЕ РасширениеПодключено Тогда + Предупреждение(НСтр("ru = 'В Веб-клиенте без установленного расширения работы с файлами настройка рабочего каталога не поддерживается.'")); + Отказ = Истина; + Возврат; + КонецЕсли; + + ОбновитьПараметрыНаКлиенте(); +КонецПроцедуры + +&НаКлиенте +Процедура СписокФайловВыполнить() + ОткрытьФормуМодально("Справочник.Файлы.Форма.СписокФайловВЛокальномКэшеФайлов"); + ПутьКЛокальномуКэшуФайловВФорме = ПутьКЛокальномуКэшуФайлов; + ОбновитьПараметры(); + ПутьКЛокальномуКэшуФайлов = ПутьКЛокальномуКэшуФайловВФорме; +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьВыполнить() + ОбновитьПараметры(); +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ОбновитьПараметрыНаСервере(); +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьЛокальныйКэшФайлов(Команда) + #Если НЕ ВебКлиент Тогда + + ТекстВопроса = НСтр("ru = 'Из основного рабочего каталога будут удалены все файлы, кроме занятых Вами для редактирования. Продолжить?'"); + Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); + Если Ответ = КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + + Состояние(НСтр("ru = 'Выполняется очистка основного рабочего каталога... + |Пожалуйста, подождите.'")); + ИмяКаталога = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЛокальныйКэшФайлов", "ПутьКЛокальномуКэшуФайлов"); + + МассивФайлов = НайтиФайлы(ИмяКаталога, "*.*"); + + РазмерФайловВРабочемКаталоге = 0; + КоличествоСуммарное = 0; + ФайловыеФункцииКлиент.ОбходФайловРазмер(ИмяКаталога, МассивФайлов, РазмерФайловВРабочемКаталоге, КоличествоСуммарное); + + ФайловыеФункцииКлиент.ОчиститьРабочийКаталог(РазмерФайловВРабочемКаталоге, 0, Истина); // ОчищатьВсе= Истина + + РазмерФайловВРабочемКаталоге = РазмерФайловВРабочемКаталоге / 1048576; + + ПутьКЛокальномуКэшуФайловВФорме = ПутьКЛокальномуКэшуФайлов; + ОбновитьПараметры(); + ПутьКЛокальномуКэшуФайлов = ПутьКЛокальномуКэшуФайловВФорме; + Состояние(НСтр("ru = 'Очистка основного рабочего каталога успешно завершена!'")); + + #КонецЕсли +КонецПроцедуры + +// есть ли файлы на редактирование в основном рабочем каталоге +&НаКлиенте +Функция ЕстьФайлыНаРедактированиеВЛокальномКеше() + СписокФайловВРегистре = РаботаСФайлами.СписокФайловВРегистре(); + + Для Каждого Строка Из СписокФайловВРегистре Цикл + + Если Не Строка.НаЧтение Тогда + ПолныйПуть = ПутьКЛокальномуКэшуФайлов + Строка.ЧастичныйПуть; + Файл = Новый Файл(ПолныйПуть); + Если Файл.Существует() Тогда + Возврат Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; +КонецФункции + +// вернет Истина, если можно продолжать (смену пути к рабочему каталогу) +&НаКлиенте +Функция ВопросПроФайлыНаРедактированиеВЛокальномКеше() + Если ЕстьФайлыНаРедактированиеВЛокальномКеше() Тогда + КодВозврата = Вопрос(Нстр("ru = 'В основном рабочем каталоге есть файлы на редактирование. Смена пути к рабочему каталогу приведет к потере изменений в этих файлах. Продолжить?'"), РежимДиалогаВопрос.ДаНет); + Если КодВозврата = КодВозвратаДиалога.Нет Тогда + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + Возврат Истина; +КонецФункции + +&НаКлиенте +Процедура ПутьКЛокальномуКэшуФайловНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если РасширениеПодключено Тогда + + Если Не ВопросПроФайлыНаРедактированиеВЛокальномКеше() Тогда + Возврат; + КонецЕсли; + + Режим = РежимДиалогаВыбораФайла.ВыборКаталога; + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + ДиалогОткрытияФайла.Каталог = ПутьКЛокальномуКэшуФайлов; + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите путь к основному рабочему каталогу'"); + Если ДиалогОткрытияФайла.Выбрать() Тогда + + ИмяКаталога = ДиалогОткрытияФайла.Каталог; + ФайловыеФункцииКлиентСервер.ДобавитьСлешЕслиНужно(ИмяКаталога); + + // Создать каталог для файлов + Попытка + СоздатьКаталог(ИмяКаталога); + ИмяКаталогаТестовое = ИмяКаталога + "ПроверкаДоступа\"; + СоздатьКаталог(ИмяКаталогаТестовое); + УдалитьФайлы(ИмяКаталогаТестовое); + Исключение + // нет прав на создание каталога, или такой путь отсутствует + + ТекстОшибки + = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неверный путь или отсутствуют права на запись в каталог ""%1""'"), + ИмяКаталога); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "ПутьКЛокальномуКэшуФайлов"); + Возврат; + КонецПопытки; + + ПутьКЛокальномуКэшуФайлов = ИмяКаталога; + КонецЕсли; + + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПутьКРабочемуКаталогуПоУмолчанию(Команда) + ПутьКЛокальномуКэшуФайловВременный = ФайловыеФункцииКлиент.ПолучитьПутьККаталогуДанныхПользователя(); + + Если ПутьКЛокальномуКэшуФайлов = ПутьКЛокальномуКэшуФайловВременный Тогда + Возврат; + КонецЕсли; + + Если Не ВопросПроФайлыНаРедактированиеВЛокальномКеше() Тогда + Возврат; + КонецЕсли; + + ПутьКЛокальномуКэшуФайлов = ПутьКЛокальномуКэшуФайловВременный; +КонецПроцедуры diff --git a/SSL/src/CommonForms/НастройкаЛокальногоКэшаФайлов/НастройкаЛокальногоКэшаФайлов.mdo b/SSL/src/CommonForms/НастройкаЛокальногоКэшаФайлов/НастройкаЛокальногоКэшаФайлов.mdo new file mode 100644 index 000000000..7a0f4155f --- /dev/null +++ b/SSL/src/CommonForms/НастройкаЛокальногоКэшаФайлов/НастройкаЛокальногоКэшаФайлов.mdo @@ -0,0 +1,17 @@ + + + НастройкаЛокальногоКэшаФайлов + + ru + Настройка основного рабочего каталога + + true + + + ru + + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form b/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form new file mode 100644 index 000000000..3e5ffeb11 --- /dev/null +++ b/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form @@ -0,0 +1,1000 @@ + + + + ОбщаяГруппа + 6 + + МоиКоманды + 1 + + <key>ru</key> + <value>Мои команды</value> + + true + true + + true + + + МоиКоманды + + false + Top + Add + Change + Copy + Delete + EndEdit + HierarchicalList + List + MoveDown + MoveUp + SortListAsc + SortListDesc + Tree + + МоиКомандыНаименование + 4 + true + true + + true + + + МоиКоманды.Наименование + + + МоиКомандыНаименованиеРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + МоиКомандыНаименованиеКонтекстноеМеню + 5 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + МоиКомандыКоманднаяПанель + 3 + Left + + + МоиКомандыСтрокаПоиска + 23 + + МоиКомандыСтрокаПоискаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + МоиКомандыСтрокаПоискаКонтекстноеМеню + 24 + true + + МоиКоманды + + true + + + + МоиКомандыСостояниеПросмотра + 26 + + МоиКомандыСостояниеПросмотраРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + МоиКомандыСостояниеПросмотраКонтекстноеМеню + 27 + true + + ViewStatusAddition + МоиКоманды + + true + + + + МоиКомандыУправлениеПоиском + 29 + + МоиКомандыУправлениеПоискомРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + МоиКомандыУправлениеПоискомКонтекстноеМеню + 30 + true + + SearchControlAddition + МоиКоманды + + true + + + + МоиКомандыРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + МоиКомандыКонтекстноеМеню + 2 + true + + Tree + true + true + true + true + true + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + ExpandTopLevel + true + true + true + true + None + None + None + true + + + КомандыУправленияСписком + 12 + + ДобавитьКоманду + 13 + true + true + + true + + false + + ДобавитьКомандуРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + UsualButton + Form.Command.ДобавитьКоманду + Normal + true + true + UserCmds + Auto + + + ДобавитьВсеКоманды + 14 + true + true + + true + + false + + ДобавитьВсеКомандыРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + UsualButton + Form.Command.ДобавитьВсеКоманды + Normal + Auto + true + true + UserCmds + Auto + + + УдалитьКоманду + 15 + true + true + + true + + false + + УдалитьКомандуРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + UsualButton + Form.Command.УдалитьКоманду + Normal + Auto + true + true + UserCmds + Auto + + + УдалитьВсеКоманды + 16 + true + true + + true + + false + + УдалитьВсеКомандыРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + UsualButton + Form.Command.УдалитьВсеКоманды + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ru + Команды управления списком + + true + + КомандыУправленияСпискомРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + + КомандыИсточник + 7 + + <key>ru</key> + <value>Все команды</value> + + true + true + + true + + + КомандыИсточник + + false + Top + Add + Change + Copy + Delete + EndEdit + HierarchicalList + List + MoveDown + MoveUp + SortListAsc + SortListDesc + Tree + + ВсеКомандыНаименование + 10 + true + true + + true + + + КомандыИсточник.Наименование + + + ВсеКомандыНаименованиеРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + ВсеКомандыНаименованиеКонтекстноеМеню + 11 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + КомандыИсточникКоманднаяПанель + 9 + Left + true + + + КомандыИсточникСтрокаПоиска + 48 + + КомандыИсточникСтрокаПоискаРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + КомандыИсточникСтрокаПоискаКонтекстноеМеню + 49 + true + + КомандыИсточник + + true + + + + КомандыИсточникСостояниеПросмотра + 51 + + КомандыИсточникСостояниеПросмотраРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + КомандыИсточникСостояниеПросмотраКонтекстноеМеню + 52 + true + + ViewStatusAddition + КомандыИсточник + + true + + + + КомандыИсточникУправлениеПоиском + 54 + + КомандыИсточникУправлениеПоискомРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + КомандыИсточникУправлениеПоискомКонтекстноеМеню + 55 + true + + SearchControlAddition + КомандыИсточник + + true + + + + КомандыИсточникРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + КомандыИсточникКонтекстноеМеню + 8 + true + + Tree + true + true + true + true + true + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + ExpandTopLevel + true + true + true + true + None + None + None + true + + true + true + + true + + + <key>ru</key> + <value>Общая группа</value> + + + ru + Общая группа + + + ОбщаяГруппаРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ОК + 17 + true + true + + true + + true + false + + ОКРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 18 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + МоиКоманды + + <key>ru</key> + <value>Мои команды</value> + + 1 + + ValueTree + + + true + + + true + + + Наименование + + <key>ru</key> + <value>Наименование</value> + + 1 + + String + + + + true + + + true + + + + Обработка + + <key>ru</key> + <value>Обработка</value> + + 2 + + CatalogRef.ДополнительныеОтчетыИОбработки + + + 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 + + ValueTree + + + true + + + true + + + Наименование + + <key>ru</key> + <value>Наименование</value> + + 1 + + String + + + + true + + + true + + + + Обработка + + <key>ru</key> + <value>Обработка</value> + + 2 + + CatalogRef.ДополнительныеОтчетыИОбработки + + + 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> + + 3 + + EnumRef.ВидыДополнительныхОтчетовИОбработок + + + true + + + true + + + + ЭтоГлобальныеОбработки + + <key>ru</key> + <value>Это глобальные обработки</value> + + 4 + + Boolean + + + true + + + true + + + + ТекущийРаздел + + <key>ru</key> + <value>Текущий раздел</value> + + 5 + + String + + + + true + + + true + + + + ДобавитьКоманду + + <key>ru</key> + <value><<</value> + + 1 + + ru + Добавить команду + + + true + + + + ДобавитьКоманду + + + Auto + Auto + + + ДобавитьВсеКоманды + + <key>ru</key> + <value><< <</value> + + 2 + + ru + Добавить все команды + + + true + + + + ДобавитьВсеКоманды + + + Auto + Auto + + + УдалитьКоманду + + <key>ru</key> + <value>>></value> + + 3 + + ru + Удалить команду + + + true + + + + УдалитьКоманду + + + Auto + Auto + + + УдалитьВсеКоманды + + <key>ru</key> + <value>> >></value> + + 4 + + ru + Удалить все команды + + + true + + + + УдалитьВсеКоманды + + + Auto + Auto + + + ОК + + <key>ru</key> + <value>ОК</value> + + 5 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + ВидОбработок + + EnumRef.ВидыДополнительныхОтчетовИОбработок + + + + ЭтоГлобальныеОбработки + + Boolean + + + + ТекущийРаздел + + String + + + + + + + + diff --git a/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Module.bsl b/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Module.bsl new file mode 100644 index 000000000..8c488e454 --- /dev/null +++ b/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Module.bsl @@ -0,0 +1,433 @@ +//////////////////////////////////////////////////////////////////////////////// +// БЛОК ОБРАБОТЧИКОВ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ВидОбработок = Параметры.ВидОбработок; + ЭтоГлобальныеОбработки = Параметры.ЭтоГлобальныеОбработки; + ТекущийРаздел = Параметры.ТекущийРаздел; + + ЗаполнитьДеревоОбработок(Истина, "МоиКоманды"); + ЗаполнитьДеревоОбработок(Ложь, "КомандыИсточник"); + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьКоманду(Команда) + + ТекущиеДанные = Элементы.КомандыИсточник.ТекущиеДанные; + + Если ТекущиеДанные <> Неопределено И НЕ ПустаяСтрока(ТекущиеДанные.Идентификатор) Тогда + ДобавитьКомандуСервер(ТекущиеДанные.Обработка, ТекущиеДанные.Идентификатор); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьКоманду(Команда) + + ТекущиеДанные = Элементы.МоиКоманды.ТекущиеДанные; + + Если ТекущиеДанные <> Неопределено И НЕ ПустаяСтрока(ТекущиеДанные.Идентификатор) Тогда + УдалитьКомандуСервер(ТекущиеДанные.Обработка, ТекущиеДанные.Идентификатор); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьВсеКоманды(Команда) + + Если ЭтоГлобальныеОбработки Тогда + КомандыИсточникЭлементы = КомандыИсточник.ПолучитьЭлементы(); + + Для Каждого СтрокаРазделы Из КомандыИсточникЭлементы Цикл + ЭлементРаздел = НайтиЭлементРаздел(МоиКоманды, СтрокаРазделы.ИмяРаздела, СтрокаРазделы.Наименование); + ЭлементыКоманды = СтрокаРазделы.ПолучитьЭлементы(); + Для Каждого ЭлементКоманда Из ЭлементыКоманды Цикл + НоваяКоманда = НайтиЭлементКоманду(ЭлементРаздел.ПолучитьЭлементы(), ЭлементКоманда.Идентификатор); + ЗаполнитьЗначенияСвойств(НоваяКоманда, ЭлементКоманда); + КонецЦикла; + КонецЦикла; + Иначе + ДобавитьВсеКомандыСервер(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьВсеКоманды(Команда) + + МоиКоманды.ПолучитьЭлементы().Очистить(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + + ЗаписатьНаборОбработокПользователя(); + Закрыть(Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// БЛОК ВСПОМОГАТЕЛЬНЫХ ФУНКЦИЙ + +&НаСервере +Функция ЗаполнитьДеревоОбработок(КомандыПользователя, ИмяЭлементыРеквизитаДерева) + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + + ТекстЗапроса = " + |ВЫБРАТЬ"; + + Если ЭтоГлобальныеОбработки Тогда + ТекстЗапроса = ТекстЗапроса + " + | ДополнительныеОтчетыИОбработкиРазделы.ИмяРаздела КАК ИмяРаздела,"; + КонецЕсли; + + ТекстЗапроса = ТекстЗапроса + " + | ДополнительныеОтчетыИОбработкиКоманды.Представление КАК Наименование, + | ДополнительныеОтчетыИОбработкиКоманды.Идентификатор КАК Идентификатор, + | ДополнительныеОтчетыИОбработки.Ссылка КАК Обработка + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки + | СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Команды КАК ДополнительныеОтчетыИОбработкиКоманды + | ПО ДополнительныеОтчетыИОбработкиКоманды.Ссылка = ДополнительныеОтчетыИОбработки.Ссылка"; + + Если ЭтоГлобальныеОбработки Тогда + ТекстЗапроса = ТекстЗапроса + " + | СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Разделы КАК ДополнительныеОтчетыИОбработкиРазделы + | ПО ДополнительныеОтчетыИОбработкиРазделы.Ссылка = ДополнительныеОтчетыИОбработки.Ссылка"; + КонецЕсли; + + Если КомандыПользователя Тогда + ТекстЗапроса = ТекстЗапроса + " + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПользовательскиеНастройкиДоступаКОбработкам КАК ПользовательскиеНастройкиДоступаКОбработкам + | ПО ПользовательскиеНастройкиДоступаКОбработкам.ДополнительныйОтчетИлиОбработка = ДополнительныеОтчетыИОбработки.Ссылка + | И ПользовательскиеНастройкиДоступаКОбработкам.ИдентификаторКоманды = ДополнительныеОтчетыИОбработкиКоманды.Идентификатор + | И ПользовательскиеНастройкиДоступаКОбработкам.Пользователь = &Пользователь"; + КонецЕсли; + + ТекстЗапроса = ТекстЗапроса + " + |ГДЕ + | ДополнительныеОтчетыИОбработки.Вид = &ВидОбработок + | И НЕ ДополнительныеОтчетыИОбработки.ПометкаУдаления + | И ( + | ДополнительныеОтчетыИОбработки.Публикация = ЗНАЧЕНИЕ(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется)"; + + Если РольДоступна(Метаданные.Роли.ДобавлениеИзменениеДополнительныхОтчетовИОбработок) + ИЛИ РольДоступна(Метаданные.Роли.ПолныеПрава) Тогда + ТекстЗапроса = ТекстЗапроса + " + | ИЛИ ДополнительныеОтчетыИОбработки.Публикация = ЗНАЧЕНИЕ(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.РежимОтладки)"; + КонецЕсли; + + ТекстЗапроса = ТекстЗапроса + " + | )"; + + Если КомандыПользователя Тогда + ТекстЗапроса = ТекстЗапроса + " + | И ПользовательскиеНастройкиДоступаКОбработкам.Доступно"; + КонецЕсли; + + Если ЭтоГлобальныеОбработки Тогда + ТекстЗапроса = ТекстЗапроса + " + |ИТОГИ ПО + | ИмяРаздела"; + КонецЕсли; + + Запрос.Параметры.Вставить("Пользователь", ОбщегоНазначения.ТекущийПользователь()); + + Запрос.Текст = ТекстЗапроса; + + Запрос.Параметры.Вставить("ВидОбработок", ВидОбработок); + + Если ЭтоГлобальныеОбработки Тогда + ДеревоКоманд = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); + Иначе + ТаблицаКоманд = Запрос.Выполнить().Выгрузить(); + КонецЕсли; + + КомандыДерево = РеквизитФормыВЗначение(ИмяЭлементыРеквизитаДерева); + КомандыДерево.Строки.Очистить(); + + СобственныйИндекс = 0; + Индекс = 0; + + Если ЭтоГлобальныеОбработки Тогда + Для Каждого СтрокаРазделы Из ДеревоКоманд.Строки Цикл + СтрокаВерхнегоУровня = КомандыДерево.Строки.Добавить(); + СтрокаВерхнегоУровня.ИмяРаздела = СтрокаРазделы.ИмяРаздела; + СтрокаВерхнегоУровня.Наименование = ДополнительныеОтчетыИОбработки.ПолучитьИмяРабочегоМеста(СтрокаРазделы.ИмяРаздела); + Если СтрокаВерхнегоУровня.ИмяРаздела = ТекущийРаздел Тогда + СобственныйИндекс = Индекс; + КонецЕсли; + Для Каждого СтрокаКоманды Из СтрокаРазделы.Строки Цикл + СтрокаОписанияКоманд = СтрокаВерхнегоУровня.Строки.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаОписанияКоманд, СтрокаКоманды); + Индекс = Индекс + 1; + КонецЦикла; + Индекс = Индекс + 1; + КонецЦикла; + Иначе + Для Каждого ЭлементКоманда Из ТаблицаКоманд Цикл + НоваяСтрока = КомандыДерево.Строки.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементКоманда); + КонецЦикла; + КонецЕсли; + + ЗначениеВРеквизитФормы(КомандыДерево, ИмяЭлементыРеквизитаДерева); + + Элементы[ИмяЭлементыРеквизитаДерева].ТекущаяСтрока = СобственныйИндекс; + +КонецФункции + +&НаСервере +Процедура ДобавитьКомандуСервер(Обработка, Идентификатор) + + МоиКомандыДерево = РеквизитФормыВЗначение("МоиКоманды"); + НайденныеСтроки = МоиКомандыДерево.Строки.НайтиСтроки(Новый Структура("Обработка,Идентификатор", Обработка, Идентификатор), Истина); + Если НайденныеСтроки.Количество() > 0 Тогда + Возврат; + КонецЕсли; + + КомандыИсточникДерево = РеквизитФормыВЗначение("КомандыИсточник"); + НайденныеСтроки = КомандыИсточникДерево.Строки.НайтиСтроки(Новый Структура("Обработка,Идентификатор", Обработка, Идентификатор), Истина); + + Если ЭтоГлобальныеОбработки Тогда + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + ЭлементРаздел = НайтиЭлементРаздел(МоиКоманды, НайденнаяСтрока.ИмяРаздела, НайденнаяСтрока.Родитель.Наименование); + НоваяКоманда = ЭлементРаздел.ПолучитьЭлементы().Добавить(); + ЗаполнитьЗначенияСвойств(НоваяКоманда, НайденнаяСтрока); + КонецЦикла; + Иначе + НоваяКоманда = МоиКоманды.ПолучитьЭлементы().Добавить(); + ЗаполнитьЗначенияСвойств(НоваяКоманда, НайденныеСтроки[0]); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьВсеКомандыСервер() + + ЗначениеВРеквизитФормы(РеквизитФормыВЗначение("КомандыИсточник"), "МоиКоманды"); + +КонецПроцедуры + +&НаСервере +Процедура УдалитьКомандуСервер(Обработка, Идентификатор) + + МоиКомандыЭлементы = МоиКоманды.ПолучитьЭлементы(); + + Если ЭтоГлобальныеОбработки Тогда + + УдаляемыеРазделы = Новый Массив; + + Для Каждого СтрокаРазделы Из МоиКомандыЭлементы Цикл + ЭлементыКоманды = СтрокаРазделы.ПолучитьЭлементы(); + Для Каждого СтрокаКоманды Из ЭлементыКоманды Цикл + Если СтрокаКоманды.Обработка = Обработка И СтрокаКоманды.Идентификатор = Идентификатор Тогда + ЭлементыКоманды.Удалить(ЭлементыКоманды.Индекс(СтрокаКоманды)); + Прервать; + КонецЕсли; + КонецЦикла; + Если ЭлементыКоманды.Количество() = 0 Тогда + УдаляемыеРазделы.Добавить(МоиКомандыЭлементы.Индекс(СтрокаРазделы)); + КонецЕсли; + КонецЦикла; + + УдаляемыеРазделыТаблица = Новый ТаблицаЗначений; + УдаляемыеРазделыТаблица.Колонки.Добавить("Раздел", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10))); + Для Каждого УдаляемыйРаздел Из УдаляемыеРазделы Цикл + Строка = УдаляемыеРазделыТаблица.Добавить(); + Строка.Раздел = УдаляемыйРаздел; + КонецЦикла; + УдаляемыеРазделыТаблица.Свернуть("Раздел"); + УдаляемыеРазделыТаблица.Сортировать("Раздел Убыв"); + + УдаляемыеРазделы = УдаляемыеРазделыТаблица.ВыгрузитьКолонку("Раздел"); + + Для Каждого УдаляемыйРаздел Из УдаляемыеРазделы Цикл + МоиКомандыЭлементы.Удалить(УдаляемыйРаздел); + КонецЦикла; + + Иначе + + Для Каждого СтрокаКоманды Из МоиКомандыЭлементы Цикл + Если СтрокаКоманды.Обработка = Обработка И СтрокаКоманды.Идентификатор = Идентификатор Тогда + МоиКомандыЭлементы.Удалить(МоиКомандыЭлементы.Индекс(СтрокаКоманды)); + Прервать; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция НайтиЭлементРаздел(ДанныеФормыКоманды, ИмяРаздела, Наименование) + + Результат = Неопределено; + + Для Каждого ЭлементДанных Из ДанныеФормыКоманды.ПолучитьЭлементы() Цикл + Если ЭлементДанных.ИмяРаздела = ИмяРаздела Тогда + Результат = ЭлементДанных; + Прервать; + КонецЕсли; + КонецЦикла; + + Если Результат = Неопределено Тогда + НовыйРаздел = ДанныеФормыКоманды.ПолучитьЭлементы().Добавить(); + НовыйРаздел.ИмяРаздела = ИмяРаздела; + НовыйРаздел.Наименование = Наименование; + Результат = НовыйРаздел; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция НайтиЭлементКоманду(ДанныеФормыКоллекцияЭлементовДерева, Идентификатор) + + Результат = Неопределено; + + Для Каждого ЭлементДанных Из ДанныеФормыКоллекцияЭлементовДерева Цикл + Если ЭлементДанных.Идентификатор = Идентификатор Тогда + Результат = ЭлементДанных; + Прервать; + КонецЕсли; + КонецЦикла; + + Если Результат = Неопределено Тогда + НовыйРаздел = ДанныеФормыКоллекцияЭлементовДерева.Добавить(); + Результат = НовыйРаздел; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// БЛОК РАБОТЫ С ЗАПИСЯМИ РЕГИСТРА ПОЛЬЗОВАТЕЛЬСКОЙ ДОСТУПНОСТИ ОБРАБОТОК + +&НаСервере +Процедура ЗаписатьНаборОбработокПользователя() + + ТекстЗапроса = " + |ВЫБРАТЬ + | ДополнительныеОтчетыИОбработкиКоманды.Идентификатор КАК Идентификатор, + | ДополнительныеОтчетыИОбработки.Ссылка КАК Обработка + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки + | СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Команды КАК ДополнительныеОтчетыИОбработкиКоманды + | ПО ДополнительныеОтчетыИОбработкиКоманды.Ссылка = ДополнительныеОтчетыИОбработки.Ссылка + |ГДЕ + | ДополнительныеОтчетыИОбработки.Вид = &ВидОбработок"; + + Запрос = Новый Запрос; + Запрос.Параметры.Вставить("ВидОбработок", ВидОбработок); + Запрос.Текст = ТекстЗапроса; + + ТаблицаОбработок = Запрос.Выполнить().Выгрузить(); + + МоиКомандыДерево = РеквизитФормыВЗначение("МоиКоманды"); + + ТаблицаМоихКоманд = ПолучитьТаблицу(); + + Если ЭтоГлобальныеОбработки Тогда + Для Каждого СтрокаРазделы Из МоиКомандыДерево.Строки Цикл + Для Каждого СтрокаКоманды Из СтрокаРазделы.Строки Цикл + НоваяСтрока = ТаблицаМоихКоманд.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаКоманды); + КонецЦикла; + КонецЦикла; + Иначе + Для Каждого СтрокаКоманды Из МоиКомандыДерево.Строки Цикл + НоваяСтрока = ТаблицаМоихКоманд.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаКоманды); + КонецЦикла; + КонецЕсли; + + ТаблицаМоихКоманд.Свернуть("Обработка,Идентификатор"); + + //---------------- + + ТаблицаСравнения = ТаблицаОбработок.Скопировать(); + ТаблицаСравнения.Колонки.Добавить("Признак", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(1))); + Для Каждого Строка Из ТаблицаСравнения Цикл + Строка.Признак = -1; + КонецЦикла; + + Для Каждого Строка Из ТаблицаМоихКоманд Цикл + НоваяСтрока = ТаблицаСравнения.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); + НоваяСтрока.Признак = +1; + КонецЦикла; + + ТаблицаСравнения.Свернуть("Обработка,Идентификатор", "Признак"); + + СтрокиДляИсключенияИзСпискаСвоих = ТаблицаСравнения.НайтиСтроки(Новый Структура("Признак", -1)); + СтрокиДляДобавленияВСписокСвоих = ТаблицаСравнения.НайтиСтроки(Новый Структура("Признак", 0)); + + НачатьТранзакцию(); + + Попытка + УдалитьКомандыИзСпискаСвоих(СтрокиДляИсключенияИзСпискаСвоих); + ДобавитьКомандыВСписокСвоих(СтрокиДляДобавленияВСписокСвоих); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ДобавитьКомандыВСписокСвоих(СтрокиДляДобавленияВСписокСвоих) + + УстановитьПривилегированныйРежим(Истина); + + Для Каждого ЭлементСтрока Из СтрокиДляДобавленияВСписокСвоих Цикл + + Запись = РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам.СоздатьМенеджерЗаписи(); + Запись.ДополнительныйОтчетИлиОбработка = ЭлементСтрока.Обработка; + Запись.ИдентификаторКоманды = ЭлементСтрока.Идентификатор; + Запись.Пользователь = ОбщегоНазначения.ТекущийПользователь(); + Запись.Доступно = Истина; + + Запись.Записать(Истина); + КонецЦикла; + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура УдалитьКомандыИзСпискаСвоих(СтрокиДляИсключенияИзСпискаСвоих) + + УстановитьПривилегированныйРежим(Истина); + + Для Каждого ЭлементСтрока Из СтрокиДляИсключенияИзСпискаСвоих Цикл + + Запись = РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам.СоздатьМенеджерЗаписи(); + Запись.ДополнительныйОтчетИлиОбработка = ЭлементСтрока.Обработка; + Запись.ИдентификаторКоманды = ЭлементСтрока.Идентификатор; + Запись.Пользователь = ОбщегоНазначения.ТекущийПользователь(); + Запись.Прочитать(); + Запись.Удалить(); + + КонецЦикла; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьТаблицу() + + ТаблицаКоманд = Новый ТаблицаЗначений; + ТаблицаКоманд.Колонки.Добавить("Обработка", Новый ОписаниеТипов("СправочникСсылка.ДополнительныеОтчетыИОбработки")); + ТаблицаКоманд.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); + + Возврат ТаблицаКоманд; + +КонецФункции diff --git a/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/НастройкаМоихОтчетовИОбработок.mdo b/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/НастройкаМоихОтчетовИОбработок.mdo new file mode 100644 index 000000000..4c72a1ad6 --- /dev/null +++ b/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/НастройкаМоихОтчетовИОбработок.mdo @@ -0,0 +1,10 @@ + + + НастройкаМоихОтчетовИОбработок + + ru + Настройка моих отчетов и обработок + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonForms/НастройкаПечатныхФормПередОтправкой/Form.form b/SSL/src/CommonForms/НастройкаПечатныхФормПередОтправкой/Form.form new file mode 100644 index 000000000..0efd3c230 --- /dev/null +++ b/SSL/src/CommonForms/НастройкаПечатныхФормПередОтправкой/Form.form @@ -0,0 +1,394 @@ + + + + <key>ru</key> + <value>Подготовка документов к отправке</value> + + + Форматы + 28 + + ФорматMXL + 29 + true + true + + true + + + ФорматMXL + + Right + + ФорматMXLРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ФорматMXLКонтекстноеМеню + 30 + true + + CheckBoxField + Enter + true + Left + true + + + + ФорматXLS + 31 + true + true + + true + + + ФорматXLS + + Right + + ФорматXLSРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ФорматXLSКонтекстноеМеню + 32 + true + + CheckBoxField + Enter + true + Left + true + + + + ФорматHTML + 33 + true + true + + true + + + ФорматHTML + + Right + + ФорматHTMLРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + ФорматHTMLКонтекстноеМеню + 34 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Формат отправляемых документов</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + Форматы + + true + + ФорматыРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + StrongSeparation + true + true + Auto + Auto + + + + ЗапаковатьZIP + 14 + true + true + + true + + + ЗапаковатьZIP + + Right + + ЗапаковатьZIPРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ЗапаковатьZIPКонтекстноеМеню + 15 + true + + CheckBoxField + Enter + true + Left + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + КнопкаОК + 17 + true + true + + true + + false + + КнопкаОКРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + Form.Command.КнопкаОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 37 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + 38 + DontBlock + Use + UseList + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ЗапаковатьZIP + + <key>ru</key> + <value>Упаковать в zip-архив</value> + + 2 + + Boolean + + + true + + + true + + + ЗапаковатьZIP + + + + ФорматMXL + + <key>ru</key> + <value>MXL (табличный документ 1С:Предприятие)</value> + + 5 + + Boolean + + + true + + + true + + + ФорматMXL + + + + ФорматXLS + + <key>ru</key> + <value>XLS (табличный документ MS Excel)</value> + + 6 + + Boolean + + + true + + + true + + + ФорматXLS + + + + ФорматHTML + + <key>ru</key> + <value>HTML</value> + + 7 + + Boolean + + + true + + + true + + + ФорматHTML + + + + КнопкаОК + + <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 new file mode 100644 index 000000000..ccccfcf19 --- /dev/null +++ b/SSL/src/CommonForms/НастройкаПечатныхФормПередОтправкой/Module.bsl @@ -0,0 +1,40 @@ +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + #Если ВебКлиент Тогда + ФорматMXL = Истина; + ФорматXLS = Ложь; + ФорматHTML = Ложь; + Элементы.ФорматXLS.Доступность = Ложь; + Элементы.ФорматHTML.Доступность = Ложь; + #КонецЕсли + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура КнопкаОтменаВыполнить() + + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура КнопкаОКВыполнить() + + Если Не ФорматMXL И Не ФорматXLS И Не ФорматHTML Тогда + Предупреждение(НСтр("ru = 'Необходимо указать как минимум один из форматов: MXL, XLS или HTML!'")); + Возврат; + КонецЕсли; + + Результат = Новый Структура; + Результат.Вставить("ЗапаковатьZIP", ЗапаковатьZIP); + Результат.Вставить("ФорматMXL", ФорматMXL); + Результат.Вставить("ФорматXLS", ФорматXLS); + Результат.Вставить("ФорматHTML", ФорматHTML); + + Закрыть(Результат); + +КонецПроцедуры diff --git a/SSL/src/CommonForms/НастройкаПечатныхФормПередОтправкой/НастройкаПечатныхФормПередОтправкой.mdo b/SSL/src/CommonForms/НастройкаПечатныхФормПередОтправкой/НастройкаПечатныхФормПередОтправкой.mdo new file mode 100644 index 000000000..f8fe029d9 --- /dev/null +++ b/SSL/src/CommonForms/НастройкаПечатныхФормПередОтправкой/НастройкаПечатныхФормПередОтправкой.mdo @@ -0,0 +1,11 @@ + + + НастройкаПечатныхФормПередОтправкой + + ru + Настройка печатных форм перед отправкой + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/НастройкиЭЦП/Form.form b/SSL/src/CommonForms/НастройкиЭЦП/Form.form new file mode 100644 index 000000000..7098e2e8c --- /dev/null +++ b/SSL/src/CommonForms/НастройкиЭЦП/Form.form @@ -0,0 +1,819 @@ + + + + <key>ru</key> + <value>Настройки ЭЦП и шифрования</value> + + + ПровайдерЭЦП + 1 + true + true + + true + + + ПровайдерЭЦП + + + OnChange + ПровайдерЭЦППриИзменении + + + ПровайдерЭЦПРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ПровайдерЭЦПКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + 50 + true + true + true + true + true + true + Normal + + + + ТипПровайдераЭЦП + 3 + true + true + + true + + + ТипПровайдераЭЦП + + + ТипПровайдераЭЦПРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ТипПровайдераЭЦПКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + АлгоритмПодписи + 7 + true + true + + true + + + АлгоритмПодписи + + + АлгоритмПодписиРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + АлгоритмПодписиКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + АлгоритмХеширования + 9 + true + true + + true + + + АлгоритмХеширования + + + АлгоритмХешированияРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + АлгоритмХешированияКонтекстноеМеню + 10 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + АлгоритмШифрования + 15 + true + true + + true + + + АлгоритмШифрования + + + АлгоритмШифрованияРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + АлгоритмШифрованияКонтекстноеМеню + 16 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ВыполнятьПроверкуЭЦПНаСервере + 11 + true + true + + true + + + ВыполнятьПроверкуЭЦПНаСервере + + Right + + OnChange + ВыполнятьПроверкуЭЦПНаСервереПриИзменении + + + ВыполнятьПроверкуЭЦПНаСервереРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ВыполнятьПроверкуЭЦПНаСервереКонтекстноеМеню + 12 + true + + CheckBoxField + Enter + true + Left + true + + + + ПутиМодулейКриптографииСерверовЛинукс + 17 + + <key>ru</key> + <value>Пути модулей криптографии серверов 1С:Предприятия под управлением ОС Линукс</value> + + true + true + + true + + + ПутиМодулейКриптографииСерверовЛинукс + + Top + + ПутиМодулейКриптографииСерверовЛинуксИмяКомпьютера + 20 + true + true + + true + + + ПутиМодулейКриптографииСерверовЛинукс.ИмяКомпьютера + + + ПутиМодулейКриптографииСерверовЛинуксИмяКомпьютераРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ПутиМодулейКриптографииСерверовЛинуксИмяКомпьютераКонтекстноеМеню + 21 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПутиМодулейКриптографииСерверовЛинуксПутьМодуляКриптографии + 22 + true + true + + true + + + ПутиМодулейКриптографииСерверовЛинукс.ПутьМодуляКриптографии + + + ПутиМодулейКриптографииСерверовЛинуксПутьМодуляКриптографииРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ПутиМодулейКриптографииСерверовЛинуксПутьМодуляКриптографииКонтекстноеМеню + 23 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПутиМодулейКриптографииСерверовЛинуксКомментарий + 24 + true + true + + true + + + ПутиМодулейКриптографииСерверовЛинукс.Комментарий + + + ПутиМодулейКриптографииСерверовЛинуксКомментарийРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + ПутиМодулейКриптографииСерверовЛинуксКомментарийКонтекстноеМеню + 25 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПутиМодулейКриптографииСерверовЛинуксКоманднаяПанель + 19 + Left + true + + + ПутиМодулейКриптографииСерверовЛинуксСтрокаПоиска + 41 + + ПутиМодулейКриптографииСерверовЛинуксСтрокаПоискаРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ПутиМодулейКриптографииСерверовЛинуксСтрокаПоискаКонтекстноеМеню + 42 + true + + ПутиМодулейКриптографииСерверовЛинукс + + true + + + + ПутиМодулейКриптографииСерверовЛинуксСостояниеПросмотра + 44 + + ПутиМодулейКриптографииСерверовЛинуксСостояниеПросмотраРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ПутиМодулейКриптографииСерверовЛинуксСостояниеПросмотраКонтекстноеМеню + 45 + true + + ViewStatusAddition + ПутиМодулейКриптографииСерверовЛинукс + + true + + + + ПутиМодулейКриптографииСерверовЛинуксУправлениеПоиском + 47 + + ПутиМодулейКриптографииСерверовЛинуксУправлениеПоискомРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + ПутиМодулейКриптографииСерверовЛинуксУправлениеПоискомКонтекстноеМеню + 48 + true + + SearchControlAddition + ПутиМодулейКриптографииСерверовЛинукс + + true + + + + ПутиМодулейКриптографииСерверовЛинуксРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + ПутиМодулейКриптографииСерверовЛинуксКонтекстноеМеню + 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 + +
    + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 13 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 14 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + ПровайдерЭЦП + + <key>ru</key> + <value>Провайдер ЭЦП</value> + + 1 + + String + + + + true + + + true + + ShowError + + + ТипПровайдераЭЦП + + <key>ru</key> + <value>Тип провайдера ЭЦП</value> + + 2 + + Number + + 10 + + + + true + + + true + + + + АлгоритмПодписи + + <key>ru</key> + <value>Алгоритм подписи</value> + + 4 + + String + + + + true + + + true + + ShowError + + + АлгоритмХеширования + + <key>ru</key> + <value>Алгоритм хеширования</value> + + 5 + + String + + + + true + + + true + + ShowError + + + ВыполнятьПроверкуЭЦПНаСервере + + <key>ru</key> + <value>Выполнять проверку ЭЦП на сервере</value> + + 6 + + Boolean + + + true + + + true + + + + АлгоритмШифрования + + <key>ru</key> + <value>Алгоритм шифрования</value> + + 7 + + String + + + + true + + + true + + ShowError + + + ГлавныйУзел + + <key>ru</key> + <value>Главный узел</value> + + 8 + + Boolean + + + true + + + true + + + + ПутиМодулейКриптографииСерверовЛинукс + + <key>ru</key> + <value>Пути модулей криптографии серверов линукс</value> + + 3 + + ValueTable + + + true + + + true + + + ИмяКомпьютера + + <key>ru</key> + <value>Имя компьютера</value> + + 1 + + String + + + + true + + + true + + + + ПутьМодуляКриптографии + + <key>ru</key> + <value>Путь модуля криптографии</value> + + 2 + + String + + + + true + + + true + + + + Комментарий + + <key>ru</key> + <value>Комментарий</value> + + 3 + + String + + + + true + + + true + + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + + + +
    diff --git a/SSL/src/CommonForms/НастройкиЭЦП/Help/ru.html b/SSL/src/CommonForms/НастройкиЭЦП/Help/ru.html new file mode 100644 index 000000000..f912a553a --- /dev/null +++ b/SSL/src/CommonForms/НастройкиЭЦП/Help/ru.html @@ -0,0 +1,15 @@ + +

    В форме выполняется настройка параметров для использования средств криптографии: электронно-цифровой подписи (ЭЦП) и шифрования.

    +

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

    +

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

    +

    + + + + + + + + +
    НастройкаОписание
    Провайдер ЭЦПСтрока, идентифицирующая провайдера ЭЦП, например: "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider".
    Тип провайдера ЭЦПЧисло, указывающее тип провайдера ЭЦП. Например, для Крипто Про - 75.
    Выполнять проверку ЭЦП на сервереЕсли настройка установлена, то проверка ЭЦП выполняется на сервере, иначе - на клиенте.
    Путь модуля криптографии (для сервера 1С:Предприятия под управлением Linux)Путь к модулю криптографии. Имеет смысл, если установлена настройка "Выполнять проверку ЭЦП на сервере".
    Алгоритм подписиУказывается алгоритм подписи. Выбирается из списка выбора, предоставляемого провайдером ЭЦП.
    Алгоритм хешированияУказывается алгоритм хеширования. Выбирается из списка выбора, предоставляемого провайдером ЭЦП.
    Алгоритм шифрованияУказывается алгоритм шифрования. Выбирается из списка выбора, предоставляемого провайдером ЭЦП.

     

    +

     

    \ 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..c13895412 --- /dev/null +++ b/SSL/src/CommonForms/НастройкиЭЦП/Module.bsl @@ -0,0 +1,157 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ГлавныйУзел = (ПланыОбмена.ГлавныйУзел() <> Неопределено); + + УстановитьПривилегированныйРежим(Истина); + Запрос = Новый Запрос(); + Запрос.Текст = "ВЫБРАТЬ + | ПутиМодулейКриптографииСерверовЛинукс.ИмяКомпьютера, + | ПутиМодулейКриптографииСерверовЛинукс.ПутьМодуляКриптографии, + | ПутиМодулейКриптографииСерверовЛинукс.Комментарий + |ИЗ + | РегистрСведений.ПутиМодулейКриптографииСерверовЛинукс КАК ПутиМодулейКриптографииСерверовЛинукс"; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + Строка = ПутиМодулейКриптографииСерверовЛинукс.Добавить(); + + Строка.ИмяКомпьютера = Выборка.ИмяКомпьютера; + Строка.ПутьМодуляКриптографии = Выборка.ПутьМодуляКриптографии; + Строка.Комментарий = Выборка.Комментарий; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ПровайдерЭЦП = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ПровайдерЭЦП; + ПутьМодуляКриптографии = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ПутьМодуляКриптографии; + ТипПровайдераЭЦП = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ТипПровайдераЭЦП; + + АлгоритмПодписи = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().АлгоритмПодписи; + АлгоритмХеширования = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().АлгоритмХеширования; + АлгоритмШифрования = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().АлгоритмШифрования; + + ВыполнятьПроверкуЭЦПНаСервере = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ВыполнятьПроверкуЭЦПНаСервере; + + Элементы.ПутиМодулейКриптографииСерверовЛинукс.Доступность = ВыполнятьПроверкуЭЦПНаСервере; + Элементы.ПутиМодулейКриптографииСерверовЛинуксКоманднаяПанель.Доступность = ВыполнятьПроверкуЭЦПНаСервере; + + Если ГлавныйУзел Тогда // мы в не главном узле + Элементы.АлгоритмПодписи.ТолькоПросмотр = Истина; + Элементы.АлгоритмХеширования.ТолькоПросмотр = Истина; + Элементы.АлгоритмШифрования.ТолькоПросмотр = Истина; + Элементы.ПровайдерЭЦП.ТолькоПросмотр = Истина; + Элементы.ТипПровайдераЭЦП.ТолькоПросмотр = Истина; + КонецЕсли; + + Если ТипПровайдераЭЦП = 0 Тогда + ТипПровайдераЭЦП = 75; // Крипто Про + КонецЕсли; + + Если ПустаяСтрока(ПровайдерЭЦП) Тогда + + Попытка + МенеджерКриптографии = Новый МенеджерКриптографии("", "", ТипПровайдераЭЦП); + ИнформацияМенеджера = МенеджерКриптографии.ПолучитьИнформациюМодуляКриптографии(); + ПровайдерЭЦП = ИнформацияМенеджера.Имя; + Исключение + // не обрабатываем исключение - вполне допустимо исключение, если нет ни одного криптопровайдера + КонецПопытки; + + КонецЕсли; + + ЗаполнитьСпискиВыбораНаКлиенте(); + +КонецПроцедуры + +&НаСервере +Процедура СохранитьПараметры() + + УстановитьПривилегированныйРежим(Истина); + Константы.ПровайдерЭЦП.Установить(ПровайдерЭЦП); + Константы.ТипПровайдераЭЦП.Установить(ТипПровайдераЭЦП); + Константы.АлгоритмХеширования.Установить(АлгоритмХеширования); + Константы.АлгоритмПодписи.Установить(АлгоритмПодписи); + Константы.АлгоритмШифрования.Установить(АлгоритмШифрования); + Константы.ВыполнятьПроверкуЭЦПНаСервере.Установить(ВыполнятьПроверкуЭЦПНаСервере); + + Для Каждого Строка Из ПутиМодулейКриптографииСерверовЛинукс Цикл + НаборЗаписей = РегистрыСведений.ПутиМодулейКриптографииСерверовЛинукс.СоздатьНаборЗаписей(); + + НаборЗаписей.Отбор.ИмяКомпьютера.Установить(Строка.ИмяКомпьютера); + + НоваяЗапись = НаборЗаписей.Добавить(); + НоваяЗапись.ИмяКомпьютера = Строка.ИмяКомпьютера; + НоваяЗапись.ПутьМодуляКриптографии = Строка.ПутьМодуляКриптографии; + НоваяЗапись.Комментарий = Строка.Комментарий; + + НаборЗаписей.Записать(); + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + + СохранитьПараметры(); + ОбновитьПовторноИспользуемыеЗначения(); + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьСпискиВыбораНаКлиенте() + + Если НЕ ПустаяСтрока(ПровайдерЭЦП) Тогда + Попытка + ПутьМодуляКриптографии = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ПутьМодуляКриптографии; + + МенеджерКриптографии = Новый МенеджерКриптографии(ПровайдерЭЦП, ПутьМодуляКриптографии, ТипПровайдераЭЦП); + ИнформацияМенеджера = МенеджерКриптографии.ПолучитьИнформациюМодуляКриптографии(); + + // заполняем списки выбора + Элементы.АлгоритмПодписи.СписокВыбора.Очистить(); + Для Индекс = 0 По ИнформацияМенеджера.АлгоритмыПодписи.Количество() - 1 Цикл + Строка = ИнформацияМенеджера.АлгоритмыПодписи.Получить(Индекс); + Элементы.АлгоритмПодписи.СписокВыбора.Добавить(Строка); + КонецЦикла; + + Элементы.АлгоритмХеширования.СписокВыбора.Очистить(); + Для Индекс = 0 По ИнформацияМенеджера.АлгоритмыХеширования.Количество() - 1 Цикл + Строка = ИнформацияМенеджера.АлгоритмыХеширования.Получить(Индекс); + Элементы.АлгоритмХеширования.СписокВыбора.Добавить(Строка); + КонецЦикла; + + Элементы.АлгоритмШифрования.СписокВыбора.Очистить(); + Для Индекс = 0 По ИнформацияМенеджера.АлгоритмыШифрования.Количество() - 1 Цикл + Строка = ИнформацияМенеджера.АлгоритмыШифрования.Получить(Индекс); + Элементы.АлгоритмШифрования.СписокВыбора.Добавить(Строка); + КонецЦикла; + + Исключение + // Ситуация, когда нет ни одного криптопровайдера является нормальной + КонецПопытки; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПровайдерЭЦППриИзменении(Элемент) + + ЗаполнитьСпискиВыбораНаКлиенте(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнятьПроверкуЭЦПНаСервереПриИзменении(Элемент) + + Элементы.ПутиМодулейКриптографииСерверовЛинукс.Доступность = ВыполнятьПроверкуЭЦПНаСервере; + Элементы.ПутиМодулейКриптографииСерверовЛинуксКоманднаяПанель.Доступность = ВыполнятьПроверкуЭЦПНаСервере; + +КонецПроцедуры + diff --git a/SSL/src/CommonForms/НастройкиЭЦП/НастройкиЭЦП.mdo b/SSL/src/CommonForms/НастройкиЭЦП/НастройкиЭЦП.mdo new file mode 100644 index 000000000..c9461cd9b --- /dev/null +++ b/SSL/src/CommonForms/НастройкиЭЦП/НастройкиЭЦП.mdo @@ -0,0 +1,15 @@ + + + НастройкиЭЦП + + ru + Настройки ЭЦП + + + + ru + + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Form.form b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Form.form new file mode 100644 index 000000000..600110a5b --- /dev/null +++ b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Form.form @@ -0,0 +1,166 @@ + + + + ОписаниеОбновлений + 1 + + <key>ru</key> + <value>Описание обновлений</value> + + true + true + + true + + + ОписаниеОбновлений + + None + + ОписаниеОбновленийРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ОписаниеОбновленийКонтекстноеМеню + 2 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + + Selection + ОписаниеОбновленийВыбор + + 80 + true + 20 + true + true + true + Special + ScrollAlways + ScrollAlways + true + Auto + true + true + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Закрыть + 3 + true + true + + true + + true + false + + ЗакрытьРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + Form.StandardCommand.Close + true + true + true + UserCmds + Auto + + + Справка + 4 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ОписаниеОбновлений + + <key>ru</key> + <value>Описание обновлений</value> + + 2 + + SpreadsheetDocument + + + true + + + true + + + + + ВыполненныеОбработчикиОбновления + + String + + + true + + + + + + diff --git a/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Help/ru.html b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Help/ru.html new file mode 100644 index 000000000..e63c91757 --- /dev/null +++ b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Help/ru.html @@ -0,0 +1,2 @@ + +

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

    \ 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..8849b5a9b --- /dev/null +++ b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Module.bsl @@ -0,0 +1,35 @@ +////////////////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ПустаяСтрока(Параметры.ВыполненныеОбработчикиОбновления) Тогда + ДокументОписаниеОбновлений = Метаданные.ОбщиеМакеты.Найти("ОписаниеИзмененийСистемы"); + Если ДокументОписаниеОбновлений <> Неопределено Тогда + ДокументОписаниеОбновлений = ПолучитьОбщийМакет(ДокументОписаниеОбновлений); + Иначе + ДокументОписаниеОбновлений = Новый ТабличныйДокумент(); + КонецЕсли; + Иначе + ВыполненныеОбработчикиОбновления = ПолучитьИзВременногоХранилища(Параметры.ВыполненныеОбработчикиОбновления); + ДокументОписаниеОбновлений = ОбновлениеИнформационнойБазы.ДокументОписаниеОбновлений(ВыполненныеОбработчикиОбновления); + КонецЕсли; + Если ДокументОписаниеОбновлений.ВысотаТаблицы = 0 Тогда + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Конфигурация успешно обновлена на версию %1'"), Метаданные.Версия); + ДокументОписаниеОбновлений.Область("R1C1:R1C1").Текст = Текст; + КонецЕсли; + ОбновлениеИнформационнойБазыПереопределяемый.ПриПодготовкеМакетаОписанияОбновлений(ДокументОписаниеОбновлений); + ОписаниеОбновлений.Очистить(); + ОписаниеОбновлений.Вывести(ДокументОписаниеОбновлений); + +КонецПроцедуры + +&НаКлиенте +Процедура ОписаниеОбновленийВыбор(Элемент, Область, СтандартнаяОбработка) + + ОбновлениеИнформационнойБазыКлиентПереопределяемый.ПриНажатииНаГиперссылкуВДокументеОписанияОбновлений(Область); + +КонецПроцедуры + diff --git a/SSL/src/CommonForms/ОписаниеИзмененийСистемы/ОписаниеИзмененийСистемы.mdo b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/ОписаниеИзмененийСистемы.mdo new file mode 100644 index 000000000..460e8b583 --- /dev/null +++ b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/ОписаниеИзмененийСистемы.mdo @@ -0,0 +1,17 @@ + + + ОписаниеИзмененийСистемы + + ru + Описание изменений системы + + true + + + ru + + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/ПанельОтчетов/Form.form b/SSL/src/CommonForms/ПанельОтчетов/Form.form new file mode 100644 index 000000000..3de9461f2 --- /dev/null +++ b/SSL/src/CommonForms/ПанельОтчетов/Form.form @@ -0,0 +1,469 @@ + + + + ГруппаОсновная + 1 + + КартинкаОтчета + 9 + + <key>ru</key> + <value>Картинка отчета</value> + + true + + true + + + КартинкаОтчетаРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + КартинкаОтчетаКонтекстноеМеню + 10 + true + + 5 + true + 2 + true + false + + + StdPicture.CheckSyntax + + + + true + true + + true + + + <key>ru</key> + <value>Отчеты</value> + + + ru + Группа основная + + + ГруппаОсновнаяРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаСмТакже + 14 + + Декорация + 18 + + <key>ru</key> + <value>См. также</value> + + true + true + + true + + + ДекорацияРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ДекорацияКонтекстноеМеню + 19 + true + + Label + true + true + true + false + + 168 + 162 + 126 + + + System.DefaultGUIFont + 11.0 + true + false + false + false + + + Left + + + + ГруппаСмТакжеСпискиОтчетов + 20 + true + true + + true + + + <key>ru</key> + <value>Группа см также списки отчетов</value> + + + ru + Группа см также списки отчетов + + + ГруппаСмТакжеСпискиОтчетовРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + + true + + + System.DefaultGUIFont + 12.0 + true + false + false + false + + true + + ГруппаСмТакжеРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + + ОбщийСписокВаринтовОтчетов + 21 + + <key>ru</key> + <value>Все отчеты...</value> + + true + true + + true + + + ОбщийСписокВаринтовОтчетовРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Hyperlink + Form.Command.ОбщийСписокВаринтовОтчетов + Normal + Auto + true + true + UserCmds + Auto + + None + false + + ФормаКоманднаяПанель + -1 + Left + + + ChoiceProcessing + ОбработкаВыбора + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + Close + CustomizeForm + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + СписокПодсистем + + <key>ru</key> + <value>Список подсистем</value> + + 1 + + ValueList + + + true + + + true + + + + + + + Подсистемы + + <key>ru</key> + <value>Подсистемы</value> + + 2 + + ValueList + String + + + + 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 + + String + + + + true + + + true + + + + ИмяФормыОтчетов + + <key>ru</key> + <value>Имя формы отчетов</value> + + 6 + + String + + + + true + + + true + + + + КартинкаФормы + + <key>ru</key> + <value>Картинка формы</value> + + 7 + + String + + + + true + + + true + + + + ПутиПодсистемы + + <key>ru</key> + <value>Пути подсистемы</value> + + 8 + + ValueList + + + true + + + true + + + + + + + ОбщийСписокВаринтовОтчетов + + <key>ru</key> + <value>Полный список отчетов</value> + + 2 + + ru + Общий список варинтов отчетов + + + true + + + + ОбщийСписокВаринтовОтчетов + + + Auto + Auto + + + Подсистемы + + ValueList + String + + 500 + + + + + НеВыводить + + ValueList + + + + АдрессПараметровВызова + + String + + + + + КартинкаФормы + + String + + + + + + + + diff --git a/SSL/src/CommonForms/ПанельОтчетов/Module.bsl b/SSL/src/CommonForms/ПанельОтчетов/Module.bsl new file mode 100644 index 000000000..b95c15108 --- /dev/null +++ b/SSL/src/CommonForms/ПанельОтчетов/Module.bsl @@ -0,0 +1,515 @@ +Перем СоответсвиеВариантовГруппировке, СоответсвиеВариантовНомеруСортировки, СписокОтчетов; +Перем ПараметрыВызова, СтрокаФиксированнаяГруппировка, ТаблицаВариантов; + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Подсистемы = Параметры.Подсистемы; + ИмяФормыОтчетов = Параметры.ИмяФормы; + КартинкаФормы = Параметры.КартинкаФормы; + ГруппироватьВарианты = истина; + + Заголовок = Параметры.ИмяФормы; + Если Параметры.КартинкаФормы <> "" тогда + Элементы.КартинкаОтчета.Картинка = БиблиотекаКартинок[Параметры.КартинкаФормы]; + Элементы.КартинкаОтчета.Видимость = истина; + КонецЕсли; + + Если ТипЗнч(Параметры.Подсистемы) = Тип("СписокЗначений") тогда + ПутиПодсистемы = Параметры.Подсистемы; + Иначе + ПутиПодсистемы = Новый СписокЗначений; + ПутиПодсистемы.Добавить(Параметры.Подсистемы); + КонецЕсли; + + НарисоватьПанель(); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура НарисоватьПанель() + + СписокОтчетов = ВариантыОтчетовПереопределяемый.СписокОтчетовПоддерживаемыхПодсистемой(); + + ДеревоПодсистем = Новый ДеревоЗначений; + ДеревоПодсистем.Колонки.Добавить("Подсистема"); + ДеревоПодсистем.Колонки.Добавить("Название"); + + // Сделаем список отчетов + СписокПодсистем = ВариантыОтчетов.ПолучитьСписокПодсистем(ПутиПодсистемы, ДеревоПодсистем); + + Если СписокПодсистем.Количество() = 0 тогда + Возврат; + КонецЕсли; + + МаксимальнаяДлинна = 0; + + Для каждого ЭлементСпПодсистема из СписокПодсистем Цикл + МаксимальнаяДлинна = Макс(СтрДлина(ЭлементСпПодсистема.Значение), МаксимальнаяДлинна); + КонецЦикла; + + + // Получить вариантов отчетов с разделами + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетов.КлючОбъекта + ""\"" + ВариантыОтчетов.КлючВарианта КАК Ключ, + | ВариантыОтчетов.Наименование КАК Представление, + | ВариантыОтчетов.Описание, + | ВариантыОтчетов.Видимость, + | ВариантыОтчетов.Наименование КАК Сортировка, + | ВариантыОтчетов.ТипВариантаОтчета, + | ВариантыОтчетовПодсистемы.Подсистема + |ИЗ + | Справочник.ВариантыОтчетов.Подсистемы КАК ВариантыОтчетовПодсистемы + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов КАК ВариантыОтчетов + | ПО ВариантыОтчетовПодсистемы.Ссылка = ВариантыОтчетов.Ссылка + |ГДЕ + | (НЕ ВариантыОтчетов.ПометкаУдаления) + | И ВЫРАЗИТЬ(ВариантыОтчетовПодсистемы.Подсистема КАК Строка("+Формат(МаксимальнаяДлинна, "ЧГ=0")+"))В (&Подсистемы) + | И ВариантыОтчетов.КлючОбъекта В (&СписокОтчетов) + | + |УПОРЯДОЧИТЬ ПО + | Сортировка"; + + Запрос = Новый Запрос(ТЗ); + Запрос.УстановитьПараметр("Подсистемы", СписокПодсистем); + Запрос.УстановитьПараметр("СписокОтчетов", СписокОтчетов); + УстановитьПривилегированныйРежим(истина); + ТаблицаВариантов = Запрос.Выполнить().Выгрузить(); + УстановитьПривилегированныйРежим(ложь); + + // роли варинатов + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетов.КлючОбъекта + ""\"" + ВариантыОтчетов.КлючВарианта КАК Ключ, + | ВариантыОтчетовНастройкаВидимости.Пользователь, + | НЕ ВариантыОтчетовНастройкаВидимости.Ссылка.Видимость КАК Видимость + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов.НастройкаВидимости КАК ВариантыОтчетовНастройкаВидимости + | ПО ВариантыОтчетов.Ссылка = ВариантыОтчетовНастройкаВидимости.Ссылка + |ГДЕ + | (НЕ ВариантыОтчетов.ПометкаУдаления) + | И ВариантыОтчетов.КлючОбъекта + ""\"" + ВариантыОтчетов.КлючВарианта В (&Ключи) + | И ВариантыОтчетов.КлючОбъекта В (&СписокОтчетов) + | И (ВариантыОтчетовНастройкаВидимости.Пользователь = Пользователь)"; + + Запрос.Текст = ТЗ; + Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь); + Запрос.УстановитьПараметр("Ключи", ТаблицаВариантов.ВыгрузитьКолонку("Ключ")); + УстановитьПривилегированныйРежим(истина); + ТаблицаПользователей = Запрос.Выполнить().Выгрузить(); + УстановитьПривилегированныйРежим(ложь); + + ТаблицаВариантов.Колонки.Добавить("Группировка", Новый ОписаниеТипов(,, Новый КвалификаторыСтроки())); + + СписокГруппировок = Новый ТаблицаЗначений; + СписокГруппировок.Колонки.Добавить("Группировка"); + СписокГруппировок.Колонки.Добавить("ГруппировкаПредставление"); + + Для каждого СтрокаПодсистемы из ДеревоПодсистем.Строки Цикл + ДанныеГруппировки = СписокГруппировок.Добавить(); + ДанныеГруппировки.Группировка = СтрокаПодсистемы.Подсистема; + ДанныеГруппировки.ГруппировкаПредставление = ""; + Для каждого СтрокаГруппировки из СтрокаПодсистемы.Строки Цикл + ДанныеГруппировки = СписокГруппировок.Добавить(); + ДанныеГруппировки.Группировка = СтрокаГруппировки.Подсистема; + ДанныеГруппировки.ГруппировкаПредставление = СтрокаГруппировки.Название; + КонецЦикла; + КонецЦикла; + + // создадим дерево вариантов + + ГруппировкиВариантов = Новый Соответствие; + + ГруппировкиВариантовСмТакже = Новый СписокЗначений; + + СгруппированныйСписокВариантовОтчетов = Новый ДеревоЗначений; + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("Ключ"); + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("Представление"); + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("Описание"); + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("Группировка"); + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("ГруппировкаПредставление"); + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("Сортировка"); + СгруппированныйСписокВариантовОтчетов.Колонки.Добавить("Видимость"); + + Если ГруппироватьВарианты тогда + Для каждого ГруппировкаВар из СписокГруппировок Цикл + Если Найти(ГруппировкаВар.Группировка, "СмТакже") > 0 тогда + Продолжить; + КонецЕсли; + СтрокаГруппировкиОтчета = СгруппированныйСписокВариантовОтчетов.Строки.Добавить(); + СтрокаГруппировкиОтчета.Группировка = ГруппировкаВар.Группировка; + СтрокаГруппировкиОтчета.ГруппировкаПредставление = ГруппировкаВар.ГруппировкаПредставление; + ГруппировкиВариантов.Вставить(ГруппировкаВар.Группировка, СтрокаГруппировкиОтчета); + КонецЦикла; + КонецЕсли; + + СтрокаГруппировкиОтчета = СгруппированныйСписокВариантовОтчетов.Строки.Добавить(); + СтрокаГруппировкиОтчета.Группировка = "ПрочиеИПользовательскиеВариантыОтчета"; + СтрокаГруппировкиОтчета.ГруппировкаПредставление = НСТр("ru = 'Прочие'"); + ГруппировкиВариантов.Вставить("ПрочиеИПользовательскиеВариантыОтчета", СтрокаГруппировкиОтчета); + СтрокаФиксированнаяГруппировка = СтрокаГруппировкиОтчета; + + СтрокаГруппировкиОтчета = СгруппированныйСписокВариантовОтчетов.Строки.Добавить(); + СтрокаГруппировкиОтчета.Группировка = "СмТакже"; + СтрокаГруппировкиОтчета.ГруппировкаПредставление = НСТр("ru = 'См. также'"); + ГруппировкиВариантов.Вставить("СмТакже", СтрокаГруппировкиОтчета); + СтрокаГруппировкаСмТакже = СтрокаГруппировкиОтчета; + + // Составим список отчетов + СоответсвиеВариантовГруппировке = Новый Соответствие; + СоответсвиеВариантовНомеруСортировки = Новый Соответствие; + + Для каждого СтрокаВариантаОтчета из ТаблицаВариантов Цикл + + Если НЕ ГруппироватьВарианты или НЕ ЗначениеЗаполнено(СтрокаВариантаОтчета.Подсистема ) тогда + СтрокаВариантаОтчета.Группировка = "ПрочиеИПользовательскиеВариантыОтчета"; + СоответсвиеВариантовГруппировке.Вставить(СтрокаВариантаОтчета.Ключ, "ПрочиеИПользовательскиеВариантыОтчета"); + Иначе + Если Найти(СтрокаВариантаОтчета.Подсистема, "СмТакже") > 0 тогда + СтрокаВариантаОтчета.Группировка = "СмТакже"; + ИначеЕсли СтрокаВариантаОтчета.Подсистема = СтрокаВариантаОтчета.Подсистема тогда + Для каждого ГруппировкаВараинта из ГруппировкиВариантов Цикл + Если СтрокаВариантаОтчета.Подсистема = ГруппировкаВараинта.Ключ тогда + СтрокаВариантаОтчета.Группировка = ГруппировкаВараинта.Ключ; + КонецЕсли; + КонецЦикла; + СоответсвиеВариантовГруппировке.Вставить(СтрокаВариантаОтчета.Ключ, СтрокаВариантаОтчета.Подсистема); + КонецЕсли; + КонецЕсли; + + СоответсвиеВариантовНомеруСортировки.Вставить(СтрокаВариантаОтчета.Ключ, СтрокаВариантаОтчета.Сортировка); + КонецЦикла; + + Для каждого СтрокаВарианта из ТаблицаВариантов Цикл + Видимость = СтрокаВарианта.Видимость; + СтрокиПользователи = ТаблицаПользователей.НайтиСтроки(Новый Структура("Ключ, Пользователь", СтрокаВарианта.Ключ, ПараметрыСеанса.ТекущийПользователь)); + Для каждого СтрокаПользователи из СтрокиПользователи Цикл + Видимость = СтрокаПользователи.Видимость; + КонецЦикла; + ДобавитьВариантыОтчета(ГруппировкиВариантов, СтрокаВарианта.Ключ, СтрокаВарианта.Представление, СтрокаВарианта.Описание, СтрокаВарианта.ТипВариантаОтчета, СтрокаВарианта.Группировка, Видимость); + КонецЦикла; + + //Удалить лишние группировки + УдаляемыеГруппировки = Новый Массив; + Для каждого СтрокаГруппировки из СгруппированныйСписокВариантовОтчетов.Строки Цикл + Если СтрокаГруппировки.Строки.Количество() = 0 тогда + УдаляемыеГруппировки.Добавить(СтрокаГруппировки); + КонецЕсли; + КонецЦикла; + + Для каждого СтрокаГруппировки из УдаляемыеГруппировки Цикл + СгруппированныйСписокВариантовОтчетов.Строки.Удалить(СтрокаГруппировки); + КонецЦикла; + + // Вывести группировки отчета + Если СгруппированныйСписокВариантовОтчетов.Строки.Количество() = 1 тогда + СтрокаГруппировки = СгруппированныйСписокВариантовОтчетов.Строки[0]; + Элементы.ГруппаОсновная.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; + ВывестиСслыкиНаВариантыОтчетов(СтрокаГруппировки, Элементы.ГруппаОсновная); + Иначе + Элементы.ГруппаОсновная.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + Для каждого СтрокаГруппировки из СгруппированныйСписокВариантовОтчетов.Строки Цикл + + Если Найти(СтрокаГруппировки.Группировка, "СмТакже") > 0 тогда + Продолжить; + КонецЕсли; + + // ПРОПУСТИТЬ ГРУППУ СМ ТАКЖЕ + УИ = "ГруппаРаздела_" + СтрокаГруппировки.Группировка; + Группа = ДобавитьГруппу(УИ, Элементы.ГруппаОсновная, СтрокаГруппировки.ГруппировкаПредставление, истина); + ВывестиСслыкиНаВариантыОтчетов(СтрокаГруппировки, Группа); + КонецЦикла; + КонецЕсли; + + Если СгруппированныйСписокВариантовОтчетов.Строки.Найти("СмТакже", "Группировка") <> Неопределено тогда + Элементы.ГруппаСмТакже.Видимость = Истина; + СтрокаГруппировки = СтрокаГруппировкаСмТакже; + Элементы.ГруппаСмТакжеСпискиОтчетов.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; + ВывестиСслыкиНаВариантыОтчетов(СтрокаГруппировки, Элементы.ГруппаСмТакжеСпискиОтчетов); + КонецЕсли; + +КонецПроцедуры + + +&НаСервере +Процедура ПолучитьСписокОбъектовОтчетов(Массив,Подсистема) + + ДобавитьВСписокОтчетыПодсистемы(Массив, Подсистема); + + Для каждого ОбъектПодсистемы из Подсистема.Подсистемы Цикл + ПолучитьСписокОбъектовОтчетов(Массив, ОбъектПодсистемы); + КонецЦикла + +КонецПроцедуры + +Процедура ДобавитьВСписокОтчетыПодсистемы(Массив, Подсистема) + + Для каждого Объект из Подсистема.Состав Цикл + ПолноеИмя = Объект.ПолноеИмя(); + Если Найти(ПолноеИмя, "Отчет.") = 0 + или СписокОтчетов.НайтиПоЗначению(ПолноеИмя) = Неопределено + или Параметры.НеВыводить.НайтиПоЗначению(ПолноеИмя) <> Неопределено + тогда + Продолжить; + КонецЕсли; + Массив.Добавить(ПолноеИмя); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьВариантыОтчета(ГруппировкиВариантов, Ключ, Представление, Описание, ТипВарианта, ГруппировкаРаздела, Видимость) + + Если ГруппировкаРаздела <> Неопределено тогда + Если ГруппировкиВариантов[ГруппировкаРаздела].Строки.НайтиСтроки(Новый Структура("Ключ", Ключ)).Количество() > 0 тогда + Возврат; + КонецЕсли; + СтрокаВариантаОтчета = ГруппировкиВариантов[ГруппировкаРаздела].Строки.Добавить(); + Иначе + Если СтрокаФиксированнаяГруппировка.Строки.НайтиСтроки(Новый Структура("Ключ", Ключ)).Количество() > 0 тогда + Возврат; + КонецЕсли; + СтрокаВариантаОтчета = СтрокаФиксированнаяГруппировка.Строки.Добавить(); + КонецЕсли; + Если ТипВарианта = Перечисления.ТипыВариантовОтчетов.Отчет тогда + СтрокаВариантаОтчета.Ключ = Ключ+"_Отчет_"; + Иначе + СтрокаВариантаОтчета.Ключ = Ключ; + КонецЕсли; + СтрокаВариантаОтчета.Представление = Представление; + СтрокаВариантаОтчета.Описание = Описание; + СтрокаВариантаОтчета.Видимость = Видимость; + НомерСортировки = СоответсвиеВариантовНомеруСортировки[Ключ]; + СтрокаВариантаОтчета.Сортировка = ?(НомерСортировки <> Неопределено, НомерСортировки, "ЯЯ9999999999999"); + +КонецПроцедуры + +&НаСервере +Процедура ВывестиСслыкиНаВариантыОтчетов(СтрокаГруппировки, Группа) + + СтрокаГруппировки.Строки.Сортировать("Сортировка, Представление"); + + ИмяГруппировки = СтрокаГруппировки.Группировка; + ИмяГруппировки = СтрЗаменить(ИмяГруппировки, ".", "_Точка_"); + ИмяГруппировки = СтрЗаменить(ИмяГруппировки, "\", "_Слэш_"); + ИмяГруппировки = СтрЗаменить(ИмяГруппировки, "-", "_Тирэ_"); + ИмяГруппировки = "_ГруппаРаздела_" + ИмяГруппировки; + + Колонка1 = ДобавитьГруппу(ИмяГруппировки + "Колонки1", Группа, "Первая колонка", , ложь); + Колонка2 = ДобавитьГруппу(ИмяГруппировки + "Колонки2", Группа, "Вторая колонка", , ложь); + Колонка3 = ДобавитьГруппу(ИмяГруппировки + "Колонки3", Группа, "Третья колонка", , ложь); + + КоличетвоВариантов = СтрокаГруппировки.Строки.Количество(); + + МинимальноКолВоВариантов = Цел(КоличетвоВариантов/3); + Остаток = КоличетвоВариантов - МинимальноКолВоВариантов*3; + + КоличествоВариантовВКолонке1 = МинимальноКолВоВариантов + ?(Остаток >= 1, 1, 0); + КоличествоВариантовВКолонке2 = МинимальноКолВоВариантов + ?(Остаток >= 2, 1, 0); + КоличествоВариантовВКолонке3 = МинимальноКолВоВариантов; + + Для Сч = 0 по КоличествоВариантовВКолонке1-1 Цикл + СтрокаСсылки = СтрокаГруппировки.Строки[Сч]; + ДобавитьСсылкуНаВариантОтчета(СтрокаСсылки.Ключ + ИмяГруппировки, СтрокаСсылки.Представление, СтрокаСсылки.Описание, Колонка1, СтрокаСсылки.Видимость); + КонецЦикла; + + Для Сч = КоличествоВариантовВКолонке1 по КоличествоВариантовВКолонке1 + КоличествоВариантовВКолонке2-1 Цикл + СтрокаСсылки = СтрокаГруппировки.Строки[Сч]; + ДобавитьСсылкуНаВариантОтчета(СтрокаСсылки.Ключ + ИмяГруппировки, СтрокаСсылки.Представление, СтрокаСсылки.Описание, Колонка2, СтрокаСсылки.Видимость); + КонецЦикла; + + Для Сч = КоличествоВариантовВКолонке1 + КоличествоВариантовВКолонке2 по КоличествоВариантовВКолонке1 + КоличествоВариантовВКолонке2 + КоличествоВариантовВКолонке3-1 Цикл + СтрокаСсылки = СтрокаГруппировки.Строки[Сч]; + ДобавитьСсылкуНаВариантОтчета(СтрокаСсылки.Ключ + ИмяГруппировки, СтрокаСсылки.Представление, СтрокаСсылки.Описание, Колонка3, СтрокаСсылки.Видимость); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Функция ДобавитьГруппу(Имя, Родитель, Заголовок = "", Горизонтально = ложь, ОтображатьЗаголовок = истина) + + Имя = СтрЗаменить(Имя, ".", "_Точка_"); + Имя = СтрЗаменить(Имя, "\", "_Слэш_"); + Имя = СтрЗаменить(Имя, "-", "_Тирэ_"); + + Группа = Элементы.Добавить(Имя, Тип("ГруппаФормы"), Родитель); + Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа; + Группа.Заголовок = Заголовок; + Группа.ОтображатьЗаголовок = ОтображатьЗаголовок; + Если Группа.ОтображатьЗаголовок тогда + Группа.ШрифтЗаголовка = Новый Шрифт(Группа.ШрифтЗаголовка, , , истина); + КонецЕсли; + Группа.Отображение = ОтображениеОбычнойГруппы.Отступ; + Группа.Группировка = ?(Горизонтально, ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная, ГруппировкаПодчиненныхЭлементовФормы.Вертикальная); + + Возврат Группа; +КонецФункции + +&НаСервере +Процедура ДобавитьСсылкуНаВариантОтчета(Ключ, Представление, Описание, Родитель, Видимость) + + ИмяОтчета = Ключ; + Ключ = СтрЗаменить(Ключ, ".", "_Точка_"); + Ключ = СтрЗаменить(Ключ, "\", "_Слэш_"); + Ключ = СтрЗаменить(Ключ, "-", "_Тирэ_"); + + + НоваяКоманда = Команды.Добавить(Ключ); + НоваяКоманда.Действие = "ОткрытьОтчет"; + НоваяКоманда.Подсказка = Описание; + + ПозицияВарианта = Найти(ИмяОтчета, "\"); + ИмяОтчета = Лев(ИмяОтчета, ПозицияВарианта-1); + ИмяОтчета = СтрЗаменить(ИмяОтчета, "Отчет.", ""); + + Отчет = Метаданные.Отчеты.Найти(ИмяОтчета); + Если Отчет = Неопределено тогда + Возврат; + КонецЕсли; + + ЕстьПравоПросмотра = ПравоДоступа("Просмотр", Отчет); + Если НЕ ЕстьПравоПросмотра тогда + Возврат; + КонецЕсли; + + ПараметрыФО = Новый Структура(""); + + ДоступенПоФоОпциям = ложь; + СодержитсяВФО = ложь; + Для каждого ФО из Метаданные.ФункциональныеОпции Цикл + + Если ФО.Состав.Найти(Отчет) = Неопределено тогда + Продолжить; + КонецЕсли; + + СодержитсяВФО = Истина; + + ЗначениеФО = ПолучитьФункциональнуюОпцию(ФО.Имя, ПараметрыФО); + Если ТипЗнч(ЗначениеФО) = Тип("Булево") тогда + Если ЗначениеФО тогда + ДоступенПоФоОпциям = истина; + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если СодержитсяВФО И НЕ ДоступенПоФоОпциям тогда + Возврат; + КонецЕсли; + + НоваяКнопка = Элементы.Добавить(Ключ, Тип("КнопкаФормы"), Родитель); + НоваяКнопка.Заголовок = Представление; + НоваяКнопка.ИмяКоманды = Ключ; + НоваяКнопка.Вид = ВидКнопкиФормы.Гиперссылка; + НоваяКнопка.Видимость = Видимость; + +Конецпроцедуры + +&НаКлиенте +Процедура ОткрытьОтчет(Команда) + + Ключ = Команда.Имя; + Ключ = Лев(Ключ, Найти(Ключ, "_ГруппаРаздела_")-1); + Ключ = СтрЗаменить(Ключ, "_Точка_", "."); + Ключ = СтрЗаменить(Ключ, "_Слэш_", "\"); + Ключ = СтрЗаменить(Ключ, "_Тирэ_", "-"); + + ПозицияВарианта = Найти(Ключ, "\"); + ИмяОтчета = Лев(Ключ, ПозицияВарианта-1); + КлючВарианта = Прав(Ключ, СтрДлина(Ключ)-ПозицияВарианта); + + ПараметрыОтчета = Новый Структура("КлючВарианта", КлючВарианта); + + СтандартнаяОбработка = истина; + + ВариантыОтчетовКлиентПереопределяемый.ПередОткрытиемФормыОтчета(Ключ, ПараметрыОтчета, СтандартнаяОбработка); + + Если СтандартнаяОбработка тогда + ОткрытьФорму(ИмяОтчета + ".Форма", ПараметрыОтчета, Ключ); + КонецЕсли; + +КонецПроцедуры + + +// Процедура открывает форму выбора варианта отчета +// +&НаКлиенте +Процедура ОбщийСписокВаринтовОтчетов(Команда) + + ПараметрыФормы = Новый Структура("Подсистемы, ИмяФормы, КартинкаФормы"); + + ПараметрыФормы.Подсистемы = Подсистемы; + ПараметрыФормы.ИмяФормы = "Все " + Нрег(ИмяФормыОтчетов); + ПараметрыФормы.КартинкаФормы = КартинкаФормы; + + СтруктураПараметров = ОткрытьФорму("ОбщаяФорма.ВсеОтчеты", ПараметрыФормы, ЭтаФорма); + +КонецПроцедуры + +&НаСервере +Процедура УстановитьВидимостьВариантовОтчета(СтруктураПараметров) + + СписокКлючей = СтруктураПараметров.СписокВариантов; + + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетов.Ссылка, + | ВариантыОтчетов.Видимость, + | ВариантыОтчетов.КлючОбъекта + ""\"" + ВариантыОтчетов.КлючВарианта КАК Ключ + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов + |ГДЕ + | ВариантыОтчетов.КлючОбъекта + ""\"" + ВариантыОтчетов.КлючВарианта В (&Ключ)"; + + Запрос = Новый Запрос(ТЗ); + Запрос.УстановитьПараметр("Ключ", СписокКлючей); + + УстановитьПривилегированныйРежим(истина); + Выборка = Запрос.Выполнить().Выбрать(); + ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь; + + Пока Выборка.Следующий() Цикл + ЗначениеЭлемент = СписокКлючей.НайтиПоЗначению(Выборка.Ключ); + Если ЗначениеЭлемент <> Неопределено тогда + Объект = Выборка.Ссылка.ПолучитьОбъект(); + СтрокиПользователя = Объект.НастройкаВидимости.НайтиСтроки(Новый Структура("Пользователь", ТекущийПользователь)); + Если ЗначениеЭлемент.Пометка <> Выборка.Видимость тогда + Если СтрокиПользователя.Количество() = 0 тогда + СтрокаПользователя = Объект.НастройкаВидимости.Добавить(); + СтрокаПользователя.Пользователь = ТекущийПользователь; + Объект.Записать(); + КонецЕсли; + Иначе + Если СтрокиПользователя.Количество() > 0 тогда + Объект.НастройкаВидимости.Удалить(СтрокиПользователя[0]); + Объект.Записать(); + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЦикла; + УстановитьПривилегированныйРежим(ложь); + + СписокЭлементов = СтруктураПараметров.СписокЭлементов; + + Для каждого Элемент из СписокЭлементов Цикл + ЭлементФормы = Элементы.Найти(Элемент.Значение); + Если ЭлементФормы <> Неопределено тогда + ЭлементФормы.Видимость = Элемент.Пометка; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + + +&НаКлиенте +Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) + + Если ВыбранноеЗначение <> Неопределено тогда + УстановитьВидимостьВариантовОтчета(ВыбранноеЗначение); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonForms/ПанельОтчетов/ПанельОтчетов.mdo b/SSL/src/CommonForms/ПанельОтчетов/ПанельОтчетов.mdo new file mode 100644 index 000000000..a1833f974 --- /dev/null +++ b/SSL/src/CommonForms/ПанельОтчетов/ПанельОтчетов.mdo @@ -0,0 +1,10 @@ + + + ПанельОтчетов + + ru + Панель отчетов + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Form.form b/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Form.form new file mode 100644 index 000000000..b890ade0c --- /dev/null +++ b/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Form.form @@ -0,0 +1,752 @@ + + + + ГруппаПодключениеКСерверу + 1 + + ГруппаАдминистрирование + 2 + + АдминистраторИБ + 3 + + <key>ru</key> + <value>Администратор</value> + + true + true + + true + + + АдминистраторИБ + + + ru + Администратор информационной базы, от имени которого выполняется принудительное отключение сеансов + + + АдминистраторИБРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + АдминистраторИБКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ПарольАдминистратораИБ + 5 + + <key>ru</key> + <value>Пароль</value> + + true + true + + true + + + ПарольАдминистратораИБ + + + ru + Пароль администратора информационной базы, от имени которого выполняется принудительное отключение сеансов + + + ПарольАдминистратораИБРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + ПарольАдминистратораИБКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + 15 + true + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Укажите администратора информационной базы:</value> + + + ГруппаАдминистрированиеРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + + КластерТребуетАвторизации + 7 + true + true + + true + + + КластерТребуетАвторизации + + Right + + OnChange + КластерТребуетАвторизацииПриИзменении + + + КластерТребуетАвторизацииРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + КластерТребуетАвторизацииКонтекстноеМеню + 8 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаАвторизацияКластера + 9 + + ИмяАдминистратораКластера + 10 + true + true + + true + + + ИмяАдминистратораКластера + + + ИмяАдминистратораКластераРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ИмяАдминистратораКластераКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + + 15 + true + true + false + true + true + true + Normal + + + + ПарольАдминистратораКластера + 12 + true + true + + true + + + ПарольАдминистратораКластера + + + ПарольАдминистратораКластераРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ПарольАдминистратораКластераКонтекстноеМеню + 13 + true + + InputField + Enter + true + Left + true + + 15 + true + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Параметры авторизации кластера серверов</value> + + + ГруппаАвторизацияКластераРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + НестандартныеПорты + 14 + true + true + + true + + + НестандартныеПорты + + Right + + OnChange + НестандартныеПортыПриИзменении + + + НестандартныеПортыРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + НестандартныеПортыКонтекстноеМеню + 15 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаПорты + 16 + + ПортКластераСерверов + 17 + true + true + + true + + + ПортКластераСерверов + + + ПортКластераСерверовРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ПортКластераСерверовКонтекстноеМеню + 18 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ПортАгентаСервера + 19 + true + true + + true + + + ПортАгентаСервера + + + ПортАгентаСервераРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + ПортАгентаСервераКонтекстноеМеню + 20 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Порты</value> + + + ГруппаПортыРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Подключение к серверу</value> + + + ГруппаПодключениеКСерверуРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + СохранитьПараметрыПодключения + 21 + true + true + + true + + false + + СохранитьПараметрыПодключенияРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + Form.Command.Записать + Auto + true + true + true + UserCmds + Auto + + + Закрыть + 22 + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + Auto + + + Справка + 23 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + + FillCheckProcessingAtServer + ОбработкаПроверкиЗаполненияНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + АдминистраторИБ + + <key>ru</key> + <value>Администратор ИБ</value> + + 1 + + CatalogRef.Пользователи + + + 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 + + String + + + + true + + + true + + + + ПарольАдминистратораКластера + + <key>ru</key> + <value>Пароль администратора кластера</value> + + 5 + + String + + + + true + + + true + + + + НестандартныеПорты + + <key>ru</key> + <value>Подключение осуществляется по нестандартным портам</value> + + 6 + + Boolean + + + true + + + true + + + + ПортАгентаСервера + + <key>ru</key> + <value>Порт агента сервера</value> + + 7 + + Number + + 5 + true + + + + true + + + true + + + + ПортКластераСерверов + + <key>ru</key> + <value>Порт кластера серверов</value> + + 8 + + Number + + 5 + true + + + + 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 new file mode 100644 index 000000000..3bf97f64a --- /dev/null +++ b/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Module.bsl @@ -0,0 +1,141 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + ВызватьИсключение НСтр("ru = 'Настройка параметров серверной ИБ доступна только в клиент-серверном режиме работы.'"); + Возврат; + КонецЕсли; + + Элементы.ГруппаАдминистрирование.Доступность = ?(ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() > 0, Истина, Ложь); + + ПараметрыАдминистрирования = СоединенияИБ.ПолучитьПараметрыАдминистрированияИБ(); + + ИдентификаторАдминистратораИБ = ПользователиИнформационнойБазы.НайтиПоИмени( + ПараметрыАдминистрирования.ИмяАдминистратораИБ).УникальныйИдентификатор; + АдминистраторИБ = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ИдентификаторАдминистратораИБ); + ПарольАдминистратораИБ = ПараметрыАдминистрирования.ПарольАдминистратораИБ; + ИмяАдминистратораКластера = ПараметрыАдминистрирования.ИмяАдминистратораКластера; + ПарольАдминистратораКластера= ПараметрыАдминистрирования.ПарольАдминистратораКластера; + ПортАгентаСервера = ПараметрыАдминистрирования.ПортАгентаСервера; + ПортКластераСерверов = ПараметрыАдминистрирования.ПортКластераСерверов; + + НестандартныеПорты = ПортКластераСерверов <> 0 ИЛИ ПортАгентаСервера <> 0; + КластерТребуетАвторизации = НЕ ПустаяСтрока(ИмяАдминистратораКластера); + + Элементы.ГруппаПорты.Доступность = НестандартныеПорты; + Элементы.ГруппаАвторизацияКластера.Доступность = КластерТребуетАвторизации; + +КонецПроцедуры + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + + Если ЗначениеЗаполнено(АдминистраторИБ) Тогда + + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(АдминистраторИБ.ИдентификаторПользователяИБ); + Если ПользовательИБ = Неопределено Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Указан пользователь, у которого нет доступа к информационной базе.'"),, + "АдминистраторИБ",,Отказ); + Возврат; + КонецЕсли; + Если НЕ ПравоДоступа("Администрирование", Метаданные, ПользовательИБ) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Указан пользователь без административных прав.'"),, + "АдминистраторИБ",,Отказ); + Возврат; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура Записать(Команда) + + ОчиститьСообщения(); + ПараметрыПодключения = СохранитьПараметрыПодключения(АдминистраторИБ, ПарольАдминистратораИБ, КластерТребуетАвторизации, + ИмяАдминистратораКластера, ПарольАдминистратораКластера, НестандартныеПорты, + ПортАгентаСервера, ПортКластераСерверов); + + Если ПараметрыПодключения = Неопределено Тогда + Возврат; + КонецЕсли; + + Оповестить("ОбновленыПараметрыПодключенияКИнформационнойБазе", ПараметрыПодключения); + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура КластерТребуетАвторизацииПриИзменении(Элемент) + + УстановитьСостояниеПолей() + +КонецПроцедуры + +&НаКлиенте +Процедура НестандартныеПортыПриИзменении(Элемент) + + УстановитьСостояниеПолей(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура УстановитьСостояниеПолей() + + Элементы.ГруппаПорты.Доступность = НестандартныеПорты; + Элементы.ГруппаАвторизацияКластера.Доступность = КластерТребуетАвторизации; + +КонецПроцедуры + +&НаСервере +Функция СохранитьПараметрыПодключения(АдминистраторИБ, ПарольАдминистратораИБ, КластерТребуетАвторизации, + ИмяАдминистратораКластера, ПарольАдминистратораКластера, НестандартныеПорты, + ПортАгентаСервера, ПортКластераСерверов) + + Если НЕ ПроверитьЗаполнение() Тогда + Возврат Неопределено; + КонецЕсли; + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(АдминистраторИБ.ИдентификаторПользователяИБ); + Если ПользовательИБ <> Неопределено Тогда + ИмяАдминистратораИБ = ПользовательИБ.Имя; + Иначе + ИмяАдминистратораИБ = ""; + КонецЕсли; + ПараметрыАдминистрирования = СоединенияИБ.ПолучитьПараметрыАдминистрированияИБ(); + + ПараметрыАдминистрирования.ИмяАдминистратораИБ = ИмяАдминистратораИБ; + ПараметрыАдминистрирования.ПарольАдминистратораИБ = ПарольАдминистратораИБ; + + Если КластерТребуетАвторизации Тогда + ПараметрыАдминистрирования.ИмяАдминистратораКластера = ИмяАдминистратораКластера; + ПараметрыАдминистрирования.ПарольАдминистратораКластера = ПарольАдминистратораКластера; + Иначе + ПараметрыАдминистрирования.ИмяАдминистратораКластера = ""; + ПараметрыАдминистрирования.ПарольАдминистратораКластера = ""; + КонецЕсли; + + Если НестандартныеПорты Тогда + ПараметрыАдминистрирования.ПортКластераСерверов = ПортКластераСерверов; + ПараметрыАдминистрирования.ПортАгентаСервера = ПортАгентаСервера; + Иначе + ПараметрыАдминистрирования.ПортКластераСерверов = 0; + ПараметрыАдминистрирования.ПортАгентаСервера = 0; + КонецЕсли; + + Константы.ПараметрыАдминистрированияИБ.Установить(Новый ХранилищеЗначения(ПараметрыАдминистрирования)); + + СоединенияИБ.ЗаписатьПараметрыАдминистрированияИБ(ПараметрыАдминистрирования); + + Возврат ПараметрыАдминистрирования; + +КонецФункции + + diff --git a/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/ПараметрыАдминистрированияСервернойИБ.mdo b/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/ПараметрыАдминистрированияСервернойИБ.mdo new file mode 100644 index 000000000..dfd87c50d --- /dev/null +++ b/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/ПараметрыАдминистрированияСервернойИБ.mdo @@ -0,0 +1,11 @@ + + + ПараметрыАдминистрированияСервернойИБ + + ru + Параметры администрирования информационной базы + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form b/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form new file mode 100644 index 000000000..92cf99b44 --- /dev/null +++ b/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form @@ -0,0 +1,553 @@ + + + + ИспользоватьПрокси + 16 + true + true + + true + + + ИспользоватьПрокси + + true + Right + + OnChange + ИспользоватьПроксиПриИзменении + + + ИспользоватьПроксиРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + ИспользоватьПроксиКонтекстноеМеню + 17 + true + + CheckBoxField + Enter + true + Left + true + + + + ПараметрыПрокси + 18 + + ПроксиСервер + 9 + true + true + + true + + + Сервер + + + ПроксиСерверРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ПроксиСерверКонтекстноеМеню + 10 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Пользователь + 5 + true + true + + true + + + Пользователь + + + ПользовательРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ПользовательКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Пароль + 3 + true + true + + true + + + Пароль + + + ПарольРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ПарольКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Порт + 1 + true + true + + true + + + Порт + + + ПортРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ПортКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + 0 + + + 65535 + + Normal + + + + НеИспользоватьПроксиДляЛокальныхАдресов + 11 + true + true + + true + + + НеИспользоватьПроксиДляЛокальныхАдресов + + Right + + НеИспользоватьПроксиДляЛокальныхАдресовРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + НеИспользоватьПроксиДляЛокальныхАдресовКонтекстноеМеню + 12 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Настройка прокси сервера</value> + + + ru + Параметры прокси + + + ПараметрыПроксиРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ПоняснениеКнопкаОК + 19 + + <key>ru</key> + <value>Нажмите ОК что бы сохранить настройки прокси-сервера</value> + + true + true + + true + + + ПоняснениеКнопкаОКРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ПоняснениеКнопкаОККонтекстноеМеню + 20 + true + + Label + true + true + + Style.ПоясняющийТекст + + + Left + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Ок + 8 + true + true + + true + + false + + ОкРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 13 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + 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 + + 5 + true + + + + 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> + + 6 + + Boolean + + + true + + + true + + + + ИспользоватьПрокси + + <key>ru</key> + <value>Использовать прокси-сервер для соединения с Интернет</value> + + 7 + + Boolean + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОкВыполнить + + + TextPicture + Auto + Auto + + + НастройкаПроксиНаКлиенте + + Boolean + + + + + + + diff --git a/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl b/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl new file mode 100644 index 000000000..71bb7615b --- /dev/null +++ b/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl @@ -0,0 +1,79 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + НастройкаПроксиНаКлиенте = Параметры.НастройкаПроксиНаКлиенте; + + Если НастройкаПроксиНаКлиенте Тогда + НастройкаПроксиСервера = ХранилищеОбщихНастроек.Загрузить("НастройкаПроксиСервера"); + Иначе + НастройкаПроксиСервера = ПолучениеФайловИзИнтернета.ПолучитьНастройкиПроксиНаСервере1СПредприятие(); + КонецЕсли; + + Если ТипЗнч(НастройкаПроксиСервера) = Тип("Соответствие") Тогда + ИспользоватьПрокси = НастройкаПроксиСервера["ИспользоватьПрокси"]; + Сервер = НастройкаПроксиСервера["Сервер"]; + Пользователь = НастройкаПроксиСервера["Пользователь"]; + Пароль = НастройкаПроксиСервера["Пароль"]; + Порт = НастройкаПроксиСервера["Порт"]; + НеИспользоватьПроксиДляЛокальныхАдресов = + НастройкаПроксиСервера["НеИспользоватьПроксиДляЛокальныхАдресов"]; + КонецЕсли; + + Элементы.ПараметрыПрокси.Доступность = ?(ИспользоватьПрокси, Истина, Ложь); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +// Обработчик события нажатия на кнопку "ОК" командной панели формы +// Закрывает форму, передавая в качестве возвращаемого результата +// параметры прокси. +// +&НаКлиенте +Процедура ОкВыполнить() + + НастройкаПроксиСервера = Новый Соответствие; + НастройкаПроксиСервера.Вставить("ИспользоватьПрокси", ИспользоватьПрокси); + НастройкаПроксиСервера.Вставить("Пользователь", Пользователь); + НастройкаПроксиСервера.Вставить("Пароль", Пароль); + НастройкаПроксиСервера.Вставить("Порт", Порт); + НастройкаПроксиСервера.Вставить("Сервер", Сервер); + НастройкаПроксиСервера.Вставить("НеИспользоватьПроксиДляЛокальныхАдресов", + НеИспользоватьПроксиДляЛокальныхАдресов); + + СохранитьНастройкиПроксиСервера(НастройкаПроксиНаКлиенте, НастройкаПроксиСервера); + + Закрыть(НастройкаПроксиСервера); + +КонецПроцедуры + +// Изменяем доступность группы редактирования параметров прокси если они не используются +// +&НаКлиенте +Процедура ИспользоватьПроксиПриИзменении(Элемент) + + Элементы.ПараметрыПрокси.Доступность = ?(ИспользоватьПрокси, Истина, Ложь); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Сохранение настроек прокси +// +&НаСервереБезКонтекста +Процедура СохранитьНастройкиПроксиСервера(НастройкаПроксиНаКлиенте, НастройкаПроксиСервера) + + Если НастройкаПроксиНаКлиенте Тогда + ХранилищеОбщихНастроек.Сохранить("НастройкаПроксиСервера", , НастройкаПроксиСервера); + ОбновитьПовторноИспользуемыеЗначения(); + Иначе + ПолучениеФайловИзИнтернета.СохранитьНастройкиПроксиНаСервере1СПредприятие(НастройкаПроксиСервера); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/CommonForms/ПараметрыПроксиСервера/ПараметрыПроксиСервера.mdo b/SSL/src/CommonForms/ПараметрыПроксиСервера/ПараметрыПроксиСервера.mdo new file mode 100644 index 000000000..908356531 --- /dev/null +++ b/SSL/src/CommonForms/ПараметрыПроксиСервера/ПараметрыПроксиСервера.mdo @@ -0,0 +1,11 @@ + + + ПараметрыПроксиСервера + + ru + Параметры прокси-сервера + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Form.form b/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Form.form new file mode 100644 index 000000000..eecc770bd --- /dev/null +++ b/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Form.form @@ -0,0 +1,284 @@ + + + + ДействияПриСохраненииСЭЦП + 3 + true + true + + true + + + ДействияПриСохраненииСЭЦП + + + ДействияПриСохраненииСЭЦПРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ДействияПриСохраненииСЭЦПКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + РасширениеДляЗашифрованныхФайлов + 9 + true + true + + true + + + РасширениеДляЗашифрованныхФайлов + + + РасширениеДляЗашифрованныхФайловРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + РасширениеДляЗашифрованныхФайловКонтекстноеМеню + 10 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПутьМодуляКриптографии + 7 + + <key>ru</key> + <value>Путь модуля криптографии (для веб клиента под управлением Linux)</value> + + true + true + + true + + + ПутьМодуляКриптографии + + Top + + ПутьМодуляКриптографииРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + ПутьМодуляКриптографииКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 2 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 1 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + UseIfNecessary + auto + true + + ДействияПриСохраненииСЭЦП + + <key>ru</key> + <value>Действия при сохранении с ЭЦП</value> + + 1 + + EnumRef.ДействияПриСохраненииСЭЦП + + + true + + + true + + + + ПутьМодуляКриптографии + + <key>ru</key> + <value>Путь модуля криптографии</value> + + 3 + + String + + + + true + + + true + + + + РасширениеДляЗашифрованныхФайлов + + <key>ru</key> + <value>Расширение для зашифрованных файлов</value> + + 4 + + String + + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + + + + diff --git a/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Help/ru.html b/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Help/ru.html new file mode 100644 index 000000000..622062c1b --- /dev/null +++ b/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Help/ru.html @@ -0,0 +1,14 @@ + +

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

    +

    + + + + +
    НастройкаОписание
    Действия при сохранении с ЭЦП +

    Задает поведение при выполнении команды "Сохранить с ЭЦП":

    +
    • Сохранять все подписи - все подписи сохраняются; +
    • Спрашивать - выбор сохраняемых подписей осуществляется в форме.
    Расширение для зашифрованных файловЗадает расширение для зашифрованных файлов при отправке по почте, при выполнении команды "Сохранить как" и при экспорте папки.
    По умолчанию "p7m".
    Путь модуля криптографии (для веб клиента под управлением Linux)Задает путь модуля криптографии для операций с файлами (расшифровка, подписание, проверка подписи, просмотр сертификата).

     

    +

    См. также:

    +
    +

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

    \ 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..ded8f4f07 --- /dev/null +++ b/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Module.bsl @@ -0,0 +1,48 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ДействияПриСохраненииСЭЦП = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "ДействияПриСохраненииСЭЦП"); + Если ДействияПриСохраненииСЭЦП.Пустая() Тогда + ДействияПриСохраненииСЭЦП = Перечисления.ДействияПриСохраненииСЭЦП.Спрашивать; + КонецЕсли; + + РасширениеДляЗашифрованныхФайлов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "РасширениеДляЗашифрованныхФайлов"); + Если ПустаяСтрока(РасширениеДляЗашифрованныхФайлов) Тогда + РасширениеДляЗашифрованныхФайлов = "p7m"; + КонецЕсли; + + ПутьМодуляКриптографии = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "ПутьМодуляКриптографии"); + + Если НЕ Параметры.ВебКлиентВЛинукс Тогда + Элементы.ПутьМодуляКриптографии.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + МассивСтруктур = Новый Массив; + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "ЭЦП"); + Элемент.Вставить("Настройка", "ДействияПриСохраненииСЭЦП"); + Элемент.Вставить("Значение", ДействияПриСохраненииСЭЦП); + МассивСтруктур.Добавить(Элемент); + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "ЭЦП"); + Элемент.Вставить("Настройка", "ПутьМодуляКриптографии"); + Элемент.Вставить("Значение", ПутьМодуляКриптографии); + МассивСтруктур.Добавить(Элемент); + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "ЭЦП"); + Элемент.Вставить("Настройка", "РасширениеДляЗашифрованныхФайлов"); + Элемент.Вставить("Значение", РасширениеДляЗашифрованныхФайлов); + МассивСтруктур.Добавить(Элемент); + + ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур); + + Закрыть(); +КонецПроцедуры diff --git a/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/ПерсональныеНастройкиЭЦП.mdo b/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/ПерсональныеНастройкиЭЦП.mdo new file mode 100644 index 000000000..b248755fa --- /dev/null +++ b/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/ПерсональныеНастройкиЭЦП.mdo @@ -0,0 +1,16 @@ + + + ПерсональныеНастройкиЭЦП + + ru + Персональные настройки ЭЦП + + + + ru + + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/ПечатьДокументов/Form.form b/SSL/src/CommonForms/ПечатьДокументов/Form.form new file mode 100644 index 000000000..0c15e342e --- /dev/null +++ b/SSL/src/CommonForms/ПечатьДокументов/Form.form @@ -0,0 +1,1425 @@ + + + + Панель + 67 + + ПечатьПоКомплектно + 38 + true + true + + true + + false + + ПечатьПоКомплектноРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + UsualButton + Form.Command.Печать + Normal + Auto + true + true + UserCmds + Auto + + + Копии + 65 + + <key>ru</key> + <value>копий</value> + + true + true + + true + + + Копии + + + ru + количество копий + + + OnChange + КопииПриИзменении + + + КопииРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + КопииКонтекстноеМеню + 66 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + ГруппаКопии + 37 + + Копии1 + 70 + + <key>ru</key> + <value>К1</value> + + true + true + + true + + + Копии1 + + + ru + количество копий + + + OnChange + КопииПриИзменении + + + Копии1РасширеннаяПодсказка + 87 + Label + true + true + + Left + + + + Копии1КонтекстноеМеню + 71 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + Копии2 + 72 + + <key>ru</key> + <value>К2</value> + + true + true + + true + + + Копии2 + + + ru + количество копий + + + OnChange + КопииПриИзменении + + + Копии2РасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + Копии2КонтекстноеМеню + 73 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + Копии3 + 74 + + <key>ru</key> + <value>К3</value> + + true + true + + true + + + Копии3 + + + ru + количество копий + + + OnChange + КопииПриИзменении + + + Копии3РасширеннаяПодсказка + 91 + Label + true + true + + Left + + + + Копии3КонтекстноеМеню + 75 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + Копии4 + 76 + + <key>ru</key> + <value>К4</value> + + true + true + + true + + + Копии4 + + + ru + количество копий + + + OnChange + КопииПриИзменении + + + Копии4РасширеннаяПодсказка + 93 + Label + true + true + + Left + + + + Копии4КонтекстноеМеню + 77 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + + Копии5 + 78 + + <key>ru</key> + <value>К5</value> + + true + true + + true + + + Копии5 + + + ru + количество копий + + + OnChange + КопииПриИзменении + + + Копии5РасширеннаяПодсказка + 95 + Label + true + true + + Left + + + + Копии5КонтекстноеМеню + 79 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + 1 + + Normal + + + true + true + + true + + + ru + Группа копии + + + ГруппаКопииРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Группа + 68 + + ОтправитьПоПочте + 80 + true + true + + true + + false + + ОтправитьПоПочтеРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + UsualButton + Form.Command.ОтправитьПоПочте + Normal + Auto + true + true + UserCmds + Auto + + + Перейти + 64 + + <key>ru</key> + <value>Перейти</value> + + true + true + + true + + false + + ПерейтиРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + UsualButton + Form.Command.Перейти + Normal + Auto + true + true + UserCmds + Auto + + + ПерейтиКУправлениюМакетами + 81 + true + true + + true + + false + + ПерейтиКУправлениюМакетамиРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + UsualButton + Form.Command.ПерейтиКУправлениюМакетами + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + ПанельРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Страницы + 9 + + Группа1 + 10 + + Таб1 + 15 + true + true + + true + + + Таб1 + + None + + Таб1РасширеннаяПодсказка + 103 + Label + true + true + + Left + + + + Таб1КонтекстноеМеню + 16 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + 50 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Auto + true + true + true + + + true + true + + true + + + Группа1РасширеннаяПодсказка + 102 + Label + true + true + + Left + + + Page + + + StdPicture.SpreadsheetInsertPageBreak + + Vertical + auto + + + + Группа2 + 11 + + Таб2 + 17 + true + true + + true + + + Таб2 + + None + + Таб2РасширеннаяПодсказка + 106 + Label + true + true + + Left + + + + Таб2КонтекстноеМеню + 18 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + 50 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Auto + true + true + true + + + true + true + + true + + + Группа2РасширеннаяПодсказка + 105 + Label + true + true + + Left + + + Page + + + StdPicture.SpreadsheetInsertPageBreak + + Vertical + auto + + + + Группа3 + 12 + + Таб3 + 19 + true + true + + true + + + Таб3 + + None + + Таб3РасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + Таб3КонтекстноеМеню + 20 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + 50 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Auto + true + true + true + + + true + true + + true + + + Группа3РасширеннаяПодсказка + 108 + Label + true + true + + Left + + + Page + + + StdPicture.SpreadsheetInsertPageBreak + + Vertical + auto + + + + Группа4 + 13 + + Таб4 + 23 + true + true + + true + + + Таб4 + + None + + Таб4РасширеннаяПодсказка + 112 + Label + true + true + + Left + + + + Таб4КонтекстноеМеню + 24 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + 50 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Auto + true + true + true + + + true + true + + true + + + Группа4РасширеннаяПодсказка + 111 + Label + true + true + + Left + + + Page + + + StdPicture.SpreadsheetInsertPageBreak + + Vertical + auto + + + + Группа5 + 14 + + Таб5 + 21 + true + true + + true + + + Таб5 + + None + + Таб5РасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + Таб5КонтекстноеМеню + 22 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + 50 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Auto + true + true + true + + + true + true + + true + + + Группа5РасширеннаяПодсказка + 114 + Label + true + true + + Left + + + Page + + + StdPicture.SpreadsheetInsertPageBreak + + Vertical + auto + + + true + true + + true + + + ru + Страницы + + true + true + + СтраницыРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Таб1 + + <key>ru</key> + <value>Таб1</value> + + 3 + + SpreadsheetDocument + + + true + + + true + + + + + Таб2 + + <key>ru</key> + <value>Таб2</value> + + 4 + + SpreadsheetDocument + + + true + + + true + + + + + Таб3 + + <key>ru</key> + <value>Таб3</value> + + 5 + + SpreadsheetDocument + + + true + + + true + + + + + Таб4 + + <key>ru</key> + <value>Таб4</value> + + 6 + + SpreadsheetDocument + + + true + + + true + + + + + Таб5 + + <key>ru</key> + <value>Таб5</value> + + 7 + + SpreadsheetDocument + + + true + + + true + + + + + Копии + + <key>ru</key> + <value>Копии</value> + + 1 + + Number + + 2 + true + + + + true + + + true + + + + Копии1 + + <key>ru</key> + <value>Копии1</value> + + 8 + + Number + + 2 + true + + + + true + + + true + + + + Копии2 + + <key>ru</key> + <value>Копии2</value> + + 9 + + Number + + 2 + true + + + + true + + + true + + + + Копии3 + + <key>ru</key> + <value>Копии3</value> + + 10 + + Number + + 2 + true + + + + true + + + true + + + + Копии4 + + <key>ru</key> + <value>Копии4</value> + + 11 + + Number + + 2 + true + + + + true + + + true + + + + Копии5 + + <key>ru</key> + <value>Копии5</value> + + 12 + + Number + + 2 + true + + + + true + + + true + + + + ДоступнаПечатьПоКомплектно + + <key>ru</key> + <value>Доступна печать по комплектно</value> + + 13 + + Boolean + + + true + + + true + + + + ОбъектыПечати + + <key>ru</key> + <value>Объекты печати</value> + + 14 + + ValueList + + + true + + + true + + + + + + + ИменаТабДокументов + + <key>ru</key> + <value>Имена таб. документов</value> + + 15 + + ValueList + + + true + + + true + + + + + + + МакетыПечатныхФорм + + <key>ru</key> + <value>Макеты печатных форм</value> + + 2 + + ValueList + + + true + + + true + + + + + + + СистемнаяУчетнаяЗаписьЭлектроннойПочты + + <key>ru</key> + <value>Системная учетная запись электронной почты</value> + + 16 + + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + + true + + + true + + + + ОтправитьПоПочте + + <key>ru</key> + <value>Отправить</value> + + 1 + + ru + Отправить по почте + + + true + + + CommonPicture.ОтправитьEmail + + + + ОтправитьПоПочтеВыполнить + + + Picture + Auto + Auto + + + Печать + + <key>ru</key> + <value>Печать</value> + + 2 + + ru + Печать + + + + true + Role.ВыводНаПринтерФайлБуферОбмена + + + true + Role.ПолныеПрава + + + + StdPicture.Print + + + + ПечатьВыполнить + + + TextPicture + Auto + Auto + + + Перейти + + <key>ru</key> + <value>Перейти</value> + + 8 + + ru + Перейти к печатной форме ... + + + true + + F7 + + StdPicture.Find + + + + ПерейтиВыполнить + + + Picture + Auto + Auto + + + ПерейтиКУправлениюМакетами + + <key>ru</key> + <value>Перейти к управлению макетами</value> + + 3 + + ru + Перейти к управлению макетами + + + + true + Role.ИзменениеМакетовПечатныхФорм + + + + StdPicture.ReportSettings + + + + ПерейтиКУправлениюМакетами + + + Picture + Auto + Auto + + + ИмяМенеджераПечати + + String + + + + + ИменаМакетов + + String + + + + + ПараметрКоманды + + + + ВнешнийИсточник + + Boolean + + + + ПараметрыПечати + + + + + + + diff --git a/SSL/src/CommonForms/ПечатьДокументов/Module.bsl b/SSL/src/CommonForms/ПечатьДокументов/Module.bsl new file mode 100644 index 000000000..d090884f7 --- /dev/null +++ b/SSL/src/CommonForms/ПечатьДокументов/Module.bsl @@ -0,0 +1,393 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Перем КоллекцияПечатныхФорм, ПараметрыВывода; + + Если Параметры.Свойство("ИсточникДанных") Тогда + + Если НЕ УправлениеПечатьюПереопределяемый.ПечатьПоВнешнемуИсточнику( + Параметры.ИсточникДанных, + Параметры.ПараметрыИсточника, + КоллекцияПечатныхФорм, + ОбъектыПечати, + ПараметрыВывода) Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + Иначе + + ИмяМенеджераПечати = Параметры.ИмяМенеджераПечати; + ИменаМакетов = Параметры.ИменаМакетов; + ПараметрКоманды = Параметры.ПараметрКоманды; + ПараметрыПечати = Параметры.ПараметрыПечати; + + УправлениеПечатью.СформироватьПечатныеФормы(ИмяМенеджераПечати, ИменаМакетов, ПараметрКоманды, ПараметрыПечати, + КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода); + + КонецЕсли; + + ДоступнаПечатьПоКомплектно = ПараметрыВывода.ДоступнаПечатьПоКомплектно; + + Колво = КоллекцияПечатныхФорм.Количество(); + Для Сч = 1 По 5 Цикл + Если Сч > Колво Тогда + ЭтаФорма["Таб" + Сч] = Неопределено; + Элементы["Группа" + Сч].Видимость = Ложь; + Элементы["Копии" + Сч].Видимость = Ложь; + + Иначе + СтрМакета = КоллекцияПечатныхФорм[Сч-1]; + + ЭтаФорма["Таб" + Сч] = СтрМакета.ТабличныйДокумент; + Элементы["Группа" + Сч].Видимость = Истина; + Элементы["Группа" + Сч].Заголовок = СтрМакета.СинонимМакета; + Элементы["Копии" + Сч].Видимость = Истина; + Элементы["Копии" + Сч].Заголовок = СтрМакета.СинонимМакета; + + ЭтаФорма["Копии" + Сч] = СтрМакета.Экземпляров; + + ИменаТабДокументов.Добавить(Сч, СтрМакета.СинонимМакета); + + Если НЕ ПустаяСтрока(СтрМакета.ПолныйПутьКМакету) Тогда + МакетыПечатныхФорм.Добавить(СтрМакета.ПолныйПутьКМакету); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если Колво = 1 Тогда + Элементы.ГруппаКопии.Видимость = Ложь; + Элементы.Копии.Видимость = Истина; + Копии = КоллекцияПечатныхФорм[0].Экземпляров; + Иначе + Элементы.Копии.Видимость = Ложь; + Элементы.ГруппаКопии.Видимость = Истина; + КонецЕсли; + + Если Колво <= 1 Тогда + Элементы.Страницы.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; + КонецЕсли; + + Если Пользователи.ЭтоПолноправныйПользовательИБ() + ИЛИ ( РольДоступна("ВыводНаПринтерФайлБуферОбмена") + И РаботаСПочтовымиСообщениями.ПроверитьСистемнаяУчетнаяЗаписьДоступна() )Тогда + СистемнаяУчетнаяЗаписьЭлектроннойПочты = РаботаСПочтовымиСообщениями.ПолучитьСистемнуюУчетнуюЗапись(); + Иначе + Элементы.ОтправитьПоПочте.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ПечатьВыполнить() + + ТабличныеДокументы = Новый СписокЗначений; + + Для Каждого ТабДокумент Из ИменаТабДокументов Цикл + ТабличныеДокументы.Добавить(ЭтаФорма["Таб" + ТабДокумент.Значение], ТабДокумент.Представление); + КонецЦикла; + + УправлениеПечатьюКлиент.РаспечататьТабличныеДокументы(ТабличныеДокументы, ОбъектыПечати, + ДоступнаПечатьПоКомплектно); + +КонецПроцедуры + +&НаКлиенте +Процедура КопииПриИзменении(Элемент) + + Копий = ЭтаФорма[Элемент.Имя]; + ИмяТабДока = "Таб" + ?(Элемент.Имя = "Копии", "1", Сред(Элемент.Имя, 6)); + ТабДок = ЭтаФорма[ИмяТабДока]; + ТабДок.КоличествоЭкземпляров = Копий; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтправитьПоПочтеВыполнить() + + Результат = ОткрытьФормуМодально("ОбщаяФорма.НастройкаПечатныхФормПередОтправкой"); + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + Вложения = Новый Соответствие; + + СписокФайлов = Новый СписокЗначений; + + Если Результат.ЗапаковатьZIP Тогда +#Если ВебКлиент Тогда + Путь = ПоместитьТабличныеДокументыВZIPНаСервере(); +#Иначе + Путь = ПоместитьТабличныеДокументыВZIPНаКлиенте(Результат); +#КонецЕсли + + Если Путь = "" Тогда + Возврат; + КонецЕсли; + + ИменаМакетов = ""; + Для Каждого ИмяТабДокумента Из ИменаТабДокументов Цикл + ИменаМакетов = ИменаМакетов + ИмяТабДокумента.Представление + ", ";; + КонецЦикла; + ИменаМакетов = Лев(ИменаМакетов, СтрДлина(ИменаМакетов) - 2); + ДатаПредставление = Формат(ТекущаяДата(), "ДФ='yyyyMMdd HH:mm'"); + + Если ОбъектыПечати.Количество() > 1 Тогда + ИмяФайла = "[ИменаМакетов] ([ДатаПредставление]).zip"; + Иначе + ИмяФайла = "[Документ] ([ИменаМакетов] [ДатаПредставление]).zip"; + КонецЕсли; + + ИмяФайла = СтрЗаменить(ИмяФайла, "[Документ]", Строка(ОбъектыПечати[0].Значение)); + ИмяФайла = СтрЗаменить(ИмяФайла, "[ИменаМакетов]", ИменаМакетов); + ИмяФайла = СтрЗаменить(ИмяФайла, "[ДатаПредставление]", ДатаПредставление); + + СписокФайлов.Добавить(Путь, ИмяФайла); + Иначе +#Если ВебКлиент Тогда + ПоместитьТабличныеДокументыВоВременноеХранилище(СписокФайлов); +#Иначе + ПоместитьТабличныеДокументыВФайлы(СписокФайлов, Результат); +#КонецЕсли +КонецЕсли; + + НормализоватьИменаФайлов(СписокФайлов); + + РаботаСПочтовымиСообщениямиКлиент.ОткрытьФормуОтправкиПочтовогоСообщения( + СистемнаяУчетнаяЗаписьЭлектроннойПочты, "", "", "", СписокФайлов, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПерейтиВыполнить() + + спсВыбора = Новый СписокЗначений; + Для Каждого Элемент Из ОбъектыПечати Цикл + спсВыбора.Добавить(Элемент.Значение); + КонецЦикла; + + Элемент = спсВыбора.ВыбратьЭлемент(НСтр("ru = 'Перейти к печатной форме'")); + Если Элемент = Неопределено Тогда + Возврат; + КонецЕсли; + + Элемент = ОбъектыПечати.НайтиПоЗначению(Элемент.Значение); + Если Элемент = Неопределено Тогда + Возврат; + КонецЕсли; + + ИмяОбласти = Элемент.Представление; + Для Каждого ТабДокумент Из ИменаТабДокументов Цикл + + ИмяЭлемента = "Таб" + ТабДокумент.Значение; + Таб = ЭтаФорма[ИмяЭлемента]; + Область = Таб.Области.Найти(ИмяОбласти); + Если Область = Неопределено Тогда + Продолжить; + КонецЕсли; + + ТекущаяОбласть = Таб.Область(Область.Верх, , Область.Верх); + Элементы[ИмяЭлемента].ТекущаяОбласть = ТекущаяОбласть; + + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ФУНКЦИИ И ПРОЦЕДУРЫ ПОДГОТАВЛИВАЮЩИЕ ТАБЛИЧНЫЕ ДОКУМЕНТЫ К ОТПРАВКЕ + +&НаСервере +Функция ПоместитьТабличныеДокументыВZIPНаСервере() + + ИмяКаталога = ПолучитьИмяВременногоФайла(); + ИмяАрхива = ПолучитьИмяВременногоФайла(); + БылаОшибка = Ложь; + + СоздатьКаталог(ИмяКаталога); + Попытка + Архив = Новый ЗаписьZipФайла(ИмяАрхива); + + Для Каждого ТабДокумент Из ИменаТабДокументов Цикл + ИмяТабДока = ИмяКаталога + "/" + ТабДокумент.Представление + ".mxl"; + ТабДок = ЭтаФорма["Таб" + ТабДокумент.Значение]; + ТабДок.Записать(ИмяТабДока, ТипФайлаТабличногоДокумента.MXL); + Архив.Добавить(ИмяТабДока, РежимСохраненияПутейZIP.НеСохранятьПути); + КонецЦикла; + + Архив.Записать(); + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + БылаОшибка = Истина; + КонецПопытки; + + УдалитьФайлы(ИмяКаталога); + + Если БылаОшибка Тогда + Возврат ""; + КонецЕсли; + + Данные = Новый ДвоичныеДанные(ИмяАрхива); + УдалитьФайлы(ИмяАрхива); + + Возврат ПоместитьВоВременноеХранилище(Данные, ""); + +КонецФункции + +&НаКлиенте +Функция ПолучитьСписокТиповФайловТабличныхДокументов(Результат) + + СписокТипов = Новый СписокЗначений; + + Если Результат.ФорматMXL Тогда + СписокТипов.Добавить(ТипФайлаТабличногоДокумента.MXL, "mxl"); + КонецЕсли; + + Если Результат.ФорматHTML Тогда + СписокТипов.Добавить(ТипФайлаТабличногоДокумента.HTML, "html"); + КонецЕсли; + + Если Результат.ФорматXLS Тогда + СписокТипов.Добавить(ТипФайлаТабличногоДокумента.XLS, "xls"); + КонецЕсли; + + Возврат СписокТипов; + +КонецФункции + +&НаСервере +Процедура ПоместитьТабличныеДокументыВоВременноеХранилище(СписокФайлов) + + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); + ДатаПредставление = Формат(ТекущаяДата(), "ДФ='yyyyMMdd HH:mm'"); + + Для Каждого ТабДокумент Из ИменаТабДокументов Цикл + ТабДок = ЭтаФорма["Таб" + ТабДокумент.Значение]; + ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.MXL); + Данные = Новый ДвоичныеДанные(ИмяВременногоФайла); + Путь = ПоместитьВоВременноеХранилище(Данные, ""); + + Если ОбъектыПечати.Количество() > 1 Тогда + ИмяФайла = "[ИмяМакета] ([ДатаПредставление]).mxl"; + Иначе + ИмяФайла = "[Документ] ([ИмяМакета] [ДатаПредставление]).mxl"; + КонецЕсли; + + ИмяФайла = СтрЗаменить(ИмяФайла, "[Документ]", Строка(ОбъектыПечати[0].Значение)); + ИмяФайла = СтрЗаменить(ИмяФайла, "[ИмяМакета]", ТабДокумент.Представление); + ИмяФайла = СтрЗаменить(ИмяФайла, "[ДатаПредставление]", ДатаПредставление); + + СписокФайлов.Добавить(Путь, ИмяФайла); + КонецЦикла; + + УдалитьФайлы(ИмяВременногоФайла); + +КонецПроцедуры + +#Если НЕ ВебКлиент Тогда +&НаКлиенте +Процедура ПоместитьТабличныеДокументыВФайлы(СписокФайлов, Результат) + + СписокТипов = ПолучитьСписокТиповФайловТабличныхДокументов(Результат); + ДатаПредставление = Формат(ТекущаяДата(), "ДФ='yyyyMMdd HH:mm'"); + + Для Каждого ТабДокумент Из ИменаТабДокументов Цикл + ТабДок = ЭтаФорма["Таб" + ТабДокумент.Значение]; + + Для Каждого ТипФайла Из СписокТипов Цикл + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(ТипФайла.Представление); + ТабДок.Записать(ИмяВременногоФайла, ТипФайла.Значение); + + Если ОбъектыПечати.Количество() > 1 Тогда + ИмяФайла = "[ИмяМакета] ([ДатаПредставление]).[Расширение]"; + Иначе + ИмяФайла = "[Документ] ([ИмяМакета] [ДатаПредставление]).[Расширение]"; + КонецЕсли; + + ИмяФайла = СтрЗаменить(ИмяФайла, "[Документ]", Строка(ОбъектыПечати[0].Значение)); + ИмяФайла = СтрЗаменить(ИмяФайла, "[ИмяМакета]", ТабДокумент.Представление); + ИмяФайла = СтрЗаменить(ИмяФайла, "[ДатаПредставление]", ДатаПредставление); + ИмяФайла = СтрЗаменить(ИмяФайла, "[Расширение]", ТипФайла.Представление); + + СписокФайлов.Добавить(ИмяВременногоФайла, ИмяФайла); + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Функция ПоместитьТабличныеДокументыВZIPНаКлиенте(Результат) + + ИмяКаталога = ПолучитьИмяВременногоФайла(); + ИмяАрхива = ПолучитьИмяВременногоФайла("zip"); + БылаОшибка = Ложь; + + СписокТипов = ПолучитьСписокТиповФайловТабличныхДокументов(Результат); + + СоздатьКаталог(ИмяКаталога); + + Попытка + Архив = Новый ЗаписьZipФайла(ИмяАрхива); + + Для Каждого ТабДокумент Из ИменаТабДокументов Цикл + ТабДок = ЭтаФорма["Таб" + ТабДокумент.Значение]; + + Для Каждого ТипФайла Из СписокТипов Цикл + ИмяТабДока = ИмяКаталога + "/" + ТабДокумент.Представление + "." + ТипФайла.Представление; + ТабДок.Записать(ИмяТабДока, ТипФайла.Значение); + Архив.Добавить(ИмяТабДока, РежимСохраненияПутейZIP.НеСохранятьПути); + КонецЦикла; + КонецЦикла; + + Архив.Записать(); + Исключение + БылаОшибка = Истина; + КонецПопытки; + + УдалитьФайлы(ИмяКаталога); + + Если БылаОшибка Тогда + Возврат ""; + КонецЕсли; + + Возврат ИмяАрхива; + +КонецФункции +#КонецЕсли + +&НаКлиенте +Процедура ПерейтиКУправлениюМакетами(Команда) + + ПараметрыОткрытия = ?(МакетыПечатныхФорм.Количество() > 0, Новый Структура("Фильтр", ОбъектыПечати[0].Значение), Неопределено); + + ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.МакетыПечатныхФорм", ПараметрыОткрытия); + +КонецПроцедуры + +&НаКлиенте +Процедура НормализоватьИменаФайлов(СписокФайлов) + + СтрИсключения = """ / \ [ ] : ; | = , ? * < >"; + СтрИсключения = СтрЗаменить(СтрИсключения, " ", ""); + + Для Каждого ЭлементФайл Из СписокФайлов Цикл + Для Индекс = 1 По СтрДлина(СтрИсключения) Цикл + + Символ = Сред(СтрИсключения, Индекс, 1); + + Если Найти(ЭлементФайл.Представление, Символ) > 0 Тогда + ЭлементФайл.Представление = СтрЗаменить(ЭлементФайл.Представление, Символ, " "); + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/CommonForms/ПечатьДокументов/ПечатьДокументов.mdo b/SSL/src/CommonForms/ПечатьДокументов/ПечатьДокументов.mdo new file mode 100644 index 000000000..cbbcbd83f --- /dev/null +++ b/SSL/src/CommonForms/ПечатьДокументов/ПечатьДокументов.mdo @@ -0,0 +1,11 @@ + + + ПечатьДокументов + + ru + Печать документов + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Form.form b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Form.form new file mode 100644 index 000000000..653fbf00a --- /dev/null +++ b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Form.form @@ -0,0 +1,328 @@ + + + + Пароль + 6 + true + true + + true + + + Пароль + + + ПарольРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ПарольКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПодтверждениеПароля + 4 + + <key>ru</key> + <value>Подтверждение</value> + + true + true + + true + + + ПодтверждениеПароля + + + ПодтверждениеПароляРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + ПодтверждениеПароляКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СохранятьПароль + 8 + true + true + + true + + + СохранятьПароль + + Right + + СохранятьПарольРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + СохранятьПарольКонтекстноеМеню + 9 + true + + CheckBoxField + Enter + true + Left + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + СохранитьПарольИПродолжить + 3 + true + true + + true + + false + + СохранитьПарольИПродолжитьРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + Form.Command.СохранитьПарольИПродолжить + Auto + true + true + true + UserCmds + Auto + + + Отмена + 2 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 1 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + 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 + + Boolean + + + true + + + true + + + + УчетнаяЗапись + + <key>ru</key> + <value>Учетная запись</value> + + 4 + + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + + true + + + true + + + + СохранитьПарольИПродолжить + + <key>ru</key> + <value>Продолжить</value> + + 1 + + ru + Сохранить пароль в информационной базе и отправить сообщение + + + true + + + + СохранитьПарольИПродолжитьВыполнить + + + Auto + Auto + + + УчетнаяЗапись + + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + + + + + + diff --git a/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Help/ru.html b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Help/ru.html new file mode 100644 index 000000000..22f9076ed --- /dev/null +++ b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Help/ru.html @@ -0,0 +1,7 @@ + +

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

    +

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

    +
    • Продолжить - эта форма закрывается и письмо отправляется +
    • Отмена - отмена ввода пароля, так же вызывает отмену отправки сообщения +
    •  - показывает эту справку

     

    +

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

    \ 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..4d64ec023 --- /dev/null +++ b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Module.bsl @@ -0,0 +1,104 @@ +//------------------------------------------------------------------------------ +// СПЕЦИФИКАЦИЯ ПАРАМЕТРОВ ПЕРЕДАВАЕМЫХ В ФОРМУ +// +// УчетнаяЗапись* - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты +// +// ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ +// +// Неопределено - пользователь отказался от ввода пароля +// Структура - +// ключ "Статус", булево - истина или ложь в зависмости от успеха вызова +// ключ "Пароль", строка - в случае если статус Истина содержит пароль +// ключ "СообщениеОбОшибке" - в случае если статус Истина содержит текст +// сообщения об ошибке +// +//------------------------------------------------------------------------------ +// СПЕЦИФИКАЦИЯ ФУНКЦИОНИРОВАНИЯ ФОРМЫ +// +// Если в списке переданных учетных записей более одной записи, то на форме +// появится возможность выбора учетной записи, с которой будет отправлено +// электронное сообщение. +// +//------------------------------------------------------------------------------ + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ ОБРАБОТЧИКОВ СОБЫТИЙ ФОРМЫ И ЭЛЕМЕНТОВ ФОРМЫ +// + +// Обработчик события "при создании на сервере" формы +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.УчетнаяЗапись.Пустая() Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + УчетнаяЗапись = Параметры.УчетнаяЗапись; + + Результат = ЗагрузитьПароль(); + + Если ЗначениеЗаполнено(Результат) Тогда + Пароль = Результат; + ПодтверждениеПароля = Результат; + СохранятьПароль = Истина; + Иначе + Пароль = ""; + ПодтверждениеПароля = ""; + СохранятьПароль = Ложь; + КонецЕсли; + +КонецПроцедуры + +// Обработчик события нажатия на кнопку "Продолжить" +// +&НаКлиенте +Процедура СохранитьПарольИПродолжитьВыполнить() + + Если Пароль <> ПодтверждениеПароля Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Пароль и подтверждение пароля не совпадают'"), , "Пароль"); + Возврат; + КонецЕсли; + + Если СохранятьПароль Тогда + СохранитьПароль(Пароль); + Иначе + СохранитьПароль(Неопределено); + КонецЕсли; + + Закрыть(Пароль); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ СЕРВИСНЫХ ФУНКЦИЙ +// + +// Сохраняет значение в системном хранилище настроек ИБ +// +&НаСервере +Процедура СохранитьПароль(Значение) + + ХранилищеОбщихНастроек.Сохранить( + "ФормаПодтвержденияПароляУчетнойЗаписи", + УчетнаяЗапись, + Значение, , + ОбщегоНазначения.ТекущийПользователь()); + +КонецПроцедуры + +// Получает значение из системного хранилища настроек ИБ +// +&НаСервере +Функция ЗагрузитьПароль() + + Значение = ХранилищеОбщихНастроек.Загрузить( + "ФормаПодтвержденияПароляУчетнойЗаписи", + УчетнаяЗапись, , + ОбщегоНазначения.ТекущийПользователь()); + + Возврат Значение; + +КонецФункции diff --git a/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/ПодтверждениеПароляУчетнойЗаписи.mdo b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/ПодтверждениеПароляУчетнойЗаписи.mdo new file mode 100644 index 000000000..703aba9cb --- /dev/null +++ b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/ПодтверждениеПароляУчетнойЗаписи.mdo @@ -0,0 +1,16 @@ + + + ПодтверждениеПароляУчетнойЗаписи + + ru + Подтверждение пароля учетной записи + + true + + + ru + + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonForms/ПоискПоИндексу/Form.form b/SSL/src/CommonForms/ПоискПоИндексу/Form.form new file mode 100644 index 000000000..20d205ea6 --- /dev/null +++ b/SSL/src/CommonForms/ПоискПоИндексу/Form.form @@ -0,0 +1,558 @@ + + + + <key>ru</key> + <value>Выберите улицу/населенный пункт</value> + + + НадписьОРегионеИРайоне + 13 + + true + true + + true + + + НадписьОРегионеИРайоне + + None + + НадписьОРегионеИРайонеРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + НадписьОРегионеИРайонеКонтекстноеМеню + 14 + true + + LabelField + Enter + true + Left + true + + true + true + + Style.FieldSelectionBackColor + + + System.DefaultGUIFont + true + false + false + false + + + + + НайденныеЗаписиПоИндексу + 1 + true + true + + true + + + НайденныеЗаписиПоИндексу + + true + false + None + + Улица + 4 + true + true + + true + + + НайденныеЗаписиПоИндексу.Улица + + + УлицаРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + УлицаКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Описание + 6 + + <key>ru</key> + <value>Город/Нас.пункт</value> + + true + true + + true + + + НайденныеЗаписиПоИндексу.Описание + + + ОписаниеРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + None + + НайденныеЗаписиПоИндексуКоманднаяПанель + 3 + Left + true + + + Selection + НайденныеЗаписиПоИндексуВыбор + + + НайденныеЗаписиПоИндексуСтрокаПоиска + 18 + + НайденныеЗаписиПоИндексуСтрокаПоискаРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + НайденныеЗаписиПоИндексуСтрокаПоискаКонтекстноеМеню + 19 + true + + НайденныеЗаписиПоИндексу + + true + + + + НайденныеЗаписиПоИндексуСостояниеПросмотра + 21 + + НайденныеЗаписиПоИндексуСостояниеПросмотраРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + НайденныеЗаписиПоИндексуСостояниеПросмотраКонтекстноеМеню + 22 + true + + ViewStatusAddition + НайденныеЗаписиПоИндексу + + true + + + + НайденныеЗаписиПоИндексуУправлениеПоиском + 24 + + НайденныеЗаписиПоИндексуУправлениеПоискомРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + НайденныеЗаписиПоИндексуУправлениеПоискомКонтекстноеМеню + 25 + true + + SearchControlAddition + НайденныеЗаписиПоИндексу + + true + + + + НайденныеЗаписиПоИндексуРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + НайденныеЗаписиПоИндексуКонтекстноеМеню + 2 + true + + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + + Style.BorderColor + + None + None + None + true + +
    + + Группа + 8 + + КомандаВыбрать + 9 + true + true + + true + + false + + КомандаВыбратьРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + Form.Command.КомандаВыбрать + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + КомандаЗакрыть + 10 + true + true + + true + + false + + КомандаЗакрытьРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + Form.Command.КомандаЗакрыть + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + 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 + + String + + + + true + + + true + + + + + НадписьОРегионеИРайоне + + <key>ru</key> + <value>Надпись о регионе и районе</value> + + 2 + + String + + + + true + + + true + + + + КомандаВыбрать + + <key>ru</key> + <value>Выбрать</value> + + 1 + + ru + Выбрать + + + true + + + + КомандаВыбратьВыполнить + + + Auto + Auto + + + КомандаЗакрыть + + <key>ru</key> + <value>Закрыть</value> + + 2 + + ru + Закрыть + + + true + + + + КомандаЗакрытьВыполнить + + + Auto + Auto + + + НайденныйРегион + + String + + + + + НайденныйРайон + + String + + + + + АдресВХранилище + + String + + + + + + + +
    diff --git a/SSL/src/CommonForms/ПоискПоИндексу/Module.bsl b/SSL/src/CommonForms/ПоискПоИндексу/Module.bsl new file mode 100644 index 000000000..7b7b3dae5 --- /dev/null +++ b/SSL/src/CommonForms/ПоискПоИндексу/Module.bsl @@ -0,0 +1,54 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ + +&НаКлиенте +Процедура ОбработатьВыбор() + + Закрыть(Элементы.НайденныеЗаписиПоИндексу.ТекущиеДанные.Код); + +КонецПроцедуры + + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗначениеВРеквизитФормы(ПолучитьИзВременногоХранилища(Параметры.АдресВХранилище), "НайденныеЗаписиПоИндексу"); + УдалитьИзВременногоХранилища(Параметры.АдресВХранилище); + + НадписьОРегионеИРайоне = "" + Параметры.НайденныйРегион + ?(ЗначениеЗаполнено(Параметры.НайденныйРегион) И ЗначениеЗаполнено(Параметры.НайденныйРайон), ", ", "") + Параметры.НайденныйРайон; + + ЕстьОписание = Ложь; + Для Каждого Стр Из НайденныеЗаписиПоИндексу Цикл + Если Не ПустаяСтрока(Стр.Описание) Тогда + ЕстьОписание = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Элементы.НайденныеЗаписиПоИндексу.ПодчиненныеЭлементы.Описание.Видимость = ЕстьОписание; + +КонецПроцедуры + + + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура КомандаЗакрытьВыполнить() + Закрыть(); +КонецПроцедуры + +&НаКлиенте +Процедура КомандаВыбратьВыполнить() + ОбработатьВыбор(); +КонецПроцедуры + +&НаКлиенте +Процедура НайденныеЗаписиПоИндексуВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + ОбработатьВыбор(); +КонецПроцедуры diff --git a/SSL/src/CommonForms/ПоискПоИндексу/ПоискПоИндексу.mdo b/SSL/src/CommonForms/ПоискПоИндексу/ПоискПоИндексу.mdo new file mode 100644 index 000000000..6efa68826 --- /dev/null +++ b/SSL/src/CommonForms/ПоискПоИндексу/ПоискПоИндексу.mdo @@ -0,0 +1,11 @@ + + + ПоискПоИндексу + + ru + Поиск по индексу + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/ПраваПоЗначениямДоступа/ConditionalAppearance.dcssca b/SSL/src/CommonForms/ПраваПоЗначениямДоступа/ConditionalAppearance.dcssca new file mode 100644 index 000000000..603dd94bb --- /dev/null +++ b/SSL/src/CommonForms/ПраваПоЗначениямДоступа/ConditionalAppearance.dcssca @@ -0,0 +1,23 @@ + + + + + + ГруппыПрав + + + + + ГруппыПрав.Запрещено + Equal + true + + + + + ЦветТекста + #FFFF00 + + + + diff --git a/SSL/src/CommonForms/ПраваПоЗначениямДоступа/Form.form b/SSL/src/CommonForms/ПраваПоЗначениямДоступа/Form.form new file mode 100644 index 000000000..d2902c2c4 --- /dev/null +++ b/SSL/src/CommonForms/ПраваПоЗначениямДоступа/Form.form @@ -0,0 +1,1092 @@ + + + + ВидДоступа + 8 + true + true + + true + + + ВидДоступа + + + OnChange + ВидДоступаПриИзменении + + + ВидДоступаРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ВидДоступаКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + + StartChoice + ВидДоступаНачалоВыбора + + + Clearing + ВидДоступаОчистка + + true + true + true + false + true + false + false + false + true + true + Normal + + + + ГруппыПрав + 1 + true + true + + true + + + ГруппыПрав + + false + None + OutputList + + ГруппыПравРаспространяетсяВИерархии + 19 + + <key>ru</key> + <value>Распр</value> + + true + true + + true + + + ГруппыПрав.РаспространяетсяВИерархии + + + ru + Распространяется в иерархии (значения доступа) + + + ГруппыПравРаспространяетсяВИерархииРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + + ГруппыПравРаспространяетсяВИерархииКонтекстноеМеню + 20 + true + + CheckBoxField + Auto + true + + CommonPicture.РаспространяетсяВИерархии + + Left + true + + + None + + ГруппыПравКоманднаяПанель + 3 + Left + true + + + BeforeDeleteRow + ГруппыПравПередУдалением + + + BeforeRowChange + ГруппыПравПередНачаломИзменения + + + OnStartEdit + ГруппыПравПриНачалеРедактирования + + + ГруппыПравСтрокаПоиска + 54 + + ГруппыПравСтрокаПоискаРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + ГруппыПравСтрокаПоискаКонтекстноеМеню + 55 + true + + ГруппыПрав + + true + + + + ГруппыПравСостояниеПросмотра + 57 + + ГруппыПравСостояниеПросмотраРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + ГруппыПравСостояниеПросмотраКонтекстноеМеню + 58 + true + + ViewStatusAddition + ГруппыПрав + + true + + + + ГруппыПравУправлениеПоиском + 60 + + ГруппыПравУправлениеПоискомРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + ГруппыПравУправлениеПоискомКонтекстноеМеню + 61 + true + + SearchControlAddition + ГруппыПрав + + true + + + + ГруппыПравРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ГруппыПравКонтекстноеМеню + 2 + + КонтекстноеМенюГруппыПравДобавить + 23 + true + true + + true + + false + + КонтекстноеМенюГруппыПравДобавитьРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + Form.Item.ГруппыПрав.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюГруппыПравСкопировать + 24 + true + true + + true + + false + + КонтекстноеМенюГруппыПравСкопироватьРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + Form.Item.ГруппыПрав.StandardCommand.Copy + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюГруппыПравУдалить + 25 + true + true + + true + + false + + КонтекстноеМенюГруппыПравУдалитьРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + Form.Item.ГруппыПрав.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + true + 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 + +
    + + НаследоватьПраваРодителей + 15 + true + true + + true + + + НаследоватьПраваРодителей + + Right + + OnChange + НаследоватьПраваРодителейПриИзменении + + + НаследоватьПраваРодителейРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + НаследоватьПраваРодителейКонтекстноеМеню + 16 + true + + CheckBoxField + Enter + true + Left + true + + + + ФормаКоманднаяПанель + -1 + + ЗаписатьИЗакрыть + 12 + true + true + + true + + false + + ЗаписатьИЗакрытьРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + true + true + true + UserCmds + Auto + + + Записать + 21 + true + true + + true + + false + + ЗаписатьРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + Form.Command.Записать + Normal + Auto + true + true + UserCmds + + StdPicture.Write + + Auto + + + Добавить + 31 + true + true + + true + + false + + ДобавитьРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + Form.Item.ГруппыПрав.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + Скопировать + 32 + true + true + + true + + false + + СкопироватьРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + Form.Item.ГруппыПрав.StandardCommand.Copy + Normal + Auto + true + true + UserCmds + Auto + + + Удалить + 33 + true + true + + true + + false + + УдалитьРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + Form.Item.ГруппыПрав.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + Найти + 34 + 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 + + СправкаРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + + ИзменитьФорму + 36 + true + true + + true + + false + + ИзменитьФормуРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + + Left + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ГруппыПрав + + <key>ru</key> + <value>Группы прав</value> + + 1 + + ValueTable + + + true + + + true + + true + + Запрещено + + <key>ru</key> + <value>Запрещено</value> + + 2 + + Boolean + + + true + + + true + + + + РаспространяетсяВИерархии + + <key>ru</key> + <value>Распространяется в иерархии</value> + + 1 + + Boolean + + + true + + + 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 + + + true + + + true + + + + ОбратныеЗависимостиПрав + + <key>ru</key> + <value>Обратные зависимости прав</value> + + 6 + + + true + + + true + + + + ВозможныеПрава + + <key>ru</key> + <value>Возможные права</value> + + 7 + + + true + + + true + + + + НастройкаПоГруппеПользователей + + <key>ru</key> + <value>Настройка по группе пользователей</value> + + 8 + + Boolean + + + true + + + true + + + + НаследоватьПраваРодителей + + <key>ru</key> + <value>Наследовать права родителей</value> + + 11 + + Boolean + + + true + + + true + + true + + + ДобавленныеРеквизиты + + <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 + + + + ВнешнийПользовательИлиГруппа + + <key>ru</key> + <value>Внешний пользователь или группа</value> + + 14 + + Boolean + + + true + + + true + + + + ИспользоватьВнешнихПользователей + + <key>ru</key> + <value>Использовать внешних пользователей</value> + + 15 + + Boolean + + + true + + + true + + + + СписокТиповПользователей + + <key>ru</key> + <value>Список типов пользователей</value> + + 16 + + ValueList + + + true + + + true + + + + + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 1 + + ru + Записать и закрыть + + + true + + + StdPicture.WriteAndClose + + + + ЗаписатьИЗакрыть + + + TextPicture + true + Auto + Auto + + + Записать + + <key>ru</key> + <value>Записать</value> + + 2 + + ru + Записать + + + true + + + + Записать + + + true + Auto + Auto + + + Перечитать + + <key>ru</key> + <value>Перечитать</value> + + 3 + + ru + Перечитать + + + true + + + StdPicture.Reread + + + + Перечитать + + + Auto + Auto + + + СсылкаНаОбъект + + true + + + + + +
    diff --git a/SSL/src/CommonForms/ПраваПоЗначениямДоступа/Module.bsl b/SSL/src/CommonForms/ПраваПоЗначениямДоступа/Module.bsl new file mode 100644 index 000000000..ab0a01617 --- /dev/null +++ b/SSL/src/CommonForms/ПраваПоЗначениямДоступа/Module.bsl @@ -0,0 +1,1132 @@ + +&НаСервере +Функция НазваниеОбъектаИзМетаданных(МетаданныеОбъекта) + + Если ЗначениеЗаполнено(МетаданныеОбъекта.РасширенноеПредставлениеОбъекта) Тогда + НазваниеОбъекта = МетаданныеОбъекта.РасширенноеПредставлениеОбъекта; + ИначеЕсли ЗначениеЗаполнено(МетаданныеОбъекта.ПредставлениеОбъекта) Тогда + НазваниеОбъекта = МетаданныеОбъекта.ПредставлениеОбъекта; + ИначеЕсли ЗначениеЗаполнено(МетаданныеОбъекта.Синоним) Тогда + НазваниеОбъекта = МетаданныеОбъекта.Синоним; + Иначе + НазваниеОбъекта = МетаданныеОбъекта.Имя; + КонецЕсли; + + Возврат НазваниеОбъекта; + +КонецФункции + +// Подготовка таблиц прав, проверяемых в стандартных шаблонах ограничения доступа по возможным правам. +&НаСервере +Функция ПолучитьПраваТаблицДляШаблонов(ТаблицаЗначенийДоступа, Право) + + ПраваТаблицДляШаблонов = Новый Соответствие; + ОписаниеПрава = УправлениеДоступом.ВозможныеПраваПоЗначениюДоступа(ТаблицаЗначенийДоступа).Найти(Право, "Имя"); + Для каждого Таблица Из ОписаниеПрава.ЧтениеВТаблицах Цикл + ПраваТаблицы = ПраваТаблицДляШаблонов.Получить(Таблица); + Если ПраваТаблицы = Неопределено Тогда + ПраваТаблицы = Новый Структура("Чтение, Добавление, Изменение, Удаление", Ложь, Ложь, Ложь, Ложь); + ПраваТаблицДляШаблонов.Вставить(Таблица, ПраваТаблицы); + КонецЕсли; + ПраваТаблицы.Чтение = Истина; + КонецЦикла; + Для каждого Таблица Из ОписаниеПрава.ДобавлениеВТаблицах Цикл + ПраваТаблицы = ПраваТаблицДляШаблонов.Получить(Таблица); + Если ПраваТаблицы = Неопределено Тогда + ПраваТаблицы = Новый Структура("Чтение, Добавление, Изменение, Удаление", Ложь, Ложь, Ложь, Ложь); + ПраваТаблицДляШаблонов.Вставить(Таблица, ПраваТаблицы); + КонецЕсли; + ПраваТаблицы.Добавление = Истина; + КонецЦикла; + Для каждого Таблица Из ОписаниеПрава.ИзменениеВТаблицах Цикл + ПраваТаблицы = ПраваТаблицДляШаблонов.Получить(Таблица); + Если ПраваТаблицы = Неопределено Тогда + ПраваТаблицы = Новый Структура("Чтение, Добавление, Изменение, Удаление", Ложь, Ложь, Ложь, Ложь); + ПраваТаблицДляШаблонов.Вставить(Таблица, ПраваТаблицы); + КонецЕсли; + ПраваТаблицы.Изменение = Истина; + КонецЦикла; + Для каждого Таблица Из ОписаниеПрава.УдалениеВТаблицах Цикл + ПраваТаблицы = ПраваТаблицДляШаблонов.Получить(Таблица); + Если ПраваТаблицы = Неопределено Тогда + ПраваТаблицы = Новый Структура("Чтение, Добавление, Изменение, Удаление", Ложь, Ложь, Ложь, Ложь); + ПраваТаблицДляШаблонов.Вставить(Таблица, ПраваТаблицы); + КонецЕсли; + ПраваТаблицы.Удаление = Истина; + КонецЦикла; + + Если ПраваТаблицДляШаблонов.Количество() = 0 Тогда + ПраваТаблицДляШаблонов.Вставить("", Новый Структура("Чтение, Добавление, Изменение, Удаление", Ложь, Ложь, Ложь, Ложь)); + КонецЕсли; + + Возврат ПраваТаблицДляШаблонов; + +КонецФункции + +&НаСервере +Процедура ДобавитьРеквизит(НовыеРеквизиты, Реквизит, НачальноеЗначение) + + НовыеРеквизиты.Добавить(Реквизит); + ДобавленныеРеквизиты.Вставить(Реквизит.Имя, НачальноеЗначение); + +КонецПроцедуры + +&НаСервере +Функция ДобавитьЭлемент(Имя, Тип, Родитель) + + Элемент = Элементы.Добавить(Имя, Тип, Родитель); + Элемент.ФиксацияВТаблице = ФиксацияВТаблице.Нет; + ДобавленныеЭлементы.Вставить(Имя); + Возврат Элемент; + +КонецФункции + +&НаСервере +Процедура ДобавитьРеквизитыЭлементыФормы(НовыеРеквизиты = Неопределено) + + ОписанияВозможныхПрав = УправлениеДоступом.ВозможныеПраваПоЗначениюДоступа(ТаблицаЗначенийДоступа); + + Если НастройкаПоЗначениюДоступа Тогда + Если НовыеРеквизиты <> Неопределено Тогда + ДобавитьРеквизит(НовыеРеквизиты, Новый РеквизитФормы("Пользователь", Новый ОписаниеТипов("СправочникСсылка.Пользователи, СправочникСсылка.ГруппыПользователей, СправочникСсылка.ВнешниеПользователи, СправочникСсылка.ГруппыВнешнихПользователей"), "ГруппыПрав", НСтр("ru = 'Пользователь'")), Справочники.Пользователи.ПустаяСсылка()); + ДобавитьРеквизит(НовыеРеквизиты, Новый РеквизитФормы("НомерКартинки", Новый ОписаниеТипов("Число"), "ГруппыПрав"), -1); + Иначе + Элемент = ДобавитьЭлемент("ГруппыПравПользователь", Тип("ПолеФормы"), Элементы.ГруппыПрав); + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.ПутьКДанным = "ГруппыПрав.Пользователь"; + Элемент.ТолькоПросмотр = НЕ НастройкаПоЗначениюДоступа; + Элемент.УстановитьДействие("ПриИзменении", "ГруппыПравПользовательПриИзменении"); + Элемент.УстановитьДействие("НачалоВыбора", "ГруппыПравПользовательНачалоВыбора"); + Элемент.УстановитьДействие("Очистка", "ГруппыПравПользовательОчистка"); + Элемент.УстановитьДействие("ОкончаниеВводаТекста", "ГруппыПравПользовательОкончаниеВводаТекста"); + Элемент.УстановитьДействие("АвтоПодбор", "ГруппыПравПользовательАвтоПодбор"); + + Элементы.ГруппыПрав.ПутьКДаннымКартинкиСтроки = "ГруппыПрав.НомерКартинки"; + КонецЕсли; + Иначе + Если НовыеРеквизиты <> Неопределено Тогда + ДобавитьРеквизит(НовыеРеквизиты, Новый РеквизитФормы("ЗначениеДоступа", Метаданные.НайтиПоПолномуИмени(ТаблицаЗначенийДоступа).СтандартныеРеквизиты.Ссылка.Тип, + "ГруппыПрав", + НазваниеЗначенийДоступа), + Неопределено); + Иначе + Элемент = ДобавитьЭлемент("ГруппыПравЗначениеДоступа", Тип("ПолеФормы"), Элементы.ГруппыПрав); + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.ПутьКДанным = "ГруппыПрав.ЗначениеДоступа"; + КонецЕсли; + КонецЕсли; + + // Добавление возможных прав, настраиваемых по владельцу (таблице значений доступа). + Для каждого ОписаниеПрава Из ОписанияВозможныхПрав Цикл + + Если НовыеРеквизиты <> Неопределено Тогда + ДобавитьРеквизит(НовыеРеквизиты, Новый РеквизитФормы(ОписаниеПрава.Имя, Новый ОписаниеТипов("Булево"), "ГруппыПрав", ОписаниеПрава.Синоним), ОписаниеПрава.НачальноеЗначение); + + ВозможныеПрава.Вставить(ОписаниеПрава.Имя); + + // Добавление прямых и обратных зависимостей прав. + ПрямыеЗависимостиПрав.Вставить(ОписаниеПрава.Имя, ОписаниеПрава.ТребуемыеПрава); + Для каждого ЗависимоеПраво Из ОписаниеПрава.ТребуемыеПрава Цикл + Если ОбратныеЗависимостиПрав.Свойство(ЗависимоеПраво) Тогда + ЗависимыеПрава = ОбратныеЗависимостиПрав[ЗависимоеПраво]; + Иначе + ЗависимыеПрава = Новый Массив; + ОбратныеЗависимостиПрав.Вставить(ЗависимоеПраво, ЗависимыеПрава); + КонецЕсли; + Если ЗависимыеПрава.Найти(ОписаниеПрава.Имя) = Неопределено Тогда + ЗависимыеПрава.Добавить(ОписаниеПрава.Имя); + КонецЕсли; + КонецЦикла; + Иначе + Элемент = ДобавитьЭлемент("ГруппыПрав" + ОписаниеПрава.Имя, Тип("ПолеФормы"), Элементы.ГруппыПрав); + Элемент.Вид = ВидПоляФормы.ПолеФлажка; + Элемент.ПутьКДанным = "ГруппыПрав."+ ОписаниеПрава.Имя; + Элемент.УстановитьДействие("ПриИзменении", "ГруппыПравПравоПриИзменении"); + Если ЗначениеЗаполнено(ОписаниеПрава.Заголовок) Тогда + Элемент.Заголовок = ОписаниеПрава.Заголовок; + ИначеЕсли ЗначениеЗаполнено(ОписаниеПрава.Сокращение) Тогда + Элемент.Заголовок = ОписаниеПрава.Сокращение; + Иначе + Элемент.Заголовок = ОписаниеПрава.Имя; + КонецЕсли; + Элемент.Подсказка = ОписаниеПрава.Синоним; + КонецЕсли; + КонецЦикла; + + Если НастройкаПоЗначениюДоступа Тогда + Если НовыеРеквизиты <> Неопределено Тогда + ТипыНаследуетсяОт = Метаданные.РегистрыСведений.ПраваПоЗначениямДоступа.Измерения.ЗначениеДоступа.Тип.Типы(); + ТипыНаследуетсяОт.Добавить(Тип("Строка")); + ДобавитьРеквизит(НовыеРеквизиты, Новый РеквизитФормы("НаследуетсяОт", Новый ОписаниеТипов(ТипыНаследуетсяОт), "ГруппыПрав", НСтр("ru = 'Наследуется от'")), НСтр("ru = '<не наследуется>'")); + Иначе + Элемент = ДобавитьЭлемент("ГруппыПравНаследуетсяОт", Тип("ПолеФормы"), Элементы.ГруппыПрав); + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.ПутьКДанным = "ГруппыПрав.НаследуетсяОт"; + Элемент.ТолькоПросмотр = Истина; + Элемент.Подсказка = НСтр("ru = 'Наследуется от (значения доступа)'"); + КонецЕсли; + ИначеЕсли НЕ НастройкаПоГруппеПользователей Тогда + Если НовыеРеквизиты <> Неопределено Тогда + ДобавитьРеквизит(НовыеРеквизиты, Новый РеквизитФормы("ГруппаПользователей", Новый ОписаниеТипов("СправочникСсылка.ГруппыПользователей, СправочникСсылка.ГруппыВнешнихПользователей, Строка"), "ГруппыПрав", НСтр("ru = 'От группы'")), Неопределено); + Иначе + Элемент = ДобавитьЭлемент("ГруппыПравГруппаПользователей", Тип("ПолеФормы"), Элементы.ГруппыПрав); + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.ПутьКДанным = "ГруппыПрав.ГруппаПользователей"; + Элемент.ТолькоПросмотр = НЕ НастройкаПоЗначениюДоступа; + Элемент.Подсказка = НСтр("ru = 'Настройка прав от группы пользователей'"); + КонецЕсли; + КонецЕсли; + + Если НовыеРеквизиты = Неопределено Тогда + Элемент = ДобавитьЭлемент("ГруппыПравЗапрещено", Тип("ПолеФормы"), Элементы.ГруппыПрав); + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.ПутьКДанным = "ГруппыПрав.Запрещено"; + Элемент.Заголовок = НСтр("ru = 'Тип прав'"); + Элемент.УстановитьДействие("ПриИзменении", "ГруппыПравЗапрещеноПриИзменении"); + Элемент.Формат = НСтр("ru = 'БЛ=Разрешить; БИ=Запретить'"); + Элемент.ФорматРедактирования = Элемент.Формат; + Элемент.Подсказка = НСтр("ru = 'Запретить/Разрешить'"); + КонецЕсли; + + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьПрава() + + ПрямыеЗависимостиПрав = Новый Структура; + ОбратныеЗависимостиПрав = Новый Структура; + ВозможныеПрава = Новый Структура; + + Если ДобавленныеЭлементы = Неопределено Тогда + ДобавленныеЭлементы = Новый Структура; + Иначе + // Удаление ранее добавленных элементов. + Для каждого ОписаниеЭлемента Из ДобавленныеЭлементы Цикл + Элементы.Удалить(Элементы[ОписаниеЭлемента.Ключ]); + КонецЦикла; + ДобавленныеЭлементы.Очистить(); + КонецЕсли; + + УдаляемыеРеквизиты = Новый Массив; + Если ДобавленныеРеквизиты = Неопределено Тогда + ДобавленныеРеквизиты = Новый Структура; + Иначе + // Подготовка массива удаляемых реквизитов. + Для каждого ОписаниеРеквизита Из ДобавленныеРеквизиты Цикл + УдаляемыеРеквизиты.Добавить("ГруппыПрав." + ОписаниеРеквизита.Ключ); + КонецЦикла; + ДобавленныеРеквизиты.Очистить(); + КонецЕсли; + + // Подготовка новых реквизитов формы. + НовыеРеквизиты = Новый Массив; + ДобавитьРеквизитыЭлементыФормы(НовыеРеквизиты); + + // Обновление реквизитов формы. + ИзменитьРеквизиты(НовыеРеквизиты, УдаляемыеРеквизиты); + + // Добавление новых элементов формы. + ДобавитьРеквизитыЭлементыФормы(); + + ПрочитатьПрава(); + +КонецПроцедуры + +&НаСервере +Процедура ПрочитатьПрава() + + УстановитьПривилегированныйРежим(Истина); + + ГруппыПрав.Очистить(); + Запрос = Новый Запрос; + + Если НастройкаПоЗначениюДоступа Тогда + + // Чтение прав по значению доступа (флажок НаследоватьПраваРодителей). + Запрос.УстановитьПараметр("ВидДоступа", ВидДоступа); + Запрос.УстановитьПараметр("ЗначениеДоступа", Параметры.СсылкаНаОбъект); + Запрос.Текст = + "ВЫБРАТЬ + | ИерархияЗначений.НаследоватьПраваРодителей + |ИЗ + | РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + |ГДЕ + | ИерархияЗначений.ГруппаДоступа = &ЗначениеДоступа + | И ИерархияЗначений.ЗначениеДоступа = &ЗначениеДоступа"; + Выборка = Запрос.Выполнить().Выбрать(); + НаследоватьПраваРодителей = ?(Выборка.Следующий(), Выборка.НаследоватьПраваРодителей, Ложь); + + // Чтение прав по значению доступа (без прав, наследуемых по иерархии). + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПраваПоЗначениямДоступа.Пользователь, + | ПраваПоЗначениямДоступа.Право, + | ПраваПоЗначениямДоступа.Запрещено, + | ПраваПоЗначениямДоступа.РаспространяетсяВИерархии + |ИЗ + | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениямДоступа + |ГДЕ + | ПраваПоЗначениямДоступа.ЗначениеДоступа = &ЗначениеДоступа + | + |УПОРЯДОЧИТЬ ПО + | ПраваПоЗначениямДоступа.Пользователь"; + Выборка = Запрос.Выполнить().Выбрать(); + ТекущийПользователь = Неопределено; + Пока Выборка.Следующий() Цикл + Если ТекущийПользователь <> Выборка.Пользователь Тогда + ТекущийПользователь = Выборка.Пользователь; + ГруппаПрав = ГруппыПрав.Добавить(); + ГруппаПрав.НаследуетсяОт = НСтр("ru = '<не наследуется>'"); + ГруппаПрав.Пользователь = Выборка.Пользователь; + ГруппаПрав.Запрещено = Выборка.Запрещено; + ГруппаПрав.РаспространяетсяВИерархии = Выборка.РаспространяетсяВИерархии; + КонецЕсли; + Если ВозможныеПрава.Свойство(Выборка.Право) Тогда + ГруппаПрав[Выборка.Право] = Истина; + КонецЕсли; + КонецЦикла; + + Если НаследоватьПраваРодителей Тогда + ДобавитьПраваНаследуемыеПоИерархии(); + КонецЕсли; + + ИначеЕсли НастройкаПоГруппеПользователей Тогда + // Чтение прав по группе пользователей (без прав, наследуемых по иерархии). + Запрос.УстановитьПараметр("ГруппаПользователей", Параметры.СсылкаНаОбъект); + Запрос.Текст = СтрЗаменить( + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПраваПоЗначениямДоступа.ЗначениеДоступа, + | ПраваПоЗначениямДоступа.Право, + | ПраваПоЗначениямДоступа.Запрещено, + | ПраваПоЗначениямДоступа.РаспространяетсяВИерархии + |ИЗ + | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениямДоступа + |ГДЕ + | ПраваПоЗначениямДоступа.Пользователь = &ГруппаПользователей + | И ТИПЗНАЧЕНИЯ(ПраваПоЗначениямДоступа.ЗначениеДоступа) = &ТаблицаЗначенийДоступа + | + |УПОРЯДОЧИТЬ ПО + | ПраваПоЗначениямДоступа.ЗначениеДоступа", "&ТаблицаЗначенийДоступа", "Тип(" + ТаблицаЗначенийДоступа + ")"); + Выборка = Запрос.Выполнить().Выбрать(); + ТекущееЗначениеДоступа = Неопределено; + Пока Выборка.Следующий() Цикл + Если ТекущееЗначениеДоступа <> Выборка.ЗначениеДоступа Тогда + ТекущееЗначениеДоступа = Выборка.ЗначениеДоступа; + ГруппаПрав = ГруппыПрав.Добавить(); + ГруппаПрав.ЗначениеДоступа = Выборка.ЗначениеДоступа; + ГруппаПрав.Запрещено = Выборка.Запрещено; + ГруппаПрав.РаспространяетсяВИерархии = Выборка.РаспространяетсяВИерархии; + КонецЕсли; + Если ВозможныеПрава.Свойство(Выборка.Право) Тогда + ГруппаПрав[Выборка.Право] = Истина; + КонецЕсли; + КонецЦикла; + Иначе + // Чтение прав по пользователю (без прав, наследуемых по иерархии). + Запрос.УстановитьПараметр("Пользователь", Параметры.СсылкаНаОбъект); + Запрос.Текст = СтрЗаменить( + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПраваПоЗначениямДоступа.ЗначениеДоступа, + | ПраваПоЗначениямДоступа.Пользователь, + | ПраваПоЗначениямДоступа.Право, + | ПраваПоЗначениямДоступа.Запрещено, + | ПраваПоЗначениямДоступа.РаспространяетсяВИерархии + |ИЗ + | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениямДоступа + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ПО (ТИПЗНАЧЕНИЯ(ПраваПоЗначениямДоступа.ЗначениеДоступа) = &ТаблицаЗначенийДоступа) + | И (ПользователиИГруппыПользователей.ВидДоступа В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи))) + | И (ПользователиИГруппыПользователей.ЗначениеДоступа = &Пользователь) + | И (ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ) + | И (ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениямДоступа.Пользователь) + | + |УПОРЯДОЧИТЬ ПО + | ПраваПоЗначениямДоступа.ЗначениеДоступа, + | ПраваПоЗначениямДоступа.Пользователь", "&ТаблицаЗначенийДоступа", "Тип(" + ТаблицаЗначенийДоступа + ")"); + Выборка = Запрос.Выполнить().Выбрать(); + ТекущееЗначениеДоступа = Неопределено; + ТекущийПользователь = Неопределено; + Пока Выборка.Следующий() Цикл + Если ТекущееЗначениеДоступа <> Выборка.ЗначениеДоступа ИЛИ ТекущийПользователь <> Выборка.Пользователь Тогда + ТекущееЗначениеДоступа = Выборка.ЗначениеДоступа; + ТекущийПользователь = Выборка.Пользователь; + ГруппаПрав = ГруппыПрав.Добавить(); + ГруппаПрав.ГруппаПользователей = ?(ТипЗнч(Выборка.Пользователь) = Тип("СправочникСсылка.ГруппыПользователей") ИЛИ ТипЗнч(Выборка.Пользователь) = Тип("СправочникСсылка.ГруппыВнешнихПользователей"), Выборка.Пользователь, Неопределено); + ГруппаПрав.ЗначениеДоступа = Выборка.ЗначениеДоступа; + ГруппаПрав.Запрещено = Выборка.Запрещено; + ГруппаПрав.РаспространяетсяВИерархии = Выборка.РаспространяетсяВИерархии; + КонецЕсли; + Если ВозможныеПрава.Свойство(Выборка.Право) Тогда + ГруппаПрав[Выборка.Право] = Истина; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + ЗаполнитьНомераКартинокПользователей(); + + Модифицированность = Ложь; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьПраваНаследуемыеПоИерархии() + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ЗначениеДоступа", Параметры.СсылкаНаОбъект); + Запрос.Текст = + "ВЫБРАТЬ + | ПраваПоЗначениямДоступа.ЗначениеДоступа КАК ВладелецПрава, + | ПраваПоЗначениямДоступа.Пользователь, + | ПраваПоЗначениямДоступа.Право, + | ПраваПоЗначениямДоступа.Запрещено, + | ПраваПоЗначениямДоступа.РаспространяетсяВИерархии + |ИЗ + | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениямДоступа + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + | ПО ПраваПоЗначениямДоступа.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + | И (ПраваПоЗначениямДоступа.ЗначениеДоступа <> &ЗначениеДоступа) + | И (ПраваПоЗначениямДоступа.РаспространяетсяВИерархии) + | И (ИерархияЗначений.ЗначениеДоступа = &ЗначениеДоступа)"; + Выборка = Запрос.Выполнить().Выбрать(); + ТекущийВладелецПрава = Неопределено; + ТекущийПользователь = Неопределено; + Пока Выборка.Следующий() Цикл + Если ТекущийВладелецПрава <> Выборка.ВладелецПрава ИЛИ ТекущийПользователь <> Выборка.Пользователь Тогда + ТекущийВладелецПрава = Выборка.ВладелецПрава; + ТекущийПользователь = Выборка.Пользователь; + ГруппаПрав = ГруппыПрав.Добавить(); + ГруппаПрав.НаследуетсяОт = Выборка.ВладелецПрава; + ГруппаПрав.Пользователь = Выборка.Пользователь; + ГруппаПрав.Запрещено = Выборка.Запрещено; + ГруппаПрав.РаспространяетсяВИерархии = Выборка.РаспространяетсяВИерархии; + КонецЕсли; + Если ВозможныеПрава.Свойство(Выборка.Право) Тогда + ГруппаПрав[Выборка.Право] = Истина; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаПроверкиЗаполнения(Отказ) + + НомерСтроки = ГруппыПрав.Количество()-1; + + Пока НЕ Отказ И НомерСтроки >= 0 Цикл + ТекущаяСтрока = ГруппыПрав.Получить(НомерСтроки); + + // Проверка заполнения флажков прав. + НетЗаполненногоПрава = Истина; + ИмяПервогоПрава = ""; + Для каждого ВозможноеПраво Из ВозможныеПрава Цикл + Если НЕ ЗначениеЗаполнено(ИмяПервогоПрава) Тогда + ИмяПервогоПрава = ВозможноеПраво.Ключ; + КонецЕсли; + Если ТекущаяСтрока[ВозможноеПраво.Ключ] Тогда + НетЗаполненногоПрава = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + Если НетЗаполненногоПрава Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Заполните хотя бы одно право доступа!'"), + , + "ГруппыПрав[" + Формат(НомерСтроки, "ЧГ=0") + "]." + ИмяПервогоПрава, + , + Отказ); + Возврат; + КонецЕсли; + + // Проверка заполенения пользователей/групп пользователей, + // значений доступа и их дублей. + Если НастройкаПоЗначениюДоступа Тогда + + // Проверка заполнения. + Если НЕ ЗначениеЗаполнено(ТекущаяСтрока["Пользователь"]) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Выберите пользователя или группу пользователей!'"), + , + "ГруппыПрав[" + Формат(НомерСтроки, "ЧГ=0") + "].Пользователь", + , + Отказ); + Возврат; + КонецЕсли; + + // Проверка дублей. + Отбор = Новый Структура("НаследуетсяОт, Пользователь", + ТекущаяСтрока["НаследуетсяОт"], + ТекущаяСтрока["Пользователь"]); + Если ГруппыПрав.НайтиСтроки(Отбор).Количество() > 1 Тогда + Если ТипЗнч(Отбор.Пользователь) = Тип("СправочникСсылка.Пользователи") Тогда + ТекстСообщения = НСтр("ru = 'Настройка для пользователя ""%1"" уже есть! + |Выберите другого пользователя или группу пользователей.'"); + Иначе + ТекстСообщения = НСтр("ru = 'Настройка для группы пользователей ""%1"" уже есть! + |Выберите другую группу пользователей или пользователя.'"); + КонецЕсли; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, Отбор.Пользователь), + , + "ГруппыПрав[" + Формат(НомерСтроки, "ЧГ=0") + "].Пользователь", + , + Отказ); + Возврат; + КонецЕсли; + + ИначеЕсли НастройкаПоГруппеПользователей Тогда + + // Проверка заполнения. + Если НЕ ЗначениеЗаполнено(ТекущаяСтрока["ЗначениеДоступа"]) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Выберите значение!'"), + , + "ГруппыПрав[" + Формат(НомерСтроки, "ЧГ=0") + "].ЗначениеДоступа", + , + Отказ); + Возврат; + КонецЕсли; + + // Проверка дублей. + Отбор = Новый Структура("ЗначениеДоступа", + ТекущаяСтрока["ЗначениеДоступа"]); + Если ГруппыПрав.НайтиСтроки(Отбор).Количество() > 1 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Настройка для значения ""%1"" уже есть! + |Выберите другое значение.'"), + Отбор.ЗначениеДоступа), + , + "ГруппыПрав[" + Формат(НомерСтроки, "ЧГ=0") + "].ЗначениеДоступа", + , + Отказ); + Возврат; + КонецЕсли; + + Иначе + + // Проверка заполнения. + Если НЕ ЗначениеЗаполнено(ТекущаяСтрока["ЗначениеДоступа"]) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Выберите значение!'"), + , + "ГруппыПрав[" + Формат(НомерСтроки, "ЧГ=0") + "].ЗначениеДоступа", + , + Отказ); + Возврат; + КонецЕсли; + + // Проверка дублей. + Отбор = Новый Структура("ГруппаПользователей, ЗначениеДоступа", + ТекущаяСтрока["ГруппаПользователей"], + ТекущаяСтрока["ЗначениеДоступа"]); + Если ГруппыПрав.НайтиСтроки(Отбор).Количество() > 1 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Настройка для значения ""%1"" уже есть! + |Выберите другое значение.'"), + Отбор.ЗначениеДоступа), + , + "ГруппыПрав[" + Формат(НомерСтроки, "ЧГ=0") + "].ЗначениеДоступа", + , + Отказ); + Возврат; + КонецЕсли; + КонецЕсли; + + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьПрава(Отказ = Ложь, РазрешеноУправлениеПравамиПослеЗаписи = Ложь, ОписаниеПредупреждения = "") + + ОписаниеОшибки = ""; + Если НЕ УправлениеДоступом.РазрешеноУправлениеПравамиПоЗначениямДоступа(Параметры.СсылкаНаОбъект, ОписаниеОшибки) Тогда + ВызватьИсключение(ОписаниеОшибки); + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + НачатьТранзакцию(); + Попытка + // Запись флажка "Наследовать права родителей". + Если НастройкаПоЗначениюДоступа Тогда + + НаборЗаписей = РегистрыСведений.ГруппыЗначенийДоступа.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ВидДоступа.Установить(ВидДоступа); + НаборЗаписей.Отбор.ЗначениеДоступа.Установить(Параметры.СсылкаНаОбъект); + НаборЗаписей.Прочитать(); + Если НаборЗаписей.Количество() = 0 Тогда + Запись = НаборЗаписей.Добавить(); + Запись.ВидДоступа = ВидДоступа; + Запись.ГруппаДоступа = Параметры.СсылкаНаОбъект; + Запись.ЗначениеДоступа = Параметры.СсылкаНаОбъект; + КонецЕсли; + Для каждого Запись Из НаборЗаписей Цикл + Запись.ТолькоВидДоступа = Ложь; + Запись.СвязьСРодителем = Запись.ГруппаДоступа <> Запись.ЗначениеДоступа; + Запись.НаследоватьПраваРодителей = ?(Запись.СвязьСРодителем, Ложь, НаследоватьПраваРодителей); + Запись.ИспользоватьПраваСсылки = ?(Запись.СвязьСРодителем, НаследоватьПраваРодителей, Истина); + КонецЦикла; + НаборЗаписей.Записать(); + КонецЕсли; + + // Подготовка новых прав в формате регистра, исключая права, наследуемые от родителей по иерархии. + НаборЗаписей = РегистрыСведений.ПраваПоЗначениямДоступа.СоздатьНаборЗаписей(); + + Если НастройкаПоЗначениюДоступа Тогда + + Для каждого ГруппаПрав ИЗ ГруппыПрав Цикл + Если ТипЗнч(ГруппаПрав.НаследуетсяОт) = Тип("Строка") Тогда + Для каждого ВозможноеПраво Из ВозможныеПрава Цикл + Если ГруппаПрав[ВозможноеПраво.Ключ] Тогда + Для каждого ОписаниеТаблицы Из ПолучитьПраваТаблицДляШаблонов(ТаблицаЗначенийДоступа, ВозможноеПраво.Ключ) Цикл + Право = НаборЗаписей.Добавить(); + Право.ЗначениеДоступа = Параметры.СсылкаНаОбъект; + Право.Пользователь = ГруппаПрав.Пользователь; + Право.Право = ВозможноеПраво.Ключ; + Право.Запрещено = ГруппаПрав.Запрещено; + Право.РаспространяетсяВИерархии = ГруппаПрав.РаспространяетсяВИерархии; + // Заполнение данных для стандартных шаблонов ограничения доступа. + Право.Таблица = ОписаниеТаблицы.Ключ; + Если Право.Запрещено Тогда + Право.ЧтениеЗапрещено = ОписаниеТаблицы.Значение.Чтение; + Право.ДобавлениеЗапрещено = ОписаниеТаблицы.Значение.Добавление; + Право.ИзменениеЗапрещено = ОписаниеТаблицы.Значение.Изменение; + Право.УдалениеЗапрещено = ОписаниеТаблицы.Значение.Удаление; + Иначе + Право.Чтение = ОписаниеТаблицы.Значение.Чтение; + Право.Добавление = ОписаниеТаблицы.Значение.Добавление; + Право.Изменение = ОписаниеТаблицы.Значение.Изменение; + Право.Удаление = ОписаниеТаблицы.Значение.Удаление; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЦикла; + + НаборЗаписей.Отбор.ЗначениеДоступа.Установить(Параметры.СсылкаНаОбъект); + НаборЗаписей.Записать(); + + Иначе + ТаблицаЗаписей = НаборЗаписей.Выгрузить(Новый Массив); + ЗначенияДоступа = Новый Соответствие; + Для каждого ГруппаПрав ИЗ ГруппыПрав Цикл + Если НастройкаПоГруппеПользователей ИЛИ НЕ ЗначениеЗаполнено(ГруппаПрав.ГруппаПользователей) Тогда + Для каждого ВозможноеПраво Из ВозможныеПрава Цикл + Если ГруппаПрав[ВозможноеПраво.Ключ] Тогда + Для каждого ОписаниеТаблицы Из ПолучитьПраваТаблицДляШаблонов(ГруппаПрав.ЗначениеДоступа.Метаданные().ПолноеИмя(), ВозможноеПраво.Ключ) Цикл + Право = ТаблицаЗаписей.Добавить(); + Право.ЗначениеДоступа = ГруппаПрав.ЗначениеДоступа; + Право.Пользователь = Параметры.СсылкаНаОбъект; + Право.Право = ВозможноеПраво.Ключ; + Право.Запрещено = ГруппаПрав.Запрещено; + Право.РаспространяетсяВИерархии = ГруппаПрав.РаспространяетсяВИерархии; + // Заполнение данных для стандартных шаблонов ограничения доступа. + Право.Таблица = ОписаниеТаблицы.Ключ; + Если Право.Запрещено Тогда + Право.ЧтениеЗапрещено = ОписаниеТаблицы.Значение.Чтение; + Право.ДобавлениеЗапрещено = ОписаниеТаблицы.Значение.Добавление; + Право.ИзменениеЗапрещено = ОписаниеТаблицы.Значение.Изменение; + Право.УдалениеЗапрещено = ОписаниеТаблицы.Значение.Удаление; + Иначе + Право.Чтение = ОписаниеТаблицы.Значение.Чтение; + Право.Добавление = ОписаниеТаблицы.Значение.Добавление; + Право.Изменение = ОписаниеТаблицы.Значение.Изменение; + Право.Удаление = ОписаниеТаблицы.Значение.Удаление; + КонецЕсли; + ЗначенияДоступа.Вставить(ГруппаПрав.ЗначениеДоступа); + КонецЦикла; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЦикла; + + Отбор = Новый Структура("ЗначениеДоступа"); + НаборЗаписей.Отбор.Пользователь.Установить(Параметры.СсылкаНаОбъект); + ЗаписанныеЗначенияДоступа = Новый Массив; + Для каждого КлючИЗначение Из ЗначенияДоступа Цикл + Отбор.ЗначениеДоступа = КлючИЗначение.Ключ; + НаборЗаписей.Отбор.ЗначениеДоступа.Установить(Отбор.ЗначениеДоступа); + НаборЗаписей.Загрузить(ТаблицаЗаписей.Скопировать(ТаблицаЗаписей.НайтиСтроки(Отбор))); + НаборЗаписей.Записать(); + ЗаписанныеЗначенияДоступа.Добавить(Отбор.ЗначениеДоступа); + КонецЦикла; + + // Удаление прав удаленных групп прав. + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПраваПоЗначениямДоступа.ЗначениеДоступа + |ИЗ + | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениямДоступа + |ГДЕ + | ПраваПоЗначениямДоступа.Пользователь = &Пользователь + | И (НЕ ПраваПоЗначениямДоступа.ЗначениеДоступа В (&ЗаписанныеЗначенияДоступа))"); + Запрос.УстановитьПараметр("Пользователь", Параметры.СсылкаНаОбъект); + Запрос.УстановитьПараметр("ЗаписанныеЗначенияДоступа", ЗаписанныеЗначенияДоступа); + НаборЗаписей.Очистить(); + Для каждого ЗначениеДоступаБезПрав Из Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ЗначениеДоступа") Цикл + НаборЗаписей.Отбор.ЗначениеДоступа.Установить(ЗначениеДоступаБезПрав); + НаборЗаписей.Записать(); + КонецЦикла; + + КонецЕсли; + РазрешеноУправлениеПравамиПослеЗаписи = УправлениеДоступом.РазрешеноУправлениеПравамиПоЗначениямДоступа(Параметры.СсылкаНаОбъект, ОписаниеПредупреждения); + Модифицированность = Ложь; + ЗафиксироватьТранзакцию(); + + Исключение + ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ОтменитьТранзакцию(); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Ошибка при записи прав:'") + Символы.ПС + ПредставлениеОшибки, , , , Отказ); + КонецПопытки; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверкаВозможностиИзмененияПрав(Отказ, ПроверкаУдаления = Ложь) + + Если НастройкаПоЗначениюДоступа И ТипЗнч(Элементы.ГруппыПрав.ТекущиеДанные["НаследуетсяОт"]) <> Тип("Строка") Тогда + Отказ = Истина; + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Эта наследуемая настройка редактируется только в форме + |""Права доступа: %1 (%2)"" !'"), + Элементы.ГруппыПрав.ТекущиеДанные["НаследуетсяОт"], + НазваниеЗначенийДоступа); + ТекстСообщения = ТекстСообщения + + ?(ПроверкаУдаления, + СтрЗаменить(" + | + |Для удаления всех наследуемых настроек для ""%1"" + |можно снять флажок ""Наследовать права родителей"".", "%1", НаименованиеНастройки), + ""); + ИначеЕсли НЕ НастройкаПоЗначениюДоступа И НЕ НастройкаПоГруппеПользователей И ЗначениеЗаполнено(Элементы.ГруппыПрав.ТекущиеДанные["ГруппаПользователей"]) Тогда + Отказ = Истина; + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Эта настройка редактируется только в форме + |""Права доступа: %1 (%2)""!'"), + Элементы.ГруппыПрав.ТекущиеДанные["ГруппаПользователей"], + НСтр( ?(ВнешнийПользовательИлиГруппа, + "ru = 'Группа внешних пользователей'", + "ru = 'Группа пользователей'") ) ); + КонецЕсли; + + Если Отказ Тогда + Предупреждение(ТекстСообщения); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ВыбранТипПользователиИлиВнешниеПользователи(ВыборИПодборВнешнихПользователей) + + ВыборИПодборВнешнихПользователей = Ложь; + + Если ИспользоватьВнешнихПользователей Тогда + Элемент = СписокТиповПользователей.ВыбратьЭлемент("Выбор типа данных", СписокТиповПользователей[0]); + Если Элемент <> Неопределено Тогда + ВыборИПодборВнешнихПользователей = Элемент.Значение = Тип("СправочникСсылка.ВнешниеПользователи"); + Иначе + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +&НаКлиенте +Процедура ВыбратьПользователей() + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ТекущаяСтрока", ?(Элементы.ГруппыПрав.ТекущиеДанные = Неопределено, Неопределено, Элементы.ГруппыПрав.ТекущиеДанные.Пользователь)); + + Если ЗначениеЗаполнено(ПараметрыФормы.ТекущаяСтрока) И + ( ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.Пользователи") ИЛИ + ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыПользователей") ) Тогда + + ВыборИПодборВнешнихПользователей = Ложь; + + ИначеЕсли ИспользоватьВнешнихПользователей И + ЗначениеЗаполнено(ПараметрыФормы.ТекущаяСтрока) И + ( ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.ВнешниеПользователи") ИЛИ + ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") ) Тогда + + ВыборИПодборВнешнихПользователей = Истина; + Иначе + Если НЕ ВыбранТипПользователиИлиВнешниеПользователи(ВыборИПодборВнешнихПользователей) Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + Если ВыборИПодборВнешнихПользователей Тогда + ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); + Иначе + ПараметрыФормы.Вставить("ВыборГруппПользователей", Истина); + КонецЕсли; + + Если ВыборИПодборВнешнихПользователей Тогда + ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, Элементы.ГруппыПравПользователь); + Иначе + ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элементы.ГруппыПравПользователь); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьНомераКартинокПользователей(ИдентификаторСтроки = Неопределено) + + Если Элементы.Найти("ГруппыПравПользователь") = Неопределено Тогда + Возврат; + КонецЕсли; + + Пользователи.ЗаполнитьНомераКартинокПользователей(ГруппыПрав, "Пользователь", "НомерКартинки", ИдентификаторСтроки); + +КонецПроцедуры + + +// Обработчики событий формы. + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СсылкаНаОбъект = Параметры.СсылкаНаОбъект; + + // Проверка разрешения на открытие формы. + ОписаниеОшибки = ""; + Если НЕ УправлениеДоступом.РазрешеноУправлениеПравамиПоЗначениямДоступа(СсылкаНаОбъект, ОписаниеОшибки, ТолькоПросмотр) Тогда + ВызватьИсключение(ОписаниеОшибки); + КонецЕсли; + + ИспользоватьВнешнихПользователей = ВнешниеПользователи.ИспользоватьВнешнихПользователей() И ПравоДоступа("Просмотр", Метаданные.Справочники.ВнешниеПользователи); + + УстановитьПривилегированныйРежим(Истина); + + СписокТиповПользователей.Добавить(Тип("СправочникСсылка.Пользователи"), "Пользователи"); + СписокТиповПользователей.Добавить(Тип("СправочникСсылка.ВнешниеПользователи"), "ВнешниеПользователи"); + + + // Установка заголовка формы. + МетаданныеОбъекта = СсылкаНаОбъект.Метаданные(); + НаименованиеНастройки = Строка(СсылкаНаОбъект); + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Права доступа: %1 (%2)'"), + НаименованиеНастройки, + НазваниеОбъектаИзМетаданных(МетаданныеОбъекта) ); + // Определение режима редактирования прав. + НастройкаПоЗначениюДоступа = (ТипЗнч(СсылкаНаОбъект) <> Тип("СправочникСсылка.ГруппыПользователей")) И + (ТипЗнч(СсылкаНаОбъект) <> Тип("СправочникСсылка.Пользователи")) И + (ТипЗнч(СсылкаНаОбъект) <> Тип("СправочникСсылка.ГруппыВнешнихПользователей")) И + (ТипЗнч(СсылкаНаОбъект) <> Тип("СправочникСсылка.ВнешниеПользователи")); + НастройкаПоГруппеПользователей = (ТипЗнч(СсылкаНаОбъект) = Тип("СправочникСсылка.ГруппыПользователей")) ИЛИ + (ТипЗнч(СсылкаНаОбъект) = Тип("СправочникСсылка.ГруппыВнешнихПользователей")); + ВнешнийПользовательИлиГруппа = (ТипЗнч(СсылкаНаОбъект) = Тип("СправочникСсылка.ГруппыВнешнихПользователей")) ИЛИ + (ТипЗнч(СсылкаНаОбъект) = Тип("СправочникСсылка.ВнешниеПользователи")); + + Если НастройкаПоЗначениюДоступа Тогда + НазваниеЗначенийДоступа = НазваниеОбъектаИзМетаданных(МетаданныеОбъекта); + Элементы.ВидДоступа.Видимость = Ложь; + ТаблицаЗначенийДоступа = МетаданныеОбъекта.ПолноеИмя(); + ВидыДоступа = УправлениеДоступом.ВидыДоступаТаблицы(ТаблицаЗначенийДоступа); + Если ВидыДоступа.Количество() <> 1 ИЛИ НЕ УправлениеДоступом.СвойстваВидаДоступа(ВидыДоступа[0]).ВидДоступаЧерезПраваПоЗначениямДоступа Тогда + ВызватьИсключение(СтрЗаменить(НСтр("ru = 'Для значений доступа ""%1"" не найдено вида доступа через права по значениям доступа!'"), "%1", Метаданные.НайтиПоПолномуИмени(ТаблицаЗначенийДоступа).Синоним)); + КонецЕсли; + ВидДоступа = ВидыДоступа[0]; + Иначе + Элементы.НаследоватьПраваРодителей.Видимость = Ложь; + // Подготовка списка возможных видов доступа и установка начального вида доступа. + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ВидыДоступа.Ссылка, + | ВидыДоступа.Наименование КАК Наименование + |ИЗ + | ПланВидовХарактеристик.ВидыДоступа КАК ВидыДоступа + | + |УПОРЯДОЧИТЬ ПО + | Наименование"); + ВидыДоступа = Запрос.Выполнить().Выбрать(); + Пока ВидыДоступа.Следующий() Цикл + Если УправлениеДоступом.СвойстваВидаДоступа(ВидыДоступа.Ссылка).ВидДоступаЧерезПраваПоЗначениямДоступа Тогда + Элементы.ВидДоступа.СписокВыбора.Добавить(ВидыДоступа.Ссылка, ВидыДоступа.Наименование); + КонецЕсли; + КонецЦикла; + Если ВидыДоступа.Количество() = 0 Тогда + ВызватьИсключение(НСтр("ru = 'Не найдено видов доступа через права по значениям доступа!'")); + КонецЕсли; + ВидДоступа = Элементы.ВидДоступа.СписокВыбора[0].Значение; + ТаблицаЗначенийДоступа = УправлениеДоступом.СвойстваВидаДоступа(ВидДоступа).Таблицы[0]; + НазваниеЗначенийДоступа = НазваниеОбъектаИзМетаданных(Метаданные.НайтиПоПолномуИмени(ТаблицаЗначенийДоступа)); + Элементы.ВидДоступа.Видимость = Элементы.ВидДоступа.СписокВыбора.Количество() > 1; + КонецЕсли; + + ЗаполнитьПрава(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Если Модифицированность Тогда + Ответ = Вопрос(НСтр("ru = 'Сохранить изменения?'"), РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Отмена); + Если Ответ = КодВозвратаДиалога.Да Тогда + ЗаписатьПрава(Отказ); + ИначеЕсли Ответ = КодВозвратаДиалога.Отмена Тогда + Отказ = Истина; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + + +// Обработчики событий элементов формы. + +&НаКлиенте +Процедура ВидДоступаПриИзменении(Элемент) + + ВидДоступаПриИзмененииНаСервере(); + +КонецПроцедуры + +&НаСервере +Процедура ВидДоступаПриИзмененииНаСервере() + + НоваяТаблицаЗначенийДоступа = УправлениеДоступом.СвойстваВидаДоступа(ВидДоступа).Таблицы[0]; + + Если ТаблицаЗначенийДоступа <> НоваяТаблицаЗначенийДоступа Тогда + + ТаблицаЗначенийДоступа = НоваяТаблицаЗначенийДоступа; + НазваниеЗначенийДоступа = НазваниеОбъектаИзМетаданных(Метаданные.НайтиПоПолномуИмени(ТаблицаЗначенийДоступа)); + + ЗаполнитьПрава(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВидДоступаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + Если Модифицированность Тогда + Предупреждение(НСтр("ru = 'Данные изменены. Запишите или отмените изменения.'")); + СтандартнаяОбработка = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВидДоступаОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура НаследоватьПраваРодителейПриИзменении(Элемент) + + НаследоватьПраваРодителейПриИзмененииНаСервере(); + +КонецПроцедуры + +&НаСервере +Процедура НаследоватьПраваРодителейПриИзмененииНаСервере() + + Если НаследоватьПраваРодителей Тогда + ДобавитьПраваНаследуемыеПоИерархии(); + Иначе + // Очистка настроек, наследуемых от родителей по иерархии. + Индекс = ГруппыПрав.Количество()-1; + Пока Индекс >= 0 Цикл + Если ТипЗнч(ГруппыПрав.Получить(Индекс).НаследуетсяОт) <> Тип("Строка") Тогда + ГруппыПрав.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + + +// Обработчики таблицы ГруппыПрав. + +&НаКлиенте +Процедура ГруппыПравПередНачаломИзменения(Элемент, Отказ) + + ПроверкаВозможностиИзмененияПрав(Отказ); + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПередУдалением(Элемент, Отказ) + + ПроверкаВозможностиИзмененияПрав(Отказ, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) + + Если НоваяСтрока Тогда + + // Установка начальных значений. + Если Копирование Тогда + Если Элементы.Найти("ГруппыПравНаследуетсяОт") <> Неопределено Тогда + Элементы.ГруппыПрав.ТекущиеДанные.НаследуетсяОт = ДобавленныеРеквизиты.НаследуетсяОт; + КонецЕсли; + Если Элементы.Найти("ГруппыПравГруппаПользователей") <> Неопределено Тогда + Элементы.ГруппыПрав.ТекущиеДанные.ГруппаПользователей = ДобавленныеРеквизиты.ГруппаПользователей; + КонецЕсли; + Иначе + Элементы.ГруппыПрав.ТекущиеДанные.РаспространяетсяВИерархии = Истина; + + Для каждого ДобавленныйРеквизит Из ДобавленныеРеквизиты Цикл + Элементы.ГруппыПрав.ТекущиеДанные[ДобавленныйРеквизит.Ключ] = ДобавленныйРеквизит.Значение; + КонецЦикла; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПользовательПриИзменении(Элемент) + + Если ЗначениеЗаполнено(Элементы.ГруппыПрав.ТекущиеДанные.Пользователь) Тогда + ЗаполнитьНомераКартинокПользователей(Элементы.ГруппыПрав.ТекущаяСтрока); + Иначе + Элементы.ГруппыПрав.ТекущиеДанные.НомерКартинки = ДобавленныеРеквизиты.НомерКартинки; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПользовательНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ВыбратьПользователей(); + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПользовательОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Элементы.ГруппыПрав.ТекущиеДанные.Пользователь = ДобавленныеРеквизиты.Пользователь; + Элементы.ГруппыПрав.ТекущиеДанные.НомерКартинки = ДобавленныеРеквизиты.НомерКартинки; + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПользовательОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = Пользователи.СформироватьДанныеВыбораПользователя(Текст); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПользовательАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = Пользователи.СформироватьДанныеВыбораПользователя(Текст); + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ГруппыПравЗапрещеноПриИзменении(Элемент) + + // При изменении вида настроки необходимо сбросить флажки прав. + Для каждого ВозможноеПраво Из ВозможныеПрава Цикл + Элементы.ГруппыПрав.ТекущиеДанные[ВозможноеПраво.Ключ] = Ложь; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПравоПриИзменении(Элемент) + + // Обновить зависимости прав. + ЗависимыеПрава = Неопределено; + ТекущееПраво = Сред(Элемент.Имя, СтрДлина("ГруппыПрав")+1); + Если Элементы.ГруппыПрав.ТекущиеДанные[ТекущееПраво] Тогда + Если Элементы.ГруппыПрав.ТекущиеДанные.Запрещено Тогда + // Увеличены запрещения. + ОбратныеЗависимостиПрав.Свойство(ТекущееПраво, ЗависимыеПрава); + ЗначениеЗависимогоПрава = Истина; + Иначе + // Увеличены разрешения. + ПрямыеЗависимостиПрав.Свойство(ТекущееПраво, ЗависимыеПрава); + ЗначениеЗависимогоПрава = Истина; + КонецЕсли; + Иначе + Если Элементы.ГруппыПрав.ТекущиеДанные.Запрещено Тогда + // Уменьшены запрещения. + ПрямыеЗависимостиПрав.Свойство(ТекущееПраво, ЗависимыеПрава); + ЗначениеЗависимогоПрава = Ложь; + Иначе + // Уменьшены разрешения. + ОбратныеЗависимостиПрав.Свойство(ТекущееПраво, ЗависимыеПрава); + ЗначениеЗависимогоПрава = Ложь; + КонецЕсли; + КонецЕсли; + + Если ЗависимыеПрава <> Неопределено Тогда + Для каждого ЗависимоеПраво Из ЗависимыеПрава Цикл + Элементы.ГруппыПрав.ТекущиеДанные[ЗависимоеПраво] = ЗначениеЗависимогоПрава; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + + +// Обработчики команд. + +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + + Отказ = Ложь; + ОбработкаПроверкиЗаполнения(Отказ); + + Если НЕ Отказ Тогда + + ЗаписатьПрава(Отказ); + Если НЕ Отказ Тогда + Закрыть(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Записать(Команда) + + Отказ = Ложь; + ОбработкаПроверкиЗаполнения(Отказ); + + Если НЕ Отказ Тогда + + РазрешеноУправлениеПравамиПослеЗаписи = Ложь; + ОписаниеПредупреждения = ""; + ЗаписатьПрава(Отказ, РазрешеноУправлениеПравамиПослеЗаписи, ОписаниеПредупреждения); + Если НЕ Отказ И НЕ РазрешеноУправлениеПравамиПослеЗаписи Тогда + Предупреждение(ОписаниеПредупреждения, 7, НСтр("ru = 'После успешной записи'")); + Закрыть(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Перечитать(Команда) + + Если НЕ Модифицированность ИЛИ Вопрос(НСтр("ru = 'Данные изменены. Прочитать без сохранения?'"), РежимДиалогаВопрос.ОКОтмена, 5, КодВозвратаДиалога.Отмена) = КодВозвратаДиалога.ОК Тогда + ПрочитатьПрава(); + КонецЕсли; + +КонецПроцедуры + + + diff --git a/SSL/src/CommonForms/ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo b/SSL/src/CommonForms/ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo new file mode 100644 index 000000000..009bec033 --- /dev/null +++ b/SSL/src/CommonForms/ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo @@ -0,0 +1,10 @@ + + + ПраваПоЗначениямДоступа + + ru + Права по значениям доступа + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonForms/РедактированиеЗначенийСвойств/Form.form b/SSL/src/CommonForms/РедактированиеЗначенийСвойств/Form.form new file mode 100644 index 000000000..9db3b8c30 --- /dev/null +++ b/SSL/src/CommonForms/РедактированиеЗначенийСвойств/Form.form @@ -0,0 +1,865 @@ + + + + ТаблицаЗначенийСвойств + 3 + true + true + + true + + + ТаблицаЗначенийСвойств + + false + None + + ТаблицаЗначенийСвойствКартинкаИСвойство + 15 + + ТаблицаЗначенийСвойствНомерКартинки + 6 + true + false + + true + + + ТаблицаЗначенийСвойств.НомерКартинки + + None + + ТаблицаЗначенийСвойствНомерКартинкиРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + ТаблицаЗначенийСвойствНомерКартинкиКонтекстноеМеню + 7 + true + + PictureField + Enter + true + Left + true + + 2 + true + 1 + true + true + true + + StdPicture.SetListItemDeletionMark + + + 1 + + + + + ТаблицаЗначенийСвойствНаименование + 16 + true + true + + true + + + ТаблицаЗначенийСвойств.Наименование + + + ТаблицаЗначенийСвойствНаименованиеРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + ТаблицаЗначенийСвойствНаименованиеКонтекстноеМеню + 17 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + true + false + + ТаблицаЗначенийСвойствКартинкаИСвойствоРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + ТаблицаЗначенийСвойствЗначение + 10 + + <key>ru</key> + <value>Значение</value> + + true + true + + true + + + ТаблицаЗначенийСвойств.Значение + + + ТаблицаЗначенийСвойствЗначениеРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ТаблицаЗначенийСвойствЗначениеКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + + true + true + true + + ru + БЛ=Нет; БИ=Да + + true + true + true + + Отбор.Владелец + + Items.ТаблицаЗначенийСвойств.CurrentData.Свойство + + + Normal + + + None + + ТаблицаЗначенийСвойствКоманднаяПанель + 5 + Left + true + + + BeforeAddRow + ТаблицаЗначенийСвойствПередНачаломДобавления + + + BeforeDeleteRow + ТаблицаЗначенийСвойствПередУдалением + + + OnStartEdit + ТаблицаЗначенийСвойствПриНачалеРедактирования + + + OnChange + ТаблицаЗначенийСвойствПриИзменении + + + ТаблицаЗначенийСвойствСтрокаПоиска + 21 + + ТаблицаЗначенийСвойствСтрокаПоискаРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + ТаблицаЗначенийСвойствСтрокаПоискаКонтекстноеМеню + 22 + true + + ТаблицаЗначенийСвойств + + true + + + + ТаблицаЗначенийСвойствСостояниеПросмотра + 24 + + ТаблицаЗначенийСвойствСостояниеПросмотраРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ТаблицаЗначенийСвойствСостояниеПросмотраКонтекстноеМеню + 25 + true + + ViewStatusAddition + ТаблицаЗначенийСвойств + + true + + + + ТаблицаЗначенийСвойствУправлениеПоиском + 27 + + ТаблицаЗначенийСвойствУправлениеПоискомРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ТаблицаЗначенийСвойствУправлениеПоискомКонтекстноеМеню + 28 + true + + SearchControlAddition + ТаблицаЗначенийСвойств + + true + + + + ТаблицаЗначенийСвойствРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ТаблицаЗначенийСвойствКонтекстноеМеню + 4 + + Tree + true + true + true +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + + CommonPicture.КартинкаВДеревеСвойств + + None + None + None + true + +
    + + ГруппаКоманд + 18 + + КомандаОК + 13 + true + true + + true + + false + + КомандаОКРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.Command.КомандаОК + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + Auto + + + КомандаОтмена + 14 + true + true + + true + + false + + КомандаОтменаРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + Form.Command.КомандаОтмена + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа команд</value> + + + ru + Группа команд + + + ГруппаКомандРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + CommandBar + + Right + + + Top + true + + ФормаКоманднаяПанель + -1 + + РедактироватьСоставСвойств + 2 + true + true + + true + + false + + РедактироватьСоставСвойствРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.Command.РедактироватьСоставСвойств + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + Auto + + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ТаблицаЗначенийСвойств + + <key>ru</key> + <value>Таблица значений свойств</value> + + 1 + + ValueTable + + + true + + + true + + + Свойство + + <key>ru</key> + <value>Свойство</value> + + 1 + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + true + + + true + + + + ТипЗначения + + <key>ru</key> + <value>Тип значения</value> + + 2 + + TypeDescription + + + true + + + true + + + + Значение + + <key>ru</key> + <value>Значение</value> + + 3 + + Characteristic.ДополнительныеРеквизитыИСведения + + + true + + + + true + Role.ИзменениеДополнительныхСведений + + + true + Role.ПолныеПрава + + + + + НомерКартинки + + <key>ru</key> + <value>Номер картинки</value> + + 6 + + Number + + 1 + + + + 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> + + 2 + + ValueList + + + true + + + true + + + + + + + БылаНажатаКнопкаЗакрытия + + <key>ru</key> + <value>Была нажата кнопка закрытия</value> + + 4 + + Boolean + + + true + + + true + + + + СсылкаНаОбъект + + <key>ru</key> + <value>Ссылка на объект</value> + + 5 + + AnyRef + + + true + + + true + + + + РедактироватьСоставСвойств + + <key>ru</key> + <value>Изменить состав доп. реквизитов и сведений</value> + + 1 + + ru + Изменить состав дополнительных реквизитов и сведений + + + + Role.Администрирование + + + Role.БазовыеПрава + + + Role.ВыводНаПринтерФайлБуферОбмена + + + Role.ВыполнениеОбменовДанными + + + true + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ДобавлениеИзменениеДополнительныхОтчетовИОбработок + + + Role.ДобавлениеИзменениеЗаданий + + + Role.ДобавлениеИзменениеОбменовДанными + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеРолейИсполнителей + + + Role.ДобавлениеИзменениеФизическихЛиц + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИзменениеВыполнениеЗадач + + + Role.ИзменениеДополнительныхСведений + + + Role.ИзменениеМакетовПечатныхФорм + + + Role.ИзменениеТекущегоВнешнегоПользователя + + + Role.ИзменениеТекущегоПользователя + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ИспользованиеДополнительныхОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПроверкаДоступныхОбновленийКонфигурации + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеВнешнихПользователей + + + Role.ЧтениеДополнительныхСведений + + + Role.ЧтениеЗаданий + + + Role.ЧтениеЗадач + + + Role.ЧтениеОтветовНаВопросыАнкет + + + Role.ЧтениеПерсональныхДанныхФизическихЛиц + + + + StdPicture.ListSettings + + + + РедактироватьСоставСвойств + + + Auto + Auto + + + КомандаОК + + <key>ru</key> + <value>ОК</value> + + 2 + + ru + ОК + + + true + + + + КомандаОКВыполнить + + + Auto + Auto + + + КомандаОтмена + + <key>ru</key> + <value>Отмена</value> + + 3 + + ru + Отмена + + + true + + + + КомандаОтменаВыполнить + + + Auto + Auto + + + Ссылка + + AnyRef + + + + + + +
    diff --git a/SSL/src/CommonForms/РедактированиеЗначенийСвойств/Module.bsl b/SSL/src/CommonForms/РедактированиеЗначенийСвойств/Module.bsl new file mode 100644 index 000000000..4af593864 --- /dev/null +++ b/SSL/src/CommonForms/РедактированиеЗначенийСвойств/Module.bsl @@ -0,0 +1,230 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + БылаНажатаКнопкаЗакрытия = Ложь; + СсылкаНаОбъект = Параметры.Ссылка; + + // Получим список доступных наборов свойств + ДоступныеНаборы = УправлениеСвойствами.ПолучитьДоступныеНаборыСвойств(Параметры.Ссылка); + Если ТипЗнч(ДоступныеНаборы) = Тип("СписокЗначений") Тогда + ДоступныеНаборыСвойств = ДоступныеНаборы; + ИначеЕсли ДоступныеНаборы <> Справочники.НаборыДополнительныхРеквизитовИСведений.ПустаяСсылка() Тогда + ДоступныеНаборыСвойств.Добавить(ДоступныеНаборы); + КонецЕсли; + + // Установим заголовок + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Дополнительные сведения: %1'"), Строка(Параметры.Ссылка) ); + + // Заполним таблицу значений свойств + ЗаполнитьТаблицуЗначенийСвойств(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Если Модифицированность И Не БылаНажатаКнопкаЗакрытия Тогда + Результат = Вопрос(НСтр("ru = 'Значения были изменены. Сохранить?'"), РежимДиалогаВопрос.ДаНетОтмена); + Если Результат = КодВозвратаДиалога.Да Тогда + ЗаписатьЗначенияСвойств(); + ИначеЕсли Результат = КодВозвратаДиалога.Отмена Тогда + Отказ = Истина; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ИзмененНаборСвойств" Тогда + Если ДоступныеНаборыСвойств.НайтиПоЗначению(Параметр) <> Неопределено Тогда + ЗаполнитьТаблицуЗначенийСвойств(Ложь); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЧНОГО ПОЛЯ ДеревоЗначенийСвойств И команды РедактироватьСоставСвойств + +&НаКлиенте +Процедура ТаблицаЗначенийСвойствПриИзменении(Элемент) + + Модифицированность = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаЗначенийСвойствПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Отказ = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаЗначенийСвойствПередУдалением(Элемент, Отказ) + + Если Элемент.ТекущиеДанные.НомерКартинки = -1 Тогда + Отказ = Истина; + Элемент.ТекущиеДанные.Значение = Элемент.ТекущиеДанные.ТипЗначения.ПривестиЗначение(Неопределено); + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаЗначенийСвойствПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) + + Элемент.ПодчиненныеЭлементы.ТаблицаЗначенийСвойствЗначение.ОграничениеТипа = Элемент.ТекущиеДанные.ТипЗначения; + +КонецПроцедуры + +&НаКлиенте +Процедура РедактироватьСоставСвойств() + + Если ДоступныеНаборыСвойств.Количество() = 0 Тогда + Предупреждение(НСтр("ru = 'Для объекта нет доступных ему наборов свойств!'")); + Возврат; + ИначеЕсли ДоступныеНаборыСвойств.Количество() = 1 Тогда + Элемент = ДоступныеНаборыСвойств.Получить(0); + Иначе + Элемент = ДоступныеНаборыСвойств.ВыбратьЭлемент(); + Если Элемент = Неопределено Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + ПараметрыФормыНабораСвойств = Новый Структура("Ключ", Элемент.Значение); + ОткрытьФормуМодально("Справочник.НаборыДополнительныхРеквизитовИСведений.Форма.ФормаЭлемента", ПараметрыФормыНабораСвойств); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ НАЖАТИЯ НА КЛАВИШИ ОК И ОТМЕНА + +&НаКлиенте +Процедура КомандаОКВыполнить() + + ЗаписатьЗначенияСвойств(); + БылаНажатаКнопкаЗакрытия = Истина; + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура КомандаОтменаВыполнить() + + БылаНажатаКнопкаЗакрытия = Истина; + Закрыть(); + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ + +// Заполнить значениями дерево свойств +&НаСервере +Процедура ЗаполнитьТаблицуЗначенийСвойств(ИзОбработчикаПриСоздании) + + Если ИзОбработчикаПриСоздании Тогда + ЗначенияСвойств = ПрочитатьЗначенияСвойствИзРегистраСведений(); + Иначе + ЗначенияСвойств = ПолучитьТекущиеЗначенияСвойств(); + ТаблицаЗначенийСвойств.Очистить(); + КонецЕсли; + + Таблица = УправлениеСвойствами.ПолучитьТаблицуЗначенийСвойств(ЗначенияСвойств, ДоступныеНаборыСвойств, Истина); + Для Каждого Стр Из Таблица Цикл + новСтр = ТаблицаЗначенийСвойств.Добавить(); + ЗаполнитьЗначенияСвойств(новСтр, Стр); + новСтр.НомерКартинки = ?(Стр.Удалено, 0, -1); + + Если Стр.Значение = Неопределено И + ОбщегоНазначения.ОписаниеТипаСостоитИзТипа(Стр.ТипЗначения, Тип("Булево")) ТОгда + новСтр.Значение = Ложь; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Записать значения свойств в регистр сведений +&НаКлиенте +Процедура ЗаписатьЗначенияСвойств() + + ЗначенияСвойств = Новый Массив; + + Для Каждого Стр Из ТаблицаЗначенийСвойств Цикл + Если ЗначениеЗаполнено(Стр.Значение) И (Стр.Значение <> Ложь) Тогда + Значение = Новый Структура("Свойство, Значение", Стр.Свойство, Стр.Значение); + ЗначенияСвойств.Добавить(Значение); + КонецЕсли; + КонецЦикла; + + ЗаписатьНаборСвойствВРегистр(СсылкаНаОбъект, ЗначенияСвойств); + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ЗаписатьНаборСвойствВРегистр(Ссылка, ЗначенияСвойств) + + Набор = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей(); + Набор.Отбор.Объект.Установить(Ссылка); + + Для Каждого Стр Из ЗначенияСвойств Цикл + Запись = Набор.Добавить(); + Запись.Свойство = Стр.Свойство; + Запись.Значение = Стр.Значение; + Запись.Объект = Ссылка; + КонецЦикла; + + УстановитьПривилегированныйРежим(Истина); + + Набор.Записать(); + +КонецПроцедуры + +&НаСервере +Функция ПрочитатьЗначенияСвойствИзРегистраСведений() + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ДополнительныеСведения.Свойство, + | ДополнительныеСведения.Значение + |ИЗ + | РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения + |ГДЕ + | ДополнительныеСведения.Объект = &Объект"; + Запрос.УстановитьПараметр("Объект", Параметры.Ссылка); + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +&НаСервере +Функция ПолучитьТекущиеЗначенияСвойств() + + ЗначенияСвойств = Новый ТаблицаЗначений; + ЗначенияСвойств.Колонки.Добавить("Свойство"); + ЗначенияСвойств.Колонки.Добавить("Значение"); + + Для Каждого Стр Из ТаблицаЗначенийСвойств Цикл + Если ЗначениеЗаполнено(Стр.Значение) И (Стр.Значение <> Ложь) Тогда + новСтр = ЗначенияСвойств.Добавить(); + новСтр.Свойство = Стр.Свойство; + новСтр.Значение = Стр.Значение; + КонецЕсли; + КонецЦикла; + + Возврат ЗначенияСвойств; + +КонецФункции diff --git a/SSL/src/CommonForms/РедактированиеЗначенийСвойств/РедактированиеЗначенийСвойств.mdo b/SSL/src/CommonForms/РедактированиеЗначенийСвойств/РедактированиеЗначенийСвойств.mdo new file mode 100644 index 000000000..be6a2a1c7 --- /dev/null +++ b/SSL/src/CommonForms/РедактированиеЗначенийСвойств/РедактированиеЗначенийСвойств.mdo @@ -0,0 +1,11 @@ + + + РедактированиеЗначенийСвойств + + ru + Редактирование значений свойств + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/РедактированиеНовогоПисьма/Form.form b/SSL/src/CommonForms/РедактированиеНовогоПисьма/Form.form new file mode 100644 index 000000000..c5539b95f --- /dev/null +++ b/SSL/src/CommonForms/РедактированиеНовогоПисьма/Form.form @@ -0,0 +1,1192 @@ + + + + ОсновнаяГруппаТелаПисьма + 10 + + ЭлектронныйАдресКому + 4 + + <key>ru</key> + <value>Кому</value> + + true + true + + true + + + ПочтовыйАдресПолучателя + + + ru + Адреса электронной почты получателей сообщения + + + ЭлектронныйАдресКомуРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + ЭлектронныйАдресКомуКонтекстноеМеню + 5 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТемаПисьма + 11 + true + true + + true + + + ТемаПисьма + + + ru + Тема отправляемого сообщения + + + ТемаПисьмаРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ТемаПисьмаКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТелоПисьма + 22 + true + true + + true + + + ТелоПисьма + + None + + ru + Тело сообщения + + + ТелоПисьмаРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + ТелоПисьмаКонтекстноеМеню + 23 + true + + TextDocumentField + Enter + true + Left + true + + 50 + true + 10 + true + true + true + + + + ГруппаВложения + 21 + + Вложения + 13 + + <key>ru</key> + <value>Вложить</value> + + true + true + + true + + + ПредставлениеВложений + + false + None + Copy + CopyToClipboard + EndEdit + SortListAsc + SortListDesc + + Вложение1 + 34 + true + true + + true + + + ПредставлениеВложений.Вложение1 + + + Вложение1РасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + Вложение1КонтекстноеМеню + 35 + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Вложение2 + 36 + true + true + + true + + + ПредставлениеВложений.Вложение2 + + + Вложение2РасширеннаяПодсказка + 75 + Label + true + true + + Left + + + + Вложение2КонтекстноеМеню + 37 + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ВложенияКоманднаяПанель + 15 + + ПриложитьФайл + 40 + true + true + + true + + false + + ПриложитьФайлРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + Form.Command.ПриложитьФайл + Normal + Auto + true + true + UserCmds + Auto + + Left + + + DragCheck + ВложенияПроверкаПеретаскивания + + + Selection + ВложенияВыбор + + + BeforeAddRow + ВложенияПередНачаломДобавления + + + BeforeDeleteRow + ВложенияПередУдалением + + + Drag + ВложенияПеретаскивание + + + ВложенияСтрокаПоиска + 64 + + ВложенияСтрокаПоискаРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + ВложенияСтрокаПоискаКонтекстноеМеню + 65 + true + + Вложения + + true + + + + ВложенияСостояниеПросмотра + 67 + + ВложенияСостояниеПросмотраРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + ВложенияСостояниеПросмотраКонтекстноеМеню + 68 + true + + ViewStatusAddition + Вложения + + true + + + + ВложенияУправлениеПоиском + 70 + + ВложенияУправлениеПоискомРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + + ВложенияУправлениеПоискомКонтекстноеМеню + 71 + true + + SearchControlAddition + Вложения + + true + + + + ВложенияРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + + ВложенияКонтекстноеМеню + 14 + + ГруппаПриложитьФайл + 45 + + КонтекстноеМенюВложенияПриложитьФайл + 44 + true + true + + true + + false + + КонтекстноеМенюВложенияПриложитьФайлРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + Form.Command.ПриложитьФайл + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюВложенияУдалить + 43 + true + true + + true + + false + + КонтекстноеМенюВложенияУдалитьРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + Form.Item.Вложения.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа приложить файл</value> + + + ru + Группа приложить файл + + + ГруппаПриложитьФайлРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + + + КонтекстноеМенюВложенияОткрытьФайл + 46 + true + true + + true + + false + + КонтекстноеМенюВложенияОткрытьФайлРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + Form.Command.ОткрытьФайл + Normal + Auto + true + true + UserCmds + Auto + + + true + true + 1 + true + true + 2 + true + 1 + 1 + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + true + None + None + None + true + + + true + true + + true + + + <key>ru</key> + <value>Вложения</value> + + + + ГруппаВложенияРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + ru + Основная группа тела письма + + + ОсновнаяГруппаТелаПисьмаРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаУчетнаяЗапись + 30 + + УчетнаяЗапись + 25 + true + true + + true + + + УчетнаяЗапись + + Left + + ru + Учетная запись электронной почты, через которую будет отправлено электронное сообщение + + + УчетнаяЗаписьРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + УчетнаяЗаписьКонтекстноеМеню + 26 + true + + InputField + Enter + true + Left + true + + + ChoiceProcessing + УчетнаяЗаписьОбработкаВыбора + + true + true + false + false + false + false + false + true + true + Normal + + + + АдресОтвета + 38 + true + true + + true + + + АдресОтвета + + + ru + Введите адрес электронной почты на который вы хотите получить ответ на это письмо + + + АдресОтветаРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + АдресОтветаКонтекстноеМеню + 39 + true + + InputField + Enter + true + Left + true + + + Clearing + АдресОтветаОчистка + + + TextEditEnd + АдресОтветаОкончаниеВводаТекста + + + ChoiceProcessing + АдресОтветаОбработкаВыбора + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Учетная запись</value> + + + ru + Группа учетная запись + + + ГруппаУчетнаяЗаписьРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ОтправитьПисьмо + 1 + true + true + + true + + false + + ОтправитьПисьмоРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + Form.Command.ОтправитьПисьмо + Auto + true + true + true + UserCmds + Auto + + + Отмена + 24 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 27 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + 60 + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ПочтовыйАдресПолучателя + + <key>ru</key> + <value>Адрес получателя</value> + + 1 + + String + + + + true + + + true + + + + ТелоПисьма + 2 + + String + + + + true + + + true + + + + ТемаПисьма + + <key>ru</key> + <value>Тема</value> + + 4 + + String + + + + true + + + true + + + + ВложенияВПисьмо + + <key>ru</key> + <value>Вложения в письмо</value> + + 5 + + ValueList + + + true + + + true + + + + + + + УчетнаяЗапись + + <key>ru</key> + <value>Учетная запись</value> + + 6 + + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + + true + + + true + + + + АдресОтвета + + <key>ru</key> + <value>Адрес ответа</value> + + 7 + + String + + + + true + + + true + + + + АвтоматическаяПодстановкаАдресаОтвета + + <key>ru</key> + <value>Автоматическая подстановка адреса ответа</value> + + 8 + + Boolean + + + true + + + true + + + + ПредставлениеВложений + + <key>ru</key> + <value>Представление вложений</value> + + 9 + + ValueTable + + + true + + + true + + + Вложение1 + + <key>ru</key> + <value>Вложение1</value> + + 1 + + String + + + + true + + + true + + + + Вложение2 + + <key>ru</key> + <value>Вложение2</value> + + 2 + + String + + + + true + + + true + + + + + ВоВложенияхПрисутствуютСсылки + + <key>ru</key> + <value>Во вложениях присутствуют ссылки</value> + + 3 + + Boolean + + + true + + + true + + + + ПарольЗадан + + <key>ru</key> + <value>Пароль задан</value> + + 11 + + + true + + + true + + + + АдресаОтветаПоУчетнымЗаписям + + <key>ru</key> + <value>Адреса ответа по учетным записям</value> + + 10 + + ValueList + + + true + + + true + + + + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + + + + ОтправитьПисьмо + + <key>ru</key> + <value>Отправить письмо</value> + + 1 + + ru + Отправить письмо + + + true + + + + ОтправитьПисьмоВыполнить + + + Auto + Auto + + + ПриложитьФайл + + <key>ru</key> + <value>Приложить файл</value> + + 2 + + ru + Приложить файл + + + true + + + CommonPicture.ПриложитьФайл + + + + ПриложитьФайлВыполнить + + + TextPicture + Auto + Auto + + + ОткрытьФайл + + <key>ru</key> + <value>Открыть файл</value> + + 3 + + ru + Открыть файл + + + true + + + StdPicture.OpenFile + + + + ОткрытьФайл + + + Auto + Auto + + + УчетнаяЗапись + + ValueList + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + + + Кому + + ValueList + String + + 1000 + + + + + Тема + + String + + + + + Тело + + String + + + + + Вложения + + ValueList + + + + АдресОтвета + + String + + + + + УдалятьФайлыПослеОтправки + + Boolean + + + + + + + diff --git a/SSL/src/CommonForms/РедактированиеНовогоПисьма/Help/ru.html b/SSL/src/CommonForms/РедактированиеНовогоПисьма/Help/ru.html new file mode 100644 index 000000000..d8d60cd98 --- /dev/null +++ b/SSL/src/CommonForms/РедактированиеНовогоПисьма/Help/ru.html @@ -0,0 +1,8 @@ + +

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

    +

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

    +

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

    +

    Примеры записи почтового адреса:

    +
    • ivanov@server - краткая запись, адрес почтового ящика +
    • Иванов ivanov@server - полная запись почтового адреса состоит из имени адресата и адреса почтового ящика +
    • ivanov (почтовый сервер при этом, должен уметь сопоставлять данный краткий адрес полному)

     

    \ 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..d9ff32b91 --- /dev/null +++ b/SSL/src/CommonForms/РедактированиеНовогоПисьма/Module.bsl @@ -0,0 +1,675 @@ +//------------------------------------------------------------------------------ +// СПЕЦИФИКАЦИЯ ПАРАМЕТРОВ ПЕРЕДАВАЕМЫХ В ФОРМУ +// +// УчетнаяЗапись* - СписокЗначений, СправочникСсылка.УчетныеЗаписиЭлектроннойПочты +// если тип список значений, тогда +// представление - наименование учетной записи, +// значение - ссылка на учетную запись +// +// Кому - СписокЗначений, Строка: +// если список значений, то представление - имя получателя +// значение - почтовый адрес +// если строка то список почтовых адресов, +// в формате правильного e-mail адреса* +// +// Вложения - СписокЗначений, где +// представление - строка - наименование вложения +// значение - ДвоичныеДанные - двоичные данные вложения +// - Строка - адрес файла во временном хранилище +// - Строка - путь к файлу на клиенте +// +// УдалятьФайлыПослеОтправки - булево - удалять файлы в локальной файловой системы +// после успешной отправки +// +// Тема - Строка - тема письма +// Тело - Строка - тело письма +// АдресОтвета - Строка - адрес по которому получателям письма +// будет предложено написать ответ +// +// Использовать +// +// *формат правильного e-mail адреса: +// Z = ([Имя Пользователя] [<]пользователь@почтовыйсервер[>][;]), Строка = Z[Z].. +// +// ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ +// +// Неопределено +// +// Булево: истина - сообщение успешно отправлено +// ложь - сообщение не было отправлено +// +//------------------------------------------------------------------------------ +// СПЕЦИФИКАЦИЯ ФУНКЦИОНИРОВАНИЯ ФОРМЫ +// +// Если в списке переданных учетных записей более одной записи, то на форме +// появится возможность выбора учетной записи, с которой будет отправлено +// электронное сообщение. +// Если файлы для вложения существует на сервере 1С:Предприятие, в качестве +// параметра необходимо не двоичные данные, а ссылку на данные во временном +// хранилище. +// +//------------------------------------------------------------------------------ + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ ОБРАБОТЧИКОВ СОБЫТИЙ ФОРМЫ И ЭЛЕМЕНТОВ ФОРМЫ +// + +// Обработчик события "при создании на сервере" формы +// Заполняет поля формы по переданным в форму параметрам +// +// В форму могут передаваться следующие параметры: +// УчетнаяЗапись* - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты, список - +// ссылка на учетную запись, которая будет использоваться +// при отправке сообщения, либо список из учетных записей (для выбора) +// Вложения - соответствие - вложения в письмо, где +// ключ - имя файла +// значение - двоичные данные файла +// Тема - строка - тема письма +// Тело - строка - тело письма +// Кому - соответствие/строка - адресаты письма +// если тип соответствие, то +// ключ - строка - Имя адресата +// значение - строка - электронный адрес в формате addr@server +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + + ТемаПисьма = Параметры.Тема; + ТелоПисьма = Параметры.Тело; + АдресОтвета = Параметры.АдресОтвета; + + ВложенияВПисьмо = Параметры.Вложения; + + // помечаем те вложения, которые являются путями к файлам на клиенте + Для Каждого ОписаниеВложение из ВложенияВПисьмо Цикл + Если ТипЗнч(ОписаниеВложение.Значение) = Тип("Строка") Тогда + Если ЭтоАдресВременногоХранилища(ОписаниеВложение.Значение) Тогда + ОписаниеВложение.Значение = ПолучитьИзВременногоХранилища(ОписаниеВложение.Значение); + Иначе + ОписаниеВложение.Пометка = Истина; // Это путь к файлу в локальной файловой системе + КонецЕсли; + КонецЕсли; + КонецЦикла; + + // обработка сложных параметров формы (составного типа) + // УчетнаяЗапись, Кому + УстановитьПривилегированныйРежим(Истина); + Если ТипЗнч(Параметры.УчетнаяЗапись) = Тип("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты") Тогда + УчетнаяЗапись = Параметры.УчетнаяЗапись; + ПарольЗадан = ЗначениеЗаполнено(УчетнаяЗапись.Пароль); + Иначе + Если ТипЗнч(Параметры.УчетнаяЗапись) = Тип("СписокЗначений") Тогда + НаборУчетныхЗаписей = Параметры.УчетнаяЗапись; + Если НаборУчетныхЗаписей.Количество() = 0 Тогда + ТекстСообщения = НСтр("ru = 'Не указаны учетные записи для отправки сообщения.'"); + Отказ = Истина; + КонецЕсли; + Иначе + ТекстСообщения = НСтр("ru = 'Не указаны учетные записи для отправки сообщения.'"); + Отказ = Истина; + КонецЕсли; + + Если Отказ Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения); + Возврат; + КонецЕсли; + + ПарольЗаданМас = Новый Массив; + + Для Каждого ЭлементУчетнаяЗапись Из НаборУчетныхЗаписей Цикл + Элементы.УчетнаяЗапись.СписокВыбора.Добавить( + ЭлементУчетнаяЗапись.Значение, + ЭлементУчетнаяЗапись.Представление); + Если ЭлементУчетнаяЗапись.Значение.ИспользоватьДляПолучения Тогда + АдресаОтветаПоУчетнымЗаписям.Добавить(ЭлементУчетнаяЗапись.Значение, + ПолучитьПочтовыйАдресПоУчетнойЗаписи(ЭлементУчетнаяЗапись.Значение)); + КонецЕсли; + Если ЗначениеЗаполнено(ЭлементУчетнаяЗапись.Значение.Пароль) Тогда + ПарольЗаданМас.Добавить(ЭлементУчетнаяЗапись.Значение); + КонецЕсли; + КонецЦикла; + ПарольЗадан = Новый ФиксированныйМассив(ПарольЗаданМас); + Элементы.УчетнаяЗапись.СписокВыбора.СортироватьПоПредставлению(); + УчетнаяЗапись = НаборУчетныхЗаписей[0].Значение; + Элементы.УчетнаяЗапись.КнопкаСпискаВыбора = Истина; + КонецЕсли; + + Если ТипЗнч(Параметры.Кому) = Тип("СписокЗначений") Тогда + ПочтовыйАдресПолучателя = ""; + Для Каждого ЭлементПочтовыйАдрес Из Параметры.Кому Цикл + Если ЗначениеЗаполнено(ЭлементПочтовыйАдрес.Представление) тогда + ПочтовыйАдресПолучателя = ПочтовыйАдресПолучателя + + ЭлементПочтовыйАдрес.Представление + + " <" + + ЭлементПочтовыйАдрес.Значение + + ">; " + Иначе + ПочтовыйАдресПолучателя = ПочтовыйАдресПолучателя + + ЭлементПочтовыйАдрес.Значение + + "; "; + КонецЕсли; + КонецЦикла; + ИначеЕсли ТипЗнч(Параметры.Кому) = Тип("Строка") Тогда + ПочтовыйАдресПолучателя = Параметры.Кому; + КонецЕсли; + + // Получаем список адресов, которые пользователь использовал ранее + СписокАдресовОтвета = ХранилищеОбщихНастроек.Загрузить("РедактированиеНовогоПисьма", "СписокАдресовОтвета", , ОбщегоНазначения.ТекущийПользователь()); + + Если СписокАдресовОтвета <> Неопределено И СписокАдресовОтвета.Количество() > 0 Тогда + Для Каждого ЭлементаАдресОтвета Из СписокАдресовОтвета Цикл + Элементы.АдресОтвета.СписокВыбора.Добавить(ЭлементаАдресОтвета.Значение, ЭлементаАдресОтвета.Представление); + КонецЦикла; + Элементы.АдресОтвета.КнопкаСпискаВыбора = Истина; + КонецЕсли; + + Если ЗначениеЗаполнено(АдресОтвета) Тогда + АвтоматическаяПодстановкаАдресаОтвета = Ложь; + Иначе + Если УчетнаяЗапись.ИспользоватьДляПолучения Тогда + // устанавливаем почтовый адрес по умолчанию + Если ЗначениеЗаполнено(УчетнаяЗапись.ИмяПользователя) тогда + АдресОтвета = УчетнаяЗапись.ИмяПользователя + " <" + УчетнаяЗапись.АдресЭлектроннойПочты + ">"; + Иначе + АдресОтвета = УчетнаяЗапись.АдресЭлектроннойПочты; + КонецЕсли; + КонецЕсли; + + АвтоматическаяПодстановкаАдресаОтвета = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьПочтовыйАдресПоУчетнойЗаписи(знач УчетнаяЗапись) + + Возврат СокрЛП(УчетнаяЗапись.ИмяПользователя) + + ? (ПустаяСтрока(СокрЛП(УчетнаяЗапись.ИмяПользователя)), + УчетнаяЗапись.АдресЭлектроннойПочты, + " <" + УчетнаяЗапись.АдресЭлектроннойПочты + ">"); + +КонецФункции + +// Обработчик события "при открытии" формы +// Вызывает функцию заполнения списка вложений +// +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ОбновитьПредставлениеВложений(); + +КонецПроцедуры + +// Обработчик события нажатия на кнопку "Отправить письмо" формы +// +&НаКлиенте +Процедура ОтправитьПисьмоВыполнить() + + ОчиститьСообщения(); + + Попытка + ПриведенныйПочтовыйАдрес = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ПочтовыйАдресПолучателя); + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), , + ПочтовыйАдресПолучателя); + Возврат; + КонецПопытки; + + Если ЗначениеЗаполнено(АдресОтвета) Тогда + Попытка + ПриведенныйАдресОтвета = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(АдресОтвета); + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), , + "АдресОтвета"); + Возврат; + КонецПопытки; + КонецЕсли; + + Пароль = Неопределено; + + Если ((ТипЗнч(ПарольЗадан) = Тип("Булево") И Не ПарольЗадан) + Или (ТипЗнч(ПарольЗадан) = Тип("ФиксированныйМассив") И ПарольЗадан.Найти(УчетнаяЗапись) = Неопределено)) Тогда + ПараметрУчетнаяЗапись = Новый Структура("УчетнаяЗапись", УчетнаяЗапись); + Пароль = ОткрытьФормуМодально("ОбщаяФорма.ПодтверждениеПароляУчетнойЗаписи", + ПараметрУчетнаяЗапись); + Если ТипЗнч(Пароль) <> Тип("Строка") Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + ПараметрыПисьма = СформироватьПараметрыПисьма(ПриведенныйПочтовыйАдрес, Пароль); + + Если ПараметрыПисьма = Неопределено Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Ошибка формирования параметров почтового сообщения'")); + Возврат; + КонецЕсли; + + Попытка + ЭлектроннаяПочта.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма); + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат; + КонецПопытки; + + СохранитьАдресОтвета(АдресОтвета); + Предупреждение(НСтр("ru = 'Сообщение успешно отправлено'")); + + УстановитьСостояниеОтправленногоСообщения(); + +КонецПроцедуры + +// Обработчик события "обработка выбора" поля УчетнаяЗапись +// Подставляет адрес ответа, если флаг автоматической подставновки ответа +// установлен. +// +&НаКлиенте +Процедура УчетнаяЗаписьОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + Если АвтоматическаяПодстановкаАдресаОтвета Тогда + АдресОтвета = АдресаОтветаПоУчетнымЗаписям.НайтиПоЗначению(ВыбранноеЗначение).Представление; + КонецЕсли; + +КонецПроцедуры + +// Обработчик события "окончание ввода текста" поля АдресОтвета. +// Если введенный почтовый адрес отличается от заполненного по умолчанию +// +&НаКлиенте +Процедура АдресОтветаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + Если АвтоматическаяПодстановкаАдресаОтвета Тогда + Если Не ЗначениеЗаполнено(АдресОтвета) + ИЛИ Не ЗначениеЗаполнено(Текст) Тогда + АвтоматическаяПодстановкаАдресаОтвета = Ложь; + Иначе + АдресСоответствие1 = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(АдресОтвета); + Попытка + АдресСоответствие2 = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Текст); + Исключение + СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщениеОбОшибке, , "АдресОтвета"); + СтандартнаяОбработка = Ложь; + Возврат; + КонецПопытки; + + Если НЕ EMAILАдресаОдинаковы(АдресСоответствие1, АдресСоответствие2) Тогда + АвтоматическаяПодстановкаАдресаОтвета = Ложь; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + АдресОтвета = ПолучитьПриведенныйПочтовыйАдресВФормате(Текст); + +КонецПроцедуры + +// Обработчик события "обработка выбора" поля АдресОтвета. +// Снимает флаг авто подстановки адреса ответа +// +&НаКлиенте +Процедура АдресОтветаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + АвтоматическаяПодстановкаАдресаОтвета = Ложь; + +КонецПроцедуры + +// Обработчик события "очистика" поля АдресОтвета. +// +&НаКлиенте +Процедура АдресОтветаОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + АктуализироватьАдресОтветаВХранимомСписоке(АдресОтвета, Ложь); + + Для Каждого ЭлементаАдресОтвета Из Элементы.АдресОтвета.СписокВыбора Цикл + Если ЭлементаАдресОтвета.Значение = АдресОтвета + И ЭлементаАдресОтвета.Представление = АдресОтвета Тогда + Элементы.АдресОтвета.СписокВыбора.Удалить(ЭлементаАдресОтвета); + КонецЕсли; + КонецЦикла; + + АдресОтвета = ""; + +КонецПроцедуры + +// Обработчик события "перед удалением" поля Вложения +// Удаляет вложение из списка, а так же вызывает функцию +// обновления таблицы представления вложений +// +&НаКлиенте +Процедура ВложенияПередУдалением(Элемент, Отказ) + + НаименованиеВложения = Элемент.ТекущиеДанные[Элемент.ТекущийЭлемент.Имя]; + + Для Каждого ЭлементВложение Из ВложенияВПисьмо Цикл + Если ЭлементВложение.Представление = НаименованиеВложения Тогда + ВложенияВПисьмо.Удалить(ЭлементВложение); + КонецЕсли; + КонецЦикла; + + ОбновитьПредставлениеВложений(); + +КонецПроцедуры + +// Обработчик события нажатия на кнопку командной панели "приложить файл" +// +&НаКлиенте +Процедура ПриложитьФайлВыполнить() + + ДобавлениеФайлаКВложениям(); + +КонецПроцедуры + +// Обработчик события "перед началом добавления" поля Вложения +// +&НаКлиенте +Процедура ВложенияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Отказ = Истина; + ДобавлениеФайлаКВложениям(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВложенияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ОткрытьВложение(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФайл(Команда) + ОткрытьВложение(); +КонецПроцедуры + +&НаКлиенте +Процедура ВложенияПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + СтандартнаяОбработка = Ложь; +КонецПроцедуры + +&НаКлиенте +Процедура ВложенияПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + + СтандартнаяОбработка = Ложь; + + Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") Тогда + АдресВременногоХранилища = ""; + Если ПоместитьФайл(АдресВременногоХранилища, ПараметрыПеретаскивания.Значение.ПолноеИмя, , Ложь) Тогда + Файлы = Новый Массив; + ПередаваемыйФайл = Новый ОписаниеПередаваемогоФайла(ПараметрыПеретаскивания.Значение.Имя, АдресВременногоХранилища); + Файлы.Добавить(ПередаваемыйФайл); + ДобавитьФайлыВСписок(Файлы); + ОбновитьПредставлениеВложений(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ СЕРВИСНЫХ ФУНКЦИЙ +// + +&НаКлиенте +Процедура УстановитьСостояниеОтправленногоСообщения() + + Заголовок = НСтр("ru = 'Сообщение отправлено'"); + Элементы.ОтправитьПисьмо.Доступность = Ложь; + Элементы.Отмена.Заголовок = НСтр("ru = 'Закрыть'");; + Элементы.ЭлектронныйАдресКому.ТолькоПросмотр = Истина; + Элементы.ТемаПисьма.ТолькоПросмотр = Истина; + Элементы.ТелоПисьма.ТолькоПросмотр = Истина; + Элементы.Вложения.ТолькоПросмотр = Истина; + Элементы.УчетнаяЗапись.ТолькоПросмотр = Истина; + Элементы.АдресОтвета.ТолькоПросмотр = Истина; + Элементы.ПриложитьФайл.Доступность = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВложение() + + Если Элементы.Вложения.ТекущиеДанные <> Неопределено Тогда + НаименованиеВложения = Элементы.Вложения.ТекущиеДанные[Элементы.Вложения.ТекущийЭлемент.Имя]; + + Для Каждого ЭлементСпискаВложений Из ВложенияВПисьмо Цикл + Если ЭлементСпискаВложений.Представление = НаименованиеВложения Тогда + Если ТипЗнч(ЭлементСпискаВложений.Значение) = Тип("ДвоичныеДанные") Тогда +#Если ВебКлиент Тогда + АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ЭлементСпискаВложений.Значение); + ПолучитьФайл(АдресВоВременномХранилище, , Истина) +#Иначе + Файл = Новый Файл(ЭлементСпискаВложений.Представление); + Если Файл.Расширение = "mxl" Тогда + ТабличныйДокумент = ПолучитьТабличныйДокументПоДвоичнымДанным(ЭлементСпискаВложений.Значение); + ТабличныйДокумент.ТолькоПросмотр = Истина; + ТабличныйДокумент.Показать(ЭлементСпискаВложений.Представление); + Иначе + ИмяФайлаДляОткрытия = ПолучитьИмяВременногоФайла(Файл.Расширение); + ЭлементСпискаВложений.Значение.Записать(ИмяФайлаДляОткрытия); + ЗапуститьПриложение(ИмяФайлаДляОткрытия); + КонецЕсли; +#КонецЕсли + Иначе +#Если НЕ ВебКлиент Тогда + Если Прав(СокрЛП(ЭлементСпискаВложений.Значение), 4) = ".mxl" Тогда + ТабличныйДокумент = ПолучитьТабличныйДокументПоДвоичнымДанным(Новый ДвоичныеДанные(ЭлементСпискаВложений.Значение)); + ТабличныйДокумент.ТолькоПросмотр = Истина; + ТабличныйДокумент.Показать(ЭлементСпискаВложений.Представление, ЭлементСпискаВложений.Значение); + Иначе +#КонецЕсли + ЗапуститьПриложение(ЭлементСпискаВложений.Значение); +#Если НЕ ВебКлиент Тогда + КонецЕсли; +#КонецЕсли + КонецЕсли; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьТабличныйДокументПоДвоичнымДанным(ДвоичныеДанные) + + ИмяФайла = ПолучитьИмяВременногоФайла("mxl"); + ДвоичныеДанные.Записать(ИмяФайла); + + ТабличныйДокумент = Новый ТабличныйДокумент; + ТабличныйДокумент.Прочитать(ИмяФайла); + + Возврат ТабличныйДокумент; + +КонецФункции + +&НаКлиенте +Процедура ДобавлениеФайлаКВложениям() + + Перем ПомещенныеФайлы; + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + ПомещенныеФайлы = Новый Массив; + Если ПоместитьФайлы(, ПомещенныеФайлы, "", Истина, ) Тогда + ДобавитьФайлыВСписок(ПомещенныеФайлы); + ОбновитьПредставлениеВложений(); + КонецЕсли; + Иначе + Предупреждение(НСтр("ru = 'В Веб-клиенте без установленного расширения работы с файлами добавление файлов не поддерживается.'")); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьФайлыВСписок(ПомещенныеФайлы) + + Для Каждого ОписаниеФайла Из ПомещенныеФайлы Цикл + Файл = Новый Файл(ОписаниеФайла.Имя); + ВложенияВПисьмо.Добавить(ПолучитьИзВременногоХранилища(ОписаниеФайла.Хранение), Файл.Имя); + УдалитьИзВременногоХранилища(ОписаниеФайла.Хранение); + КонецЦикла; + +КонецПроцедуры + +// Обновляет представление списка вложений +// +// +&НаКлиенте +Процедура ОбновитьПредставлениеВложений() + + ПредставлениеВложений.Очистить(); + + индекс = 0; + + Для Каждого ЭлементВложение Из ВложенияВПисьмо Цикл + Если Индекс = 0 Тогда + СтрокаПредставления = ПредставлениеВложений.Добавить(); + КонецЕсли; + + СтрокаПредставления["Вложение"+Строка(Индекс+1)] = ЭлементВложение.Представление; + + Индекс = Индекс + 1; + Если Индекс = 2 тогда + Индекс = 0; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Проверяет возможность отправления письма и если +// это возможно - формирует параметры отправки +// +&НаКлиенте +Функция СформироватьПараметрыПисьма(знач ПриведенныйПочтовыйАдрес, + знач Пароль = Неопределено) + + ПараметрыПисьма = Новый Структура; + + Если ЗначениеЗаполнено(Пароль) Тогда + ПараметрыПисьма.Вставить("Пароль", Пароль); + КонецЕсли; + + Если ЗначениеЗаполнено(ПриведенныйПочтовыйАдрес) Тогда + ПараметрыПисьма.Вставить("Кому", ПриведенныйПочтовыйАдрес); + КонецЕсли; + + Если ЗначениеЗаполнено(АдресОтвета) Тогда + ПараметрыПисьма.Вставить("АдресОтвета", АдресОтвета); + КонецЕсли; + + Если ЗначениеЗаполнено(ТемаПисьма) Тогда + ПараметрыПисьма.Вставить("Тема", ТемаПисьма); + КонецЕсли; + + Если ЗначениеЗаполнено(ТелоПисьма) Тогда + ПараметрыПисьма.Вставить("Тело", ТелоПисьма); + КонецЕсли; + + Если ВложенияВПисьмо.Количество() > 0 Тогда + Вложения = Новый Соответствие; + Для Каждого ЭлементВложение Из ВложенияВПисьмо Цикл + Если ЭлементВложение.Пометка Тогда + ДвоичныеДанные = Новый ДвоичныеДанные(ЭлементВложение.Значение); + Вложения.Вставить(ЭлементВложение.Представление, ДвоичныеДанные); + Иначе + Вложения.Вставить(ЭлементВложение.Представление, ЭлементВложение.Значение); + КонецЕсли; + КонецЦикла; + ПараметрыПисьма.Вставить("Вложения", Вложения); + КонецЕсли; + + Возврат ПараметрыПисьма; + +КонецФункции + +// Добавляет адрес ответа в список сохраняемых значений +// +&НаСервереБезКонтекста +Функция СохранитьАдресОтвета(знач АдресОтвета) + + АктуализироватьАдресОтветаВХранимомСписоке(АдресОтвета); + +КонецФункции + +// Добавляет адрес ответа в список сохраняемых значений +// +&НаСервереБезКонтекста +Функция АктуализироватьАдресОтветаВХранимомСписоке(знач АдресОтвета, + знач ДобавлятьАдресВСписок = Истина) + + // Получаем список адресов, которые пользователь использовал ранее + СписокАдресовОтвета = ХранилищеОбщихНастроек.Загрузить( + "РедактированиеНовогоПисьма", + "СписокАдресовОтвета", , + ОбщегоНазначения.ТекущийПользователь()); + + Если СписокАдресовОтвета = Неопределено Тогда + СписокАдресовОтвета = Новый СписокЗначений(); + КонецЕсли; + + Для Каждого ЭлементАдресОтвета Из СписокАдресовОтвета Цикл + Если ЭлементАдресОтвета.Значение = АдресОтвета + И ЭлементАдресОтвета.Представление = АдресОтвета Тогда + СписокАдресовОтвета.Удалить(ЭлементАдресОтвета); + КонецЕсли; + КонецЦикла; + + Если ДобавлятьАдресВСписок + И ЗначениеЗаполнено(АдресОтвета) Тогда + СписокАдресовОтвета.Вставить(0, АдресОтвета, АдресОтвета); + КонецЕсли; + + ХранилищеОбщихНастроек.Сохранить( + "РедактированиеНовогоПисьма", + "СписокАдресовОтвета", + СписокАдресовОтвета, , + ОбщегоНазначения.ТекущийПользователь()); + +КонецФункции + +// Сравнивает два e-mail адреса +// Параметры +// АдресСоответствие1 - строка - первый e-mail адрес +// АдресСоответствие2 - строка - второй e-mail адрес +// Возвращаемое значение +// Истина, или Ложь в зависимости от того одинаковы ли e-mail адреса +// +&НаКлиенте +Функция EMAILАдресаОдинаковы(АдресСоответствие1, АдресСоответствие2) + + Если АдресСоответствие1.Количество() <> 1 + Или АдресСоответствие2.Количество() <> 1 Тогда + Возврат Ложь; + КонецЕсли; + + Если АдресСоответствие1[0].Представление = АдресСоответствие2[0].Представление + И АдресСоответствие1[0].Адрес = АдресСоответствие2[0].Адрес Тогда + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; + +КонецФункции + +// Возвращает приведенный почтовый адрес +// +&НаКлиенте +Функция ПолучитьПриведенныйПочтовыйАдресВФормате(Текст) + + ПочтовыйАдрес = ""; + + МассивАдресов = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Текст); + + Для Каждого ЭлементАдрес Из МассивАдресов Цикл + Если ЗначениеЗаполнено(ЭлементАдрес.Представление) тогда + ПочтовыйАдрес = ПочтовыйАдрес + ЭлементАдрес.Представление + + ? (ПустаяСтрока(СокрЛП(ЭлементАдрес.Адрес)), "", " <" + ЭлементАдрес.Адрес + ">"); + Иначе + ПочтовыйАдрес = ПочтовыйАдрес + ЭлементАдрес.Адрес + "; "; + КонецЕсли; + КонецЦикла; + + Возврат ПочтовыйАдрес; + +КонецФункции diff --git a/SSL/src/CommonForms/РедактированиеНовогоПисьма/РедактированиеНовогоПисьма.mdo b/SSL/src/CommonForms/РедактированиеНовогоПисьма/РедактированиеНовогоПисьма.mdo new file mode 100644 index 000000000..a4e639600 --- /dev/null +++ b/SSL/src/CommonForms/РедактированиеНовогоПисьма/РедактированиеНовогоПисьма.mdo @@ -0,0 +1,16 @@ + + + РедактированиеНовогоПисьма + + ru + Отправка сообщения + + true + + + ru + + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form new file mode 100644 index 000000000..eba87212d --- /dev/null +++ b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form @@ -0,0 +1,1463 @@ + + + + <key>ru</key> + <value>Создание начального образа информационной базы</value> + + + ВидБазы + 1 + true + true + + true + + + ВидБазы + + None + + OnChange + ВидБазыПриИзменении + + + ВидБазыРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ВидБазыКонтекстноеМеню + 2 + true + + RadioButtonField + Enter + true + Left + true + + + + ru + На данном компьютере или на компьютере в локальной сети + + + 0 + + + + + ru + На сервере 1С:Предприятия + + + 1 + + + Vertical + + + + Параметры + 3 + + Страницы + 4 + + ЗаполнитьПараметрыФайловойБазы + 5 + + ЯзыкФайловойБазы + 7 + true + true + + true + + + Язык + + + ЯзыкФайловойБазыРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ЯзыкФайловойБазыКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ГруппаПутьФайловойБазы + 37 + + ПолноеИмяФайловойБазы + 35 + + <key>ru</key> + <value>Для сервера 1С:Предприятия под управлением Microsoft Windows, (вида "\\servername\resource\1Cv8.1CD")</value> + + true + true + + true + + + ПолноеИмяФайловойБазыWindows + + Top + 1 + + ПолноеИмяФайловойБазыРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + ПолноеИмяФайловойБазыКонтекстноеМеню + 36 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПолноеИмяФайловойБазыLinux + 38 + + <key>ru</key> + <value>Для сервера 1С:Предприятия под управлением Linux</value> + + true + true + + true + + + ПолноеИмяФайловойБазыLinux + + Top + + ПолноеИмяФайловойБазыLinuxРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ПолноеИмяФайловойБазыLinuxКонтекстноеМеню + 39 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Полное имя файловой базы</value> + + + ru + Группа путь файловой базы + + + ГруппаПутьФайловойБазыРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + StrongSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Заполнить параметры файловой базы</value> + + + ru + Заполнить параметры файловой базы + + + ЗаполнитьПараметрыФайловойБазыРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ЗаполнитьПараметрыСервернойБазы + 6 + + Сервер + 9 + true + true + + true + + + Сервер + + + СерверРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + СерверКонтекстноеМеню + 10 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИмяБазы + 11 + true + true + + true + + + ИмяБазы + + + ИмяБазыРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + ИмяБазыКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ЗащищенноеСоединение + 13 + true + true + + true + + + ЗащищенноеСоединение + + + ЗащищенноеСоединениеРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + ЗащищенноеСоединениеКонтекстноеМеню + 14 + true + + InputField + DontShow + Enter + true + Left + true + + 20 + true + true + true + true + true + true + + + ru + Выключено + + + 0 + + + + + ru + Установка соединения + + + 1 + + + + + ru + Постоянно + + + 2 + + + Normal + + + + ТипСУБД + 15 + true + true + + true + + + ТипСУБД + + + ТипСУБДРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + ТипСУБДКонтекстноеМеню + 16 + true + + InputField + DontShow + Enter + true + Left + true + + true + true + true + true + true + + + ru + Microsoft SQL Server + + + MSSQLServer + + + + + ru + PostgreSQL + + + PostgreSQL + + + + + ru + IBM DB2 + + + IBMDB2 + + + + + ru + Oracle Database + + + Oracle + + + Normal + + + + СерверБазыДанных + 17 + true + true + + true + + + СерверБазыДанных + + + СерверБазыДанныхРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + СерверБазыДанныхКонтекстноеМеню + 18 + true + + InputField + DontShow + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ИмяБазыДанных + 19 + true + true + + true + + + ИмяБазыДанных + + + ИмяБазыДанныхРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + ИмяБазыДанныхКонтекстноеМеню + 20 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ПользовательБазыДанных + 21 + true + true + + true + + + ПользовательБазыДанных + + + ПользовательБазыДанныхРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + ПользовательБазыДанныхКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ПарольПользователя + 23 + true + true + + true + + + ПарольПользователя + + + ПарольПользователяРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + + ПарольПользователяКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СмещениеДат + 25 + true + true + + true + + + СмещениеДат + + + СмещениеДатРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + + СмещениеДатКонтекстноеМеню + 26 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + + ru + 0 + + + 0 + + + + + ru + 2000 + + + 2000 + + + Normal + + + + ЯзыкБазыСервера + 27 + true + true + + true + + + Язык + + + ЯзыкБазыСервераРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + ЯзыкБазыСервераКонтекстноеМеню + 28 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Заполнить параметры серверной базы</value> + + + ru + Заполнить параметры серверной базы + + + ЗаполнитьПараметрыСервернойБазыРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы</value> + + + ru + Страницы + + + СтраницыРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Параметры информационной базы</value> + + + ru + Параметры + + + ПараметрыРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаПутьКАрхивуСФайламиТомов + 40 + + ПутьКАрхивуСФайламиТомов + 33 + + <key>ru</key> + <value>Для сервера 1С:Предприятия под управлением Microsoft Windows, (вида "\\servername\resource\files.zip")</value> + + true + true + + true + + + ПутьКАрхивуСФайламиТомовWindows + + Top + + ПутьКАрхивуСФайламиТомовРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + + ПутьКАрхивуСФайламиТомовКонтекстноеМеню + 34 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПутьКАрхивуСФайламиТомовLinux + 41 + + <key>ru</key> + <value>Для сервера 1С:Предприятия под управлением Linux</value> + + true + true + + true + + + ПутьКАрхивуСФайламиТомовLinux + + Top + + ПутьКАрхивуСФайламиТомовLinuxРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ПутьКАрхивуСФайламиТомовLinuxКонтекстноеМеню + 42 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Полное имя архива с файлами томов</value> + + + ru + Группа путь к архиву с файлами томов + + + ГруппаПутьКАрхивуСФайламиТомовРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + StrongSeparation + true + true + auto + Auto + Auto + + + + ПанельДействий + 29 + + СоздатьНачальныйОбраз + 30 + true + true + + true + + false + + СоздатьНачальныйОбразРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + Form.Command.СоздатьНачальныйОбраз + Auto + true + true + true + UserCmds + Auto + + + Закрыть + 31 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + Auto + + + Справка + 32 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Панель действий</value> + + + ru + Панель действий + + + ПанельДействийРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + 75 + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ВидБазы + + <key>ru</key> + <value>Вариант информационной базы</value> + + 1 + + Number + + 1 + + + + true + + + true + + + + Язык + + <key>ru</key> + <value>Язык (Страна)</value> + + 2 + + String + + + + true + + + true + + + + Сервер + + <key>ru</key> + <value>Кластер серверов 1С:Предприятия</value> + + 3 + + String + + + + true + + + true + + + + ИмяБазы + + <key>ru</key> + <value>Имя информационной базы в кластере</value> + + 4 + + String + + + + true + + + true + + + + ЗащищенноеСоединение + + <key>ru</key> + <value>Защищенное соединение</value> + + 5 + + Number + + 10 + + + + 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> + + 9 + + String + + + + true + + + true + + + + ПарольПользователя + + <key>ru</key> + <value>Пароль пользователя</value> + + 10 + + String + + + + true + + + true + + + + СмещениеДат + + <key>ru</key> + <value>Смещение дат</value> + + 11 + + Number + + 10 + + + + true + + + true + + + + Узел + + <key>ru</key> + <value>Узел</value> + + 12 + + ExchangePlanRef + + + true + + + true + + + + МожноСоздатьФайловуюБазу + + <key>ru</key> + <value>Можно создать файловую базу</value> + + 13 + + Boolean + + + true + + + true + + + + ПутьКАрхивуСФайламиТомовWindows + + <key>ru</key> + <value>Полное имя архива с файлами томов</value> + + 14 + + String + + + + true + + + true + + + + ПолноеИмяФайловойБазыWindows + + <key>ru</key> + <value>Полное имя файловой базы windows</value> + + 15 + + String + + + + true + + + true + + + + ПолноеИмяФайловойБазыLinux + + <key>ru</key> + <value>Полное имя файловой базы linux</value> + + 16 + + String + + + + true + + + true + + + + ПутьКАрхивуСФайламиТомовLinux + + <key>ru</key> + <value>Полное имя архива с файлами томов</value> + + 17 + + 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 new file mode 100644 index 000000000..d97fc1e8b --- /dev/null +++ b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl @@ -0,0 +1,91 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Менеджер = ПланыОбмена[Параметры.Узел.Метаданные().Имя]; + Если Параметры.Узел = Менеджер.ЭтотУзел() Тогда + + ВызватьИсключение НСтр("ru = 'Создание начального образа для данного узла невозможно.'", "ru"); + + Иначе + + ВидБазы = 0; // файловая база + ТипСУБД = ""; + Узел = Параметры.Узел; + МожноСоздатьФайловуюБазу = Истина; + СистемнаяИнформация = Новый СистемнаяИнформация; + Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда + МожноСоздатьФайловуюБазу = Ложь; + КонецЕсли; + + КодыЛокализации = ПолучитьДопустимыеКодыЛокализации(); + ЯзыкФайловойБазы = Элементы.Найти("ЯзыкФайловойБазы"); + ЯзыкБазыСервера = Элементы.Найти("ЯзыкБазыСервера"); + Для Каждого Код Из КодыЛокализации Цикл + Представление = ПредставлениеКодаЛокализации(Код); + ЯзыкФайловойБазы.СписокВыбора.Добавить(Код, Представление); + ЯзыкБазыСервера.СписокВыбора.Добавить(Код, Представление); + КонецЦикла; + Язык = КодЛокализацииИнформационнойБазы(); + + КонецЕсли; + + ТипПлатформыСервера = РаботаСФайламиПовтИсп.ТипПлатформыСервера(); + Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда + Элементы.ПолноеИмяФайловойБазы.АвтоОтметкаНезаполненного = Истина; + Элементы.ПутьКАрхивуСФайламиТомов.АвтоОтметкаНезаполненного = Истина; + Иначе + Элементы.ПолноеИмяФайловойБазыLinux.АвтоОтметкаНезаполненного = Истина; + Элементы.ПутьКАрхивуСФайламиТомовLinux.АвтоОтметкаНезаполненного = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВидБазыПриИзменении(Элемент) + // переключить страницу параметров + Страницы = Элементы.Найти("Страницы"); + Страницы.ТекущаяСтраница = Страницы.ПодчиненныеЭлементы[ВидБазы]; +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьНачальныйОбраз(Команда) + ОчиститьСообщения(); + + Состояние(НСтр("ru = 'Обмен данными'", "ru"), , + НСтр("ru = 'Осуществляется создание начального образа...'", "ru"), + БиблиотекаКартинок.СоздатьНачальныйОбраз); + ВременнаяСсылка = Неопределено; + Если ВидБазы = 0 Тогда + + Если МожноСоздатьФайловуюБазу = Ложь Тогда + + ВызватьИсключение НСтр("ru = 'Создание начального образа файловой информационной базы на данной платформе не поддерживается.'", "ru"); + + КонецЕсли; + + Если Не ОбменФайлами.СоздатьФайловыйНачальныйОбразНаСервере(Узел, УникальныйИдентификатор, Язык, ПолноеИмяФайловойБазыWindows, ПолноеИмяФайловойБазыLinux, ПутьКАрхивуСФайламиТомовWindows, ПутьКАрхивуСФайламиТомовLinux) Тогда + Состояние(); + Возврат; + КонецЕсли; + + Иначе + СтрокаСоединения = "Srvr=""" + Сервер + """;" + + "Ref=""" + ИмяБазы + """;" + + "DBMS=""" + ТипСУБД + """;" + + "DBSrvr=""" + СерверБазыДанных + """;" + + "DB=""" + ИмяБазыДанных + """;" + + "DBUID=""" + ПользовательБазыДанных + """;" + + "DBPwd=""" + ПарольПользователя + """;" + + "SQLYOffs=""" + СмещениеДат + """;" + + "Locale=""" + Язык + """;"; + Если Не ОбменФайлами.СоздатьСерверныйНачальныйОбразНаСервере(Узел, СтрокаСоединения, ПутьКАрхивуСФайламиТомовWindows, ПутьКАрхивуСФайламиТомовLinux) Тогда + Состояние(); + Возврат; + КонецЕсли; + + КонецЕсли; + + Предупреждение(НСтр("ru = 'Создание начального образа успешно завершено.'", "ru")); +КонецПроцедуры + diff --git a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/СозданиеНачальногоОбразаСФайлами.mdo b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/СозданиеНачальногоОбразаСФайлами.mdo new file mode 100644 index 000000000..e65b8783f --- /dev/null +++ b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/СозданиеНачальногоОбразаСФайлами.mdo @@ -0,0 +1,11 @@ + + + СозданиеНачальногоОбразаСФайлами + + ru + Создание начального образа с файлами + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonForms/СтруктураПодчиненности/ConditionalAppearance.dcssca b/SSL/src/CommonForms/СтруктураПодчиненности/ConditionalAppearance.dcssca new file mode 100644 index 000000000..e24e58636 --- /dev/null +++ b/SSL/src/CommonForms/СтруктураПодчиненности/ConditionalAppearance.dcssca @@ -0,0 +1,23 @@ + + + + + + ТаблицаДокументов + + + + + ДеревоСтруктурыПодчиненности.Ссылка + Equal + ДокументСсылка + + + + + Шрифт + + + + + diff --git a/SSL/src/CommonForms/СтруктураПодчиненности/Form.form b/SSL/src/CommonForms/СтруктураПодчиненности/Form.form new file mode 100644 index 000000000..fa491c6da --- /dev/null +++ b/SSL/src/CommonForms/СтруктураПодчиненности/Form.form @@ -0,0 +1,512 @@ + + + + <key>ru</key> + <value>Структура подчиненности</value> + + + ГруппаОтчет + 14 + + ТаблицаОтчета + 15 + true + true + + true + + + ТаблицаОтчета + + None + + ТаблицаОтчетаРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ТаблицаОтчетаКонтекстноеМеню + 16 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + 50 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + true + Always + Auto + true + + + true + true + + true + + + ГруппаОтчетРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + Top + true + + ФормаКоманднаяПанель + -1 + + Обновить + 10 + true + true + + true + + false + + ОбновитьРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.Command.Обновить + Normal + PictureAndText + true + true + UserCmds + + StdPicture.Refresh + + Auto + + + ВывестиДляТекущего + 11 + true + true + + true + + false + + ВывестиДляТекущегоРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + Form.Command.ВывестиДляТекущего + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ДеревоПодчиненныеДокументы + + <key>ru</key> + <value>Дерево подчиненные документы</value> + + 1 + + ValueTree + + + true + + + true + + + Представление + + <key>ru</key> + <value>Представление</value> + + 1 + + String + + + + true + + + true + + + + СуммаДокумента + + <key>ru</key> + <value>Сумма документа</value> + + 2 + + Number + + 15 + 2 + + + + true + + + true + + + + Валюта + + <key>ru</key> + <value>Валюта</value> + + 3 + + String + + + + true + + + true + + + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 4 + + DocumentRef + + + true + + + true + + + + Проведен + + <key>ru</key> + <value>Проведен</value> + + 5 + + Boolean + + + true + + + true + + + + ПометкаУдаления + + <key>ru</key> + <value>Пометка удаления</value> + + 6 + + Boolean + + + true + + + true + + + + + ДокументСсылка + + <key>ru</key> + <value>Документ ссылка</value> + + 2 + + DocumentRef + + + true + + + true + + + + ИсходныйДокумент + + <key>ru</key> + <value>Исходный документ</value> + + 3 + + DocumentRef + + + true + + + true + + + + ТаблицаОтчета + + <key>ru</key> + <value>Таблица отчета</value> + + 4 + + SpreadsheetDocument + + + true + + + true + + + + + ДеревоРодительскиеДокументы + 5 + + ValueTree + + + true + + + true + + + Представление + + <key>ru</key> + <value>Представление</value> + + 1 + + String + + + + true + + + true + + + + СуммаДокумента + + <key>ru</key> + <value>Сумма документа</value> + + 2 + + Number + + 15 + 2 + + + + true + + + true + + + + Валюта + + <key>ru</key> + <value>Валюта</value> + + 3 + + String + + + + true + + + true + + + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 4 + + DocumentRef + + + true + + + true + + + + Проведен + + <key>ru</key> + <value>Проведен</value> + + 5 + + Boolean + + + true + + + true + + + + ПометкаУдаления + + <key>ru</key> + <value>Пометка удаления</value> + + 6 + + Boolean + + + true + + + true + + + + + Обновить + + <key>ru</key> + <value>Обновить</value> + + 1 + + ru + Обновить + + + true + + + + Обновить + + + Auto + Auto + + + ВывестиДляТекущего + + <key>ru</key> + <value>Вывести для текущего</value> + + 2 + + ru + Вывести для текущего + + + true + + + + ВывестиДляТекущего + + + Auto + Auto + + + + + + diff --git a/SSL/src/CommonForms/СтруктураПодчиненности/Help/ru.html b/SSL/src/CommonForms/СтруктураПодчиненности/Help/ru.html new file mode 100644 index 000000000..6b082495c --- /dev/null +++ b/SSL/src/CommonForms/СтруктураПодчиненности/Help/ru.html @@ -0,0 +1,6 @@ + +

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

    +

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

    +

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

    +

    Для того, чтобы обновить отчёт используйте кнопку Обновить.

    +

     

    \ 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..c006f0e51 --- /dev/null +++ b/SSL/src/CommonForms/СтруктураПодчиненности/Module.bsl @@ -0,0 +1,709 @@ +&НаСервере +Перем мКэшРеквизитовДокумента; + +////////////////////////////////////////////////////////////////////////////////////////////// +// Процедуры вывода в табличный документ. + +// Выводит дерево подчиненности в табличный документ +&НаСервере +Процедура ВывестиТабличныйДокумент() + + ТаблицаОтчета.Очистить(); + + Макет = ПолучитьОбщийМакет("СтруктураПодчиненности"); + + ВывестиРодительскиеЭлементыДерева(ДеревоРодительскиеДокументы.ПолучитьЭлементы(),Макет,1); + ВывестиТекущийДокумент(Макет); + ВывестиПодчиненныеЭлементыДерева(ДеревоПодчиненныеДокументы.ПолучитьЭлементы(),Макет,1) + +КонецПроцедуры // + +// Выводит строки дерева родительских документов +// +// Параметры +// СтрокиДерева - ДанныеФормыКоллекцияЭлементовДерева - строки дерева +// которые выводятся в табличный документ +// Макет - МакетТабличногоДокумента - макет, на основании которого +// происходит вывод в табличный документ +// УровеньРекурсии - Число - уровень рекурсии процедуры +// +&НаСервере +Процедура ВывестиРодительскиеЭлементыДерева(СтрокиДерева,Макет,УровеньРекурсии) + + Счётчик = СтрокиДерева.Количество(); + Пока Счётчик >0 Цикл + + ТекущаяСтрокаДерева = СтрокиДерева.Получить(Счётчик -1); + ПодчиненныеЭлементыСтрокиДерева = ТекущаяСтрокаДерева.ПолучитьЭлементы(); + ВывестиРодительскиеЭлементыДерева(ПодчиненныеЭлементыСтрокиДерева,Макет,УровеньРекурсии + 1); + + Для инд=1 По УровеньРекурсии Цикл + + Если инд = УровеньРекурсии Тогда + + Если СтрокиДерева.Индекс(ТекущаяСтрокаДерева) < (СтрокиДерева.Количество()-1) Тогда + Область = Макет.ПолучитьОбласть("КоннекторВерхПравоНиз"); + Иначе + Область = Макет.ПолучитьОбласть("КоннекторПравоНиз"); + КонецЕсли; + + Иначе + + Если НеобходимостьВыводаВертикальногоКоннектора(УровеньРекурсии - инд + 1,ТекущаяСтрокаДерева,Ложь) Тогда + Область = Макет.ПолучитьОбласть("КоннекторВерхНиз"); + Иначе + Область = Макет.ПолучитьОбласть("Отступ"); + + КонецЕсли; + + КонецЕсли; + + Если инд = 1 Тогда + ТаблицаОтчета.Вывести(Область); + Иначе + ТаблицаОтчета.Присоединить(Область); + КонецЕсли; + + КонецЦикла; + + ВывестиДокументИКартинку(ТекущаяСтрокаДерева,Макет,Ложь,Ложь); + + Счётчик = Счётчик - 1; + + КонецЦикла; + +КонецПроцедуры + +// Выводит в табличный документ картинку, соответствующую статусу документа и его представление +// +&НаСервере +Процедура ВывестиДокументИКартинку(СтрокаДерева,Макет,ЭтоТекущийДокумент = Ложь,ЭтоПодчиненный = Неопределено) + + //Вывод картинки + Если СтрокаДерева.Проведен Тогда + Если ЭтоПодчиненный = Неопределено Тогда + Если ДеревоПодчиненныеДокументы.ПолучитьЭлементы().Количество() И ДеревоРодительскиеДокументы.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПроведенКоннекторВерхНиз"); + ИначеЕсли ДеревоПодчиненныеДокументы.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПроведенКоннекторНиз"); + ИначеЕсли ДеревоРодительскиеДокументы.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПроведенКоннекторВерх"); + Иначе + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПроведенКоннекторВерх"); + КонецЕсли; + ИначеЕсли ЭтоПодчиненный = Истина Тогда + Если СтрокаДерева.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПроведенКоннекторЛевоНиз"); + Иначе + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПроведен"); + КонецЕсли; + Иначе + Если СтрокаДерева.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПроведенКоннекторЛевоВерх"); + Иначе + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПроведен"); + КонецЕсли; + КонецЕсли; + ИначеЕсли СтрокаДерева.ПометкаУдаления Тогда + Если ЭтоПодчиненный = Неопределено Тогда + Если ДеревоПодчиненныеДокументы.ПолучитьЭлементы().Количество() И ДеревоРодительскиеДокументы.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПомеченНаУдалениеКоннекторВерхНиз"); + ИначеЕсли ДеревоПодчиненныеДокументы.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПомеченНаУделениеКоннекторНиз"); + ИначеЕсли ДеревоРодительскиеДокументы.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПомеченНаУдалениеКоннекторВерх"); + Иначе + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПомеченНаУдалениеКоннекторВерх"); + КонецЕсли; + ИначеЕсли ЭтоПодчиненный = Истина Тогда + Если СтрокаДерева.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПомеченНаУдалениеКоннекторЛевоНиз"); + Иначе + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПомеченНаУдаление"); + КонецЕсли; + Иначе + Если СтрокаДерева.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПомеченНаУдалениеКоннекторЛевоВерх"); + Иначе + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументПомеченНаУдаление"); + КонецЕсли; + КонецЕсли; + Иначе + Если СтрокаДерева.Ссылка = ДокументСсылка Тогда + Если ДеревоПодчиненныеДокументы.ПолучитьЭлементы().Количество() И ДеревоРодительскиеДокументы.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументЗаписанКоннекторВерхНиз"); + ИначеЕсли ДеревоПодчиненныеДокументы.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументЗаписанКоннекторНиз"); + ИначеЕсли ДеревоРодительскиеДокументы.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументЗаписанКоннекторВерх"); + Иначе + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументЗаписанКоннекторВерх"); + КонецЕсли; + ИначеЕсли ЭтоПодчиненный = Истина Тогда + Если СтрокаДерева.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументЗаписанКоннекторЛевоНиз"); + Иначе + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументЗаписан"); + КонецЕсли; + Иначе + Если СтрокаДерева.ПолучитьЭлементы().Количество() Тогда + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументЗаписанКоннекторЛевоВерх"); + Иначе + ОбластьКартинка = Макет.ПолучитьОбласть("ДокументЗаписан"); + КонецЕсли; + КонецЕсли; + КонецЕсли; +// ОбластьКартинка.Параметры.Документ = СтрокаДерева.Ссылка; + Если ЭтоТекущийДокумент Тогда + ТаблицаОтчета.Вывести(ОбластьКартинка) + Иначе + ТаблицаОтчета.Присоединить(ОбластьКартинка); + КонецЕсли; + + + //Вывод документа + ОбластьДокумент = Макет.ПолучитьОбласть(?(ЭтоТекущийДокумент,"ТекущийДокумент","Документ")); + ОбластьДокумент.Параметры.ПредставлениеДокумента = ПолучитьПредставлениеДокументаДляПечати(СтрокаДерева); + ОбластьДокумент.Параметры.Документ = СтрокаДерева.Ссылка; + ТаблицаОтчета.Присоединить(ОбластьДокумент); + +КонецПроцедуры + +// Определяет необходимость вывода вертикального коннектора в табличный документ +// +// Параметры +// УровеньВверх - Число - на каком количестве уровней выше находится +// родитель от которого будет рисоваться вертикальный коннектор +// СтрокаДерева - ДанныеФормыЭлементДерева - исходная строка дерева значений +// от которой ведется отсчет. +// Возвращаемое значение: +// Булево - необходимость вывода в области вертиркального коннекотора +// +&НаСервере +Функция НеобходимостьВыводаВертикальногоКоннектора(УровеньВверх,СтрокаДерева,ИщемСредиПодчиненных = Истина) + + ТекущаяСтрока = СтрокаДерева; + + Для инд=1 По УровеньВверх Цикл + + ТекущаяСтрока = ТекущаяСтрока.ПолучитьРодителя(); + Если инд = УровеньВверх Тогда + ИскомыйРодитель = ТекущаяСтрока; + ИначеЕсли инд = (УровеньВверх-1) Тогда + ИскомаяСтрока = ТекущаяСтрока; + КонецЕсли; + + КонецЦикла; + + Если ИскомыйРодитель = Неопределено Тогда + Если ИщемСредиПодчиненных Тогда + ПодчиненныеЭлементыРодителя = ДеревоПодчиненныеДокументы.ПолучитьЭлементы(); + Иначе + ПодчиненныеЭлементыРодителя = ДеревоРодительскиеДокументы.ПолучитьЭлементы(); + КонецЕсли; + Иначе + ПодчиненныеЭлементыРодителя = ИскомыйРодитель.ПолучитьЭлементы(); + КонецЕсли; + + Возврат ПодчиненныеЭлементыРодителя.Индекс(ИскомаяСтрока) < (ПодчиненныеЭлементыРодителя.Количество()-1); + +КонецФункции + +// Выводит в табличный документ строку с документом, для которого формируется структура подчиненности +// +// Параметры +// Макет - МакетТабличногоДокумента - макет, на основании которого формирутеся табличный документ. +&НаСервере +Процедура ВывестиТекущийДокумент(Макет) + + + Выборка = ПолучитьВыборкуПоРеквизитамДокумента(ДокументСсылка); + Если Выборка.Следующий() Тогда + + ВывестиДокументИКартинку(Выборка,Макет,Истина); + + КонецЕсли; + +КонецПроцедуры + +// Формирует представление документа для вывода в табличный документ +// +// Параметры +// Выборка - ВыборкаИзРезульататаЗапроса или ДанныеФормыЭлементДерева - набор данных +// на основании которого формируется представление +// +// Возвращаемое значение: +// Строка - сформированное представление +// +&НаСервере +Функция ПолучитьПредставлениеДокументаДляПечати(Выборка) + + ПредставлениеДокумента = Выборка.Представление; + Если (Выборка.СуммаДокумента <> 0) И (Выборка.СуммаДокумента <> NULL) Тогда + ПредставлениеДокумента = ПредставлениеДокумента + НСтр("ru=' на сумму '") + Выборка.СуммаДокумента + " " + Выборка.Валюта + "."; + КонецЕсли; + + Возврат ПредставлениеДокумента; + +КонецФункции // () + +// Выводит строки дерева подчиненных документов +// +// Параметры +// СтрокиДерева - ДанныеФормыКоллекцияЭлементовДерева - строки дерева +// которые выводятся в табличный документ +// Макет - МакетТабличногоДокумента - макет, на основании которого +// происходит вывод в табличный документ +// УровеньРекурсии - Число - уровень рекурсии процедуры +// +&НаСервере +Процедура ВывестиПодчиненныеЭлементыДерева(СтрокиДерева,Макет,УровеньРекурсии) + + Для каждого СтрокаДерева Из СтрокиДерева Цикл + + ЭтоТекущийДокумент = (СтрокаДерева.Ссылка = ДокументСсылка); + ЭтоИсходныйДокумент = (СтрокаДерева.Ссылка = ИсходныйДокумент); + ПодчиненныеЭлементыДерева = СтрокаДерева.ПолучитьЭлементы(); + + //Вывод коннекторов + Для инд = 1 По УровеньРекурсии Цикл + Если УровеньРекурсии > инд Тогда + + Если НеобходимостьВыводаВертикальногоКоннектора(УровеньРекурсии - инд + 1,СтрокаДерева) Тогда + Область = Макет.ПолучитьОбласть("КоннекторВерхНиз"); + Иначе + Область = Макет.ПолучитьОбласть("Отступ"); + + КонецЕсли; + Иначе + + Если СтрокиДерева.Количество() > 1 И (СтрокиДерева.Индекс(СтрокаДерева)<> (СтрокиДерева.Количество()-1)) Тогда + Область = Макет.ПолучитьОбласть("КоннекторВерхПравоНиз"); + Иначе + Область = Макет.ПолучитьОбласть("КоннекторВерхПраво"); + КонецЕсли; + + КонецЕсли; + + Область.Параметры.Документ = ?(ЭтоИсходныйДокумент,Неопределено,СтрокаДерева.Ссылка); + + Если инд = 1 Тогда + ТаблицаОтчета.Вывести(Область); + Иначе + ТаблицаОтчета.Присоединить(Область); + КонецЕсли; + + КонецЦикла; + + ВывестиДокументИКартинку(СтрокаДерева,Макет,Ложь,Истина); + + //Вывод подчиненных элементов дерева + ВывестиПодчиненныеЭлементыДерева(ПодчиненныеЭлементыДерева,Макет,УровеньРекурсии + 1); + + КонецЦикла; + +КонецПроцедуры // () + +//Инициирует вывод в табличный документ и отображает его по окончанию формирования. +&НаКлиенте +Процедура ВывестиСтруктуруПодчиненности() + + ОбновитьДеревоСтруктурыПодчиненности(); + ТаблицаОтчета.Показать(); + +КонецПроцедуры + +////////////////////////////////////////////////////////////////////////////////////////////// +// Процедуры построения дерева подчиненности документов. + +&НаСервере +Процедура ОбновитьДеревоСтруктурыПодчиненности() + + Если ОсновнойДокументДоступен() Тогда + СформироватьДеревьяДокументов(); + ВывестиТабличныйДокумент(); + Иначе + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + Нстр("ru = 'Документ, для которого сформирован отчет о структуре подчиненности, стал недоступен.'")); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура СформироватьДеревьяДокументов() + + ДеревоРодительскиеДокументы.ПолучитьЭлементы().Очистить(); + ДеревоПодчиненныеДокументы.ПолучитьЭлементы().Очистить(); + + мКэшРеквизитовДокумента = Новый Соответствие; + + ВывестиРодительскиеДокументы(ДокументСсылка,ДеревоРодительскиеДокументы); + ВывестиПодчиненныеДокументы(ДокументСсылка,ДеревоПодчиненныеДокументы); + +КонецПроцедуры + +&НаСервере +Функция ОсновнойДокументДоступен() + + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | 1 + |ИЗ + | Документ." + ДокументСсылка.Метаданные().Имя + " КАК Таб + |ГДЕ + | Таб.Ссылка = &ТекущийДокумент + |"); + Запрос.УстановитьПараметр("ТекущийДокумент", ДокументСсылка); + Возврат Не Запрос.Выполнить().Пустой(); + +КонецФункции + +// Получает выборку по реквзитам документа +// +// Параметры +// ДокументСсылка - ДокументСсылка - документ, значения реквзитов которого получаются запросом. +// +// Возвращаемое значение: +// ВыборкаИзРезультатаЗапроса +// +&НаСервере +Функция ПолучитьВыборкуПоРеквизитамДокумента(ДокументСсылка) + + МетаданныеДокумента = ДокументСсылка.Метаданные(); + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Ссылка, + | Проведен, + | ПометкаУдаления, + | #Сумма, + | #Валюта, + | Представление + |ИЗ + | Документ." + МетаданныеДокумента.Имя + " + |ГДЕ + | Ссылка = &Ссылка + |"; + ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеДокумента, "#Сумма", "СуммаДокумента"); + ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеДокумента, "#Валюта", "Валюта"); + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Ссылка", ДокументСсылка); + Возврат Запрос.Выполнить().Выбрать(); + +КонецФункции // () + +&НаСервере +Процедура ВывестиРодительскиеДокументы(ТекущийДокумент,ДеревоРодитель) + + СтрокиДерева = ДеревоРодитель.ПолучитьЭлементы(); + МетаданныеДокумента = ТекущийДокумент.Метаданные(); + СписокРеквизитов = Новый СписокЗначений; + + Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл + + Для Каждого ТекущийТип Из Реквизит.Тип.Типы() Цикл + + МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип); + + Если МетаданныеРеквизита <> Неопределено + И Метаданные.Документы.Содержит(МетаданныеРеквизита) + И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда + + ЗначениеРеквизита = ТекущийДокумент[Реквизит.Имя]; + + Если ЗначениеЗаполнено(ЗначениеРеквизита) + И ТипЗнч(ЗначениеРеквизита) = ТекущийТип + И СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда + + СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс")); + + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл + СтрРеквизитов = ""; + + СодержимоеТЧ = ТекущийДокумент[ТЧ.Имя].Выгрузить(); + + Для Каждого Реквизит Из ТЧ.Реквизиты Цикл + + Для Каждого ТекущийТип Из Реквизит.Тип.Типы() Цикл + + МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип); + + Если МетаданныеРеквизита<>Неопределено + И Метаданные.Документы.Содержит(МетаданныеРеквизита) + И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда + + СтрРеквизитов = СтрРеквизитов + ?(СтрРеквизитов = "", "", ", ") + Реквизит.Имя; + Прервать; + + КонецЕсли; + КонецЦикла; + КонецЦикла; + + СодержимоеТЧ.Свернуть(СтрРеквизитов); + Для Каждого КолонкаТЧ ИЗ СодержимоеТЧ.Колонки Цикл + + Для Каждого СтрокаТЧ ИЗ СодержимоеТЧ Цикл + + ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя]; + + МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеРеквизита)); + Если МетаданныеЗначения <> Неопределено Тогда + + Если ЗначениеЗаполнено(ЗначениеРеквизита) + И Метаданные.Документы.Содержит(МетаданныеЗначения) Тогда + + Если СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда + + СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс")); + + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЦикла; + КонецЦикла; + + СписокРеквизитов.СортироватьПоПредставлению(); + + Для каждого ЭлементСписка Из СписокРеквизитов Цикл + + Выборка = ПолучитьВыборкуПоРеквизитамДокумента(ЭлементСписка.Значение); + + Если Выборка.Следующий() Тогда + СтрокаДерева = ДобавитьСтрокуВДерево(СтрокиДерева, Выборка); + Если НЕ ДобавляемыйДокументИмеетсяСредиРодителей(ДеревоРодитель,ЭлементСписка.Значение) Тогда + ВывестиРодительскиеДокументы(ЭлементСписка.Значение,СтрокаДерева); + КонецЕсли; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Определяет наличие документа среди родителей строки дерева, которая возомжно будет добавлена +// +// Параметры +// СтрокаРодитель - ДанныеФормыДерево,ДанныеФормыЭлементДерева - родитель, для +// которого предполагается добавить строку дерева. +// ДокументСсылка - Документ - документ, на наличие которого выполняется проверка +// +// Возвращаемое значение: +// Булево - Истина если найден, Ложь в обратном случае. +// +Функция ДобавляемыйДокументИмеетсяСредиРодителей(СтрокаРодитель,ИскомыйДокумент) + + Если ИскомыйДокумент = ДокументСсылка Тогда + Возврат Истина; + КонецЕсли; + + Если ТипЗнч(СтрокаРодитель) = Тип("ДанныеФормыДерево") Тогда + Возврат Ложь; + КонецЕсли; + + ТекущийРодитель = СтрокаРодитель; + Пока ТекущийРодитель <> Неопределено Цикл + Если ТекущийРодитель.Ссылка = ИскомыйДокумент Тогда + Возврат Истина; + КонецЕсли; + ТекущийРодитель = ТекущийРодитель.ПолучитьРодителя(); + КонецЦикла; + + Возврат Ложь; + +КонецФункции // () + + +&НаСервере +Процедура ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеДокумента, ЧтоЗаменять, ИмяРеквизита) + + Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЧтоЗаменять, ИмяРеквизита + " КАК " + ИмяРеквизита); + + Иначе + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЧтоЗаменять, " NULL КАК " + ИмяРеквизита); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ДополнитьКэшМетаданных(МетаданныеДокумента, ИмяДокумента) + + РеквизитыДокумента = мКэшРеквизитовДокумента[ИмяДокумента]; + Если РеквизитыДокумента = Неопределено Тогда + + РеквизитыДокумента = Новый Соответствие; + РеквизитыДокумента.Вставить("СуммаДокумента", МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено); + РеквизитыДокумента.Вставить("Валюта", МетаданныеДокумента.Реквизиты.Найти("Валюта") <> Неопределено); + + мКэшРеквизитовДокумента.Вставить(ИмяДокумента, РеквизитыДокумента); + + КонецЕсли; + +КонецПроцедуры + + +&НаСервере +Функция ПолучитьСписокДокументовПоКритериюОтбора(ЗначениеКритерияОтбора) + + Если Метаданные.КритерииОтбора.СвязанныеДокументы.Тип.СодержитТип(ТипЗнч(ЗначениеКритерияОтбора)) Тогда + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | СвязанныеДокументы.Ссылка + |ИЗ + | КритерийОтбора.СвязанныеДокументы(&ЗначениеКритерияОтбора) КАК СвязанныеДокументы"; + + Запрос.УстановитьПараметр("ЗначениеКритерияОтбора",ЗначениеКритерияОтбора); + Возврат Запрос.Выполнить().Выгрузить(); + + Иначе + + Возврат Неопределено; + + КонецЕсли; + +КонецФункции + +&НаСервере +Процедура ВывестиПодчиненныеДокументы(ТекущийДокумент,ДеревоРодитель) + + СтрокиДерева = ДеревоРодитель.ПолучитьЭлементы(); + Таблица = ПолучитьСписокДокументовПоКритериюОтбора(ТекущийДокумент); + Если Таблица = Неопределено Тогда + Возврат; + КонецЕсли; + + КэшПоТипамДокументов = Новый Соответствие; + + Для Каждого СтрокаТаблицы ИЗ Таблица Цикл + + МетаданныеДокумента = СтрокаТаблицы.Ссылка.Метаданные(); + Если Не ПравоДоступа("Чтение", МетаданныеДокумента) Тогда + Продолжить; + КонецЕсли; + + ИмяДокумента = МетаданныеДокумента.Имя; + ДополнитьКэшМетаданных(МетаданныеДокумента, ИмяДокумента); + + МассивСсылок = КэшПоТипамДокументов[ИмяДокумента]; + Если МассивСсылок = Неопределено Тогда + + МассивСсылок = Новый Массив; + КэшПоТипамДокументов.Вставить(ИмяДокумента, МассивСсылок); + + КонецЕсли; + + МассивСсылок.Добавить(СтрокаТаблицы.Ссылка); + + КонецЦикла; + + ЕСли КэшПоТипамДокументов.Количество() = 0 ТОгда + Возврат; + КонецЕсли; + + ТекстЗапросаНачало = "ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ ("; + ТекстЗапросаКонец = ") КАК ПодчиненныеДокументы УПОРЯДОЧИТЬ ПО ПодчиненныеДокументы.Дата"; + + Запрос = Новый Запрос; + Текст = ""; + Для Каждого КлючИЗначение Из КэшПоТипамДокументов Цикл + + Текст = Текст + ?(Текст = "", " ВЫБРАТЬ ", " ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ") + " + | Дата, + | Ссылка, + | Проведен, + | ПометкаУдаления, + |" + ?(мКэшРеквизитовДокумента[КлючИЗначение.Ключ]["СуммаДокумента"], "СуммаДокумента", "NULL") + " КАК СуммаДокумента, + |" + ?(мКэшРеквизитовДокумента[КлючИЗначение.Ключ]["Валюта"], "Валюта", "NULL") + " КАК Валюта, + | Представление + |ИЗ + | Документ." + КлючИЗначение.Ключ + " + |ГДЕ + | Ссылка В (&" + КлючИЗначение.Ключ + ")"; + + Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение); + + КонецЦикла; + + Запрос.Текст = ТекстЗапросаНачало + Текст + ТекстЗапросаКонец; + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + НоваяСтрока = ДобавитьСтрокуВДерево(СтрокиДерева, Выборка); + Если НЕ ДобавляемыйДокументИмеетсяСредиРодителей(ДеревоРодитель,Выборка.Ссылка) Тогда + ВывестиПодчиненныеДокументы(Выборка.Ссылка,НоваяСтрока) + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Функция ДобавитьСтрокуВДерево(СтрокиДерева, Выборка) + + НоваяСтрока = СтрокиДерева.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка, "Ссылка, Представление, СуммаДокумента, Валюта, Проведен, ПометкаУдаления"); + + Возврат НоваяСтрока; + +КонецФункции + +////////////////////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Параметры.Свойство("ОбъектОтбора", ДокументСсылка); + + ИсходныйДокумент = ДокументСсылка; + + Если ЗначениеЗаполнено(ДокументСсылка) Тогда + ОбновитьДеревоСтруктурыПодчиненности(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ТаблицаОтчета.Показать(); + +КонецПроцедуры + +////////////////////////////////////////////////////////////////////////////////////////////// +// Обработчики команд формы + +&НаКлиенте +Процедура Обновить(Команда) + + ВывестиСтруктуруПодчиненности(); + ТаблицаОтчета.Показать(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВывестиДляТекущего(Команда) + + ТекущийДокумент = Элементы.ТаблицаОтчета.ТекущаяОбласть.Расшифровка; + + Если ЗначениеЗаполнено(ТекущийДокумент) Тогда + ДокументСсылка = ТекущийДокумент; + Иначе + Возврат; + КонецЕсли; + + ВывестиСтруктуруПодчиненности(); + ТаблицаОтчета.Показать(); + +КонецПроцедуры diff --git a/SSL/src/CommonForms/СтруктураПодчиненности/СтруктураПодчиненности.mdo b/SSL/src/CommonForms/СтруктураПодчиненности/СтруктураПодчиненности.mdo new file mode 100644 index 000000000..1f7ffce0c --- /dev/null +++ b/SSL/src/CommonForms/СтруктураПодчиненности/СтруктураПодчиненности.mdo @@ -0,0 +1,15 @@ + + + СтруктураПодчиненности + + ru + Структура подчиненности + + + + ru + + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonForms/УправлениеОбменамиДанных/Form.form b/SSL/src/CommonForms/УправлениеОбменамиДанных/Form.form new file mode 100644 index 000000000..da934536b --- /dev/null +++ b/SSL/src/CommonForms/УправлениеОбменамиДанных/Form.form @@ -0,0 +1,1840 @@ + + + + <key>ru</key> + <value>Обмены данными</value> + + + СписокСостоянияУзлов + 1 + true + true + + true + + + СписокСостоянияУзлов + + false + None + Add + Change + Copy + Delete + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + СписокСостоянияУзловИмяПланаОбмена + 89 + true + true + + true + + + СписокСостоянияУзлов.ИмяПланаОбмена + + + СписокСостоянияУзловИмяПланаОбменаРасширеннаяПодсказка + 140 + Label + true + true + + Left + + + + СписокСостоянияУзловИмяПланаОбменаКонтекстноеМеню + 90 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + СписокСостоянияУзловУзелИнформационнойБазы + 10 + true + true + + true + + + СписокСостоянияУзлов.УзелИнформационнойБазы + + + СписокСостоянияУзловУзелИнформационнойБазыРасширеннаяПодсказка + 142 + Label + true + true + + Left + + + + СписокСостоянияУзловУзелИнформационнойБазыКонтекстноеМеню + 11 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ГруппаСостоянияЗагрузки + 40 + + СписокСостоянияУзловРезультатПоследнейЗагрузкиДанных + 8 + true + true + + true + + + СписокСостоянияУзлов.РезультатПоследнейЗагрузкиДанных + + None + + СписокСостоянияУзловРезультатПоследнейЗагрузкиДанныхРасширеннаяПодсказка + 145 + Label + true + true + + Left + + + + СписокСостоянияУзловРезультатПоследнейЗагрузкиДанныхКонтекстноеМеню + 9 + true + + PictureField + Auto + true + Left + true + + true + true + true + true + + CommonPicture.СостояниеОбменаДанными + + + + 1 + + + + + СписокСостоянияУзловДатаПоследнейЗагрузки + 38 + true + true + + true + + + СписокСостоянияУзлов.ДатаПоследнейЗагрузки + + + СписокСостоянияУзловДатаПоследнейЗагрузкиРасширеннаяПодсказка + 147 + Label + true + true + + Left + + + + СписокСостоянияУзловДатаПоследнейЗагрузкиКонтекстноеМеню + 39 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа состояния загрузки</value> + + + ru + Группа состояния загрузки + + + ГруппаСостоянияЗагрузкиРасширеннаяПодсказка + 144 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + СписокСостоянияУзловДатаПоследнейУспешнойЗагрузки + 12 + true + true + + true + + + СписокСостоянияУзлов.ДатаПоследнейУспешнойЗагрузки + + + СписокСостоянияУзловДатаПоследнейУспешнойЗагрузкиРасширеннаяПодсказка + 149 + Label + true + true + + Left + + + + СписокСостоянияУзловДатаПоследнейУспешнойЗагрузкиКонтекстноеМеню + 13 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ГруппаСостоянияВыгрузки + 41 + + СписокСостоянияУзловРезультатПоследнейВыгрузкиДанных + 6 + true + true + + true + + + СписокСостоянияУзлов.РезультатПоследнейВыгрузкиДанных + + None + + СписокСостоянияУзловРезультатПоследнейВыгрузкиДанныхРасширеннаяПодсказка + 152 + Label + true + true + + Left + + + + СписокСостоянияУзловРезультатПоследнейВыгрузкиДанныхКонтекстноеМеню + 7 + true + + PictureField + Auto + true + Left + true + + true + true + true + true + + CommonPicture.СостояниеОбменаДанными + + + + 1 + + + + + СписокСостоянияУзловДатаПоследнейВыгрузки + 36 + true + true + + true + + + СписокСостоянияУзлов.ДатаПоследнейВыгрузки + + + СписокСостоянияУзловДатаПоследнейВыгрузкиРасширеннаяПодсказка + 154 + Label + true + true + + Left + + + + СписокСостоянияУзловДатаПоследнейВыгрузкиКонтекстноеМеню + 37 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа состояния выгрузки</value> + + + ru + Группа состояния выгрузки + + + ГруппаСостоянияВыгрузкиРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + СписокСостоянияУзловДатаПоследнейУспешнойВыгрузки + 4 + true + true + + true + + + СписокСостоянияУзлов.ДатаПоследнейУспешнойВыгрузки + + + СписокСостоянияУзловДатаПоследнейУспешнойВыгрузкиРасширеннаяПодсказка + 156 + Label + true + true + + Left + + + + СписокСостоянияУзловДатаПоследнейУспешнойВыгрузкиКонтекстноеМеню + 5 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + СписокСостоянияУзловКоманднаяПанель + 3 + Left + true + + + Selection + СписокСостоянияУзловВыбор + + + СписокСостоянияУзловСтрокаПоиска + 131 + + СписокСостоянияУзловСтрокаПоискаРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + + СписокСостоянияУзловСтрокаПоискаКонтекстноеМеню + 132 + true + + СписокСостоянияУзлов + + true + + + + СписокСостоянияУзловСостояниеПросмотра + 134 + + СписокСостоянияУзловСостояниеПросмотраРасширеннаяПодсказка + 136 + Label + true + true + + Left + + + + СписокСостоянияУзловСостояниеПросмотраКонтекстноеМеню + 135 + true + + ViewStatusAddition + СписокСостоянияУзлов + + true + + + + СписокСостоянияУзловУправлениеПоиском + 137 + + СписокСостоянияУзловУправлениеПоискомРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + + СписокСостоянияУзловУправлениеПоискомКонтекстноеМеню + 138 + true + + SearchControlAddition + СписокСостоянияУзлов + + true + + + + СписокСостоянияУзловРасширеннаяПодсказка + 130 + Label + true + true + + Left + + + + СписокСостоянияУзловКонтекстноеМеню + 2 + + КонтекстноеМенюСписокСостоянияУзловСоздатьОбменСИнформационнойБазой + 67 + true + true + + true + + false + + КонтекстноеМенюСписокСостоянияУзловСоздатьОбменСИнформационнойБазойРасширеннаяПодсказка + 118 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСостоянияУзловИзменитьУзелИнформационнойБазы + 54 + true + true + + true + + false + + КонтекстноеМенюСписокСостоянияУзловИзменитьУзелИнформационнойБазыРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + Form.Command.ИзменитьУзелИнформационнойБазы + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСостоянияУзловКопироватьВБуферОбмена + 55 + true + true + + true + + false + + КонтекстноеМенюСписокСостоянияУзловКопироватьВБуферОбменаРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + Form.Item.СписокСостоянияУзлов.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСостоянияУзловВыделитьВсе + 56 + true + true + + true + + false + + КонтекстноеМенюСписокСостоянияУзловВыделитьВсеРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаКнопокВыполненияОбменаДанными + 101 + + ВыполнитьОбменДанными1 + 96 + true + true + + true + + false + + ВыполнитьОбменДанными1РасширеннаяПодсказка + 123 + Label + true + true + + Left + + + Form.Command.ВыполнитьОбменДанными + Normal + Auto + true + true + UserCmds + Auto + + + ВыполнитьОбменДаннымиИнтерактивно1 + 97 + true + true + + true + + + ВыполнитьОбменДаннымиИнтерактивно1РасширеннаяПодсказка + 124 + Label + true + true + + Left + + + Form.Command.ВыполнитьОбменДаннымиИнтерактивно + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа кнопок выполнения обмена данными</value> + + + ru + Группа кнопок выполнения обмена данными + + + ГруппаКнопокВыполненияОбменаДаннымиРасширеннаяПодсказка + 122 + Label + true + true + + Left + + + + + + СобытияЖурналаРегистрации + 86 + + КонтекстноеМенюСписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + 85 + true + true + + true + + false + + КонтекстноеМенюСписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийЗагрузкиДанныхРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + Form.Command.ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + 84 + true + true + + true + + false + + КонтекстноеМенюСписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийВыгрузкиДанныхРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + Form.Command.ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + СобытияЖурналаРегистрацииРасширеннаяПодсказка + 125 + Label + true + true + + Left + + + + + + ГруппаКнопокНастройкиРасписания + 104 + + НастроитьРасписаниеВыполненияОбмена1 + 105 + true + true + + true + + + НастроитьРасписаниеВыполненияОбмена1РасширеннаяПодсказка + 129 + Label + true + true + + Left + + + Form.Command.НастроитьРасписаниеВыполненияОбмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа кнопок настройки расписания</value> + + + ru + Группа кнопок настройки расписания + + + ГруппаКнопокНастройкиРасписанияРасширеннаяПодсказка + 128 + Label + true + true + + Left + + + + + + true + true + true + true + true + true + Row +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + +
    + + ФормаКоманднаяПанель + -1 + + ПодменюСоздать + 91 + true + true + + true + + + <key>ru</key> + <value>Создать</value> + + + ru + Подменю создать + + + ПодменюСоздатьРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + Popup + + + StdPicture.CreateListItem + + Auto + Normal + + + + ВыполнениеОбменаДанными + 94 + + ВыполнитьОбменДанными + 52 + true + true + + true + + false + + ВыполнитьОбменДаннымиРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + Form.Command.ВыполнитьОбменДанными + Normal + Auto + true + true + UserCmds + Auto + + + ВыполнитьОбменДаннымиИнтерактивно + 92 + true + true + + true + + + ВыполнитьОбменДаннымиИнтерактивноРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + Form.Command.ВыполнитьОбменДаннымиИнтерактивно + Normal + Auto + true + true + UserCmds + Auto + + + ВыполнениеОбменаДаннымиПодгруппа + 100 + + СписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + 99 + true + true + + true + + + СписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийЗагрузкиДанныхРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + Form.Command.ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + Normal + Auto + true + true + UserCmds + Auto + + + СписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + 98 + true + true + + true + + + СписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийВыгрузкиДанныхРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + Form.Command.ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Выполнение обмена данными подгруппа</value> + + + ru + Выполнение обмена данными подгруппа + + + ВыполнениеОбменаДаннымиПодгруппаРасширеннаяПодсказка + 110 + Label + true + true + + Left + + + + + + ВыполнениеОбменаДаннымиПодгруппаРасписания + 103 + + НастроитьРасписаниеВыполненияОбмена + 102 + true + true + + true + + + НастроитьРасписаниеВыполненияОбменаРасширеннаяПодсказка + 114 + Label + true + true + + Left + + + Form.Command.НастроитьРасписаниеВыполненияОбмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Выполнение обмена данными подгруппа расписания</value> + + + ru + Выполнение обмена данными подгруппа расписания + + + ВыполнениеОбменаДаннымиПодгруппаРасписанияРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>Выполнение обмена данными</value> + + + ru + Выполнение обмена данными + + + ВыполнениеОбменаДаннымиРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + Popup + + + CommonPicture.ВыполнитьЗапускОбменаДанными + + Auto + Normal + + + + СписокСостоянияУзловИзменитьУзелИнформационнойБазы + 53 + true + true + + true + + true + Role.ДобавлениеИзменениеОбменовДанными + + + false + + СписокСостоянияУзловИзменитьУзелИнформационнойБазыРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + Form.Command.ИзменитьУзелИнформационнойБазы + Normal + Auto + true + true + UserCmds + Auto + + + ОбновитьМонитор + 16 + true + true + + true + + false + + ОбновитьМониторРасширеннаяПодсказка + 116 + Label + true + true + + Left + + + Form.Command.ОбновитьМонитор + Normal + Auto + true + true + UserCmds + Auto + + + СписокСостоянияУзловОткрытьСписокУзловПланаОбмена + 71 + true + true + + true + + false + + СписокСостоянияУзловОткрытьСписокУзловПланаОбменаРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + Form.Command.ОткрытьСписокУзловПланаОбмена + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + 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 + + Date + + + + true + + + true + + + + РезультатПоследнейВыгрузкиДанных + 2 + + Number + + 1 + true + + + + true + + + true + + + + РезультатПоследнейЗагрузкиДанных + 3 + + Number + + 1 + true + + + + true + + + true + + + + УзелИнформационнойБазы + + <key>ru</key> + <value>Информационная база</value> + + 4 + + ExchangePlanRef + + + true + + + true + + + + ДатаПоследнейУспешнойЗагрузки + + <key>ru</key> + <value>Дата успешной загрузки</value> + + 5 + + Date + + + + true + + + true + + + + ДатаПоследнейЗагрузки + + <key>ru</key> + <value>Дата загрузки</value> + + 6 + + Date + + + + true + + + true + + + + ДатаПоследнейВыгрузки + + <key>ru</key> + <value>Дата выгрузки</value> + + 7 + + Date + + + + true + + + true + + + + ИмяПланаОбмена + + <key>ru</key> + <value>План обмена</value> + + 8 + + String + + + + true + + + true + + + + + ОбновитьМонитор + + <key>ru</key> + <value>Обновить</value> + + 1 + + ru + Обновить монитор + + + true + + F5 + + StdPicture.Refresh + + + + ОбновитьМонитор + + + Auto + Auto + + + ВыполнитьОбменДанными + + <key>ru</key> + <value>Выполнить автоматически</value> + + 3 + + ru + Выполнить обмен данными с информационной базой + + + true + + + StdPicture.GenerateReport + + + + ВыполнитьОбменДанными + + + TextPicture + Auto + Auto + + + ИзменитьУзелИнформационнойБазы + + <key>ru</key> + <value>Изменить</value> + + 4 + + ru + Изменить + + + + Role.Администрирование + + + Role.БазовыеПрава + + + Role.ВыводНаПринтерФайлБуферОбмена + + + Role.ВыполнениеОбменовДанными + + + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ДобавлениеИзменениеДополнительныхОтчетовИОбработок + + + Role.ИзменениеДополнительныхСведений + + + Role.ДобавлениеИзменениеЗаданий + + + true + Role.ДобавлениеИзменениеОбменовДанными + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеРолейИсполнителей + + + Role.ДобавлениеИзменениеФизическихЛиц + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИзменениеВыполнениеЗадач + + + Role.ИзменениеМакетовПечатныхФорм + + + Role.ИзменениеТекущегоВнешнегоПользователя + + + Role.ИзменениеТекущегоПользователя + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ИспользованиеДополнительныхОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + Role.ПолныеПрава + + + Role.ПроверкаДоступныхОбновленийКонфигурации + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеВнешнихПользователей + + + Role.ЧтениеДополнительныхСведений + + + Role.ЧтениеЗаданий + + + Role.ЧтениеЗадач + + + Role.ЧтениеОтветовНаВопросыАнкет + + + Role.ЧтениеПерсональныхДанныхФизическихЛиц + + + + StdPicture.Change + + + + ИзменитьУзелИнформационнойБазы + + + Auto + Auto + + + ОткрытьСписокУзловПланаОбмена + + <key>ru</key> + <value>Список узлов плана обмена</value> + + 11 + + ru + Список узлов плана обмена + + + + Role.Администрирование + + + Role.БазовыеПрава + + + Role.ВыводНаПринтерФайлБуферОбмена + + + Role.ВыполнениеОбменовДанными + + + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВариантовОтчетов + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ДобавлениеИзменениеДополнительныхОтчетовИОбработок + + + Role.ДобавлениеИзменениеЗаданий + + + true + Role.ДобавлениеИзменениеОбменовДанными + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеРолейИсполнителей + + + Role.ДобавлениеИзменениеФизическихЛиц + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИзменениеВыполнениеЗадач + + + Role.ИзменениеДополнительныхСведений + + + Role.ИзменениеМакетовПечатныхФорм + + + Role.ИзменениеТекущегоВнешнегоПользователя + + + Role.ИзменениеТекущегоПользователя + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ИспользованиеДополнительныхОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + Role.ПолныеПрава + + + Role.ПроверкаДоступныхОбновленийКонфигурации + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеВнешнихПользователей + + + Role.ЧтениеДополнительныхСведений + + + Role.ЧтениеЗаданий + + + Role.ЧтениеЗадач + + + Role.ЧтениеОтветовНаВопросыАнкет + + + Role.ЧтениеПерсональныхДанныхФизическихЛиц + + + + + ОткрытьСписокУзловПланаОбмена + + + Auto + Auto + + + ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + + <key>ru</key> + <value>События загрузки данных</value> + + 7 + + ru + Перейти в журнал регистрации событий загрузки данных + + + true + + + + ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + + + Auto + Auto + + + ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + + <key>ru</key> + <value>События выгрузки данных</value> + + 8 + + ru + Перейти в журнал регистрации событий загрузки данных + + + true + + + + ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + + + Auto + Auto + + + ВыполнитьОбменДаннымиИнтерактивно + + <key>ru</key> + <value>Выполнить интерактивно...</value> + + 2 + + ru + Выполнить обмен данными интерактивно + + + true + + + StdPicture.SyncContents + + + + ВыполнитьОбменДаннымиИнтерактивно + + + TextPicture + Auto + Auto + + + НастроитьРасписаниеВыполненияОбмена + + <key>ru</key> + <value>Настроить сценарии обмена данными...</value> + + 5 + + ru + Настроить расписание выполнения обмена + + + true + + + StdPicture.ScheduledJob + + + + НастроитьРасписаниеВыполненияОбмена + + + Auto + Auto + + + + + +
    diff --git a/SSL/src/CommonForms/УправлениеОбменамиДанных/Help/ru.html b/SSL/src/CommonForms/УправлениеОбменамиДанных/Help/ru.html new file mode 100644 index 000000000..2a27acc68 --- /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 new file mode 100644 index 000000000..e515dda75 --- /dev/null +++ b/SSL/src/CommonForms/УправлениеОбменамиДанных/Module.bsl @@ -0,0 +1,411 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СписокПлановОбмена = ОбменДаннымиПовтИсп.ПолучитьСписокПлановОбменаКонфигурацииВерсии30(); + + Если СписокПлановОбмена.Количество() = 0 Тогда + + НСтрока = НСтр("ru = 'В конфигурации не задано ни одного плана обмена! Монитор обменов данными не может быть использован.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,,, Отказ); + Возврат; + КонецЕсли; + + ОбновитьСписокСостоянияУзлов(); + + Если ОбменДаннымиСервер.РольДоступнаДобавлениеИзменениеОбменовДанными() Тогда + + ДобавитьКомандыСозданияНовогоОбмена(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ВыполненОбменДанными" + ИЛИ ИмяСобытия = "ЗакрытаФормаСценарияОбменаДанными" + ИЛИ ИмяСобытия = "ЗакрытаФормаУзлаПланаОбмена" + ИЛИ ИмяСобытия = "ЗакрытаФормаПомощникаСопоставленияОбъектов" + ИЛИ ИмяСобытия = "ЗакрытаФормаПомощникаСозданияОбменаДанными" Тогда + + // обновляем данные монитора + ОбновитьМонитор(); + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ВыполнитьОбменДанными(Команда) + + ТекущиеДанные = Элементы.СписокСостоянияУзлов.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ОбменДаннымиКлиент.ВыполнитьОбменДаннымиОбработкаКоманды(ТекущиеДанные.УзелИнформационнойБазы, ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьОбменДаннымиИнтерактивно(Команда) + + ТекущиеДанные = Элементы.СписокСостоянияУзлов.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ОбменДаннымиКлиент.ОткрытьПомощникСопоставленияОбъектовОбработкаКоманды(ТекущиеДанные.УзелИнформационнойБазы, ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьРасписаниеВыполненияОбмена(Команда) + + ТекущиеДанные = Элементы.СписокСостоянияУзлов.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ОбменДаннымиКлиент.ОбработкаКомандыНастроитьРасписаниеВыполненияОбмена(ТекущиеДанные.УзелИнформационнойБазы, ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьМонитор(Команда = Неопределено) + + ИндексСтрокиСписокСостоянияУзлов = ПолучитьТекущийИндексСтроки("СписокСостоянияУзлов"); + + // выполняем обновление таблиц монитора на сервере + ОбновитьСписокСостоянияУзлов(); + + // выполняем позиционирование курсора + ВыполнитьПозиционированиеКурсора("СписокСостоянияУзлов", ИндексСтрокиСписокСостоянияУзлов); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьУзелИнформационнойБазы(Команда) + + ТекущиеДанные = Элементы.СписокСостоянияУзлов.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ОткрытьЗначение(ТекущиеДанные.УзелИнформационнойБазы); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокСостоянияУзловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ИзменитьУзелИнформационнойБазы(Неопределено); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСписокУзловПланаОбмена(Команда) + + ТекущиеДанные = Элементы.СписокСостоянияУзлов.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(ТекущиеДанные.УзелИнформационнойБазы); + + ИмяФормыСписка = "ПланОбмена.[ИмяПланаОбмена].ФормаСписка"; + ИмяФормыСписка = СтрЗаменить(ИмяФормыСписка, "[ИмяПланаОбмена]", ИмяПланаОбмена); + + ОткрытьФорму(ИмяФормыСписка,,ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных(Команда) + + ТекущиеДанные = Элементы.СписокСостоянияУзлов.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(ТекущиеДанные.УзелИнформационнойБазы, ЭтаФорма, "ЗагрузкаДанных"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных(Команда) + + ТекущиеДанные = Элементы.СписокСостоянияУзлов.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(ТекущиеДанные.УзелИнформационнойБазы, ЭтаФорма, "ВыгрузкаДанных"); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ОбновитьСписокСостоянияУзлов() + + ТекстЗапроса = " + | + |[ПланыОбменаКонфигурации] + | + |//////////////////////////////////////////////////////////////////////////////// {СостояниеОбменовДаннымиЗагрузка} + |ВЫБРАТЬ + | СостояниеОбменовДанными.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | СостояниеОбменовДанными.ДатаОкончания КАК ДатаОкончания, + | ВЫБОР + | КОГДА СостояниеОбменовДанными.РезультатВыполненияОбмена = ЗНАЧЕНИЕ(Перечисление.РезультатыВыполненияОбмена.Предупреждение_СообщениеОбменаБылоРанееПринято) + | ТОГДА 3 + | КОГДА СостояниеОбменовДанными.РезультатВыполненияОбмена = ЗНАЧЕНИЕ(Перечисление.РезультатыВыполненияОбмена.Выполнено) + | ТОГДА 2 + | ИНАЧЕ 1 + | КОНЕЦ КАК РезультатВыполненияОбмена + |ПОМЕСТИТЬ СостояниеОбменовДаннымиЗагрузка + |ИЗ + | РегистрСведений.СостояниеОбменовДанными КАК СостояниеОбменовДанными + |ГДЕ + | СостояниеОбменовДанными.ДействиеПриОбмене = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ЗагрузкаДанных) + |; + | + |//////////////////////////////////////////////////////////////////////////////// {СостояниеОбменовДаннымиВыгрузка} + |ВЫБРАТЬ + | СостояниеОбменовДанными.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | СостояниеОбменовДанными.ДатаОкончания КАК ДатаОкончания, + | ВЫБОР + | КОГДА СостояниеОбменовДанными.РезультатВыполненияОбмена = ЗНАЧЕНИЕ(Перечисление.РезультатыВыполненияОбмена.Предупреждение_СообщениеОбменаБылоРанееПринято) + | ТОГДА 3 + | КОГДА СостояниеОбменовДанными.РезультатВыполненияОбмена = ЗНАЧЕНИЕ(Перечисление.РезультатыВыполненияОбмена.Выполнено) + | ТОГДА 2 + | ИНАЧЕ 1 + | КОНЕЦ КАК РезультатВыполненияОбмена + |ПОМЕСТИТЬ СостояниеОбменовДаннымиВыгрузка + |ИЗ + | РегистрСведений.СостояниеОбменовДанными КАК СостояниеОбменовДанными + |ГДЕ + | СостояниеОбменовДанными.ДействиеПриОбмене = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ВыгрузкаДанных) + |; + | + |//////////////////////////////////////////////////////////////////////////////// {СостояниеУспешныхОбменовДаннымиЗагрузка} + |ВЫБРАТЬ + | СостояниеУспешныхОбменовДанными.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | СостояниеУспешныхОбменовДанными.ДатаОкончания КАК ДатаОкончания + |ПОМЕСТИТЬ СостояниеУспешныхОбменовДаннымиЗагрузка + |ИЗ + | РегистрСведений.СостояниеУспешныхОбменовДанными КАК СостояниеУспешныхОбменовДанными + |ГДЕ + | СостояниеУспешныхОбменовДанными.ДействиеПриОбмене = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ЗагрузкаДанных) + |; + | + |//////////////////////////////////////////////////////////////////////////////// {СостояниеУспешныхОбменовДаннымиВыгрузка} + |ВЫБРАТЬ + | СостояниеУспешныхОбменовДанными.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | СостояниеУспешныхОбменовДанными.ДатаОкончания КАК ДатаОкончания + |ПОМЕСТИТЬ СостояниеУспешныхОбменовДаннымиВыгрузка + |ИЗ + | РегистрСведений.СостояниеУспешныхОбменовДанными КАК СостояниеУспешныхОбменовДанными + |ГДЕ + | СостояниеУспешныхОбменовДанными.ДействиеПриОбмене = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ВыгрузкаДанных) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПланыОбмена.ИмяПланаОбмена КАК ИмяПланаОбмена, + | ПланыОбмена.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | ЕСТЬNULL(СостояниеОбменовДаннымиВыгрузка.РезультатВыполненияОбмена, 0) КАК РезультатПоследнейВыгрузкиДанных, + | ЕСТЬNULL(СостояниеОбменовДаннымиЗагрузка.РезультатВыполненияОбмена, 0) КАК РезультатПоследнейЗагрузкиДанных, + | СостояниеОбменовДаннымиЗагрузка.ДатаОкончания КАК ДатаПоследнейЗагрузки, + | СостояниеОбменовДаннымиВыгрузка.ДатаОкончания КАК ДатаПоследнейВыгрузки, + | СостояниеУспешныхОбменовДаннымиЗагрузка.ДатаОкончания КАК ДатаПоследнейУспешнойЗагрузки, + | СостояниеУспешныхОбменовДаннымиВыгрузка.ДатаОкончания КАК ДатаПоследнейУспешнойВыгрузки + |ИЗ + | ПланыОбменаКонфигурации КАК ПланыОбмена + | + | ЛЕВОЕ СОЕДИНЕНИЕ СостояниеОбменовДаннымиЗагрузка КАК СостояниеОбменовДаннымиЗагрузка + | ПО ПланыОбмена.УзелИнформационнойБазы = СостояниеОбменовДаннымиЗагрузка.УзелИнформационнойБазы + | + | ЛЕВОЕ СОЕДИНЕНИЕ СостояниеОбменовДаннымиВыгрузка КАК СостояниеОбменовДаннымиВыгрузка + | ПО ПланыОбмена.УзелИнформационнойБазы = СостояниеОбменовДаннымиВыгрузка.УзелИнформационнойБазы + | + | ЛЕВОЕ СОЕДИНЕНИЕ СостояниеУспешныхОбменовДаннымиЗагрузка КАК СостояниеУспешныхОбменовДаннымиЗагрузка + | ПО ПланыОбмена.УзелИнформационнойБазы = СостояниеУспешныхОбменовДаннымиЗагрузка.УзелИнформационнойБазы + | + | ЛЕВОЕ СОЕДИНЕНИЕ СостояниеУспешныхОбменовДаннымиВыгрузка КАК СостояниеУспешныхОбменовДаннымиВыгрузка + | ПО ПланыОбмена.УзелИнформационнойБазы = СостояниеУспешныхОбменовДаннымиВыгрузка.УзелИнформационнойБазы + | + |УПОРЯДОЧИТЬ ПО + | ПланыОбмена.ИмяПланаОбмена, + | ПланыОбмена.Наименование + |"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПланыОбменаКонфигурации]", ТекстЗапросаПоПланамОбменаКонфигурации()); + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + + Для Каждого Элемент ИЗ ОбменДаннымиПовтИсп.ПолучитьСписокПлановОбменаКонфигурации() Цикл + + ИмяПараметра = СтрЗаменить("ЭтотУзел[ИмяПланаОбмена]", "[ИмяПланаОбмена]", Элемент.Значение); + Запрос.УстановитьПараметр(ИмяПараметра, ПланыОбмена[Элемент.Значение].ЭтотУзел()); + + КонецЦикла; + + // обновляем данные в списке состояния узлов + СписокСостоянияУзлов.Загрузить(Запрос.Выполнить().Выгрузить()); + +КонецПроцедуры + +&НаСервере +Функция ТекстЗапросаПоПланамОбменаКонфигурации() + + ТекстЗапроса = ""; + + СписокПлановОбмена = ОбменДаннымиПовтИсп.ПолучитьСписокПлановОбменаКонфигурацииВерсии30(); + + Если СписокПлановОбмена.Количество() = 0 Тогда + Возврат ""; + КонецЕсли; + + ШаблонЗапроса = " + | + |ОБЪЕДИНИТЬ ВСЕ + | + |//////////////////////////////////////////////////////// {[ИмяПланаОбмена]} + |ВЫБРАТЬ + | Ссылка КАК УзелИнформационнойБазы, + | Наименование КАК Наименование, + | ""[ИмяПланаОбменаСиноним]"" КАК ИмяПланаОбмена + |ИЗ + | ПланОбмена.[ИмяПланаОбмена] + |ГДЕ + | Ссылка <> &ЭтотУзел[ИмяПланаОбмена] + | И НЕ ПометкаУдаления + |"; + + Для Каждого Элемент ИЗ СписокПлановОбмена Цикл + + ТекстЗапросаДляПланаОбмена = СтрЗаменить(ШаблонЗапроса, "[ИмяПланаОбмена]", Элемент.Значение); + ТекстЗапросаДляПланаОбмена = СтрЗаменить(ТекстЗапросаДляПланаОбмена, "[ИмяПланаОбменаСиноним]", Элемент.Представление); + + // удаляем литерал объединения для первой таблицы + Если ПустаяСтрока(ТекстЗапроса) Тогда + + ТекстЗапросаДляПланаОбмена = СтрЗаменить(ТекстЗапросаДляПланаОбмена, "ОБЪЕДИНИТЬ ВСЕ", ""); + + КонецЕсли; + + ТекстЗапроса = ТекстЗапроса + ТекстЗапросаДляПланаОбмена; + + КонецЦикла; + + // возвращаемое значение функции + ТекстЗапросаРезультат = " + |//////////////////////////////////////////////////////// {ПланыОбменаКонфигурации} + |ВЫБРАТЬ + | УзелИнформационнойБазы, + | Наименование, + | ИмяПланаОбмена + |ПОМЕСТИТЬ ПланыОбменаКонфигурации + |ИЗ + | ( + | [ТекстЗапроса] + | ) КАК ВложенныйЗапрос + |; + |"; + + ТекстЗапросаРезультат = СтрЗаменить(ТекстЗапросаРезультат, "[ТекстЗапроса]", ТекстЗапроса); + + Возврат ТекстЗапросаРезультат; +КонецФункции + +&НаСервере +Процедура ДобавитьКомандыСозданияНовогоОбмена() + + СписокПлановОбмена = ОбменДаннымиПовтИсп.ПолучитьСписокПлановОбменаКонфигурацииВерсии30(); + + Для Каждого Элемент ИЗ СписокПлановОбмена Цикл + + ИмяПланаОбмена = Элемент.Значение; + + МенеджерПланаОбмена = ПланыОбмена[ИмяПланаОбмена]; + + Если МенеджерПланаОбмена.ИспользоватьПомощникСозданияОбменаДанными() Тогда + + Команды.Добавить(ИмяПланаОбмена); + Команды[ИмяПланаОбмена].Заголовок = МенеджерПланаОбмена.ЗаголовокКомандыДляСозданияНовогоОбменаДанными(); + Команды[ИмяПланаОбмена].Действие = "ОткрытьПомощникНастройкиОбменаДанными"; + + Элементы.Добавить(ИмяПланаОбмена, Тип("КнопкаФормы"), Элементы.ПодменюСоздать); + Элементы[ИмяПланаОбмена].ИмяКоманды = ИмяПланаОбмена; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьТекущийИндексСтроки(ИмяТаблицы) + + // возвращаемое значение функции + ИндексСтроки = Неопределено; + + // при обновлении монитора выполняем позиционирование курсора + ТекущиеДанные = Элементы[ИмяТаблицы].ТекущиеДанные; + + Если ТекущиеДанные <> Неопределено Тогда + + ИндексСтроки = ЭтаФорма[ИмяТаблицы].Индекс(ТекущиеДанные); + + КонецЕсли; + + Возврат ИндексСтроки; +КонецФункции + +&НаКлиенте +Процедура ВыполнитьПозиционированиеКурсора(ИмяТаблицы, ИндексСтроки) + + Если ИндексСтроки <> Неопределено Тогда + + // выполняем проверки позиционирования курсора после получения новых данных + Если ЭтаФорма[ИмяТаблицы].Количество() <> 0 Тогда + + Если ИндексСтроки > ЭтаФорма[ИмяТаблицы].Количество() - 1 Тогда + + ИндексСтроки = ЭтаФорма[ИмяТаблицы].Количество() - 1; + + КонецЕсли; + + // позиционируем курсор + Элементы[ИмяТаблицы].ТекущаяСтрока = ЭтаФорма[ИмяТаблицы][ИндексСтроки].ПолучитьИдентификатор(); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьПомощникНастройкиОбменаДанными(Команда) + + ОбменДаннымиКлиент.ОткрытьПомощникНастройкиОбменаДанными(Команда.Имя); + +КонецПроцедуры diff --git a/SSL/src/CommonForms/УправлениеОбменамиДанных/УправлениеОбменамиДанных.mdo b/SSL/src/CommonForms/УправлениеОбменамиДанных/УправлениеОбменамиДанных.mdo new file mode 100644 index 000000000..e8e0d6f41 --- /dev/null +++ b/SSL/src/CommonForms/УправлениеОбменамиДанных/УправлениеОбменамиДанных.mdo @@ -0,0 +1,15 @@ + + + УправлениеОбменамиДанных + + ru + Управление обменами данных + + + + ru + + + PersonalComputer + MobileDevice + diff --git a/SSL/src/CommonForms/ФормаСертификатаЭЦП/Form.form b/SSL/src/CommonForms/ФормаСертификатаЭЦП/Form.form new file mode 100644 index 000000000..48c4c0816 --- /dev/null +++ b/SSL/src/CommonForms/ФормаСертификатаЭЦП/Form.form @@ -0,0 +1,414 @@ + + + + <key>ru</key> + <value>Сертификат ЭЦП</value> + + + КомуВыдан + 2 + true + true + + true + + + КомуВыдан + + + КомуВыданРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + КомуВыданКонтекстноеМеню + 3 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + КемВыдан + 4 + true + true + + true + + + КемВыдан + + + КемВыданРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + КемВыданКонтекстноеМеню + 5 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СрокДействия + 6 + true + true + + true + + + ДействителенДо + + + СрокДействияРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СрокДействияКонтекстноеМеню + 7 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Назначение + 8 + true + true + + true + + + Назначение + + + НазначениеРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + НазначениеКонтекстноеМеню + 9 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаЗакрыть + 1 + true + true + + true + + + ФормаЗакрытьРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.StandardCommand.Close + true + true + true + UserCmds + Auto + + + ФормаСохранить + 10 + true + true + + true + + + ФормаСохранитьРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + Form.Command.Сохранить + Normal + Auto + true + true + UserCmds + Auto + + + ФормаПроверить + 11 + true + true + + true + + + ФормаПроверитьРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + Form.Command.Проверить + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + 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 + + Date + + Date + + + + 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> + + 1 + + ru + Сохранить + + + true + + + + Сохранить + + + Auto + Auto + + + Проверить + + <key>ru</key> + <value>Проверить</value> + + 2 + + ru + Проверить + + + true + + + + Проверить + + + Auto + Auto + + + + + + diff --git a/SSL/src/CommonForms/ФормаСертификатаЭЦП/Help/ru.html b/SSL/src/CommonForms/ФормаСертификатаЭЦП/Help/ru.html new file mode 100644 index 000000000..d5fbe5e91 --- /dev/null +++ b/SSL/src/CommonForms/ФормаСертификатаЭЦП/Help/ru.html @@ -0,0 +1,8 @@ + +

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

    +

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

    +

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

    +

     

    +

    См. также:

    +
    +

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

    \ 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..3f95f5b42 --- /dev/null +++ b/SSL/src/CommonForms/ФормаСертификатаЭЦП/Module.bsl @@ -0,0 +1,83 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СтруктураСертификата = Параметры.СтруктураСертификата; + Отпечаток = Параметры.Отпечаток; + + КомуВыдан = СтруктураСертификата.КомуВыдан; + КемВыдан = СтруктураСертификата.КемВыдан; + ДействителенДо = СтруктураСертификата.ДействителенДо; + Назначение = СтруктураСертификата.Назначение; + + НовоеНазначение = ""; + ПисатьКодНазначения = Истина; + ОбщегоНазначения.ЗаполнитьНазначениеСертификата(Назначение, НовоеНазначение, ПисатьКодНазначения); + Назначение = НовоеНазначение; + +КонецПроцедуры + +&НаКлиенте +Процедура Сохранить(Команда) + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если РасширениеПодключено Тогда + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); + Фильтр = НСтр("ru = 'Все файлы(*.cer)|*.cer'"); + ДиалогОткрытияФайла.Фильтр = Фильтр; + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файл для сохранения сертификата'"); + Если ДиалогОткрытияФайла.Выбрать() Тогда + + ДвоичныеДанныеОтпечатка = Base64Значение(Отпечаток); + + МенеджерКриптографии = ЭлектронноЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + + ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(); + Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(ДвоичныеДанныеОтпечатка); + + Если Сертификат = Неопределено Тогда + Отказ = Истина; + Сообщить(НСтр("ru = 'Сертификат не найден'")); + Возврат; + КонецЕсли; + + Сертификат.Выгрузить(ДиалогОткрытияФайла.ПолноеИмяФайла); + + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сертификат ЭЦП сохранен в файл ""%1""'"), + ДиалогОткрытияФайла.ПолноеИмяФайла); + Состояние(Текст); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Проверить(Команда) + + ДвоичныеДанныеОтпечатка = Base64Значение(Отпечаток); + + МенеджерКриптографии = ЭлектронноЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + + ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(); + Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(ДвоичныеДанныеОтпечатка); + + Если Сертификат = Неопределено Тогда + Отказ = Истина; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю((НСтр("ru = 'Сертификат не найден'"))); + Возврат; + КонецЕсли; + + Попытка + МенеджерКриптографии.ПроверитьСертификат(Сертификат); + Предупреждение(НСтр("ru = 'Сертификат действителен'")); + Исключение + Текст = НСтр("ru = 'Сертификат не действителен.'") + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Предупреждение(Текст); + КонецПопытки; + +КонецПроцедуры diff --git a/SSL/src/CommonForms/ФормаСертификатаЭЦП/ФормаСертификатаЭЦП.mdo b/SSL/src/CommonForms/ФормаСертификатаЭЦП/ФормаСертификатаЭЦП.mdo new file mode 100644 index 000000000..ffbcc6495 --- /dev/null +++ b/SSL/src/CommonForms/ФормаСертификатаЭЦП/ФормаСертификатаЭЦП.mdo @@ -0,0 +1,16 @@ + + + ФормаСертификатаЭЦП + + ru + Форма сертификата ЭЦП + + + + ru + + + PersonalComputer + MobileDevice + true + diff --git a/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl new file mode 100644 index 000000000..00f88ecac --- /dev/null +++ b/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl @@ -0,0 +1,801 @@ +// Проверяет наличие обновлений адресного классификатора на веб сервере +// для тех объектов, которые ранее уже загружались (для тех объектов +// для которых есть запись в регистре ВерсииОбъектовАдресногоКлассификатора). +// +// Возвращаемое значение +// Массив структур, в котором каждая структура имеет формат: +// ключ КодАдресногоОбъекта - строка - код адресного объекта +// ключ Наименование - строка - наименование адресного объекта +// ключ Сокращение - строка - сокращение адресного объекта +// ключ Индекс - строка - индекс адресного объекта +// ключ ОбновлениеДоступно - Булево +// +Функция ПроверитьОбновлениеАдресныхОбъектов_Сервер() Экспорт + + Возврат АдресныйКлассификаторКлиентСервер.ПроверитьОбновлениеАдресныхОбъектов(); + +КонецФункции + +// Возвращает версию адресных объектов, записанную при последнем обновлении +// Если записи об адресном объекте нет - возвращается дата 01.09.2008 +// Возвращаемое значение +// Массив соответствий: ключ - номер адресного объекта, значение - дата выпуска версии +// +Функция ПолучитьВерсииАдресныхОбъектов() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = "Выбрать АдресныйОбъект, ДатаВыпускаВерсии + |ИЗ РегистрСведений.ВерсииОбъектовАдресногоКлассификатора"; + + ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); + + Результат = Новый Соответствие; + + Пока ВыборкаЗапроса.Следующий() Цикл + Результат.Вставить(ВыборкаЗапроса.АдресныйОбъект, ВыборкаЗапроса.ДатаВыпускаВерсии); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Блок экспортных функций, реализующих загрузку и очистку адресных сведений +// в регистре сведений АдресныйКлассификатор +// + +// Процедура для загрузки данных в КЛАДР +// +// Параметры: +// КодАдресногоОбъекта- строка - код адресного объекта в формате NN +// ПутьКДаннымНаСервере - Строка - путь к каталогу на сервере, в котором хранятся файлы кладр +// ЗагрузкаСВеб - булево - если Истина, данные загружаются с веб сервера 1С +// +Процедура ЗагрузитьКлассификаторПоАдресномуОбъекту(знач КодАдресногоОбъекта, + ПутьКДаннымНаСервере, + ЗагрузкаСВеб) Экспорт + + КодАдресногоОбъекта = Лев(КодАдресногоОбъекта, 2); + + АльтернативныеНазвания = Новый ТаблицаЗначений; + АльтернативныеНазвания.Колонки.Добавить("Код"); + АльтернативныеНазвания.Колонки.Добавить("Наименование"); + АльтернативныеНазвания.Колонки.Добавить("Сокращение"); + АльтернативныеНазвания.Колонки.Добавить("Индекс"); + + АдресныеСведения = Новый ТаблицаЗначений; + АдресныеСведения.Колонки.Добавить("Код"); + АдресныеСведения.Колонки.Добавить("КодАдресногоОбъектаВКоде"); + АдресныеСведения.Колонки.Добавить("Наименование"); + АдресныеСведения.Колонки.Добавить("АльтернативныеНазвания"); + АдресныеСведения.Колонки.Добавить("Сокращение"); + АдресныеСведения.Колонки.Добавить("Индекс"); + АдресныеСведения.Колонки.Добавить("ТипАдресногоЭлемента"); + АдресныеСведения.Колонки.Добавить("КодРайонаВКоде"); + АдресныеСведения.Колонки.Добавить("КодГородаВКоде"); + АдресныеСведения.Колонки.Добавить("КодНаселенногоПунктаВКоде"); + АдресныеСведения.Колонки.Добавить("КодУлицыВКоде"); + + Постфикс = ? (ЗагрузкаСВеб, КодАдресногоОбъекта, ""); + + ЗагрузитьАдресныеСведения(КодАдресногоОбъекта, + ПутьКДаннымНаСервере + "kladr"+Постфикс, + АдресныеСведения, + АльтернативныеНазвания); + + ЗагрузитьАдресныеСведения(КодАдресногоОбъекта, + ПутьКДаннымНаСервере + "street"+Постфикс, + АдресныеСведения, + АльтернативныеНазвания, + 5); + + ЗагрузитьАдресныеСведения(КодАдресногоОбъекта, + ПутьКДаннымНаСервере + "doma"+Постфикс, + АдресныеСведения, + АльтернативныеНазвания, + 6); + + Файл = Новый Файл(ПутьКДаннымНаСервере+"altnames.dbf"); + + Если Файл.Существует() Тогда + ЗаполнитьАльтернативныеНазвания(ПутьКДаннымНаСервере, АдресныеСведения, АльтернативныеНазвания); + КонецЕсли; + + ЗаписатьКлассификатор(КодАдресногоОбъекта, АдресныеСведения); + +КонецПроцедуры + +// Процедура очищает адресные сведений по переданным адресным объектам. +// +// Параметры +// МассивАдресныхОбъектов - массив - каждый элемент - строка, номер +// адресного объекта в формате NN +// +Процедура УдалитьАдресныеСведения(знач МассивАдресныхОбъектов) Экспорт + + Для Каждого КодАдресногоОбъекта Из МассивАдресныхОбъектов Цикл + НаборАдресныхСведений = РегистрыСведений.АдресныйКлассификатор.СоздатьНаборЗаписей(); + НаборАдресныхСведений.Отбор.КодАдресногоОбъектаВКоде.Использование = Истина; + НаборАдресныхСведений.Отбор.КодАдресногоОбъектаВКоде.Значение = Число(КодАдресногоОбъекта); + НаборАдресныхСведений.Записать(); + УстановитьВерсиюКлассификатора(КодАдресногоОбъекта); + КонецЦикла; + +КонецПроцедуры + +// Загружает адресные объекты первого уровня по макету +// +Процедура ЗагрузитьАдресныеОбъектыПервогоУровня() Экспорт + + КлассификаторАдресныхОбъектовXML = РегистрыСведений.АдресныйКлассификатор.ПолучитьМакет("КлассификаторАдресныхОбъектовРоссии").ПолучитьТекст(); + + КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(КлассификаторАдресныхОбъектовXML).Данные; + + Для Каждого АдресныйОбъект Из КлассификаторТаблица Цикл + + МенеджерЗаписи = РегистрыСведений.АдресныйКлассификатор.СоздатьМенеджерЗаписи(); + + МенеджерЗаписи.Код = АдресныйОбъект.Code; + МенеджерЗаписи.ТипАдресногоЭлемента = 1; + МенеджерЗаписи.Наименование = АдресныйОбъект.Name; + МенеджерЗаписи.Сокращение = АдресныйОбъект.Socr; + МенеджерЗаписи.Индекс = АдресныйОбъект.Index; + МенеджерЗаписи.КодАдресногоОбъектаВКоде = Лев(АдресныйОбъект.Code,2); + + МенеджерЗаписи.Записать(); + + КонецЦикла; + +КонецПроцедуры + +// Функция возвращает число адресных объектов по которым заполнены адресные сведения +// +Функция ЧислоЗаполненныхАдресныхОбъектов() Экспорт + + ТекстЗапроса = "ВЫБРАТЬ + | Истина + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК АдресныйКлассификатор + | + |СГРУППИРОВАТЬ ПО + | АдресныйКлассификатор.КодАдресногоОбъектаВКоде + | + |ИМЕЮЩИЕ + | КОЛИЧЕСТВО(АдресныйКлассификатор.КодАдресногоОбъектаВКоде) <> 1"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + + Возврат Запрос.Выполнить().Выбрать().Количество(); + +КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Блок сервисных функций, используются при загрузке адресного классификатора +// + +// Загружает адресные сокращения в регистр АдресныеСокращения. +// Параметры +// ПутьКДаннымНаСервере - путь к каталогу в котором находится файл socrbase.dbf +// Возвращаемое значение +// булево - истина - сведения успешно записаны +// ложь - ошибка при подготовке / записи сведений в регистр +// +Функция ЗагрузитьАдресныеСокращения(ПутьКДаннымНаСервере) Экспорт + + ФайлАдресныхСокращений = ПутьКДаннымНаСервере + "socrbase.dbf"; + + ТаблицаАдресныеСокращения = Новый ТаблицаЗначений; + ТаблицаАдресныеСокращения.Колонки.Добавить("Код"); + ТаблицаАдресныеСокращения.Колонки.Добавить("Уровень"); + ТаблицаАдресныеСокращения.Колонки.Добавить("Наименование"); + ТаблицаАдресныеСокращения.Колонки.Добавить("Сокращение"); + + АдресныеСокращения = РегистрыСведений.АдресныеСокращения; + + НаборЗаписей = АдресныеСокращения.СоздатьНаборЗаписей(); + НаборЗаписей.Записать(); + + xB = Новый XBase(ФайлАдресныхСокращений); + xB.Кодировка = КодировкаXBase.OEM; + + // Контроль уникальности кодов в файле классификатора + Контроль = Новый Соответствие; + ЕстьОшибки = Ложь; + Если xB.Открыта() Тогда + Пока Не xB.ВКонце() Цикл + КодУникальности = Число(xB.level)*10000 + Число(xB.kod_t_st); + Если Контроль[КодУникальности] = НеОпределено Тогда + Контроль[КодУникальности] = 0; + НоваяЗапись = НаборЗаписей.Добавить(); + НоваяЗапись.Код = xB.kod_t_st; + НоваяЗапись.Уровень = xB.level; + НоваяЗапись.Наименование = xB.socrname; + НоваяЗапись.Сокращение = xB.scname; + Иначе + ЕстьОшибки = Истина; + КонецЕсли; + xB.Следующая(); + + КонецЦикла; + xB.ЗакрытьФайл(); + Иначе + Возврат Ложь; + КонецЕсли; + + Если ЕстьОшибки Тогда + ЗаписьЖурналаРегистрации(НСтр("ru = 'Адресный классификатор.Загрузка'"), + УровеньЖурналаРегистрации.Ошибка,,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В файле адресного классификатора %1 есть ошибки уникальности кодов'"), + "socrbase.dbf")); + КонецЕсли; + НаборЗаписей.Записать(); + + Возврат Истина; + +КонецФункции + +// Функция для заполнения данных с 2-го по 6-й уровень классификации: +// 2-й - районы (улусы) республик, краев, областей, автономных областей, +// автономных округов, входящих в состав Российской Федерации. +// 3-й города и поселки городского типа1 регионального и районного подчинения; +// сельсоветы (сельские округа, сельские администрации, волости и т.п.). +// 4-й города и поселки городского типа , подчиненные администрациям городов третьего уровня; +// сельские населенные пункты +// 5-й улицы городов, поселков городского типа и сельских населенных пунктов. +// 6-й дома, расположенные в городах и поселках городского типа, являющихся объектами +// третьего уровня , в т.ч. дома, непосредственно привязанные к городам и поселкам +// городского типа +// +// Параметры: +// КодАдресногоОбъекта - строка (2 символа) - строковое представление номера адресного объекта +// ПутьКДаннымНаСервере - Строка - путь к каталогу на сервере, в котором +// хранятся файлы кладр. Путь заканчивается слешем (обратным или прямым) +// АдресныеСведения - ТаблицаЗначений - таблица, которая заполняется загружаемыми элементами +// АльтернативныеНазвания +// ТипАдресногоЭлемента - число - по сути уровень адресного объекта +// +Функция ЗагрузитьАдресныеСведения(КодАдресногоОбъекта, + ПутьКДаннымНаСервере, + АдресныеСведения, + АльтернативныеНазвания, + знач ТипАдресногоЭлемента = Неопределено) + + ФайлАдресногоКлассификатора = ПутьКДаннымНаСервере + ".dbf"; + ФайлИндексаКлассификатора = ПутьКДаннымНаСервере + ".cdx"; + + ФайлИндекса = Новый Файл (ФайлИндексаКлассификатора); + Если НЕ ФайлИндекса.Существует() Тогда + xB = Новый XBase(ФайлАдресногоКлассификатора); + xB.Кодировка = КодировкаXBase.OEM; + + Если xB.Открыта() Тогда + // Для загрузки сразу группы адресных сведений удобно + // пользоваться индексом по всему поле CODE + xB.индексы.Добавить("IDXCODE", "CODE", Истина); + xB.СоздатьИндексныйФайл(ФайлИндексаКлассификатора); + xB.ЗакрытьФайл(); + Иначе + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + xB = Новый XBase(ФайлАдресногоКлассификатора, + ФайлИндексаКлассификатора, + Истина); + xB.Кодировка = КодировкаXBase.OEM; + + // Если мы загружаем улицы или дома, то + // тип адресного элемента + Если ТипАдресногоЭлемента <> Неопределено Тогда + ТипАдресногоЭлементаУстановлен = Истина; + Иначе + ТипАдресногоЭлементаУстановлен = Ложь; + КонецЕсли; + + Если Не xB.Открыта() Тогда + Возврат Ложь; + КонецЕсли; + + Контроль = Новый Соответствие; + ЕстьОшибки = Ложь; + + xB.ТекущийИндекс = xB.Индексы.Найти("IDXCODE"); + + xB.Найти (КодАдресногоОбъекта, "="); + + Пока Не xB.ВКонце() Цикл + Код = xB.CODE; + + Если Контроль[Код] = НеОпределено Тогда + Контроль[Код] = 0; + + Если Лев(Код, 2) <> КодАдресногоОбъекта Тогда + Прервать; + КонецЕсли; + + Если НЕ ТипАдресногоЭлементаУстановлен Тогда + ТипАдресногоЭлемента = ПолучитьТипАдресногоЭлементаПоКоду(Код); + КонецЕсли; + + // Если это альтернативное название, то заносим сведения в отдельную таблицу + // альтернативных наименований (для номеров домов альтернативных наименований нет) + ПризнакАктуальности = Прав(Код, 2); + Если (ТипАдресногоЭлемента <> 6) + И (ПризнакАктуальности <> "00") + И (ПризнакАктуальности <> "99") Тогда + + СтрокаАльтернативныхНазваний = АльтернативныеНазвания.Добавить(); + СтрокаАльтернативныхНазваний.Код = Код; + СтрокаАльтернативныхНазваний.Наименование = СокрЛП(xB.NAME); + СтрокаАльтернативныхНазваний.Сокращение = СокрЛП(xB.SOCR); + СтрокаАльтернативныхНазваний.Индекс = СокрЛП(xB.INDEX); + + xB.Следующая(); + Продолжить; + + КонецЕсли; + + НоваяСтрока = АдресныеСведения.Добавить(); + + НоваяСтрока.Код = Код; + + НоваяСтрока.ТипАдресногоЭлемента = ТипАдресногоЭлемента; + НоваяСтрока.КодАдресногоОбъектаВКоде = Число(Сред(Код, 1, 2)); + НоваяСтрока.КодРайонаВКоде = Число(Сред(Код, 3, 3)); + НоваяСтрока.КодГородаВКоде = Число(Сред(Код, 6, 3)); + НоваяСтрока.КодНаселенногоПунктаВКоде = Число(Сред(Код, 9, 3)); + НоваяСтрока.КодУлицыВКоде = Число(Сред(Код, 12, 4)); + + НоваяСтрока.Наименование = СокрЛП(xB.NAME); + НоваяСтрока.Индекс = xB.INDEX; + НоваяСтрока.Сокращение = СокрЛП(xB.SOCR); + + xB.Следующая(); + Иначе + ЕстьОшибки = Истина; + КонецЕсли; + + КонецЦикла; + + xB.ЗакрытьФайл(); + + Если ЕстьОшибки Тогда + ЗаписьЖурналаРегистрации(НСтр("ru = 'Адресный классификатор.Загрузка'"), + УровеньЖурналаРегистрации.Ошибка, , , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В файле адресного классификатора %1 есть ошибки уникальности кодов'"), + ПутьКДаннымНаСервере)); + КонецЕсли; + + Возврат Истина; + +КонецФункции + +// Дополняет адресные сведения альтернативными названиями +// +Функция ЗаполнитьАльтернативныеНазвания(ПутьКДаннымНаСервере, + АдресныеСведения, + АльтернативныеНазвания) + + ПутьКФайлуАН = ПутьКДаннымНаСервере + "altnames.dbf"; + ПутьКФайлуАН_Индекс = ПутьКДаннымНаСервере + "altnames.cdx"; + + ФайлИндекса = Новый Файл (ПутьКФайлуАН_Индекс); + Если НЕ ФайлИндекса.Существует() Тогда + xB = Новый XBase(ПутьКФайлуАН); + xB.Кодировка = КодировкаXBase.OEM; + Если xB.Открыта() Тогда + xB.индексы.Добавить("IDXCODE", "OLDCODE", Истина); + xB.СоздатьИндексныйФайл(ПутьКФайлуАН_Индекс); + xB.ЗакрытьФайл(); + Иначе + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + xB = Новый XBase(ПутьКФайлуАН, + ПутьКФайлуАН_Индекс, + Истина); + + xB.Кодировка = КодировкаXBase.OEM; + + Если xB.Открыта() Тогда + xB.ТекущийИндекс = xB.Индексы.Найти("IDXCODE"); + КонецЕсли; + + Для Каждого АльтернативныйОбъект Из АльтернативныеНазвания Цикл + + ПризнакАктуальности = Прав(АльтернативныйОбъект.Код, 2); + + КодАктуальногоНаименования = Лев(АльтернативныйОбъект.Код, + СтрДлина(АльтернативныйОбъект.Код) - 2) + "00"; + + Если ПризнакАктуальности = "51" Тогда + // адресную информацию необходимо искать в altnames.dbf + OLDCODE = КодАктуальногоНаименования; + xB.Найти (OLDCODE, "="); + + НовыйКод = СокрЛП(xB.NewCode); + + // пытаемся найти актуальный объект в адресных сведениях + СтрокаТаблицы = АдресныеСведения.Найти(НовыйКод, "Код"); + + Если СтрокаТаблицы = Неопределено Тогда + + КодУдаленногоНП = Лев(АльтернативныйОбъект.Код, + СтрДлина(АльтернативныйОбъект.Код) - 2) + "99"; + + НоваяСтрока = АдресныеСведения.Добавить(); + + Код = Лев(АльтернативныйОбъект.Код, СтрДлина(АльтернативныйОбъект.Код) - 2) + "00"; + + ТипАдресногоЭлемента = ПолучитьТипАдресногоЭлементаПоКоду(Код); + + НоваяСтрока.Код = Код; + + НоваяСтрока.ТипАдресногоЭлемента = ТипАдресногоЭлемента; + НоваяСтрока.КодАдресногоОбъектаВКоде = Число(Сред(Код, 1, 2)); + НоваяСтрока.КодРайонаВКоде = Число(Сред(Код, 3, 3)); + НоваяСтрока.КодГородаВКоде = Число(Сред(Код, 6, 3)); + НоваяСтрока.КодНаселенногоПунктаВКоде = Число(Сред(Код, 9, 3)); + НоваяСтрока.КодУлицыВКоде = Число(Сред(Код, 12, 4)); + + НоваяСтрока.Наименование = СокрЛП(АльтернативныйОбъект.Наименование); + НоваяСтрока.Индекс = СокрЛП(АльтернативныйОбъект.Индекс); + НоваяСтрока.Сокращение = СокрЛП(АльтернативныйОбъект.Сокращение); + + Продолжить; + КонецЕсли; + + Иначе + + СтрокаТаблицы = АдресныеСведения.Найти(КодАктуальногоНаименования, "Код"); + + КонецЕсли; // Если ПризнакАктуальности = "51" Тогда ... Иначе + + + Если СтрокаТаблицы <> Неопределено Тогда + Если ЗначениеЗаполнено(СокрЛП(АльтернативныйОбъект.Индекс)) Тогда + ИндексААО = " : " + АльтернативныйОбъект.Индекс; + Иначе + ИндексААО = ""; + КонецЕсли; + + АльтернативноеНазвание = АльтернативныйОбъект.Наименование + + " " + + АльтернативныйОбъект.Сокращение + + ИндексААО; + + Если СтрокаТаблицы.АльтернативныеНазвания = Неопределено Тогда + СтрокаТаблицы.АльтернативныеНазвания = АльтернативноеНазвание; + Иначе + СтрокаТаблицы.АльтернативныеНазвания = СтрокаТаблицы.АльтернативныеНазвания + + ", " + + АльтернативноеНазвание; + КонецЕсли; + КонецЕсли; // Если СтрокаТаблицы <> Неопределено Тогда + + СтрокаТаблицы = Неопределено; + + КонецЦикла; + + Если xB.Открыта() Тогда + xB.ЗакрытьФайл(); + КонецЕсли; + +КонецФункции + +// Функция для заполнения данных с 2-го по 4-й уровень классификации: +// +// Параметры: +// КодАдресногоОбъекта - строка - код адресного объекта в формате NN +// АдресныеСведения - ТаблицаЗначений - записи, повторяющие структуру РС АдресныйКлассификатор; +// которые переносятся в регистр +// +Функция ЗаписатьКлассификатор(КодАдресногоОбъекта, АдресныеСведения) + + Для Каждого Элемент Из АдресныеСведения Цикл + + КодСтр = Строка(Элемент.Код); + ДС = СтрДлина(КодСтр); + + Для Индекс = ДС По 20 Цикл + КодСтр = КодСтр + "0"; + КонецЦикла; + + Элемент.Код = КодСтр; + + КонецЦикла; + + НаборАдресныхСведений = РегистрыСведений.АдресныйКлассификатор.СоздатьНаборЗаписей(); + НаборАдресныхСведений.Отбор.КодАдресногоОбъектаВКоде.Использование = Истина; + НаборАдресныхСведений.Отбор.КодАдресногоОбъектаВКоде.Значение = Число(КодАдресногоОбъекта); + НаборАдресныхСведений.Загрузить(АдресныеСведения); + НаборАдресныхСведений.Записать(); + +КонецФункции + +// Функция получает уровень адресного элемента (всего 6 уровней) в +// иерархической системе классификации по его коду +// формат кода: +// _2__3___3___3___4____4____ +// |СС|РРР|ГГГ|ППП|УУУУ|ДДДД| +// +// чем глубже уровень иерархии тем более младшие разряды являются заполненными +// +// Параметры: +// Код - строка - код, взятый из поля записи CODE файла данных +// +// Возвращаемое значение: +// Число [1-6] +Функция ПолучитьТипАдресногоЭлементаПоКоду(знач Код) + + Размерность = СтрДлина(Код); + + // для кодов с размерностью 13 или 17 необходимо уменьшить код + // на 2 разряда - символы актуальности адресного объекта + Если Размерность = 13 ИЛИ Размерность = 17 Тогда + Размерность = Размерность - 2; + КодЧисло = Число(Сред(Код, 1, СтрДлина(Код)-2)); + ИначеЕсли Размерность = 19 Тогда + КодЧисло = Число(Сред(Код, 1, СтрДлина(Код))); + КонецЕсли; + + // Проверяем заполненность разрядов ДДДД + Если Размерность = 19 Тогда + + Ост = КодЧисло % 10000; + Если Ост <> 0 Тогда + Возврат 6; + КонецЕсли; + + КодЧисло = КодЧисло / 10000; + + КонецЕсли; + + // Проверяем заполненность разрядов УУУУ + Если Размерность = 15 Тогда + + Ост = КодЧисло % 10000; + Если Ост <> 0 Тогда + Возврат 5; + КонецЕсли; + + КодЧисло = КодЧисло / 10000; + + КонецЕсли; + + // Проверяем заполненность разрядов ППП + Ост = КодЧисло % 1000; + Если Ост <> 0 Тогда + Возврат 4; + КонецЕсли; + + // Проверяем заполненность разрядов ГГГ + Ост = КодЧисло % 1000000; + + Если Ост <> 0 Тогда + Возврат 3; + КонецЕсли; + + // Проверяем заполненность разрядов РРР + Ост = КодЧисло % 1000000000; + + Если Ост <> 0 Тогда + Возврат 2; + КонецЕсли; + + // Верхний уровень иерархии - единица + + Возврат 1; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Функции для получении информации по адресным объектам +// + +// Возвращает структуру, содержащую информацию по адресному объекту +// +// Параметры +// КодАдресногоОбъекта - Строка - номер адресного объекта от 1 до 89 + 99 в формате NN +// +// Возвращаемое значение +// структура, с ключами: КодАдресногоОбъекта, Наименование, Сокращение, Индекс +// +Функция ИнформацияПоАдресномуОбъекту(КодАдресногоОбъекта) Экспорт + + КлассификаторАдресныхОбъектовXML = РегистрыСведений.АдресныйКлассификатор.ПолучитьМакет("КлассификаторАдресныхОбъектовРоссии").ПолучитьТекст(); + + КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(КлассификаторАдресныхОбъектовXML).Данные; + + Результат = Новый Структура("КодАдресногоОбъекта, Наименование, Сокращение, Индекс"); + + Для Каждого АдресныйОбъект Из КлассификаторТаблица Цикл + Если Лев(АдресныйОбъект.Code, 2) = КодАдресногоОбъекта Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Результат.КодАдресногоОбъекта = АдресныйОбъект.Code; + Результат.Наименование = АдресныйОбъект.Name; + Результат.Сокращение = АдресныйОбъект.Socr; + Результат.Индекс = АдресныйОбъект.Index; + + Возврат Результат; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Функция для работы с версиями сведений по адресным объектам +// + +// Устанавливает версию адресного объекта в регистре +// Параметры +// НомерАО - строка - код адресного объекта в формате NN +// Наименование - наименование адресного объекта +// ВерсияСведенийПоАдресномуОбъекту - дата - версия адресного объекта +// +Процедура УстановитьВерсиюКлассификатора(знач НомерАО, + знач Наименование = "", + знач ВерсияСведенийПоАдресномуОбъекту = "") Экспорт + + МенеджерЗаписи = РегистрыСведений.ВерсииОбъектовАдресногоКлассификатора.СоздатьМенеджерЗаписи(); + + Если ПустаяСтрока(ВерсияСведенийПоАдресномуОбъекту) Тогда + МенеджерЗаписи.АдресныйОбъект = НомерАО; + МенеджерЗаписи.Прочитать(); + МенеджерЗаписи.Удалить(); + Иначе + МенеджерЗаписи.АдресныйОбъект = НомерАО; + МенеджерЗаписи.ДатаВыпускаВерсии = ВерсияСведенийПоАдресномуОбъекту; + МенеджерЗаписи.Наименование = Наименование; + + МенеджерЗаписи.Записать(Истина); + КонецЕсли; + +КонецПроцедуры + +// Считывает с диска файл версий адресных объектов и возвращает +// версии сведений по адресным объектам +// +Функция ПолучитьВерсииАдресныхСведений(знач ТекстXML) Экспорт + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.УстановитьСтроку(ТекстXML); + + ЧтениеXML.Прочитать(); + + Результат = Новый Соответствие; + + Пока ЧтениеXML.Прочитать() Цикл + КодАдресногоОбъекта = ПолучитьАтрибут(ЧтениеXML, "code"); + Если ЗначениеЗаполнено(КодАдресногоОбъекта) Тогда + ДатаВыпуска = ПолучитьАтрибут(ЧтениеXML, "date"); + Результат.Вставить(КодАдресногоОбъекта, ДатаВыпуска); + КонецЕсли; + ЧтениеXML.Прочитать(); + КонецЦикла; + + ЧтениеXML.Закрыть(); + + Возврат Результат; + +КонецФункции + +// Читает значение атрибута по имени из указанного объекта, приводит значение +// к указанному примитивному типу +// +// Параметры: +// ЧтениеXML - объект типа ЧтениеXML, спозиционированный на начале элемента, +// атрибут которого требуется получить +// Тип - Значение типа Тип. Тип атрибута +// Имя - Строка. Имя атрибута +// +// Возвращаемое значение: +// Значение атрибута полученное по имени и приведенное к указанному типу +// +Функция ПолучитьАтрибут(знач ЧтениеXML, Знач Имя) + + СтрЗначение = СокрЛП(ЧтениеXML.ПолучитьАтрибут(Имя)); + + Если Имя = "date" Тогда + Возврат Дата(Сред(СтрЗначение, 7, 4) + Сред(СтрЗначение, 4, 2) + Лев(СтрЗначение, 2)); + ИначеЕсли Имя = "code" Тогда + Возврат Лев(СтрЗначение, 2); + КонецЕсли; + +КонецФункции + +// Функция ставит на поддержку адресные объекты. Фактически происходит заполнение +// регистра сведений соответствием кодов адресных объектов датами актуальности +// Параметры +// ТекстXML - многострочная строка - текст файла с описанием версий адресных объектов +// АдресныеОбъекты - массив - список адресных объектов, каждая строка - код +// адресного объекта в формате NN +// +Процедура ОбновитьВерсиюАдресныхСведений(ТекстXML, АдресныеОбъекты) Экспорт + + ВерсииАдресныхСведений = ПолучитьВерсииАдресныхСведений(ТекстXML); + + Для Каждого АдресныйОбъект Из АдресныеОбъекты Цикл + АдресныеСведения = ИнформацияПоАдресномуОбъекту(АдресныйОбъект); + УстановитьВерсиюКлассификатора(АдресныйОбъект, + АдресныеСведения.Наименование + " " + АдресныеСведения.Сокращение, + ВерсииАдресныхСведений[АдресныйОбъект]); + КонецЦикла; + +КонецПроцедуры + +// Сохраняет файл архива из двоичных данных на сервере по +// переданному имени в переданном каталоге, и распаковывает его. +// +// Параметры +// ДвоичныеДанные - ДвоичныеДанные -данные файла +// ИмяФайлаАрхива - строка - имя файла +// ПутьККаталогуНаСервере - путь к каталогу, в который требуется положить распакованный файл +// +Процедура СохранитьФайлНаСервереИРаспаковать(знач ДвоичныеДанные, + ИмяФайлаАрхива, + ПутьККаталогуНаСервере) Экспорт + + Если ПутьККаталогуНаСервере = Неопределено Тогда + ПутьККаталогуНаСервере = ОбщегоНазначенияКлиентСервер.ПолучитьИмяКаталога("kladr_files"); + КонецЕсли; + + ДвоичныеДанные.Записать(ПутьККаталогуНаСервере + ИмяФайлаАрхива); + + ЧтениеZIP = Новый ЧтениеZipФайла(ПутьККаталогуНаСервере + ИмяФайлаАрхива); + ЧтениеZIP.ИзвлечьВсе(ПутьККаталогуНаСервере, + РежимВосстановленияПутейФайловZIP.НеВосстанавливать); + ЧтениеZIP.Закрыть(); + УдалитьФайлы(ПутьККаталогуНаСервере, ИмяФайлаАрхива); + +КонецПроцедуры + +// --------------------------------------------------------------- +// Аутентификация на пользовательском сайте 1С + +// Получает параметры аутентификации пользователя (логин и пароль) на пользовательском сайте 1с. +// Возвращаемое значение: +// Булево - Истина - параметры аутентификации заполнены +// Ложь - хотя бы один из параметров аутентификации не заполнен +// +Функция ПолучитьПараметрыАутентификации(КодПользователя, Пароль) Экспорт + + Значение = ХранилищеОбщихНастроек.Загрузить("АутентификацияНаПользовательскомСайте", "КодПользователя"); + + КодПользователя = ? (Значение = Неопределено, "", Значение); + + Значение = ХранилищеОбщихНастроек.Загрузить( + "АутентификацияНаПользовательскомСайте", + "Пароль"); + + Пароль = ? (Значение = Неопределено, "", Значение); + + Возврат ((? (КодПользователя = Неопределено, Ложь, Истина)) + И (? (ПустаяСтрока(Пароль), Ложь, Истина))) + +КонецФункции + +// Сохраняет код пользователя и пароль в системном хранилище настроек ИБ +// Параметры +// КодПользователя - строка - код пользователя, или логин, для доступа к пользовательскому сайту 1с +// Пароль - строка - пароль +// +Процедура СохранитьПараметрыАутентификации(КодПользователя, Пароль) Экспорт + + ХранилищеОбщихНастроек.Сохранить( + "АутентификацияНаПользовательскомСайте", + "КодПользователя", + КодПользователя,, + Пользователи.АвторизованныйПользователь()); + + ХранилищеОбщихНастроек.Сохранить( + "АутентификацияНаПользовательскомСайте", + "Пароль", + Пароль,, + Пользователи.АвторизованныйПользователь()); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/АдресныйКлассификатор/АдресныйКлассификатор.mdo b/SSL/src/CommonModules/АдресныйКлассификатор/АдресныйКлассификатор.mdo new file mode 100644 index 000000000..b3f1bdb95 --- /dev/null +++ b/SSL/src/CommonModules/АдресныйКлассификатор/АдресныйКлассификатор.mdo @@ -0,0 +1,10 @@ + + + АдресныйКлассификатор + + ru + Адресный классификатор + + true + true + diff --git a/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl new file mode 100644 index 000000000..79b7ab398 --- /dev/null +++ b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl @@ -0,0 +1,437 @@ +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ ФУНКЦИЙ ДЛЯ ЗАГРУЗКИ ФАЙЛОВ АДРЕСНОГО КЛАССИФИКАТОРА С ВЕБ СЕРВЕРА, +// А ТАК ЖЕ ФУНКЦИИ ПОДДЕРЖКИ ОБНОВЛЕНИЯ АДРЕСНЫХ СВЕДЕНИЙ +// + +// Вызывает форму загрузки классификатора. Может использоваться как интерфейс. +// +Функция ЗагрузитьАдресныйКлассификатор() Экспорт + + #Если ВебКлиент Тогда + Предупреждение(НСтр("ru = 'В Веб-клиенте загрузка адресного классификатора не поддерживается'")); + #Иначе + ОткрытьФорму("РегистрСведений.АдресныйКлассификатор.Форма.ФормаЗагрузкиАдресногоКлассификатора"); + #КонецЕсли + +КонецФункции + +// Проверяет наличие обновлений адресного классификатора на веб сервере +// для тех объектов, которые ранее уже загружались (для тех объектов +// для которых есть запись в регистре ВерсииОбъектовАдресногоКлассификатора). +// +// Возвращаемое значение +// Массив структур, в котором каждая структура имеет формат: +// ключ КодАдресногоОбъекта - строка - код адресного объекта +// ключ Наименование - строка - наименование адресного объекта +// ключ Сокращение - строка - сокращение адресного объекта +// ключ Индекс - строка - индекс адресного объекта +// ключ ОбновлениеДоступно - Булево +// +Процедура ПроверитьОбновлениеАдресныхОбъектов() Экспорт + +#Если ВебКлиент Тогда + Результат = АдресныйКлассификатор.ПроверитьОбновлениеАдресныхОбъектов_Сервер(); +#Иначе + Результат = АдресныйКлассификаторКлиентСервер.ПроверитьОбновлениеАдресныхОбъектов(); +#КонецЕсли + + Если Не Результат.Статус Тогда + Предупреждение(Результат.СообщениеОбОшибке); + Возврат; + КонецЕсли; + + Если Результат.Значение.Количество() <> 0 Тогда + + КоличествоОбновлений = 0; + + СписокСтрока = ""; + + АдресныеОбъекты = Новый Массив; + + Для Каждого АО Из Результат.Значение Цикл + Если АО.ОбновлениеДоступно Тогда + КоличествоОбновлений = КоличествоОбновлений + 1; + АдресныеОбъекты.Добавить(Лев(АО.КодАдресногоОбъекта, 2)); + СписокСтрока = СписокСтрока + Лев(АО.КодАдресногоОбъекта, 2) + + " - " + АО.Наименование + + " " + АО.Сокращение + Символы.ПС; + КонецЕсли; + КонецЦикла; + + Если КоличествоОбновлений > 0 Тогда + Текст = НСтр("ru = 'На сервере присутствуют обновления для следующих адресных объектов:'") + + Символы.ПС + + СписокСтрока; + +#Если ВебКлиент Тогда + Предупреждение(Текст); +#Иначе + Текст = Текст + НСтр("ru = 'Приступить к обновлению адресного классификатора?'"); + Результат = Вопрос(Текст, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, "Обновление адресного классификатора"); + + Если Результат = КодВозвратаДиалога.Да Тогда + ОткрытьФорму("РегистрСведений.АдресныйКлассификатор.Форма.ФормаЗагрузкиАдресногоКлассификатора", + Новый Структура("АдресныеОбъекты", АдресныеОбъекты) ); + КонецЕсли; +#КонецЕсли + Иначе + Предупреждение(НСтр("ru = 'Обновление не требуется. Информационная база содержит актуальные адресные сведения.'"), , НСтр("ru = 'Адресный классификатор'")); + КонецЕсли; + Иначе + Предупреждение(НСтр("ru = 'Обновление не требуется. Информационная база содержит актуальные адресные сведения.'"), , НСтр("ru = 'Адресный классификатор'")); + КонецЕсли; + +КонецПроцедуры + +// Вызывает форму очистки сведений адресного классификатора по адресным объектам +// +Процедура ОчиститьКлассификатор() Экспорт + + ОткрытьФормуМодально("РегистрСведений.АдресныйКлассификатор.Форма.ФормаОчисткиАдресногоКлассификатора"); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ ВСПОМОГАТЕЛЬНЫХ ФУНКЦИИ +// + +// Содержит полный список файлов данных КЛАДР +// +Функция СписокФайловДанных() Экспорт + + Список = Новый Массив; + + Список.Добавить("SOCRBASE.DBF"); + Список.Добавить("ALTNAMES.DBF"); + Список.Добавить("DOMA.DBF"); + Список.Добавить("KLADR.DBF"); + Список.Добавить("STREET.DBF"); + + Возврат Список; + +КонецФункции + +// Заменяет в имени файла расширение с ".DBF" на ".EXE" +// +Функция ЗаменитьРасширение_DBF_На_EXE(Строка) + + Возврат СтрЗаменить(Строка, ".DBF", ".EXE"); + +КонецФункции + +// Заменяет в имени файла расширение на c ".DBF" на ".ZIP" +// +Функция ЗаменитьРасширение_DBF_На_ZIP(Строка) Экспорт + + Возврат СтрЗаменить(Строка, ".DBF", ".ZIP"); + +КонецФункции + +// Заменяет в имени файла расширение на c ".EXE" на ".DBF" +// +Функция ЗаменитьРасширение_EXE_На_DBF(Строка) Экспорт + + Возврат СтрЗаменить(Строка, ".EXE", ".DBF"); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Блок функций проверки наличия файлов на диске (ИТС) +// + +// Проверяет существование файлов адресного классификатора на диске ИТС. +// +// Параметры: +// ПутьКДискуИТС - строка - путь к корню диска ИТС +// +// Возвращаемое значение: +// Булево - истина - файлы присутствуют +// ложь - файлы отсутствуют +// +Функция ПроверитьНаличиеФайловНаДискеИТС(знач ПутьКДискуИТС) Экспорт + + // если был выбран диск - то убираем последний символ "\" + Если Прав(ПутьКДискуИТС, 1) = "\" Тогда + ПутьКДискуИТС = Лев(ПутьКДискуИТС, СтрДлина(ПутьКДискуИТС) - 1); + КонецЕсли; + + ПутьКДискуИТС = ПутьКДискуИТС + ПутьККаталогуСДаннымиКЛАДРНаДискеИТС(ПутьКДискуИТС); + + СписокФайловДанных = СписокФайловДанныхНаДискеИТС(); + + Для Каждого ПутьКФайлу Из СписокФайловДанных Цикл + ПолныйПутьКФайлу = ПутьКДискуИТС + ПутьКФайлу; + Если ПутьКФайлу = "ALTNAMES.EXE" Тогда + Продолжить; + КонецЕсли; + ФайлНаДиске = Новый Файл(ПолныйПутьКФайлу); + Если Не ФайлНаДиске.Существует() Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +// Функция возвращает относительный путь на диске ИТС по которому находятся файлы КЛАДР. +// +// Параметры: +// ПутьКДискуИТС - путь к корневому каталогу диска ИТС. +// +// Возвращаемое значение: +// строка - относительный путь на диске ИТС к файлам КЛАДР (самораспаковывающийся архив). +// если файлы не найдены, возвращается пустая строка. +// +Функция ПутьККаталогуСДаннымиКЛАДРНаДискеИТС(знач ПутьКДискуИТС) Экспорт + + ВозможныеПути = Новый Массив; + ВозможныеПути.Добавить("\1CIts\EXE\KLADR\"); + ВозможныеПути.Добавить("\1CitsFr\EXE\KLADR\"); + ВозможныеПути.Добавить("\1CItsB\EXE\KLADR"); + + Если Прав(ПутьКДискуИТС, 1) = "\" Тогда + ПутьКДискуИТС = Лев(ПутьКДискуИТС, СтрДлина(ПутьКДискуИТС) - 1); + КонецЕсли; + + Для Каждого Путь Из ВозможныеПути Цикл + ПолныйПутьКФайлу = ПутьКДискуИТС + Путь +"STREET.EXE" ; + ФайлНаДиске = Новый Файл(ПолныйПутьКФайлу); + Если ФайлНаДиске.Существует() Тогда + Возврат Путь; + КонецЕсли; + КонецЦикла; + + Возврат ""; + +КонецФункции + +// Содержит полный список файлов данных КЛАДР (в формате самораспаковывающегося архива, EXE) +// +Функция СписокФайловДанныхНаДискеИТС() Экспорт + + Список = СписокФайловДанных(); + + Для Каждого ИмяФайла Из Список Цикл + НовоеИмя = ЗаменитьРасширение_DBF_На_EXE(ИмяФайла); + Список.Установить(Список.Найти(ИмяФайла), НовоеИмя); + КонецЦикла; + + Возврат Список; + +КонецФункции + +// Проверяет существование файлов данных в переданном каталоге +// +// Параметры: +// ПутьККаталогу - строка - путь к каталогу, который необходимо проверить на наличие файлов +// +// Возвращаемое значение: +// Истина - файлы существуют на диске +// Ложь - хотя бы одного файла из необходимого набора файлов +// не существует на диске +// +Функция ПроверитьНаличиеФайловДанныхВКаталоге(знач ПутьККаталогу) Экспорт + + Если ПустаяСтрока(ПутьККаталогу) Тогда + Возврат Ложь; + КонецЕсли; + + Если Прав(ПутьККаталогу, 1) <> "\" Тогда + ПутьККаталогу = ПутьККаталогу + "\"; + КонецЕсли; + + Для Каждого ПутьКФайлу Из СписокФайловДанных() Цикл + ФайлНаДиске = Новый Файл(ПутьККаталогу+ПутьКФайлу); + Если Не ФайлНаДиске.Существует() Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +#Если Не ВебКлиент Тогда + +// Распаковывает файлы КЛАДР с диска ИТС и выполняет их архивацию в ZIP-архив. +// +// Параметры +// ДискИТС - строка - путь к корневой папке диска ИТС +// +// Возвращаемое значение +// строка - путь к временному каталогу с файлами архива кладр +// +Функция ПреобразоватьФайлыКЛАДРEXEВZIP(знач ДискИТС) Экспорт + + ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ПолучитьИмяКаталога("kladr_files"); + + СоздатьКаталог(ВременныйКаталог); + + Если Прав(ДискИТС, 1) = "\" Тогда + ДискИТС = Лев(ДискИТС, СтрДлина(ДискИТС) - 1); + КонецЕсли; + + ПутьКФайламНаДискеИТС = ДискИТС + ПутьККаталогуСДаннымиКЛАДРНаДискеИТС(ДискИТС); + + СписокФайловДанных = СписокФайловДанныхНаДискеИТС(); + + Для Каждого ИмяФайла Из СписокФайловДанных Цикл + Файл = Новый Файл(ПутьКФайламНаДискеИТС + ИмяФайла); + Если Файл.Существует() Тогда + КопироватьФайл(ПутьКФайламНаДискеИТС + ИмяФайла, ВременныйКаталог + ИмяФайла); + Файл = Новый Файл(ВременныйКаталог + ИмяФайла); + Файл.УстановитьТолькоЧтение(Ложь); + КомандаСистемы(ИмяФайла + " -s", ВременныйКаталог); + КонецЕсли; + + ФайлDBF = Новый Файл(ВременныйКаталог+ЗаменитьРасширение_EXE_На_DBF(ИмяФайла)); + + Если Не ФайлDBF.Существует() Тогда + УдалитьФайлы(ВременныйКаталог); + Возврат Неопределено; + КонецЕсли; + + СжатьФайл(ВременныйКаталог, ЗаменитьРасширение_EXE_На_DBF(ИмяФайла), ВременныйКаталог); + КонецЦикла; + + Возврат ВременныйКаталог; + +КонецФункции + +// Сжимает файл из поставки КЛАДР в ZIP архив. +// +// Параметры +// ПутьКDBFФайлам - строка - путь к каталогу с файлами DBF +// ИмяФайла - строка - имя файла, который требуется сжать +// КаталогВременныхФайлов - строка - каталог, в который требуется сохранить файл архива +// +Процедура СжатьФайл(Знач ПутьКDBFФайлам, ИмяФайла, КаталогВременныхФайлов) Экспорт + + Если Не ЗначениеЗаполнено(КаталогВременныхФайлов) Тогда + КаталогВременныхФайлов = ОбщегоНазначенияКлиентСервер.ПолучитьИмяКаталога("kladr_files"); + СоздатьКаталог(КаталогВременныхФайлов); + КонецЕсли; + + ФайлDBF = ПутьКDBFФайлам + ИмяФайла; + Файл = Новый Файл(ФайлDBF); + Если Файл.Существует() Тогда + ПутьКФайлуАрхива = КаталогВременныхФайлов + ЗаменитьРасширение_DBF_На_ZIP(ИмяФайла); + ZIPФайл = Новый ЗаписьZipФайла(ПутьКФайлуАрхива, , , + МетодСжатияZIP.Сжатие, + УровеньСжатияZIP.Максимальный); + ZIPФайл.Добавить(ФайлDBF); + ZIPФайл.Записать(); + КонецЕсли; + +КонецПроцедуры + +// Загружает файлы КЛАДР региона с Веб сервера +// Параметры +// АдресныйОбъект - массив - каждая строка идентификатор адресного объекта в формате NN +// ДанныеАутентификации - структура - параметры аутентификации на пользовательском сайте 1С +// ключ - КодПользователя - значение - пользователь (логин) +// ключ - Пароль - значение - пароль пользователя +// Возвращаемое значение: структура, ключ Статус - булево - истина или ложь +// ключ значение - строка - если Статус ложь, содержит +// пояснение об ошибке. +// +Функция ЗагрузитьКЛАДРСВебСервера(знач АдресныйОбъект, знач ДанныеАутентификации, ВремКаталог) Экспорт + + URLСтрока = "http://downloads.v8.1c.ru/tmplts/ITS/KLADR/"; + + Если Не ЗначениеЗаполнено(ВремКаталог) Тогда + ВремКаталог = КаталогВременныхФайлов() + "kladr_files"; + СоздатьКаталог(ВремКаталог); + КонецЕсли; + + ПараметрыЗагрузкиФайла = Новый Структура; + ПараметрыЗагрузкиФайла.Вставить("Пользователь", ДанныеАутентификации.КодПользователя); + ПараметрыЗагрузкиФайла.Вставить("Пароль", ДанныеАутентификации.Пароль); + + ИмяZIP = "base" + АдресныйОбъект + ".zip"; + ПараметрыЗагрузкиФайла.Вставить("ПутьДляСохранения", ВремКаталог + "\" + ИмяZIP); + Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте(URLСтрока + ИмяZIP, + ПараметрыЗагрузкиФайла); + Если Не Результат.Статус Тогда + Возврат Результат; + КонецЕсли; + + Файл = Новый Файл(ВремКаталог + "\altnames.zip"); + Если Не Файл.Существует() Тогда + ПараметрыЗагрузкиФайла.Вставить("ПутьДляСохранения", ВремКаталог + "\altnames.zip"); + Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте(URLСтрока + "altnames.zip", + ПараметрыЗагрузкиФайла); + Если Не Результат.Статус Тогда + Возврат Результат; + КонецЕсли; + КонецЕсли; + + Файл = Новый Файл(ВремКаталог + "\socrbase.zip"); + Если Не Файл.Существует() Тогда + ПараметрыЗагрузкиФайла.Вставить("ПутьДляСохранения", ВремКаталог + "\socrbase.zip"); + Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте(URLСтрока + "socrbase.zip", + ПараметрыЗагрузкиФайла); + Если Не Результат.Статус Тогда + Возврат Результат; + КонецЕсли; + КонецЕсли; + + Возврат Новый Структура("Статус", Истина); + +КонецФункции + +#КонецЕсли + +// Передает сжатый файл КЛАДР на сервер. На стороне сервера файл распаковывается. +// +// Параметры +// ПутьКФайламНаКлиенте - строка - путь к каталогу с файлом +// ИмяФайла - строка - имя файла архива, который нужно передать на сервер и распаковывать +// +// Возвращаемое значение +// Строка - путь к каталогу на сервере, в который был распакован файл +// +// +Процедура ПередатьФайлНаСервер(знач ПутьКФайламНаКлиенте, знач ИмяФайла, ПутьККаталогуНаСервере) Экспорт + + ПутьКФайлуАрхива = ПутьКФайламНаКлиенте + ЗаменитьРасширение_DBF_На_ZIP(ИмяФайла); + + Файл = Новый Файл(ПутьКФайлуАрхива); + + Если Файл.Существует() Тогда + АдресныйКлассификатор.СохранитьФайлНаСервереИРаспаковать(Новый ДвоичныеДанные(ПутьКФайлуАрхива), + ЗаменитьРасширение_DBF_На_ZIP(ИмяФайла), + ПутьККаталогуНаСервере); + Иначе + ВызватьИсключение НСтр("ru = 'Невозможно передать файл данных на сервер. Файл не найден.'"); + КонецЕсли; + +КонецПроцедуры + +// Передает сжатый файлы КЛАДР на сервер. На стороне сервера файл распаковывается. +// +// Параметры: +// ПутьКФайламНаКлиенте - строка - путь к каталогу с файлом на клиенте +// ПутьККаталогуНаСервере - строка - путь к каталогу, в который будет распаковываться файл на сервере +// АдресныйОбъект - строка - номер адресного объекта в формате NN. +// ПередаватьТолькоОсновныеФайлы - булево - если истина, то будут передаваться только основные zip файлы, +// если ложь, так же будут передаваться файлы altnames.zip и socrbase.zip +// +Процедура ПередатьФайлыНаСерверПоАдреснымОбъектам(знач ПутьКФайламНаКлиенте, ПутьККаталогуНаСервере, АдресныйОбъект, ПередаватьТолькоОсновныеФайлы) Экспорт + + ИмяФайла = "base" + АдресныйОбъект + ".zip"; + АдресныйКлассификатор.СохранитьФайлНаСервереИРаспаковать(Новый ДвоичныеДанные(ПутьКФайламНаКлиенте + ИмяФайла), + ИмяФайла, + ПутьККаталогуНаСервере); + + Если Не ПередаватьТолькоОсновныеФайлы Тогда + АдресныйКлассификатор.СохранитьФайлНаСервереИРаспаковать(Новый ДвоичныеДанные(ПутьКФайламНаКлиенте + "altnames.zip"), + "altnames.zip", + ПутьККаталогуНаСервере); + АдресныйКлассификатор.СохранитьФайлНаСервереИРаспаковать(Новый ДвоичныеДанные(ПутьКФайламНаКлиенте + "socrbase.zip"), + "socrbase.zip", + ПутьККаталогуНаСервере); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/АдресныйКлассификаторКлиент/АдресныйКлассификаторКлиент.mdo b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/АдресныйКлассификаторКлиент.mdo new file mode 100644 index 000000000..380fdd33b --- /dev/null +++ b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/АдресныйКлассификаторКлиент.mdo @@ -0,0 +1,11 @@ + + + АдресныйКлассификаторКлиент + + ru + Адресный классификатор клиент + + true + true + true + diff --git a/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl new file mode 100644 index 000000000..8652b026e --- /dev/null +++ b/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl @@ -0,0 +1,90 @@ +// Проверяет наличие обновлений адресного классификатора на веб сервере +// для тех объектов, которые ранее уже загружались (для тех объектов +// для которых есть запись в регистре ВерсииОбъектовАдресногоКлассификатора). +// +// Возвращаемое значение +// Массив структур, в котором каждая структура имеет формат: +// ключ КодАдресногоОбъекта - строка - код адресного объекта +// ключ Наименование - строка - наименование адресного объекта +// ключ Сокращение - строка - сокращение адресного объекта +// ключ Индекс - строка - индекс адресного объекта +// ключ ОбновлениеДоступно - Булево +// +Функция ПроверитьОбновлениеАдресныхОбъектов() Экспорт + + ВерсияХранимыхСведений = АдресныйКлассификатор.ПолучитьВерсииАдресныхОбъектов(); + + URLСтрока = ПутьКФайлуОписаниюДанныхКЛАДР(); + +#Если Клиент Тогда + РезультатПолученияФайлов = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте(URLСтрока); +#Иначе + РезультатПолученияФайлов = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(URLСтрока); +#КонецЕсли + + Если Не РезультатПолученияФайлов.Статус Тогда + Возврат РезультатПолученияФайлов; + КонецЕсли; + + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.Прочитать(РезультатПолученияФайлов.Путь); + ТекстXML = ТекстовыйДокумент.ПолучитьТекст(); + + УдалитьФайлы(РезультатПолученияФайлов.Путь); + + Обновления = АдресныйКлассификатор.ПолучитьВерсииАдресныхСведений(ТекстXML); + + Результат = Новый Массив; + + Для Каждого ЭлементХранимаяВерсия Из ВерсияХранимыхСведений Цикл + АдресныеСведения = АдресныйКлассификатор.ИнформацияПоАдресномуОбъекту(ЭлементХранимаяВерсия.Ключ); + АдресныеСведения.Вставить("ОбновлениеДоступно", + Обновления[ЭлементХранимаяВерсия.Ключ] > ЭлементХранимаяВерсия.Значение); + Результат.Добавить(АдресныеСведения); + КонецЦикла; + + Возврат ОбщегоНазначенияКлиентСервер.ЗаполнитьРезультат(Результат); + +КонецФункции + +// Функция получает файл с данными по версиям адресных сведений и обновляет версии +// адресных объектов в регистре ВерсииОбъектовАдресногоКлассификатора +// +// Параметры +// АдресныеОбъекты - массив - каждый элемент - строка, номер адресного объекта в формате NN +// +// Возвращаемое значение: структура, ключ Статус - булево - истина или ложь +// ключ значение - строка - если Статус ложь, содержит +// пояснение об ошибке. +// +Функция ПолучитьФайлВерсийИОбновитьВерсиюАдресныхСведений(знач АдресныеОбъекты) Экспорт + +#Если Клиент Тогда + Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте(ПутьКФайлуОписаниюДанныхКЛАДР()); +#Иначе + Результат = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(ПутьКФайлуОписаниюДанныхКЛАДР()); +#КонецЕсли + + Если Не Результат.Статус Тогда + Возврат Результат; + КонецЕсли; + + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.Прочитать(Результат.Путь); + ТекстXML = ТекстовыйДокумент.ПолучитьТекст(); + + УдалитьФайлы(Результат.Путь); + + АдресныйКлассификатор.ОбновитьВерсиюАдресныхСведений(ТекстXML, АдресныеОбъекты); + + Возврат Новый Структура("Статус", Истина); + +КонецФункции + +// Путь к файлу на веб сервере, содержащему информацию по версиям адресных сведений +// +Функция ПутьКФайлуОписаниюДанныхКЛАДР() Экспорт + + Возврат "http://downloads.1c.ru/ipp/ITSREPV/V8Update/Configs/kladr/versions.xml"; + +КонецФункции diff --git a/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/АдресныйКлассификаторКлиентСервер.mdo b/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/АдресныйКлассификаторКлиентСервер.mdo new file mode 100644 index 000000000..3c20e6daf --- /dev/null +++ b/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/АдресныйКлассификаторКлиентСервер.mdo @@ -0,0 +1,12 @@ + + + АдресныйКлассификаторКлиентСервер + + ru + Адресный классификатор клиент сервер + + true + true + true + true + diff --git a/SSL/src/CommonModules/Анкетирование/Module.bsl b/SSL/src/CommonModules/Анкетирование/Module.bsl new file mode 100644 index 000000000..75e87dfb1 --- /dev/null +++ b/SSL/src/CommonModules/Анкетирование/Module.bsl @@ -0,0 +1,1890 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Устанавливает параметры отбора в отбор динамического списка +// +// Параметры +// Параметры - Структура - параметры, переданные форме +// ОтборДинамическогоСписка - Отбор - Отбор динамического списка, +// в который устанавливаются параметры отбора. +Процедура УстановитьПараметрыОтбораФормуВыбора(Параметры,ОтборДинамическогоСписка) Экспорт + + Если Параметры.Свойство("МассивОтбора") = Истина Тогда + + Для каждого ЭлементМассиваОтбора Из Параметры.МассивОтбора Цикл + + ЭлементОтбораДанных = ОтборДинамическогоСписка.Элементы.Добавить(ЭлементМассиваОтбора.ТипОтбора); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ЭлементМассиваОтбора.ЛевоеЗначение); + ЭлементОтбораДанных.Использование = Истина; + ЭлементОтбораДанных.ВидСравнения = ЭлементМассиваОтбора.ВидСравнения; + ЭлементОтбораДанных.ПравоеЗначение = ЭлементМассиваОтбора.ПравоеЗначение; + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры // УстановитьПараметрыОтбораФормуВыбора() + +// Функция заполняет структуру значениями перечисления +// +// Параметры +// ИмяПеречисления - строка - имя перечисления +// Включать пустую ссылку - булево - добавлять ли в структуру значение пустой ссылки +// +// Возвращаемое значение: +// СтруктураВозврата - Структура содержащая значения перечисления, +// в том числе пустое значение. +Функция ПолучитьСтруктуруЗначенияПеречисления(ИмяПеречисления, ВключатьПустуюСсылку = ЛОЖЬ) Экспорт + + СтруктураВозврата = Новый Структура; + Для каждого ЭлементМетаданных Из Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления Цикл + СтруктураВозврата.Вставить(ЭлементМетаданных.Имя,Перечисления[ИмяПеречисления][ЭлементМетаданных.Имя]); + КонецЦикла; + + Если ВключатьПустуюСсылку Тогда + СтруктураВозврата.Вставить("ПустаяСсылка",Перечисления[ИмяПеречисления].ПустаяСсылка()); + КонецЕсли; + + Возврат СтруктураВозврата; + +КонецФункции // ПолучитьСтруктуруЗначенияПеречисления() + +// Процедура удаляет старые элементы вопроса шаблона анкеты. +// +Процедура УдалитьВопросыШаблонаАнкеты(СсылкаВладелец) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + //удалим старые вопросы шаблона + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ВопросыШаблонаАнкеты.Ссылка + |ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + |ГДЕ + | ВопросыШаблонаАнкеты.Владелец = &Владелец"; + + Запрос.УстановитьПараметр("Владелец",СсылкаВладелец); + + РезультатЗапроса = Запрос.Выполнить(); + Если Не РезультатЗапроса.Пустой() Тогда + + МассивСсылок = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Ссылка"); + Для каждого ЭлементМассива Из МассивСсылок Цикл + + СправочникОбъект = ЭлементМассива.ПолучитьОбъект(); + Если (НЕ СправочникОбъект = Неопределено) Тогда + СправочникОбъект.Удалить(); + КонецЕсли; + + КонецЦикла; + КонецЕсли; + + УстановитьПривилегированныйРежим(Ложь); + +КонецПроцедуры // УдалитьВопросыШаблонаАнкеты() + +// Возвращает код картинки в зависимости от типа вопроса и принадлежности к разделу. +// +// Параметры +// ЭтоРаздел - Булево - признак раздела +// ТипВопроса - Перечисление.ТипыВопросовШаблонаАнкеты +// +// Возвращаемое значение: +// Число - код картинки для отображения в дереве +// +Функция ПолучитьКодКартинкиШаблонаАнкеты(ЭтоРаздел,ТипВопроса = Неопределено) Экспорт + + Если ЭтоРаздел Тогда + Возврат 1; + ИначеЕсли ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Простой Тогда + Возврат 2; + ИначеЕсли ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.ВопросСУсловием Тогда + Возврат 4; + ИначеЕсли ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда + Возврат 3; + Иначе + Возврат 0; + КонецЕсли; + +КонецФункции // () + +// Получает представления элементарный вопросов табличных вопросов +// и заполняет соответствие ПредставленияВопросов, из которого потом будут получаться представления +// вопросов при выводе табличных вопросов. +// +// Параметры: +// ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет, по которому проводился опрос +// +// ВозвращаемоеЗначение: +// Соответствие - в качестве ключа выступает ссылка на вопрос, в качестве значения его формулировка +// +Функция ПолучитьПредставленияЭлементарныхВопросовТабличногоВопроса(ШаблонАнкеты) Экспорт + + ПредставленияВопросов = Новый Соответствие; + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ВопросыШаблонаАнкеты.Ссылка + |ПОМЕСТИТЬ ВопросыШаблона + |ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + |ГДЕ + | ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВопросыШаблонаАнкетыСоставТабличногоВопроса.ЭлементарныйВопрос + |ПОМЕСТИТЬ ЭлементарныеВопросы + |ИЗ + | Справочник.ВопросыШаблонаАнкеты.СоставТабличногоВопроса КАК ВопросыШаблонаАнкетыСоставТабличногоВопроса + |ГДЕ + | ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка В + | (ВЫБРАТЬ + | ВопросыШаблона.Ссылка + | ИЗ + | ВопросыШаблона КАК ВопросыШаблона) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВопросыДляАнкетирования.Ссылка, + | ВопросыДляАнкетирования.Формулировка, + | ВопросыДляАнкетирования.АгрегироватьСуммуВОтчетах + |ИЗ + | ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования + |ГДЕ + | ВопросыДляАнкетирования.Ссылка В + | (ВЫБРАТЬ + | ЭлементарныеВопросы.ЭлементарныйВопрос + | ИЗ + | ЭлементарныеВопросы КАК ЭлементарныеВопросы)"; + + Запрос.УстановитьПараметр("ШаблонАнкеты",ШаблонАнкеты); + + Результат = Запрос.Выполнить(); + Если НЕ Результат.Пустой() Тогда + + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + ПредставленияВопросов.Вставить(Выборка.Ссылка,Новый Структура("Формулировка,АгрегироватьСуммуВОтчетах", Выборка.Формулировка,Выборка.АгрегироватьСуммуВОтчетах)); + КонецЦикла; + + КонецЕсли; + + Возврат ПредставленияВопросов; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ЗАПОЛНЕНИЕ ДЕРЕВА АНКЕТЫ + +//Обновляет превью табличного вопроса +Процедура ОбновитьПревьюТабличныйВопрос(Вопросы,Ответы,ТипТабличногоВопроса,Форма,ИмяТаблицыПревью,Ключ) Экспорт + + ИмяКолонкиБезНомера = "ПревьюТаблицаКолонка_" + СтрЗаменить(Строка(Ключ),"-","_") + "_"; + ОписаниеТиповСтрока = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(70)); + + РезультирующаяТаблицаСервер = Форма.РеквизитФормыВЗначение(ИмяТаблицыПревью); + РезультирующаяТаблицаСервер.Колонки.Очистить(); + + УдаляемыеРеквизиты = Новый Массив; + УдаляемыеЭлементыФормы = Новый Массив; + МассивТекущихКолонокРезультирующейТаблицы = Форма.ПолучитьРеквизиты(ИмяТаблицыПревью); + Для каждого ЭлементМассива Из МассивТекущихКолонокРезультирующейТаблицы Цикл + УдаляемыеРеквизиты.Добавить(ЭлементМассива.Путь + "." + ЭлементМассива.Имя); + УдаляемыеЭлементыФормы.Добавить(ЭлементМассива.Имя); + КонецЦикла; + + Для каждого ЭлементМассива Из УдаляемыеЭлементыФормы Цикл + НайденныйЭлементФормы = Форма.Элементы.Найти(ЭлементМассива); + Если НайденныйЭлементФормы <> Неопределено Тогда + Форма.Элементы.Удалить(НайденныйЭлементФормы); + КонецЕсли; + КонецЦикла; + + ДобавляемыеРеквизиты = Новый Массив; + СчетчикКолонок = 0; + + МассивВопросы = Вопросы.ВыгрузитьКолонку("ЭлементарныйВопрос"); + + Если Вопросы.Колонки.Найти("НомерСтроки") = Неопределено Тогда + Вопросы.Колонки.Добавить("НомерСтроки",Новый ОписаниеТипов("Число")); + КонецЕсли; + + Для инд = 0 По Вопросы.Количество()- 1 Цикл + Вопросы[инд].НомерСтроки = инд; + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | Вопросы.ЭлементарныйВопрос КАК Вопрос, + | Вопросы.НомерСтроки + |ПОМЕСТИТЬ Вопросы + |ИЗ + | &Вопросы КАК Вопросы + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВопросыДляАнкетирования.Формулировка, + | ВопросыДляАнкетирования.ТипЗначения + |ИЗ + | Вопросы КАК Вопросы + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования + | ПО Вопросы.Вопрос = ВопросыДляАнкетирования.Ссылка + |ГДЕ + | ВопросыДляАнкетирования.Ссылка В(&Вопросы) + | + |УПОРЯДОЧИТЬ ПО + | Вопросы.НомерСтроки"; + + Запрос.УстановитьПараметр("Вопросы",Вопросы); + + Результат = Запрос.Выполнить(); + Если Результат.Пустой() Тогда + Возврат; + КонецЕсли; + + Если ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Тогда + + ВыборкаВопросы = Результат.Выбрать(); + Пока ВыборкаВопросы.Следующий() Цикл + + СчетчикКолонок = СчетчикКолонок + 1; + РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + Строка(СчетчикКолонок),ВыборкаВопросы.ТипЗначения,ВыборкаВопросы.Формулировка); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(СчетчикКолонок),ВыборкаВопросы.ТипЗначения,ИмяТаблицыПревью)); + + КонецЦикла; + + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда + + ВыборкаВопросы = Результат.Выбрать(); + Пока ВыборкаВопросы.Следующий() Цикл + + СчетчикКолонок = СчетчикКолонок + 1; + РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + Строка(СчетчикКолонок),ВыборкаВопросы.ТипЗначения,ВыборкаВопросы.Формулировка); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(СчетчикКолонок),ВыборкаВопросы.ТипЗначения,ИмяТаблицыПревью)); + + КонецЦикла; + + Для инд = 1 По Ответы.Количество() Цикл + + НоваяСтрока = РезультирующаяТаблицаСервер.Добавить(); + НоваяСтрока[0] = Ответы[инд - 1].Ответ; + + КонецЦикла; + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда + + ВыборкаВопросы = Результат.Выбрать(); + Если ВыборкаВопросы.Следующий() Тогда + + СчетчикКолонок = СчетчикКолонок + 1; + РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + "1",ОписаниеТиповСтрока,ВыборкаВопросы.Формулировка); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + "1",ОписаниеТиповСтрока,ИмяТаблицыПревью)); + + КонецЕсли; + + Для инд = 1 По Ответы.Количество() Цикл + + РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + Строка(инд + 1),ОписаниеТиповСтрока,Ответы[инд-1].Ответ); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(инд + 1),ОписаниеТиповСтрока,ИмяТаблицыПревью)); + + КонецЦикла; + + Пока ВыборкаВопросы.Следующий() Цикл + + НоваяСтрока = РезультирующаяТаблицаСервер.Добавить(); + НоваяСтрока[0] = ВыборкаВопросы.Формулировка; + + КонецЦикла; + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + + ТаблицаВопросы = Результат.Выгрузить(); + + РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + "1",ТаблицаВопросы[0].ТипЗначения,ТаблицаВопросы[0].Формулировка); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + "1",ТаблицаВопросы[0].ТипЗначения,ИмяТаблицыПревью)); + + ОтветыВКолонках = Ответы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",МассивВопросы[1])); + Для инд = 1 По ОтветыВКолонках.Количество() Цикл + + РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + Строка(инд + 1),ТаблицаВопросы[2].ТипЗначения,ОтветыВКолонках[инд-1].Ответ); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(инд + 1),ТаблицаВопросы[2].ТипЗначения,ИмяТаблицыПревью)); + + КонецЦикла; + + ОтветыВСтроках = Ответы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",МассивВопросы[0])); + Для инд = 1 По ОтветыВСтроках.Количество() Цикл + + НоваяСтрока = РезультирующаяТаблицаСервер.Добавить(); + НоваяСтрока[0] = ОтветыВСтроках[инд - 1].Ответ; + + КонецЦикла; + + КонецЕсли; + + Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты,УдаляемыеРеквизиты); + Форма.ЗначениеВРеквизитФормы(РезультирующаяТаблицаСервер,ИмяТаблицыПревью); + + Для инд = 1 По ДобавляемыеРеквизиты.Количество() Цикл + + Элемент = Форма.Элементы.Добавить(ИмяКолонкиБезНомера + Строка(инд),Тип("ПолеФормы"), Форма.Элементы[ИмяТаблицыПревью]); + Если ДобавляемыеРеквизиты[инд-1].ТипЗначения = Новый ОписаниеТипов("Булево") Тогда + Элемент.Вид = ВидПоляФормы.ПолеФлажка; + Иначе + Элемент.Вид = ВидПоляФормы.ПолеВвода; + КонецЕсли; + + Элемент.ПутьКДанным = ИмяТаблицыПревью + "." + ИмяКолонкиБезНомера + Строка(инд); + Если (ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной + ИЛИ ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках) ИЛИ (инд > 1) Тогда + Элемент.Заголовок = РезультирующаяТаблицаСервер.Колонки[инд -1].Заголовок; + Иначе + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +//Процедура устанавливает корневой элемент в дерево шаблона анкеты. +//Вызывается при создании форм, в которых отражается шаблон анкеты +Процедура УстановитьКорневойЭлементДереваАнкеты(ДеревоАнкеты) Экспорт + + ЭлементыДерева = ДеревоАнкеты.ПолучитьЭлементы(); + НоваяСтрока = ЭлементыДерева.Добавить(); + + НоваяСтрока.Формулировка = "Анкета"; + НоваяСтрока.ТипСтроки = "Корень"; + НоваяСтрока.КодКартинки = ПолучитьКодКартинкиШаблонаАнкеты(Ложь); + +КонецПроцедуры // () + + // Устанавливает для дерева разделов элементы вступление и заключение + // + // Параметры + // ДеревоАнкеты - ДанныеФормыДерево + // Формулировка - <Тип.Вид> - строка + // + Процедура УстановитьЭлементДереваРазделовАнкетыВступлениеЗаключение(ДеревоАнкеты,Формулировка) Экспорт + + ЭлементыДерева = ДеревоАнкеты.ПолучитьЭлементы(); + НоваяСтрока = ЭлементыДерева.Добавить(); + + НоваяСтрока.Формулировка = Формулировка; + НоваяСтрока.ТипСтроки = Формулировка; + НоваяСтрока.КодКартинки = ПолучитьКодКартинкиШаблонаАнкеты(Ложь); + + КонецПроцедуры // УстановитьЭлементДереваАнкетыВступлениеЗаключение() + +//Заполняет дерево шаблона анкеты +// +// Параметры +// Форма - УправляемаяФорма - форма, для которой заполняется дерево +// ИмяДереваАнкеты - Строка - имя реквизита формы, в котором будет содержаться дерево анкеты +// ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет - ссылка на шаблон анкеты, согласно которому будет заполнено дерево +// ЗаполнятьСтраницыПревью - Булево - признак, необходимо ли формировать таблицы превью табличных вопросов +// +Процедура ЗаполнитьДеревоШаблонаАнкеты(Форма, ИмяДереваАнкеты, ШаблонАнкеты,ЗаполнятьСтраницыПревью = Истина) Экспорт + + Если ШаблонАнкеты = Справочники.ШаблоныАнкет.ПустаяСсылка() Тогда + Возврат; + КонецЕсли; + + Результат = ВыполнитьЗапросПоВопросамШаблонаАнкеты(ШаблонАнкеты); + Если Результат.Пустой() Тогда + Возврат; + КонецЕсли; + + ДеревоАнкетыСервер = Форма.РеквизитФормыВЗначение(ИмяДереваАнкеты); + + Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); + + Если Выборка.Количество() > 0 Тогда + ДобавитьСтрокиДереваАнкеты(Выборка,ДеревоАнкетыСервер.Строки[0],1,Форма); + КонецЕсли; + + Если ЗаполнятьСтраницыПревью Тогда + НайденныеСтроки = ДеревоАнкетыСервер.Строки.НайтиСтроки(Новый Структура("ТипВопроса",Перечисления.ТипыВопросовШаблонаАнкеты.Табличный),Истина); + ДобавитьСтраницыПревью(НайденныеСтроки,Форма,ШаблонАнкеты); + КонецЕсли; + + Форма.ЗначениеВРеквизитФормы(ДеревоАнкетыСервер,ИмяДереваАнкеты); + +КонецПроцедуры // ЗаполнитьДеревоШаблонаАнкеты() + +//Вызывается рекурсивно и добавляет строки в дерево анкеты +// +// Параметры +// Выборка - Выборка из запроса - текущая выборка результата запроса +// СтрокаРодитель - Строка дерева значений - родительская строка дерева значений +// +Процедура ДобавитьСтрокиДереваАнкеты(Выборка,СтрокаРодитель,УровеньРекурсии,Форма) + + Пока Выборка.Следующий() Цикл + + Если Не ЗначениеЗаполнено(Выборка.РодительВопрос) Тогда + НоваяСтрока = СтрокаРодитель.Строки.Добавить(); + Иначе + СтрокаРодительПодчиненногоВопроса = СтрокаРодитель.Строки.Найти(Выборка.РодительВопрос,"ВопросШаблона"); + Если СтрокаРодительПодчиненногоВопроса <> Неопределено Тогда + НоваяСтрока = СтрокаРодительПодчиненногоВопроса.Строки.Добавить(); + КонецЕсли; + КонецЕсли; + + НоваяСтрока.ВопросШаблона = Выборка.ВопросШаблона; + НоваяСтрока.КодКартинки = Анкетирование.ПолучитьКодКартинкиШаблонаАнкеты(Выборка.ЭтоРаздел,Выборка.ТипВопроса); + НоваяСтрока.ТипВопроса = Выборка.ТипВопроса; + НоваяСтрока.ТипТабличногоВопроса = Выборка.ТипТабличногоВопроса; + НоваяСтрока.ТипСтроки = ?(Выборка.ЭтоРаздел,"Раздел","Вопрос"); + Если Форма.ИмяФормы = "Справочник.ШаблоныАнкет.Форма.ФормаЭлемента" Тогда + НоваяСтрока.ЭлементарныйВопрос = ?(Выборка.ЭтоРаздел,Выборка.Наименование,?(Выборка.ТипВопроса <> Перечисления.ТипыВопросовШаблонаАнкеты.Табличный,Выборка.ЭлементарныйВопрос,Выборка.Формулировка)); + НоваяСтрока.Обязательный = ?(Выборка.ЭтоРаздел,Неопределено,?(Выборка.ТипВопроса <> Перечисления.ТипыВопросовШаблонаАнкеты.Табличный,Выборка.Обязательный,Неопределено)); + НоваяСтрока.Формулировка = ?(Выборка.ЭтоРаздел,Выборка.Наименование,Выборка.Формулировка); + НоваяСтрока.Заметки = Выборка.Заметки; + Иначе + НоваяСтрока.Формулировка = Выборка.Формулировка; + НоваяСтрока.ЭлементарныйВопрос = Выборка.ЭлементарныйВопрос; + НоваяСтрока.Обязательный = Выборка.Обязательный; + КонецЕсли; + + НоваяСтрока.Наименование = Выборка.Наименование; + НоваяСтрока.ТипОтвета = Выборка.ТипОтвета; + НоваяСтрока.СоставТабличногоВопроса = Выборка.СоставТабличногоВопроса.Выгрузить(); + НоваяСтрока.СоставТабличногоВопроса.Сортировать("НомерСтроки Возр"); + НоваяСтрока.ПредопределенныеОтветы = Выборка.ПредопределенныеОтветы.Выгрузить(); + НоваяСтрока.ПредопределенныеОтветы.Сортировать("НомерСтроки Возр"); + НоваяСтрока.КлючСтроки = Новый УникальныйИдентификатор; + НоваяСтрока.Длина = Выборка.Длина; + НоваяСтрока.МинимальноеЗначение = Выборка.МинимальноеЗначение; + НоваяСтрока.МаксимальноеЗначение = Выборка.МаксимальноеЗначение; + НоваяСтрока.ТребуетсяКомментарий = Выборка.ТребуетсяКомментарий; + НоваяСтрока.ПояснениеКомментария = Выборка.ПояснениеКомментария; + НоваяСтрока.ТипЗначения = ?(Выборка.ТипЗначения = NULL,Неопределено,Выборка.ТипЗначения); + НоваяСтрока.Точность = Выборка.Точность; + НоваяСтрока.ВысотаЭлементаФормулировкиВопроса = Выборка.ВысотаЭлементаФормулировкиВопроса; + + ПодчиненнаяВыборка = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); + Если ПодчиненнаяВыборка.Количество() > 0 Тогда + ДобавитьСтрокиДереваАнкеты(ПодчиненнаяВыборка,НоваяСтрока,УровеньРекурсии + 1,Форма); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // ДобавитьСтрокиДереваАнкеты() + +//Выполняет запрос по шаблона анкеты, для формирования дерева анкеты в формах +// +// Параметры +// ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет - ссылка на шаблон анкеты, по которому будет выполнен запрос +// +// Возвращаемое значение +// РезультатЗапроса - результат запроса по шаблону анкеты +Функция ВыполнитьЗапросПоВопросамШаблонаАнкеты(ШаблонАнкеты) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ВопросыШаблонаАнкеты.Ссылка КАК ВопросШаблона, + | ВопросыШаблонаАнкеты.Родитель КАК Родитель, + | ВопросыШаблонаАнкеты.Наименование КАК Наименование, + | ВопросыШаблонаАнкеты.Обязательный КАК Обязательный, + | ВопросыШаблонаАнкеты.ТипВопроса КАК ТипВопроса, + | ВопросыШаблонаАнкеты.ТипТабличногоВопроса КАК ТипТабличногоВопроса, + | ВопросыШаблонаАнкеты.ЭлементарныйВопрос КАК ЭлементарныйВопрос, + | ВопросыШаблонаАнкеты.ЭтоГруппа КАК ЭтоРаздел, + | ВопросыШаблонаАнкеты.РодительВопрос КАК РодительВопрос, + | ВопросыШаблонаАнкеты.СоставТабличногоВопроса.( + | НомерСтроки КАК НомерСтроки, + | ЭлементарныйВопрос + | ), + | ВопросыШаблонаАнкеты.ПредопределенныеОтветы.( + | НомерСтроки КАК НомерСтроки, + | ЭлементарныйВопрос, + | Ответ + | ), + | ЕСТЬNULL(ВопросыДляАнкетирования.Длина, 0) КАК Длина, + | ВопросыДляАнкетирования.ТипЗначения КАК ТипЗначения, + | ЕСТЬNULL(ВопросыДляАнкетирования.ТребуетсяКомментарий, ЛОЖЬ) КАК ТребуетсяКомментарий, + | ЕСТЬNULL(ВопросыДляАнкетирования.ПояснениеКомментария, """") КАК ПояснениеКомментария, + | ЕСТЬNULL(ВопросыДляАнкетирования.МинимальноеЗначение, 0) КАК МинимальноеЗначение, + | ЕСТЬNULL(ВопросыДляАнкетирования.МаксимальноеЗначение, 0) КАК МаксимальноеЗначение, + | ЕСТЬNULL(ВопросыДляАнкетирования.ТипОтвета, ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.ПустаяСсылка)) КАК ТипОтвета, + | ЕСТЬNULL(ВопросыШаблонаАнкеты.Формулировка, """") КАК Формулировка, + | ЕСТЬNULL(ВопросыДляАнкетирования.Точность, 0) КАК Точность, + | ВопросыШаблонаАнкеты.ВысотаЭлементаФормулировкиВопроса КАК ВысотаЭлементаФормулировкиВопроса, + | ВопросыШаблонаАнкеты.Заметки + |ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования + | ПО ВопросыШаблонаАнкеты.ЭлементарныйВопрос = ВопросыДляАнкетирования.Ссылка + |ГДЕ + | (НЕ ВопросыШаблонаАнкеты.ПометкаУдаления) + | И ВопросыШаблонаАнкеты.Владелец = &Владелец + | + |УПОРЯДОЧИТЬ ПО + | ВопросыШаблонаАнкеты.Ссылка ИЕРАРХИЯ"; + + Запрос.УстановитьПараметр("Владелец",ШаблонАнкеты); + + Возврат Запрос.Выполнить(); + +КонецФункции // () + +// Добавляет страницы превью табличных вопросов +// +// Параметры +// СтрокиДерева - СтрокиДереваЗначений - строки дерева значений подчиненные корню дерева +// Форма - УправляемаяФорма - форма для которой добавляются превью табличного вопроса +// ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет - шаблон, на основании которого формируются превью +// +Процедура ДобавитьСтраницыПревью(СтрокиДерева,Форма,ШаблонАнкеты) + + ДобавляемыеРеквизиты = Новый Массив; + + УдаляемыеРеквизиты = Новый Массив; + МассивРеквизитов = Форма.ПолучитьРеквизиты(); + Для каждого Реквизит Из МассивРеквизитов Цикл + Если СтрЧислоВхождений(Реквизит.Имя,"ПревьюТабличногоВопроса") > 0 Тогда + УдаляемыеРеквизиты.Добавить(Реквизит.Имя); + КонецЕсли + КонецЦикла; + + ПредставленияВопросов = ПолучитьПредставленияЭлементарныхВопросовТабличногоВопроса(ШаблонАнкеты); + ДобавитьРеквизитыТаблицПревью(СтрокиДерева,Форма,ДобавляемыеРеквизиты,ПредставленияВопросов); + Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты,УдаляемыеРеквизиты); + ДобавитьЭлементыФормыТаблицПревью(СтрокиДерева,Форма,ДобавляемыеРеквизиты,ПредставленияВопросов); + +КонецПроцедуры + +// Добавляет реквизиты таблиц превью табличный вопросов +// +// Параметры +// СтрокиДерева - СтрокиДереваЗначений - строки дерева значений подчиненные корню дерева +// Форма - УправляемаяФорма - форма для которой добавляются превью табличного вопроса +// ДобавляемыеРеквизиты - Массив - массив, в котором аккумулируются добавляемые реквизиты +// ПредставленияВопросов - Соответствие - в нем хранятся представления элементарных вопросов +// +Процедура ДобавитьРеквизитыТаблицПревью(СтрокиДерева,Форма,ДобавляемыеРеквизиты,ПредставленияВопросов) + + ОписаниеТиповСтрока30 = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(70)); + ОписаниеТиповСтрока300 = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(300)); + + Для каждого СтрокаДерева Из СтрокиДерева Цикл + + СтрокаКлюч = СтрЗаменить(Строка(СтрокаДерева.КлючСтроки),"-","_"); + ИмяТаблицы = "ПревьюТабличногоВопроса_" + СтрокаКлюч; + ИмяКолонкиБезНомера = "ПревьюТаблицаКолонка_" + СтрокаКлюч + "_"; + ТипТабличногоВопроса = СтрокаДерева.ТипТабличногоВопроса; + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяТаблицы,Новый ОписаниеТипов("ТаблицаЗначений"))); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Формулировка_" + ИмяТаблицы,ОписаниеТиповСтрока300)); + + Если ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Тогда + + Для инд = 1 По СтрокаДерева.СоставТабличногоВопроса.Количество() Цикл + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(инд),ОписаниеТиповСтрока30,ИмяТаблицы,ПредставленияВопросов.Получить(СтрокаДерева.СоставТабличногоВопроса[инд-1].ЭлементарныйВопрос).Формулировка)); + КонецЦикла; + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + "1",СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос.ТипЗначения,ИмяТаблицы,ПредставленияВопросов.Получить(СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос).Формулировка)); + + Для инд = 2 По СтрокаДерева.СоставТабличногоВопроса.Количество() Цикл + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(инд),ОписаниеТиповСтрока30,ИмяТаблицы,ПредставленияВопросов.Получить(СтрокаДерева.СоставТабличногоВопроса[инд-1].ЭлементарныйВопрос).Формулировка)); + + КонецЦикла; + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + "1",ОписаниеТиповСтрока300,ИмяТаблицы,ПредставленияВопросов.Получить(СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос).Формулировка)); + Для инд = 1 По СтрокаДерева.ПредопределенныеОтветы.Количество() Цикл + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(инд+1),ОписаниеТиповСтрока30,ИмяТаблицы,СтрокаДерева.ПредопределенныеОтветы[инд-1].Ответ)); + КонецЦикла; + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + "1",СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос.ТипЗначения,ИмяТаблицы)); + + ОтветыВКолонках = СтрокаДерева.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",СтрокаДерева.СоставТабличногоВопроса[1].ЭлементарныйВопрос)); + Для инд = 1 По ОтветыВКолонках.Количество() Цикл + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(инд + 1),ОписаниеТиповСтрока30,ИмяТаблицы,ОтветыВКолонках[инд-1].Ответ)); + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Добавляет элементы формы таблиц превью табличный вопросов +// +// Параметры +// СтрокиДерева - СтрокиДереваЗначений - строки дерева значений подчиненные корню дерева +// Форма - УправляемаяФорма - форма для которой добавляются превью табличного вопроса +// ДобавляемыеРеквизиты - Массив - массив, в котором аккумулируются добавляемые реквизиты +// ПредставленияВопросов - Соответствие - в нем хранятся представления элементарных вопросов +// +Процедура ДобавитьЭлементыФормыТаблицПревью(СтрокиДерева,Форма,ДобавляемыеРеквизиты,ПредставленияВопросов) + + Для каждого СтрокаДерева Из СтрокиДерева Цикл + + ТипТабличногоВопроса = СтрокаДерева.ТипТабличногоВопроса; + СтрокаКлюч = СтрЗаменить(Строка(СтрокаДерева.КлючСтроки),"-","_"); + ИмяТаблицы = "ПревьюТабличногоВопроса_" + СтрокаКлюч; + ИмяКолонкиБезНомера = "ПревьюТаблицаКолонка_" + СтрокаКлюч + "_"; + + ЭлементСтраница = Форма.Элементы.Добавить("Страница_" + ИмяТаблицы,Тип("ГруппаФормы"),Форма.Элементы.СтраницыИнформация); + ЭлементСтраница.Вид = ВидГруппыФормы.Страница; + ЭлементСтраница.ОтображатьЗаголовок = Ложь; + ЭлементСтраница.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + + Элемент = Форма.Элементы.Добавить("Формулировка_" + ИмяТаблицы,Тип("ПолеФормы"),ЭлементСтраница); + Элемент.ПутьКДанным = "Формулировка_" + ИмяТаблицы; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Элемент.Высота = 2; + Элемент.Шрифт = Новый Шрифт("MS Shell Dlg",10,Истина); + + Форма["Формулировка_" + ИмяТаблицы] = СтрокаДерева.ПолныйКод + " " + СтрокаДерева.Формулировка; + + Элемент = Форма.Элементы.Добавить(ИмяТаблицы,Тип("ТаблицаФормы"),ЭлементСтраница); + Элемент.ТолькоПросмотр = Истина; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Элемент.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; + Элемент.ПутьКДанным = ИмяТаблицы; + + ТаблицаСервер = Форма.РеквизитФормыВЗначение(ИмяТаблицы); + + Если ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда + + Для инд = 1 По СтрокаДерева.ПредопределенныеОтветы.Количество() Цикл + + НоваяСтрока = ТаблицаСервер.Добавить(); + НоваяСтрока[0] = СтрокаДерева.ПредопределенныеОтветы[инд - 1].Ответ; + + КонецЦикла; + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда + + Для инд = 2 По СтрокаДерева.СоставТабличногоВопроса.Количество() Цикл + + НоваяСтрока = ТаблицаСервер.Добавить(); + НоваяСтрока[0] = ПредставленияВопросов.Получить(СтрокаДерева.СоставТабличногоВопроса[инд-1].ЭлементарныйВопрос).Формулировка; + + КонецЦикла; + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + + ОтветыВСтроках = СтрокаДерева.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос)); + Для инд = 1 По ОтветыВСтроках.Количество() Цикл + + НоваяСтрока = ТаблицаСервер.Добавить(); + НоваяСтрока[0] = ОтветыВСтроках[инд - 1].Ответ; + + КонецЦикла; + + КонецЕсли; + + Для инд = 1 По ТаблицаСервер.Колонки.Количество() Цикл + + Элемент = Форма.Элементы.Добавить(ИмяКолонкиБезНомера + Строка(инд),Тип("ПолеФормы"), Форма.Элементы[ИмяТаблицы]); + Если ТаблицаСервер.Колонки[инд-1].ТипЗначения = Новый ОписаниеТипов("Булево") Тогда + Элемент.Вид = ВидПоляФормы.ПолеФлажка; + Иначе + Элемент.Вид = ВидПоляФормы.ПолеВвода; + КонецЕсли; + + Элемент.ПутьКДанным = ИмяТаблицы + "." + ИмяКолонкиБезНомера + Строка(инд); + Если (ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной + ИЛИ ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках) ИЛИ (инд > 1) Тогда + Элемент.Заголовок = ТаблицаСервер.Колонки[инд -1].Заголовок; + Иначе + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + КонецЕсли; + + КонецЦикла; + + Форма.ЗначениеВРеквизитФормы(ТаблицаСервер,ИмяТаблицы); + + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ФОРМИРОВАНИЕ ФОРМЫ ЗАПОЛНЕНИЯ АНКЕТЫ + + // Выполняет построение формы, согласно раздела шаблона анкеты + // + // Параметры + // Форма - УправляемаяФорма - форма для которой получается информация + // ТекущиеДанныеДеревоРазделов - ДанныеФормыЭлементДерева - текущий раздел, для которого строится форма заполнения + // + Процедура ПостроениеФормыЗаполненияПоРазделу(Форма,ТекущиеДанныеДеревоРазделов) Экспорт + + ДобавляемыеРеквизиты = Новый Массив; + Форма.ТаблицаВопросовРаздела.Очистить(); + + Если ТекущиеДанныеДеревоРазделов.ТипСтроки = "Раздел" Тогда + + Форма.Элементы.НадписьВступление.Заголовок = "Раздел " + ТекущиеДанныеДеревоРазделов.Формулировка; + Форма.Элементы.НадписьВступление.ЦветТекста = WebЦвета.НейтральноКоричневый; + Форма.Элементы.НадписьВступление.Шрифт = Новый Шрифт(, 8, Истина, , , ); + + Раздел = ТекущиеДанныеДеревоРазделов.Ссылка; + ПолныйКодРаздела = ТекущиеДанныеДеревоРазделов.ПолныйКод; + + //получение вопросов раздела + Форма.ТаблицаВопросовРаздела.Очистить(); + ПолучитьИнформациюПоВопросамАнкеты(Форма,Форма.ШаблонАнкеты,Раздел,ПолныйКодРаздела); + СформироватьДобавляемыеРеквизитыДляРаздела(ДобавляемыеРеквизиты,Форма); + + Иначе + + Форма.Элементы.НадписьВступление.Заголовок = ?(ТекущиеДанныеДеревоРазделов.ТипСтроки = "Вступление",Форма.Вступление,Форма.Заключение); + Форма.Элементы.НадписьВступление.ЦветТекста = ЦветаСтиля.ЦветТекстаПоля; + Форма.Элементы.НадписьВступление.Шрифт = Новый Шрифт(, 8, Ложь, , , ); + + КонецЕсли; + + Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты,Форма.ДобавленныеДинамическиРеквизиты.ВыгрузитьЗначения()); + + //удаление ранее динамически сформированных элементов формы + УдалитьЭлементыФормыЗаполнения(Форма,Форма.ДобавленныеДинамическиРеквизиты); + Форма.ДобавленныеДинамическиРеквизиты.Очистить(); + Для каждого ДобавленныйРеквизит Из ДобавляемыеРеквизиты Цикл + Если ПустаяСтрока(ДобавленныйРеквизит.Путь) Тогда + Форма.ДобавленныеДинамическиРеквизиты.Добавить(ДобавленныйРеквизит.Имя); + КонецЕсли; + КонецЦикла; + + Если ТекущиеДанныеДеревоРазделов.ТипСтроки = "Раздел" Тогда + //добавление элементов формы + СформироватьЭлементыФормыДляРаздела(Форма); + КонецЕсли; + + КонецПроцедуры // () + +//////////////////////////////////////////////////////////////////////////////// +// СОЗДАНИЕ РЕКВИЗИТОВ ФОРМЫ ЗАПОЛНЕНИЯ АНКЕТЫ + +// Формирует массив добавляемых реквизитов +// +// Параметры +// ДобавляемыеРеквизиты - Массив - предназначен для аккумулирования создаваемых реквизитов формы +// Форма - Управляемая форма - форма для которой формируется массив реквизитов +// +Процедура СформироватьДобавляемыеРеквизитыДляРаздела(ДобавляемыеРеквизиты,Форма) Экспорт + + Для каждого Строка Из Форма.ТаблицаВопросовРаздела Цикл + + ДобавитьРеквизитыДляВопроса(Строка,ДобавляемыеРеквизиты,Форма); + + КонецЦикла; + +КонецПроцедуры // () + +//Добавляет реквизиты формы для простых вопросов +// +// Параметры +// СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты +// ДобавляемыеРеквизиты - Массив - предназначен для аккумулирования добавляемых реквизитов формы +// +Процедура ДобавитьРеквизитыДляВопроса(СтрокаДерева,ДобавляемыеРеквизиты,Форма) + + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки); + + ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(500)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_Формулировка",ОписаниеТипаСтроки,)); + + Если СтрокаДерева.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда + + ДобавитьРеквизитыТабличныйВопрос(СтрокаДерева,ДобавляемыеРеквизиты,Форма); + + Иначе + + Если СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Строка Тогда + + ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(СтрокаДерева.Длина)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса,ОписаниеТипаСтроки,,СтрокаДерева.Формулировка)); + + ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Текст Тогда + + ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(СтрокаДерева.Длина)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса,ОписаниеТипаСтроки,,СтрокаДерева.Формулировка)); + + ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Булево Тогда + + ОписаниеТипаБулево = Новый ОписаниеТипов("Булево"); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса,ОписаниеТипаБулево,,СтрокаДерева.Формулировка)); + + ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Дата Тогда + + ОписаниеТипаДата = Новый ОписаниеТипов("Дата",Новый КвалификаторыДаты(ЧастиДаты.Дата)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса,ОписаниеТипаДата,,СтрокаДерева.Формулировка)); + + ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Число Тогда + + ОписаниеТипаЧисло = Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(СтрокаДерева.Длина,СтрокаДерева.Точность)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса,ОписаниеТипаЧисло,,СтрокаДерева.Формулировка)); + + ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ВидКонтактнойИнформации Тогда + + ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(0)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса,ОписаниеТипаСтроки,,СтрокаДерева.Формулировка)); + + ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ЗначениеИнформационнойБазы Тогда + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса,СтрокаДерева.ТипЗначения,,СтрокаДерева.Формулировка)); + + ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ОдинВариантИз Тогда + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса,СтрокаДерева.ТипЗначения,,СтрокаДерева.Формулировка)); + + ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда + + ВариантыОтветовНаВопрос = ПолучитьВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос,Форма); + + ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(150)); + ОписаниеТипаБулево = Новый ОписаниеТипов("Булево"); + + Счётчик = 0; + + Для каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл + Счётчик = Счётчик + 1; + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_Реквизит_" + Счётчик,ОписаниеТипаБулево,,ВариантОтвета.Представление)); + Если ВариантОтвета.ТребуетОткрытогоОтвета Тогда + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_Комментарий_" + Счётчик,ОписаниеТипаСтроки)); + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + Если (СтрокаДерева.ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз) И (СтрокаДерева.ТребуетсяКомментарий) Тогда + + ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(150)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_Комментарий",ОписаниеТипаСтроки,,СтрокаДерева.ПояснениеКомментария)); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры // () + +//Добавляет реквизиты формы для табличных вопросов +// +// Параметры +// СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты +// ДобавляемыеРеквизиты - Массив - предназначен для аккумулирования добавляемых реквизитов формы +// +Процедура ДобавитьРеквизитыТабличныйВопрос(СтрокаДерева,ДобавляемыеРеквизиты,Форма) + + ТипТабличногоВопроса = СтрокаДерева.ТипТабличногоВопроса; + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки); + ИмяТаблицы = ИмяВопроса + "_Таблица"; + ИмяКолонкиБезНомера = ИмяТаблицы + "_Колонка_"; + ОписаниеТиповПВХ = Метаданные.ПланыВидовХарактеристик.ВопросыДляАнкетирования.Тип; + СчётчикКолонок = 0; + + РеквизитТаблица = Новый РеквизитФормы(ИмяТаблицы ,Новый ОписаниеТипов("ТаблицаЗначений"),,СтрокаДерева.Формулировка); + ДобавляемыеРеквизиты.Добавить(РеквизитТаблица); + + Если ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной + ИЛИ ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда + + Для инд = 1 По СтрокаДерева.СоставТабличногоВопроса.Количество() Цикл + + НайденныеСтроки = Форма.ВопросыПредставлениеТипы.НайтиСтроки(Новый Структура("Вопрос",СтрокаДерева.СоставТабличногоВопроса[инд-1].ЭлементарныйВопрос)); + Если НайденныеСтроки.Количество() > 0 Тогда + ПредставлениеТипВопроса = НайденныеСтроки[0]; + Иначе + Продолжить; + КонецЕсли; + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(инд),ПредставлениеТипВопроса.Тип,ИмяТаблицы,ПредставлениеТипВопроса.Формулировка)); + + КонецЦикла; + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда + + //Вопрос, ответы на который будут отображаться в колонках + ВопросДляКолонок = СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос; + //Добавим первую колонку в таблицу + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + "1",Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования"),ИмяТаблицы)); + + //Добавим остальные колонки + МассивОтветы = СтрокаДерева.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ВопросДляКолонок)); + Для инд=1 По МассивОтветы.Количество() Цикл + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(инд+1),ОписаниеТиповПВХ,ИмяТаблицы,МассивОтветы[инд-1].Ответ)); + КонецЦикла; + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + + //Вопрос, ответы на который будут отображаться в колонках + ВопросДляКолонок = СтрокаДерева.СоставТабличногоВопроса[1].ЭлементарныйВопрос; + + //Вопрос, который задает тип ячеек + ВопросДляЯчеек = СтрокаДерева.СоставТабличногоВопроса[2].ЭлементарныйВопрос; + НайденныеСтроки = Форма.ВопросыПредставлениеТипы.НайтиСтроки(Новый Структура("Вопрос",ВопросДляЯчеек)); + Если НайденныеСтроки.Количество() > 0 Тогда + ПредставлениеТипВопросаДляЯчеек = НайденныеСтроки[0]; + Иначе + Возврат; + КонецЕсли; + + //Вопрос, ответы на который будут отображаться в строках первой колонки + ВопросДляСтрок = СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос; + НайденныеСтроки = Форма.ВопросыПредставлениеТипы.НайтиСтроки(Новый Структура("Вопрос",ВопросДляСтрок)); + Если НайденныеСтроки.Количество() > 0 Тогда + ПредставлениеТипВопросаДляСтрок = НайденныеСтроки[0]; + Иначе + Возврат; + КонецЕсли; + //Добавим первую колонку в таблицу + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + "1",ПредставлениеТипВопросаДляСтрок.Тип,ИмяТаблицы,ПредставлениеТипВопросаДляСтрок.Формулировка)); + + //Добавим остальные колонки + МассивОтветы = СтрокаДерева.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ВопросДляКолонок)); + Для инд=1 По МассивОтветы.Количество() Цикл + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + Строка(инд+1),ПредставлениеТипВопросаДляЯчеек.Тип,ИмяТаблицы,МассивОтветы[инд-1].Ответ)); + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры // () + +//////////////////////////////////////////////////////////////////////////////// +// СОЗДАНИЕ ЭЛЕМЕНТОВ ФОРМЫ ЗАПОЛНЕНИЯ АНКЕТЫ + +// Формирует элементы формы заполнения анкеты для выбранного раздела +Процедура СформироватьЭлементыФормыДляРаздела(Форма) Экспорт + + Для каждого СтрокаТаблицы Из Форма.ТаблицаВопросовРаздела Цикл + + ДобавитьЭлементыФормыПоСтрокеТаблицы(СтрокаТаблицы,Форма.Элементы.ГруппаТелоАнкеты,Форма); + + КонецЦикла; + + СпозиционироватьсяНаПервомВопросеРаздела(Форма); + +КонецПроцедуры + +// Устанавливает фокус на первом вопросе открывшегося раздела +// +// Параметры +// Форма - УправляемаяФорма - форма для которой выполняется действие +// +Процедура СпозиционироватьсяНаПервомВопросеРаздела(Форма) + + Если Форма.ТаблицаВопросовРаздела.Количество() > 0 Тогда + + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(Форма.ТаблицаВопросовРаздела[0].КлючСтроки); + + НайденныйЭлемент = Форма.Элементы.Найти(ИмяВопроса); + Если НайденныйЭлемент = Неопределено Тогда + НайденныйЭлемент = Форма.Элементы.Найти(ИмяВопроса + "_Реквизит_1"); + КонецЕсли; + + Если НайденныйЭлемент = Неопределено Тогда + НайденныйЭлемент = Форма.Элементы.Найти(ИмяВопроса + "_Таблица"); + КонецЕсли; + + Если НайденныйЭлемент <> Неопределено Тогда + Форма.ТекущийЭлемент = НайденныйЭлемент; + НайденныйЭлемент.АктивизироватьПоУмолчанию = Истина; + Форма.ИмяЭлементаДляПозиционирования = НайденныйЭлемент.Имя; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры // () + + +//Анализирует тип строки дерева анкеты и вызывает соответствующую функцию для добавления элементов формы +// +// Параметры +// СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты +// ЭлементГруппы - ГруппаФормы - группа формы, для которой будут подчиняться добавляемые реквизиты +// УровеньРекурсии - Число - уровень рекурсии вызова процедуры +// Форма - Управляемая форма +// +// Возвращаемое значение: +// ГруппаФормы - группа созданных элементов +// + Функция ДобавитьЭлементыФормыПоСтрокеТаблицы(СтрокаТаблицы,ЭлементГруппы,Форма) + + Если СтрокаТаблицы.ТипСтроки = "Раздел" Тогда + Возврат ДобавитьЭлементыРаздел(СтрокаТаблицы,ЭлементГруппы,Форма); + ИначеЕсли СтрокаТаблицы.ТипСтроки = "Вопрос" Тогда + ДобавитьЭлементыВопрос(СтрокаТаблицы,ЭлементГруппы,Форма); + КонецЕсли; + +КонецФункции + +//Добавляет элементы формы для разделов +// +// Параметры +// СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты +// ЭлементГруппы - ГруппаФормы - группа формы, для которой будут подчиняться добавляемые реквизиты +// УровеньРекурсии - Число - уровень рекурсии вызова процедуры +// Форма - Управляемая форма +// +// Возвращаемое значение: +// ГруппаФормы - группа созданных элементов +// +Функция ДобавитьЭлементыРаздел(СтрокаТаблицы,ЭлементГруппы,Форма) + + ИмяРаздела = "Раздел_" + СтрЗаменить(СтрокаТаблицы.КлючСтроки,"-","_"); + + ЭлементРаздел = Форма.Элементы.Добавить(ИмяРаздела,Тип("ГруппаФормы"),ЭлементГруппы); + ЭлементРаздел.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ЭлементРаздел.Заголовок = ПолныйКодНаименование(СтрокаТаблицы); + ЭлементРаздел.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + ЭлементРаздел.РастягиватьПоВертикали = Ложь; + + Возврат ЭлементРаздел; + +КонецФункции + +//Добавляет элементы формы для вопросов +// +// Параметры +// СтрокаТаблицы - ДанныеФормыЭлементКоллекции - строка таблицы вопросов раздела +// ЭлементГруппы - ГруппаФормы - группа формы, для которой будут подчиняться добавляемые реквизиты +// Форма - Управляемая форма +// +Процедура ДобавитьЭлементыВопрос(СтрокаТаблицы,ЭлементГруппа,Форма) + + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаТаблицы.КлючСтроки); + + //Зададим элемент группы для вопроса + ЭлементГруппаВопроса = Форма.Элементы.Добавить(ИмяВопроса + "_Группа" ,Тип("ГруппаФормы"),ЭлементГруппа); + ЭлементГруппаВопроса.Вид = ВидГруппыФормы.ОбычнаяГруппа ; + ЭлементГруппаВопроса.ОтображатьЗаголовок = Ложь; + ЭлементГруппаВопроса.Отображение = ОтображениеОбычнойГруппы.Отступ; + ЭлементГруппаВопроса.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; + ЭлементГруппаВопроса.ШиринаПодчиненныхЭлементов = ШиринаПодчиненныхЭлементовФормы.ЛевыйОченьУзкий; + ЭлементГруппаВопроса.РастягиватьПоГоризонтали = Истина; + ЭлементГруппаВопроса.РастягиватьПоВертикали = Ложь; + + Форма[ИмяВопроса + "_Формулировка"] = ПолныйКодНаименование(СтрокаТаблицы); + Элемент = Форма.Элементы.Добавить(ИмяВопроса + "_Формулировка",Тип("ПолеФормы"),ЭлементГруппаВопроса); + Элемент.Вид = ВидПоляФормы.ПолеНадписи; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Элемент.ВертикальноеПоложение = ВертикальноеПоложениеЭлемента.Верх; + Элемент.ПутьКДанным = ИмяВопроса + "_Формулировка"; + Если СтрокаТаблицы.ВысотаЭлементаФормулировкиВопроса = 0 Тогда + Элемент.АвтоВысотаЯчейки = Истина; + Иначе + Элемент.Высота = СтрокаТаблицы.ВысотаЭлементаФормулировкиВопроса; + КонецЕсли; + Элемент.РастягиватьПоВертикали = Истина; + + ЭлементГруппаВопросКомментарий = Форма.Элементы.Добавить(ИмяВопроса + "_Группа_Вопрос_Комментарий",Тип("ГруппаФормы"),ЭлементГруппаВопроса); + ЭлементГруппаВопросКомментарий.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ЭлементГруппаВопросКомментарий.Отображение = ОтображениеОбычнойГруппы.Нет; + ЭлементГруппаВопросКомментарий.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + ЭлементГруппаВопросКомментарий.ОтображатьЗаголовок = Ложь; + + Если СтрокаТаблицы.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда + + ДобавитьЭлементыТабличныйВопрос(СтрокаТаблицы,ЭлементГруппаВопроса,Форма); + + Иначе + + Если СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Строка Тогда + + Элемент = Форма.Элементы.Добавить(ИмяВопроса,Тип("ПолеФормы"),ЭлементГруппаВопросКомментарий); + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный; + Элемент.ПутьКДанным = ИмяВопроса; + + ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Текст Тогда + + Элемент = Форма.Элементы.Добавить(ИмяВопроса,Тип("ПолеФормы"),ЭлементГруппаВопросКомментарий); + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный; + Элемент.ПутьКДанным = ИмяВопроса; + Элемент.РастягиватьПоВертикали = Ложь; + Если СтрокаТаблицы.ВысотаЭлементаФормулировкиВопроса > 2 Тогда + Элемент.Высота = СтрокаТаблицы.ВысотаЭлементаФормулировкиВопроса; + КонецЕсли; + УстановитьПараметрыЭлементаЯчейкаТекст(Элемент); + + ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Булево Тогда + + Элемент = Форма.Элементы.Добавить(ИмяВопроса,Тип("ПолеФормы"),ЭлементГруппаВопросКомментарий); + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Элемент.ПутьКДанным = ИмяВопроса; + + ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Дата Тогда + + Элемент = Форма.Элементы.Добавить(ИмяВопроса,Тип("ПолеФормы"),ЭлементГруппаВопросКомментарий); + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный; + Элемент.ПутьКДанным = ИмяВопроса; + + ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Число Тогда + + Элемент = Форма.Элементы.Добавить(ИмяВопроса,Тип("ПолеФормы"),ЭлементГруппаВопросКомментарий); + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный; + Элемент.МинимальноеЗначение = ?(СтрокаТаблицы.МинимальноеЗначение = 0,Неопределено,СтрокаТаблицы.МинимальноеЗначение); + Элемент.МаксимальноеЗначение = ?(СтрокаТаблицы.МаксимальноеЗначение = 0,Неопределено,СтрокаТаблицы.МаксимальноеЗначение); + Элемент.КнопкаВыбора = Ложь; + Элемент.ПутьКДанным = ИмяВопроса; + + ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ВидКонтактнойИнформации Тогда + + Элемент = Форма.Элементы.Добавить(ИмяВопроса,Тип("ПолеФормы"),ЭлементГруппаВопросКомментарий); + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.МногострочныйРежим = Ложь; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный; + Элемент.ПутьКДанным = ИмяВопроса; + + ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ЗначениеИнформационнойБазы Тогда + + Элемент = Форма.Элементы.Добавить(ИмяВопроса,Тип("ПолеФормы"),ЭлементГруппаВопросКомментарий); + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный; + Элемент.ПутьКДанным = ИмяВопроса; + + ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ОдинВариантИз Тогда + + ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаТаблицы.ЭлементарныйВопрос,Форма); + + Элемент = Форма.Элементы.Добавить(ИмяВопроса,Тип("ПолеФормы"),ЭлементГруппаВопросКомментарий); + Элемент.Вид = ВидПоляФормы.ПолеПереключателя; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Элемент.ПутьКДанным = ИмяВопроса; + Элемент.КоличествоКолонок = 1; + Элемент.ВысотаЭлемента = 1; + Элемент.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Лево; + Для каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл + Элемент.СписокВыбора.Добавить(ВариантОтвета.Ответ,ВариантОтвета.Представление); + КонецЦикла; + + ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда + + ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаТаблицы.ЭлементарныйВопрос,Форма); + Счётчик = 0; + + ЭлементГруппаВариантыОтветов = Форма.Элементы.Добавить(ИмяВопроса + "_Группа_Варианты",Тип("ГруппаФормы"),ЭлементГруппаВопросКомментарий); + + ЭлементГруппаВариантыОтветов.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ЭлементГруппаВариантыОтветов.Отображение = ОтображениеОбычнойГруппы.Нет; + ЭлементГруппаВариантыОтветов.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + ЭлементГруппаВариантыОтветов.ОтображатьЗаголовок = Ложь; + + Для каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл + + Счётчик = Счётчик + 1; + + ЭлементГруппаВариантОтвета = Форма.Элементы.Добавить(ИмяВопроса + "_Группа_ВариантОтвета_" + Строка(Счётчик),Тип("ГруппаФормы"),ЭлементГруппаВариантыОтветов); + + ЭлементГруппаВариантОтвета.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ЭлементГруппаВариантОтвета.Отображение = ОтображениеОбычнойГруппы.Нет; + ЭлементГруппаВариантОтвета.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; + ЭлементГруппаВариантОтвета.ОтображатьЗаголовок = Ложь; + ЭлементГруппаВариантОтвета.ШиринаПодчиненныхЭлементов = ШиринаПодчиненныхЭлементовФормы.Авто; + ЭлементГруппаВариантОтвета.РастягиватьПоГоризонтали = Истина; + + ИмяРеквизитаВопроса = ИмяВопроса + "_Реквизит_" + Счётчик; + Элемент = Форма.Элементы.Добавить(ИмяРеквизитаВопроса,Тип("ПолеФормы"),ЭлементГруппаВариантОтвета); + + Элемент.Вид = ВидПоляФормы.ПолеФлажка; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; + Элемент.ПутьКДанным = ИмяРеквизитаВопроса; + Элемент.ВысотаЗаголовка = 1; + + Если ВариантОтвета.ТребуетОткрытогоОтвета Тогда + ИмяРеквизитаКомментария = ИмяВопроса + "_Комментарий_" + Счётчик; + Элемент = Форма.Элементы.Добавить(ИмяРеквизитаКомментария,Тип("ПолеФормы"),ЭлементГруппаВариантОтвета); + Элемент.Вид = ВидПоляФормы.ПолеФлажка; + Элемент.ПутьКДанным = ИмяРеквизитаКомментария; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + //Комментарии к вопросам + Если (СтрокаТаблицы.ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз) И (СтрокаТаблицы.ТребуетсяКомментарий) Тогда + + Элемент = Форма.Элементы.Добавить(ИмяВопроса + "_Комментарий",Тип("ПолеФормы"),ЭлементГруппаВопросКомментарий); + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.ПутьКДанным = ИмяВопроса + "_Комментарий"; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +//Добавляет элементы формы для табличных вопросов +// +// Параметры +// СтрокаТаблицы - ДанныеФормыЭлементКоллекции - строка таблицы вопросов раздела +// ЭлементГруппы - ГруппаФормы - группа формы, для которой будут подчиняться добавляемые реквизиты +// Форма - Управляемая форма +// +Процедура ДобавитьЭлементыТабличныйВопрос(СтрокаТаблицы,ЭлементГруппа,Форма) + + ТипТабличногоВопроса = СтрокаТаблицы.ТипТабличногоВопроса; + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаТаблицы.КлючСтроки); + ИмяТаблицы = ИмяВопроса + "_Таблица"; + + //Создание элемента формы таблица. + ЭлементТаблица = Форма.Элементы.Добавить(ИмяТаблицы,Тип("ТаблицаФормы"),ЭлементГруппа); + + Если ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Тогда + ЭлементТаблица.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Верх; + Иначе + ЭлементТаблица.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; + ЭлементТаблица.ИзменятьСоставСтрок = Ложь; + ЭлементТаблица.ИзменятьПорядокСтрок = Ложь; + КонецЕсли; + ЭлементТаблица.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + ЭлементТаблица.ПутьКДанным = ИмяТаблицы; + ЭлементТаблица.РастягиватьПоВертикали = Ложь; + + //Добавление колонок в элемент формы таблица. + ТаблицаВопроса = Форма.РеквизитФормыВЗначение(ИмяТаблицы); + + Если СтрокаТаблицы.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках + И СтрокаТаблицы.СоставТабличногоВопроса.Количество() = 3 Тогда + + НайденныеСтроки = Форма.ВопросыПредставлениеТипы.НайтиСтроки(Новый Структура("Вопрос",СтрокаТаблицы.СоставТабличногоВопроса[2].ЭлементарныйВопрос)); + Если НайденныеСтроки.Количество() > 0 Тогда + РеквизитыЭлементарногоВопроса = НайденныеСтроки[0]; + Иначе + Возврат; + КонецЕсли; + + ИначеЕсли СтрокаТаблицы.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках + И СтрокаТаблицы.СоставТабличногоВопроса.Количество() > 1 Тогда + + КонецЕсли; + + Для инд = 1 По ТаблицаВопроса.Колонки.Количество() Цикл + + ИмяКолонки = ИмяТаблицы + "_Колонка_" + инд; + + Если СтрокаТаблицы.ТипТабличногоВопроса <> Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках И + СтрокаТаблицы.ТипТабличногоВопроса <> Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда + НайденныеСтроки = Форма.ВопросыПредставлениеТипы.НайтиСтроки(Новый Структура("Вопрос",СтрокаТаблицы.СоставТабличногоВопроса[инд-1].ЭлементарныйВопрос)); + Если НайденныеСтроки.Количество() > 0 Тогда + РеквизитыЭлементарногоВопроса = НайденныеСтроки[0]; + Иначе + Продолжить; + КонецЕсли; + КонецЕсли; + + Элемент = Форма.Элементы.Добавить(ИмяКолонки, Тип("ПолеФормы"), Форма.Элементы[ИмяТаблицы]); + Элемент.РежимРедактирования = РежимРедактированияКолонки.Непосредственно; + + Если ТаблицаВопроса.Колонки[инд-1].ТипЗначения = Новый ОписаниеТипов("Булево") Тогда + Элемент.Вид = ВидПоляФормы.ПолеФлажка; + Иначе + Элемент.Вид = ВидПоляФормы.ПолеВвода; + + //Установка списка выборка для тех колонок, тип ответа которых "Варианты ответов анкет" и ограничения для числовых вопросов + Если СтрокаТаблицы.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной + Или СтрокаТаблицы.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда + + Если ТаблицаВопроса.Колонки[инд-1].ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ВариантыОтветовАнкет") Тогда + + Элемент.РежимВыбораИзСписка = Истина; + ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаТаблицы.СоставТабличногоВопроса[инд-1].ЭлементарныйВопрос,Форма); + Для каждого ВариантОтветаНаВопрос Из ВариантыОтветовНаВопрос Цикл + Элемент.СписокВыбора.Добавить(ВариантОтветаНаВопрос.Ответ); + КонецЦикла; + Элемент.КнопкаОткрытия = Ложь; + + ИначеЕсли РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Число Тогда + + УстановитьПараметрыЭлементаЯчейкаЧисло(Элемент,РеквизитыЭлементарногоВопроса); + + ИначеЕсли РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Текст Тогда + + УстановитьПараметрыЭлементаЯчейкаТекст(Элемент); + + КонецЕсли; + + ИначеЕсли СтрокаТаблицы.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + + Если СтрокаТаблицы.СоставТабличногоВопроса.Количество() = 3 И инд <> 1 Тогда + + Если СтрокаТаблицы.СоставТабличногоВопроса[2].ЭлементарныйВопрос.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ВариантыОтветовАнкет")Тогда + + Элемент.РежимВыбораИзСписка = Истина; + ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаТаблицы.СоставТабличногоВопроса[2].ЭлементарныйВопрос,Форма); + Для каждого ВариантОтветаНаВопрос Из ВариантыОтветовНаВопрос Цикл + Элемент.СписокВыбора.Добавить(ВариантОтветаНаВопрос.Ответ); + КонецЦикла; + Элемент.КнопкаОткрытия = Ложь; + + КонецЕсли; + + Если РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Число Тогда + + УстановитьПараметрыЭлементаЯчейкаЧисло(Элемент,РеквизитыЭлементарногоВопроса); + + ИначеЕсли РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Текст Тогда + + УстановитьПараметрыЭлементаЯчейкаТекст(Элемент); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + Элемент.ПутьКДанным = ИмяТаблицы + "." + ИмяКолонки; + + Если (ТипТабличногоВопроса <> Перечисления.ТипыТабличныхВопросов.Составной) И (инд = 1) Тогда + Элемент.Доступность = Ложь; + КонецЕсли; + + Если (ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках)Тогда + Если инд = 1 Тогда + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Иначе + Элемент.СвязьПоТипу = Новый СвязьПоТипу("Элементы." + ИмяТаблицы + ".ТекущиеДанные." + ИмяТаблицы + "_Колонка_1"); + СвязиПараметровВыбора = Новый Массив(); + СвязиПараметровВыбора.Добавить(Новый СвязьПараметраВыбора("Отбор.Владелец","Элементы." + ИмяТаблицы + ".ТекущиеДанные." + ИмяТаблицы + "_Колонка_1")); + Элемент.СвязиПараметровВыбора = Новый ФиксированныйМассив(СвязиПараметровВыбора); + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + //Заполнение строк таблицы. + Если ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда + + МассивОтветы = СтрокаТаблицы.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",СтрокаТаблицы.СоставТабличногоВопроса[0].ЭлементарныйВопрос)); + + Для каждого СтрокаОтвет Из МассивОтветы Цикл + + НоваяСтрока = ТаблицаВопроса.Добавить(); + НоваяСтрока[0] = СтрокаОтвет.Ответ; + + КонецЦикла; + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда + + Для инд = 2 По СтрокаТаблицы.СоставТабличногоВопроса.Количество() Цикл + + НоваяСтрока = ТаблицаВопроса.Добавить(); + НоваяСтрока[0] = СтрокаТаблицы.СоставТабличногоВопроса[инд-1].ЭлементарныйВопрос; + + КонецЦикла; + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + + МассивОтветы = СтрокаТаблицы.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",СтрокаТаблицы.СоставТабличногоВопроса[0].ЭлементарныйВопрос)); + + Для каждого СтрокаОтвет Из МассивОтветы Цикл + + НоваяСтрока = ТаблицаВопроса.Добавить(); + НоваяСтрока[0] = СтрокаОтвет.Ответ; + + КонецЦикла; + + КонецЕсли; + + Если ТипТабличногоВопроса <> Перечисления.ТипыТабличныхВопросов.Составной Тогда + + ЭлементТаблица.ВысотаВСтрокахТаблицы = ТаблицаВопроса.Количество() + 1; + + КонецЕсли; + + Форма.ЗначениеВРеквизитФормы(ТаблицаВопроса,ИмяТаблицы); + +КонецПроцедуры // () - + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ ФОРМЫ ЗАПОЛНЕНИЯ АНКЕТЫ + +//Получает возможные варианты ответа на вопрос +// +//Параметры +// ЭлементарныйВопрос - ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования - вопрос для которого получаются ответы +// Форма - Управляемая форма - форма из которой происходит вызов +// +// Возвращаемое значение: +// Массив - массив строк таблицы значений, в которых содержаться варианты ответов на вопрос +// +Функция ПолучитьВариантыОтветовНаВопрос(ЭлементарныйВопрос,Форма) Экспорт + + Возврат (Форма.ВариантыОтветовНаВопросы.НайтиСтроки(Новый Структура("Вопрос",ЭлементарныйВопрос))); + +КонецФункции + +// Формирует строки из формулировки и полного кода строки +// +// Параметры +// СтрокаТаблицы - ДанныеФормыЭлементКоллекции - строка таблицы вопросов раздела +// +// Возвращаемое значение: +// Строка - строка содержащая полный код и формулировку +// +Функция ПолныйКодНаименование(СтрокаТаблицы) + + Возврат ?(СтрокаТаблицы.ТипСтроки = "Раздел","Раздел ","") + СтрокаТаблицы.ПолныйКод + " " + ?(СтрокаТаблицы.ТипСтроки="Раздел",СтрокаТаблицы.Наименование,СтрокаТаблицы.Формулировка); + +КонецФункции // () + +// Устанавливает отметку для элементов типа "радиокнопка", если значение элемента не заполнено +// +// Параметры +// Форма - Управляемая форма - форма, для которой выполняются действия +// +Процедура УстановитьЗначенияРеквизитовВариантОтветаОдинИз(Форма) Экспорт + + НайденныеСтроки = Форма.ТаблицаВопросовРаздела.НайтиСтроки(Новый Структура("ТипОтвета",Перечисления.ТипыОтветовНаВопрос.ОдинВариантИз)); + + Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл + Если НЕ ЗначениеЗаполнено(Форма[АнкетированиеКлиентСервер.ПолучитьИмяВопроса(НайденнаяСтрока.КлючСтроки)]) Тогда + + ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(НайденнаяСтрока.ЭлементарныйВопрос,Форма); + Если ВариантыОтветовНаВопрос.Количество() > 0 Тогда + Форма[АнкетированиеКлиентСервер.ПолучитьИмяВопроса(НайденнаяСтрока.КлючСтроки)] = ВариантыОтветовНаВопрос[0].Ответ; + КонецЕсли; + + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Устанавливает значения параметров и обработчик события "НачалоВыбора", +// для поля формы, предназначенного для ввода текста +// +// Параметры +// Элемент - ПолеФормы - элемент, для которого устанавливаются параметры +// +Процедура УстановитьПараметрыЭлементаЯчейкаТекст(Элемент) + + Элемент.КнопкаВыбора = Истина; + Элемент.МногострочныйРежим = Истина; + Элемент.УстановитьДействие("НачалоВыбора","Подключаемый_НачалоВыбораТекстовыхЯчеекТабличныхВопросов"); + +КонецПроцедуры + +// Устанавливает значения параметров для поля формы, предназначенного для ввода числового значения +// +// Параметры +// Элемент - ПолеФормы - элемент, для которого устанавливаются параметры +// РеквизитыЭлементарногоВопроса - ДанныеФормыЭлементКоллекции - содержит значения параметров +// +Процедура УстановитьПараметрыЭлементаЯчейкаЧисло(Элемент,РеквизитыЭлементарногоВопроса); + + Элемент.МинимальноеЗначение = ?(РеквизитыЭлементарногоВопроса.МинимальноеЗначение = 0,Неопределено,РеквизитыЭлементарногоВопроса.МинимальноеЗначение); + Элемент.МаксимальноеЗначение = ?(РеквизитыЭлементарногоВопроса.МаксимальноеЗначение = 0,Неопределено,РеквизитыЭлементарногоВопроса.МаксимальноеЗначение); + +КонецПроцедуры + + // Удаляет ранее динамически сформированные элементы формы заполнения анкеты +// +// Параметры +// Форма - Управляемая форма - форма у которой удаляются элементы +// УдаляемыеРеквизиты - массив - массив имен удаляемых реквизитов формы, на основании которого удаляются +// элементы формы +// +Процедура УдалитьЭлементыФормыЗаполнения(Форма,УдаляемыеРеквизиты) Экспорт + + Для каждого УдаляемыйРеквизит Из УдаляемыеРеквизиты Цикл + + ИмяВопроса = Лев(УдаляемыйРеквизит.Значение,43); + + НайденныйЭлементФормы = Форма.Элементы.Найти(ИмяВопроса + "_Группа"); + + Если НайденныйЭлементФормы <> Неопределено Тогда + МассивПодчиненныеЭлементы = НайденныйЭлементФормы.ПодчиненныеЭлементы; + Для каждого ПодчиненныйЭлемент Из МассивПодчиненныеЭлементы Цикл + Форма.Элементы.Удалить(ПодчиненныйЭлемент); + КонецЦикла; + Форма.Элементы.Удалить(НайденныйЭлементФормы); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // () + +// Заполняет дерево разделов на форме +// +// Параметры +// Форма - Управляемая форма - форма для которой выполняется операция +// ДеревоРазделов - ДанныеФормыДерево - дерево, для которого получаются данные +// +Процедура ЗаполнитьДеревоРазделов(Форма,ДеревоРазделов) Экспорт + + ВыборкаРазделы = ПолучитьВыборкуРазделовПоШаблонуАнкеты(Форма.ШаблонАнкеты); + ДобавитьСтрокиВДеревоРазделов(ВыборкаРазделы,ДеревоРазделов); + +КонецПроцедуры + +// Получает иерархическую выборку по шаблону анкеты +// +// Параметры +// ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет - шаблон анкеты по которому получается выборка +// +// Возвращаемое значение: +// ВыборкаИзРезультатаЗапроса - иерархическая выборка по разделам шаблона анкеты +// +Функция ПолучитьВыборкуРазделовПоШаблонуАнкеты(ШаблонАнкеты) + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ВопросыШаблонаАнкеты.Ссылка КАК Ссылка, + | ВопросыШаблонаАнкеты.Формулировка, + | КоличествоВопросов.Количество + |ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВопросыШаблонаАнкеты.Ссылка) КАК Количество, + | ВопросыШаблонаАнкеты.Родитель КАК Родитель + | ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + | ГДЕ + | ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты + | И (НЕ ВопросыШаблонаАнкеты.ЭтоГруппа) + | + | СГРУППИРОВАТЬ ПО + | ВопросыШаблонаАнкеты.Родитель) КАК КоличествоВопросов + | ПО ВопросыШаблонаАнкеты.Ссылка = КоличествоВопросов.Родитель + |ГДЕ + | ВопросыШаблонаАнкеты.ЭтоГруппа + | И (НЕ ВопросыШаблонаАнкеты.ПометкаУдаления) + | И ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты + | + |УПОРЯДОЧИТЬ ПО + | Ссылка ИЕРАРХИЯ"; + + Запрос.УстановитьПараметр("ШаблонАнкеты",ШаблонАнкеты); + + Возврат Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); + +КонецФункции + + // Добавляет строки в дерево разделов +// +// Параметры +// ВыборкаРазделы - ВыборкаИзРезультатаЗапроса - иерархическая выборка по разделам шаблона анкеты +// Родитель - ДанныеФормыЭлементДерева - Родительский элемент дерева, для которого добавляются строки +// +Процедура ДобавитьСтрокиВДеревоРазделов(ВыборкаРазделы,Родитель) + + ЭлементыДереваРодителя = Родитель.ПолучитьЭлементы(); + Пока ВыборкаРазделы.Следующий() Цикл + + НовыйЭлементДерева = ЭлементыДереваРодителя.Добавить(); + НовыйЭлементДерева.Формулировка = ВыборкаРазделы.Формулировка; + НовыйЭлементДерева.КодКартинки = ПолучитьКодКартинкиШаблонаАнкеты(Истина); + НовыйЭлементДерева.ТипСтроки = "Раздел"; + НовыйЭлементДерева.Ссылка = ВыборкаРазделы.Ссылка; + НовыйЭлементДерева.КоличествоВопросов = ВыборкаРазделы.Количество; + + ДобавитьСтрокиВДеревоРазделов(ВыборкаРазделы.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией),НовыйЭлементДерева); + + КонецЦикла; + +КонецПроцедуры // () + + // Получает необходимую информацию по разделу анкеты: вопросы раздела, + // необходимые реквизиты вопросов, варианты ответов. Помещает полученную информацию в + // реквизиты формы + // + // Параметры + // Форма - УправляемаяФорма - форма для которой получается информация + // ШаблонАнкеты - СправочникСсылка.ШаблонАнкеты - шаблон анкеты, по которому получается информация + // Раздел - СправочникСсылка.ВопросыШаблонаАнкеты - раздел анкеты, по которому получается информация + // ПолныйКодРаздела - Строка - Полный код раздела, по которому получается информация + // +Процедура ПолучитьИнформациюПоВопросамАнкеты(Форма, ШаблонАнкеты, Раздел,ПолныйКодРаздела) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ВопросыДляАнкетирования.Ссылка КАК Вопрос, + | ВопросыДляАнкетирования.Формулировка КАК Формулировка, + | ВопросыДляАнкетирования.ТипЗначения КАК Тип, + | ВопросыДляАнкетирования.ТипОтвета КАК ТипОтвета, + | ВопросыДляАнкетирования.МинимальноеЗначение КАК МинимальноеЗначение, + | ВопросыДляАнкетирования.МаксимальноеЗначение КАК МаксимальноеЗначение + |ИЗ + | ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования + |ГДЕ + | ВопросыДляАнкетирования.Ссылка В + | (ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВопросыШаблонаАнкеты.ЭлементарныйВопрос + | ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + | ГДЕ + | ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты + | И ВопросыШаблонаАнкеты.Родитель = &Раздел + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ВопросыШаблонаАнкетыСоставТабличногоВопроса.ЭлементарныйВопрос + | ИЗ + | Справочник.ВопросыШаблонаАнкеты.СоставТабличногоВопроса КАК ВопросыШаблонаАнкетыСоставТабличногоВопроса + | ГДЕ + | ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка.Владелец = &ШаблонАнкеты + | И ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка.Родитель = &Раздел) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВопросыШаблонаАнкеты.Ссылка КАК ВопросШаблона, + | ВопросыШаблонаАнкеты.Родитель КАК Родитель, + | ВопросыШаблонаАнкеты.Наименование КАК Наименование, + | ВопросыШаблонаАнкеты.Обязательный КАК Обязательный, + | ВопросыШаблонаАнкеты.ТипВопроса КАК ТипВопроса, + | ВопросыШаблонаАнкеты.ТипТабличногоВопроса КАК ТипТабличногоВопроса, + | ВопросыШаблонаАнкеты.ЭлементарныйВопрос КАК ЭлементарныйВопрос, + | ""Вопрос"" КАК ТипСтроки, + | ВопросыШаблонаАнкеты.РодительВопрос КАК РодительВопрос, + | ВопросыШаблонаАнкеты.СоставТабличногоВопроса.( + | НомерСтроки, + | ЭлементарныйВопрос + | ), + | ВопросыШаблонаАнкеты.ПредопределенныеОтветы.( + | НомерСтроки, + | ЭлементарныйВопрос, + | Ответ + | ), + | ЕСТЬNULL(ВопросыДляАнкетирования.Длина, 0) КАК Длина, + | ВопросыДляАнкетирования.ТипЗначения КАК ТипЗначения, + | ЕСТЬNULL(ВопросыДляАнкетирования.ТребуетсяКомментарий, ЛОЖЬ) КАК ТребуетсяКомментарий, + | ЕСТЬNULL(ВопросыДляАнкетирования.ПояснениеКомментария, """") КАК ПояснениеКомментария, + | ЕСТЬNULL(ВопросыДляАнкетирования.МинимальноеЗначение, 0) КАК МинимальноеЗначение, + | ЕСТЬNULL(ВопросыДляАнкетирования.МаксимальноеЗначение, 0) КАК МаксимальноеЗначение, + | ЕСТЬNULL(ВопросыДляАнкетирования.ТипОтвета, ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.ПустаяСсылка)) КАК ТипОтвета, + | ЕСТЬNULL(ВопросыШаблонаАнкеты.Формулировка, """") КАК Формулировка, + | ЕСТЬNULL(ВопросыДляАнкетирования.Точность, 0) КАК Точность, + | ВопросыШаблонаАнкеты.ВысотаЭлементаФормулировкиВопроса КАК ВысотаЭлементаФормулировкиВопроса + |ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования + | ПО ВопросыШаблонаАнкеты.ЭлементарныйВопрос = ВопросыДляАнкетирования.Ссылка + |ГДЕ + | (НЕ ВопросыШаблонаАнкеты.ПометкаУдаления) + | И ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты + | И ВопросыШаблонаАнкеты.Родитель = &Раздел + | И (НЕ ВопросыШаблонаАнкеты.ЭтоГруппа) + | + |УПОРЯДОЧИТЬ ПО + | ВопросыШаблонаАнкеты.Код + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВариантыОтветовАнкет.Владелец КАК Вопрос, + | ВариантыОтветовАнкет.Ссылка КАК Ответ, + | ВариантыОтветовАнкет.Представление, + | ВариантыОтветовАнкет.ТребуетОткрытогоОтвета + |ИЗ + | Справочник.ВариантыОтветовАнкет КАК ВариантыОтветовАнкет + |ГДЕ + | ВариантыОтветовАнкет.Владелец В + | (ВЫБРАТЬ + | ВопросыШаблонаАнкеты.ЭлементарныйВопрос + | ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + | ГДЕ + | ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты + | И ВопросыШаблонаАнкеты.Родитель = &Раздел + | И (НЕ ВопросыШаблонаАнкеты.ЭтоГруппа) + | И (НЕ ВопросыШаблонаАнкеты.ПометкаУдаления) + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ВопросыШаблонаАнкетыСоставТабличногоВопроса.ЭлементарныйВопрос + | ИЗ + | Справочник.ВопросыШаблонаАнкеты.СоставТабличногоВопроса КАК ВопросыШаблонаАнкетыСоставТабличногоВопроса + | ГДЕ + | ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка.Владелец = &ШаблонАнкеты + | И ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка.Родитель = &Раздел + | И (НЕ ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка.ЭтоГруппа) + | И (НЕ ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка.ПометкаУдаления)) + | И (НЕ ВариантыОтветовАнкет.ПометкаУдаления) + | + |УПОРЯДОЧИТЬ ПО + | ВариантыОтветовАнкет.РеквизитДопУпорядочивания"; + + Запрос.УстановитьПараметр("ШаблонАнкеты",ШаблонАнкеты); + Запрос.УстановитьПараметр("Раздел",Раздел); + + МассивРезультатовЗапросов = Запрос.ВыполнитьПакет(); + + //Представление и типы вопросов + Форма.ВопросыПредставлениеТипы.Загрузить(МассивРезультатовЗапросов[0].Выгрузить()); + + //Вопросы раздела шаблона анкеты + ВыборкаВопросыПоРазделуАнкеты = МассивРезультатовЗапросов[1].Выбрать();; + СчётчикВопросов = 0; + + Пока ВыборкаВопросыПоРазделуАнкеты.Следующий() Цикл + + СчётчикВопросов = СчётчикВопросов + 1; + НоваяСтрока = Форма.ТаблицаВопросовРаздела.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока,ВыборкаВопросыПоРазделуАнкеты,,"СоставТабличногоВопроса,ПредопределенныеОтветы"); + НоваяСтрока.СоставТабличногоВопроса.Загрузить(ВыборкаВопросыПоРазделуАнкеты.СоставТабличногоВопроса.Выгрузить()); + НоваяСтрока.СоставТабличногоВопроса.Сортировать("НомерСтроки Возр"); + НоваяСтрока.ПредопределенныеОтветы.Загрузить(ВыборкаВопросыПоРазделуАнкеты.ПредопределенныеОтветы.Выгрузить()); + НоваяСтрока.ПредопределенныеОтветы.Сортировать("НомерСтроки Возр"); + НоваяСтрока.КлючСтроки = Новый УникальныйИдентификатор; + НоваяСтрока.ПолныйКод = ПолныйКодРаздела + Строка(СчётчикВопросов); + + КонецЦикла; + + //Варианты ответов + Форма.ВариантыОтветовНаВопросы.Загрузить(МассивРезультатовЗапросов[2].Выгрузить()); + + КонецПроцедуры + +// Формирует таблицу подчинения вопросов +// +// Параметры +// Форма - УправляемаяФорма - форма для которой формируется таблица подчинения +// +Процедура СформироватьТаблицуПодчиненияВопросов(Форма) Экспорт + + Форма.ПодчиненныеВопросы.Очистить(); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ВнешнийИсточник.ВопросШаблона КАК ВопросШаблона, + | ВнешнийИсточник.РодительВопрос КАК РодительВопрос, + | ВнешнийИсточник.ТипВопроса, + | ВнешнийИсточник.СтроковыйКлюч, + | ВнешнийИсточник.Обязательный, + | ВнешнийИсточник.ТребуетсяКомментарий, + | ВнешнийИсточник.ЭлементарныйВопрос, + | ВнешнийИсточник.ТипОтвета + |ПОМЕСТИТЬ ВопросыРаздела + |ИЗ + | &ВнешнийИсточник КАК ВнешнийИсточник + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВопросыРаздела.ВопросШаблона КАК ВопросШаблона, + | ВопросыРаздела.СтроковыйКлюч + |ПОМЕСТИТЬ ВопросыСУсловием + |ИЗ + | ВопросыРаздела КАК ВопросыРаздела + |ГДЕ + | ВопросыРаздела.ТипВопроса = ЗНАЧЕНИЕ(Перечисление.ТипыВопросовШаблонаАнкеты.ВопросСУсловием) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВопросыРаздела.РодительВопрос КАК РодительВопрос, + | ВопросыРаздела.ВопросШаблона, + | ВопросыРаздела.СтроковыйКлюч КАК КлючСтроки, + | ВопросыСУсловием.СтроковыйКлюч КАК КлючСтрокиРодителя, + | ВопросыРаздела.Обязательный, + | ВопросыРаздела.ТребуетсяКомментарий, + | ВопросыРаздела.ТипВопроса, + | ВопросыРаздела.ЭлементарныйВопрос, + | ВопросыРаздела.ТипОтвета + |ИЗ + | ВопросыРаздела КАК ВопросыРаздела + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВопросыСУсловием КАК ВопросыСУсловием + | ПО ВопросыРаздела.РодительВопрос = ВопросыСУсловием.ВопросШаблона + |ГДЕ + | ВопросыРаздела.РодительВопрос В + | (ВЫБРАТЬ + | ВопросыСУсловием.ВопросШаблона + | ИЗ + | ВопросыСУсловием КАК ВопросыСУсловием) + |ИТОГИ ПО + | КлючСтрокиРодителя"; + + ВнешнийИсточник = Форма.ТаблицаВопросовРаздела.Выгрузить(); + ВнешнийИсточник.Колонки.Добавить("СтроковыйКлюч", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(50))); + Для каждого СтрокаТаблицы Из ВнешнийИсточник Цикл + СтрокаТаблицы.СтроковыйКлюч = Строка(СтрокаТаблицы.КлючСтроки); + КонецЦикла; + Запрос.УстановитьПараметр("ВнешнийИсточник",ВнешнийИсточник); + + Результат = Запрос.Выполнить(); + Если Результат.Пустой() Тогда + Возврат; + КонецЕсли; + + Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + Пока Выборка.Следующий() Цикл + + Форма.Элементы[АнкетированиеКлиентСервер.ПолучитьИмяВопроса(Выборка.КлючСтрокиРодителя)].УстановитьДействие("ПриИзменении","Подключаемый_ПриИзмененииВопросовСУсловием"); + + ВыборкаДетали = Выборка.Выбрать(); + + НоваяСтрока = Форма.ПодчиненныеВопросы.Добавить(); + НоваяСтрока.Вопрос = Выборка.КлючСтрокиРодителя; + + Пока ВыборкаДетали.Следующий() Цикл + + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(ВыборкаДетали.КлючСтроки); + Если ВыборкаДетали.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда + + НоваяСтрокаПодчиненные = НоваяСтрока.Подчиненные.Добавить(); + НоваяСтрокаПодчиненные.ИмяЭлементаПодчиненногоВопроса = ИмяВопроса + "_Таблица"; + НоваяСтрокаПодчиненные.Обязательный = Выборка.Обязательный; + + Иначе + + Если ВыборкаДетали.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда + + ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(ВыборкаДетали.ЭлементарныйВопрос,Форма); + + Счётчик = 0; + Для каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл + + Счётчик = Счётчик + 1; + НоваяСтрокаПодчиненные = НоваяСтрока.Подчиненные.Добавить(); + НоваяСтрокаПодчиненные.ИмяЭлементаПодчиненногоВопроса = ИмяВопроса + "_Реквизит_" + Счётчик; + НоваяСтрокаПодчиненные.Обязательный = Ложь; + + Если ВариантОтвета.ТребуетОткрытогоОтвета Тогда + НоваяСтрокаПодчиненные = НоваяСтрока.Подчиненные.Добавить(); + НоваяСтрокаПодчиненные.ИмяЭлементаПодчиненногоВопроса = ИмяВопроса + "_Комментарий_" + Счётчик; + НоваяСтрокаПодчиненные.Обязательный = Ложь; + КонецЕсли; + КонецЦикла; + + Иначе + + НоваяСтрокаПодчиненные = НоваяСтрока.Подчиненные.Добавить(); + НоваяСтрокаПодчиненные.ИмяЭлементаПодчиненногоВопроса = ИмяВопроса; + НоваяСтрокаПодчиненные.Обязательный = ВыборкаДетали.Обязательный; + + Если ВыборкаДетали.ТребуетсяКомментарий Тогда + НоваяСтрокаПодчиненные = НоваяСтрока.Подчиненные.Добавить(); + НоваяСтрокаПодчиненные.ИмяЭлементаПодчиненногоВопроса = ИмяВопроса + "_Комментарий"; + НоваяСтрокаПодчиненные.Обязательный = Ложь;; + КонецЕсли; + + КонецЕсли; + КонецЕсли; + КонецЦикла; // выборка детали + КонецЦикла; //выборка + +КонецПроцедуры // + diff --git a/SSL/src/CommonModules/Анкетирование/Анкетирование.mdo b/SSL/src/CommonModules/Анкетирование/Анкетирование.mdo new file mode 100644 index 000000000..af3b68427 --- /dev/null +++ b/SSL/src/CommonModules/Анкетирование/Анкетирование.mdo @@ -0,0 +1,10 @@ + + + Анкетирование + + ru + Анкетирование + + true + true + diff --git a/SSL/src/CommonModules/АнкетированиеКлиент/Module.bsl b/SSL/src/CommonModules/АнкетированиеКлиент/Module.bsl new file mode 100644 index 000000000..a730b4916 --- /dev/null +++ b/SSL/src/CommonModules/АнкетированиеКлиент/Module.bsl @@ -0,0 +1,33 @@ +// Создает структуру отбора, для дальнейшей передачи на сервер, +//и использования в качестве параметров отбора динамических списков вызываемых форм +// +Функция СоздатьСтруктуруПараметраОтбора(ТипОтбора,ЛевоеЗначение,ВидСравнения,ПравоеЗначение) Экспорт + + СтруктураВозврата = Новый Структура; + СтруктураВозврата.Вставить("ТипОтбора",ТипОтбора); + СтруктураВозврата.Вставить("ЛевоеЗначение",ЛевоеЗначение); + СтруктураВозврата.Вставить("ВидСравнения",ВидСравнения); + СтруктураВозврата.Вставить("ПравоеЗначение",ПравоеЗначение); + + Возврат СтруктураВозврата; + +КонецФункции // () + +// Формирует структуру параметров для передачи в вспомогательную форму ввода текста +// +Функция СформироватьСтруктуруПараметровДляФормыВводаТекста(Форма,Элемент) Экспорт + + СтруктураПараметров = Новый Структура; + Если ТипЗнч(Элемент.Родитель) = Тип("ГруппаФормы") Тогда + СтруктураПараметров.Вставить("Текст",Форма[Элемент.Имя]); + СтруктураПараметров.Вставить("ИмяТаблицы",Элемент.Имя); + Иначе + СтруктураПараметров.Вставить("Текст",Форма[Элемент.Родитель.Имя][Элемент.Родитель.ТекущаяСтрока][Элемент.Имя]); + СтруктураПараметров.Вставить("ИмяТаблицы",Элемент.Родитель.Имя); + СтруктураПараметров.Вставить("НомерСтроки",Элемент.Родитель.ТекущаяСтрока); + СтруктураПараметров.Вставить("ИмяКолонки",Элемент.Имя); + КонецЕсли; + + Возврат СтруктураПараметров; + +КонецФункции // () diff --git a/SSL/src/CommonModules/АнкетированиеКлиент/АнкетированиеКлиент.mdo b/SSL/src/CommonModules/АнкетированиеКлиент/АнкетированиеКлиент.mdo new file mode 100644 index 000000000..247c9760f --- /dev/null +++ b/SSL/src/CommonModules/АнкетированиеКлиент/АнкетированиеКлиент.mdo @@ -0,0 +1,10 @@ + + + АнкетированиеКлиент + + ru + Анкетирование клиент + + true + true + diff --git a/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl b/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl new file mode 100644 index 000000000..fef166093 --- /dev/null +++ b/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl @@ -0,0 +1,137 @@ + +// Преобразовывает массив в строку, +// +// Параметры: +// Массив - Массив - массив, который будет преобразован в строку +// Разделитель - Строка - строка, которая будет разделять элементы массива +// +// Возвращаемое значение: +// Строка - строка получившаяся в результате преобразования массива +// +Функция ПреобразоватьМассивВСтроку(Массив,Разделитель = "")Экспорт + + СтрокаРезультат = ""; + + Для каждого Элемент Из Массив Цикл + СтрокаРезультат = СтрокаРезультат + Строка(Элемент) + Разделитель; + КонецЦикла; + + Возврат СтрокаРезультат; + +КонецФункции // ПреобразоватьМассивВСтроку() + +// Удаляет из строки последние символы, если они равны подстроке удаления, +// до тех пор, пока последние символы будут не равны подстроке удаления. +// +// Параметры +// ВходящаяСтрока - Строка - строка, которая будет обрабатываться +// ПодстрокаУдаления - Строка - подстрока, которая будет удалена из конца строки +// Разделитель - Строка - если задан, то удаление происходит только в том случае, +// если подстрока удаления находится целиком после разделителя. +// +// Возвращаемое значение: +// Строка - получившаяся в результате обработки строка +// +Функция УдалитьПоследниеСимволыИзСтроки(ВходящаяСтрока,ПодстрокаУдаления,Разделитель = Неопределено) Экспорт + + Пока Прав(ВходящаяСтрока,СтрДлина(ПодстрокаУдаления)) = ПодстрокаУдаления Цикл + + Если Разделитель <> Неопределено Тогда + Если СРЕД(ВходящаяСтрока,СтрДлина(ВходящаяСтрока)-СтрДлина(ПодстрокаУдаления)-СтрДлина(Разделитель),СтрДлина(Разделитель)) = Разделитель Тогда + Возврат ВходящаяСтрока; + КонецЕсли; + КонецЕсли; + ВходящаяСтрока = ЛЕВ(ВходящаяСтрока,СтрДлина(ВходящаяСтрока) - СтрДлина(ПодстрокаУдаления)); + + КонецЦикла; + + Возврат ВходящаяСтрока; + +КонецФункции // () + +// Формирует имя вопроса на основании уникального идентификатора строки дерева анкеты +// +// Параметры +// Ключ - УникальныйИдентификатор - ключ, на основе которого будет формироваться имя вопроса +// +// Возвращаемое значение: +// Строка - получившаяся в результате обработки строка +// +Функция ПолучитьИмяВопроса(Ключ) Экспорт + + Возврат "Вопрос_" + СтрЗаменить(Ключ,"-","_"); + +КонецФункции // + +// Заново формирует нумерацию дерева анкеты +Процедура СформироватьНумерациюДерева(ДеревоАнкеты,ПреобразовыватьФормулировку = Ложь) Экспорт + + Если ДеревоАнкеты.ПолучитьЭлементы()[0].ТипСтроки = "Корень" Тогда + ЗначимыеЭлементыДерева = ДеревоАнкеты.ПолучитьЭлементы()[0].ПолучитьЭлементы(); + Иначе + ЗначимыеЭлементыДерева = ДеревоАнкеты.ПолучитьЭлементы(); + КонецЕсли; + + CформироватьНумерациюЭлементовДерева(ЗначимыеЭлементыДерева,1,Новый Массив,ПреобразовыватьФормулировку); + +КонецПроцедуры // + +//Вызывается рекурсивно при формировании полного кода строк дерева анкеты +Процедура CформироватьНумерациюЭлементовДерева(СтрокиДерева, УровеньРекурсии, МассивПолныйКод, ПреобразовыватьФормулировку) + + Если МассивПолныйКод.Количество() < УровеньРекурсии Тогда + МассивПолныйКод.Добавить(0); + КонецЕсли; + + Для каждого Элемент Из СтрокиДерева Цикл + + Если Элемент.ТипСтроки = "Вступление" ИЛИ Элемент.ТипСтроки = "Заключение" Тогда + Продолжить; + КонецЕсли; + + МассивПолныйКод[УровеньРекурсии-1] = МассивПолныйКод[УровеньРекурсии-1] + 1; + Для инд = УровеньРекурсии По МассивПолныйКод.Количество()-1 Цикл + МассивПолныйКод[инд] = 0; + КонецЦикла; + + ПолныйКод = ПреобразоватьМассивВСтроку(МассивПолныйКод,"."); + ПолныйКод = УдалитьПоследниеСимволыИзСтроки(ПолныйКод,"0.","."); + + Элемент.ПолныйКод = ПолныйКод; + Если ПреобразовыватьФормулировку Тогда + Элемент.Формулировка = Элемент.ПолныйКод + Элемент.Формулировка; + КонецЕсли; + + + ПодчиненныеЭлементыСтрокиДерева = Элемент.ПолучитьЭлементы(); + Попытка + Если ПодчиненныеЭлементыСтрокиДерева.Количество() > 0 Тогда + CформироватьНумерациюЭлементовДерева(ПодчиненныеЭлементыСтрокиДерева,?(Элемент.ТипСтроки ="Вопрос",УровеньРекурсии,УровеньРекурсии + 1),МассивПолныйКод,ПреобразовыватьФормулировку); + КонецЕсли; + Исключение + КонецПопытки + + КонецЦикла; + +КонецПроцедуры // () + +//Находит первую строку в заданной колонке, с заданным значением в коллекции ДанныеФормыДерево +Функция НайтиСтрокуВДанныхФормыДерево(ГдеИскать,Значение,Колонка,ИскатьВПодчиненных) Экспорт + + ЭлементыДерева = ГдеИскать.ПолучитьЭлементы(); + + Для каждого ЭлементДерева Из ЭлементыДерева Цикл + Если ЭлементДерева[Колонка] = Значение Тогда + Возврат ЭлементДерева.ПолучитьИдентификатор(); + ИначеЕсли ИскатьВПодчиненных Тогда + НайденныйИдентификаторСтроки = НайтиСтрокуВДанныхФормыДерево(ЭлементДерева,Значение,Колонка,ИскатьВПодчиненных); + Если НайденныйИдентификаторСтроки >=0 Тогда + Возврат НайденныйИдентификаторСтроки; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + Возврат -1; + +КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/АнкетированиеКлиентСервер/АнкетированиеКлиентСервер.mdo b/SSL/src/CommonModules/АнкетированиеКлиентСервер/АнкетированиеКлиентСервер.mdo new file mode 100644 index 000000000..2efe0b3e6 --- /dev/null +++ b/SSL/src/CommonModules/АнкетированиеКлиентСервер/АнкетированиеКлиентСервер.mdo @@ -0,0 +1,12 @@ + + + АнкетированиеКлиентСервер + + ru + Анкетирование клиент сервер + + true + true + true + true + diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl new file mode 100644 index 000000000..a3b9aed28 --- /dev/null +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl @@ -0,0 +1,204 @@ +//////////////////////////////////////////////////////////////////////////////// +// Клиентские процедуры подсистемы + +// Стандартный обработчик оповещения для форм выполнения задач. +// Для вызова из обработчика события формы ОбработкаОповещения. +// +// Параметры +// ЭтаФорма - УправляемаяФорма - форма выполнения задачи. +// ИмяСобытия - Строка - имя события. +// Параметр - произвольный тип - параметр события +// Источник - произвольный тип - источник события. +// +Процедура ФормаЗадачиОбработкаОповещения(Форма, ИмяСобытия, Параметр, Источник) Экспорт + + Если ИмяСобытия = "ЗадачаПеренаправлена" Тогда + Если НЕ Форма.Модифицированность + И (Параметр = Форма.Объект.Ссылка ИЛИ (ТипЗнч(Параметр) = Тип("Массив") + И Параметр.Найти(Форма.Объект.Ссылка) <> Неопределено)) Тогда + Форма.Закрыть(); + КонецЕсли; + ИначеЕсли ИмяСобытия = "ЗадачаИзменена" Тогда + Если НЕ Форма.Модифицированность + И (Параметр = Форма.Объект.Ссылка ИЛИ (ТипЗнч(Параметр) = Тип("Массив") + И Параметр.Найти(Форма.Объект.Ссылка) <> Неопределено)) Тогда + Форма.Прочитать(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Процедура СписокЗадачПередНачаломДобавления(Форма, Элемент, Отказ, Копирование, Родитель, Группа) Экспорт + + Если Копирование Тогда + Задача = Элемент.ТекущаяСтрока; + Если НЕ ЗначениеЗаполнено(Задача) Тогда + Возврат; + КонецЕсли; + ПараметрыФормы = Новый Структура("Основание", Задача); + КонецЕсли; + СоздатьЗадание(Форма, ПараметрыФормы); + Отказ = Истина; + +КонецПроцедуры + +Процедура СписокЗадачВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) Экспорт + СтандартнаяОбработка = НЕ ОткрытьФормуВыполненияЗадачи(ВыбраннаяСтрока); +КонецПроцедуры + +Процедура СписокЗадачПередНачаломИзменения(Элемент, Отказ) Экспорт + Отказ = ОткрытьФормуВыполненияЗадачи(Элемент.ТекущаяСтрока); +КонецПроцедуры + +// Открыть форму выполнения задачи, которую предоставляет бизнес-процесс. +// +Функция ОткрытьФормуВыполненияЗадачи(Знач ЗадачаСсылка) Экспорт + + ПараметрыФормы = БизнесПроцессыИЗадачиСервер.ПолучитьФормуВыполненияЗадачи(ЗадачаСсылка); + ИмяФормыВыполненияЗадачи = ""; + Результат = ПараметрыФормы.Свойство("ИмяФормы", ИмяФормыВыполненияЗадачи); + Если Результат Тогда + ОткрытьФорму(ИмяФормыВыполненияЗадачи, ПараметрыФормы.ПараметрыФормы); + КонецЕсли; + Возврат Результат; + +КонецФункции + +// Записать и закрыть форму выполнения задачи. +// +// Параметры +// Форма - УправляемаяФорма - форма выполнения задачи. +// ВыполнитьЗадачу - Булево - задача записывается в режиме выполнения. +// +// Возвращаемое значение: +// Булево - Истина, если запись прошла успешно. +// +Функция ЗаписатьИЗакрытьВыполнить(Форма, ВыполнитьЗадачу = Ложь) Экспорт + + ОчиститьСообщения(); + + НовыйОбъект = НЕ Форма.Объект.Ссылка.Пустая(); + Если НЕ Форма.НачальныйПризнакВыполнения И ВыполнитьЗадачу Тогда + + Если НЕ Форма.Записать(Новый Структура("ВыполнитьЗадачу", Истина)) Тогда + Возврат Ложь; + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Задача выполнена'"), + ПолучитьНавигационнуюСсылку(Форма.Объект.Ссылка), + Строка(Форма.Объект.Ссылка), + БиблиотекаКартинок.Информация32); + Оповестить("ЗадачаВыполнена", Форма.Объект.Ссылка); + + Иначе + Если НЕ Форма.Записать() Тогда + Возврат Ложь; + КонецЕсли; + + Если НовыйОбъект Тогда + ПоказатьОповещениеПользователя( + НСтр("ru = 'Задача создана'"), + ПолучитьНавигационнуюСсылку(Форма.Объект.Ссылка), + Строка(Форма.Объект.Ссылка), + БиблиотекаКартинок.Информация32); + Оповестить("ЗадачаИзменена", Форма.Объект.Ссылка); + Иначе + ПоказатьОповещениеПользователя( + НСтр("ru = 'Задача изменена'"), + ПолучитьНавигационнуюСсылку(Форма.Объект.Ссылка), + Строка(Форма.Объект.Ссылка), + БиблиотекаКартинок.Информация32); + Оповестить("ЗадачаИзменена", Форма.Объект.Ссылка); + КонецЕсли; + КонецЕсли; + + Форма.Закрыть(); + Возврат Истина; + +КонецФункции + +// Открыть форму для ввода нового задания. +// +Процедура СоздатьЗадание(Знач ФормаВладелец = Неопределено, Знач ПараметрыФормы = Неопределено) Экспорт + ОткрытьФорму("БизнесПроцесс.Задание.ФормаОбъекта", ПараметрыФормы, ФормаВладелец); +КонецПроцедуры + +Процедура ПеренаправитьЗадачи(МассивЗадач, ВладелецФорма) Экспорт + + Если МассивЗадач = Неопределено Тогда + Предупреждение(НСтр("ru = 'Не выбраны задачи.'")); + Возврат; + КонецЕсли; + + ЗадачиМогутБытьПеренаправлены = БизнесПроцессыИЗадачиСервер.ПеренаправитьЗадачи(МассивЗадач, Неопределено, Истина); + Если НЕ ЗадачиМогутБытьПеренаправлены И МассивЗадач.Количество() = 1 Тогда + Предупреждение(НСтр("ru = 'Невозможно перенаправить уже выполненную задачу.'")); + Возврат; + КонецЕсли; + + Результат = ОткрытьФормуМодально("Задача.ЗадачаИсполнителя.Форма.ПеренаправитьЗадачи", + Новый Структура("Задача,КоличествоЗадач,ЗаголовокФормы", + МассивЗадач[0], МассивЗадач.Количество(), + ?(МассивЗадач.Количество() > 1, НСтр("ru = 'Перенаправить задачи'"), НСтр("ru = 'Перенаправить задачу'"))), + ВладелецФорма); + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + Если МассивЗадач.Количество() > 10 Тогда + Состояние(НСтр("ru = 'Перенаправление задач'"),, + НСтр("ru = 'Выполняется перенаправление задач...'")); + КонецЕсли; + МассивПеренаправленныхЗадач = Неопределено; + ЗадачиПеренаправлены = БизнесПроцессыИЗадачиСервер.ПеренаправитьЗадачи(МассивЗадач, Результат, Ложь, МассивПеренаправленныхЗадач); + Если МассивЗадач.Количество() > 1 Тогда + Если ЗадачиПеренаправлены Тогда + Состояние(НСтр("ru = 'Перенаправление задач'"),, + НСтр("ru = 'Задачи перенаправлены.'")); + Иначе + Состояние(НСтр("ru = 'Перенаправление задач'"),, + НСтр("ru = 'Не все задачи перенаправлены. Пропущены задачи, отмеченные как выполненные.'")); + КонецЕсли; + Иначе + Задача = МассивПеренаправленныхЗадач[0]; + ПоказатьОповещениеПользователя( + НСтр("ru = 'Задача перенаправлена'"), + ПолучитьНавигационнуюСсылку(Задача), + Строка(Задача)); + КонецЕсли; + Оповестить("ЗадачаИзменена", МассивЗадач); + Оповестить("ЗадачаПеренаправлена", МассивЗадач); + +КонецПроцедуры + +// Открыть форму с дополнительной информацией о задаче. +// +Функция ОткрытьДопИнформациюОЗадаче(Знач ЗадачаСсылка) Экспорт + + ОткрытьФорму("Задача.ЗадачаИсполнителя.Форма.Дополнительно", + Новый Структура("Ключ", ЗадачаСсылка)); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции + +Процедура СписокБизнесПроцессовПометкаУдаления(Список) Экспорт + ВыделенныеСтроки = Список.ВыделенныеСтроки; + Если ВыделенныеСтроки = Неопределено ИЛИ ВыделенныеСтроки.Количество() <= 0 Тогда + Предупреждение(НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); + Возврат; + КонецЕсли; + Результат = Вопрос(НСтр("ru = 'Изменить пометку удаления?'"), РежимДиалогаВопрос.ДаНет); + Если Результат <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + БизнесПроцессСсылка = БизнесПроцессыИЗадачиСервер.ПометитьНаУдалениеБизнесПроцессы(ВыделенныеСтроки); + Список.Обновить(); + ПоказатьОповещениеПользователя(НСтр("ru = 'Пометка удаления изменена.'"), + ?(БизнесПроцессСсылка <> Неопределено, ПолучитьНавигационнуюСсылку(БизнесПроцессСсылка), ""), + ?(БизнесПроцессСсылка <> Неопределено, Строка(БизнесПроцессСсылка), "")); +КонецПроцедуры + diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/БизнесПроцессыИЗадачиКлиент.mdo b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/БизнесПроцессыИЗадачиКлиент.mdo new file mode 100644 index 000000000..076a3b307 --- /dev/null +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/БизнесПроцессыИЗадачиКлиент.mdo @@ -0,0 +1,11 @@ + + + БизнесПроцессыИЗадачиКлиент + + ru + Бизнес процессы и задачи клиент + + true + true + true + diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl new file mode 100644 index 000000000..206679482 --- /dev/null +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl @@ -0,0 +1,27 @@ +/////////////////////////////////////////////////////////////////////////////// +// ИНТЕРФЕЙСНАЯ ЧАСТЬ ПЕРЕОПРЕДЕЛЯЕМОГО МОДУЛЯ + +// Возвращает адрес электронной почты пользователя ПользовательСсылка. +// +// Параметры +// ПользовательСсылка – СправочникСсылка.Пользователи +// +// Возвращаемое значение: +// Строка – адрес электронной почты. +// +Функция ПолучитьАдресЭлектроннойПочты(ПользовательСсылка) Экспорт + + Результат = УправлениеКонтактнойИнформацией.ПолучитьКонтактнуюИнформацияОбъекта(ПользовательСсылка, + Справочники.ВидыКонтактнойИнформации.EmailПользователя); + Возврат Результат; + +КонецФункции + +// Вызывается для обновления данных бизнес-процесса в регистре сведений +// СписокБизнесПроцессов. +// +// Параметры +// Запись - РегистрСведенийЗапись.СписокБизнесПроцессов +// +Процедура ПриЗаписиСпискаБизнесПроцессов(Запись) Экспорт +КонецПроцедуры diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/БизнесПроцессыИЗадачиПереопределяемый.mdo b/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/БизнесПроцессыИЗадачиПереопределяемый.mdo new file mode 100644 index 000000000..dbaac0a30 --- /dev/null +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/БизнесПроцессыИЗадачиПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + БизнесПроцессыИЗадачиПереопределяемый + + ru + Бизнес процессы и задачи переопределяемый + + true + true + diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl new file mode 100644 index 000000000..8133e9903 --- /dev/null +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl @@ -0,0 +1,1166 @@ +//////////////////////////////////////////////////////////////////////////////// +// Взаимодействие с бизнес-процессами + +// Получить структуру с описанием формы выполнения задачи. +// +// Параметры +// ЗадачаСсылка – ЗадачаСсылка.ЗадачаИсполнителя – задача +// +// Возвращаемое значение: +// Структура – структуру с описанием формы выполнения задачи. +// В ключе +// +Функция ПолучитьФормуВыполненияЗадачи(Знач ЗадачаСсылка) Экспорт + + Если ТипЗнч(ЗадачаСсылка) <> Тип("ЗадачаСсылка.ЗадачаИсполнителя") Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неправильный тип параметра ЗадачаСсылка (передан: %1; ожидается: %2)'"), + ТипЗнч(ЗадачаСсылка), "ЗадачаСсылка.ЗадачаИсполнителя"); + + ВызватьИсключение ТекстСообщения; + + КонецЕсли; + + Реквизиты = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ЗадачаСсылка, "БизнесПроцесс,ТочкаМаршрута"); + Если Реквизиты.БизнесПроцесс = Неопределено ИЛИ Реквизиты.БизнесПроцесс.Пустая() Тогда + Возврат Новый Структура(); + КонецЕсли; + + ТипБизнесПроцесса = Метаданные.НайтиПоТипу(ТипЗнч(Реквизиты.БизнесПроцесс)); + ПараметрыФормы = БизнесПроцессы[ТипБизнесПроцесса.Имя].ФормаВыполненияЗадачи(ЗадачаСсылка, + Реквизиты.ТочкаМаршрута); + Возврат ПараметрыФормы; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обновление информационной базы + +// Обновить данные в информационной базе при смене версии конфигурации. +// +Процедура ОбновлениеИнформационнойБазы() Экспорт + + ВсеОбъектыАдресации = ПланыВидовХарактеристик.ОбъектыАдресацииЗадач.ВсеОбъектыАдресации; + + РольОбъект = Справочники.РолиИсполнителей.ОтветственныйЗаКонтрольИсполнения.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(РольОбъект.Ссылка); + РольОбъект.ИспользуетсяБезОбъектовАдресации = Истина; + РольОбъект.ИспользуетсяСОбъектамиАдресации = Истина; + РольОбъект.ТипыОсновногоОбъектаАдресации = ВсеОбъектыАдресации; + РольОбъект.Записать(); + +КонецПроцедуры + +// Обновить данные в информационной базе при смене версии конфигурации. +// +Процедура ОбновлениеИнформационнойБазыПредметСтрокой() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ЗадачаИсполнителя.Ссылка КАК Ссылка, + | ЗадачаИсполнителя.Предмет КАК Предмет + |ИЗ + | Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя"; + + Результат = Запрос.Выполнить(); + ВыборкаДетальныеЗаписи = Результат.Выбрать(); + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + + ПредметСсылка = ВыборкаДетальныеЗаписи.Предмет; + Если ПредметСсылка = Неопределено ИЛИ ПредметСсылка.Пустая() Тогда + Продолжить; + КонецЕсли; + + ЗадачаОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); + ЗадачаОбъект.ПредметСтрокой = ПредметСтрокой(ПредметСсылка); + ЗадачаОбъект.Записать(); + + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Серверные процедуры подсистемы + +// Инициализирует общие параметры формы выполнения задачи. +// +// Параметры: +// Форма - УправляемаяФорма - форма выполнения задачи. +// ЗадачаОбъект - ЗадачаОбъект - объект задачи. +// ЭлементГруппаСостояние - элемент управления формы - группа с информации о +// состоянии задачи +// ЭлементДатаИсполнения - элемент управления формы - поле с датой исполнения задачи +// +Процедура ФормаЗадачиПриСозданииНаСервере(Форма, ЗадачаОбъект, + ЭлементГруппаСостояние, ЭлементДатаИсполнения) Экспорт + + Форма.ТолькоПросмотр = ЗадачаОбъект.Выполнена; + ИзменятьЗаданияЗаднимЧислом = ПолучитьФункциональнуюОпцию("ИзменятьЗаданияЗаднимЧислом"); + ЭлементДатаИсполнения.Вид = ?(ИзменятьЗаданияЗаднимЧислом, ВидПоляФормы.ПолеВвода, ВидПоляФормы.ПолеНадписи); + + ЭлементГруппаСостояние.Видимость = ЗадачаОбъект.Выполнена; + Если ЗадачаОбъект.Выполнена Тогда + Родитель = ?(ЭлементГруппаСостояние <> Неопределено, ЭлементГруппаСостояние, Форма); + Элемент = Форма.Элементы.Найти("__СостояниеЗадачиКартинка"); + Если Элемент = Неопределено Тогда + Элемент = Форма.Элементы.Добавить("__СостояниеЗадачиКартинка", Тип("ДекорацияФормы"), Родитель); + Элемент.Вид = ВидДекорацииФормы.Картинка; + Элемент.Картинка = БиблиотекаКартинок.Информация32; + Элемент.Высота = 2; + Элемент.Ширина = 4; + КонецЕсли; + + Элемент = Форма.Элементы.Найти("__СостояниеЗадачи"); + Если Элемент = Неопределено Тогда + Элемент = Форма.Элементы.Добавить("__СостояниеЗадачи", Тип("ДекорацияФормы"), Родитель); + Элемент.Вид = ВидДекорацииФормы.Надпись; + Элемент.Высота = 2; + КонецЕсли; + ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); + ДатаИсполненияСтрокой = ?(ИспользоватьДатуИВремяВСрокахЗадач, + Формат(ЗадачаОбъект.ДатаИсполнения, "ДЛФ=DT"), Формат(ЗадачаОбъект.ДатаИсполнения, "ДЛФ=D")); + Элемент.Заголовок = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru ='Задача выполнена %1 пользователем %2.'"), + ДатаИсполненияСтрокой, + ИсполнительСтрокой(ЗадачаОбъект.Исполнитель, ЗадачаОбъект.РольИсполнителя, + ЗадачаОбъект.ОсновнойОбъектАдресации, ЗадачаОбъект.ДополнительныйОбъектАдресации)); + КонецЕсли; + + Если ЭтоВедущаяЗадача(ЗадачаОбъект.Ссылка) Тогда + Родитель = ?(ЭлементГруппаСостояние <> Неопределено, ЭлементГруппаСостояние, Форма); + Элемент = Форма.Элементы.Найти("__ВедущаяЗадачаКартинка"); + Если Элемент = Неопределено Тогда + Элемент = Форма.Элементы.Добавить("__ВедущаяЗадачаКартинка", Тип("ДекорацияФормы"), Родитель); + Элемент.Вид = ВидДекорацииФормы.Картинка; + Элемент.Картинка = БиблиотекаКартинок.Информация32; + Элемент.Высота = 2; + Элемент.Ширина = 4; + КонецЕсли; + + Элемент = Форма.Элементы.Найти("__ВедущаяЗадача"); + Если Элемент = Неопределено Тогда + Элемент = Форма.Элементы.Добавить("__ВедущаяЗадача", Тип("ДекорацияФормы"), Родитель); + Элемент.Вид = ВидДекорацииФормы.Надпись; + Элемент.Заголовок = НСтр("ru ='Это ведущая задача для вложенных бизнес-процессов.'"); + Элемент.Высота = 2; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Вызывается при создании формы списка задач на сервере. +// +// Параметры +// УсловноеОформление - УсловноеОформление - условное оформление списка задач +// +Процедура УстановитьОформлениеЗадач(Знач УсловноеОформление) Экспорт + + // установка оформления для просроченных задач + ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + + ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СрокИсполнения"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено; + ЭлементОтбораДанных.Использование = Истина; + + ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СрокИсполнения"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше; + ЭлементОтбораДанных.ПравоеЗначение = КонецДня(ТекущаяДата()); + ЭлементОтбораДанных.Использование = Истина; + + ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Выполнена"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбораДанных.ПравоеЗначение = Ложь; + ЭлементОтбораДанных.Использование = Истина; + + ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("TextColor"); + ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.ПросроченнаяЗадача.Значение; + ЭлементЦветаОформления.Использование = Истина; + + // установка оформления для выполненных задач + ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + + ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Выполнена"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбораДанных.ПравоеЗначение = Истина; + ЭлементОтбораДанных.Использование = Истина; + + ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("TextColor"); + ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.ВыполненнаяЗадача.Значение; + ЭлементЦветаОформления.Использование = Истина; + +КонецПроцедуры + +// Возвращает строковое представление исполнителя задачи. +// +// Возвращаемое значение: +// Строка +// +Функция ИсполнительСтрокой(Знач ПользовательСсылка, Знач РольСсылка, + Знач ОсновнойОбъектАдресации = Неопределено, + Знач ДополнительныйОбъектАдресации = Неопределено) Экспорт + + Если НЕ ПользовательСсылка.Пустая() Тогда + Возврат Строка(ПользовательСсылка) + ИначеЕсли НЕ РольСсылка.Пустая() Тогда + Возврат РольСтрокой(РольСсылка, ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации); + КонецЕсли; + Возврат НСтр("ru = 'Не указан'"); + +КонецФункции + +// Возвращает строковое представление роли. +// +// Параметры +// Роль – Справочники.РолиИсполнителей – роль +// ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации - произвольный ссылочный тип. +// +// Возвращаемое значение: +// Строка +// +Функция РольСтрокой(Знач РольСсылка, + Знач ОсновнойОбъектАдресации = Неопределено, + Знач ДополнительныйОбъектАдресации = Неопределено) Экспорт + + Если НЕ РольСсылка.Пустая() Тогда + Результат = Строка(РольСсылка); + Если ОсновнойОбъектАдресации <> Неопределено Тогда + Результат = Результат + " (" + Строка(ОсновнойОбъектАдресации); + Если ДополнительныйОбъектАдресации <> Неопределено Тогда + Результат = Результат + " ," + Строка(ДополнительныйОбъектАдресации); + КонецЕсли; + Результат = Результат + ")"; + КонецЕсли; + Возврат Результат; + КонецЕсли; + Возврат НСтр("ru = 'Не указана'"); + +КонецФункции + +Функция ПредметСтрокой(ПредметСсылка) Экспорт + + ПредметЗаполнен = ПредметСсылка <> Неопределено И НЕ ПредметСсылка.Пустая(); + Если НЕ ПредметЗаполнен Тогда + Возврат НСтр("ru = 'не задан'"); + КонецЕсли; + + Если Метаданные.Документы.Содержит(Метаданные.НайтиПоТипу(ТипЗнч(ПредметСсылка))) Тогда + Возврат Строка(ПредметСсылка); + Иначе + ПредставлениеОбъекта = ПредметСсылка.Метаданные().ПредставлениеОбъекта; + Если ПустаяСтрока(ПредставлениеОбъекта) Тогда + ПредставлениеОбъекта = ПредметСсылка.Метаданные().Представление(); + КонецЕсли; + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + "%1 (%2)", Строка(ПредметСсылка), ПредставлениеОбъекта); + КонецЕсли; + +КонецФункции + +// Возвращает количество невыполненных задач текущего пользователя. +// +Функция КоличествоЗадачПоИсполнителю(Знач ВключаяВыполненные) Экспорт + + Запрос = Новый Запрос(); + Запрос.Текст = "ВЫБРАТЬ + | КОЛИЧЕСТВО(ПорученияЗадачиПоИсполнителю.Наименование) КАК Количество + |ИЗ + | Задача.ЗадачаИсполнителя.ЗадачиПоИсполнителю КАК ПорученияЗадачиПоИсполнителю + |ГДЕ + | ПорученияЗадачиПоИсполнителю.ПометкаУдаления = ЛОЖЬ"; + Если НЕ ВключаяВыполненные Тогда + Запрос.Текст = Запрос.Текст + " И ПорученияЗадачиПоИсполнителю.Выполнена = ЛОЖЬ"; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + ТаблицаДанных = Запрос.Выполнить().Выгрузить(); + Возврат ?(ТаблицаДанных.Количество() = 0, 0, ТаблицаДанных[0].Количество); + +КонецФункции + +// Помечает на удаление задачи указанного бизнес-процесса. +// +// Параметры +// БизнесПроцессСсылка - бизнес-процесс +// ПометкаУдаления - Булево - значение свойства ПометкаУдаления. +// +Процедура УстановитьПометкуУдаленияЗадач(БизнесПроцессСсылка, ПометкаУдаления) Экспорт + + НачатьТранзакцию(); + Попытка + Запрос = Новый Запрос("ВЫБРАТЬ + | Задачи.Ссылка КАК Ссылка + |ИЗ + | Задача.ЗадачаИсполнителя КАК Задачи + |ГДЕ + | Задачи.БизнесПроцесс = &БизнесПроцесс"); + Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцессСсылка); + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + ЗадачаОбъект = Выборка.Ссылка.ПолучитьОбъект(); + ЗадачаОбъект.УстановитьПометкуУдаления(ПометкаУдаления); + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, + БизнесПроцессСсылка.Метаданные(), БизнесПроцессСсылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Установить формат отображения и редактирования поля формы типа Дата +// в зависимости от настроек подсистемы. +// +// Параметры +// ПолеДаты - элемент управления формы, поле со значением типа Дата. +// +Процедура УстановитьФорматДаты(ПолеДаты) Экспорт + + ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); + СтрокаФормата = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"); + Если ПолеДаты.Вид = ВидПоляФормы.ПолеВвода Тогда + ПолеДаты.ФорматРедактирования = СтрокаФормата; + Иначе + ПолеДаты.Формат = СтрокаФормата; + КонецЕсли; + ПолеДаты.Ширина = ?(ИспользоватьДатуИВремяВСрокахЗадач, 0, 8); + +КонецПроцедуры + +// Возвращает дату завершения указанного бизнес-процесса, +// полученную как максимальная дата исполнения задач бизнес-процесса. +// +// Параметры +// БизнесПроцессСсылка - бизнес-процесс +// +// Возвращаемое значение: +// Дата +// +Функция ДатаЗавершенияБизнесПроцесса(БизнесПроцессСсылка) Экспорт + + УстановитьПривилегированныйРежим(Истина); + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | МАКСИМУМ(ЗадачаИсполнителя.ДатаИсполнения) КАК МаксДатаИсполнения + |ИЗ + | Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя + |ГДЕ + | ЗадачаИсполнителя.БизнесПроцесс = &БизнесПроцесс + | И ЗадачаИсполнителя.Выполнена = ИСТИНА"; + Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцессСсылка); + + Результат = Запрос.Выполнить(); + Если Результат.Пустой() Тогда + Возврат ТекущаяДата(); + КонецЕсли; + + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + Возврат Выборка.МаксДатаИсполнения; + +КонецФункции + +// Проверяет, является ли указанная задача ведущей. +// +// Параметры +// ЗадачаСсылка - задача. +// +// Возвращаемое значение: +// Булево +// +Функция ЭтоВедущаяЗадача(ЗадачаСсылка) Экспорт + + УстановитьПривилегированныйРежим(Истина); + Результат = ВыбратьБизнесПроцессыВедущейЗадачи(ЗадачаСсылка); + Возврат НЕ Результат.Пустой(); + +КонецФункции + +// Проверяет, является ли указанная задача ведущей. +// +// Параметры +// ЗадачаСсылка - задача. +// +// Возвращаемое значение: +// Булево +// +Функция БизнесПроцессыВедущейЗадачи(ЗадачаСсылка) Экспорт + + Результат = ВыбратьБизнесПроцессыВедущейЗадачи(ЗадачаСсылка); + Возврат Результат.Выгрузить().ВыгрузитьКолонку("Ссылка"); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции + +// Обработчик регламентного задания УведомлениеИсполнителейОНовыхЗадачах. +// +Процедура УведомитьИсполнителейОНовыхЗадачах() Экспорт + + УстановитьПривилегированныйРежим(Истина); + ДатаПоследнегоУведомления = Константы.ДатаУведомленияОНовыхЗадачах.Получить(); + ТекущаяДата = ТекущаяДата(); + Константы.ДатаУведомленияОНовыхЗадачах.Установить(ТекущаяДата); + УстановитьПривилегированныйРежим(Ложь); + + // Если оповещение ранее не производилось, или последнее оповещение происходило + // ранее, чем за сутки, то отбираем новые задачи за последние сутки. + Если (ДатаПоследнегоУведомления = '00010101000000') + ИЛИ (ТекущаяДата - ДатаПоследнегоУведомления > 24*60*60) Тогда + ДатаПоследнегоУведомления = ТекущаяДата - 24*60*60; + КонецЕсли; + + ЗадачиПоИсполнителям = ВыбратьНовыеЗадачиПоИсполнителям(ДатаПоследнегоУведомления); + Для Каждого СтрокаИсполнителя Из ЗадачиПоИсполнителям.Строки Цикл + ОтправитьУведомлениеОНовыхЗадачах(СтрокаИсполнителя.Исполнитель, СтрокаИсполнителя); + КонецЦикла; + +КонецПроцедуры + +// Обработчик регламентного задания МониторингЗадач. +// +Процедура ПроконтролироватьЗадачи() Экспорт + + ПросроченныеЗадачи = ВыбратьПросроченныеЗадачи(); + Если ПросроченныеЗадачи.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + НаборПисемПоАдресатам = Новый ТаблицаЗначений; + НаборПисемПоАдресатам.Колонки.Добавить("ПочтовыйАдрес"); + НаборПисемПоАдресатам.Колонки.Добавить("ТекстПисьма"); + НаборПисемПоАдресатам.Колонки.Добавить("КоличествоЗадач"); + НаборПисемПоАдресатам.Колонки.Добавить("ТипПисьма"); + НаборПисемПоАдресатам.Колонки.Добавить("Получатель"); + + Для Каждого ЭлементПросроченныеЗадачи Из ПросроченныеЗадачи Цикл + ПросроченнаяЗадача = ЭлементПросроченныеЗадачи.Ссылка; + + ТекстПисьма = СформироватьПредставлениеЗадачи(ЭлементПросроченныеЗадачи); + // Задача адресована лично исполнителю? + Если ЗначениеЗаполнено(ПросроченнаяЗадача.Исполнитель) Тогда + ПолучательПисьма = БизнесПроцессыИЗадачиПереопределяемый.ПолучитьАдресЭлектроннойПочты(ПросроченнаяЗадача.Исполнитель); + НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, ПросроченнаяЗадача.Исполнитель, ТекстПисьма, "Исполнителю"); + ПолучательПисьма = БизнесПроцессыИЗадачиПереопределяемый.ПолучитьАдресЭлектроннойПочты(ПросроченнаяЗадача.Автор); + НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, ПросроченнаяЗадача.Автор, ТекстПисьма, "Автору"); + Иначе + Исполнители = ВыбратьИсполнителейЗадач(ПросроченнаяЗадача); + Координаторы = НайтиОтветственныхЗаНазначениеРолей(ПросроченнаяЗадача); + // Есть хотя бы один исполнитель для измерений ролевой адресации задачи? + Если Исполнители.Количество() > 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 = 'Бизнес-процессы и задачи.Уведомление о просроченных задачах'"), УровеньВажностиСобытия,,, ТекстСообщения); + КонецЦикла; + +КонецПроцедуры + +// Выбрать список ролей, которые могут быть назначены в ОсновнойОбъектАдресации, +// и посчитать список назначений. +// +Функция ВыбратьРолиСКоличествомИсполнителей(ОсновнойОбъектАдресации) Экспорт + Если ОсновнойОбъектАдресации <> Неопределено Тогда + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | РолиИсполнителей.Ссылка КАК РольСсылка, + | РолиИсполнителей.Наименование КАК Роль, + | РолиИсполнителей.ТипыОсновногоОбъектаАдресации КАК ТипыОсновногоОбъектаАдресации, + | СУММА(ВЫБОР + | КОГДА ИсполнителиЗадач.РольИсполнителя <> ЗНАЧЕНИЕ(Справочник.РолиИсполнителей.ПустаяСсылка) + | И ИсполнителиЗадач.РольИсполнителя ЕСТЬ НЕ NULL + | И ИсполнителиЗадач.ОсновнойОбъектАдресации = &ОсновнойОбъектАдресации + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ) КАК Исполнители + |ИЗ + | Справочник.РолиИсполнителей КАК РолиИсполнителей + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач + | ПО (ИсполнителиЗадач.РольИсполнителя = РолиИсполнителей.Ссылка) + |ГДЕ + | РолиИсполнителей.ПометкаУдаления = ЛОЖЬ + | И РолиИсполнителей.ИспользуетсяСОбъектамиАдресации = ИСТИНА + | СГРУППИРОВАТЬ ПО + | РолиИсполнителей.Ссылка, + | ИсполнителиЗадач.РольИсполнителя, + | РолиИсполнителей.Наименование, + | РолиИсполнителей.ТипыОсновногоОбъектаАдресации"; + Иначе + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | РолиИсполнителей.Ссылка КАК РольСсылка, + | РолиИсполнителей.Наименование КАК Роль, + | РолиИсполнителей.ТипыОсновногоОбъектаАдресации КАК ТипыОсновногоОбъектаАдресации, + | СУММА(ВЫБОР + | КОГДА ИсполнителиЗадач.РольИсполнителя <> ЗНАЧЕНИЕ(Справочник.РолиИсполнителей.ПустаяСсылка) + | И ИсполнителиЗадач.РольИсполнителя ЕСТЬ НЕ NULL + | И (ИсполнителиЗадач.ОсновнойОбъектАдресации ЕСТЬ NULL + | ИЛИ ИсполнителиЗадач.ОсновнойОбъектАдресации = Неопределено) + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ) КАК Исполнители + |ИЗ + | Справочник.РолиИсполнителей КАК РолиИсполнителей + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач + | ПО (ИсполнителиЗадач.РольИсполнителя = РолиИсполнителей.Ссылка) + |ГДЕ + | РолиИсполнителей.ПометкаУдаления = ЛОЖЬ + | И РолиИсполнителей.ИспользуетсяБезОбъектовАдресации = ИСТИНА + | СГРУППИРОВАТЬ ПО + | РолиИсполнителей.Ссылка, + | ИсполнителиЗадач.РольИсполнителя, + | РолиИсполнителей.Наименование, + | РолиИсполнителей.ТипыОсновногоОбъектаАдресации"; + КонецЕсли; + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.Параметры.Вставить("ОсновнойОбъектАдресации", ОсновнойОбъектАдресации); + ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); + Возврат ВыборкаЗапроса; + +КонецФункции + +// Выбрать список исполнителей, назначенных на указанную роль. +// +// Результат: +// Массив - массив элементов справочника Пользователи. +// +Функция ИсполнителиРоли(РольСсылка, ОсновнойОбъектАдресации = Неопределено, + ДополнительныйОбъектАдресации = Неопределено) Экспорт + + РезультатЗапроса = ВыбратьИсполнителейРоли(РольСсылка, ОсновнойОбъектАдресации, + ДополнительныйОбъектАдресации); + Возврат РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Исполнитель"); + +КонецФункции + +// Есть ли хотя бы один исполнитель, назначенный на указанную роль. +// +// Результат: +// Булево +// +Функция ЕстьИсполнителиРоли(РольСсылка, ОсновнойОбъектАдресации = Неопределено, + ДополнительныйОбъектАдресации = Неопределено) Экспорт + + РезультатЗапроса = ВыбратьИсполнителейРоли(РольСсылка, ОсновнойОбъектАдресации, + ДополнительныйОбъектАдресации); + Возврат НЕ РезультатЗапроса.Пустой(); + +КонецФункции + +Функция ВыбратьИсполнителейРоли(РольСсылка, ОсновнойОбъектАдресации = Неопределено, + ДополнительныйОбъектАдресации = Неопределено) + + ТекстЗапроса = + "ВЫБРАТЬ + | ИсполнителиЗадач.Исполнитель + |ИЗ + | РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач + |ГДЕ + | ИсполнителиЗадач.РольИсполнителя = &РольИсполнителя"; + Если ОсновнойОбъектАдресации <> Неопределено Тогда + ТекстЗапроса = ТекстЗапроса + + " И ИсполнителиЗадач.ОсновнойОбъектАдресации = &ОсновнойОбъектАдресации"; + КонецЕсли; + Если ДополнительныйОбъектАдресации <> Неопределено Тогда + ТекстЗапроса = ТекстЗапроса + + " И ИсполнителиЗадач.ДополнительныйОбъектАдресации = &ДополнительныйОбъектАдресации"; + КонецЕсли; + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.Параметры.Вставить("РольИсполнителя", РольСсылка); + Запрос.Параметры.Вставить("ОсновнойОбъектАдресации", ОсновнойОбъектАдресации); + Запрос.Параметры.Вставить("ДополнительныйОбъектАдресации", ДополнительныйОбъектАдресации); + РезультатЗапроса = Запрос.Выполнить(); + Возврат РезультатЗапроса; + +КонецФункции + +// Выбрать одного любого исполнителя, назначенного на РольИсполнителя в ОсновнойОбъектАдресации. +// +Функция ВыбратьИсполнителя(ОсновнойОбъектАдресации, РольИсполнителя) Экспорт + + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 + | ИсполнителиЗадач.Исполнитель КАК Исполнитель + |ИЗ + | РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач + |ГДЕ + | ИсполнителиЗадач.РольИсполнителя = &РольИсполнителя + | И ИсполнителиЗадач.ОсновнойОбъектАдресации = &ОсновнойОбъектАдресации" + ); + Запрос.Параметры.Вставить("ОсновнойОбъектАдресации", ОсновнойОбъектАдресации); + Запрос.Параметры.Вставить("РольИсполнителя", РольИсполнителя); + ВыборкаЗапроса = Запрос.Выполнить().Выгрузить(); + Возврат ?(ВыборкаЗапроса.Количество() > 0, ВыборкаЗапроса[0].Исполнитель, Справочники.Пользователи.ПустаяСсылка()); + +КонецФункции + +Процедура ВыполнитьЗадачу(ЗадачаСсылка, ДействиеПоУмолчанию = Ложь) Экспорт + + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + ЭлементБлокировки.УстановитьЗначение("Ссылка", ЗадачаСсылка); + Блокировка.Заблокировать(); + + ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); + ЗадачаОбъект.Прочитать(); + Если ДействиеПоУмолчанию И ЗадачаОбъект.БизнесПроцесс <> Неопределено + И НЕ ЗадачаОбъект.БизнесПроцесс.Пустая() Тогда + ТипБизнесПроцесса = Метаданные.НайтиПоТипу(ТипЗнч(ЗадачаОбъект.БизнесПроцесс)); + БизнесПроцессы[ТипБизнесПроцесса.Имя].ОбработкаВыполненияПоУмолчанию(ЗадачаСсылка, + ЗадачаОбъект.БизнесПроцесс, ЗадачаОбъект.ТочкаМаршрута); + КонецЕсли; + + ЗадачаОбъект.Выполнена = Ложь; + ЗадачаОбъект.ВыполнитьЗадачу(); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Проверяет, находится ли в ячейке отчета ссылка на задачу и в параметре +// ЗначениеРасшифровки возвращает значение расшифровки. +// +Функция ЭтоЗадачаИсполнителю(Знач Расшифровка, Знач ДанныеРасшифровкиОтчета, ЗначениеРасшифровки) Экспорт + + ДанныеРасшифровкиОбъект = ПолучитьИзВременногоХранилища(ДанныеРасшифровкиОтчета); + ЗначениеРасшифровки = ДанныеРасшифровкиОбъект.Элементы[Расшифровка].ПолучитьПоля()[0].Значение; + Возврат ТипЗнч(ЗначениеРасшифровки) = Тип("ЗадачаСсылка.ЗадачаИсполнителя"); + +КонецФункции + +Функция ПеренаправитьЗадачи(Знач МассивЗадач, Знач ИнфоОПеренаправлении, Знач ТолькоПроверка = Ложь, + МассивПеренаправленныхЗадач = Неопределено) Экспорт + + // Перенаправление задач доступно всем, кто имеет права на их изменение. + Если ПравоДоступа("Изменение", Метаданные.Задачи.ЗадачаИсполнителя) Тогда + УстановитьПривилегированныйРежим(Истина); + КонецЕсли; + + Результат = Истина; + Для Каждого Задача Из МассивЗадач Цикл + + ЗадачаВыполнена = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Задача.Ссылка, "Выполнена"); + Если ЗадачаВыполнена Тогда + Результат = Ложь; + Если ТолькоПроверка Тогда + Прервать; + КонецЕсли; + КонецЕсли; + + Если ТолькоПроверка Тогда + Продолжить; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(МассивПеренаправленныхЗадач) Тогда + МассивПеренаправленныхЗадач = Новый Массив(); + КонецЕсли; + + ЗадачаОбъект = Задача.Ссылка.ПолучитьОбъект(); + + НоваяЗадача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу(); + НоваяЗадача.Заполнить(ЗадачаОбъект); + ЗаполнитьЗначенияСвойств(НоваяЗадача, ИнфоОПеренаправлении, + "Исполнитель,РольИсполнителя,ОсновнойОбъектАдресации,ДополнительныйОбъектАдресации"); + НоваяЗадача.Записать(); + + МассивПеренаправленныхЗадач.Добавить(НоваяЗадача.Ссылка); + + ЗадачаОбъект.РезультатВыполнения = ИнфоОПеренаправлении.Комментарий; + ЗадачаОбъект.Выполнена = Ложь; + ЗадачаОбъект.ВыполнитьЗадачу(); + + ПриПеренаправленииЗадачи(ЗадачаОбъект, НоваяЗадача); + + КонецЦикла; + Возврат Результат; + +КонецФункции + +Процедура ПриПеренаправленииЗадачи(ЗадачаОбъект, НоваяЗадачаОбъект) + + Если ЗадачаОбъект.БизнесПроцесс = Неопределено ИЛИ ЗадачаОбъект.БизнесПроцесс.Пустая() Тогда + Возврат; + КонецЕсли; + + ТипБизнесПроцесса = Метаданные.НайтиПоТипу(ТипЗнч(ЗадачаОбъект.БизнесПроцесс)); + Попытка + БизнесПроцессы[ТипБизнесПроцесса.Имя].ПриПеренаправленииЗадачи(ЗадачаОбъект.Ссылка, НоваяЗадачаОбъект.Ссылка); + Исключение + // метод не определен + КонецПопытки; + +КонецПроцедуры + +Функция ВыбратьБизнесПроцессыВедущейЗадачи(ЗадачаСсылка) + + Итерация = 1; + ТекстЗапроса = ""; + Для Каждого ТипБизнесПроцесса Из Метаданные.БизнесПроцессы Цикл + Если НЕ ПустаяСтрока(ТекстЗапроса) Тогда + ТекстЗапроса = ТекстЗапроса + " + | + |ОБЪЕДИНИТЬ + |"; + + КонецЕсли; + ФрагментЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + "ВЫБРАТЬ %3 + | %1.Ссылка КАК Ссылка + |ИЗ + | %2 КАК %1 + |ГДЕ + | %1.ВедущаяЗадача = &ВедущаяЗадача", ТипБизнесПроцесса.Имя, ТипБизнесПроцесса.ПолноеИмя(), + ?(Итерация = 1, "РАЗРЕШЕННЫЕ", "")); + ТекстЗапроса = ТекстЗапроса + ФрагментЗапроса; + Итерация = Итерация + 1; + КонецЦикла; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("ВедущаяЗадача", ЗадачаСсылка); + Результат = Запрос.Выполнить(); + Возврат Результат; + +КонецФункции + +Функция СобытиеЖурналаРегистрации() + Возврат НСтр("ru = 'Бизнес-процессы и задачи'"); +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Мониторинг и контроль исполнения + +Функция ВыгрузитьИсполнителей(ТекстЗапроса, ОсновнойОбъектАдресацииСсылка, ДопОбъектАдресацииСсылка) + + Запрос = Новый Запрос(ТекстЗапроса); + + Если ЗначениеЗаполнено(ДопОбъектАдресацииСсылка) Тогда + Запрос.УстановитьПараметр("ДОА", ДопОбъектАдресацииСсылка); + КонецЕсли; + + Если ЗначениеЗаполнено(ОсновнойОбъектАдресацииСсылка) Тогда + Запрос.УстановитьПараметр("ООА", ОсновнойОбъектАдресацииСсылка); + КонецЕсли; + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +Функция НайтиИсполнителейПоРолям(Знач Задача, Знач БазовыйТекстЗапроса) + + СписокПользователей = Новый Массив; + + ООА = Задача.ОсновнойОбъектАдресации; + ДОА = Задача.ДополнительныйОбъектАдресации; + + Если ЗначениеЗаполнено(ДОА) Тогда + ТекстЗапроса = БазовыйТекстЗапроса + " И ИсполнителиЗадач.ОсновнойОбъектАдресации = &ООА + |И ИсполнителиЗадач.ДополнительныйОбъектАдресации = &ДОА"; + ИначеЕсли ЗначениеЗаполнено(ООА) Тогда + ТекстЗапроса = БазовыйТекстЗапроса + " И ИсполнителиЗадач.ОсновнойОбъектАдресации = &ООА + |И ИсполнителиЗадач.ДополнительныйОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка)"; + Иначе + ТекстЗапроса = БазовыйТекстЗапроса + " И ИсполнителиЗадач.ОсновнойОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка) + |И ИсполнителиЗадач.ДополнительныйОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка)"; + КонецЕсли; + + ВыгрузкаИсполнителей = ВыгрузитьИсполнителей(ТекстЗапроса, ООА, ДОА); + + // Если в задаче не заполнены основной и дополнительный объекты адресации + Если Не ЗначениеЗаполнено(ДОА) И Не ЗначениеЗаполнено(ООА) Тогда + Для Каждого ЭлементВыгрузки Из ВыгрузкаИсполнителей Цикл + СписокПользователей.Добавить(ЭлементВыгрузки.Исполнитель); + КонецЦикла; + + Возврат СписокПользователей; + КонецЕсли; + + Если ВыгрузкаИсполнителей.Количество() = 0 И ЗначениеЗаполнено(ДОА) Тогда + ТекстЗапроса = БазовыйТекстЗапроса + " И ИсполнителиЗадач.ОсновнойОбъектАдресации = &ООА + |И ИсполнителиЗадач.ДополнительныйОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка)"; + ВыгрузкаИсполнителей = ВыгрузитьИсполнителей(ТекстЗапроса, ООА, Неопределено); + КонецЕсли; + + Если ВыгрузкаИсполнителей.Количество() = 0 Тогда + ТекстЗапроса = БазовыйТекстЗапроса + " И ИсполнителиЗадач.ОсновнойОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка) + |И ИсполнителиЗадач.ДополнительныйОбъектАдресации = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ОбъектыАдресацииЗадач.ПустаяСсылка)"; + ВыгрузкаИсполнителей = ВыгрузитьИсполнителей(ТекстЗапроса, Неопределено, Неопределено); + КонецЕсли; + + Для Каждого ЭлементВыгрузки Из ВыгрузкаИсполнителей Цикл + СписокПользователей.Добавить(ЭлементВыгрузки.Исполнитель); + КонецЦикла; + + Возврат СписокПользователей; + +КонецФункции + +Функция НайтиОтветственныхЗаНазначениеРолей(Знач Задача) + + БазовыйТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ ИсполнителиЗадач.Исполнитель + |ИЗ + | РегистрСведений.ИсполнителиЗадач Как ИсполнителиЗадач, Справочник.РолиИсполнителей Как РолиИсполнителей + |Где + | ИсполнителиЗадач.РольИсполнителя = РолиИсполнителей.Ссылка + |И + | РолиИсполнителей.Ссылка = ЗНАЧЕНИЕ(Справочник.РолиИсполнителей.ОтветственныйЗаКонтрольИсполнения)"; + + Ответственные = НайтиИсполнителейПоРолям(Задача, БазовыйТекстЗапроса); + Возврат Ответственные; + +КонецФункции + +Функция ВыбратьИсполнителейЗадач(Знач Задача) + + ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ + | ИсполнителиЗадач.Исполнитель КАК Исполнитель + |ИЗ + | РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач + |ГДЕ + | ИсполнителиЗадач.РольИсполнителя = &РольИсполнителя + | И ИсполнителиЗадач.ОсновнойОбъектАдресации = &ОсновнойОбъектАдресации + | И ИсполнителиЗадач.ДополнительныйОбъектАдресации = &ДополнительныйОбъектАдресации"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.Параметры.Вставить("РольИсполнителя", Задача.РольИсполнителя); + Запрос.Параметры.Вставить("ОсновнойОбъектАдресации", Задача.ОсновнойОбъектАдресации); + Запрос.Параметры.Вставить("ДополнительныйОбъектАдресации", Задача.ДополнительныйОбъектАдресации); + Исполнители = Запрос.Выполнить().Выгрузить(); + Возврат Исполнители; + +КонецФункции + +Процедура НайтиПисьмоИДобавитьТекст(Знач НаборПисемПоАдресатам, + Знач ПолучательПисьма, + Знач ПредставлениеПолучателяПисьма, + Знач ТекстПисьма, + Знач ТипПисьма) + + ПараметрыОтбора = Новый Структура("ТипПисьма, ПочтовыйАдрес", ТипПисьма, ПолучательПисьма); + СтрокаПараметрыПисьма = НаборПисемПоАдресатам.НайтиСтроки(ПараметрыОтбора); + Если СтрокаПараметрыПисьма.Количество() = 0 Тогда + СтрокаПараметрыПисьма = Неопределено; + Иначе + СтрокаПараметрыПисьма = СтрокаПараметрыПисьма[0]; + КонецЕсли; + + Если СтрокаПараметрыПисьма = Неопределено Тогда + СтрокаПараметрыПисьма = НаборПисемПоАдресатам.Добавить(); + СтрокаПараметрыПисьма.ПочтовыйАдрес = ПолучательПисьма; + СтрокаПараметрыПисьма.ТекстПисьма = ""; + СтрокаПараметрыПисьма.КоличествоЗадач = 0; + СтрокаПараметрыПисьма.ТипПисьма = ТипПисьма; + СтрокаПараметрыПисьма.Получатель = ПредставлениеПолучателяПисьма; + КонецЕсли; + + Если ЗначениеЗаполнено(СтрокаПараметрыПисьма.ТекстПисьма) Тогда + СтрокаПараметрыПисьма.ТекстПисьма = + СтрокаПараметрыПисьма.ТекстПисьма + Символы.ПС + + "------------------------------------" + Символы.ПС; + КонецЕсли; + + СтрокаПараметрыПисьма.КоличествоЗадач = СтрокаПараметрыПисьма.КоличествоЗадач + 1; + СтрокаПараметрыПисьма.ТекстПисьма = СтрокаПараметрыПисьма.ТекстПисьма + ТекстПисьма; + +КонецПроцедуры + +Функция ВыбратьПросроченныеЗадачи() + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ЗадачаИсполнителя.Ссылка КАК Ссылка, + | ЗадачаИсполнителя.СрокИсполнения КАК СрокИсполнения, + | ЗадачаИсполнителя.Исполнитель КАК Исполнитель, + | ЗадачаИсполнителя.РольИсполнителя КАК РольИсполнителя, + | ЗадачаИсполнителя.ОсновнойОбъектАдресации КАК ОсновнойОбъектАдресации, + | ЗадачаИсполнителя.ДополнительныйОбъектАдресации КАК ДополнительныйОбъектАдресации, + | ЗадачаИсполнителя.Автор КАК Автор, + | ЗадачаИсполнителя.Описание КАК Описание + |ИЗ + | Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя + |ГДЕ + | ЗадачаИсполнителя.ПометкаУдаления = ЛОЖЬ + | И ЗадачаИсполнителя.Выполнена = ЛОЖЬ + | И ЗадачаИсполнителя.СрокИсполнения <= &Дата"; + + СрокИсполнения = КонецДня(ТекущаяДата()); + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Дата", СрокИсполнения); + + ПросроченныеЗадачи = Запрос.Выполнить().Выгрузить(); + Возврат ПросроченныеЗадачи; + +КонецФункции + +Функция СоздатьЗадачуПоНастройкеРолей(ЗадачаСсылка, Ответственные) + + Для Каждого Ответственный Из Ответственные Цикл + ЗадачаОбъект = Задачи.ЗадачаИсполнителя.СоздатьЗадачу(); + ЗадачаОбъект.Дата = ТекущаяДата(); + ЗадачаОбъект.Важность = Перечисления.ВариантыВажностиЗадачи.Высокая; + ЗадачаОбъект.Исполнитель = Ответственный; + + ЗадачаОбъект.Описание = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Задача не может быть исполнена, так как у роли не задано ни одного исполнителя: + |%1'"), Строка(ЗадачаСсылка)); + + ЗадачаОбъект.Наименование = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Назначить исполнителей: задача не может быть исполнена %1'"), Строка(ЗадачаСсылка)); + + ЗадачаОбъект.Записать(); + КонецЦикла; + +КонецФункции + +Функция ВыбратьНовыеЗадачиПоИсполнителям(Знач ДатаПоследнегоУведомления) + + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ЗадачаИсполнителя.Ссылка КАК Ссылка, + | ЗадачаИсполнителя.Номер КАК Номер, + | ЗадачаИсполнителя.Дата КАК Дата, + | ЗадачаИсполнителя.Наименование КАК Наименование, + | ЗадачаИсполнителя.СрокИсполнения КАК СрокИсполнения, + | ЗадачаИсполнителя.Автор КАК Автор, + | ЗадачаИсполнителя.Описание КАК Описание, + | ВЫБОР + | КОГДА ЗадачаИсполнителя.Исполнитель ЕСТЬ НЕ NULL И ЗадачаИсполнителя.Исполнитель <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | ТОГДА ЗадачаИсполнителя.Исполнитель + | ИНАЧЕ + | ИсполнителиЗадач.Исполнитель + | КОНЕЦ Исполнитель, + | ЗадачаИсполнителя.РольИсполнителя КАК РольИсполнителя, + | ЗадачаИсполнителя.ОсновнойОбъектАдресации КАК ОсновнойОбъектАдресации, + | ЗадачаИсполнителя.ДополнительныйОбъектАдресации КАК ДополнительныйОбъектАдресации + |ИЗ + | Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач + | ПО ЗадачаИсполнителя.РольИсполнителя = ИсполнителиЗадач.РольИсполнителя + | И ЗадачаИсполнителя.ОсновнойОбъектАдресации = ИсполнителиЗадач.ОсновнойОбъектАдресации + | И ЗадачаИсполнителя.ДополнительныйОбъектАдресации = ИсполнителиЗадач.ДополнительныйОбъектАдресации + |ГДЕ + | ЗадачаИсполнителя.ПометкаУдаления = ЛОЖЬ + | И ЗадачаИсполнителя.Дата > &ДатаПоследнегоУведомления + | И ((ЗадачаИсполнителя.Исполнитель ЕСТЬ НЕ NULL И ЗадачаИсполнителя.Исполнитель <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)) ИЛИ + | (ИсполнителиЗадач.Исполнитель ЕСТЬ НЕ NULL И ИсполнителиЗадач.Исполнитель <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка))) + | И ЗадачаИсполнителя.Выполнена = ЛОЖЬ + | + |УПОРЯДОЧИТЬ ПО + | Исполнитель, + | СрокИсполнения УБЫВ"); + Запрос.Параметры.Вставить("ДатаПоследнегоУведомления", ДатаПоследнегоУведомления); + ТаблицаРезультатов = Запрос.Выполнить().Выгрузить(); + + ПостроительЗапроса = Новый ПостроительЗапроса(); + Источник = Новый ОписаниеИсточникаДанных(ТаблицаРезультатов); + Источник.Колонки.Исполнитель.Измерение = Истина; + ПостроительЗапроса.ИсточникДанных = Источник; + ПостроительЗапроса.Измерения.Добавить("Исполнитель"); + ПостроительЗапроса.Выполнить(); + Результат = ПостроительЗапроса.Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); + + Возврат Результат; + +КонецФункции + +Процедура ОтправитьУведомлениеОНовыхЗадачах(Исполнитель, ЗадачиПоИсполнителю) + + ПараметрыПисьма = Новый Структура; + + ПараметрыПисьма.Вставить("Тема", + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Вам направлены задачи - %1'"), Метаданные.КраткаяИнформация)); + + ТекстПисьма = ""; + + Для Каждого СтрокаЗадача Из ЗадачиПоИсполнителю.Строки Цикл + Для Каждого Задача Из СтрокаЗадача.Строки Цикл + ТекстПисьма = ТекстПисьма + СформироватьПредставлениеЗадачи(Задача); + КонецЦикла; + КонецЦикла; + + ПараметрыПисьма.Вставить("Тело", ТекстПисьма); + ПочтовыйАдресПолучателя = БизнесПроцессыИЗадачиПереопределяемый.ПолучитьАдресЭлектроннойПочты(Исполнитель); + Если ПустаяСтрока(ПочтовыйАдресПолучателя) Тогда + ЗаписьЖурналаРегистрации(НСтр("ru = 'Бизнес-процессы и задачи.Уведомление о новых задачах'"), + УровеньЖурналаРегистрации.Информация,,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Уведомление не отправлено, так как не указан почтовый адрес у пользователя %1.'"), Строка(Исполнитель))); + Возврат; + КонецЕсли; + ПараметрыПисьма.Вставить("Кому", ПочтовыйАдресПолучателя); + + Попытка + РаботаСПочтовымиСообщениями.ОтправитьСообщение( + РаботаСПочтовымиСообщениями.ПолучитьСистемнуюУчетнуюЗапись(), ПараметрыПисьма); + + ЗаписьЖурналаРегистрации(НСтр("ru = 'Бизнес-процессы и задачи.Уведомление о новых задачах'"), + УровеньЖурналаРегистрации.Информация,,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Уведомления успешно отправлены на адрес %1.'", ПочтовыйАдресПолучателя))); + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Бизнес-процессы и задачи.Уведомление о новых задачах'"), + УровеньЖурналаРегистрации.Ошибка,,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при отправке уведомления о новых задачах: %1'"), + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + КонецПопытки; + +КонецПроцедуры + +Функция СформироватьПредставлениеЗадачи(ЗадачаСтруктура) + + ШаблонСтроки = + НСтр("ru = '%1 + | + |Крайний срок: %2'") + Символы.ПС; + Если ЗначениеЗаполнено(ЗадачаСтруктура.Исполнитель) Тогда + ШаблонСтроки = ШаблонСтроки + НСтр("ru = 'Исполнитель: %3'") + Символы.ПС; + КонецЕсли; + Если ЗначениеЗаполнено(ЗадачаСтруктура.РольИсполнителя) Тогда + ШаблонСтроки = ШаблонСтроки + НСтр("ru = 'Роль: %4'") + Символы.ПС; + КонецЕсли; + Если ЗначениеЗаполнено(ЗадачаСтруктура.ОсновнойОбъектАдресации) Тогда + ШаблонСтроки = ШаблонСтроки + НСтр("ru = 'Основной объект адресации: %5'") + Символы.ПС; + КонецЕсли; + Если ЗначениеЗаполнено(ЗадачаСтруктура.ДополнительныйОбъектАдресации) Тогда + ШаблонСтроки = ШаблонСтроки + НСтр("ru = 'Доп. объект адресации: %6'") + Символы.ПС; + КонецЕсли; + Если ЗначениеЗаполнено(ЗадачаСтруктура.Автор) Тогда + ШаблонСтроки = ШаблонСтроки + НСтр("ru = 'Автор: %7'") + Символы.ПС; + КонецЕсли; + Если ЗначениеЗаполнено(ЗадачаСтруктура.Описание) Тогда + ШаблонСтроки = ШаблонСтроки + Символы.ПС + НСтр("ru = '%8'") + Символы.ПС; + КонецЕсли; + ШаблонСтроки = ШаблонСтроки + Символы.ПС; + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСтроки, + ЗадачаСтруктура.Ссылка, + Формат(ЗадачаСтруктура.СрокИсполнения, "ДЛФ=DD; ДП='не указан'"), ЗадачаСтруктура.Исполнитель, + ЗадачаСтруктура.РольИсполнителя, ЗадачаСтруктура.ОсновнойОбъектАдресации, + ЗадачаСтруктура.ДополнительныйОбъектАдресации, ЗадачаСтруктура.Автор, + ЗадачаСтруктура.Описание); + +КонецФункции + +Функция ПометитьНаУдалениеБизнесПроцессы(ВыделенныеСтроки) Экспорт + Количество = 0; + Для Каждого СтрокаТаблицы Из ВыделенныеСтроки Цикл + БизнесПроцессСсылка = СтрокаТаблицы.БизнесПроцесс; + Если БизнесПроцессСсылка = Неопределено ИЛИ БизнесПроцессСсылка.Пустая() Тогда + Продолжить; + КонецЕсли; + БизнесПроцессОбъект = БизнесПроцессСсылка.ПолучитьОбъект(); + БизнесПроцессОбъект.УстановитьПометкуУдаления(НЕ БизнесПроцессОбъект.ПометкаУдаления); + Количество = Количество + 1; + КонецЦикла; + Возврат ?(Количество = 1, ВыделенныеСтроки[0].БизнесПроцесс, Неопределено); +КонецФункции diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/БизнесПроцессыИЗадачиСервер.mdo b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/БизнесПроцессыИЗадачиСервер.mdo new file mode 100644 index 000000000..60b65ff07 --- /dev/null +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/БизнесПроцессыИЗадачиСервер.mdo @@ -0,0 +1,10 @@ + + + БизнесПроцессыИЗадачиСервер + + ru + Бизнес процессы и задачи сервер + + true + true + diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСобытия/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСобытия/Module.bsl new file mode 100644 index 000000000..d75cd8184 --- /dev/null +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСобытия/Module.bsl @@ -0,0 +1,36 @@ + +Процедура ЗаписатьВСписокБизнесПроцессов(Источник, Отказ) Экспорт + + Если Источник.ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + НаборЗаписей = РегистрыСведений.СписокБизнесПроцессов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.БизнесПроцесс.Значение = Источник.Ссылка; + НаборЗаписей.Отбор.БизнесПроцесс.Использование = Истина; + Запись = НаборЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(Запись, Источник, + "Номер,Дата,Завершен,Стартован,Автор,ДатаЗавершения,Наименование,ПометкаУдаления"); + Запись.БизнесПроцесс = Источник.Ссылка; + + БизнесПроцессыИЗадачиПереопределяемый.ПриЗаписиСпискаБизнесПроцессов(Запись); + + УстановитьПривилегированныйРежим(Истина); + НаборЗаписей.Записать(); + +КонецПроцедуры + +Процедура УстановитьПометкуУдаленияЗадач(Источник, Отказ) Экспорт + + Если Источник.ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + ПредыдущаяПометкаУдаления = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Источник.Ссылка, "ПометкаУдаления"); + Если Источник.ПометкаУдаления <> ПредыдущаяПометкаУдаления Тогда + УстановитьПривилегированныйРежим(Истина); + БизнесПроцессыИЗадачиСервер.УстановитьПометкуУдаленияЗадач(Источник.Ссылка, Источник.ПометкаУдаления); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСобытия/БизнесПроцессыИЗадачиСобытия.mdo b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСобытия/БизнесПроцессыИЗадачиСобытия.mdo new file mode 100644 index 000000000..f60e6ad4f --- /dev/null +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСобытия/БизнесПроцессыИЗадачиСобытия.mdo @@ -0,0 +1,13 @@ + + + БизнесПроцессыИЗадачиСобытия + + ru + Бизнес процессы и задачи события + + Обработчики подписок на события + true + true + true + true + diff --git a/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl new file mode 100644 index 000000000..5c35af4a2 --- /dev/null +++ b/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl @@ -0,0 +1,799 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// МОДУЛЬ СОДЕРЖИТ СЕРВЕРНЫЕ ПРОЦЕДУРЫ ПОДСИСТЕМЫ «ВАРИАНТЫ ОТЧЕТОВ» + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ОБНОВЛЕНИЯ ИНФОРМАЦИОННОЙ БАЗЫ + +// Процедура обновляет вариантов отчетов при обновление ИБ и заполнение пустой ИБ +// Параметры: +// ИзмененныеОбъектыДанных - соответствие ключ - старое имя отчета, значение - новое имя отчета +// +// Пример кода создания параметра процедуры: +// СоответствиеИзмененияОбъектов = Новый Соответствие; +// СоответствиеИзмененияОбъектов.Вставить("ВедомостьПоТоварамНаСкладах", "ВедомостьПоТоварамНаСкладахВЦенахНоменклатуры"); + +Функция ОбработкаПредопределенныхВариантов(ИзмененныеОбъектыДанных = Неопределено) Экспорт + + // обновить название отчетов и ключи объектов + + НачатьТранзакцию(); + Попытка + БылиОшибки = ложь; + + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетов.Ссылка, + | ВариантыОтчетов.КлючОбъекта, + | ВариантыОтчетов.ПредставлениеОбъекта + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов"; + + Запрос = Новый Запрос(ТЗ); + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + ИмяОтчета = Выборка.КлючОбъекта; + + Если ИзмененныеОбъектыДанных <> Неопределено тогда + ИзменИмяОтчета = ИзмененныеОбъектыДанных[ИмяОтчета]; + Если ИзменИмяОтчета <> Неопределено тогда + ИмяОтчета = ИзменИмяОтчета; + КонецЕсли; + КонецЕсли; + + ИмяОтчета = СтрЗаменить(ИмяОтчета, "Отчет.", ""); + ОтчетМетаданные = Метаданные.Отчеты.Найти(ИмяОтчета); + Если ОтчетМетаданные = Неопределено тогда + ОбъектВариантаОтчета = Выборка.Ссылка.ПолучитьОбъект(); + ОбъектВариантаОтчета.ПометкаУдаления = истина; + ОбъектВариантаОтчета.Записать(); + Иначе + Если Выборка.ПредставлениеОбъекта <> ОтчетМетаданные.Синоним или Выборка.КлючОбъекта <> "Отчет." + ОтчетМетаданные.Имя тогда + ОбъектВариантаОтчета = Выборка.Ссылка.ПолучитьОбъект(); + ОбъектВариантаОтчета.КлючОбъекта = "Отчет." + ОтчетМетаданные.Имя; + ОбъектВариантаОтчета.ПредставлениеОбъекта = ОтчетМетаданные.Синоним; + ОбъектВариантаОтчета.ПометкаУдаления = ложь; + ОбъектВариантаОтчета.Записать(); + КонецЕсли; + КонецЕсли; + КонецЦИкла; + + //Обновим варианты + + СписокОшибокПриОбновлении = Новый Массив; + + СписокКлючейПредопределенныхВариантов = Новый СписокЗначений; + ОтчетыБезСКД = Новый Массив; + + СписокОтчетов = ВариантыОтчетовПереопределяемый.СписокОтчетовПоддерживаемыхПодсистемой(); + СоответсвиеОтчетаПодсистемам = ВариантыОтчетов.ПолучитьСписокПодсистемОтчетов(); + + ДанныеОПодсистемахВариантов = Новый Структура("СоответствиеПодсистемИВариантов, НеИспользоватьПодсистемуОтчета"); + ДанныеОПодсистемахВариантов.СоответствиеПодсистемИВариантов = Новый ТаблицаЗначений; + ДанныеОПодсистемахВариантов.СоответствиеПодсистемИВариантов.Колонки.Добавить("Ключ"); + ДанныеОПодсистемахВариантов.СоответствиеПодсистемИВариантов.Колонки.Добавить("ПутьКПодсистеме"); + + ДанныеОПодсистемахВариантов.НеИспользоватьПодсистемуОтчета = Новый ТаблицаЗначений; + ДанныеОПодсистемахВариантов.НеИспользоватьПодсистемуОтчета.Колонки.Добавить("Ключ"); + ДанныеОПодсистемахВариантов.НеИспользоватьПодсистемуОтчета.Колонки.Добавить("ПутьКПодсистеме"); + + ОписаниеВариантов = Новый Соответствие; + ЗначениеНастроекДопВариантов = Новый Соответствие; + СписокДопВариантов = Новый СписокЗначений; + + Для каждого Отчет из Метаданные.Отчеты Цикл + + ПолноеИмяОтчета = Отчет.ПолноеИмя(); + + Если СписокОтчетов.НайтиПоЗначению(ПолноеИмяОтчета) = Неопределено тогда + Продолжить; + КонецЕсли; + + Если Отчет.ОсновнаяСхемаКомпоновкиДанных <> Неопределено тогда + Макет = Отчет.ОсновнаяСхемаКомпоновкиДанных.Имя; + СКД = Отчеты[Отчет.Имя].ПолучитьМакет(Макет); + Для каждого Вариант из СКД.ВариантыНастроек Цикл + СписокКлючейПредопределенныхВариантов.Добавить(Отчет.ПолноеИмя() + "\" + Вариант.Имя, Вариант.Представление); + КонецЦикла; + Иначе + СписокКлючейПредопределенныхВариантов.Добавить(ПолноеИмяОтчета + "\_СсылкаНаОтчет", Отчет.Синоним); + ОтчетыБезСКД.Добавить(ПолноеИмяОтчета); + КонецЕсли; + + ДобавитьВДопНастройки(ПолноеИмяОтчета, ОписаниеВариантов, ДанныеОПодсистемахВариантов, СписокДопВариантов, ЗначениеНастроекДопВариантов); + + КонецЦикла; + + Для каждого Вариант из СписокДопВариантов Цикл + + НомерСимвола = Найти(Вариант.Значение, "\"); + ПолноеИмяОтчета = Лев(Вариант.Значение, НомерСимвола-1); + + СписокКлючейПредопределенныхВариантов.Добавить(Вариант.Значение, Вариант.Представление); + + КонецЦикла; + + // получил три списка вариантов в справочнике отчетов. + + ВариантыДляОбновления = Новый СписокЗначений; + НовыеВариантыДляДобавления = Новый СписокЗначений; + ВариантыНеИспользуемые = Новый Массив; + + Для каждого Вариант из СписокКлючейПредопределенныхВариантов Цикл + НовыеВариантыДляДобавления.Добавить(Вариант.Значение, Вариант.Представление); + КонецЦикла; + + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетов.Ссылка, + | ВариантыОтчетов.КлючОбъекта + ""\"" + ВариантыОтчетов.КлючВарианта КАК КлючОбъекта, + | ВариантыОтчетов.ТипВариантаОтчета + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов + |ГДЕ + | (ВариантыОтчетов.ТипВариантаОтчета = ЗНАЧЕНИЕ(Перечисление.ТипыВариантовОтчетов.Предопределенный) + | ИЛИ ВариантыОтчетов.ТипВариантаОтчета = ЗНАЧЕНИЕ(Перечисление.ТипыВариантовОтчетов.Отчет))"; + + Запрос = Новый Запрос(ТЗ); + УстановитьПривилегированныйРежим(истина); + Выборка = Запрос.Выполнить().Выбрать(); + УстановитьПривилегированныйРежим(ложь); + + Пока Выборка.Следующий() Цикл + + Если Выборка.ТипВариантаОтчета = Перечисления.ТипыВариантовОтчетов.Предопределенный тогда + ЭлементСписка = СписокКлючейПредопределенныхВариантов.НайтиПоЗначению(Выборка.КлючОбъекта); + Иначе + ЭлементСписка = СписокКлючейПредопределенныхВариантов.НайтиПоЗначению(Выборка.КлючОбъекта+"_СсылкаНаОтчет"); + КонецЕсли; + + Если ЭлементСписка = Неопределено тогда + ВариантыНеИспользуемые.Добавить(Выборка.Ссылка); + Иначе + ВариантыДляОбновления.Добавить(Выборка.Ссылка, ЭлементСписка.Представление); + Если Выборка.ТипВариантаОтчета = Перечисления.ТипыВариантовОтчетов.Предопределенный тогда + ИсключаемыйВариант = НовыеВариантыДляДобавления.НайтиПоЗначению(Выборка.КлючОбъекта); + Иначе + ИсключаемыйВариант = НовыеВариантыДляДобавления.НайтиПоЗначению(Выборка.КлючОбъекта+"_СсылкаНаОтчет"); + КонецЕсли; + + НовыеВариантыДляДобавления.Удалить(ИсключаемыйВариант); + КонецЕсли; + КонецЦикла; + + // обновляем существующие варианты + + Для каждого Вариант из ВариантыДляОбновления Цикл + + ВариантОбъект = Вариант.Значение.Ссылка.Получитьобъект(); + + ВариантОбъект.Наименование = Вариант.Представление; + ВариантОбъект.Описание = ОписаниеВариантов[ВариантОбъект.КлючОбъекта + "\" + ВариантОбъект.КлючВарианта]; + ВариантОбъект.Видимость = истина; + ВариантОбъект.ПометкаУдаления = ложь; + + //удалим ссылки на подсистемы + МассивПредопределенныхПодсистем = ВариантОбъект.Подсистемы.НайтиСтроки(Новый Структура("Предопределенная", истина)); + Для каждого Подсистема из МассивПредопределенныхПодсистем Цикл + ВариантОбъект.Подсистемы.Удалить(Подсистема); + КонецЦикла; + + // добавим подсистемы отчета + МассивПодсистем = СоответсвиеОтчетаПодсистемам.НайтиСтроки(Новый Структура("Отчет", ВариантОбъект.КлючОбъекта)); + + Для каждого Подсистема из МассивПодсистем Цикл + + СтруктураПоиска = Новый Структура("Ключ, ПутьКПодсистеме", ВариантОбъект.КлючОбъекта + "\" + ВариантОбъект.КлючВарианта, Подсистема.ПутьКПодсистеме); + НеИспользоватьПодсистемуОтчета = ДанныеОПодсистемахВариантов.НеИспользоватьПодсистемуОтчета.НайтиСтроки(СтруктураПоиска); + + Если НеИспользоватьПодсистемуОтчета.Количество() = 0 тогда + СтрокаПодсистемы = ВариантОбъект.Подсистемы.Добавить(); + СтрокаПодсистемы.Подсистема = Подсистема.ПутьКПодсистеме; + СтрокаПодсистемы.Название = Подсистема.НазваниеПодсистемы; + СтрокаПодсистемы.Предопределенная = Истина; + КонецЕсли; + КонецЦикла; + + // добавим подсистемы варианта + МассивПодсистем = ДанныеОПодсистемахВариантов.СоответствиеПодсистемИВариантов.НайтиСтроки(Новый Структура("Ключ", ВариантОбъект.КлючОбъекта + "\" + ВариантОбъект.КлючВарианта)); + + Для каждого Подсистема из МассивПодсистем Цикл + + ПодсистемаМетаДанные = Метаданные.НайтиПоПолномуИмени("Подсистема." + СтрЗаменить(Подсистема.ПутьКПодсистеме, "\", ".Подсистема.")); + НазваниеПодсистемы = ""; + Если ПодсистемаМетаДанные <> Неопределено тогда + НазваниеПодсистемы = ПодсистемаМетаДанные.Представление(); + КонецЕсли; + СтрокаПодсистемы = ВариантОбъект.Подсистемы.Добавить(); + СтрокаПодсистемы.Подсистема = Подсистема.ПутьКПодсистеме; + СтрокаПодсистемы.Название = НазваниеПодсистемы; + + //Метаданные.Подсистемы.Маркетинг.Подсистемы.КонкурентнаяРазведка.ПолноеИмя() + СтрокаПодсистемы.Предопределенная = Истина; + КонецЦикла; + + ВариантОбъект.ПометкаУдаления = Ложь; + + Если СписокДопВариантов.НайтиПоЗначению(ВариантОбъект.КлючОбъекта) <> Неопределено тогда + ВариантОбъект.ХранилищеЗначений = ЗначениеНастроекДопВариантов[ВариантОбъект.КлючОбъекта]; + КонецЕсли; + + ВариантОбъект.Записать(); + + КонецЦикла; + + Администратор = ВариантыОтчетов.ТекущийПользователь(); + + // добавить новые варианты + Для каждого Вариант из НовыеВариантыДляДобавления Цикл + + ВариантОбъект = Справочники.ВариантыОтчетов.СоздатьЭлемент(); + + Если Найти(Вариант.Значение, "_СсылкаНаОтчет") = 0 тогда + ВариантОбъект.ТипВариантаОтчета = Перечисления.ТипыВариантовОтчетов.Предопределенный; + НомерПозиции = Найти(Вариант.Значение, "\"); + КлючОбъекта = Лев(Вариант.Значение, НомерПозиции-1); + КлючВарианта = СтрЗаменить(Вариант.Значение, КлючОбъекта + "\" , ""); + Иначе + ВариантОбъект.ТипВариантаОтчета = Перечисления.ТипыВариантовОтчетов.Отчет; + КлючОбъекта = СтрЗаменить(Вариант.Значение, "\_СсылкаНаОтчет", ""); + КлючВарианта = ""; + КонецЕсли; + + ИмяОтчета = КлючОбъекта; + + Если ИзмененныеОбъектыДанных <> Неопределено тогда + ИзменИмяОтчета = ИзмененныеОбъектыДанных[ИмяОтчета]; + Если ИзменИмяОтчета <> Неопределено тогда + ИмяОтчета = ИзменИмяОтчета; + КонецЕсли; + КонецЕсли; + + ИмяОтчета = СтрЗаменить(ИмяОтчета, "Отчет.", ""); + ОтчетМетаданные = Метаданные.Отчеты.Найти(ИмяОтчета); + Если ОтчетМетаданные <> Неопределено тогда + ВариантОбъект.ПредставлениеОбъекта = ОтчетМетаданные.Синоним; + КонецЕсли; + + ВариантОбъект.КлючОбъекта = КлючОбъекта; + ВариантОбъект.КлючВарианта = КлючВарианта; + ВариантОбъект.Наименование = Вариант.Представление; + ВариантОбъект.Описание = ОписаниеВариантов[Вариант.Значение]; + ВариантОбъект.Видимость = истина; + + МассивПодсистем = СоответсвиеОтчетаПодсистемам.НайтиСтроки(Новый Структура("Отчет", ВариантОбъект.КлючОбъекта)); + + Для каждого Подсистема из МассивПодсистем Цикл + + СтруктураПоиска = Новый Структура("Ключ, ПутьКПодсистеме", ВариантОбъект.КлючОбъекта + "\" + ВариантОбъект.КлючВарианта, Подсистема.ПутьКПодсистеме); + НеИспользоватьПодсистемуОтчета = ДанныеОПодсистемахВариантов.НеИспользоватьПодсистемуОтчета.НайтиСтроки(СтруктураПоиска); + + Если НеИспользоватьПодсистемуОтчета.Количество() = 0 тогда + СтрокаПодсистемы = ВариантОбъект.Подсистемы.Добавить(); + СтрокаПодсистемы.Подсистема = Подсистема.ПутьКПодсистеме; + СтрокаПодсистемы.Название = Подсистема.НазваниеПодсистемы; + СтрокаПодсистемы.Предопределенная = Истина; + КонецЕсли; + КонецЦикла; + + // добавим подсистемы варианта + МассивПодсистем = ДанныеОПодсистемахВариантов.СоответствиеПодсистемИВариантов.НайтиСтроки(Новый Структура("Ключ", ВариантОбъект.КлючОбъекта + "\" + ВариантОбъект.КлючВарианта)); + + Для каждого Подсистема из МассивПодсистем Цикл + СтрокаПодсистемы = ВариантОбъект.Подсистемы.Добавить(); + СтрокаПодсистемы.Подсистема = Подсистема.ПутьКПодсистеме; + СтрокаПодсистемы.Название = СоответсвиеОтчетаПодсистемам[Подсистема.ПутьКПодсистеме].НазваниеПодсистемы; + СтрокаПодсистемы.Предопределенная = Истина; + КонецЦикла; + + ВариантОбъект.Администратор = Администратор; + + Если СписокДопВариантов.НайтиПоЗначению(ВариантОбъект.КлючОбъекта) <> Неопределено тогда + ВариантОбъект.ХранилищеЗначений = ЗначениеНастроекДопВариантов.Получить(ВариантОбъект.КлючОбъекта + "\" + ВариантОбъект.КлючВарианта); + КонецЕсли; + + ВариантОбъект.Записать(); + + КонецЦикла; + + // добавить новые варианты + Для каждого Вариант из ВариантыНеИспользуемые Цикл + ВариантОбъект = Вариант.Получитьобъект(); + ВариантОбъект.УстановитьПометкуУдаления(истина); + КонецЦикла; + ЗафиксироватьТранзакцию(); + Исключение + ОписаниеОшибки = ИнформацияОбОшибке(); + ЗаписьЖурналаРегистрации(НСТр("ru = 'Обновление вариантов отчетов'"), УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки.Описание); + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Возврат истина; +КонецФункции + +////////////////////////////////////////////////////////////////// +// РАБОТА С ДОПОЛНИТЕЛЬНЫМИ НАСТРОЙКАМИ + +// Процедура добавляет вариант отчета в подсистему. Использовать эту процедуру нужно в функции +// общего модуля ВариантыОтчетовПереопределяемый отчета КомандныйИнтерфейс +// Параметры: +// ДопНастройки - параметр настройки процедуры НастройкиОтчетов +// Ключ - общий ключ варианта отчета "Отчет.Взаиморасчеты\Основной" +// ПутьКПодсистеме - Путь к подсистеме, к которой вариант привязывается +// +// Пример кода: +// +// Функция КомандныйИнтерфейс() Экспорт +// ДанныеОПодсистемахВариантов = ВариантыОтчетов.НоваяСтруктураКомандногоИнтерфейса(); +// ВариантыОтчетов.ДобавитьПодсистемуВариантаВДопНастройках(Настройки, "Отчет.ДинамикаИзмененийФайлов\СводнаяДиаграммаИзменения", "Администрирование"); +// Возврат ДанныеОПодсистемахВариантов; +// КонецФункции +// +Процедура ДобавитьПодсистемуВариантаВДопНастройках(ДопНастройки, Ключ, ПутьКПодсистеме) Экспорт + + Если ДопНастройки = Неопределено или Ключ = "" или ПутьКПодсистеме = "" тогда + Возврат; + КонецЕсли; + + СтрокаПодсистемы = ДопНастройки.СоответствиеПодсистемИВариантов.Добавить(); + СтрокаПодсистемы.Ключ = Ключ; + СтрокаПодсистемы.ПутьКПодсистеме = ПутьКПодсистеме; + +Конецпроцедуры + +// Процедура удаляет вариант отчета из подсистемы. Использовать эту процедуру нужно в процедуре +// менеджера отчета НастройкиОтчета. +// Параметры: +// ДопНастройки - параметр настройки процедуры НастройкиОтчетов +// Ключ - общий ключ варианта отчета "Отчет.Взаиморасчеты\Основной" +// ПутьКПодсистеме - Путь к подсистеме, к которой вариант привязывается +// +// Пример кода: +// +// Процедура НастройкиОтчета(Настройки) Экспорт +// ВариантыОтчетов.ДобавитьПодсистемуВариантаВДопНастройках(Настройки, "Отчет.ДинамикаИзмененийФайлов\СводнаяДиаграммаИзменения", "Администрирование"); +// КонецПроцедуры +// +Процедура УдалитьПодсистемуВариантаВДопНастройках(ДопНастройки, Ключ, ПутьКПодсистеме) Экспорт + + Если ДопНастройки = Неопределено или Ключ = "" или ПутьКПодсистеме = "" тогда + Возврат; + КонецЕсли; + + СтрокаНеИспПодсистем = ДопНастройки.НеИспользоватьПодсистемыОтчета.Добавить(); + СтрокаНеИспПодсистем.Ключ = Ключ; + СтрокаНеИспПодсистем.ПутьКПодсистеме = ПутьКПодсистеме; + +КонецПроцедуры + +// Процедура используется для добавления вариантов отчетов в отчеты не на СКД. Использовать эту процедуру нужно в процедуре +// менеджера отчета НастройкиОтчета. +// Параметры: +// ДопНастройки - параметр настройки процедуры НастройкиОтчетов +// Ключ - общий ключ варианта отчета "Отчет.Взаиморасчеты\Основной" +// Представление - Представление варианта отчета +// ЗначениеНастройки - Путь к подсистеме, к которой вариант привязывается +// +// Пример кода: +// +// Процедура НастройкиОтчета(Настройки) Экспорт +// ВариантыОтчетов.ДобавитьПредопределенныйВариантВДопНастройках(Настройки, "Отчет.ОСВ\ПОСчету50", "Кассовые операции", Новый Структура("Счет", 50); +// КонецПроцедуры +// +Процедура ДобавитьПредопределенныйВариантВДопНастройках(ДопНастройки, Ключ, Представление, ЗначениеНастройки) Экспорт + + Если ДопНастройки = Неопределено или Ключ = "" или Представление = "" тогда + Возврат; + КонецЕсли; + + ДопНастройки.ПредопределенныеВариантыБезСКД.Добавить(Ключ, Представление); + ДопНастройки.ЗначенияНастроекОтчетовБезСКД.Вставить(Ключ, ЗначениеНастройки); + +КонецПроцедуры + +// Процедура используется для установки описания варианта отчета. Использовать эту процедуру нужно в процедуре +// менеджера отчета НастройкиОтчета. +// Параметры: +// ДопНастройки - параметр настройки процедуры НастройкиОтчетов +// Ключ - общий ключ варианта отчета "Отчет.Взаиморасчеты\Основной" +// Описание - описание варианта отчета +// +// Пример кода: +// +// Процедура НастройкиОтчета(Настройки) Экспорт +// ВариантыОтчетов.УстановитьОписаниеВариантаВДопНастройках(Настройки, "Отчет.ОСВ\ПОСчету50", "Кассовые операции за текущий месяц"); +// КонецПроцедуры +// +Процедура УстановитьОписаниеВариантаВДопНастройках(ДопНастройки, Ключ, Описание) Экспорт + + ДопНастройки.ОписаниеВариантов.Вставить(Ключ, Описание); + +КонецПроцедуры + + +// Функция возвращает структуру данных для переопределения командного интерфейса +// +Функция НоваяСтруктураКомандногоИнтерфейса() Экспорт + + ДанныеОПодсистемахВариантов = Новый Структура("СоответствиеПодсистемИВариантов, НеИспользоватьПодсистемыОтчета"); + ДанныеОПодсистемахВариантов.СоответствиеПодсистемИВариантов = Новый ТаблицаЗначений; + ДанныеОПодсистемахВариантов.СоответствиеПодсистемИВариантов.Колонки.Добавить("Ключ"); + ДанныеОПодсистемахВариантов.СоответствиеПодсистемИВариантов.Колонки.Добавить("ПутьКПодсистеме"); + + ДанныеОПодсистемахВариантов.НеИспользоватьПодсистемыОтчета = Новый ТаблицаЗначений; + ДанныеОПодсистемахВариантов.НеИспользоватьПодсистемыОтчета.Колонки.Добавить("Ключ"); + ДанныеОПодсистемахВариантов.НеИспользоватьПодсистемыОтчета.Колонки.Добавить("ПутьКПодсистеме"); + + Возврат ДанныеОПодсистемахВариантов; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// ВНУТРЕННИЕ ПРОЦЕДУРЫ ПОДСИСТЕМЫ + +// Функция возвращает список значений подсистем отчетов. Функция используется во внутренних целях подсистемы. +// +Функция ПолучитьСписокПодсистемОтчетов() Экспорт + + СоответствиеПодсистемОтчетам = Новый ТаблицаЗначений; + СоответствиеПодсистемОтчетам.Колонки.Добавить("Отчет"); + СоответствиеПодсистемОтчетам.Колонки.Добавить("ПутьКПодсистеме"); + СоответствиеПодсистемОтчетам.Колонки.Добавить("НазваниеПодсистемы"); + СоответствиеПодсистемОтчетам.Колонки.Добавить("Пояснение"); + + Для каждого Подсистема из Метаданные.Подсистемы Цикл + Если Не Подсистема.ВключатьВКомандныйИнтерфейс тогда + Продолжить; + КонецЕсли; + Путь = Подсистема.Имя; + ДобавитьОтчетыПодсистемы(Подсистема, СоответствиеПодсистемОтчетам, Путь); + КонецЦикла; + + Возврат СоответствиеПодсистемОтчетам; + +КонецФункции + +// Функция возвращает список виртуальных подсистем. Функция используется во внутренних целях подсистемы. +// +Функция ПолучитьВиртуальныеПодсистемы(ПутьПодсистемы) Экспорт + + ПодсистемыВиртуальные = Новый СписокЗначений; + + ПутиИПодсистем = ПолучитьПутьВиртуальныхПодсистем(); + + Для каждого ЗначениеПути из ПутиИПодсистем Цикл + + Если ЗначениеПути.Значение.ПутьПодсистемы = ПутьПодсистемы тогда + ПодсистемыВиртуальные.Добавить(ЗначениеПути.Значение.ПутьПодсистемы+"\"+ ЗначениеПути.Значение.ИмяПодсистемы, ЗначениеПути.Представление); + КонецЕсли; + + КонецЦикла; + + Возврат ПодсистемыВиртуальные; + +КонецФункции + +// Функция возвращает список подсистем (разделов). Функция используется во внутренних целях подсистемы. +// +Функция ПолучитьСписокПодсистем(ПутиПодсистемы, ДеревоПодсистем) Экспорт + + СписокПодсистем = Новый СписокЗначений; + + Для каждого Подсистема из Метаданные.Подсистемы Цикл + + Если Не Подсистема.ВключатьВКомандныйИнтерфейс тогда + Продолжить; + КонецЕсли; + + ПутьКПодсистеме = Подсистема.Имя; + + ПодсистемаПрисутствует = ложь; + + Для каждого ЭлементПодсистемы из ПутиПодсистемы Цикл + ПутьПодсистемы = ЭлементПодсистемы.Значение; + Если Найти(ПутьКПодсистеме, ПутьПодсистемы) > 0 тогда + ПодсистемаПрисутствует = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ПодсистемаПрисутствует тогда + СтрокаДереваПодсистем = ДеревоПодсистем.Строки.Добавить(); + СтрокаДереваПодсистем.Подсистема = ПутьКПодсистеме; + СтрокаДереваПодсистем.Название = Подсистема.Синоним; + + ЕстьПравоПросмотра = ПравоДоступа("Просмотр", Подсистема); + Если НЕ ЕстьПравоПросмотра тогда + Продолжить; + КонецЕсли; + + ПараметрыФункциональнаяОпция = Новый Структура(""); + + ДоступенПоФункциональнаяОпцияОпциям = ложь; + СодержитсяВФункциональнаяОпция = ложь; + Для каждого ФункциональнаяОпция из Метаданные.ФункциональныеОпции Цикл + + Если ФункциональнаяОпция.Состав.Найти(Подсистема) = Неопределено тогда + Продолжить; + КонецЕсли; + + СодержитсяВФункциональнаяОпция = Истина; + + ЗначениеФункциональнаяОпция = ПолучитьФункциональнуюОпцию(ФункциональнаяОпция.Имя, ПараметрыФункциональнаяОпция); + Если ТипЗнч(ЗначениеФункциональнаяОпция) = Тип("Булево") тогда + Если ЗначениеФункциональнаяОпция тогда + ДоступенПоФункциональнаяОпцияОпциям = истина; + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если СодержитсяВФункциональнаяОпция И НЕ ДоступенПоФункциональнаяОпцияОпциям тогда + Продолжить; + КонецЕсли; + + + СтрокаПодсистемы = СписокПодсистем.Добавить(); + СтрокаПодсистемы.Значение = ПутьКПодсистеме; + СтрокаПодсистемы.Представление = Подсистема.Синоним; + ДобавитьДеревоПодсистем(СписокПодсистем, Подсистема, ПутьКПодсистеме, СтрокаДереваПодсистем); + КонецЕсли; + + КонецЦикла; + + ВиртуальныеПодсистемы = ПолучитьВиртуальныеПодсистемы(Подсистема); + + Для каждого Подсистема из ВиртуальныеПодсистемы Цикл + + ПутьКПодсистеме = Подсистема.Значение; + + ПодсистемаПрисутствует = ложь; + + Для каждого ЭлементПодсистемы из ПутиПодсистемы Цикл + ПутьПодсистемы = ЭлементПодсистемы.Значение; + Если Найти(ПутьКПодсистеме, ПутьПодсистемы) > 0 тогда + ПодсистемаПрисутствует = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ПодсистемаПрисутствует тогда + + СтрокаДереваПодсистем = ДеревоПодсистем.Строки.Добавить(); + СтрокаДереваПодсистем.Подсистема = ПутьКПодсистеме; + СтрокаДереваПодсистем.Название = Подсистема.Представление; + + СтрокаПодсистемы = СписокПодсистем.Добавить(); + СтрокаПодсистемы.Значение = Подсистема.Значение; + СтрокаПодсистемы.Представление = Подсистема.Представление; + ДобавитьДеревоВиртуальныхПодсистем(СписокПодсистем, Подсистема.Значение, СтрокаДереваПодсистем); + КонецЕсли; + + КонецЦикла; + + Возврат СписокПодсистем; + +КонецФункции + +// Функция применяется для облегчения гибридного встраивания подсистемы. Функция используется во внутренних целях подсистемы. +// +Функция ТекущийПользователь() Экспорт + + Возврат ОбщегоНазначения.ТекущийПользователь(); + +КонецФункции + +// Функция возвращает шаблон заполнения для доп. настроек отчета. Функция используется во внутренних целях подсистемы. +// +Функция ПолучитьСтруктуруДополнительныхНастроек() Экспорт + + ДополнительныеНастройки = Новый Структура("ПредопределенныеВариантыБезСКД, + |ЗначенияНастроекОтчетовБезСКД, + |ОписаниеВариантов"); + + ДополнительныеНастройки.ПредопределенныеВариантыБезСКД = Новый СписокЗначений; + ДополнительныеНастройки.ЗначенияНастроекОтчетовБезСКД = Новый Соответствие; + + ДополнительныеНастройки.ОписаниеВариантов = Новый Соответствие; + + Возврат ДополнительныеНастройки; + +КонецФункции + +Процедура ДобавитьОтчетыПодсистемы(Подсистема, СоответствиеПодсистемОтчетам, Знач Путь) + + Для каждого ОбъектМетаданных из Подсистема.Состав Цикл + + Если ОбъектМетаданных = Неопределено тогда + Продолжить; + КонецЕсли; + + ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); + + Если Найти(ПолноеИмя, "Отчет.") <> 0 Тогда + + СтрокаДанных = СоответствиеПодсистемОтчетам.Добавить(); + СтрокаДанных.Отчет = ПолноеИмя; + СтрокаДанных.ПутьКПодсистеме = Путь; + СтрокаДанных.НазваниеПодсистемы = Подсистема.Синоним; + СтрокаДанных.Пояснение = Подсистема.Пояснение; + + КонецЕсли; + КонецЦикла; + + Для каждого Подсистема из Подсистема.Подсистемы Цикл + Если Не Подсистема.ВключатьВКомандныйИнтерфейс тогда + Продолжить; + КонецЕсли; + ДобавитьОтчетыПодсистемы(Подсистема, СоответствиеПодсистемОтчетам, Путь + "\" + Подсистема.Имя); + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьПутьВиртуальныхПодсистем() + + СписокЗначений = Новый СписокЗначений; + + СписокВиртуальныхПодсистем = ВариантыОтчетовПереопределяемый.ОписаниеВиртуальныхПодсистем(); + + Для каждого Подсистема из СписокВиртуальныхПодсистем Цикл + + НомерПозицииПоследнегоРазделителя = 0; + + ДлинаПути = СтрДлина(Подсистема.Значение); + + Для Сч = 1 по ДлинаПути Цикл + + Если КодСимвола(Подсистема.Значение, Сч) = КодСимвола("\") тогда + + НомерПозицииПоследнегоРазделителя = Сч; + + КонецЕсли; + КонецЦикла; + + ПутьПодсистемы = Лев(Подсистема.Значение, НомерПозицииПоследнегоРазделителя-1); + ИмяПодсистемы = Прав(Подсистема.Значение, ДлинаПути -НомерПозицииПоследнегоРазделителя); + НазваниеПодсистемы = Подсистема.Представление; + + СписокЗначений.Добавить(Новый Структура("ПутьПодсистемы, ИмяПодсистемы", ПутьПодсистемы, ИмяПодсистемы), НазваниеПодсистемы); + + КонецЦикла; + + Возврат СписокЗначений; +КонецФункции + + Процедура ДобавитьДеревоПодсистем(СписокПодсистем, Подсистема, Знач ПутьПодсистемы, СтрокаДереваПодсистем) + + Для каждого ПодсистемаПодчиненная из Подсистема.Подсистемы Цикл + + Если Не ПодсистемаПодчиненная.ВключатьВКомандныйИнтерфейс тогда + Продолжить; + КонецЕсли; + + ЕстьПравоПросмотра = ПравоДоступа("Просмотр", ПодсистемаПодчиненная); + Если НЕ ЕстьПравоПросмотра тогда + Продолжить; + КонецЕсли; + + ПараметрыФункциональнаяОпция = Новый Структура(""); + + ДоступенПоФункциональнаяОпцияОпциям = ложь; + СодержитсяВФункциональнаяОпция = ложь; + Для каждого ФункциональнаяОпция из Метаданные.ФункциональныеОпции Цикл + + Если ФункциональнаяОпция.Состав.Найти(ПодсистемаПодчиненная.Имя) = Неопределено тогда + Продолжить; + КонецЕсли; + + СодержитсяВФункциональнаяОпция = Истина; + + ЗначениеФункциональнаяОпция = ПолучитьФункциональнуюОпцию(ФункциональнаяОпция.Имя, ПараметрыФункциональнаяОпция); + Если ТипЗнч(ЗначениеФункциональнаяОпция) = Тип("Булево") тогда + Если ЗначениеФункциональнаяОпция тогда + ДоступенПоФункциональнаяОпцияОпциям = истина; + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если СодержитсяВФункциональнаяОпция И НЕ ДоступенПоФункциональнаяОпцияОпциям тогда + Продолжить; + КонецЕсли; + + ПутьКПодсистеме = ПутьПодсистемы + "\" + ПодсистемаПодчиненная.Имя; + + Если Найти(ПутьКПодсистеме, ПутьПодсистемы) > 0 тогда + СтрокаДереваПодсистемПодчиненная = СтрокаДереваПодсистем.Строки.Добавить(); + СтрокаДереваПодсистемПодчиненная.Подсистема = ПутьКПодсистеме; + СтрокаДереваПодсистемПодчиненная.Название = ПодсистемаПодчиненная.Синоним; + + СтрокаПодсистемы = СписокПодсистем.Добавить(); + СтрокаПодсистемы.Значение = ПутьКПодсистеме; + СтрокаПодсистемы.Представление = ПодсистемаПодчиненная.Синоним; + ДобавитьДеревоПодсистем(СписокПодсистем, ПодсистемаПодчиненная, ПутьКПодсистеме, СтрокаДереваПодсистемПодчиненная); + КонецЕсли; + КонецЦикла; + + ВиртуальныеПодсистемы = ПолучитьВиртуальныеПодсистемы(ПутьПодсистемы); + + Для каждого ПодсистемаПодчиненная из ВиртуальныеПодсистемы Цикл + + ПутьКПодсистеме = ПодсистемаПодчиненная.Значение; + + Если Найти(ПутьКПодсистеме, ПутьПодсистемы) > 0 тогда + СтрокаДереваПодсистемПодчиненная = СтрокаДереваПодсистем.Строки.Добавить(); + СтрокаДереваПодсистемПодчиненная.Подсистема = ПутьКПодсистеме; + СтрокаДереваПодсистемПодчиненная.Название = ПодсистемаПодчиненная.Представление; + + СтрокаПодсистемы = СписокПодсистем.Добавить(); + СтрокаПодсистемы.Значение = ПодсистемаПодчиненная.Значение; + СтрокаПодсистемы.Представление = ПодсистемаПодчиненная.Представление; + ДобавитьДеревоВиртуальныхПодсистем(СписокПодсистем, ПодсистемаПодчиненная.Значение, СтрокаДереваПодсистемПодчиненная); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьДеревоВиртуальныхПодсистем(СписокПодсистем, Знач Подсистема, СтрокаДереваПодсистем) + + ВиртуальныеПодсистемы = ПолучитьВиртуальныеПодсистемы(Подсистема); + + Для каждого ПодсистемаПодчиненная из ВиртуальныеПодсистемы Цикл + + ПутьКПодсистеме = ПодсистемаПодчиненная.Значение; + Если Найти(ПутьКПодсистеме, Подсистема) > 0 тогда + СтрокаДереваПодсистемПодчиненная = СтрокаДереваПодсистем.Строки.Добавить(); + СтрокаДереваПодсистемПодчиненная.Подсистема = ПутьКПодсистеме; + СтрокаДереваПодсистемПодчиненная.Название = Подсистема.Представление; + + СтрокаПодсистемы = СписокПодсистем.Добавить(); + СтрокаПодсистемы.Значение = ПодсистемаПодчиненная.Значение; + СтрокаПодсистемы.Представление = ПодсистемаПодчиненная.Представление; + ДобавитьДеревоВиртуальныхПодсистем(СписокПодсистем, ПодсистемаПодчиненная.Значение, СтрокаДереваПодсистемПодчиненная); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + + +Процедура ДобавитьВДопНастройки(ИмяОтчета, ОписаниеВариантов, ДанныеОПодсистемахВариантов, СписокДопВариантов, ЗначениеНастроекДопВариантов) + + ДанныеДополнительныхНастроек = ПолучитьСтруктуруДополнительныхНастроек(); + + Отчеты[СтрЗаменить(ИмяОтчета, "Отчет.", "")].НастройкиОтчета(ДанныеДополнительныхНастроек); + + //ОписаниеВариантов + Для каждого ОписаниеВарианта из ДанныеДополнительныхНастроек.ОписаниеВариантов Цикл + ОписаниеВариантов.Вставить(ИмяОтчета + "\" + ОписаниеВарианта.Ключ, ОписаниеВарианта.Значение); + КонецЦикла; + + //ПредопределенныеВариантыБезСКД + Для каждого ВариантБезСКД из ДанныеДополнительныхНастроек.ПредопределенныеВариантыБезСКД Цикл + СписокДопВариантов.Добавить(ИмяОтчета + "\" + ВариантБезСКД.Значение, ВариантБезСКД.Представление); + КонецЦикла; + + //ПредопределенныеВариантыБезСКД + Для каждого ЗначениеВариантаБезСКД из ДанныеДополнительныхНастроек.ЗначенияНастроекОтчетовБезСКД Цикл + ЗначениеНастроекДопВариантов.Вставить(ИмяОтчета + "\" + ВариантБезСКД.Ключ, ВариантБезСКД.Значение); + КонецЦикла; + + ДанныеДополнительныхНастроек = ВариантыОтчетовПереопределяемый.КомандныйИнтерфейс(); + + //СоответствиеПодсистемИВариантов + Для каждого ДанныеОПодсистеме из ДанныеДополнительныхНастроек.СоответствиеПодсистемИВариантов Цикл + СтрокаПодсистемы = ДанныеОПодсистемахВариантов.СоответствиеПодсистемИВариантов.Добавить(); + СтрокаПодсистемы.Ключ = ДанныеОПодсистеме.Ключ; + СтрокаПодсистемы.ПутьКПодсистеме = ДанныеОПодсистеме.ПутьКПодсистеме; + КонецЦикла; + + //СоответствиеПодсистемИВариантов + Для каждого ДанныеОПодсистеме из ДанныеДополнительныхНастроек.НеИспользоватьПодсистемыОтчета Цикл + СтрокаПодсистемы = ДанныеОПодсистемахВариантов.НеИспользоватьПодсистемуОтчета.Добавить(); + СтрокаПодсистемы.Ключ = ДанныеОПодсистеме.Ключ; + СтрокаПодсистемы.ПутьКПодсистеме = ДанныеОПодсистеме.ПутьКПодсистеме; + КонецЦикла; + +КонецПроцедуры + + + diff --git a/SSL/src/CommonModules/ВариантыОтчетов/ВариантыОтчетов.mdo b/SSL/src/CommonModules/ВариантыОтчетов/ВариантыОтчетов.mdo new file mode 100644 index 000000000..bf4286a81 --- /dev/null +++ b/SSL/src/CommonModules/ВариантыОтчетов/ВариантыОтчетов.mdo @@ -0,0 +1,10 @@ + + + ВариантыОтчетов + + ru + Варианты отчетов (сервер) + + true + true + diff --git a/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl new file mode 100644 index 000000000..8c50c4fcd --- /dev/null +++ b/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl @@ -0,0 +1,19 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// МОДУЛЬ СОДЕРЖИТ КЛИЕНТСКИЕ ПРОЦЕДУРЫ ПОДСИСТЕМЫ "ВАРИАНТЫ ОТЧЕТОВ" + +// Процедура открывает панель отчетов. Используется в модуле общей команды. +// Параметры: +// Подсистемы - строка с путем к подсистеме +// НазваниеФормы - заголовок панели отчетов должен соответствовать представление команды +// ПараметрыВыполненияКоманды - Параметры выполнения команды +// КартинкаФормы - картинка возле заголовка панели. +// +Процедура ОткрытьПанельОтчетов(Подсистемы, НазваниеФормы, ПараметрыВыполненияКоманды, КартинкаФормы = Неопределено) Экспорт + + ПараметрыФормы = Новый Структура("Подсистемы, ИмяФормы, КартинкаФормы"); + ПараметрыФормы.Подсистемы = Подсистемы; + ПараметрыФормы.ИмяФормы = НазваниеФормы; + ПараметрыФормы.КартинкаФормы = КартинкаФормы; + ОткрытьФорму("ОбщаяФорма.ПанельОтчетов", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ВариантыОтчетовКлиент/ВариантыОтчетовКлиент.mdo b/SSL/src/CommonModules/ВариантыОтчетовКлиент/ВариантыОтчетовКлиент.mdo new file mode 100644 index 000000000..0896c065d --- /dev/null +++ b/SSL/src/CommonModules/ВариантыОтчетовКлиент/ВариантыОтчетовКлиент.mdo @@ -0,0 +1,10 @@ + + + ВариантыОтчетовКлиент + + ru + Варианты отчетов (клиент) + + true + true + diff --git a/SSL/src/CommonModules/ВариантыОтчетовКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовКлиентПереопределяемый/Module.bsl new file mode 100644 index 000000000..173f4e106 --- /dev/null +++ b/SSL/src/CommonModules/ВариантыОтчетовКлиентПереопределяемый/Module.bsl @@ -0,0 +1,11 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// МОДУЛЬ, В КОТОРОМ МОЖНО ПЕРЕОПРЕДЕЛИТЬ ПОВЕДНИЕ КОМАНДЫ ВЫЗОВА ОТЧЕТА С ВАРИАНТОМ + +// Событие вызывается перед нажатии на команду открытия варианта отчета. В событие передается ключ, параметры формы, +// признак стандартной обработки. +// +Процедура ПередОткрытиемФормыОтчета(Ключ, ПараметрыФормы, СтандартнаяОбработка) Экспорт + + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ВариантыОтчетовКлиентПереопределяемый/ВариантыОтчетовКлиентПереопределяемый.mdo b/SSL/src/CommonModules/ВариантыОтчетовКлиентПереопределяемый/ВариантыОтчетовКлиентПереопределяемый.mdo new file mode 100644 index 000000000..7e443942d --- /dev/null +++ b/SSL/src/CommonModules/ВариантыОтчетовКлиентПереопределяемый/ВариантыОтчетовКлиентПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + ВариантыОтчетовКлиентПереопределяемый + + ru + Варианты отчетов (клиент, переопределяемый) + + true + true + diff --git a/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl new file mode 100644 index 000000000..4f9102a98 --- /dev/null +++ b/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl @@ -0,0 +1,63 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// МОДУЛЬ, В КОТОРОМ ОПРЕДЕЛЯЮТСЯ НАСТРОЙКИ ПОДСИСТЕМЫ + +// Функция должна вернуть список значений с описанием виртуальных подсистем +// Пример кода: +// +// Функция ОписаниеВиртуальныхПодсистем() Экспорт +// СписокПодсистем = Новый СписокЗначений; +// СписокПодсистем.Добавить("Маркетинг\АнализКлиентов", "Работа с клиентами") +// Возврат СписокПодсистем; +// КонецФункции +// +Функция ОписаниеВиртуальныхПодсистем() Экспорт + + СписокПодсистем = Новый СписокЗначений; + + + Возврат СписокПодсистем; + +КонецФункции + +// Функция должна вернуть соответсвие с кодом сортировки для каждого варианта отчета +// Пример кода: +// +// Функция СортировкаПредопределенныхВариантов() Экспорт +// СоответствиеСортировкиИВариантов = Новый Соответствие; +// СоответствиеСортировкиИВариантов.Вставить("Отчет.БизнесПроцессыИЗадачи\Основной", "АА00001"); +// Возврат СоответствиеСортировкиИВариантов; +// КонецФункции +// +Функция СортировкаПредопределенныхВариантов() Экспорт + СоответствиеСортировкиИВариантов = Новый Соответствие; + Возврат СоответствиеСортировкиИВариантов; +КонецФункции + + +// Функция должна вернуть список значений с ключами отчета, которые поддерживаются подсистемой +// +Функция СписокОтчетовПоддерживаемыхПодсистемой() Экспорт + + СписокОтчетов = Новый СписокЗначений; + + Возврат СписокОтчетов; + +КонецФункции + +// Функция возвращает структуру данных для переопределения командного интерфейса +// Пример кода: +// +// Функция КомандныйИнтерфейс() Экспорт +// ДанныеОПодсистемахВариантов = ВариантыОтчетов.НоваяСтруктураКомандногоИнтерфейса(); +// ВариантыОтчетов.ДобавитьПодсистемуВариантаВДопНастройках(ДанныеОПодсистемахВариантов, "Отчет.ДинамикаИзмененийФайлов\СводнаяДиаграммаИзменения", "Администрирование"); +// Возврат ДанныеОПодсистемахВариантов; +// КонецФункции +// +Функция КомандныйИнтерфейс() Экспорт + + ДанныеОПодсистемахВариантов = ВариантыОтчетов.НоваяСтруктураКомандногоИнтерфейса(); + + Возврат ДанныеОПодсистемахВариантов; + +КонецФункции + diff --git a/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/ВариантыОтчетовПереопределяемый.mdo b/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/ВариантыОтчетовПереопределяемый.mdo new file mode 100644 index 000000000..a6c6f6e8a --- /dev/null +++ b/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/ВариантыОтчетовПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + ВариантыОтчетовПереопределяемый + + ru + варианты отчетов (переопределяемый) + + true + true + diff --git a/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl b/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl new file mode 100644 index 000000000..1c2c413ed --- /dev/null +++ b/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl @@ -0,0 +1,195 @@ + +// Записывает версию объекта в регистр сведений +// Параметры +// Ссылка - СправочникСсылка / ДокументСсылка - ссылка на объект ИБ +// ЧислоВерсийОбъекта - Число - число версий объекта +// ХранилищеДанных - ХранилищеЗначения - хранилище с объектом ИБ (сериализованным в Fast InfoSet) +// +Процедура ЗаписатьВерсиюОбъекта(знач Ссылка, + знач ЧислоВерсийОбъекта, + знач ХранилищеДанных) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + МенеджерЗаписиВерсииОбъектов = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); + МенеджерЗаписиВерсииОбъектов.Объект = Ссылка; + МенеджерЗаписиВерсииОбъектов.ДатаВерсии = ТекущаяДата(); + МенеджерЗаписиВерсииОбъектов.ВерсияОбъекта = ХранилищеДанных; + МенеджерЗаписиВерсииОбъектов.НомерВерсии = Число(ЧислоВерсийОбъекта) + 1; + МенеджерЗаписиВерсииОбъектов.АвторВерсии = Пользователи.АвторизованныйПользователь(); + + МенеджерЗаписиВерсииОбъектов.Записать(); + +КонецПроцедуры + +// Возвращает количество версий объекта переданного по ссылке +// Параметры +// Объект - СправочникСсылка/ДокументСсылка - ссылка на объект ИБ +// Возвращаемое значение +// Число - количество версий объекта Объект в регистре сведений ВерсииОбъектов +// +Функция ПолучитьКоличествоВерсийОбъекта(Ссылка) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(НомерВерсии) КАК Количество + | ИЗ РегистрСведений.ВерсииОбъектов + | ГДЕ Объект=&Ссылка"; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + + Возврат Число(Выборка.Количество); + +КонецФункции + +// Удаляет хранимые версии объекта по ссылке Ссылка из регистра ВерсииОбъектов +// +Процедура УдалитьХранимыеВерсииПоОбъекту(Ссылка) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Объект.Использование = Истина; + НаборЗаписей.Отбор.Объект.Значение = Ссылка; + НаборЗаписей.Записать(); + +КонецПроцедуры + +// Выполняется при обновлении конфигурации. +// 1. Очищает настройки версионирования по объектам, для которых версионирование не применено +// 2. Устанавливает настройки версионирования по умолчанию +// +Процедура ОбновитьНастройкиВерсионированияОбъектов() Экспорт + + ВерсионируемыеОбъекты = ПолучитьВерсионируемыеОбъекты(); + + ВыборкаЗаписей = РегистрыСведений.НастройкаВерсионированияОбъектов.Выбрать(); + + Пока ВыборкаЗаписей.Следующий() Цикл + Если ВерсионируемыеОбъекты.Найти(ВыборкаЗаписей.ТипОбъекта) = Неопределено Тогда + МенеджерЗаписи = ВыборкаЗаписей.ПолучитьМенеджерЗаписи(); + МенеджерЗаписи.Удалить(); + КонецЕсли; + КонецЦикла; + + // составной тип из строки и ссылки на справочник Номенклатуры. + МассивТипов = Новый Массив; + МассивТипов.Добавить(Тип("Строка")); + + ВерсионируемыеОбъектыТЗ = Новый ТаблицаЗначений; + ВерсионируемыеОбъектыТЗ.Колонки.Добавить("ТипОбъекта", + Новый ОписаниеТипов(МассивТипов, , Метаданные.РегистрыСведений.НастройкаВерсионированияОбъектов.Измерения.ТипОбъекта.Тип.КвалификаторыСтроки) ); + Для Каждого ТипОбъекта Из ВерсионируемыеОбъекты Цикл + ВерсионируемыеОбъектыТЗ.Добавить(); + КонецЦикла; + ВерсионируемыеОбъектыТЗ.ЗагрузитьКолонку(ВерсионируемыеОбъекты, "ТипОбъекта"); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ВерсионируемыеОбъекты.ТипОбъекта + |ПОМЕСТИТЬ ТаблицаВерсионируемыхОбъектов + |ИЗ + | &ВерсионируемыеОбъекты КАК ВерсионируемыеОбъекты + |; + |//////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ТаблицаВерсионируемыхОбъектов.ТипОбъекта + |ИЗ + | ТаблицаВерсионируемыхОбъектов КАК ТаблицаВерсионируемыхОбъектов + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаВерсионированияОбъектов КАК НастройкаВерсионированияОбъектов + | ПО НастройкаВерсионированияОбъектов.ТипОбъекта = ТаблицаВерсионируемыхОбъектов.ТипОбъекта + |ГДЕ + | НастройкаВерсионированияОбъектов.Вариант ЕСТЬ NULL "; + + Запрос.Параметры.Вставить("ВерсионируемыеОбъекты", ВерсионируемыеОбъектыТЗ); + ВерсионируемыеОбъектыБезНастройки = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ТипОбъекта"); + + НаборЗаписейНастроек = РегистрыСведений.НастройкаВерсионированияОбъектов.СоздатьНаборЗаписей(); + НаборЗаписейНастроек.Прочитать(); + Для Каждого ВерсионируемыйОбъект Из ВерсионируемыеОбъектыБезНастройки Цикл + НоваяЗапись = НаборЗаписейНастроек.Добавить(); + НоваяЗапись.ТипОбъекта = ВерсионируемыйОбъект; + НоваяЗапись.Вариант = ПолучитьНастройкуВерсионированияПоУмолчанию(ВерсионируемыйОбъект); + НоваяЗапись.Использовать = ? (НоваяЗапись.Вариант = Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать, Ложь, Истина); + КонецЦикла; + + НаборЗаписейНастроек.Записать(Истина); + +КонецПроцедуры + +// Получает объекты информационной базы, для которых применена подсистема версионирования +// Возвращаемое значение +// Массив, элемент массива - строка, идентифицирующая объект метаданных в формате +// Справочник.<Имя справочника> или Документ.<Имя документа> +// +Функция ПолучитьВерсионируемыеОбъекты() + + Результат = Новый Массив; + + Для Каждого ЭлементМетаданных Из Метаданные.Справочники Цикл + Если Метаданные.ОбщиеКоманды.ИсторияИзменений.ТипПараметраКоманды.СодержитТип( + Тип("СправочникСсылка."+ЭлементМетаданных.Имя)) Тогда + Результат.Добавить(ЭлементМетаданных.ПолноеИмя()); + КонецЕсли; + КонецЦикла; + + Для Каждого ЭлементМетаданных Из Метаданные.Документы Цикл + Если Метаданные.ОбщиеКоманды.ИсторияИзменений.ТипПараметраКоманды.СодержитТип( + Тип("ДокументСсылка."+ЭлементМетаданных.Имя)) Тогда + Результат.Добавить(ЭлементМетаданных.ПолноеИмя()); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьНастройкуВерсионированияПоУмолчанию(ПолноеИмя) + + РазложенныйПуть = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПолноеИмя, "."); + + Если РазложенныйПуть[0] = "Документы" Тогда + Если Метаданные.НайтиПоПолномуИмени(ПолноеИмя).Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить Тогда + Возврат Перечисления.ВариантыВерсионированияОбъектов.ВерсионироватьПриПроведении; + Иначе + Возврат Перечисления.ВариантыВерсионированияОбъектов.Версионировать; + КонецЕсли + КонецЕсли; + + Возврат Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Блок функций для работы с настройками значений + +// Записывает настройку версионирования по объекту в регистр сведений +// +Процедура ЗаписатьНастройкуВерсионированияПоОбъекту( + Объект, + ВариантВерсионирования) Экспорт + + ВариантМВ = РегистрыСведений.НастройкаВерсионированияОбъектов.СоздатьМенеджерЗаписи(); + ВариантМВ.ТипОбъекта = Объект; + ВариантМВ.Вариант = ВариантВерсионирования; + ВариантМВ.Записать(); + +КонецПроцедуры + +// Выполняет с формой действия, необходимые для подключения подсистемы версионирования +// +Процедура ПриСозданииНаСервере(Форма) Экспорт + + Если ПустаяСтрока(ПользователиИнформационнойБазы.ТекущийПользователь().Имя) ИЛИ РольДоступна(Метаданные.Роли.ПолныеПрава) Тогда + ИмяФормыМассив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Форма.ИмяФормы, "."); + ПолноеИмяМетаданных = ИмяФормыМассив[0] + "." + ИмяФормыМассив[1]; + Иначе + ПолноеИмяМетаданных = Неопределено; + КонецЕсли; + + Форма.УстановитьПараметрыФункциональныхОпцийФормы(Новый Структура("ТипОбъектаКонфигурации", ПолноеИмяМетаданных)); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ВерсионированиеОбъектов/ВерсионированиеОбъектов.mdo b/SSL/src/CommonModules/ВерсионированиеОбъектов/ВерсионированиеОбъектов.mdo new file mode 100644 index 000000000..4e728bd1a --- /dev/null +++ b/SSL/src/CommonModules/ВерсионированиеОбъектов/ВерсионированиеОбъектов.mdo @@ -0,0 +1,10 @@ + + + ВерсионированиеОбъектов + + ru + Версионирование объектов + + true + true + diff --git a/SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/Module.bsl b/SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/Module.bsl new file mode 100644 index 000000000..7ac65843d --- /dev/null +++ b/SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/Module.bsl @@ -0,0 +1,70 @@ + +// Обработчик события ПриЗаписи. Определен для версионируемых объектов. +// Объект сериализуется в XML (Fast Infoset). +// +Процедура ВерсионированиеОбъектовПриЗаписиОбъекта(Источник, Отказ) Экспорт + + Перем ЧислоВерсийОбъекта; + + Если ОбъектВерсионируется(Источник, ЧислоВерсийОбъекта) Тогда + ЗаписьXML = Новый ЗаписьFastInfoset; + ЗаписьXML.УстановитьДвоичныеДанные(); + ЗаписьXML.ЗаписатьОбъявлениеXML(); + ЗаписатьXML(ЗаписьXML, Источник, НазначениеТипаXML.Явное); + ДвоичныеДанные = ЗаписьXML.Закрыть(); + ХранилищеДанных = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9)); + + ВерсионированиеОбъектов.ЗаписатьВерсиюОбъекта(Источник.Ссылка, ЧислоВерсийОбъекта, ХранилищеДанных); + КонецЕсли; + +КонецПроцедуры + +// Проверяет настройки версионирования по переданному объекту и +// и возвращает вариант версионирования. Если по объекту не настроено +// версионирование, то он версионируется в соответствии с правилами +// версионирования "по умолчанию". +// +Функция ОбъектВерсионируется(знач Источник, ЧислоВерсийОбъекта) + + УстановитьПривилегированныйРежим(Истина); + ИспользоватьВерсионированиеОбъектов = ПолучитьФункциональнуюОпцию("ИспользоватьВерсионированиеОбъектов"); + УстановитьПривилегированныйРежим(Ложь); + + // Проверяем, что подсистема версионирования включена + Если ИспользоватьВерсионированиеОбъектов Тогда + + ПолноеИмяОбъектаМетаданных = Источник.Метаданные().ПолноеИмя(); + + УстановитьПривилегированныйРежим(Истина); + ВариантВерсионирования = ПолучитьФункциональнуюОпцию("ВариантыВерсионированияОбъектов", + Новый Структура("ТипОбъектаКонфигурации", ПолноеИмяОбъектаМетаданных)); + УстановитьПривилегированныйРежим(Ложь); + + ЧислоВерсийОбъекта = ВерсионированиеОбъектов.ПолучитьКоличествоВерсийОбъекта(Источник.Ссылка); + + ВерсионироватьОбъект = Истина; + + Если ВариантВерсионирования = Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать Тогда + ВерсионироватьОбъект = Ложь; + ИначеЕсли ВариантВерсионирования = Перечисления.ВариантыВерсионированияОбъектов.ВерсионироватьПриПроведении Тогда + Если ЧислоВерсийОбъекта = 0 И НЕ Источник.Проведен Тогда + ВерсионироватьОбъект = Ложь; + КонецЕсли; + КонецЕсли; + + Иначе + ВерсионироватьОбъект = Ложь; + КонецЕсли; + + Возврат ВерсионироватьОбъект; + +КонецФункции + +// Обработчик события ПриЗаписи Справочников и Документов ИБ. +// Подготавливает объект к записи в регистр версий. +// +Процедура ВерсионированиеОбъектовПередУдалениемОбъекта(Источник, Отказ) Экспорт + + ВерсионированиеОбъектов.УдалитьХранимыеВерсииПоОбъекту(Источник.Ссылка); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/ВерсионированиеОбъектовСобытия.mdo b/SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/ВерсионированиеОбъектовСобытия.mdo new file mode 100644 index 000000000..8153b20b1 --- /dev/null +++ b/SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/ВерсионированиеОбъектовСобытия.mdo @@ -0,0 +1,12 @@ + + + ВерсионированиеОбъектовСобытия + + ru + Версионирование объектов события + + true + true + true + true + diff --git a/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl b/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl new file mode 100644 index 000000000..4b872c015 --- /dev/null +++ b/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl @@ -0,0 +1,558 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции прикладного разработчика +// + +// Функция ИспользоватьВнешнихПользователей() возвращает +// значение функциональной опции ИспользоватьВнешнихПользователей. +// +// Возвращаемое значение: +// Булево. +// +Функция ИспользоватьВнешнихПользователей() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Возврат Константы.ИспользоватьВнешнихПользователей.Получить(); + +КонецФункции + +// Получает значение параметра сеанса "Текущий внешний пользователь" +// +// Возвращаемое значение: +// СправочникСсылка.ВнешниеПользователи. +// +Функция ТекущийВнешнийПользователь() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Возврат ПараметрыСеанса.ТекущийВнешнийПользователь; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Внутренние процедуры и функции +// + +//Получает значение реквизита для внешнего пользователя +// +// Параметры +// Ссылка - СправочникСсылка - ссылка на элемент справочника для которого нужно получить значение реквизита +// ИмяРеквизита - Строка - имя реквизита, значение которого нужно получить +// +// Возвращаемое значение: +// Произвольный - полученное значение реквизита +// +Функция ПолучитьЗначениеРеквизитовВнешнегоПользователя(ВнешнийПользователь,ИмяРеквизитов,ИскатьВОбъектеАвторизации = Истина) Экспорт; + + Если ВнешнийПользователь = Справочники.ВнешниеПользователи.ПустаяСсылка() И ИскатьВОбъектеАвторизации Тогда + Возврат Неопределено; + КонецЕсли; + + Если ИскатьВОбъектеАвторизации Тогда + Возврат ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ВнешнийПользователь.ОбъектАвторизации,ИмяРеквизитов); + Иначе + Возврат ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ВнешнийПользователь,ИмяРеквизитов); + КонецЕсли; + +КонецФункции + +// Устанавливает значение реквизита формы +// +// Параметры +// Форма - Управляемая форма - форма, для которой выполняется действие +// ИмяРеквизита - Строка - реквизит, для которого устанавливается значение +// УстанавливаемоеЗначение - Произвольный - устанавливаемое значение +// +Процедура УстановитьЗначениеРеквизитаФормы(Форма,ИмяРеквизита,УстанавливаемоеЗначение) Экспорт + + МассивИмениРеквизита = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяРеквизита,"."); + + Попытка + Если МассивИмениРеквизита.Количество() > 0 Тогда + СтрокаПутьРеквизита = ""; + Для каждого ЭлементМассива Из МассивИмениРеквизита Цикл + СтрокаПутьРеквизита = СтрокаПутьРеквизита + "[""" + ЭлементМассива + """]"; + КонецЦикла; + Выполнить("Форма" + СтрокаПутьРеквизита + " = УстанавливаемоеЗначение"); + Иначе + Форма[ИмяРеквизита] = УстанавливаемоеЗначение; + КонецЕсли; + + Исключение + КонецПопытки; + +КонецПроцедуры + +// Процедура ОбновитьСоставГруппВнешнихПользователей обновляет в регистре сведений +// "Состав групп пользователей" соответствие групп внешних пользователей и внешних пользователей +// с учетом иерархии групп внешних пользователей (родитель включает внешних пользователей порожденных групп). +// Эти данные требуются для формы списка и формы выбора внешних пользователей. +// Данные регистра могут быть применены в других целях для повышения производительности, +// т.к. не требуется работать с иерархией на языке запросов. +// +// Параметры: +// ГруппаВнешнихПользователей - СправочникСсылка.ГруппыВнешнихПользователей +// +Процедура ОбновитьСоставГруппВнешнихПользователей(Знач ГруппаВнешнихПользователей, ИзмененныеВнешниеПользователи = Неопределено) Экспорт + + Если НЕ ЗначениеЗаполнено(ГруппаВнешнихПользователей) Тогда + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + // Подготовка групп родителей. + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ТаблицаГруппРодителей.Родитель, + | ТаблицаГруппРодителей.Ссылка + |ПОМЕСТИТЬ ТаблицаГруппРодителей + |ИЗ + | &ТаблицаГруппРодителей КАК ТаблицаГруппРодителей"); + Запрос.УстановитьПараметр("ТаблицаГруппРодителей", Пользователи.ТаблицаГруппРодителей("Справочник.ГруппыВнешнихПользователей")); + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + Запрос.Выполнить(); + + ИзмененныеВнешниеПользователи = Новый ТаблицаЗначений; + ИзмененныеВнешниеПользователи.Колонки.Добавить("ВнешнийПользователь", Новый ОписаниеТипов("СправочникСсылка.ВнешниеПользователи")); + ИзмененныеГруппыВнешнихПользователей = Новый ТаблицаЗначений; + ИзмененныеГруппыВнешнихПользователей.Колонки.Добавить("ГруппаВнешнихПользователей", Новый ОписаниеТипов("СправочникСсылка.ГруппыВнешнихПользователей")); + ИзмененныеГруппыВнешнихПользователей.Индексы.Добавить("ГруппаВнешнихПользователей"); + + // Выполнение для текущий группы и каждой группы-родителя. + Пока НЕ ГруппаВнешнихПользователей.Пустая() Цикл + + Запрос.УстановитьПараметр("ГруппаВнешнихПользователей", ГруппаВнешнихПользователей); + СвойстваГруппы = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ГруппаВнешнихПользователей, "ТипОбъектовАвторизации, ВсеОбъектыАвторизации"); + ТипОбъектовАвторизации = ?(СвойстваГруппы.ВсеОбъектыАвторизации, СвойстваГруппы.ТипОбъектовАвторизации, Неопределено); + + Если ГруппаВнешнихПользователей <> Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи И + ТипОбъектовАвторизации = Неопределено Тогда + + // Удаление связей для удаленных пользователей. + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | СоставГруппПользователей.Пользователь КАК ВнешнийПользователь + |ИЗ + | РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыВнешнихПользователей.Состав КАК ГруппыВнешнихПользователейСостав + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаГруппРодителей КАК ТаблицаГруппРодителей + | ПО (ТаблицаГруппРодителей.Ссылка = ГруппыВнешнихПользователейСостав.Ссылка) + | И (ТаблицаГруппРодителей.Родитель = &ГруппаВнешнихПользователей) + | ПО (СоставГруппПользователей.ГруппаПользователей = &ГруппаВнешнихПользователей) + | И СоставГруппПользователей.Пользователь = ГруппыВнешнихПользователейСостав.ВнешнийПользователь + |ГДЕ + | СоставГруппПользователей.ГруппаПользователей = &ГруппаВнешнихПользователей + | И ГруппыВнешнихПользователейСостав.Ссылка ЕСТЬ NULL "; + ВнешниеПользователиУдаленныеИзГруппы = Запрос.Выполнить().Выбрать(); + МенеджерЗаписи = РегистрыСведений.СоставГруппПользователей.СоздатьМенеджерЗаписи(); + Пока ВнешниеПользователиУдаленныеИзГруппы.Следующий() Цикл + МенеджерЗаписи.ГруппаПользователей = ГруппаВнешнихПользователей; + МенеджерЗаписи.Пользователь = ВнешниеПользователиУдаленныеИзГруппы.ВнешнийПользователь; + МенеджерЗаписи.Удалить(); + Если ИзмененныеГруппыВнешнихПользователей.Найти(ГруппаВнешнихПользователей, "ГруппаВнешнихПользователей") = Неопределено Тогда + ИзмененныеГруппыВнешнихПользователей.Добавить().ГруппаВнешнихПользователей = ГруппаВнешнихПользователей; + КонецЕсли; + ИзмененныеВнешниеПользователи.Добавить().ВнешнийПользователь = ВнешниеПользователиУдаленныеИзГруппы.ВнешнийПользователь; + КонецЦикла; + КонецЕсли; + + // Добавление связей для добавленных внешних пользователей. + Если ГруппаВнешнихПользователей = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда + Запрос.Текст = + "ВЫБРАТЬ + | ЗНАЧЕНИЕ(Справочник.ГруппыВнешнихПользователей.ВсеВнешниеПользователи) КАК ГруппаПользователей, + | ВнешниеПользователи.Ссылка КАК Пользователь + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + | ПО (СоставГруппПользователей.ГруппаПользователей = ЗНАЧЕНИЕ(Справочник.ГруппыВнешнихПользователей.ВсеВнешниеПользователи)) + | И (СоставГруппПользователей.Пользователь = ВнешниеПользователи.Ссылка) + |ГДЕ + | СоставГруппПользователей.Пользователь ЕСТЬ NULL "; + + ИначеЕсли ТипОбъектовАвторизации <> Неопределено Тогда + Запрос.УстановитьПараметр("ТипОбъектовАвторизации", ТипЗнч(ТипОбъектовАвторизации)); + Запрос.Текст = + "ВЫБРАТЬ + | &ГруппаВнешнихПользователей КАК ГруппаПользователей, + | ВнешниеПользователи.Ссылка КАК Пользователь + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + | ПО (СоставГруппПользователей.ГруппаПользователей = &ГруппаВнешнихПользователей) + | И (СоставГруппПользователей.Пользователь = ВнешниеПользователи.Ссылка) + |ГДЕ + | СоставГруппПользователей.Пользователь ЕСТЬ NULL + | И ТИПЗНАЧЕНИЯ(ВнешниеПользователи.ОбъектАвторизации) = &ТипОбъектовАвторизации"; + Иначе + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | &ГруппаВнешнихПользователей КАК ГруппаПользователей, + | ГруппыВнешнихПользователейСостав.ВнешнийПользователь КАК Пользователь + |ИЗ + | Справочник.ГруппыВнешнихПользователей.Состав КАК ГруппыВнешнихПользователейСостав + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаГруппРодителей КАК ТаблицаГруппРодителей + | ПО (ТаблицаГруппРодителей.Ссылка = ГруппыВнешнихПользователейСостав.Ссылка) + | И (ТаблицаГруппРодителей.Родитель = &ГруппаВнешнихПользователей) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + | ПО (СоставГруппПользователей.ГруппаПользователей = &ГруппаВнешнихПользователей) + | И (СоставГруппПользователей.Пользователь = ГруппыВнешнихПользователейСостав.ВнешнийПользователь) + |ГДЕ + | СоставГруппПользователей.Пользователь ЕСТЬ NULL "; + КонецЕсли; + + ВнешниеПользователиДобавленныеВГруппу = Запрос.Выполнить().Выгрузить(); + + Если ВнешниеПользователиДобавленныеВГруппу.Количество() > 0 Тогда + + НаборЗаписей = РегистрыСведений.СоставГруппПользователей.СоздатьНаборЗаписей(); + НаборЗаписей.Загрузить(ВнешниеПользователиДобавленныеВГруппу); + НаборЗаписей.Записать(Ложь); // Добавление недостающих записей связей. + + Для каждого ОписаниеВнешнегоПользователя Из ВнешниеПользователиДобавленныеВГруппу Цикл + + Если ИзмененныеГруппыВнешнихПользователей.Найти(ГруппаВнешнихПользователей, "ГруппаВнешнихПользователей") = Неопределено Тогда + ИзмененныеГруппыВнешнихПользователей.Добавить().ГруппаВнешнихПользователей = ГруппаВнешнихПользователей; + КонецЕсли; + ИзмененныеВнешниеПользователи.Добавить().ВнешнийПользователь = ОписаниеВнешнегоПользователя.Пользователь; + КонецЦикла; + КонецЕсли; + + ГруппаВнешнихПользователей = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ГруппаВнешнихПользователей, "Родитель"); + КонецЦикла; + +КонецПроцедуры + +// Процедура ОбновитьРолиВнешнихПользователей обновляет список ролей пользователей +// информационной базы по их текущим принадлежностям к группам внешних пользователей. +// +// Параметры: +// ВнешниеПользователи - Массив элементов СправочникСсылка.ВнешниеПользователи. +// ЕстьОшибки - Булево. Возвращает истина, когда были ошибки, записанные в журнал регистрации. +// +Процедура ОбновитьРолиВнешнихПользователей(Знач ВнешниеПользователи, ЕстьОшибки = Ложь) Экспорт + + Если ПользователиПереопределяемый.ЗапретРедактированияРолей() Тогда + // Роли устанавливаются другим механизмом, например, механизмом подсистемы УправлениеДоступом. + Возврат; + КонецЕсли; + + Если ВнешниеПользователи.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + ИдентификаторыПользователейИБ = Новый Соответствие; + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ВнешниеПользователи.Ссылка КАК ВнешнийПользователь, + | ВнешниеПользователи.ИдентификаторПользователяИБ + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + |ГДЕ + | ВнешниеПользователи.Ссылка В(&ВнешниеПользователи) + | И (НЕ ВнешниеПользователи.УстановитьРолиНепосредственно)"); + Запрос.УстановитьПараметр("ВнешниеПользователи", ВнешниеПользователи); + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + ИдентификаторыПользователейИБ.Вставить(Выборка.ВнешнийПользователь, Выборка.ИдентификаторПользователяИБ); + КонецЦикла; + + // Подготовка таблицы старых ролей внешних пользователей. + СтарыеРолиВнешнихПользователей = Новый ТаблицаЗначений; + СтарыеРолиВнешнихПользователей.Колонки.Добавить("ВнешнийПользователь", Новый ОписаниеТипов("СправочникСсылка.ВнешниеПользователи")); + СтарыеРолиВнешнихПользователей.Колонки.Добавить("Роль", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200))); + + ТекущийНомер = ВнешниеПользователи.Количество()-1; + Пока ТекущийНомер >= 0 Цикл + // Проверка необходимости обработки пользователя. + Если ИдентификаторыПользователейИБ[ВнешниеПользователи[ТекущийНомер]] = Неопределено Тогда + ПользовательИБ = Неопределено; + Иначе + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ИдентификаторыПользователейИБ[ВнешниеПользователи[ТекущийНомер]]); + КонецЕсли; + Если ПользовательИБ = Неопределено ИЛИ + ПустаяСтрока(ПользовательИБ.Имя) Тогда + ВнешниеПользователи.Удалить(ТекущийНомер); + Иначе + Для каждого Роль Из ПользовательИБ.Роли Цикл + СтараяРольВнешнегоПользователя = СтарыеРолиВнешнихПользователей.Добавить(); + СтараяРольВнешнегоПользователя.ВнешнийПользователь = ВнешниеПользователи[ТекущийНомер]; + СтараяРольВнешнегоПользователя.Роль = Роль.Имя; + КонецЦикла; + КонецЕсли; + ТекущийНомер = ТекущийНомер - 1; + КонецЦикла; + + // Подготовка списка ролей отсутствующих в метаданных и которые нужно переустановить. + Запрос.Текст = + "ВЫБРАТЬ + | СтарыеРолиВнешнихПользователей.ВнешнийПользователь, + | СтарыеРолиВнешнихПользователей.Роль + |ПОМЕСТИТЬ СтарыеРолиВнешнихПользователей + |ИЗ + | &СтарыеРолиВнешнихПользователей КАК СтарыеРолиВнешнихПользователей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВсеДоступныеРоли.Имя + |ПОМЕСТИТЬ ВсеДоступныеРоли + |ИЗ + | &ВсеДоступныеРоли КАК ВсеДоступныеРоли + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | СоставГруппПользователей.ГруппаПользователей КАК ГруппаВнешнихПользователей, + | СоставГруппПользователей.Пользователь КАК ВнешнийПользователь, + | Роли.Роль + |ПОМЕСТИТЬ ВсеНовыеРолиВнешнихПользователей + |ИЗ + | Справочник.ГруппыВнешнихПользователей.Роли КАК Роли + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + | ПО (СоставГруппПользователей.Пользователь В (&ВнешниеПользователи)) + | И (СоставГруппПользователей.ГруппаПользователей = Роли.Ссылка) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВсеНовыеРолиВнешнихПользователей.ВнешнийПользователь, + | ВсеНовыеРолиВнешнихПользователей.Роль + |ПОМЕСТИТЬ НовыеРолиВнешнихПользователей + |ИЗ + | ВсеНовыеРолиВнешнихПользователей КАК ВсеНовыеРолиВнешнихПользователей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СтарыеРолиВнешнихПользователей.ВнешнийПользователь + |ПОМЕСТИТЬ ИзмененныеВнешниеПользователи + |ИЗ + | СтарыеРолиВнешнихПользователей КАК СтарыеРолиВнешнихПользователей + | ЛЕВОЕ СОЕДИНЕНИЕ НовыеРолиВнешнихПользователей КАК НовыеРолиВнешнихПользователей + | ПО (НовыеРолиВнешнихПользователей.ВнешнийПользователь = СтарыеРолиВнешнихПользователей.ВнешнийПользователь) + | И (НовыеРолиВнешнихПользователей.Роль = СтарыеРолиВнешнихПользователей.Роль) + |ГДЕ + | НовыеРолиВнешнихПользователей.Роль ЕСТЬ NULL + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | НовыеРолиВнешнихПользователей.ВнешнийПользователь + |ИЗ + | НовыеРолиВнешнихПользователей КАК НовыеРолиВнешнихПользователей + | ЛЕВОЕ СОЕДИНЕНИЕ СтарыеРолиВнешнихПользователей КАК СтарыеРолиВнешнихПользователей + | ПО НовыеРолиВнешнихПользователей.ВнешнийПользователь = СтарыеРолиВнешнихПользователей.ВнешнийПользователь + | И НовыеРолиВнешнихПользователей.Роль = СтарыеРолиВнешнихПользователей.Роль + |ГДЕ + | СтарыеРолиВнешнихПользователей.Роль ЕСТЬ NULL + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВсеНовыеРолиВнешнихПользователей.ГруппаВнешнихПользователей, + | ВсеНовыеРолиВнешнихПользователей.ВнешнийПользователь, + | ВсеНовыеРолиВнешнихПользователей.Роль + |ИЗ + | ВсеНовыеРолиВнешнихПользователей КАК ВсеНовыеРолиВнешнихПользователей + |ГДЕ + | (НЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + | ИЗ + | ВсеДоступныеРоли КАК ВсеДоступныеРоли + | ГДЕ + | ВсеДоступныеРоли.Имя = ВсеНовыеРолиВнешнихПользователей.Роль))"; + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + Запрос.УстановитьПараметр("ВсеДоступныеРоли", ПользователиСерверПовтИсп.ВсеРоли(Истина)); + Запрос.УстановитьПараметр("СтарыеРолиВнешнихПользователей", СтарыеРолиВнешнихПользователей); + + // Регистрация ошибок имен ролей в профилях групп доступа. + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + ЗаписьЖурналаРегистрации(НСтр("ru = 'Внешние пользователи.Роль не найдена в метаданных'"), + УровеньЖурналаРегистрации.Ошибка, + , + , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru= 'При обновлении ролей внешнего пользователя ""<%1>"" роль ""<%2>"" группы внешних пользователей ""<%3>"" не найдена в метаданных!'"), + СокрЛП(Выборка.ВнешнийПользователь.Наименование), + Выборка.Роль, + Строка(Выборка.ГруппаВнешнихПользователей)), + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + ЕстьОшибки = Истина; + КонецЦикла; + + // Обновление ролей пользователейИБ. + Запрос.Текст = + "ВЫБРАТЬ + | ИзмененныеВнешниеПользователиИРоли.ВнешнийПользователь, + | ИзмененныеВнешниеПользователиИРоли.Роль + |ИЗ + | (ВЫБРАТЬ + | НовыеРолиВнешнихПользователей.ВнешнийПользователь КАК ВнешнийПользователь, + | НовыеРолиВнешнихПользователей.Роль КАК Роль + | ИЗ + | НовыеРолиВнешнихПользователей КАК НовыеРолиВнешнихПользователей + | ГДЕ + | НовыеРолиВнешнихПользователей.ВнешнийПользователь В + | (ВЫБРАТЬ + | ИзмененныеВнешниеПользователи.ВнешнийПользователь + | ИЗ + | ИзмененныеВнешниеПользователи КАК ИзмененныеВнешниеПользователи) + | + | ОБЪЕДИНИТЬ + | + | ВЫБРАТЬ + | ВнешниеПользователи.Ссылка, + | """" + | ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + | ГДЕ + | ВнешниеПользователи.Ссылка В + | (ВЫБРАТЬ + | ИзмененныеВнешниеПользователи.ВнешнийПользователь + | ИЗ + | ИзмененныеВнешниеПользователи КАК ИзмененныеВнешниеПользователи)) КАК ИзмененныеВнешниеПользователиИРоли + | + |УПОРЯДОЧИТЬ ПО + | ИзмененныеВнешниеПользователиИРоли.ВнешнийПользователь, + | ИзмененныеВнешниеПользователиИРоли.Роль"; + Выборка = Запрос.Выполнить().Выбрать(); + + ПользовательИБ = Неопределено; + Пока Выборка.Следующий() Цикл + Если НЕ ЗначениеЗаполнено(Выборка.Роль) Тогда + Если ПользовательИБ <> Неопределено Тогда + ПользовательИБ.Записать(); + КонецЕсли; + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ИдентификаторыПользователейИБ[Выборка.ВнешнийПользователь]); + ПользовательИБ.Роли.Очистить(); + Иначе + ПользовательИБ.Роли.Добавить(Метаданные.Роли[Выборка.Роль]); + КонецЕсли; + КонецЦикла; + Если ПользовательИБ <> Неопределено Тогда + ПользовательИБ.Записать(); + КонецЕсли; + +КонецПроцедуры + +// Функция ОбъектАвторизацииИспользуется проверяет, что объект информационной базы, +// используется в качестве объекта авторизации внешнего пользователя, кроме текущего (если задан). +// +Функция ОбъектАвторизацииИспользуется(Знач СсылкаНаОбъектАвторизации, + Знач СсылкаНаТекущегоВнешнегоПользователя = Неопределено, + НайденныйВнешнийПользователь = Неопределено, + ЕстьПравоДобавленияВнешнегоПользователя = Ложь) Экспорт + + ЕстьПравоДобавленияВнешнегоПользователя = ПравоДоступа("Добавление", Метаданные.Справочники.ВнешниеПользователи); + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ Первые 1 + | ВнешниеПользователи.Ссылка + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + |ГДЕ + | ВнешниеПользователи.ОбъектАвторизации = &СсылкаНаОбъектАвторизации + | И ВнешниеПользователи.Ссылка <> &СсылкаНаТекущегоВнешнегоПользователя"; + Запрос.УстановитьПараметр("СсылкаНаТекущегоВнешнегоПользователя", СсылкаНаТекущегоВнешнегоПользователя); + Запрос.УстановитьПараметр("СсылкаНаОбъектАвторизации", СсылкаНаОбъектАвторизации); + + Таблица = Запрос.Выполнить().Выгрузить(); + Если Таблица.Количество() > 0 Тогда + НайденныйВнешнийПользователь = Таблица[0].Ссылка; + КонецЕсли; + + Возврат Таблица.Количество() > 0; + +КонецФункции + +// Обработчик подписки на событие ОбновитьПредставлениеВнешнегоПользователя +Процедура ОбновитьПредставлениеВнешнегоПользователя(СсылкаНаОбъектАвторизации) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос( + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ВнешниеПользователи.Ссылка + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + |ГДЕ + | ВнешниеПользователи.ОбъектАвторизации = &СсылкаНаОбъектАвторизации + | И ВнешниеПользователи.Наименование <> &НовоеПредставлениеОбъектаАвторизации"); + Запрос.УстановитьПараметр("СсылкаНаОбъектАвторизации", СсылкаНаОбъектАвторизации); + Запрос.УстановитьПараметр("НовоеПредставлениеОбъектаАвторизации", Строка(СсылкаНаОбъектАвторизации)); + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + + ВнешнийПользовательОбъект = Выборка.Ссылка.ПолучитьОбъект(); + // Наименование будет переустановлено в обработчике ПриЗаписи. + ВнешнийПользовательОбъект.Записать(); + КонецЕсли; + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики обновления при переходе на новую версию конфигурации БСП +// + +// Обработчик обновления при переходе на версию конфигурации 1.0.6.5 +// для обновления записей регистра сведений СоставГруппПользователей. +// +Процедура ЗаполнитьСоставГруппВнешнихПользователей() Экспорт + + ВнешниеПользователи.ОбновитьСоставГруппВнешнихПользователей(Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи); + +КонецПроцедуры + +// Обработчик обновления при переходе на версию конфигурации 1.0.6.5 +// создает пользователей ИБ из данных Справочник.ВнешниеПользователи +// +Процедура ДляВнешнихПользователейСоздатьПользователейИБ() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Выборка = Справочники.ВнешниеПользователи.Выбрать(); + + Пока Выборка.Следующий() Цикл + + Если НЕ ЗначениеЗаполнено(Выборка.ИдентификаторПользователяИБ) И + ЗначениеЗаполнено(Выборка.ОбъектАвторизации) И + ЗначениеЗаполнено(Выборка.Код) Тогда + + ВнешнийПользовательОбъект = Выборка.Ссылка.ПолучитьОбъект(); + Попытка + ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя(); + ПользовательИБ.Имя = Выборка.Код; + ПользовательИБ.Пароль = Выборка.УдалитьПароль; + ПользовательИБ.ПолноеИмя = Строка(Выборка.ОбъектАвторизации); + ПользовательИБ.Записать(); + ВнешнийПользовательОбъект.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор; + ВнешнийПользовательОбъект.Записать(); + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Внешние пользователи.Ошибка при обновлении информационной базы'"), + УровеньЖурналаРегистрации.Ошибка, + , + , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru= 'При создании пользователя информационной базы с именем ""%1"" для внешнего пользователя ""%2"" произошла ошибка: + |%3'"), + Выборка.Код, + Выборка.Наименование, + ОписаниеОшибки()), + РежимТранзакцииЗаписиЖурналаРегистрации.Независимая); + КонецПопытки; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ВнешниеПользователи/ВнешниеПользователи.mdo b/SSL/src/CommonModules/ВнешниеПользователи/ВнешниеПользователи.mdo new file mode 100644 index 000000000..69ca57404 --- /dev/null +++ b/SSL/src/CommonModules/ВнешниеПользователи/ВнешниеПользователи.mdo @@ -0,0 +1,10 @@ + + + ВнешниеПользователи + + ru + Внешние пользователи + + true + true + diff --git a/SSL/src/CommonModules/ВнешниеПользователиСобытия/Module.bsl b/SSL/src/CommonModules/ВнешниеПользователиСобытия/Module.bsl new file mode 100644 index 000000000..9432061df --- /dev/null +++ b/SSL/src/CommonModules/ВнешниеПользователиСобытия/Module.bsl @@ -0,0 +1,22 @@ + +// Обработчик ОбновитьПредставлениеВнешнегоПользователя события ПриЗаписи подписки на события +// "ОбновитьПредставлениеВнешнегоПользователя" вызывает метод записи представления внешнего пользователя. +// Тип СправочникСсылка.ВнешниеПользователи используется для целей поставки непустого списка типов в +// подписке на событие. +// В состав подписки следует включить типы объектов авторизации, +// например, Справочник.ФизическиеЛица, Справочник.Контрагенты +// +Процедура ОбновитьПредставлениеВнешнегоПользователя(Знач Объект, Отказ) Экспорт + + Если Объект.ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда + Возврат; + КонецЕсли; + + ВнешниеПользователи.ОбновитьПредставлениеВнешнегоПользователя(Объект.Ссылка); + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ВнешниеПользователиСобытия/ВнешниеПользователиСобытия.mdo b/SSL/src/CommonModules/ВнешниеПользователиСобытия/ВнешниеПользователиСобытия.mdo new file mode 100644 index 000000000..0febbc56e --- /dev/null +++ b/SSL/src/CommonModules/ВнешниеПользователиСобытия/ВнешниеПользователиСобытия.mdo @@ -0,0 +1,12 @@ + + + ВнешниеПользователиСобытия + + ru + Внешние пользователи события + + true + true + true + true + diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl new file mode 100644 index 000000000..f1233f0cf --- /dev/null +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl @@ -0,0 +1,537 @@ +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Обработчик события ПриСозданииНаСервере. +// Выполняет установки параметров функциональных опций формы - требуется +// для формирования командного интерфейса формы. +// +Процедура ПриСозданииНаСервере(Форма) Экспорт + + Если ПустаяСтрока(ПользователиИнформационнойБазы.ТекущийПользователь().Имя) + ИЛИ РольДоступна(Метаданные.Роли.ПолныеПрава) + ИЛИ РольДоступна(Метаданные.Роли.ИспользованиеДополнительныхОтчетовИОбработок) + ИЛИ РольДоступна(Метаданные.Роли.ДобавлениеИзменениеДополнительныхОтчетовИОбработок) Тогда + + ИмяФормыМассив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Форма.ИмяФормы, "."); + ПолноеИмяОбъектаМетаданных = ИмяФормыМассив[0] + "." + ИмяФормыМассив[1]; + + Если ЭтоФормаОбъекта(ПолноеИмяОбъектаМетаданных, Форма.ИмяФормы) Тогда + Форма.УстановитьПараметрыФункциональныхОпцийФормы(Новый Структура("ТипФормыСДополнительнымиОтчетамиИОбработками", "ФормаОбъекта")); + Иначе + Форма.УстановитьПараметрыФункциональныхОпцийФормы(Новый Структура("ТипФормыСДополнительнымиОтчетамиИОбработками", "ФормаСписка")); + КонецЕсли; + + Форма.УстановитьПараметрыФункциональныхОпцийФормы(Новый Структура("ТипОбъектаКонфигурации", ПолноеИмяОбъектаМетаданных)); + + КонецЕсли; + +КонецПроцедуры + +// Функция формирования печатной формы по внешнему источнику. +// ИсточникДанных - СправочникСсылка.ДополнительныеОтчетыИОбработки - ссылка на внешнюю обработку +// ПараметрыИсточника - Структура с ключами: +// БезопасныйРежим - булево - используется ли безопасный режим +// ИдентификаторКоманды - строка- список макетов, перечисленных через запятую +// ОбъектыНазначения - массив - массив ссылок на объекты назначения +// +// параметры, заполняемые в функции (описание см. в модуле УправлениеПечатьюПереопределяемый) +// КоллекцияПечатныхФорм +// ОбъектыПечати +// ПараметрыВывода +// +Процедура ПечатьПоВнешнемуИсточнику(ИсточникДанных, + ПараметрыИсточника, + КоллекцияПечатныхФорм, + ОбъектыПечати, + ПараметрыВывода) Экспорт + + КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ПараметрыИсточника.ИдентификаторКоманды); + + ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода(); + + ОбъектыПечати = Новый СписокЗначений; + + ВнешняяОбработкаОбъект = ПолучитьОбъектВнешнейОбработки(ИсточникДанных, ПараметрыИсточника.БезопасныйРежим); + + ВнешняяОбработкаОбъект.Печать( + ПараметрыИсточника.ОбъектыНазначения, + КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода); + + // Проверим, все ли макеты были сформированы + Для Каждого Стр Из КоллекцияПечатныхФорм Цикл + Если Стр.ТабличныйДокумент = Неопределено Тогда + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В обработчике печати не был сформирован табличный документ для: %1'"), + Стр.ИмяМакета); + ВызватьИсключение(ТекстСообщенияОбОшибке); + КонецЕсли; + + Стр.ТабличныйДокумент.КоличествоЭкземпляров = Стр.Экземпляров; + КонецЦикла; + +КонецПроцедуры + +Функция ЭтоФормаОбъекта(ПолноеИмяОбъектаМетаданных, ИмяФормы) Экспорт + + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных); + + Если ОбъектМетаданных.ОсновнаяФормаОбъекта.ПолноеИмя() = ИмяФормы Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Обработчик экземпляра регламентного задания ЗапускОбработок. +// Запускает обработчик глобальной обработки по регламентному заданию, +// с указанным идентификатором команды. +// +// Параметры +// ВнешняяОбработка - СправочникСсылка.ДополнительныеОтчетыИОбработки +// ИдентификаторКоманды - Строка - идентификатор выполняемой команды +// +Процедура ВыполнитьОбработкуПоРегламентномуЗаданию(ВнешняяОбработка, ИдентификаторКоманды) Экспорт + + НачалоВыполненияОбработки(ВнешняяОбработка, ИдентификаторКоманды); + + ВыполнитьОбработкуНепосредственно(ВнешняяОбработка, ИдентификаторКоманды, ВнешняяОбработка.БезопасныйРежим); + + ОкончаниеРаботыОбработки(ВнешняяОбработка, ИдентификаторКоманды); + +КонецПроцедуры + +// Функция возвращает таблицу значений со списком объектов метаданных, +// к которым может быть применена обработка переданного вида. +// Список объектов метаданных берется из общий команд, соответствующих +// виду обработки. Для глобальных обработок возвращается пустой набор. +// Параметры +// Вид - Перечисление.ВидыДополнительныхОтчетовИОбработок - вид внешней обработки +// Возвращаемое значение +// ТаблицаЗначений с колонками +// ПолноеИмяОбъектаМетаданных - строка - полное имя объекта метаданных, например "Справочник.Валюты" +// Класс - строка - класс метаданных, например "Справочник" +// Объект - строка - имя объекта метаданных, например "Валюты" +// +Функция ПолучитьПолноеНазначениеПоВидуДополнительнойВнешнейОбработки(Вид) Экспорт + + Назначение = Новый ТаблицаЗначений; + Назначение.Колонки.Добавить("ПолноеИмяОбъектаМетаданных"); + Назначение.Колонки.Добавить("Класс"); + Назначение.Колонки.Добавить("Объект"); + + Команда = Неопределено; + + Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта Тогда + Команда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта; + ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет Тогда + Команда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиОтчеты; + ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма Тогда + Команда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиПечатныеФормы; + ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.СозданиеСвязанныхОбъектов Тогда + Команда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов; + КонецЕсли; + + Если Команда <> Неопределено Тогда + + Для Каждого Тип Из Команда.ТипПараметраКоманды.Типы() Цикл + ПолноеИмяОбъектаМетаданных = Метаданные.НайтиПоТипу(Тип).ПолноеИмя(); + РазделеннаяСтрока = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПолноеИмяОбъектаМетаданных, "."); + НовоеНазначение = Назначение.Добавить(); + НовоеНазначение.ПолноеИмяОбъектаМетаданных = ПолноеИмяОбъектаМетаданных; + НовоеНазначение.Класс = РазделеннаяСтрока[0]; + НовоеНазначение.Объект = РазделеннаяСтрока[1]; + КонецЦикла; + + КонецЕсли; + + Возврат Назначение; + +КонецФункции + +// Проверяет, что обработка относится к категории глобальных. +// Параметры +// Вид - ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок - вид обработки +// Возвращаемое значение +// Истина - обработка относится к категории глобальных +// Ложь - обработка относится к категории назначаемых +// +Функция ПроверитьГлобальнаяОбработка(Вид) Экспорт + + Возврат (Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка) + ИЛИ (Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет); + +КонецФункции + +// Проверяет, что обработка относится к категории назначаемых для объектов +// Параметры +// Вид - ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок - вид обработки +// Возвращаемое значение +// Истина - обработка относится к категории назначаемых +// Ложь - обработка относится к категории глобальных +// +Функция ПроверитьНазначаемаяОбработка(Вид) Экспорт + + Возврат Не ПроверитьГлобальнаяОбработка(Вид); + +КонецФункции + +// Выполняет подключение внешней обработки. После подключения обработка +// становится известной в системе под определенным именем. После этого +// можно открывать форму обработки. +// +// Параметры +// ВнешняяОбработка - СправочникСсылка.ДополнительныеОтчетыИОбработки +// БезопасныйРежим - Булево - требуется ли запускать обработку в безопасном режиме +// +// Возвращаемое значение +// Имя обработки - строка - имя обработки известное системе +// +Функция ПодключитьВнешнююОбработку(ВнешняяОбработка, БезопасныйРежим) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ДвоичныеДанныеОбработки = ВнешняяОбработка.ПолучитьОбъект().ХранилищеОбработки.Получить(); + АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки); + + Если ВнешняяОбработка.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет + ИЛИ ВнешняяОбработка.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда + Возврат ВнешниеОтчеты.Подключить(АдресВоВременномХранилище,, БезопасныйРежим); + Иначе + Возврат ВнешниеОбработки.Подключить(АдресВоВременномХранилище,, БезопасныйРежим); + КонецЕсли; + +КонецФункции + +// Создает объект обработки и передает ему управление через известный интерфейс. +// Для назначаемых обработок так же указываются объекты назначения. Из некоторых обработок +// происходит получение результата выполнения. +// Параметры +// ВнешняяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки +// ИдентификаторКоманды - Строка - идентификатор одной из команд обработки +// БезопасныйРежим - Булево - требуется ли запускать обработку в безопасном режиме +// ОбъектыНазначения - Массив - объекты назначения обработки +// РезультатВыполнения - Массив - используется для передачи результата выполнения обработки +// +Процедура ВыполнитьОбработкуНепосредственно( + ВнешняяОбработкаСсылка, + ИдентификаторКоманды, + БезопасныйРежим, + ОбъектыНазначения = Неопределено, + РезультатВыполнения = Неопределено + ) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ВнешняяОбработка = ПолучитьОбъектВнешнейОбработки(ВнешняяОбработкаСсылка, БезопасныйРежим); + + ТипОбработки = ВнешняяОбработкаСсылка.Вид; + + Если ТипОбработки = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка + ИЛИ ТипОбработки = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда + + ВнешняяОбработка.ВыполнитьКоманду(ИдентификаторКоманды); + + ИначеЕсли ТипОбработки = Перечисления.ВидыДополнительныхОтчетовИОбработок.СозданиеСвязанныхОбъектов Тогда + + СозданныеОбъекты = Новый Массив; + + ВнешняяОбработка.ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты); + + РезультатВыполнения = Новый Массив; + + Для Каждого СозданныйОбъект Из СозданныеОбъекты Цикл + Тип = ТипЗнч(СозданныйОбъект); + Если РезультатВыполнения.Найти(Тип) = Неопределено Тогда + РезультатВыполнения.Добавить(Тип); + КонецЕсли; + КонецЦикла; + + ИначеЕсли ТипОбработки = Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта Тогда + + ВнешняяОбработка.ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения); + + РезультатВыполнения = Новый Массив; + + Для Каждого ИзмененныйОбъект Из ОбъектыНазначения Цикл + Тип = ТипЗнч(ИзмененныйОбъект); + Если РезультатВыполнения.Найти(Тип) = Неопределено Тогда + РезультатВыполнения.Добавить(Тип); + КонецЕсли; + КонецЦикла; + + ИначеЕсли ТипОбработки = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда + + ВнешняяОбработка.ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения); + + ИначеЕсли ТипОбработки = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма Тогда + + ВнешняяОбработка.Печать(ИдентификаторКоманды, ОбъектыНазначения); + + КонецЕсли; + +КонецПроцедуры + +// Возвращает вид обработки по строковому представлению +// Параметры +// СтроковоеПредставление - Строка - строковое представление вида обработки +// Возвращаемое значение +// ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок - вид обработки +// +Функция ПолучитьВидОбработкиПоСтроковомуПредставлениюВида(СтроковоеПредставление) Экспорт + + Если СтроковоеПредставление = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта() Тогда + Возврат Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта; + ИначеЕсли СтроковоеПредставление = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет() Тогда + Возврат Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет; + ИначеЕсли СтроковоеПредставление = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма() Тогда + Возврат Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма; + ИначеЕсли СтроковоеПредставление = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиСозданиеСвязанныхОбъектов() Тогда + Возврат Перечисления.ВидыДополнительныхОтчетовИОбработок.СозданиеСвязанныхОбъектов; + ИначеЕсли СтроковоеПредставление = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка() Тогда + Возврат Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка; + ИначеЕсли СтроковоеПредставление = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет() Тогда + Возврат Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет; + КонецЕсли; + +КонецФункции + +// Выполняет создание экземпляра внешней обработки (отчета) +// Параметры +// ВнешняяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки +// БезопасныйРежим - Булево - требуется ли запускать обработку в безопасном режиме +// Возвращаемое значение +// строка - имя обработки известное системе +// +Функция ПолучитьОбъектВнешнейОбработки(ВнешняяОбработкаСсылка, БезопасныйРежим) Экспорт + + ВнешняяОбработкаОбъект = ВнешняяОбработкаСсылка.ПолучитьОбъект(); + + ДвоичныеДанныеОбработки = ВнешняяОбработкаОбъект.ХранилищеОбработки.Получить(); + + ИмяВременногоФайла = ПолучитьИмяВременногоФайла("epf"); + + ДвоичныеДанныеОбработки.Записать(ИмяВременногоФайла); + + Если ВнешняяОбработкаОбъект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет + ИЛИ ВнешняяОбработкаОбъект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда + Возврат ВнешниеОтчеты.Создать(ИмяВременногоФайла, БезопасныйРежим); + Иначе + Возврат ВнешниеОбработки.Создать(ИмяВременногоФайла, БезопасныйРежим); + КонецЕсли; + +КонецФункции + +// Возвращает имя рабочего места команды +// +Функция ПолучитьИмяРабочегоМеста(ИмяКоманды) Экспорт + + ТаблицаКоманд = ДополнительныеОтчетыИОбработкиПереопределяемый.ПолучитьОбщиеКомандыДополнительныхОбработок(); + + Найденные = ТаблицаКоманд.НайтиСтроки(Новый Структура("ИмяКоманды", ИмяКоманды)); + + Если Найденные.Количество() = 0 Тогда + ТаблицаКоманд = ДополнительныеОтчетыИОбработкиПереопределяемый.ПолучитьОбщиеКомандыДополнительныхОтчетов(); + Найденные = ТаблицаКоманд.НайтиСтроки(Новый Структура("ИмяКоманды", ИмяКоманды)); + КонецЕсли; + + Возврат Найденные[0].ИмяРабочегоМеста; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +Процедура НачалоВыполненияОбработки(ДополнительнаяОбработкаСсылка, ИдентификаторКоманды) + + ТекстСообщения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Запуск обработчика. Команда: %1.'"), + ИдентификаторКоманды); + + ЗаписатьСобытиеВЖурналРегистрации(ДополнительнаяОбработкаСсылка, ТекстСообщения); + +КонецПроцедуры + +Процедура ОкончаниеРаботыОбработки(ДополнительнаяОбработкаСсылка, ИдентификаторКоманды) + + ТекстСообщения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Возврат из обработчика. Команда: %1.'"), + ИдентификаторКоманды); + + ЗаписатьСобытиеВЖурналРегистрации(ДополнительнаяОбработкаСсылка, ТекстСообщения); + +КонецПроцедуры + +Процедура ЗаписатьСобытиеВЖурналРегистрации(ДополнительнаяОбработкаСсылка, ТекстСообщения) + + ЗаписьЖурналаРегистрации(НСтр("ru = 'Дополнительные отчеты и обработки'"), + УровеньЖурналаРегистрации.Информация, + ДополнительнаяОбработкаСсылка.Метаданные(), + ДополнительнаяОбработкаСсылка, + ТекстСообщения); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ ОБНОВЛЕНИЯ ИНФОРМАЦИОННОЙ БАЗЫ + +// Процедура обновления записей о доступности дополнительных обработок +// +Процедура ОбновитьПользовательскиеНастройкиДоступаКОбработкам() Экспорт + + ПользователиСДопОбработками = ПолучитьМассивПользователейСДоступомКДополнительнымОбработкам(); + + ТаблицаЗаписей = ПолучитьТаблицуЗаписей(ПользователиСДопОбработками); + + Для Каждого Пользователь Из ПользователиСДопОбработками Цикл + НаборЗаписей = РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Пользователь.Установить(Пользователь); + ЗаписиПоБыстромуДоступу = ТаблицаЗаписей.НайтиСтроки(Новый Структура("Пользователь,Доступно", Пользователь, Истина)); + Для Каждого ЗаписьБыстрогоДоступа Из ЗаписиПоБыстромуДоступу Цикл + НоваяЗапись = НаборЗаписей.Добавить(); + НоваяЗапись.ДополнительныйОтчетИлиОбработка = ЗаписьБыстрогоДоступа.Обработка; + НоваяЗапись.ИдентификаторКоманды = ЗаписьБыстрогоДоступа.Идентификатор; + НоваяЗапись.Пользователь = Пользователь; + НоваяЗапись.Доступно = Истина; + КонецЦикла; + НаборЗаписей.Записать(Истина); + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьТаблицуЗаписей(ПользователиСДопОбработками) + + ТекстЗапроса = "ВЫБРАТЬ + | ДополнительныеОтчетыИОбработки.Ссылка КАК Обработка, + | КомандыДополнительныхОтчетовИОбработок.Идентификатор КАК Идентификатор + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Команды КАК КомандыДополнительныхОтчетовИОбработок + | ПО (КомандыДополнительныхОтчетовИОбработок.Ссылка = ДополнительныеОтчетыИОбработки.Ссылка)"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + ОбработкиСКомандами = Запрос.Выполнить().Выгрузить(); + + ТаблицаЗаписей = Новый ТаблицаЗначений; + ТаблицаЗаписей.Колонки.Добавить("Обработка", Новый ОписаниеТипов("СправочникСсылка.ДополнительныеОтчетыИОбработки")); + ТаблицаЗаписей.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); + ТаблицаЗаписей.Колонки.Добавить("Пользователь", Новый ОписаниеТипов("СправочникСсылка.Пользователи")); + ТаблицаЗаписей.Колонки.Добавить("Доступно", Новый ОписаниеТипов("Булево")); + + Для Каждого ОбработкаКоманда Из ОбработкиСКомандами Цикл + Для Каждого Пользователь Из ПользователиСДопОбработками Цикл + НоваяСтрока = ТаблицаЗаписей.Добавить(); + НоваяСтрока.Обработка = ОбработкаКоманда.Обработка; + НоваяСтрока.Идентификатор = ОбработкаКоманда.Идентификатор; + НоваяСтрока.Пользователь = Пользователь; + НоваяСтрока.Доступно = Истина; + КонецЦикла; + КонецЦикла; + + ТекстЗапроса = "ВЫБРАТЬ + | ДополнительныеОтчетыИОбработки.Ссылка КАК Обработка, + | КомандыДополнительныхОтчетовИОбработок.Идентификатор КАК Идентификатор, + | Пользователи.Ссылка КАК Пользователь, + | ПользовательскиеНастройкиДоступаКОбработкам.Доступно КАК Доступно + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Команды КАК КомандыДополнительныхОтчетовИОбработок + | ПО (КомандыДополнительныхОтчетовИОбработок.Ссылка = ДополнительныеОтчетыИОбработки.Ссылка) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПользовательскиеНастройкиДоступаКОбработкам КАК ПользовательскиеНастройкиДоступаКОбработкам + | ПО (ПользовательскиеНастройкиДоступаКОбработкам.ДополнительныйОтчетИлиОбработка = ДополнительныеОтчетыИОбработки.Ссылка) + | И (ПользовательскиеНастройкиДоступаКОбработкам.ИдентификаторКоманды = КомандыДополнительныхОтчетовИОбработок.Идентификатор) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи + | ПО (Пользователи.Ссылка = ПользовательскиеНастройкиДоступаКОбработкам.Пользователь)"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + ИсключенияПерсональногоДоступа = Запрос.Выполнить().Выгрузить(); + + Для Каждого ИсключениеПерсональногоДоступа Из ИсключенияПерсональногоДоступа Цикл + + Строка = ТаблицаЗаписей.НайтиСтроки(Новый Структура("Обработка,Идентификатор,Пользователь", + ИсключениеПерсональногоДоступа.Обработка, + ИсключениеПерсональногоДоступа.Идентификатор, + ИсключениеПерсональногоДоступа.Пользователь))[0]; + + Строка.Доступно = НЕ ИсключениеПерсональногоДоступа.Доступно; // ранее это значение было исключением доступа, инвертируем его + + КонецЦикла; + + Возврат ТаблицаЗаписей; + +КонецФункции + +Функция ПолучитьМассивПользователейСДоступомКДополнительнымОбработкам() + + Результат = Новый Массив; + + ТекстЗапроса = "ВЫБРАТЬ Ссылка + |ИЗ + | Справочник.Пользователи"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + + ВсеПользователи = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + + Для Каждого Пользователь Из ВсеПользователи Цикл + + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Пользователь.ИдентификаторПользователяИБ); + + Если ПользовательИБ <> Неопределено Тогда + Если ПользовательИБ.Роли.Содержит(Метаданные.Роли.ИспользованиеДополнительныхОтчетовИОбработок) + ИЛИ ПользовательИБ.Роли.Содержит(Метаданные.Роли.ДобавлениеИзменениеДополнительныхОтчетовИОбработок) + ИЛИ ПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава) Тогда + Результат.Добавить(Пользователь); + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ + | Пользователь + |ИЗ + | РегистрСведений.ПользовательскиеНастройкиДоступаКОбработкам + |ГДЕ + | Пользователь НЕ В (&МассивПользователей)"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.Параметры.Вставить("МассивПользователей", Результат); + + ПользователиВРегистре = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Пользователь"); + + Для Каждого Пользователь Из ПользователиВРегистре Цикл + Результат.Добавить(Пользователь); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Служебные функции, используются в общем модуле ДополнительныеОтчетыИОбработкиПереопределяемый +// + +Функция ПолучитьТаблицуКоманд() Экспорт + + Таблица = Новый ТаблицаЗначений; + + Таблица.Колонки.Добавить("ИмяКоманды", Новый ОписаниеТипов("Строка")); + Таблица.Колонки.Добавить("ИмяРабочегоМеста", Новый ОписаниеТипов("Строка")); + + Возврат Таблица; + +КонецФункции + +Процедура ДобавитьКоманду(ТаблицаКоманд, ИмяКоманды, ИмяРабочегоМеста) Экспорт + + НоваяСтрока = ТаблицаКоманд.Добавить(); + НоваяСтрока.ИмяКоманды = ИмяКоманды; + НоваяСтрока.ИмяРабочегоМеста = ИмяРабочегоМеста; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo new file mode 100644 index 000000000..d051cfbaf --- /dev/null +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo @@ -0,0 +1,10 @@ + + + ДополнительныеОтчетыИОбработки + + ru + Дополнительные отчеты и обработки + + true + true + diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl new file mode 100644 index 000000000..3935b4e0b --- /dev/null +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl @@ -0,0 +1,301 @@ +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Обработчик команд обращения к дополнительным отчетам и обработкам. +// Открывает форму с доступными командами и передает ей объекты назначения +// и вид обработок. +// Параметры +// ПараметрКоманды - Массив - объекты информационной базы, для которых была вызвана команда +// ПараметрыВыполненияКоманды - ДанныеФормыСтруктура -параметры выполнения команды +// Вид - строка - строковое представление вида обработки +// ИмяРаздела - строка - имя раздела для фильтрации обработок, +// указывается только для глобальных обработок +// +Функция ОткрытьФормуКомандДополнительныхОтчетовИОбработок(ПараметрКоманды, + ПараметрыВыполненияКоманды, + Вид, + ИмяРаздела = "") Экспорт + + ПараметрКомандыСписок = Новый СписокЗначений; + + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда // назначаемая обработка + ПараметрКомандыСписок.ЗагрузитьЗначения(ПараметрКоманды); + КонецЕсли; + + Параметры = Новый Структура("ОбъектыНазначения,Вид,ИмяРаздела", + ПараметрКомандыСписок, + Вид, + ИмяРаздела); + + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда // назначаемая обработка + Параметры.Вставить("ИмяФормы", ПараметрыВыполненияКоманды.Источник.ИмяФормы); + КонецЕсли; + + ОткрытьФормуМодально("ОбщаяФорма.ДополнительныеОтчетыИОбработки", + Параметры, + ПараметрыВыполненияКоманды.Источник); + +КонецФункции + +// Используется для управления вызовами внешних отчетов и обработок. +// В зависимости от варианта запуска обработки либо открывает форму обработки, +// либо вызывает клиентский метод формы либо передает управление на сервер +// для последующего вызова обработки на сервере. Так же отвечает за +// отображения оповещения и оповещения об измененных объектах. +// +// Параметры +// ВнешняяОбработка - СправочникСсылка.ДополнительныеОтчетыИОбработки +// ВидОбработки - Строка - строковое представление вида обработки +// ИдентификаторКоманды - Строка - идентификатор команды +// БезопасныйРежим - Булево - требуется ли использовать обработку в безопасном режиме +// ВариантЗапуска - ПеречислениеСсылка.СпособыВызоваДополнительныхОбработок - вариант запуска обработки +// ПоказыватьОповещение - Булево - требуется ли показывать оповещение о начале и окончании +// выполнения обработки. Не используется если ВариантЗапуска задан как ОткрытиеФормы +// Модификатор - Строка - модификатор команды, используется для печатных форм на основе макетов табличных документов +// ОбъектыНазначенияМассив - Массив - ссылки на объекты информационной базы +// +Процедура ВыполнитьОбработку(ВнешняяОбработка, + ВидОбработки, + ИдентификаторКоманды, + БезопасныйРежим, + ВариантЗапуска, + ПоказыватьОповещение, + Модификатор, + ОбъектыНазначенияМассив) Экспорт + + Если ВариантЗапуска = ВариантЗапускаОткрытиеФормы() Тогда + + ВыполнитьОткрытиеФормыОбработки( + ВнешняяОбработка, + ВидОбработки, + ИдентификаторКоманды, + БезопасныйРежим, + ОбъектыНазначенияМассив); + + ИначеЕсли ВариантЗапуска = ВариантЗапускаВызовКлиентскогоМетода() Тогда + + ВыполнитьКлиентскийМетодОбработки( + ВнешняяОбработка, + ВидОбработки, + ИдентификаторКоманды, + БезопасныйРежим, + ПоказыватьОповещение, + ОбъектыНазначенияМассив); + + ИначеЕсли ВариантЗапуска = ВариантЗапускаВызовСерверногоМетода() Тогда + + ВыполнитьСерверныйМетодОбработки( + ВнешняяОбработка, + ВидОбработки, + ИдентификаторКоманды, + БезопасныйРежим, + ПоказыватьОповещение, + Модификатор, + ОбъектыНазначенияМассив); + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +Функция ЭтоГлобальнаяОбработка(Вид) + + Возврат (Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка()) + ИЛИ (Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет()); + +КонецФункции + +Процедура ВыполнитьОткрытиеФормыОбработки( + ВнешняяОбработка, + ВидОбработки, + ИдентификаторКоманды, + БезопасныйРежим, + ОбъектыНазначенияМассив) + + ИмяОбработки = ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(ВнешняяОбработка, БезопасныйРежим); + + ПараметрыОбработки = Новый Структура("ИдентификаторКоманды"); + ПараметрыОбработки.ИдентификаторКоманды = ИдентификаторКоманды; + + Если НЕ ЭтоГлобальнаяОбработка(ВидОбработки) Тогда + ПараметрыОбработки.Вставить("ОбъектыНазначения", ОбъектыНазначенияМассив); + КонецЕсли; + + Если ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет() + ИЛИ ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет() Тогда + ОткрытьФорму("ВнешнийОтчет."+ ИмяОбработки +".Форма", ПараметрыОбработки); + Иначе + ОткрытьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма", ПараметрыОбработки); + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьКлиентскийМетодОбработки( + ВнешняяОбработка, + ВидОбработки, + ИдентификаторКоманды, + БезопасныйРежим, + ПоказыватьОповещение, + ОбъектыНазначенияМассив) + + Если ПоказыватьОповещение Тогда + ПоказатьОповещениеПользователя(НСтр("ru = 'Обработка выполняется...'")); + КонецЕсли; + + ИмяОбработки = ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(ВнешняяОбработка, БезопасныйРежим); + + ПараметрыОбработки = Новый Структура("ИдентификаторКоманды"); + ПараметрыОбработки.ИдентификаторКоманды = ИдентификаторКоманды; + + Если НЕ ЭтоГлобальнаяОбработка(ВидОбработки) Тогда + ПараметрыОбработки.Вставить("ОбъектыНазначения", ОбъектыНазначенияМассив); + КонецЕсли; + + Если ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет() + ИЛИ ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет() Тогда + ФормаОбработки = ПолучитьФорму("ВнешнийОтчет."+ ИмяОбработки +".Форма", ПараметрыОбработки); + Иначе + ФормаОбработки = ПолучитьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма", ПараметрыОбработки); + КонецЕсли; + + Если ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка() + ИЛИ ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет() Тогда + + ФормаОбработки.ВыполнитьКоманду(ИдентификаторКоманды); + + ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиСозданиеСвязанныхОбъектов() Тогда + + СозданныеОбъекты = Новый Массив; + + ФормаОбработки.ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив, СозданныеОбъекты); + + ТипыСозданныхОбъектов = Новый Массив; + + Для Каждого СозданныйОбъект Из СозданныеОбъекты Цикл + Тип = ТипЗнч(СозданныйОбъект); + Если ТипыСозданныхОбъектов.Найти(Тип) = Неопределено Тогда + ТипыСозданныхОбъектов.Добавить(Тип); + КонецЕсли; + КонецЦикла; + + Для Каждого Тип Из ТипыСозданныхОбъектов Цикл + ОповеститьОбИзменении(Тип); + КонецЦикла; + + ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма() Тогда + + ФормаОбработки.Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив); + + ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта() Тогда + + ФормаОбработки.ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив); + + ТипыИзмененныхОбъектов = Новый Массив; + + Для Каждого ИзмененныйОбъект Из ОбъектыНазначенияМассив Цикл + Тип = ТипЗнч(ИзмененныйОбъект); + Если ТипыИзмененныхОбъектов.Найти(Тип) = Неопределено Тогда + ТипыИзмененныхОбъектов.Добавить(Тип); + КонецЕсли; + КонецЦикла; + + Для Каждого Тип Из ТипыИзмененныхОбъектов Цикл + ОповеститьОбИзменении(Тип); + КонецЦикла; + + ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет() Тогда + + ФормаОбработки.ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив); + + КонецЕсли; + + Если ПоказыватьОповещение Тогда + ПоказатьОповещениеПользователя(НСтр("ru = 'Обработка завершена...'")); + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьСерверныйМетодОбработки( + ВнешняяОбработка, + ВидОбработки, + ИдентификаторКоманды, + БезопасныйРежим, + ПоказыватьОповещение, + Модификатор, + ОбъектыНазначенияМассив) + + Если ПоказыватьОповещение Тогда + ПоказатьОповещениеПользователя(НСтр("ru = 'Обработка выполняется...'")); + КонецЕсли; + + Если ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка() + ИЛИ ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет() Тогда + + ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуНепосредственно(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим); + + ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиСозданиеСвязанныхОбъектов() Тогда + + ТипыСозданныхОбъектов = Новый Массив; + + ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуНепосредственно(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив, ТипыСозданныхОбъектов); + + Для Каждого Тип Из ТипыСозданныхОбъектов Цикл + ОповеститьОбИзменении(Тип); + КонецЦикла; + + ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма() + И Модификатор = "ПечатьMXL" Тогда + + ПараметрыИсточника = Новый Структура; + ПараметрыИсточника.Вставить("ИдентификаторКоманды", ИдентификаторКоманды); + ПараметрыИсточника.Вставить("ОбъектыНазначения", ОбъектыНазначенияМассив); + ПараметрыИсточника.Вставить("БезопасныйРежим", БезопасныйРежим); + + ПараметрыОткрытия = Новый Структура("ИсточникДанных,ПараметрыИсточника"); + ПараметрыОткрытия.ИсточникДанных = ВнешняяОбработка; + ПараметрыОткрытия.ПараметрыИсточника = ПараметрыИсточника; + + ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия); + + ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта() Тогда + + ИзмененныеОбъекты = Новый Массив; + + ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуНепосредственно(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив, ИзмененныеОбъекты); + + Для Каждого Тип Из ИзмененныеОбъекты Цикл + ОповеститьОбИзменении(Тип); + КонецЦикла; + + ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма() + ИЛИ ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет() Тогда + + ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуНепосредственно(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив); + + КонецЕсли; + + Если ПоказыватьОповещение Тогда + ПоказатьОповещениеПользователя(НСтр("ru = 'Обработка завершена...'")); + КонецЕсли; + +КонецПроцедуры + +Функция ВариантЗапускаВызовКлиентскогоМетода() + + Возврат "ВызовКлиентскогоМетода"; + +КонецФункции + +Функция ВариантЗапускаВызовСерверногоМетода() + + Возврат "ВызовСерверногоМетода"; + +КонецФункции + +Функция ВариантЗапускаОткрытиеФормы() + + Возврат "ОткрытиеФормы"; + +КонецФункции diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/ДополнительныеОтчетыИОбработкиКлиент.mdo b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/ДополнительныеОтчетыИОбработкиКлиент.mdo new file mode 100644 index 000000000..cdad249e1 --- /dev/null +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/ДополнительныеОтчетыИОбработкиКлиент.mdo @@ -0,0 +1,10 @@ + + + ДополнительныеОтчетыИОбработкиКлиент + + ru + Дополнительные отчеты и обработки клиент + + true + true + diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl new file mode 100644 index 000000000..0750f8189 --- /dev/null +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl @@ -0,0 +1,38 @@ + +// Идентификаторы видов дополнительных внешних обработок + +Функция ВидОбработкиПечатнаяФорма() Экспорт + + Возврат "ПечатнаяФорма"; // не локализуется + +КонецФункции + +Функция ВидОбработкиЗаполнениеОбъекта() Экспорт + + Возврат "ЗаполнениеОбъекта"; // не локализуется + +КонецФункции + +Функция ВидОбработкиСозданиеСвязанныхОбъектов() Экспорт + + Возврат "СозданиеСвязанныхОбъектов"; // не локализуется + +КонецФункции + +Функция ВидОбработкиОтчет() Экспорт + + Возврат "Отчет"; // не локализуется + +КонецФункции + +Функция ВидОбработкиДополнительнаяОбработка() Экспорт + + Возврат "ДополнительнаяОбработка"; // не локализуется + +КонецФункции + +Функция ВидОбработкиДополнительныйОтчет() Экспорт + + Возврат "ДополнительныйОтчет"; // не локализуется + +КонецФункции diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/ДополнительныеОтчетыИОбработкиКлиентСервер.mdo b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/ДополнительныеОтчетыИОбработкиКлиентСервер.mdo new file mode 100644 index 000000000..78e407e9a --- /dev/null +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/ДополнительныеОтчетыИОбработкиКлиентСервер.mdo @@ -0,0 +1,11 @@ + + + ДополнительныеОтчетыИОбработкиКлиентСервер + + ru + Дополнительные отчеты и обработки клиент сервер + + true + true + true + diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl new file mode 100644 index 000000000..9962e9c1f --- /dev/null +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl @@ -0,0 +1,28 @@ + +// Экспортная функция - интерфейс, определяет общие команды конфигурации, +// которые образуют рабочие места для вызова дополнительных обработок. +// Возвращаемое значение - массив, в котором нужно перечислить имена +// общих команд для вызова дополнительных обработок. +// +Функция ПолучитьОбщиеКомандыДополнительныхОбработок() Экспорт + + ТаблицаКоманд = ДополнительныеОтчетыИОбработки.ПолучитьТаблицуКоманд(); + + + Возврат ТаблицаКоманд; + +КонецФункции + +// Экспортная функция - интерфейс, определяет общие команды конфигурации, +// которые образуют рабочие места для вызова дополнительны отчетов. +// Возвращаемое значение - массив, в котором нужно перечислить имена +// общих команд для вызова дополнительных отчетов. +// +Функция ПолучитьОбщиеКомандыДополнительныхОтчетов() Экспорт + + ТаблицаКоманд = ДополнительныеОтчетыИОбработки.ПолучитьТаблицуКоманд(); + + Возврат ТаблицаКоманд; + +КонецФункции + diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/ДополнительныеОтчетыИОбработкиПереопределяемый.mdo b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/ДополнительныеОтчетыИОбработкиПереопределяемый.mdo new file mode 100644 index 000000000..158258dd1 --- /dev/null +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/ДополнительныеОтчетыИОбработкиПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + ДополнительныеОтчетыИОбработкиПереопределяемый + + ru + Дополнительные отчеты и обработки переопределяемый + + true + true + diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl new file mode 100644 index 000000000..341e13922 --- /dev/null +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl @@ -0,0 +1,216 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Для функционирования подсистемы в интерактивном режиме форме объекта добавляется +// реквизит __ПараметрыЗапретаРедактирования, с типом ФиксированноеСоответствие, где +// ключ - строка - имя реквизита +// значение - структура: +// БлокируемыеЭлементы - Массив - массив, строк - имен блокируемых элементов формы +// Представление - строка - представление реквизита для пользователя +// РазрешитьИзменение - булево - изменение реквизита разрешено +/////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// БЛОК ЭКСПОРТНЫХ ФУНКЦИЙ + +// Процедура принимает в качестве параметра форму и для всех реквизитов, +// для которых определен механизм, блокирует их редактирование. +// Параметры: +// Форма - управляемая форма - форма объекта, для которой применяется механизм +// НаименованиеГруппыДляКнопкиЗапрета - если требуется поместить кнопку разрешения +// редактирования в специальное место - передается группа на форме +Процедура ЗаблокироватьРеквизиты(Форма, + НаименованиеГруппыДляКнопкиЗапрета = Неопределено) Экспорт + + // Проверяем, что форма подготовлена (созданы необходимые реквизиты и элементы формы) + ФормаПодготовлена = Ложь; + РеквизитыФормы = Форма.ПолучитьРеквизиты(); + Для Каждого РеквизитФормы Из РеквизитыФормы Цикл + Если РеквизитФормы.Имя = "__ПараметрыЗапретаРедактирования" Тогда + ФормаПодготовлена = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если Не ФормаПодготовлена Тогда + ПодготовитьФорму(Форма, Форма.Объект.Ссылка, НаименованиеГруппыДляКнопкиЗапрета); + КонецЕсли; + + Если Форма.Объект.Ссылка.Пустая() Тогда + РазрешитьИзменение = Истина; + Иначе + РазрешитьИзменение = Ложь; + КонецЕсли; + + // Блокируем редактирование реквизитов + Для Каждого ОписаниеБлокируемогоРеквизита Из Форма.__ПараметрыЗапретаРедактирования Цикл + Для Каждого ОписаниеЭлементаФормы Из ОписаниеБлокируемогоРеквизита.БлокируемыеЭлементы Цикл + ЭлементФормы = Форма.Элементы.Найти(ОписаниеЭлементаФормы.Значение); + Если ЭлементФормы <> Неопределено Тогда + Если ТипЗнч(ЭлементФормы) = Тип("ПолеФормы") + ИЛИ ТипЗнч(ЭлементФормы) = Тип("ТаблицаФормы") Тогда + ЭлементФормы.ТолькоПросмотр = НЕ РазрешитьИзменение; + Иначе + ЭлементФормы.Доступность = РазрешитьИзменение; + КонецЕсли; + КонецЕсли; + КонецЦикла; + ОписаниеБлокируемогоРеквизита.РазрешитьИзменение = РазрешитьИзменение; + КонецЦикла; + +КонецПроцедуры + +// Проверяет, что объект с ссылкой Ссылка ссылаются существующие объекты информационной базы. +// +Функция ПроверитьНаОбъектыИмеютсяСсылкиВИБ(знач СсылкаИлиМассивСсылок) Экспорт + + Если ТипЗнч(СсылкаИлиМассивСсылок) = Тип("Массив") Тогда + МассивСсылок = СсылкаИлиМассивСсылок; + Иначе + МассивСсылок = Новый Массив; + МассивСсылок.Добавить(СсылкаИлиМассивСсылок); + КонецЕсли; + + ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок); + + СлужебныеОбъекты = ОбщегоНазначенияПереопределяемый.ПолучитьИсключенияПоискаСсылок(); + + Исключения = Новый Массив; + + Для Каждого ОписаниеСсылки Из ТаблицаСсылок Цикл + Если СлужебныеОбъекты.Найти(ОписаниеСсылки.Метаданные.ПолноеИмя()) <> Неопределено Тогда + Исключения.Добавить(ОписаниеСсылки); + КонецЕсли; + КонецЦикла; + + Для Каждого СтрокаИсключение Из Исключения Цикл + ТаблицаСсылок.Удалить(СтрокаИсключение); + КонецЦикла; + + Если ТаблицаСсылок.Количество() > 0 Тогда + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// БЛОК ВСПОМОГАТЕЛЬНЫХ ФУНКЦИЙ + +// Подготавливает форму, для подсистемы. +// Добавляется реквизит __ПараметрыЗапретаРедактирования тип ФиксированноеСоответствие (см. выше) +// +Процедура ПодготовитьФорму(Форма, Ссылка, НаименованиеГруппыДляКнопкиЗапрета = Неопределено) + + ОписаниеТиповСтрока100 = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100)); + ОписаниеТиповБулево = Новый ОписаниеТипов("Булево"); + ОписаниеТиповМассив = Новый ОписаниеТипов("СписокЗначений"); + + // Добавляем реквизит на форму + ДобавляемыеРеквизиты = Новый Массив; + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("__ПараметрыЗапретаРедактирования", Новый ОписаниеТипов("ТаблицаЗначений"))); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИмяРеквизита",ОписаниеТиповСтрока100, "__ПараметрыЗапретаРедактирования")); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Представление",ОписаниеТиповСтрока100, "__ПараметрыЗапретаРедактирования")); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("РазрешитьИзменение",ОписаниеТиповБулево, "__ПараметрыЗапретаРедактирования")); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("БлокируемыеЭлементы",ОписаниеТиповМассив, "__ПараметрыЗапретаРедактирования")); + + Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); + + БлокируемыеРеквизиты = ОбщегоНазначения.МенеджерОбъектаПоСсылке(Ссылка).ПолучитьБлокируемыеРеквизитыОбъекта(); + + Для Каждого БлокируемыйРеквизит Из БлокируемыеРеквизиты Цикл + + ОписаниеРеквизита = Форма.__ПараметрыЗапретаРедактирования.Добавить(); + + ИнформацияОБР = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(БлокируемыйРеквизит, ";"); + ОписаниеРеквизита.ИмяРеквизита = ИнформацияОБР[0]; + + Если ИнформацияОБР.Количество() > 1 Тогда + БлокируемыеЭлементы = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИнформацияОБР[1], ","); + Для Каждого БлокируемыйЭлемент Из БлокируемыеЭлементы Цикл + ОписаниеРеквизита.БлокируемыеЭлементы.Добавить(СокрЛП(БлокируемыйЭлемент)); + КонецЦикла; + КонецЕсли; + + ЗаполнитьСвязанныеЭлементы(ОписаниеРеквизита.БлокируемыеЭлементы, Форма, ОписаниеРеквизита.ИмяРеквизита); + + Если Ссылка.Метаданные().Реквизиты.Найти(ОписаниеРеквизита.ИмяРеквизита) <> Неопределено Тогда + Если ЗначениеЗаполнено(Ссылка.Метаданные().Реквизиты[ОписаниеРеквизита.ИмяРеквизита].Синоним) Тогда + Представление = Ссылка.Метаданные().Реквизиты[ОписаниеРеквизита.ИмяРеквизита].Синоним; + Иначе + Представление = Ссылка.Метаданные().Реквизиты[ОписаниеРеквизита.ИмяРеквизита].Имя; + КонецЕсли; + ИначеЕсли ЭтоСтандартныйРеквизит(Ссылка, ОписаниеРеквизита.ИмяРеквизита) Тогда + Если ЗначениеЗаполнено(Ссылка.Метаданные().СтандартныеРеквизиты[ОписаниеРеквизита.ИмяРеквизита].Синоним) Тогда + Представление = Ссылка.Метаданные().СтандартныеРеквизиты[ОписаниеРеквизита.ИмяРеквизита].Синоним; + Иначе + Представление = Ссылка.Метаданные().СтандартныеРеквизиты[ОписаниеРеквизита.ИмяРеквизита].Имя; + КонецЕсли; + ИначеЕсли Ссылка.Метаданные().ТабличныеЧасти.Найти(ОписаниеРеквизита.ИмяРеквизита) <> Неопределено Тогда + Если ЗначениеЗаполнено(Ссылка.Метаданные().ТабличныеЧасти[ОписаниеРеквизита.ИмяРеквизита].Синоним) Тогда + Представление = Ссылка.Метаданные().ТабличныеЧасти[ОписаниеРеквизита.ИмяРеквизита].Синоним; + Иначе + Представление = Ссылка.Метаданные().ТабличныеЧасти[ОписаниеРеквизита.ИмяРеквизита].Имя; + КонецЕсли; + КонецЕсли; + + ОписаниеРеквизита.Представление = Представление; + + ОписаниеРеквизита.РазрешитьИзменение = Ложь; + + КонецЦикла; + + // Команду формы добавляем только если установлена роль "РедактированиеРеквизитовОбъектов" + Если (РольДоступна(Метаданные.Роли.РедактированиеРеквизитовОбъектов) + ИЛИ Пользователи.ЭтоПолноправныйПользовательИБ()) + И ПравоДоступа("Редактирование", Ссылка.Метаданные()) Тогда + // Добавляем команду + Команда = Форма.Команды.Добавить("РазрешитьРедактированиеРеквизитовОбъекта"); + Команда.Заголовок = НСтр("ru = 'Разрешить редактирование реквизитов объекта'"); + Команда.Действие = "Подключаемый_РазрешитьРедактированиеРеквизитовОбъекта"; + Команда.Картинка = БиблиотекаКартинок.РазрешитьРедактированиеРеквизитовОбъекта; + Команда.ИзменяетСохраняемыеДанные = Ложь; + + // Добавляем кнопку на форму + Если НаименованиеГруппыДляКнопкиЗапрета <> Неопределено Тогда + РодительскаяГруппа = НаименованиеГруппыДляКнопкиЗапрета; + Иначе + РодительскаяГруппа = Форма.КоманднаяПанель; + КонецЕсли; + + Кнопка = Форма.Элементы.Добавить("РазрешитьРедактированиеРеквизитовОбъекта", Тип("КнопкаФормы"), РодительскаяГруппа); + Кнопка.ТолькоВоВсехДействиях = Истина; + Кнопка.ИмяКоманды = "РазрешитьРедактированиеРеквизитовОбъекта"; + КонецЕсли; + +КонецПроцедуры + +// Проверяет, что текущий реквизит это стандартный реквизит объекта +// +Функция ЭтоСтандартныйРеквизит(Ссылка, Наименование) + + Для Каждого ОписаниеСтандартногоРеквизита Из Ссылка.Метаданные().СтандартныеРеквизиты Цикл + Если ОписаниеСтандартногоРеквизита.Имя = Наименование Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +// По переданному имени реквизита объекта возвращает имя элемента формы, +// ссылающегося на него +// +Процедура ЗаполнитьСвязанныеЭлементы(МассивСвязанныхЭлементов, Форма, ИмяРеквизита) + + Для Каждого ЭлементФормы Из Форма.Элементы Цикл + Если (ТипЗнч(ЭлементФормы) = Тип("ПолеФормы") И ЭлементФормы.Вид <> ВидПоляФормы.ПолеНадписи) + ИЛИ ТипЗнч(ЭлементФормы) = Тип("ТаблицаФормы") Тогда + РазложенныйПутьКДанным = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ЭлементФормы.ПутьКДанным, "."); + Если РазложенныйПутьКДанным.Количество() = 2 И РазложенныйПутьКДанным[1] = ИмяРеквизита Тогда + МассивСвязанныхЭлементов.Добавить(ЭлементФормы.Имя); + КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/ЗапретРедактированияРеквизитовОбъектов.mdo b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/ЗапретРедактированияРеквизитовОбъектов.mdo new file mode 100644 index 000000000..627f9e655 --- /dev/null +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/ЗапретРедактированияРеквизитовОбъектов.mdo @@ -0,0 +1,10 @@ + + + ЗапретРедактированияРеквизитовОбъектов + + ru + Запрет редактирования реквизитов объектов + + true + true + diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl new file mode 100644 index 000000000..2b4a66ce4 --- /dev/null +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl @@ -0,0 +1,149 @@ +// Модуль содержит экспортную функцию РазрешитьРедактированиеРеквизитовОбъекта, +// которая умеет разрешать редактирование элементов формы, связанных с заблокированными +// подсистемой реквизитами, а так же формирует запись в реквизите формы +// __ПараметрыЗапретаРедактирования позволяющую запись объекта с изменившимися +// реквизитами. +// +// __ПараметрыЗапретаРедактирования представляет из себя соответствие, ключем +// в котором выступает наименование реквизита объекта. Значение - структура +// с ключами: +// БлокируемыеЭлементы - Массив - массив, строк - имен блокируемых элементов формы +// Представление - строка - представление поля на форме (заголовок поля или другое представление) +// РазрешитьИзменение - булево - изменение реквизита объекта разрешено +// + +// Функция реализующая взаимодействие с пользователем +// +Функция РазрешитьРедактированиеРеквизитовОбъекта(Форма) Экспорт + + СинонимыРеквизитов = Новый Массив; + + Для Каждого ОписаниеБлокируемогоРеквизита Из Форма.__ПараметрыЗапретаРедактирования Цикл + СинонимыРеквизитов.Добавить(ОписаниеБлокируемогоРеквизита.Представление); + КонецЦикла; + + МассивСсылок = Новый Массив; + + МассивСсылок.Добавить(Форма.Объект.Ссылка); + + Результат = ПроверитьСсылкиНаОбъект(МассивСсылок, СинонимыРеквизитов); + + Если Результат Тогда + Для Каждого ОписаниеБлокируемогоРеквизита Из Форма.__ПараметрыЗапретаРедактирования Цикл + ОписаниеБлокируемогоРеквизита.РазрешитьИзменение = Истина; + КонецЦикла; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Спрашивает у пользователя подтверждение на разрешение редактирования реквизитов +// и проверяет есть ли ссылки на объект в информационной базе +// +Функция ПроверитьСсылкиНаОбъект(МассивСсылок, СинонимыРеквизитов) Экспорт + + Результат = Ложь; + + ЗаголовокДиалога = НСтр("ru = 'Редактирование реквизитов объекта'"); + + РеквизитыПредставление = ""; + + Для Каждого СинонимРеквизита Из СинонимыРеквизитов Цикл + РеквизитыПредставление = РеквизитыПредставление + """" + СинонимРеквизита + """, "; + КонецЦикла; + + РеквизитыПредставление = Лев(РеквизитыПредставление, СтрДлина(РеквизитыПредставление)-2); + + Если СинонимыРеквизитов.Количество() > 1 Тогда + ТекстВопроса = НСтр("ru = 'Внимание!!! + |Вы собираетесь редактировать реквизиты %1. + |Изменение этих реквизитов может привести к рассогласованию данных информационной базы.'"); + Иначе + ТекстВопроса = НСтр("ru = 'Внимание!!! + |Вы собираетесь редактировать реквизит %1. + |Изменение этого реквизита может привести к рассогласованию данных информационной базы.'"); + КонецЕсли; + + Если МассивСсылок.Количество() = 1 Тогда + ТекстВопроса = ТекстВопроса + НСтр("ru = ' + |Настоятельно рекомендуется предварительно проверить все случаи использования ссылок на данный объект и оценить последствия изменений. + |Продолжить с проверкой наличия ссылок на этот объект?'"); + Иначе + ЧислоОбъектов = Строка(МассивСсылок.Количество()); + Склонение = ? (Прав(ЧислоОбъектов,1) = "1", НСтр("ru = 'объекта'"), НСтр("ru = 'объектов'")); + ТекстВопроса = ТекстВопроса + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = ' + |Вы уверены, что хотите разрешить редактирование реквизитов для %1 %2?'"), + ЧислоОбъектов, Склонение); + КонецЕсли; + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, РеквизитыПредставление); + + РезультатВыбора = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, ЗаголовокДиалога); + + Если РезультатВыбора = КодВозвратаДиалога.Да Тогда + + Если МассивСсылок.Количество() = 1 Тогда + Если ЗапретРедактированияРеквизитовОбъектов.ПроверитьНаОбъектыИмеютсяСсылкиВИБ(МассивСсылок) Тогда + ТекстСообщения = НСтр("ru = 'Внимание! В информационной базе существуют ссылки на редактируемый объект. + |Разрешить редактирование реквизитов объекта?'"); + + РезультатВыбораПослеПоиска = Вопрос(ТекстСообщения, + РежимДиалогаВопрос.ДаНет, , + КодВозвратаДиалога.Да, + ЗаголовокДиалога); + Если РезультатВыбораПослеПоиска = КодВозвратаДиалога.Да Тогда + Результат = Истина; + КонецЕсли; + + Иначе + ТекстСообщения = НСтр("ru = 'В информационной базе не найдены ссылки на редактируемый объект. Редактирование реквизитов объекта разрешено.'"); + Предупреждение(ТекстСообщения,, ЗаголовокДиалога); + Результат = Истина; + КонецЕсли; + + Иначе + Результат = Истина; + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Устанавливает доступность элементов формы соответствующих реквизитам объекта. +// Если все реквизиты объекта разрешены для редактирования так же +// делает кнопку разрешения редактирования недоступной. +// Параметры +// Форма - УправляемаяФорма - форма, в которой требуется разрешить +// редактирование реквизитов объекта +// Реквизиты - Массив - реквизиты, редактирование которых разрешено +// +Процедура УстановитьДоступностьЭлементовФормы(Форма, знач Реквизиты = Неопределено) Экспорт + + Если Реквизиты <> Неопределено Тогда + Для Каждого Реквизит Из Реквизиты Цикл + Форма.__ПараметрыЗапретаРедактирования.НайтиСтроки(Новый Структура("ИмяРеквизита", Реквизит))[0].РазрешитьИзменение = Истина; + КонецЦикла; + КонецЕсли; + + Для Каждого ОписаниеБлокируемогоРеквизита Из Форма.__ПараметрыЗапретаРедактирования Цикл + Если ОписаниеБлокируемогоРеквизита.РазрешитьИзменение Тогда + Для Каждого БлокируемыйЭлементФормы Из ОписаниеБлокируемогоРеквизита.БлокируемыеЭлементы Цикл + ЭлементФормы = Форма.Элементы.Найти(БлокируемыйЭлементФормы.Значение); + Если ЭлементФормы <> Неопределено Тогда + Если ТипЗнч(ЭлементФормы) = Тип("ПолеФормы") + ИЛИ ТипЗнч(ЭлементФормы) = Тип("ТаблицаФормы") Тогда + ЭлементФормы.ТолькоПросмотр = Ложь; + Иначе + ЭлементФормы.Доступность = Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/ЗапретРедактированияРеквизитовОбъектовКлиент.mdo b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/ЗапретРедактированияРеквизитовОбъектовКлиент.mdo new file mode 100644 index 000000000..d3d31c428 --- /dev/null +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/ЗапретРедактированияРеквизитовОбъектовКлиент.mdo @@ -0,0 +1,10 @@ + + + ЗапретРедактированияРеквизитовОбъектовКлиент + + ru + Запрет редактирования реквизитов объектов клиент + + true + true + diff --git a/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl b/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl new file mode 100644 index 000000000..f32300692 --- /dev/null +++ b/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl @@ -0,0 +1,330 @@ +//////////////////////////////////////////////////////////////////////////////// +// ФУНЦИИ БИБЛИОТЕКИ + +// Функция возвращает массив дат, которые отличается указанной даты на количество дней, +// входящих в указанный график +// +// Параметры +// Календарь - календарь, который необходимо использовать, тип СправочникСсылка.Календари +// ДатаОт - дата, от которой нужно рассчитать количество дней, тип Дата +// МассивДней - массив с количеством дней, на которые нужно увеличить дату начала, тип Массив,Число +// РассчитыватьСледующуюДатуОтПредыдущей - нужно ли рассчитывать следующую дату от предыдущей или +// все даты рассчитываются от переданной даты +// +// Возвращаемое значение +// Массив - массив дат, увеличенных на количество дней, входящих в график +// +Функция ПолучитьМассивДатПоКалендарю(Знач Календарь, Знач ДатаОт, Знач МассивДней, Знач РассчитыватьСледующуюДатуОтПредыдущей = Ложь) Экспорт + + ДатаОт = НачалоДня(ДатаОт); + + ТаблицаДат = Новый ТаблицаЗначений; + ТаблицаДат.Колонки.Добавить("ИндексСтроки", Новый ОписаниеТипов("Число")); + ТаблицаДат.Колонки.Добавить("КоличествоДней", Новый ОписаниеТипов("Число")); + + КоличествоДней = 0; + НомерСтроки = 0; + Для Каждого СтрокаДней Из МассивДней Цикл + КоличествоДней = КоличествоДней + СтрокаДней; + + Строка = ТаблицаДат.Добавить(); + Строка.ИндексСтроки = НомерСтроки; + Если РассчитыватьСледующуюДатуОтПредыдущей Тогда + Строка.КоличествоДней = КоличествоДней; + Иначе + Строка.КоличествоДней = СтрокаДней; + КонецЕсли; + + НомерСтроки = НомерСтроки + 1; + КонецЦикла; + + Запрос = Новый Запрос; + + Запрос.УстановитьПараметр("Календарь", Календарь); + Запрос.УстановитьПараметр("ДатаОт", ДатаОт); + Запрос.УстановитьПараметр("Таблица", ТаблицаДат); + + // Алгоритм работает следующим образом: + // Получаем для ДатаОт каким днем с начала года эта дата является + // К этому дню прибавляем количество дней с начала года, которое должно быть у конечной даты + // Получаем максимальный номер дня в году для этого года + // Проверяем, не превышает ли полученное число количество дней + // Если превышает, используем следующий год, если нет, то текущий + // Ищем, минимальную дату, которая соответствует нужному нам дню в году + + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + Запрос.Текст = + "ВЫБРАТЬ + | ТаблицаДат.ИндексСтроки, + | ТаблицаДат.КоличествоДней + |ПОМЕСТИТЬ ВТ_ТаблицаДат + |ИЗ + | &Таблица КАК ТаблицаДат + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | МАКСИМУМ(ГрафикЗаГод.КоличествоДнейВГрафикеСНачалаГода) КАК КоличествоДнейВсего + |ПОМЕСТИТЬ ВТ_КоличествоРабочихДнейВГоду + |ИЗ + | РегистрСведений.КалендарныеГрафики КАК ГрафикЗаГод + |ГДЕ + | ГрафикЗаГод.Календарь = &Календарь + | И ГрафикЗаГод.Год = ГОД(&ДатаОт) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ГрафикЗаГод.Год, + | ГрафикЗаГод.КоличествоДнейВГрафикеСНачалаГода КАК КоличествоДнейВГрафикеСНачалаГода, + | КоличествоРабочихДнейВГоду.КоличествоДнейВсего + |ПОМЕСТИТЬ ВТ_КалендарныйГрафик + |ИЗ + | РегистрСведений.КалендарныеГрафики КАК ГрафикЗаГод + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_КоличествоРабочихДнейВГоду КАК КоличествоРабочихДнейВГоду + | ПО (ГрафикЗаГод.Календарь = &Календарь) + | И (ГрафикЗаГод.ДатаГрафика = &ДатаОт) + | + |ИНДЕКСИРОВАТЬ ПО + | КоличествоДнейВГрафикеСНачалаГода + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | КалендарныйГрафик.ИндексСтроки, + | КалендарныйГрафик.КоличествоДней, + | ЕСТЬNULL(КалендарныйГрафик.ДатаПоКалендарю, НЕОПРЕДЕЛЕНО) КАК ДатаПоКалендарю + |ИЗ + | (ВЫБРАТЬ + | ГрафикЗаГодДатаОт.ИндексСтроки КАК ИндексСтроки, + | ГрафикЗаГодДатаОт.КоличествоДней КАК КоличествоДней, + | МИНИМУМ(ГрафикЗаГод.ДатаГрафика) КАК ДатаПоКалендарю + | ИЗ + | (ВЫБРАТЬ + | ТаблицаДат.ИндексСтроки КАК ИндексСтроки, + | ТаблицаДат.КоличествоДней КАК КоличествоДней, + | ВЫБОР + | КОГДА КалендарныйГрафик.КоличествоДнейВсего ЕСТЬ NULL + | ИЛИ КалендарныйГрафик.КоличествоДнейВсего >= КалендарныйГрафик.КоличествоДнейВГрафикеСНачалаГода + ТаблицаДат.КоличествоДней + | ТОГДА ГОД(&ДатаОт) + | ИНАЧЕ ГОД(&ДатаОт) + 1 + | КОНЕЦ КАК ГодДатыОкончания, + | КалендарныйГрафик.КоличествоДнейВГрафикеСНачалаГода + ТаблицаДат.КоличествоДней - ВЫБОР + | КОГДА КалендарныйГрафик.КоличествоДнейВсего < КалендарныйГрафик.КоличествоДнейВГрафикеСНачалаГода + ТаблицаДат.КоличествоДней + | ТОГДА КалендарныйГрафик.КоличествоДнейВсего + | ИНАЧЕ 0 + | КОНЕЦ КАК КоличествоДнейДляДатыПо + | ИЗ + | ВТ_ТаблицаДат КАК ТаблицаДат + | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_КалендарныйГрафик КАК КалендарныйГрафик + | ПО (ИСТИНА)) КАК ГрафикЗаГодДатаОт + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КалендарныеГрафики КАК ГрафикЗаГод + | ПО (ГрафикЗаГод.Календарь = &Календарь) + | И ГрафикЗаГодДатаОт.КоличествоДнейДляДатыПо = ГрафикЗаГод.КоличествоДнейВГрафикеСНачалаГода + | И ГрафикЗаГодДатаОт.ГодДатыОкончания = ГрафикЗаГод.Год + | + | СГРУППИРОВАТЬ ПО + | ГрафикЗаГодДатаОт.ИндексСтроки, + | ГрафикЗаГодДатаОт.КоличествоДней) КАК КалендарныйГрафик + | + |УПОРЯДОЧИТЬ ПО + | КалендарныйГрафик.ИндексСтроки"; + Выборка = Запрос.Выполнить().Выбрать(); + + МассивДат = Новый Массив; + + Пока Выборка.Следующий() Цикл + Если Выборка.ДатаПоКалендарю = Неопределено Тогда + СообщениеОбОшибке = НСтр("ru = 'В календаре ''%1'' с даты %2 нет указанного количества рабочих дней!'"); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + СообщениеОбОшибке, + Календарь, Формат(ДатаОт, "ДЛФ=D")); + КонецЕсли; + + МассивДат.Добавить(Выборка.ДатаПоКалендарю); + КонецЦикла; + + Возврат МассивДат; + +КонецФункции + +// Функция возвращает дату, которая отличается указанной даты на количество дней, +// входящих в указанный график +// +// Параметры +// Календарь - календарь, который необходимо использовать, тип СправочникСсылка.Календари +// ДатаОт - дата, от которой нужно рассчитать количество дней, тип Дата +// КоличествоДней - количество дней, на которые нужно увеличить дату начала, тип Число +// +// Возвращаемое значение +// Дата - дата, увеличенная на количество дней, входящих в график +// +Функция ПолучитьДатуПоКалендарю(Знач Календарь, Знач ДатаОт, Знач КоличествоДней) Экспорт + + ДатаОт = НачалоДня(ДатаОт); + + Если КоличествоДней = 0 Тогда + Возврат ДатаОт; + КонецЕсли; + + МассивДней = Новый Массив; + МассивДней.Добавить(КоличествоДней); + + МассивДат = ПолучитьМассивДатПоКалендарю(Календарь, ДатаОт, МассивДней); + + Возврат МассивДат[0]; + +КонецФункции + +// Функция определяет количество дней, входящих в календарь, для указанного периода +// +// Параметры +// Календарь - календарь, который необходимо использовать, тип СправочникСсылка.Календари +// ДатаНачала - дата начала периода +// ДатаОкончания - дата окончания периода +// +// Возвращаемое значение +// Массив - массив дат, увеличенных на количество дней, входящих в график +// +Функция ПолучитьРазностьДатПоКалендарю(Знач Календарь, Знач ДатаНачала, Знач ДатаОкончания) Экспорт + + ДатаНачала = НачалоДня(ДатаНачала); + ДатаОкончания = НачалоДня(ДатаОкончания); + + Если ДатаНачала = ДатаОкончания Тогда + Возврат 0; + КонецЕсли; + + РазныеГода = Год(ДатаНачала) <> Год(ДатаОкончания); + + Запрос = Новый Запрос; + + МассивДатНачала = Новый Массив; + МассивДатНачала.Добавить(ДатаНачала); + Если РазныеГода Тогда + МассивДатНачала.Добавить(НачалоДня(КонецГода(ДатаНачала))); + КонецЕсли; + + Запрос.УстановитьПараметр("Календарь", Календарь); + Запрос.УстановитьПараметр("МассивДатНачала", МассивДатНачала); + Запрос.УстановитьПараметр("ГодДатыНачала", Год(ДатаНачала)); + + Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); + Запрос.УстановитьПараметр("ГодДатыОкончания", Год(ДатаОкончания)); + + Запрос.Текст = + "ВЫБРАТЬ + | КалендарныеГрафики.КоличествоДнейВГрафикеСНачалаГода КАК КоличествоДней, + | КалендарныеГрафики.ДатаГрафика КАК ДатаГрафика + |ИЗ + | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики + |ГДЕ + | КалендарныеГрафики.Календарь = &Календарь + | И (КалендарныеГрафики.Год = &ГодДатыНачала + | И КалендарныеГрафики.ДатаГрафика В (&МассивДатНачала) + | ИЛИ КалендарныеГрафики.Год = &ГодДатыОкончания + | И КалендарныеГрафики.ДатаГрафика = &ДатаОкончания) + | + |УПОРЯДОЧИТЬ ПО + | ДатаГрафика"; + ТаблицаДней = Запрос.Выполнить().Выгрузить(); + + Если ТаблицаДней.Количество() < ?(РазныеГода, 3, 2) Тогда + СообщениеОбОшибке = НСтр("ru = 'Не заполнен календарь ''%1'' за период %2!'"); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + СообщениеОбОшибке, + Календарь, ПредставлениеПериода(ДатаНачала, КонецДня(ДатаОкончания))); + КонецЕсли; + + КоличествоДнейДатыНачала = ТаблицаДней[0].КоличествоДней; + КоличествоДнейДатыОкончания = ТаблицаДней[?(РазныеГода, 2, 1)].КоличествоДней + ?(РазныеГода, ТаблицаДней[1].КоличествоДней, 0); + + Возврат КоличествоДнейДатыОкончания - КоличествоДнейДатыНачала; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ОБНОВЛЕНИЕ ИНФОРМАЦИОННОЙ БАЗЫ + +// Процедура создает в справочнике Календари календарь, соответствующий производственному +// календарю Российской Федерации на 2010 год, если в справочнике нет ни одного календаря +// +Процедура СоздатьПроизводственныйКалендарьНа2010Год() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | Календари.Ссылка + |ИЗ + | Справочник.Календари КАК Календари"; + Результат = Запрос.Выполнить(); + + Если Не Результат.Пустой() Тогда + Возврат; + КонецЕсли; + + ПроизводственныйКалендарь = Справочники.Календари.СоздатьЭлемент(); + ПроизводственныйКалендарь.Наименование = "Производственный календарь"; + ПроизводственныйКалендарь.Записать(); + + // Записываем данные за 2010 год + + РабочиеДни = Новый Массив; + ПраздничныеДни = Новый Массив; + + // праздники РФ + ПраздничныеДни.Добавить(Дата(2010, 1, 1)); + ПраздничныеДни.Добавить(Дата(2010, 1, 2)); + ПраздничныеДни.Добавить(Дата(2010, 1, 3)); + ПраздничныеДни.Добавить(Дата(2010, 1, 4)); + ПраздничныеДни.Добавить(Дата(2010, 1, 5)); + ПраздничныеДни.Добавить(Дата(2010, 1, 7)); + ПраздничныеДни.Добавить(Дата(2010, 2, 23)); + ПраздничныеДни.Добавить(Дата(2010, 3, 8)); + ПраздничныеДни.Добавить(Дата(2010, 5, 1)); + ПраздничныеДни.Добавить(Дата(2010, 5, 9)); + ПраздничныеДни.Добавить(Дата(2010, 6, 12)); + ПраздничныеДни.Добавить(Дата(2010, 11, 4)); + + // Переносы праздников с выходных дней + ПраздничныеДни.Добавить(Дата(2010, 1, 6)); + ПраздничныеДни.Добавить(Дата(2010, 1, 8)); + ПраздничныеДни.Добавить(Дата(2010, 2, 22)); + РабочиеДни.Добавить(Дата(2010, 2, 27)); + ПраздничныеДни.Добавить(Дата(2010, 5, 3)); + ПраздничныеДни.Добавить(Дата(2010, 5, 10)); + ПраздничныеДни.Добавить(Дата(2010, 6, 14)); + ПраздничныеДни.Добавить(Дата(2010, 11, 5)); + РабочиеДни.Добавить(Дата(2010, 11, 7)); + + НомерГода = 2010; + + НаборЗаписей = РегистрыСведений.КалендарныеГрафики.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Календарь.Установить(ПроизводственныйКалендарь.Ссылка); + НаборЗаписей.Отбор.Год.Установить(НомерГода); + + КоличествоРабочихДнейСНачалаГода = 0; + + Для НомерМесяца = 1 По 12 Цикл + Для НомерДня = 1 По День(КонецМесяца(Дата(НомерГода, НомерМесяца, 1))) Цикл + ДатаГрафика = Дата(НомерГода, НомерМесяца, НомерДня); + + ДеньВключенВГрафик = ПраздничныеДни.Найти(ДатаГрафика) = Неопределено + И (РабочиеДни.Найти(ДатаГрафика) <> Неопределено ИЛИ ДеньНедели(ДатаГрафика) <= 5); + + Если ДеньВключенВГрафик Тогда + КоличествоРабочихДнейСНачалаГода = КоличествоРабочихДнейСНачалаГода + 1; + КонецЕсли; + + Строка = НаборЗаписей.Добавить(); + Строка.Календарь = ПроизводственныйКалендарь.Ссылка; + Строка.Год = НомерГода; + Строка.ДатаГрафика = ДатаГрафика; + Строка.ДеньВключенВГрафик = ДеньВключенВГрафик; + Строка.КоличествоДнейВГрафикеСНачалаГода = КоличествоРабочихДнейСНачалаГода; + КонецЦикла; + КонецЦикла; + + НаборЗаписей.Записать(Истина); + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonModules/КалендарныеГрафики/КалендарныеГрафики.mdo b/SSL/src/CommonModules/КалендарныеГрафики/КалендарныеГрафики.mdo new file mode 100644 index 000000000..ed0108abb --- /dev/null +++ b/SSL/src/CommonModules/КалендарныеГрафики/КалендарныеГрафики.mdo @@ -0,0 +1,10 @@ + + + КалендарныеГрафики + + ru + Календарные графики + + true + true + diff --git a/SSL/src/CommonModules/КомандыРаботыСФайлами/Module.bsl b/SSL/src/CommonModules/КомандыРаботыСФайлами/Module.bsl new file mode 100644 index 000000000..a6a40ab72 --- /dev/null +++ b/SSL/src/CommonModules/КомандыРаботыСФайлами/Module.bsl @@ -0,0 +1,337 @@ +// Сохраняет отредактированный файл в ИБ и снимает с него блокировку +Процедура ЗакончитьРедактирование( + ПараметрКоманды, + ИдентификаторФормы, + Знач ХранитьВерсии = Неопределено, + Знач РедактируетТекущийПользователь = Неопределено, + Знач Редактирует = Неопределено, + Знач АвторТекущейВерсии = Неопределено) Экспорт + + Если ПараметрКоманды = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда + + МассивОбработанных = РаботаСФайламиКлиент.ЗакончитьРедактированиеПоСсылкам( + ПараметрКоманды, + ИдентификаторФормы); + + Для Каждого ФайлСсылка Из МассивОбработанных Цикл + ОповеститьОбИзменении(ФайлСсылка); + Оповестить("ДанныеФайлаИзменены", ФайлСсылка); + Оповестить("ВерсияСохранена", ФайлСсылка); + КонецЦикла; + + Иначе + + РедактированиеЗакончено = Ложь; + + РедактированиеЗакончено = РаботаСФайламиКлиент.ЗакончитьРедактирование( + ПараметрКоманды, + ИдентификаторФормы, + ХранитьВерсии, + РедактируетТекущийПользователь, + Редактирует, + АвторТекущейВерсии, + ""); + + Если РедактированиеЗакончено Тогда + Оповестить("ЗаконченоРедактирование", ПараметрКоманды); + ОповеститьОбИзменении(ПараметрКоманды); + Оповестить("ДанныеФайлаИзменены", ПараметрКоманды); + Оповестить("ВерсияСохранена", ПараметрКоманды); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Блокирует файл для редактирования и открывает его +Процедура Редактировать(ОбъектСсылка, УникальныйИдентификатор = Неопределено, РабочийКаталогВладельца = Неопределено) Экспорт + + Если ОбъектСсылка = Неопределено Тогда + Возврат; + КонецЕсли; + + РаботаСФайламиКлиент.РедактироватьФайлПоСсылке(ОбъектСсылка, УникальныйИдентификатор, РабочийКаталогВладельца); + ОповеститьОбИзменении(ОбъектСсылка); + Оповестить("ДанныеФайлаИзменены", ОбъектСсылка); + Оповестить("ФайлРедактировался", ОбъектСсылка); + +КонецПроцедуры + +// Выполняет блокировку файла или нескольких файлов +// ПараметрКоманды - либо ссылка на файл, либо массив ссылок на файлы +Процедура Занять(ПараметрКоманды, УникальныйИдентификатор = Неопределено) Экспорт + + Если ПараметрКоманды = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда + + РаботаСФайламиКлиент.ЗанятьФайлыПоСсылкам(ПараметрКоманды); + + Для Каждого ФайлСсылка Из ПараметрКоманды Цикл + ОповеститьОбИзменении(ФайлСсылка); + Оповестить("ДанныеФайлаИзменены", ФайлСсылка); + КонецЦикла; + + Иначе + + РаботаСФайламиКлиент.ЗанятьФайлПоСсылке(ПараметрКоманды, УникальныйИдентификатор); + ОповеститьОбИзменении(ПараметрКоманды); + Оповестить("ДанныеФайлаИзменены", ПараметрКоманды); + + КонецЕсли; + +КонецПроцедуры + +// Освобождает занятый ранее файл +Процедура ОсвободитьФайл( + ПараметрКоманды, + Знач ХранитьВерсии = Неопределено, + Знач РедактируетТекущийПользователь = Неопределено, + Знач Редактирует = Неопределено, + УникальныйИдентификатор = Неопределено) Экспорт + + Если ПараметрКоманды = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда + + РаботаСФайламиКлиент.ОсвободитьФайлыПоСсылкам(ПараметрКоманды); + + Для Каждого ФайлСсылка Из ПараметрКоманды Цикл + ОповеститьОбИзменении(ФайлСсылка); + Оповестить("ДанныеФайлаИзменены", ФайлСсылка); + КонецЦикла; + + Иначе + + РаботаСФайламиКлиент.ОсвободитьФайл( + ПараметрКоманды, + ХранитьВерсии, + РедактируетТекущийПользователь, + Редактирует, + УникальныйИдентификатор); + + ОповеститьОбИзменении(ПараметрКоманды); + Оповестить("ДанныеФайлаИзменены", ПараметрКоманды); + + КонецЕсли; + +КонецПроцедуры + +// Открывает файл для просмотра +Процедура Открыть(ДанныеФайла) Экспорт + + РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла); + Оповестить("ФайлОткрыт", ДанныеФайла.Ссылка); + +КонецПроцедуры + +// Сохраняет файл в информационной базе, но не освобождает его +Процедура ОпубликоватьФайл(ПараметрКоманды, ИдентификаторФормы) Экспорт + + Если ПараметрКоманды = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда + + РаботаСФайламиКлиент.ОпубликоватьФайлыПоСсылкам(ПараметрКоманды, ИдентификаторФормы); + + Для Каждого ФайлСсылка Из ПараметрКоманды Цикл + Оповестить("ДанныеФайлаИзменены", ФайлСсылка); + Оповестить("ВерсияСохранена", ФайлСсылка); + КонецЦикла; + + Иначе + + РаботаСФайламиКлиент.ОпубликоватьФайл(ПараметрКоманды, ИдентификаторФормы); + + Оповестить("ДанныеФайлаИзменены", ПараметрКоманды); + Оповестить("ВерсияСохранена", ПараметрКоманды); + + КонецЕсли; + +КонецПроцедуры + +// Открывает каталог на локальном компьютере в котором размещен этот файл +Процедура ОткрытьКаталогФайла(ДанныеФайла) Экспорт + + РаботаСФайламиКлиент.КаталогФайла(ДанныеФайла); + +КонецПроцедуры + +// Сохраняет текущую версию файла в выбранный каталог на жестком или сетевом диске +Процедура СохранитьКак(ДанныеФайла) Экспорт + + РаботаСФайламиКлиент.СохранитьКак(ДанныеФайла); + +КонецПроцедуры + +// Выбирает на диске файл и создает из него новую версию +Процедура ОбновитьИзФайлаНаДиске(ДанныеФайла, ИдентификаторФормы) Экспорт + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если РасширениеПодключено Тогда + + РаботаСФайламиКлиент.ОбновитьИзФайлаНаДиске(ДанныеФайла, ИдентификаторФормы); + ОповеститьОбИзменении(ДанныеФайла.Ссылка); + Оповестить("ДанныеФайлаИзменены", ДанныеФайла.Ссылка); + Оповестить("ВерсияСохранена", ДанныеФайла.Ссылка); + + Иначе + Предупреждение(НСтр("ru = 'Для выполнения данной операции вам нужно установить расширение работы с файлами.'")); + КонецЕсли; + +КонецПроцедуры + +// Формирует электронно-цифровую подпись +Функция СформироватьПодписьФайла(ДанныеФайла, ДанныеДляЗанесенияВРегистр) Экспорт + + Если НЕ ДанныеФайла.Редактирует.Пустая() Тогда + Предупреждение(НСтр("ru = 'Нельзя подписать занятый файл.'")); + Возврат Ложь; + КонецЕсли; + + Если ДанныеФайла.Зашифрован Тогда + Предупреждение(НСтр("ru = 'Зашифрованный файл нельзя подписывать.'")); + Возврат Ложь; + КонецЕсли; + + РасширениеПодключеноКрипто = ПодключитьРасширениеРаботыСКриптографией(); + + ДляШифрования = Ложь; + МассивСтруктурСертификатов = ЭлектронноЦифроваяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(ДляШифрования); + ПараметрыФормы = Новый Структура("МассивСтруктурСертификатов, ОбъектСсылка", МассивСтруктурСертификатов, ДанныеФайла.Ссылка); + + СтруктураПараметровПодписи = ОткрытьФормуМодально("ОбщаяФорма.ВыборСертификатаЭЦПДляПодписи", ПараметрыФормы); + + Если ТипЗнч(СтруктураПараметровПодписи) = Тип("Структура") Тогда + + ВерсияАлгоритмаГенерацииФайла = 0; + + СтруктураВозврата = РаботаСФайлами.ПолучитьДанныеФайлаИДвоичныеДанные(ДанныеФайла.Ссылка); + + МенеджерКриптографии = ЭлектронноЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + + ДанныеДляЗанесенияВРегистр = ЭлектронноЦифроваяПодписьКлиент.СформироватьПодпись( + МенеджерКриптографии, ДанныеФайла.Ссылка, + СтруктураВозврата.ДвоичныеДанные, СтруктураПараметровПодписи, ВерсияАлгоритмаГенерацииФайла); + + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Зашифровать файл +Функция Зашифровать(ДанныеФайла, УникальныйИдентификатор, + МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, МассивАдресов) Экспорт + + Если ДанныеФайла.Зашифрован Тогда + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" уже зашифрован.'"), Строка(ДанныеФайла.Ссылка)); + Предупреждение(Текст); + Возврат Ложь; + КонецЕсли; + + Если НЕ ДанныеФайла.Редактирует.Пустая() Тогда + Предупреждение(НСтр("ru = 'Нельзя зашифровать занятый файл.'")); + Возврат Ложь; + КонецЕсли; + + РасширениеПодключеноФайл = ПодключитьРасширениеРаботыСФайлами(); + РасширениеПодключеноКрипто = ПодключитьРасширениеРаботыСКриптографией(); + + ДляШифрования = Истина; + МассивСтруктурСертификатов = ЭлектронноЦифроваяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(ДляШифрования); + + ПараметрыФормы = Новый Структура("МассивСтруктурСертификатов, ОбъектСсылка", + МассивСтруктурСертификатов, ДанныеФайла.Ссылка); + СтруктураВозврата = ОткрытьФормуМодально("Справочник.Файлы.Форма.ФормаШифрования", ПараметрыФормы); + + Если ТипЗнч(СтруктураВозврата) = Тип("Массив") Тогда + + Возврат РаботаСФайламиКлиент.Зашифровать(ДанныеФайла.Ссылка, СтруктураВозврата, + УникальныйИдентификатор, ДанныеФайла, МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, МассивАдресов); + + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Расшифровать файл +Функция Расшифровать(ДанныеФайла, УникальныйИдентификатор, + МассивДанныхДляЗанесенияВБазу, МассивАдресов) Экспорт + + РасширениеПодключеноФайл = ПодключитьРасширениеРаботыСФайлами(); + РасширениеПодключеноКрипто = ПодключитьРасширениеРаботыСКриптографией(); + + Возврат РаботаСФайламиКлиент.Расшифровать(ДанныеФайла.Ссылка, УникальныйИдентификатор, + ДанныеФайла, МассивДанныхДляЗанесенияВБазу, МассивАдресов); + +КонецФункции + +// Добавить ЭЦП из файла +Функция ДобавитьЭЦПИзФайла(ДанныеФайла, УникальныйИдентификатор) Экспорт + ПараметрыФормы = Новый Структура; + МассивВозврата = ОткрытьФормуМодально("Справочник.Файлы.Форма.ФормаДобавленияПодписиИзФайла", ПараметрыФормы); + + Если ТипЗнч(МассивВозврата) = Тип("Массив") Тогда + + Если МассивВозврата.Количество() = 0 Тогда + Возврат Ложь; + КонецЕсли; + + РасширениеПодключеноФайл = ПодключитьРасширениеРаботыСФайлами(); + РасширениеПодключеноКрипто = ПодключитьРасширениеРаботыСКриптографией(); + + ЭлектронноЦифроваяПодписьКлиент.ДобавитьЭЦП(ДанныеФайла.Ссылка, МассивВозврата, + УникальныйИдентификатор, ДанныеФайла.Владелец); + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// СохранитьКак вместе с ЭЦП +Процедура СохранитьВместеСЭЦП(ДанныеФайла, УникальныйИдентификатор) Экспорт + + РасширениеПодключеноФайл = ПодключитьРасширениеРаботыСФайлами(); + РасширениеПодключеноКрипто = ПодключитьРасширениеРаботыСКриптографией(); + + ПолноеИмяФайла = РаботаСФайламиКлиент.СохранитьКак(ДанныеФайла); + Если ПолноеИмяФайла = "" Тогда + Возврат; // пользователь нажал Отмена или это веб клиент без расширения + КонецЕсли; + + Настройка = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ДействияПриСохраненииСЭЦП; + + Если Настройка = "Спрашивать" Тогда + + ПараметрыФормы = Новый Структура("Объект, УникальныйИдентификатор", ДанныеФайла.Ссылка, УникальныйИдентификатор); + МассивВозврата = ОткрытьФормуМодально("Справочник.Файлы.Форма.ФормаВыбораПодписей", ПараметрыФормы); + + Если ТипЗнч(МассивВозврата) = Тип("Массив") Тогда + + Если МассивВозврата.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ЭлектронноЦифроваяПодписьКлиент.СохранитьПодписи(ДанныеФайла.Ссылка, ПолноеИмяФайла, УникальныйИдентификатор, МассивВозврата); + КонецЕсли; + + ИначеЕсли Настройка = "СохранятьВсеПодписи" Тогда + ЭлектронноЦифроваяПодписьКлиент.СохранитьПодписи(ДанныеФайла.Ссылка, ПолноеИмяФайла, УникальныйИдентификатор); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/КомандыРаботыСФайлами/КомандыРаботыСФайлами.mdo b/SSL/src/CommonModules/КомандыРаботыСФайлами/КомандыРаботыСФайлами.mdo new file mode 100644 index 000000000..e8a6be631 --- /dev/null +++ b/SSL/src/CommonModules/КомандыРаботыСФайлами/КомандыРаботыСФайлами.mdo @@ -0,0 +1,10 @@ + + + КомандыРаботыСФайлами + + ru + Команды работы с файлами + + true + true + diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурации/Module.bsl b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурации/Module.bsl new file mode 100644 index 000000000..9749c9671 --- /dev/null +++ b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурации/Module.bsl @@ -0,0 +1,5 @@ +// Проверить, что информационная база была обновлена динамически. +// +Функция КонфигурацияБДБылаИзмененаДинамически() Экспорт + Возврат КонфигурацияБазыДанныхИзмененаДинамически(); +КонецФункции diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурации/КонтрольДинамическогоОбновленияКонфигурации.mdo b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурации/КонтрольДинамическогоОбновленияКонфигурации.mdo new file mode 100644 index 000000000..5a2a1f40d --- /dev/null +++ b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурации/КонтрольДинамическогоОбновленияКонфигурации.mdo @@ -0,0 +1,10 @@ + + + КонтрольДинамическогоОбновленияКонфигурации + + ru + Контроль динамического обновления конфигурации + + true + true + diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииГлобальный/Module.bsl b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииГлобальный/Module.bsl new file mode 100644 index 000000000..372eadca2 --- /dev/null +++ b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииГлобальный/Module.bsl @@ -0,0 +1,22 @@ +// Обработчик ожидания проверяет, что информационная база была обновлена динамически, и +// сообщает об этом пользователю. +// +Процедура ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ() Экспорт + + Если КонтрольДинамическогоОбновленияКонфигурации.КонфигурацияБДБылаИзмененаДинамически() Тогда + + ОтключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ"); + + ТекстСообщения = НСтр("ru = 'В конфигурацию информационной базы внесены изменения. + |Для дальнейшей работы рекомендуется перезапустить программу. + |Перезапустить?'"); + + Если Вопрос(ТекстСообщения, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда + ЗавершитьРаботуСистемы(Истина, Истина); + КонецЕсли; + + ПодключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ", 20 * 60); + + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииГлобальный/КонтрольДинамическогоОбновленияКонфигурацииГлобальный.mdo b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииГлобальный/КонтрольДинамическогоОбновленияКонфигурацииГлобальный.mdo new file mode 100644 index 000000000..6683996ac --- /dev/null +++ b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииГлобальный/КонтрольДинамическогоОбновленияКонфигурацииГлобальный.mdo @@ -0,0 +1,12 @@ + + + КонтрольДинамическогоОбновленияКонфигурацииГлобальный + + ru + Контроль динамического обновления конфигурации глобальный + + true + true + true + true + diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииКлиент/Module.bsl b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииКлиент/Module.bsl new file mode 100644 index 000000000..59a25b570 --- /dev/null +++ b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииКлиент/Module.bsl @@ -0,0 +1,7 @@ +// Обработчик события ПриНачалеРаботыСистемы вызывается +// для выполнения действий, требуемых для подсистемы +// КонтрольДинамическогоОбновленияКонфигурацииКлиент. +// +Процедура ПриНачалеРаботыСистемы() Экспорт + ПодключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ", 20 * 60); +КонецПроцедуры diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииКлиент/КонтрольДинамическогоОбновленияКонфигурацииКлиент.mdo b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииКлиент/КонтрольДинамическогоОбновленияКонфигурацииКлиент.mdo new file mode 100644 index 000000000..5dd79435a --- /dev/null +++ b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииКлиент/КонтрольДинамическогоОбновленияКонфигурацииКлиент.mdo @@ -0,0 +1,11 @@ + + + КонтрольДинамическогоОбновленияКонфигурацииКлиент + + ru + Контроль динамического обновления конфигурации клиент + + true + true + true + diff --git a/SSL/src/CommonModules/КонтрольЖурналаРегистрации/Module.bsl b/SSL/src/CommonModules/КонтрольЖурналаРегистрации/Module.bsl new file mode 100644 index 000000000..9c26025d8 --- /dev/null +++ b/SSL/src/CommonModules/КонтрольЖурналаРегистрации/Module.bsl @@ -0,0 +1,48 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИК РЕГЛАМЕНТНОГО ЗАДАНИЯ + +// Процедура - обработчик регламентного задания КонтрольОшибокВЖурналеРегистрации. +// +Процедура ОбработкаРегламентногоЗадания_КонтрольОшибокВЖурналеРегистрации() Экспорт + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Начат регламентный контроль ошибок и предупреждений в журнале регистрации'")); + + Попытка + Обработки.КонтрольЖурналаРегистрации.СформироватьОтчетПоОшибкамИПослатьОтчет(); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Завершен регламентный контроль ошибок и предупреждений в журнале регистрации'")); + Исключение + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Ошибка, , , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Во время регламентного контроля ошибок и предупреждений в журнале регистрации, произошла неизвестная ошибка. + |%1'"), ОписаниеОшибки())); + КонецПопытки; + +КонецПроцедуры + +Функция ПолучитьАдресатовПолученияОтчетаПоЖурналуРегистрации() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Возврат Константы.АдресатыПолученияОтчетаПоЖурналуРегистрации.Получить(); + +КонецФункции + +Процедура УстановитьАдресатовПолученияОтчетаПоЖурналуРегистрации(Адресаты) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Константы.АдресатыПолученияОтчетаПоЖурналуРегистрации.Установить(Адресаты); + +КонецПроцедуры + +Функция СобытиеЖурналаРегистрации() + + Возврат "Контроль журнала регистрации"; + +КонецФункции + diff --git a/SSL/src/CommonModules/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo b/SSL/src/CommonModules/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo new file mode 100644 index 000000000..948c33891 --- /dev/null +++ b/SSL/src/CommonModules/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo @@ -0,0 +1,10 @@ + + + КонтрольЖурналаРегистрации + + ru + Контроль журнала регистрации + + true + true + diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементов/Module.bsl b/SSL/src/CommonModules/НастройкаПорядкаЭлементов/Module.bsl new file mode 100644 index 000000000..3bfe4e09f --- /dev/null +++ b/SSL/src/CommonModules/НастройкаПорядкаЭлементов/Module.bsl @@ -0,0 +1,185 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Выполнить перемещение объекта вверх или вниз +// +// Параметры: +// Ссылка - Ссылка - Ссылка на перемещаемый элемент +// Направление - Число - Направление в котором перемещается элемент: -1 - вверх, +1 - вниз +// Отбор - ОтборКомпоновкиДанных - Отбор установленный в динамическом списке +// Отображение - ОтображениеТаблицы - Установленный список отображения динамического списка +// СтрОшибка - Строка - При возникновении ошибки возвращается описание +// +// +Функция ИзменитьПорядокЭлементов(Ссылка, УстановленныеОтборы, ОтображениеСписком, Вверх) Экспорт + + Информация = ПолучитьИнформациюДляПеремещенияОМетаданных(Ссылка); + + // Для иерархических справочников может быть установлен отбор по родителю, если нет, + // то способ отображения должен быть иерархический или в виде дерева + Если Информация.ЕстьРодитель И ОтображениеСписком И Не УстановленныеОтборы.ЕстьОтборПоРодителю Тогда + Возврат НСтр("ru = 'Перед перемещением необходимо установить отображение в виде дерева или иерархического списка!'"); + КонецЕсли; + + // Для подчиненных справочников должен быть установлен отбор по владельцу + Если Информация.ЕстьВладелец И НЕ УстановленныеОтборы.ЕстьОтборПоВладельцу Тогда + Возврат НСтр("ru = 'Перед перемещением необходимо установить отбор по владельцу!'"); + КонецЕсли; + + // Проверим, есть ли у выбранного объекта реквизит доп. упорядочивания + Если Информация.ЕстьГруппы Тогда + ЭтоГруппа = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Ссылка, "ЭтоГруппа"); + Если ЭтоГруппа И Не Информация.ДляГрупп Тогда + // Это группа, но для группа порядок не назначается + Возврат ""; + ИначеЕсли Не ЭтоГруппа И Не Информация.ДляЭлементов Тогда + // Это элемент, но для элементов порядок не назначается + Возврат ""; + КонецЕсли; + КонецЕсли; + + Запрос = Новый Запрос; + масУсловия = Новый Массив; + + // Добавим условие по родителю + Если Информация.ЕстьРодитель Тогда + масУсловия.Добавить("Таблица.Родитель = &Родитель"); + Запрос.УстановитьПараметр("Родитель", ОбщегоНазначения.ПолучитьЗначениеРеквизита(Ссылка, "Родитель")); + КонецЕсли; + + // Добавим условие по владельцу + Если Информация.ЕстьВладелец Тогда + масУсловия.Добавить("Таблица.Владелец = &Владелец"); + Запрос.УстановитьПараметр("Владелец", ОбщегоНазначения.ПолучитьЗначениеРеквизита(Ссылка, "Владелец")); + КонецЕсли; + + // Добавим условие на группу + Если Информация.ЕстьГруппы Тогда + Если Информация.ДляГрупп И Не Информация.ДляЭлементов Тогда + масУсловия.Добавить("Таблица.ЭтоГруппа"); + ИначеЕсли Не Информация.ДляГрупп И Информация.ДляЭлементов Тогда + масУсловия.Добавить("НЕ Таблица.ЭтоГруппа"); + КонецЕсли; + КонецЕсли; + + // Составим строку со всеми условиями + СтрУсловия = ""; + СтрДобавка = " + |ГДЕ + | "; + Для Каждого Условие Из масУсловия Цикл + СтрУсловия = СтрУсловия + СтрДобавка + Условие; + СтрДобавка = " + | И "; + КонецЦикла; + + // Составим текст запроса + ТекстЗапроса = + "ВЫБРАТЬ + | Таблица.Ссылка, + | Таблица.РеквизитДопУпорядочивания КАК ПорядокСтарый, + | Таблица.РеквизитДопУпорядочивания КАК ПорядокНовый + |ИЗ + | " + Ссылка.Метаданные().ПолноеИмя() + " КАК Таблица + |" + СтрУсловия + " + | + |УПОРЯДОЧИТЬ ПО + | РеквизитДопУпорядочивания"; + + + Запрос.Текст = ТекстЗапроса; + ТабЭлементы = Запрос.Выполнить().Выгрузить(); + + Стр1 = ТабЭлементы.Найти(Ссылка, "Ссылка"); + Если Стр1 = Неопределено Тогда + Возврат ""; + КонецЕсли; + + Смещение = ?(Вверх, -1, 1); + Индекс1 = ТабЭлементы.Индекс(Стр1); + Индекс2 = Индекс1 + Смещение; + Если (Индекс2 < 0) ИЛИ (Индекс2 >= ТабЭлементы.Количество()) Тогда + Возврат ""; + КонецЕсли; + Стр2 = ТабЭлементы[Индекс2]; + + Стр1.ПорядокНовый = Стр2.ПорядокСтарый; + Стр2.ПорядокНовый = Стр1.ПорядокСтарый; + + ТабЭлементы.Сдвинуть(Стр1, Смещение); + + предПорядок = 0; + + НачатьТранзакцию(); + + Попытка + + Для Каждого Стр Из ТабЭлементы Цикл + + Если предПорядок >= Стр.ПорядокНовый Тогда + Стр.ПорядокНовый = предПорядок + 1; + КонецЕсли; + + предПорядок = Стр.ПорядокНовый; + + Если Стр.ПорядокНовый <> Стр.ПорядокСтарый Тогда + Объект = Стр.Ссылка.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка); + Объект.РеквизитДопУпорядочивания = Стр.ПорядокНовый; + Объект.Записать(); + КонецЕсли; + + КонецЦикла; + + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Возврат ""; + +КонецФункции + +// Получить структуру с информацией о метаданных объекта +Функция ПолучитьИнформациюДляПеремещенияОМетаданных(Ссылка) Экспорт + + Информация = Новый Структура; + + МетаданныеОбъекта = Ссылка.Метаданные(); + МетаданныеРеквизита = МетаданныеОбъекта.Реквизиты.РеквизитДопУпорядочивания; + + Информация.Вставить("ПолноеИмя", МетаданныеОбъекта.ПолноеИмя()); + + ЭтоСправочник = Метаданные.Справочники.Содержит(МетаданныеОбъекта); + ЭтоПВХ = Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеОбъекта); + + Если ЭтоСправочник ИЛИ ЭтоПВХ Тогда + + Информация.Вставить("ЕстьГруппы", + МетаданныеОбъекта.Иерархический И + ?(ЭтоПВХ, Истина, МетаданныеОбъекта.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов)); + + Информация.Вставить("ДляГрупп", (МетаданныеРеквизита.Использование <> Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляЭлемента)); + Информация.Вставить("ДляЭлементов", (МетаданныеРеквизита.Использование <> Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппы)); + Информация.Вставить("ЕстьРодитель", МетаданныеОбъекта.Иерархический); + Информация.Вставить("ГруппыСверху", ?(НЕ Информация.ЕстьРодитель, Ложь, МетаданныеОбъекта.ГруппыСверху)); + Информация.Вставить("ЕстьВладелец", ?(ЭтоПВХ, Ложь, (МетаданныеОбъекта.Владельцы.Количество() <> 0))); + + Иначе + + Информация.Вставить("ЕстьГруппы", Ложь); + Информация.Вставить("ДляГрупп", Ложь); + Информация.Вставить("ДляЭлементов", Истина); + Информация.Вставить("ЕстьРодитель", Ложь); + Информация.Вставить("ЕстьВладелец", Ложь); + Информация.Вставить("ГруппыСверху", Ложь); + + КонецЕсли; + + Возврат Информация; + +КонецФункции + diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементов/НастройкаПорядкаЭлементов.mdo b/SSL/src/CommonModules/НастройкаПорядкаЭлементов/НастройкаПорядкаЭлементов.mdo new file mode 100644 index 000000000..3c3a579aa --- /dev/null +++ b/SSL/src/CommonModules/НастройкаПорядкаЭлементов/НастройкаПорядкаЭлементов.mdo @@ -0,0 +1,10 @@ + + + НастройкаПорядкаЭлементов + + ru + Настройка порядка элементов + + true + true + diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/Module.bsl b/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/Module.bsl new file mode 100644 index 000000000..f65751891 --- /dev/null +++ b/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/Module.bsl @@ -0,0 +1,149 @@ + + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Обработчик команды "Переместить вверх" формы списка +Процедура ПереместитьЭлементВверхВыполнить(СписокРеквизит, СписокЭлемент) Экспорт + + ПереместитьЭлементВыполнить(СписокРеквизит, СписокЭлемент, Истина); + +КонецПроцедуры + +// Обработчик команды "Переместить вниз" формы списка +Процедура ПереместитьЭлементВнизВыполнить(СписокРеквизит, СписокЭлемент) Экспорт + + ПереместитьЭлементВыполнить(СписокРеквизит, СписокЭлемент, Ложь); + +КонецПроцедуры + + + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Выполнить операцию перемещения или восстановления порядка +Процедура ПереместитьЭлементВыполнить(СписокРеквизит, СписокЭлемент, Вверх) + + УстановленныеОтборы = Новый Структура; + + Если Не ПроверитьСписокПередОперацией(СписокРеквизит, СписокЭлемент, УстановленныеОтборы) Тогда + Возврат; + КонецЕсли; + + Ссылка = СписокЭлемент.ТекущаяСтрока; + ОтображениеСписком = (СписокЭлемент.Отображение = ОтображениеТаблицы.Список); + + СтрОшибка = НастройкаПорядкаЭлементов.ИзменитьПорядокЭлементов(Ссылка, УстановленныеОтборы, ОтображениеСписком, Вверх); + + Если СтрОшибка = "" Тогда + СписокЭлемент.Обновить(); + Иначе + Предупреждение(СтрОшибка); + КонецЕсли; + +КонецПроцедуры + +// Проверить настройки списка перед выполнением операции +Функция ПроверитьСписокПередОперацией(СписокРеквизит, СписокЭлемент, УстановленныеОтборы) + + // Проверим, установлены ли текущие данные + Если СписокЭлемент.ТекущиеДанные = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + // Проверим установленную сортировку + Если Не СортировкаВСпискеУстановленаПравильно(СписокРеквизит) Тогда + Предупреждение(НСтр("ru = 'Перед изменением порядка элементов необходимо установить сортировку по реквизиту доп. упорядочивания по возрастанию!'")); + Возврат Ложь; + КонецЕсли; + + // Проверим установленные отборы + Если Не ПроверитьУстановленныеОтборыВСписке(СписокРеквизит, УстановленныеОтборы) Тогда + Предупреждение(НСтр("ru = 'В списке неверно установлен отбор!'")); + Возврат Ложь; + КонецЕсли; + + Для Каждого ЭлементГруппировки Из СписокРеквизит.Группировка.Элементы Цикл + Если ЭлементГруппировки.Использование Тогда + Предупреждение(НСтр("ru = 'Изменение порядка элементов невозможно при установленной группировке!'")); + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +// Проверить, правильно ли в списке установлена сортировка +Функция СортировкаВСпискеУстановленаПравильно(СписокРеквизит) + + ЭлементыПорядка = СписокРеквизит.Порядок.Элементы; + + // Найдем первый используемый элемент порядка + Элемент = Неопределено; + Для Каждого ЭлементПорядка Из ЭлементыПорядка Цикл + Если ЭлементПорядка.Использование Тогда + Элемент = ЭлементПорядка; + Прервать; + КонецЕсли; + КонецЦикла; + + Если Элемент = Неопределено Тогда + // Не установлена никакая сортировка + Возврат Ложь; + КонецЕсли; + + Если ТипЗнч(Элемент) = Тип("ЭлементПорядкаКомпоновкиДанных") Тогда + Если Элемент.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр Тогда + ПолеРеквизита = Новый ПолеКомпоновкиДанных("РеквизитДопУпорядочивания"); + Если Элемент.Поле = ПолеРеквизита Тогда + Возврат Истина; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Получить информацию об установленных отборах и частично проверить их +Функция ПроверитьУстановленныеОтборыВСписке(СписокРеквизит, УстановленныеОтборы) + + УстановленныеОтборы.Вставить("ЕстьОтборПоРодителю", Ложь); + УстановленныеОтборы.Вставить("ЕстьОтборПоВладельцу", Ложь); + + ПолеРодитель1 = Новый ПолеКомпоновкиДанных("Родитель"); + ПолеРодитель2 = Новый ПолеКомпоновкиДанных("Parent"); + ПолеВладелец1 = Новый ПолеКомпоновкиДанных("Владелец"); + ПолеВладелец2 = Новый ПолеКомпоновкиДанных("Owner"); + + Для Каждого Отбор Из СписокРеквизит.Отбор.Элементы Цикл + + Если Не Отбор.Использование Тогда + // Отбор не используется + Продолжить; + ИначеЕсли ТипЗнч(Отбор) <> Тип("ЭлементОтбораКомпоновкиДанных") Тогда + // Группа элементов отбора не допустима + Возврат Ложь; + ИначеЕсли Отбор.ВидСравнения <> ВидСравненияКомпоновкиДанных.Равно Тогда + // Допустимо только сравнение на равенство + Возврат Ложь; + КонецЕсли; + + Если (Отбор.ЛевоеЗначение = ПолеРодитель1) ИЛИ (Отбор.ЛевоеЗначение = ПолеРодитель2) Тогда + // Установлен отбор по родителю + УстановленныеОтборы.ЕстьОтборПоРодителю = Истина; + ИначеЕсли (Отбор.ЛевоеЗначение = ПолеВладелец1) ИЛИ (Отбор.ЛевоеЗначение = ПолеВладелец2) Тогда + // Установлен отбор по владельцу + УстановленныеОтборы.ЕстьОтборПоВладельцу = Истина; + Иначе + // Установлен отбор по реквизиту, по которому нельзя устанавливать отбор + Возврат Ложь; + КонецЕсли; + + КонецЦикла; + + Возврат Истина; + +КонецФункции diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/НастройкаПорядкаЭлементовКлиент.mdo b/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/НастройкаПорядкаЭлементовКлиент.mdo new file mode 100644 index 000000000..d957d4251 --- /dev/null +++ b/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/НастройкаПорядкаЭлементовКлиент.mdo @@ -0,0 +1,10 @@ + + + НастройкаПорядкаЭлементовКлиент + + ru + Настройка порядка элементов клиент + + true + true + diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементовСобытия/Module.bsl b/SSL/src/CommonModules/НастройкаПорядкаЭлементовСобытия/Module.bsl new file mode 100644 index 000000000..3f14ea06e --- /dev/null +++ b/SSL/src/CommonModules/НастройкаПорядкаЭлементовСобытия/Module.bsl @@ -0,0 +1,95 @@ + +Процедура НастройкаПорядкаЭлементовПередЗаписью(Источник, Отказ) Экспорт + + // Если в обработчике был установлен отказ новые порядок не вычисляем + Если Отказ Тогда + Возврат; + КонецЕсли; + + // Проверим, есть ли у объекта реквизит доп. упорядочивания + Информация = НастройкаПорядкаЭлементов.ПолучитьИнформациюДляПеремещенияОМетаданных(Источник.Ссылка); + Если Не УОбъектаЕстьРеквизитДопУпорядочивания(Источник, Информация) Тогда + Возврат; + КонецЕсли; + + // Вычислим новое значение для порядка элемента + Если Источник.РеквизитДопУпорядочивания = 0 Тогда + Источник.РеквизитДопУпорядочивания = ПолучитьНовоеЗначениеРеквизитаДопУпорядочивания(Информация, Источник); + КонецЕсли; + + +КонецПроцедуры + +Процедура НастройкаПорядкаЭлементовПриКопировании(Источник, ОбъектКопирования) Экспорт + + Информация = НастройкаПорядкаЭлементов.ПолучитьИнформациюДляПеремещенияОМетаданных(Источник.Ссылка); + Если УОбъектаЕстьРеквизитДопУпорядочивания(Источник, Информация) Тогда + Источник.РеквизитДопУпорядочивания = 0; + КонецЕсли; + + +КонецПроцедуры + +// Проверить, есть ли у объекта РеквизитДопУпорядочивания +Функция УОбъектаЕстьРеквизитДопУпорядочивания(Объект, Информация) + + Если Не Информация.ЕстьРодитель Тогда + // Справочник неиерархический, значит реквизит есть + Возврат Истина; + + ИначеЕсли Объект.ЭтоГруппа И Не Информация.ДляГрупп Тогда + // Это группа, но для группа порядок не назначается + Возврат Ложь; + + ИначеЕсли Не Объект.ЭтоГруппа И Не Информация.ДляЭлементов Тогда + // Это элемент, но для элементов порядок не назначается + Возврат Ложь; + + Иначе + Возврат Истина; + + КонецЕсли; + +КонецФункции + +// Получить новое значение реквизита доп. упорядочивания для объекта +Функция ПолучитьНовоеЗначениеРеквизитаДопУпорядочивания(Информация, Объект) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | Таблица.РеквизитДопУпорядочивания КАК РеквизитДопУпорядочивания + |ИЗ + | " + Информация.ПолноеИмя + " КАК Таблица"; + + СтрУсловия = ""; + Если Информация.ЕстьРодитель Тогда + СтрУсловия = СтрУсловия + ?(СтрУсловия = "", "", " И ") + "(Таблица.Родитель = &Родитель)"; + Запрос.УстановитьПараметр("Родитель", Объект.Родитель); + КонецЕсли; + Если Информация.ЕстьВладелец Тогда + СтрУсловия = СтрУсловия + ?(СтрУсловия = "", "", " И ") + "(Таблица.Владелец = &Владелец)"; + Запрос.УстановитьПараметр("Владелец", Объект.Владелец); + КонецЕсли; + + Если СтрУсловия <> "" Тогда + Запрос.Текст = Запрос.Текст + " + |ГДЕ + | " + СтрУсловия; + КонецЕсли; + + + Запрос.Текст = Запрос.Текст + " + | + |УПОРЯДОЧИТЬ ПО + | РеквизитДопУпорядочивания УБЫВ + |"; + + + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + + Возврат ?(Не ЗначениеЗаполнено(Выборка.РеквизитДопУпорядочивания), 1, Выборка.РеквизитДопУпорядочивания + 1); + +КонецФункции + diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементовСобытия/НастройкаПорядкаЭлементовСобытия.mdo b/SSL/src/CommonModules/НастройкаПорядкаЭлементовСобытия/НастройкаПорядкаЭлементовСобытия.mdo new file mode 100644 index 000000000..e10589c21 --- /dev/null +++ b/SSL/src/CommonModules/НастройкаПорядкаЭлементовСобытия/НастройкаПорядкаЭлементовСобытия.mdo @@ -0,0 +1,12 @@ + + + НастройкаПорядкаЭлементовСобытия + + ru + Настройка порядка элементов события + + true + true + true + true + diff --git a/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl new file mode 100644 index 000000000..a70a5da7b --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl @@ -0,0 +1,325 @@ +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ВНЕШНИЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +Процедура ФормаНастройкиУзлаКомандаЗакрытьФорму(Форма) Экспорт + + Для Каждого НастройкаОтбора ИЗ Форма.НастройкаОтборовНаУзле Цикл + + Если ТипЗнч(Форма[НастройкаОтбора.Ключ]) = Тип("ДанныеФормыКоллекция") Тогда + + СтруктураТабличнойЧасти = Форма.НастройкаОтборовНаУзле[НастройкаОтбора.Ключ]; + + Для Каждого Элемент ИЗ СтруктураТабличнойЧасти Цикл + + СтруктураТабличнойЧасти[Элемент.Ключ].Очистить(); + + Для Каждого СтрокаКоллекции ИЗ Форма[НастройкаОтбора.Ключ] Цикл + + СтруктураТабличнойЧасти[Элемент.Ключ].Добавить(СтрокаКоллекции[Элемент.Ключ]); + + КонецЦикла; + + КонецЦикла; + + Иначе + + Форма.НастройкаОтборовНаУзле[НастройкаОтбора.Ключ] = Форма[НастройкаОтбора.Ключ]; + + КонецЕсли; + + КонецЦикла; + + Форма.Закрыть(Форма.НастройкаОтборовНаУзле); + +КонецПроцедуры + +Процедура ФормаНастройкиЗначенийПоУмолчаниюКомандаЗакрытьФорму(Форма) Экспорт + + Для Каждого Настройка ИЗ Форма.ЗначенияПоУмолчаниюНаУзле Цикл + + Форма.ЗначенияПоУмолчаниюНаУзле[Настройка.Ключ] = Форма[Настройка.Ключ]; + + КонецЦикла; + + Форма.Закрыть(Форма.ЗначенияПоУмолчаниюНаУзле); + +КонецПроцедуры + +Процедура ОткрытьПомощникНастройкиОбменаДанными(ИмяПланаОбмена) Экспорт + + ПараметрыФормы = Новый Структура("ИмяПланаОбмена", ИмяПланаОбмена); + + ОткрытьФорму("Обработка.ПомощникСозданияОбменаДанными.Форма.Форма", ПараметрыФормы); + +КонецПроцедуры + +Процедура ОткрытьПомощникСопоставленияОбъектов(ИмяПланаОбмена) Экспорт + + ПараметрыФормы = Новый Структура("ИмяПланаОбмена", ИмяПланаОбмена); + + ОткрытьФорму("Обработка.ПомощникСопоставленияОбъектовИнформационныхБаз.Форма", ПараметрыФормы); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СВОЙСТВА + +Функция МаксимальноеКоличествоПолейСопоставленияОбъектов() Экспорт + + Возврат 5; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ВНУТРЕННИЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Открывает файл в ассоциированном приложении операционной системы +// Каталоги открываются в приложении explorer +// +// Параметры: +// Объект - объект из которого по имени свойства будет получено имя файла для открытия +// ИмяСвойства - Строка - имя свойства объекта из которого будет получено имя файла для открытия +// СтандартнаяОбработка - Булево - флаг стандартной обработки. Устанавливается в значение Ложь. +// +Процедура ОбработчикОткрытияФайлаИлиКаталога(Объект, ИмяСвойства, СтандартнаяОбработка) Экспорт + + СтандартнаяОбработка = Ложь; + + ПолноеИмяФайла = Объект[ИмяСвойства]; + + Если ПустаяСтрока(ПолноеИмяФайла) Тогда + Возврат; + КонецЕсли; + + // открываем каталог в приложении explorer + // файл открываем в ассоциированном приложении + ЗапуститьПриложение(ПолноеИмяФайла); + +КонецПроцедуры + +Процедура ОбработчикВыбораФайловогоКаталога(Объект, ИмяСвойства, СтандартнаяОбработка) Экспорт + + СтандартнаяОбработка = Ложь; + + Если Не ПодключитьРасширениеРаботыСФайлами() Тогда + Предупреждение(НСтр("ru = 'Для данной операции необходимо установить расширение работы с файлами!'")); + Возврат; + КонецЕсли; + + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); + + Диалог.Заголовок = НСтр("ru = 'Укажите каталог'"); + Диалог.Каталог = Объект[ИмяСвойства]; + + Если Диалог.Выбрать() Тогда + + Объект[ИмяСвойства] = Диалог.Каталог; + + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработчикВыбораФайла(Объект, + ИмяСвойства, + СтандартнаяОбработка, + Фильтр = "", + ПроверятьСуществованиеФайла = Истина) Экспорт + + СтандартнаяОбработка = Ложь; + + Если Не ПодключитьРасширениеРаботыСФайлами() Тогда + Предупреждение(НСтр("ru = 'Для данной операции необходимо установить расширение работы с файлами!'")); + Возврат; + КонецЕсли; + + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + + Диалог.Заголовок = НСтр("ru = 'Выберите файл'"); + Диалог.ПолноеИмяФайла = Объект[ИмяСвойства]; + Диалог.МножественныйВыбор = Ложь; + Диалог.ПредварительныйПросмотр = Ложь; + Диалог.ПроверятьСуществованиеФайла = ПроверятьСуществованиеФайла; + Диалог.Фильтр = Фильтр; + + Если Диалог.Выбрать() Тогда + + Объект[ИмяСвойства] = Диалог.ПолноеИмяФайла; + + КонецЕсли; + +КонецПроцедуры + +// Открывает форму выбора или форму списка для справочника правил обмена с отбором по имени плана обмена +// +// Параметры: +// ИмяФормы - Строка - Имя формы для открытия, например, "ФормаСписка" или "ФормаВыбора" +// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена для которого необходимо открыть список правил обмена +// ФормаВладелец - форма-владелец или элемент управления формы +// ОкноВладелец - ОкноКлиентскогоПриложения - Окно приложения, в котором будет открыта форма +// СтандартнаяОбработка - Булево - флаг стандартной обработки. Устанавливается в значение Ложь. +// +Процедура ОткрытьФормуСправочникПравилаОбмена(ИмяФормы = "ФормаСписка", + УзелИнформационнойБазы, + ФормаВладелец, + ОкноВладелец = Неопределено, + СтандартнаяОбработка = Ложь) Экспорт + +КонецПроцедуры + +Процедура ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, ЗначенияЗаполнения, Знач ИмяРегистра, ФормаВладелец) Экспорт + Перем КлючЗаписи; + + НаборЗаписейПустой = ОбменДаннымиСервер.НаборЗаписейРегистраПустой(Отбор, ИмяРегистра); + + Если Не НаборЗаписейПустой Тогда + + ТипЗначения = Тип("РегистрСведенийКлючЗаписи." + ИмяРегистра); + Параметры = Новый Массив(1); + Параметры[0] = Отбор; + + КлючЗаписи = Новый(ТипЗначения, Параметры); + + КонецЕсли; + + ПараметрыЗаписи = Новый Структура; + ПараметрыЗаписи.Вставить("Ключ", КлючЗаписи); + ПараметрыЗаписи.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения); + + // открываем форму записи РС + ОткрытьФормуМодально("РегистрСведений." + ИмяРегистра + ".ФормаЗаписи", ПараметрыЗаписи, ФормаВладелец); + +КонецПроцедуры + +Процедура ПолучитьИнформациюОПравилах(УникальныйИдентификатор) Экспорт + + Перем АдресВременногоХранилища; + Перем СтрокаИнформацииОПравилах; + + Отказ = Ложь; + + Если Не ПоместитьФайл(АдресВременногоХранилища, , , Истина, УникальныйИдентификатор) Тогда + Возврат; + КонецЕсли; + + НСтрока = НСтр("ru = 'Выполняется загрузка информации о правилах...'"); + Состояние(НСтрока); + + // загрузка правил на сервере + ОбменДаннымиСервер.ЗагрузитьИнформациюОПравилах(Отказ, АдресВременногоХранилища, СтрокаИнформацииОПравилах); + + Если Отказ Тогда + + НСтрока = НСтр("ru = 'При получении информации о правилах возникла ошибка!'"); + + Предупреждение(НСтрока); + + Иначе + + ЗаголовокОкна = НСтр("ru = 'Информация о правилах'"); + + Предупреждение(СтрокаИнформацииОПравилах,, ЗаголовокОкна); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПерейтиВЖурналРегистрацииСобытийДанных(УзелИнформационнойБазы, ПараметрыВыполненияКоманды, ДействиеПриОбменеСтрокой) Экспорт + + СобытиеЖурналаРегистрации = ОбменДаннымиСервер.ПолучитьКлючСообщенияЖурналаРегистрацииПоСтрокеДействия(УзелИнформационнойБазы, ДействиеПриОбменеСтрокой); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("СобытиеЖурналаРегистрации", СобытиеЖурналаРегистрации); + + ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры + +Процедура ПерейтиВЖурналРегистрацииСобытийДанныхМодально(УзелИнформационнойБазы, Владелец, ДействиеПриОбмене) Экспорт + + // вызов сервера + ПараметрыФормы = ОбменДаннымиСервер.ПолучитьСтруктуруДанныхОтбораЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене); + + ОткрытьФормуМодально("Обработка.ЖурналРегистрации.Форма", ПараметрыФормы, Владелец); + +КонецПроцедуры + +Процедура ВыполнитьОбменДаннымиОбработкаКоманды(УзелИнформационнойБазы, Владелец) Экспорт + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("УзелИнформационнойБазы", УзелИнформационнойБазы); + + ОткрытьФорму("ОбщаяФорма.ВыполнениеОбменаДанными", ПараметрыФормы, Владелец); + +КонецПроцедуры + +Процедура ОткрытьПомощникСопоставленияОбъектовОбработкаКоманды(УзелИнформационнойБазы, Владелец) Экспорт + + // открываем форму помощника сопоставления объектов; + // в качестве параметра формы задаем узел информационной базы; + ПараметрыФормы = Новый Структура("УзелИнформационнойБазы", УзелИнформационнойБазы); + + ОткрытьФорму("Обработка.ПомощникСопоставленияОбъектовИнформационныхБаз.Форма", ПараметрыФормы, Владелец); + +КонецПроцедуры + +Процедура ОбработкаКомандыНастроитьРасписаниеВыполненияОбмена(УзелИнформационнойБазы, Владелец) Экспорт + + ПараметрыФормы = Новый Структура("УзелИнформационнойБазы", УзелИнформационнойБазы); + + ОткрытьФорму("Справочник.СценарииОбменовДанными.Форма.НастройкаРасписанияОбменовДанными", ПараметрыФормы, Владелец); + +КонецПроцедуры + +// + +Функция СтраницыСтатусаЗагрузкиДанных() Экспорт + + Структура = Новый Структура; + Структура.Вставить("Неопределено", "СтатусЗагрузкиНеопределено"); + Структура.Вставить("Ошибка", "СтатусЗагрузкиОшибка"); + Структура.Вставить("Успех", "СтатусЗагрузкиУспех"); + + Структура.Вставить("Предупреждение_СообщениеОбменаБылоРанееПринято", "СтатусЗагрузкиПредупреждение"); + Структура.Вставить("Ошибка_ТранспортСообщения", "СтатусЗагрузкиОшибка"); + + Возврат Структура; +КонецФункции + +Функция СтраницыСтатусаВыгрузкиДанных() Экспорт + + Структура = Новый Структура; + Структура.Вставить("Неопределено", "СтатусВыгрузкиНеопределено"); + Структура.Вставить("Ошибка", "СтатусВыгрузкиОшибка"); + Структура.Вставить("Успех", "СтатусВыгрузкиУспех"); + + Структура.Вставить("Предупреждение_СообщениеОбменаБылоРанееПринято", "СтатусВыгрузкиПредупреждение"); + Структура.Вставить("Ошибка_ТранспортСообщения", "СтатусВыгрузкиОшибка"); + + Возврат Структура; +КонецФункции + +Функция ЗаголовкиГиперссылокЗагрузкиДанных() Экспорт + + Структура = Новый Структура; + Структура.Вставить("Неопределено", НСтр("ru = 'Загрузка данных не выполнялась'")); + Структура.Вставить("Ошибка", НСтр("ru = 'Загрузка данных выполнена с ошибками'")); + Структура.Вставить("Успех", НСтр("ru = 'Загрузка данных выполнена успешно'")); + + Структура.Вставить("Предупреждение_СообщениеОбменаБылоРанееПринято", НСтр("ru = 'Сообщение обмена было ранее принято'")); + Структура.Вставить("Ошибка_ТранспортСообщения", НСтр("ru = 'Ошибка транспорта сообщения обмена при загрузке данных'")); + + Возврат Структура; +КонецФункции + +Функция ЗаголовкиГиперссылокВыгрузкиДанных() Экспорт + + Структура = Новый Структура; + Структура.Вставить("Неопределено", НСтр("ru = 'Выгрузка данных не выполнялась'")); + Структура.Вставить("Ошибка", НСтр("ru = 'Выгрузка данных выполнена с ошибками'")); + Структура.Вставить("Успех", НСтр("ru = 'Выгрузка данных выполнена успешно'")); + + Структура.Вставить("Предупреждение_СообщениеОбменаБылоРанееПринято", НСтр("ru = 'Предупреждение'")); + Структура.Вставить("Ошибка_ТранспортСообщения", НСтр("ru = 'Ошибка транспорта сообщения обмена при выгрузке данных'")); + + Возврат Структура; +КонецФункции diff --git a/SSL/src/CommonModules/ОбменДаннымиКлиент/ОбменДаннымиКлиент.mdo b/SSL/src/CommonModules/ОбменДаннымиКлиент/ОбменДаннымиКлиент.mdo new file mode 100644 index 000000000..97909e68f --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиКлиент/ОбменДаннымиКлиент.mdo @@ -0,0 +1,11 @@ + + + ОбменДаннымиКлиент + + ru + Обмен данными клиент + + true + true + true + diff --git a/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl new file mode 100644 index 000000000..b3a27a2de --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl @@ -0,0 +1,14 @@ + +// Возвращает префикс кодов и номеров объектов информационной базы по умолчанию +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Строка, 2 - префикс кодов и номеров объектов информационной базы по умолчанию +// +Функция ПрефиксИнформационнойБазыПоУмолчанию() Экспорт + + Возврат "ДМ"; + +КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/ОбменДаннымиПереопределяемый.mdo b/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/ОбменДаннымиПереопределяемый.mdo new file mode 100644 index 000000000..b78874479 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/ОбменДаннымиПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + ОбменДаннымиПереопределяемый + + ru + Обмен данными переопределяемый + + true + true + diff --git a/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl new file mode 100644 index 000000000..268037fa1 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl @@ -0,0 +1,922 @@ +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ВНУТРЕННИЕ ФУНКЦИИ +// +// Модуль содержит только внутренние функции для повторно используемых +// возвращаемых значений следующих механизмов: +// - механизм регистрации объектов на узлах (МРО) +// - механизм сбора и инициализации настроек для выполнения обмена данными +// +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// ФУНКЦИИ МЕХАНИЗМА РЕГИСТРАЦИИ ОБЪЕКТОВ НА УЗЛАХ ПЛАНОВ ОБМЕНА (МРО) + +// Получает таблицу реквизитов регистрации объектов для механизма выборочной регистрации объектов +// +// Параметры: +// ИмяОбъекта - Строка - полное имя объекта метаданного, например, "Справочник.Номенклатура" +// ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе +// +// Возвращаемое значение: +// ТаблицаРеквизитовРегистрации - таблица значений - таблица реквизитов регистрации, +// упорядоченная по полю "Порядок", для заданного объекта метаданного +// +Функция ПолучитьТаблицуРеквизитовРегистрации(ИмяОбъекта, ИмяПланаОбмена) Экспорт + + ТаблицаРеквизитовРегистрацииОбъектов = ОбменДаннымиСервер.ПолучитьПравилаВыборочнойРегистрацииОбъектовПС(); + + Отбор = Новый Структура; + Отбор.Вставить("ИмяПланаОбмена", ИмяПланаОбмена); + Отбор.Вставить("ИмяОбъекта", ИмяОбъекта); + + ТаблицаРеквизитовРегистрации = ТаблицаРеквизитовРегистрацииОбъектов.Скопировать(Отбор); + + ТаблицаРеквизитовРегистрации.Сортировать("Порядок Возр"); + + Возврат ТаблицаРеквизитовРегистрации; + +КонецФункции + +// Получает таблицу правил выборочной регистрации объектов из параметров сеанса. +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Таблица значений - таблица реквизитов регистрации для всех объектов метаданных +// +Функция ПолучитьПравилаВыборочнойРегистрацииОбъектовПС() Экспорт + + Возврат ПараметрыСеанса.ПравилаВыборочнойРегистрацииОбъектов.Получить(); + +КонецФункции + +// Получает предопределенный узел плана обмена +// +// Параметры: +// ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе +// +// Возвращаемое значение: +// ЭтотУзел - ПланОбменаСсылка - предопределенный узел плана обмена +// +Функция ПолучитьЭтотУзелПланаОбмена(ИмяПланаОбмена) Экспорт + + Возврат ПланыОбмена[ИмяПланаОбмена].ЭтотУзел() + +КонецФункции + +// Получает предопределенный узел плана обмена по ссылке на узел плана обмена +// +// Параметры: +// УзелПланаОбмена - ПланОбменаСсылка - любой узел плана обмена +// +// Возвращаемое значение: +// ЭтотУзел - ПланОбменаСсылка - предопределенный узел плана обмена +// +Функция ПолучитьЭтотУзелПланаОбменаПоСсылке(УзелПланаОбмена) Экспорт + + Возврат ПолучитьЭтотУзелПланаОбмена(ПолучитьИмяПланаОбмена(УзелПланаОбмена)); + +КонецФункции + +// Возвращает признак предопределенного узла этой информационной базы по переданному значению ссылки +// +// Параметры: +// УзелПланаОбмена - ПланОбменаСсылка - любой узел плана обмена +// +// Возвращаемое значение: +// Булево - признак предопределенного узла этой информационной базы +// +Функция ЭтоПредопределенныйУзелПланаОбмена(УзелПланаОбмена) Экспорт + + Если Не ЗначениеЗаполнено(УзелПланаОбмена) Тогда + Возврат Ложь; + КонецЕсли; + + Возврат ПолучитьЭтотУзелПланаОбменаПоСсылке(УзелПланаОбмена) = УзелПланаОбмена; + +КонецФункции + +// Получает имя плана обмена как объекта метаданного для заданного узла +// +// Параметры: +// УзелПланаОбмена - ПланОбменаСсылка - любой узел плана обмена +// +// Возвращаемое значение: +// Имя - Строка - имя плана обмена как объекта метаданного +// +Функция ПолучитьИмяПланаОбмена(УзелПланаОбмена) Экспорт + + Возврат УзелПланаОбмена.Метаданные().Имя; + +КонецФункции + +// Получает массив всех узлов для заданного плана обмена кроме предопределенного узла +// +// Параметры: +// ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе +// +// Возвращаемое значение: +// МассивУзлов - Массив - массив всех узлов для заданного плана обмена кроме предопределенного узла +// +Функция ПолучитьМассивУзловПланаОбмена(ИмяПланаОбмена) Экспорт + + ЭтотУзел = ПланыОбмена[ИмяПланаОбмена].ЭтотУзел(); + + ТекстЗапроса = " + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ТекущийПланОбмена.Ссылка + |ИЗ ПланОбмена." + ИмяПланаОбмена + " КАК ТекущийПланОбмена + |ГДЕ + | Не ТекущийПланОбмена.Ссылка = &ЭтотУзел + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("ЭтотУзел", ЭтотУзел); + + Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + +КонецФункции + +// Получает список макетов типовых правил обмена из конфигурации для заданного плана обмена; +// список заполняется именами и синонимами макетов правил +// +// Параметры: +// ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе +// +// Возвращаемое значение: +// СписокПравил - список значений - список макетов типовых правил обмена +// +Функция ПолучитьСписокТиповыхПравилОбмена(ИмяПланаОбмена) Экспорт + + Возврат ПолучитьСписокТиповыхПравил(ИмяПланаОбмена, "ПравилаОбмена"); + +КонецФункции + +// Получает список макетов типовых правил регистрации из конфигурации для плана обмена; +// список заполняется именами и синонимами макетов правил +// +// Параметры: +// ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе +// +// Возвращаемое значение: +// СписокПравил - список значений - список макетов типовых правил регистрации +// +Функция ПолучитьСписокТиповыхПравилРегистрации(ИмяПланаОбмена) Экспорт + + Возврат ПолучитьСписокТиповыхПравил(ИмяПланаОбмена, "ПравилаРегистрации"); + +КонецФункции + +// Получает список макетов типовых правил регистрации из конфигурации для всех планов обмена; +// список заполняется именами и синонимами макетов правил +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// СписокПравилРегистрации - список значений - список макетов типовых правил регистрации +// +Функция ПолучитьСписокТиповыхПравилРегистрацииКонфигурации() Экспорт + + // возвращаемое значение функции + СписокПравилРегистрации = Новый СписокЗначений; + + Для Каждого ПланОбмена ИЗ Метаданные.ПланыОбмена Цикл + + Для Каждого Макет ИЗ ПланОбмена.Макеты Цикл + + МакетИмя = Макет.Имя; + + Если Найти(МакетИмя, "ПравилаРегистрации") <> 0 Тогда + + СписокПравилРегистрации.Добавить(ПланОбмена.Имя, ПланОбмена.Синоним + ": " + Макет.Синоним); + + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + + Возврат СписокПравилРегистрации + +КонецФункции + +// Получает список планов обмена конфигурации; +// список заполняется именами и синонимами планов обмена +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// СписокПлановОбмена - список значений - список планов обмена конфигурации +// +Функция ПолучитьСписокПлановОбменаКонфигурации() Экспорт + + СписокПлановОбмена = Новый СписокЗначений; + + Для Каждого ПланОбмена ИЗ Метаданные.ПланыОбмена Цикл + + СписокПлановОбмена.Добавить(ПланОбмена.Имя, ПланОбмена.Синоним); + + КонецЦикла; + + Возврат СписокПлановОбмена + +КонецФункции + +// Получает список планов обмена конфигурации для обмена версии 3.0; +// список заполняется именами и синонимами планов обмена +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// СписокПлановОбмена - список значений - список планов обмена конфигурации +// +Функция ПолучитьСписокПлановОбменаКонфигурацииВерсии30() Экспорт + + СписокПлановОбмена = Новый СписокЗначений; + + Для Каждого ПланОбмена ИЗ Метаданные.ПланыОбмена Цикл + + МенеджерПланаОбмена = ПланыОбмена[ПланОбмена.Имя]; + + Если МенеджерПланаОбмена.ВерсияОбменаДанными() = Перечисления.ВерсииПодсистемыОбменаДанными.Версия30 Тогда + + СписокПлановОбмена.Добавить(ПланОбмена.Имя, ПланОбмена.Синоним); + + КонецЕсли; + + КонецЦикла; + + Возврат СписокПлановОбмена +КонецФункции + +// Получает менеджер плана обмена по имени плана обмена +// +// Параметры: +// ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе +// +// Возвращаемое значение: +// ПланОбменаМенеджер - менеджер плана обмена +// +Функция ПолучитьМенеджерПланаОбменаПоИмени(ИмяПланаОбмена) Экспорт + + Результат = Неопределено; + + Попытка + + Результат = ПланыОбмена[ИмяПланаОбмена]; + + Исключение + Возврат Неопределено; + КонецПопытки; + + Возврат Результат; +КонецФункции + +Функция ПолучитьМенеджерПланаОбменаПоУзлу(УзелПланаОбмена) Экспорт + + Возврат ПолучитьМенеджерПланаОбменаПоИмени(ПолучитьИмяПланаОбмена(УзелПланаОбмена)); + +КонецФункции + +Функция ОбработкаОбменаДляЗагрузкиДанных(Отказ, УзелИнформационнойБазы, Знач ИмяФайлаСообщенияОбмена) Экспорт + + // ИНИЦИАЛИЗАЦИЯ ОБРАБОТКИ ДЛЯ ЗАГРУЗКИ ДАННЫХ + ОбработкаОбменаДанными = Обработки.КонвертацияОбъектовИнформационныхБаз.Создать(); + + ОбработкаОбменаДанными.РежимОбмена = "Загрузка"; + + ОбработкаОбменаДанными.ВыводВОкноСообщенийИнформационныхСообщений = Ложь; + ОбработкаОбменаДанными.ВыводВПротоколИнформационныхСообщений = Ложь; + ОбработкаОбменаДанными.ДописыватьДанныеВПротоколОбмена = Ложь; + ОбработкаОбменаДанными.ВыгружатьТолькоРазрешенные = Ложь; + ОбработкаОбменаДанными.ФлагРежимОтладки = Ложь; + + ОбработкаОбменаДанными.ИспользоватьТранзакцииПриВыгрузкеДляПлановОбмена = Ложь; + ОбработкаОбменаДанными.КоличествоЭлементовВТранзакцииПриВыгрузкеДляПлановОбмена = 0; + + ОбработкаОбменаДанными.ИмяФайлаПротоколаОбмена = ""; + + ОбработкаОбменаДанными.КлючСообщенияЖурналаРегистрации = ОбменДаннымиСервер.ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + + ОбработкаОбменаДанными.УзелОбменаЗагрузкаДанных = УзелИнформационнойБазы; + ОбработкаОбменаДанными.ИмяФайлаОбмена = ИмяФайлаСообщенияОбмена; + + Возврат ОбработкаОбменаДанными; + +КонецФункции + +Функция ЭтоПланОбменаРаспределеннойИнформационнойБазы(ИмяПланаОбмена) Экспорт + + Возврат Метаданные.ПланыОбмена[ИмяПланаОбмена].РаспределеннаяИнформационнаяБаза; + +КонецФункции + +Функция ЕстьМакетПланаОбмена(Знач ИмяПланаОбмена, Знач ИмяМакета) Экспорт + + Возврат Метаданные.ПланыОбмена[ИмяПланаОбмена].Макеты.Найти(ИмяМакета) <> Неопределено; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ИНИЦИАЛИЗАЦИИ СТРУКТУРЫ НАСТРОЕК ОБМЕНА ДАННЫМИ + +// Выполняет инициализацию подсистемы обмена данными для выполнения процесса обмена +// +// Параметры: +// +// Возвращаемое значение: +// СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена +// +Функция ПолучитьСтруктуруНастроекОбменаДляУзлаИнформационнойБазы(УзелИнформационнойБазы, ДействиеПриОбмене, ВидТранспортаСообщенийОбмена) Экспорт + + // возвращаемое значение функции + СтруктураНастроекОбмена = СтруктураНастроекОбменаБазовая(); + + СтруктураНастроекОбмена.УзелИнформационнойБазы = УзелИнформационнойБазы; + СтруктураНастроекОбмена.ДействиеПриОбмене = ДействиеПриОбмене; + СтруктураНастроекОбмена.ВидТранспортаОбмена = ВидТранспортаСообщенийОбмена; + + ВыполнитьИнициализациюСтруктурыНастроекОбменаДляУзлаИнформационнойБазы(СтруктураНастроекОбмена); + + // проверяем структуру настроек на валидность значений для выполнения обмена. Ошибки фиксируем в ЖР + ВыполнитьПроверкуСтруктурыОбменаНаВалидность(СтруктураНастроекОбмена); + + // если настройки содержат ошибки, то выходим + Если СтруктураНастроекОбмена.Отказ Тогда + Возврат СтруктураНастроекОбмена; + КонецЕсли; + + // инициализируем обработку транспорта сообщений обмена + ВыполнитьИнициализациюОбработкиТранспортаСообщенийОбмена(СтруктураНастроекОбмена); + + // инициализируем обработку обмена данными + Если СтруктураНастроекОбмена.ОбменПоПравиламКонвертацииОбъектов Тогда + + ВыполнитьИнициализациюОбработкиОбменаПоПравиламКонвертации(СтруктураНастроекОбмена); + + Иначе + + ВыполнитьИнициализациюОбработкиОбмена(СтруктураНастроекОбмена); + + КонецЕсли; + + Возврат СтруктураНастроекОбмена; +КонецФункции + +// Выполняет инициализацию подсистемы обмена данными для выполнения процесса обмена +// +// Параметры: +// +// Возвращаемое значение: +// СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена +// +Функция ПолучитьСтруктуруНастроекОбмена(НастройкаВыполненияОбмена, НомерСтроки) Экспорт + + // возвращаемое значение функции + СтруктураНастроекОбмена = СтруктураНастроекОбменаБазовая(); + + ВыполнитьИнициализациюСтруктурыНастроекОбмена(СтруктураНастроекОбмена, НастройкаВыполненияОбмена, НомерСтроки); + + Если СтруктураНастроекОбмена.Отказ Тогда + Возврат СтруктураНастроекОбмена; + КонецЕсли; + + // проверяем структуру настроек на валидность значений для выполнения обмена. Ошибки фиксируем в ЖР + ВыполнитьПроверкуСтруктурыОбменаНаВалидность(СтруктураНастроекОбмена); + + // если настройки содержат ошибки, то выходим + Если СтруктураНастроекОбмена.Отказ Тогда + Возврат СтруктураНастроекОбмена; + КонецЕсли; + + // инициализируем обработку транспорта сообщений обмена + ВыполнитьИнициализациюОбработкиТранспортаСообщенийОбмена(СтруктураНастроекОбмена); + + // инициализируем обработку обмена данными + Если СтруктураНастроекОбмена.ОбменПоПравиламКонвертацииОбъектов Тогда + + ВыполнитьИнициализациюОбработкиОбменаПоПравиламКонвертации(СтруктураНастроекОбмена); + + Иначе + + ВыполнитьИнициализациюОбработкиОбмена(СтруктураНастроекОбмена); + + КонецЕсли; + + Возврат СтруктураНастроекОбмена; +КонецФункции + +Функция ПолучитьСтруктуруНастроекТранспорта(УзелИнформационнойБазы, ВидТранспортаСообщенийОбмена) Экспорт + + // возвращаемое значение функции + СтруктураНастроекОбмена = СтруктураНастроекОбменаБазовая(); + + СтруктураНастроекОбмена.УзелИнформационнойБазы = УзелИнформационнойБазы; + СтруктураНастроекОбмена.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; + СтруктураНастроекОбмена.ВидТранспортаОбмена = ВидТранспортаСообщенийОбмена; + + ВыполнитьИнициализациюСтруктурыНастроекОбменаДляУзлаИнформационнойБазы(СтруктураНастроекОбмена); + + // проверяем структуру настроек на валидность значений для выполнения обмена. Ошибки фиксируем в ЖР + ВыполнитьПроверкуСтруктурыОбменаНаВалидность(СтруктураНастроекОбмена); + + // если настройки содержат ошибки, то выходим + Если СтруктураНастроекОбмена.Отказ Тогда + Возврат Неопределено; + КонецЕсли; + + // инициализируем обработку транспорта сообщений обмена + ВыполнитьИнициализациюОбработкиТранспортаСообщенийОбмена(СтруктураНастроекОбмена); + + Возврат СтруктураНастроекОбмена; +КонецФункции + +// + +Процедура ВыполнитьИнициализациюСтруктурыНастроекОбмена(СтруктураНастроекОбмена, НастройкаВыполненияОбмена, НомерСтроки) + + ТекстЗапроса = " + |ВЫБРАТЬ + | НастройкиВыполненияОбменаНастройкиОбмена.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | НастройкиВыполненияОбменаНастройкиОбмена.УзелИнформационнойБазы.Код КАК УзелИнформационнойБазыКод, + | НастройкиВыполненияОбменаНастройкиОбмена.ВидТранспортаОбмена КАК ВидТранспортаОбмена, + | НастройкиВыполненияОбменаНастройкиОбмена.ВыполняемоеДействие КАК ДействиеПриОбмене, + | НастройкиВыполненияОбменаНастройкиОбмена.КоличествоЭлементовВТранзакции КАК КоличествоЭлементовВТранзакции, + | НастройкиВыполненияОбменаНастройкиОбмена.Ссылка КАК НастройкаВыполненияОбмена, + | НастройкиВыполненияОбменаНастройкиОбмена.Ссылка.Наименование КАК НастройкаВыполненияОбменаНаименование, + | ВЫБОР + | КОГДА НастройкиВыполненияОбменаНастройкиОбмена.ВыполняемоеДействие = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ЗагрузкаДанных) ТОГДА Истина + | ИНАЧЕ Ложь + | КОНЕЦ КАК ПроизводитьЗагрузкуДанных, + | ВЫБОР + | КОГДА НастройкиВыполненияОбменаНастройкиОбмена.ВыполняемоеДействие = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ВыгрузкаДанных) ТОГДА Истина + | ИНАЧЕ Ложь + | КОНЕЦ КАК ПроизводитьВыгрузкуДанных + |ИЗ + | Справочник.СценарииОбменовДанными.НастройкиОбмена КАК НастройкиВыполненияОбменаНастройкиОбмена + |ГДЕ + | НастройкиВыполненияОбменаНастройкиОбмена.Ссылка = &НастройкаВыполненияОбмена + | И НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки = &НомерСтроки + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("НастройкаВыполненияОбмена", НастройкаВыполненияОбмена); + Запрос.УстановитьПараметр("НомерСтроки", НомерСтроки); + + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + + // заполняем значения свойств структуры + ЗаполнитьЗначенияСвойств(СтруктураНастроекОбмена, Выборка); + + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = "Обмен данными"; + + // выполняем проверку задания основных полей структуры настроек обмена + ВыполнитьПроверкуОсновныхПолейСтруктурыНастроекОбмена(СтруктураНастроекОбмена); + + Если СтруктураНастроекОбмена.Отказ Тогда + Возврат; + КонецЕсли; + + // + СтруктураНастроекОбмена.ИмяПланаОбмена = СтруктураНастроекОбмена.УзелИнформационнойБазы.Метаданные().Имя; + СтруктураНастроекОбмена.ОбменПоПравиламКонвертацииОбъектов = ОбменДаннымиСервер.ПравилаКонвертацииОбъектовДляПланаОбменаЗагружены(СтруктураНастроекОбмена.ИмяПланаОбмена); + + СтруктураНастроекОбмена.ТекущийУзелПланаОбмена = ПланыОбмена[СтруктураНастроекОбмена.ИмяПланаОбмена].ЭтотУзел(); + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод = СтруктураНастроекОбмена.ТекущийУзелПланаОбмена.Код; + + СтруктураНастроекОбмена.ИмяОбработкиТранспортаСообщенийОбмена = ОбменДаннымиСервер.ИмяОбработкиТранспортаСообщенийОбмена(СтруктураНастроекОбмена.ВидТранспортаОбмена); + + // получаем ключ сообщения для ЖР + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ОбменДаннымиСервер.ПолучитьКлючСообщенияЖурналаРегистрации(СтруктураНастроекОбмена.УзелИнформационнойБазы, СтруктураНастроекОбмена.ДействиеПриОбмене); + + // + СтруктураНастроекОбмена.НастройкиТранспорта = РегистрыСведений.НастройкиТранспортаОбмена.ПолучитьНастройкиТранспортаДляУзла(СтруктураНастроекОбмена.УзелИнформационнойБазы, СтруктураНастроекОбмена.ВидТранспортаОбмена); + СтруктураНастроекОбмена.ИмяФайлаПротоколаОбмена = СтруктураНастроекОбмена.НастройкиТранспорта.ИмяФайлаПротоколаОбмена; + СтруктураНастроекОбмена.РежимОтладки = СтруктураНастроекОбмена.НастройкиТранспорта.ВыполнятьОбменВРежимеОтладки; + +КонецПроцедуры + +Процедура ВыполнитьИнициализациюСтруктурыНастроекОбменаДляУзлаИнформационнойБазы(СтруктураНастроекОбмена) + + СтруктураСвойств = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(СтруктураНастроекОбмена.УзелИнформационнойБазы, "Код, Наименование"); + + СтруктураНастроекОбмена.УзелИнформационнойБазыКод = СтруктураСвойств.Код; + СтруктураНастроекОбмена.УзелИнформационнойБазыНаименование = СтруктураСвойств.Наименование; + + // + СтруктураНастроекОбмена.НастройкиТранспорта = РегистрыСведений.НастройкиТранспортаОбмена.ПолучитьНастройкиТранспортаДляУзла(СтруктураНастроекОбмена.УзелИнформационнойБазы); + СтруктураНастроекОбмена.ИмяФайлаПротоколаОбмена = СтруктураНастроекОбмена.НастройкиТранспорта.ИмяФайлаПротоколаОбмена; + СтруктураНастроекОбмена.РежимОтладки = СтруктураНастроекОбмена.НастройкиТранспорта.ВыполнятьОбменВРежимеОтладки; + + // если не указан вид транспорта, то используем значение по умолчанию + Если СтруктураНастроекОбмена.ВидТранспортаОбмена = Неопределено Тогда + СтруктураНастроекОбмена.ВидТранспортаОбмена = СтруктураНастроекОбмена.НастройкиТранспорта.ВидТранспортаСообщенийОбменаПоУмолчанию; + КонецЕсли; + + // если вид транспорта не задан, то используем транспорт FILE + Если Не ЗначениеЗаполнено(СтруктураНастроекОбмена.ВидТранспортаОбмена) Тогда + + СтруктураНастроекОбмена.ВидТранспортаОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FILE; + + КонецЕсли; + + // ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ + СтруктураНастроекОбмена.НастройкаВыполненияОбмена = Справочники.СценарииОбменовДанными.ПустаяСсылка(); + СтруктураНастроекОбмена.НастройкаВыполненияОбменаНаименование = ""; + + СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции = 0; + + // ВЫЧИСЛЯЕМЫЕ ЗНАЧЕНИЯ + СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных = (СтруктураНастроекОбмена.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных = (СтруктураНастроекОбмена.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных); + + СтруктураНастроекОбмена.ИмяПланаОбмена = СтруктураНастроекОбмена.УзелИнформационнойБазы.Метаданные().Имя; + СтруктураНастроекОбмена.ОбменПоПравиламКонвертацииОбъектов = ОбменДаннымиСервер.ПравилаКонвертацииОбъектовДляПланаОбменаЗагружены(СтруктураНастроекОбмена.ИмяПланаОбмена); + + СтруктураНастроекОбмена.ТекущийУзелПланаОбмена = ПланыОбмена[СтруктураНастроекОбмена.ИмяПланаОбмена].ЭтотУзел(); + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод = СтруктураНастроекОбмена.ТекущийУзелПланаОбмена.Код; + + СтруктураНастроекОбмена.ИмяОбработкиТранспортаСообщенийОбмена = ОбменДаннымиСервер.ИмяОбработкиТранспортаСообщенийОбмена(СтруктураНастроекОбмена.ВидТранспортаОбмена); + + // получаем ключ сообщения для ЖР + СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации = ОбменДаннымиСервер.ПолучитьКлючСообщенияЖурналаРегистрации(СтруктураНастроекОбмена.УзелИнформационнойБазы, СтруктураНастроекОбмена.ДействиеПриОбмене); + +КонецПроцедуры + +Функция СтруктураНастроекОбменаБазовая() + + СтруктураНастроекОбмена = Новый Структура; + + // структура настроек по полям запроса + + СтруктураНастроекОбмена.Вставить("ДатаНачала"); + СтруктураНастроекОбмена.Вставить("ДатаОкончания"); + + СтруктураНастроекОбмена.Вставить("НомерСтроки"); + СтруктураНастроекОбмена.Вставить("НастройкаВыполненияОбмена"); + СтруктураНастроекОбмена.Вставить("НастройкаВыполненияОбменаНаименование"); + СтруктураНастроекОбмена.Вставить("УзелИнформационнойБазы"); + СтруктураНастроекОбмена.Вставить("УзелИнформационнойБазыКод", ""); + СтруктураНастроекОбмена.Вставить("УзелИнформационнойБазыНаименование", ""); + СтруктураНастроекОбмена.Вставить("ВидТранспортаОбмена"); + СтруктураНастроекОбмена.Вставить("ДействиеПриОбмене"); + СтруктураНастроекОбмена.Вставить("КоличествоЭлементовВТранзакции"); + СтруктураНастроекОбмена.Вставить("РежимОтладки"); + СтруктураНастроекОбмена.Вставить("ПроизводитьЗагрузкуДанных"); + СтруктураНастроекОбмена.Вставить("ПроизводитьВыгрузкуДанных"); + + // структура настроек дополнительная + СтруктураНастроекОбмена.Вставить("Отказ", Ложь); + + СтруктураНастроекОбмена.Вставить("ОбработкаОбменаДанными"); + СтруктураНастроекОбмена.Вставить("ОбработкаТранспортаСообщенийОбмена"); + + СтруктураНастроекОбмена.Вставить("ИмяПланаОбмена"); + СтруктураНастроекОбмена.Вставить("ТекущийУзелПланаОбмена"); + СтруктураНастроекОбмена.Вставить("ТекущийУзелПланаОбменаКод"); + + СтруктураНастроекОбмена.Вставить("ОбменПоПравиламКонвертацииОбъектов"); + + СтруктураНастроекОбмена.Вставить("ИмяОбработкиТранспортаСообщенийОбмена"); + + СтруктураНастроекОбмена.Вставить("КлючСообщенияЖурналаРегистрации"); + + СтруктураНастроекОбмена.Вставить("НастройкиТранспорта"); + СтруктураНастроекОбмена.Вставить("ИмяФайлаПротоколаОбмена"); + + СтруктураНастроекОбмена.Вставить("ПравилаКонвертацииОбъектов"); + СтруктураНастроекОбмена.Вставить("ПравилаЗагружены"); + + // структура для регистрации событий в ЖР + СтруктураНастроекОбмена.Вставить("РезультатВыполненияОбмена"); + СтруктураНастроекОбмена.Вставить("ДействиеПриОбмене"); + СтруктураНастроекОбмена.Вставить("КоличествоОбъектовОбработано", 0); + СтруктураНастроекОбмена.Вставить("СообщениеПриОбмене", ""); + СтруктураНастроекОбмена.Вставить("СтрокаСообщенияОбОшибке", ""); + + СтруктураНастроекОбмена.Вставить("РезультатОтложенныхДвиженийДокументов"); + + Возврат СтруктураНастроекОбмена; +КонецФункции + +Процедура ВыполнитьПроверкуОсновныхПолейСтруктурыНастроекОбмена(СтруктураНастроекОбмена) + + Если НЕ ЗначениеЗаполнено(СтруктураНастроекОбмена.УзелИнформационнойБазы) Тогда + + // узел информационной базы не должен быть пустым + СтрокаСообщенияОбОшибке = НСтр("ru = 'Не задан узел информационной базы с которым нужно производить обмен информацией! Обмен отменен.'"); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + ИначеЕсли НЕ ЗначениеЗаполнено(СтруктураНастроекОбмена.ВидТранспортаОбмена) Тогда + + СтрокаСообщенияОбОшибке = НСтр("ru = 'Не задан вид транспорта обмена! Обмен отменен.'"); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + ИначеЕсли НЕ ЗначениеЗаполнено(СтруктураНастроекОбмена.ДействиеПриОбмене) Тогда + + СтрокаСообщенияОбОшибке = НСтр("ru = 'Не указано выполняемое действие (выгрузка / загрузка)! Обмен отменен.'"); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьПроверкуСтруктурыОбменаНаВалидность(СтруктураНастроекОбмена) + + Если НЕ ЗначениеЗаполнено(СтруктураНастроекОбмена.УзелИнформационнойБазы) Тогда + + // узел информационной базы не должен быть пустым + СтрокаСообщенияОбОшибке = НСтр("ru = 'Не задан узел информационной базы с которым нужно производить обмен информацией! Обмен отменен.'"); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + ИначеЕсли НЕ ЗначениеЗаполнено(СтруктураНастроекОбмена.ВидТранспортаОбмена) Тогда + + СтрокаСообщенияОбОшибке = НСтр("ru = 'Не задан вид транспорта обмена! Обмен отменен.'"); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + ИначеЕсли НЕ ЗначениеЗаполнено(СтруктураНастроекОбмена.ДействиеПриОбмене) Тогда + + СтрокаСообщенияОбОшибке = НСтр("ru = 'Не указано выполняемое действие (выгрузка / загрузка)! Обмен отменен.'"); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + ИначеЕсли СтруктураНастроекОбмена.УзелИнформационнойБазы.ПометкаУдаления Тогда + + // узел информационной базы не должен быть помечен на удаление + СтрокаСообщенияОбОшибке = НСтр("ru = 'Узел информационной базы помечен на удаление! Обмен отменен.'"); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + ИначеЕсли СтруктураНастроекОбмена.УзелИнформационнойБазы = СтруктураНастроекОбмена.ТекущийУзелПланаОбмена Тогда + + // сами с собой не обмениваемся + СтрокаСообщенияОбОшибке = НСтр("ru = 'Нельзя организовать обмен данными с текущим узлом информационной базы! Обмен отменен.'"); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + ИначеЕсли ПустаяСтрока(СтруктураНастроекОбмена.УзелИнформационнойБазыКод) + ИЛИ ПустаяСтрока(СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод) Тогда + + // у узлов участвующих в обмене должен быть не пустой код + СтрокаСообщенияОбОшибке = НСтр("ru = 'Один из узлов обмена имеет пустой код! Обмен отменен.'"); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ИНИЦИАЛИЗАЦИИ ОБРАБОТКИ ОБМЕНА ДАННЫМИ + +Процедура ВыполнитьИнициализациюОбработкиОбмена(СтруктураНастроекОбмена) + + // если настройки содержат ошибки, то не производим инициализацию + Если СтруктураНастроекОбмена.Отказ Тогда + Возврат; + КонецЕсли; + + // создание + ОбработкаОбменаДанными = Обработки.КонвертацияОбъектовРаспределенныхИнформационныхБаз.Создать(); + + // инициализация свойств + ОбработкаОбменаДанными.УзелИнформационнойБазы = СтруктураНастроекОбмена.УзелИнформационнойБазы; + ОбработкаОбменаДанными.КоличествоЭлементовВТранзакции = СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции; + ОбработкаОбменаДанными.КлючСообщенияЖурналаРегистрации = СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации; + + СтруктураНастроекОбмена.Вставить("ОбработкаОбменаДанными", ОбработкаОбменаДанными); + +КонецПроцедуры + +Процедура ВыполнитьИнициализациюОбработкиОбменаПоПравиламКонвертации(СтруктураНастроекОбмена) + + Перем ОбработкаОбменаДанными; + + // если настройки содержат ошибки, то не производим инициализацию + Если СтруктураНастроекОбмена.Отказ Тогда + Возврат; + КонецЕсли; + + Если СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных Тогда + + ОбработкаОбменаДанными = ПолучитьОбработкуОбменаДаннымиДляВыгрузки(СтруктураНастроекОбмена); + + ИначеЕсли СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных Тогда + + ОбработкаОбменаДанными = ПолучитьОбработкуОбменаДаннымиДляЗагрузки(СтруктураНастроекОбмена); + + КонецЕсли; + + СтруктураНастроекОбмена.Вставить("ОбработкаОбменаДанными", ОбработкаОбменаДанными); + +КонецПроцедуры + +Процедура ВыполнитьИнициализациюОбработкиТранспортаСообщенийОбмена(СтруктураНастроекОбмена) + + // создаем обработку транспорта + ОбработкаТранспортаСообщенийОбмена = Обработки[СтруктураНастроекОбмена.ИмяОбработкиТранспортаСообщенийОбмена].Создать(); + + ЭтоИсходящееСообщение = СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных; + + // заполняем общие реквизиты, одинаковые для всех обработок транспорта + ОбработкаТранспортаСообщенийОбмена.ШаблонИмениФайлаСообщения = ПолучитьШаблонИмениФайлаСообщения(СтруктураНастроекОбмена, ЭтоИсходящееСообщение); + + // заполняем настойки транспорта, различные для каждой обработки транспорта + ЗаполнитьЗначенияСвойств(ОбработкаТранспортаСообщенийОбмена, СтруктураНастроекОбмена.НастройкиТранспорта); + + // Инициализируем транспорт + ОбработкаТранспортаСообщенийОбмена.Инициализация(); + + СтруктураНастроекОбмена.Вставить("ОбработкаТранспортаСообщенийОбмена", ОбработкаТранспортаСообщенийОбмена); + +КонецПроцедуры + +Функция ПолучитьОбработкуОбменаДаннымиДляВыгрузки(СтруктураНастроекОбмена) + + ОбработкаОбменаДанными = Обработки.КонвертацияОбъектовИнформационныхБаз.Создать(); + + ОбработкаОбменаДанными.РежимОбмена = "Выгрузка"; + + УстановитьПравилаОбменаВыгрузкиДанных(ОбработкаОбменаДанными, СтруктураНастроекОбмена); + + ОбработкаОбменаДанными.ДобавлениеОбъектовИзФоновогоОбмена = 0; + ОбработкаОбменаДанными.КоличествоОбъектовДляФоновогоОбмена = 0; + + // задаем узлы обмена + ОбработкаОбменаДанными.УзелДляОбмена = СтруктураНастроекОбмена.УзелИнформационнойБазы; + ОбработкаОбменаДанными.УзелДляФоновогоОбмена = Неопределено; + + // устанавливаем соответствие пользовательских полей поиска + ПередатьИнформациюОПользовательскихПоляхПоиска(ОбработкаОбменаДанными, Новый Соответствие); + + ОбработкаОбменаДанными.НеВыгружатьОбъектыПоСсылкам = Истина; + ОбработкаОбменаДанными.ИмяФайлаПравилОбмена = "1"; + + // флаг того, что это обмен не через COM + ОбработкаОбменаДанными.НепосредственноеЧтениеВИБПриемнике = Ложь; + + УстановитьОбщиеПараметрыДляОбработкиОбменаДанными(ОбработкаОбменаДанными, СтруктураНастроекОбмена); + + Возврат ОбработкаОбменаДанными; + +КонецФункции + +Функция ПолучитьОбработкуОбменаДаннымиДляЗагрузки(СтруктураНастроекОбмена) + + ОбработкаОбменаДанными = Обработки.КонвертацияОбъектовИнформационныхБаз.Создать(); + + ОбработкаОбменаДанными.РежимОбмена = "Загрузка"; + ОбработкаОбменаДанными.УзелОбменаЗагрузкаДанных = СтруктураНастроекОбмена.УзелИнформационнойБазы; + + УстановитьОбщиеПараметрыДляОбработкиОбменаДанными(ОбработкаОбменаДанными, СтруктураНастроекОбмена); + + Возврат ОбработкаОбменаДанными + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ ИНИЦИАЛИЗАЦИИ ВЫПОЛНЕНИЯ ОБМЕНА ДАННЫМИ + +Процедура УстановитьОбщиеПараметрыДляОбработкиОбменаДанными(ОбработкаОбменаДанными, СтруктураНастроекОбмена) + + ОбработкаОбменаДанными.ВыводВОкноСообщенийИнформационныхСообщений = Ложь; + ОбработкаОбменаДанными.ВыводВПротоколИнформационныхСообщений = ОбработкаОбменаДанными.ВыводВОкноСообщенийИнформационныхСообщений; + + ОбработкаОбменаДанными.ДописыватьДанныеВПротоколОбмена = Ложь; + ОбработкаОбменаДанными.ВыгружатьТолькоРазрешенные = Ложь; + + ОбработкаОбменаДанными.ФлагРежимОтладки = СтруктураНастроекОбмена.РежимОтладки; + + ОбработкаОбменаДанными.ИспользоватьТранзакцииПриВыгрузкеДляПлановОбмена = (СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции > 0); + ОбработкаОбменаДанными.КоличествоЭлементовВТранзакцииПриВыгрузкеДляПлановОбмена = СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции; + + ОбработкаОбменаДанными.ИмяФайлаПротоколаОбмена = СтруктураНастроекОбмена.ИмяФайлаПротоколаОбмена; + + ОбработкаОбменаДанными.КлючСообщенияЖурналаРегистрации = СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации; + +КонецПроцедуры + +Процедура УстановитьПравилаОбменаВыгрузкиДанных(ОбработкаОбменаДаннымиXML, СтруктураНастроекОбмена) + + Попытка + + ПравилаКонвертацииОбъектов = РегистрыСведений.ПравилаДляОбменаДанными.ПолучитьЗачитанныеПравилаКонвертацииОбъектов(СтруктураНастроекОбмена.ИмяПланаОбмена); + + ПравилаЗагружены = (ПравилаКонвертацииОбъектов <> Неопределено); + + Если Не ПравилаЗагружены Тогда + + // правила обмена должны быть указаны + НСтрока = НСтр("ru = 'Не заданы правила конвертации для плана обмена [ИмяПланаОбмена]. Выгрузка данных отменена.'"); + СтрокаСообщенияОбОшибке = СтрЗаменить(НСтрока, "[ИмяПланаОбмена]", СтруктураНастроекОбмена.ИмяПланаОбмена); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Возврат; + + КонецЕсли; + + ОбработкаОбменаДаннымиXML.СохраненныеНастройки = ПравилаКонвертацииОбъектов; + + ОбработкаОбменаДаннымиXML.ВосстановитьПравилаИзВнутреннегоФормата(); + + Исключение + + СтрокаСообщенияОбОшибке = НСтр("ru = 'Ошибка при установке зачитанных правил обмена! Обмен отменен.'"); + ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + КонецПопытки; + +КонецПроцедуры + +Процедура ПередатьИнформациюОПользовательскихПоляхПоиска(ОбработкаОбменаДаннымиXML, СоответствиеПоиска) + + Попытка + + ОбработкаОбменаДаннымиXML.ИнформацияОПользовательскихПоляхПоискаПриВыгрузкеДанных.Очистить(); + + Для Каждого Элемент Из СоответствиеПоиска Цикл + + ОбработкаОбменаДаннымиXML.ИнформацияОПользовательскихПоляхПоискаПриВыгрузкеДанных.Вставить(Элемент.Ключ, Элемент.Значение); + + КонецЦикла; + + Исключение + КонецПопытки; + +КонецПроцедуры + +Процедура ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена) + + СтруктураНастроекОбмена.Отказ = Истина; + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + +КонецПроцедуры + +Функция ПолучитьШаблонИмениФайлаСообщения(СтруктураНастроекОбмена, ЭтоИсходящееСообщение) + + УзелОтправитель = ?(ЭтоИсходящееСообщение, СтруктураНастроекОбмена.ТекущийУзелПланаОбмена, СтруктураНастроекОбмена.УзелИнформационнойБазы); + УзелПолучатель = ?(ЭтоИсходящееСообщение, СтруктураНастроекОбмена.УзелИнформационнойБазы, СтруктураНастроекОбмена.ТекущийУзелПланаОбмена); + + Возврат ОбменДаннымиСервер.ИмяФайлаСообщенияОбмена(УзелОтправитель.Код, УзелПолучатель.Код); + +КонецФункции + +// Получает список макетов типовых правил для обмена данными из конфигурации для заданного плана обмена; +// список заполняется именами и синонимами макетов правил +// +// Параметры: +// ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе +// +// Возвращаемое значение: +// СписокПравил - список значений - список макетов типовых правил для обмена данными +// +Функция ПолучитьСписокТиповыхПравил(ИмяПланаОбмена, ЛитералИмениМакета) + + СписокПравил = Новый СписокЗначений; + + Если ПустаяСтрока(ИмяПланаОбмена) Тогда + Возврат СписокПравил; + КонецЕсли; + + Попытка + + МакетыПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена].Макеты; + + Исключение + Возврат СписокПравил; + КонецПопытки; + + Для Каждого Макет ИЗ МакетыПланаОбмена Цикл + + МакетИмя = Макет.Имя; + + Если Найти(МакетИмя, ЛитералИмениМакета) <> 0 Тогда + + СписокПравил.Добавить(МакетИмя, Макет.Синоним); + + КонецЕсли; + + КонецЦикла; + + Возврат СписокПравил; +КонецФункции diff --git a/SSL/src/CommonModules/ОбменДаннымиПовтИсп/ОбменДаннымиПовтИсп.mdo b/SSL/src/CommonModules/ОбменДаннымиПовтИсп/ОбменДаннымиПовтИсп.mdo new file mode 100644 index 000000000..ca75f111a --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиПовтИсп/ОбменДаннымиПовтИсп.mdo @@ -0,0 +1,13 @@ + + + ОбменДаннымиПовтИсп + + ru + Обмен данными повторное использование + + true + true + true + true + DuringSession + diff --git a/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl new file mode 100644 index 000000000..028becd3e --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl @@ -0,0 +1,1647 @@ +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ВНЕШНИЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +Процедура ФормаНастройкиУзлаПриСозданииНаСервере(Форма, ИмяПланаОбмена) Экспорт + + Форма.НастройкаОтборовНаУзле = ПланыОбмена[ИмяПланаОбмена].НастройкаОтборовНаУзле(); + + Для Каждого НастройкаОтбора ИЗ Форма.НастройкаОтборовНаУзле Цикл + + Ключ = НастройкаОтбора.Ключ; + + Если ТипЗнч(Форма[Ключ]) = Тип("ДанныеФормыКоллекция") Тогда + + Таблица = Новый ТаблицаЗначений; + + СтруктураТабличнойЧасти = Форма.Параметры[Ключ]; + + Для Каждого Элемент ИЗ СтруктураТабличнойЧасти Цикл + + УстановитьКоличествоСтрокТаблицы(Таблица, Элемент.Значение.Количество()); + + Таблица.Колонки.Добавить(Элемент.Ключ); + + Таблица.ЗагрузитьКолонку(Элемент.Значение, Элемент.Ключ); + + КонецЦикла; + + Форма[Ключ].Загрузить(Таблица); + + Иначе + + Форма[Ключ] = Форма.Параметры[Ключ]; + + КонецЕсли; + + Форма.НастройкаОтборовНаУзле[Ключ] = Форма.Параметры[Ключ]; + + КонецЦикла; + +КонецПроцедуры + +Процедура ФормаНастройкиЗначенийПоУмолчаниюПриСозданииНаСервере(Форма, ИмяПланаОбмена) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Форма.ЗначенияПоУмолчаниюНаУзле = ПланыОбмена[ИмяПланаОбмена].ЗначенияПоУмолчаниюНаУзле(); + + Для Каждого Настройка ИЗ Форма.ЗначенияПоУмолчаниюНаУзле Цикл + + Ключ = Настройка.Ключ; + + Форма[Ключ] = Форма.Параметры[Ключ]; + + Форма.ЗначенияПоУмолчаниюНаУзле[Ключ] = Форма.Параметры[Ключ]; + + КонецЦикла; + +КонецПроцедуры + +// Выполняет обновление типовых правил конвертации объектов для всех планов обмена, +// для которых созданы настройки обмена в системе +// +// Параметры: +// Отказ - Булево - флаг отказа; поднимается при возникновении ошибки обновления правил +// +Процедура ВыполнитьОбновлениеТиповыхПравилКонвертацииОбъектов(Отказ) Экспорт + + ВыполнитьОбновлениеТиповыхПравилДляОбменаДанными(Отказ, "ПравилаКонвертацииОбъектов", "ПравилаОбмена"); + +КонецПроцедуры + +// Выполняет обновление типовых правил регистрации объектов для всех планов обмена, +// для которых созданы настройки обмена в системе +// +// Параметры: +// Отказ - Булево - флаг отказа; поднимается при возникновении ошибки обновления правил +// +Процедура ВыполнитьОбновлениеТиповыхПравилРегистрацииОбъектов(Отказ) Экспорт + + ВыполнитьОбновлениеТиповыхПравилДляОбменаДанными(Отказ, "ПравилаРегистрацииОбъектов", "ПравилаРегистрации"); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ВЫПОЛНЕНИЯ ОБМЕНА ДАННЫМИ + +Процедура ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(Отказ, + УзелИнформационнойБазы, + ВыполнятьЗагрузку = Истина, + ВыполнятьВыгрузку = Истина, + ВидТранспортаСообщенийОбмена = Неопределено) Экспорт + + + Если ВыполнятьЗагрузку Тогда + + // ЗАГРУЗКА ДАННЫХ + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных, ВидТранспортаСообщенийОбмена); + + КонецЕсли; + + Если ВыполнятьВыгрузку Тогда + + // ВЫГРУЗКА ДАННЫХ + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ВыгрузкаДанных, ВидТранспортаСообщенийОбмена); + + КонецЕсли; + +КонецПроцедуры + +// Выполняет процесс обмена данными отдельно для каждой строки настройки обмена +// Процесс обмена данными состоит из двух стадий: +// - инициализация обмена - подготовка подсистемы обмена данными к процессу обмена +// - обмен данными - процесс зачитывания файла сообщения с последующей загрузкой этих данных в ИБ +// или выгрузки изменений в файл сообщения +// Стадия инициализации выполняется один раз за сеанс и сохраняется в кэше сеанса на сервере +// до перезапуска сеанса или сброса повторно-используемых значений подсистемы обмена данными. +// Сброс повторно-используемых значений происходит при изменении данных, влияющих на процесс обмена данными +// (настройки транспорта, настройка выполнения обмена, настройка отборов на узлах планов обмена) +// +// Обмен может быть выполнен полностью для всех строк сценария, +// а может быть выполнен для отдельной строки ТЧ сценария обмена +// +// Параметры: +// НастройкаВыполненияОбмена - СправочникСсылка.СценарииОбменовДанными - элемент справочника, +// по значениям реквизитов которого будет выполнен обмен данными +// НомерСтроки - Число - Номер строки по которой будет выполнен обмен данными. +// Если не указан, то обмен данными будет выполнен для всех строк +// +Процедура ВыполнитьОбменДаннымиПоСценариюОбменаДанными(НастройкаВыполненияОбмена, НомерСтроки = Неопределено) Экспорт + + ТекстЗапроса = " + |ВЫБРАТЬ + | НастройкиВыполненияОбменаНастройкиОбмена.Ссылка КАК НастройкаВыполненияОбмена, + | НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки КАК НомерСтроки, + | ВЫБОР + | КОГДА НастройкиВыполненияОбменаНастройкиОбмена.ВыполняемоеДействие = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ЗагрузкаДанных) ТОГДА Истина + | ИНАЧЕ Ложь + | КОНЕЦ КАК ПроизводитьЗагрузкуДанных, + | ВЫБОР + | КОГДА НастройкиВыполненияОбменаНастройкиОбмена.ВыполняемоеДействие = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ВыгрузкаДанных) ТОГДА Истина + | ИНАЧЕ Ложь + | КОНЕЦ КАК ПроизводитьВыгрузкуДанных + |ИЗ + | Справочник.СценарииОбменовДанными.НастройкиОбмена КАК НастройкиВыполненияОбменаНастройкиОбмена + |ГДЕ + | НастройкиВыполненияОбменаНастройкиОбмена.Ссылка = &НастройкаВыполненияОбмена + | [УсловиеПоНомеруСтроки] + |УПОРЯДОЧИТЬ ПО + | НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки + |"; + + // устанавливаем привилегированный режим + УстановитьПривилегированныйРежим(Истина); + + УсловиеПоНомеруСтроки = ?(НомерСтроки = Неопределено, "", "И НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки = &НомерСтроки"); + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[УсловиеПоНомеруСтроки]", УсловиеПоНомеруСтроки); + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("НастройкаВыполненияОбмена", НастройкаВыполненияОбмена); + Запрос.УстановитьПараметр("НомерСтроки", НомерСтроки); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ + СтруктураНастроекОбмена = ОбменДаннымиПовтИсп.ПолучитьСтруктуруНастроекОбмена(Выборка.НастройкаВыполненияОбмена, Выборка.НомерСтроки); + + // если настройка содержит ошибки, то обмен не производим; статус "Отменено" + Если СтруктураНастроекОбмена.Отказ Тогда + + // фиксируем в ЖР лог по обмену данными + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Продолжить; + КонецЕсли; + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; + СтруктураНастроекОбмена.ДатаНачала = ТекущаяДата(); + + // добавляем в ЖР информацию о процессе обмена данными + СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными по настройке [НастройкаВыполненияОбменаНаименование]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[НастройкаВыполненияОбменаНаименование]", СтруктураНастроекОбмена.НастройкаВыполненияОбменаНаименование); + ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена); + + // ОБМЕН ДАННЫМИ + ВыполнитьОбменДаннымиЧерезФайловыйРесурс(СтруктураНастроекОбмена); + + // фиксируем в ЖР лог по обмену данными + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + КонецЦикла; + +КонецПроцедуры + +// + +Функция ПолучитьСообщениеОбменаВоВременныйКаталог(Отказ, УзелИнформационнойБазы, ВидТранспортаСообщенийОбмена) Экспорт + + // возвращаемое значение функции + Результат = Новый Структура; + Результат.Вставить("ИмяВременногоКаталогаСообщенийОбмена", ""); + Результат.Вставить("ИмяФайлаСообщенияОбмена", ""); + Результат.Вставить("ИдентификаторФайлаПакетаДанных", Неопределено); + + СтруктураНастроекОбмена = ОбменДаннымиПовтИсп.ПолучитьСтруктуруНастроекТранспорта(УзелИнформационнойБазы, ВидТранспортаСообщенийОбмена); + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; + СтруктураНастроекОбмена.ДатаНачала = ТекущаяДата(); + + // если настройка содержит ошибки, то получение сообщения обмена не производим; статус "Отменено" + Если СтруктураНастроекОбмена.Отказ Тогда + + НСтрока = НСтр("ru = 'При инициализации обработки транспорта сообщений обмена возникли ошибки.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,,, Отказ); + + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Возврат Результат; + КонецЕсли; + + // создаем временный каталог + ВыполнитьТранспортСообщенияОбменаПередОбработкой(СтруктураНастроекОбмена); + + Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда + + // получаем сообщение во временный каталог + ВыполнитьТранспортСообщенияОбменаПолучение(СтруктураНастроекОбмена); + + КонецЕсли; + + Если СтруктураНастроекОбмена.РезультатВыполненияОбмена <> Неопределено Тогда + + НСтрока = НСтр("ru = 'При получении сообщений обмена возникли ошибки.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,,, Отказ); + + // удаляем временный каталог и все его содержимое + ВыполнитьТранспортСообщенияОбменаПослеОбработки(СтруктураНастроекОбмена); + + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Возврат Результат; + КонецЕсли; + + Результат.ИмяВременногоКаталогаСообщенийОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ИмяКаталогаСообщенияОбмена(); + Результат.ИмяФайлаСообщенияОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ИмяФайлаСообщенияОбмена(); + Результат.ИдентификаторФайлаПакетаДанных = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ДатаФайлаСообщенияОбмена(); + + Возврат Результат; +КонецФункции + +// ЭКСПОРТНЫЕ ВНУТРЕННИЕ СВОЙСТВА + +// Возвращает имя временного каталога для сообщений обмена данными +// Имя каталога соответствует шаблону: +// "Exchange82 {GUID}", +// где GUID - строка уникального идентификатора +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Строка - имя временного каталога для сообщений обмена данными +// +Функция ИмяВременногоКаталогаСообщенийОбмена() Экспорт + + Возврат СтрЗаменить("Exchange82 {GUID}", "GUID", ВРег(Строка(Новый УникальныйИдентификатор))); + +КонецФункции + +Функция ИмяОбработкиТранспортаСообщенийОбмена(ВидТранспорта) Экспорт + + Возврат СтрЗаменить("ТранспортСообщенийОбмена[ВидТранспорта]", "[ВидТранспорта]", ОбщегоНазначения.ИмяЗначенияПеречисления(ВидТранспорта)); + +КонецФункции + +// + +Процедура ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, ДействиеПриОбмене, ВидТранспортаСообщенийОбмена) + + УстановитьПривилегированныйРежим(Истина); + + // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ + СтруктураНастроекОбмена = ОбменДаннымиПовтИсп.ПолучитьСтруктуруНастроекОбменаДляУзлаИнформационнойБазы(УзелИнформационнойБазы, ДействиеПриОбмене, ВидТранспортаСообщенийОбмена); + + Если СтруктураНастроекОбмена.Отказ Тогда + + // если настройка содержит ошибки, то обмен не производим; статус "Отменено" + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + Отказ = Истина; + + Возврат; + КонецЕсли; + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; + СтруктураНастроекОбмена.ДатаНачала = ТекущаяДата(); + + СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными для узла: [УзелИнформационнойБазыНаименование]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[УзелИнформационнойБазыНаименование]", СтруктураНастроекОбмена.УзелИнформационнойБазыНаименование); + ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена); + + // ОБМЕН ДАННЫМИ + ВыполнитьОбменДаннымиЧерезФайловыйРесурс(СтруктураНастроекОбмена); + + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + Если СтруктураНастроекОбмена.РезультатВыполненияОбмена <> Перечисления.РезультатыВыполненияОбмена.Выполнено Тогда + + Отказ = Истина; + + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьОбменДаннымиЧерезФайловыйРесурс(СтруктураНастроекОбмена) + + ВыполнитьТранспортСообщенияОбменаПередОбработкой(СтруктураНастроекОбмена); + + Если СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных Тогда + + Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда + + ВыполнитьТранспортСообщенияОбменаПолучение(СтруктураНастроекОбмена); + + КонецЕсли; + + // загрузка данных только при успешном получении сообщения обмена + Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда + + ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена); + + КонецЕсли; + + ИначеЕсли СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных Тогда + + // выгрузка данных + Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда + + ЗаписатьСообщенияСИзменениямиДляУзла(СтруктураНастроекОбмена); + + КонецЕсли; + + // отправка сообщения обмена только в случае успешной выгрузки данных + Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда + + ВыполнитьТранспортСообщенияОбменаОтправка(СтруктураНастроекОбмена); + + КонецЕсли; + + КонецЕсли; + + ВыполнитьТранспортСообщенияОбменаПослеОбработки(СтруктураНастроекОбмена); + +КонецПроцедуры + +// Записывает изменения узла информационной базы в файл во временном каталоге +// +// Параметры: +// СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена +// +Процедура ЗаписатьСообщенияСИзменениямиДляУзла(СтруктураНастроекОбмена) + + Если СтруктураНастроекОбмена.ОбменПоПравиламКонвертацииОбъектов Тогда // конвертация объектов по правилам обмена + + // получаем инициализированную обработку обмена данными + ОбработкаОбменаДаннымиXML = СтруктураНастроекОбмена.ОбработкаОбменаДанными; + ОбработкаОбменаДаннымиXML.ИмяФайлаОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ИмяФайлаСообщенияОбмена(); + + // выгрузка данных + ОбработкаОбменаДаннымиXML.ВыполнитьВыгрузкуДанных(); + + Если ОбработкаОбменаДаннымиXML.ФлагОшибки() Тогда + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = ОбработкаОбменаДаннымиXML.РезультатВыполненияОбмена(); + + КонецЕсли; + + // фиксируем состояние выполнения обмена данными + СтруктураНастроекОбмена.КоличествоОбъектовОбработано = ОбработкаОбменаДаннымиXML.СчетчикВыгруженныхОбъектов(); + СтруктураНастроекОбмена.СообщениеПриОбмене = ОбработкаОбменаДаннымиXML.КомментарийПриВыгрузкеДанных; + СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = ОбработкаОбменаДаннымиXML.СтрокаСообщенияОбОшибке(); + + Иначе // конвертация объектов методами сериализации, предоставленными платформой (РИБ) + + Отказ = Ложь; + + // получаем обработку обмена данными + ОбработкаОбменаДанными = СтруктураНастроекОбмена.ОбработкаОбменаДанными; + + // устанавливаем имя файла сообщения обмена, который необходимо прочитать + ОбработкаОбменаДанными.УстановитьИмяФайлаСообщенияОбмена(СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ИмяФайлаСообщенияОбмена()); + + ОбработкаОбменаДанными.ВыполнитьВыгрузкуДанных(Отказ); + + Если Отказ Тогда + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Получает сообщение обмена с новыми данными и загружает данные в информационную базу +// +// Параметры: +// СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена +// +Процедура ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена) + + Если СтруктураНастроекОбмена.ОбменПоПравиламКонвертацииОбъектов Тогда // конвертация объектов по правилам обмена + + // получаем инициализированную обработку обмена данными + ОбработкаОбменаДаннымиXML = СтруктураНастроекОбмена.ОбработкаОбменаДанными; + ОбработкаОбменаДаннымиXML.ИмяФайлаОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ИмяФайлаСообщенияОбмена(); + + // загрузка данных + ОбработкаОбменаДаннымиXML.ВыполнитьЗагрузкуДанных(); + + Если ОбработкаОбменаДаннымиXML.ФлагОшибки() Тогда + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = ОбработкаОбменаДаннымиXML.РезультатВыполненияОбмена(); + + КонецЕсли; + + // фиксируем состояние выполнения обмена данными + СтруктураНастроекОбмена.КоличествоОбъектовОбработано = ОбработкаОбменаДаннымиXML.СчетчикЗагруженныхОбъектов(); + СтруктураНастроекОбмена.СообщениеПриОбмене = ОбработкаОбменаДаннымиXML.КомментарийПриЗагрузкеДанных; + СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = ОбработкаОбменаДаннымиXML.СтрокаСообщенияОбОшибке(); + + СтруктураНастроекОбмена.РезультатОтложенныхДвиженийДокументов = ОбработкаОбменаДаннымиXML.РезультатВыполненияОтложенныхДвижений; + + Иначе // конвертация объектов платформенными методами сериализации + + Отказ = Ложь; + + // получаем обработку обмена данными + ОбработкаОбменаДанными = СтруктураНастроекОбмена.ОбработкаОбменаДанными; + + // устанавливаем имя файла сообщения обмена, который необходимо прочитать + ОбработкаОбменаДанными.УстановитьИмяФайлаСообщенияОбмена(СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ИмяФайлаСообщенияОбмена()); + + ОбработкаОбменаДанными.ВыполнитьЗагрузкуДанных(Отказ); + + Если Отказ Тогда + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ТРАНСПОРТА СООБЩЕНИЙ ОБМЕНА + +Процедура ВыполнитьТранспортСообщенияОбменаПередОбработкой(СтруктураНастроекОбмена) + + // получаем инициализированную обработку транспорта сообщений + ОбработкаТранспортаСообщенийОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена; + + // получаем новое имя временного файла + Если Не ОбработкаТранспортаСообщенийОбмена.ВыполнитьДействияПередОбработкойСообщения() Тогда + + ЗаписьЖурналаРегистрацииОбменаДанными(ОбработкаТранспортаСообщенийОбмена.СтрокаСообщенияОбОшибкеЖР, СтруктураНастроекОбмена, Истина); + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка_ТранспортСообщения; + + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьТранспортСообщенияОбменаОтправка(СтруктураНастроекОбмена) + + // получаем инициализированную обработку транспорта сообщений + ОбработкаТранспортаСообщенийОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена; + + // отправляем сообщение обмена из временного каталога + Если Не ОбработкаТранспортаСообщенийОбмена.ОтправитьСообщение() Тогда + + ЗаписьЖурналаРегистрацииОбменаДанными(ОбработкаТранспортаСообщенийОбмена.СтрокаСообщенияОбОшибкеЖР, СтруктураНастроекОбмена, Истина); + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка_ТранспортСообщения; + + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьТранспортСообщенияОбменаПолучение(СтруктураНастроекОбмена) + + // получаем инициализированную обработку транспорта сообщений + ОбработкаТранспортаСообщенийОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена; + + // получаем сообщение обмена во временный каталог + Если Не ОбработкаТранспортаСообщенийОбмена.ПолучитьСообщение() Тогда + + ЗаписьЖурналаРегистрацииОбменаДанными(ОбработкаТранспортаСообщенийОбмена.СтрокаСообщенияОбОшибкеЖР, СтруктураНастроекОбмена, Истина); + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка_ТранспортСообщения; + + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьТранспортСообщенияОбменаПослеОбработки(СтруктураНастроекОбмена) + + // получаем инициализированную обработку транспорта сообщений + ОбработкаТранспортаСообщенийОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена; + + // выполняем действия после отправки сообщения + ОбработкаТранспортаСообщенийОбмена.ВыполнитьДействияПослеОбработкиСообщения(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ВНУТРЕННИЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +Процедура ПроверитьПодключениеОбработкиТранспортаСообщенийОбмена(Отказ, СтруктураНастроек, ВидТранспорта) Экспорт + + // создаем экземпляр объекта обработки + ОбработкаОбъект = Обработки[ИмяОбработкиТранспортаСообщенийОбмена(ВидТранспорта)].Создать(); + + // инициализация свойств обработки переданными параметрами настроек + ЗаполнитьЗначенияСвойств(ОбработкаОбъект, СтруктураНастроек); + + // Инициализация транспорта обмена + ОбработкаОбъект.Инициализация(); + + // выполняем проверку подключения + Если Не ОбработкаОбъект.ПодключениеУстановлено() Тогда + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОбработкаОбъект.СтрокаСообщенияОбОшибке,,,, Отказ); + + КонецЕсли; + +КонецПроцедуры + +Функция ФайлСообщенияОбменаСуществует(СтруктураНастроек, ВидТранспорта, ШаблонИмениФайлаСообщения) Экспорт + + // создаем экземпляр объекта обработки + ОбработкаОбъект = Обработки[ИмяОбработкиТранспортаСообщенийОбмена(ВидТранспорта)].Создать(); + + // инициализация свойств обработки переданными параметрами настроек + ЗаполнитьЗначенияСвойств(ОбработкаОбъект, СтруктураНастроек); + + ОбработкаОбъект.ШаблонИмениФайлаСообщения = ШаблонИмениФайлаСообщения; + + // Инициализация транспорта обмена + ОбработкаОбъект.Инициализация(); + + Возврат ОбработкаОбъект.ФайлСообщенияОбменаСуществует(); + +КонецФункции + +Процедура СоздатьКаталогПриНеобходимости(Знач ИмяКаталога) Экспорт + + Попытка + + Каталог = Новый Файл(ИмяКаталога); + + Если Не Каталог.Существует() Тогда + + СоздатьКаталог(ИмяКаталога); + + КонецЕсли; + + Исключение + СообщитьОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + +КонецПроцедуры + +Функция НовоеИмяКаталогаОбменаИнформацией() Экспорт + + // возвращаемое значение функции + НовоеИмяКаталога = ""; + + ТаблицаНомеровКаталога = Новый ТаблицаЗначений; + ТаблицаНомеровКаталога.Колонки.Добавить("НомерКаталога", Новый ОписаниеТипов("Число")); + + КаталогВременныхФайлов = КаталогВременныхФайлов(); + + ШаблонИмениКаталога = НСтр("ru = 'Каталог обмена'"); + + МассивНайденныхФайлов = НайтиФайлы(КаталогВременныхФайлов, ШаблонИмениКаталога + "*"); + + Для Каждого Файл ИЗ МассивНайденныхФайлов Цикл + + Если Не Файл.ЭтоКаталог() Тогда + Продолжить; + КонецЕсли; + + НомерКаталога = СтрЗаменить(Файл.Имя, ШаблонИмениКаталога, ""); + НомерКаталога = СтрЗаменить(НомерКаталога, "(", ""); + НомерКаталога = СтрЗаменить(НомерКаталога, ")", ""); + + Попытка + НомерКаталога = Число(НомерКаталога); + Исключение + Продолжить; + КонецПопытки; + + ТаблицаНомеровКаталога.Добавить().НомерКаталога = НомерКаталога; + + КонецЦикла; + + Если ТаблицаНомеровКаталога.Количество() > 0 Тогда + + ТаблицаНомеровКаталога.Сортировать("НомерКаталога Убыв"); + + НовыйНомерКаталога = ТаблицаНомеровКаталога[0]["НомерКаталога"] + 1; + + Иначе + + НовыйНомерКаталога = 1; + + КонецЕсли; + + НовоеИмяКаталога = КаталогВременныхФайлов + ШаблонИмениКаталога + " (" + Формат(НовыйНомерКаталога, "ЧГ=0") + ")"; + + Возврат НовоеИмяКаталога; +КонецФункции + +// Выводит сообщение об ошибке и выставляет параметр Отказ в "Истина". +// +// Параметры: +// ТекстСообщения - строка, текст сообщения. +// Отказ - булево, признак отказа (необязательный). +// +Процедура СообщитьОбОшибке(ТекстСообщения, Отказ = Ложь) Экспорт + + Отказ = Истина; + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения); + +КонецПроцедуры + +// Получает таблицу правил выборочной регистрации объектов из параметров сеанса. +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Таблица значений - таблица реквизитов регистрации для всех объектов метаданных +// +Функция ПолучитьПравилаВыборочнойРегистрацииОбъектовПС() Экспорт + + Возврат ОбменДаннымиПовтИсп.ПолучитьПравилаВыборочнойРегистрацииОбъектовПС(); + +КонецФункции + +// Добавляет одну запись в регистр сведений по переданным значениям структуры +// +// Параметры: +// СтруктураЗаписи - Структура - структура, по значениям которой необходимо создать набор записей и заполнить этот набор +// ИмяРегистра - Строка - имя регистра сведений, в который необходимо добавить запись +// +Процедура ДобавитьЗаписьВРегистрСведений(СтруктураЗаписи, Знач ИмяРегистра) Экспорт + + НаборЗаписей = СоздатьНаборЗаписейРегистраСведений(СтруктураЗаписи, ИмяРегистра); + + // добавляем только одну запись в новый набор записей + НоваяЗапись = НаборЗаписей.Добавить(); + + // заполняем значения свойств записи из переданной структуры + ЗаполнитьЗначенияСвойств(НоваяЗапись, СтруктураЗаписи); + + // записываем набор записей + НаборЗаписей.Записать(); + +КонецПроцедуры + +// Обновляет запись в регистр сведений по переданным значениям структуры +// +// Параметры: +// СтруктураЗаписи - Структура - структура, по значениям которой необходимо создать менеджер записи и обновить запись +// ИмяРегистра - Строка - имя регистра сведений, в котором необходимо обновить запись +// +Процедура ОбновитьЗаписьВРегистрСведений(СтруктураЗаписи, Знач ИмяРегистра) Экспорт + + МетаданныеРегистра = Метаданные.РегистрыСведений[ИмяРегистра]; + + // создаем менеджер записи регистра + МенеджерЗаписи = РегистрыСведений[ИмяРегистра].СоздатьМенеджерЗаписи(); + + // устанавливаем отбор по измерениям регистра + Для Каждого Измерение ИЗ МетаданныеРегистра.Измерения Цикл + + // если задано значение в структуре, то отбор устанавливаем + Если СтруктураЗаписи.Свойство(Измерение.Имя) Тогда + + МенеджерЗаписи[Измерение.Имя] = СтруктураЗаписи[Измерение.Имя]; + + КонецЕсли; + + КонецЦикла; + + // считываем запись из базы данных + МенеджерЗаписи.Прочитать(); + + // заполняем значения свойств записи из переданной структуры + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, СтруктураЗаписи); + + // записываем менеджер записи + МенеджерЗаписи.Записать(); + +КонецПроцедуры + +// Удаляет набор записей в регистре по переданным значениям структуры +// +// Параметры: +// СтруктураЗаписи - Структура - структура, по значениям которой необходимо удалить набор записей +// ИмяРегистра - Строка - имя регистра сведений, в котором необходимо удалить набор записей +// +Процедура УдалитьНаборЗаписейВРегистреСведений(СтруктураЗаписи, ИмяРегистра) Экспорт + + НаборЗаписей = СоздатьНаборЗаписейРегистраСведений(СтруктураЗаписи, ИмяРегистра); + + // записываем набор записей + НаборЗаписей.Записать(); + +КонецПроцедуры + +Процедура ЗагрузитьПравилаДляОбменаДанными(Отказ, Знач ИмяПланаОбмена, Знач ВидПравил, Знач ИмяМакетаПравил, Знач ИспользоватьФильтрВыборочнойРегистрацииОбъектов = Истина) Экспорт + + СтруктураЗаписи = Новый Структура; + СтруктураЗаписи.Вставить("ИмяПланаОбмена", ИмяПланаОбмена); + СтруктураЗаписи.Вставить("ВидПравил", Перечисления.ВидыПравилДляОбменаДанными[ВидПравил]); + СтруктураЗаписи.Вставить("ИмяМакетаПравил", ИмяМакетаПравил); + СтруктураЗаписи.Вставить("ИсточникПравил", Перечисления.ИсточникиПравилДляОбменаДанными.МакетКонфигурации); + СтруктураЗаписи.Вставить("ИспользоватьФильтрВыборочнойРегистрацииОбъектов", ИспользоватьФильтрВыборочнойРегистрацииОбъектов); + + // получаем набор записей регистра + НаборЗаписей = СоздатьНаборЗаписейРегистраСведений(СтруктураЗаписи, "ПравилаДляОбменаДанными"); + + // добавляем только одну запись в новый набор записей + НоваяЗапись = НаборЗаписей.Добавить(); + + // заполняем значения свойств записи из структуры + ЗаполнитьЗначенияСвойств(НоваяЗапись, СтруктураЗаписи); + + // Загружаем правила для обмена данными в ИБ + РегистрыСведений.ПравилаДляОбменаДанными.ЗагрузитьПравила(Отказ, НаборЗаписей[0]); + + Если Не Отказ Тогда + НаборЗаписей.Записать(); + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьОбновлениеТиповыхПравилДляОбменаДанными(Отказ, ВидПравил, ИмяМакетаПравил) + + ТекстЗапроса = " + |ВЫБРАТЬ + | ПравилаДляОбменаДанными.ИмяПланаОбмена, + | ПравилаДляОбменаДанными.ИспользоватьФильтрВыборочнойРегистрацииОбъектов + |ИЗ + | РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными + |ГДЕ + | ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.#ВидПравил#) + | И ПравилаДляОбменаДанными.ИсточникПравил = ЗНАЧЕНИЕ(Перечисление.ИсточникиПравилДляОбменаДанными.МакетКонфигурации) + | И ПравилаДляОбменаДанными.ПравилаЗагружены + |"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ВидПравил#", ВидПравил); + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + ЗагрузитьПравилаДляОбменаДанными(Отказ, Выборка.ИмяПланаОбмена, ВидПравил, ИмяМакетаПравил, Выборка.ИспользоватьФильтрВыборочнойРегистрацииОбъектов); + + КонецЦикла; + +КонецПроцедуры + +// Создает набор записей регистра сведений по переданным значениям структуры. Добавляет одну запись в набор +// +// Параметры: +// СтруктураЗаписи - Структура - структура по значениям которой необходимо создать набор записей и заполнить этот набор +// ИмяРегистра - Строка - имя регистра сведений +// +Функция СоздатьНаборЗаписейРегистраСведений(СтруктураЗаписи, ИмяРегистра) Экспорт + + МетаданныеРегистра = Метаданные.РегистрыСведений[ИмяРегистра]; + + // создаем набор записей регистра + НаборЗаписей = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей(); + + // устанавливаем отбор по измерениям регистра + Для Каждого Измерение ИЗ МетаданныеРегистра.Измерения Цикл + + // если задано значение в структуре, то отбор устанавливаем + Если СтруктураЗаписи.Свойство(Измерение.Имя) Тогда + + НаборЗаписей.Отбор[Измерение.Имя].Установить(СтруктураЗаписи[Измерение.Имя]); + + КонецЕсли; + + КонецЦикла; + + Возврат НаборЗаписей; +КонецФункции + +// Получает список транспортов сообщений обмена определенных в конфигурации +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// СписокЗначений - список транспортов сообщений обмена определенных в конфигурации +// +Функция СписокВидовТранспортаСообщенийОбмена() Экспорт + + Список = Новый СписокЗначений; + + ВидыТранспортаСообщенийОбмена = Метаданные.Перечисления.ВидыТранспортаСообщенийОбмена.ЗначенияПеречисления; + + Для Каждого Элемент ИЗ ВидыТранспортаСообщенийОбмена Цикл + + Список.Добавить(Перечисления.ВидыТранспортаСообщенийОбмена[Элемент.Имя], Элемент.Синоним); + + КонецЦикла; + + Возврат Список; + +КонецФункции + +Функция ИндексКартинкиТаблицыИнформацииСтатистики(Знач КоличествоОбъектовНесопоставленных, Знач ДанныеУспешноЗагружены) Экспорт + + Возврат ?(ДанныеУспешноЗагружены = Истина, 2, ?(КоличествоОбъектовНесопоставленных = 0, 0, 1)); + +КонецФункции + +Функция ПравилаКонвертацииОбъектовДляПланаОбменаЗагружены(Знач ИмяПланаОбмена) Экспорт + + ТекстЗапроса = " + |ВЫБРАТЬ ПЕРВЫЕ 1 1 + |ИЗ + | РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными + |ГДЕ + | ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов) + | И ПравилаДляОбменаДанными.ПравилаЗагружены + | И ПравилаДляОбменаДанными.ИмяПланаОбмена = &ИмяПланаОбмена + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("ИмяПланаОбмена", ИмяПланаОбмена); + + Возврат Не Запрос.Выполнить().Пустой(); +КонецФункции + +Функция РазмерСообщенияОбменаПревышаетДопустимый(Знач ИмяФайла, Знач МаксимальныйДопустимыйРазмерСообщения) Экспорт + + // возвращаемое значение функции + Результат = Ложь; + + Файл = Новый Файл(ИмяФайла); + + Если Файл.Существует() И Файл.ЭтоФайл() Тогда + + Если МаксимальныйДопустимыйРазмерСообщения <> 0 Тогда + + РазмерПакета = Окр(Файл.Размер() / 1024, 0, РежимОкругления.Окр15как20); + + Если РазмерПакета > МаксимальныйДопустимыйРазмерСообщения Тогда + + СтрокаСообщения = НСтр("ru = 'Размер исходящего пакета составил [РазмерПакета] Кбайт, что превышает допустимое ограничение [ДопустимыйРазмер] Кбайт.'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[РазмерПакета]", Строка(РазмерПакета)); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ДопустимыйРазмер]", Строка(МаксимальныйДопустимыйРазмерСообщения)); + + СообщитьОбОшибке(СтрокаСообщения, Результат); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ВСПОМОГАТЕЛЬНЫЕ + +Процедура ЗаполнитьСписокВыбораДоступнымиВидамиТранспорта(УзелИнформационнойБазы, ЭлементФормы) Экспорт + + ИспользуемыеТранспорты = ПланыОбмена[ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелИнформационнойБазы)].ИспользуемыеТранспортыСообщенийОбмена(); + + ЭлементФормы.СписокВыбора.Очистить(); + + Для Каждого Элемент Из ИспользуемыеТранспорты Цикл + + ЭлементФормы.СписокВыбора.Добавить(Элемент, Строка(Элемент)); + + КонецЦикла; + +КонецПроцедуры + +// Регистрирует что обмен был произведен и фиксирует информацию в протоколе +// +// Параметры: +// СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена +// +Процедура ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена) + + // статус "Неопределено" в конце обмена свидетельствует об успешном выполнении обмена + Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Выполнено; + КонецЕсли; + + // формируем итоговое сообщение для протокола + СтрокаСообщения = НСтр("ru = '[РезультатВыполненияОбмена], [ДействиеПриОбмене]; Обработано [КоличествоОбъектовОбработано] объектов'"); + + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[РезультатВыполненияОбмена]", СтруктураНастроекОбмена.РезультатВыполненияОбмена); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ДействиеПриОбмене]", СтруктураНастроекОбмена.ДействиеПриОбмене); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[КоличествоОбъектовОбработано]", СтруктураНастроекОбмена.КоличествоОбъектовОбработано); + + ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена); + + СтруктураНастроекОбмена.ДатаОкончания = ТекущаяДата(); + + // фиксируем состояние обмена в РС + ЗафиксироватьЗавершениеОбменаВРегистреСведений(СтруктураНастроекОбмена); + + // если обмен данными был успешно выполнен + Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Выполнено Тогда + + ЗафиксироватьУспешныйОбменДаннымиВРегистреСведений(СтруктураНастроекОбмена); + + КонецЕсли; + +КонецПроцедуры + +// Фиксирует состояние обмена данными в регистре сведений СостояниеОбменовДанными +// +// Параметры: +// СтруктураНастроекОбмена - Структура - структура со всеми необходимыми данными и объектами для выполнения обмена +// +Процедура ЗафиксироватьЗавершениеОбменаВРегистреСведений(СтруктураНастроекОбмена) + + // создаем структуру для новой записи в РС + СтруктураЗаписи = Новый Структура; + СтруктураЗаписи.Вставить("УзелИнформационнойБазы", СтруктураНастроекОбмена.УзелИнформационнойБазы); + СтруктураЗаписи.Вставить("ДействиеПриОбмене", СтруктураНастроекОбмена.ДействиеПриОбмене); + + СтруктураЗаписи.Вставить("РезультатВыполненияОбмена", СтруктураНастроекОбмена.РезультатВыполненияОбмена); + СтруктураЗаписи.Вставить("ДатаНачала", СтруктураНастроекОбмена.ДатаНачала); + СтруктураЗаписи.Вставить("ДатаОкончания", СтруктураНастроекОбмена.ДатаОкончания); + + // добавляем запись в РС + РегистрыСведений.СостояниеОбменовДанными.ДобавитьЗапись(СтруктураЗаписи); + +КонецПроцедуры + +Процедура ЗафиксироватьУспешныйОбменДаннымиВРегистреСведений(СтруктураНастроекОбмена) + + // создаем структуру для новой записи в РС + СтруктураЗаписи = Новый Структура; + СтруктураЗаписи.Вставить("УзелИнформационнойБазы", СтруктураНастроекОбмена.УзелИнформационнойБазы); + СтруктураЗаписи.Вставить("ДействиеПриОбмене", СтруктураНастроекОбмена.ДействиеПриОбмене); + СтруктураЗаписи.Вставить("ДатаОкончания", СтруктураНастроекОбмена.ДатаОкончания); + + // добавляем запись в РС + РегистрыСведений.СостояниеУспешныхОбменовДанными.ДобавитьЗапись(СтруктураЗаписи); + +КонецПроцедуры + +Процедура ЗагрузитьИнформациюОПравилах(Отказ, АдресВременногоХранилища, СтрокаИнформацииОПравилах) Экспорт + + РегистрыСведений.ПравилаДляОбменаДанными.ЗагрузитьИнформациюОПравилах(Отказ, АдресВременногоХранилища, СтрокаИнформацииОПравилах); + +КонецПроцедуры + +Процедура УстановитьКоличествоСтрокТаблицы(Таблица, КоличествоСтрок) Экспорт + + Пока Таблица.Количество() < КоличествоСтрок Цикл + + Таблица.Добавить(); + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаписьЖурналаРегистрацииОбменаДанными(Комментарий, СтруктураНастроекОбмена, ЭтоОшибка = Ложь) Экспорт + + Уровень = ?(ЭтоОшибка, УровеньЖурналаРегистрации.Ошибка, УровеньЖурналаРегистрации.Информация); + + ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, Уровень,,, Комментарий); + +КонецПроцедуры + +// Проверяет состав полей таблицы значений в соответствии с составом полей таблицы-шаблона +// Если колонка в таблице отсутствует, то она будет добавлена из таблицы-шаблона +// Новые колонки добавляются; удаленные колонки в таблиц-шаблоне не удаляются из таблицы +// +// Параметры: +// Таблица - ТаблицаЗначений; ДеревоЗначений - таблица в которую будет добавлена колонка при необходимости +// ТаблицаШаблон - ТаблицаЗначений; ДеревоЗначений - таблица-шаблон, которая используется для сопоставления колонок +// +Процедура ПроверитьСоставПолейТаблицыЗначений(Таблица, ТаблицаШаблон) + + Для Каждого КолонкаТаблицыШаблона Из ТаблицаШаблон.Колонки Цикл + + Если Таблица.Колонки.Найти(КолонкаТаблицыШаблона.Имя) = Неопределено Тогда + + ЗаполнитьЗначенияСвойств(Таблица.Колонки.Добавить(), КолонкаТаблицыШаблона); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Распаковывает файл архива ZIP в указанный каталог; Извлекает все файлы архива +// +// Параметры: +// ПолноеИмяФайлаАрхива - Строка - имя файла архива, который необходимо распаковать +// ПутьРаспаковкиФайлов - Строка - путь по которому необходимо распаковать файлы +// ПарольАрхива - Строка - пароль для распаковки архива. По умолчанию пустая строка +// +// Возвращаемое значение: +// Результат - Булево - Истина, если успешно, Ложь, если нет. +Функция РаспаковатьZipФайл(Знач ПолноеИмяФайлаАрхива, Знач ПутьРаспаковкиФайлов, Знач ПарольАрхива = "") Экспорт + + // возвращаемое значение функции + Результат = Истина; + + Попытка + + Архиватор = Новый ЧтениеZipФайла(ПолноеИмяФайлаАрхива, ПарольАрхива); + + Исключение + Архиватор = Неопределено; + СообщитьОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат Ложь; + КонецПопытки; + + Попытка + + Архиватор.ИзвлечьВсе(ПутьРаспаковкиФайлов, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); + + Исключение + + СтрокаСообщения = НСтр("ru = 'Ошибка при распаковке файлов архива: [ПолноеИмяФайлаАрхива] в каталог: [ПутьРаспаковкиФайлов]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ПолноеИмяФайлаАрхива]", ПолноеИмяФайлаАрхива); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ПутьРаспаковкиФайлов]", ПутьРаспаковкиФайлов); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщения); + + Результат = Ложь; + КонецПопытки; + + Архиватор.Закрыть(); + Архиватор = Неопределено; + + Возврат Результат; + +КонецФункции + +Функция НаборЗаписейРегистраПустой(СтруктураЗаписи, ИмяРегистра) Экспорт + + МетаданныеРегистра = Метаданные.РегистрыСведений[ИмяРегистра]; + + // создаем набор записей регистра + НаборЗаписей = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей(); + + // устанавливаем отбор по измерениям регистра + Для Каждого Измерение ИЗ МетаданныеРегистра.Измерения Цикл + + // если задано значение в структуре, то отбор устанавливаем + Если СтруктураЗаписи.Свойство(Измерение.Имя) Тогда + + НаборЗаписей.Отбор[Измерение.Имя].Установить(СтруктураЗаписи[Измерение.Имя]); + + КонецЕсли; + + КонецЦикла; + + НаборЗаписей.Прочитать(); + + Возврат НаборЗаписей.Количество() = 0; + +КонецФункции + +Функция КоличествоЗаписейВТаблицеБазыДанных(Знач ИмяТаблицы) Экспорт + + ТекстЗапроса = " + |ВЫБРАТЬ + | Количество(*) КАК Количество + |ИЗ + | #ИмяТаблицы + |"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяТаблицы", ИмяТаблицы); + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + + Возврат Выборка["Количество"]; + +КонецФункции + +Функция КоличествоЗаписейВоВременнойТаблицеБазыДанных(Знач ИмяТаблицы, МенеджерВременныхТаблиц) Экспорт + + ТекстЗапроса = " + |ВЫБРАТЬ + | Количество(*) КАК Количество + |ИЗ + | #ИмяТаблицы + |"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяТаблицы", ИмяТаблицы); + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + + Возврат Выборка["Количество"]; + +КонецФункции + +Функция ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене) Экспорт + + ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелИнформационнойБазы); + КодУзлаПланаОбмена = ОбщегоНазначения.ПолучитьЗначениеРеквизита(УзелИнформационнойБазы, "Код"); + + КлючСообщения = "Обмен данными.[ИмяПланаОбмена].Узел [КодУзла].[ДействиеПриОбмене]"; + + КлючСообщения = СтрЗаменить(КлючСообщения, "[ИмяПланаОбмена]", ИмяПланаОбмена); + КлючСообщения = СтрЗаменить(КлючСообщения, "[КодУзла]", КодУзлаПланаОбмена); + КлючСообщения = СтрЗаменить(КлючСообщения, "[ДействиеПриОбмене]", ДействиеПриОбмене); + + Возврат КлючСообщения; + +КонецФункции + +Функция ПолучитьКлючСообщенияЖурналаРегистрацииПоСтрокеДействия(УзелИнформационнойБазы, ДействиеПриОбменеСтрокой) Экспорт + + Возврат ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене[ДействиеПриОбменеСтрокой]); + +КонецФункции + +Функция ПолучитьСтруктуруДанныхОтбораЖурналаРегистрации(УзелИнформационнойБазы, Знач ДействиеПриОбмене) Экспорт + + Если ТипЗнч(ДействиеПриОбмене) = Тип("Строка") Тогда + + ДействиеПриОбмене = Перечисления.ДействияПриОбмене[ДействиеПриОбмене]; + + КонецЕсли; + + СостояниеОбменовДанными = РегистрыСведений.СостояниеОбменовДанными.СостояниеОбменовДанными(УзелИнформационнойБазы, ДействиеПриОбмене); + + Отбор = Новый Структура; + Отбор.Вставить("СобытиеЖурналаРегистрации", ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене)); + Отбор.Вставить("ДатаНачала", СостояниеОбменовДанными.ДатаНачала); + Отбор.Вставить("ДатаОкончания", СостояниеОбменовДанными.ДатаОкончания); + + Возврат Отбор; +КонецФункции + +Функция РольДоступнаДобавлениеИзменениеОбменовДанными() Экспорт + + Возврат РольДоступна(Метаданные.Роли.ПолныеПрава) + ИЛИ РольДоступна(Метаданные.Роли.ДобавлениеИзменениеОбменовДанными); + +КонецФункции + +Функция ИмяФайлаСообщенияОбмена(КодУзлаОтправителя, КодУзлаПолучателя) Экспорт + + ШаблонИмени = "[Префикс]_[УзелОтправитель]_[УзелПолучатель]"; + + ШаблонИмени = СтрЗаменить(ШаблонИмени, "[Префикс]", "Message"); + ШаблонИмени = СтрЗаменить(ШаблонИмени, "[УзелОтправитель]", КодУзлаОтправителя); + ШаблонИмени = СтрЗаменить(ШаблонИмени, "[УзелПолучатель]", КодУзлаПолучателя); + + Возврат ШаблонИмени; +КонецФункции + +Функция ЭтоСтандартныйРеквизит(СтандартныеРеквизиты, ИмяРеквизита) Экспорт + + Для Каждого Реквизит ИЗ СтандартныеРеквизиты Цикл + + Если Реквизит.Имя = ИмяРеквизита Тогда + + Возврат Истина; + + КонецЕсли; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция ВсеТранспортыСообщенийОбменаКонфигурации() Экспорт + + Результат = Новый Массив; + + Для Каждого Элемент Из Перечисления.ВидыТранспортаСообщенийОбмена Цикл + + Результат.Добавить(Элемент); + + КонецЦикла; + + Возврат Результат; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ИНИЦИАЛИЗАЦИИ СЕАНСА + +// Получает массив всех планов обмена по которым выполняется обмен данными +// Наличие обмена с каким либо планом обмена определяется по наличию у этого плана обмена узлов кроме предопределенного. +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// МассивПлановОбмена - Массив - массив строк (имен) всех планов обмена по которым выполняется обмен данными +// +Функция ПолучитьИспользуемыеПланыОбмена() Экспорт + + // возвращаемое значение + МассивПлановОбмена = Новый Массив; + + // список всех узлов в конфигурации + СписокПлановОбмена = ОбменДаннымиПовтИсп.ПолучитьСписокПлановОбменаКонфигурации(); + + Для Каждого Элемент ИЗ СписокПлановОбмена Цикл + + ИмяПланаОбмена = Элемент.Значение; + + Если Не ПланОбменаНеСодержитУзлов(ИмяПланаОбмена) Тогда + + МассивПлановОбмена.Добавить(ИмяПланаОбмена); + + КонецЕсли; + + КонецЦикла; + + Возврат МассивПлановОбмена; + +КонецФункции + +// Получает таблицу правил регистрации объектов из информационной базы +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// ПравилаРегистрацииОбъектов - ТаблицаЗначений - таблица общих правил регистрации объектов для МРО +// +Функция ПолучитьПравилаРегистрацииОбъектов() Экспорт + + // возвращаемое значение функции + ПравилаРегистрацииОбъектов = ИнициализацияТаблицыПравилРегистрацииОбъектов(); + + ТекстЗапроса = " + |ВЫБРАТЬ + | ПравилаДляОбменаДанными.ПравилаЗачитанные КАК ПравилаЗачитанные + |ИЗ + | РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными + |ГДЕ + | ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов) + | И ПравилаДляОбменаДанными.ПравилаЗагружены + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + ЗаполнитьЗначенияСвойствДляТаблицыЗначенийПРО(ПравилаРегистрацииОбъектов, Выборка.ПравилаЗачитанные.Получить()); + + КонецЦикла; + + Возврат ПравилаРегистрацииОбъектов; + +КонецФункции + +// Получает таблицу правил выборочной регистрации объектов из информационной базы +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// ПравилаВыборочнойРегистрацииОбъектов - ТаблицаЗначений - таблица общих правил выборочной регистрации объектов для МРО +// +Функция ПолучитьПравилаВыборочнойРегистрацииОбъектов() Экспорт + + // возвращаемое значение функции + ПравилаВыборочнойРегистрацииОбъектов = ИнициализацияТаблицыПравилВыборочнойРегистрацииОбъектов(); + + ТекстЗапроса = " + |ВЫБРАТЬ + | ПравилаДляОбменаДанными.ПравилаЗачитанные КАК ПравилаЗачитанные + |ИЗ + | РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными + |ГДЕ + | ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов) + | И ПравилаДляОбменаДанными.ИспользоватьФильтрВыборочнойРегистрацииОбъектов + | И ПравилаДляОбменаДанными.ПравилаЗагружены + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + СтруктураПравилОбмена = Выборка.ПравилаЗачитанные.Получить(); + + ЗаполнитьЗначенияСвойствДляТаблицыЗначений(ПравилаВыборочнойРегистрацииОбъектов, СтруктураПравилОбмена["ПравилаВыборочнойРегистрацииОбъектов"]); + + КонецЦикла; + + Возврат ПравилаВыборочнойРегистрацииОбъектов; + +КонецФункции + +Функция ИнициализацияТаблицыПравилРегистрацииОбъектов() + + // возвращаемое значение функции + Правила = Новый ТаблицаЗначений; + + Колонки = Правила.Колонки; + + Колонки.Добавить("ОбъектМетаданныхИмя", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("ИмяПланаОбмена", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("ТекстЗапроса", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("СвойстваОбъекта", Новый ОписаниеТипов("Структура")); + + // признаки того, что правила пустые + Колонки.Добавить("ПравилоПоСвойствамОбъектаПустое", Новый ОписаниеТипов("Булево")); + + // обработчики событий + Колонки.Добавить("ПередОбработкой", Новый ОписаниеТипов("Строка")); + + Колонки.Добавить("ЕстьОбработчикПередОбработкой", Новый ОписаниеТипов("Булево")); + + Колонки.Добавить("ОтборПоСвойствамОбъекта", Новый ОписаниеТипов("ДеревоЗначений")); + + // поле для оперативного хранения данных из объекта или ссылки + Колонки.Добавить("ОтборПоСвойствам", Новый ОписаниеТипов("ДеревоЗначений")); + + // добавляем индекс + Правила.Индексы.Добавить("ИмяПланаОбмена, ОбъектМетаданныхИмя"); + + Возврат Правила; + +КонецФункции + +Функция ИнициализацияТаблицыПравилВыборочнойРегистрацииОбъектов() + + // возвращаемое значение функции + Правила = Новый ТаблицаЗначений; + + Колонки = Правила.Колонки; + + Колонки.Добавить("Порядок", Новый ОписаниеТипов("Число")); + Колонки.Добавить("ИмяОбъекта", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("ИмяПланаОбмена", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("ИмяТабличнойЧасти", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("РеквизитыРегистрации", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("СтруктураРеквизитовРегистрации", Новый ОписаниеТипов("Структура")); + + // добавляем индекс + Правила.Индексы.Добавить("ИмяПланаОбмена, ИмяОбъекта"); + + Возврат Правила; + +КонецФункции + +Функция ПланОбменаНеСодержитУзлов(Знач ИмяПланаОбмена) + + ТекстЗапроса = " + |ВЫБРАТЬ ПЕРВЫЕ 1 1 + |ИЗ + | ПланОбмена." + ИмяПланаОбмена + " КАК ПланОбмена + |ГДЕ + | ПланОбмена.Ссылка <> &ЭтотУзел + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("ЭтотУзел", ПланыОбмена[ИмяПланаОбмена].ЭтотУзел()); + + Возврат Запрос.Выполнить().Пустой() + +КонецФункции + +Процедура ЗаполнитьЗначенияСвойствДляТаблицыЗначенийПРО(ТаблицаПриемник, ТаблицаИсточник) + + ТаблицаШаблон = Обработки.ЗагрузкаПравилРегистрацииОбъектов.ИнициализацияТаблицыОтборПоСвойствамОбъекта(); + + Для Каждого СтрокаИсточника ИЗ ТаблицаИсточник Цикл + + ПроверитьСоставПолейТаблицыЗначений(СтрокаИсточника.ОтборПоСвойствамОбъекта, ТаблицаШаблон); + + ЗаполнитьЗначенияСвойств(ТаблицаПриемник.Добавить(), СтрокаИсточника); + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаполнитьЗначенияСвойствДляТаблицыЗначений(ТаблицаПриемник, ТаблицаИсточник) + + Для Каждого СтрокаИсточника ИЗ ТаблицаИсточник Цикл + + ЗаполнитьЗначенияСвойств(ТаблицаПриемник.Добавить(), СтрокаИсточника); + + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ФУНКЦИИ ОПРЕДЕЛЕНИЯ ТИПА ОБЪЕКТА МЕТАДАННЫХ + +Функция ЭтоДокумент(ОбъектМетаданных) Экспорт + + Возврат Метаданные.Документы.Содержит(ОбъектМетаданных); + +КонецФункции + +Функция ЭтоСправочник(ОбъектМетаданных) Экспорт + + Возврат Метаданные.Справочники.Содержит(ОбъектМетаданных); + +КонецФункции + +Функция ЭтоКонстанта(ОбъектМетаданных) Экспорт + + Возврат Метаданные.Константы.Содержит(ОбъектМетаданных); + +КонецФункции + +Функция ЭтоРегистрСведений(ОбъектМетаданных) Экспорт + + Возврат Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных); + +КонецФункции + +Функция ЭтоРегистрНакопления(ОбъектМетаданных) Экспорт + + Возврат Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных); + +КонецФункции + +Функция ЭтоРегистрБухгалтерии(ОбъектМетаданных) Экспорт + + Возврат Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных); + +КонецФункции + +Функция ЭтоРегистрРасчета(ОбъектМетаданных) Экспорт + + Возврат Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных); + +КонецФункции + +Функция ЭтоБизнесПроцесс(ОбъектМетаданных) Экспорт + + Возврат Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных); + +КонецФункции + +Функция ЭтоЗадача(ОбъектМетаданных) Экспорт + + Возврат Метаданные.Задачи.Содержит(ОбъектМетаданных); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ОБМЕНА ДАННЫМИ ПОД ПОЛНЫМИ ПРАВАМИ + +// Находит регламентное задание по GUID +// +// Параметры: +// УникальныйНомерЗадания - Строка - строка с GUID регламентного задания +// +// Возвращаемое значение: +// Неопределено - если поиск регламентного задания по GUID не дал результатов +// ТекущееРегламентноеЗадание - РегламентноеЗадание - найденное по GUID регламентное задание +// +Функция НайтиРегламентноеЗаданиеПоПараметру(УникальныйНомерЗадания) Экспорт + + // возвращаемое значение функции + РегламентноеЗадание = Неопределено; + + Если ПустаяСтрока(УникальныйНомерЗадания) Тогда + + Возврат Неопределено; + + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + Попытка + + РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(УникальныйНомерЗадания)); + + Исключение + + РегламентноеЗадание = Неопределено; + + КонецПопытки; + + Возврат РегламентноеЗадание; + +КонецФункции + +// Обновляет/устанавливает повторно-используемые значения и параметры сеанса для подсистемы обмена данными +// +// Устанавливаемые параметры сеанса: +// ОбменДаннымиВключен - Булево - флаг, который показывает следует или нет использовать обмен данными в конфигурации. +// Определяется косвенным образом по факту наличия обмена данными хотя бы с одним планом обмена. +// Наличие обмена с каким либо планом обмена определяется по наличию у этого плана обмена узлов +// кроме предопределенного. +// ИспользуемыеПланыОбмена - ФиксированныйМассив - массив с именами планов обмена для которых используется обмен. +// ПравилаРегистрацииОбъектов - ХранилищеЗначения - в бинарном виде содержит таблицу значений с правилами регистрации объектов. +// ПравилаВыборочнойРегистрацииОбъектов - +// ДатаОбновленияПовторноИспользуемыхЗначенийМРО - Дата (Дата и время) - содержит дату последнего актуального +// кэша для подсистемы обмена данными +// +// Параметры: +// Нет. +// +Процедура ОбновитьПовторноИспользуемыеЗначенияМРО() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + // Обновляем повторно используемые значения + ОбновитьПовторноИспользуемыеЗначения(); + + // получаем планы обмена конфигурации, которые используются при обмене + ИспользуемыеПланыОбмена = ПолучитьИспользуемыеПланыОбмена(); + + // флаг включения механизма обмена данными + ОбменДаннымиВключен = (ИспользуемыеПланыОбмена.Количество() <> 0); + + // устанавливаем параметр сеанса ОбменДаннымиВключен + ПараметрыСеанса.ОбменДаннымиВключен = ОбменДаннымиВключен; + + // устанавливаем параметр сеанса ИспользуемыеПланыОбмена + ПараметрыСеанса.ИспользуемыеПланыОбмена = Новый ФиксированныйМассив(ИспользуемыеПланыОбмена); + + // получаем таблицу правил регистрации из ИБ + ПравилаРегистрацииОбъектов = ПолучитьПравилаРегистрацииОбъектов(); + + // устанавливаем параметр сеанса ПравилаРегистрацииОбъектов + ПараметрыСеанса.ПравилаРегистрацииОбъектов = Новый ХранилищеЗначения(ПравилаРегистрацииОбъектов); + + // устанавливаем параметр сеанса ПравилаВыборочнойРегистрацииОбъектов + ПравилаВыборочнойРегистрацииОбъектов = ПолучитьПравилаВыборочнойРегистрацииОбъектов(); + + ПараметрыСеанса.ПравилаВыборочнойРегистрацииОбъектов = Новый ХранилищеЗначения(ПравилаВыборочнойРегистрацииОбъектов); + + // КЛЮЧ ДЛЯ ПРОВЕРКИ АКТУАЛЬНОСТИ КЭША + + // устанавливаем актуальную дату обновления кеша МРО + АктуальнаяДата = ПолучитьФункциональнуюОпцию("АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО"); + + ПараметрыСеанса.ДатаОбновленияПовторноИспользуемыхЗначенийМРО = АктуальнаяДата; + +КонецПроцедуры + +// Устанавливает значение константы ДатаОбновленияПовторноИспользуемыхЗначенийМРО +// В качестве устанавливаемого значения используется текущая дата компьютера (сервера) +// В момент изменения значения этой константы повторно-используемые значения +// для подсистемы обмена данными становятся не актуальными и требуют повторной инициализации. +// +// Параметры: +// Нет. +// +Процедура УстановитьДатуОбновленияПовторноИспользуемыхЗначенийМРО() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Константы.ДатаОбновленияПовторноИспользуемыхЗначенийМРО.Установить(ТекущаяДата()); + +КонецПроцедуры + +// Устанавливает параметры сеанса подсистемы обмена данными +// +// Параметры: +// ИмяПараметра - Строка - имя параметра сеанса, значение которого необходимо установить +// УстановленныеПараметры - массив - в данный параметр помещается информация об установленных параметрах сеанса +// +Процедура УстановитьПараметрыСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт + + Если НЕ (ИмяПараметра = "ДатаОбновленияПовторноИспользуемыхЗначенийМРО" + ИЛИ ИмяПараметра = "ОбменДаннымиВключен" + ИЛИ ИмяПараметра = "ИспользуемыеПланыОбмена" + ИЛИ ИмяПараметра = "ПравилаВыборочнойРегистрацииОбъектов" + ИЛИ ИмяПараметра = "ПравилаРегистрацииОбъектов") Тогда + Возврат; + КонецЕсли; + + // процедура обновления повторно-используемых значений и параметров сеанса + ОбновитьПовторноИспользуемыеЗначенияМРО(); + + // зарегистрируем имена параметров, которые установлены при + // выполнении ОбновитьПовторноИспользуемыеЗначенияМРО + УстановленныеПараметры.Добавить("ОбменДаннымиВключен"); + УстановленныеПараметры.Добавить("ИспользуемыеПланыОбмена"); + УстановленныеПараметры.Добавить("ПравилаВыборочнойРегистрацииОбъектов"); + УстановленныеПараметры.Добавить("ПравилаРегистрацииОбъектов"); + УстановленныеПараметры.Добавить("ДатаОбновленияПовторноИспользуемыхЗначенийМРО"); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// КОНСТАНТЫ ПОДСИСТЕМЫ ОБМЕНА ДАННЫМИ + +Функция СтрокаНеограниченнойДлины() Экспорт + + Возврат "Строка(Неогр)"; + +КонецФункции + +Функция ЭлементОтбораСвойствоЗначениеКонстанты() Экспорт + + Возврат "ЗначениеКонстанты"; + +КонецФункции + +Функция ЭлементОтбораСвойствоАлгоритмЗначения() Экспорт + + Возврат "АлгоритмЗначения"; + +КонецФункции diff --git a/SSL/src/CommonModules/ОбменДаннымиСервер/ОбменДаннымиСервер.mdo b/SSL/src/CommonModules/ОбменДаннымиСервер/ОбменДаннымиСервер.mdo new file mode 100644 index 000000000..f9fbd038f --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиСервер/ОбменДаннымиСервер.mdo @@ -0,0 +1,10 @@ + + + ОбменДаннымиСервер + + ru + Обмен данными сервер + + true + true + diff --git a/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl new file mode 100644 index 000000000..678274c84 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl @@ -0,0 +1,1484 @@ +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ВНЕШНИЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Процедура предназначена для определения вида отправки выгружаемого элемента данных +// Вызывается из обработчиков планов обмена: ПриОтправкеДанныхГлавному(), ПриОтправкеДанныхПодчиненному() +// +// Параметры: +// ЭлементДанных, ОтправкаЭлемента - см. описание параметров в синтаксис помощнике +// для методов ПриОтправкеДанныхГлавному() и ПриОтправкеДанныхПодчиненному() +// УзелИнформационнойБазы - ПланОбменаСсылка - текущий узел плана обмена для которого выполняется выгрузка данных +// ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе +// +Процедура ПриОтправкеДанных(ЭлементДанных, ОтправкаЭлемента, УзелИнформационнойБазы, ИмяПланаОбмена) Экспорт + + Если ТипЗнч(ЭлементДанных) = Тип("УдалениеОбъекта") Тогда + Возврат; // удаление объекта отсылаем "как есть" + КонецЕсли; + + ОбъектМетаданных = ЭлементДанных.Метаданные(); + + Если АвтоРегистрацияРазрешена(ОбъектМетаданных, ИмяПланаОбмена) Тогда + Возврат; // если установлен признак авторегистрации, то отсылаем объект "как есть" + КонецЕсли; + + ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных); + + Если ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаСправочники() + ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаДокументы() + ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыВидовХарактеристик() + ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыСчетов() + ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыВидовРасчета() + ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаБизнесПроцессы() + ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаЗадачи() Тогда + + // определяем массив узлов для регистрации объекта + МассивУзловДляРегистрацииОбъекта = ОпределитьПолучателейПриВыгрузкеДанных(ЭлементДанных, ОбъектМетаданных, ИмяПланаОбмена); + + НомерВМассиве = МассивУзловДляРегистрацииОбъекта.Найти(УзелИнформационнойБазы); + + // если в массиве нет текущего узла, то посылаем удаление объекта + Если НомерВМассиве = Неопределено Тогда + + // передаем информацию об удалении + ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить; + + КонецЕсли; + + ИначеЕсли ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыСведений() + ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыНакопления() + ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыБухгалтерии() + ИЛИ ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыРасчета() Тогда + + ОбратныйИндекс = ЭлементДанных.Количество() - 1; + + Пока ОбратныйИндекс >= 0 Цикл + + СтрокаНабора = ЭлементДанных[ОбратныйИндекс]; + + // определяем массив узлов для регистрации объекта + МассивУзловДляРегистрацииОбъекта = ОпределитьПолучателейПриВыгрузкеСтрокиНабораЗаписей(ЭлементДанных, СтрокаНабора, ОбъектМетаданных, ИмяПланаОбмена); + + НомерВМассиве = МассивУзловДляРегистрацииОбъекта.Найти(УзелИнформационнойБазы); + + // если в массиве нет текущего узла, то удаляем строку из набора + Если НомерВМассиве = Неопределено Тогда + + ЭлементДанных.Удалить(ОбратныйИндекс); + + КонецЕсли; + + ОбратныйИндекс = ОбратныйИндекс - 1; + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +// + +// Процедура-обработчик события "ПередЗаписью" документов для механизма регистрации объектов на узлах +// +// Параметры: +// Источник - ДокументОбъект - источник события +// Отказ - Булево - флаг отказа от выполнения обработчика +// +Процедура МеханизмРегистрацииОбъектовПередЗаписьюДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт + + МеханизмРегистрацииОбъектов(Источник, Отказ, РежимЗаписи); + +КонецПроцедуры + +// Процедура-обработчик события "ПередЗаписью" ссылочных типов данных (кроме документов) для механизма регистрации объектов на узлах +// +// Параметры: +// Источник - источник события, кроме типа ДокументОбъект +// Отказ - Булево - флаг отказа от выполнения обработчика +// +Процедура МеханизмРегистрацииОбъектовПередЗаписью(Источник, Отказ) Экспорт + + МеханизмРегистрацииОбъектов(Источник, Отказ); + +КонецПроцедуры + +// Процедура-обработчик события "ПередЗаписью" регистров для механизма регистрации объектов на узлах +// +// Параметры: +// Источник - НаборЗаписейРегистра - источник события +// Отказ - Булево - флаг отказа от выполнения обработчика +// Замещение - Булево - признак замещения существующего набора записей +// +Процедура МеханизмРегистрацииОбъектовПередЗаписьюРегистра(Источник, Отказ, Замещение) Экспорт + + МеханизмРегистрацииОбъектов(Источник, Отказ,, Замещение, Истина); + +КонецПроцедуры + +// Процедура-обработчик события "ПередУдалением" ссылочных типов данных для механизма регистрации объектов на узлах +// +// Параметры: +// Источник - источник события +// Отказ - Булево - флаг отказа от выполнения обработчика +// +Процедура МеханизмРегистрацииОбъектовПередУдалением(Источник, Отказ) Экспорт + + МеханизмРегистрацииОбъектов(Источник, Отказ,,,, Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ВНУТРЕННИЕ ПРОЦЕДУРЫ-ОБРАБОТЧИКИ СОБЫТИЙ ПОДПИСОК + +// Процедура-обработчик события "ПередЗаписью" для узла любого плана обмена +// +// Параметры: +// Источник - ПланОбменаОбъект - узел плана обмена, источник события +// Отказ - Булево - флаг отказа от выполнения обработчика +// +Процедура ОбменДаннымиПередЗаписьюУзлаПланаОбменаПередЗаписью(Источник, Отказ) Экспорт + + Если Источник.ЭтоНовый() Тогда + + // если добавили новый узел, то: + // - обновить список используемых ПО (если узел первый) + // - обновить кешируемые ссылки всех узлов ПО + // кеш открытых сеансов для МРО стал неактуальным + ОбменДаннымиСервер.УстановитьДатуОбновленияПовторноИспользуемыхЗначенийМРО(); + + КонецЕсли; + +КонецПроцедуры + +// Процедура-обработчик события "ПередУдалением" для узла любого плана обмена +// +// Параметры: +// Источник - ПланОбменаОбъект - узел плана обмена, источник события +// Отказ - Булево - флаг отказа от выполнения обработчика +// +Процедура ОбменДаннымиПередУдалениемУзлаПланаОбменаПередУдалением(Источник, Отказ) Экспорт + + // если удалили узел, то необходимо обновить кешируемые ссылки всех узлов ПО + // кеш открытых сеансов для МРО стал неактуальным + ОбменДаннымиСервер.УстановитьДатуОбновленияПовторноИспользуемыхЗначенийМРО(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МЕХАНИЗМА РЕГИСТРАЦИИ ОБЪЕКТОВ + +// Процедура механизма регистрации объектов. Предназначена для определения списка узлов получателей планов обмена +// на которых необходимо выполнить регистрацию объекта для последующей его выгрузки +// Включает в себя два последовательно работающие механизма - ВРО и ПРО. +// ВРО - механизм выборочной регистрации объектов; +// ПРО - механизм регистрации объектов по правилам регистрации; +// Вначале отрабатывает механизм ВРО, далее включается механизм ПРО. +// ВРО определяет на каких планах обмена должен быть зарегистрирован объект к выгрузке; +// ПРО определяет на каких узлах каждого плана обмена должен быть зарегистрирован объект. +// +// Параметры: +// Источник - СправочникОбъект или ДокументОбъект - источник для получения значений реквизитов и др. свойств +// Отказ - Булево - флаг отказа. Если флаг отказа взведен, то процедура не выполняется +// +Процедура МеханизмРегистрацииОбъектов(Источник, + Отказ, + РежимЗаписи = Неопределено, + Замещение = Ложь, + ЭтоРегистр = Ложь, + ЭтоУдалениеОбъекта = Ложь) + // + УстановитьПривилегированныйРежим(Истина); + + ОтключитьМеханизмРегистрацииОбъектов = Ложь; + Если Источник.ДополнительныеСвойства.Свойство("ОтключитьМеханизмРегистрацииОбъектов", ОтключитьМеханизмРегистрацииОбъектов) + И ОтключитьМеханизмРегистрацииОбъектов = Истина Тогда + + Возврат; // отказались от выполнения МРО; выходим + КонецЕсли; + + // проверяем актуальность кеша сеанса для МРО + ОбновитьПовторноИспользуемыеЗначенияМРОПриНеобходимости(); + + Если НЕ ПараметрыСеанса.ОбменДаннымиВключен Тогда + Возврат; + КонецЕсли; + + // определяем необходимость регистрации объекта на узле отправителе + РегистрироватьОбъектНаУзлеОтправителе = Ложь; + Если Источник.ДополнительныеСвойства.Свойство("РегистрироватьОбъектНаУзлеОтправителе", РегистрироватьОбъектНаУзлеОтправителе) + И РегистрироватьОбъектНаУзлеОтправителе Тогда + + // обнуляем ссылку на узел отправитель + Источник.ОбменДанными.Отправитель = Неопределено; + + КонецЕсли; + + ОбъектМетаданных = Источник.Метаданные(); + + // при физическом удалении объекта ВРО не выполняем + ЗарегистрироватьОбъектКВыгрузке = ЭтоРегистр ИЛИ ЭтоУдалениеОбъекта; + + // получаем массив планов обмена для которых надо выполнять ПРО + ПланыОбменаДляРегистрации = ОпределитьМассивПлановОбменаДляОбъекта(Источник, ОбъектМетаданных, РежимЗаписи, ЗарегистрироватьОбъектКВыгрузке); + + Если ПланыОбменаДляРегистрации.Количество() = 0 Тогда + + Возврат // для объекта нет потребности выполнять ПРО; выходим + КонецЕсли; + + Если ЭтоРегистр Тогда + + // определяем узлы для регистрации набора записей регистра + ОпределитьМассивУзловДляНабораЗаписей(Источник, ОбъектМетаданных, ПланыОбменаДляРегистрации, Замещение); + + Иначе + + // определяем узлы для регистрации объекта + ОпределитьМассивУзловДляОбъекта(Источник, ОбъектМетаданных, ПланыОбменаДляРегистрации, ЭтоУдалениеОбъекта); + + КонецЕсли; + +КонецПроцедуры + +Процедура ОбновитьПовторноИспользуемыеЗначенияМРОПриНеобходимости() Экспорт + + АктуальнаяДата = ПолучитьФункциональнуюОпцию("АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО"); + + Если ПараметрыСеанса.ДатаОбновленияПовторноИспользуемыхЗначенийМРО <> АктуальнаяДата Тогда + + ОбменДаннымиСервер.ОбновитьПовторноИспользуемыеЗначенияМРО(); + + // рекурсивный вызов для проверки + ОбновитьПовторноИспользуемыеЗначенияМРОПриНеобходимости(); + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МЕХАНИЗМА ВЫБОРОЧНОЙ РЕГИСТРАЦИИ ОБЪЕКТОВ (ВРО) + +// таблица выполняемых действий функции в зависимости от значения флагов +//------------------------------------------------------- +//РегистрироватьОбъект | АвтоРегистрацияОбъектаРазрешена +//------------------------------------------------------- +// 0 | 0 | ничего не выполнять +// 1 | 1 | ничего не выполнять +// 1 | 0 | выполнить ПРО для текущего плана обмена +// 0 | 1 | удалить узлы авторегистрации для текущего плана обмена +// +Функция ОпределитьМассивПлановОбменаДляОбъекта(Источник, ОбъектМетаданных, РежимЗаписи, ЗарегистрироватьОбъектКВыгрузке) + + // возвращаемое значение функции + ПланыОбменаДляРегистрации = Новый Массив; + + Для Каждого ИмяПланаОбмена ИЗ ПараметрыСеанса.ИспользуемыеПланыОбмена Цикл + + // флаг необходимости регистрации объекта на узлах текущего ПО + РегистрироватьОбъект = НадоЗарегистрироватьОбъектКВыгрузке(Источник, ОбъектМетаданных, ИмяПланаОбмена, РежимЗаписи, ЗарегистрироватьОбъектКВыгрузке); + + // флаг наличия авторегистрации объекта на узлах текущего ПО + АвтоРегистрацияОбъектаРазрешена = АвтоРегистрацияРазрешена(ОбъектМетаданных, ИмяПланаОбмена); + + Если Не РегистрироватьОбъект И АвтоРегистрацияОбъектаРазрешена Тогда + + // если объект регистрировать не нужно и он регистрируется автоматически, + // то удаляем все узлы по авторегистрации для текущего плана обмена + УдалитьУзлыАвторегистрацииПоПлануОбмена(Источник, ИмяПланаОбмена); + + ИначеЕсли РегистрироватьОбъект И Не АвтоРегистрацияОбъектаРазрешена Тогда + + // если надо зарегистрировать объект и признака авторегистрации нет, + // то заполняем массив планов обмена для выполнения ПРО + ПланыОбменаДляРегистрации.Добавить(ИмяПланаОбмена); + + КонецЕсли; + + КонецЦикла; + + Возврат ПланыОбменаДляРегистрации + +КонецФункции + +Функция НадоЗарегистрироватьОбъектКВыгрузке(Источник, ОбъектМетаданных, ИмяПланаОбмена, РежимЗаписи, ЗарегистрироватьОбъектКВыгрузке) + + Если ЗарегистрироватьОбъектКВыгрузке + ИЛИ Источник.ЭтоНовый() + ИЛИ Источник.ОбменДанными.Загрузка Тогда + + // для наборов записей регистров, + // при физическом удалении объектов, + // для новых объектов, + // для объектов записанных по обмену данными + // регистрируем изменения всегда + Возврат Истина; + + ИначеЕсли РежимЗаписи <> Неопределено + И ИзмененоПроведениеДокумента(Источник, РежимЗаписи) Тогда + + // если изменен признак документа "Проведен", то считаем документ измененным + Возврат Истина; + КонецЕсли; + + ИмяОбъекта = ОбъектМетаданных.ПолноеИмя(); + + ТаблицаРеквизитовРегистрации = ОбменДаннымиПовтИсп.ПолучитьТаблицуРеквизитовРегистрации(ИмяОбъекта, ИмяПланаОбмена); + + Если ТаблицаРеквизитовРегистрации.Количество() = 0 Тогда + + // если правила ВРО не заданы, то считаем, что фильтра ВРО нет. + // объект модифицирован всегда + Возврат Истина; + + КонецЕсли; + + Для Каждого СтрокаТаблицыРеквизитовРегистрации ИЗ ТаблицаРеквизитовРегистрации Цикл + + ЕстьИзмененияВерсийОбъектов = ОпределитьИзмененияВерсийОбъекта(Источник, СтрокаТаблицыРеквизитовРегистрации); + + Если ЕстьИзмененияВерсийОбъектов Тогда + + Возврат Истина; + + КонецЕсли; + + КонецЦикла; + + // если дошли до конца, то объект не изменился по реквизитам регистрации; + // регистрация на узлах не нужна + Возврат Ложь; + +КонецФункции + +Функция ОпределитьИзмененияВерсийОбъекта(Объект, СтрокаТаблицыРеквизитовРегистрации) + + Если ПустаяСтрока(СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти) Тогда // реквизиты Шапки объекта + + ТаблицаРеквизитовРегистрацииВерсияОбъектаДоИзменения = ПолучитьТаблицуРеквизитовРегистрацииШапкиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); + + ТаблицаРеквизитовРегистрацииВерсияОбъектаПослеИзменения = ПолучитьТаблицуРеквизитовРегистрацииШапкиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); + + Иначе // реквизиты ТЧ объекта + + ТаблицаРеквизитовРегистрацииВерсияОбъектаДоИзменения = ПолучитьТаблицуРеквизитовРегистрацииТабличнойЧастиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); + + ТаблицаРеквизитовРегистрацииВерсияОбъектаПослеИзменения = ПолучитьТаблицуРеквизитовРегистрацииТабличнойЧастиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации); + + КонецЕсли; + + Возврат Не ТаблицыРеквизитовРегистрацииОдинаковые(ТаблицаРеквизитовРегистрацииВерсияОбъектаДоИзменения, ТаблицаРеквизитовРегистрацииВерсияОбъектаПослеИзменения, СтрокаТаблицыРеквизитовРегистрации); + +КонецФункции + +Функция ПолучитьТаблицуРеквизитовРегистрацииШапкиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) + + ТекстЗапроса = " + |ВЫБРАТЬ " + СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации + + " ИЗ " + СтрокаТаблицыРеквизитовРегистрации.ИмяОбъекта + " КАК ТекущийОбъект + |ГДЕ + | ТекущийОбъект.Ссылка = &Ссылка + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +Функция ПолучитьТаблицуРеквизитовРегистрацииТабличнойЧастиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) + + ТекстЗапроса = " + |ВЫБРАТЬ "+ СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации + + " ИЗ " + СтрокаТаблицыРеквизитовРегистрации.ИмяОбъекта + + "." + СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти + " КАК ТекущийОбъектИмяТабличнойЧасти + |ГДЕ + | ТекущийОбъектИмяТабличнойЧасти.Ссылка = &Ссылка + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +Функция ПолучитьТаблицуРеквизитовРегистрацииШапкиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) + + СтруктураРеквизитовРегистрации = СтрокаТаблицыРеквизитовРегистрации.СтруктураРеквизитовРегистрации; + + ТаблицаРеквизитовРегистрации = Новый ТаблицаЗначений; + + Для Каждого РеквизитРегистрации ИЗ СтруктураРеквизитовРегистрации Цикл + + ТаблицаРеквизитовРегистрации.Колонки.Добавить(РеквизитРегистрации.Ключ); + + КонецЦикла; + + СтрокаТаблицы = ТаблицаРеквизитовРегистрации.Добавить(); + + Для Каждого РеквизитРегистрации ИЗ СтруктураРеквизитовРегистрации Цикл + + СтрокаТаблицы[РеквизитРегистрации.Ключ] = Объект[РеквизитРегистрации.Ключ]; + + КонецЦикла; + + Возврат ТаблицаРеквизитовРегистрации; +КонецФункции + +Функция ПолучитьТаблицуРеквизитовРегистрацииТабличнойЧастиПослеИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) + + ТаблицаРеквизитовРегистрации = Объект[СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти].Выгрузить(, СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации); + + Возврат ТаблицаРеквизитовРегистрации; + +КонецФункции + +Функция ТаблицыРеквизитовРегистрацииОдинаковые(Таблица1, Таблица2, СтрокаТаблицыРеквизитовРегистрации) + + ДобавитьИтераторТаблице(Таблица1, +1); + ДобавитьИтераторТаблице(Таблица2, -1); + + ТаблицаРезультат = Таблица1.Скопировать(); + + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(Таблица2, ТаблицаРезультат); + + ТаблицаРезультат.Свернуть(СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации, "ИтераторТаблицыРеквизитовРегистрации"); + + КоличествоОдинаковыхСтрок = ТаблицаРезультат.НайтиСтроки(Новый Структура ("ИтераторТаблицыРеквизитовРегистрации", 0)).Количество(); + + КоличествоСтрокТаблицы = ТаблицаРезультат.Количество(); + + Возврат КоличествоОдинаковыхСтрок = КоличествоСтрокТаблицы; + +КонецФункции + +Функция ИзмененоПроведениеДокумента(Источник, РежимЗаписи) + + Возврат (Источник.Проведен И РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения) + ИЛИ (НЕ Источник.Проведен И РежимЗаписи = РежимЗаписиДокумента.Проведение); + +КонецФункции + +Процедура ДобавитьИтераторТаблице(Таблица, ЗначениеИтератора) + + Таблица.Колонки.Добавить("ИтераторТаблицыРеквизитовРегистрации"); + + Таблица.ЗаполнитьЗначения(ЗначениеИтератора, "ИтераторТаблицыРеквизитовРегистрации"); + +КонецПроцедуры + +Процедура ДополнитьТаблицуУзлов(МассивУзлов, ИтоговаяТаблицаУзлов, Итератор) + + Для Каждого УзелИнформационнойБазы ИЗ МассивУзлов Цикл + + СтрокаТаблицы = ИтоговаяТаблицаУзлов.Добавить(); + СтрокаТаблицы.УзелИнформационнойБазы = УзелИнформационнойБазы; + СтрокаТаблицы.Итератор = Итератор; + + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МЕХАНИЗМА РЕГИСТРАЦИИ ОБЪЕКТОВ (ПРО) + +Процедура ОпределитьМассивУзловДляОбъекта(Источник, ОбъектМетаданных, ПланыОбменаДляРегистрации, ЭтоУдалениеОбъекта) + + ПроверятьСсылку = Не Источник.ЭтоНовый() И Не ЭтоУдалениеОбъекта; + + // получаем правило регистрации для объекта метаданных; + // в зависимости о используемых планов обмена (см. ВРО) + // правило каждый раз имеет разный состав параметров + ОбщееПравилоРегистрацииОбъекта = ПолучитьОбщееПравилоРегистрацииОбъекта(ПланыОбменаДляРегистрации, ОбъектМетаданных, Источник, ПроверятьСсылку); + + Если ОбщееПравилоРегистрацииОбъекта = Неопределено Тогда + + // 1. динамически-созданное правило оказалось пустым + // 2. объект не прошел фильтр ПРОБ + Возврат; + + КонецЕсли; + + Если Не ПроверятьСсылку Тогда + + ЗначенияСвойствСсылки = Неопределено; + + Иначе + + // получаем структуру значений свойств для ссылки + ЗначенияСвойствСсылки = ПолучитьЗначенияСвойствДляСсылки(Источник.Ссылка, ОбщееПравилоРегистрацииОбъекта, ОбъектМетаданных); + + КонецЕсли; + + // получаем структуру значений свойств для объекта + ЗначенияСвойствОбъекта = ПолучитьЗначенияСвойствДляОбъекта(Источник, ОбщееПравилоРегистрацииОбъекта); + + // для новых объектов и для удаляемых физически объектов определяем узлы только по значениям свойств объекта; + // + // если ключевые реквизиты (элементы отбора) ссылки и объекта одинаковы, + // то массив узлов определяем только по значениям реквизитов объекта, + // т.к. они одинаковы для ссылки и для объекта. + // (оптимизиция - не выполняем лишний запрос к ИБ для получения реквизитов ссылки) + Если Не ПроверятьСсылку Тогда + + // определяем массив узлов для регистрации объекта + МассивУзловДляРегистрации = ОпределитьМассивУзловПоЗначениямСвойств(ЗначенияСвойствОбъекта, ОбщееПравилоРегистрацииОбъекта, ОбъектМетаданных, ПланыОбменаДляРегистрации); + + // добавляем узлы для регистрации + ДополнитьМассивПолучателейУзламиИзМассива(Источник, МассивУзловДляРегистрации); + + ИначеЕсли НЕ ЗначенияСвойствОбъектаИзменены(ЗначенияСвойствСсылки, ЗначенияСвойствОбъекта) Тогда + + // определяем массив узлов для регистрации объекта + МассивУзловДляРегистрации = ОпределитьМассивУзловПоЗначениямСвойств(ЗначенияСвойствОбъекта, ОбщееПравилоРегистрацииОбъекта, ОбъектМетаданных, ПланыОбменаДляРегистрации); + + // добавляем узлы для регистрации + ДополнитьМассивПолучателейУзламиИзМассива(Источник, МассивУзловДляРегистрации); + + Иначе // ключевые реквизиты фильтрации объекта по узлам изменены + + // определяем массив узлов для регистрации ссылки + МассивУзловДляРегистрации = ОпределитьМассивУзловПоЗначениямСвойств(ЗначенияСвойствСсылки, ОбщееПравилоРегистрацииОбъекта, ОбъектМетаданных, ПланыОбменаДляРегистрации); + + // добавляем узлы для регистрации + ДополнитьМассивПолучателейУзламиИзМассива(Источник, МассивУзловДляРегистрации); + + // определяем массив узлов для регистрации объекта + МассивУзловДляРегистрации = ОпределитьМассивУзловПоЗначениямСвойств(ЗначенияСвойствОбъекта, ОбщееПравилоРегистрацииОбъекта, ОбъектМетаданных, ПланыОбменаДляРегистрации); + + // добавляем узлы для регистрации + ДополнитьМассивПолучателейУзламиИзМассива(Источник, МассивУзловДляРегистрации); + + КонецЕсли; + +КонецПроцедуры + +Процедура ОпределитьМассивУзловДляНабораЗаписей(Источник, ОбъектМетаданных, ПланыОбменаДляРегистрации, Замещение) + + // получаем правило регистрации для объекта метаданных; + // в зависимости о используемых планов обмена (см. ВРО) + // правило каждый раз имеет разный состав параметров + ОбщееПравилоРегистрацииОбъекта = ПолучитьОбщееПравилоРегистрацииОбъекта(ПланыОбменаДляРегистрации, ОбъектМетаданных, Источник, Ложь, Истина); + + Если ОбщееПравилоРегистрацииОбъекта = Неопределено Тогда + + // 1. динамически-созданное правило оказалось пустым + // 2. объект не прошел фильтр ПРОБ + Возврат; + + КонецЕсли; + + Если Замещение Тогда + + // определяем старый набор записей из глобального контекста + ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных); + + Если ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыСведений() Тогда + + СтарыйНаборЗаписей = РегистрыСведений[ОбъектМетаданных.Имя].СоздатьНаборЗаписей(); + + ИначеЕсли ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыНакопления() Тогда + + СтарыйНаборЗаписей = РегистрыНакопления[ОбъектМетаданных.Имя].СоздатьНаборЗаписей(); + + ИначеЕсли ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыБухгалтерии() Тогда + + СтарыйНаборЗаписей = РегистрыБухгалтерии[ОбъектМетаданных.Имя].СоздатьНаборЗаписей(); + + ИначеЕсли ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаРегистрыРасчета() Тогда + + СтарыйНаборЗаписей = РегистрыРасчета[ОбъектМетаданных.Имя].СоздатьНаборЗаписей(); + + Иначе + + Возврат; // внутренняя ошибка (ошибка встраивания библиотеки) + + КонецЕсли; + + Для Каждого ЗначениеОтбора Из Источник.Отбор Цикл + + Если ЗначениеОтбора.Использование = Ложь Тогда + Продолжить; + КонецЕсли; + + СтрокаОтбора = СтарыйНаборЗаписей.Отбор.Найти(ЗначениеОтбора.Имя); + СтрокаОтбора.Значение = ЗначениеОтбора.Значение; + СтрокаОтбора.Использование = Истина; + + КонецЦикла; + + СтарыйНаборЗаписей.Прочитать(); + + // определяем массив узлов-получателей по старому набору записей + ОпределитьМассивПолучателейПоНаборуЗаписей(Источник, СтарыйНаборЗаписей, ОбщееПравилоРегистрацииОбъекта, ОбъектМетаданных, ПланыОбменаДляРегистрации); + + КонецЕсли; + + // определяем массив узлов-получателей по текущему набору записей + ОпределитьМассивПолучателейПоНаборуЗаписей(Источник, Источник, ОбщееПравилоРегистрацииОбъекта, ОбъектМетаданных, ПланыОбменаДляРегистрации); + +КонецПроцедуры + +Процедура ОпределитьМассивПолучателейПоНаборуЗаписей(Источник, НаборЗаписей, ОбщееПравилоРегистрацииОбъекта, ОбъектМетаданных, ПланыОбменаДляРегистрации) + + // получаем значение регистратора из отбора для набора записей + Регистратор = Неопределено; + + ЭлементОтбора = НаборЗаписей.Отбор.Найти("Регистратор"); + + ЕстьРегистратор = ЭлементОтбора <> Неопределено; + + Если ЕстьРегистратор Тогда + + Регистратор = ЭлементОтбора.Значение; + + КонецЕсли; + + Для Каждого СтрокаНабора ИЗ НаборЗаписей Цикл + + Если ЕстьРегистратор И СтрокаНабора["Регистратор"] = Неопределено Тогда + + Если Регистратор <> Неопределено Тогда + + СтрокаНабора["Регистратор"] = Регистратор; + + КонецЕсли; + + КонецЕсли; + + // получаем структуру значений свойств для объекта + ЗначенияСвойствОбъекта = ПолучитьЗначенияСвойствДляОбъекта(СтрокаНабора, ОбщееПравилоРегистрацииОбъекта); + + // определяем массив узлов для регистрации объекта + МассивУзловДляРегистрации = ОпределитьМассивУзловПоЗначениямСвойств(ЗначенияСвойствОбъекта, ОбщееПравилоРегистрацииОбъекта, ОбъектМетаданных, ПланыОбменаДляРегистрации); + + // добавляем узлы для регистрации + ДополнитьМассивПолучателейУзламиИзМассива(Источник, МассивУзловДляРегистрации); + + КонецЦикла; + +КонецПроцедуры + +Функция ОпределитьМассивУзловПоЗначениямСвойств(ЗначенияСвойств, ПРО, ОбъектМетаданных, ПланыОбменаДляРегистрации) + + // возвращаемое значение функции + МассивУзловРезультат = Новый Массив; + + // подготавливаем запрос для получения узлов планов обмена + Запрос = Новый Запрос; + + // текст запроса + Запрос.Текст = ПРО.ТекстЗапроса; + + // добавляем параметры, которые присутствуют всегда + Для Каждого ИмяПланаОбмена ИЗ ПланыОбменаДляРегистрации Цикл + + Запрос.УстановитьПараметр(ИмяПланаОбмена + "ЭтотУзел", ОбменДаннымиПовтИсп.ПолучитьЭтотУзелПланаОбмена(ИмяПланаОбмена)); + + КонецЦикла; + + // задаем значения параметров запроса из свойств объекта + Для Каждого Элемент ИЗ ЗначенияСвойств Цикл + + Запрос.УстановитьПараметр("СвойствоОбъекта_" + Элемент.Ключ, Элемент.Значение); + + КонецЦикла; + + Попытка + МассивУзловРезультат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + Исключение + + // фиксируем ошибку в ЖР + + СтрокаСообщения = НСтр("ru = 'Ошибка при получении списка узлов получателей. Ошибка выполнения запроса: [ОписаниеОшибки]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОписаниеОшибки]", ОписаниеОшибки()); + ЗаписьЖурналаРегистрацииПРО(СтрокаСообщения, ОбъектМетаданных); + + Возврат Новый Массив // возвращаем пустой массив + + КонецПопытки; + + // возвращаем результирующий массив узлов + Возврат МассивУзловРезультат; + +КонецФункции + +Функция ПолучитьЗначенияСвойствДляОбъекта(Объект, ПРО) + + ЗначенияСвойств = Новый Структура; + + Для Каждого Элемент ИЗ ПРО.СвойстваОбъекта Цикл + + ЗначенияСвойств.Вставить(Элемент.Ключ, ПолучитьЗначениеСвойстваОбъекта(Объект, Элемент.Значение)); + + КонецЦикла; + + Возврат ЗначенияСвойств; + +КонецФункции + +Функция ПолучитьЗначениеСвойстваОбъекта(Объект, СтрокаСвойствОбъекта) + + Значение = Объект; + + МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаСвойствОбъекта, "."); + + // значение получаем с учетом возможного разыменования свойства + Для Каждого ИмяСвойства ИЗ МассивПодстрок Цикл + + Значение = Значение[ИмяСвойства]; + + КонецЦикла; + + Возврат Значение; + +КонецФункции + +Функция ПолучитьЗначенияСвойствДляСсылки(Ссылка, ПРО, ОбъектМетаданных) + + ЗначенияСвойств = СкопироватьСтруктуру(ПРО.СвойстваОбъекта); + + Если ЗначенияСвойств.Количество() = 0 Тогда + + Возврат ЗначенияСвойств; // возвращаем пустую структуру + + КонецЕсли; + + ТекстЗапроса = " + |ВЫБРАТЬ + | [СвойстваОбъектаСтрокой] + |ИЗ + | [ОбъектМетаданныхИмя] КАК Таблица + |ГДЕ + | Таблица.Ссылка = &Ссылка + |"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[СвойстваОбъектаСтрокой]", ПРО.СвойстваОбъектаСтрокой); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ОбъектМетаданныхИмя]", ПРО.ОбъектМетаданныхИмя); + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + + Попытка + Выборка = Запрос.Выполнить().Выбрать(); + Исключение + + // фиксируем ошибку в ЖР + СтрокаСообщения = НСтр("ru = 'Ошибка при получении свойств ссылки. Ошибка выполнения запроса: [ОписаниеОшибки]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОписаниеОшибки]", ОписаниеОшибки()); + ЗаписьЖурналаРегистрацииПРО(СтрокаСообщения, ОбъектМетаданных); + + // устанавливаем все свойства в значение "Неопределено" + Для Каждого Элемент ИЗ ЗначенияСвойств Цикл + + ЗначенияСвойств[Элемент.Ключ] = Неопределено; + + КонецЦикла; + + Возврат ЗначенияСвойств; + КонецПопытки; + + Если Выборка.Следующий() Тогда + + Для Каждого Элемент ИЗ ЗначенияСвойств Цикл + + ЗначенияСвойств[Элемент.Ключ] = Выборка[Элемент.Ключ]; + + КонецЦикла; + + КонецЕсли; + + Возврат ЗначенияСвойств; + +КонецФункции + +Функция ЗначенияСвойствОбъектаИзменены(ЗначенияСвойств1, ЗначенияСвойств2) + + Для Каждого Элемент ИЗ ЗначенияСвойств1 Цикл + + Если ЗначенияСвойств1[Элемент.Ключ] <> ЗначенияСвойств2[Элемент.Ключ] Тогда + + Возврат Истина; // есть различия + + КонецЕсли; + + КонецЦикла; + + // если дошли до конца, то структуры имеют одинаковые значения свойств + Возврат Ложь; + +КонецФункции + +Функция СкопироватьСтруктуру(СтруктураИсточник) + + СтруктураРезультат = Новый Структура; + + Для Каждого Элемент ИЗ СтруктураИсточник Цикл + + СтруктураРезультат.Вставить(Элемент.Ключ, Элемент.Значение); + + КонецЦикла; + + Возврат СтруктураРезультат; + +КонецФункции + +Процедура ДополнитьМассивПолучателейУзламиИзМассива(Источник, МассивУзлов) + + Для Каждого Элемент Из МассивУзлов Цикл + + Попытка + + Источник.ОбменДанными.Получатели.Добавить(Элемент); + + Исключение + + // фиксируем ошибку в ЖР + ИмяПланаОбмена = Элемент.Метаданные().Имя; + + ОбъектМетаданных = Источник.Метаданные(); + + СтрокаСообщения = НСтр("ru = 'Для состава плана обмена [ИмяПланаОбмена] не указана регистрация объекта [ПолноеИмя]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ИмяПланаОбмена]", ИмяПланаОбмена); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ПолноеИмя]", ОбъектМетаданных.ПолноеИмя()); + + ЗаписьЖурналаРегистрацииПРО(СтрокаСообщения, ОбъектМетаданных); + + КонецПопытки; + + КонецЦикла; + +КонецПроцедуры + +Процедура УдалитьУзлыАвторегистрацииПоПлануОбмена(Источник, ИмяПланаОбмена) + + // все узлы для текущего плана обмена + МассивУзловПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьМассивУзловПланаОбмена(ИмяПланаОбмена); + + ИтоговаяТаблицаУзлов = Новый ТаблицаЗначений; + ИтоговаяТаблицаУзлов.Колонки.Добавить("УзелИнформационнойБазы"); + ИтоговаяТаблицаУзлов.Колонки.Добавить("Итератор"); + + // заполняем ТЗ узлами авторегистрации для всех планов обмена + ДополнитьТаблицуУзлов(Источник.ОбменДанными.Получатели, ИтоговаяТаблицаУзлов, +1); + + // заполняем ТЗ узлами авторегистрации для текущего плана обмена + ДополнитьТаблицуУзлов(МассивУзловПланаОбмена, ИтоговаяТаблицаУзлов, -1); + + ИтоговаяТаблицаУзлов.Свернуть("УзелИнформационнойБазы", "Итератор"); + + // отбираем строки + Отбор = Новый Структура("Итератор", 1); + + МассивУзловРезультат = ИтоговаяТаблицаУзлов.Скопировать(Отбор, "УзелИнформационнойБазы").ВыгрузитьКолонку("УзелИнформационнойБазы"); + + // очищаем список получателей и заполняем его заново + Источник.ОбменДанными.Получатели.Очистить(); + + // добавляем узлы для регистрации объекта + ДополнитьМассивПолучателейУзламиИзМассива(Источник, МассивУзловРезультат); + +КонецПроцедуры + +// ФУНКЦИИ ДИНАМИЧЕСКОГО СОЗДАНИЯ ОБЩЕГО ПРАВИЛА РЕГИСТАЦИИ ОБЪЕКТА + +Функция ПолучитьОбщееПравилоРегистрацииОбъекта(ПланыОбменаДляРегистрации, ОбъектМетаданных, Источник, ПроверятьСсылку, ЭтоНаборЗаписейРегистра = Ложь) + + ОбъектМетаданныхПолноеИмя = ОбъектМетаданных.ПолноеИмя(); + + // получаем массив всех ПРО для текущего объекта метаданных + МассивПравилРегистрацииОбъекта = ПолучитьМассивПравилРегистрацииОбъекта(Источник, ПланыОбменаДляРегистрации, ОбъектМетаданных, ОбъектМетаданныхПолноеИмя); + + Если МассивПравилРегистрацииОбъекта.Количество() = 0 Тогда + + // фиксируем ошибку в журнале регистрации + СтрокаСообщения = НСтр("ru = 'Для объекта [ОбъектМетаданныхПолноеИмя] не заданы правила регистрации.'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОбъектМетаданныхПолноеИмя]", ОбъектМетаданныхПолноеИмя); + ЗаписьЖурналаРегистрацииПРО(СтрокаСообщения, ОбъектМетаданных); + + Возврат Неопределено // ПРО для объекта не заданы ни для одного плана обмена + КонецЕсли; + + // выполняем правила регистрации по свойствам Объекта; + // если на заданном Плане обмена регистрировать объект не нужно, + // то удаляем это правило регистрации из массива правил МассивПравилРегистрацииОбъекта; + // таким образом выключаем ПРО для соответствующего Плана обмена + // ПРО = ПРОБ + ПРОП + // + // ПРОБ - Правила регистрации по свойствам Объекта + // ПРОП - Правила регистрации по свойствам Плана обмена + + Если ЭтоНаборЗаписейРегистра Тогда + + Для Каждого СтрокаНабора ИЗ Источник Цикл + + ПравилаРегистрацииПоСвойствамОбъекта(МассивПравилРегистрацииОбъекта, СтрокаНабора, Ложь); + + КонецЦикла; + + Иначе + + ПравилаРегистрацииПоСвойствамОбъекта(МассивПравилРегистрацииОбъекта, Источник, ПроверятьСсылку); + + КонецЕсли; + + Если МассивПравилРегистрацииОбъекта.Количество() = 0 Тогда + Возврат Неопределено; // по результату работы ПРОБ - объект регистрации не подлежит; выходим + КонецЕсли; + + // получаем структуру свойств объекта для всех используемых планов обмена + СвойстваОбъекта = ПолучитьСвойстваОбъектаПоПравиламРегистрацииОбъекта(МассивПравилРегистрацииОбъекта); + + // получаем свойства объекта в строковом представлении + СвойстваОбъектаСтрокой = ПолучитьСвойстваОбъектаСтрокой(СвойстваОбъекта); + + // получаем текст запроса + ТекстЗапроса = ПолучитьТекстЗапросаПоПравиламРегистрацииОбъекта(МассивПравилРегистрацииОбъекта); + + // создаем ПРО из полученных значений параметров + ОбщееПравилоРегистрацииОбъекта = Новый Структура; + + ОбщееПравилоРегистрацииОбъекта.Вставить("ОбъектМетаданныхИмя", ОбъектМетаданныхПолноеИмя); + ОбщееПравилоРегистрацииОбъекта.Вставить("ТекстЗапроса", ТекстЗапроса); + ОбщееПравилоРегистрацииОбъекта.Вставить("СвойстваОбъекта", СвойстваОбъекта); + ОбщееПравилоРегистрацииОбъекта.Вставить("СвойстваОбъектаСтрокой", СвойстваОбъектаСтрокой); + + Возврат ОбщееПравилоРегистрацииОбъекта + +КонецФункции + +Функция ПолучитьМассивПравилРегистрацииОбъекта(Объект, ПланыОбменаДляРегистрации, ОбъектМетаданных, ОбъектМетаданныхПолноеИмя) + + // возвращаемое значение функции + Результат = Новый Массив; + + // получаем правила регистрации объектов + ПравилаРегистрацииОбъектов = ПараметрыСеанса.ПравилаРегистрацииОбъектов.Получить(); + + // устанавливаем отбор для поиска нужного ПРО + Отбор = Новый Структура; + Отбор.Вставить("ОбъектМетаданныхИмя", ОбъектМетаданныхПолноеИмя); + + Для Каждого ИмяПланаОбмена ИЗ ПланыОбменаДляРегистрации Цикл + + Отбор.Вставить("ИмяПланаОбмена", ИмяПланаОбмена); + + // получаем правило регистрации для объекта метаданных по текущему ПО + ПравилоРегистрацииОбъекта = ПравилаРегистрацииОбъектов.НайтиСтроки(Отбор); + + Если ПравилоРегистрацииОбъекта.Количество() = 0 Тогда + + // фиксируем ошибку в журнале регистрации + СтрокаСообщения = НСтр("ru = 'Для плана обмена [ИмяПланаОбмена] для объекта [ОбъектМетаданныхПолноеИмя] не задано правило регистрации'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ИмяПланаОбмена]", ИмяПланаОбмена); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОбъектМетаданныхПолноеИмя]", ОбъектМетаданныхПолноеИмя); + ЗаписьЖурналаРегистрацииПРО(СтрокаСообщения, ОбъектМетаданных); + + Продолжить; + + КонецЕсли; + + // получаем все найденные ПРО для объекта метаданных + Для Каждого ПРО ИЗ ПравилоРегистрацииОбъекта Цикл + + // {Обработчик: Перед обработкой} Начало + Отказ = Ложь; + + ВыполнитьОбработчикПередОбработкойПРО(ПРО, Отказ, Объект, ОбъектМетаданных); + + Если Отказ Тогда + Продолжить; // пропускаем правило + КонецЕсли; + // {Обработчик: Перед обработкой} Окончание + + // все отобранные ПРО для текущего объекта метаданнх будут выполнены по условию "ИЛИ" + Результат.Добавить(ПРО); + + КонецЦикла; + + КонецЦикла; + + Возврат Результат + +КонецФункции + +Функция ПолучитьСвойстваОбъектаПоПравиламРегистрацииОбъекта(МассивПравилРегистрацииОбъекта) + + СвойстваОбъекта = Новый Структура; + + Для Каждого ПРО ИЗ МассивПравилРегистрацииОбъекта Цикл + + Для Каждого Элемент ИЗ ПРО.СвойстваОбъекта Цикл + + СвойстваОбъекта.Вставить(Элемент.Ключ, Элемент.Значение); + + КонецЦикла; + + КонецЦикла; + + Возврат СвойстваОбъекта; + +КонецФункции + +// возвращает свойства объекта в строковом представлении +Функция ПолучитьСвойстваОбъектаСтрокой(СвойстваОбъекта) + + Результат = ""; + + Для Каждого Элемент ИЗ СвойстваОбъекта Цикл + + Результат = Результат + Элемент.Значение + " КАК " + Элемент.Ключ + ", "; + + КонецЦикла; + + // удаляем последние два символа + СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(Результат, 2); + + Возврат Результат; + +КонецФункции + +Функция ПолучитьТекстЗапросаПоПравиламРегистрацииОбъекта(МассивПравилРегистрацииОбъекта) + + ТекстЗапроса = ""; + + Для Каждого ПРО ИЗ МассивПравилРегистрацииОбъекта Цикл + + СтрокаЛитерала = ?(ПустаяСтрока(ТекстЗапроса),"", Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС); + + ТекстЗапроса = ТекстЗапроса + СтрокаЛитерала + ПРО.ТекстЗапроса; + + КонецЦикла; + + Возврат ТекстЗапроса; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МЕХАНИЗМА РЕГИСТРАЦИИ ОБЪЕКТОВ ПРИ ВЫГРУЗКЕ ДАННЫХ (ПРО) + +// Получает массив узлов-получателей для объекта при заданном плане обмена +// +// Параметры: +// Источник - СправочникОбъект или ДокументОбъект - источник для получения значений реквизитов и др. свойств +// ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе +// +// Возвращаемое значение: +// МассивУзловРезультат - Массив - массив узлов-получателей для объекта +// +Функция ОпределитьПолучателейПриРегистрацииДанных(Источник, ОбъектМетаданных, Знач ИмяПланаОбмена) Экспорт + + // определяем массив узлов по правилам регистрации + МассивУзловРезультат = ОпределитьМассивУзловДляОбъектаПоПлануОбмена(Источник, ОбъектМетаданных, ИмяПланаОбмена); + + Возврат МассивУзловРезультат; + +КонецФункции + +// Получает массив узлов-получателей для объекта при заданном плане обмена +// +// Параметры: +// Источник - СправочникОбъект или ДокументОбъект - источник для получения значений реквизитов и др. свойств +// ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе +// +// Возвращаемое значение: +// МассивУзловРезультат - Массив - массив узлов-получателей для объекта +// +Функция ОпределитьПолучателейПриВыгрузкеДанных(Источник, ОбъектМетаданных, Знач ИмяПланаОбмена) + + Если АвтоРегистрацияРазрешена(ОбъектМетаданных, ИмяПланаОбмена) Тогда + + // определяем массив узлов по Авторегистрации + МассивУзловРезультат = ОпределитьМассивУзловАвторегистрации(Источник); + + Иначе + + // определяем массив узлов по правилам регистрации + МассивУзловРезультат = ОпределитьМассивУзловДляОбъектаПоПлануОбмена(Источник, ОбъектМетаданных, ИмяПланаОбмена); + + КонецЕсли; + + Возврат МассивУзловРезультат + +КонецФункции + +Функция ОпределитьПолучателейПриВыгрузкеСтрокиНабораЗаписей(Источник, СтрокаНабора, ОбъектМетаданных, Знач ИмяПланаОбмена) + + // возвращаемое значение функции + МассивУзловДляРегистрации = Новый Массив; + + // массив с одним элементом + ПланыОбменаДляРегистрации = Новый Массив; + ПланыОбменаДляРегистрации.Добавить(ИмяПланаОбмена); + + // получаем правило регистрации для объекта метаданных; + ОбщееПравилоРегистрацииОбъекта = ПолучитьОбщееПравилоРегистрацииОбъекта(ПланыОбменаДляРегистрации, ОбъектМетаданных, Источник, Ложь, Истина); + + Если ОбщееПравилоРегистрацииОбъекта = Неопределено Тогда + + // 1. динамически-созданное правило оказалось пустым + // 2. объект не прошел фильтр ПРОБ + // возвращаем пустой массив + Возврат МассивУзловДляРегистрации; + КонецЕсли; + + // получаем структуру значений свойств для объекта + ЗначенияСвойствОбъекта = ПолучитьЗначенияСвойствДляОбъекта(СтрокаНабора, ОбщееПравилоРегистрацииОбъекта); + + // определяем массив узлов для регистрации объекта + МассивУзловДляРегистрации = ОпределитьМассивУзловПоЗначениямСвойств(ЗначенияСвойствОбъекта, ОбщееПравилоРегистрацииОбъекта, ОбъектМетаданных, ПланыОбменаДляРегистрации); + + Возврат МассивУзловДляРегистрации; + +КонецФункции + +Функция ОпределитьМассивУзловДляОбъектаПоПлануОбмена(Источник, ОбъектМетаданных, ИмяПланаОбмена) + + // возвращаемое значение функции + МассивУзловДляРегистрации = Новый Массив; + + // массив с одним элементом + ПланыОбменаДляРегистрации = Новый Массив; + ПланыОбменаДляРегистрации.Добавить(ИмяПланаОбмена); + + // получаем правило регистрации для объекта метаданных; + ОбщееПравилоРегистрацииОбъекта = ПолучитьОбщееПравилоРегистрацииОбъекта(ПланыОбменаДляРегистрации, ОбъектМетаданных, Источник, Ложь); + + Если ОбщееПравилоРегистрацииОбъекта = Неопределено Тогда + + // 1. динамически-созданное правило оказалось пустым + // 2. объект не прошел фильтр ПРОБ + // возвращаем пустой массив + Возврат МассивУзловДляРегистрации + КонецЕсли; + + // получаем структуру значений свойств для объекта + ЗначенияСвойствОбъекта = ПолучитьЗначенияСвойствДляОбъекта(Источник, ОбщееПравилоРегистрацииОбъекта); + + // определяем массив узлов для регистрации объекта + МассивУзловДляРегистрации = ОпределитьМассивУзловПоЗначениямСвойств(ЗначенияСвойствОбъекта, ОбщееПравилоРегистрацииОбъекта, ОбъектМетаданных, ПланыОбменаДляРегистрации); + + Возврат МассивУзловДляРегистрации + +КонецФункции + +Функция ОпределитьМассивУзловАвторегистрации(Объект) + + МассивУзловАвторегистрации = Новый Массив; + + Объект.ОбменДанными.Получатели.Заполнить(); + + Для Каждого Элемент Из Объект.ОбменДанными.Получатели Цикл + + МассивУзловАвторегистрации.Добавить(Элемент); + + КонецЦикла; + + Возврат МассивУзловАвторегистрации; + +КонецФункции + +Функция АвтоРегистрацияРазрешена(ОбъектМетаданных, ИмяПланаОбмена) + + // получаем коллекцию объектов метаданных, входящих в состав плана обмена + СоставПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав; + + ЭлементСоставаПланаОбмена = СоставПланаОбмена.Найти(ОбъектМетаданных); + + Если ЭлементСоставаПланаОбмена = Неопределено Тогда + Возврат Истина; // объект метаданных не входит в состав плана обмена + КонецЕсли; + + Возврат ЭлементСоставаПланаОбмена.АвтоРегистрация = АвтоРегистрацияИзменений.Разрешить; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ПРАВИЛ РЕГИСТРАЦИИ ПО СВОЙСТВАМ ОБЪЕКТА + +Процедура ПравилаРегистрацииПоСвойствамОбъекта(МассивПравилРегистрацииОбъекта, Объект, ПроверятьСсылку) + + КолвоЭлементовКоллекции = МассивПравилРегистрацииОбъекта.Количество(); + + Для ОбратныйИндекс = 1 По КолвоЭлементовКоллекции Цикл + + ТекущийИндекс = КолвоЭлементовКоллекции - ОбратныйИндекс; + + ПРО = МассивПравилРегистрацииОбъекта[ТекущийИндекс]; + + Если Не ПРО.ПравилоПоСвойствамОбъектаПустое И Не ОбъектПрошелФильтрПравилРегистрацииПоСвойствам(ПРО, Объект, ПроверятьСсылку) Тогда + + МассивПравилРегистрацииОбъекта.Удалить(ТекущийИндекс); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаполнитьЗначенияСвойствИзОбъекта(ДеревоЗначений, Объект) + + Для Каждого СтрокаДерева ИЗ ДеревоЗначений.Строки Цикл + + Если СтрокаДерева.ЭтоГруппа Тогда + + ЗаполнитьЗначенияСвойствИзОбъекта(СтрокаДерева, Объект); + + Иначе + + СтрокаДерева.ЗначениеСвойства = ПолучитьЗначениеСвойстваОбъекта(Объект, СтрокаДерева.СвойствоОбъекта); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ПолучитьЗначенияАлгоритмовКонстант(ПРО, ДеревоЗначений) + + Для Каждого СтрокаДерева Из ДеревоЗначений.Строки Цикл + + Если СтрокаДерева.ЭтоГруппа Тогда + + ПолучитьЗначенияАлгоритмовКонстант(ПРО, СтрокаДерева); + + Иначе + + Если СтрокаДерева.ВидЭлементаОтбора = ОбменДаннымиСервер.ЭлементОтбораСвойствоАлгоритмЗначения() Тогда + + Значение = Неопределено; + + Попытка + + Выполнить(СтрокаДерева.ЗначениеКонстанты); + + Исключение + + // фиксируем ошибку в журнале регистрации + СтрокаСообщения = НСтр("ru = 'Ошибка алгоритма вычисления значения константы: + |План обмена: [ИмяПланаОбмена] + |Объект метаданных: [ОбъектМетаданныхИмя] + |Описание ошибки: [Описание] + |Алгоритм: + |// {Начало алгоритма} + |[ЗначениеКонстанты] + |// {Окончание алгоритма} + |'"); + // + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ИмяПланаОбмена]", ПРО.ИмяПланаОбмена); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОбъектМетаданныхИмя]", ПРО.ОбъектМетаданныхИмя); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[Описание]", ИнформацияОбОшибке().Описание); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ЗначениеКонстанты]", Строка(СтрокаДерева.ЗначениеКонстанты)); + + ЗаписьЖурналаРегистрацииПРО(СтрокаСообщения); + + КонецПопытки; + + СтрокаДерева.ЗначениеКонстанты = Значение; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура СоздатьДопустимыйОтборПоСвойствам(Объект, ДеревоЗначенийПриемник, ДеревоЗначенийИсточник) + + Для Каждого СтрокаДереваИсточника Из ДеревоЗначенийИсточник.Строки Цикл + + Если СтрокаДереваИсточника.ЭтоГруппа Тогда + + СтрокаДереваПриемника = ДеревоЗначенийПриемник.Строки.Добавить(); + + ЗаполнитьЗначенияСвойств(СтрокаДереваПриемника, СтрокаДереваИсточника); + + СоздатьДопустимыйОтборПоСвойствам(Объект, СтрокаДереваПриемника, СтрокаДереваИсточника); + + Иначе + + Если ЦепочкаСвойствДействительна(Объект, СтрокаДереваИсточника.СвойствоОбъекта) Тогда + + СтрокаДереваПриемника = ДеревоЗначенийПриемник.Строки.Добавить(); + + ЗаполнитьЗначенияСвойств(СтрокаДереваПриемника, СтрокаДереваИсточника); + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция ЦепочкаСвойствДействительна(Объект, Знач СтрокаСвойствОбъекта) + + Значение = Объект; + + МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаСвойствОбъекта, "."); + + // значение получаем с учетом возможного разыменования свойства + Для Каждого ИмяСвойства ИЗ МассивПодстрок Цикл + + Попытка + Значение = Значение[ИмяСвойства]; + Исключение + Возврат Ложь; + КонецПопытки; + + КонецЦикла; + + Возврат Истина; +КонецФункции + +// Выполняем ПРОБ для ссылки и для объекта +// Результат учитываем по условию "ИЛИ" +// Если объект прошел фильтр ПРОБ по значения из ссылки, +// то ПРОБ для значений объекта уже не выполняем +// +Функция ОбъектПрошелФильтрПравилРегистрацииПоСвойствам(ПРО, Объект, ПроверятьСсылку) + + ПолучитьЗначенияАлгоритмовКонстант(ПРО, ПРО.ОтборПоСвойствамОбъекта); + + Если ПроверятьСсылку Тогда // проверка Ссылки; выполняем ПРОБ для ссылки + + ПРО.ОтборПоСвойствам = Обработки.ЗагрузкаПравилРегистрацииОбъектов.ИнициализацияТаблицыОтборПоСвойствамОбъекта(); + + СоздатьДопустимыйОтборПоСвойствам(Объект.Ссылка, ПРО.ОтборПоСвойствам, ПРО.ОтборПоСвойствамОбъекта); + + ЗаполнитьЗначенияСвойствИзОбъекта(ПРО.ОтборПоСвойствам, Объект.Ссылка); + + Если УсловиеИстинноДляВеткиДереваЗначений(ПРО.ОтборПоСвойствам) Тогда + + Возврат Истина; + + КонецЕсли; + + КонецЕсли; + + ПРО.ОтборПоСвойствам = Обработки.ЗагрузкаПравилРегистрацииОбъектов.ИнициализацияТаблицыОтборПоСвойствамОбъекта(); + + СоздатьДопустимыйОтборПоСвойствам(Объект, ПРО.ОтборПоСвойствам, ПРО.ОтборПоСвойствамОбъекта); + + ЗаполнитьЗначенияСвойствИзОбъекта(ПРО.ОтборПоСвойствам, Объект); + + Возврат УсловиеИстинноДляВеткиДереваЗначений(ПРО.ОтборПоСвойствам); + +КонецФункции + +// По умолчанию считаем, что элементы отбора корневой группы сравниваются по условию "И". +// Поэтому параметр ЭтоОператорИ по умолчанию принимает значение Истина +// +Функция УсловиеИстинноДляВеткиДереваЗначений(ДеревоЗначений, Знач ЭтоОператорИ = Истина) + + // инициализиция + Если ЭтоОператорИ Тогда // И + Результат = Истина; + Иначе // ИЛИ + Результат = Ложь; + КонецЕсли; + + Для Каждого СтрокаДерева ИЗ ДеревоЗначений.Строки Цикл + + Если СтрокаДерева.ЭтоГруппа Тогда + + РезультатЭлемента = УсловиеИстинноДляВеткиДереваЗначений(СтрокаДерева, СтрокаДерева.ЭтоОператорИ); + Иначе + + РезультатЭлемента = УсловиеИстинноДляЭлемента(СтрокаДерева, ЭтоОператорИ); + КонецЕсли; + + Если ЭтоОператорИ Тогда // И + + Результат = Результат И РезультатЭлемента; + + Если Не Результат Тогда + Возврат Ложь; + КонецЕсли; + + Иначе // ИЛИ + + Результат = Результат ИЛИ РезультатЭлемента; + + Если Результат Тогда + Возврат Истина; + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Возврат Результат; +КонецФункции + +Функция УсловиеИстинноДляЭлемента(СтрокаДерева, ЭтоОператорИ) + + Перем ВидСравнения; + + ВидСравнения = СтрокаДерева.ВидСравнения; + + Попытка + + Если ВидСравнения = "Равно" Тогда Возврат СтрокаДерева.ЗначениеСвойства = СтрокаДерева.ЗначениеКонстанты; + ИначеЕсли ВидСравнения = "НеРавно" Тогда Возврат СтрокаДерева.ЗначениеСвойства <> СтрокаДерева.ЗначениеКонстанты; + ИначеЕсли ВидСравнения = "Больше" Тогда Возврат СтрокаДерева.ЗначениеСвойства > СтрокаДерева.ЗначениеКонстанты; + ИначеЕсли ВидСравнения = "БольшеИлиРавно" Тогда Возврат СтрокаДерева.ЗначениеСвойства >= СтрокаДерева.ЗначениеКонстанты; + ИначеЕсли ВидСравнения = "Меньше" Тогда Возврат СтрокаДерева.ЗначениеСвойства < СтрокаДерева.ЗначениеКонстанты; + ИначеЕсли ВидСравнения = "МеньшеИлиРавно" Тогда Возврат СтрокаДерева.ЗначениеСвойства <= СтрокаДерева.ЗначениеКонстанты; + КонецЕсли; + + Исключение + + Возврат Ложь; + + КонецПопытки; + + Возврат Ложь; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ РАБОТЫ С ЖУРНАЛОМ РЕГИСТРАЦИИ + +Процедура ЗаписьЖурналаРегистрацииПРО(Комментарий, ОбъектМетаданных = Неопределено) + + ЗаписьЖурналаРегистрации("Обмен данными.Правила регистрации объектов", УровеньЖурналаРегистрации.Ошибка, ОбъектМетаданных, , Комментарий); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ-ОБРАБОТЧИКИ СОБЫТИЙ ПРО + +Процедура ВыполнитьОбработчикПередОбработкойПРО(ПРО, Отказ, Объект, ОбъектМетаданных) + + Если ПРО.ЕстьОбработчикПередОбработкой Тогда + + Попытка + + Выполнить(ПРО.ПередОбработкой); + + Исключение + + // фиксируем ошибку в журнале регистрации + СтрокаСообщения = НСтр("ru = 'Ошибка при выполнении обработчика: ""[ИмяОбработчика]""; План обмена: [ИмяПланаОбмена]; Объект метаданных: [ОбъектМетаданныхИмя] + |Описание ошибки: [Описание]'"); + // + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ИмяОбработчика]", "Перед обработкой"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ИмяПланаОбмена]", ПРО.ИмяПланаОбмена); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОбъектМетаданныхИмя]", ПРО.ОбъектМетаданныхИмя); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[Описание]", ИнформацияОбОшибке().Описание); + ЗаписьЖурналаРегистрацииПРО(СтрокаСообщения, ОбъектМетаданных); + + // флаг ошибки + Отказ = Истина; + + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбменДаннымиСобытия/ОбменДаннымиСобытия.mdo b/SSL/src/CommonModules/ОбменДаннымиСобытия/ОбменДаннымиСобытия.mdo new file mode 100644 index 000000000..3505146e7 --- /dev/null +++ b/SSL/src/CommonModules/ОбменДаннымиСобытия/ОбменДаннымиСобытия.mdo @@ -0,0 +1,12 @@ + + + ОбменДаннымиСобытия + + ru + Обмен данными события + + true + true + true + true + diff --git a/SSL/src/CommonModules/ОбменФайлами/Module.bsl b/SSL/src/CommonModules/ОбменФайлами/Module.bsl new file mode 100644 index 000000000..84a119abb --- /dev/null +++ b/SSL/src/CommonModules/ОбменФайлами/Module.bsl @@ -0,0 +1,438 @@ +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ВНЕШНИЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// обработка одного элемента при обмене - отправка +Процедура ПриОтправкеДанныхФайла(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза = Ложь) Экспорт + + Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ВерсииФайлов") Тогда + + Если ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + + Если СозданиеНачальногоОбраза = Истина Тогда + + Если НЕ ЭлементДанных.Том.Пустая() Тогда + + ИмяКаталогаФайлов = ХранилищеОбщихНастроек.Загрузить("ОбменФайлами", "ВременныйКаталог"); + + ПолныйПуть = РаботаСФайлами.ПолныйПутьТома(ЭлементДанных.Том) + ЭлементДанных.ПутьКФайлу; + УникальныйИдентификатор = ЭлементДанных.Ссылка.УникальныйИдентификатор(); + + НовыйПутьФайла = ИмяКаталогаФайлов + "/" + УникальныйИдентификатор; + + Попытка + // если файл в томе - скопируем его во временный каталог (при создании начального образа) + КопироватьФайл(ПолныйПуть, НовыйПутьФайла); + ФайлВременный = Новый Файл(НовыйПутьФайла); + ФайлВременный.УстановитьТолькоЧтение(Ложь); + Исключение + КонецПопытки; + + КонецЕсли; + + Иначе // обычный обмен - СозданиеНачальногоОбраза = Ложь + + Если НЕ ЭлементДанных.Том.Пустая() Тогда + // если файл в томе - поместим его в ФайлХранилище, и поменяем ЭлементДанных.ТипХраненияФайла на ВИнформационнойБазе + + ПолныйПуть = РаботаСФайлами.ПолныйПутьТома(ЭлементДанных.Том) + ЭлементДанных.ПутьКФайлу; + УникальныйИдентификатор = ЭлементДанных.Ссылка.УникальныйИдентификатор(); + + ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть); + ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(ДвоичныеДанные); + + ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; + ЭлементДанных.ПутьКФайлу = ""; + ЭлементДанных.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// обработка одного элемента при обмене - прием +Процедура ПриПолученииДанныхФайла(ЭлементДанных) Экспорт + + Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ВерсииФайлов") Тогда + + ТипХраненияФайлов = ПолучитьТипХраненияФайлов(); + + ПрежнийПутьНаТоме = ""; + + Если НЕ ЭлементДанных.ЭтоНовый() Тогда // изменен уже существующий элемент + + // файл был на томе - удалим его - т.к. при обмене придет новый + Если ЭлементДанных.Ссылка.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + ПрежнийПутьНаТоме = РаботаСФайлами.ПолныйПутьТома(ЭлементДанных.Ссылка.Том) + ЭлементДанных.Ссылка.ПутьКФайлу; + + ФайлВременный = Новый Файл(ПрежнийПутьНаТоме); + ФайлВременный.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ПрежнийПутьНаТоме); + + ПутьСПодкаталогом = ФайлВременный.Путь; + МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*.*"); + Если МассивФайловВКаталоге.Количество() = 0 Тогда + УдалитьФайлы(ПутьСПодкаталогом); + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + // при обмене сюда приходит только ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе + // если тип хранения базы-приемника такой же (в базе) - ничего не делаем + // а вот если в базе приемнике - тип хранения в томах - то разместим на диске + Если ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + // тип отличается от типа по умолчанию для данной базы - поменяем + + // по обмену пришел элемент с хранением в базе - но в базе приемнике принято хранить в томах + // - из ФайлХранилище размещаем на томе и меняем ТипХраненияФайла на ВТомахНаДиске + + ДвоичныеДанные = ЭлементДанных.ФайлХранилище.Получить(); + + ВремяИзменения = ЭлементДанных.ДатаМодификацииУниверсальная; + РазмерФайла = ЭлементДанных.Размер; + ИмяБезРасширения = ЭлементДанных.Наименование; + Расширение = ЭлементДанных.Расширение; + + ПутьКФайлуНаТоме = ""; + СсылкаНаТом = Неопределено; + // добавить в один из томов (где есть свободное место) + РаботаСФайлами.ДобавитьНаДиск(ДвоичныеДанные, ПутьКФайлуНаТоме, СсылкаНаТом, ВремяИзменения, ЭлементДанных.НомерВерсии, ИмяБезРасширения, Расширение, РазмерФайла); + ЭлементДанных.ПутьКФайлу = ПутьКФайлуНаТоме; + ЭлементДанных.Том = СсылкаНаТом.Ссылка; + ЭлементДанных.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске; + + ЭлементДанных.ФайлХранилище = Новый ХранилищеЗначения(""); // очистим ФайлХранилище + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + + +// Создать файловый начальный образ на сервере +Функция СоздатьФайловыйНачальныйОбразНаСервере(Узел, УникальныйИдентификаторФормы, Язык, ПолноеИмяФайловойБазыWindows, ПолноеИмяФайловойБазыLinux, ПутьКАрхивуСФайламиТомовWindows, ПутьКАрхивуСФайламиТомовLinux) Экспорт + + ПутьКАрхивуСФайламиТомов = ""; + ПолноеИмяФайловойБазы = ""; + + ТипПлатформыСервера = РаботаСФайламиПовтИсп.ТипПлатформыСервера(); + Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда + ПутьКАрхивуСФайламиТомов = ПутьКАрхивуСФайламиТомовWindows; + ПолноеИмяФайловойБазы = ПолноеИмяФайловойБазыWindows; + + Если Не ПустаяСтрока(ПутьКАрхивуСФайламиТомов) И (Лев(ПутьКАрхивуСФайламиТомов, 2) <> "\\" ИЛИ Найти(ПутьКАрхивуСФайламиТомов, ":") <> 0) Тогда + ТекстОшибки = НСтр("ru = 'Путь к файловой базе должен быть в формате UNC (\\servername\resource) '"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "ПутьКАрхивуСФайламиТомовWindows"); + Возврат Ложь; + КонецЕсли; + + Если Не ПустаяСтрока(ПолноеИмяФайловойБазы) И (Лев(ПолноеИмяФайловойБазы, 2) <> "\\" ИЛИ Найти(ПолноеИмяФайловойБазы, ":") <> 0) Тогда + ТекстОшибки = НСтр("ru = 'Путь к архиву с файлами томов должен быть в формате UNC (\\servername\resource) '"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "ПолноеИмяФайловойБазыWindows"); + Возврат Ложь; + КонецЕсли; + + Иначе + ПутьКАрхивуСФайламиТомов = ПутьКАрхивуСФайламиТомовLinux; + ПолноеИмяФайловойБазы = ПолноеИмяФайловойБазыLinux; + КонецЕсли; + + Если ПустаяСтрока(ПолноеИмяФайловойБазы) Тогда + + Текст = НСтр("ru = 'Укажите полное имя файловой базы (файл 1cv8.1cd)'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст, , "ПолноеИмяФайловойБазыWindows"); + Возврат Ложь; + КонецЕсли; + ФайлБазы = Новый Файл(ПолноеИмяФайловойБазы); + Если ФайлБазы.Существует() Тогда + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" уже существует. Введите другое имя файла.'"), ПолноеИмяФайловойБазы); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст, , "ПолноеИмяФайловойБазыWindows"); + Возврат Ложь; + КонецЕсли; + + Если ПустаяСтрока(ПутьКАрхивуСФайламиТомов) Тогда + Текст = НСтр("ru = 'Укажите полное имя архива с файлами томов (файл *.zip)'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст, , "ПутьКАрхивуСФайламиТомовWindows"); + Возврат Ложь; + КонецЕсли; + + ПутьФайла = ПутьКАрхивуСФайламиТомов; + Файл = Новый Файл(ПутьФайла); + Если Файл.Существует() Тогда + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" уже существует. Введите другое имя файла.'"), ПутьФайла); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст, , "ПутьКАрхивуСФайламиТомовWindows"); + Возврат Ложь; + КонецЕсли; + + + // создать временный каталог + ИмяКаталога = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ИмяКаталога); + + // создать временный каталог для файлов + ИмяКаталогаФайлов = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ИмяКаталогаФайлов); + + ХранилищеОбщихНастроек.Сохранить("ОбменФайлами", "ВременныйКаталог", ИмяКаталогаФайлов); + + ZIP = Неопределено; + Запись = Неопределено; + + Попытка + + СтрокаСоединения = "File=""" + ИмяКаталога + """;" + + "Locale=""" + Язык + """;"; + ПланыОбмена.СоздатьНачальныйОбраз(Узел, СтрокаСоединения); // собственно создание начального образа + + ZIP = Новый ЗаписьZipФайла; + ПутьZIP = ПутьФайла; + ZIP.Открыть(ПутьZIP); + + ВременныеФайлы = Новый Массив; + ВременныеФайлы = НайтиФайлы(ИмяКаталогаФайлов, "*.*"); + + Для Каждого ВременныйФайл Из ВременныеФайлы Цикл + Если ВременныйФайл.ЭтоФайл() Тогда + ПутьВременногоФайла = ВременныйФайл.ПолноеИмя; + ZIP.Добавить(ПутьВременногоФайла); + КонецЕсли; + КонецЦикла; + + ZIP.Записать(); + + УдалитьФайлы(ИмяКаталогаФайлов); // удаляем вместе с файлами внутри + + Исключение + + УдалитьФайлы(ИмяКаталога); + ВызватьИсключение; + + КонецПопытки; + + ПутьВременногоФайлаБазы = ИмяКаталога + "\1Cv8.1CD"; + ПереместитьФайл(ПутьВременногоФайлаБазы, ПолноеИмяФайловойБазы); + + // очистка + УдалитьФайлы(ИмяКаталога); + + Возврат Истина; +КонецФункции + +// Создать серверный начальный образ на сервере +Функция СоздатьСерверныйНачальныйОбразНаСервере(Узел, СтрокаСоединения, ПутьКАрхивуСФайламиТомовWindows, ПутьКАрхивуСФайламиТомовLinux) Экспорт + + ПутьКАрхивуСФайламиТомов = ""; + ТипПлатформыСервера = РаботаСФайламиПовтИсп.ТипПлатформыСервера(); + Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда + ПутьКАрхивуСФайламиТомов = ПутьКАрхивуСФайламиТомовWindows; + + Если Не ПустаяСтрока(ПутьКАрхивуСФайламиТомов) И (Лев(ПутьКАрхивуСФайламиТомов, 2) <> "\\" ИЛИ Найти(ПутьКАрхивуСФайламиТомов, ":") <> 0) Тогда + ТекстОшибки = НСтр("ru = 'Путь к файловой базе должен быть в формате UNC (\\servername\resource) '"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "ПутьКАрхивуСФайламиТомовWindows"); + Возврат Ложь; + КонецЕсли; + + Иначе + ПутьКАрхивуСФайламиТомов = ПутьКАрхивуСФайламиТомовLinux; + КонецЕсли; + + Если ПустаяСтрока(ПутьКАрхивуСФайламиТомов) Тогда + Текст = НСтр("ru = 'Укажите полное имя архива с файлами томов (файл *.zip)'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст, , "ПутьКАрхивуСФайламиТомовWindows"); + Возврат Ложь; + КонецЕсли; + + ПутьФайла = ПутьКАрхивуСФайламиТомов; + Файл = Новый Файл(ПутьФайла); + Если Файл.Существует() Тогда + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" уже существует. Введите другое имя файла.'"), ПутьФайла); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст); + Возврат Ложь; + КонецЕсли; + + // создать временный каталог + ИмяКаталога = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ИмяКаталога); + + // создать временный каталог для файлов + ИмяКаталогаФайлов = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ИмяКаталогаФайлов); + + ХранилищеОбщихНастроек.Сохранить("ОбменФайлами", "ВременныйКаталог", ИмяКаталогаФайлов); + + ZIP = Неопределено; + Запись = Неопределено; + + Попытка + + ПланыОбмена.СоздатьНачальныйОбраз(Узел, СтрокаСоединения); + + ZIP = Новый ЗаписьZipФайла; + ПутьZIP = ПутьФайла; + ZIP.Открыть(ПутьZIP); + + ВременныеФайлы = Новый Массив; + ВременныеФайлы = НайтиФайлы(ИмяКаталогаФайлов, "*.*"); + + Для Каждого ВременныйФайл Из ВременныеФайлы Цикл + Если ВременныйФайл.ЭтоФайл() Тогда + ПутьВременногоФайла = ВременныйФайл.ПолноеИмя; + ZIP.Добавить(ПутьВременногоФайла); + КонецЕсли; + КонецЦикла; + + ZIP.Записать(); + УдалитьФайлы(ИмяКаталогаФайлов); // удаляем вместе с файлами внутри + + Исключение + + УдалитьФайлы(ИмяКаталога); + ВызватьИсключение; + + КонецПопытки; + + // очистка + УдалитьФайлы(ИмяКаталога); + + Возврат Истина; +КонецФункции + +//Есть ли хоть один том хранения файлов +Функция ЕстьТомаХраненияФайлов() Экспорт + + ТипХраненияФайлов = ПолучитьТипХраненияФайлов(); + + Если ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + Возврат Истина; // тут не проверяем наличие томов + КонецЕсли; + + Выборка = Справочники.ТомаХраненияФайлов.Выбрать(,,, "ПорядокЗаполнения Возр"); + Если Выборка.Следующий() Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; +КонецФункции + +// получает ТипХраненияФайлов у информационной базы +Функция ПолучитьТипХраненияФайлов() + УстановитьПривилегированныйРежим(Истина); + ТипХраненияФайлов = Константы.ТипХраненияФайлов.Получить(); + Возврат ТипХраненияФайлов; +КонецФункции + +// Размещает файлы в томах, устанавливая ссылки в ВерсииФайла +Функция ДобавитьФайлыВТома(ПутьКАрхивуWindows, ПутьКАрхивуLinux) Экспорт + + ПолноеИмяФайлаZip = ""; + ТипПлатформыСервера = РаботаСФайламиПовтИсп.ТипПлатформыСервера(); + Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда + ПолноеИмяФайлаZip = ПутьКАрхивуWindows; + Иначе + ПолноеИмяФайлаZip = ПутьКАрхивуLinux; + КонецЕсли; + + ИмяКаталога = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ИмяКаталога); + + ZIP = Новый ЧтениеZipФайла(ПолноеИмяФайлаZip); + ZIP.ИзвлечьВсе(ИмяКаталога, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); + + СоответствиеПутейФайлов = Новый Соответствие; + + Для Каждого ZIPЭлемент Из ZIP.Элементы Цикл + ПолныйПутьФайла = ИмяКаталога + "/" + ZIPЭлемент.Имя; + УникальныйИдентификатор = ZIPЭлемент.ИмяБезРасширения; + + СоответствиеПутейФайлов.Вставить(УникальныйИдентификатор, ПолныйПутьФайла); + КонецЦикла; + + ТипХраненияФайлов = ПолучитьТипХраненияФайлов(); + + НачатьТранзакцию(); + Попытка + Выборка = Справочники.ВерсииФайлов.Выбрать(); + Пока Выборка.Следующий() Цикл + Объект = Выборка.ПолучитьОбъект(); + Если Объект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + + УникальныйИдентификатор = Строка(Объект.Ссылка.УникальныйИдентификатор()); + + ПолныйПутьФайлаНаДиске = СоответствиеПутейФайлов.Получить(УникальныйИдентификатор); + Если ПолныйПутьФайлаНаДиске <> Неопределено Тогда + + // в базе-приемнике файлы должны храниться в информационной базе - значит там их и разместим (даже если в исходной базе они были в томах) + Если ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + + Объект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; + Объект.ПутьКФайлу = ""; + Объект.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + + ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПутьФайлаНаДиске); + Объект.ФайлХранилище = Новый ХранилищеЗначения(ДвоичныеДанные); + + Иначе // в базе-приемнике файлы должны храниться в томах на диске - переместим разархивированный файл на том + + ФайлИсх = Новый Файл(ПолныйПутьФайлаНаДиске); + РазмерФайла = ФайлИсх.Размер(); + + ВремяИзменения = Объект.ДатаМодификацииУниверсальная; + ИмяБезРасширения = Объект.Наименование; + Расширение = Объект.Расширение; + + ПолныйПутьНовый = ФайлИсх.Путь + ИмяБезРасширения + "." + Объект.Расширение; + ПереместитьФайл(ПолныйПутьФайлаНаДиске, ПолныйПутьНовый); + + ПутьКФайлуНаТоме = ""; + СсылкаНаТом = Неопределено; + // добавить в один из томов (где есть свободное место) + РаботаСФайлами.ДобавитьНаДиск(ПолныйПутьНовый, ПутьКФайлуНаТоме, СсылкаНаТом, ВремяИзменения, Объект.НомерВерсии, ИмяБезРасширения, Расширение, РазмерФайла); + Объект.ПутьКФайлу = ПутьКФайлуНаТоме; + Объект.Том = СсылкаНаТом.Ссылка; + + КонецЕсли; + + Объект.Записать(); + УдалитьФайлы(ПолныйПутьНовый); + + КонецЕсли; + + КонецЕсли; + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + // очистим регистрацию изменений ВерсииФайлов, которые мы только что сделали + Для Каждого ПланОбмена из Метаданные.ПланыОбмена Цикл + ИмяПланаОбмена = ПланОбмена.Имя; + МенеджерПланаОбмена = ПланыОбмена[ИмяПланаОбмена]; + + ЭтотУзел = МенеджерПланаОбмена.ЭтотУзел(); + Выборка = МенеджерПланаОбмена.Выбрать(); + + Пока Выборка.Следующий() Цикл + ПланОбменаОбъект = Выборка.ПолучитьОбъект(); + Если ПланОбменаОбъект.Ссылка <> ЭтотУзел Тогда + ПланыОбмена.УдалитьРегистрациюИзменений(ПланОбменаОбъект.Ссылка, Метаданные.Справочники.ВерсииФайлов); + КонецЕсли; + КонецЦикла; + + КонецЦикла; + +КонецФункции diff --git a/SSL/src/CommonModules/ОбменФайлами/ОбменФайлами.mdo b/SSL/src/CommonModules/ОбменФайлами/ОбменФайлами.mdo new file mode 100644 index 000000000..8655c055f --- /dev/null +++ b/SSL/src/CommonModules/ОбменФайлами/ОбменФайлами.mdo @@ -0,0 +1,10 @@ + + + ОбменФайлами + + ru + Обмен файлами + + true + true + diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl new file mode 100644 index 000000000..ccb2b06dc --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl @@ -0,0 +1,410 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБНОВЛЕНИЕ ДАННЫХ ИНФОРМАЦИОННОЙ БАЗЫ ПРИ СМЕНЕ ВЕРСИИ КОНФИГУРАЦИИ + +// Проверить необходимость обновления информационной базы при смене версии конфигурации. +// +Функция НеобходимоОбновлениеИнформационнойБазы() Экспорт + + Возврат НеобходимоВыполнитьОбновление(Метаданные.Версия, ВерсияИБ(Метаданные.Имя)); + +КонецФункции + +// Проверить права текущего пользователя на выполнение обновления информационной базы. +// +Функция ЕстьПраваНаОбновлениеИнформационнойБазы() Экспорт + + Возврат ПравоДоступа("МонопольныйРежим", Метаданные) И ПравоДоступа("Администрирование", Метаданные); + +КонецФункции + +Функция ПроверитьНевозможностьОбновленияИнформационнойБазы() Экспорт + + Возврат НеобходимоОбновлениеИнформационнойБазы() И НЕ ЕстьПраваНаОбновлениеИнформационнойБазы(); + +КонецФункции + +// Выполнить неинтерактивное обновление данных ИБ. +// +// Результат: +// Неопределено - обновление не выполнялось (не требуется) +// Строка - адрес временного хранилища со списком выполненных обработчиков обновления +// +Функция ВыполнитьОбновлениеИнформационнойБазы() Экспорт + + ВерсияМетаданных = Метаданные.Версия; + ВерсияДанных = ВерсияИБ(Метаданные.Имя); + Если ПустаяСтрока(ВерсияМетаданных) Тогда + ВерсияМетаданных = "0.0.0.0"; + КонецЕсли; + + Если НЕ НеобходимоВыполнитьОбновление(ВерсияМетаданных, ВерсияДанных) Тогда + Возврат Неопределено; + КонецЕсли; + + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Изменился номер версии конфигурации: с ""%1"" на ""%2"". Будет выполнено обновление информационной базы.'"), + ВерсияДанных, ВерсияМетаданных); + ЗаписатьИнформацию(Сообщение); + + // Проверка наличия прав для обновления информационной базы. + Если НЕ ЕстьПраваНаОбновлениеИнформационнойБазы() Тогда + Сообщение = НСтр("ru = 'Недостаточно прав для выполнения обновления. Обратитесь к системному администратору.'"); + ЗаписатьОшибку(Сообщение); + ВызватьИсключение Сообщение; + КонецЕсли; + + ЗначениеНастройки = ХранилищеОбщихНастроек.Загрузить("ОбновлениеВерсииИБ", "РежимОтладки"); + РежимОтладки = ЗначениеНастройки = Истина; + + // Установка монопольного режима для обновления информационной базы. + Если НЕ РежимОтладки Тогда + Попытка + УстановитьМонопольныйРежим(Истина); + Исключение + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Невозможно выполнить обновление информационной базы, так как к ней подключены другие сеансы. + |Обратитесь к системному администратору. + | + |Подробности ошибки: + |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + ЗаписатьОшибку(Сообщение); + + ВызватьИсключение Сообщение; + КонецПопытки; + КонецЕсли; + + Попытка + СписокОбработчиковОбновления = ОбновлениеИнформационнойБазыПереопределяемый.ОбработчикиОбновления(); + + // Также всегда вызываются процедуры обновления данных библиотеки стандартных подсистем + // + Обработчик = СписокОбработчиковОбновления.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Процедура = "СтандартныеПодсистемыПереопределяемый.ВыполнитьОбновлениеИнформационнойБазы"; + + ВыполненныеОбработчики = ВыполнитьИтерациюОбновления(Метаданные.Имя, Метаданные.Версия, + СписокОбработчиковОбновления); + Исключение + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Обновление информационной базы на версию ""%1"" завершилось с ошибками: + |%2'"), ВерсияМетаданных, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьОшибку(Сообщение); + // Отключение монопольного режима. + Если НЕ РежимОтладки Тогда + УстановитьМонопольныйРежим(Ложь); + КонецЕсли; + ВызватьИсключение; + КонецПопытки; + + // Отключение монопольного режима. + Если НЕ РежимОтладки Тогда + УстановитьМонопольныйРежим(Ложь); + КонецЕсли; + + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Обновление информационной базы на версию ""%1"" выполнено успешно.'"), ВерсияМетаданных); + ЗаписатьИнформацию(Сообщение); + + ВыводитьОписаниеОбновлений = ВерсияДанных <> "0.0.0.0"; + ОбновлениеИнформационнойБазыПереопределяемый.ПослеОбновления(ВерсияДанных, ВерсияМетаданных, + ВыполненныеОбработчики, ВыводитьОписаниеОбновлений); + + Адрес = ""; + Если ВыводитьОписаниеОбновлений Тогда + Адрес = ПоместитьВоВременноеХранилище(ВыполненныеОбработчики, Новый УникальныйИдентификатор); + КонецЕсли; + + Возврат Адрес; + +КонецФункции + +// Выполнить обработчики обновления из списка ОбработчикиОбновления +// для компонента ИдентификаторБиблиотеки до версии ВерсияМетаданныхИБ. +// +// Параметры +// ИдентификаторБиблиотеки – Строка – имя конфигурации или идентификатор библиотеки. +// ВерсияМетаданныхИБ – Строка – версия метаданных, до которой необходимо +// выполнить обновление. +// ОбработчикиОбновления – Соответствие – список обработчиков обновления. +// +// Возвращаемое значение: +// ДеревоЗначений – выполненные обработчики обновления. +// +Функция ВыполнитьИтерациюОбновления(Знач ИдентификаторБиблиотеки, Знач ВерсияМетаданныхИБ, + Знач ОбработчикиОбновления) Экспорт + + ТекущаяВерсияИБ = ВерсияИБ(ИдентификаторБиблиотеки); + Если ПустаяСтрока(ТекущаяВерсияИБ) Тогда + ТекущаяВерсияИБ = "0.0.0.0"; + КонецЕсли; + НоваяВерсияИБ = ТекущаяВерсияИБ; + ВерсияМетаданных = ВерсияМетаданныхИБ; + Если ПустаяСтрока(ВерсияМетаданных) Тогда + ВерсияМетаданных = "0.0.0.0"; + КонецЕсли; + + Если ТекущаяВерсияИБ = ВерсияМетаданных Тогда + Возврат Новый ДеревоЗначений(); + КонецЕсли; + + ВыполняемыеОбработчики = ОбработчикиОбновленияВИнтервале(ОбработчикиОбновления, ТекущаяВерсияИБ, ВерсияМетаданных); + Для Каждого Версия Из ВыполняемыеОбработчики.Строки Цикл + + Если Версия.Версия = "*" Тогда + Сообщение = НСтр("ru = 'Выполняются обязательные процедуры обновления информационной базы.'"); + Иначе + НоваяВерсияИБ = Версия.Версия; + + Если ИдентификаторБиблиотеки = Метаданные.Имя Тогда + Сообщение = НСтр("ru = 'Выполняется обновление информационной базы с версии %1 на версию %2.'"); + Иначе + Сообщение = НСтр("ru = 'Выполняется обновление информационной базы родительской конфигурации %3 с версии %1 на версию %2.'"); + КонецЕсли; + + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, + ТекущаяВерсияИБ, НоваяВерсияИБ, ИдентификаторБиблиотеки); + + КонецЕсли; + + ЗаписатьИнформацию(Сообщение); + + Для Каждого Обработчик Из Версия.Строки Цикл + ОбщегоНазначения.ВыполнитьБезопасно(Обработчик.Процедура); + КонецЦикла; + + Если Версия.Версия = "*" Тогда + Сообщение = НСтр("ru = 'Выполнены обязательные процедуры обновления информационной базы.'"); + Иначе + // Установка номера версии информационной базы + УстановитьВерсиюИБ(ИдентификаторБиблиотеки, НоваяВерсияИБ); + + Если ИдентификаторБиблиотеки = Метаданные.Имя Тогда + Сообщение = НСтр("ru = 'Выполнено обновление информационной базы с версии %1 на версию %2.'"); + Иначе + Сообщение = НСтр("ru = 'Выполнено обновление информационной базы родительской конфигурации %3 с версии %1 на версию %2.'"); + КонецЕсли; + + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, + ТекущаяВерсияИБ, НоваяВерсияИБ, ИдентификаторБиблиотеки); + + ТекущаяВерсияИБ = НоваяВерсияИБ; + + КонецЕсли; + ЗаписатьИнформацию(Сообщение); + + КонецЦикла; + + // Установка номера версии информационной базы + Если ВерсияИБ(ИдентификаторБиблиотеки) <> ВерсияМетаданныхИБ Тогда + УстановитьВерсиюИБ(ИдентификаторБиблиотеки, ВерсияМетаданныхИБ); + КонецЕсли; + + Возврат ВыполняемыеОбработчики; + +КонецФункции + +Функция НоваяТаблицаОбработчиковОбновления() Экспорт + + Обработчики = Новый ТаблицаЗначений; + Обработчики.Колонки.Добавить("Версия", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0))); + Обработчики.Колонки.Добавить("Процедура", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0))); + Обработчики.Колонки.Добавить("Опциональный"); + Возврат Обработчики; + +КонецФункции + +// Получить версию конфигурации или родительской конфигурации (библиотеки), +// которая хранится в информационной базе. +// +// Параметры +// ИдентификаторБиблиотеки – Строка – имя конфигурации или идентификатор библиотеки. +// +// Возвращаемое значение: +// Строка – версия. +// +// Пример использования: +// ВерсияКонфигурацииИБ = ВерсияИБ(Метаданные.Имя); +// +Функция ВерсияИБ(Знач ИдентификаторБиблиотеки) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ВерсииПодсистем.Версия КАК Версия + |ИЗ + | РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем + |ГДЕ + | ВерсииПодсистем.ИмяПодсистемы = &ИмяПодсистемы"); + Запрос.Параметры.Вставить("ИмяПодсистемы", ИдентификаторБиблиотеки); + ТаблицаЗначений = Запрос.Выполнить().Выгрузить(); + Результат = ""; + Если ТаблицаЗначений.Количество() > 0 Тогда + Результат = СокрЛП(ТаблицаЗначений[0].Версия); + КонецЕсли; + Возврат ?(ПустаяСтрока(Результат), "0.0.0.0", Результат); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +Функция НеобходимоВыполнитьОбновление(Знач ВерсияМетаданных, Знач ВерсияДанных) + + Возврат НЕ ПустаяСтрока(ВерсияМетаданных) И ВерсияДанных <> ВерсияМетаданных; + +КонецФункции + +Процедура УстановитьВерсиюИБ(Знач ИдентификаторБиблиотеки, Знач НомерВерсии) + + НаборЗаписей = РегистрыСведений.ВерсииПодсистем.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ИмяПодсистемы.Установить(ИдентификаторБиблиотеки); + + НоваяЗапись = НаборЗаписей.Добавить(); + + НоваяЗапись.ИмяПодсистемы = ИдентификаторБиблиотеки; + НоваяЗапись.Версия = НомерВерсии; + + НаборЗаписей.Записать(); + +КонецПроцедуры + +Функция ОбработчикиОбновленияВИнтервале(Знач ВсеОбработчики, Знач ВерсияОт, Знач ВерсияДо) + + ПостроительЗапроса = Новый ПостроительЗапроса(); + Источник = Новый ОписаниеИсточникаДанных(ВсеОбработчики); + Источник.Колонки.Версия.Измерение = Истина; + ПостроительЗапроса.ИсточникДанных = Источник; + ПостроительЗапроса.Измерения.Добавить("Версия"); + ПостроительЗапроса.Выполнить(); + ВыборкаИтоги = ПостроительЗапроса.Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + + ВыполняемыеОбработчики = Новый ДеревоЗначений(); + ВыполняемыеОбработчики.Колонки.Добавить("Версия"); + ВыполняемыеОбработчики.Колонки.Добавить("Процедура"); + Пока ВыборкаИтоги.Следующий() Цикл + + Если ВыборкаИтоги.Версия <> "*" И + НЕ (СтроковыеФункцииКлиентСервер.СравнитьВерсии(ВыборкаИтоги.Версия, ВерсияОт) > 0 + И СтроковыеФункцииКлиентСервер.СравнитьВерсии(ВыборкаИтоги.Версия, ВерсияДо) <= 0) Тогда + Продолжить; + КонецЕсли; + + СтрокаВерсии = Неопределено; + Выборка = ВыборкаИтоги.Выбрать(ОбходРезультатаЗапроса.Прямой); + Пока Выборка.Следующий() Цикл + Если Выборка.Процедура = Null Тогда + Продолжить; + КонецЕсли; + Если Выборка.Опциональный = Истина И ВерсияОт = "0.0.0.0" Тогда + Продолжить; + КонецЕсли; + Если СтрокаВерсии = Неопределено Тогда + СтрокаВерсии = ВыполняемыеОбработчики.Строки.Добавить(); + СтрокаВерсии.Версия = ВыборкаИтоги.Версия; + КонецЕсли; + Обработчик = СтрокаВерсии.Строки.Добавить(); + ЗаполнитьЗначенияСвойств(Обработчик, Выборка, "Версия, Процедура"); + КонецЦикла; + + КонецЦикла; + + // упорядочить обработчики по возрастанию версий + КоличествоСтрок = ВыполняемыеОбработчики.Строки.Количество(); + Для Инд1 = 2 По КоличествоСтрок Цикл + Для Инд2 = 0 По КоличествоСтрок - Инд1 Цикл + + Если ВыполняемыеОбработчики.Строки[Инд2].Версия = "*" Тогда + Результат = -1; + ИначеЕсли ВыполняемыеОбработчики.Строки[Инд2+1].Версия = "*" Тогда + Результат = 1; + Иначе + Результат = СтроковыеФункцииКлиентСервер.СравнитьВерсии(ВыполняемыеОбработчики.Строки[Инд2].Версия, ВыполняемыеОбработчики.Строки[Инд2+1].Версия); + КонецЕсли; + + Если Результат > 0 Тогда + ВыполняемыеОбработчики.Строки.Сдвинуть(Инд2, 1); + КонецЕсли; + + КонецЦикла; + КонецЦикла; + + Возврат ВыполняемыеОбработчики; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОТОКОЛИРОВАНИЕ ХОДА ОБНОВЛЕНИЯ + +Функция СобытиеЖурналаРегистрации() + + Возврат НСтр("ru = 'Обновление информационной базы'"); + +КонецФункции + +Процедура ЗаписатьИнформацию(Знач Текст) + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация,,, Текст); + +КонецПроцедуры + +Процедура ЗаписатьОшибку(Знач Текст) + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, Текст); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОПИСАНИЕ ОБНОВЛЕНИЙ + +Функция ДокументОписаниеОбновлений(Знач ОбработчикиОбновления) Экспорт + + ДокументОписаниеОбновлений = Новый ТабличныйДокумент(); + Если ОбработчикиОбновления = Неопределено Тогда + Возврат ДокументОписаниеОбновлений; + КонецЕсли; + + МакетОписаниеОбновлений = Метаданные.ОбщиеМакеты.Найти("ОписаниеИзмененийСистемы"); + Если МакетОписаниеОбновлений <> Неопределено Тогда + МакетОписаниеОбновлений = ПолучитьОбщийМакет(МакетОписаниеОбновлений); + Иначе + МакетОписаниеОбновлений = Новый ТабличныйДокумент(); + КонецЕсли; + + Для Каждого Версия Из ОбработчикиОбновления.Строки Цикл + + Если Версия.Версия = "*" Тогда + Продолжить; + КонецЕсли; + + ВывестиОписаниеИзменений(Версия.Версия, ДокументОписаниеОбновлений, МакетОписаниеОбновлений); + + КонецЦикла; + + Возврат ДокументОписаниеОбновлений; + +КонецФункции + +// Вывести описания изменений в указанной версии +// +// Параметры +// НомерВерсии – Строка - номер версии, для которого выводится описание из макета +// табличного документа МакетОписаниеОбновлений в табличный документ +// ДокументОписаниеОбновлений +// +Процедура ВывестиОписаниеИзменений(Знач НомерВерсии, ДокументОписаниеОбновлений, МакетОписаниеОбновлений) + + Номер = СтрЗаменить(НомерВерсии, ".", "_"); + + Если МакетОписаниеОбновлений.Области.Найти("Шапка" + Номер) = Неопределено Тогда + Возврат; + КонецЕсли; + + ДокументОписаниеОбновлений.Вывести(МакетОписаниеОбновлений.ПолучитьОбласть("Шапка" + Номер)); + ДокументОписаниеОбновлений.НачатьГруппуСтрок("Версия" + Номер); + ДокументОписаниеОбновлений.Вывести(МакетОписаниеОбновлений.ПолучитьОбласть("Версия" + Номер)); + ДокументОписаниеОбновлений.ЗакончитьГруппуСтрок(); + ДокументОписаниеОбновлений.Вывести(МакетОписаниеОбновлений.ПолучитьОбласть("Отступ")); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo new file mode 100644 index 000000000..e3e13c946 --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo @@ -0,0 +1,10 @@ + + + ОбновлениеИнформационнойБазы + + ru + Обновление информационной базы + + true + true + diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl new file mode 100644 index 000000000..bc47e013c --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl @@ -0,0 +1,57 @@ +/////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ИНТЕРАКТИВНОГО ОБНОВЛЕНИЯ ИНФОРМАЦИОННОЙ БАЗЫ + +// Проверить, есть ли необходимость выполнять обновление информационной базы, и +// если необходимо - выполняется обновление. +// Если обновление не удалось выполнить, то процедура предлагает завершить работу системы. +// +Процедура ВыполнитьОбновлениеИнформационнойБазы() Экспорт + + Если НЕ СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НеобходимоОбновлениеИнформационнойБазы Тогда + Возврат; + КонецЕсли; + + Состояние(НСтр("ru = 'Пожалуйста, подождите, выполняется обновление информационной базы...'")); + ДокументОписаниеОбновлений = Неопределено; + + Попытка + ВыполненныеОбработчикиОбновления = ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы(); + Исключение + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'При обновлении информационной базы возникла ошибка: + | + |%1 + | + |Подробности см. в Журнале регистрации.'"), + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ВызватьИсключение ТекстСообщенияОбОшибке; + КонецПопытки; + + Состояние(НСтр("ru = 'Обновление информационной базы выполнено успешно.'")); + + Если ВыполненныеОбработчикиОбновления <> Неопределено Тогда + ОбновитьИнтерфейс(); + КонецЕсли; + Если ВыполненныеОбработчикиОбновления <> "" Тогда + ОткрытьФорму("ОбщаяФорма.ОписаниеИзмененийСистемы", + Новый Структура("ВыполненныеОбработчикиОбновления", ВыполненныеОбработчикиОбновления)); + КонецЕсли; + +КонецПроцедуры + +// Проверить, возможно ли выполнять обновление информационной базы. +// +Функция ВозможноВыполнитьОбновлениеИнформационнойБазы() Экспорт + + Результат = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаЗаблокированаДляОбновления; + + Если Результат Тогда + Сообщение = НСтр("ru = 'Информационная база заблокирована в связи с обновлением версии конфигурации. Работа системы будет завершена. + |Обратитесь к системному администратору за подробностями.'"); + Предупреждение(Сообщение); + КонецЕсли; + + Возврат НЕ Результат; + +КонецФункции diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/ОбновлениеИнформационнойБазыКлиент.mdo b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/ОбновлениеИнформационнойБазыКлиент.mdo new file mode 100644 index 000000000..21e0fc8d9 --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/ОбновлениеИнформационнойБазыКлиент.mdo @@ -0,0 +1,11 @@ + + + ОбновлениеИнформационнойБазыКлиент + + ru + Обновление информационной базы клиент + + true + true + true + diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиентПереопределяемый/Module.bsl new file mode 100644 index 000000000..30169742e --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиентПереопределяемый/Module.bsl @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// ИНТЕРФЕЙСНАЯ ЧАСТЬ ПЕРЕОПРЕДЕЛЯЕМОГО МОДУЛЯ + +// Вызывается при нажатии на гиперссылку или двойном щелчке на ячейке +// табличного документа с описанием изменений системы. +// +// Параметры: +// Область - ОбластьЯчеекТабличногоДокумента - область документа, на +// которой произошло нажатие. +// +// См. также общий макет ОписаниеИзмененийСистемы. +// +Процедура ПриНажатииНаГиперссылкуВДокументеОписанияОбновлений(Знач Область) Экспорт + + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиентПереопределяемый/ОбновлениеИнформационнойБазыКлиентПереопределяемый.mdo b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиентПереопределяемый/ОбновлениеИнформационнойБазыКлиентПереопределяемый.mdo new file mode 100644 index 000000000..506dcd561 --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиентПереопределяемый/ОбновлениеИнформационнойБазыКлиентПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + ОбновлениеИнформационнойБазыКлиентПереопределяемый + + ru + Обновление информационной базы клиент переопределяемый + + true + true + diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl new file mode 100644 index 000000000..731ee1c98 --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl @@ -0,0 +1,61 @@ +/////////////////////////////////////////////////////////////////////////////// +// ИНТЕРФЕЙСНАЯ ЧАСТЬ ПЕРЕОПРЕДЕЛЯЕМОГО МОДУЛЯ + +// Возвращает список процедур-обработчиков обновления ИБ для всех поддерживаемых версий ИБ. +// +// Пример добавления процедуры-обработчика в список: +// Обработчик = Обработчики.Добавить(); +// Обработчик.Версия = "1.0.0.0"; +// Обработчик.Процедура = "ОбновлениеИБ.ПерейтиНаВерсию_1_0_0_0"; +// +// Вызывается перед началом обновления данных ИБ. +// +Функция ОбработчикиОбновления() Экспорт + + Обработчики = ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(); + + Возврат Обработчики; + +КонецФункции + +// Вызывается после завершении обновления данных ИБ. +// +// Параметры: +// ПредыдущаяВерсияИБ - Строка - версия ИБ до обновления. "0.0.0.0" для "пустой" ИБ. +// ТекущаяВерсияИБ - Строка - версия ИБ после обновления. +// ВыполненныеОбработчики - ДеревоЗначений - список выполненных процедур-обработчиков +// обновления, сгруппированных по номеру версии. +// Итерирование по выполненным обработчикам: +// Для Каждого Версия Из ВыполненныеОбработчики.Строки Цикл +// +// Если Версия.Версия = "*" Тогда +// группа обработчиков, которые выполняются всегда +// Иначе +// группа обработчиков, которые выполняются для определенной версии +// КонецЕсли; +// +// Для Каждого Обработчик Из Версия.Строки Цикл +// ... +// КонецЦикла; +// +// КонецЦикла; +// +// ВыводитьОписаниеОбновлений - Булево - если Истина, то выводить форму с описанием +// обновлений. +// +Процедура ПослеОбновления(Знач ПредыдущаяВерсияИБ, Знач ТекущаяВерсияИБ, + Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений) Экспорт + +КонецПроцедуры + +// Вызывается при подготовке табличного документа с описанием изменений системы. +// +// Параметры: +// Макет - ТабличныйДокумент - описание обновлений. +// +// См. также общий макет ОписаниеИзмененийСистемы. +// +Процедура ПриПодготовкеМакетаОписанияОбновлений(Знач Макет) Экспорт + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/ОбновлениеИнформационнойБазыПереопределяемый.mdo b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/ОбновлениеИнформационнойБазыПереопределяемый.mdo new file mode 100644 index 000000000..2d0b5a7b8 --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/ОбновлениеИнформационнойБазыПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + ОбновлениеИнформационнойБазыПереопределяемый + + ru + Обновление информационной базы переопределяемый + + true + true + diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl new file mode 100644 index 000000000..8e012c60c --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl @@ -0,0 +1,316 @@ +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции + +// Получить глобальные настройки обновления на сеанс 1С:Предприятия +Функция ПолучитьНастройкиОбновления() Экспорт + Настройки = Новый Структура; + Настройки.Вставить("КороткоеИмяКонфигурации", КороткоеИмяКонфигурации()); + Настройки.Вставить("АдресСервераДляПроверкиНаличияОбновления", АдресСервераДляПроверкиНаличияОбновления()); + Настройки.Вставить("КаталогОбновлений", КаталогОбновлений()); + Настройки.Вставить("АдресРесурсаДляПроверкиНаличияОбновления", АдресРесурсаДляПроверкиНаличияОбновления()); + Настройки.Вставить("ИмяКонфигурации", Метаданные.Имя); + Настройки.Вставить("СинонимКонфигурации", Метаданные.Синоним); + Настройки.Вставить("КраткаяИнформацияКонфигурации", Метаданные.КраткаяИнформация); + Настройки.Вставить("ПоставщикКонфигурации", Метаданные.Поставщик); + Настройки.Вставить("ВерсияКонфигурации", Метаданные.Версия); + Настройки.Вставить("КонфигурацияИзменена", КонфигурацияИзменена()); + Настройки.Вставить("ИмяCOMСоединителя", ОбщегоНазначения.ИмяCOMСоединителя()); + Настройки.Вставить("ПроверитьПрошлыеОбновленияБазы", ОбновлениеКонфигурацииУспешно() <> Неопределено); + Настройки.Вставить("НастройкиОбновленияКонфигурации", ПолучитьСтруктуруНастроекПомощника()); + Настройки.Вставить("ЕстьДоступДляОбновления", ПроверитьДоступДляОбновления()); + Настройки.Вставить("ЕстьДоступДляПроверкиОбновления", ПроверитьДоступДляПроверкиОбновления()); + Настройки.Вставить("ИнформацияОПользователе", ПолучитьИнформациюОПользователе()); + Если Настройки.ЕстьДоступДляОбновления Тогда + Настройки.Вставить("ПараметрыАдминистрированияИБ", СоединенияИБ.ПолучитьПараметрыАдминистрированияИБ()); + КонецЕсли; + + Возврат Настройки; +КонецФункции + +// Записать список сообщений в журнал регистрации. +Процедура ЗаписатьСобытияВЖурналРегистрации(СообщенияВЖурналРегистрации) Экспорт + + Если ТипЗнч(СообщенияВЖурналРегистрации) <> Тип("СписокЗначений") Тогда + Возврат; + КонецЕсли; + + СобытиеЖурналаРегистрации = СобытиеЖурналаРегистрации(); + Для каждого ТекСообщение Из СообщенияВЖурналРегистрации Цикл + Если ТекСообщение.Представление = "Предупреждение" Тогда + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Предупреждение ,,, ТекСообщение.Значение); + ИначеЕсли ТекСообщение.Представление = "Информация" Тогда + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Информация ,,, ТекСообщение.Значение); + ИначеЕсли ТекСообщение.Представление = "Примечание" Тогда + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Примечание ,,, ТекСообщение.Значение); + ИначеЕсли ТекСообщение.Представление = "Ошибка" Тогда + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка ,,, ТекСообщение.Значение); + КонецЕсли; + КонецЦикла; + СообщенияВЖурналРегистрации.Очистить(); + +КонецПроцедуры + +// Вызывается при завершении обновления конфигурации через COM-соединение. +// +// Параметры +// РезультатОбновления – Булево – Результат обновления. +// +Процедура ЗавершитьОбновление(Знач РезультатОбновления, Знач ЭлектроннаяПочта, Знач ИмяАдминистратораОбновления) Экспорт + + ТекстСообщения = НСтр("ru = 'Завершение обновления из внешнего скрипта.'"); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация,,,ТекстСообщения); + + Если НЕ ПроверитьДоступДляОбновления() Тогда + ТекстСообщения = НСтр("ru = 'Недостаточно прав для завершения обновления конфигурации.'"); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,,ТекстСообщения); + ВызватьИсключение ТекстСообщения; + КонецЕсли; + + ЗаписатьСтатусОбновления(ИмяАдминистратораОбновления, Ложь, Истина, РезультатОбновления); + + Если НЕ ПустаяСтрока(ЭлектроннаяПочта) Тогда + Попытка + ОтправитьУведомлениеОбОбновлении(ИмяАдминистратораОбновления, ЭлектроннаяПочта, РезультатОбновления); + ТекстСообщения = НСтр("ru = 'Уведомление об обновлении успешно отправлено на адрес электронной почты: '") + ЭлектроннаяПочта; + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация,,,ТекстСообщения); + Исключение + ТекстСообщения = НСтр("ru = 'Ошибка при отправке письма электронной почты:'") + ЭлектроннаяПочта + Символы.ПС + + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,,ТекстСообщения); + КонецПопытки; + КонецЕсли; + +КонецПроцедуры + +Процедура ПриЗапускеПомощникаОбновленияКонфигурации() Экспорт + + ТекстСообщения = НСтр("ru = 'Открытие помощника обновления конфигурации...'"); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация,,,ТекстСообщения); + +КонецПроцедуры + +Функция ПолучитьИнформациюОПользователе() + ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь(); + Возврат Новый Структура("Имя, ПолноеИмя, ПарольУстановлен, АутентификацияСтандартная, АутентификацияОС", + ТекущийПользователь.Имя, ТекущийПользователь.ПолноеИмя, ТекущийПользователь.ПарольУстановлен, + ТекущийПользователь.АутентификацияСтандартная, ТекущийПользователь.АутентификацияОС); +КонецФункции + +// Получить короткое имя (идентификатор) конфигурации. +// +// Возвращаемое значение: +// Строка – короткое имя конфигурации. +Функция КороткоеИмяКонфигурации() + + Значение = ОбновлениеКонфигурацииПереопределяемый.КороткоеИмяКонфигурации() + "/"; + // Определение редакции конфигурации + ПодстрокиВерсии = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Метаданные.Версия, "."); + Если ПодстрокиВерсии.Количество() > 1 Тогда + Значение = Значение + ПодстрокиВерсии[0] + ПодстрокиВерсии[1] + "/"; + КонецЕсли; + // Определение версии платформы + СисИнфо = Новый СистемнаяИнформация; + ПодстрокиВерсии = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СисИнфо.ВерсияПриложения, "."); + Значение = Значение + ПодстрокиВерсии[0] + ПодстрокиВерсии[1] + "/"; + + СтруктураНастройки = ХранилищеОбщихНастроек.Загрузить("ОбновлениеКонфигурации", "НастройкиОбновленияКонфигурации"); + Если СтруктураНастройки <> Неопределено Тогда // Значение из настроек пользователя + ИспользоватьЗначениеНастройки = Ложь; + СтруктураНастройки.Свойство("ИспользоватьЗначениеНастройкиКороткоеИмяКонфигурации", ИспользоватьЗначениеНастройки); + Если ИспользоватьЗначениеНастройки = Истина Тогда + Значение = СтруктураНастройки.КороткоеИмяКонфигурации; + КонецЕсли; + КонецЕсли; + + Возврат Значение; + +КонецФункции + +// Получить адрес веб-сервера поставщика конфигурации, на котором находится +// информация о доступных обновлениях. +// +// Возвращаемое значение: +// Строка – адрес веб-сервера. +// +// Пример реализации: +// +// Возврат "localhost"; // локальный веб-сервер для тестирования. +// +Функция АдресСервераДляПроверкиНаличияОбновления() + + Значение = "downloads.1c.ru"; // Значение по умолчанию + + ЗначениеПереопределяемогоМодуля = ОбновлениеКонфигурацииПереопределяемый.АдресСервераДляПроверкиНаличияОбновления(); + Если НЕ ПустаяСтрока(ЗначениеПереопределяемогоМодуля) Тогда // Переопределяемое значение + Значение = ЗначениеПереопределяемогоМодуля; + КонецЕсли; + + СтруктураНастройки = ХранилищеОбщихНастроек.Загрузить( + "ОбновлениеКонфигурации", + "НастройкиОбновленияКонфигурации"); + + Если СтруктураНастройки <> Неопределено Тогда // Значение из настроек пользователя + ИспользоватьЗначениеНастройки = Ложь; + СтруктураНастройки.Свойство("ИспользоватьЗначениеНастройкиАдресСервераДляПроверкиНаличияОбновления", ИспользоватьЗначениеНастройки); + Если ИспользоватьЗначениеНастройки = Истина Тогда + Значение = СтруктураНастройки.АдресСервераДляПроверкиНаличияОбновления; + КонецЕсли; + КонецЕсли; + + Возврат Значение; + +КонецФункции + +Функция КаталогОбновлений() + + Значение = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Метаданные.АдресКаталогаОбновлений); // Значение по умолчанию + + ЗначениеПереопределяемогоМодуля = ОбновлениеКонфигурацииПереопределяемый.КаталогОбновлений(); + Если НЕ ПустаяСтрока(ЗначениеПереопределяемогоМодуля) Тогда // Переопределяемое значение + Значение = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ЗначениеПереопределяемогоМодуля); + КонецЕсли; + + СтруктураНастройки = ХранилищеОбщихНастроек.Загрузить("ОбновлениеКонфигурации", "НастройкиОбновленияКонфигурации"); + Если СтруктураНастройки <> Неопределено Тогда // Значение из настроек пользователя + ИспользоватьЗначениеНастройки = Ложь; + СтруктураНастройки.Свойство("ИспользоватьЗначениеНастройкиКаталогОбновлений", ИспользоватьЗначениеНастройки); + Если ИспользоватьЗначениеНастройки = Истина Тогда + Значение = СтруктураНастройки.КаталогОбновлений; + КонецЕсли; + КонецЕсли; + + Возврат Значение; + +КонецФункции + +Функция АдресРесурсаДляПроверкиНаличияОбновления() + + Значение = "/ipp/ITSREPV/V8Update/Configs/"; // Значение по умолчанию + + ЗначениеПереопределяемогоМодуля = ОбновлениеКонфигурацииПереопределяемый.АдресРесурсаДляПроверкиНаличияОбновления(); + Если НЕ ПустаяСтрока(ЗначениеПереопределяемогоМодуля) Тогда // Переопределяемое значение + Значение = ЗначениеПереопределяемогоМодуля; + КонецЕсли; + + СтруктураНастройки = ХранилищеОбщихНастроек.Загрузить("ОбновлениеКонфигурации", + "НастройкиОбновленияКонфигурации"); + + Если СтруктураНастройки <> Неопределено Тогда // Значение из настроек пользователя + ИспользоватьЗначениеНастройки = Ложь; + СтруктураНастройки.Свойство("ИспользоватьЗначениеНастройкиАдресРесурсаДляПроверкиНаличияОбновления", ИспользоватьЗначениеНастройки); + Если ИспользоватьЗначениеНастройки = Истина Тогда + Значение = СтруктураНастройки.АдресРесурсаДляПроверкиНаличияОбновления; + КонецЕсли; + КонецЕсли; + + Возврат Значение; + +КонецФункции + +Функция ОбновлениеКонфигурацииУспешно() Экспорт + + Если НЕ ПравоДоступа("Чтение", Метаданные.Константы.СтатусОбновленияКонфигурации) Тогда + Возврат Неопределено; + КонецЕсли; + + ЗначениеХранилища = Константы.СтатусОбновленияКонфигурации.Получить(); + + Статус = Неопределено; + Если ЗначениеХранилища <> Неопределено Тогда + Статус = ЗначениеХранилища.Получить(); + КонецЕсли; + + Если Статус = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Если НЕ Статус.ОбновлениеВыполнено ИЛИ + (Статус.ИмяАдминистратораОбновления <> ИмяПользователя()) Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат Статус.РезультатОбновленияКонфигурации; + +КонецФункции + +Процедура ЗаписатьСтатусОбновления(Знач ИмяАдминистратораОбновления = "", Знач ОбновлениеЗапланировано = Ложь, + Знач ОбновлениеВыполнено = Ложь, Знач РезультатОбновления = Ложь, СообщенияДляЖурналаРегистрации = Неопределено) Экспорт + + Если СообщенияДляЖурналаРегистрации <> Неопределено И СообщенияДляЖурналаРегистрации.Количество() > 0 Тогда + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + КонецЕсли; + + Статус = Новый Структура("ИмяАдминистратораОбновления, + |ОбновлениеЗапланировано, + |ОбновлениеВыполнено, + |РезультатОбновленияКонфигурации", + ИмяАдминистратораОбновления, + ОбновлениеЗапланировано, + ОбновлениеВыполнено, + РезультатОбновления); + + Константы.СтатусОбновленияКонфигурации.Установить(Новый ХранилищеЗначения(Статус)); + +КонецПроцедуры + +Процедура СброситьСтатусОбновленияКонфигурации() Экспорт + + Константы.СтатусОбновленияКонфигурации.Установить(Новый ХранилищеЗначения(Неопределено)); + +КонецПроцедуры + +Функция ПолучитьСтруктуруНастроекПомощника() Экспорт + Возврат ХранилищеОбщихНастроек.Загрузить( + "ОбновлениеКонфигурации", + "НастройкиОбновленияКонфигурации"); +КонецФункции + +Процедура ЗаписатьСтруктуруНастроекПомощника(НастройкиОбновленияКонфигурации, СообщенияДляЖурналаРегистрации = Неопределено) Экспорт + + Если СообщенияДляЖурналаРегистрации <> Неопределено И СообщенияДляЖурналаРегистрации.Количество() > 0 Тогда + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + КонецЕсли; + + ХранилищеОбщихНастроек.Сохранить("ОбновлениеКонфигурации", "НастройкиОбновленияКонфигурации", НастройкиОбновленияКонфигурации); + +КонецПроцедуры + +// Проверка доступа к подсистеме ОбновлениеКонфигурации +Функция ПроверитьДоступДляОбновления() + Возврат Пользователи.ЭтоПолноправныйПользовательИБ(); +КонецФункции + +Функция ПроверитьДоступДляПроверкиОбновления() Экспорт + Возврат ( РольДоступна("ПроверкаДоступныхОбновленийКонфигурации") ИЛИ + Пользователи.ЭтоПолноправныйПользовательИБ()) + И НЕ ОбщегоНазначения.ТекущийПользователь().Пустая(); +КонецФункции + +Функция СобытиеЖурналаРегистрации() Экспорт + Возврат НСтр("ru = 'Обновление информационной базы'"); +КонецФункции + +Процедура ОтправитьУведомлениеОбОбновлении(Знач ИмяПользователя, Знач АдресНазначения, Знач УспешноеОбновление) + + Тема = ? (УспешноеОбновление, НСтр("ru = 'Успешное обновление конфигурации ""%1"", версия %2'"), + НСтр("ru = 'Ошибка обновления конфигурации ""%1"", версия %2'")); + Тема = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Тема, Метаданные.КраткаяИнформация, Метаданные.Версия); + + Подробности = ?(УспешноеОбновление, НСтр("ru = 'Обновление конфигурации завершено успешно.'"), + НСтр("ru = 'При обновлении конфигурации произошли ошибки. Подробности записаны в журнал регистрации.'")); + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 + | + |Конфигурация: %2 + |Версия: %3 + |Строка соединения: %4'"), + Подробности, Метаданные.КраткаяИнформация, Метаданные.Версия, СтрокаСоединенияИнформационнойБазы()); + + ПараметрыПисьма = Новый Структура; + ПараметрыПисьма.Вставить("Тема", Тема); + ПараметрыПисьма.Вставить("Тело", Текст); + ПараметрыПисьма.Вставить("Кому", АдресНазначения); + + РаботаСПочтовымиСообщениями.ОтправитьСообщение(РаботаСПочтовымиСообщениями.ПолучитьСистемнуюУчетнуюЗапись(), ПараметрыПисьма); + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурации/ОбновлениеКонфигурации.mdo b/SSL/src/CommonModules/ОбновлениеКонфигурации/ОбновлениеКонфигурации.mdo new file mode 100644 index 000000000..d527e6e23 --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеКонфигурации/ОбновлениеКонфигурации.mdo @@ -0,0 +1,11 @@ + + + ОбновлениеКонфигурации + + ru + Обновление конфигурации + + true + true + true + diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl new file mode 100644 index 000000000..054eeea3c --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl @@ -0,0 +1,596 @@ +//////////////////////////////////////////////////////////////////////////////// +// Программный интерфейс подсистемы. + +// Проверяет наличие обновления конфигурации в Интернете при запуске программы. +// +Процедура ПроверитьОбновлениеКонфигурации() Экспорт + #Если НЕ ВебКлиент Тогда + ДоступноеОбновлениеКонфигурации = Неопределено; + СообщенияДляЖурналаРегистрации = Новый СписокЗначений; + НастройкиОбновления = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления; + НаличиеОбновления = НастройкиОбновления.ПроверитьПрошлыеОбновленияБазы; + Если НЕ НаличиеОбновления И НастройкиОбновления.ЕстьДоступДляОбновления Тогда + НаличиеОбновления = НастройкиОбновления.КонфигурацияИзменена; + КонецЕсли; + НаименованиеСтраницыДоступногоОбновления = "ДоступноеОбновление"; + НаименованиеСтраницыФайлОбновления = "ФайлОбновления"; + ЕстьДоступноеОбновлениеВИнтернете = Ложь; + НастройкиОбновленияКонфигурации = НастройкиОбновления.НастройкиОбновленияКонфигурации; + + Если НЕ НаличиеОбновления И НастройкиОбновленияКонфигурации <> Неопределено + И НастройкиОбновления.ЕстьДоступДляПроверкиОбновления И + (НастройкиОбновленияКонфигурации.ПроверятьНаличиеОбновленияПриЗапуске = 1 ИЛИ + НастройкиОбновленияКонфигурации.ПроверятьНаличиеОбновленияПриЗапуске = 2) Тогда + // подключение обработчика ожидания для проверки наличия обновления в интернете + РасписаниеПроверкиНаличияОбновления = Неопределено; + Если НастройкиОбновленияКонфигурации <> Неопределено Тогда + НастройкиОбновленияКонфигурации.Свойство("РасписаниеПроверкиНаличияОбновления", РасписаниеПроверкиНаличияОбновления); + Если НастройкиОбновленияКонфигурации.ПроверятьНаличиеОбновленияПриЗапуске = 1 И РасписаниеПроверкиНаличияОбновления <> Неопределено Тогда + ПодключитьОтключитьПроверкуПоРасписанию(Истина); + КонецЕсли; + КонецЕсли; + + // если расписание не задано, то проверяем наличие обновления сейчас + Если НастройкиОбновленияКонфигурации.ПроверятьНаличиеОбновленияПриЗапуске = 2 Тогда + ПроверитьНаличиеОбновленияЧерезИнтернет(); + ЕстьДоступноеОбновлениеВИнтернете = (ДоступноеОбновлениеКонфигурации <> Неопределено И + ДоступноеОбновлениеКонфигурации.ИмяСтраницы = НаименованиеСтраницыДоступногоОбновления); + Если НЕ НаличиеОбновления И ЕстьДоступноеОбновлениеВИнтернете Тогда + НаличиеОбновления = ЕстьДоступноеОбновлениеВИнтернете; + КонецЕсли; + КонецЕсли; + + Возврат; + КонецЕсли; + + Если НастройкиОбновления.КонфигурацияИзменена И НастройкиОбновления.ЕстьДоступДляПроверкиОбновления Тогда + Если НастройкиОбновленияКонфигурации = Неопределено Тогда + НастройкиОбновленияКонфигурации = Новый Структура("КодПользователяСервераОбновлений, + |ПарольСервераОбновлений, + |ЗапомнитьПарольСервераОбновлений, + |ПроверятьНаличиеОбновленияПриЗапуске, + |ИсточникОбновления, + |РежимОбновления, + |ДатаВремяОбновления, + |ВыслатьОтчетНаПочту, + |АдресЭлектроннойПочты, + |КодЗадачиПланировщика, + |ПовторныйЗапуск, + |ИмяФайлаОбновления, + |НуженФайлОбновления, + |СоздаватьРезервнуюКопию, + |ИмяКаталогаРезервнойКопииИБ", + "", + "", + Ложь, + Ложь, + 2, + 0, + ТекущаяДата(), + Ложь, + "", + 0, + Ложь, + "", + Ложь, + 0, + ""); + Иначе + НастройкиОбновленияКонфигурации.ИсточникОбновления = 2; // локальный или сетевой каталог + НастройкиОбновленияКонфигурации.НуженФайлОбновления = Ложь; + КонецЕсли; + ОбновлениеКонфигурации.ЗаписатьСтруктуруНастроекПомощника(НастройкиОбновленияКонфигурации); + + Если ДоступноеОбновлениеКонфигурации = Неопределено Тогда + ДоступноеОбновлениеКонфигурации = Новый Структура; + КонецЕсли; + ДоступноеОбновлениеКонфигурации.Вставить("ИсточникОбновления" , НастройкиОбновленияКонфигурации.ИсточникОбновления); + ДоступноеОбновлениеКонфигурации.Вставить("НуженФайлОбновления" , НастройкиОбновленияКонфигурации.НуженФайлОбновления); + ДоступноеОбновлениеКонфигурации.Вставить("ФлагАвтоПереходаНаСтраницуСОбновлением" , Истина); + ДоступноеОбновлениеКонфигурации.Вставить("НадписьОповещения" , "Обнаружено, что конфигурация отличается от основной конфигурации информационной базы!"); + ПоказатьОповещениеПользователя(НСтр("ru = 'Обновление конфигурации'"), + "e1cib/app/Обработка.ОбновлениеКонфигурации", + НСтр("ru = 'Конфигурация отличается от основной конфигурации информационной базы.'"), + БиблиотекаКартинок.Информация32); + Возврат; + КонецЕсли; + + Если ЕстьДоступноеОбновлениеВИнтернете И НастройкиОбновления.ЕстьДоступДляПроверкиОбновления Тогда + Если НастройкиОбновленияКонфигурации = Неопределено Тогда + НастройкиОбновленияКонфигурации = Новый Структура("КодПользователяСервераОбновлений, + |ПарольСервераОбновлений, + |ЗапомнитьПарольСервераОбновлений, + |ПроверятьНаличиеОбновленияПриЗапуске, + |ИсточникОбновления, + |РежимОбновления, + |ДатаВремяОбновления, + |ВыслатьОтчетНаПочту, + |АдресЭлектроннойПочты, + |КодЗадачиПланировщика, + |ПовторныйЗапуск, + |ИмяФайлаОбновления, + |НуженФайлОбновления, + |СоздаватьРезервнуюКопию, + |ИмяКаталогаРезервнойКопииИБ", + "", + "", + Ложь, + Ложь, + 0, + 0, + ТекущаяДата(), + Ложь, + "", + 0, + Ложь, + "", + Ложь, + 0, + ""); + Иначе + НастройкиОбновленияКонфигурации.ИсточникОбновления = 0; + КонецЕсли; + ОбновлениеКонфигурации.ЗаписатьСтруктуруНастроекПомощника(НастройкиОбновленияКонфигурации); + + Если ДоступноеОбновлениеКонфигурации = Неопределено Тогда + ДоступноеОбновлениеКонфигурации = Новый Структура; + КонецЕсли; + ДоступноеОбновлениеКонфигурации.Вставить("ИсточникОбновления" , НастройкиОбновленияКонфигурации.ИсточникОбновления); + ДоступноеОбновлениеКонфигурации.Вставить("НуженФайлОбновления" , НастройкиОбновленияКонфигурации.НуженФайлОбновления); + ДоступноеОбновлениеКонфигурации.Вставить("ФлагАвтоПереходаНаСтраницуСОбновлением" , Истина); + ДоступноеОбновлениеКонфигурации.Вставить("НадписьОповещения" , "Обнаружено доступное обновление в Интернете"); + ПоказатьОповещениеПользователя(НСтр("ru = 'Доступно обновление конфигурации'"), + "e1cib/app/Обработка.ОбновлениеКонфигурации", + НСтр("ru = 'Версия: '") + ДоступноеОбновлениеКонфигурации.ПараметрыФайлаПроверкиОбновления.Version, + БиблиотекаКартинок.Информация32); + Возврат; + КонецЕсли; + + Если НаличиеОбновления Тогда + // надо завершить предыдущее обновление + ОткрытьФорму("Обработка.ОбновлениеКонфигурации.Форма.Форма"); + КонецЕсли; + #КонецЕсли +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции + +// Получить адрес страницы на веб-сервере поставщика конфигурации, на которой находится +// информация о доступных обновлениях. +// +// Возвращаемое значение: +// Строка – адрес веб-страницы. +// +Функция АдресРесурсовДляПроверкиНаличияОбновления() Экспорт + НастройкиОбновления = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления; + КороткоеИмяКонфигурации = НастройкиОбновления.КороткоеИмяКонфигурации; + КороткоеИмяКонфигурации = СтрЗаменить(КороткоеИмяКонфигурации, "\", "/"); + Результат = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(НастройкиОбновления.АдресРесурсаДляПроверкиНаличияОбновления) + + КороткоеИмяКонфигурации + "/"; + Возврат Результат; +КонецФункции + +// Получить адрес веб-страницы с информацией о том, как получить доступ к +// пользовательскому разделу на сайте поставщика конфигурации. +// +// Возвращаемое значение: +// Строка – адрес веб-страницы. +Функция АдресСтраницыИнформацииОПолученииДоступаКПользовательскомуСайту() Экспорт + + Значение = "http://users.v8.1c.ru/Rules.aspx"; // Значение по умолчанию + + ЗначениеПереопределяемогоМодуля = ОбновлениеКонфигурацииКлиентПереопределяемый.АдресСтраницыИнформацииОПолученииДоступаКПользовательскомуСайту(); + Если НЕ ПустаяСтрока(ЗначениеПереопределяемогоМодуля) Тогда // Переопределяемое значение + Значение = ЗначениеПереопределяемогоМодуля; + КонецЕсли; + + Возврат Значение; +КонецФункции + +// Получить адрес каталога файлов обновления на сервере обновлений. +// +// Возвращаемое значение: +// Строка – адрес каталога на веб-сервере. +// +Функция АдресКаталогаШаблоновНаСервереОбновлений() Экспорт + + СерверОбновлений = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.КаталогОбновлений; + СерверОбновлений = СтрЗаменить(СерверОбновлений, "http://", ""); + КаталогШаблоновНаСервере = ""; + Позиция = Найти(СерверОбновлений, "/"); + Если Позиция > 0 Тогда + КаталогШаблоновНаСервере = Сред(СерверОбновлений, Позиция, СтрДлина(СерверОбновлений)); + КонецЕсли; + Возврат КаталогШаблоновНаСервере; + +КонецФункции + +// Получить адрес сервера обновлений. +// +// Возвращаемое значение: +// Строка – адрес веб-сервера. +// +Функция АдресСервераОбновлений() Экспорт + + СерверОбновлений = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.КаталогОбновлений; + СерверОбновлений = СтрЗаменить(СерверОбновлений, "http://", ""); + Позиция = Найти(СерверОбновлений, "/"); + Если Позиция > 0 Тогда + СерверОбновлений = Сред(СерверОбновлений, 1, Позиция - 1); + КонецЕсли; + Возврат "http://" + СерверОбновлений; + +КонецФункции + +// Получить имя файла с информацией о доступном обновлении на сайте поставщика +// конфигурации. +// +// Возвращаемое значение: +// Строка – имя файла. +// +Функция ИмяФайлаПроверкиНаличияОбновления() Экспорт + + Возврат "UpdInfo.txt"; + +КонецФункции + +Функция ПодключитьОтключитьПроверкуПоРасписанию(ФлагПодключитьИЛИОтключить = Истина) Экспорт + Если ФлагПодключитьИЛИОтключить Тогда + ПодключитьОбработчикОжидания("ОбработатьПроверкуОбновленияПоРасписанию", 10); //60 * 5); // каждые 5 минут + Иначе + ОтключитьОбработчикОжидания("ОбработатьПроверкуОбновленияПоРасписанию"); + КонецЕсли; +КонецФункции + +Процедура ПроверитьНаличиеОбновленияЧерезИнтернет(ВыдаватьСообщения = Ложь) Экспорт + Состояние("Проверка наличия обновления в Интернете.."); + + Если ТипЗнч(ДоступноеОбновлениеКонфигурации) = Тип("Структура") Тогда + ВремяПолученияОбновления = Неопределено; + ДоступноеОбновлениеКонфигурации.Свойство("ВремяПолученияОбновления", ВремяПолученияОбновления); + Если ВремяПолученияОбновления <> Неопределено И + ТекущаяДата() - ВремяПолученияОбновления < 30 Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + ДоступноеОбновлениеКонфигурации = Новый Структура; + + ДоступноеОбновлениеКонфигурации.Вставить("ПараметрыФайлаПроверкиОбновления", ПолучитьФайлПроверкиНаличияОбновлений(ВыдаватьСообщения)); + Если ТипЗнч(ДоступноеОбновлениеКонфигурации.ПараметрыФайлаПроверкиОбновления) = Тип("Строка") Тогда + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + НСтр("ru = ' Невозможно подключиться к сети Интернет для проверки обновлений.'"), "Предупреждение"); + ДоступноеОбновлениеКонфигурации.Вставить("ИмяСтраницы", "ПодключениеКИнтернет"); + Возврат; + КонецЕсли; + + ДоступноеОбновлениеКонфигурации.Вставить("ПоследняяВерсияКонфигурации", ДоступноеОбновлениеКонфигурации.ПараметрыФайлаПроверкиОбновления.Version); + Если СтроковыеФункцииКлиентСервер.СравнитьВерсии(СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ВерсияКонфигурации, + ДоступноеОбновлениеКонфигурации.ПоследняяВерсияКонфигурации) >= 0 Тогда + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + НСтр("ru = ' Обновление не требуется: последняя версия конфигурации уже установлена.'"), "Информация"); + ДоступноеОбновлениеКонфигурации.Вставить("ИмяСтраницы", "ОбновленияНеОбнаружено"); + Возврат; + КонецЕсли; + + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + НСтр("ru = ' Обнаружена более новая версия конфигурации в Интернете: '") + ДоступноеОбновлениеКонфигурации.ПоследняяВерсияКонфигурации + ".", "Информация"); + ДоступноеОбновлениеКонфигурации.Вставить("ИмяСтраницы" , "ДоступноеОбновление"); + ДоступноеОбновлениеКонфигурации.Вставить("ВремяПолученияОбновления" , ТекущаяДата()); +КонецПроцедуры + +Процедура ПроверитьОбновлениеПоРасписанию() Экспорт + НастройкиОбновленияКонфигурации = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.НастройкиОбновленияКонфигурации; + РасписаниеПроверкиНаличияОбновления = Неопределено; + Если НастройкиОбновленияКонфигурации = Неопределено Тогда + Возврат; + КонецЕсли; + НастройкиОбновленияКонфигурации.Свойство("РасписаниеПроверкиНаличияОбновления", РасписаниеПроверкиНаличияОбновления); + Если НастройкиОбновленияКонфигурации.ПроверятьНаличиеОбновленияПриЗапуске <> 1 ИЛИ + РасписаниеПроверкиНаличияОбновления = Неопределено Тогда + Возврат; + КонецЕсли; + + Если НЕ РасписаниеПроверкиНаличияОбновления.ТребуетсяВыполнение() Тогда + Возврат; + КонецЕсли; + + Если ЗначениеЗаполнено(РасписаниеПроверкиНаличияОбновления.ПериодПовтораДней) Тогда + РасписаниеПроверкиНаличияОбновления.ДатаНачала = ДобавитьДни(ТекущаяДата(), + РасписаниеПроверкиНаличияОбновления.ПериодПовтораДней); + ОбновлениеКонфигурации.ЗаписатьСтруктуруНастроекПомощника(НастройкиОбновленияКонфигурации); + КонецЕсли; + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + "ru = ' Проверка наличия обновления в интернете по расписанию.'"); + НаименованиеСтраницыДоступногоОбновления = "ДоступноеОбновление"; + ОбновлениеКонфигурацииКлиент.ПроверитьНаличиеОбновленияЧерезИнтернет(); + Если ДоступноеОбновлениеКонфигурации <> Неопределено И + ДоступноеОбновлениеКонфигурации.ИмяСтраницы = НаименованиеСтраницыДоступногоОбновления Тогда + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + + НСтр("ru = 'Обнаружена новая версия конфигурации: '") + ДоступноеОбновлениеКонфигурации.ПараметрыФайлаПроверкиОбновления.Version); + НастройкиОбновленияКонфигурации.ИсточникОбновления = 0; + НастройкиОбновленияКонфигурации.Вставить("РасписаниеПроверкиНаличияОбновления" , РасписаниеПроверкиНаличияОбновления); + НастройкиОбновленияКонфигурации.Вставить("ПроверятьНаличиеОбновленияПриЗапуске" , НастройкиОбновленияКонфигурации.ПроверятьНаличиеОбновленияПриЗапуске); + ОбновлениеКонфигурации.ЗаписатьСтруктуруНастроекПомощника(НастройкиОбновленияКонфигурации, СообщенияДляЖурналаРегистрации); + + ДоступноеОбновлениеКонфигурации.Вставить("ИсточникОбновления" , НастройкиОбновленияКонфигурации.ИсточникОбновления); + ДоступноеОбновлениеКонфигурации.Вставить("НуженФайлОбновления" , НастройкиОбновленияКонфигурации.НуженФайлОбновления); + ДоступноеОбновлениеКонфигурации.Вставить("ФлагАвтоПереходаНаСтраницуСОбновлением" , Истина); + ДоступноеОбновлениеКонфигурации.Вставить("НадписьОповещения" , "Обнаружено доступное обновление в Интернете"); + ПоказатьОповещениеПользователя(НСтр("ru = 'Доступно обновление конфигурации'"), + "e1cib/app/Обработка.ОбновлениеКонфигурации", + НСтр("ru = 'Версия: '") + ДоступноеОбновлениеКонфигурации.ПараметрыФайлаПроверкиОбновления.Version, + БиблиотекаКартинок.Информация32); + Иначе + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + НСтр("ru = 'Доступных обновлений не обнаружено.'")); + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + КонецЕсли; +КонецПроцедуры + +Функция ПолучитьФайлПроверкиНаличияОбновлений(Знач ВыдаватьСообщения = Истина) + + ВременныйФайл = ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().КаталогФайловОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаПроверкиНаличияОбновления; + Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте( СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.АдресСервераДляПроверкиНаличияОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().АдресРесурсовДляПроверкиНаличияОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаПроверкиНаличияОбновления, + Новый Структура("ПутьДляСохранения", + ? (ПустаяСтрока(ВременныйФайл), Неопределено, ВременныйФайл))); + Если Результат.Статус <> Истина Тогда + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось проверить наличие обновлений. + |%1'"), Результат.СообщениеОбОшибке); + Если ВыдаватьСообщения Тогда + Предупреждение(СообщениеОбОшибке); + КонецЕсли; + Возврат СообщениеОбОшибке; + КонецЕсли; + + Возврат ПараметрыДистрибутива(ВременныйФайл); + +КонецФункции + +Функция СкопироватьФайл(ИмяФайлаИсточник, ИмяФайлаНазначение, ВыдаватьСообщения = Ложь) Экспорт + Попытка + СоздатьКаталог(ПолучитьКаталогФайла(ИмяФайлаНазначение)); + КопироватьФайл(ИмяФайлаИсточник, ИмяФайлаНазначение); + Исключение + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 Ошибка при копировании: %2 + |(источник: %3; приемник: %4)'"), + ТекущаяДата(), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ИмяФайлаИсточник, ИмяФайлаНазначение); + СообщенияДляЖурналаРегистрации.Добавить(Сообщение, "Предупреждение"); + Возврат Ложь; + КонецПопытки; + Возврат Истина; +КонецФункции + +Функция ПолучитьПараметрыОбновленияИТС(КаталогОбновленияНаДискеИТС, Знач ВыдаватьСообщения = Истина) Экспорт + + Если ПустаяСтрока(КаталогОбновленияНаДискеИТС) Тогда + Возврат Неопределено; + КонецЕсли; + + ВременныйФайл = ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().КаталогФайловОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаПроверкиНаличияОбновления; + Если НЕ СкопироватьФайл(КаталогОбновленияНаДискеИТС + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаПроверкиНаличияОбновления, ВременныйФайл, ВыдаватьСообщения) Тогда + Возврат Неопределено; + КонецЕсли; + + ПараметрыДискИТС = ПараметрыДистрибутива(ВременныйФайл); + Если ТипЗнч(ПараметрыДискИТС) = Тип("Строка") Тогда + Возврат Неопределено; + КонецЕсли; + Возврат ПараметрыДискИТС; + +КонецФункции + +Функция ПолучитьПараметрыРелизовНаДискеИТС(ДискИТС, Знач ВыдаватьСообщения = Истина) Экспорт + + Если ПустаяСтрока(ДискИТС) Тогда + Возврат Неопределено; + КонецЕсли; + + ПараметрыОбновления = ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления(); + ВременныйФайл = ПараметрыОбновления.КаталогФайловОбновления + ПараметрыОбновления.ИмяФайлаАдресовРелизовИТС; + Если НЕ СкопироватьФайл( + ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ДискИТС) + + ПараметрыОбновления.ИмяФайлаАдресовРелизовИТС, ВременныйФайл, ВыдаватьСообщения) Тогда + Возврат Неопределено; + КонецЕсли; + + ПараметрыРелизовНаДискеИТС = ПрочитатьАдресаРелизовНаДискеИТС(ВременныйФайл, ДискИТС); + Если ТипЗнч(ПараметрыРелизовНаДискеИТС) <> Тип("Структура") Тогда // ошибки при чтении файла + Если ВыдаватьСообщения Тогда + Предупреждение(НСтр("ru = 'Обновления на диске ИТС не найдены.'")); + КонецЕсли; + Возврат Неопределено; + КонецЕсли; + Возврат ПараметрыРелизовНаДискеИТС; + +КонецФункции + +Функция СуществуетФайлПроверкиНаличияОбновления(Знач ПутьККаталогу) + ФайлПроверки = Новый Файл(ПутьККаталогу + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаПроверкиНаличияОбновления); + Возврат ФайлПроверки.Существует(); +КонецФункции + +// Возвратить каталог файла - часть пути без имени файла. +// +// Параметры +// ПутьКФайлу – Строка – путь к файлу. +// +// Возвращаемое значение: +// Строка – каталог файла +Функция ПолучитьКаталогФайла(Знач ПутьКФайлу) Экспорт + + ПозицияСимвола = ПолучитьНомерПоследнегоСимвола(ПутьКФайлу, "\"); + Если ПозицияСимвола > 1 Тогда + Возврат Сред(ПутьКФайлу, 1, ПозицияСимвола - 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 = 'Неверный формат сведений о наличии обновлений'"); + КонецЕсли; + КонецЦикла; + Возврат ПарКомпл; +КонецФункции + +Функция ПрочитатьАдресаРелизовНаДискеИТС(Знач ИмяФайла, Знач ДискИТС) + Файл = Новый Файл(ИмяФайла); + Если НЕ Файл.Существует() Тогда + Возврат НСтр("ru = 'Файл описания обновлений не получен'"); + КонецЕсли; + + КороткоеИмяКонфигурации = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.КороткоеИмяКонфигурации; + КороткоеИмяКонфигурации = СтрЗаменить(КороткоеИмяКонфигурации, "/", "\"); + КороткоеИмяКонфигурации = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КороткоеИмяКонфигурации); + ВозвращаемаяСтруктура = Новый Структура("ПутьКФайламОбновленияНаДискеИТС, ПутьКСтатьеПеречнюРелизов", "", ""); + Попытка + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.ОткрытьФайл(Файл.ПолноеИмя); + ЧтениеXML.Прочитать(); + + // Путь к статье с перечнем релизов на диске ИТС + ПутьКСтатьеПеречнюРелизов = ЧтениеXML.ПолучитьАтрибут("UpdateListFile"); + Если НЕ ПустаяСтрока(ПутьКСтатьеПеречнюРелизов) Тогда + ВозвращаемаяСтруктура.Вставить("ПутьКСтатьеПеречнюРелизов", ПутьКСтатьеПеречнюРелизов); + КонецЕсли; + + // Читаем начало элемента Update или конец элемента UpdateList. + Пока ЧтениеXML.Прочитать() Цикл + Если ЧтениеXML.Имя = "UpdateSourceList" Тогда + Прервать; + КонецЕсли; + Если ЧтениеXML.Имя <> "source" Тогда + Продолжить; + КонецЕсли; + + ЧтениеXML.Прочитать(); + ЗначениеПутиКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ДискИТС) + + ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(СтроковыеФункцииКлиентСервер.СократитьДвойныеКавычки( + СокрЛП(ЧтениеXML.Значение))) + + КороткоеИмяКонфигурации; + Если НЕ ПустаяСтрока(ЗначениеПутиКаталога) И СуществуетФайлПроверкиНаличияОбновления(ЗначениеПутиКаталога) Тогда + ВозвращаемаяСтруктура.Вставить("ПутьКФайламОбновленияНаДискеИТС", ЗначениеПутиКаталога); + Прервать; + КонецЕсли; + ЧтениеXML.Прочитать(); + КонецЦикла; + ЧтениеXML.Закрыть(); + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + НСтр("ru = ' ПрочитатьАдресаРелизовНаДискеИТС: '") + + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), "Ошибка"); + Возврат Неопределено; + КонецПопытки; + + Возврат ВозвращаемаяСтруктура; +КонецФункции + +Функция ПолучитьНомерПоследнегоСимвола(Знач ИсходнаяСтрока, Знач СимволПоиска) + + ПозицияСимвола = СтрДлина(ИсходнаяСтрока); + Пока ПозицияСимвола >= 1 Цикл + + Если Сред(ИсходнаяСтрока, ПозицияСимвола, 1) = СимволПоиска Тогда + Возврат ПозицияСимвола; + КонецЕсли; + + ПозицияСимвола = ПозицияСимвола - 1; + КонецЦикла; + + Возврат 0; + +КонецФункции + +Функция КаталогLocalAppData() Экспорт + App = Новый COMОбъект("Shell.Application"); + Folder = App.Namespace(28); + Результат = Folder.Self.Path; + Возврат ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Результат); +КонецФункции + +Процедура ОткрытьВебСтраницу(Знач АдресСтраницы, Знач Заголовок = "") Экспорт + + ОткрытьФорму("Обработка.ОбновлениеКонфигурации.Форма.Обозреватель", + Новый Структура("АдресСтраницы,Заголовок", АдресСтраницы, Заголовок)); + +КонецПроцедуры + +// Добавляет заданное количество дней к дате +// +// Параметры: +// Дата - Дата - Исходная дата +// ЧислоДней - Число - Количество дней, добавляемых к исходной дате +Функция ДобавитьДни(Знач Дата, Знач ЧислоДней) Экспорт + + Если ЧислоДней > 0 Тогда + Разница = День(Дата) + ЧислоДней - День(КонецМесяца(Дата)); + Если Разница > 0 Тогда + НоваяДата = ДобавитьМесяц(Дата, 1); + Возврат Дата(Год(НоваяДата), Месяц(НоваяДата), Разница, + Час(НоваяДата), Минута(НоваяДата), Секунда(НоваяДата)); + КонецЕсли; + ИначеЕсли ЧислоДней < 0 Тогда + Разница = День(Дата) + ЧислоДней - День(НачалоМесяца(Дата)); + Если Разница < 1 Тогда + НоваяДата = ДобавитьМесяц(Дата, -1); + Возврат Дата(Год(НоваяДата), Месяц(НоваяДата), День(КонецМесяца(НоваяДата)) - Разница, + Час(НоваяДата), Минута(НоваяДата), Секунда(НоваяДата)); + КонецЕсли; + КонецЕсли; + Возврат Дата(Год(Дата), Месяц(Дата), День(Дата) + ЧислоДней, Час(Дата), Минута(Дата), Секунда(Дата)); + +КонецФункции + diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/ОбновлениеКонфигурацииКлиент.mdo b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/ОбновлениеКонфигурацииКлиент.mdo new file mode 100644 index 000000000..3f684580c --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/ОбновлениеКонфигурацииКлиент.mdo @@ -0,0 +1,10 @@ + + + ОбновлениеКонфигурацииКлиент + + ru + Обновление конфигурации клиент + + true + true + diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентГлобальный/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентГлобальный/Module.bsl new file mode 100644 index 000000000..e6447f051 --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентГлобальный/Module.bsl @@ -0,0 +1,7 @@ +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции + +Процедура ОбработатьПроверкуОбновленияПоРасписанию() Экспорт + ОбновлениеКонфигурацииКлиент.ПроверитьОбновлениеПоРасписанию(); +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентГлобальный/ОбновлениеКонфигурацииКлиентГлобальный.mdo b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентГлобальный/ОбновлениеКонфигурацииКлиентГлобальный.mdo new file mode 100644 index 000000000..8d3f9cf3d --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентГлобальный/ОбновлениеКонфигурацииКлиентГлобальный.mdo @@ -0,0 +1,11 @@ + + + ОбновлениеКонфигурацииКлиентГлобальный + + ru + Обновление конфигурации клиент глобальный + + true + true + true + diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/Module.bsl new file mode 100644 index 000000000..4a958dff2 --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/Module.bsl @@ -0,0 +1,75 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ИНТЕРАКТИВНОЙ РАБОТЫ В ФОРМЕ ПОМОЩНИКА +// + +// Обработчик события перехода по страница помощника обновления. +// +// Параметры +// ПомощникОбновления - Обработка.ОбновлениеКонфигурации +// ПредыдущаяСтраница - Строка - имя страницы помощника. +// СледующаяСтраница - Строка - имя страницы помощника. +// Отказ - Булево - если записать значение Истина, то переход на +// страницу СледующаяСтраница не произойдет. +// По умолчанию, значение Ложь. +// +Процедура ПриПереходеНаСтраницуПомощника(ПредыдущаяСтраница, СледующаяСтраница, Отказ) Экспорт + +КонецПроцедуры + +// Обработчик вызывается перед завершением работы системы при обновлении конфигурации из помощника. +// +// Пример реализации: +// #Если Клиент Тогда +//   глЗапрашиватьПодтверждениеПриЗакрытии = Ложь; +// #КонецЕсли +// +Процедура ПередЗавершениемРаботыСистемы() Экспорт + +КонецПроцедуры + +// Проверить, что информационную базу можно обновить. +// Например, если выясняется, что обновление конфигурации не пройдет или +// будет идти с проблемами, то пользователю выдается предупреждение, и +// предлагается самостоятельно устранить причины, после чего +// повторить попытку обновления. +// +// Параметры +// ВыдаватьСообщения – Булево – определяет, может ли функция выводить +// сообщения/диалоги или от нее требуется +// вернуть только результат проверки. +// +// Возвращаемое значение: +// Булево – признак готовности ИБ к проведению обновления. +// +// Пример реализации: +// +// Результат = ПроверитьКорректностьДанных(); +// Если НЕ Результат И ВыдаватьСообщения Тогда +// Предупреждение("Конфигурация не может быть обновлена, так как ..."); +// КонецЕсли; +// Возврат Результат; +Функция ГотовностьКОбновлениюКонфигурации(Знач ВыдаватьСообщения) Экспорт + Возврат Истина; // результат по умолчанию +КонецФункции + +// Определить, поставляются ли для данной конфигурации обновления на ИТС. +// +// Возвращаемое значение: +// Булево - признак того, что обновления поставляются на диске ИТС. +// +Функция ИспользоватьОбновлениеСДискаИТС() Экспорт + Возврат Истина; // значение по умолчанию +КонецФункции + +// Получить адрес веб-страницы с информацией о том, как получить доступ к +// пользовательскому разделу на сайте поставщика конфигурации. +// +// Возвращаемое значение: +// Строка – адрес веб-страницы. +// +// Пример реализации: +// Возврат "http://users.v8.1c.ru/Rules.aspx"; // для типовых конфигураций +// +Функция АдресСтраницыИнформацииОПолученииДоступаКПользовательскомуСайту() Экспорт + Возврат ""; +КонецФункции diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/ОбновлениеКонфигурацииКлиентПереопределяемый.mdo b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/ОбновлениеКонфигурацииКлиентПереопределяемый.mdo new file mode 100644 index 000000000..5ff7de6b3 --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/ОбновлениеКонфигурацииКлиентПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + ОбновлениеКонфигурацииКлиентПереопределяемый + + ru + Обновление конфигурации клиент переопределяемый + + true + true + diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПовтИсп/Module.bsl new file mode 100644 index 000000000..e671bbc88 --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПовтИсп/Module.bsl @@ -0,0 +1,44 @@ + +Функция ПолучитьПараметрыОбновления() Экспорт + #Если НЕ ВебКлиент Тогда + + СтруктураПараметров = Новый Структура(); + + СтруктураПараметров.Вставить("ДатаВремяОбновленияУстановлена" , Ложь); + + // Интернет + СтруктураПараметров.Вставить("ИмяZipФайлаСпискаШаблонов" , "v8upd11.zip"); + СтруктураПараметров.Вставить("ИмяФайлаСпискаШаблонов" , "v8cscdsc.xml"); + СтруктураПараметров.Вставить("ИмяФайлаОписанияОбновления" , "news.htm"); + СтруктураПараметров.Вставить("ИмяФайлаПорядкаОбновления" , "update.htm"); + + // Имена служебных файлов + СтруктураПараметров.Вставить("ИмяФайлаПрограммы" , "1cv8.exe"); + + // Реклама + СтруктураПараметров.Вставить("ФайлАрхиваРекламы" , "INDEX.ZIP"); + СтруктураПараметров.Вставить("ФайлРекламы" , "index.htm"); + + СтруктураПараметров.Вставить("СобытиеЖурналаРегистрации" , НСтр("ru = 'Обновление информационной базы'")); + + // Определение каталога временных файлов. + СтруктураПараметров.Вставить("КаталогФайловОбновления" , ОбновлениеКонфигурацииКлиент.КаталогLocalAppData() + "1C\1Cv8Update\"); + СтруктураПараметров.Вставить("КаталогВременныхФайловОбновления" , КаталогВременныхФайлов() + "1Cv8Update." + Формат(ТекущаяДата(), "ДФ=ггММддЧЧммсс") + "\"); + + // Определение каталога рекламы. + СтруктураПараметров.Вставить("ИмяКаталогаРекламы" , СтруктураПараметров.КаталогФайловОбновления + "adv\"); + СтруктураПараметров.Вставить("ПутьКФайлуАрхиваРекламы" , СтруктураПараметров.ИмяКаталогаРекламы + СтруктураПараметров.ФайлАрхиваРекламы); + + СтруктураПараметров.Вставить("АдресРесурсовДляПроверкиНаличияОбновления" , ОбновлениеКонфигурацииКлиент.АдресРесурсовДляПроверкиНаличияОбновления()); + СтруктураПараметров.Вставить("АдресСтраницыИнформацииОПолученииДоступаКПользовательскомуСайту" , ОбновлениеКонфигурацииКлиент.АдресСтраницыИнформацииОПолученииДоступаКПользовательскомуСайту()); + СтруктураПараметров.Вставить("АдресКаталогаШаблоновНаСервереОбновлений" , ОбновлениеКонфигурацииКлиент.АдресКаталогаШаблоновНаСервереОбновлений()); + СтруктураПараметров.Вставить("АдресСервераОбновлений" , ОбновлениеКонфигурацииКлиент.АдресСервераОбновлений()); + СтруктураПараметров.Вставить("ИмяФайлаПроверкиНаличияОбновления" , ОбновлениеКонфигурацииКлиент.ИмяФайлаПроверкиНаличияОбновления()); + + // ИТС + СтруктураПараметров.Вставить("ИмяФайлаАдресовРелизовИТС", "AutoUpdate.xml"); + + Возврат СтруктураПараметров; + #КонецЕсли +КонецФункции + diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПовтИсп/ОбновлениеКонфигурацииКлиентПовтИсп.mdo b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПовтИсп/ОбновлениеКонфигурацииКлиентПовтИсп.mdo new file mode 100644 index 000000000..042fcf10d --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПовтИсп/ОбновлениеКонфигурацииКлиентПовтИсп.mdo @@ -0,0 +1,11 @@ + + + ОбновлениеКонфигурацииКлиентПовтИсп + + ru + Обновление конфигурации клиент повт исп + + true + true + DuringSession + diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииПереопределяемый/Module.bsl new file mode 100644 index 000000000..44b88e83a --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииПереопределяемый/Module.bsl @@ -0,0 +1,54 @@ +//////////////////////////////////////////////////////////////////////////////// +// ФУНКЦИИ ДЛЯ ПРОВЕРКИ НАЛИЧИЯ И ПОЛУЧЕНИЯ ОБНОВЛЕНИЙ +// + +// Получить короткое имя (идентификатор) конфигурации. +// +// Возвращаемое значение: +// Строка – короткое имя конфигурации. +Функция КороткоеИмяКонфигурации() Экспорт + + Возврат ""; + +КонецФункции + +// Получить адрес веб-сервера поставщика конфигурации, на котором находится +// информация о доступных обновлениях ("открытая" часть веб-сайта). +// +// Возвращаемое значение: +// Строка – адрес веб-сервера. +// +// Примеры реализации: +// Возврат "localhost"; // локальный веб-сервер для тестирования +// Возврат "downloads.1c.ru"; // сервер обновлений типовых конфигураций +// +Функция АдресСервераДляПроверкиНаличияОбновления() Экспорт + + Возврат ""; + +КонецФункции + +// Получить адрес ресурса на веб-сервере для проверки наличия обновлений +// (на "открытой" части веб-сайта). +// +// Например: +// Возврат "/ipp/ITSREPV/V8Update/Configs/"; +// +Функция АдресРесурсаДляПроверкиНаличияОбновления() Экспорт + Возврат ""; + +КонецФункции + +// Получить адрес веб-сайта с каталогом обновлений ("закрытая" часть веб-сайта). +// +// Примеры реализации: +// Возврат Метаданные.АдресКаталогаОбновлений; // из свойств конфигурации +// Возврат "localhost/tmplts/"; // локальный веб-сервер для тестирования +// +Функция КаталогОбновлений() Экспорт + + + Возврат ""; + +КонецФункции + diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииПереопределяемый/ОбновлениеКонфигурацииПереопределяемый.mdo b/SSL/src/CommonModules/ОбновлениеКонфигурацииПереопределяемый/ОбновлениеКонфигурацииПереопределяемый.mdo new file mode 100644 index 000000000..077346663 --- /dev/null +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииПереопределяемый/ОбновлениеКонфигурацииПереопределяемый.mdo @@ -0,0 +1,11 @@ + + + ОбновлениеКонфигурацииПереопределяемый + + ru + Обновление конфигурации переопределяемый + + true + true + true + diff --git a/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl new file mode 100644 index 000000000..4b9704149 --- /dev/null +++ b/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl @@ -0,0 +1,1165 @@ +//////////////////////////////////////////////////////////////////////////////// +// Общие процедуры и функции + +// Проверяет проведенность документов +// Параметры +// Документы - массив - документы, проведенность которых необходимо проверить +// Возвращаемое значение +// Массив - непроведенные документы из массива Документы +// +Функция ПроверитьПроведенностьДокументов(знач Документы) Экспорт + + ТекстЗапроса = "ВЫБРАТЬ + | Документ.Ссылка КАК Ссылка + |ИЗ + | Документ.[ИмяДокумента] КАК Документ + |ГДЕ + | Документ.Ссылка В (&МассивДокументов) + | И Не Документ.Проведен"; + + ИмяДокумента = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + Документы[0].Метаданные().ПолноеИмя(), ".")[1]; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяДокумента]", ИмяДокумента); + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("МассивДокументов", Документы); + + Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + +КонецФункции + +// Процедура выполняет проведение документов перед формированием печатной формы. +// +// Параметры: +// Документы - Массив - Документы, которые необходимо провести +// +// Возвращаемое значение: +// Массив - документы, которые провести не удалось +// +Функция ПровестиДокументы(Документы, ТипПроведенныхДокументов) Экспорт + + ИмяДокумента = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + Документы[0].Метаданные().ПолноеИмя(), ".")[1]; + + ТипПроведенныхДокументов = ТипЗнч(Документы[0]); + + НепроведенныеДокументы = Новый Массив; + + Для Каждого ДокументСсылка Из Документы Цикл + + ДокументОбъект = ДокументСсылка.ПолучитьОбъект(); + + ВыполненоУспешно = Ложь; + + Если ДокументОбъект.ПроверитьЗаполнение() Тогда + Попытка + ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); + ВыполненоУспешно = Истина; + Исключение + ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстСообщенияОбОшибке = НСтр("ru = 'Ошибка при попытке проведения документа: %1'"); + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщенияОбОшибке, ПредставлениеОшибки); + ЗаписьЖурналаРегистрации("Проведение документов при печати", + УровеньЖурналаРегистрации.Информация, + ДокументОбъект.Метаданные(), + ДокументСсылка, + ТекстСообщенияОбОшибке); + КонецПопытки; + КонецЕсли; + + Если Не ВыполненоУспешно Тогда + НепроведенныеДокументы.Добавить(ДокументСсылка); + КонецЕсли; + + КонецЦикла; + + Возврат НепроведенныеДокументы; + +КонецФункции + +// Функция возвращает ссылку на текущего пользователя базы данных, +// установленного по учетной записи пользователя конфигурации. +// +// Возвращаемое значение: +// СправочникСсылка.Пользователи +// +Функция ТекущийПользователь() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Возврат ПараметрыСеанса.ТекущийПользователь; + +КонецФункции + +// Выполнить экспортную процедуру без параметров по имени. +// +// Параметры +// ИмяЭкспортнойПроцедуры – Строка – имя экспортной процедуры в формате +// <имя объекта>.<имя процедуры>, где <имя объекта> - это +// общий модуль или модуль менеджера объекта. +// +// Пример: +// ВыполнитьБезопасно("МойОбщийМодуль.МояПроцедура"); +// +Процедура ВыполнитьБезопасно(Знач ИмяЭкспортнойПроцедуры) Экспорт + + // Проверка предусловий на формат ИмяЭкспортнойПроцедуры. + ЧастиИмени = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяЭкспортнойПроцедуры, "."); + Если ЧастиИмени.Количество() <> 2 Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"), + ИмяЭкспортнойПроцедуры); + КонецЕсли; + + ИмяОбъекта = ЧастиИмени[0]; + Если (Метаданные.ОбщиеМодули.Найти(ИмяОбъекта) = Неопределено) + И (Метаданные.Обработки.Найти(ИмяОбъекта) = Неопределено) + И (Метаданные.Документы.Найти(ИмяОбъекта) = Неопределено) + И (Метаданные.Справочники.Найти(ИмяОбъекта) = Неопределено) + И (Метаданные.БизнесПроцессы.Найти(ИмяОбъекта) = Неопределено) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"), + ИмяЭкспортнойПроцедуры); + КонецЕсли; + + Выполнить ИмяЭкспортнойПроцедуры + "();"; + +КонецПроцедуры + +// Функция ПолучитьЗначенияРеквизитов возвращает структуру, +// содержащую значения реквизитов прочитанные из информационной базы +// по ссылке на объект. +// +// Если доступа к одному из реквизитов нет, возникнет исключение прав доступа. +// Если необходимо зачитать реквизит независимо от прав текущего пользователя, +// то следует использовать предварительный переход в привилегированный режим. +// +// Параметры: +// Ссылка - ссылка на объект, - элемент справочника, документ, ... +// ИменаРеквизитов - Строка, имена реквизитов перечисленные через запятую, +// в формате требований к свойствам структуры. +// Например, "Код, Наименование, Родитель". +// +// Возвращаемое значение: +// Структура - содержит список свойств, как список имен в строке +// ИменаРеквизитов, со значениям реквизитов, прочитанных +// из информационной базы. +// +Функция ПолучитьЗначенияРеквизитов(Ссылка, ИменаРеквизитов) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | " + ИменаРеквизитов + " + |ИЗ + | " + Ссылка.Метаданные().ПолноеИмя() + " КАК Таблица + |ГДЕ + | Таблица.Ссылка = &Ссылка"; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + Результат = Новый Структура(ИменаРеквизитов); + ЗаполнитьЗначенияСвойств(Результат, Выборка); + + Возврат Результат; + +КонецФункции + +// Функция ПолучитьЗначениеРеквизита возвращает значение +// реквизита, прочитанного из информационной базы по ссылке на объект. +// +// Если доступа к реквизиту нет, возникнет исключение прав доступа. +// Если необходимо зачитать реквизит независимо от прав текущего пользователя, +// то следует использовать предварительный переход в привилегированный режим. +// +// Параметры: +// Ссылка - ссылка на объект, - элемент справочника, документ, ... +// ИмяРеквизита - Строка, например, "Код". +// +// Возвращаемое значение: +// Произвольный - зависит от типа значения прочитанного реквизита. +// +Функция ПолучитьЗначениеРеквизита(Ссылка, ИмяРеквизита) Экспорт + + Результат = ПолучитьЗначенияРеквизитов(Ссылка, ИмяРеквизита); + Возврат Результат[ИмяРеквизита]; + +КонецФункции + +// Объединяет две таблицы значений по условию "И". +// Возвращает таблицу значений, полученную в результате объединения двух таблиц по условию "И". +// +// Параметры: +// Таблица1 - ТаблицаЗначений - первая таблица значений для объединения +// Таблица2 - ТаблицаЗначений - вторая таблица значений для объединения +// ПоляТаблицы - Строка - поля таблицы, перечисленные через запятую, по которым будут выполнятся объединение +// ИмяПоляИтератора - Строка - имя служебной колонки таблицы значений. +// Это имя должно быть уникально во множестве имен колонок первой и второй таблиц. +// Переменная ПоляТаблицы не должна содержать этого имени. +// Значение по умолчанию "ИтераторПоляТаблицы" +// +// Возвращаемое значение: +// ТаблицаЗначений - таблица значений, полученная в результате объединения двух таблиц по условию "И" +// +Функция ОбъединитьТаблицыПоУсловиюИ(Таблица1, Таблица2, Знач ПоляТаблицы, ИмяПоляИтератора = "ИтераторПоляТаблицы") Экспорт + + Таблица1.Свернуть(ПоляТаблицы); + Таблица2.Свернуть(ПоляТаблицы); + + ДобавитьИтераторТаблице(Таблица1, +1, ИмяПоляИтератора); + ДобавитьИтераторТаблице(Таблица2, -1, ИмяПоляИтератора); + + ТаблицаРезультат = Таблица1.Скопировать(); + + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(Таблица2, ТаблицаРезультат); + + ТаблицаРезультат.Свернуть(ПоляТаблицы, ИмяПоляИтератора); + + ТаблицаРезультат = ТаблицаРезультат.Скопировать(Новый Структура(ИмяПоляИтератора, 0)); + + ТаблицаРезультат.Колонки.Удалить(ИмяПоляИтератора); + + Возврат ТаблицаРезультат; + +КонецФункции + +// Получает имя значения перечисления как объекта метаданных +// +// Параметры: +// Значение - значение перечисления для которого необходимо получить имя перечисления +// +// Возвращаемое значение: +// Строка - имя значения перечисления как объекта метаданных +// +Функция ИмяЗначенияПеречисления(Значение) Экспорт + + ОбъектМетаданных = Значение.Метаданные(); + + ИндексЗначения = Перечисления[ОбъектМетаданных.Имя].Индекс(Значение); + + Возврат ОбъектМетаданных.ЗначенияПеречисления[ИндексЗначения].Имя; + +КонецФункции + +// Добавляет колонку в таблицу значений. Заполняет колонку переданным значением +// +// Параметры: +// Таблица - ТаблицаЗначений - таблица значений для добавления колонки +// ЗначениеИтератора - Произвольный - значение, которым будет заполнено новое поле таблицы +// ИмяПоляИтератора - Строка - имя добавляемого поля +// +Процедура ДобавитьИтераторТаблице(Таблица, ЗначениеИтератора, ИмяПоляИтератора) + + Таблица.Колонки.Добавить(ИмяПоляИтератора); + + Таблица.ЗаполнитьЗначения(ЗначениеИтератора, ИмяПоляИтератора); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции + +// Возвращает имя COM-класса для работы с 1С:Предприятием 8 через COM-соединение. +// +Функция ИмяCOMСоединителя() Экспорт + + СистемнаяИнфо = Новый СистемнаяИнформация; + ПодстрокиВерсии = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + СистемнаяИнфо.ВерсияПриложения, "."); + Возврат "v" + ПодстрокиВерсии[0] + ПодстрокиВерсии[1] + ".COMConnector"; + +КонецФункции + +// Функция ИнформационнаяБазаФайловая определяет режим эксплуатации +// информационной базы файловый (Истина) или Серверный (Ложь). +// При проверке используется СтрокаСоединенияИнформационнойБазы, которую +// можно указать явно. +// +// Параметры: +// СтрокаСоединенияИнформационнойБазы - Строка - параметр используется, если +// нужно проверить строку соединения не текущей информационной базы. +// +// Возвращаемое значение: +// Булево. +// +Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = "") Экспорт + + Если ПустаяСтрока(СтрокаСоединенияИнформационнойБазы) Тогда + СтрокаСоединенияИнформационнойБазы = СтрокаСоединенияИнформационнойБазы(); + КонецЕсли; + Возврат Найти(Врег(СтрокаСоединенияИнформационнойБазы), "FILE=") = 1; + +КонецФункции + +// Получить представление информационной базы для отображения пользователю. +// +// Возвращаемое значение: +// Строка - Представление информационной базы +// +// Пример возвращаемого результата: +// - для ИБ в файлом режиме: \\FileServer\1c_ib\ +// - для ИБ в серверном режиме: ServerName:1111 / information_base_name +// +Функция ПолучитьПредставлениеИнформационнойБазы() Экспорт + + СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы(); + + Если ИнформационнаяБазаФайловая(СтрокаСоединенияСБД) Тогда + ПутьКБД = Сред(СтрокаСоединенияСБД, 6, СтрДлина(СтрокаСоединенияСБД) - 6); + Иначе + // надо к имени сервера прибавить имя пути информационной базы + ПозицияПоиска = Найти(Врег(СтрокаСоединенияСБД), "SRVR="); + + Если ПозицияПоиска <> 1 Тогда + Возврат Неопределено; + КонецЕсли; + + ПозицияТочкиСЗапятой = Найти(СтрокаСоединенияСБД, ";"); + НачальнаяПозицияКопирования = 6 + 1; + КонечнаяПозицияКопирования = ПозицияТочкиСЗапятой - 2; + + ИмяСервера = Сред(СтрокаСоединенияСБД, НачальнаяПозицияКопирования, КонечнаяПозицияКопирования - НачальнаяПозицияКопирования + 1); + + СтрокаСоединенияСБД = Сред(СтрокаСоединенияСБД, ПозицияТочкиСЗапятой + 1); + + // позиция имени сервера + ПозицияПоиска = Найти(Врег(СтрокаСоединенияСБД), "REF="); + + Если ПозицияПоиска <> 1 Тогда + Возврат Неопределено; + КонецЕсли; + + НачальнаяПозицияКопирования = 6; + ПозицияТочкиСЗапятой = Найти(СтрокаСоединенияСБД, ";"); + КонечнаяПозицияКопирования = ПозицияТочкиСЗапятой - 2; + + ИмяИБНаСервере = Сред(СтрокаСоединенияСБД, НачальнаяПозицияКопирования, КонечнаяПозицияКопирования - НачальнаяПозицияКопирования + 1); + + ПутьКБД = ИмяСервера + "/ " + ИмяИБНаСервере; + + КонецЕсли; + + Возврат ПутьКБД; + +КонецФункции + +// Проверить, что описание типа состоит из единственного типа значения и +// совпадает с нужным типом. +// +// Возвращаемое значение: +// Булево - Совпадает или нет +// +Функция ОписаниеТипаСостоитИзТипа(ОписаниеТипа, ТипЗначения) Экспорт + + Если ОписаниеТипа.Типы().Количество() = 1 + И ОписаниеТипа.Типы().Получить(0) = ТипЗначения Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Функция ПрочитатьXMLВТаблицу преобразует текст формата XML в таблицу значений, +// при этом колонки таблицы формируются на основе описания в XML. +// +// Параметры: +// ТекстXML - текст формата XML. +// +// Возвращаемое значение: +// ТаблицаЗначений. +// +Функция ПрочитатьXMLВТаблицу(ТекстXML) Экспорт + + Чтение = Новый ЧтениеXML; + Чтение.УстановитьСтроку(ТекстXML); + + // Прочитаем первый узел и проверим его + Если Не Чтение.Прочитать() Тогда + ВызватьИсключение("Пустой XML"); + ИначеЕсли Чтение.Имя <> "Items" Тогда + ВызватьИсключение("Ошибка в структуре XML"); + КонецЕсли; + + // Получим описание таблицы и создадим ее + ИмяТаблицы = Чтение.ПолучитьАтрибут("Description"); + ИменаКолонок = СтрЗаменить(Чтение.ПолучитьАтрибут("Columns"), ",", Символы.ПС); + Колонок = СтрЧислоСтрок(ИменаКолонок); + + ТаблицаЗначений = Новый ТаблицаЗначений; + Для Сч = 1 По Колонок Цикл + ТаблицаЗначений.Колонки.Добавить(СтрПолучитьСтроку(ИменаКолонок, Сч), Новый ОписаниеТипов("Строка")); + КонецЦикла; + + // Заполним значения в таблице + Пока Чтение.Прочитать() Цикл + + Если Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда + Продолжить; + ИначеЕсли Чтение.Имя <> "Item" Тогда + ВызватьИсключение("Ошибка в структуре XML"); + КонецЕсли; + + новСтр = ТаблицаЗначений.Добавить(); + Для Сч = 1 По Колонок Цикл + ИмяКолонки = СтрПолучитьСтроку(ИменаКолонок, Сч); + новСтр[Сч-1] = Чтение.ПолучитьАтрибут(ИмяКолонки); + КонецЦикла; + + КонецЦикла; + + // Заполним результат + Результат = Новый Структура; + Результат.Вставить("ИмяТаблицы", ИмяТаблицы); + Результат.Вставить("Данные", ТаблицаЗначений); + + Возврат Результат; + +КонецФункции // ПрочитатьXMLВТаблицу() + +// Функция СохранитьФайлНаСервере перемещает двоичные данные из временного +// хранилища в файл на сервере (данные во временном хранилище удаляются). +// +// Параметры: +// АдресВоВременномХранилище - адрес, указывающий на значение во временном хранилище. +// ИмяФайла - Строка, необязательный параметр, +// полное имя файла на сервере для сохранения двоичных данных. +// +// Возвращаемое значение: +// Строка - полное имя файла на сервере, в который сохранены двоичные данные. +// +Функция СохранитьФайлНаСервере(Знач АдресВоВременномХранилище, Знач ИмяФайла = Неопределено) Экспорт + + Если ИмяФайла = Неопределено Тогда + ИмяФайла = ПолучитьИмяВременногоФайла(); + КонецЕсли; + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище); + ДвоичныеДанные.Записать(ИмяФайла); + + УдалитьИзВременногоХранилища(АдресВоВременномХранилище); + + Возврат ИмяФайла; + +КонецФункции // СохранитьФайлНаСервере() + +// Вызывается в серверном контексте и удаляет временные файлы на сервере 1С:Предприятие. +// +Процедура УдалитьФайлыНаСервере1СПредприятие(Путь) Экспорт + + ОбщегоНазначенияКлиентСервер.УдалитьКаталогСФайлами(Путь); + +КонецПроцедуры + +// Получает таблицу значений с описанием требуемых свойств всех реквизитов объекта метаданного +// Получает значения свойств стандартных реквизитов и пользовательских реквизитов (созданных в режиме конфигуратора) +// +// Параметры: +// ОбъектМетаданных - Объект метаданных конфигурации, для которого необходимо получить значение свойств реквизитов. +// Например: Метаданные.Документ.РеализацияТоваровИУслуг +// Свойства - Строка - свойства реквизитов, перечисленных через запятую, значение которых необходимо получить. +// Например: "Имя, Тип, Синоним, Подсказка" +// +// Возвращаемое значение: +// ТаблицаЗначений - таблица значений с описанием требуемых свойств всех реквизитов объекта метаданного +// +Функция ПолучитьТаблицуОписанияСвойствОбъекта(ОбъектМетаданных, Свойства) Экспорт + + МассивСвойств = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Свойства); + + // возвращаемое значение функции + ТаблицаОписанияСвойствОбъекта = Новый ТаблицаЗначений; + + // добавляем в таблицу поля согласно именам переданных свойств + Для Каждого ИмяСвойства ИЗ МассивСвойств Цикл + + ТаблицаОписанияСвойствОбъекта.Колонки.Добавить(СокрЛП(ИмяСвойства)); + + КонецЦикла; + + // заполняем строку таблицы свойствами реквизитов объекта метаданных + Для Каждого Реквизит ИЗ ОбъектМетаданных.Реквизиты Цикл + + ЗаполнитьЗначенияСвойств(ТаблицаОписанияСвойствОбъекта.Добавить(), Реквизит); + + КонецЦикла; + + // заполняем строку таблицы свойствами стандартных реквизитов объекта метаданных + Для Каждого Реквизит ИЗ ОбъектМетаданных.СтандартныеРеквизиты Цикл + + ЗаполнитьЗначенияСвойств(ТаблицаОписанияСвойствОбъекта.Добавить(), Реквизит); + + КонецЦикла; + + Возврат ТаблицаОписанияСвойствОбъекта; + +КонецФункции + +// Преобразует таблицу значений в массив. +// Может использоваться для передачи на клиента данных, полученных +// на сервере в виде таблицы значений в том случае, если таблица +// значений содержит только такие значения, которые могут +// быть переданы на клиента +// +// Полученный массив содержит структуры, каждая из которых повторяет +// структуру колонок таблицы значений. +// +// Не рекомендуется использовать для преобразования таблиц значений +// с большим количеством строк. +// +// Параметры: ТаблицаЗначений +// Возвращаемое значение: Массив +// +Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт + Массив = Новый Массив(); + СтруктураСтрокой = ""; + НужнаЗапятая = Ложь; + Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл + Если НужнаЗапятая Тогда + СтруктураСтрокой = СтруктураСтрокой + ","; + КонецЕсли; + СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя; + НужнаЗапятая = Истина; + КонецЦикла; + Для Каждого Строка Из ТаблицаЗначений Цикл + НоваяСтрока = Новый Структура(СтруктураСтрокой); + ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); + Массив.Добавить(НоваяСтрока); + КонецЦикла; + Возврат Массив; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции работающие с типами +// и их строковыми представлениями + +// Возвращает имя базового типа по переданному значению объекта метаданных +// +// Параметры: +// ОбъектМетаданных - объект метаданных, по которому необходимо определить базовый тип +// +// Возвращаемое значение: +// Строка - имя базового типа по переданному значению объекта метаданных +// +Функция ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) Экспорт + + Если Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаДокументы(); + + ИначеЕсли Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаСправочники(); + + ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаРегистрыСведений(); + + ИначеЕсли Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаРегистрыНакопления(); + + ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаРегистрыБухгалтерии(); + + ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаРегистрыРасчета(); + + ИначеЕсли Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаПланыОбмена(); + + ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаПланыВидовХарактеристик(); + + ИначеЕсли Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаБизнесПроцессы(); + + ИначеЕсли Метаданные.Задачи.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаЗадачи(); + + ИначеЕсли Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаПланыСчетов(); + + ИначеЕсли Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаПланыВидовРасчета(); + Иначе + + Возврат ""; + + КонецЕсли; + +КонецФункции + +// Функция МенеджерОбъектаПоПолномуИмени возвращает менеджер объекта +// по полному имени объекта метаданных. +// +// Не обрабатываются точки маршрутов бизнес-процессов. +// +// Параметры: +// ПолноеИмя - Строка, полное имя объекта метаданных, +// например, "Справочник.Организации". +// +// Возвращаемое значение: +// СправочникМенеджер, ДокументМенеджер, ... +// +Функция МенеджерОбъектаПоПолномуИмени(ПолноеИмя) Экспорт + + ЧастиИмени = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПолноеИмя, "."); + + КлассОМ = ЧастиИмени[0]; + ИмяОМ = ЧастиИмени[1]; + + Если ВРег(КлассОМ) = "СПРАВОЧНИК" Тогда + Возврат Справочники[ИмяОМ]; + ИначеЕсли ВРег(КлассОМ) = "ДОКУМЕНТ" Тогда + Возврат Документы[ИмяОМ]; + ИначеЕсли ВРег(КлассОМ) = "БИЗНЕСПРОЦЕСС" Тогда + Возврат БизнесПроцессы[ИмяОМ]; + ИначеЕсли ВРег(КлассОМ) = "ПЛАНВИДОВХАРАКТЕРИСТИК" Тогда + Возврат ПланыВидовХарактеристик[ИмяОМ]; + ИначеЕсли ВРег(КлассОМ) = "ПЛАНСЧЕТОВ" Тогда + Возврат ПланыСчетов[ИмяОМ]; + ИначеЕсли ВРег(КлассОМ) = "ПЛАНВИДОВРАСЧЕТА" Тогда + Возврат ПланЫВидовРасчета[ИмяОМ]; + ИначеЕсли ВРег(КлассОМ) = "ЗАДАЧА" Тогда + Возврат Задачи[ИмяОМ]; + ИначеЕсли ВРег(КлассОМ) = "ПЛАНОБМЕНА" Тогда + Возврат ПланыОбмена[ИмяОМ]; + ИначеЕсли ВРег(КлассОМ) = "ПЕРЕЧИСЛЕНИЕ" Тогда + Возврат Перечисления[ИмяОМ]; + ИначеЕсли ВРег(КлассОМ) = "ОБРАБОТКА" Тогда + Возврат Обработки[ИмяОМ]; + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Неизвестный тип объекта метаданных (%1)'"), КлассОМ); + КонецЕсли; + +КонецФункции + +// Функция МенеджерОбъектаПоПолномуИмени возвращает менеджер объекта +// по ссылке на объект. +// +// Не обрабатываются точки маршрутов бизнес-процессов. +// +// Параметры: +// Ссылка - ссылка на объект, - элемент справочника, документ, ... +// +// Возвращаемое значение: +// СправочникМенеджер, ДокументМенеджер, ... +// +Функция МенеджерОбъектаПоСсылке(Ссылка) Экспорт + + ИмяОбъекта = Ссылка.Метаданные().Имя; + ТипСсылки = ТипЗнч(Ссылка); + + Если Справочники.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда + Возврат Справочники[ИмяОбъекта]; + ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда + Возврат Документы[ИмяОбъекта]; + ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда + Возврат БизнесПроцессы[ИмяОбъекта]; + ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда + Возврат ПланыВидовХарактеристик[ИмяОбъекта]; + ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда + Возврат ПланыСчетов[ИмяОбъекта]; + ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда + Возврат ПланыВидовРасчета[ИмяОбъекта]; + ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда + Возврат Задачи[ИмяОбъекта]; + ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда + Возврат ПланыОбмена[ИмяОбъекта]; + ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда + Возврат Перечисления[ИмяОбъекта]; + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции // МенеджерОбъектаПоСсылке() + +// Проверяет физическое наличие записи в информационной базе данных о переданном значении ссылки +// +// Параметры: +// ЛюбаяСсылка - значение любой ссылки информационной базы данных +// +// Возвращаемое значение: +// Истина - ссылка физически существует; +// Ложь - ссылка физически не существует +// +Функция СсылкаСуществует(ЛюбаяСсылка) Экспорт + + ТекстЗапроса = " + |ВЫБРАТЬ + | Ссылка + |ИЗ + | [ИмяТаблицы] + |ГДЕ + | Ссылка = &Ссылка + |"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ИмяТаблицыПоСсылке(ЛюбаяСсылка)); + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка); + + УстановитьПривилегированныйРежим(Истина); + + Возврат НЕ Запрос.Выполнить().Пустой(); + +КонецФункции + +// Функция ВидОбъектаПоСсылке возвращает имя вида объектов метаданных +// по ссылке на объект. +// +// Не обрабатываются точки маршрутов бизнес-процессов. +// +// Параметры: +// Ссылка - ссылка на объект, - элемент справочника, документ, ... +// +// Возвращаемое значение: +// Строка - имя вида объектов метаданных, например, "Справочник", "Документ" ... +// +Функция ВидОбъектаПоСсылке(Ссылка) Экспорт + + Возврат ВидОбъектаПоТипу(ТипЗнч(Ссылка)); + +КонецФункции + +// Функция возвращает имя вида объектов метаданных по типу объекта. +// +// Не обрабатываются точки маршрутов бизнес-процессов. +// +// Параметры: +// Тип - Тип прикладного объекта, определенный в конфигурации +// +// Возвращаемое значение: +// Строка - имя вида объектов метаданных, например, "Справочник", "Документ" ... +// +Функция ВидОбъектаПоТипу(Тип) Экспорт + + Если Справочники.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "Справочник"; + + ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "Документ"; + + ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "БизнесПроцесс"; + + ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "ПланВидовХарактеристик"; + + ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "ПланСчетов"; + + ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "ПланВидовРасчета"; + + ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "Задача"; + + ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "ПланОбмена"; + + ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "Перечисление"; + + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Неверный тип значения параметра (%1)'"), Строка(Тип)); + + КонецЕсли; + +КонецФункции + +// Возвращает полное имя объекта метаданных по переданному значению ссылки +// Например, +// "Справочник.Номенклатура"; +// "Документ.ПриходнаяНакладная" +// +// Параметры: +// Ссылка - ЛюбаяСсылка - значение ссылки, для которого необходимо получить имя таблицы ИБ +// +// Возвращаемое значение: +// Строка - полное имя объекта метаданных для указанного значения ссылки +// +Функция ИмяТаблицыПоСсылке(Ссылка) Экспорт + + Возврат Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).ПолноеИмя(); + +КонецФункции + +Функция ПолучитьСтроковоеПредставлениеТипа(Тип) Экспорт + + Представление = ""; + + Если ТипСсылочногоТипа(Тип) Тогда + + ПолноеИмя = Метаданные.НайтиПоТипу(Тип).ПолноеИмя(); + ИмяОбъекта = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПолноеИмя, ".")[1]; + + Если Справочники.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "СправочникСсылка"; + + ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "ДокументСсылка"; + + ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "БизнесПроцессСсылка"; + + ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "ПланВидовХарактеристикСсылка"; + + ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "ПланСчетовСсылка"; + + ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "ПланВидовРасчетаСсылка"; + + ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "ЗадачаСсылка"; + + ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "ПланОбменаСсылка"; + + ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "ПеречислениеСсылка"; + + КонецЕсли; + + Результат = ?(Представление = "", Представление, Представление + "." + ИмяОбъекта); + + Иначе + + Результат = Строка(Тип); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Функция ЗначениеСсылочногоТипа проверяет, что значение имеет ссылочный тип данных +// +// Параметры: +// Ссылка - ссылка на объект, - элемент справочника, документ, ... +// +// Возвращаемое значение: +// Булево - Истина, если тип значения ссылочный. +// +Функция ЗначениеСсылочногоТипа(Значение) Экспорт + + Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если Перечисления.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если ПланыСчетов.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если Задачи.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Проверка того, что тип имеет ссылочный тип данных +// +Функция ТипСсылочногоТипа(Тип) Экспорт + + Возврат Справочники.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ Документы.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ Перечисления.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(Тип) + ИЛИ Задачи.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип); + +КонецФункции + +// Является ли объект группой +// В качестве параметра может принимать только справочник или ПВХ +// +Функция ОбъектЯвляетсяГруппой(Объект) Экспорт + + МетаданныеОбъекта = Объект.Метаданные(); + + Если НЕ (МетаданныеОбъекта.Иерархический И МетаданныеОбъекта.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов) Тогда + Возврат Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ЗначениеСсылочногоТипа(Объект) Тогда + Возврат Объект.ЭтоГруппа; + КонецЕсли; + + Ссылка = Объект.Ссылка; + + Если Не ЗначениеЗаполнено(Ссылка) Тогда + Возврат Ложь; + КонецЕсли; + + Возврат ОбщегоНазначения.ПолучитьЗначениеРеквизита(Ссылка, "ЭтоГруппа"); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные функции для установки расширения работы с файлами в веб-клиенте. + +// Возвращает значение параметра сеанса ПредлагатьУстановкуРасширенияРаботыСФайлами. +// Возвращаемое значение: +// Булево - значение параметра сеанса ПредлагатьУстановкуРасширенияРаботыСФайлами. +// +Функция ПараметрыСеансаПредлагатьУстановкуРасширенияРаботыСФайлами() Экспорт + УстановитьПривилегированныйРежим(Истина); + Возврат ПараметрыСеанса.ПредлагатьУстановкуРасширенияРаботыСФайлами; +КонецФункции + +// Устанавливает значение параметра сеанса ПредлагатьУстановкуРасширенияРаботыСФайлами. +// Параметры: +// Предлагать - Булево - новое значение параметра сеанса ПредлагатьУстановкуРасширенияРаботыСФайлами. +// +Процедура УстановитьПараметрСеансаПредлагатьУстановкуРасширенияРаботыСФайлами(Предлагать) Экспорт + УстановитьПривилегированныйРежим(Истина); + ПараметрыСеанса.ПредлагатьУстановкуРасширенияРаботыСФайлами = Предлагать; +КонецПроцедуры + +// Сохраняет ПредлагатьУстановкуРасширенияРаботыСФайлами в настройках и параметре сеанса +Процедура СохранитьПредлагатьУстановкуРасширенияРаботыСФайлами(Предлагать) Экспорт + + ХранилищеОбщихНастроек.Сохранить("НастройкиПрограммы", "ПредлагатьУстановкуРасширенияРаботыСФайлами", + Предлагать); + + // здесь всегда ставим Ложь, чтобы в этом сеансе больше не беспокоить. + // а вот в ХранилищеОбщихНастроек можем записать и Истина + // - и на следующем запуске снова будем предлагать установку + УстановитьПараметрСеансаПредлагатьУстановкуРасширенияРаботыСФайлами(Ложь); +КонецПроцедуры + +// Выполняет установку параметра сеанса ПредлагатьУстановкуРасширенияРаботыСФайлами +// при начале работы системы. +// +// Параметры +// ИмяПараметра - Строка - имя устанавливаемого параметра +// УстановленныеПараметры - Массив - массив, в котором собираются +// имена установленных параметров сеанса +// +Процедура НачальнаяУстановкаПараметраСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт + + Если ИмяПараметра <> "ПредлагатьУстановкуРасширенияРаботыСФайлами" Тогда + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + Если ИмяПараметра = "ПредлагатьУстановкуРасширенияРаботыСФайлами" Тогда + + ПредлагатьУстановку = ХранилищеОбщихНастроек.Загрузить("НастройкиПрограммы", + "ПредлагатьУстановкуРасширенияРаботыСФайлами"); + Если ПредлагатьУстановку = Неопределено Тогда + ПредлагатьУстановку = Истина; + ХранилищеОбщихНастроек.Сохранить("НастройкиПрограммы", + "ПредлагатьУстановкуРасширенияРаботыСФайлами", ПредлагатьУстановку); + КонецЕсли; + + ПараметрыСеанса.ПредлагатьУстановкуРасширенияРаботыСФайлами = ПредлагатьУстановку; + УстановленныеПараметры.Добавить(ИмяПараметра); + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// КОНСТАНТЫ + +Функция ИмяТипаРегистрыСведений() Экспорт + + Возврат "РегистрыСведений"; + +КонецФункции + +Функция ИмяТипаРегистрыНакопления() Экспорт + + Возврат "РегистрыНакопления"; + +КонецФункции + +Функция ИмяТипаРегистрыБухгалтерии() Экспорт + + Возврат "РегистрыБухгалтерии"; + +КонецФункции + +Функция ИмяТипаРегистрыРасчета() Экспорт + + Возврат "РегистрыРасчета"; + +КонецФункции + +Функция ИмяТипаДокументы() Экспорт + + Возврат "Документы"; + +КонецФункции + +Функция ИмяТипаСправочники() Экспорт + + Возврат "Справочники"; + +КонецФункции + +Функция ИмяТипаПланыОбмена() Экспорт + + Возврат "ПланыОбмена"; + +КонецФункции + +Функция ИмяТипаПланыВидовХарактеристик() Экспорт + + Возврат "ПланыВидовХарактеристик"; + +КонецФункции + +Функция ИмяТипаБизнесПроцессы() Экспорт + + Возврат "БизнесПроцессы"; + +КонецФункции + +Функция ИмяТипаЗадачи() Экспорт + + Возврат "Задачи"; + +КонецФункции + +Функция ИмяТипаПланыСчетов() Экспорт + + Возврат "ПланыСчетов"; + +КонецФункции + +Функция ИмяТипаПланыВидовРасчета() Экспорт + + Возврат "ПланыВидовРасчета"; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Сохранение и чтение настроек + +// Передает с клиента на сервер для записи массив настроек +//(массив структур с полями Объект Настройка Значение) +Процедура ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур) Экспорт + Для Каждого Элемент Из МассивСтруктур Цикл + ХранилищеОбщихНастроек.Сохранить(Элемент.Объект, Элемент.Настройка, Элемент.Значение); + КонецЦикла; +КонецПроцедуры + +// Передает с клиента на сервер для записи настройку +Процедура ХранилищеОбщихНастроекСохранить(Объект, Настройка, Значение) Экспорт + ХранилищеОбщихНастроек.Сохранить(Объект, Настройка, Значение); +КонецПроцедуры + +// Передает с клиента на сервер для записи +Функция ХранилищеОбщихНастроекЗагрузить(Объект, Настройка) Экспорт + Возврат ХранилищеОбщихНастроек.Загрузить(Объект, Настройка); +КонецФункции + +// заполняет справочник НазначенияСертификатовЭЦП значениями из макета +Процедура ЗаполнитьНазначенияСертификатовЭЦП() Экспорт + + УстановитьПривилегированныйРежим(Истина); + Макет = Справочники.НазначенияСертификатовЭЦП.ПолучитьМакет("НазначенияСертификатов"); + ТабЗначений = ОбщегоНазначения.ПрочитатьXMLВТаблицу(Макет.ПолучитьТекст()).Данные; + + НачатьТранзакцию(); + Попытка + + Для Каждого Запись Из ТабЗначений Цикл + + СпрСсылка = Справочники.НазначенияСертификатовЭЦП.НайтиПоКоду(Запись.Code); + Если СпрСсылка = Неопределено ИЛИ СпрСсылка.Пустая() Тогда + Элемент = Справочники.НазначенияСертификатовЭЦП.СоздатьЭлемент(); + Элемент.Код = Запись.Code; + Элемент.Наименование = Запись.Name; + Элемент.Записать(); + КонецЕсли; + + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// преобразует назначения сертификатов в дружественный вид +Процедура ЗаполнитьНазначениеСертификата(Назначение, НовоеНазначение, ПисатьКодНазначения = Ложь) Экспорт + + УстановитьПривилегированныйРежим(Истина); + НовоеНазначение = ""; + + Для Индекс = 1 По СтрЧислоСтрок(Назначение) Цикл + + Строка = СтрПолучитьСтроку(Назначение, Индекс); + Представление = Назначение; + Код = ""; + + Позиция = СтроковыеФункцииКлиентСервер.НайтиСимволСКонца(Строка, "("); + Если Позиция <> 0 Тогда + + Представление = Лев(Строка, Позиция - 1); + Код = Сред(Строка, Позиция + 1, СтрДлина(Строка) - Позиция - 1); + + СпрСсылка = Справочники.НазначенияСертификатовЭЦП.НайтиПоКоду(Код); + Если СпрСсылка <> Неопределено И НЕ СпрСсылка.Пустая() Тогда + Представление = СпрСсылка.Наименование; + КонецЕсли; + + Если ПисатьКодНазначения Тогда + Представление = Представление + " (" + Код + ")"; + КонецЕсли; + + КонецЕсли; + + НовоеНазначение = НовоеНазначение + Представление; + НовоеНазначение = НовоеНазначение + Символы.ПС; + + КонецЦикла; + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ОбщегоНазначения/ОбщегоНазначения.mdo b/SSL/src/CommonModules/ОбщегоНазначения/ОбщегоНазначения.mdo new file mode 100644 index 000000000..b327cade8 --- /dev/null +++ b/SSL/src/CommonModules/ОбщегоНазначения/ОбщегоНазначения.mdo @@ -0,0 +1,11 @@ + + + ОбщегоНазначения + + ru + Общего назначения + + Серверные процедуры и функции общего назначения + true + true + diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl new file mode 100644 index 000000000..83dd75814 --- /dev/null +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl @@ -0,0 +1,164 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Клиентские процедуры общего назначения + +Процедура ГрупповоеИзменениеОбъектов(Список) Экспорт + + ВыделенныеСтроки = Список.ВыделенныеСтроки; + + ПараметрыФормы = Новый Структура("МассивОбъектов", Новый Массив); + + Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл + Если ТипЗнч(ВыделеннаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Продолжить; + КонецЕсли; + ПараметрыФормы.МассивОбъектов.Добавить(Список.ДанныеСтроки(ВыделеннаяСтрока).Ссылка); + КонецЦикла; + + Если ПараметрыФормы.МассивОбъектов.Количество() = 0 Тогда + Предупреждение(НСтр("ru = 'Команда не может быть выполнена для указанного объекта!'")); + Возврат; + КонецЕсли; + + ОткрытьФорму("Обработка.ГрупповоеИзменениеОбъектов.Форма", ПараметрыФормы); + +КонецПроцедуры + +// Процедура УстановитьПроизвольныйЗаголовокПриложения выполняет установку стандартного +// заголовка приложения, используя имя представление текущего пользователя и +// и строку в константе ЗаголовокПриложения (если задана) или +// текущий заголовок приложения ПолучитьЗаголовокПриложения() (если константа не установлена). +// +// Параметры: +// ПредставлениеЗаголовка - Строка, необязательный параметр, позволяющий сформировать заголовок +// приложения из представления, заданного пользователем, вместо представления, +// заданного в константе (или полученного вызовом функции ПолучитьЗаголовокПриложения()). +// +Процедура УстановитьПроизвольныйЗаголовокПриложения() Экспорт + + ПредставлениеЗаголовка = СтандартныеПодсистемыПереопределяемый.ПараметрыРаботыКлиента().ЗаголовокПриложения; + + ПредставлениеПользователя = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().АвторизованныйПользователь; + + ШаблонЗаголовка = "%ОсновнойЗаголовок / %Пользователь /"; + + Если ПустаяСтрока(СокрЛП(ПредставлениеЗаголовка)) Тогда + ЗаголовокПриложения = СтрЗаменить(ШаблонЗаголовка, "%ОсновнойЗаголовок", СтандартныеПодсистемыПереопределяемый.ПараметрыРаботыКлиента().ПодробнаяИнформация); + Иначе + ЗаголовокПриложения = СтрЗаменить(ШаблонЗаголовка, "%ОсновнойЗаголовок", СокрЛП(ПредставлениеЗаголовка)); + КонецЕсли; + + ЗаголовокПриложения = СтрЗаменить(ЗаголовокПриложения, "%Пользователь", ПредставлениеПользователя); + + УстановитьЗаголовокПриложения(ЗаголовокПриложения); + +КонецПроцедуры + +// Процедура ПреобразоватьЗимнееВремяКТекущему изменяет переданное +// значение времени в местное время из зимнего к текущему с учетом NTFS коррекции. +// +// Параметры: +// ДатаВремя - Дата, преобразуемое время. +// +// Возвращаемое значение: +// Дата - преобразованное время. +// +Процедура ПреобразоватьЗимнееВремяКТекущему(ДатаВремя) Экспорт + + ДатаВремя = МестноеВремя(ДатаВремя); + +КонецПроцедуры + +// Предлагает пользователю установить расширение работы с файлами в веб-клиенте. +// При этом инициализирует параметр сеанса ПредлагатьУстановкуРасширенияРаботыСФайлами. +// +// Процедура предназначена для использования в начале участков кода, в которых ведется работа с файлами. +// Например: +// +// ПредложитьУстановкуРасширенияРаботыСФайлами("Для печати документа необходимо установить расширение работы с файлами"); +// // далее располагается код печати документа +// //... +// +// Параметры +// Сообщение - Строка - текст сообщения. Если не указан, то выводится текст по умолчанию. +// +Процедура ПредложитьУстановкуРасширенияРаботыСФайлами(Сообщение = Неопределено) Экспорт + +#Если Не ВебКлиент Тогда + Возврат; // только в веб клиенте этот код работает +#КонецЕсли + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если РасширениеПодключено Тогда + Возврат; // если расширение и так уже есть, незачем про него спрашивать + КонецЕсли; + + Если ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентБезПоддержкиРасширенияРаботыСФайлами() Тогда + Возврат; + КонецЕсли; + + ПредлагатьУстановку = ОбщегоНазначенияКлиентПовтИсп.ПолучитьПредлагатьУстановкуРасширенияРаботыСФайлами(); + + Если ПредлагатьУстановку = Ложь Тогда + Возврат; + КонецЕсли; + + // тут надо показать диалог + ПараметрыФормы = Новый Структура("Сообщение", Сообщение); + КодВозврата = ОткрытьФормуМодально("ОбщаяФорма.ВопросОбУстановкеРасширенияРаботыСФайлами", ПараметрыФормы); + Если КодВозврата = Неопределено Тогда + КодВозврата = Истина; + КонецЕсли; + + ПредлагатьУстановку = КодВозврата; + ОбщегоНазначения.СохранитьПредлагатьУстановкуРасширенияРаботыСФайлами(ПредлагатьУстановку); + ОбновитьПовторноИспользуемыеЗначения(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Функции для обработки действий пользователя в процессе редактирования +// многострочного текста, например комментария в документах + +// Открывает форму редактирования произвольного многострочного текста модально +// +// Параметры: +// МногострочныйТекст - Строка - произвольный текст, который необходимо отредактировать +// РезультатРедактирования - Строка - переменная, в которую будет помещен результат редактирования +// Модифицированность - Строка - флаг модифицированности формы +// Заголовок - Строка - текст, который необходимо отобразить в заголовке формы +// +Процедура ОткрытьФормуРедактированияМногострочногоТекста(Знач МногострочныйТекст, РезультатРедактирования, Модифицированность = Ложь, + Знач Заголовок = Неопределено) Экспорт + + Если Заголовок = Неопределено Тогда + ТекстВведен = ВвестиСтроку(МногострочныйТекст,,, Истина); + Иначе + ТекстВведен = ВвестиСтроку(МногострочныйТекст, Заголовок,, Истина); + КонецЕсли; + + Если Не ТекстВведен Тогда + Возврат; + КонецЕсли; + + РезультатРедактирования = МногострочныйТекст; + Если Не Модифицированность Тогда + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + +// Открывает форму редактирования многострочного комментария модально +// +// Параметры: +// МногострочныйТекст - Строка - произвольный текст, который необходимо отредактировать +// РезультатРедактирования - Строка - переменная, в которую будет помещен результат редактирования +// Модифицированность - Строка - флаг модифицированности формы +// +Процедура ОткрытьФормуРедактированияКомментария(Знач МногострочныйТекст, РезультатРедактирования, + Модифицированность = Ложь) Экспорт + + ОткрытьФормуРедактированияМногострочногоТекста(МногострочныйТекст, РезультатРедактирования, Модифицированность, + НСтр("ru='Комментарий'")); + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиент/ОбщегоНазначенияКлиент.mdo b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/ОбщегоНазначенияКлиент.mdo new file mode 100644 index 000000000..f0a110d43 --- /dev/null +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/ОбщегоНазначенияКлиент.mdo @@ -0,0 +1,12 @@ + + + ОбщегоНазначенияКлиент + + ru + Общего назначения клиент + + Клиентские процедуры общего назначения + true + true + true + diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/Module.bsl new file mode 100644 index 000000000..178b1b6a2 --- /dev/null +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/Module.bsl @@ -0,0 +1,40 @@ +//////////////////////////////////////////////////////////////////////////////// +// Клиентские процедуры общего назначения + +// Возвращает параметр сеанса ПредлагатьУстановкуРасширенияРаботыСФайлами +Функция ПолучитьПредлагатьУстановкуРасширенияРаботыСФайлами() Экспорт + Возврат ОбщегоНазначения.ПараметрыСеансаПредлагатьУстановкуРасширенияРаботыСФайлами(); +КонецФункции + +// Возвращает Истина, если этот веб клиент не поддерживает расширение работы с файлами +Функция ЭтоВебКлиентБезПоддержкиРасширенияРаботыСФайлами() Экспорт + + СистемнаяИнфо = Новый СистемнаяИнформация; + + Если Найти(СистемнаяИнфо.ИнформацияПрограммыПросмотра, "Safari") <> 0 Тогда + Возврат Истина; + КонецЕсли; + + Если Найти(СистемнаяИнфо.ИнформацияПрограммыПросмотра, "Chrome") <> 0 Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Возвращает Истина, если это веб клиент в Mac OS +Функция ЭтоВебКлиентПодMacOS() Экспорт + +#Если Не ВебКлиент Тогда + Возврат Ложь; // только в веб клиенте этот код работает +#КонецЕсли + + СистемнаяИнфо = Новый СистемнаяИнформация; + Если Найти(СистемнаяИнфо.ИнформацияПрограммыПросмотра, "Macintosh") <> 0 Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/ОбщегоНазначенияКлиентПовтИсп.mdo b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/ОбщегоНазначенияКлиентПовтИсп.mdo new file mode 100644 index 000000000..bd1be5100 --- /dev/null +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/ОбщегоНазначенияКлиентПовтИсп.mdo @@ -0,0 +1,11 @@ + + + ОбщегоНазначенияКлиентПовтИсп + + ru + Общего назначения клиент повт исп + + true + true + DuringSession + diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl new file mode 100644 index 000000000..97bcbb588 --- /dev/null +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl @@ -0,0 +1,779 @@ +//////////////////////////////////////////////////////////////////////////////// +// Клиентские и серверные процедуры общего назначения + +// Формирует и выводит сообщение, которое может быть связано с элементом +// управления формы. +// +// Параметры +// ТекстСообщенияПользователю - Строка - текст сообщения. +// ОбъектИлиСсылка - Ссылка на объект ИБ или объект +// Поле - Строка - наименование реквизита формы +// ПутьКДанным - Строка - путь к данным (путь к реквизиту формы) +// Отказ - Булево - Выходной параметр. +// Устанавливается в этой процедуре в значение Истина. +// +// Примеры использования: +// 1. Для вывода сообщения у поля управляемой формы, связанного с реквизитом объекта: +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( +// НСтр("ru = 'Сообщение об ошибке.'"), , +// "ПолеВРеквизитеФормыОбъект", +// "Объект"); +// +// Альтернативный вариант использования в форме объекта: +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( +// НСтр("ru = 'Сообщение об ошибке.'"), , +// "Объект.ПолеВРеквизитеФормыОбъект"); +// +// 2. Для вывода сообщения рядом с полем управляемой формы, связанным с реквизитом формы: +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( +// НСтр("ru = 'Сообщение об ошибке.'"), , +// "ИмяРеквизитаФормы"); +// +// 3. Для вывода сообщения из кода на сервере: +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( +// НСтр("ru = 'Сообщение об ошибке.'"),СсылкаНаОбъект,,,Отказ); +// +Процедура СообщитьПользователю( Знач ТекстСообщенияПользователю, + Знач ОбъектИлиСсылка = Неопределено, + Знач Поле = "", + Знач ПутьКДанным = "", + Отказ = Ложь) Экспорт + + Сообщение = Новый СообщениеПользователю; + Сообщение.Текст = ТекстСообщенияПользователю; + Сообщение.Поле = Поле; + Сообщение.ПутьКДанным = ПутьКДанным; + + Если ОбъектИлиСсылка <> Неопределено Тогда + Сообщение.УстановитьДанные(ОбъектИлиСсылка); + КонецЕсли; + + Сообщение.Сообщить(); + Отказ = Истина; + +КонецПроцедуры + +// Дополняет таблицу значений-приемник данными из таблицы значений-источник +// +// Параметры: +// ТаблицаИсточник - Таблица значений - таблица из которой будут браться строки для заполнения +// ТаблицаПриемник - Таблица значений - таблица в которую будут добавлены строки из таблицы-источника +// +Процедура ДополнитьТаблицу(ТаблицаИсточник, ТаблицаПриемник) Экспорт + + Для каждого СтрокаТаблицыИсточник Из ТаблицаИсточник Цикл + + ЗаполнитьЗначенияСвойств(ТаблицаПриемник.Добавить(), СтрокаТаблицыИсточник); + + КонецЦикла; + +КонецПроцедуры + +// Дополняет таблицу значений Таблица значениями из массива Массив. +// +// Параметры: +// Таблица - ТаблицаЗначений - таблица, которую необходимо заполнить значениями из массива +// Массив - Массив - массив значений для заполнения таблицы +// ИмяПоля - Строка - имя поля таблицы значений, в которое необходимо загрузить значения из массива +// +Процедура ДополнитьТаблицуИзМассива(Таблица, Массив, ИмяПоля) Экспорт + + Для каждого Значение Из Массив Цикл + + Таблица.Добавить()[ИмяПоля] = Значение; + + КонецЦикла; + +КонецПроцедуры + +// Снимает один элемент условного оформления, если это список значений. +// Параметры +// УсловноеОформление - условное оформление элемента формы +// ИдентификаторПользовательскойНастройки - строка - идентификатор настройки +// Значение - значение, которое требуется удалить из списка оформления +// +Процедура СнятьУсловноеОформлениеСпискаЗначений( + УсловноеОформление, + знач ИдентификаторПользовательскойНастройки, + знач Значение) Экспорт + + Для каждого ЭлементУО Из УсловноеОформление.Элементы Цикл + Если ЭлементУО.ИдентификаторПользовательскойНастройки = ИдентификаторПользовательскойНастройки Тогда + Если ЭлементУО.Отбор.Элементы.Количество() = 0 Тогда + Возврат; + КонецЕсли; + ЭлементСписокОтбора = ЭлементУО.Отбор.Элементы[0]; + Если ЭлементСписокОтбора.ПравоеЗначение = Неопределено Тогда + Возврат; + КонецЕсли; + ЭлементСписка = ЭлементСписокОтбора.ПравоеЗначение.НайтиПоЗначению(Значение); + Если ЭлементСписка <> Неопределено Тогда + ЭлементСписокОтбора.ПравоеЗначение.Удалить(ЭлементСписка); + КонецЕсли; + ЭлементСписокОтбора.ПравоеЗначение = ЭлементСписокОтбора.ПравоеЗначение; + Возврат; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Удаляет одно значение из массива +// +// Параметры: +// Массив - массив, из которого необходимо удалить значение +// Значение - удаляемое значение из массива +// +Процедура УдалитьЗначениеИзМассива(Массив, Значение) Экспорт + + Индекс = Массив.Найти(Значение); + + Если Индекс <> Неопределено Тогда + + Массив.Удалить(Индекс); + + КонецЕсли; + +КонецПроцедуры + +// Заполняет коллекцию-приемник значениями из коллекции-источник +// В качестве коллекций источника и приемника могут выступать типы: +// ТаблицаЗначений; ДеревоЗначений; СписокЗначений и пр. +// +// Параметры: +// КоллекцияИсточник - коллекция значений, которая является источником для заполнения данных +// КоллекцияПриемник - коллекция значений, которая является приемником для заполнения данных +// +Процедура ЗаполнитьКоллекциюСвойств(КоллекцияИсточник, КоллекцияПриемник) Экспорт + + Для Каждого Элемент ИЗ КоллекцияИсточник Цикл + + ЗаполнитьЗначенияСвойств(КоллекцияПриемник.Добавить(), Элемент); + + КонецЦикла; + +КонецПроцедуры + +// Получает массив значений из отмеченных элементов списка значений +// +// Параметры: +// Список - СписокЗначений - список значений из которого будет формироваться массив значений +// +// Возвращаемое значение: +// Массив - массив значений из отмеченных элементов списка значений +// +Функция ПолучитьМассивОтмеченныхЭлементовСписка(Список) Экспорт + + // возвращаемое значение функции + Массив = Новый Массив; + + Для Каждого Элемент ИЗ Список Цикл + + Если Элемент.Пометка Тогда + + Массив.Добавить(Элемент.Значение); + + КонецЕсли; + + КонецЦикла; + + Возврат Массив; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Блок функций для работы с файловой системой +// + +// Процедура УдалитьКаталогСФайлами удаляет все файлы в заданном каталоге. +// +// Параметры: +// Путь - Строка, полный путь каталога, в котором требуется +// удалить все файлы. +// +Процедура УдалитьКаталогСФайлами(Путь) Экспорт + + Каталог = Новый Файл(Путь); + + Если Каталог.Существует() Тогда + УдалитьФайлы(Путь); + КонецЕсли; + +КонецПроцедуры // УдалитьКаталогСФайлами() + +// Добавляет к переданному пути каталога конечный символ-разделитель, +// если необходимо. +// +// Параметры +// ПутьКаталога - Строка - путь к каталогу +// +// Возвращаемое значение: +// Строка - путь к каталогу с конечным символом-разделителем. +// +// Примеры использования: +// Результат = ДобавитьКонечныйРазделительПути("C:\Мой каталог"); // возвращает "C:\Мой каталог\" +// Результат = ДобавитьКонечныйРазделительПути("C:\Мой каталог\"); // возвращает "C:\Мой каталог\" +// Результат = ДобавитьКонечныйРазделительПути("ftp://Мой каталог"); // возвращает "ftp://Мой каталог/" +// +Функция ДобавитьКонечныйРазделительПути(Знач ПутьКаталога) Экспорт + Если ПустаяСтрока(ПутьКаталога) Тогда + Возврат ПутьКаталога; + КонецЕсли; + + ДобавляемыйСимвол = "\"; + Если Найти(ПутьКаталога, "/") > 0 Тогда + ДобавляемыйСимвол = "/"; + КонецЕсли; + + Длина = СтрДлина(ПутьКаталога); + Если Длина = 0 Тогда + Возврат ДобавляемыйСимвол; + ИначеЕсли Сред(ПутьКаталога, Длина, 1) <> ДобавляемыйСимвол Тогда + Возврат ПутьКаталога + ДобавляемыйСимвол; + Иначе + Возврат ПутьКаталога; + КонецЕсли; +КонецФункции + +// Составляет полное имя файла из имени каталога и имени файла. +// +// Параметры +// ИмяКаталога – Строка, содержащая путь к каталогу файла на диске. +// ИмяФайла – Строка, содержащая имя файла, без имени каталога. +// +// Возвращаемое значение: +// Строка – полное имя файла с учетом каталога. +// +Функция ПолучитьИмяФайла(Знач ИмяКаталога, Знач ИмяФайла) Экспорт + + Если НЕ ПустаяСтрока(ИмяФайла) Тогда + + Слэш = ""; + Если (Прав(ИмяКаталога, 1) <> "\") И (Прав(ИмяКаталога, 1) <> "/") Тогда + Слэш = ?(Найти(ИмяКаталога, "\") = 0, "/", "\"); + КонецЕсли; + + Возврат ИмяКаталога + Слэш + ИмяФайла; + + Иначе + + Возврат ИмяКаталога; + + КонецЕсли; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Блок функций для работы с почтовыми адресами +// + +// Функция проверяет что введенная строка с e-mail адресами введена правильно +// +// Формат строки: +// Z = ИмяПользователя|[Имя Пользователя] [<]пользователь@почтовый_сервер[>], Строка = Z[<разделитель*>Z].. +// +// прим.: разделитель* - имеется в виду любой разделитель адресов +// +// Параметры: +// СтрокаАдресов - строка - правильная строка с почтовыми адресами +// +// Возвращаемое значение: +// Структура +// ключ Статус - булево - успех или неуспех преобразования +// в случае успеха содержит ключ Значение: +// Массив структур, где +// Адрес- e-mail получателя +// Представление - имя получателя +// в случае неуспеха содержит ключ СообщениеОбОшибке - строка +// +// ВАЖНО: Функция возвращает массив структур, в которых одно поле (любое) +// может быть незаполнено. Может использоваться различными +// подсистемами для собственного сопоставления имени пользователя +// некому e-mail адресу. Поэтому, необходимо перед непосредственной +// отправкой проверить, что поле почтового адреса заполнено. +// +Функция РазобратьСтрокуСПочтовымиАдресами(знач СтрокаАдресов) Экспорт + + Результат = Новый Массив; + + НедопустимыеСимволы = "!#$%^&*()+`~|\/="; + СимволыРазделители = ";,"; + + Индекс = 1; // номер обрабатываемого символа + Накопитель = ""; // накопитель символов, после анализа перемещается либо в полное имя + // либо в почтовый адрес + ПолноеИмяАдресата = ""; // переменная, накапливающая имя адресата + ПочтовыйАдрес = ""; // переменная, накапливающая e-mail адрес + // 1 - формирование полного имени: ожидаются любые допустимые символы имени адресата + // 2 - формирование почтового адреса: ожидаются любые допустимые символы email адреса + // 3 - завершение формирования очередного почтового адреса - ожидаются символы разделители либо пробелы + СтадияРазбора = 1; + + СообщениеНедопустимыеСимволы = НСтр("ru = 'Недопустимые символы в почтовом адресе.'"); + СообщениеНеверныйФорматПочтовогоАдреса = НСтр("ru = 'Неверный формат почтового адреса.'"); + + Пока Индекс <= СтрДлина(СтрокаАдресов) Цикл + + Символ = Сред(СтрокаАдресов, Индекс, 1); + + Если Символ = " " Тогда + Индекс = ? ((ПропуститьПробелы(СтрокаАдресов, Индекс, " ") - 1) > Индекс, + ПропуститьПробелы(СтрокаАдресов, Индекс, " ") - 1, + Индекс); + Если СтадияРазбора = 1 Тогда + ПолноеИмяАдресата = ПолноеИмяАдресата + Накопитель + " "; + ИначеЕсли СтадияРазбора = 2 Тогда + ПочтовыйАдрес = Накопитель; + СтадияРазбора = 3; + КонецЕсли; + Накопитель = ""; + ИначеЕсли Символ = "@" Тогда + Если СтадияРазбора = 1 Тогда + СтадияРазбора = 2; + + Для ИндексПоискаНС = 1 По СтрДлина(Накопитель) Цикл + Если Найти(НедопустимыеСимволы, Сред(Накопитель, ИндексПоискаНС, 1)) > 0 Тогда + ВызватьИсключение СообщениеНедопустимыеСимволы; + КонецЕсли; + КонецЦикла; + + Накопитель = Накопитель + Символ; + ИначеЕсли СтадияРазбора = 2 Тогда + ВызватьИсключение СообщениеНеверныйФорматПочтовогоАдреса; + ИначеЕсли СтадияРазбора = 3 Тогда + ВызватьИсключение СообщениеНеверныйФорматПочтовогоАдреса; + КонецЕсли; + ИначеЕсли Найти(СимволыРазделители, Символ) > 0 Тогда + + Если СтадияРазбора = 1 Тогда + ПолноеИмяАдресата = ПолноеИмяАдресата + Накопитель; + ИначеЕсли СтадияРазбора = 2 Тогда + ПочтовыйАдрес = Накопитель; + КонецЕсли; + + СтадияРазбора = 1; + + Если НЕ (ПустаяСтрока(ПолноеИмяАдресата) И ПустаяСтрока(ПочтовыйАдрес)) Тогда + Результат.Добавить(ПроверитьИПодготовитьПочтовыйАдрес(ПолноеИмяАдресата, ПочтовыйАдрес)); + КонецЕсли; + + ПочтовыйАдрес = ""; + ПолноеИмяАдресата = ""; + Накопитель = ""; + Иначе + Если СтадияРазбора = 2 ИЛИ СтадияРазбора = 3 Тогда + Если Найти(НедопустимыеСимволы, Символ) > 0 Тогда + ВызватьИсключение СообщениеНедопустимыеСимволы; + КонецЕсли; + КонецЕсли; + + Накопитель = Накопитель + Символ; + КонецЕсли; + + Индекс = Индекс + 1; + КонецЦикла; + + Если СтадияРазбора = 1 Тогда + ПолноеИмяАдресата = ПолноеИмяАдресата + Накопитель; + ИначеЕсли СтадияРазбора = 2 Тогда + ПочтовыйАдрес = Накопитель; + КонецЕсли; + + Если НЕ (ПустаяСтрока(ПолноеИмяАдресата) И ПустаяСтрока(ПочтовыйАдрес)) Тогда + Результат.Добавить(ПроверитьИПодготовитьПочтовыйАдрес(ПолноеИмяАдресата, ПочтовыйАдрес)); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Проверяет, что почтовый адрес не содержит символов обрамления +// если символы обрамления вставлены правильно убирает их +// Параметры: +// ПолноеИмяАдресата - строка - имя получателя +// ПочтовыйАдрес - строка - email адрес +// Возвращаемое значение: +// Структура: +// Ключ статус - булево - успех или неуспех операции +// СообщениеОбОшибке - в случае неуспеха операции содержит сообщение об ошибке +// Значение - структура - в случае успеха операции содержит записанную структуру почтового +// адреса: ключи - Адрес, Представление (строки) +// +Функция ПроверитьИПодготовитьПочтовыйАдрес(знач ПолноеИмяАдресата, знач ПочтовыйАдрес) + + НедопустимыйСимволВИмениАдресата = НСтр("ru = 'Недопустимый символ в имени адресата.'"); + НедопустимыйСимволВПочтовомАдресе = НСтр("ru = 'Недопустимый символ в почтовом адресе.'"); + СимволыОбрамления = "<>[]"; + ДопустимыеСимволыEMAIL = "abcdefghijklmnopqrstuvwxyz0123456789-_.@"; + + ПочтовыйАдрес = СокрЛП(ПочтовыйАдрес); + ПолноеИмяАдресата = СокрЛП(ПолноеИмяАдресата); + + Если Лев(ПолноеИмяАдресата, 1) = "<" Тогда + Если Прав(ПолноеИмяАдресата, 1) = ">" Тогда + ПолноеИмяАдресата = Сред(ПолноеИмяАдресата, 2, СтрДлина(ПолноеИмяАдресата)-2); + Иначе + ВызватьИсключение НедопустимыйСимволВИмениАдресата; + КонецЕсли; + ИначеЕсли Лев(ПолноеИмяАдресата, 1) = "[" Тогда + Если Прав(ПолноеИмяАдресата, 1) = "]" Тогда + ПолноеИмяАдресата = Сред(ПолноеИмяАдресата, 2, СтрДлина(ПолноеИмяАдресата)-2); + Иначе + ВызватьИсключение НедопустимыйСимволВИмениАдресата; + КонецЕсли; + КонецЕсли; + + Если Лев(ПочтовыйАдрес, 1) = "<" Тогда + Если Прав(ПочтовыйАдрес, 1) = ">" Тогда + ПочтовыйАдрес = Сред(ПочтовыйАдрес, 2, СтрДлина(ПочтовыйАдрес)-2); + Иначе + ВызватьИсключение НедопустимыйСимволВПочтовомАдресе; + КонецЕсли; + ИначеЕсли Лев(ПочтовыйАдрес, 1) = "[" Тогда + Если Прав(ПочтовыйАдрес, 1) = "]" Тогда + ПочтовыйАдрес = Сред(ПочтовыйАдрес, 2, СтрДлина(ПочтовыйАдрес)-2); + Иначе + ВызватьИсключение НедопустимыйСимволВПочтовомАдресе; + КонецЕсли; + КонецЕсли; + + Для Индекс = 1 По СтрДлина(СимволыОбрамления) Цикл + Если Найти(ПолноеИмяАдресата, Сред(СимволыОбрамления, Индекс, 1)) <> 0 + ИЛИ Найти(ПочтовыйАдрес, Сред(СимволыОбрамления, Индекс, 1)) <> 0 Тогда + ВызватьИсключение НедопустимыйСимволВПочтовомАдресе; + КонецЕсли; + КонецЦикла; + + Если НЕ ВыполнитьПоискИсключенийВхожденияСимволов(ПочтовыйАдрес, ДопустимыеСимволыEMAIL) Тогда + ВызватьИсключение НедопустимыйСимволВПочтовомАдресе; + КонецЕсли; + + Возврат Новый Структура("Адрес, Представление", ПочтовыйАдрес,ПолноеИмяАдресата); + +КонецФункции + +Функция ВыполнитьПоискИсключенийВхожденияСимволов(ОбследуемаяСтрока, ДопустимыеСимволы) + + Для Индекс = 1 По СтрДлина(ОбследуемаяСтрока) Цикл + Символ = Сред(ОбследуемаяСтрока, Индекс, 1); + + Если Найти(ДопустимыеСимволы, НРег(Символ)) = 0 Тогда + Возврат Ложь; + КонецЕсли; + + КонецЦикла; + + Возврат Истина; + +КонецФункции + +// Формирует структуру с ключами Статус (Истина) и Значение +// +Функция ЗаполнитьРезультат(знач Значение, знач Статус = Истина) Экспорт + + Если Статус Тогда + Возврат Новый Структура("Статус, Значение", Истина, Значение); + Иначе + Возврат Новый Структура("Статус, СообщениеОбОшибке", Ложь, Значение); + КонецЕсли; + +КонецФункции + +// Сдвигает маркер позиции пока встречается символ Символ +// возвращает номер позиции в строке, на которое установился маркер +// +Функция ПропуститьПробелы(знач Строка, + знач ТекущийИндекс, + знач ПропускаемыйСимвол) + + Результат = ТекущийИндекс; + + // убираем лишние пробелы если они есть + Пока ТекущийИндекс < СтрДлина(Строка) Цикл + Если Сред(Строка, ТекущийИндекс, 1) <> ПропускаемыйСимвол Тогда + Возврат ТекущийИндекс; + КонецЕсли; + ТекущийИндекс = ТекущийИндекс + 1; + КонецЦикла; + + Возврат ТекущийИндекс; + +КонецФункции + +#Если Не ВебКлиент Тогда +// Функция ПолучитьИмяКаталога возвращает полный путь +// к новому каталогу в каталоге временных файлов. +// +// Параметры: +// Идентификатор - Строка, начальная часть имени каталога во временном каталоге. +// +// Возвращаемое значение: +// Строка - полное имя временного каталога, например "КаталогВременныхФайлов() + Обработка123\". +// +Функция ПолучитьИмяКаталога(знач Идентификатор) Экспорт + + Индекс = 0; + + Пока Истина Цикл + + ПутьККаталогу = КаталогВременныхФайлов () + Идентификатор + строка(Индекс) + "\"; + КаталогНаДиске = Новый Файл(ПутьККаталогу); + Если НЕ КаталогНаДиске.Существует() Тогда + СоздатьКаталог(ПутьККаталогу); + Возврат ПутьККаталогу; + КонецЕсли; + Индекс = Индекс + 1; + + КонецЦикла; + +КонецФункции // ПолучитьИмяКаталога() +#КонецЕсли + +//////////////////////////////////////////////////////////////////////////////// +// Блок функций для работы с отборами динамических списков +// + +// Поиск элементов и групп отбора динамического списка +// Параметры: +// ОбластьПоиска - контейнер с элементами и группами отбора, например +// Список.Отбор +// или группа в отборе +// ИмяПоля - имя поля компоновки (не используется для групп) +// Представление - представление поля компоновки +// Примечание: поиск может осуществляться или по ЛевомуЗначению, или по Представлению +// +Функция НайтиЭлементыИГруппыОтбора(знач ОбластьПоиска, + знач ИмяПоля = Неопределено, + знач Представление = Неопределено) Экспорт + + Если ЗначениеЗаполнено(ИмяПоля) Тогда + ЗначениеПоиска = Новый ПолеКомпоновкиДанных(ИмяПоля); + СпособПоиска = 1; + Иначе + СпособПоиска = 2; + ЗначениеПоиска = Представление; + КонецЕсли; + + МассивЭлементов = Новый Массив; + + НайтиРекурсивно(ОбластьПоиска.Элементы, МассивЭлементов, СпособПоиска, ЗначениеПоиска); + + Возврат МассивЭлементов; + +КонецФункции + +// Добавление группы отбора +// Параметры: +// ОбластьДобавления - контейнер с элементами и группами отбора, например +// Список.Отбор +// или группа в отборе +// ТипГруппы - ТипГруппыЭлементовОтбораКомпоновкиДанных - тип группы +// Представление строка - представление группы +// +Функция ДобавитьГруппуОтбора(ОбластьДобавления, знач ТипГруппы, знач Представление = "") Экспорт + + Группа = ОбластьДобавления.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); + Группа.ТипГруппы = ТипГруппы; + Группа.Представление = Представление; + Группа.Использование = Истина; + + Возврат Группа; + +КонецФункции + +// Добавление элемента компоновки в контейнер элементов компоновки +// Параметры: +// ОбластьДобавления - контейнер с элементами и группами отбора, например +// Список.Отбор +// или группа в отборе +// ИмяПоля - строка - имя для поля компоновки данных +// ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения +// ПравоеЗначение - произвольный +// Представление - представление элемента компоновки данных +// Использование - булево - использование элемента +// +Функция ДобавитьЭлементКомпоновки(ОбластьДобавления, + знач ИмяПоля, + знач ВидСравнения, + знач ПравоеЗначение = Неопределено, + знач Представление = Неопределено, + знач Использование = Неопределено) Экспорт + + Элемент = ОбластьДобавления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля); + Элемент.ВидСравнения = ВидСравнения; + + Если ПравоеЗначение <> Неопределено Тогда + Элемент.ПравоеЗначение = ПравоеЗначение; + КонецЕсли; + + Если Представление <> Неопределено Тогда + Элемент.Представление = Представление; + КонецЕсли; + + Если Использование <> Неопределено Тогда + Элемент.Использование = Использование; + КонецЕсли; + + Возврат Элемент; + +КонецФункции + +// Изменение элементов отбора +// Параметры +// ИмяПоля - строка - имя поля компоновки +// ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения +// ПравоеЗначение - произвольный +// Представление - строка - представление элемента компоновки данных +// +Функция ИзменитьЭлементыОтбора(ОбластьПоиска, + знач ИмяПоля = Неопределено, + знач Представление = Неопределено, + знач ПравоеЗначение = Неопределено, + знач ВидСравнения = Неопределено, + знач Использование = Неопределено) Экспорт + + Если ЗначениеЗаполнено(ИмяПоля) Тогда + ЗначениеПоиска = Новый ПолеКомпоновкиДанных(ИмяПоля); + СпособПоиска = 1; + Иначе + СпособПоиска = 2; + ЗначениеПоиска = Представление; + КонецЕсли; + + МассивЭлементов = Новый Массив; + + НайтиРекурсивно(ОбластьПоиска.Элементы, МассивЭлементов, СпособПоиска, ЗначениеПоиска); + + Для Каждого Элемент Из МассивЭлементов Цикл + Если ИмяПоля <> Неопределено Тогда + Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля); + КонецЕсли; + Если Представление <> Неопределено Тогда + Элемент.Представление = Представление; + КонецЕсли; + Если Использование <> Неопределено Тогда + Элемент.Использование = Использование; + КонецЕсли; + Если ВидСравнения <> Неопределено Тогда + Элемент.ВидСравнения = ВидСравнения; + КонецЕсли; + Если ПравоеЗначение <> Неопределено Тогда + Элемент.ПравоеЗначение = ПравоеЗначение; + КонецЕсли; + КонецЦикла; + + Возврат МассивЭлементов.Количество(); + +КонецФункции + +// Поиск элементов и групп отбора динамического списка +// Параметры: +// ОбластьУдаления - контейнер с элементами и группами отбора, например +// Список.Отбор +// или группа в отборе +// ИмяПоля - имя поля компоновки (не используется для групп) +// Представление - представление поля компоновки +// Примечание: поиск может осуществляться или по ЛевомуЗначению, или по Представлению +// +Процедура УдалитьЭлементыГруппыОтбора(знач ОбластьУдаления, + знач ИмяПоля = Неопределено, + знач Представление = Неопределено) Экспорт + + Если ЗначениеЗаполнено(ИмяПоля) Тогда + ЗначениеПоиска = Новый ПолеКомпоновкиДанных(ИмяПоля); + СпособПоиска = 1; + Иначе + СпособПоиска = 2; + ЗначениеПоиска = Представление; + КонецЕсли; + + МассивЭлементов = Новый Массив; + + НайтиРекурсивно(ОбластьУдаления.Элементы, МассивЭлементов, СпособПоиска, ЗначениеПоиска); + + Для Каждого Элемент Из МассивЭлементов Цикл + Если Элемент.Родитель = Неопределено Тогда + ОбластьУдаления.Элементы.Удалить(Элемент); + Иначе + Элемент.Родитель.Элементы.Удалить(Элемент); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Используется для создания элемента отбора или, если таковой не найден, +// установления существующим элементам свойств +// Параметры +// ОбластьПоискаДобавления - контейнер с элементами и группами отбора, например +// Список.Отбор +// или группа в отборе +// ИмяПоля - строка - имя для поля компоновки данных (заполняется всегда) +// Устанавливаемые поля: +// ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения +// ПравоеЗначение - произвольный +// Представление - представление элемента компоновки данных +// Использование - булево - использование элемента +// +Процедура УстановитьЭлементОтбора(ОбластьПоискаДобавления, + знач ИмяПоля, + знач ПравоеЗначение = Неопределено, + знач ВидСравнения = Неопределено, + знач Представление = Неопределено, + знач Использование = Неопределено) Экспорт + + ЧислоИзмененных = ИзменитьЭлементыОтбора(ОбластьПоискаДобавления, ИмяПоля, Представление, + ПравоеЗначение, ВидСравнения, Использование); + + Если ЧислоИзмененных = 0 Тогда + Если ВидСравнения = Неопределено Тогда + ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + КонецЕсли; + ДобавитьЭлементКомпоновки(ОбластьПоискаДобавления, ИмяПоля, ВидСравнения, + ПравоеЗначение, Представление, Использование); + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьПараметрДинамическогоСписка(Список, ИмяПараметра, Значение, Использование = Истина) Экспорт + + Если Использование Тогда + Список.Параметры.УстановитьЗначениеПараметра(ИмяПараметра, Значение); + Иначе + ЗначениеПараметра = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра)); + Если ЗначениеПараметра <> Неопределено Тогда + ЗначениеПараметра.Значение = Значение; + ЗначениеПараметра.Использование = Ложь; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры // УстановитьПараметрДинамическогоСписка() + +// Служебные функции + +Процедура НайтиРекурсивно(КоллекцияЭлементов, МассивЭлементов, СпособПоиска, ЗначениеПоиска) + + Для каждого ЭлементОтбора Из КоллекцияЭлементов Цикл + + Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда + + Если СпособПоиска = 1 Тогда + Если ЭлементОтбора.ЛевоеЗначение = ЗначениеПоиска Тогда + МассивЭлементов.Добавить(ЭлементОтбора); + КонецЕсли; + ИначеЕсли СпособПоиска = 2 Тогда + Если ЭлементОтбора.Представление = ЗначениеПоиска Тогда + МассивЭлементов.Добавить(ЭлементОтбора); + КонецЕсли; + КонецЕсли; + Иначе + + НайтиРекурсивно(ЭлементОтбора.Элементы, МассивЭлементов, СпособПоиска, ЗначениеПоиска); + + Если СпособПоиска = 2 И ЭлементОтбора.Представление = ЗначениеПоиска Тогда + МассивЭлементов.Добавить(ЭлементОтбора); + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/ОбщегоНазначенияКлиентСервер.mdo b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/ОбщегоНазначенияКлиентСервер.mdo new file mode 100644 index 000000000..7070b4911 --- /dev/null +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/ОбщегоНазначенияКлиентСервер.mdo @@ -0,0 +1,14 @@ + + + ОбщегоНазначенияКлиентСервер + + ru + Общего назначения клиент сервер + + Клиентские и серверные процедуры общего назначения + true + true + true + true + true + diff --git a/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl new file mode 100644 index 000000000..89cb340f0 --- /dev/null +++ b/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl @@ -0,0 +1,57 @@ + +// Функция ПолучитьИсключенияПоискаСсылок возвращает список имен объектов метаданных, +// которые могут ссылаться на различные объекты метаданных без влияния на бизнес-логику приложения, +// +// Пример: +// Для документ "Реализация товаров и услуг" настроена подсистема версионирования объектов, +// и подсистема свойств. При этом на экземпляр документа может быть множество ссылок +// в информационной базе (из других документов, регистров). Часть ссылок имеют значение для бизнес-логики +// (например движения по регистрам). Другая часть ссылок - "техногенные" ссылки на объект из объектов ИБ, +// которые относятся к подсистеме версионирования объектов и подсистеме свойств. Такие техногенные +// ссылки должны быть отфильтрованы в обработке удаления помеченных и при поиске ссылок на объект +// в подсистеме запрета редактирования ключевых реквизитов. +// +// Возвращаемое значение: +// Массив - массив строк, например, "РегистрСведений.ВерсииОбъектов". +// +Функция ПолучитьИсключенияПоискаСсылок() Экспорт + + Массив = Новый Массив; + + // Валюты + Массив.Добавить(Метаданные.РегистрыСведений.КурсыВалют.ПолноеИмя()); + // Конец Валюты + + // ВерсионированиеОбъектов + Массив.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов.ПолноеИмя()); + // Конец ВерсионированиеОбъектов + + // Свойства + Массив.Добавить(Метаданные.РегистрыСведений.ДополнительныеСведения.ПолноеИмя()); + // Конец Свойства + + // УправлениеДоступом + Массив.Добавить(Метаданные.РегистрыСведений.ГруппыЗначенийДоступа.ПолноеИмя()); + Массив.Добавить(Метаданные.РегистрыСведений.НаборыЗначенийДоступа.ПолноеИмя()); + Массив.Добавить(Метаданные.РегистрыСведений.ЗначенияГруппДоступа.ПолноеИмя()); + Массив.Добавить(Метаданные.РегистрыСведений.ТаблицыГруппДоступа.ПолноеИмя()); + Массив.Добавить(Метаданные.РегистрыСведений.ПраваПоЗначениямДоступа.ПолноеИмя()); + // Конец УправлениеДоступом + + // БизнесПроцессыИЗадачи + Массив.Добавить(Метаданные.РегистрыСведений.ИсполнителиЗадач.ПолноеИмя()); + Массив.Добавить(Метаданные.РегистрыСведений.СписокБизнесПроцессов.ПолноеИмя()); + // Конец БизнесПроцессыИЗадачи + + // ФизическиеЛица + Массив.Добавить(Метаданные.РегистрыСведений.ДокументыФизическихЛиц.ПолноеИмя()); + // Конец ФизическиеЛица + + // РаботаСФайлами + Массив.Добавить(Метаданные.РегистрыСведений.ФайлыВРабочемКаталоге.ПолноеИмя()); + // Конец РаботаСФайлами + + Возврат Массив; + +КонецФункции // ПолучитьИсключенияПоискаСсылок() + diff --git a/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/ОбщегоНазначенияПереопределяемый.mdo b/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/ОбщегоНазначенияПереопределяемый.mdo new file mode 100644 index 000000000..187532abd --- /dev/null +++ b/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/ОбщегоНазначенияПереопределяемый.mdo @@ -0,0 +1,11 @@ + + + ОбщегоНазначенияПереопределяемый + + ru + Общего назначения переопределяемый + + true + true + DuringSession + diff --git a/SSL/src/CommonModules/ПолнотекстовыйПоискКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПолнотекстовыйПоискКлиентПереопределяемый/Module.bsl new file mode 100644 index 000000000..36a66ac71 --- /dev/null +++ b/SSL/src/CommonModules/ПолнотекстовыйПоискКлиентПереопределяемый/Module.bsl @@ -0,0 +1,24 @@ + +// Вызывается при открытии объекта из полнотекстового поиска +// Функция ПриОткрытииОбъекта позволяет настроить +// поведение при открытии результата из списка найденного в полнотекстовом поиске +// Например, это необходимо при использовании подсистемы "Бизнес-процессы и задачи". +// +// Параметры +// Значение - объект, найденный в полнотекстовом поиске, например СправочникСсылка +// СтандартнаяОбработка - Булево - по умолчанию Истина. +// Если поведение изменено (по собственной механике делается открытие формы для Значение), +// то СтандартнаяОбработка надо установить в Ложь +// +// При использовании подсистемы "Бизнес-процессы и задачи" нужно +// вписать следующий код: +// +//Если ТипЗнч(Значение) = Тип("ЗадачаСсылка.ЗадачаИсполнителя") Тогда +// Если БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(Значение) Тогда +// СтандартнаяОбработка = Ложь; +// КонецЕсли; +//КонецЕсли; +// +Процедура ПриОткрытииОбъекта(Значение, СтандартнаяОбработка) Экспорт + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ПолнотекстовыйПоискКлиентПереопределяемый/ПолнотекстовыйПоискКлиентПереопределяемый.mdo b/SSL/src/CommonModules/ПолнотекстовыйПоискКлиентПереопределяемый/ПолнотекстовыйПоискКлиентПереопределяемый.mdo new file mode 100644 index 000000000..2ef8012f5 --- /dev/null +++ b/SSL/src/CommonModules/ПолнотекстовыйПоискКлиентПереопределяемый/ПолнотекстовыйПоискКлиентПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + ПолнотекстовыйПоискКлиентПереопределяемый + + ru + Полнотекстовый поиск клиент переопределяемый + + true + true + diff --git a/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl b/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl new file mode 100644 index 000000000..e4caa13c3 --- /dev/null +++ b/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl @@ -0,0 +1,74 @@ +//////////////////////////////////////////////////////////////////////////////// +// МОДУЛЬ УПРАВЛЕНИЯ ИНДЕКСОМ ПОЛНОТЕКСТОВОГО ПОИСКА + +// Обновляет индекс полнотекстового поиска +Процедура ОбновлениеИндексаППД() Экспорт + + РазрешитьПолнотекстовыйПоиск = ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Разрешить; + Если РазрешитьПолнотекстовыйПоиск = Ложь Тогда + Возврат; + КонецЕсли; + + Попытка + ЗаписьЖурналаРегистрации("Полнотекстовое индексирование", + УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Начато регламентное индексирование порции'")); + + ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь, Истина); + + ЗаписьЖурналаРегистрации("Полнотекстовое индексирование", + УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Закончено регламентное индексирование порции'")); + Исключение + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Во время регламентного обновления индекса произошла неизвестная ошибка. + |%1'"), ОписаниеОшибки()); + ЗаписьЖурналаРегистрации("Полнотекстовое индексирование", + УровеньЖурналаРегистрации.Ошибка, , , + ТекстСообщенияОбОшибке); + КонецПопытки; + +КонецПроцедуры + +// Выполняет слияние индексов полнотекстового поиска +Процедура СлияниеИндексаППД() Экспорт + + РазрешитьПолнотекстовыйПоиск = ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Разрешить; + Если РазрешитьПолнотекстовыйПоиск = Ложь Тогда + Возврат; + КонецЕсли; + + Попытка + ЗаписьЖурналаРегистрации("Полнотекстовое индексирование", + УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Начато регламентное слияние индексов'")); + + ПолнотекстовыйПоиск.ОбновитьИндекс(Истина); + + ЗаписьЖурналаРегистрации("Полнотекстовое индексирование", + УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Закончено регламентное слияние индексов'")); + Исключение + ТекстСообщенияОбОшибке = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Во время регламентного слияния индекса произошла неизвестная ошибка. + |%1'"), ОписаниеОшибки()); + ЗаписьЖурналаРегистрации("Полнотекстовое индексирование", + УровеньЖурналаРегистрации.Ошибка, , , + ТекстСообщенияОбОшибке); + КонецПопытки; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обновление информационной базы. + +// Установить константу ИспользоватьПолнотекстовыйПоиск синхронно с ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() +Процедура ИнициализироватьФункциональнуюОпциюПолнотекстовыйПоиск() Экспорт + Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Разрешить Тогда + Константы.ИспользоватьПолнотекстовыйПоиск.Установить(Истина); + Иначе + Константы.ИспользоватьПолнотекстовыйПоиск.Установить(Ложь); + КонецЕсли; +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/ПолнотекстовыйПоискСервер.mdo b/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/ПолнотекстовыйПоискСервер.mdo new file mode 100644 index 000000000..2eff77193 --- /dev/null +++ b/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/ПолнотекстовыйПоискСервер.mdo @@ -0,0 +1,10 @@ + + + ПолнотекстовыйПоискСервер + + ru + Полнотекстовый поиск сервер + + true + true + diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl new file mode 100644 index 000000000..ddf930769 --- /dev/null +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl @@ -0,0 +1,247 @@ + +// Общая интерфейсная функция для получения файла из Интернет по протоколу http(s) +// либо ftp и сохранения его во временное хранилище. +// +// Параметры: +// ПутьДляСохранения - строка - путь на сервере (включая имя файла), для сохранения скачанного файла +// URL - строка - url файла в формате: +// [Протокол://]<Сервер>/<Путь к файлу на сервере> +// Пользователь - строка - пользователь от имени которого установлено соединение +// Пароль - строка - пароль пользователя от которого установлено соединение +// Порт - число - порт сервера с которым установлено соединение +// ЗащищенноеСоединение - Булево - для случая http загрузки флаг указывает, +// что соединение должно производиться через https +// ПассивноеСоединение - - Булево - для случая ftp загрузки флаг указывает, +// что соединение должно пассивным (или активным) +// +// Возвращаемое значение: +// структура +// Статус - Булево - ключ присутствует в структуре всегда, значения +// Истина - вызов функции успешно завершен +// Ложь - вызов функции завершен неудачно +// Путь - Строка - путь к файлу на сервере, ключ используется только +// если статус Истина +// СообщениеОбОшибке - Строка - сообщение об ошибке, если статус Ложь +// +Функция СкачатьФайлНаСервере(знач URL, + знач ПараметрыПолучения = Неопределено) Экспорт + + // Объявление переменных перед первым использованием в качестве + // параметра метода Свойство, при анализе параметров получения файлов + // из ПараметрыПолучения. Содержат значения переданных параметров получения файла + Перем ПутьДляСохранения, Пользователь, Пароль, Порт, + ЗащищенноеСоединение, ПассивноеСоединение; + + // Получаем параметры получения файла + + Если ПараметрыПолучения = Неопределено Тогда + ПараметрыПолучения = Новый Структура; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("ПутьДляСохранения", ПутьДляСохранения) Тогда + ПутьДляСохранения = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("Пользователь", Пользователь) Тогда + Пользователь = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("Пароль", Пароль) Тогда + Пароль = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("Порт", Порт) Тогда + Порт = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("ЗащищенноеСоединение", ЗащищенноеСоединение) Тогда + ЗащищенноеПассивноеСоединение = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("ПассивноеСоединение", ПассивноеСоединение) Тогда + ЗащищенноеПассивноеСоединение = Неопределено; + КонецЕсли; + + НастройкаСохранения = Новый Соответствие; + НастройкаСохранения.Вставить("МестоХранения", "Сервер"); + НастройкаСохранения.Вставить("Путь", ПутьДляСохранения); + + Результат = ПолучениеФайловИзИнтернетаКлиентСервер.ПодготовитьПолучениеФайла( + URL, + Пользователь, + Пароль, + Порт, + ЗащищенноеСоединение, + ПассивноеСоединение, + НастройкаСохранения); + + Возврат Результат; + +КонецФункции + +// Общая интерфейсная функция для получения файла из Интернет по протоколу http(s) +// либо ftp и сохранения его во временное хранилище. +// +// Параметры: +// URL - строка - url файла в формате: +// [Протокол://]<Сервер>/<Путь к файлу на сервере> +// Пользователь - строка - пользователь от имени которого установлено соединение +// Пароль - строка - пароль пользователя от которого установлено соединение +// Порт - число - порт сервера с которым установлено соединение +// ЗащищенноеСоединение - Булево - для случая http загрузки флаг указывает, +// что соединение должно производиться через https +// ПассивноеСоединение - - Булево - для случая ftp загрузки флаг указывает, +// что соединение должно пассивным (или активным) +// +// Возвращаемое значение: +// структура +// Статус - Булево - ключ присутствует в структуре всегда, значения +// Истина - вызов функции успешно завершен +// Ложь - вызов функции завершен неудачно +// Путь - Строка - путь к файлу во временном хранилище, +// ключ используется только если статус Истина +// СообщениеОбОшибке - Строка - сообщение об ошибке, если статус Ложь +// +Функция СкачатьФайлВоВременноеХранилище(знач URL, + знач ПараметрыПолучения = Неопределено) Экспорт + + // Объявление переменных перед первым использованием в качестве + // параметра метода Свойство, при анализе параметров получения файлов + // из ПараметрыПолучения. Содержат значения переданных параметров получения файла + Перем ПутьДляСохранения, Пользователь, Пароль, Порт, + ЗащищенноеСоединение, ПассивноеСоединение; + // Получаем параметры получения файла + + Если ПараметрыПолучения = Неопределено Тогда + ПараметрыПолучения = Новый Структура; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("ПутьДляСохранения", ПутьДляСохранения) Тогда + ПутьДляСохранения = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("Пользователь", Пользователь) Тогда + Пользователь = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("Пароль", Пароль) Тогда + Пароль = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("Порт", Порт) Тогда + Порт = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("ЗащищенноеСоединение", ЗащищенноеСоединение) Тогда + ЗащищенноеПассивноеСоединение = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("ПассивноеСоединение", ПассивноеСоединение) Тогда + ЗащищенноеПассивноеСоединение = Неопределено; + КонецЕсли; + + НастройкаСохранения = Новый Соответствие; + НастройкаСохранения.Вставить("МестоХранения", "ВременноеХранилище"); + + Результат = ПолучениеФайловИзИнтернетаКлиентСервер.ПодготовитьПолучениеФайла( + URL, + Пользователь, + Пароль, + Порт, + ЗащищенноеСоединение, + ПассивноеСоединение, + НастройкаСохранения); + + Возврат Результат; + +КонецФункции + +// Записывает двоичные данные в файл, хранящийся во временном хранилище +// +// Параметры: +// АдресВоВременномХранилище - строка - адрес двоичных данных файла +// во временном хранилище +// ИмяФайла - строка - путь по которому файл необходимо сохранить +// на сервере +// +Функция СохранитьФайлИзВременногоХранилищаНаСервере(АдресВоВременномХранилище, ИмяФайла) Экспорт + + ДанныеФайла = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище); + ДанныеФайла.Записать(ИмяФайла); + + Возврат Истина; + +КонецФункции + +// Получает имя временного файла вызовом одноименной системной функции на сервере +// +Функция ПолучитьИмяВременногоФайлаНаСервере() Экспорт + + Возврат ПолучитьИмяВременногоФайла(); + +КонецФункции + +// Возвращает параметры настройки прокси сервера на стороне сервера 1С:Предприятие +// +Функция ПолучитьНастройкиПроксиНаСервере1СПредприятие() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Возврат Константы.НастройкаПроксиСервера.Получить().Получить(); + +КонецФункции + +// Возвращает параметры настройки прокси сервера на стороне сервера 1С:Предприятие +// +Процедура СохранитьНастройкиПроксиНаСервере1СПредприятие(знач Настройки) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Константы.НастройкаПроксиСервера.Установить(Новый ХранилищеЗначения(Настройки)); + +КонецПроцедуры + +// Возвращает настройку прокси сервера для доступа к интернет со стороны +// клиента по конкретному пользователю +Функция ПолучитьНастройкуПроксиСервера() Экспорт + + Возврат ХранилищеОбщихНастроек.Загрузить("НастройкаПроксиСервера"); + +КонецФункции + +Процедура ЗаписатьОшибкуВЖурналРегистрации(знач СообщениеОбОшибке) Экспорт + + ЗаписьЖурналаРегистрации(НСтр("ru='Получение файлов из интернет'"), + УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обновление информационной базы + +// Изменение настроек прокси - к настройкам добавлено новое свойство "ИспользоватьПрокси" +// +Процедура ОбновлениеХранимыхНастроекПрокси() Экспорт + + МассивПользователейИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); + + Для Каждого ПользовательИБ Из МассивПользователейИБ Цикл + НастройкаПроксиСервера = ХранилищеОбщихНастроек.Загрузить("НастройкаПроксиСервера",,, ПользовательИБ.Имя); + Если ТипЗнч(НастройкаПроксиСервера) = Тип("Соответствие") Тогда + Если НастройкаПроксиСервера.Получить("ИспользоватьПрокси") = Неопределено Тогда + НастройкаПроксиСервера.Вставить("ИспользоватьПрокси", Истина); + ХранилищеОбщихНастроек.Сохранить("НастройкаПроксиСервера", , НастройкаПроксиСервера, , ПользовательИБ.Имя); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + НастройкаПроксиСервера = ПолучениеФайловИзИнтернета.ПолучитьНастройкиПроксиНаСервере1СПредприятие(); + + Если ТипЗнч(НастройкаПроксиСервера) = Тип("Соответствие") Тогда + Если НастройкаПроксиСервера.Получить("ИспользоватьПрокси") = Неопределено Тогда + НастройкаПроксиСервера.Вставить("ИспользоватьПрокси", Истина); + ПолучениеФайловИзИнтернета.СохранитьНастройкиПроксиНаСервере1СПредприятие(НастройкаПроксиСервера); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/ПолучениеФайловИзИнтернета.mdo b/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/ПолучениеФайловИзИнтернета.mdo new file mode 100644 index 000000000..902476cb9 --- /dev/null +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/ПолучениеФайловИзИнтернета.mdo @@ -0,0 +1,10 @@ + + + ПолучениеФайловИзИнтернета + + ru + Серверный модуль механизма получения файлов + + true + true + diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/Module.bsl new file mode 100644 index 000000000..be4a8ffaa --- /dev/null +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/Module.bsl @@ -0,0 +1,82 @@ +// Общая интерфейсная функция для получения файла из Интернет по протоколу http(s) +// либо ftp и сохранения его во временное хранилище. +// +// Параметры: +// URL* - строка - url файла в формате: +// [Протокол://]<Сервер>/<Путь к файлу на сервере> +// ПараметрыПолучения* - структура с ключами: +// ПутьДляСохранения - строка - путь на клиенте (включая имя файла), сохранения +// Пользователь - строка - пользователь от имени которого установлено соединение +// Пароль - строка - пароль пользователя от которого установлено соединение +// Порт - число - порт сервера с которым установлено соединение +// ЗащищенноеСоединение - Булево - для случая http загрузки флаг указывает, +// что соединение должно производиться через https +// ПассивноеСоединение - - Булево - для случая ftp загрузки флаг указывает, +// что соединение должно пассивным (или активным) +// +// помеченные знаком '*' являются обязательными +// +// Возвращаемое значение: +// структура +// Статус - Булево - ключ присутствует в структуре всегда, значения +// Истина - вызов функции успешно завершен +// Ложь - вызов функции завершен неудачно +// Путь - Строка - путь к файлу на клиенте, ключ используется только +// если статус Истина +// СообщениеОбОшибке - Строка - сообщение об ошибке, если статус Ложь +// +Функция СкачатьФайлНаКлиенте(знач URL, + знач ПараметрыПолучения = Неопределено) Экспорт + + // Объявление переменных перед первым использованием в качестве + // параметра метода Свойство, при анализе параметров получения файлов + // из ПараметрыПолучения. Содержат значения переданных параметров получения файла + Перем ПутьДляСохранения, Пользователь, Пароль, Порт, + ЗащищенноеСоединение, ПассивноеСоединение; + + // Получаем параметры получения файла + + Если ПараметрыПолучения = Неопределено Тогда + ПараметрыПолучения = Новый Структура; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("ПутьДляСохранения", ПутьДляСохранения) Тогда + ПутьДляСохранения = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("Пользователь", Пользователь) Тогда + Пользователь = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("Пароль", Пароль) Тогда + Пароль = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("Порт", Порт) Тогда + Порт = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("ЗащищенноеСоединение", ЗащищенноеСоединение) Тогда + ЗащищенноеПассивноеСоединение = Неопределено; + КонецЕсли; + + Если Не ПараметрыПолучения.Свойство("ПассивноеСоединение", ПассивноеСоединение) Тогда + ЗащищенноеПассивноеСоединение = Неопределено; + КонецЕсли; + + НастройкаСохранения = Новый Соответствие; + НастройкаСохранения.Вставить("МестоХранения", "Клиент"); + НастройкаСохранения.Вставить("Путь", ПутьДляСохранения); + + Результат = ПолучениеФайловИзИнтернетаКлиентСервер.ПодготовитьПолучениеФайла( + URL, + Пользователь, + Пароль, + Порт, + ЗащищенноеСоединение, + ПассивноеСоединение, + НастройкаСохранения); + + Возврат Результат; + +КонецФункции diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/ПолучениеФайловИзИнтернетаКлиент.mdo b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/ПолучениеФайловИзИнтернетаКлиент.mdo new file mode 100644 index 000000000..cc3cf7e62 --- /dev/null +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/ПолучениеФайловИзИнтернетаКлиент.mdo @@ -0,0 +1,10 @@ + + + ПолучениеФайловИзИнтернетаКлиент + + ru + Получение файлов из интернета клиент + + true + true + diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl new file mode 100644 index 000000000..3c44673e6 --- /dev/null +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl @@ -0,0 +1,317 @@ +// Функция для получения файла из интернета. +// +// Параметры: +// URL - строка - url файла в формате: +// [Протокол://]<Сервер>/<Путь к файлу на сервере> +// Пользователь - строка - пользователь от имени которого установлено соединение +// Пароль - строка - пароль пользователя от которого установлено соединение +// Порт - число - порт сервера с которым установлено соединение +// ЗащищенноеПассивноеСоединение +// +// НастройкаСохранения - соответствие - содержит параметры для сохранения скачанного файла +// ключи: +// МестоХранения - строка - может содержать +// "Клиент" - клиент, +// "Сервер" - сервер, +// "ВременноеХранилище" - временное хранилище +// Путь - строка (необязательный параметр) - +// путь к каталогу на клиенте либо на сервере либо адрес во временном хранилище +// если не задано будет сгенерировано автоматически +// +// Возвращаемое значение: +// структура +// успех - булево - успех или неудача операции +// строка - строка - в случае успеха либо строка-путь сохранения файла +// либо адрес во временном хранилище +// в случае неуспеха сообщение об ошибке +// +Функция ПодготовитьПолучениеФайла( знач URL, + знач Пользователь = Неопределено, + знач Пароль = Неопределено, + знач Порт = Неопределено, + знач ЗащищенноеСоединение = Ложь, + знач ПассивноеСоединение = Ложь, + знач НастройкаСохранения) Экспорт + + НастройкаСоединения = Новый Соответствие; + НастройкаСоединения.Вставить("Пользователь", Пользователь); + НастройкаСоединения.Вставить("Пароль", Пароль); + НастройкаСоединения.Вставить("Порт", Порт); + + Протокол = РазделитьURL(URL).Протокол; + + Если Протокол = "ftp" Тогда + НастройкаСоединения.Вставить("ПассивноеСоединение", ПассивноеСоединение); + Иначе + НастройкаСоединения.Вставить("ЗащищенноеСоединение", ЗащищенноеСоединение); + КонецЕсли; + +#Если НаКлиенте Тогда + НастройкаПроксиСервера = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиПроксиСервера; +#Иначе + НастройкаПроксиСервера = ПолучениеФайловИзИнтернета.ПолучитьНастройкиПроксиНаСервере1СПредприятие(); +#КонецЕсли + + Если НастройкаПроксиСервера <> Неопределено + И НастройкаПроксиСервера["ИспользоватьПрокси"] = Ложь Тогда + НастройкаПроксиСервера = Неопределено; + КонецЕсли; + + Результат = ПолучитьФайлИзИнтернет(URL, НастройкаСохранения, НастройкаСоединения, НастройкаПроксиСервера); + + Возврат Результат; + +КонецФункции + +// Функция для получения файла из интернета. +// +// Параметры: +// URL - строка - url файла в формате: +// [Протокол://]<Сервер>/<Путь к файлу на сервере> +// +// НастройкаСоединения - Соответствие - +// ЗащищенноеСоединение* - булево - соединение защищенное +// ПассивноеСоединение* - булево - соединение защищенное +// Пользователь - строка - пользователь от имени которого установлено соединение +// Пароль - строка - пароль пользователя от которого установлено соединение +// Порт - число - порт сервера с которым установлено соединение +// * - взаимоисключающие ключи +// +// Прокси - Соответствие - +// ключи: +// НеИспользоватьПроксиДляЛокальныхАдресов - строка - +// Сервер - адрес прокси-сервера +// Порт - порт прокси-сервера +// Пользователь - имя пользователя для авторизации на прокси-сервере +// Пароль - пароль пользователя +// +// НастройкаСохранения - соответствие - содержит параметры для сохранения скачанного файла +// ключи: +// МестоХранения - строка - может содержать +// "Клиент" - клиент, +// "Сервер" - сервер, +// "ВременноеХранилище" - временное хранилище +// Путь - строка (необязательный параметр) - +// путь к каталогу на клиенте либо на сервере либо адрес во временном хранилище +// если не задано будет сгенерировано автоматически +// +// Возвращаемое значение: +// структура +// успех - булево - успех или неудача операции +// строка - строка - в случае успеха либо строка-путь сохранения файла +// либо адрес во временном хранилище +// в случае неуспеха сообщение об ошибке +// +Функция ПолучитьФайлИзИнтернет(знач URL, + знач НастройкаСохранения, + знач НастройкаСоединения = Неопределено, + знач Прокси = Неопределено) + + // Объявление переменных перед первым использованием в качестве + // параметра метода Свойство, при анализе параметров получения файлов + // из ПараметрыПолучения. Содержат значения переданных параметров получения файла + Перем ИмяСервера, ИмяПользователя, Пароль, Порт, + ЗащищенноеСоединение,ПассивноеСоединение, + ПустьКФайлуНаСервере, Протокол; + + URLРазделенный = РазделитьURL(URL); + + ИмяСервера = URLРазделенный.ИмяСервера; + ПустьКФайлуНаСервере = URLРазделенный.ПустьКФайлуНаСервере; + Протокол = ?(URLРазделенный.Протокол=Неопределено, "", URLРазделенный.Протокол); + + ЗащищенноеСоединение = НастройкаСоединения.Получить("ЗащищенноеСоединение"); + ПассивноеСоединение = НастройкаСоединения.Получить("ПассивноеСоединение"); + + ИмяПользователя = НастройкаСоединения.Получить("Пользователь"); + ПарольПользователя = НастройкаСоединения.Получить("Пароль"); + Порт = НастройкаСоединения.Получить("Порт"); + + Если Не ЗначениеЗаполнено(URLРазделенный.Протокол) Тогда + Если ЗащищенноеСоединение <> Неопределено Тогда + Если ЗащищенноеСоединение Тогда + Протокол = "https"; + Иначе + Протокол = "http"; + КонецЕсли; + ИначеЕсли ПассивноеСоединение <> Неопределено Тогда + Если ПассивноеСоединение Тогда + Протокол = "ftp"; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Протокол = ?(ЗначениеЗаполнено(Протокол), Протокол, "http"); + + Прокси = ?(Прокси = Неопределено, Неопределено, СформироватьПрокси(Прокси, Протокол)); + + Если Протокол = "ftp" Тогда + Попытка + Соединение = Новый FTPСоединение(ИмяСервера, Порт, ИмяПользователя, ПарольПользователя, Прокси, ПассивноеСоединение); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + СообщениеОбОшибке = НСтр("ru = 'Ошибка при создании FTP-соединения с сервером %1:'") + Символы.ПС + "%2"; + ПолучениеФайловИзИнтернета.ЗаписатьОшибкуВЖурналРегистрации( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + Возврат СформироватьРезультат(Ложь, СообщениеОбОшибке); + КонецПопытки; + Иначе + Попытка + Соединение = Новый HTTPСоединение(ИмяСервера, Порт, ИмяПользователя, ПарольПользователя, Прокси, ЗащищенноеСоединение); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + СообщениеОбОшибке = НСтр("ru = 'Ошибка при создании HTTP-соединения с сервером %1:'") + Символы.ПС + "%2"; + ПолучениеФайловИзИнтернета.ЗаписатьОшибкуВЖурналРегистрации( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + Возврат СформироватьРезультат(Ложь, СообщениеОбОшибке); + КонецПопытки; + КонецЕсли; + + Если НастройкаСохранения["Путь"] <> Неопределено Тогда + ПутьДляСохранения = НастройкаСохранения["Путь"]; + Иначе +#Если НЕ ВебКлиент Тогда + ПутьДляСохранения = ПолучитьИмяВременногоФайла(); +#КонецЕсли + КонецЕсли; + + Попытка + Соединение.Получить(ПустьКФайлуНаСервере, ПутьДляСохранения); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + СообщениеОбОшибке = НСтр("ru = 'Ошибка при получении файла с сервера %1:'") + Символы.ПС + "%2"; + ПолучениеФайловИзИнтернета.ЗаписатьОшибкуВЖурналРегистрации( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + Возврат СформироватьРезультат(Ложь, СообщениеОбОшибке); + КонецПопытки; + + // Если сохраняем файл в соответствии с настройкой + Если НастройкаСохранения["МестоХранения"] = "ВременноеХранилище" Тогда + КлючУникальности = Новый УникальныйИдентификатор; + Адрес = ПоместитьВоВременноеХранилище (ПутьДляСохранения, КлючУникальности); + Возврат СформироватьРезультат(Истина, Адрес); + ИначеЕсли НастройкаСохранения["МестоХранения"] = "Клиент" + ИЛИ НастройкаСохранения["МестоХранения"] = "Сервер" Тогда + Возврат СформироватьРезультат(Истина, ПутьДляСохранения); + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +// Функция формирует прокси по настройкам прокси (передаваемому параметру) +// +// Параметры: +// +// Прокси - Соответствие - +// ключи: +// НеИспользоватьПроксиДляЛокальныхАдресов - строка - +// Сервер - адрес прокси-сервера +// Порт - порт прокси-сервера +// Пользователь - имя пользователя для авторизации на прокси-сервере +// Пароль - пароль пользователя +// Протокол - строка - протокол для которого устанавливаются параметры прокси сервера +// например "http", "https", "ftp" +// +Функция СформироватьПрокси(НастройкиПрокси, Протокол) + + Прокси = Новый ИнтернетПрокси; + Прокси.НеИспользоватьПроксиДляЛокальныхАдресов = НастройкиПрокси["НеИспользоватьПроксиДляЛокальныхАдресов"]; + Прокси.Установить(Протокол, НастройкиПрокси["Сервер"], НастройкиПрокси["Порт"]); + Прокси.Пользователь = НастройкиПрокси["Пользователь"]; + Прокси.Пароль = НастройкиПрокси["Пароль"]; + + Возврат Прокси; + +КонецФункции + +// Разделяем URL по составным частям (протокол, сервер и путь) +// Параметры: +// URL - строка - правильный url к ресурсу в Интернет +// +// Возвращаемое значение: +// структура с полями: +// протокол - строка - протокол доступа к ресурсу +// ИмяСервера - строка - сервер на котором располагается ресурс +// ПустьКФайлуНаСервере - строка - пусть к файлу на сервере +// +Функция РазделитьURL(знач URL) + + Результат = Новый Структура; + + // протокол по умолчанию + Протокол = "http"; + + URL = СокрЛП(URL); + + Если Лев(URL, 5) = "ftp://" Тогда + URL = Прав(URL, СтрДлина(URL) - 7); + КонецЕсли; + + Если Лев(URL, 7) = "http://" Тогда + URL = Прав(URL, СтрДлина(URL) - 7); + Протокол = "http"; + КонецЕсли; + + Если Лев(URL, 8) = "https://" Тогда + URL = Прав(URL, СтрДлина(URL) - 8); + Протокол = "https"; + КонецЕсли; + + Индекс = 1; + ИмяСервера = ""; + + Пока Индекс < СтрДлина(URL) Цикл + _Символ = Сред(URL, Индекс, 1); + Если _Символ = "/" Тогда + Прервать; + КонецЕсли; + ИмяСервера = ИмяСервера + _Символ; + Индекс = Индекс + 1; + КонецЦикла; + + ПустьКФайлу = Прав(URL, СтрДлина(URL) - Индекс); + + Результат.Вставить("ИмяСервера", ИмяСервера); + Результат.Вставить("ПустьКФайлуНаСервере", ПустьКФайлу); + Результат.Вставить("Протокол", Протокол); + + Возврат Результат; + +КонецФункции + +// Функция, заполняющая структуру по параметрам. +// +// Параметры: +// УспехОперации - булево - успех или неуспех операции +// СообщениеПуть - строка - +// +// Возвращаемое значение: +// стуктура : +// поле успех - булево +// поле путь - строка +// +Функция СформироватьРезультат(знач Статус, знач СообщениеПуть) + + Результат = Новый Структура("Статус"); + + Результат.Статус = Статус; + + Если Статус Тогда + Результат.Вставить("Путь", СообщениеПуть); + Иначе + Результат.Вставить("СообщениеОбОшибке", СообщениеПуть); + КонецЕсли; + + Возврат Результат; + +КонецФункции diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/ПолучениеФайловИзИнтернетаКлиентСервер.mdo b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/ПолучениеФайловИзИнтернетаКлиентСервер.mdo new file mode 100644 index 000000000..b15676fa4 --- /dev/null +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/ПолучениеФайловИзИнтернетаКлиентСервер.mdo @@ -0,0 +1,12 @@ + + + ПолучениеФайловИзИнтернетаКлиентСервер + + ru + Получение файлов из интернета клиент сервер + + true + true + true + true + diff --git a/SSL/src/CommonModules/Пользователи/Module.bsl b/SSL/src/CommonModules/Пользователи/Module.bsl new file mode 100644 index 000000000..cf99d73f8 --- /dev/null +++ b/SSL/src/CommonModules/Пользователи/Module.bsl @@ -0,0 +1,1190 @@ + +// Функция АвторизованныйПользователь возвращает +// текущего пользователя сеанса. +// +// Возвращаемое значение: +// СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи. +// +Функция АвторизованныйПользователь() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Возврат ?(ЗначениеЗаполнено(ПараметрыСеанса.ТекущийПользователь), ПараметрыСеанса.ТекущийПользователь, ПараметрыСеанса.ТекущийВнешнийПользователь); + +КонецФункции + +// Функция ЭтоПолноправныйПользовательИБ проверяет, +// является ли полноправным текущий пользователь ИБ или +// пользователь ИБ заданного пользователя (обычного или внешнего). +// +// Полноправными считается: +// а) пользователь ИБ при пустом списке пользователей ИБ, +// если основная роль не задана или ПолныеПрава, +// б) пользователь ИБ с ролью ПолныеПрава. +// +// +// Параметры: +// Пользователь - Неопределено (проверяется текущий пользователь ИБ), +// Справочник.Пользователи, Справочник.ВнешниеПользователи +// (осуществляется поиск пользователя ИБ по уникальному +// идентификатору, заданному в реквизите ИдентификаторПользователяИБ, +// если пользователь ИБ не найден, возвращается Ложь). +// +// Возвращаемое значение: +// Булево. +// +Функция ЭтоПолноправныйПользовательИБ(Пользователь = Неопределено) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Если ЗначениеЗаполнено(Пользователь) И Пользователь <> АвторизованныйПользователь() Тогда + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ОбщегоНазначения.ПолучитьЗначениеРеквизита(Пользователь, "ИдентификаторПользователяИБ")); + Если ПользовательИБ = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + Иначе + ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь(); + КонецЕсли; + + Если ПользовательИБ.УникальныйИдентификатор = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор Тогда + + Если ЗначениеЗаполнено(ПользовательИБ.Имя) Тогда + + Возврат РольДоступна("ПолныеПрава") ИЛИ ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор).Роли.Содержит(Метаданные.Роли.ПолныеПрава); + Иначе + // Авторизован пустой пользователь - список пользователей пуст, + // если основная роль пустая - все права разрешены. + Если Метаданные.ОсновнаяРоль = Неопределено ИЛИ + Метаданные.ОсновнаяРоль = Метаданные.Роли.ПолныеПрава Тогда + + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; + КонецЕсли; + Иначе + Возврат ПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава); + КонецЕсли; + +КонецФункции + +// Проверить, что запуск программы выполнен от имени внешнего пользователя +// и выбросить исключение в этом случае. +// +// Параметры +// ТекстСообщения - Строка - текст исключения. Если не задан, +// используется текст по умолчанию. +// +// Пример использования: +// ПрерватьВыполнениеЕслиАвторизованВнешнийПользователь(); +// ... далее располагается фрагмент кода, который рассчитывает только на выполнение +// из-под "обычного" пользователя. +// +Процедура ПрерватьВыполнениеЕслиАвторизованВнешнийПользователь(Знач ТекстСообщения = "") Экспорт + + УстановитьПривилегированныйРежим(Истина); + Если НЕ ЗначениеЗаполнено(ПараметрыСеанса.ТекущийПользователь) Тогда + ТекстИсключения = ТекстСообщения; + Если ПустаяСтрока(ТекстИсключения) Тогда + ТекстИсключения = НСтр("ru = 'Данная операция не доступна внешнему пользователю системы.'"); + КонецЕсли; + ВызватьИсключение ТекстИсключения; + КонецЕсли; + +КонецПроцедуры + +// Функция ПолноеИмяНеУказанногоПользователя возвращает +// представление не указанного пользователя, т.е. когда +// список пользователей пуст. +// +// Возвращаемое значение: +// Строка. +// +Функция ПолноеИмяНеУказанногоПользователя() Экспорт + + Возврат НСтр("ru = '<Не указан>'"); + +КонецФункции + +// Функция СоздатьПервогоАдминистратора используется +// при обновлении и начальном заполнении информационной базы +// При использовании подсистемы УправлениеДоступом +// первый администратор будет автоматически включен +// в группу доступа Администраторы (если действие встроено) +// +// Параметры: +// УчетнаяЗапись - ПользовательИнформационнойБазы - используется +// когда нужно создать первого администратора из уже имеющегося +// пользователя ИБ (см. функцию Пользователи.ОшибкаАвторизации()) +// +Процедура СоздатьПервогоАдминистратора(УчетнаяЗапись = Неопределено) Экспорт + + // Добавление администратора (администратор системы - полные права). + + Если УчетнаяЗапись = Неопределено Тогда + УчетнаяЗапись = ПользователиИнформационнойБазы.НайтиПоИмени("Администратор"); + Если УчетнаяЗапись = Неопределено Тогда + УчетнаяЗапись = ПользователиИнформационнойБазы.СоздатьПользователя(); + КонецЕсли; + КонецЕсли; + УчетнаяЗапись.Имя = "Администратор"; + УчетнаяЗапись.ПолноеИмя = УчетнаяЗапись.Имя; + УчетнаяЗапись.Роли.Очистить(); + УчетнаяЗапись.Роли.Добавить(Метаданные.Роли.ПолныеПрава); + УчетнаяЗапись.Записать(); + + Если ПользовательПоИдентификаторуСуществует(УчетнаяЗапись.УникальныйИдентификатор) Тогда + Пользователь = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", УчетнаяЗапись.УникальныйИдентификатор); + // Если администратор связан с внешним пользователем - это ошибка, требуется очистить связь + Если НЕ ЗначениеЗаполнено(Пользователь) Тогда + ВнешнийПользователь = Справочники.ВнешниеПользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", УчетнаяЗапись.УникальныйИдентификатор); + ВнешнийПользовательОбъект = ВнешнийПользователь.ПолучитьОбъект(); + ВнешнийПользовательОбъект.ОбменДанными.Загрузка = Истина; + ВнешнийПользовательОбъект.Записать(); + КонецЕсли; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(Пользователь) Тогда + Пользователь = Справочники.Пользователи.НайтиПоНаименованию(УчетнаяЗапись.Имя); + Если ЗначениеЗаполнено(Пользователь) + И ЗначениеЗаполнено(Пользователь.ИдентификаторПользователяИБ) + И Пользователь.ИдентификаторПользователяИБ <> УчетнаяЗапись.УникальныйИдентификатор + И ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Пользователь.ИдентификаторПользователяИБ) <> Неопределено Тогда + Пользователь = Неопределено; + КонецЕсли; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(Пользователь) Тогда + Пользователь = Справочники.Пользователи.СоздатьЭлемент(); + Иначе + Пользователь = Пользователь.ПолучитьОбъект(); + КонецЕсли; + Пользователь.ИдентификаторПользователяИБ = УчетнаяЗапись.УникальныйИдентификатор; + Пользователь.Наименование = УчетнаяЗапись.ПолноеИмя; + Пользователь.Записать(); + + ПользователиПереопределяемый.ПриЗаписиПервогоАдминистратора(Пользователь.Ссылка); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Интерфейсные процедуры и функции + +// Функция СформироватьДанныеВыбораПользователя возвращает список +// пользователей, групп пользователей, внешних пользователей и групп внешних пользователей +// не помеченных на удаление. +// Используется в обработчиках событий ОкончаниеВводаТекста и АвтоПодбор. +// +// Параметры: +// Текст - Строка, символы введенные пользователем. +// ВключаяГруппы - Булево, если Истина, включать группы пользователей и внешних пользователей. +// ВключаяВнешнихПользователей - Неопределено, Ложь, Истина, +// когда Неопределено, взять значение ВнешниеПользователи.ИспользоватьВнешнихПользователей(). +// БезПользователей - Булево, если Истина, то элементы справочника Пользователи исключаются из результата. +// +Функция СформироватьДанныеВыбораПользователя(Знач Текст, Знач ВключаяГруппы = Истина, Знач ВключаяВнешнихПользователей = Неопределено, БезПользователей = Ложь) Экспорт + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Текст", Текст + "%"); + Запрос.УстановитьПараметр("ВключаяГруппы", ВключаяГруппы); + Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор", Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) КАК Ссылка, + | """" КАК Наименование, + | -1 КАК НомерКартинки + |ГДЕ + | ЛОЖЬ"; + + Если НЕ БезПользователей Тогда + Запрос.Текст = Запрос.Текст + " ОБЪЕДИНИТЬ ВСЕ " + + "ВЫБРАТЬ + | Пользователи.Ссылка, + | Пользователи.Наименование, + | ВЫБОР + | КОГДА Пользователи.ИдентификаторПользователяИБ = &ПустойУникальныйИдентификатор + | ТОГДА 4 + | ИНАЧЕ 1 + | КОНЕЦ КАК НомерКартинки + |ИЗ + | Справочник.Пользователи КАК Пользователи + |ГДЕ + | (НЕ Пользователи.ПометкаУдаления) + | И Пользователи.Наименование ПОДОБНО &Текст + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ГруппыПользователей.Ссылка, + | ГруппыПользователей.Наименование, + | 3 + |ИЗ + | Справочник.ГруппыПользователей КАК ГруппыПользователей + |ГДЕ + | &ВключаяГруппы + | И (НЕ ГруппыПользователей.ПометкаУдаления) + | И ГруппыПользователей.Наименование ПОДОБНО &Текст"; + КонецЕсли; + + Если ТипЗнч(ВключаяВнешнихПользователей) <> Тип("Булево") Тогда + ВключаяВнешнихПользователей = ВнешниеПользователи.ИспользоватьВнешнихПользователей(); + КонецЕсли; + ВключаяВнешнихПользователей = ВключаяВнешнихПользователей И ПравоДоступа("Чтение", Метаданные.Справочники.ВнешниеПользователи); + + Если ВключаяВнешнихПользователей Тогда + Запрос.Текст = Запрос.Текст + " ОБЪЕДИНИТЬ ВСЕ " + + "ВЫБРАТЬ + | ВнешниеПользователи.Ссылка, + | ВнешниеПользователи.Наименование, + | ВЫБОР + | КОГДА ВнешниеПользователи.ИдентификаторПользователяИБ = &ПустойУникальныйИдентификатор + | ТОГДА 10 + | ИНАЧЕ 7 + | КОНЕЦ КАК НомерКартинки + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + |ГДЕ + | (НЕ ВнешниеПользователи.ПометкаУдаления) + | И ВнешниеПользователи.Наименование ПОДОБНО &Текст + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ГруппыВнешнихПользователей.Ссылка, + | ГруппыВнешнихПользователей.Наименование, + | 9 + |ИЗ + | Справочник.ГруппыВнешнихПользователей КАК ГруппыВнешнихПользователей + |ГДЕ + | &ВключаяГруппы + | И (НЕ ГруппыВнешнихПользователей.ПометкаУдаления) + | И ГруппыВнешнихПользователей.Наименование ПОДОБНО &Текст"; + КонецЕсли; + + ДанныеВыбора = Новый СписокЗначений; + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + + ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование, , БиблиотекаКартинок["ПиктограммыПользователя" + Формат(Выборка.НомерКартинки + 1, "ЧЦ=2; ЧВН=; ЧГ=")]); + КонецЦикла; + + Возврат ДанныеВыбора; + +КонецФункции + +// Процедура ЗаполнитьНомераКартинокПользователей заполняет номера картинок +// пользователей, групп пользователей, внешних пользователей и групп внешних пользователей. +// +// Параметры: +// Таблица - ДанныеФормыКоллекция. +// ИмяПоляПользователь - Строка, имя поля содержащего ссылку на пользователя, группу пользователей, +// внешнего пользователя или группу внешних пользователей. +// ИмяПоляНомераКартинки - Строка, имя поля содержащего номер картинки, который нужно установить. +// ИдентификаторСтроки - Неопределено, Число, идентификатор строки (не порядковый номер), +// когда Неопределено, заполнить картинки для всех строк таблицы. +// +Процедура ЗаполнитьНомераКартинокПользователей(Таблица, ИмяПоляПользователь, ИмяПоляНомераКартинки, ИдентификаторСтроки = Неопределено) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос(СтрЗаменить( + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | Пользователи.#ИмяПоляПользователь КАК Пользователь + |ПОМЕСТИТЬ Пользователи + |ИЗ + | &Пользователи КАК Пользователи + |; + | + |ВЫБРАТЬ + | Пользователи.Пользователь, + | ВЫБОР + | КОГДА Пользователи.Пользователь = Неопределено + | ТОГДА -1 + | КОГДА ТИПЗНАЧЕНИЯ(Пользователи.Пользователь) = ТИП(Справочник.Пользователи) + | ТОГДА ВЫБОР + | КОГДА Пользователи.Пользователь.ПометкаУдаления + | ТОГДА 0 + | ИНАЧЕ ВЫБОР + | КОГДА Пользователи.Пользователь.ИдентификаторПользователяИБ = &ПустойУникальныйИдентификатор + | ТОГДА 4 + | ИНАЧЕ 1 + | КОНЕЦ + | КОНЕЦ + | КОГДА ТИПЗНАЧЕНИЯ(Пользователи.Пользователь) = ТИП(Справочник.ГруппыПользователей) + | ТОГДА ВЫБОР + | КОГДА Пользователи.Пользователь.ПометкаУдаления + | ТОГДА 2 + | ИНАЧЕ 3 + | КОНЕЦ + | КОГДА ТИПЗНАЧЕНИЯ(Пользователи.Пользователь) = ТИП(Справочник.ВнешниеПользователи) + | ТОГДА ВЫБОР + | КОГДА Пользователи.Пользователь.ПометкаУдаления + | ТОГДА 6 + | ИНАЧЕ ВЫБОР + | КОГДА Пользователи.Пользователь.ИдентификаторПользователяИБ = &ПустойУникальныйИдентификатор + | ТОГДА 10 + | ИНАЧЕ 7 + | КОНЕЦ + | КОНЕЦ + | КОГДА ТИПЗНАЧЕНИЯ(Пользователи.Пользователь) = ТИП(Справочник.ГруппыВнешнихПользователей) + | ТОГДА ВЫБОР + | КОГДА Пользователи.Пользователь.ПометкаУдаления + | ТОГДА 8 + | ИНАЧЕ 9 + | КОНЕЦ + | ИНАЧЕ -2 + | КОНЕЦ КАК НомерКартинки + |ИЗ + | Пользователи КАК Пользователи", "#ИмяПоляПользователь", ИмяПоляПользователь)); + Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор", Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); + + Если ИдентификаторСтроки = Неопределено Тогда + + Запрос.УстановитьПараметр("Пользователи", Таблица.Выгрузить(, ИмяПоляПользователь)); + НомераКартинок = Запрос.Выполнить().Выгрузить(); + + Для каждого Строка Из Таблица Цикл + Строка[ИмяПоляНомераКартинки] = НомераКартинок.Найти(Строка[ИмяПоляПользователь], "Пользователь").НомерКартинки; + КонецЦикла; + Иначе + Строка = Таблица.НайтиПоИдентификатору(ИдентификаторСтроки); + МассивСтрок = Новый Массив; + МассивСтрок.Добавить(Строка); + Запрос.УстановитьПараметр("Пользователи", Таблица.Выгрузить(МассивСтрок, ИмяПоляПользователь)); + НомераКартинок = Запрос.Выполнить().Выгрузить(); + + Строка[ИмяПоляНомераКартинки] = НомераКартинок.Найти(Строка[ИмяПоляПользователь], "Пользователь").НомерКартинки; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры подсистемы для внутренних нужд + +// Функция ПрочитатьПользователяИБ считывает свойства пользователя +// информационной базы по строковому или уникальному идентификатору. +// +// Параметры: +// Идентификатор - Неопределено, Строка, УникальныйИдентификатор (идентификатор пользователя). +// Свойства - Структура: +// ПользовательИнфБазыУникальныйИдентификатор - УникальныйИдентификатор +// ПользовательИнфБазыИмя - Строка +// ПользовательИнфБазыПолноеИмя - Строка +// +// ПользовательИнфБазыАутентификацияСтандартная - Булево +// ПользовательИнфБазыПоказыватьВСпискеВыбора - Булево +// ПользовательИнфБазыПароль - Неопределено +// ПользовательИнфБазыСохраняемоеЗначениеПароля - Строка +// ПользовательИнфБазыПарольУстановлен - Булево +// ПользовательИнфБазыЗапрещеноИзменятьПароль - Булево +// +// ПользовательИнфБазыАутентификацияОС - Булево +// ПользовательИнфБазыПользовательОС - Строка +// +// ПользовательИнфБазыОсновнойИнтерфейс - Строка (имя интерфейса из коллекции Метаданные.Интерфейсы) +// ПользовательИнфБазыРежимЗапуска - Строка (значения: "Авто", "ОбычноеПриложение", "УправляемоеПриложение") +// ПользовательИнфБазыЯзык - Строка (имя языка из коллекции Метаданные.Языки) +// +// Роли - Массив значений типа Строка (имена ролей из коллекции Метаданные.Роли) +// +// ОписаниеОшибки - Строка, содержит описание ошибки, если чтение не удалось. +// +// Возвращаемое значение: +// Булево, +// если Истина - успех, иначе отказ, см. ОписаниеОшибки. +// +Функция ПрочитатьПользователяИБ(Знач Идентификатор, Свойства = Неопределено, Роли = Неопределено, ОписаниеОшибки = "", ПользовательИБ = Неопределено) Экспорт + + // Подготовка структур возвращаемых данных + Свойства = Новый Структура; + Свойства.Вставить("ПользовательИнфБазыУникальныйИдентификатор", Новый УникальныйИдентификатор); + Свойства.Вставить("ПользовательИнфБазыИмя", ""); + Свойства.Вставить("ПользовательИнфБазыПолноеИмя", ""); + Свойства.Вставить("ПользовательИнфБазыАутентификацияСтандартная", Ложь); + Свойства.Вставить("ПользовательИнфБазыПоказыватьВСпискеВыбора", Ложь); + Свойства.Вставить("ПользовательИнфБазыПароль", Неопределено); + Свойства.Вставить("ПользовательИнфБазыСохраняемоеЗначениеПароля", ""); + Свойства.Вставить("ПользовательИнфБазыПарольУстановлен", Ложь); + Свойства.Вставить("ПользовательИнфБазыЗапрещеноИзменятьПароль", Ложь); + Свойства.Вставить("ПользовательИнфБазыАутентификацияОС", Ложь); + Свойства.Вставить("ПользовательИнфБазыПользовательОС", ""); + Свойства.Вставить("ПользовательИнфБазыОсновнойИнтерфейс", ?(Метаданные.ОсновнойИнтерфейс = Неопределено, "", Метаданные.ОсновнойИнтерфейс.Имя)); + Свойства.Вставить("ПользовательИнфБазыРежимЗапуска", "Авто"); + Свойства.Вставить("ПользовательИнфБазыЯзык", ?(Метаданные.ОсновнойЯзык = Неопределено, "", Метаданные.ОсновнойЯзык.Имя)); + + Роли = Новый Массив; + + Если ТипЗнч(Идентификатор) = Тип("УникальныйИдентификатор") Тогда + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Идентификатор); + ИначеЕсли ТипЗнч(Идентификатор) = Тип("Строка") Тогда + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(Идентификатор); + Иначе + ПользовательИБ = Неопределено; + КонецЕсли; + + Если ПользовательИБ = Неопределено Тогда + ОписаниеОшибки = СтрЗаменить(НСтр("ru = 'Пользователь информационной базы ""%1""' не найден!"), "%1", Идентификатор); + Возврат Ложь; + КонецЕсли; + + Свойства.ПользовательИнфБазыУникальныйИдентификатор = ПользовательИБ.УникальныйИдентификатор; + Свойства.ПользовательИнфБазыИмя = ПользовательИБ.Имя; + Свойства.ПользовательИнфБазыПолноеИмя = ПользовательИБ.ПолноеИмя; + Свойства.ПользовательИнфБазыАутентификацияСтандартная = ПользовательИБ.АутентификацияСтандартная; + Свойства.ПользовательИнфБазыПоказыватьВСпискеВыбора = ПользовательИБ.ПоказыватьВСпискеВыбора; + Свойства.ПользовательИнфБазыСохраняемоеЗначениеПароля = ПользовательИБ.СохраняемоеЗначениеПароля; + Свойства.ПользовательИнфБазыПарольУстановлен = ПользовательИБ.ПарольУстановлен; + Свойства.ПользовательИнфБазыЗапрещеноИзменятьПароль = ПользовательИБ.ЗапрещеноИзменятьПароль; + Свойства.ПользовательИнфБазыАутентификацияОС = ПользовательИБ.АутентификацияОС; + Свойства.ПользовательИнфБазыПользовательОС = ПользовательИБ.ПользовательОС; + Свойства.ПользовательИнфБазыОсновнойИнтерфейс = ?(ПользовательИБ.ОсновнойИнтерфейс = Неопределено, "", ПользовательИБ.ОсновнойИнтерфейс.Имя); + Свойства.ПользовательИнфБазыРежимЗапуска = ?(ПользовательИБ.РежимЗапуска = РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение, + "ОбычноеПриложение", + ?(ПользовательИБ.РежимЗапуска = РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение, + "УправляемоеПриложение", + "Авто")); + Свойства.ПользовательИнфБазыЯзык = ?(ПользовательИБ.Язык = Неопределено, "", ПользовательИБ.Язык.Имя); + + Для каждого Роль Из ПользовательИБ.Роли Цикл + Роли.Добавить(Роль.Имя); + КонецЦикла; + + Возврат Истина; + +КонецФункции + +// Функция ЗаписатьПользователяИБ +// либо перезаписывает свойства пользователяИБ, +// найденного по строковому или уникальному идентификатору, +// либо создает нового пользователяИБ, когда задано создать, +// при этом, если пользовательИБ найден будет ошибка +// +// Параметры: +// Идентификатор - Строка, УникальныйИдентификатор (идентификатор пользователя). +// НовыеСвойства - Структура (свойство может быть не задано, +// тогда используется прочитанное или начальное значение) +// ПользовательИнфБазыУникальныйИдентификатор - Неопределено (задается после записи пользователя ИБ) +// ПользовательИнфБазыИмя - Неопределено, Строка +// ПользовательИнфБазыПолноеИмя - Неопределено, Строка +// +// ПользовательИнфБазыАутентификацияСтандартная - Неопределено, Булево +// ПользовательИнфБазыПоказыватьВСпискеВыбора - Неопределено, Булево +// ПользовательИнфБазыПароль - Неопределено, Строка +// ПользовательИнфБазыСохраняемоеЗначениеПароля - Неопределено, Строка +// ПользовательИнфБазыПарольУстановлен - Неопределено, Булево +// ПользовательИнфБазыЗапрещеноИзменятьПароль - Неопределено, Булево +// +// ПользовательИнфБазыАутентификацияОС - Неопределено, Булево +// ПользовательИнфБазыПользовательОС - Неопределено, Строка +// +// ПользовательИнфБазыОсновнойИнтерфейс - Неопределено, Строка (имя интерфейса из коллекции Метаданные.Интерфейсы) +// ПользовательИнфБазыРежимЗапуска - Неопределено, Строка (значения: "Авто", "ОбычноеПриложение", "УправляемоеПриложение") +// ПользовательИнфБазыЯзык - Неопределено, Строка (имя языка из коллекции Метаданные.Языки) +// +// НовыеРоли - Неопределено, Массив значений типа Строка (имена ролей из коллекции Метаданные.Роли) +// +// ОписаниеОшибки - Строка, содержит описание ошибки, если чтение не удалось. +// +// Возвращаемое значение: +// Булево, +// если Истина - успех, иначе отказ, см. ОписаниеОшибки. +// +Функция ЗаписатьПользователяИБ(Знач Идентификатор, Знач НовыеСвойства, Знач НовыеРоли, Знач СоздатьНового = Ложь, ОписаниеОшибки = "") Экспорт + + ПользовательИБ = Неопределено; + СтарыеСвойства = Неопределено; + СтарыеРоли = Неопределено; + Свойства = Неопределено; + Роли = Неопределено; + + ПредварительноеЧтение = ПрочитатьПользователяИБ(Идентификатор, СтарыеСвойства, СтарыеРоли, ОписаниеОшибки); + + Если НЕ ПрочитатьПользователяИБ(Идентификатор, Свойства, Роли, ОписаниеОшибки, ПользовательИБ) ИЛИ НЕ ПредварительноеЧтение Тогда + + Если СоздатьНового Тогда + ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя(); + Иначе + Возврат Ложь; + КонецЕсли; + ИначеЕсли СоздатьНового Тогда + ОписаниеОшибки = СтрЗаменить(НСтр("ru = 'Невозможно создать пользователя информационной базы ""%1"" + |так как он уже существует!'"), "%1", Идентификатор); + Возврат Ложь; + КонецЕсли; + + // Подготовка новых значений свойств + Для каждого КлючИЗначение Из Свойства Цикл + Если НовыеСвойства.Свойство(КлючИЗначение.Ключ) И НовыеСвойства[КлючИЗначение.Ключ] <> Неопределено Тогда + Свойства[КлючИЗначение.Ключ] = НовыеСвойства[КлючИЗначение.Ключ]; + КонецЕсли; + КонецЦикла; + + Если НовыеРоли <> Неопределено Тогда + Роли = НовыеРоли; + КонецЕсли; + + // Установка новых значений свойств + + ПользовательИБ.Имя = Свойства.ПользовательИнфБазыИмя; + ПользовательИБ.ПолноеИмя = Свойства.ПользовательИнфБазыПолноеИмя; + ПользовательИБ.АутентификацияСтандартная = Свойства.ПользовательИнфБазыАутентификацияСтандартная; + ПользовательИБ.ПоказыватьВСпискеВыбора = Свойства.ПользовательИнфБазыПоказыватьВСпискеВыбора; + Если Свойства.ПользовательИнфБазыПароль <> Неопределено Тогда + ПользовательИБ.Пароль = Свойства.ПользовательИнфБазыПароль; + КонецЕсли; + ПользовательИБ.ЗапрещеноИзменятьПароль = Свойства.ПользовательИнфБазыЗапрещеноИзменятьПароль; + ПользовательИБ.АутентификацияОС = Свойства.ПользовательИнфБазыАутентификацияОС; + ПользовательИБ.ПользовательОС = Свойства.ПользовательИнфБазыПользовательОС; + Если ЗначениеЗаполнено(Свойства.ПользовательИнфБазыОсновнойИнтерфейс) Тогда + ПользовательИБ.ОсновнойИнтерфейс = Метаданные.Интерфейсы[Свойства.ПользовательИнфБазыОсновнойИнтерфейс]; + Иначе + ПользовательИБ.ОсновнойИнтерфейс = Неопределено; + КонецЕсли; + Если ЗначениеЗаполнено(Свойства.ПользовательИнфБазыРежимЗапуска) Тогда + ПользовательИБ.РежимЗапуска = РежимЗапускаКлиентскогоПриложения[Свойства.ПользовательИнфБазыРежимЗапуска]; + КонецЕсли; + Если ЗначениеЗаполнено(Свойства.ПользовательИнфБазыЯзык) Тогда + ПользовательИБ.Язык = Метаданные.Языки[Свойства.ПользовательИнфБазыЯзык]; + Иначе + ПользовательИБ.Язык = Неопределено; + КонецЕсли; + + ПользовательИБ.Роли.Очистить(); + Для каждого Роль Из Роли Цикл + ПользовательИБ.Роли.Добавить(Метаданные.Роли[Роль]); + КонецЦикла; + + // Добавление роли ПолныеПрава, при попытке создать первого пользователя с пустым списком ролей + Если ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() = 0 И + НЕ ПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава) Тогда + + ПользовательИБ.Роли.Добавить(Метаданные.Роли.ПолныеПрава); + КонецЕсли; + + // Попытка записи нового или измененного пользователяИБ + Попытка + ПользовательИБ.Записать(); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + Если ИнформацияОбОшибке.Причина = Неопределено Тогда + ОписаниеОшибки = ИнформацияОбОшибке.Описание; + Иначе + ОписаниеОшибки = ИнформацияОбОшибке.Причина.Описание; + КонецЕсли; + ОписаниеОшибки = НСтр("ru = 'Ошибка при записи пользователя информационной базы:'") + Символы.ПС + ОписаниеОшибки; + Возврат Ложь; + КонецПопытки; + + НовыеСвойства.ПользовательИнфБазыУникальныйИдентификатор = ПользовательИБ.УникальныйИдентификатор; + + ПользователиПереопределяемый.ПриЗаписиПользователяИнформационнойБазы(СтарыеСвойства, Свойства); + + Возврат Истина; + +КонецФункции + +// Функция удаляет пользователя информационной базы +// по строковому или уникальному идентификатору. +// +// Параметры: +// ОписаниеОшибки - Строка, содержит описание ошибки, если чтение не удалось. +// +// Возвращаемое значение: +// Булево, +// если Истина - успех, иначе отказ, см. ОписаниеОшибки. +// +Функция УдалитьПользователяИБ(Знач Идентификатор, ОписаниеОшибки = "") Экспорт + + ПользовательИБ = Неопределено; + Свойства = Неопределено; + Роли = Неопределено; + + Если НЕ ПрочитатьПользователяИБ(Идентификатор, Свойства, Роли, ОписаниеОшибки, ПользовательИБ) Тогда + Возврат Ложь; + Иначе + Попытка + ПользовательИБ.Удалить(); + Исключение + ОписаниеОшибки = НСтр("ru = 'Ошибка при удалении пользователя информационной базы:'") + Символы.ПС + ИнформацияОбОшибке().Причина.Описание; + Возврат Ложь; + КонецПопытки; + КонецЕсли; + + ПользователиПереопределяемый.ПослеУдаленияПользователяИнформационнойБазы(Свойства); + + Возврат Истина; + +КонецФункции + +// Функция проверяет существования пользователя информационной базы +// Параметры +// Идентификатор - УникальныйИдентификатор, Строка +// УИД пользователяИБ или Имя пользователяИБ +// +// Возвращаемое значение: +// Булево +// +Функция ПользовательИБСуществует(Знач Идентификатор) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Если ТипЗнч(Идентификатор) = Тип("УникальныйИдентификатор") Тогда + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Идентификатор); + Иначе + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(Идентификатор); + КонецЕсли; + + Если ПользовательИБ = Неопределено Тогда + Возврат Ложь; + Иначе + Возврат Истина; + КонецЕсли; + +КонецФункции + +// Процедура, определяет пользователя, под которым запущен сеанс и пытается +// найти соответсвие ему в справочнике Пользователи. Если соответствие +// не найдено - создается новый элемент. Параметр сеанса ТекущийПользователь +// устанавливается как ссылка на найденный (созданный) элемент справочника. +// +Процедура ОпределитьТекущегоПользователя(Знач ИмяПараметра, УстановленныеПараметры) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Если ИмяПараметра <> "ТекущийПользователь" И ИмяПараметра <> "ТекущийВнешнийПользователь" Тогда + Возврат; + КонецЕсли; + + ПользовательНеНайден = Ложь; + СоздатьПользователя = Ложь; + + Если ПустаяСтрока(ПользователиИнформационнойБазы.ТекущийПользователь().Имя) Тогда + + Если ЭтоПолноправныйПользовательИБ() Тогда + ПараметрыСеанса.ТекущийВнешнийПользователь = Справочники.ВнешниеПользователи.ПустаяСсылка(); + + ИмяПользователя = ПолноеИмяНеУказанногоПользователя(); + ПолноеИмяПользователя = ПолноеИмяНеУказанногоПользователя(); + + Запрос = Новый Запрос; + Запрос.Текст = " + |ВЫБРАТЬ ПЕРВЫЕ 1 + | Пользователи.Ссылка КАК Ссылка + |ИЗ + | Справочник.Пользователи КАК Пользователи + |ГДЕ + | Пользователи.Наименование = &ПолноеИмяПользователя"; + + Запрос.Параметры.Вставить("ПолноеИмяПользователя", ПолноеИмяПользователя); + + Результат = Запрос.Выполнить(); + + Если Результат.Пустой() Тогда + ПользовательНеНайден = Истина; + СоздатьПользователя = Истина; + ИдентификаторПользователяИБ = ""; + Иначе + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + ПараметрыСеанса.ТекущийПользователь = Выборка.Ссылка; + КонецЕсли; + Иначе + ПользовательНеНайден = Истина; + КонецЕсли; + Иначе + ИдентификаторПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор; + + Запрос = Новый Запрос; + Запрос.Параметры.Вставить("ИдентификаторПользователяИБ ", ИдентификаторПользователяИБ); + + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | Пользователи.Ссылка КАК Ссылка + |ИЗ + | Справочник.Пользователи КАК Пользователи + |ГДЕ + | Пользователи.ИдентификаторПользователяИБ = &ИдентификаторПользователяИБ"; + РезультатПользователи = Запрос.Выполнить(); + + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ВнешниеПользователи.Ссылка КАК Ссылка + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + |ГДЕ + | ВнешниеПользователи.ИдентификаторПользователяИБ = &ИдентификаторПользователяИБ"; + РезультатВнешниеПользователи = Запрос.Выполнить(); + + Если НЕ РезультатВнешниеПользователи.Пустой() Тогда + + Выборка = РезультатВнешниеПользователи.Выбрать(); + Выборка.Следующий(); + ПараметрыСеанса.ТекущийПользователь = Справочники.Пользователи.ПустаяСсылка(); + ПараметрыСеанса.ТекущийВнешнийПользователь = Выборка.Ссылка; + + Если НЕ ВнешниеПользователи.ИспользоватьВнешнихПользователей() Тогда + + ТекстСообщенияОбОшибке = НСтр("ru = 'Внешние пользователи отключены!'"); + ВызватьИсключение ТекстСообщенияОбОшибке; + КонецЕсли; + Иначе + ПараметрыСеанса.ТекущийВнешнийПользователь = Справочники.ВнешниеПользователи.ПустаяСсылка(); + + Если РезультатПользователи.Пустой() Тогда + Если ЭтоПолноправныйПользовательИБ() Тогда + + ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь(); + ИмяПользователя = ТекущийПользователь.Имя; + ПолноеИмяПользователя = ТекущийПользователь.ПолноеИмя; + ИдентификаторПользователяИБ = ТекущийПользователь.УникальныйИдентификатор; + ПользовательПоНаименованию = СсылкаПользователяПоПолномуНаименованию(ПолноеИмяПользователя); + + Если ПользовательПоНаименованию = Неопределено Тогда + ПользовательНеНайден = Истина; + СоздатьПользователя = Истина; + Иначе + ПараметрыСеанса.ТекущийПользователь = ПользовательПоНаименованию; + КонецЕсли; + Иначе + ПользовательНеНайден = Истина; + КонецЕсли; + Иначе + Выборка = РезультатПользователи.Выбрать(); + Выборка.Следующий(); + ПараметрыСеанса.ТекущийПользователь = Выборка.Ссылка; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если СоздатьПользователя Тогда + СсылкаНового = Справочники.Пользователи.ПолучитьСсылку(); + ПараметрыСеанса.ТекущийПользователь = СсылкаНового; + + НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент(); + НовыйПользователь.ИдентификаторПользователяИБ = ИдентификаторПользователяИБ; + НовыйПользователь.Наименование = ПолноеИмяПользователя; + НовыйПользователь.УстановитьСсылкуНового(СсылкаНового); + + Попытка + НовыйПользователь.Записать(); + Исключение + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Авторизация не выполнена. + |Пользователь: %1 не найден в справочнике ""Пользователи"". + | + |Обратитесь к администратору. + |Возникла ошибка при добавлении пользователя в справочник. + |%2'"), + ИмяПользователя, + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) ); + ВызватьИсключение ТекстСообщенияОбОшибке; + КонецПопытки; + + ИначеЕсли ПользовательНеНайден Тогда + ВызватьИсключение ТекстСообщенияПользовательНеНайденВСправочнике(ИмяПользователя); + КонецЕсли; + + УстановленныеПараметры.Добавить(ИмяПараметра); + +КонецПроцедуры + +Функция ПользовательПоИдентификаторуСуществует(УникальныйИдентификатор, СсылкаНаТекущего = Неопределено) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | Справочник.Пользователи КАК Пользователи + |ГДЕ + | Пользователи.ИдентификаторПользователяИБ = &УникальныйИдентификатор + | И Пользователи.Ссылка <> &СсылкаНаТекущего + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ИСТИНА + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + |ГДЕ + | ВнешниеПользователи.ИдентификаторПользователяИБ = &УникальныйИдентификатор + | И ВнешниеПользователи.Ссылка <> &СсылкаНаТекущего"; + Запрос.УстановитьПараметр("СсылкаНаТекущего", СсылкаНаТекущего); + Запрос.УстановитьПараметр("УникальныйИдентификатор", УникальныйИдентификатор); + + Возврат НЕ Запрос.Выполнить().Пустой(); + +КонецФункции + +Функция ПользовательИБНеЗанят(знач ИмяПользователя) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя); + + Если ПользовательИБ = Неопределено Тогда + Возврат Истина; + КонецЕсли; + + Если ПользовательПоИдентификаторуСуществует(ПользовательИБ.УникальныйИдентификатор) Тогда + Возврат Ложь; + Иначе + Возврат Истина; + КонецЕсли + +КонецФункции + +// Процедура ОбновитьСоставГруппПользователей обновляет в регистре сведений +// "Состав групп пользователей" соответствие групп пользователей и пользователей +// с учетом иерархии групп пользователей (родитель включает пользователей порожденных групп). +// Эти данные требуются для формы списка и формы выбора пользователей. +// Данные регистра могут быть применены в других целях для повышения производительности, +// т.к. не требуется работать с иерархией на языке запросов. +// +// Параметры: +// ГруппаПользователей - СправочникСсылка.ГруппыПользователей +// +Процедура ОбновитьСоставГруппПользователей(Знач ГруппаПользователей) Экспорт + + Если НЕ ЗначениеЗаполнено(ГруппаПользователей) Тогда + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + // Подготовка групп родителей. + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ТаблицаГруппРодителей.Родитель, + | ТаблицаГруппРодителей.Ссылка + |ПОМЕСТИТЬ ТаблицаГруппРодителей + |ИЗ + | &ТаблицаГруппРодителей КАК ТаблицаГруппРодителей"); + Запрос.УстановитьПараметр("ТаблицаГруппРодителей", ТаблицаГруппРодителей("Справочник.ГруппыПользователей")); + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + Запрос.Выполнить(); + + ИзмененныеПользователи = Новый ТаблицаЗначений; + ИзмененныеПользователи.Колонки.Добавить("Пользователь", Новый ОписаниеТипов("СправочникСсылка.Пользователи")); + ИзмененныеГруппыПользователей = Новый ТаблицаЗначений; + ИзмененныеГруппыПользователей.Колонки.Добавить("ГруппаПользователей", Новый ОписаниеТипов("СправочникСсылка.ГруппыПользователей")); + ИзмененныеГруппыПользователей.Индексы.Добавить("ГруппаПользователей"); + + // Выполнение для текущий группы и каждой группы-родителя. + Пока НЕ ГруппаПользователей.Пустая() Цикл + + Запрос.УстановитьПараметр("ГруппаПользователей", ГруппаПользователей); + + Если ГруппаПользователей <> Справочники.ГруппыПользователей.ВсеПользователи Тогда + // Удаление связей для удаленных пользователей. + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | СоставГруппПользователей.Пользователь + |ИЗ + | РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаГруппРодителей КАК ТаблицаГруппРодителей + | ПО (ТаблицаГруппРодителей.Ссылка = ГруппыПользователейСостав.Ссылка) + | И (ТаблицаГруппРодителей.Родитель = &ГруппаПользователей) + | ПО (СоставГруппПользователей.ГруппаПользователей = &ГруппаПользователей) + | И СоставГруппПользователей.Пользователь = ГруппыПользователейСостав.Пользователь + |ГДЕ + | СоставГруппПользователей.ГруппаПользователей = &ГруппаПользователей + | И ГруппыПользователейСостав.Ссылка ЕСТЬ NULL "; + ПользователиУдаленныеИзГруппы = Запрос.Выполнить().Выбрать(); + МенеджерЗаписи = РегистрыСведений.СоставГруппПользователей.СоздатьМенеджерЗаписи(); + Пока ПользователиУдаленныеИзГруппы.Следующий() Цикл + МенеджерЗаписи.ГруппаПользователей = ГруппаПользователей; + МенеджерЗаписи.Пользователь = ПользователиУдаленныеИзГруппы.Пользователь; + МенеджерЗаписи.Удалить(); + Если ИзмененныеГруппыПользователей.Найти(ГруппаПользователей, "ГруппаПользователей") = Неопределено Тогда + ИзмененныеГруппыПользователей.Добавить().ГруппаПользователей = ГруппаПользователей; + КонецЕсли; + ИзмененныеПользователи.Добавить().Пользователь = ПользователиУдаленныеИзГруппы.Пользователь; + КонецЦикла; + КонецЕсли; + + // Добавление связей для добавленных пользователей. + Если ГруппаПользователей = Справочники.ГруппыПользователей.ВсеПользователи Тогда + Запрос.Текст = + "ВЫБРАТЬ + | ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи) КАК ГруппаПользователей, + | Пользователи.Ссылка КАК Пользователь + |ИЗ + | Справочник.Пользователи КАК Пользователи + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + | ПО (СоставГруппПользователей.ГруппаПользователей = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи)) + | И (СоставГруппПользователей.Пользователь = Пользователи.Ссылка) + |ГДЕ + | СоставГруппПользователей.Пользователь ЕСТЬ NULL "; + Иначе + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | &ГруппаПользователей КАК ГруппаПользователей, + | ГруппыПользователейСостав.Пользователь + |ИЗ + | Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаГруппРодителей КАК ТаблицаГруппРодителей + | ПО (ТаблицаГруппРодителей.Ссылка = ГруппыПользователейСостав.Ссылка) + | И (ТаблицаГруппРодителей.Родитель = &ГруппаПользователей) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + | ПО (СоставГруппПользователей.ГруппаПользователей = &ГруппаПользователей) + | И (СоставГруппПользователей.Пользователь = ГруппыПользователейСостав.Пользователь) + |ГДЕ + | СоставГруппПользователей.Пользователь ЕСТЬ NULL "; + КонецЕсли; + ПользователиДобавленныеВГруппу = Запрос.Выполнить().Выгрузить(); + Если ПользователиДобавленныеВГруппу.Количество() > 0 Тогда + НаборЗаписей = РегистрыСведений.СоставГруппПользователей.СоздатьНаборЗаписей(); + НаборЗаписей.Загрузить(ПользователиДобавленныеВГруппу); + НаборЗаписей.Записать(Ложь); // Добавление недостающих записей связей. + Для каждого ОписаниеПользователя Из ПользователиДобавленныеВГруппу Цикл + Если ИзмененныеГруппыПользователей.Найти(ГруппаПользователей, "ГруппаПользователей") = Неопределено Тогда + ИзмененныеГруппыПользователей.Добавить().ГруппаПользователей = ГруппаПользователей; + КонецЕсли; + ИзмененныеПользователи.Добавить().Пользователь = ОписаниеПользователя.Пользователь; + КонецЦикла; + КонецЕсли; + + ГруппаПользователей = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ГруппаПользователей, "Родитель"); + КонецЦикла; + +КонецПроцедуры + +// Функция ТаблицаГруппРодителей используется в процедурах ОбновитьСоставГруппПользователей, +// ОбновитьСоставГруппВнешнихПользователей. +// +Функция ТаблицаГруппРодителей(Таблица) Экспорт + + // Подготовка состава групп родителей. + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ГруппыТаблицы.Ссылка, + | ГруппыТаблицы.Родитель + |ИЗ + | " + Таблица + " КАК ГруппыТаблицы"); + ТаблицаЭлементов = Запрос.Выполнить().Выгрузить(); + ТаблицаЭлементов.Индексы.Добавить("Родитель"); + ТаблицаГруппРодителей = ТаблицаЭлементов.Скопировать(Новый Массив); + + Для каждого ОписаниеЭлемента Из ТаблицаЭлементов Цикл + ОписаниеГруппыРодителя = ТаблицаГруппРодителей.Добавить(); + ОписаниеГруппыРодителя.Родитель = ОписаниеЭлемента.Ссылка; + ОписаниеГруппыРодителя.Ссылка = ОписаниеЭлемента.Ссылка; + ЗаполнитьГруппыРодителя(ОписаниеЭлемента.Ссылка, ОписаниеЭлемента.Ссылка, ТаблицаЭлементов, ТаблицаГруппРодителей); + КонецЦикла; + + Возврат ТаблицаГруппРодителей; + +КонецФункции + +Процедура ЗаполнитьГруппыРодителя(Знач Родитель, Знач ТекущийРодитель, Знач ТаблицаЭлементов, Знач ТаблицаРодителей) + + ОписанияГруппРодителя = ТаблицаЭлементов.НайтиСтроки(Новый Структура("Родитель", ТекущийРодитель)); + Для каждого ОписаниеГруппы Из ОписанияГруппРодителя Цикл + ОписаниеГруппыРодителя = ТаблицаРодителей.Добавить(); + ОписаниеГруппыРодителя.Родитель = Родитель; + ОписаниеГруппыРодителя.Ссылка = ОписаниеГруппы.Ссылка; + ЗаполнитьГруппыРодителя(Родитель, ОписаниеГруппы.Ссылка, ТаблицаЭлементов, ТаблицаРодителей); + КонецЦикла; + +КонецПроцедуры + +// Процедура вызывается при начале работы системы +// чтобы проверить возможность выполнения авторизации +// и вызвать заполнение значений параметров сеанса +// ТекущийПользователь и ВнешнийПользователь +// +Функция ОшибкаАвторизации() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Если ПустаяСтрока(ПользователиИнформационнойБазы.ТекущийПользователь().Имя) + ИЛИ ПользовательПоИдентификаторуСуществует(ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор) Тогда + // Авторизуется пользователь по умолчанию + // или пользовательИБ найден в справочнике + Возврат ""; + КонецЕсли; + + // Требуется, либо создать первого администратора, либо сообщить об отказе авторизации + + ТекстСообщенияОбОшибке = ""; + ТребуетсяСоздатьПервогоАдминистратора = Ложь; + + ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); + Если ПользователиИБ.Количество() = 1 Тогда + ТребуетсяСоздатьПервогоАдминистратора = Истина; + + ИначеЕсли Не ПравоДоступа("Администрирование", Метаданные, ПользователиИнформационнойБазы.ТекущийПользователь()) Тогда + // Авторизуется обычный пользователь, созданный в конфигураторе + ТекстСообщенияОбОшибке = ТекстСообщенияПользовательНеНайденВСправочнике(ПользователиИнформационнойБазы.ТекущийПользователь().Имя); + Иначе + // Авторизуется дополнительный администратор, созданный в конфигураторе + РабочийАдминистратор = Неопределено; + Для каждого ПользовательИБ Из ПользователиИБ Цикл + Если ПравоДоступа("Администрирование", Метаданные, ПользовательИБ) + И ПользовательПоИдентификаторуСуществует(ПользовательИБ.УникальныйИдентификатор) Тогда + + РабочийАдминистратор = ПользовательИБ; + Прервать; + КонецЕсли; + КонецЦикла; + + Если РабочийАдминистратор = Неопределено Тогда + // Требуется создать/восстановить администратора + ТребуетсяСоздатьПервогоАдминистратора = Истина; + Иначе + ТекстСообщенияОбОшибке = ТекстСообщенияАдминистраторНеНайденВСправочнике(ПользователиИнформационнойБазы.ТекущийПользователь().Имя, РабочийАдминистратор.Имя) + КонецЕсли; + КонецЕсли; + + Если ТребуетсяСоздатьПервогоАдминистратора Тогда + ТекстСообщенияОбОшибке = НСтр("ru = 'Обнаружено, что пользователь информационной базы + |с правом Администрирование был создан в Конфигураторе: + | + |- пользователю установлена роль ПолныеПрава, + |- пользователь переименован в Администратор, + |- пользователь зарегистрирован в справочнике Пользователи. + | + |Пользователей информационной базы следует создавать в режиме 1С:Предприятия. + | + |Работа системы будет завершена. + |Требуется повторно запустить 1С:Предприятие.'"); + + СоздатьПервогоАдминистратора(ПользователиИнформационнойБазы.ТекущийПользователь()); + ПользователиПереопределяемый.ТекстПредупрежденияПослеЗаписиПервогоАдминистратора(ТекстСообщенияОбОшибке); + + ИначеЕсли НЕ ЗначениеЗаполнено(ТекстСообщенияОбОшибке) Тогда + Попытка + АвторизованныйПользователь(); + Исключение + ТекстСообщенияОбОшибке = ТекстСообщенияОбОшибке + Символы.ПС + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + КонецЕсли; + + Возврат ТекстСообщенияОбОшибке; + +КонецФункции + +Функция ТекстСообщенияПользовательНеНайденВСправочнике(ИмяПользователя) + + Если ВнешниеПользователи.ИспользоватьВнешнихПользователей() Тогда + ТекстСообщенияОбОшибке = НСтр("ru = 'Авторизация не выполнена. Работа системы будет завершена. + | + |Пользователь ""%1"" не найден в справочниках + |""Пользователи"" и ""Внешние пользователи"". + | + |Обратитесь к администратору.'"); + Иначе + ТекстСообщенияОбОшибке = НСтр("ru = 'Авторизация не выполнена. Работа системы будет завершена. + | + |Пользователь ""%1"" не найден в справочнике ""Пользователи"". + | + |Обратитесь к администратору.'"); + КонецЕсли; + + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщенияОбОшибке, ИмяПользователя); + + Возврат ТекстСообщенияОбОшибке; + +КонецФункции + +Функция ТекстСообщенияАдминистраторНеНайденВСправочнике(ИмяАдминистратора, ИмяРабочегоАдминистратора) + + ТекстСообщенияОбОшибке = НСтр("ru = 'Авторизация не выполнена. Работа системы будет завершена. + | + |Администратор ""%1"" не найден в справочнике ""Пользователи"". + | + |Пользователей информационной базы следует создавать в режиме 1С:Предприятия. + |Обратитесь, например, к администратору ""%2"".'"); + + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщенияОбОшибке, ИмяАдминистратора, ИмяРабочегоАдминистратора); + + Возврат ТекстСообщенияОбОшибке; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры-обработчики обновления данных подсистемы + +Функция СсылкаПользователяПоПолномуНаименованию(ПолноеИмя) + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ Ссылка КАК Ссылка + |ИЗ + | Справочник.Пользователи КАК Пользователи + |ГДЕ + | Пользователи.Наименование = &ПолноеИмя"; + Запрос.УстановитьПараметр("ПолноеИмя", ПолноеИмя); + + РезультатЗапроса = Запрос.Выполнить(); + + Если РезультатЗапроса.Пустой() Тогда + Возврат Неопределено; + КонецЕсли; + + Выборка = РезультатЗапроса.Выбрать(); + Выборка.Следующий(); + + Пользователь = Выборка.Ссылка; + + Если ПользовательИБНеЗанят(Пользователь.ИдентификаторПользователяИБ) Тогда + Возврат Пользователь; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +// Процедура вызывается при обновлении конфигурации на версию 1.0.5.2 +// Выполняет попытку сопоставления / заполнения реквизита "ИдентификаторПользователяИБ" +// для каждого элемента справочника Пользователи. +// +Процедура ЗаполнитьИдентификаторыПользователей() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + СписокПользователей = Справочники.Пользователи.Выбрать(); + + ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); + + Пока СписокПользователей.Следующий() Цикл + Пользователь = СписокПользователей.Ссылка; + Если Не ЗначениеЗаполнено(Пользователь.ИдентификаторПользователяИБ) + И НРег(СокрЛП(Пользователь.Наименование)) <> НРег(ПолноеИмяНеУказанногоПользователя()) Тогда + ПолноеИмяПользователя = СокрЛП(Пользователь.Наименование); + Для Каждого ПользовательИБ Из ПользователиИБ Цикл + Если ПолноеИмяПользователя = СокрЛП(Лев(ПользовательИБ.ПолноеИмя, Метаданные.Справочники.Пользователи.ДлинаНаименования)) + И Не ПользовательПоИдентификаторуСуществует(ПользовательИБ.УникальныйИдентификатор) Тогда + ОбъектПользователь = Пользователь.ПолучитьОбъект(); + ОбъектПользователь.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор; + ОбъектПользователь.Записать(); + Продолжить; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Процедура вызывается при обновлении конфигурации на версию 1.0.5.12 +// Выполняется перезапись всех пользователей. +// Возможен вызов с любой версии начиная с 1.0.5.12. +// +Процедура ЗаполнениеРегистраСоставГруппПользователей() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Выборка = Справочники.Пользователи.Выбрать(); + Пока Выборка.Следующий() Цикл + + Объект = Выборка.ПолучитьОбъект(); + Объект.Записать(); + + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/Пользователи/Пользователи.mdo b/SSL/src/CommonModules/Пользователи/Пользователи.mdo new file mode 100644 index 000000000..a788af6c8 --- /dev/null +++ b/SSL/src/CommonModules/Пользователи/Пользователи.mdo @@ -0,0 +1,10 @@ + + + Пользователи + + ru + Пользователи + + true + true + diff --git a/SSL/src/CommonModules/ПользователиКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПользователиКлиентПереопределяемый/Module.bsl new file mode 100644 index 000000000..75266cd9d --- /dev/null +++ b/SSL/src/CommonModules/ПользователиКлиентПереопределяемый/Module.bsl @@ -0,0 +1,12 @@ + +// Обработчик события ТекстВопросаПередЗаписьюПервогоАдминистратора вызывается +// из формы пользователя в обработчике перед записью, +// чтобы изменить текст вопроса пользователю, +// например, для подсистемы УправлениеДоступом. +// Вызов происходит, если установлен ЗапретРедактированияРолей +// и количество пользователей информационной базы равно нулю. +// +Процедура ТекстВопросаПередЗаписьюПервогоАдминистратора(ТекстВопроса) Экспорт + + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ПользователиКлиентПереопределяемый/ПользователиКлиентПереопределяемый.mdo b/SSL/src/CommonModules/ПользователиКлиентПереопределяемый/ПользователиКлиентПереопределяемый.mdo new file mode 100644 index 000000000..70d41cec8 --- /dev/null +++ b/SSL/src/CommonModules/ПользователиКлиентПереопределяемый/ПользователиКлиентПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + ПользователиКлиентПереопределяемый + + ru + Пользователи клиент переопределяемый + + true + true + diff --git a/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl new file mode 100644 index 000000000..155301ae5 --- /dev/null +++ b/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl @@ -0,0 +1,94 @@ + + +// Функция ЗапретРедактированияРолей используется для +// управления поведением подсистем Пользователи и ВнешниеПользователи, +// когда требуется переключится в режим автоустановки ролей пользователей ИБ, +// например, при встраивании подсистемы УправлениеДоступом. +// +// Возвращаемое значение: +// Булево. +// +Функция ЗапретРедактированияРолей() Экспорт + + Возврат Ложь; + +КонецФункции + +// Процедура ИзменитьДействияВФорме позволяет переопределить +// поведение форм пользователя, внешнего пользователя, группы внешних пользователей +// когда это требуется, например, при встараивании подсистемы "Управление доступом". +// +// Параметры: +// Ссылка - СправочникСсылка.Пользователи, +// СправочникСсылка.ВнешниеПользователи, +// СправочникСсылка.ГруппыВнешнихПользователей +// ссылка на пользователя, внешнего пользователя или группу внешних пользователей +// при создании формы. +// +// ДействияВФорме - Структура (со свойствами типа Строка): +// Роли = "", "Просмотр", "Редактирование" +// КонтактнаяИнформация = "", "Просмотр", "Редактирование" +// СвойстваПользователяИБ = "", "ПросмотрВсех", "РедактированиеВсех", РедактированиеСвоих" +// СвойстваЭлемента = "", "Просмотр", "Редактирование" +// +// Для групп внешних пользователей КонтактнаяИнформация и СвойстваПользователяИБ не существуют. +// +Процедура ИзменитьДействияВФорме(Знач Ссылка = Неопределено, Знач ДействияВФорме) Экспорт + +КонецПроцедуры + +// Обработчик события ПриЗаписи пользователя информационной базы +// вызывается из процедуры ЗаписатьПользователяИБ(), если пользователь +// был действительно записан. +// +// Параметры: +// СтарыеСвойства - Структура, см. параметры возвращаемые функцией Пользователи.ПрочитатьПользователяИБ() +// НовыеСвойства - Структура, см. параметры возвращаемые функцией Пользователи.ЗаписатьПользователяИБ() +// +Процедура ПриЗаписиПользователяИнформационнойБазы(Знач СтарыеСвойства, Знач НовыеСвойства) Экспорт + + +КонецПроцедуры + +// Обработчик события ПослеУдаления пользователя информационной базы +// вызывается из процедуры УдалитьПользователяИБ(), если пользователь +// был действительно удален. +// +// Параметры: +// СтарыеСвойства - Структура, см. параметры возвращаемые функцией Пользователи.ПрочитатьПользователяИБ() +// +Процедура ПослеУдаленияПользователяИнформационнойБазы(Знач СтарыеСвойства) Экспорт + + + +КонецПроцедуры + +// Обработчик события ПриЗаписиПервогоАдминистратора вызывается +// из формы пользователя в обработчике ПриЗаписиНаСервере, +// из функции Пользователи.ОшибкаАвторизации() при авторизации администратора, +// когда нет ни одного администратора зарегистрированного в справочнике Пользователи +// Это нужно, например, для подсистемы УправлениеДоступом, +// чтобы добавить первого администратора в группу доступа Администраторы +// +// Параметры: +// Пользователь - СправочникСсылка.Пользователи (изменение объекта запрещено) +// +Процедура ПриЗаписиПервогоАдминистратора(Пользователь) Экспорт + + +КонецПроцедуры + +// Обработчик события ТекстПредупрежденияПослеЗаписиПервогоАдминистратора вызывается +// из функции Пользователи.ОшибкаАвторизации() при авторизации администратора, +// когда нет ни одного администратора зарегистрированного в справочнике Пользователи +// Это нужно, например, для подсистемы УправлениеДоступом, +// чтобы сообщить, что первый администратор добавлен в группу доступа Администраторы +// +// Параметры: +// ТекстПредупреждения - Строка +// +Процедура ТекстПредупрежденияПослеЗаписиПервогоАдминистратора(ТекстПредупреждения) Экспорт + + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ПользователиПереопределяемый/ПользователиПереопределяемый.mdo b/SSL/src/CommonModules/ПользователиПереопределяемый/ПользователиПереопределяемый.mdo new file mode 100644 index 000000000..2f8f265b4 --- /dev/null +++ b/SSL/src/CommonModules/ПользователиПереопределяемый/ПользователиПереопределяемый.mdo @@ -0,0 +1,9 @@ + + + ПользователиПереопределяемый + + ru + Пользователи переопределяемый + + true + diff --git a/SSL/src/CommonModules/ПользователиСерверПовтИсп/Module.bsl b/SSL/src/CommonModules/ПользователиСерверПовтИсп/Module.bsl new file mode 100644 index 000000000..ea0012c01 --- /dev/null +++ b/SSL/src/CommonModules/ПользователиСерверПовтИсп/Module.bsl @@ -0,0 +1,116 @@ + +// Функция ДеревоПодсистем() возвращает дерево значений имен всех подсистем конфигурации. +// +// Возвращаемое значение: +// ДеревоЗначений +// ПолноеИмя - Строка, например, <Имя родительской подсистемы>.<Имя подсистемы> +// Имя - Строка. +// Синоним - Строка. +// +Функция ДеревоПодсистем() Экспорт + + Дерево = Новый ДеревоЗначений; + Дерево.Колонки.Добавить("ПолноеИмя", Новый ОписаниеТипов("Строка")); + Дерево.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(1000))); + Дерево.Колонки.Добавить("Синоним", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(1000))); + + ЗаполнитьПодсистемы(Дерево.Строки); + + Возврат Дерево; + +КонецФункции + +// Функция ВсеРоли() возвращает таблицу значений имен всех ролей конфигурации. +// +// Параметры: +// ТолькоИменаРолей - Булево. Если ложь возвращается доп. сведения: синонимы ролей, имена и синонимы подсистем. +// +// Возвращаемое значение: +// ТаблицаЗначений +// Имя - Строка. +// // Если ТолькоИменаРолей = Ложь, тогда: +// Синоним - Строка. +// ИменаПодсистем - Строка, например, "СтандартныеПодсистемы, СтандартныеПодсистемы.БазоваяФункциональность". +// СинонимыПодсистем - Строка, например, "Стандартные подсистемы, Стандартные подсистемы.Базовая функциональность". +// +Функция ВсеРоли(ТолькоИменаРолей = Ложь) Экспорт + + Таблица = Новый ТаблицаЗначений; + Таблица.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(1000))); + + Если НЕ ТолькоИменаРолей Тогда + Таблица.Колонки.Добавить("Синоним", Новый ОписаниеТипов("Строка")); + Таблица.Колонки.Добавить("ИменаПодсистем", Новый ОписаниеТипов("Строка")); + Таблица.Колонки.Добавить("СинонимыПодсистем", Новый ОписаниеТипов("Строка")); + КонецЕсли; + + Для каждого Роль Из Метаданные.Роли Цикл + + Строка = Таблица.Добавить(); + Строка.Имя = Роль.Имя; + + Если НЕ ТолькоИменаРолей Тогда + Строка.Синоним = Роль.Синоним; + ЗаполнитьПодсистемыРолей(Роль, Строка.ИменаПодсистем, Строка.СинонимыПодсистем); + КонецЕсли; + КонецЦикла; + + Возврат Таблица; + +КонецФункции + + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры модуля +//////////////////////////////////////////////////////////////////////////////// + +Процедура ЗаполнитьПодсистемы(КоллекцияСтрокДерева, Подсистемы = Неопределено, ИменаРодительскихПодсистем = "") + + Если Подсистемы = Неопределено Тогда + Подсистемы = Метаданные.Подсистемы; + КонецЕсли; + + Если ЗначениеЗаполнено(ИменаРодительскихПодсистем) Тогда + ИменаРодительскихПодсистем = ИменаРодительскихПодсистем + "."; + КонецЕсли; + + Для каждого Подсистема Из Подсистемы Цикл + + СтрокаДерева = КоллекцияСтрокДерева.Добавить(); + + СтрокаДерева.ПолноеИмя = ИменаРодительскихПодсистем + Подсистема.Имя; + + СтрокаДерева.Имя = Подсистема.Имя; + СтрокаДерева.Синоним = Подсистема.Синоним; + + ЗаполнитьПодсистемы(СтрокаДерева.Строки, Подсистема.Подсистемы, ИменаРодительскихПодсистем + Подсистема.Имя); + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаполнитьПодсистемыРолей(ОбъектМетаданных, ИменаПодсистем, СинонимыПодсистем, Подсистемы = Неопределено, ИменаРодительскихПодсистемы = "", СинонимыРодительскихПодсистемы = "") + + + Если Подсистемы = Неопределено Тогда + Подсистемы = Метаданные.Подсистемы; + КонецЕсли; + + Если ЗначениеЗаполнено(ИменаРодительскихПодсистемы) Тогда + ИменаРодительскихПодсистемы = ИменаРодительскихПодсистемы + "."; + СинонимыРодительскихПодсистемы = СинонимыРодительскихПодсистемы + "."; + КонецЕсли; + + Для каждого Подсистема Из Подсистемы Цикл + Если Подсистема.Состав.Содержит(ОбъектМетаданных) Тогда + Если ЗначениеЗаполнено(ИменаПодсистем) Тогда + ИменаПодсистем = ИменаПодсистем + ", "; + СинонимыПодсистем = СинонимыПодсистем + ", "; + КонецЕсли; + ИменаПодсистем = ИменаПодсистем + ИменаРодительскихПодсистемы + Подсистема.Имя; + СинонимыПодсистем = СинонимыПодсистем + СинонимыРодительскихПодсистемы + Подсистема.Синоним; + КонецЕсли; + ЗаполнитьПодсистемыРолей(ОбъектМетаданных, ИменаПодсистем, СинонимыПодсистем, Подсистема.Подсистемы, ИменаРодительскихПодсистемы + Подсистема.Имя, СинонимыРодительскихПодсистемы + Подсистема.Синоним); + КонецЦикла; + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ПользователиСерверПовтИсп/ПользователиСерверПовтИсп.mdo b/SSL/src/CommonModules/ПользователиСерверПовтИсп/ПользователиСерверПовтИсп.mdo new file mode 100644 index 000000000..b1ea65e6c --- /dev/null +++ b/SSL/src/CommonModules/ПользователиСерверПовтИсп/ПользователиСерверПовтИсп.mdo @@ -0,0 +1,11 @@ + + + ПользователиСерверПовтИсп + + ru + Пользователи сервер повт исп + + true + true + DuringSession + diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/Module.bsl new file mode 100644 index 000000000..6dd23c79d --- /dev/null +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/Module.bsl @@ -0,0 +1,168 @@ +//////////////////////////////////////////////////////////////////////////////// +// ФУНКЦИИ ФОРМИРОВАНИЯ НОМЕРА/КОДА ОБЪЕКТА ДЛЯ ВЫВОДА В ПЕЧАТНЫХ ФОРМАХ + +// Удаляет префикс информационной базы и префикс организации из переданной строки НомерОбъекта +// Переменная НомерОбъекта должна соответствовать шаблону: ООГГ-ХХХ...ХХ, где +// ОО - префикс организации; +// ГГ - префикс информационной базы; +// "-" - разделитель; +// ХХХ...ХХ - номер/код объекта. +// +// Параметры: +// НомерОбъекта - Строка - номер или код объекта из которого требуется удалить префиксы +// УдалитьПрефиксОрганизации - Булево (необязательный) - признак удаления префикса организации; по умолчанию равен Ложь; +// УдалитьПрефиксИнформационнойБазы - Булево (необязательный) - признак удаления префикса информационной базы; по умолчанию равен Ложь; +// +// Примеры: +// УдалитьПрефиксыИзНомераОбъекта("НФГЛ-000001234", Истина, Истина) = "000001234" +// УдалитьПрефиксыИзНомераОбъекта("НФГЛ-000001234", Ложь, Истина) = "НФ-000001234" +// УдалитьПрефиксыИзНомераОбъекта("НФГЛ-000001234", Истина, Ложь) = "ГЛ-000001234" +// УдалитьПрефиксыИзНомераОбъекта("НФГЛ-000001234", Ложь, Ложь) = "НФГЛ-000001234" +// +Функция УдалитьПрефиксыИзНомераОбъекта(Знач НомерОбъекта, УдалитьПрефиксОрганизации = Ложь, УдалитьПрефиксИнформационнойБазы = Ложь) Экспорт + + // изначально пустая строка префикса номера объекта + ПрефиксОбъекта = ""; + + ПрефиксОрганизации = Лев(НомерОбъекта, 2); + ПрефиксИнформационнойБазы = Сред(НомерОбъекта, 3, 2); + + // добавляем префикс организации + Если Не УдалитьПрефиксОрганизации Тогда + + ПрефиксОбъекта = ПрефиксОбъекта + ПрефиксОрганизации; + + КонецЕсли; + + // добавляем префикс информационной базы + Если Не УдалитьПрефиксИнформационнойБазы Тогда + + ПрефиксОбъекта = ПрефиксОбъекта + ПрефиксИнформационнойБазы; + + КонецЕсли; + + Если Не ПустаяСтрока(ПрефиксОбъекта) Тогда + + ПрефиксОбъекта = ПрефиксОбъекта + "-"; + + КонецЕсли; + + Возврат ПрефиксОбъекта + Сред(НомерОбъекта, 6); +КонецФункции + +// Удаляет лидирующие нули из номера объекта +// Переменная НомерОбъекта должна соответствовать шаблону: ООГГ-ХХХ...ХХ, где +// ОО - префикс организации; +// ГГ - префикс информационной базы; +// "-" - разделитель; +// ХХХ...ХХ - номер/код объекта. +// +// Параметры: +// НомерОбъекта - Строка - номер или код объекта из которого требуется лидирующие нули +// +Функция УдалитьЛидирующиеНулиИзНомераОбъекта(Знач НомерОбъекта) Экспорт + + Префикс = Лев(НомерОбъекта, 5); + ПользовательскийПрефикс = ПолучитьПользовательскийПрефикс(НомерОбъекта); + + Номер = Сред(НомерОбъекта, 6 + СтрДлина(ПользовательскийПрефикс)); + + // удаляем лидирующие нули слева в номере + Номер = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(Номер, "0"); + + Возврат Префикс + ПользовательскийПрефикс + Номер; +КонецФункции + +// Удаляет все пользовательские префиксы из номера объекта (все нецифровые символы) +// Переменная НомерОбъекта должна соответствовать шаблону: ООГГ-ХХХ...ХХ, где +// ОО - префикс организации; +// ГГ - префикс информационной базы; +// "-" - разделитель; +// ХХХ...ХХ - номер/код объекта. +// +// Параметры: +// НомерОбъекта - Строка - номер или код объекта из которого требуется лидирующие нули +// +Функция УдалитьПользовательскиеПрефиксыИзНомераОбъекта(Знач НомерОбъекта) Экспорт + + СтрокаЦифровыхСимволов = "0123456789"; + + Префикс = Лев(НомерОбъекта, 5); + НомерПолный = Сред(НомерОбъекта, 6); + + Номер = ""; + + Для Индекс = 1 По СтрДлина(НомерПолный) Цикл + + Символ = Сред(НомерПолный, Индекс, 1); + + Если Найти(СтрокаЦифровыхСимволов, Символ) > 0 Тогда + + Номер = Номер + Символ; + + КонецЕсли; + + КонецЦикла; + + Возврат Префикс + Номер; +КонецФункции + +// Получает пользовательский префикс номера/кода объекта +// Переменная НомерОбъекта должна соответствовать шаблону: ООГГ-ААХХ..ХХ, где +// ОО - префикс организации; +// ГГ - префикс информационной базы; +// "-" - разделитель; +// АА - пользовательский префикс; +// ХХ..ХХ - номер/код объекта. +// +// Параметры: +// НомерОбъекта - Строка - номер или код объекта из которого требуется получить пользовательский префикс +// +Функция ПолучитьПользовательскийПрефикс(Знач НомерОбъекта) Экспорт + + // возвращаемое значение функции (пользовательский префикс) + Результат = ""; + + НомерОбъекта = Сред(НомерОбъекта, 6); + + СтрокаЦифровыхСимволов = "0123456789"; + + Для Индекс = 1 По СтрДлина(НомерОбъекта) Цикл + + Символ = Сред(НомерОбъекта, Индекс, 1); + + Если Найти(СтрокаЦифровыхСимволов, Символ) > 0 Тогда + Прервать; + КонецЕсли; + + Результат = Результат + Символ; + + КонецЦикла; + + Возврат Результат; +КонецФункции + +// Получает номер документа для вывода на печать; из номера удаляются префиксы и лидирующие нули +// Функция: +// отбрасывает префикс организации, +// отбрасывает префикс информационной базы (опционально), +// отбрасывает пользовательские префиксы (опционально), +// удаляет лидирующие нули в номере объекта +// +Функция ПолучитьНомерНаПечать(Знач НомерОбъекта, УдалитьПрефиксИнформационнойБазы = Ложь, УдалитьПользовательскийПрефикс = Ложь) Экспорт + + // удаляем пользовательские префиксы из номера объекта + Если УдалитьПользовательскийПрефикс Тогда + + НомерОбъекта = УдалитьПользовательскиеПрефиксыИзНомераОбъекта(НомерОбъекта); + + КонецЕсли; + + // удаляем лидирующие нули из номера объекта + НомерОбъекта = УдалитьЛидирующиеНулиИзНомераОбъекта(НомерОбъекта); + + // удаляем префикс организации и префикс информационной базы из номера объекта + НомерОбъекта = УдалитьПрефиксыИзНомераОбъекта(НомерОбъекта, Истина, УдалитьПрефиксИнформационнойБазы); + + Возврат НомерОбъекта; +КонецФункции diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/ПрефиксацияОбъектовКлиентСервер.mdo b/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/ПрефиксацияОбъектовКлиентСервер.mdo new file mode 100644 index 000000000..649f7391c --- /dev/null +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/ПрефиксацияОбъектовКлиентСервер.mdo @@ -0,0 +1,13 @@ + + + ПрефиксацияОбъектовКлиентСервер + + ru + Префиксация объектов клиент сервер + + true + true + true + true + true + diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/Module.bsl new file mode 100644 index 000000000..1313c602b --- /dev/null +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/Module.bsl @@ -0,0 +1,34 @@ +// Возвращает признак наличия в конфигурации функциональной опции ПрефиксыОрганизаций. +// +// Возвращаемое значение: +// Булево - признак наличия в конфигурации функциональной опции с заданным именем. +// +Функция ЕстьФункциональнаяОпцияПрефиксыОрганизаций() Экспорт + Возврат ЕстьФункциональнаяОпция("ПрефиксыОрганизаций"); +КонецФункции + +// Возвращает признак наличия в конфигурации функциональной опции с заданным именем. +// +// Параметры: +// ИмяФункциональнойОпции - Строка - имя функциональной опции, наличие которой в конфигурации необходимо проверить. +// +// Возвращаемое значение: +// Булево - признак наличия в конфигурации функциональной опции ПрефиксИнформационнойБазы. +// +Функция ЕстьФункциональнаяОпцияПрефиксИнформационнойБазы() Экспорт + Возврат ЕстьФункциональнаяОпция("ПрефиксИнформационнойБазы"); +КонецФункции + +// Возвращает признак наличия в конфигурации функциональной опции с заданным именем. +// +// Параметры: +// ИмяФункциональнойОпции - Строка - имя функциональной опции, наличие которой необходимо проверить. +// +// Возвращаемое значение: +// Булево - признак наличия в конфигурации функциональной опции с заданным именем. +// +Функция ЕстьФункциональнаяОпция(ИмяФункциональнойОпции) + + Возврат Метаданные.ФункциональныеОпции.Найти(ИмяФункциональнойОпции) <> Неопределено; + +КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/ПрефиксацияОбъектовПовтИсп.mdo b/SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/ПрефиксацияОбъектовПовтИсп.mdo new file mode 100644 index 000000000..8a2523e4e --- /dev/null +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/ПрефиксацияОбъектовПовтИсп.mdo @@ -0,0 +1,13 @@ + + + ПрефиксацияОбъектовПовтИсп + + ru + Префиксация объектов повторное использование + + true + true + true + true + DuringSession + diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl new file mode 100644 index 000000000..58e8e685b --- /dev/null +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl @@ -0,0 +1,344 @@ +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ВНЕШНИЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Устанавливает префикс источника подписки в соответствии с префиксом организации. +// Источник подписки должен содержать +// обязательный реквизит шапки "Организация", тип: "СправочникСсылка.Организации" +// +// Параметры: +// Источник - Источник события подписки. +// Любой объект из множества [Справочник, Документ, План видов характеристик, Бизнес процесс, Задача] +// СтандартнаяОбработка - Булево - флаг стандартной обработки подписки +// Префикс - Строка - префикс объекта, который нужно изменить +// +Процедура УстановитьПрефиксОрганизации(Источник, СтандартнаяОбработка, Префикс) Экспорт + + УстановитьПрефикс(Источник, Префикс, Ложь, Истина); + +КонецПроцедуры + +// Устанавливает префикс источника подписки в соответствии с префиксом информационной базы. +// Ограничения на реквизиты источника не накладываются +// +// Параметры: +// Источник - Источник события подписки. +// Любой объект из множества [Справочник, Документ, План видов характеристик, Бизнес процесс, Задача] +// СтандартнаяОбработка - Булево - флаг стандартной обработки подписки +// Префикс - Строка - префикс объекта, который нужно изменить +// +Процедура УстановитьПрефиксИнформационнойБазы(Источник, СтандартнаяОбработка, Префикс) Экспорт + + УстановитьПрефикс(Источник, Префикс, Истина, Ложь); + +КонецПроцедуры + +// Устанавливает префикс источника подписки в соответствии с префиксом информационной базы и префиксом организации. +// Источник подписки должен содержать +// обязательный реквизит шапки "Организация", тип: "СправочникСсылка.Организации" +// +// Параметры: +// Источник - Источник события подписки. +// Любой объект из множества [Справочник, Документ, План видов характеристик, Бизнес процесс, Задача] +// СтандартнаяОбработка - Булево - флаг стандартной обработки подписки +// Префикс - Строка - префикс объекта, который нужно изменить +// +Процедура УстановитьПрефиксИнформационнойБазыИОрганизации(Источник, СтандартнаяОбработка, Префикс) Экспорт + + УстановитьПрефикс(Источник, Префикс, Истина, Истина); + +КонецПроцедуры + +// для справочников + +// Выполняет проверку модифицированности реквизита Организация элемента справочника +// Если реквизит Организация изменен, то Код элемента обнуляется. +// Это необходимо для назначения нового кода элементу +// +// Параметры: +// Источник - СправочникОбъект - источник события подписки +// Отказ - Булево - флаг отказа +// +Процедура ПроверитьКодСправочникаПоОрганизации(Источник, Отказ) Экспорт + + ПроверитьКодОбъектаПоОрганизации(Источник); + +КонецПроцедуры + +// для бизнес процессов + +// Выполняет проверку модифицированности Даты бизнес процесса +// Если дата не входит в предыдущий период, то номер бизнес процесса обнуляется. +// Это необходимо для назначения нового номера бизнес процессу +// +// Параметры: +// Источник - БизнесПроцессОбъект - источник события подписки +// Отказ - Булево - флаг отказа +// +Процедура ПроверитьНомерБизнесПроцессаПоДате(Источник, Отказ) Экспорт + + ПроверитьНомерОбъектаПоДате(Источник); + +КонецПроцедуры + +// Выполняет проверку модифицированности Даты и Организации бизнес процесса +// Если дата не входит в предыдущий период или изменен реквизит Организация, то номер бизнес процесса обнуляется. +// Это необходимо для назначения нового номера бизнес процессу +// +// Параметры: +// Источник - БизнесПроцессОбъект - источник события подписки +// Отказ - Булево - флаг отказа +// +Процедура ПроверитьНомерБизнесПроцессаПоДатеИОрганизации(Источник, Отказ) Экспорт + + ПроверитьНомерОбъектаПоДатеИОрганизации(Источник); + +КонецПроцедуры + +// для документов + +// Выполняет проверку модифицированности Даты документа +// Если дата не входит в предыдущий период, то номер документа обнуляется. +// Это необходимо для назначения нового номера документу +// +// Параметры: +// Источник - ДокументОбъект - источник события подписки +// Отказ - Булево - флаг отказа +// +Процедура ПроверитьНомерДокументаПоДате(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт + + ПроверитьНомерОбъектаПоДате(Источник); + +КонецПроцедуры + +// Выполняет проверку модифицированности Даты и Организации документа +// Если дата не входит в предыдущий период или изменен реквизит Организация, то номер документа обнуляется. +// Это необходимо для назначения нового номера документу +// +// Параметры: +// Источник - ДокументОбъект - источник события подписки +// Отказ - Булево - флаг отказа +// +Процедура ПроверитьНомерДокументаПоДатеИОрганизации(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт + + ПроверитьНомерОбъектаПоДатеИОрганизации(Источник); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +Процедура УстановитьПрефикс(Источник, Префикс, УстановитьПрефиксИнформационнойБазы, УстановитьПрефиксОрганизации) + + ПрефиксИнформационнойБазы = ""; + ПрефиксОрганизации = ""; + + // устанавливаем привилегированный режим + УстановитьПривилегированныйРежим(Истина); + + Если УстановитьПрефиксИнформационнойБазы + И ПрефиксацияОбъектовПовтИсп.ЕстьФункциональнаяОпцияПрефиксИнформационнойБазы() Тогда + + ПрефиксИнформационнойБазы = ПолучитьФункциональнуюОпцию("ПрефиксИнформационнойБазы"); + + ДополнитьСтрокуНулямиСлева(ПрефиксИнформационнойБазы, 2); + + КонецЕсли; + + Если УстановитьПрефиксОрганизации + И ПрефиксацияОбъектовПовтИсп.ЕстьФункциональнаяОпцияПрефиксыОрганизаций() Тогда + + ПрефиксОрганизации = ПолучитьФункциональнуюОпцию("ПрефиксыОрганизаций", Новый Структура("Организация", Источник.Организация)); + + // если задана пустая ссылка на организацию + Если ПрефиксОрганизации = Ложь Тогда + + ПрефиксОрганизации = ""; + + КонецЕсли; + + ДополнитьСтрокуНулямиСлева(ПрефиксОрганизации, 2); + + КонецЕсли; + + ОсновнойПрефикс = ПрефиксОрганизации + ПрефиксИнформационнойБазы; + + Разделитель = ?(ПустаяСтрока(ОсновнойПрефикс), "", "-"); + + Префикс = ОсновнойПрефикс + Разделитель + Префикс; + + // если префикс не задан, то устанавливаем значение по умолчанию + Если ПустаяСтрока(Префикс) Тогда + + Префикс = "0"; + + КонецЕсли; + +КонецПроцедуры + +Процедура ПроверитьНомерОбъектаПоДате(Объект) + + Если Объект.ЭтоНовый() Тогда + Возврат; + КонецЕсли; + + МетаданныеОбъекта = Объект.Метаданные(); + + ТекстЗапроса = " + |ВЫБРАТЬ + | ШапкаОбъекта.Дата КАК Дата + |ИЗ + | " + МетаданныеОбъекта.ПолноеИмя() + " КАК ШапкаОбъекта + |ГДЕ + | ШапкаОбъекта.Ссылка = &Ссылка + |"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); + + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + + Если Не ДатыОбъектаОдногоПериода(Выборка.Дата, Объект.Дата, МетаданныеОбъекта) Тогда + + Объект.Номер = ""; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Процедура ПроверитьНомерОбъектаПоДатеИОрганизации(Объект) + + Если Объект.ЭтоНовый() Тогда + Возврат; + КонецЕсли; + + МетаданныеОбъекта = Объект.Метаданные(); + + ТекстЗапроса = " + |ВЫБРАТЬ + | ШапкаОбъекта.Дата КАК Дата, + | ШапкаОбъекта.Организация КАК Организация + |ИЗ + | " + МетаданныеОбъекта.ПолноеИмя() + " КАК ШапкаОбъекта + |ГДЕ + | ШапкаОбъекта.Ссылка = &Ссылка + |"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); + + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + + Если Выборка.Организация <> Объект.Организация Тогда + + Объект.Номер = ""; + + ИначеЕсли Не ДатыОбъектаОдногоПериода(Выборка.Дата, Объект.Дата, МетаданныеОбъекта) Тогда + + Объект.Номер = ""; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Процедура ПроверитьКодОбъектаПоОрганизации(Объект) + + Если Объект.ЭтоНовый() Тогда + Возврат; + КонецЕсли; + + МетаданныеОбъекта = Объект.Метаданные(); + + ТекстЗапроса = " + |ВЫБРАТЬ + | ШапкаОбъекта.Организация КАК Организация + |ИЗ + | " + МетаданныеОбъекта.ПолноеИмя() + " КАК ШапкаОбъекта + |ГДЕ + | ШапкаОбъекта.Ссылка = &Ссылка + |"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); + + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + + Если Выборка.Организация <> Объект.Организация Тогда + + Объект.Код = ""; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Процедура ДополнитьСтрокуНулямиСлева(Строка, ДлинаСтроки) + + Строка = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(Строка, ДлинаСтроки, "0", "Слева"); + +КонецПроцедуры + +Функция ДатыОбъектаОдногоПериода(Знач Дата1, Знач Дата2, МетаданныеОбъекта) + + Если ПериодичностьНомераДокументаГод(МетаданныеОбъекта) Тогда + + РазностьДат = НачалоГода(Дата1) - НачалоГода(Дата2); + + ИначеЕсли ПериодичностьНомераДокументаКвартал(МетаданныеОбъекта) Тогда + + РазностьДат = НачалоКвартала(Дата1) - НачалоКвартала(Дата2); + + ИначеЕсли ПериодичностьНомераДокументаМесяц(МетаданныеОбъекта) Тогда + + РазностьДат = НачалоМесяца(Дата1) - НачалоМесяца(Дата2); + + ИначеЕсли ПериодичностьНомераДокументаДень(МетаданныеОбъекта) Тогда + + РазностьДат = НачалоДня(Дата1) - НачалоДня(Дата2); + + Иначе // ПериодичностьНомераДокументаНеопределено + + РазностьДат = 0; + + КонецЕсли; + + Возврат РазностьДат = 0; + +КонецФункции + +Функция ПериодичностьНомераДокументаГод(МетаданныеОбъекта) + + Возврат МетаданныеОбъекта.ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераДокумента.Год; + +КонецФункции + +Функция ПериодичностьНомераДокументаКвартал(МетаданныеОбъекта) + + Возврат МетаданныеОбъекта.ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераДокумента.Квартал; + +КонецФункции + +Функция ПериодичностьНомераДокументаМесяц(МетаданныеОбъекта) + + Возврат МетаданныеОбъекта.ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераДокумента.Месяц; + +КонецФункции + +Функция ПериодичностьНомераДокументаДень(МетаданныеОбъекта) + + Возврат МетаданныеОбъекта.ПериодичностьНомера = Метаданные.СвойстваОбъектов.ПериодичностьНомераДокумента.День; + +КонецФункции + + + diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/ПрефиксацияОбъектовСобытия.mdo b/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/ПрефиксацияОбъектовСобытия.mdo new file mode 100644 index 000000000..c33e15632 --- /dev/null +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/ПрефиксацияОбъектовСобытия.mdo @@ -0,0 +1,12 @@ + + + ПрефиксацияОбъектовСобытия + + ru + Префиксация объектов события + + true + true + true + true + diff --git a/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/Module.bsl b/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/Module.bsl new file mode 100644 index 000000000..936a34885 --- /dev/null +++ b/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/Module.bsl @@ -0,0 +1,48 @@ +// Запрашивает у пользователя диалог с подтверждением легальности полученного +// обновления и завершает работу системы если обновление получено не легально +// (см. параметр ЗавершатьРаботуСистемы). +// +// Параметры +// ЗавершатьРаботуСистемы - Булево - завершать работу системы, если пользователь +// указал что обновление получено не легально +// +// Возвращаемое значение: +// Булево - Истина, если проверка завершилась успешно (пользователь +// подтвердил, что обновление получено легально) +// +Функция ПроверитьЛегальностьПолученияОбновления(знач ЗавершатьРаботуСистемы = Ложь) Экспорт + + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + Возврат Истина; + КонецЕсли; + + Результат = ОткрытьФормуМодально("Обработка.ЛегальностьПолученияОбновлений.Форма", + Новый Структура("ПоказыватьПредупреждениеОПерезапуске,ПринудительныйЗапуск", + ?(ЗавершатьРаботуСистемы, Истина, Ложь), + Истина) ); + + Если Результат <> Истина Тогда + Если ЗавершатьРаботуСистемы Тогда + ЗавершитьРаботуСистемы(Ложь); + КонецЕсли; + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +// Процедура для проверки легальности получения обновления. +// Должна вызываться перед обновлением информационной базы. +// +Функция ПодтвердитьЛегальностьПолученияОбновления() Экспорт + + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НеобходимоОбновлениеИнформационнойБазы + И СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоГлавныйУзел + И НЕ ПроверкаЛегальностиПолученияОбновленияКлиент.ПроверитьЛегальностьПолученияОбновления(Истина) Тогда + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции diff --git a/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/ПроверкаЛегальностиПолученияОбновленияКлиент.mdo b/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/ПроверкаЛегальностиПолученияОбновленияКлиент.mdo new file mode 100644 index 000000000..394ed88a1 --- /dev/null +++ b/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/ПроверкаЛегальностиПолученияОбновленияКлиент.mdo @@ -0,0 +1,10 @@ + + + ПроверкаЛегальностиПолученияОбновленияКлиент + + ru + Проверка легальности получения обновления клиент + + true + true + diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl new file mode 100644 index 000000000..137bed15f --- /dev/null +++ b/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl @@ -0,0 +1,267 @@ +// Копирует в регистр сведений подчиненной валюты всю информацию из регистра +// сведений базовой валюты (период, курс, кратность). +// +// Параметры +// ВалютаИсточник – Справочники.Валюты – ссылка на базовую валюту, из регистра +// сведений которой, будут копироваться данные +// ВалютаПриемник – Справочники.Валюты – ссылка на зависимую валюту от базовой, +// в регистр сведений которой данные будут копироваться +// +Процедура ЗаписатьСведенияДляПодчиненногоРегистра(ВалютаИсточник, ВалютаПриемник) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ * + | ИЗ РегистрСведений.КурсыВалют + | ГДЕ Валюта = &ВалютаИсточник"; + Запрос.УстановитьПараметр("ВалютаИсточник", ВалютаИсточник); + + Выборка = Запрос.Выполнить().Выбрать(); + + РегистрКурсыВалют = РегистрыСведений.КурсыВалют; + НаборКурсов = РегистрКурсыВалют.СоздатьНаборЗаписей(); + + НаборКурсов.Отбор.Валюта.ВидСравнения = ВидСравнения.Равно; + НаборКурсов.Отбор.Валюта.Значение = ВалютаПриемник; + НаборКурсов.Отбор.Валюта.Использование = Истина; + + КоэффициентПодчиненногоКурса = ВалютаПриемник.КоэффициентПодчиненногоКурса; + + Пока Выборка.Следующий() Цикл + + НоваяЗаписьНабораКурсов = НаборКурсов.Добавить(); + НоваяЗаписьНабораКурсов.Валюта = ВалютаПриемник; + НоваяЗаписьНабораКурсов.Кратность = Выборка.Кратность; + НоваяЗаписьНабораКурсов.Курс = Выборка.Курс + Выборка.Курс*КоэффициентПодчиненногоКурса/100; + НоваяЗаписьНабораКурсов.Период = Выборка.Период; + + КонецЦикла; + + НаборКурсов.Записать(); + +КонецПроцедуры + +// Проверяет наличие установленного курса и кратности валюты на 1 января 1980 года. +// В случае отсутствия устанавливает курс и кратность равными единице. +// +// Параметры: +// Валюта - ссылка на элемент справочника Валют +// +Процедура ПроверитьКорректностьКурсаНа01_01_1980(Валюта) Экспорт + + ДатаКурса = Дата("19800101"); + СтруктураКурса = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ДатаКурса, Новый Структура("Валюта", Валюта)); + + Если (СтруктураКурса.Курс = 0) Или (СтруктураКурса.Кратность = 0) Тогда + + РегистрКурсыВалют = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); + + РегистрКурсыВалют.Период = ДатаКурса; + РегистрКурсыВалют.Валюта = Валюта; + РегистрКурсыВалют.Курс = 1; + РегистрКурсыВалют.Кратность = 1; + РегистрКурсыВалют.Записать(); + КонецЕсли; + +КонецПроцедуры // ПроверитьКорректностьКурсаНа01_01_1980() + +// Функция, загружающая информацию о курсе валюты из файла в регистр +// сведений курсов валют. При этом файл с курсами разбирается и записываются +// только те данные, которые удовлетворяют периоду. +// +Функция ЗагрузитьКурсВалютыИзФайла(знач Валюта, + знач СсылкаНаФайл, + знач НачалоПериодаЗагрузки, + знач ОкончаниеПериодаЗагрузки) Экспорт + + СтатусЗагрузки = 1; + + ЧислоЗагружаемыхДнейВсего = 1 + (ОкончаниеПериодаЗагрузки - НачалоПериодаЗагрузки) / ( 24 * 60 * 60); + + ЧислоЗагруженныхДней = 0; + + Если ЭтоАдресВременногоХранилища(СсылкаНаФайл) Тогда + ИмяФайла = ПолучитьИмяВременногоФайла(); + ДвоичныеДанные = ПолучитьИзВременногоХранилища(СсылкаНаФайл); + ДвоичныеДанные.Записать(ИмяФайла); + Иначе + ИмяФайла = СсылкаНаФайл; + КонецЕсли; + + Текст = Новый ТекстовыйДокумент(); + + РегистрКурсыВалют = РегистрыСведений.КурсыВалют; + + Текст.Прочитать(ИмяФайла, КодировкаТекста.ANSI); + КолСтрок = Текст.КоличествоСтрок(); + + Для Инд = 1 По КолСтрок Цикл + + Стр = Текст.ПолучитьСтроку(Инд); + Если (Стр = "") ИЛИ (Найти(Стр,Символы.Таб) = 0) Тогда + Продолжить; + КонецЕсли; + + Если НачалоПериодаЗагрузки = ОкончаниеПериодаЗагрузки Тогда + ДатаКурса = ОкончаниеПериодаЗагрузки; + Иначе + ДатаКурсаСтр = ВыделитьПодСтроку(Стр); + ДатаКурса = Дата(Лев(ДатаКурсаСтр,4), Сред(ДатаКурсаСтр,5,2), Сред(ДатаКурсаСтр,7,2)); + КонецЕсли; + + Кратность = Число(ВыделитьПодСтроку(Стр)); + Курс = Число(ВыделитьПодСтроку(Стр)); + + Если ДатаКурса > ОкончаниеПериодаЗагрузки Тогда + Прервать; + КонецЕсли; + + Если ДатаКурса < НачалоПериодаЗагрузки Тогда + Продолжить; + КонецЕсли; + + ЗаписьКурсовВалют = РегистрКурсыВалют.СоздатьМенеджерЗаписи(); + + ЗаписьКурсовВалют.Валюта = Валюта; + ЗаписьКурсовВалют.Период = ДатаКурса; + ЗаписьКурсовВалют.Курс = Курс; + ЗаписьКурсовВалют.Кратность = Кратность; + ЗаписьКурсовВалют.Записать(); + + ЧислоЗагруженныхДней = ЧислоЗагруженныхДней + 1; + КонецЦикла; + + Если ЭтоАдресВременногоХранилища(СсылкаНаФайл) Тогда + УдалитьФайлы(ИмяФайла); + УдалитьИзВременногоХранилища(СсылкаНаФайл); + КонецЕсли; + + Если ЧислоЗагружаемыхДнейВсего = ЧислоЗагруженныхДней Тогда + ПояснениеОЗагрузке = ""; + ИначеЕсли ЧислоЗагруженныхДней = 0 Тогда + ПояснениеОЗагрузке = НСтр("ru = 'Курсы валюты %1 - %2 не загружены. Нет данных.'"); + Иначе + ПояснениеОЗагрузке = НСтр("ru = 'Загружены не все курсы по валюте %1 - %2.'"); + КонецЕсли; + + ПояснениеОЗагрузке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ПояснениеОЗагрузке, + Валюта.Код, + Валюта.Наименование); + + Возврат ПояснениеОЗагрузке; + +КонецФункции + +// Выделяет из переданной строки первое значение + // до символа "TAB" + // + // Параметры: + // ИсходнаяСтрока - Строка - строка для разбора + // + // Возвращаемое значение: + // подстроку до символа "TAB" + // +Функция ВыделитьПодСтроку(ИсходнаяСтрока) + + Перем ПодСтрока; + + Поз = Найти(ИсходнаяСтрока,Символы.Таб); + Если Поз > 0 Тогда + ПодСтрока = Лев(ИсходнаяСтрока,Поз-1); + ИсходнаяСтрока = Сред(ИсходнаяСтрока,Поз + 1); + Иначе + ПодСтрока = ИсходнаяСтрока; + ИсходнаяСтрока = ""; + КонецЕсли; + + Возврат ПодСтрока; + +КонецФункции + +Функция ПолучитьМассивЗагружаемыхВалют() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ Ссылка КАК Ссылка + |ИЗ Справочник.Валюты КАК Валюты + |ГДЕ Валюты.ВалютаЗагружается"; + + Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + +КонецФункции + +// Функция возвращает информацию о курсе валюты на основе ссылки на валюту. +// Данные возвращаются в виде структуры. +// +// Параметры: +// ВыбраннаяВалюта - Справочник.Валюты / Ссылка - ссылка на валюту, информацию +// о курсе которой необходимо получить +// +// Возвращаемое значение: +// ДанныеКурса - стуктура, содержащая информацию о последней доступной +// записи курса +// +Функция ЗаполнитьДанныеКурсаДляВалюты(ВыбраннаяВалюта) Экспорт + + ДанныеКурса = Новый Структура("ДатаКурса, Курс, Кратность"); + + Запрос = Новый Запрос; + + Запрос.Текст = "ВЫБРАТЬ РегКурсы.Период, РегКурсы.Курс, РегКурсы.Кратность + | ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&ОкончаниеПериодаЗагрузки, Валюта = &ВыбраннаяВалюта) КАК РегКурсы"; + Запрос.УстановитьПараметр("ВыбраннаяВалюта", ВыбраннаяВалюта); + Запрос.УстановитьПараметр("ОкончаниеПериодаЗагрузки", ТекущаяДата()); + + ВыборкаКурс = Запрос.Выполнить().Выбрать(); + ВыборкаКурс.Следующий(); + + ДанныеКурса.ДатаКурса = ВыборкаКурс.Период; + ДанныеКурса.Курс = ВыборкаКурс.Курс; + ДанныеКурса.Кратность = ВыборкаКурс.Кратность; + + Возврат ДанныеКурса; + +КонецФункции + +// Возвращает таблицу значений - валюты, зависящие от переданной +// в качестве параметра. +// Возвращаемое значение +// ТаблицаЗначений +// колонка "Ссылка" - СправочникСсылка.Валюты +// колонка "КоэффициентПодчиненногоКурса" - число +// +Функция ПолучитьСписокЗависимыхВалют(знач ВалютаБазовая) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = "Выбрать Ссылка, КоэффициентПодчиненногоКурса + | ИЗ Справочник.Валюты Как СпрВалюты + | ГДЕ ПодчиненныйКурсОт = &ВалютаБазовая"; + + Запрос.УстановитьПараметр("ВалютаБазовая", ВалютаБазовая); + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +Процедура ОбновитьФорматХраненияПрописиНаРусскомЯзыке() Экспорт + + ВыборкаВалют = Справочники.Валюты.Выбрать(); + + Пока ВыборкаВалют.Следующий() Цикл + Объект = ВыборкаВалют.ПолучитьОбъект(); + СтрокаПараметров = СтрЗаменить(Объект.ПараметрыПрописиНаРусском, ",", Символы.ПС); + Род1 = НРег(Лев(СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 4)), 1)); + Род2 = НРег(Лев(СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 8)), 1)); + Объект.ПараметрыПрописиНаРусском = + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 1)) + ", " + + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 2)) + ", " + + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 3)) + ", " + + Род1 + ", " + + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 5)) + ", " + + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 6)) + ", " + + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 7)) + ", " + + Род2 + ", " + + СокрЛП(СтрПолучитьСтроку(СтрокаПараметров, 9)); + Объект.Записать(); + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалют/РаботаСКурсамиВалют.mdo b/SSL/src/CommonModules/РаботаСКурсамиВалют/РаботаСКурсамиВалют.mdo new file mode 100644 index 000000000..dfcbb703d --- /dev/null +++ b/SSL/src/CommonModules/РаботаСКурсамиВалют/РаботаСКурсамиВалют.mdo @@ -0,0 +1,10 @@ + + + РаботаСКурсамиВалют + + ru + Работа с курсами валют + + true + true + diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl new file mode 100644 index 000000000..02b4f8c24 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl @@ -0,0 +1,70 @@ +// Процедура для загрузки курсов валют по определенному периоду. +// +// Параметры +// Валюты - Любая коллекция - со следующими полями: +// КодВалюты - числовой код валюты +// Валюта - ссылка на валюту +// НачалоПериодаЗагрузки - Дата - начало периода загрузки курсов +// ОкончаниеПериодаЗагрузки - Дата - окончание периода загрузки курсов +// ПоясняющееСообщение - строка - в случае возникновения ошибки +// (исключения) в функции, содержит текстовое представление описания ошибки +// +// Возвращаемое значение: +// Истина - валюты успешно загружены +// Ложь - хотя бы одна валюта не была загружена +// +Функция ЗагрузитьКурсыВалютПоПараметрам(знач Валюты, + знач НачалоПериодаЗагрузки, + знач ОкончаниеПериодаЗагрузки, + ПоясняющееСообщение = "") Экспорт + + СтатусОперации = Истина; + + СерверИсточник = "cbrates.rbc.ru"; + Если НачалоПериодаЗагрузки = ОкончаниеПериодаЗагрузки Тогда + Адрес = "tsv/"; + ТМП = "/"+Формат(Год(ОкончаниеПериодаЗагрузки),"ЧРГ=; ЧГ=0")+"/"+Формат(Месяц(ОкончаниеПериодаЗагрузки),"ЧЦ=2;ЧДЦ=0;ЧВН=")+"/"+Формат(День(ОкончаниеПериодаЗагрузки),"ЧЦ=2;ЧДЦ=0;ЧВН="); + Иначе + Адрес = "tsv/cb/"; + ТМП = ""; + КонецЕсли; + + Для Каждого Валюта из Валюты Цикл + ФайлНаВебСервере = "http://" + СерверИсточник + "/" + Адрес + Прав(Валюта.КодВалюты, 3) + ТМП + ".tsv"; + +#Если НаКлиенте Тогда + Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте(ФайлНаВебСервере); +#Иначе + Результат = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(ФайлНаВебСервере); +#КонецЕсли + + Если Результат.Статус Тогда +#Если НаКлиенте Тогда + ДвоичныеДанные = Новый ДвоичныеДанные (Результат.Путь); + АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные); + ПоясняющееСообщение = ПоясняющееСообщение + РаботаСКурсамиВалют.ЗагрузитьКурсВалютыИзФайла(Валюта.Валюта, АдресВоВременномХранилище, НачалоПериодаЗагрузки, ОкончаниеПериодаЗагрузки) + Символы.ПС; +#Иначе + ПоясняющееСообщение = ПоясняющееСообщение + РаботаСКурсамиВалют.ЗагрузитьКурсВалютыИзФайла(Валюта.Валюта, Результат.Путь, НачалоПериодаЗагрузки, ОкончаниеПериодаЗагрузки) + Символы.ПС; +#КонецЕсли + УдалитьФайлы(Результат.Путь); + Иначе + СтатусОперации = Ложь; + ПоясняющееСообщение= НСтр("ru = 'Не возможно получить файл данных с курсами валюты (%1 - %2): + |%3 + |Возможно, нет доступа к веб сайту с курсами валют, либо указана несуществующая валюта.'"); + ПоясняющееСообщение = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ПоясняющееСообщение, + Валюта.КодВалюты, + Валюта.Валюта, + Результат.СообщениеОбОшибке); + КонецЕсли; + КонецЦикла; + + Если СтатусОперации Тогда + ПоясняющееСообщение = Лев(ПоясняющееСообщение, СтрДлина(ПоясняющееСообщение) - 2); + КонецЕсли; + + Возврат СтатусОперации; + +КонецФункции diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/РаботаСКурсамиВалютКлиентСервер.mdo b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/РаботаСКурсамиВалютКлиентСервер.mdo new file mode 100644 index 000000000..e34e6e54f --- /dev/null +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/РаботаСКурсамиВалютКлиентСервер.mdo @@ -0,0 +1,12 @@ + + + РаботаСКурсамиВалютКлиентСервер + + ru + Работа с курсами валют клиент сервер + + true + true + true + true + diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютСобытия/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютСобытия/Module.bsl new file mode 100644 index 000000000..a1c000aef --- /dev/null +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютСобытия/Module.bsl @@ -0,0 +1,38 @@ + +// Обработчик регламентного задания по загрузке курса валют +// +Процедура ЗагрузитьАктуальныйКурс() Экспорт + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Начата регламентная загрузка курсов валют'")); + + ТекущаяДата = ТекущаяДата(); + + СообщениеОбОшибке = ""; + + ОбработкаЗагрузкиКурсовВалют = Обработки.КурсыВалютРБК.Создать(); + ОбработкаЗагрузкиКурсовВалют.НачалоПериодаЗагрузки = ТекущаяДата; + ОбработкаЗагрузкиКурсовВалют.ОкончаниеПериодаЗагрузки = ТекущаяДата; + ОбработкаЗагрузкиКурсовВалют.ЗаполнитьСписокВалют(); + СтатусОперации = ОбработкаЗагрузкиКурсовВалют.ЗагрузитьКурсыВалют(СообщениеОбОшибке); + Если СтатусОперации Тогда + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Завершена регламентная загрузка курсов валют.'")); + Иначе + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Ошибка, , , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Во время регламентного задания загрузки курсов валют произошла ошибка: + |%1'"), + СообщениеОбОшибке)); + КонецЕсли; + +КонецПроцедуры + +Функция СобытиеЖурналаРегистрации() + + Возврат НСтр("ru = 'Валюты.Загрузка курсов валют'"); + +КонецФункции diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютСобытия/РаботаСКурсамиВалютСобытия.mdo b/SSL/src/CommonModules/РаботаСКурсамиВалютСобытия/РаботаСКурсамиВалютСобытия.mdo new file mode 100644 index 000000000..64b7afab6 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютСобытия/РаботаСКурсамиВалютСобытия.mdo @@ -0,0 +1,12 @@ + + + РаботаСКурсамиВалютСобытия + + ru + Модуль работы с курсами валют + + true + true + true + true + diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl new file mode 100644 index 000000000..71e3cde29 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl @@ -0,0 +1,94 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Модуль "РаботаСПочтовымиСообщениямиИнтерфейсы", содержит функции-интерфейсы, +// для работы с почтовыми сообщениями. Должен присутствовать в любой +// конфигурации, которая содержит почтовую подсистему. +// +// Функции не содержат спецификации параметров - их необходимо смотреть +// в модуле, непосредственно реализующем ту или иную механику работы с +// почтовыми сообщениями (с серверами). +// + +//////////////////////////////////////////////////////////////////////////////// +// +// Блок переопределяемых функций-интерфейсов (для вызова из вне) +// + +// Получает ссылку на учетную запись по виду назначения учетной записи +// Параметры: +// ВидНазначенияУчетнойЗаписи - Перечисления.ВидыНазначенияУчетныхЗаписей - +// вид назначения учетной записи +// Возвращаемое значение: +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - ссылка +// на описание учетной записи +// +Функция ПолучитьСистемнуюУчетнуюЗапись() Экспорт + + Возврат ЭлектроннаяПочта.ПолучитьСистемнуюУчетнуюЗапись(); + +КонецФункции + +// Проверяет, что системная учетная запись доступна +// (может быть использована) +// +Функция ПроверитьСистемнаяУчетнаяЗаписьДоступна() Экспорт + + Возврат ЭлектроннаяПочта.ПроверитьСистемнаяУчетнаяЗаписьДоступна(); + +КонецФункции + +// Получить доступные учетные записи электронной почты +// Параметры: +// ДляОтправки - Булево - Если установлено Истина, то будут выбирать только записи, с которых можно отправлять почту +// ДляПриема - Булево - Если установлено Истина, то будут выбирать только записи, по которым можно получать почту +// Возвращаемое значение: +// ДоступныеУчетныеЗаписи - ТаблицаЗначений - С колонками: +// Ссылка - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - Ссылка на учетную запись +// Наименование - Строка - Наименование учетной записи +// Адрес - Строка - Адрес электронной почты +// +Функция ПолучитьДоступныеУчетныеЗаписи(знач ДляОтправки = Ложь, знач ДляПриема = Ложь, знач ВключатьСистемнуюУчетнуюЗапись = Ложь) Экспорт + + Возврат ЭлектроннаяПочта.ПолучитьДоступныеУчетныеЗаписи(ДляОтправки, ДляПриема, ВключатьСистемнуюУчетнуюЗапись); + +КонецФункции + +// Функция реализующая механику отправки сообщения электронной почты +// +// Параметры: +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - ссылка на +// учетную запись электронной почты +// ПараметрыПисьма - структура - содержит всю необходимую информацию о письме: +// содержит следующие ключи: +// Кому* - Массив структур, строка - интернет адрес получателя письма +// Адрес - строка - почтовый адрес +// Представление - строка - имя адресата +// +// Тема* - строка - тема почтового сообщения +// Тело* - тело почтового сообщения (простой текст в кодировке win-1251) +// Вложения - соответствие +// ключ - наименованиеВложения - строка - наименование вложения +// значение - ДвоичныеДанные - данные вложения +// +// дополнительные ключи структуры, которые могут использоваться: +// АдресОтвета - соответствие - см. такие же поля как и кому +// Пароль - строка - пароль для доступа учетной записи +// ТипТекста - Строка / Перечисление.ТипыТекстовЭлектронныхПисем определяет тип переданного теста +// допустимые значения: +// HTML/ТипыТекстовЭлектронныхПисем.HTML - текст почтового сообщения в формате HTML +// ПростойТекст/ТипыТекстовЭлектронныхПисем.ПростойТекст - простой текст почтового сообщения. Отображается "как есть" (значение по умолчанию) +// РазмеченныйТекст/ТипыТекстовЭлектронныхПисем.РазмеченныйТекст - текст почтового сообщения в формате Rich Text +// +// прим.: параметры письма помеченные знаком '*' являются обязательными +// т.е. к началу работы функции считается что они уже заполнены +// +// Возвращаемое значение: +// Строка - идентификатор отправленного почтового сообщения на smtp сервере +// +// ПРИМЕЧАНИЕ: функция может вызвать исключение, которое требуется обработать +// +Функция ОтправитьСообщение(знач УчетнаяЗапись, знач ПараметрыПисьма) Экспорт + + Возврат ЭлектроннаяПочта.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма); + +КонецФункции diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/РаботаСПочтовымиСообщениями.mdo b/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/РаботаСПочтовымиСообщениями.mdo new file mode 100644 index 000000000..927ecb7f9 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/РаботаСПочтовымиСообщениями.mdo @@ -0,0 +1,10 @@ + + + РаботаСПочтовымиСообщениями + + ru + Работа с почтовыми сообщениями + + true + true + diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl new file mode 100644 index 000000000..679d74039 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl @@ -0,0 +1,82 @@ + +// Интерфейсная клиентская функция поддерживающая упрощенный вызов формы редактирования +// нового письма. +// Параметры +// Отправитель* - СписокЗначений, СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - +// учетная запись (список) с которой(ых) может быть отправлено +// почтовое сообщение. Если тип список значений, тогда +// представление - наименование учетной записи, +// значение - ссылка на учетную запись +// +// Получатель - СписокЗначений, Строка: +// если список значений, то представление - имя получателя +// значение - почтовый адрес +// если строка то список почтовых адресов, +// в формате правильного e-mail адреса* +// +// Тема - Строка - тема письма +// Текст - Строка - тело письма +// +// СписокФайлов - СписокЗначений, где +// представление - строка - наименование вложения +// значение - ДвоичныеДанные - двоичные данные вложения +// - Строка - адрес файла во временном хранилище +// - Строка - путь к файлу на клиенте +// +// УдалятьФайлыПослеОтправки - булево - удалять временные файлы после отправки сообщения +// ПисьмоДолжноСохраняться - булево - должно ли письмо сохраняться (используется только +// если встроена подсистема Взаимодействия) +// +Процедура ОткрытьФормуОтправкиПочтовогоСообщения(знач Отправитель = Неопределено, + знач Получатель = Неопределено, + знач Тема = "", + знач Текст = "", + знач СписокФайлов = Неопределено, + знач УдалятьФайлыПослеОтправки = Ложь, + знач ПисьмоДолжноСохраняться = Истина) Экспорт + + ЭлектроннаяПочтаКлиент.ОткрытьФормуОтправкиПочтовогоСообщения(Отправитель, + Получатель, Тема, Текст, СписокФайлов, УдалятьФайлыПослеОтправки); + +КонецПроцедуры + + +// Выполняет проверку учетной записи +// +// Параметры +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - учетная запись, +// которую нужно проверить +// +Процедура ПроверитьУчетнуюЗапись(знач УчетнаяЗапись) Экспорт + + ОчиститьСообщения(); + + Состояние(НСтр("ru = 'Проверка учетной записи'"),,НСтр("ru = 'Выполняется проверка учетной записи. Подождите...'")); + + Если ЭлектроннаяПочта.ПарольЗадан(УчетнаяЗапись) Тогда + ПарольПараметр = Неопределено; + Иначе + ПараметрУчетнаяЗапись = Новый Структура("УчетнаяЗапись", УчетнаяЗапись); + ПарольПараметр = ОткрытьФормуМодально("ОбщаяФорма.ПодтверждениеПароляУчетнойЗаписи", ПараметрУчетнаяЗапись); + Если ТипЗнч(ПарольПараметр) <> Тип("Строка") Тогда + Возврат + КонецЕсли; + КонецЕсли; + + СообщениеОбОшибке = ""; + ДополнительноеСообщение = ""; + ЭлектроннаяПочта.ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(УчетнаяЗапись, ПарольПараметр, СообщениеОбОшибке, ДополнительноеСообщение); + + Если ЗначениеЗаполнено(СообщениеОбОшибке) Тогда + Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Проверка параметров учетной записи завершилась с ошибками: + |%1'"), СообщениеОбОшибке ),, + НСтр("ru = 'Проверка учетной записи'")); + Иначе + Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Проверка параметров учетной записи завершилась успешно!%1'"), + ДополнительноеСообщение ),, + НСтр("ru = 'Проверка учетной записи'")); + КонецЕсли; + +КонецПроцедуры // ПроверитьУчетнуюЗапись() diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/РаботаСПочтовымиСообщениямиКлиент.mdo b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/РаботаСПочтовымиСообщениямиКлиент.mdo new file mode 100644 index 000000000..ce140b4e1 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/РаботаСПочтовымиСообщениямиКлиент.mdo @@ -0,0 +1,11 @@ + + + РаботаСПочтовымиСообщениямиКлиент + + ru + Работа с почтовыми сообщениями клиент + + true + true + true + diff --git a/SSL/src/CommonModules/РаботаСФайлами/Module.bsl b/SSL/src/CommonModules/РаботаСФайлами/Module.bsl new file mode 100644 index 000000000..d22b96d50 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСФайлами/Module.bsl @@ -0,0 +1,3376 @@ +//////////////////////////////////////////////////////////////////////////////// +// МОДУЛЬ СОДЕРЖИТ РЕАЛИЗАЦИЮ МЕХАНИКИ РАБОТЫ С ФАЙЛАМИ +// + +// Освобождает файл +// Параметры: +// ДанныеФайла - структура, содержащая сведения о Файле +// см. функцию ПолучитьДанныеФайла() +Процедура ОсвободитьФайл(ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт + + ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект(); + + ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , УникальныйИдентификатор); + ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка(); + ФайлОбъект.Записать(); + РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификатор); + +КонецПроцедуры + +// Занимает файл на редактирование (checkout) +Функция ЗанятьФайл(ДанныеФайла, СтрокаОшибки = "", УникальныйИдентификатор = Неопределено) Экспорт + + Если Не РаботаСФайламиПереопределяемый.ВозможноЗанятьФайл(ДанныеФайла, СтрокаОшибки) Тогда + Возврат Ложь; + КонецЕсли; + + ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект(); + + ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , УникальныйИдентификатор); + ФайлОбъект.Редактирует = ОбщегоНазначения.ТекущийПользователь(); + ФайлОбъект.Записать(); + РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификатор); + + НавигационнаяСсылкаТекущейВерсии = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; + РабочийКаталогВладельца = ДанныеФайла.РабочийКаталогВладельца; + + ДанныеФайла = ПолучитьДанныеФайла( + ДанныеФайла.Ссылка, ДанныеФайла.Версия); + + ДанныеФайла.НавигационнаяСсылкаТекущейВерсии = НавигационнаяСсылкаТекущейВерсии; + ДанныеФайла.РабочийКаталогВладельца = РабочийКаталогВладельца; + + Возврат Истина; + +КонецФункции // ЗанятьФайл() + +// Переносит Файл в другую папку +Процедура ПеренестиФайл(ДанныеФайла, Папка) Экспорт + + ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект(); + ФайлОбъект.Заблокировать(); + ФайлОбъект.ВладелецФайла = Папка; + ФайлОбъект.Записать(); + +КонецПроцедуры + +// Создает карточку Файла в БД +Функция СоздатьФайл(Знач Владелец, Знач Комментарий, Знач ИмяБезРасширения, + Знач Расширение, Знач ХранитьВерсии, Знач АдресВременногоХранилищаТекста, + Пользователь = Неопределено) Экспорт + + Файл = Справочники.Файлы.СоздатьЭлемент(); + Файл.ВладелецФайла = Владелец; + Файл.Наименование = ИмяБезРасширения; + Файл.ПолноеНаименование = ИмяБезРасширения; + + Если Пользователь = Неопределено Тогда + Файл.Автор = ОбщегоНазначения.ТекущийПользователь(); + Иначе + Файл.Автор = Пользователь; + КонецЕсли; + + Файл.ДатаСоздания = ТекущаяДата(); + Файл.Описание = Комментарий; + Файл.ИндексКартинки = РаботаСФайламиКлиентСервер.ПолучитьИндексПиктограммыФайла(Неопределено); + Файл.ХранитьВерсии = ХранитьВерсии; + + Текст = ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); + Файл.ТекстХранилище = Новый ХранилищеЗначения(Текст); + + Файл.Записать(); + Возврат Файл.Ссылка; + +КонецФункции // СоздатьФайл() + +// Функция предназначена для преобразования расширения файла в следующий +// вид: без точки и в нижнем регистре +// +// Параметры: +// стрРасширение - Строка. Расширение для преобразования +// Возвращаемое значение: +// Преобразованная строка +// +Функция РасширениеБезТочки(стрРасширение) Экспорт + Расширение = НРег(СокрЛП(стрРасширение)); + Если Сред(Расширение, 1, 1) = "." Тогда + Расширение = Сред(Расширение, 2); + КонецЕсли; + Возврат Расширение; +КонецФункции // РасширениеБезТочки() + +// Создает версию сохраняемого файла для сохранения в карточке Файла +// и подставляет ссылку на версию в карточку Файла +Процедура СоздатьВерсиюИОбновитьВерсиюВФайле( + ВремяИзменения, + ВремяИзмененияУниверсальное, + ДокСсылка, + ИмяБезРасширения, + Размер, + Расширение, + АдресВременногоХранилищаФайла, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент = Ложь, + Пользователь = Неопределено) Экспорт + + ВерсияСсылка = СоздатьВерсию( + ВремяИзменения, + ВремяИзмененияУниверсальное, + ДокСсылка, + ИмяБезРасширения, + Размер, + Расширение, + АдресВременногоХранилищаФайла, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + Неопределено, // СсылкаНаВерсиюИсточник = + Неопределено, // НоваяВерсияДатаСоздания = + Пользователь, + Неопределено, // НоваяВерсияКомментарий + Неопределено // НоваяВерсияНомерВерсии + ); + + ОбновитьВерсиюВФайле(ДокСсылка, ВерсияСсылка, АдресВременногоХранилищаТекста); + +КонецПроцедуры // СоздатьВерсиюИОбновитьВерсиюВФайле() + + +// Находит максимальный номер версии для данного объекта Файл. Если нет версий - то 0 +Функция НайтиМаксимальныйНомерВерсии(ФайлСсылка) + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ЕСТЬNULL(МАКСИМУМ(Версии.НомерВерсии), 0) КАК МаксимальныйНомер + |ИЗ + | Справочник.ВерсииФайлов КАК Версии + |ГДЕ + | Версии.Владелец = &Файл"; + + Запрос.Параметры.Вставить("Файл", ФайлСсылка); + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + + Если Выборка.МаксимальныйНомер = Null Тогда + Возврат 0; + КонецЕсли; + + Возврат Число(Выборка.МаксимальныйНомер); + КонецЕсли; + + Возврат 0; +КонецФункции // НайтиМаксимальныйНомерВерсии + +// Возвращает полный путь тома - в зависимости от ОС +Функция ПолныйПутьТома(СсылкаНаТом) Экспорт + + ТипПлатформыСервера = РаботаСФайламиПовтИсп.ТипПлатформыСервера(); + + Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда + Возврат СсылкаНаТом.ПолныйПутьWindows; + Иначе + Возврат СсылкаНаТом.ПолныйПутьLinux; + КонецЕсли; + +КонецФункции + +// Добавляет файл в один из томов (где есть свободное место) +Процедура ДобавитьНаДиск(ДвоичныеДанные, ПутьКФайлу, СсылкаНаТом, ВремяИзменения, + НомерВерсии, ИмяБезРасширения, Расширение, РазмерФайла) Экспорт + + ПутьКТому = ""; + СсылкаНаТом = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + + Выборка = Справочники.ТомаХраненияФайлов.Выбрать(,,, "ПорядокЗаполнения Возр"); + + НайденТом = Ложь; + ФайлУспешноДобавлен = Ложь; + + ОписаниеВсехОшибок = ""; // здесь соберем ошибки со всех томов + + Пока Выборка.Следующий() Цикл + СсылкаНаТом = Выборка.ПолучитьОбъект(); + НайденТом = Истина; + + ПутьКТому = ПолныйПутьТома(СсылкаНаТом); + // Добавляем слэш в конце, если его нет + Если Прав(ПутьКТому,1) <> "\" Тогда + ПутьКТому = ПутьКТому + "\"; + КонецЕсли; + + // Имя файла для хранения на диске формировать следующим образом + // - имя файла.номер версии.расширение файла + ИмяФайла = ИмяБезРасширения + "." + НомерВерсии + "." + Расширение; + + Попытка + + // Если МаксимальныйРазмер = 0 - нет ограничения на размер файлов на томе + Если СсылкаНаТом.МаксимальныйРазмер <> 0 Тогда + ТекущийРазмерВБайтах = РаботаСФайлами.ПодсчитатьРазмерФайловНаТоме(СсылкаНаТом.Ссылка); + НовыйРазмерВБайтах = ТекущийРазмерВБайтах + РазмерФайла; + НовыйРазмер = НовыйРазмерВБайтах / (1024 * 1024); + + Если НовыйРазмер > СсылкаНаТом.МаксимальныйРазмер Тогда + СтрокаОшибки + = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Превышен максимальный размер тома (%1 Мб)!'"), + СсылкаНаТом.МаксимальныйРазмер); + ВызватьИсключение(СтрокаОшибки); + КонецЕсли; + КонецЕсли; + + Дата = ТекущаяДата(); + ПутьДня = Формат(Дата, "ДФ=ггггММдд") + "\"; + ПутьКТому = ПутьКТому + ПутьДня; + + ИмяФайлаСПутем = ФайловыеФункцииКлиентСервер.ПолучитьУникальноеИмяСПутем(ПутьКТому, ИмяФайла); + ПолноеИмяФайлаСПутем = ПутьКТому + ИмяФайлаСПутем; + + Если ТипЗнч(ДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда + ДвоичныеДанные.Записать(ПолноеИмяФайлаСПутем); + Иначе // считаем, что иначе это путь к файлу на диске + КопироватьФайл(ДвоичныеДанные, ПолноеИмяФайлаСПутем); + КонецЕсли; + + // Установим время изменения файла таким, как оно стоит в текущей версии + ФайлНаДиске = Новый Файл(ПолноеИмяФайлаСПутем); + ФайлНаДиске.УстановитьВремяИзменения(ВремяИзменения); + ФайлНаДиске.УстановитьТолькоЧтение(Истина); + + ПутьКФайлу = ПутьДня + ИмяФайлаСПутем; + ФайлУспешноДобавлен = Истина; + Прервать; // закончили - выйдем из цикла + Исключение + Если ОписаниеВсехОшибок <> "" Тогда + ОписаниеВсехОшибок = ОписаниеВсехОшибок + Символы.ПС + Символы.ПС; + КонецЕсли; + + ОписаниеВсехОшибок = ОписаниеВсехОшибок + НСтр("ru = 'Ошибка при добавлении файла на том: '"); + ОписаниеВсехОшибок = ОписаниеВсехОшибок + СсылкаНаТом; + ОписаниеВсехОшибок = ОписаниеВсехОшибок + " (" + ПутьКТому + "): "; + ОписаниеВсехОшибок = ОписаниеВсехОшибок + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + Если СсылкаНаТом.ПолныйПутьLinux = СсылкаНаТом.ПолныйПутьWindows Тогда + ОписаниеВсехОшибок = ОписаниеВсехОшибок + Символы.ПС; + ОписаниеВсехОшибок = ОписаниеВсехОшибок + НСтр("ru = 'Настройте полный путь к тому.'"); + КонецЕсли; + // надо переходить к следующему тому + Продолжить; + КонецПопытки; + + КонецЦикла; + + Если НайденТом = Ложь Тогда + ВызватьИсключение(НСтр("ru = 'Нет ни одного тома для размещения файла!'")); + КонецЕсли; + + Если ФайлУспешноДобавлен = Ложь Тогда + // запись в журнал регистрации для администратора + // здесь выдадим ошибки со всех томов + СообщениеОбОшибке = НСтр("ru = 'Не удалось добавить файл ни на один из томов! Список ошибок: '") + Символы.ПС + Символы.ПС + ОписаниеВсехОшибок; + ЗаписьЖурналаРегистрации("Добавление файла", УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); + + // здесь сообщение пользователю + СтрокаИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось добавить файл: ""%1.%2"". Обратитесь к администратору системы.'"), + ИмяБезРасширения, Расширение); + ВызватьИсключение(СтрокаИсключения); + КонецЕсли; + +КонецПроцедуры // ДобавитьНаДиск + +// Возвращает максимальный размер файла +Функция ПолучитьМаксимальныйРазмерФайла() Экспорт + УстановитьПривилегированныйРежим(Истина); + МаксимальныйРазмерФайла = Константы.МаксимальныйРазмерФайла.Получить(); + УстановитьПривилегированныйРежим(Ложь); + Возврат МаксимальныйРазмерФайла; +КонецФункции + +// Возвращает ЗапретЗагрузкиФайловПоРасширению +Функция ПолучитьЗапретЗагрузкиФайловПоРасширению() Экспорт + УстановитьПривилегированныйРежим(Истина); + ЗапретЗагрузкиФайловПоРасширению = Константы.ЗапретЗагрузкиФайловПоРасширению.Получить(); + УстановитьПривилегированныйРежим(Ложь); + Возврат ЗапретЗагрузкиФайловПоРасширению; +КонецФункции + +// Возвращает СписокЗапрещенныхРасширений +Функция ПолучитьСписокЗапрещенныхРасширений() Экспорт + УстановитьПривилегированныйРежим(Истина); + СписокЗапрещенныхРасширений = Константы.СписокЗапрещенныхРасширений.Получить(); + УстановитьПривилегированныйРежим(Ложь); + Возврат СписокЗапрещенныхРасширений; +КонецФункции + +// Создает версию сохраняемого файла для сохранения в карточке Файла +Функция СоздатьВерсию( + ВремяИзменения, + ВремяИзмененияУниверсальное, + ДокСсылка, + ИмяБезРасширения, + Размер, + Расширение, + АдресВременногоХранилищаФайла, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент = Ложь, + СсылкаНаВерсиюИсточник = Неопределено, + НоваяВерсияДатаСоздания = Неопределено, + НоваяВерсияАвтор = Неопределено, + НоваяВерсияКомментарий = Неопределено, + НоваяВерсияНомерВерсии = Неопределено) Экспорт + + Перем СсылкаНаТом; + + УстановитьПривилегированныйРежим(Истина); + + ЗапретЗагрузкиФайловПоРасширению = ПолучитьЗапретЗагрузкиФайловПоРасширению(); + СписокЗапрещенныхРасширений = ПолучитьСписокЗапрещенныхРасширений(); + РасширениеФайла = Расширение; + Если Не РаботаСФайламиКлиентСервер.РасширениеФайлаРазрешеноДляЗагрузки(ЗапретЗагрузкиФайловПоРасширению, СписокЗапрещенныхРасширений, РасширениеФайла) Тогда + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Загрузка файлов с расширением ""%1"" запрещена. Обратитесь к администратору системы.'"), + РасширениеФайла); + КонецЕсли; + + Версия = Справочники.ВерсииФайлов.СоздатьЭлемент(); + + Если НоваяВерсияНомерВерсии = Неопределено Тогда + Версия.НомерВерсии = НайтиМаксимальныйНомерВерсии(ДокСсылка) + 1; + Иначе + Версия.НомерВерсии = НоваяВерсияНомерВерсии; + КонецЕсли; + + Версия.Владелец = ДокСсылка; + Версия.ДатаМодификацииУниверсальная = ВремяИзмененияУниверсальное; + + Версия.Комментарий = НоваяВерсияКомментарий; + + Если НоваяВерсияАвтор = Неопределено Тогда + Версия.Автор = ОбщегоНазначения.ТекущийПользователь(); + Иначе + Версия.Автор = НоваяВерсияАвтор; + КонецЕсли; + + Если НоваяВерсияДатаСоздания = Неопределено Тогда + Версия.ДатаСоздания = ТекущаяДата(); + Иначе + Версия.ДатаСоздания = НоваяВерсияДатаСоздания; + КонецЕсли; + + Версия.ПолноеНаименование = ИмяБезРасширения; + Версия.Размер = Размер; + Версия.Расширение = РасширениеБезТочки(Расширение); + + ТипХраненияФайлов = Константы.ТипХраненияФайлов.Получить(); + Версия.ТипХраненияФайла = ТипХраненияФайлов; + + Если СсылкаНаВерсиюИсточник <> Неопределено Тогда // создание Файла из шаблона + + ТипХраненияФайловШаблона = СсылкаНаВерсиюИсточник.ТипХраненияФайла; + + Если ТипХраненияФайловШаблона = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе И ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + // и шаблон, и новый Файл - в базе + + // При создании Файла из шаблона хранилище значения копируется напрямую + Версия.ФайлХранилище = АдресВременногоХранилищаФайла; + + ИначеЕсли ТипХраненияФайловШаблона = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске И ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + // и шаблон, и новый Файл - на диске - просто копируем файл + + Если НЕ СсылкаНаВерсиюИсточник.Том.Пустая() Тогда + ПолныйПутьФайлаШаблона = ПолныйПутьТома(СсылкаНаВерсиюИсточник.Том) + СсылкаНаВерсиюИсточник.ПутьКФайлу; + + ПутьКФайлу = ""; + + // добавить в один из томов (где есть свободное место) + ДобавитьНаДиск(ПолныйПутьФайлаШаблона, ПутьКФайлу, СсылкаНаТом, ВремяИзменения, Версия.НомерВерсии, ИмяБезРасширения, Расширение, Версия.Размер); + Версия.ПутьКФайлу = ПутьКФайлу; + Версия.Том = СсылкаНаТом.Ссылка; + КонецЕсли; + + ИначеЕсли ТипХраненияФайловШаблона = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе И ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + // шаблон в базе, новый Файл - на диске + + ДвоичныеДанные = АдресВременногоХранилищаФайла.Получить(); // в этом случае в АдресВременногоХранилищаФайла находится ХранилищеЗначения с файлом + + ПутьКФайлу = ""; + + // добавить в один из томов (где есть свободное место) + ДобавитьНаДиск(ДвоичныеДанные, ПутьКФайлу, СсылкаНаТом, ВремяИзменения, Версия.НомерВерсии, ИмяБезРасширения, Расширение, Версия.Размер); + Версия.ПутьКФайлу = ПутьКФайлу; + Версия.Том = СсылкаНаТом.Ссылка; + + ИначеЕсли ТипХраненияФайловШаблона = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске И ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + // шаблон на диске, новый Файл - в базе + + Если НЕ СсылкаНаВерсиюИсточник.Том.Пустая() Тогда + ПолныйПутьФайлаШаблона = ПолныйПутьТома(СсылкаНаВерсиюИсточник.Том) + СсылкаНаВерсиюИсточник.ПутьКФайлу; + ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПутьФайлаШаблона); + Версия.ФайлХранилище = Новый ХранилищеЗначения(ДвоичныеДанные); + КонецЕсли; + + КонецЕсли; + Иначе // создание объекта Файл на основе выбранного файла с диска + + Если ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + Версия.ФайлХранилище = Новый ХранилищеЗначения( + ПолучитьИзВременногоХранилища(АдресВременногоХранилищаФайла)); + + Если (ЭтоВебКлиент = Истина) И (Версия.Размер = 0) Тогда + ДвоичныеДанныеФайла = Версия.ФайлХранилище.Получить(); + Версия.Размер = ДвоичныеДанныеФайла.Размер(); + + МаксРазмерФайла = ПолучитьМаксимальныйРазмерФайла(); + РазмерВМб = Версия.Размер / (1024 * 1024); + РазмерВМбМакс = МаксРазмерФайла / (1024 * 1024); + + Если Версия.Размер > МаксРазмерФайла Тогда + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Размер файла ""%1"" (%2 Мб) превышает максимально допустимый размер файла (%3 Мб).'"), + ИмяБезРасширения, + ?(РазмерВМб >= 1, Формат(РазмерВМб, "ЧДЦ=0"), Формат(РазмерВМб, "ЧДЦ=1; ЧН=0")), + ?(РазмерВМбМакс >= 1, Формат(РазмерВМбМакс, "ЧДЦ=0"), Формат(РазмерВМбМакс, "ЧДЦ=1; ЧН=0"))); + КонецЕсли; + + КонецЕсли; + + Иначе // хранение на диске + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилищаФайла); + + Если (ЭтоВебКлиент = Истина) И (Версия.Размер = 0) Тогда + Версия.Размер = ДвоичныеДанные.Размер(); + + МаксРазмерФайла = ПолучитьМаксимальныйРазмерФайла(); + РазмерВМб = Версия.Размер / (1024 * 1024); + РазмерВМбМакс = МаксРазмерФайла / (1024 * 1024); + + Если Версия.Размер > МаксРазмерФайла Тогда + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Размер файла ""%1"" (%2 Мб) превышает максимально допустимый размер файла (%3 Мб).'"), + ИмяБезРасширения, + ?(РазмерВМб >= 1, Формат(РазмерВМб, "ЧДЦ=0"), Формат(РазмерВМб, "ЧДЦ=1; ЧН=0")), + ?(РазмерВМбМакс >= 1, Формат(РазмерВМбМакс, "ЧДЦ=0"), Формат(РазмерВМбМакс, "ЧДЦ=1; ЧН=0"))); + КонецЕсли; + КонецЕсли; + + ПутьКФайлу = ""; + + // добавить в один из томов (где есть свободное место) + ДобавитьНаДиск(ДвоичныеДанные, ПутьКФайлу, СсылкаНаТом, ВремяИзменения, Версия.НомерВерсии, ИмяБезРасширения, Расширение, Версия.Размер); + Версия.ПутьКФайлу = ПутьКФайлу; + Версия.Том = СсылкаНаТом.Ссылка; + + КонецЕсли; // хранение на диске + + КонецЕсли; + + Версия.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; + + Если ТипЗнч(АдресВременногоХранилищаТекста) = Тип("ХранилищеЗначения") Тогда + // При создании Файла из шаблона хранилище значения копируется напрямую + Версия.ТекстХранилище = АдресВременногоХранилищаТекста; + Версия.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + ИначеЕсли Не ПустаяСтрока(АдресВременногоХранилищаТекста) Тогда + Текст = ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); + Версия.ТекстХранилище = Новый ХранилищеЗначения(Текст); + Версия.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + КонецЕсли; + + Если (ЭтоВебКлиент = Истина) И (Версия.Размер = 0) Тогда + ДвоичныеДанныеФайла = Версия.ФайлХранилище.Получить(); + Версия.Размер = ДвоичныеДанныеФайла.Размер(); + КонецЕсли; + + Версия.Записать(); + + Возврат Версия.Ссылка; +КонецФункции // СоздатьВерсию() + +// Подставляет ссылку на версию в карточку Файла +Процедура ОбновитьВерсиюВФайле(ФайлСсылка, Версия, Знач АдресВременногоХранилищаТекста, + УникальныйИдентификатор = Неопределено) Экспорт + + ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , УникальныйИдентификатор); + + ФайлОбъект.ТекущаяВерсия = Версия.Ссылка; + + Если ТипЗнч(АдресВременногоХранилищаТекста) = Тип("ХранилищеЗначения") Тогда + // При создании Файла из шаблона хранилище значения копируется напрямую + ФайлОбъект.ТекстХранилище = АдресВременногоХранилищаТекста; + Иначе + Текст = ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); + ФайлОбъект.ТекстХранилище = Новый ХранилищеЗначения(Текст); + КонецЕсли; + + ФайлОбъект.Записать(); + РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификатор); + +КонецПроцедуры // ОбновитьВерсиюВФайле() + +// Обновляет текстовую порцию из файла в карточке файла +Процедура ОбновитьТекстВФайле(ФайлСсылка, Знач АдресВременногоХранилищаТекста, УникальныйИдентификатор = Неопределено) + + ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, , УникальныйИдентификатор); + + Текст = ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); + ФайлОбъект.ТекстХранилище = Новый ХранилищеЗначения(Текст); + + ФайлОбъект.Записать(); + РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификатор); + +КонецПроцедуры // ОбновитьТекстВФайле() + +// Обновление или создание версии Файла и возврат ссылки на обновленную версию +Функция ОбновитьВерсию( + Файл, + СоздаватьВерсию, + АдресВременногоХранилищаФайла, + Комментарий, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + ИмяБезРасширения, + Расширение, + ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + УникальныйИдентификатор = Неопределено, + Зашифрован = Неопределено, + ВерсияСсылка = Неопределено, + СтатусИзвлеченияТекста = Неопределено) + + Перем СсылкаНаТом; + + УстановитьПривилегированныйРежим(Истина); + + ЗапретЗагрузкиФайловПоРасширению = ПолучитьЗапретЗагрузкиФайловПоРасширению(); + СписокЗапрещенныхРасширений = ПолучитьСписокЗапрещенныхРасширений(); + РасширениеФайла = Расширение; + Если Не РаботаСФайламиКлиентСервер.РасширениеФайлаРазрешеноДляЗагрузки(ЗапретЗагрузкиФайловПоРасширению, СписокЗапрещенныхРасширений, РасширениеФайла) Тогда + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Загрузка файлов с расширением ""%1"" запрещена. Обратитесь к администратору системы.'"), + РасширениеФайла); + КонецЕсли; + + СтарыйТипХранения = Неопределено; + ВерсияЗаблокирована = Ложь; + Версия = Неопределено; + + Если СоздаватьВерсию Тогда + Версия = Справочники.ВерсииФайлов.СоздатьЭлемент(); + Версия.РодительскаяВерсия = Файл.ТекущаяВерсия; + Версия.НомерВерсии = НайтиМаксимальныйНомерВерсии(Файл) + 1; + Иначе + + Если ВерсияСсылка = Неопределено Тогда + Версия = Файл.ТекущаяВерсия.ПолучитьОбъект(); + Иначе + Версия = ВерсияСсылка.ПолучитьОбъект(); + КонецЕсли; + + ЗаблокироватьДанныеДляРедактирования(Версия.Ссылка, , УникальныйИдентификатор); + ВерсияЗаблокирована = Истина; + + // удалим файл с диска - мы заместим его новым + Если Версия.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + Если НЕ Версия.Том.Пустая() Тогда + ПолныйПуть = ПолныйПутьТома(Версия.Том) + Версия.ПутьКФайлу; + Попытка + ФайлНаДиске = Новый Файл(ПолныйПуть); + ФайлНаДиске.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ПолныйПуть); + + ПутьСПодкаталогом = Файл.Путь; + МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*.*"); + Если МассивФайловВКаталоге.Количество() = 0 Тогда + УдалитьФайлы(ПутьСПодкаталогом); + КонецЕсли; + Исключение + КонецПопытки; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Версия.Владелец = Файл.Ссылка; + Версия.Автор = ОбщегоНазначения.ТекущийПользователь(); + Версия.ДатаМодификацииУниверсальная = ВремяИзмененияУниверсальное; + Версия.ДатаСоздания = ТекущаяДата(); + Версия.Размер = Размер; + Версия.ПолноеНаименование = ИмяБезРасширения; + Версия.Комментарий = Комментарий; + + Версия.Расширение = РасширениеБезТочки(Расширение); + + ТипХраненияФайлов = Константы.ТипХраненияФайлов.Получить(); + Версия.ТипХраненияФайла = ТипХраненияФайлов; + + Если ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + + Версия.ФайлХранилище = Новый ХранилищеЗначения( + ПолучитьИзВременногоХранилища(АдресВременногоХранилищаФайла)); + + Если (ЭтоВебКлиент = Истина) И (Версия.Размер = 0) Тогда + ДвоичныеДанныеФайла = Версия.ФайлХранилище.Получить(); + Версия.Размер = ДвоичныеДанныеФайла.Размер(); + + МаксРазмерФайла = ПолучитьМаксимальныйРазмерФайла(); + РазмерВМб = Версия.Размер / (1024 * 1024); + РазмерВМбМакс = МаксРазмерФайла / (1024 * 1024); + + Если Версия.Размер > МаксРазмерФайла Тогда + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Размер файла ""%1"" (%2 Мб) превышает максимально допустимый размер файла (%3 Мб).'"), + ИмяБезРасширения, + ?(РазмерВМб >= 1, Формат(РазмерВМб, "ЧДЦ=0"), Формат(РазмерВМб, "ЧДЦ=1; ЧН=0")), + ?(РазмерВМбМакс >= 1, Формат(РазмерВМбМакс, "ЧДЦ=0"), Формат(РазмерВМбМакс, "ЧДЦ=1; ЧН=0"))); + КонецЕсли; + + КонецЕсли; + + // очистим поля + Версия.ПутьКФайлу = ""; + Версия.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + Иначе // хранение на диске + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилищаФайла); + + Если (ЭтоВебКлиент = Истина) И (Версия.Размер = 0) Тогда + Версия.Размер = ДвоичныеДанные.Размер(); + + МаксРазмерФайла = ПолучитьМаксимальныйРазмерФайла(); + РазмерВМб = Версия.Размер / (1024 * 1024); + РазмерВМбМакс = МаксРазмерФайла / (1024 * 1024); + + Если Версия.Размер > МаксРазмерФайла Тогда + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Размер файла ""%1"" (%2 Мб) превышает максимально допустимый размер файла (%3 Мб).'"), + ИмяБезРасширения, + ?(РазмерВМб >= 1, Формат(РазмерВМб, "ЧДЦ=0"), Формат(РазмерВМб, "ЧДЦ=1; ЧН=0")), + ?(РазмерВМбМакс >= 1, Формат(РазмерВМбМакс, "ЧДЦ=0"), Формат(РазмерВМбМакс, "ЧДЦ=1; ЧН=0"))); + КонецЕсли; + + КонецЕсли; + + ПутьКФайлу = ""; + + // добавить в один из томов (где есть свободное место) + ДобавитьНаДиск(ДвоичныеДанные, ПутьКФайлу, СсылкаНаТом, ВремяИзменения, Версия.НомерВерсии, ИмяБезРасширения, Версия.Расширение, Версия.Размер); + Версия.ПутьКФайлу = ПутьКФайлу; + Версия.Том = СсылкаНаТом.Ссылка; + Версия.ФайлХранилище = Новый ХранилищеЗначения(""); // очистим ХранилищеЗначения + КонецЕсли; // хранение на диске + + Если НЕ ТекстНеИзвлеченНаКлиенте Тогда + ИзвлекатьТекстыФайловНаСервере = Константы.ИзвлекатьТекстыФайловНаСервере.Получить(); + Если ИзвлекатьТекстыФайловНаСервере = Ложь Тогда + Текст = ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); + Версия.ТекстХранилище = Новый ХранилищеЗначения(Текст); + Иначе + Версия.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; + КонецЕсли; + Иначе + Версия.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; + КонецЕсли; + + Если СтатусИзвлеченияТекста <> Неопределено Тогда + Версия.СтатусИзвлеченияТекста = СтатусИзвлеченияТекста; + КонецЕсли; + + Если (ЭтоВебКлиент = Истина) И (Версия.Размер = 0) Тогда + ДвоичныеДанныеФайла = Версия.ФайлХранилище.Получить(); + Версия.Размер = ДвоичныеДанныеФайла.Размер(); + КонецЕсли; + + Если Зашифрован <> Неопределено Тогда + Версия.Зашифрован = Зашифрован; + КонецЕсли; + + Версия.Записать(); + + Если ВерсияЗаблокирована Тогда + РазблокироватьДанныеДляРедактирования(Версия.Ссылка, УникальныйИдентификатор); + КонецЕсли; + + НавигационнаяСсылкаФайла = ПолучитьНавигационнуюСсылку(Файл); + ИсторияРаботыПользователя.Добавить(НавигационнаяСсылкаФайла); + + Возврат Версия.Ссылка; + +КонецФункции // ОбновитьВерсию + +// Обновляет или создает версию Файла и снимает заем +Процедура ОпубликоватьИОсвободитьФайл( + ДанныеФайла, + СоздаватьВерсию, + АдресВременногоХранилищаФайла, + Комментарий, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + ИмяБезРасширения, + Расширение, + ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + ВРабочемКаталогеВладельца, + НеМенятьЗаписьВРабочемКаталоге, + УникальныйИдентификатор = Неопределено) Экспорт + + ДанныеФайлаТекущие = ПолучитьДанныеФайла(ДанныеФайла.Ссылка); + Если Не ДанныеФайлаТекущие.РедактируетТекущийПользователь Тогда + ВызватьИсключение НСтр("ru = 'Файл не занят текущим пользователем'"); + КонецЕсли; + + НачатьТранзакцию(); + Попытка + + ПредыдущаяВерсия = ДанныеФайла.ТекущаяВерсия; + НоваяВерсия = ОбновитьВерсию( + ДанныеФайла.Ссылка, + СоздаватьВерсию, + АдресВременногоХранилищаФайла, + Комментарий, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + ИмяБезРасширения, + Расширение, + ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + УникальныйИдентификатор); + + Если СоздаватьВерсию Тогда + ОбновитьВерсиюВФайле(ДанныеФайла.Ссылка, НоваяВерсия, АдресВременногоХранилищаТекста, УникальныйИдентификатор); + Иначе + ОбновитьТекстВФайле(ДанныеФайла.Ссылка, АдресВременногоХранилищаТекста, УникальныйИдентификатор); + КонецЕсли; + ДанныеФайла.ТекущаяВерсия = НоваяВерсия; + + ОсвободитьФайл(ДанныеФайла, УникальныйИдентификатор); + + Если НЕ ЭтоВебКлиент И Не НеМенятьЗаписьВРабочемКаталоге Тогда + ИмяКаталога = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЛокальныйКэшФайлов", "ПутьКЛокальномуКэшуФайлов"); + УдалитьВерсиюИЗанестиИнформациюФайлаВРегистр( + ПредыдущаяВерсия, + НоваяВерсия, + ПолныйПутьКФайлу, + ИмяКаталога, + ДанныеФайла.РабочийКаталогВладельца <> ""); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры // ОпубликоватьИОсвободитьФайл() + +// Получает данные файла, затем обновляет или создает версию Файла и снимает заем +// Нужно для случаев, когда на клиенте нет ДанныеФайла (из соображений экономии вызовов клиент-сервер) +Процедура ПолучитьДанныеФайлаИОпубликоватьИОсвободитьФайл( + ОбъектСсылка, + ДанныеФайла, + СоздаватьВерсию, + АдресВременногоХранилищаФайла, + Комментарий, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + ИмяБезРасширения, + Расширение, + ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + УникальныйИдентификатор = Неопределено) Экспорт + + ДанныеФайла = ПолучитьДанныеФайла(ОбъектСсылка); + + Если Не ДанныеФайла.РедактируетТекущийПользователь Тогда + ВызватьИсключение НСтр("ru = 'Файл не занят текущим пользователем'"); + КонецЕсли; + + НачатьТранзакцию(); + Попытка + + ПредыдущаяВерсия = ДанныеФайла.ТекущаяВерсия; + НоваяВерсия = ОбновитьВерсию( + ДанныеФайла.Ссылка, + СоздаватьВерсию, + АдресВременногоХранилищаФайла, + Комментарий, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + ИмяБезРасширения, + Расширение, + ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + УникальныйИдентификатор); + + Если СоздаватьВерсию Тогда + ОбновитьВерсиюВФайле(ДанныеФайла.Ссылка, НоваяВерсия, АдресВременногоХранилищаТекста, УникальныйИдентификатор); + Иначе + ОбновитьТекстВФайле(ДанныеФайла.Ссылка, АдресВременногоХранилищаТекста, УникальныйИдентификатор); + КонецЕсли; + ДанныеФайла.ТекущаяВерсия = НоваяВерсия; + + ОсвободитьФайл(ДанныеФайла, УникальныйИдентификатор); + + Если НЕ ЭтоВебКлиент Тогда + ИмяКаталога = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЛокальныйКэшФайлов", "ПутьКЛокальномуКэшуФайлов"); + УдалитьВерсиюИЗанестиИнформациюФайлаВРегистр( + ПредыдущаяВерсия, + НоваяВерсия, + ПолныйПутьКФайлу, + ИмяКаталога, + ДанныеФайла.РабочийКаталогВладельца <> ""); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры // ПолучитьДанныеФайлаИОпубликоватьИОсвободитьФайл() + +// Процедура предназначена для опубликования файла без его освобождения +Процедура ОпубликоватьФайл( + Файл, + СоздаватьВерсию, + АдресВременногоХранилищаФайла, + Комментарий, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + ИмяБезРасширения, + Расширение, + ОтносительныйПутьКФайлу, + ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + ВРабочемКаталогеВладельца, + НеМенятьЗаписьВРабочемКаталоге, + УникальныйИдентификатор = Неопределено) Экспорт + + ДанныеФайлаТекущие = ПолучитьДанныеФайла(Файл); + Если Не ДанныеФайлаТекущие.РедактируетТекущийПользователь Тогда + ВызватьИсключение НСтр("ru = 'Файл не занят текущим пользователем'"); + КонецЕсли; + + НачатьТранзакцию(); + Попытка + + СтараяВерсия = Файл.ТекущаяВерсия; + + Версия = ОбновитьВерсию( + Файл, + СоздаватьВерсию, + АдресВременногоХранилищаФайла, + Комментарий, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + ИмяБезРасширения, + Расширение, + ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + УникальныйИдентификатор); + + Если СоздаватьВерсию Тогда + ОбновитьВерсиюВФайле(Файл, Версия, АдресВременногоХранилищаТекста, УникальныйИдентификатор); + Иначе + ОбновитьТекстВФайле(Файл, АдресВременногоХранилищаТекста, УникальныйИдентификатор); + КонецЕсли; + + Если НЕ ЭтоВебКлиент И Не НеМенятьЗаписьВРабочемКаталоге Тогда + УдалитьИзРегистра(СтараяВерсия); + НаЧтение = Ложь; + ЗаписатьИмяФайлаСПутемВРегистр(Версия, ОтносительныйПутьКФайлу, НаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры // ОпубликоватьФайл() + +// получает РедактируетТекущийПользователь - в привилегированном режиме +Функция ПолучитьРедактируетТекущийПользователь(ВерсияСсылка) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + + Запрос.Текст = "ВЫБРАТЬ + | Файлы.Редактирует КАК Редактирует + |ИЗ + | Справочник.Файлы КАК Файлы + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВерсииФайлов КАК ВерсииФайлов + | ПО (ИСТИНА) + |ГДЕ + | ВерсииФайлов.Ссылка = &Версия + | И Файлы.Ссылка = ВерсииФайлов.Владелец"; + + Запрос.Параметры.Вставить("Версия", ВерсияСсылка); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + РедактируетТекущийПользователь = (Выборка.Редактирует = ОбщегоНазначения.ТекущийПользователь()); + Возврат РедактируетТекущийПользователь; + КонецЦикла; + + Возврат Ложь; +КонецФункции + +// Функция возвращает структуру, содержащую различные сведения о Файле и версии +Функция ПолучитьДанныеФайла(ФайлСсылка, ВерсияСсылка = Неопределено) Экспорт + + Запрос = Новый Запрос; + + Если ВерсияСсылка = Справочники.ВерсииФайлов.ПустаяСсылка() Тогда + ВерсияСсылка = Неопределено; + КонецЕсли; + + Если ВерсияСсылка = Неопределено Тогда + + Запрос.Текст = "ВЫБРАТЬ + | Файлы.Ссылка КАК Ссылка, + | Файлы.Код КАК Код, + | Файлы.Редактирует КАК Редактирует, + | Файлы.ТекущаяВерсия КАК ТекущаяВерсия, + | Файлы.ВладелецФайла КАК ВладелецФайла, + | Файлы.ХранитьВерсии КАК ХранитьВерсии, + | Файлы.ПометкаУдаления КАК ПометкаУдаления, + | ВерсииФайлов.ПолноеНаименование КАК ПолноеНаименование, + | ВерсииФайлов.Расширение КАК Расширение, + | ВерсииФайлов.Размер КАК Размер, + | ВерсииФайлов.НомерВерсии КАК НомерВерсии, + | ВерсииФайлов.ПутьКФайлу КАК ПутьКФайлу, + | ВерсииФайлов.Том КАК Том, + | ВерсииФайлов.ДатаМодификацииУниверсальная КАК ДатаМодификацииУниверсальная, + | ВерсииФайлов.Автор КАК Автор, + | ВерсииФайлов.СтатусИзвлеченияТекста КАК СтатусИзвлеченияТекста, + | Файлы.Зашифрован КАК Зашифрован + |ИЗ + | Справочник.Файлы КАК Файлы + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВерсииФайлов КАК ВерсииФайлов + | ПО Файлы.ТекущаяВерсия = ВерсииФайлов.Ссылка"; + + Если ТипЗнч(ФайлСсылка) = Тип("Массив") Тогда + Запрос.Текст = Запрос.Текст + " ГДЕ Файлы.Ссылка В (&Файл) "; + Иначе + Запрос.Текст = Запрос.Текст + " ГДЕ Файлы.Ссылка = &Файл "; + КонецЕсли; + + Запрос.Параметры.Вставить("Файл", ФайлСсылка); + + Иначе + + Если ФайлСсылка <> Неопределено Тогда + Запрос.Текст = "ВЫБРАТЬ + | Файлы.Ссылка КАК Ссылка, + | Файлы.Код КАК Код, + | Файлы.Редактирует КАК Редактирует, + | Файлы.ТекущаяВерсия КАК ТекущаяВерсия, + | Файлы.ВладелецФайла КАК ВладелецФайла, + | Файлы.ХранитьВерсии КАК ХранитьВерсии, + | Файлы.ПометкаУдаления КАК ПометкаУдаления, + | ВерсииФайлов.ПолноеНаименование КАК ПолноеНаименование, + | ВерсииФайлов.Расширение КАК Расширение, + | ВерсииФайлов.Размер КАК Размер, + | ВерсииФайлов.НомерВерсии КАК НомерВерсии, + | ВерсииФайлов.ПутьКФайлу КАК ПутьКФайлу, + | ВерсииФайлов.Том КАК Том, + | ВерсииФайлов.ДатаМодификацииУниверсальная КАК ДатаМодификацииУниверсальная, + | ВерсииФайлов.Автор КАК Автор, + | ВерсииФайлов.СтатусИзвлеченияТекста КАК СтатусИзвлеченияТекста, + | Файлы.Зашифрован КАК Зашифрован + |ИЗ + | Справочник.Файлы КАК Файлы + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВерсииФайлов КАК ВерсииФайлов + | ПО (ИСТИНА) + |ГДЕ + | Файлы.Ссылка = &Файл + | И ВерсииФайлов.Ссылка = &Версия"; + + Запрос.Параметры.Вставить("Файл", ФайлСсылка); + Запрос.Параметры.Вставить("Версия", ВерсияСсылка); + Иначе + Запрос.Текст = "ВЫБРАТЬ + | Файлы.Ссылка КАК Ссылка, + | Файлы.Код КАК Код, + | Файлы.Редактирует КАК Редактирует, + | Файлы.ТекущаяВерсия КАК ТекущаяВерсия, + | Файлы.ВладелецФайла КАК ВладелецФайла, + | Файлы.ХранитьВерсии КАК ХранитьВерсии, + | Файлы.ПометкаУдаления КАК ПометкаУдаления, + | ВерсииФайлов.ПолноеНаименование КАК ПолноеНаименование, + | ВерсииФайлов.Расширение КАК Расширение, + | ВерсииФайлов.Размер КАК Размер, + | ВерсииФайлов.НомерВерсии КАК НомерВерсии, + | ВерсииФайлов.ПутьКФайлу КАК ПутьКФайлу, + | ВерсииФайлов.Том КАК Том, + | ВерсииФайлов.ДатаМодификацииУниверсальная КАК ДатаМодификацииУниверсальная, + | ВерсииФайлов.Автор КАК Автор, + | ВерсииФайлов.СтатусИзвлеченияТекста КАК СтатусИзвлеченияТекста, + | Файлы.Зашифрован КАК Зашифрован + |ИЗ + | Справочник.Файлы КАК Файлы + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВерсииФайлов КАК ВерсииФайлов + | ПО (ИСТИНА) + |ГДЕ + | ВерсииФайлов.Ссылка = &Версия + | И Файлы.Ссылка = ВерсииФайлов.Владелец"; + + Запрос.Параметры.Вставить("Версия", ВерсияСсылка); + КонецЕсли; + + КонецЕсли; + + МассивДанныеФайла = Новый Массив; + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + + ДанныеФайла = Новый Структура; + ДанныеФайла.Вставить("Ссылка", Выборка.Ссылка); + ДанныеФайла.Вставить("КодФайла", Выборка.Код); + ДанныеФайла.Вставить("Редактирует", Выборка.Редактирует); + ДанныеФайла.Вставить("Владелец", Выборка.ВладелецФайла); + ДанныеФайла.Вставить("НавигационнаяСсылка", ПолучитьНавигационнуюСсылку(Выборка.Ссылка)); + + Если ВерсияСсылка <> Неопределено Тогда + ДанныеФайла.Вставить("Версия", ВерсияСсылка); + Иначе + ДанныеФайла.Вставить("Версия", Выборка.ТекущаяВерсия); + КонецЕсли; + + ДанныеФайла.Вставить("ТекущаяВерсия", Выборка.ТекущаяВерсия); + ДанныеФайла.Вставить("НавигационнаяСсылкаТекущейВерсии", ПолучитьНавигационнуюСсылку(ДанныеФайла.ТекущаяВерсия, "ФайлХранилище")); + + ДанныеФайла.Вставить("Размер", Выборка.Размер); + ДанныеФайла.Вставить("НомерВерсии", Выборка.НомерВерсии); + ДанныеФайла.Вставить("ДатаМодификацииУниверсальная", Выборка.ДатаМодификацииУниверсальная); + ДанныеФайла.Вставить("Расширение", Выборка.Расширение); + ДанныеФайла.Вставить("ПолноеНаименованиеВерсии", СокрЛП(Выборка.ПолноеНаименование)); + ДанныеФайла.Вставить("ХранитьВерсии", Выборка.ХранитьВерсии); + ДанныеФайла.Вставить("ПометкаУдаления", Выборка.ПометкаУдаления); + ДанныеФайла.Вставить("АвторТекущейВерсии", Выборка.Автор); + ДанныеФайла.Вставить("Зашифрован", Выборка.Зашифрован); + + Если ДанныеФайла.Зашифрован Тогда + МассивСертификатовШифрования = ПолучитьМассивСертификатовШифрования(ДанныеФайла.Ссылка); + ДанныеФайла.Вставить("МассивСертификатовШифрования", МассивСертификатовШифрования); + КонецЕсли; + + НаЧтение = ДанныеФайла.Редактирует <> ОбщегоНазначения.ТекущийПользователь(); + ДанныеФайла.Вставить("НаЧтение", НаЧтение); + + ВРабочемКаталогеНаЧтение = Истина; + ВРабочемКаталогеВладельца = Ложь; + ИмяКаталога = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЛокальныйКэшФайлов", "ПутьКЛокальномуКэшуФайлов"); + Если ИмяКаталога = Неопределено Тогда + ИмяКаталога = ""; + КонецЕсли; + + Если ВерсияСсылка <> Неопределено Тогда + ИмяФайлаСПутемВРабочемКаталоге = ПолучитьИмяФайлаСПутемИзРегистра(ВерсияСсылка, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + Иначе + ИмяФайлаСПутемВРабочемКаталоге = ПолучитьИмяФайлаСПутемИзРегистра(Выборка.ТекущаяВерсия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + ДанныеФайла.Вставить("ИмяФайлаСПутемВРабочемКаталоге", ИмяФайлаСПутемВРабочемКаталоге); + ДанныеФайла.Вставить("ВРабочемКаталогеНаЧтение", ВРабочемКаталогеНаЧтение); + ДанныеФайла.Вставить("РабочийКаталогВладельца", ""); + + РедактируетТекущийПользователь = (ДанныеФайла.Редактирует = ОбщегоНазначения.ТекущийПользователь()); + ДанныеФайла.Вставить("РедактируетТекущийПользователь", РедактируетТекущийПользователь); + + СтатусИзвлеченияТекстаСтрока = "НеИзвлечен"; + Если Выборка.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен Тогда + СтатусИзвлеченияТекстаСтрока = "НеИзвлечен"; + ИначеЕсли Выборка.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен Тогда + СтатусИзвлеченияТекстаСтрока = "Извлечен"; + ИначеЕсли Выборка.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.ИзвлечьНеУдалось Тогда + СтатусИзвлеченияТекстаСтрока = "ИзвлечьНеУдалось"; + КонецЕсли; + ДанныеФайла.Вставить("СтатусИзвлеченияТекста", СтатусИзвлеченияТекстаСтрока); + + МассивДанныеФайла.Добавить(ДанныеФайла); + + КонецЦикла; + + // если был передан массив - возвращаем массив + Если ТипЗнч(ФайлСсылка) = Тип("Массив") Тогда + Возврат МассивДанныеФайла; + КонецЕсли; + + Если МассивДанныеФайла.Количество() > 0 Тогда + Возврат МассивДанныеФайла[0]; + Иначе + Возврат Новый Структура; + КонецЕсли; + +КонецФункции + +// Получает строку из временного хранилища (передача с клиента на сервер +//делается через временное хранилище) +Функция ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста) + Если ПустаяСтрока(АдресВременногоХранилищаТекста) Тогда + Возврат ""; + КонецЕсли; + + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); + ПолучитьИзВременногоХранилища(АдресВременногоХранилищаТекста).Записать(ИмяВременногоФайла); + + ТекстовыйФайл = Новый ЧтениеТекста(ИмяВременногоФайла, КодировкаТекста.UTF8); + Текст = ТекстовыйФайл.Прочитать(); + ТекстовыйФайл.Закрыть(); + УдалитьФайлы(ИмяВременногоФайла); + Возврат Текст; +КонецФункции + +// Создает карточку Файла в БД вместе с версией +Функция СоздатьФайлСВерсией( + ВладелецФайла, + ИмяБезРасширения, + РасширениеБезТочки, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + АдресВременногоХранилищаФайла, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + Пользователь = Неопределено, + Комментарий = "") Экспорт + + НачатьТранзакцию(); + Попытка + + // Создадим карточку Файла в БД + Док = СоздатьФайл( + ВладелецФайла, + Комментарий, + ИмяБезРасширения, + РасширениеБезТочки, + Истина, + АдресВременногоХранилищаТекста, + Пользователь); + + // Создадим версию сохраняемого файла для сохранения в карточке Файла + Версия = СоздатьВерсию( + ВремяИзменения, + ВремяИзмененияУниверсальное, + Док, + ИмяБезРасширения, + Размер, + РасширениеБезТочки, + АдресВременногоХранилищаФайла, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + Неопределено, // СсылкаНаВерсиюИсточник + Неопределено, // НоваяВерсияДатаСоздания + Пользователь); + + // Подставим ссылку на версию в карточку Файла + ОбновитьВерсиюВФайле(Док, Версия, АдресВременногоХранилищаТекста); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Возврат Док; +КонецФункции + +// Получает данные файла и делает заем (checkout) - для экономии вызовов +//клиент сервер поместили ПолучитьДанныеФайла и ЗанятьФайл в одну функцию +Функция ПолучитьДанныеФайлаИЗанятьФайл(ФайлСсылка, ДанныеФайла, СтрокаОшибки, УникальныйИдентификатор = Неопределено) Экспорт + + ДанныеФайла = ПолучитьДанныеФайла(ФайлСсылка); + + СтрокаОшибки = ""; + Если НЕ РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки) Тогда + Возврат Ложь; + КонецЕсли; + + Если ДанныеФайла.Редактирует.Пустая() Тогда + + СтрокаОшибки = ""; + Если Не ЗанятьФайл(ДанныеФайла, СтрокаОшибки, УникальныйИдентификатор) Тогда + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + Возврат Истина; +КонецФункции // ПолучитьДанныеФайлаИЗанятьФайл() + + +// получает ДанныеФайла и делает заем для массива файлов. При ошибке продолжает работу +// в МассивДанныхФайла возвращает только успешно занятые файлы +Процедура ПолучитьДанныеИЗанятьМассивФайлов(МассивОтмеченныхПодчиненных, МассивДанныхФайла, УникальныйИдентификатор = Неопределено) Экспорт + + Для Каждого СтруктураПодчиненного Из МассивОтмеченныхПодчиненных Цикл + ДанныеФайла = ПолучитьДанныеФайла(СтруктураПодчиненного.ПодчиненныйФайл, Неопределено); + + СтрокаОшибки = ""; + Если РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки) Тогда + + Если ДанныеФайла.Редактирует.Пустая() Тогда + Если ЗанятьФайл(ДанныеФайла, СтрокаОшибки, УникальныйИдентификатор) Тогда + МассивДанныхФайла.Добавить(ДанныеФайла); + КонецЕсли; + КонецЕсли; + + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// получает ДанныеФайла для подчиненных файлов и помещает в МассивДанныхФайла +Процедура ПолучитьДанныеМассиваФайлов(МассивОтмеченныхПодчиненных, МассивДанныхФайла) Экспорт + + Для Каждого СтруктураПодчиненного Из МассивОтмеченныхПодчиненных Цикл + ДанныеФайла = ПолучитьДанныеФайла(СтруктураПодчиненного.ПодчиненныйФайл, Неопределено); + МассивДанныхФайла.Добавить(ДанныеФайла); + КонецЦикла; + +КонецПроцедуры + +// получает ДанныеФайла для файлов и помещает в МассивДанныхФайла +Процедура ПолучитьДанныеДляМассиваФайлов(Знач МассивФайлов, МассивДанныхФайла) Экспорт + + Для Каждого Файл Из МассивФайлов Цикл + ДанныеФайла = ПолучитьДанныеФайла(Файл, Неопределено); + МассивДанныхФайла.Добавить(ДанныеФайла); + КонецЦикла; + +КонецПроцедуры + + +// Получает данные файла для открытия и делает заем (checkout) - для экономии вызовов +//клиент сервер поместили ПолучитьДанныеФайлаДляОткрытия и ЗанятьФайл в одну функцию +Функция ПолучитьДанныеФайлаДляОткрытияИЗанятьФайл(ФайлСсылка, ДанныеФайла, СтрокаОшибки, + УникальныйИдентификатор = Неопределено, РабочийКаталогВладельца = Неопределено) Экспорт + + ДанныеФайла = ПолучитьДанныеФайлаДляОткрытия(ФайлСсылка, Неопределено, УникальныйИдентификатор, РабочийКаталогВладельца); + + СтрокаОшибки = ""; + Если НЕ РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки) Тогда + Возврат Ложь; + КонецЕсли; + + Если ДанныеФайла.Редактирует.Пустая() Тогда + + СтрокаОшибки = ""; + Если Не ЗанятьФайл(ДанныеФайла, СтрокаОшибки, УникальныйИдентификатор) Тогда + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + Возврат Истина; +КонецФункции // ПолучитьДанныеФайлаИЗанятьФайл() + +// делает ПоместитьВоВременноеХранилище (если файл хранится на диске) и возвращает нужную ссылку +Функция ПолучитьНавигационнуюСсылкуДляОткрытия(ВерсияСсылка, ИдентификаторФормы = Неопределено) Экспорт + Адрес = ""; + + ТипХраненияФайла = ВерсияСсылка.ТипХраненияФайла; + + Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + Если НЕ ВерсияСсылка.Том.Пустая() Тогда + ПолныйПуть = ПолныйПутьТома(ВерсияСсылка.Том) + ВерсияСсылка.ПутьКФайлу; + Попытка + ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть); + Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы); + Исключение + // запись в журнал регистрации + СообщениеОбОшибке = СформироватьТекстОшибкиПолученияФайлСТомаДляАдминистратора(ИнформацияОбОшибке(), ВерсияСсылка.Владелец); + ЗаписьЖурналаРегистрации("Открытие файла", УровеньЖурналаРегистрации.Ошибка, Метаданные.Справочники.Файлы, ВерсияСсылка.Владелец, СообщениеОбОшибке); + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка открытия файла - файл не найден на сервере. Возможно он удален антивирусной программой. Обратитесь к администратору. + | Файл: ""%1.%2""'"), + ВерсияСсылка.ПолноеНаименование, + ВерсияСсылка.Расширение); + КонецПопытки; + КонецЕсли; + Иначе + Адрес = ПолучитьНавигационнуюСсылку(ВерсияСсылка, "ФайлХранилище"); + КонецЕсли; + + Возврат Адрес; +КонецФункции // ПолучитьНавигационнуюСсылкуДляОткрытия() + +// Возвращает имя с расширением- если расширение пусто - только имя +Функция ПолучитьИмяСРасширением(ПолноеНаименование, Расширение) + ИмяСРасширением = ПолноеНаименование; + + Если Расширение <> "" Тогда + ИмяСРасширением = ИмяСРасширением + "." + Расширение; + КонецЕсли; + + Возврат ИмяСРасширением; +КонецФункции + +// делает ПолучитьДанныеФайла и вычисляет РабочийКаталогВладельца +Функция ПолучитьДанныеФайлаИРабочийКаталог(ФайлСсылка, ВерсияСсылка = Неопределено, + РабочийКаталогВладельца = Неопределено) Экспорт + + ДанныеФайла = ПолучитьДанныеФайла(ФайлСсылка, ВерсияСсылка); + + Если РабочийКаталогВладельца = Неопределено Тогда + РабочийКаталогВладельца = ПолучитьРабочийКаталог(ДанныеФайла.Владелец); + КонецЕсли; + ДанныеФайла.Вставить("РабочийКаталогВладельца", РабочийКаталогВладельца); + + Если ДанныеФайла.РабочийКаталогВладельца <> "" Тогда + + ИмяФайлаСПутемВРабочемКаталоге = ""; + ИмяКаталога = ""; // путь к локал кеш здесь не используется + ВРабочемКаталогеНаЧтение = Истина; // не используется + ВРабочемКаталогеВладельца = Истина; + + Если ВерсияСсылка <> Неопределено Тогда + ИмяФайлаСПутемВРабочемКаталоге = ПолучитьИмяФайлаСПутемИзРегистра(ВерсияСсылка, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + Иначе + ИмяФайлаСПутемВРабочемКаталоге = ПолучитьИмяФайлаСПутемИзРегистра(ФайлСсылка.ТекущаяВерсия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + ДанныеФайла.Вставить("ИмяФайлаСПутемВРабочемКаталоге", ИмяФайлаСПутемВРабочемКаталоге); + КонецЕсли; + + Возврат ДанныеФайла; +КонецФункции // ПолучитьДанныеФайлаИРабочийКаталог() + + +// делает ПолучитьДанныеФайла и вычисляет количество версий файла +Функция ПолучитьДанныеФайлаИКоличествоВерсий(ФайлСсылка) Экспорт + + ДанныеФайла = ПолучитьДанныеФайла(ФайлСсылка); + КоличествоВерсий = ПолучитьКоличествоВерсий(ФайлСсылка); + ДанныеФайла.Вставить("КоличествоВерсий", КоличествоВерсий); + Возврат ДанныеФайла; +КонецФункции // ПолучитьДанныеФайлаИРабочийКаталог() + +// Формирует текст ошибки для помещения в журнал регистрации +Функция СформироватьТекстОшибкиПолученияФайлСТомаДляАдминистратора(ИнформацияОбОшибкеФункции, ФайлСсылка) Экспорт + СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибкеФункции); + СообщениеОбОшибке = СообщениеОбОшибке + Символы.ПС + Нстр("ru = 'Ссылка на файл: '"); + Если ФайлСсылка <> Неопределено Тогда + СообщениеОбОшибке = СообщениеОбОшибке + ПолучитьНавигационнуюСсылку(ФайлСсылка); + КонецЕсли; + Возврат СообщениеОбОшибке; +КонецФункции // ПолучитьДанныеФайлаИРабочийКаталог() + +// делает ПолучитьДанныеФайла + ПоместитьВоВременноеХранилище (если файл хранится на диске) +Функция ПолучитьДанныеФайлаДляОткрытия(ФайлСсылка, ВерсияСсылка = Неопределено, + ИдентификаторФормы = Неопределено, РабочийКаталогВладельца = Неопределено) Экспорт + + ДанныеФайла = ПолучитьДанныеФайла(ФайлСсылка, ВерсияСсылка); + + Если РабочийКаталогВладельца = Неопределено Тогда + РабочийКаталогВладельца = ПолучитьРабочийКаталог(ДанныеФайла.Владелец); + КонецЕсли; + ДанныеФайла.Вставить("РабочийКаталогВладельца", РабочийКаталогВладельца); + + Если ДанныеФайла.РабочийКаталогВладельца <> "" Тогда + ИмяФайла = ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + ИмяФайлаСПутемВРабочемКаталоге = РабочийКаталогВладельца + ИмяФайла; + ДанныеФайла.Вставить("ИмяФайлаСПутемВРабочемКаталоге", ИмяФайлаСПутемВРабочемКаталоге); + КонецЕсли; + + ТипХраненияФайла = ДанныеФайла.Версия.ТипХраненияФайла; + + Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске И ДанныеФайла.Версия <> Неопределено Тогда + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + + Запрос.Текст = "ВЫБРАТЬ + | ВерсииФайлов.ПутьКФайлу КАК ПутьКФайлу, + | ВерсииФайлов.Том КАК Том + |ИЗ + | Справочник.ВерсииФайлов КАК ВерсииФайлов + |ГДЕ + | ВерсииФайлов.Ссылка = &Версия"; + + Запрос.Параметры.Вставить("Версия", ДанныеФайла.Версия); + + ДанныеФайлаТом = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + ДанныеФайлаПутьКФайлу = ""; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + ДанныеФайлаТом = Выборка.Том; + ДанныеФайлаПутьКФайлу = Выборка.ПутьКФайлу; + КонецЕсли; + + Если НЕ ДанныеФайлаТом.Пустая() Тогда + ПолныйПуть = ПолныйПутьТома(ДанныеФайлаТом) + ДанныеФайлаПутьКФайлу; + Попытка + ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть); + // работаем только с текущей версией - для не-текущей ссылку получаем в ПолучитьНавигационнуюСсылкуДляОткрытия + ДанныеФайла.НавигационнаяСсылкаТекущейВерсии = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы); + Исключение + // запись в журнал регистрации + СообщениеОбОшибке = СформироватьТекстОшибкиПолученияФайлСТомаДляАдминистратора(ИнформацияОбОшибке(), ФайлСсылка); + ЗаписьЖурналаРегистрации("Открытие файла", УровеньЖурналаРегистрации.Ошибка, Метаданные.Справочники.Файлы, ФайлСсылка, СообщениеОбОшибке); + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка открытия файла - файл не найден на сервере. Возможно он удален антивирусной программой. Обратитесь к администратору. + | Файл: ""%1.%2""'"), + ДанныеФайла.ПолноеНаименованиеВерсии, + ДанныеФайла.Расширение); + КонецПопытки; + КонецЕсли; + КонецЕсли; + + Возврат ДанныеФайла; +КонецФункции // ПолучитьДанныеФайлаДляОткрытия() + + +// Освобождение Файла с получением данных +Процедура ПолучитьДанныеФайлаИОсвободитьФайл(ФайлСсылка, ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт + + ДанныеФайла = ПолучитьДанныеФайла( + ФайлСсылка); + + ОсвободитьФайл(ДанныеФайла, УникальныйИдентификатор); +КонецПроцедуры + +// получает ДанныеФайла и делает освобождение для массива файлов. При ошибке продолжает работу +// в МассивДанныхФайла возвращает только успешно освобожденные файлы +Процедура ПолучитьДанныеИОсвободитьМассивФайлов(МассивОтмеченныхПодчиненных, МассивДанныхФайла, УникальныйИдентификатор = Неопределено) Экспорт + + Для Каждого СтруктураПодчиненного Из МассивОтмеченныхПодчиненных Цикл + + ДанныеФайла = ПолучитьДанныеФайла(СтруктураПодчиненного.ПодчиненныйФайл, Неопределено); + + Если Не ДанныеФайла.Редактирует.Пустая() Тогда + ОсвободитьФайл(ДанныеФайла, УникальныйИдентификатор); + МассивДанныхФайла.Добавить(ДанныеФайла); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + + +// Процедура предназначена для опубликования файла без его освобождения +Процедура ПолучитьДанныеФайлаИОпубликоватьФайл( + Файл, + ДанныеФайла, + СоздаватьВерсию, + АдресВременногоХранилищаФайла, + Комментарий, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + ИмяБезРасширения, + Расширение, + ОтносительныйПутьКФайлу, + ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + ВРабочемКаталогеВладельца, + УникальныйИдентификатор = Неопределено) Экспорт + + ДанныеФайла = ПолучитьДанныеФайла( + Файл); + + Если Не ДанныеФайла.РедактируетТекущийПользователь Тогда + ВызватьИсключение НСтр("ru = 'Файл не занят текущим пользователем'"); + КонецЕсли; + + НеМенятьЗаписьВРабочемКаталоге = Ложь; + + ОпубликоватьФайл( + Файл, + СоздаватьВерсию, + АдресВременногоХранилищаФайла, + Комментарий, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + ИмяБезРасширения, + Расширение, + ОтносительныйПутьКФайлу, + ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + ВРабочемКаталогеВладельца, + НеМенятьЗаписьВРабочемКаталоге, + УникальныйИдентификатор); +КонецПроцедуры + +// Получает синтетический рабочий каталог папки на диске (он может прийти от родительской папки) +Функция ПолучитьРабочийКаталог(СсылкаПапки) Экспорт + Если ТипЗнч(СсылкаПапки) <> Тип("СправочникСсылка.ПапкиФайлов") Тогда + Возврат ""; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + РабочийКаталог = ""; + + // Подготовить структуру отбора по измерениям + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("Папка", СсылкаПапки); + СтруктураОтбора.Вставить("Пользователь", ОбщегоНазначения.ТекущийПользователь()); + + // Получить структуру с данными ресурсов записи + СтруктураРесурсов = РегистрыСведений.РабочиеКаталогиФайлов.Получить(СтруктураОтбора); + + // Получить путь из регистра + РабочийКаталог = СтруктураРесурсов.Путь; + + Если НЕ ПустаяСтрока(РабочийКаталог) Тогда + // Добавляем слэш в конце, если его нет + Если Прав(РабочийКаталог,1) <> "\" Тогда + РабочийКаталог = РабочийКаталог + "\"; + КонецЕсли; + КонецЕсли; + + Возврат РабочийКаталог; +КонецФункции + +// Сохраняет в регистре сведений рабочий каталог папки +Процедура СохранитьРабочийКаталог(СсылкаПапки, РабочийКаталогВладельца) Экспорт + УстановитьПривилегированныйРежим(Истина); + + НаборЗаписей = РегистрыСведений.РабочиеКаталогиФайлов.СоздатьНаборЗаписей(); + + НаборЗаписей.Отбор.Папка.Установить(СсылкаПапки); + НаборЗаписей.Отбор.Пользователь.Установить(ОбщегоНазначения.ТекущийПользователь()); + + НоваяЗапись = НаборЗаписей.Добавить(); + НоваяЗапись.Папка = СсылкаПапки; + НоваяЗапись.Пользователь = ОбщегоНазначения.ТекущийПользователь(); + НоваяЗапись.Путь = РабочийКаталогВладельца; + + НаборЗаписей.Записать(); +КонецПроцедуры + + +// Очищает в регистре сведений рабочий каталог папки +Процедура ОчиститьРабочийКаталог(СсылкаПапки) Экспорт + УстановитьПривилегированныйРежим(Истина); + + НаборЗаписей = РегистрыСведений.РабочиеКаталогиФайлов.СоздатьНаборЗаписей(); + + НаборЗаписей.Отбор.Папка.Установить(СсылкаПапки); + НаборЗаписей.Отбор.Пользователь.Установить(ОбщегоНазначения.ТекущийПользователь()); + + // не добавляем записи в набор - чтобы все стереть + НаборЗаписей.Записать(); + + + // для дочерних папок очищаем рабочие каталоги + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ПапкиФайлов.Ссылка КАК Ссылка + |ИЗ + | Справочник.ПапкиФайлов КАК ПапкиФайлов + |ГДЕ + | ПапкиФайлов.Родитель = &Ссылка"; + + Запрос.УстановитьПараметр("Ссылка", СсылкаПапки); + + Результат = Запрос.Выполнить(); + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + ОчиститьРабочийКаталог(Выборка.Ссылка); + КонецЦикла; + +КонецПроцедуры + +// Находит запись в регистре сведений ФайлыВРабочемКаталоге по пути файла на диске (относительному) +Функция НайтиВРегистреПоПути(Имяфайла, Версия, ДатаПомещения, Владелец, НомерВерсии, ВРегистреНаЧтение, ВРегистреКодФайла, ВРегистреПапка) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Версия = Новый ("СправочникСсылка.ВерсииФайлов"); + + // Для каждого по пути находим запись в регистре сведений - оттуда берем поле + // Версия и Размер и ДатаПомещенияВРабочийКаталог + ЗапросВРегистр = Новый Запрос; + ЗапросВРегистр.УстановитьПараметр("Имяфайла", Имяфайла); + ЗапросВРегистр.УстановитьПараметр("Пользователь", ОбщегоНазначения.ТекущийПользователь()); + ЗапросВРегистр.Текст = "ВЫБРАТЬ + | ФайлыВРабочемКаталоге.Версия КАК Версия, + | ФайлыВРабочемКаталоге.ДатаПомещенияВРабочийКаталог КАК ДатаПомещенияВРабочийКаталог, + | ФайлыВРабочемКаталоге.НаЧтение КАК НаЧтение + |ИЗ + | РегистрСведений.ФайлыВРабочемКаталоге КАК ФайлыВРабочемКаталоге + |ГДЕ + | ФайлыВРабочемКаталоге.Путь = &Имяфайла + | И ФайлыВРабочемКаталоге.Пользователь = &Пользователь"; + + РезультатЗапроса = ЗапросВРегистр.Выполнить(); + + Если НЕ РезультатЗапроса.Пустой() Тогда + Выборка = РезультатЗапроса.Выбрать(); + Выборка.Следующий(); + + Версия = Выборка.Версия; + ДатаПомещения = Выборка.ДатаПомещенияВРабочийКаталог; + + Владелец = Версия.Владелец; + НомерВерсии = Версия.НомерВерсии; + ВРегистреНаЧтение = Выборка.НаЧтение; + ВРегистреКодФайла = Версия.Владелец.Код; + ВРегистреПапка = Владелец.ВладелецФайла; + Возврат Истина; + КонецЕсли; + + Возврат Ложь; +КонецФункции + +// Возвращает с сервера на клиент идентификатор текущего пользователя +Функция ПараметрыСеансаИдентификаторТекущегоПользователя() Экспорт + Возврат ОбщегоНазначения.ТекущийПользователь().УникальныйИдентификатор(); +КонецФункции + +// Передает с клиента на сервер для записи массив настроек +//(массив структур с полями Объект Настройка Значение) +// и параметр сеанса ПутьКРабочемуКаталогуПользователя +Процедура ХранилищеОбщихНастроекСохранитьМассивИПараметрСеансаРабочийКаталог(МассивСтруктур, ПутьКЛокальномуКэшуФайлов) Экспорт + ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур); + УстановитьПараметрСеансаПутьКРабочемуКаталогуПользователя(ПутьКЛокальномуКэшуФайлов); +КонецПроцедуры + +// Находит в регистре сведений ФайлыВРабочемКаталоге информацию о ВерсииФайла (путь к файлу версии в рабочем каталоге, и статус - на чтение или на редактирование) +Функция ПолучитьИмяФайлаСПутемИзРегистра(Версия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ИмяФайлаСПутем = ""; + + // Подготовить структуру отбора по измерениям + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("Версия", Версия.Ссылка); + СтруктураОтбора.Вставить("Пользователь", ОбщегоНазначения.ТекущийПользователь()); + + // Получить структуру с данными ресурсов записи + СтруктураРесурсов = РегистрыСведений.ФайлыВРабочемКаталоге.Получить(СтруктураОтбора); + + // Получить путь из регистра + ИмяФайлаСПутем = СтруктураРесурсов.Путь; + ВРабочемКаталогеНаЧтение = СтруктураРесурсов.НаЧтение; + ВРабочемКаталогеВладельца = СтруктураРесурсов.ВРабочемКаталогеВладельца; + Если ИмяФайлаСПутем <> "" И ВРабочемКаталогеВладельца = Ложь Тогда + ИмяФайлаСПутем = ИмяКаталога + ИмяФайлаСПутем; + КонецЕсли; + + Возврат ИмяФайлаСПутем; +КонецФункции + +// Находит в регистре сведений ФайлыВРабочемКаталоге информацию о ВерсииФайла (путь к файлу версии в рабочем каталоге) +Функция ПолучитьИмяФайлаИзРегистра(Ссылка) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ИмяФайлаСПутем = ""; + + // Подготовить структуру отбора по измерениям + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("Версия", Ссылка); + СтруктураОтбора.Вставить("Пользователь", ОбщегоНазначения.ТекущийПользователь()); + + // Получить структуру с данными ресурсов записи + СтруктураРесурсов = РегистрыСведений.ФайлыВРабочемКаталоге.Получить(СтруктураОтбора); + + // Получить путь из регистра + ИмяФайлаСПутем = СтруктураРесурсов.Путь; + + Возврат ИмяФайлаСПутем; +КонецФункции + +Процедура ЗаписатьИмяФайлаСПутемВРегистр(ТекущаяВерсия, ИмяФайлаСПутем, НаЧтение, ВРабочемКаталогеВладельца) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + // Создать набор записей + НаборЗаписей = РегистрыСведений.ФайлыВРабочемКаталоге.СоздатьНаборЗаписей(); + + НаборЗаписей.Отбор.Версия.Установить(ТекущаяВерсия.Ссылка); + НаборЗаписей.Отбор.Пользователь.Установить(ОбщегоНазначения.ТекущийПользователь()); + + НоваяЗапись = НаборЗаписей.Добавить(); + НоваяЗапись.Версия = ТекущаяВерсия.Ссылка; + НоваяЗапись.Путь = ИмяФайлаСПутем; + НоваяЗапись.Размер = ТекущаяВерсия.Размер; + НоваяЗапись.ДатаПомещенияВРабочийКаталог = ТекущаяДата(); + НоваяЗапись.Пользователь = ОбщегоНазначения.ТекущийПользователь(); + + НоваяЗапись.НаЧтение = НаЧтение; + НоваяЗапись.ВРабочемКаталогеВладельца = ВРабочемКаталогеВладельца; + + НаборЗаписей.Записать(); +КонецПроцедуры + +Процедура УдалитьИзРегистра(Версия) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + НаборЗаписей = РегистрыСведений.ФайлыВРабочемКаталоге.СоздатьНаборЗаписей(); + + НаборЗаписей.Отбор.Версия.Установить(Версия); + НаборЗаписей.Отбор.Пользователь.Установить(ОбщегоНазначения.ТекущийПользователь()); + + НаборЗаписей.Записать(); +КонецПроцедуры + +Процедура ОчиститьВсеСвоиКромеЗанятых() Экспорт + // Отбираем все в регистре сведений. Перебираем - находим те, что не заняты текущим пользователем - + // и все удаляем - считаем, что на диске они уже удалены + + УстановитьПривилегированныйРежим(Истина); + + СписокУдалить = Новый Массив; + ТекущийПользователь = ОбщегоНазначения.ТекущийПользователь(); + + // для каждой нашей записи находим запись в регистре сведений - оттуда берем поле Версия и Редактирует + ЗапросВРегистр = Новый Запрос; + ЗапросВРегистр.УстановитьПараметр("Пользователь", ТекущийПользователь); + ЗапросВРегистр.Текст = "ВЫБРАТЬ + | ФайлыВРабочемКаталоге.Версия КАК Версия, + | ФайлыВРабочемКаталоге.Версия.Владелец.Редактирует КАК Редактирует + |ИЗ + | РегистрСведений.ФайлыВРабочемКаталоге КАК ФайлыВРабочемКаталоге + |ГДЕ + | ФайлыВРабочемКаталоге.Пользователь = &Пользователь + |И ФайлыВРабочемКаталоге.ВРабочемКаталогеВладельца = Ложь"; + + РезультатЗапроса = ЗапросВРегистр.Выполнить(); + + Если НЕ РезультатЗапроса.Пустой() Тогда + + Выборка = РезультатЗапроса.Выбрать(); + Пока Выборка.Следующий() Цикл + + Если Выборка.Редактирует <> ТекущийПользователь Тогда + СписокУдалить.Добавить(Выборка.Версия); + КонецЕсли; + + КонецЦикла; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + Для Каждого Версия из СписокУдалить Цикл + // Создать набор записей + НаборЗаписей = РегистрыСведений.ФайлыВРабочемКаталоге.СоздатьНаборЗаписей(); + + НаборЗаписей.Отбор.Версия.Установить(Версия); + НаборЗаписей.Отбор.Пользователь.Установить(ТекущийПользователь); + + НаборЗаписей.Записать(); + КонецЦикла; +КонецПроцедуры + +Процедура УдалитьВерсиюИЗанестиИнформациюФайлаВРегистр(СтараяВерсия, НоваяВерсия, ПолноеИмяФайла, ИмяКаталога, ВРабочемКаталогеВладельца) + УдалитьИзРегистра(СтараяВерсия); + НаЧтение = Истина; + ЗанестиИнформациюФайлаВРегистр(НоваяВерсия, ПолноеИмяФайла, ИмяКаталога, НаЧтение, 0, ВРабочемКаталогеВладельца); +КонецПроцедуры + +Процедура ЗанестиИнформациюФайлаВРегистр(Версия, ПолныйПуть, ИмяКаталога, НаЧтение, РазмерФайла, ВРабочемКаталогеВладельца) Экспорт + ИмяФайлаСПутем = ПолныйПуть; + + Если ВРабочемКаталогеВладельца = Ложь Тогда + Если Найти(ПолныйПуть, ИмяКаталога) = 1 Тогда + ИмяФайлаСПутем = Сред(ПолныйПуть, СтрДлина(ИмяКаталога) + 1); + КонецЕсли; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + // Создать набор записей + НаборЗаписей = РегистрыСведений.ФайлыВРабочемКаталоге.СоздатьНаборЗаписей(); + + НаборЗаписей.Отбор.Версия.Установить(Версия.Ссылка); + НаборЗаписей.Отбор.Пользователь.Установить(ОбщегоНазначения.ТекущийПользователь()); + + НоваяЗапись = НаборЗаписей.Добавить(); + НоваяЗапись.Версия = Версия.Ссылка; + НоваяЗапись.Путь = ИмяФайлаСПутем; + + Если РазмерФайла <> 0 Тогда + НоваяЗапись.Размер = РазмерФайла; + Иначе + НоваяЗапись.Размер = Версия.Размер; + КонецЕсли; + + НоваяЗапись.ДатаПомещенияВРабочийКаталог = ТекущаяДата(); + НоваяЗапись.Пользователь = ОбщегоНазначения.ТекущийПользователь(); + НоваяЗапись.НаЧтение = НаЧтение; + НоваяЗапись.ВРабочемКаталогеВладельца = ВРабочемКаталогеВладельца; + + НаборЗаписей.Записать(); +КонецПроцедуры + +// Возвращает массив файлов в регистре сведений ФайлыВРабочемКаталоге +Функция СписокФайловВРегистре() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + СписокФайлов = Новый Массив; + ТекущийПользователь = ОбщегоНазначения.ТекущийПользователь(); + + // Для каждой нашей записи находим запись в регистре сведений - оттуда берем поле Версия и Редактирует + ЗапросВРегистр = Новый Запрос; + ЗапросВРегистр.УстановитьПараметр("Пользователь", ТекущийПользователь); + + ЗапросВРегистр.Текст = + "ВЫБРАТЬ + | ФайлыВРабочемКаталоге.Версия КАК Версия, + | ФайлыВРабочемКаталоге.НаЧтение КАК НаЧтение, + | ФайлыВРабочемКаталоге.Размер КАК Размер, + | ФайлыВРабочемКаталоге.Путь КАК Путь + |ИЗ + | РегистрСведений.ФайлыВРабочемКаталоге КАК ФайлыВРабочемКаталоге + |ГДЕ + | ФайлыВРабочемКаталоге.Пользователь = &Пользователь + |И ВРабочемКаталогеВладельца = Ложь"; + + РезультатЗапроса = ЗапросВРегистр.Выполнить(); + + Если НЕ РезультатЗапроса.Пустой() Тогда + + Выборка = РезультатЗапроса.Выбрать(); + Пока Выборка.Следующий() Цикл + Версия = Выборка.Версия; + + Запись = Новый Структура; + Запись.Вставить("ДатаМодификацииУниверсальная", Версия.ДатаМодификацииУниверсальная); + Запись.Вставить("ПолноеНаименование", Версия.ПолноеНаименование); + Запись.Вставить("ИндексКартинки", Версия.ИндексКартинки); + Запись.Вставить("Размер", Выборка.Размер); + Запись.Вставить("Ссылка", Версия.Ссылка); + Запись.Вставить("Редактирует", Версия.Владелец.Редактирует); + Запись.Вставить("НаЧтение", Выборка.НаЧтение); + Запись.Вставить("ЧастичныйПуть", Выборка.Путь); + + СписокФайлов.Добавить(Запись); + КонецЦикла; + КонецЕсли; + + Возврат СписокФайлов; +КонецФункции + +Функция СправочникиПапкиСоздатьЭлемент(Имя, Родитель, Пользователь = Неопределено) Экспорт + Папка = Справочники.ПапкиФайлов.СоздатьЭлемент(); + Папка.Наименование = Имя; + Папка.Родитель = Родитель; + Папка.ДатаСоздания = ТекущаяДата(); + + Если Пользователь = Неопределено Тогда + Папка.Ответственный = ОбщегоНазначения.ТекущийПользователь(); + Иначе + Папка.Ответственный = Пользователь; + КонецЕсли; + + Папка.Записать(); + Возврат Папка.Ссылка; +КонецФункции + +// Формирует отчет для файлов с ошибками +Функция ИмпортФайловСформироватьОтчет(МассивИменФайловСОшибками) Экспорт + ТабДок = Новый ТабличныйДокумент; + ТабМакет = Справочники.Файлы.ПолучитьМакет("МакетОтчета"); + + ОбластьЗаголовок = ТабМакет.ПолучитьОбласть("Заголовок"); + ОбластьЗаголовок.Параметры.Описание = "Файлы с ошибками:"; + ТабДок.Вывести(ОбластьЗаголовок); + + ОбластьСтрока = ТабМакет.ПолучитьОбласть("Строка"); + + Для Каждого Выборка Из МассивИменФайловСОшибками Цикл + ОбластьСтрока.Параметры.Название = Выборка.ИмяФайла; + ОбластьСтрока.Параметры.Ошибка = Выборка.Ошибка; + ТабДок.Вывести(ОбластьСтрока); + КонецЦикла; + + Отчет = Новый ТабличныйДокумент; + Отчет.Вывести(ТабДок); + + Возврат Отчет; +КонецФункции + +// Сортирует массив структур по полю Дата - на сервере, т.к. на тонком клиенте нет ТаблицаЗначений +Процедура СортироватьМассивСтруктур(МассивСтруктур) Экспорт + + ТаблицаФайлов = Новый ТаблицаЗначений; + ТаблицаФайлов.Колонки.Добавить("Путь"); + ТаблицаФайлов.Колонки.Добавить("Версия"); + ТаблицаФайлов.Колонки.Добавить("Размер"); + + ТаблицаФайлов.Колонки.Добавить("ДатаПомещенияВРабочийКаталог", Новый ОписаниеТипов("Дата")); + + Для Каждого Строка из МассивСтруктур Цикл + НоваяСтрока = ТаблицаФайлов.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка, "Путь, Размер, Версия, ДатаПомещенияВРабочийКаталог"); + КонецЦикла; + + // Сортировка по дате - в начале будут самые давно помещенные в рабочий каталог + ТаблицаФайлов.Сортировать("ДатаПомещенияВРабочийКаталог Возр"); + + МассивСтруктурВозврат = Новый Массив; + + Для Каждого Строка из ТаблицаФайлов Цикл + Запись = Новый Структура; + Запись.Вставить("Путь", Строка.Путь); + Запись.Вставить("Размер", Строка.Размер); + Запись.Вставить("Версия", Строка.Версия); + Запись.Вставить("ДатаПомещенияВРабочийКаталог", Строка.ДатаПомещенияВРабочийКаталог); + МассивСтруктурВозврат.Добавить(Запись); + КонецЦикла; + + МассивСтруктур = МассивСтруктурВозврат; +КонецПроцедуры // СортироватьМассивСтруктур() + +// Возвращает настройку - Спрашивать режим редактирования при открытии файла +Функция СпрашиватьРежимРедактированияПриОткрытииФайла() + СпрашиватьРежимРедактированияПриОткрытииФайла = + ХранилищеОбщихНастроек.Загрузить("НастройкиОткрытияФайлов", "СпрашиватьРежимРедактированияПриОткрытииФайла"); + Если СпрашиватьРежимРедактированияПриОткрытииФайла = Неопределено Тогда + СпрашиватьРежимРедактированияПриОткрытииФайла = Истина; + ХранилищеОбщихНастроек.Сохранить("НастройкиОткрытияФайлов", "СпрашиватьРежимРедактированияПриОткрытииФайла", СпрашиватьРежимРедактированияПриОткрытииФайла); + КонецЕсли; + + Возврат СпрашиватьРежимРедактированияПриОткрытииФайла; +КонецФункции + +// Считаем ДействиеПоДвойномуЩелчкуМыши - если первый раз - поставим правильное значение +Функция ДействиеПоДвойномуЩелчкуМыши() + КакОткрывать = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиОткрытияФайлов", "ДействиеПоДвойномуЩелчкуМыши"); + + Если КакОткрывать = Неопределено Или КакОткрывать = Перечисления.ДействияСФайламиПоДвойномуЩелчку.ПустаяСсылка() Тогда + КакОткрывать = Перечисления.ДействияСФайламиПоДвойномуЩелчку.ОткрыватьФайл; + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("НастройкиОткрытияФайлов", "ДействиеПоДвойномуЩелчкуМыши", КакОткрывать); + КонецЕсли; + + Если КакОткрывать = Перечисления.ДействияСФайламиПоДвойномуЩелчку.ОткрыватьФайл Тогда + Возврат "ОткрыватьФайл"; + Иначе + Возврат "ОткрыватьКарточку"; + КонецЕсли; +КонецФункции + +// Считаем из настроек СпособСравненияВерсийФайлов +Функция СпособСравненияВерсийФайлов() + СпособСравнения = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиСравненияФайлов", "СпособСравненияВерсийФайлов"); + + Если СпособСравнения = Перечисления.СпособыСравненияВерсийФайлов.MicrosoftOfficeWord Тогда + Возврат "MicrosoftOfficeWord"; + ИначеЕсли СпособСравнения = Перечисления.СпособыСравненияВерсийФайлов.OpenOfficeOrgWriter Тогда + Возврат "OpenOfficeOrgWriter"; + Иначе + Возврат Неопределено; + КонецЕсли; +КонецФункции + +// Функция возвращает количество Файлов, занятых текущим пользователем +// в разрезе владельца +Функция КоличествоЗанятыхФайлов(ВладелецФайла) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | КОЛИЧЕСТВО(*) КАК Количество + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.Редактирует = &Редактирует + | И Файлы.ВладелецФайла = &Владелец"; + + Запрос.УстановитьПараметр("Редактирует", ОбщегоНазначения.ТекущийПользователь()); + Запрос.УстановитьПараметр("Владелец", ВладелецФайла); + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + + Результат = Выборка.Количество; + + Возврат Результат; +КонецФункции + +// Получает значение настройки ПоказыватьКолонкуРазмер +Функция ПолучитьПоказыватьКолонкуРазмер() Экспорт + ПоказыватьКолонкуРазмер = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПрограммы", "ПоказыватьКолонкуРазмер"); + Если ПоказыватьКолонкуРазмер = Неопределено Тогда + ПоказыватьКолонкуРазмер = Ложь; + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПоказыватьКолонкуРазмер", ПоказыватьКолонкуРазмер); + КонецЕсли; + + Возврат ПоказыватьКолонкуРазмер; +КонецФункции + +// Возвращает структуру, содержащую различные персональные настройки +// по работе с файлами +Функция ПолучитьПерсональныеНастройкиРаботыСФайламиСервер() Экспорт + Настройки = Новый Структура; + + УстановитьПривилегированныйРежим(Истина); + + Настройки.Вставить("ДействиеПоДвойномуЩелчкуМыши", ДействиеПоДвойномуЩелчкуМыши()); + + Настройки.Вставить("СпрашиватьРежимРедактированияПриОткрытииФайла", СпрашиватьРежимРедактированияПриОткрытииФайла()); + + Настройки.Вставить("СпособСравненияВерсийФайлов", СпособСравненияВерсийФайлов()); + + МаксимальныйРазмерЛокальногоКэшаФайлов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЛокальныйКэшФайлов", "МаксимальныйРазмерЛокальногоКэшаФайлов"); + Если МаксимальныйРазмерЛокальногоКэшаФайлов = Неопределено Тогда + МаксимальныйРазмерЛокальногоКэшаФайлов = 100*1024*1024; // 100 мб + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ЛокальныйКэшФайлов", "МаксимальныйРазмерЛокальногоКэшаФайлов", МаксимальныйРазмерЛокальногоКэшаФайлов); + КонецЕсли; + Настройки.Вставить("МаксимальныйРазмерЛокальногоКэшаФайлов", МаксимальныйРазмерЛокальногоКэшаФайлов); + + ПутьКЛокальномуКэшуФайлов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЛокальныйКэшФайлов", "ПутьКЛокальномуКэшуФайлов"); + Настройки.Вставить("ПутьКЛокальномуКэшуФайлов", ПутьКЛокальномуКэшуФайлов); + + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЛокальныйКэшФайлов", "УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования"); + Настройки.Вставить("УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования", УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования); + + ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЛокальныйКэшФайлов", "ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов"); + Если ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов = Неопределено Тогда + ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов = Ложь; + КонецЕсли; + Настройки.Вставить("ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов", ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов); + + Настройки.Вставить("ЭтоПолноправныйПользовательИБ", Пользователи.ЭтоПолноправныйПользовательИБ()); + + ИзвлекатьТекстыФайловНаСервере = Константы.ИзвлекатьТекстыФайловНаСервере.Получить(); + + Настройки.Вставить("ИзвлекатьТекстыФайловНаСервере", ИзвлекатьТекстыФайловНаСервере); + + МаксимальныйРазмерФайла = Константы.МаксимальныйРазмерФайла.Получить(); + Если МаксимальныйРазмерФайла = Неопределено ИЛИ МаксимальныйРазмерФайла = 0 Тогда + МаксимальныйРазмерФайла = 50*1024*1024; // 50 мб + Константы.МаксимальныйРазмерФайла.Установить(МаксимальныйРазмерФайла); + КонецЕсли; + Настройки.Вставить("МаксимальныйРазмерФайла", МаксимальныйРазмерФайла); + + ЗапретЗагрузкиФайловПоРасширению = Константы.ЗапретЗагрузкиФайловПоРасширению.Получить(); + Если ЗапретЗагрузкиФайловПоРасширению = Неопределено Тогда + ЗапретЗагрузкиФайловПоРасширению = Ложь; + Константы.ЗапретЗагрузкиФайловПоРасширению.Установить(ЗапретЗагрузкиФайловПоРасширению); + КонецЕсли; + Настройки.Вставить("ЗапретЗагрузкиФайловПоРасширению", ЗапретЗагрузкиФайловПоРасширению); + + СписокЗапрещенныхРасширений = Константы.СписокЗапрещенныхРасширений.Получить(); + Если СписокЗапрещенныхРасширений = Неопределено ИЛИ СписокЗапрещенныхРасширений = "" Тогда + СписокЗапрещенныхРасширений = "COM EXE BAT CMD VBS VBE JS JSE WSF WSH SCR"; + Константы.СписокЗапрещенныхРасширений.Установить(СписокЗапрещенныхРасширений); + КонецЕсли; + Настройки.Вставить("СписокЗапрещенныхРасширений", СписокЗапрещенныхРасширений); + + ТипХраненияФайлов = Константы.ТипХраненияФайлов.Получить(); + Если ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ПустаяСсылка() Тогда + ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; + Константы.ТипХраненияФайлов.Установить(ТипХраненияФайлов); + КонецЕсли; + ФайлыХранятсяНаДиске = Ложь; + Если ТипХраненияФайлов = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + ФайлыХранятсяНаДиске = Истина; + КонецЕсли; + Настройки.Вставить("ФайлыХранятсяНаДиске", ФайлыХранятсяНаДиске); + + ОткрыватьНачалоРаботы = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПрограммы", "ОткрыватьНачалоРаботыПриЗапуске"); + Если ОткрыватьНачалоРаботы = Неопределено Тогда + ОткрыватьНачалоРаботы = Истина; + КонецЕсли; + Настройки.Вставить("ОткрыватьНачалоРаботы", ОткрыватьНачалоРаботы); + + Настройки.Вставить("ТекущийПользователь", ОбщегоНазначения.ТекущийПользователь()); + + Настройки.Вставить("ИмяКонфигурации", Метаданные.Имя); + + ПоказыватьПодсказкиПриРедактированииФайлов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПрограммы", "ПоказыватьПодсказкиПриРедактированииФайлов"); + Если ПоказыватьПодсказкиПриРедактированииФайлов = Неопределено Тогда + ПоказыватьПодсказкиПриРедактированииФайлов = Истина; + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПоказыватьПодсказкиПриРедактированииФайлов", ПоказыватьПодсказкиПриРедактированииФайлов); + КонецЕсли; + Настройки.Вставить("ПоказыватьПодсказкиПриРедактированииФайлов", ПоказыватьПодсказкиПриРедактированииФайлов); + + ПоказыватьЗанятыеФайлыПриЗавершенииРаботы = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПрограммы", "ПоказыватьЗанятыеФайлыПриЗавершенииРаботы"); + Если ПоказыватьЗанятыеФайлыПриЗавершенииРаботы = Неопределено Тогда + ПоказыватьЗанятыеФайлыПриЗавершенииРаботы = Истина; + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПоказыватьЗанятыеФайлыПриЗавершенииРаботы", ПоказыватьЗанятыеФайлыПриЗавершенииРаботы); + КонецЕсли; + Настройки.Вставить("ПоказыватьЗанятыеФайлыПриЗавершенииРаботы", ПоказыватьЗанятыеФайлыПриЗавершенииРаботы); + + Возврат Настройки; +КонецФункции + +// Функция меняет ВладелецФайла объектам типа Справочник.Файл, вернет Истина при успехе +Функция УстановитьВладельцаФайла(МассивСсылокНаФайлы, НовыйВладелецФайла) Экспорт + Если МассивСсылокНаФайлы.Количество() = 0 Или Не ЗначениеЗаполнено(НовыйВладелецФайла) Тогда + Возврат Ложь; + КонецЕсли; + + // тот же родитель - ничего делать не надо + Если МассивСсылокНаФайлы.Количество() > 0 И (МассивСсылокНаФайлы[0].ВладелецФайла = НовыйВладелецФайла) Тогда + Возврат Ложь; + КонецЕсли; + + НачатьТранзакцию(); + Попытка + + Для Каждого ФайлПринятый Из МассивСсылокНаФайлы Цикл + ФайлОбъект = ФайлПринятый.ПолучитьОбъект(); + ФайлОбъект.Заблокировать(); + ФайлОбъект.ВладелецФайла = НовыйВладелецФайла; + ФайлОбъект.Записать(); + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Возврат Истина; +КонецФункции + + +// вернет Истина если есть зацикливание (если одну из папок переносим в ее же дочернюю папку) +Функция ЕстьЗацикливание(Знач МассивСсылокНаФайлы, НовыйРодитель) + + Если МассивСсылокНаФайлы.Найти(НовыйРодитель) <> Неопределено Тогда + Возврат Истина; // нашли зацикливание + КонецЕсли; + + Родитель = НовыйРодитель.Родитель; + Если Родитель.Пустая() Тогда // дошли до корня + Возврат Ложь; + КонецЕсли; + + Если ЕстьЗацикливание(МассивСсылокНаФайлы, Родитель) = Истина Тогда + Возврат Истина; // нашли зацикливание + КонецЕсли; + + Возврат Ложь; +КонецФункции + +// Функция меняет свойство Родитель объектам типа Справочник.ПапкиФайла, вернет Истина при успехе, +// в переменной НайденоЗацикливание вернет Истина, если одну из папок переносим в ее же дочернюю папку +Функция СменитьРодителяПапок(МассивСсылокНаФайлы, НовыйРодитель, НайденоЗацикливание) Экспорт + НайденоЗацикливание = Ложь; + + Если МассивСсылокНаФайлы.Количество() = 0 Тогда + Возврат Ложь; + КонецЕсли; + + // тот же родитель - ничего делать не надо + Если МассивСсылокНаФайлы.Количество() = 1 И (МассивСсылокНаФайлы[0].Родитель = НовыйРодитель) Тогда + Возврат Ложь; + КонецЕсли; + + Если ЕстьЗацикливание(МассивСсылокНаФайлы, НовыйРодитель) Тогда + НайденоЗацикливание = Истина; + Возврат Ложь; + КонецЕсли; + + НачатьТранзакцию(); + Попытка + + Для Каждого ФайлПринятый Из МассивСсылокНаФайлы Цикл + ФайлОбъект = ФайлПринятый.ПолучитьОбъект(); + ФайлОбъект.Заблокировать(); + ФайлОбъект.Родитель = НовыйРодитель; + ФайлОбъект.Записать(); + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Возврат Истина; +КонецФункции + +// вернет Истина, если в указанном элементе справочника ПапкиФайлов есть дочерний элемент с таким именем +Функция ЕстьПапкаСТакимИменем(ИмяФайла, Родитель, ПерваяПапкаСТакимЖеИменем) Экспорт + + ПерваяПапкаСТакимЖеИменем = Справочники.ПапкиФайлов.ПустаяСсылка(); + + ЗапросВПапки = Новый Запрос; + ЗапросВПапки.УстановитьПараметр("Наименование", Имяфайла); + ЗапросВПапки.УстановитьПараметр("Родитель", Родитель); + ЗапросВПапки.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 + | ПапкиФайлов.Ссылка КАК Ссылка + |ИЗ + | Справочник.ПапкиФайлов КАК ПапкиФайлов + |ГДЕ + | ПапкиФайлов.Наименование = &Наименование + | И ПапкиФайлов.Родитель = &Родитель"; + + РезультатЗапроса = ЗапросВПапки.Выполнить(); + + Если НЕ РезультатЗапроса.Пустой() Тогда + ВыборкаЗапроса = РезультатЗапроса.Выгрузить(); + ПерваяПапкаСТакимЖеИменем = ВыборкаЗапроса[0].Ссылка; + Возврат Истина; + КонецЕсли; + + + Возврат Ложь; +КонецФункции + +// вернет Истина, если в указанном элементе справочника ПапкиФайлов есть файл с таким именем +Функция ЕстьФайлСТакимИменем(ИмяФайла, Родитель) Экспорт + + ЗапросВПапки = Новый Запрос; + ЗапросВПапки.УстановитьПараметр("Наименование", Имяфайла); + ЗапросВПапки.УстановитьПараметр("Родитель", Родитель); + ЗапросВПапки.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 + | Файлы.Ссылка КАК Ссылка + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.ПолноеНаименование = &Наименование + | И Файлы.ВладелецФайла = &Родитель"; + + РезультатЗапроса = ЗапросВПапки.Выполнить(); + + Если НЕ РезультатЗапроса.Пустой() Тогда + Возврат Истина; + КонецЕсли; + + + Возврат Ложь; +КонецФункции + +// в справочнике ВерсииФайлов из данных в Код(Строка) заполняет НомерВерсии(Число) +Процедура ЗаполнитьНомерВерсииИзКодаСправочника() Экспорт + УстановитьПривилегированныйРежим(Истина); + НачатьТранзакцию(); + Попытка + Выборка = Справочники.ВерсииФайлов.Выбрать(); + Пока Выборка.Следующий() Цикл + Объект = Выборка.ПолучитьОбъект(); + + // коррекция ситуации, допустимой ранее, но недопустимой сейчас - активная версия помечена на удаление, а владелец - нет + Если Объект.ПометкаУдаления = Истина И Объект.Владелец.ПометкаУдаления = Ложь И Объект.Владелец.ТекущаяВерсия = Объект.Ссылка Тогда + Объект.ПометкаУдаления = Ложь; + КонецЕсли; + + Попытка + Объект.НомерВерсии = Число(Объект.Код); + Объект.Записать(); + Исключение // код например с префиксом базы - не используем. Это не ошибка - т.к. только в старых версиях конфигурации + КонецПопытки; + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; +КонецПроцедуры + +// в справочнике ВерсииФайлов заполняет ТипХраненияФайла значением ВБазе +Процедура ЗаполнитьТипХраненияФайлаВБазе() Экспорт + УстановитьПривилегированныйРежим(Истина); + НачатьТранзакцию(); + Попытка + Выборка = Справочники.ВерсииФайлов.Выбрать(); + Пока Выборка.Следующий() Цикл + Объект = Выборка.ПолучитьОбъект(); + Объект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; + Объект.Записать(); + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; +КонецПроцедуры + +// для справочника ВерсииФайлов переименует файл на диске, если ТипХраненияФайла = ВТомахНаДиске +Процедура ПереименоватьФайлВерсииНаДиске(Версия, СтароеНаименование, НовоеНаименование) Экспорт + + Если НЕ Версия.Том.Пустая() Тогда + Попытка + ВерсияОбъект = Версия.ПолучитьОбъект(); + ВерсияОбъект.Заблокировать(); + + СтарыйПолныйПуть = ПолныйПутьТома(Версия.Том) + Версия.ПутьКФайлу; + + ФайлНаДиске = Новый Файл(СтарыйПолныйПуть); + ПолныйПуть = ФайлНаДиске.Путь; + ИмяБезРасширения = ФайлНаДиске.ИмяБезРасширения; + Расширение = ФайлНаДиске.Расширение; + НовоеИмяБезРасширения = СтрЗаменить(ИмяБезРасширения, СтароеНаименование, НовоеНаименование); + + НовыйПолныйПуть = ПолныйПуть + НовоеИмяБезРасширения + Расширение; + НовыйЧастичныйПуть = Прав(НовыйПолныйПуть, СтрДлина(НовыйПолныйПуть) - ПолныйПутьТома(Версия.Том)); + + ПереместитьФайл(СтарыйПолныйПуть, НовыйПолныйПуть); + ВерсияОбъект.ПутьКФайлу = НовыйЧастичныйПуть; + ВерсияОбъект.Записать(); + ВерсияОбъект.Разблокировать(); + Исключение + КонецПопытки; + КонецЕсли; +КонецПроцедуры + +// в справочнике ВерсииФайлов и Файлы ИндексКартинки увеличивает в 2 раза +Процедура СменитьИндексПиктограммы() Экспорт + УстановитьПривилегированныйРежим(Истина); + НачатьТранзакцию(); + Попытка + Выборка = Справочники.ВерсииФайлов.Выбрать(); + Пока Выборка.Следующий() Цикл + Объект = Выборка.ПолучитьОбъект(); + Объект.ОбменДанными.Загрузка = Истина; + Объект.ИндексКартинки = РаботаСФайламиКлиентСервер.ПолучитьИндексПиктограммыФайла(Объект.Расширение); + Объект.Записать(); + КонецЦикла; + + Выборка = Справочники.Файлы.Выбрать(); + Пока Выборка.Следующий() Цикл + Объект = Выборка.ПолучитьОбъект(); + Объект.ОбменДанными.Загрузка = Истина; + Объект.ИндексКартинки = Объект.ТекущаяВерсия.ИндексКартинки; + Объект.Записать(); + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; +КонецПроцедуры + +// возвращает список занятых файлов +Функция ПолучитьЗанятыеФайлы(ВладелецФайла = Неопределено, Редактирует = Неопределено) Экспорт + + Список = Новый СписокЗначений; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Файлы.Ссылка КАК Ссылка, + | Файлы.Представление КАК Представление + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.Редактирует <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)"; + + Если Редактирует <> Неопределено Тогда + Запрос.Текст = Запрос.Текст + " И Файлы.Редактирует = &Редактирует "; + Запрос.УстановитьПараметр("Редактирует", Редактирует); + КонецЕсли; + + Если ВладелецФайла <> Неопределено Тогда + Запрос.Текст = Запрос.Текст + " И Файлы.ВладелецФайла = &ВладелецФайла "; + Запрос.УстановитьПараметр("ВладелецФайла", ВладелецФайла); + КонецЕсли; + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Список.Добавить(Выборка.Ссылка, Выборка.Представление); + КонецЦикла; + + Возврат Список; + +КонецФункции + +// помечает \ снимает пометку удаления у приложенных файлов +Процедура ПометитьНаУдалениеПриложенныеФайлы(ВладелецФайла, ПометкаУдаления) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Файлы.Ссылка КАК Ссылка, + | Файлы.Редактирует КАК Редактирует + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.ВладелецФайла = &ВладелецФайла"; + + Запрос.УстановитьПараметр("ВладелецФайла", ВладелецФайла); + + Результат = Запрос.Выполнить(); + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + Если ПометкаУдаления И Не Выборка.Редактирует.Пустая() Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '""%1"" не может быть удален, т.к. содержит файл ""%2"", занятый для редактирования.'"), + Строка(ВладелецФайла), + Строка(Выборка.Ссылка)); + КонецЕсли; + ФайлОбъект = Выборка.Ссылка.ПолучитьОбъект(); + ФайлОбъект.Заблокировать(); + ФайлОбъект.УстановитьПометкуУдаления(ПометкаУдаления); + КонецЦикла; + +КонецПроцедуры + +// получает данные для переноса файла из одного списка приложенных файлов в другой +Функция ПолучитьДанныеДляПереносаВПриложенныеФайлы(ФайлМассив, ВладелецФайла) Экспорт + + Если ТипЗнч(ФайлМассив) = Тип("Массив") Тогда + МассивФайлов = ФайлМассив; + Иначе + МассивФайлов = Новый Массив; + МассивФайлов.Добавить(ФайлМассив); + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Файлы.Ссылка КАК Ссылка, + | Файлы.ПолноеНаименование КАК ПолноеНаименование + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.ВладелецФайла = &ВладелецФайла"; + Запрос.УстановитьПараметр("ВладелецФайла", ВладелецФайла); + ТаблРезультат = Запрос.Выполнить().Выгрузить(); + + Результат = Новый Соответствие; + Для Каждого ФайлСсылка Из МассивФайлов Цикл + + Если ТаблРезультат.Найти(ФайлСсылка, "Ссылка") <> Неопределено Тогда + Результат.Вставить(ФайлСсылка, "Пропустить"); + ИначеЕсли ТаблРезультат.Найти(ФайлСсылка.ПолноеНаименование, "ПолноеНаименование") <> Неопределено Тогда + Результат.Вставить(ФайлСсылка, "Обновить"); + Иначе + Результат.Вставить(ФайлСсылка, "Скопировать"); + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// копирует файлы при переносе из одного списка приложенных файлов в другой +Функция СкопироватьФайлВПриложенных(ФайлМассив, ВладелецФайла) Экспорт + + Если ТипЗнч(ФайлМассив) = Тип("Массив") Тогда + МассивФайлов = ФайлМассив; + Иначе + МассивФайлов = Новый Массив; + МассивФайлов.Добавить(ФайлМассив); + КонецЕсли; + + Для Каждого ФайлСсылка Из МассивФайлов Цикл + + Источник = ФайлСсылка; + ИсточникОбъект = Источник.ПолучитьОбъект(); + + ПриемникОбъект = ИсточникОбъект.Скопировать(); + ПриемникОбъект.ВладелецФайла = ВладелецФайла; + ПриемникОбъект.Записать(); + + Приемник = ПриемникОбъект.Ссылка; + + Если Не Источник.ТекущаяВерсия.Пустая() Тогда + Версия = РаботаСФайлами.СоздатьВерсию( + ТекущаяДата(), + УниверсальноеВремя(ТекущаяДата()), + Приемник, + Приемник.Наименование, + Источник.ТекущаяВерсия.Размер, + Источник.ТекущаяВерсия.Расширение, + Источник.ТекущаяВерсия.ФайлХранилище, + Источник.ТекущаяВерсия.ТекстХранилище, + Ложь, + Источник.ТекущаяВерсия); + + РаботаСФайлами.ОбновитьВерсиюВФайле(Приемник, Версия, Источник.ТекущаяВерсия.ТекстХранилище); + КонецЕсли; + + КонецЦикла; + + Возврат Приемник; + +КонецФункции + +// обновляет версии одноименных файлов при переносе из одного списка приложенных файлов в другой +Функция ОбновитьФайлВПриложенных(ФайлМассив, ВладелецФайла) Экспорт + + Если ТипЗнч(ФайлМассив) = Тип("Массив") Тогда + МассивФайлов = ФайлМассив; + Иначе + МассивФайлов = Новый Массив; + МассивФайлов.Добавить(ФайлМассив); + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Файлы.Ссылка КАК Ссылка, + | Файлы.ПолноеНаименование КАК ПолноеНаименование + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.ВладелецФайла = &ВладелецФайла"; + Запрос.УстановитьПараметр("ВладелецФайла", ВладелецФайла); + + ТаблРезультат = Запрос.Выполнить().Выгрузить(); + Для Каждого ФайлСсылка Из МассивФайлов Цикл + + НайденнаяСтрока = ТаблРезультат.Найти(ФайлСсылка.ПолноеНаименование, "ПолноеНаименование"); + + Источник = ФайлСсылка; + Приемник = НайденнаяСтрока.Ссылка; + + Если Не Источник.ТекущаяВерсия.Пустая() Тогда + Версия = РаботаСФайлами.СоздатьВерсию( + ТекущаяДата(), + УниверсальноеВремя(ТекущаяДата()), + Приемник, + Приемник.Наименование, + Источник.ТекущаяВерсия.Размер, + Источник.ТекущаяВерсия.Расширение, + Источник.ТекущаяВерсия.ФайлХранилище, + Источник.ТекущаяВерсия.ТекстХранилище, + Ложь, + Источник.ТекущаяВерсия); + + РаботаСФайлами.ОбновитьВерсиюВФайле(Приемник, Версия, Источник.ТекущаяВерсия.ТекстХранилище); + КонецЕсли; + + КонецЦикла; + + Возврат Приемник; + +КонецФункции + +// заполняет условное оформление списка файлов +Процедура ЗаполнитьУсловноеОформлениеСпискаФайлов(Список) Экспорт + Элемент = Список.УсловноеОформление.Элементы.Добавить(); + Элемент.Использование = Истина; + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ФайлЗанятыйДругимПользователем); + Отбор = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + Отбор.Использование = Истина; + Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно; + Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Редактирует"); + Отбор.ПравоеЗначение = ПредопределенноеЗначение("Справочник.Пользователи.ПустаяСсылка"); + + Элемент = Список.УсловноеОформление.Элементы.Добавить(); + Элемент.Использование = Истина; + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ФайлЗанятыйТекущимПользователем); + Отбор = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + Отбор.Использование = Истина; + Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Редактирует"); + Отбор.ПравоеЗначение = ОбщегоНазначения.ТекущийПользователь(); +КонецПроцедуры + +// Возвращает с сервера на клиент идентификатор текущего пользователя +Функция ПараметрыСеансаПутьКРабочемуКаталогуПользователя() Экспорт + УстановитьПривилегированныйРежим(Истина); + Возврат ПараметрыСеанса.ПутьКРабочемуКаталогуПользователя; +КонецФункции + +// Сохраняет путь к рабочему каталогу пользователя в настройках и параметре сеанса +Процедура УстановитьПараметрСеансаПутьКРабочемуКаталогуПользователя(ИмяКаталога) Экспорт + УстановитьПривилегированныйРежим(Истина); + ПараметрыСеанса.ПутьКРабочемуКаталогуПользователя = ИмяКаталога; +КонецПроцедуры + +// Сохраняет путь к рабочему каталогу пользователя в настройках и параметре сеанса +Процедура СохранитьПутьКРабочемуКаталогуПользователя(ИмяКаталога) Экспорт + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ЛокальныйКэшФайлов", "ПутьКЛокальномуКэшуФайлов", ИмяКаталога); + УстановитьПараметрСеансаПутьКРабочемуКаталогуПользователя(ИмяКаталога); +КонецПроцедуры + +// Выполняет установку параметра сеанса "ПутьКРабочемуКаталогуПользователя" при начале работы системы +// +// Параметры +// ИмяПараметра - Строка - имя устанавливаемого параметра +// УстановленныеПараметры - Массив - массив, в котором собираются +// имена установленных параметров сеанса +// +Процедура НачальнаяУстановкаПараметраСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт + + Если ИмяПараметра <> "ПутьКРабочемуКаталогуПользователя" Тогда + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + Если ИмяПараметра = "ПутьКРабочемуКаталогуПользователя" Тогда + ПараметрыСеанса.ПутьКРабочемуКаталогуПользователя = ""; + УстановленныеПараметры.Добавить(ИмяПараметра); + КонецЕсли; + +КонецПроцедуры // () + +// Возвращает объект, для которого проверяется право доступа - для Файл это ПапкиФайлов (реквизит ВладелецФайла) +Функция ПолучитьОбъектДоступа(Объект) Экспорт + Если ТипЗнч(Объект) <> Тип("СправочникСсылка.Файлы") Тогда + Возврат Неопределено; + КонецЕсли; + + Если ТипЗнч(Объект.ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") Тогда + Возврат Объект.ВладелецФайла; + КонецЕсли; + + Возврат Неопределено; +КонецФункции + +// Возвращает номер по нарастанию. Предыдущее значение берется из регистра сведений НомераСканированныхФайлов +Функция ПолучитьНовыйНомерДляСканирования(Владелец) Экспорт + + // Подготовить структуру отбора по измерениям + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("Владелец", Владелец); + + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НомераСканированныхФайлов"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + ЭлементБлокировки.УстановитьЗначение("Владелец", Владелец); + Блокировка.Заблокировать(); + + // Получить структуру с данными ресурсов записи + СтруктураРесурсов = РегистрыСведений.НомераСканированныхФайлов.Получить(СтруктураОтбора); + + // Получить максимальный номер из регистра + Номер = СтруктураРесурсов.Номер; + Номер = Номер + 1; // увеличим на 1 + + + // запишем новый номер в регистр + НаборЗаписей = РегистрыСведений.НомераСканированныхФайлов.СоздатьНаборЗаписей(); + + НаборЗаписей.Отбор.Владелец.Установить(Владелец); + + НоваяЗапись = НаборЗаписей.Добавить(); + НоваяЗапись.Владелец = Владелец; + НоваяЗапись.Номер = Номер; + + НаборЗаписей.Записать(); + + ЗафиксироватьТранзакцию(); + + Возврат Номер; + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + + Возврат 0; +КонецФункции + +// Очищает настройки форм ФормаНового +Процедура ОчиститьНастройкиФормНовогоФайла() Экспорт + + УстановитьПривилегированныйРежим(Истина); + // Очистка настроек окна ФормаНового + ХранилищеСистемныхНастроек.Удалить("Справочник.Файлы.Форма.ФормаНового/НастройкиОкна", "", Неопределено); + +КонецПроцедуры + +// Вернет размер файлов на томе - в байтах +Функция ПодсчитатьРазмерФайловНаТоме(СсылкаТома) Экспорт + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ЕСТЬNULL(СУММА(Версии.Размер), 0) КАК РазмерФайлов + |ИЗ + | Справочник.ВерсииФайлов КАК Версии + |ГДЕ + | Версии.Том = &Том"; + + Запрос.Параметры.Вставить("Том", СсылкаТома); + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Возврат Число(Выборка.РазмерФайлов); + КонецЕсли; + + Возврат 0; +КонецФункции + +// Преобразует параметры сканера в виде чисел - в перечисления +Процедура ПреобразоватьПараметрыСканераВПеречисления(РазрешениеЧисло, ЦветностьЧисло, ПоворотЧисло, РазмерБумагиЧисло, + Разрешение, Цветность, Поворот, РазмерБумаги) Экспорт + + Если РазрешениеЧисло = 200 Тогда + Разрешение = Перечисления.РазрешенияСканированногоИзображения.dpi200; + ИначеЕсли РазрешениеЧисло = 300 Тогда + Разрешение = Перечисления.РазрешенияСканированногоИзображения.dpi300; + ИначеЕсли РазрешениеЧисло = 600 Тогда + Разрешение = Перечисления.РазрешенияСканированногоИзображения.dpi600; + ИначеЕсли РазрешениеЧисло = 1200 Тогда + Разрешение = Перечисления.РазрешенияСканированногоИзображения.dpi1200; + КонецЕсли; + + Если ЦветностьЧисло = 0 Тогда + Цветность = Перечисления.ЦветностиИзображения.Монохромное; + ИначеЕсли ЦветностьЧисло = 1 Тогда + Цветность = Перечисления.ЦветностиИзображения.ГрадацииСерого; + ИначеЕсли ЦветностьЧисло = 2 Тогда + Цветность = Перечисления.ЦветностиИзображения.Цветное; + КонецЕсли; + + Если ПоворотЧисло = 0 Тогда + Поворот = Перечисления.ПоворотИзображения.НетПоворота; + ИначеЕсли ПоворотЧисло = 90 Тогда + Поворот = Перечисления.ПоворотИзображения.ВправоНа90; + ИначеЕсли ПоворотЧисло = 180 Тогда + Поворот = Перечисления.ПоворотИзображения.ВправоНа180; + ИначеЕсли ПоворотЧисло = 270 Тогда + Поворот = Перечисления.ПоворотИзображения.ВлевоНа90; + КонецЕсли; + + Если РазмерБумагиЧисло = 0 Тогда + РазмерБумаги = Перечисления.РазмерыБумаги.НеЗадано; + ИначеЕсли РазмерБумагиЧисло = 11 Тогда + РазмерБумаги = Перечисления.РазмерыБумаги.A3; + ИначеЕсли РазмерБумагиЧисло = 1 Тогда + РазмерБумаги = Перечисления.РазмерыБумаги.A4; + ИначеЕсли РазмерБумагиЧисло = 5 Тогда + РазмерБумаги = Перечисления.РазмерыБумаги.A5; + ИначеЕсли РазмерБумагиЧисло = 6 Тогда + РазмерБумаги = Перечисления.РазмерыБумаги.B4; + ИначеЕсли РазмерБумагиЧисло = 2 Тогда + РазмерБумаги = Перечисления.РазмерыБумаги.B5; + ИначеЕсли РазмерБумагиЧисло = 7 Тогда + РазмерБумаги = Перечисления.РазмерыБумаги.B6; + ИначеЕсли РазмерБумагиЧисло = 14 Тогда + РазмерБумаги = Перечисления.РазмерыБумаги.C4; + ИначеЕсли РазмерБумагиЧисло = 15 Тогда + РазмерБумаги = Перечисления.РазмерыБумаги.C5; + ИначеЕсли РазмерБумагиЧисло = 16 Тогда + РазмерБумаги = Перечисления.РазмерыБумаги.C6; + ИначеЕсли РазмерБумагиЧисло = 3 Тогда + РазмерБумаги = Перечисления.РазмерыБумаги.USLetter; + ИначеЕсли РазмерБумагиЧисло = 4 Тогда + РазмерБумаги = Перечисления.РазмерыБумаги.USLegal; + ИначеЕсли РазмерБумагиЧисло = 10 Тогда + РазмерБумаги = Перечисления.РазмерыБумаги.USExecutive; + КонецЕсли; + +КонецПроцедуры + +// Преобразует число в перечисление и сохраняет в настройках +Процедура ПреобразоватьИСохранитьПараметрыСканера(РазрешениеЧисло, ЦветностьЧисло, ПоворотЧисло, + РазмерБумагиЧисло, ИдентификаторКлиента) Экспорт + Перем Разрешение; + Перем Цветность; + Перем Поворот; + Перем РазмерБумаги; + + ПреобразоватьПараметрыСканераВПеречисления(РазрешениеЧисло, ЦветностьЧисло, ПоворотЧисло, РазмерБумагиЧисло, + Разрешение, Цветность, Поворот, РазмерБумаги); + ХранилищеОбщихНастроек.Сохранить("НастройкиСканирования/Разрешение", ИдентификаторКлиента, Разрешение); + ХранилищеОбщихНастроек.Сохранить("НастройкиСканирования/Цветность", ИдентификаторКлиента, Цветность); +КонецПроцедуры + +// Вызывается при обновлении на 1.0.6.3 - заполняет пути ТомаХраненияФайлов +Процедура ЗаполнитьПутиТома() Экспорт + УстановитьПривилегированныйРежим(Истина); + + НачатьТранзакцию(); + Попытка + Выборка = Справочники.ТомаХраненияФайлов.Выбрать(); + Пока Выборка.Следующий() Цикл + Объект = Выборка.ПолучитьОбъект(); + Объект.ПолныйПутьLinux = Объект.ПолныйПутьWindows; + Объект.Записать(); + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Переносит настройку (копирует в новое место, в старом удаляет) +Процедура ПеренестиНастройку(Объект, Настройка, ИмяТекущее, ИмяУстанавливаемое) + + Значение = ХранилищеОбщихНастроек.Загрузить(Объект, Настройка, , ИмяТекущее); + + Если Значение <> Неопределено Тогда + ХранилищеОбщихНастроек.Сохранить(Объект, Настройка, Значение, , ИмяУстанавливаемое); + ХранилищеОбщихНастроек.Удалить(Объект, Настройка, ИмяТекущее); + КонецЕсли; +КонецПроцедуры + +// При переименовании пользователя переносит его настройки - РабочийКаталог, ДействиеПоДвойномуЩелчкуМыши и пр +Процедура ПеренестиНастройкиПриСменеИмениПользователи(знач ИмяТекущее, знач ИмяУстанавливаемое) Экспорт + + ПеренестиНастройку("ЛокальныйКэшФайлов", "ПутьКЛокальномуКэшуФайлов", ИмяТекущее, ИмяУстанавливаемое); // путь к раб каталогу тоже переносим - чтобы файлы не потерялись + ПеренестиНастройку("ЛокальныйКэшФайлов", "МаксимальныйРазмерЛокальногоКэшаФайлов", ИмяТекущее, ИмяУстанавливаемое); + ПеренестиНастройку("ЛокальныйКэшФайлов", "УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования", ИмяТекущее, ИмяУстанавливаемое); + ПеренестиНастройку("ЛокальныйКэшФайлов", "ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов", ИмяТекущее, ИмяУстанавливаемое); + + ПеренестиНастройку("НастройкиПрограммы", "ПоказыватьКолонкуРазмер", ИмяТекущее, ИмяУстанавливаемое); + ПеренестиНастройку("НастройкиПрограммы", "ОткрыватьНачалоРаботыПриЗапуске", ИмяТекущее, ИмяУстанавливаемое); + ПеренестиНастройку("НастройкиПрограммы", "ПоказыватьПодсказкиПриРедактированииФайлов", ИмяТекущее, ИмяУстанавливаемое); + ПеренестиНастройку("НастройкиПрограммы", "ПоказыватьЗанятыеФайлыПриЗавершенииРаботы", ИмяТекущее, ИмяУстанавливаемое); + ПеренестиНастройку("НастройкиПрограммы", "ПапкаДляСохранитьКак", ИмяТекущее, ИмяУстанавливаемое); + ПеренестиНастройку("НастройкиПрограммы", "ПапкаДляОбновитьИзФайла", ИмяТекущее, ИмяУстанавливаемое); + + ПеренестиНастройку("НастройкиСравненияФайлов", "СпособСравненияВерсийФайлов", ИмяТекущее, ИмяУстанавливаемое); + ПеренестиНастройку("ИмяПапкиВыгрузки", "ИмяПапкиВыгрузки", ИмяТекущее, ИмяУстанавливаемое); + + ПеренестиНастройку("НастройкиОткрытияФайлов", "ДействиеПоДвойномуЩелчкуМыши", ИмяТекущее, ИмяУстанавливаемое); + ПеренестиНастройку("НастройкиОткрытияФайлов", "СпрашиватьРежимРедактированияПриОткрытииФайла", ИмяТекущее, ИмяУстанавливаемое); + +КонецПроцедуры + +// Обработчик события ПриЗаписи. Определен для объектов (кроме Документ), владельцев Файла. +Процедура УстановитьПометкуУдаленияФайловПередЗаписью(Источник, Отказ) Экспорт + Если Источник.ПометкаУдаления <> Источник.Ссылка.ПометкаУдаления Тогда + ПометитьНаУдалениеПриложенныеФайлы(Источник.Ссылка, Источник.ПометкаУдаления); + КонецЕсли; +КонецПроцедуры + +// Обработчик события ПриЗаписи. Определен для объектов типа Документ, владельцев Файла. +Процедура УстановитьПометкуУдаленияФайловДокументовПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт + Если Источник.ПометкаУдаления <> Источник.Ссылка.ПометкаУдаления Тогда + ПометитьНаУдалениеПриложенныеФайлы(Источник.Ссылка, Источник.ПометкаУдаления); + КонецЕсли; +КонецПроцедуры + +// получает первые 100 версий файлов, у которых еще не извлечен текст +Функция ПолучитьМассивВерсийДляИзвлеченияТекста() Экспорт + + МассивВерсий = Новый Массив; + + Запрос = Новый Запрос; + + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 100 + | ВерсииФайлов.Ссылка КАК Ссылка, + | ВерсииФайлов.СтатусИзвлеченияТекста КАК СтатусИзвлеченияТекста + |ИЗ + | Справочник.ВерсииФайлов КАК ВерсииФайлов + |ГДЕ + | (ВерсииФайлов.СтатусИзвлеченияТекста = &Статус + | ИЛИ ВерсииФайлов.СтатусИзвлеченияТекста = ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.ПустаяСсылка))"; + + Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен); + + Результат = Запрос.Выполнить(); + ТаблицаВыгрузки = Результат.Выгрузить(); + + Для Каждого Строка Из ТаблицаВыгрузки Цикл + ВерсияСсылка = Строка.Ссылка; + МассивВерсий.Добавить(ВерсияСсылка); + КонецЦикла; + + Возврат МассивВерсий; + +КонецФункции + +// Записывает на сервер результат извлечения текста - извлеченный текст и СтатусИзвлеченияТекста +Процедура ЗаписатьРезультатИзвлеченияТекста(ВерсияСсылка, РезультатИзвлечения, АдресВременногоХранилищаТекста) Экспорт + + ФайлЗаблокирован = Ложь; + Файл = ВерсияСсылка.Владелец; + + Если Файл.ТекущаяВерсия = ВерсияСсылка Тогда + + Попытка + ЗаблокироватьДанныеДляРедактирования(Файл); + ФайлЗаблокирован = Истина; + Исключение + Возврат; // ничего не сообщаем + КонецПопытки; + + КонецЕсли; + + Текст = ""; + + ВерсияОбъект = ВерсияСсылка.ПолучитьОбъект(); + + Если Не ПустаяСтрока(АдресВременногоХранилищаТекста) Тогда + Текст = ПолучитьСтрокуИзВременногоХранилища(АдресВременногоХранилищаТекста); + ВерсияОбъект.ТекстХранилище = Новый ХранилищеЗначения(Текст); + ВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + КонецЕсли; + + Если РезультатИзвлечения = "НеИзвлечен" Тогда + ВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; + ИначеЕсли РезультатИзвлечения = "Извлечен" Тогда + ВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + ИначеЕсли РезультатИзвлечения = "ИзвлечьНеУдалось" Тогда + ВерсияОбъект.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.ИзвлечьНеУдалось; + КонецЕсли; + + НачатьТранзакцию(); + Попытка + + ВерсияОбъект.Записать(); + + Если Файл.ТекущаяВерсия = ВерсияСсылка Тогда + ФайлОбъект = Файл.ПолучитьОбъект(); + ФайлОбъект.ТекстХранилище = ВерсияОбъект.ТекстХранилище; + ФайлОбъект.Записать(); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + + Если ФайлЗаблокирован Тогда + РазблокироватьДанныеДляРедактирования(Файл); + КонецЕсли; + + Исключение + ОтменитьТранзакцию(); + Если ФайлЗаблокирован Тогда + РазблокироватьДанныеДляРедактирования(Файл); + КонецЕсли; + + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// получает массив ссылок всех файлов в папке (если Рекурсивно, то и в подпапках тоже) +Функция ПолучитьВсеФайлыВПапке(Папка, Рекурсивно) Экспорт + + МассивФайлов = Новый Массив; + + ПолучитьВсеФайлыВОднойПапке(Папка, МассивФайлов); + + Если Рекурсивно Тогда + + МассивПапок = Новый Массив; + + ЗапросВПапки = Новый Запрос; + ЗапросВПапки.УстановитьПараметр("Родитель", Папка); + ЗапросВПапки.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ПапкиФайлов.Ссылка КАК Ссылка + |ИЗ + | Справочник.ПапкиФайлов КАК ПапкиФайлов + |ГДЕ + | ПапкиФайлов.Родитель В ИЕРАРХИИ(&Родитель)"; + + Результат = ЗапросВПапки.Выполнить(); + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + МассивПапок.Добавить(Выборка.Ссылка); + КонецЦикла; + + Для Каждого Подпапка Из МассивПапок Цикл + ПолучитьВсеФайлыВОднойПапке(Подпапка, МассивФайлов); + КонецЦикла; + + КонецЕсли; + + Возврат МассивФайлов; +КонецФункции + +// получает массив ссылок всех файлов в папке +Процедура ПолучитьВсеФайлыВОднойПапке(Папка, МассивФайлов) Экспорт + + ЗапросВПапки = Новый Запрос; + ЗапросВПапки.УстановитьПараметр("Родитель", Папка); + ЗапросВПапки.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Файлы.Ссылка КАК Ссылка + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.ВладелецФайла = &Родитель"; + + Результат = ЗапросВПапки.Выполнить(); + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + МассивФайлов.Добавить(Выборка.Ссылка); + КонецЦикла; + +КонецПроцедуры + + +// получает ДанныеФайла и НавигационнуюСсылкуВерсии +Функция ПолучитьДанныеФайлаИНавигационнуюСсылкуВерсии(ФайлСсылка, ВерсияСсылка, ИдентификаторФормы) Экспорт + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(ФайлСсылка, ВерсияСсылка); + Если ВерсияСсылка = Неопределено Тогда + ВерсияСсылка = ФайлСсылка.ТекущаяВерсия; + КонецЕсли; + НавигационнаяСсылкаВерсии = РаботаСФайлами.ПолучитьНавигационнуюСсылкуДляОткрытия(ВерсияСсылка, ИдентификаторФормы); + + СтруктураВозврата = Новый Структура("ДанныеФайла, НавигационнаяСсылкаВерсии", ДанныеФайла, НавигационнаяСсылкаВерсии); + + Возврат СтруктураВозврата; +КонецФункции + +// Получает данные файла для открытия и читает их Общих настроек ПапкаДляСохранитьКак +Функция ПолучитьДанныеФайлаДляСохранения(ФайлСсылка, ВерсияСсылка = Неопределено, + ИдентификаторФормы = Неопределено, РабочийКаталогВладельца = Неопределено) Экспорт + + ДанныеФайла = ПолучитьДанныеФайлаДляОткрытия(ФайлСсылка, ВерсияСсылка, ИдентификаторФормы, РабочийКаталогВладельца); + + ПапкаДляСохранитьКак = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПрограммы", "ПапкаДляСохранитьКак"); + ДанныеФайла.Вставить("ПапкаДляСохранитьКак", ПапкаДляСохранитьКак); + + Возврат ДанныеФайла; +КонецФункции // ПолучитьДанныеФайлаИЗанятьФайл() + +// в справочнике Файлы перезаписывает все элементы +Процедура ПерезаписатьВсеФайлы() Экспорт + УстановитьПривилегированныйРежим(Истина); + НачатьТранзакцию(); + Попытка + Выборка = Справочники.Файлы.Выбрать(); + Пока Выборка.Следующий() Цикл + Объект = Выборка.ПолучитьОбъект(); + Объект.Записать(); + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; +КонецПроцедуры + +// Возвращает ИспользоватьЭлектронноЦифровыеПодписиИШифрование +Функция ПолучитьИспользоватьЭлектронноЦифровыеПодписиИШифрование() Экспорт + УстановитьПривилегированныйРежим(Истина); + ИспользоватьЭлектронноЦифровыеПодписиИШифрование = Константы.ИспользоватьЭлектронноЦифровыеПодписиИШифрование.Получить(); + УстановитьПривилегированныйРежим(Ложь); + Возврат ИспользоватьЭлектронноЦифровыеПодписиИШифрование; +КонецФункции + +// получает ДанныеФайла и НавигационнуюСсылкуВерсии всех подчиненных файлов для Вх Исх Внутр +Функция ПолучитьДанныеФайлаИНавигационнуюСсылкуВерсииВсехПодчиненныхФайлов(ВладелецФайла, ИдентификаторФормы) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Файлы.Ссылка КАК Ссылка + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.ВладелецФайла = &ВладелецФайла"; + + Запрос.УстановитьПараметр("ВладелецФайла", ВладелецФайла); + Результат = Запрос.Выполнить(); + Выборка = Результат.Выбрать(); + + МассивВозврата = Новый Массив; + Пока Выборка.Следующий() Цикл + + ФайлСсылка = Выборка.Ссылка; + ВерсияСсылка = ФайлСсылка.ТекущаяВерсия; + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(ФайлСсылка, ВерсияСсылка); + НавигационнаяСсылкаВерсии = РаботаСФайлами.ПолучитьНавигационнуюСсылкуДляОткрытия(ВерсияСсылка, ИдентификаторФормы); + + СтруктураВозврата = Новый Структура("ДанныеФайла, НавигационнаяСсылкаВерсии", ДанныеФайла, НавигационнаяСсылкаВерсии); + МассивВозврата.Добавить(СтруктураВозврата); + КонецЦикла; + + Возврат МассивВозврата; +КонецФункции + +// получает все подчиненные файлы для Вх ИСх Внутр +Функция ПолучитьВсеПодчиненныеФайлы(ВладелецФайла) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Файлы.Ссылка КАК Ссылка + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.ВладелецФайла = &ВладелецФайла"; + + Запрос.УстановитьПараметр("ВладелецФайла", ВладелецФайла); + Результат = Запрос.Выполнить(); + Выборка = Результат.Выбрать(); + + МассивВозврата = Новый Массив; + Пока Выборка.Следующий() Цикл + МассивВозврата.Добавить(Выборка.Ссылка); + КонецЦикла; + + Возврат МассивВозврата; +КонецФункции + +// Получает количество версий файла +Функция ПолучитьКоличествоВерсий(ФайлСсылка) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | КОЛИЧЕСТВО(*) КАК Количество + |ИЗ + | Справочник.ВерсииФайлов КАК ВерсииФайлов + |ГДЕ + | ВерсииФайлов.Владелец = &ФайлСсылка"; + + Запрос.УстановитьПараметр("ФайлСсылка", ФайлСсылка); + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + + Возврат Число(Выборка.Количество); + +КонецФункции + +// получает ДанныеФайла и НавигационнуюСсылкуВерсии всех подчиненных файлов для Вх Исх Внутр +Функция ПолучитьДанныеФайлаИНавигационнуюСсылкуВсехВерсийФайла(ФайлСсылка, ИдентификаторФормы) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ВерсииФайлов.Ссылка КАК Ссылка + |ИЗ + | Справочник.ВерсииФайлов КАК ВерсииФайлов + |ГДЕ + | ВерсииФайлов.Владелец = &ФайлСсылка"; + + Запрос.УстановитьПараметр("ФайлСсылка", ФайлСсылка); + Результат = Запрос.Выполнить(); + Выборка = Результат.Выбрать(); + + МассивВозврата = Новый Массив; + Пока Выборка.Следующий() Цикл + + ВерсияСсылка = Выборка.Ссылка; + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(ФайлСсылка, ВерсияСсылка); + НавигационнаяСсылкаВерсии = РаботаСФайлами.ПолучитьНавигационнуюСсылкуВоВременномХранилище(ВерсияСсылка, ИдентификаторФормы); + + СтруктураВозврата = Новый Структура("ДанныеФайла, НавигационнаяСсылкаВерсии, ВерсияСсылка", + ДанныеФайла, НавигационнаяСсылкаВерсии, ВерсияСсылка); + МассивВозврата.Добавить(СтруктураВозврата); + КонецЦикла; + + Возврат МассивВозврата; +КонецФункции + +// помещает шифрованные файлы в базу и ставит признак Зашифрован файлу и всем версиям +Процедура ЗанестиИнформациюОШифровании(ФайлСсылка, Зашифровать, МассивДанныхДляЗанесенияВБазу, УникальныйИдентификатор, + ИмяРабочегоКаталога, МассивФайловВРабочемКаталогеДляУдаления, МассивОтпечатков, МассивАдресов) Экспорт + + НачатьТранзакцию(); + Попытка + + ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); + ФайлОбъект.Зашифрован = Зашифровать; + ФайлОбъект.ТекстХранилище = Новый ХранилищеЗначения(""); // очистим извлеченный текст + ФайлОбъект.ЗаписьПодписанногоОбъекта = Истина; + + Если Зашифровать Тогда + Для Каждого ОтпечатокСтруктура Из МассивОтпечатков Цикл + НоваяСтрока = ФайлОбъект.СертификатыШифрования.Добавить(); + НоваяСтрока.Отпечаток = ОтпечатокСтруктура.Отпечаток; + НоваяСтрока.Представление = ОтпечатокСтруктура.Представление; + КонецЦикла; + Иначе + ФайлОбъект.СертификатыШифрования.Очистить(); + КонецЕсли; + + ФайлОбъект.Записать(); + + Для Каждого ДанныеДляЗаписиНаСервере Из МассивДанныхДляЗанесенияВБазу Цикл + АдресВременногоХранилища = ДанныеДляЗаписиНаСервере.АдресВременногоХранилища; + ВерсияСсылка = ДанныеДляЗаписиНаСервере.ВерсияСсылка; + + ИмяФайлаСПутемВРабочемКаталоге = ""; + ВРабочемКаталогеНаЧтение = Истина; // не используется + ВРабочемКаталогеВладельца = Истина; + ИмяФайлаСПутемВРабочемКаталоге = ПолучитьИмяФайлаСПутемИзРегистра(ВерсияСсылка, ИмяРабочегоКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + Если НЕ ПустаяСтрока(ИмяФайлаСПутемВРабочемКаталоге) Тогда + МассивФайловВРабочемКаталогеДляУдаления.Добавить(ИмяФайлаСПутемВРабочемКаталоге); + КонецЕсли; + + УдалитьИзРегистра(ВерсияСсылка); + + СтатусИзвлеченияТекста = Неопределено; + Если Зашифровать = Ложь Тогда + СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен; + КонецЕсли; + + Версия = ОбновитьВерсию( + ФайлСсылка, + Ложь, //СоздаватьВерсию, + АдресВременногоХранилища, + ВерсияСсылка.Комментарий, + ВерсияСсылка.ДатаСоздания, + ВерсияСсылка.ДатаМодификацииУниверсальная, + ВерсияСсылка.Размер, + ВерсияСсылка.ПолноеНаименование, + ВерсияСсылка.Расширение, + "", //ПолныйПутьКФайлу, + "", //АдресВременногоХранилищаТекста, + Ложь, //ЭтоВебКлиент, + Ложь, //ТекстНеИзвлеченНаКлиенте, + УникальныйИдентификатор, + Зашифровать, // Зашифрован + ВерсияСсылка, + СтатусИзвлеченияТекста); + + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Для Каждого АдресФайла Из МассивАдресов Цикл + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда + УдалитьИзВременногоХранилища(АдресФайла); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// делает ПоместитьВоВременноеХранилище (если файл хранится на диске) и возвращает нужную ссылку +Функция ПолучитьНавигационнуюСсылкуВоВременномХранилище(ВерсияСсылка, ИдентификаторФормы = Неопределено) Экспорт + Адрес = ""; + + ТипХраненияФайла = ВерсияСсылка.ТипХраненияФайла; + + Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + Если НЕ ВерсияСсылка.Том.Пустая() Тогда + ПолныйПуть = ПолныйПутьТома(ВерсияСсылка.Том) + ВерсияСсылка.ПутьКФайлу; + Попытка + ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть); + Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы); + Исключение + // запись в журнал регистрации + СообщениеОбОшибке = СформироватьТекстОшибкиПолученияФайлСТомаДляАдминистратора(ИнформацияОбОшибке(), ВерсияСсылка.Владелец); + ЗаписьЖурналаРегистрации("Открытие файла", УровеньЖурналаРегистрации.Ошибка, Метаданные.Справочники.Файлы, ВерсияСсылка.Владелец, СообщениеОбОшибке); + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка открытия файла - файл не найден на сервере. Возможно он удален антивирусной программой. Обратитесь к администратору. + | Файл: ""%1.%2""'"), + ВерсияСсылка.ПолноеНаименование, + ВерсияСсылка.Расширение); + КонецПопытки; + КонецЕсли; + Иначе + ДвоичныеДанные = ВерсияСсылка.ФайлХранилище.Получить(); + Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы); + КонецЕсли; + + Возврат Адрес; +КонецФункции // ПолучитьНавигационнуюСсылкуДляОткрытия() + +// получает ДанныеФайла и НавигационнуюСсылкуВерсии, предварительно поместив файл версии во временное хранилище +Функция ПолучитьДанныеФайлаИНавигационнуюСсылкуВерсииВоВременномХранилище(ФайлСсылка, ВерсияСсылка, ИдентификаторФормы) Экспорт + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(ФайлСсылка, ВерсияСсылка); + Если ВерсияСсылка = Неопределено Тогда + ВерсияСсылка = ФайлСсылка.ТекущаяВерсия; + КонецЕсли; + НавигационнаяСсылкаВерсии = ПолучитьНавигационнуюСсылкуВоВременномХранилище(ВерсияСсылка, ИдентификаторФормы); + + СтруктураВозврата = Новый Структура("ДанныеФайла, НавигационнаяСсылкаВерсии", ДанныеФайла, НавигационнаяСсылкаВерсии); + + Возврат СтруктураВозврата; +КонецФункции + +// Получает массив сертификатов шифрования +Функция ПолучитьМассивСертификатовШифрования(Ссылка) Экспорт + + УстановитьПривилегированныйРежим(Истина); + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | СертификатыШифрования.Представление КАК Представление, + | СертификатыШифрования.Отпечаток КАК Отпечаток + |ИЗ + | Справочник.Файлы.СертификатыШифрования КАК СертификатыШифрования + |ГДЕ + | СертификатыШифрования.Ссылка = &ОбъектСсылка"; + + Запрос.Параметры.Вставить("ОбъектСсылка", Ссылка); + ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); + + МассивСертификатовШифрования = Новый Массив; + Пока ВыборкаЗапроса.Следующий() Цикл + ОтпечатокСтруктура = Новый Структура("Отпечаток, Представление", + ВыборкаЗапроса.Отпечаток, ВыборкаЗапроса.Представление); + МассивСертификатовШифрования.Добавить(ОтпечатокСтруктура); + КонецЦикла; + + УстановитьПривилегированныйРежим(Ложь); + + Возврат МассивСертификатовШифрования; + +КонецФункции + +// получает ДанныеФайла и сам файл как ДвоичныеДанные +Функция ПолучитьДанныеФайлаИДвоичныеДанные(ФайлСсылка, ВерсияСсылка = Неопределено, + АдресПодписи = Неопределено) Экспорт + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(ФайлСсылка, ВерсияСсылка); + Если ВерсияСсылка = Неопределено Тогда + ВерсияСсылка = ФайлСсылка.ТекущаяВерсия; + КонецЕсли; + + ДвоичныеДанные = Неопределено; + + ТипХраненияФайла = ВерсияСсылка.ТипХраненияФайла; + Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + Если НЕ ВерсияСсылка.Том.Пустая() Тогда + ПолныйПуть = ПолныйПутьТома(ВерсияСсылка.Том) + ВерсияСсылка.ПутьКФайлу; + Попытка + ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть); + Исключение + // запись в журнал регистрации + СообщениеОбОшибке = СформироватьТекстОшибкиПолученияФайлСТомаДляАдминистратора(ИнформацияОбОшибке(), ВерсияСсылка.Владелец); + ЗаписьЖурналаРегистрации("Открытие файла", УровеньЖурналаРегистрации.Ошибка, Метаданные.Справочники.Файлы, ВерсияСсылка.Владелец, СообщениеОбОшибке); + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка открытия файла - файл не найден на сервере. Возможно он удален антивирусной программой. Обратитесь к администратору. + | Файл: ""%1.%2""'"), + ВерсияСсылка.ПолноеНаименование, + ВерсияСсылка.Расширение); + КонецПопытки; + КонецЕсли; + Иначе + ДвоичныеДанные = ВерсияСсылка.ФайлХранилище.Получить(); + КонецЕсли; + + ДвоичныеДанныеПодписи = Неопределено; + Если АдресПодписи <> Неопределено Тогда + ДвоичныеДанныеПодписи = ПолучитьИзВременногоХранилища(АдресПодписи); + КонецЕсли; + + СтруктураВозврата = Новый Структура("ДанныеФайла, ДвоичныеДанные, ДвоичныеДанныеПодписи", + ДанныеФайла, ДвоичныеДанные, ДвоичныеДанныеПодписи); + + Возврат СтруктураВозврата; +КонецФункции diff --git a/SSL/src/CommonModules/РаботаСФайлами/РаботаСФайлами.mdo b/SSL/src/CommonModules/РаботаСФайлами/РаботаСФайлами.mdo new file mode 100644 index 000000000..2f813bda7 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСФайлами/РаботаСФайлами.mdo @@ -0,0 +1,11 @@ + + + РаботаСФайлами + + ru + Работа с файлами + + Функции для работы со справочником Файлы + true + true + diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl new file mode 100644 index 000000000..2cd585383 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl @@ -0,0 +1,4047 @@ +// Можно ли освободить Файл +Функция ВозможностьОсвободитьФайл(ОбъектСсылка, РедактируетТекущийПользователь, Редактирует, СтрокаОшибки = "") Экспорт + + Если РедактируетТекущийПользователь Тогда + Возврат Истина; + ИначеЕсли Редактирует.Пустая() Тогда + СтрокаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Нельзя освободить файл ""%1"" т.к. он никем не занят.'"), Строка(ОбъектСсылка)); + Возврат Ложь; + Иначе + Если РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ЭтоПолноправныйПользовательИБ Тогда + Возврат Истина; + КонецЕсли; + + СтрокаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Нельзя освободить файл ""%1"" т.к. он занят пользователем ""%2"".'"), + Строка(ОбъектСсылка), + Строка(Редактирует)); + Возврат Ложь; + КонецЕсли; + +КонецФункции // ВозможностьОсвободитьФайл() + +// Пометка файла как занятого для редактирования - по ссылке +// (без ПолучитьДанныеФайла - для минимизации числа вызовов сервера) +Процедура ЗанятьФайлПоСсылке(ОбъектСсылка, УникальныйИдентификатор = Неопределено) Экспорт + + Перем ДанныеФайла; + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + СтрокаОшибки = ""; + Если НЕ РаботаСФайлами.ПолучитьДанныеФайлаИЗанятьФайл(ОбъектСсылка, ДанныеФайла, СтрокаОшибки, УникальныйИдентификатор) Тогда + // Если занять нельзя, то сообщаем об ошибке + Предупреждение(СтрокаОшибки); + Возврат; + КонецЕсли; + + Если РасширениеПодключено Тогда + НаЧтение = Ложь; + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Редактирование файла'"), + ДанныеФайла.НавигационнаяСсылка, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" занят для редактирования.'"), Строка(ДанныеФайла.Ссылка)), + БиблиотекаКартинок.Информация32); + +КонецПроцедуры //ЗанятьФайлПоСсылке + +// Пометка файлов как занятых для редактирования - по массиву ссылок +// +Процедура ЗанятьФайлыПоСсылкам(Знач МассивФайлов) Экспорт + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + // Получение массива данных файлов + ДанныеФайлов = Новый Массив; + РаботаСФайлами.ПолучитьДанныеДляМассиваФайлов(МассивФайлов, ДанныеФайлов); + ВГраницаМассива = ДанныеФайлов.ВГраница(); + + Для Инд = 0 По ВГраницаМассива Цикл + ДанныеФайла = ДанныеФайлов[ВГраницаМассива - Инд]; + + СтрокаОшибки = ""; + Если НЕ РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки) ИЛИ Не ДанныеФайла.Редактирует.Пустая() Тогда // занять невозможно + ДанныеФайлов.Удалить(ВГраницаМассива - Инд); + КонецЕсли; + КонецЦикла; + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + // Занять файлы + КоличествоЗанятых = 0; + + Для Каждого ДанныеФайла Из ДанныеФайлов Цикл + + Если Не РаботаСФайлами.ЗанятьФайл(ДанныеФайла) Тогда + Продолжить; + КонецЕсли; + + Если РасширениеПодключено Тогда + НаЧтение = Ложь; + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + КоличествоЗанятых = КоличествоЗанятых + 1; + КонецЦикла; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Занять файлы'"), + , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файлы (%1 из %2) заняты для редактирования.'"), + КоличествоЗанятых, МассивФайлов.Количество()), + БиблиотекаКартинок.Информация32); + +КонецПроцедуры //ЗанятьФайлПоСсылкам + +// Пометка файла как занятого для редактирования +Процедура ЗанятьФайл(ДанныеФайла) + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + СтрокаОшибки = ""; + Если РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки) Тогда + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + СтрокаОшибки = ""; + Если Не РаботаСФайлами.ЗанятьФайл(ДанныеФайла, СтрокаОшибки) Тогда + Предупреждение(СтрокаОшибки); + Возврат; + КонецЕсли; + + Если РасширениеПодключено Тогда + НаЧтение = Ложь; + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Редактирование файла'"), + ДанныеФайла.НавигационнаяСсылка, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" занят для редактирования.'"), Строка(ДанныеФайла.Ссылка)), + БиблиотекаКартинок.Информация32); + + Иначе + Предупреждение(СтрокаОшибки); + Возврат; + КонецЕсли; + +КонецПроцедуры + +// Процедура предназначена для открытия Файла в режиме редактирования - принимает ссылку на Файл +// по ссылке (без ПолучитьДанныеФайла - для минимизации числа вызовов сервера) +Процедура РедактироватьФайлПоСсылке(ОбъектСсылка, УникальныйИдентификатор = Неопределено, РабочийКаталогВладельца = Неопределено) Экспорт + Перем ДанныеФайла; + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + СтрокаОшибки = ""; + Если НЕ РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытияИЗанятьФайл(ОбъектСсылка, ДанныеФайла, СтрокаОшибки, УникальныйИдентификатор, РабочийКаталогВладельца) Тогда + // Если занять нельзя, то сообщаем об ошибке + Предупреждение(СтрокаОшибки); + Возврат; + КонецЕсли; + + Если РасширениеПодключено Тогда + НаЧтение = Ложь; + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Редактирование файла'"), + ДанныеФайла.НавигационнаяСсылка, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" занят для редактирования.'"), Строка(ДанныеФайла.Ссылка)), + БиблиотекаКартинок.Информация32); + + // Если Файл без файла, то открываем карточку + Если ДанныеФайла.Версия.Пустая() Тогда + ОткрытьЗначение(ДанныеФайла.Ссылка); + Возврат; + КонецЕсли; + + Если РасширениеПодключено Тогда + ПолноеИмяФайла = ""; + Результат = ПолучитьФайлВерсииВРабочийКаталог(ДанныеФайла, ПолноеИмяФайла, УникальныйИдентификатор); + Если Результат Тогда + ОткрытьФайлПриложением(ДанныеФайла, ПолноеИмяФайла); + КонецЕсли; + Иначе + ПоказатьНапоминаниеПриРедактировании(); + ИмяФайла = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + ПолучитьФайл(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии, ИмяФайла, Истина); + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии) Тогда + УдалитьИзВременногоХранилища(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры // РедактироватьФайлПоСсылке() + +// Покажет напоминание - если стоит настройка +Процедура ПоказатьНапоминаниеПриРедактировании() + Если РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПоказыватьПодсказкиПриРедактированииФайлов = Истина Тогда + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если НЕ РасширениеПодключено Тогда + Форма = РаботаСФайламиКлиентПовтИсп.ПолучитьФормуНапоминанияПриРедактировании(); + + Форма.БольшеНеПоказывать = Ложь; + Форма.ОткрытьМодально(); + + Если Форма.БольшеНеПоказывать = Истина Тогда + РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПоказыватьПодсказкиПриРедактированииФайлов = Ложь; + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПоказыватьПодсказкиПриРедактированииФайлов", РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПоказыватьПодсказкиПриРедактированииФайлов); + КонецЕсли; + КонецЕсли; + + КонецЕсли; +КонецПроцедуры // ПоказатьНапоминаниеПриРедактировании() + +// Покажет напоминание - если стоит настройка +Процедура ПоказатьНапоминаниеПередПоместитьФайл() + Если РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПоказыватьПодсказкиПриРедактированииФайлов = Истина Тогда + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если НЕ РасширениеПодключено Тогда + // Кешируем форму на клиенте + Форма = РаботаСФайламиКлиентПовтИсп.ПолучитьФормуНапоминанияПередПоместитьФайл(); + Форма.БольшеНеПоказывать = Ложь; + Форма.ОткрытьМодально(); + + Если Форма.БольшеНеПоказывать = Истина Тогда + РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПоказыватьПодсказкиПриРедактированииФайлов = Ложь; + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПоказыватьПодсказкиПриРедактированииФайлов", РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПоказыватьПодсказкиПриРедактированииФайлов); + КонецЕсли; + КонецЕсли; + + КонецЕсли; +КонецПроцедуры // ПоказатьНапоминаниеПередПоместитьФайл() + +// Процедура предназначена для открытия Файла в режиме редактирования +Процедура РедактироватьФайл(ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + СтрокаОшибки = ""; + Если НЕ РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки) Тогда + Предупреждение(СтрокаОшибки); + Возврат; + КонецЕсли; + + // Если Файл никем не занят - займем Файл + Если ДанныеФайла.Редактирует.Пустая() Тогда + ЗанятьФайл(ДанныеФайла); + КонецЕсли; + + // Если Файл без файла нужно в таких случаях открывать карточку + Если ДанныеФайла.Версия.Пустая() Тогда + ОткрытьЗначение(ДанныеФайла.Ссылка); + Возврат; + КонецЕсли; + + Если РасширениеПодключено Тогда + ПолноеИмяФайла = ""; + Результат = ПолучитьФайлВерсииВРабочийКаталог(ДанныеФайла, ПолноеИмяФайла, УникальныйИдентификатор); + Если Результат Тогда + ОткрытьФайлПриложением(ДанныеФайла, ПолноеИмяФайла); + КонецЕсли; + Иначе + ПоказатьНапоминаниеПриРедактировании(); + ИмяФайла = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + ПолучитьФайл(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии, ИмяФайла, Истина); + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии) Тогда + УдалитьИзВременногоХранилища(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры // РедактироватьФайл() + +// Процедура открытия Файла +Процедура ОткрытьФайл(ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + // Если Файл без файла нужно в таких случаях открывать карточку + Если ДанныеФайла.Версия.Пустая() Тогда + ОткрытьЗначение(ДанныеФайла.Ссылка); + Возврат; + КонецЕсли; + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + Если РасширениеПодключено Тогда + ПолноеИмяФайла = ""; + Результат = ПолучитьФайлВерсииВРабочийКаталог(ДанныеФайла, ПолноеИмяФайла, УникальныйИдентификатор); + Если Результат Тогда + ОткрытьФайлПриложением(ДанныеФайла, ПолноеИмяФайла); + КонецЕсли; + Иначе + Если ДанныеФайла.РедактируетТекущийПользователь Тогда + ПоказатьНапоминаниеПриРедактировании(); + КонецЕсли; + ИмяФайла = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + ПолучитьФайл(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии, ИмяФайла, Истина); + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии) Тогда + УдалитьИзВременногоХранилища(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры // ОткрытьФайл() + +// Процедура предназначена для открытия версии Файла +Процедура ОткрытьВерсиюФайла(ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если РасширениеПодключено Тогда + ПолноеИмяФайла = ""; + Результат = ПолучитьФайлВерсииВРабочийКаталог(ДанныеФайла, ПолноеИмяФайла, УникальныйИдентификатор); + Если Результат Тогда + ОткрытьФайлПриложением(ДанныеФайла, ПолноеИмяФайла); + КонецЕсли; + Иначе + Адрес = РаботаСФайлами.ПолучитьНавигационнуюСсылкуДляОткрытия(ДанныеФайла.Версия, УникальныйИдентификатор); + + ИмяФайла = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + ПолучитьФайл(Адрес, ИмяФайла, Истина); + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(Адрес) Тогда + УдалитьИзВременногоХранилища(Адрес); + КонецЕсли; + КонецЕсли; +КонецПроцедуры // ОткрытьВерсиюФайла() + + +// На основе переданного пути к файлу на диске создает Файл его и открывает карточку +Процедура СоздатьДокументНаОсновеФайла(ПолноеИмяФайла, ВладелецФайла, ФормаВладелец, + НеОткрыватьКарточкуПослеСозданияИзФайла = Неопределено, ИмяСоздаваемогоФайла = Неопределено) Экспорт + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + // Здесь создаем Файл ... + Файл = Новый Файл(ПолноеИмяФайла); + + ЗапретЗагрузкиФайловПоРасширению = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ЗапретЗагрузкиФайловПоРасширению; + СписокЗапрещенныхРасширений = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().СписокЗапрещенныхРасширений; + РасширениеФайла = Файл.Расширение; + Если Не РаботаСФайламиКлиентСервер.РасширениеФайлаРазрешеноДляЗагрузки(ЗапретЗагрузкиФайловПоРасширению, СписокЗапрещенныхРасширений, РасширениеФайла) Тогда + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Загрузка файлов с расширением ""%1"" запрещена. Обратитесь к администратору системы.'"), + РасширениеФайла); + КонецЕсли; + + МаксРазмерФайла = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().МаксимальныйРазмерФайла; + + РазмерВМб = Файл.Размер() / (1024 * 1024); + РазмерВМбМакс = МаксРазмерФайла / (1024 * 1024); + + Если Файл.Размер() > МаксРазмерФайла Тогда + + ОбновитьПовторноИспользуемыеЗначения(); + + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Размер файла ""%1"" (%2 Мб) превышает максимально допустимый размер файла (%3 Мб).'"), + Файл.Имя, + ?(РазмерВМб >= 1, Формат(РазмерВМб, "ЧДЦ=0"), Формат(РазмерВМб, "ЧДЦ=1; ЧН=0")), + ?(РазмерВМбМакс >= 1, Формат(РазмерВМбМакс, "ЧДЦ=0"), Формат(РазмерВМбМакс, "ЧДЦ=1; ЧН=0"))); + КонецЕсли; + + АдресВременногоХранилищаТекста = ФайловыеФункцииКлиент.ИзвлечьТекстВоВременноеХранилище( + Файл.ПолноеИмя, + ФормаВладелец.УникальныйИдентификатор); + + ВремяИзменения = Файл.ПолучитьВремяИзменения(); + ВремяИзмененияУниверсальное = Файл.ПолучитьУниверсальноеВремяИзменения(); + + ИмяСоздания = Файл.ИмяБезРасширения; + Если ИмяСоздаваемогоФайла <> Неопределено Тогда + ИмяСоздания = ИмяСоздаваемогоФайла; + КонецЕсли; + + ИмяФайла = ИмяСоздания + Файл.Расширение; + РазмерВМб = Файл.Размер() / (1024 * 1024); + + ТекстПояснения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идет сохранение файла ""%1"" (%2 Мб). + |Пожалуйста, подождите...'"), + ИмяФайла, + ?(РазмерВМб >= 1, Формат(РазмерВМб, "ЧДЦ=0"), Формат(РазмерВМб, "ЧДЦ=1; ЧН=0"))); + + Состояние(ТекстПояснения); + + + // Поместим Файл в ВременноеХранилище + АдресВременногоХранилищаФайла = ""; + + ПомещаемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(Файл.ПолноеИмя, ""); + ПомещаемыеФайлы.Добавить(Описание); + + ПомещенныеФайлы = Новый Массив; + + Если НЕ ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ФормаВладелец.УникальныйИдентификатор) Тогда + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при помещении файла в хранилище: %1'"), Файл.ПолноеИмя); + КонецЕсли; + + Если ПомещенныеФайлы.Количество() = 1 Тогда + АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение; + КонецЕсли; + + // Создадим карточку Файла в БД + Док = РаботаСФайлами.СоздатьФайлСВерсией( + ВладелецФайла, + ИмяСоздания, + ФайловыеФункцииКлиентСервер.РасширениеБезТочки(Файл.Расширение), + ВремяИзменения, + ВремяИзмененияУниверсальное, + Файл.Размер(), + АдресВременногоХранилищаФайла, + АдресВременногоХранилищаТекста, + Ложь); // это не веб клиент + + Состояние(); + + ПараметрыОповещения = Новый Структура("Владелец, Файл", ВладелецФайла, Док); + Оповестить("СозданФайл", ПараметрыОповещения); + + НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Док); + ПоказатьОповещениеПользователя( + НСтр("ru = 'Создание:'"), + НавигационнаяСсылка, + Док, + БиблиотекаКартинок.Информация32); + + Параметры = Новый Структура("Ключ, КарточкаОткрытаПослеСозданияФайла, НовыйФайл", Док, Истина, Истина); + + Если НеОткрыватьКарточкуПослеСозданияИзФайла <> Истина Тогда + ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", Параметры, ФормаВладелец); + КонецЕсли; +КонецПроцедуры + +// Процедура создания нового Файла +// Параметры: +// РежимСоздания - как создавать новый Файл +// 1 - создать из шаблона +// 2 - создать из файла +// 3 - создать пустую карточку +Процедура СоздатьФайл(РежимСоздания, ВладелецФайла, ФормаВладелец, НеОткрыватьКарточкуПослеСозданияИзФайла = Неопределено) Экспорт + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + Если РежимСоздания = 1 Тогда + + // Создание из шаблона + ПараметрыОткрытияФормы = Новый Структура("ВыборШаблона, ТекущаяСтрока", + Истина, ПредопределенноеЗначение("Справочник.ПапкиФайлов.Шаблоны")); + Результат = ОткрытьФормуМодально("Справочник.Файлы.Форма.ФормаВыбора", ПараметрыОткрытияФормы); + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Параметры = Новый Структура("ФайлОснование, ВладелецФайла, РежимСоздания", + Результат, ВладелецФайла, "ИзШаблона"); + ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", Параметры, ФормаВладелец); + + ИначеЕсли РежимСоздания = 2 Тогда + + // Создание из файла + ПолноеИмяФайла = ""; + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если РасширениеПодключено Тогда + ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + ВыборФайла.МножественныйВыбор = Ложь; + ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'"); + ВыборФайла.Фильтр = НСтр("ru = 'Все файлы (*.*)|*.*'"); + + РабочийКаталог = РаботаСФайлами.ПолучитьРабочийКаталог(ВладелецФайла); + ВыборФайла.Каталог = РабочийКаталог; + + Результат = ВыборФайла.Выбрать(); + ПолноеИмяФайла = ВыборФайла.ПолноеИмяФайла; + + Если НЕ Результат Тогда + Возврат; + КонецЕсли; + + СоздатьДокументНаОсновеФайла(ПолноеИмяФайла, ВладелецФайла, ФормаВладелец, НеОткрыватьКарточкуПослеСозданияИзФайла); + + Иначе + // Если веб-клиент + ВремяИзменения = ТекущаяДата(); // Т.к. не можем получить дату модификации файла на диске + ВремяИзмененияУниверсальное = УниверсальноеВремя(ТекущаяДата()); + Размер = 0; // Т.к. не можем получить размер файла на диске + ИмяБезРасширения = ""; + Расширение = ""; + АдресВременногоХранилищаТекста = ""; + + // Поместим Файл в ВременноеХранилище + АдресВременногоХранилищаФайла = ""; + ИмяФайла = ""; + Если НЕ ПоместитьФайл(АдресВременногоХранилищаФайла, ИмяФайла, ИмяФайла, Истина, ФормаВладелец.УникальныйИдентификатор) Тогда + Возврат; + КонецЕсли; + + СтрокиПути = РазложитьСтрокуПоТочкамИСлэшам(ИмяФайла); + Если СтрокиПути.Количество() >= 2 Тогда + Расширение = СтрокиПути[СтрокиПути.Количество()-1]; + ИмяБезРасширения = СтрокиПути[СтрокиПути.Количество()-2]; + Иначе + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при помещении файла в хранилище: %1'"),ИмяФайла); + КонецЕсли; + + // Создадим карточку файла в БД + Док = РаботаСФайлами.СоздатьФайлСВерсией( + ВладелецФайла, + ИмяБезРасширения, + ФайловыеФункцииКлиентСервер.РасширениеБезТочки(Расширение), + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + АдресВременногоХранилищаФайла, + АдресВременногоХранилищаТекста, + Истина); // это веб клиент + + Если НеОткрыватьКарточкуПослеСозданияИзФайла <> Истина Тогда + Параметры = Новый Структура("Ключ, НовыйФайл", Док, Истина); + ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", Параметры, ФормаВладелец); + КонецЕсли; + КонецЕсли; + + ИначеЕсли РежимСоздания = 3 Тогда + // со сканера + РаботаСоСканеромКлиент.СканироватьИПоказатьДиалогПросмотра( + ВладелецФайла, + ФормаВладелец.УникальныйИдентификатор, + ФормаВладелец, + НеОткрыватьКарточкуПослеСозданияИзФайла); + Иначе + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неверный режим создания файла: %1'"), РежимСоздания); + КонецЕсли; + +КонецПроцедуры // СоздатьФайл() + +// Закончить редактирование - по массиву ссылок +// +Функция ЗакончитьРедактированиеПоСсылкам(Знач МассивФайлов, ИдентификаторФормы) Экспорт + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + // Получение массива данных файлов + ДанныеФайлов = Новый Массив; + РаботаСФайлами.ПолучитьДанныеДляМассиваФайлов(МассивФайлов, ДанныеФайлов); + ВГраницаМассива = ДанныеФайлов.ВГраница(); + + Для Инд = 0 По ВГраницаМассива Цикл + ДанныеФайла = ДанныеФайлов[ВГраницаМассива - Инд]; + + // Проверяем возможность освобождения + СтрокаОшибки = ""; + Если НЕ ВозможностьОсвободитьФайл(ДанныеФайла.Ссылка, ДанныеФайла.РедактируетТекущийПользователь, ДанныеФайла.Редактирует, СтрокаОшибки) Тогда + ДанныеФайлов.Удалить(ВГраницаМассива - Инд); + КонецЕсли; + + КонецЦикла; + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + + ФормаВозврата = РаботаСФайламиКлиентПовтИсп.ПолучитьФормуВозвратаФайла(); + + ФормаВозврата.Параметры.ФайлСсылка = Неопределено; + ФормаВозврата.КомментарийКВерсии = ""; + + ФормаВозврата.Файл = Неопределено; + + ФормаВозврата.СоздатьНовуюВерсию = Истина; + ФормаВозврата.Элементы.СоздатьНовуюВерсию.Доступность = Истина; + + ВозвратМассив = Новый Массив; + + Результат = ФормаВозврата.ОткрытьМодально(); + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат ВозвратМассив; + КонецЕсли; + + КодВозврата = Результат.КодВозврата; + Если КодВозврата <> КодВозвратаДиалога.ОК Тогда + Возврат ВозвратМассив; + КонецЕсли; + + СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; + КомментарийКВерсии = Результат.КомментарийКВерсии; + + ПрименитьКоВсем = Ложь; + ОсвобождатьФайлы = Истина; + + // Занять файлы + Для Каждого Данные Из ДанныеФайлов Цикл + + ПоказыватьОповещение = Ложь; + + Если ЗакончитьРедактирование( + Данные.Ссылка, + ИдентификаторФормы, + Данные.ХранитьВерсии, + Данные.РедактируетТекущийПользователь, + Данные.Редактирует, + Данные.АвторТекущейВерсии, + "", + СоздатьНовуюВерсию, + КомментарийКВерсии, + ПоказыватьОповещение, + ПрименитьКоВсем, + ОсвобождатьФайлы) Тогда + + ВозвратМассив.Добавить(Данные.Ссылка); + КонецЕсли; + + КонецЦикла; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Закончить редактирование файлов'"), + , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Закончено редактирование файлов (%1 из %2).'"), + ВозвратМассив.Количество(), МассивФайлов.Количество()), + БиблиотекаКартинок.Информация32); + + Возврат ВозвратМассив; + +КонецФункции //ЗакончитьРедактированиеПоСсылкам + +// Закончить редактирование Файла и поместить его на сервер +// +Функция ЗакончитьРедактирование(ОбъектСсылка, ИдентификаторФормы, Знач ХранитьВерсии = Неопределено, + Знач РедактируетТекущийПользователь = Неопределено, + Знач Редактирует = Неопределено, + Знач АвторТекущейВерсии = Неопределено, + ПереданныйПолныйПутьКФайлу = "", + СоздатьНовуюВерсию = Неопределено, + КомментарийКВерсии = Неопределено, + ПоказыватьОповещение = Истина, + ПрименитьКоВсем = Ложь, + ОсвобождатьФайлы = Истина) Экспорт + Перем ДанныеФайла; + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + РасширениеПодключеноКрипто = ПодключитьРасширениеРаботыСКриптографией(); + + Если НЕ РасширениеПодключено Тогда // веб клиент и нет расширения работы с файлами + + Если ХранитьВерсии = Неопределено Тогда + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(ОбъектСсылка); + ХранитьВерсии = ДанныеФайла.ХранитьВерсии; + РедактируетТекущийПользователь = ДанныеФайла.РедактируетТекущийПользователь; + Редактирует = ДанныеФайла.Редактирует; + АвторТекущейВерсии = ДанныеФайла.АвторТекущейВерсии; + КонецЕсли; + + // Проверяем возможность освобождения + СтрокаОшибки = ""; + Если НЕ ВозможностьОсвободитьФайл(ОбъектСсылка, РедактируетТекущийПользователь, Редактирует, СтрокаОшибки) Тогда + Предупреждение(СтрокаОшибки); + Возврат Ложь; + КонецЕсли; + + ПолныйПутьКФайлу = ""; + + Если СоздатьНовуюВерсию = Неопределено Тогда + ФормаВозврата = РаботаСФайламиКлиентПовтИсп.ПолучитьФормуВозвратаФайла(); + + ФормаВозврата.Параметры.ФайлСсылка = ОбъектСсылка; + ФормаВозврата.КомментарийКВерсии = ""; + + ФормаВозврата.Файл = ОбъектСсылка; + + Если ХранитьВерсии Тогда + ФормаВозврата.СоздатьНовуюВерсию = Истина; + + // Если автор текущей версии - не текущий пользователь - то галочку «Не создавать новую версию» делаем недоступной + Если АвторТекущейВерсии <> Редактирует Тогда + ФормаВозврата.Элементы.СоздатьНовуюВерсию.Доступность = Ложь; + Иначе + ФормаВозврата.Элементы.СоздатьНовуюВерсию.Доступность = Истина; + КонецЕсли; + Иначе + ФормаВозврата.СоздатьНовуюВерсию = Ложь; + ФормаВозврата.Элементы.СоздатьНовуюВерсию.Доступность = Ложь; + КонецЕсли; + + + Результат = ФормаВозврата.ОткрытьМодально(); + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат Ложь; + КонецЕсли; + + КодВозврата = Результат.КодВозврата; + Если КодВозврата <> КодВозвратаДиалога.ОК Тогда + Возврат Ложь; + КонецЕсли; + + СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; + КомментарийКВерсии = Результат.КомментарийКВерсии; + + Иначе // СоздатьНовуюВерсию и КомментарийКВерсии переданы извне + + Если ХранитьВерсии Тогда + + // Если автор текущей версии - не текущий пользователь - то галочку «Не создавать новую версию» делаем недоступной + Если АвторТекущейВерсии <> Редактирует Тогда + СоздатьНовуюВерсию = Истина; + КонецЕсли; + + Иначе + СоздатьНовуюВерсию = Ложь; + КонецЕсли; + + КонецЕсли; + + Интерактивно = Истина; + + Пока Истина Цикл + Попытка + АдресВременногоХранилища = ""; + ВыбранныйПутьКФайлу = ""; + ПоказатьНапоминаниеПередПоместитьФайл(); + Если ПоместитьФайл(АдресВременногоХранилища, ПолныйПутьКФайлу, ВыбранныйПутьКФайлу, Интерактивно, ИдентификаторФормы) Тогда + + АдресВременногоХранилищаТекста = ""; + ИмяБезРасширения = ""; + Расширение = ""; + + ЭтоВебКлиент = Истина; + + ТекстНеИзвлеченНаКлиенте = Ложь; + #Если ВебКлиент Тогда + ТекстНеИзвлеченНаКлиенте = Истина; + #КонецЕсли + + ВремяИзменения = ТекущаяДата(); // Т.к. не можем получить дату модификации файла на диске + ВремяИзмененияУниверсальное = УниверсальноеВремя(ТекущаяДата()); + Размер = 0; // Т.к. не можем получить размер файла на диске + + СтрокиПути = РазложитьСтрокуПоТочкамИСлэшам(ВыбранныйПутьКФайлу); + Если СтрокиПути.Количество() >= 2 Тогда + Расширение = СтрокиПути[СтрокиПути.Количество()-1]; + ИмяБезРасширения = СтрокиПути[СтрокиПути.Количество()-2]; + КонецЕсли; + + РаботаСФайлами.ПолучитьДанныеФайлаИОпубликоватьИОсвободитьФайл( + ОбъектСсылка, + ДанныеФайла, + СоздатьНовуюВерсию, + АдресВременногоХранилища, + КомментарийКВерсии, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + ИмяБезРасширения, + Расширение, + ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + ИдентификаторФормы); + + НоваяВерсия = ДанныеФайла.ТекущаяВерсия; + + Если ПоказыватьОповещение Тогда + ПоказатьОповещениеПользователя( + НСтр("ru = 'Редактирование закончено'"), + ДанныеФайла.НавигационнаяСсылка, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл %1 обновлен и освобожден.'"), Строка(ДанныеФайла.Ссылка)), + БиблиотекаКартинок.Информация32); + КонецЕсли; + + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; + Исключение + + ОшибкаИнфо = ИнформацияОбОшибке(); + + Если ОшибкаИнфо.Причина = Неопределено Тогда + СообщениеОбОшибке =ОшибкаИнфо.Описание; + Иначе + СообщениеОбОшибке = ОшибкаИнфо.Причина.Описание; + КонецЕсли; + + ТекстВопроса = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось вернуть файл ""%1"" в информационную базу по причине: ""%2"" + |Повторить операцию?'"), + Строка(ОбъектСсылка), СообщениеОбОшибке); + КодВозврата = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ПовторитьОтмена); + + Если КодВозврата = КодВозвратаДиалога.Отмена Тогда + Возврат Ложь; + КонецЕсли; + + КонецПопытки; + КонецЦикла; + + Иначе // далее код для тонкого (или толстого) клиента (или веб с подключенным расширением) + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИРабочийКаталог(ОбъектСсылка); + + // Проверяем возможность освобождения + СтрокаОшибки = ""; + Если НЕ ВозможностьОсвободитьФайл(ДанныеФайла.Ссылка, ДанныеФайла.РедактируетТекущийПользователь, ДанныеФайла.Редактирует, СтрокаОшибки) Тогда + Предупреждение(СтрокаОшибки); + Возврат Ложь; + КонецЕсли; + + ПолныйПутьКФайлу = ПереданныйПолныйПутьКФайлу; + Если ПолныйПутьКФайлу = "" Тогда + ПолныйПутьКФайлу = ФайловыеФункцииКлиент.ПолучитьПолныйПутьКФайлуВРабочемКаталоге(ДанныеФайла); + КонецЕсли; + + // Проверяем наличие файла на диске + ФайлНовойВерсии = Новый Файл(ПолныйПутьКФайлу); + Если НЕ ФайлНовойВерсии.Существует() Тогда + + Если ПрименитьКоВсем = Ложь Тогда + + СтрокаПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось загрузить файл ""%1"" в информационную базу, т.к. он не найден на локальном компьютере'"), + Строка(ДанныеФайла.Ссылка)); + + Если НЕ ПустаяСтрока(ПолныйПутьКФайлу) Тогда + СтрокаПредупреждения = СтрокаПредупреждения + " (" + ПолныйПутьКФайлу + ")."; + Иначе + СтрокаПредупреждения = СтрокаПредупреждения + "."; + КонецЕсли; + + СтрокаПредупреждения = СтрокаПредупреждения + Символы.ПС + "Освободить файл?"; + + ПараметрыФормы = + Новый Структура("Заголовок, Информация", + НСтр("ru = 'Закончить редактирование'"), СтрокаПредупреждения); + + Результат = ОткрытьФормуМодально("Справочник.Файлы.Форма.ФормаВопросаЗакончитьРедактирование", ПараметрыФормы); + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + ОсвобождатьФайлы = Ложь; + Иначе + КодВозврата = Результат.КодВозврата; + + Если КодВозврата = КодВозвратаДиалога.Да Тогда + ПрименитьКоВсем = Результат.ПрименитьКоВсем; + ОсвобождатьФайлы = Истина; + ИначеЕсли КодВозврата = КодВозвратаДиалога.Нет Тогда + ПрименитьКоВсем = Результат.ПрименитьКоВсем; + ОсвобождатьФайлы = Ложь; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если ОсвобождатьФайлы Тогда + ОсвободитьФайлБезВопроса(ДанныеФайла, ИдентификаторФормы); + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + + КонецЕсли; + + Попытка + ТолькоЧтение = ФайлНовойВерсии.ПолучитьТолькоЧтение(); + ФайлНовойВерсии.УстановитьТолькоЧтение(НЕ ТолькоЧтение); + ФайлНовойВерсии.УстановитьТолькоЧтение(ТолькоЧтение); + Исключение + + Предупреждение( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось вернуть файл ""%1"" в информационную базу, т.к. он заблокирован другой программой'"), + Строка(ДанныеФайла.Ссылка))); + + КонецПопытки; + + // Запрашиваем комментарий и признак хранения версии + Если СоздатьНовуюВерсию = Неопределено Тогда + + ФормаВозврата = РаботаСФайламиКлиентПовтИсп.ПолучитьФормуВозвратаФайла(); + + ФормаВозврата.Параметры.ФайлСсылка = ДанныеФайла.Ссылка; + ФормаВозврата.КомментарийКВерсии = ""; + + ФормаВозврата.Файл = ДанныеФайла.Ссылка; + + Если ДанныеФайла.ХранитьВерсии Тогда + ФормаВозврата.СоздатьНовуюВерсию = Истина; + + // Если автор текущей версии - не текущий пользователь - то галочку «Не создавать новую версию» делаем недоступной + Если ДанныеФайла.АвторТекущейВерсии <> ДанныеФайла.Редактирует Тогда + ФормаВозврата.Элементы.СоздатьНовуюВерсию.Доступность = Ложь; + Иначе + ФормаВозврата.Элементы.СоздатьНовуюВерсию.Доступность = Истина; + КонецЕсли; + Иначе + ФормаВозврата.СоздатьНовуюВерсию = Ложь; + ФормаВозврата.Элементы.СоздатьНовуюВерсию.Доступность = Ложь; + КонецЕсли; + + Результат = ФормаВозврата.ОткрытьМодально(); + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат Ложь; + КонецЕсли; + + КодВозврата = Результат.КодВозврата; + Если КодВозврата <> КодВозвратаДиалога.ОК Тогда + Возврат Ложь; + КонецЕсли; + + СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; + КомментарийКВерсии = Результат.КомментарийКВерсии; + + Иначе // СоздатьНовуюВерсию и КомментарийКВерсии переданы извне + + Если ДанныеФайла.ХранитьВерсии Тогда + + // Если автор текущей версии - не текущий пользователь - то галочку «Не создавать новую версию» делаем недоступной + Если ДанныеФайла.АвторТекущейВерсии <> ДанныеФайла.Редактирует Тогда + СоздатьНовуюВерсию = Истина; + КонецЕсли; + + Иначе + СоздатьНовуюВерсию = Ложь; + КонецЕсли; + + КонецЕсли; + + СтараяВерсия = ДанныеФайла.ТекущаяВерсия; + Интерактивно = Ложь; + + РазмерВМб = ФайлНовойВерсии.Размер() / (1024 * 1024); + ВремяИзменения = ФайлНовойВерсии.ПолучитьВремяИзменения(); + ВремяИзмененияУниверсальное = ФайлНовойВерсии.ПолучитьУниверсальноеВремяИзменения(); + Размер = ФайлНовойВерсии.Размер(); + + // Файл с признаком шифрован - при окончании редактирования снова шифруем для тех же сертификатов + Если ДанныеФайла.Зашифрован Тогда + + МассивСертификатов = Новый Массив; + + Для Каждого СтруктураСертификата Из ДанныеФайла.МассивСертификатовШифрования Цикл + + Отпечаток = СтруктураСертификата.Отпечаток; + + Сертификат = ЭлектронноЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток); + Если Сертификат = Неопределено Тогда + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отсутствует сертификат ""%1""'"), + СтруктураСертификата.Представление); + Предупреждение(Сообщение); + Возврат Ложь; + КонецЕсли; + + МассивСертификатов.Добавить(Сертификат); + + КонецЦикла; + + МенеджерКриптографии = ЭлектронноЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + + ИмяФайлаСПутемШифрованное = ПолныйПутьКФайлу + ".crp"; + МенеджерКриптографии.Зашифровать(ПолныйПутьКФайлу, ИмяФайлаСПутемШифрованное, МассивСертификатов); + УдалитьФайл(ПолныйПутьКФайлу); + ПереместитьФайл(ИмяФайлаСПутемШифрованное, ПолныйПутьКФайлу); + + КонецЕсли; + + Пока Истина Цикл + Попытка + АдресВременногоХранилища = ""; + ВыбранныйПутьКФайлу = ""; + + ИмяФайла = ФайлНовойВерсии.Имя; + + ТекстПояснения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)... + |Пожалуйста, подождите.'"), + ИмяФайла, ?(РазмерВМб >= 1, Формат(РазмерВМб, "ЧДЦ=0"), Формат(РазмерВМб, "ЧДЦ=1; ЧН=0"))); + + Состояние(ТекстПояснения); + + ПомещаемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(ПолныйПутьКФайлу, ""); + ПомещаемыеФайлы.Добавить(Описание); + + ПомещенныеФайлы = Новый Массив; + + Если ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Интерактивно, ИдентификаторФормы) Тогда + Состояние(); + + Если ПомещенныеФайлы.Количество() = 1 Тогда + АдресВременногоХранилища = ПомещенныеФайлы[0].Хранение; + КонецЕсли; + + ЭтоВебКлиент = Ложь; + + ТекстНеИзвлеченНаКлиенте = Ложь; + #Если ВебКлиент Тогда + ТекстНеИзвлеченНаКлиенте = Истина; + #КонецЕсли + + ИмяБезРасширения = ФайлНовойВерсии.ИмяБезРасширения; + Расширение = ФайлНовойВерсии.Расширение; + + АдресВременногоХранилищаТекста = ФайловыеФункцииКлиент.ИзвлечьТекстВоВременноеХранилище( + ПолныйПутьКФайлу, ИдентификаторФормы); + + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + + НеМенятьЗаписьВРабочемКаталоге = Ложь; + Если ПереданныйПолныйПутьКФайлу <> "" Тогда + НеМенятьЗаписьВРабочемКаталоге = Истина; + КонецЕсли; + + РаботаСФайлами.ОпубликоватьИОсвободитьФайл( + ДанныеФайла, + СоздатьНовуюВерсию, + АдресВременногоХранилища, + КомментарийКВерсии, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + ИмяБезРасширения, + Расширение, + ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + ВРабочемКаталогеВладельца, + НеМенятьЗаписьВРабочемКаталоге, + ИдентификаторФормы); + + НоваяВерсия = ДанныеФайла.ТекущаяВерсия; + + Если ПереданныйПолныйПутьКФайлу = "" Тогда + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования; + Если УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = Неопределено Тогда + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = Ложь; + КонецЕсли; + + Если ДанныеФайла.РабочийКаталогВладельца <> "" Тогда + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = Ложь; + КонецЕсли; + + Если УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования Тогда + ФайловыеФункцииКлиент.УдалитьФайлИзРабочегоКаталога(СтараяВерсия); + Иначе + Файл = Новый Файл(ПолныйПутьКФайлу); + Файл.УстановитьТолькоЧтение(Истина); + КонецЕсли; + КонецЕсли; + + Если ПоказыватьОповещение Тогда + ПоказатьОповещениеПользователя( + НСтр("ru = 'Редактирование закончено'"), + ДанныеФайла.НавигационнаяСсылка, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл %1 обновлен и освобожден.'"), + Строка(ДанныеФайла.Ссылка)), + БиблиотекаКартинок.Информация32); + КонецЕсли; + + // удаляем зашифрованный файл из кеша + Если ДанныеФайла.Зашифрован Тогда + УдалитьФайл(ПолныйПутьКФайлу); + КонецЕсли; + + Возврат Истина; + Иначе + Состояние(); + Возврат Ложь; + КонецЕсли; + + Исключение + + ОшибкаИнфо = ИнформацияОбОшибке(); + + Если ОшибкаИнфо.Причина = Неопределено Тогда + СообщениеОбОшибке =ОшибкаИнфо.Описание; + Иначе + СообщениеОбОшибке = ОшибкаИнфо.Причина.Описание; + КонецЕсли; + + ТекстВопроса = ""; + + ТекстВопроса = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось вернуть файл ""%1"" в информационную базу по причине: ""%2"" + |Повторить операцию?'"), + Строка(ДанныеФайла.Ссылка), СообщениеОбОшибке); + + КодВозврата = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ПовторитьОтмена); + + Если КодВозврата = КодВозвратаДиалога.Отмена Тогда + Возврат Ложь; + КонецЕсли; + + КонецПопытки; + КонецЦикла; + + КонецЕсли; + + Возврат Истина; + +КонецФункции + +// Процедура предназначена для освобождения файла. При этом не происходит +// обновления файла, а просто очищается его текущий держатель. Выполняется по массиву ссылок +Процедура ОсвободитьФайлыПоСсылкам(Знач МассивФайлов) Экспорт + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + // Получение массива данных файлов + ДанныеФайлов = Новый Массив; + РаботаСФайлами.ПолучитьДанныеДляМассиваФайлов(МассивФайлов, ДанныеФайлов); + ВГраницаМассива = ДанныеФайлов.ВГраница(); + + Для Инд = 0 По ВГраницаМассива Цикл + ДанныеФайла = ДанныеФайлов[ВГраницаМассива - Инд]; + + СтрокаОшибки = ""; + Если НЕ ВозможностьОсвободитьФайл(ДанныеФайла.Ссылка, ДанныеФайла.РедактируетТекущийПользователь, ДанныеФайла.Редактирует, СтрокаОшибки) Тогда + ДанныеФайлов.Удалить(ВГраницаМассива - Инд); + КонецЕсли; + + КонецЦикла; + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + Результат = Вопрос( + НСтр("ru = 'Отмена редактирования файлов может привести к потере Ваших изменений. + |Продолжить?'"), + РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); + + Если Результат <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + // Занять файлы + Для Каждого ДанныеФайла Из ДанныеФайлов Цикл + + НеЗадаватьВопрос = Истина; + + ОсвободитьФайл(ДанныеФайла.Ссылка, ДанныеФайла.ХранитьВерсии, + ДанныеФайла.РедактируетТекущийПользователь, ДанныеФайла.Редактирует, + Неопределено, НеЗадаватьВопрос); + + КонецЦикла; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Отменить редактирование файлов'"), + , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отменено редактирование файлов (%1 из %2).'"), + ДанныеФайлов.Количество(), МассивФайлов.Количество()), + БиблиотекаКартинок.Информация32); + +КонецПроцедуры //ОсвободитьФайлыПоСсылкам + +// Процедура предназначена для освобождения файла. При этом не происходит +// обновления файла, а просто очищается его текущий держатель. +Процедура ОсвободитьФайл(ОбъектСсылка, Знач ХранитьВерсии = Неопределено, + Знач РедактируетТекущийПользователь = Неопределено, Знач Редактирует = Неопределено, + УникальныйИдентификатор = Неопределено, + НеЗадаватьВопрос = Ложь) Экспорт + + Перем ДанныеФайла; + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + Если ХранитьВерсии = Неопределено Тогда + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(ОбъектСсылка); + ХранитьВерсии = ДанныеФайла.ХранитьВерсии; + РедактируетТекущийПользователь = ДанныеФайла.РедактируетТекущийПользователь; + Редактирует = ДанныеФайла.Редактирует; + КонецЕсли; + + СтрокаОшибки = ""; + Если НЕ ВозможностьОсвободитьФайл(ОбъектСсылка, РедактируетТекущийПользователь, Редактирует, СтрокаОшибки) Тогда + Предупреждение(СтрокаОшибки); + Возврат; + КонецЕсли; + + ПродолжитьРаботу = Истина; + + Если НеЗадаватьВопрос = Ложь Тогда + + Результат = Вопрос( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отмена редактирования файла ""%1"" может привести к потере Ваших изменений. + |Продолжить?'"), Строка(ОбъектСсылка)), + РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); + + Если Результат <> КодВозвратаДиалога.Да Тогда + ПродолжитьРаботу = Ложь; + КонецЕсли; + + КонецЕсли; + + Если ПродолжитьРаботу Тогда + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + РаботаСФайлами.ПолучитьДанныеФайлаИОсвободитьФайл(ОбъектСсылка, ДанныеФайла, УникальныйИдентификатор); + + Если РасширениеПодключено Тогда + НаЧтение = Истина; + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + Если Не НеЗадаватьВопрос Тогда + ПоказатьОповещениеПользователя( + НСтр("ru = 'Файл освобожден'"), + ДанныеФайла.НавигационнаяСсылка, + ДанныеФайла.ПолноеНаименованиеВерсии, + БиблиотекаКартинок.Информация32); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры // ОсвободитьФайл() + +// Процедура предназначена для освобождения файла. При этом не происходит +// обновления файла, а просто очищается его текущий держатель. +Процедура ОсвободитьФайлБезВопроса(ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт + + РаботаСФайлами.ОсвободитьФайл(ДанныеФайла, УникальныйИдентификатор); + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если РасширениеПодключено Тогда + НаЧтение = Истина; + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Файл освобожден'"), + ДанныеФайла.НавигационнаяСсылка, + ДанныеФайла.ПолноеНаименованиеВерсии, + БиблиотекаКартинок.Информация32); + +КонецПроцедуры // ОсвободитьФайл() + +// Процедура освобождает файлы по массиву ссылок +// +Процедура ОсвободитьФайлы(ОбъектыСсылка) Экспорт + + СписокНевозможноОсвободить = Новый СписокЗначений; + + // Получение массива данных Файлов + ДанныеФайлов = РаботаСФайлами.ПолучитьДанныеФайла(ОбъектыСсылка); + ВГраницаМассива = ДанныеФайлов.ВГраница(); + + Для Инд = 0 По ВГраницаМассива Цикл + ДанныеФайла = ДанныеФайлов[ВГраницаМассива - Инд]; + + СтрокаОшибки = ""; + Если НЕ ВозможностьОсвободитьФайл( + ДанныеФайла.Ссылка, + ДанныеФайла.РедактируетТекущийПользователь, + ДанныеФайла.Редактирует, + СтрокаОшибки) Тогда // освободить невозможно + + СписокНевозможноОсвободить.Добавить(ДанныеФайла.Ссылка, СтрокаОшибки); + ДанныеФайлов.Удалить(ВГраницаМассива - Инд); + КонецЕсли; + КонецЦикла; + + // Если освободить нельзя, то выдаем диалог + Если СписокНевозможноОсвободить.Количество() > 0 Тогда + Если НЕ ДиалогВопросаСоСписком( + СписокНевозможноОсвободить, + НСтр("ru = 'Освободить остальные файлы?'"), + НСтр("ru = 'При попытке освободить файлы возникли следующие ошибки:'"), + НСтр("ru = 'Освободить файлы'")) Тогда + Возврат; + КонецЕсли; + Иначе + Ответ = Вопрос( + НСтр("ru = 'Освобождение файлов может привести к потере Ваших изменений. + |Освободить файлы?'"), + РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); + + Если Ответ = КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + // Освободить файлы + Для Каждого ДанныеФайла Из ДанныеФайлов Цикл + + РаботаСФайлами.ОсвободитьФайл(ДанныеФайла); + + Если РасширениеПодключено Тогда + НаЧтение = Истина; + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Файл освобожден'"), + ДанныеФайла.НавигационнаяСсылка, + ДанныеФайла.ПолноеНаименованиеВерсии, + БиблиотекаКартинок.Информация32); + + КонецЦикла; + +КонецПроцедуры + +// Процедура выполняет перенос файлов в другую папку - по массиву ссылок +// +Процедура ПеренестиФайлыВПапку(ОбъектыСсылка, Папка) Экспорт + + // Получение массива данных Файлов + ДанныеФайлов = РаботаСФайлами.ПолучитьДанныеФайла(ОбъектыСсылка); + + Для Каждого ДанныеФайла Из ДанныеФайлов Цикл + + РаботаСФайлами.ПеренестиФайл(ДанныеФайла, Папка); + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Перенос файла'"), + ДанныеФайла.НавигационнаяСсылка, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" перенесен в папку %2.'"), Строка(ДанныеФайла.Ссылка), Строка(Папка)), + БиблиотекаКартинок.Информация32); + + КонецЦикла; + +КонецПроцедуры + +// Функция раскладывает строку в массив строк, используя "./\" как разделитель +Функция РазложитьСтрокуПоТочкамИСлэшам(Знач Представление) + Перем ТекущаяПозиция; + + Фрагменты = Новый Массив; + + НачальнаяПозиция = 1; + + Для ТекущаяПозиция = 1 По СтрДлина(Представление) Цикл + ТекущийСимвол = Сред(Представление, ТекущаяПозиция, 1); + Если ТекущийСимвол = "." Или ТекущийСимвол = "/" Или ТекущийСимвол = "\" Тогда + ТекущийФрагмент = Сред(Представление, НачальнаяПозиция, ТекущаяПозиция - НачальнаяПозиция); + НачальнаяПозиция = ТекущаяПозиция + 1; + Фрагменты.Добавить(ТекущийФрагмент); + КонецЕсли; + КонецЦикла; + + Если НачальнаяПозиция <> ТекущаяПозиция Тогда + ТекущийФрагмент = Сред(Представление, НачальнаяПозиция, ТекущаяПозиция - НачальнаяПозиция); + Фрагменты.Добавить(ТекущийФрагмент); + КонецЕсли; + + Возврат Фрагменты; +КонецФункции + +// Опубликовать - по массиву ссылок +// +Процедура ОпубликоватьФайлыПоСсылкам(Знач МассивФайлов, ИдентификаторФормы) Экспорт + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + // Получение массива данных файлов + ДанныеФайлов = Новый Массив; + РаботаСФайлами.ПолучитьДанныеДляМассиваФайлов(МассивФайлов, ДанныеФайлов); + ВГраницаМассива = ДанныеФайлов.ВГраница(); + + Для Инд = 0 По ВГраницаМассива Цикл + ДанныеФайла = ДанныеФайлов[ВГраницаМассива - Инд]; + + // Проверяем возможность освобождения + СтрокаОшибки = ""; + Если НЕ ВозможностьОсвободитьФайл(ДанныеФайла.Ссылка, ДанныеФайла.РедактируетТекущийПользователь, ДанныеФайла.Редактирует, СтрокаОшибки) Тогда + ДанныеФайлов.Удалить(ВГраницаМассива - Инд); + КонецЕсли; + + КонецЦикла; + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + + ФормаВозврата = РаботаСФайламиКлиентПовтИсп.ПолучитьФормуВозвратаФайла(); + + ФормаВозврата.Параметры.ФайлСсылка = Неопределено; + ФормаВозврата.КомментарийКВерсии = ""; + + ФормаВозврата.Файл = Неопределено; + + ФормаВозврата.СоздатьНовуюВерсию = Истина; + ФормаВозврата.Элементы.СоздатьНовуюВерсию.Доступность = Истина; + + Результат = ФормаВозврата.ОткрытьМодально(); + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + КодВозврата = Результат.КодВозврата; + Если КодВозврата <> КодВозвратаДиалога.ОК Тогда + Возврат; + КонецЕсли; + + СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; + КомментарийКВерсии = Результат.КомментарийКВерсии; + + Для Каждого Данные Из ДанныеФайлов Цикл + + ПоказыватьОповещение = Ложь; + + ОпубликоватьФайл( + Данные.Ссылка, + ИдентификаторФормы, + Данные.ХранитьВерсии, + Данные.РедактируетТекущийПользователь, + Данные.Редактирует, + Данные.АвторТекущейВерсии, + "", + СоздатьНовуюВерсию, + КомментарийКВерсии, + ПоказыватьОповещение); + КонецЦикла; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Сохранить изменения файлов'"), + , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сохранены изменения файлов (%1 из %2).'"), + ДанныеФайлов.Количество(), МассивФайлов.Количество()), + БиблиотекаКартинок.Информация32); + +КонецПроцедуры //ОпубликоватьФайлыПоСсылкам + +// Процедура предназначена для опубликования файла без его освобождения +// +// Параметры: +// +Процедура ОпубликоватьФайл(ОбъектСсылка, ИдентификаторФормы, Знач ХранитьВерсии = Неопределено, + Знач РедактируетТекущийПользователь = Неопределено, + Знач Редактирует = Неопределено, + Знач АвторТекущейВерсии = Неопределено, + ПереданныйПолныйПутьКФайлу = "", + СоздатьНовуюВерсию = Неопределено, + КомментарийКВерсии = Неопределено, + ПоказыватьОповещение = Истина) Экспорт + + Перем ДанныеФайла; + Перем АдресВременногоХранилища; + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + РасширениеПодключеноКрипто = ПодключитьРасширениеРаботыСКриптографией(); + + Если НЕ РасширениеПодключено Тогда // веб клиент и нет расширения работы с файлами + + Если ХранитьВерсии = Неопределено Тогда + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайла(ОбъектСсылка); + ХранитьВерсии = ДанныеФайла.ХранитьВерсии; + РедактируетТекущийПользователь = ДанныеФайла.РедактируетТекущийПользователь; + Редактирует = ДанныеФайла.Редактирует; + АвторТекущейВерсии = ДанныеФайла.АвторТекущейВерсии; + КонецЕсли; + + // Проверяем возможность освобождения + СтрокаОшибки = ""; + Если НЕ ВозможностьОсвободитьФайл(ОбъектСсылка, РедактируетТекущийПользователь, Редактирует, СтрокаОшибки) Тогда + Предупреждение(СтрокаОшибки); + Возврат; + КонецЕсли; + + ПолныйПутьКФайлу = ""; + + Если СоздатьНовуюВерсию = Неопределено Тогда + + // Запрашиваем комментарий и признак хранения версии + ФормаВозврата = РаботаСФайламиКлиентПовтИсп.ПолучитьФормуВозвратаФайла(); + + ФормаВозврата.Параметры.ФайлСсылка = ОбъектСсылка; + ФормаВозврата.КомментарийКВерсии = ""; + + ФормаВозврата.Файл = ОбъектСсылка; + + Если ХранитьВерсии Тогда + ФормаВозврата.СоздатьНовуюВерсию = Истина; + + // Если автор текущей версии - не текущий пользователь - то галочку «Не создавать новую версию» делаем недоступной + Если АвторТекущейВерсии <> Редактирует Тогда + ФормаВозврата.Элементы.СоздатьНовуюВерсию.Доступность = Ложь; + Иначе + ФормаВозврата.Элементы.СоздатьНовуюВерсию.Доступность = Истина; + КонецЕсли; + Иначе + ФормаВозврата.СоздатьНовуюВерсию = Ложь; + ФормаВозврата.Элементы.СоздатьНовуюВерсию.Доступность = Ложь; + КонецЕсли; + + Результат = ФормаВозврата.ОткрытьМодально(); + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + КодВозврата = Результат.КодВозврата; + Если КодВозврата <> КодВозвратаДиалога.ОК Тогда + Возврат; + КонецЕсли; + + СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; + КомментарийКВерсии = Результат.КомментарийКВерсии; + + Иначе // СоздатьНовуюВерсию и КомментарийКВерсии переданы извне + + Если ХранитьВерсии Тогда + + // Если автор текущей версии - не текущий пользователь - то галочку «Не создавать новую версию» делаем недоступной + Если АвторТекущейВерсии <> Редактирует Тогда + СоздатьНовуюВерсию = Истина; + КонецЕсли; + + Иначе + СоздатьНовуюВерсию = Ложь; + КонецЕсли; + + КонецЕсли; + + Интерактивно = Истина; + + ВыбранныйПутьКФайлу = ""; + ПоказатьНапоминаниеПередПоместитьФайл(); + Если ПоместитьФайл(АдресВременногоХранилища, ПолныйПутьКФайлу, ВыбранныйПутьКФайлу, Интерактивно, ИдентификаторФормы) Тогда + + ИмяБезРасширения = ""; + Расширение = ""; + ВремяИзменения = ТекущаяДата(); // Т.к. не можем получить дату модификации файла на диске + ВремяИзмененияУниверсальное = УниверсальноеВремя(ТекущаяДата()); + РазмерФайла = 0; // Т.к. не можем получить размер файла на диске + + ОтносительныйПутьКФайлу = ""; + АдресВременногоХранилищаТекста = ""; + + СтрокиПути = РазложитьСтрокуПоТочкамИСлэшам(ВыбранныйПутьКФайлу); + Если СтрокиПути.Количество() >= 2 Тогда + Расширение = СтрокиПути[СтрокиПути.Количество()-1]; + ИмяБезРасширения = СтрокиПути[СтрокиПути.Количество()-2]; + КонецЕсли; + + ЭтоВебКлиент = Истина; + + ТекстНеИзвлеченНаКлиенте = Ложь; + #Если ВебКлиент Тогда + ТекстНеИзвлеченНаКлиенте = Истина; + #КонецЕсли + + ВРабочемКаталогеВладельца = Ложь; + + РаботаСФайлами.ПолучитьДанныеФайлаИОпубликоватьФайл( + ОбъектСсылка, + ДанныеФайла, + СоздатьНовуюВерсию, + АдресВременногоХранилища, + КомментарийКВерсии, + ВремяИзменения, + ВремяИзмененияУниверсальное, + РазмерФайла, + ИмяБезРасширения, + Расширение, + ОтносительныйПутьКФайлу, + ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + ВРабочемКаталогеВладельца, + ИдентификаторФормы); + + Если ПоказыватьОповещение Тогда + ПоказатьОповещениеПользователя( + НСтр("ru = 'Новая версия сохранена'"), + ДанныеФайла.НавигационнаяСсылка, + ДанныеФайла.ПолноеНаименованиеВерсии, + БиблиотекаКартинок.Информация32); + КонецЕсли; + + КонецЕсли; + + Иначе // далее код для тонкого (или толстого) клиента (или веб с подключенным расширением) + + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИРабочийКаталог(ОбъектСсылка); + + ХранитьВерсии = ДанныеФайла.ХранитьВерсии; + + // Проверяем возможность освобождения + СтрокаОшибки = ""; + Если НЕ ВозможностьОсвободитьФайл(ДанныеФайла.Ссылка, ДанныеФайла.РедактируетТекущийПользователь, ДанныеФайла.Редактирует, СтрокаОшибки) Тогда + Предупреждение(СтрокаОшибки); + Возврат; + КонецЕсли; + + ПолныйПутьКФайлу = ПереданныйПолныйПутьКФайлу; + Если ПолныйПутьКФайлу = "" Тогда + ПолныйПутьКФайлу = ФайловыеФункцииКлиент.ПолучитьПолныйПутьКФайлуВРабочемКаталоге(ДанныеФайла); + КонецЕсли; + + НеМенятьЗаписьВРабочемКаталоге = Ложь; + Если ПереданныйПолныйПутьКФайлу <> "" Тогда + НеМенятьЗаписьВРабочемКаталоге = Истина; + КонецЕсли; + + // Проверяем наличие файла на диске + ФайлНовойВерсии = Новый Файл(ПолныйПутьКФайлу); + Если НЕ ФайлНовойВерсии.Существует() Тогда + + СтрокаПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось загрузить файл ""%1"" в информационную базу, т.к. он не найден на локальном компьютере'"), + Строка(ДанныеФайла.Ссылка)); + Если НЕ ПустаяСтрока(ПолныйПутьКФайлу) Тогда + СтрокаПредупреждения = СтрокаПредупреждения + " (" + ПолныйПутьКФайлу + ")."; + Иначе + СтрокаПредупреждения = СтрокаПредупреждения + "."; + КонецЕсли; + + СтрокаПредупреждения = СтрокаПредупреждения + Символы.ПС + "Освободить файл?"; + + КодВозврата = Вопрос(СтрокаПредупреждения, РежимДиалогаВопрос.ДаНет); + + Если КодВозврата = КодВозвратаДиалога.Да Тогда + ОсвободитьФайлБезВопроса(ДанныеФайла, ИдентификаторФормы); + КонецЕсли; + + Возврат; + + КонецЕсли; + + // Запрашиваем комментарий и признак хранения версии + Если СоздатьНовуюВерсию = Неопределено Тогда + + ФормаВозврата = РаботаСФайламиКлиентПовтИсп.ПолучитьФормуВозвратаФайла(); + ФормаВозврата.Параметры.ФайлСсылка = ДанныеФайла.Ссылка; + ФормаВозврата.КомментарийКВерсии = ""; + + ФормаВозврата.Файл = ДанныеФайла.Ссылка; + + Если ДанныеФайла.ХранитьВерсии Тогда + ФормаВозврата.СоздатьНовуюВерсию = Истина; + + // Если автор текущей версии - не текущий пользователь - то галочку «Не создавать новую версию» делаем недоступной + Если ДанныеФайла.АвторТекущейВерсии <> ДанныеФайла.Редактирует Тогда + ФормаВозврата.Элементы.СоздатьНовуюВерсию.Доступность = Ложь; + Иначе + ФормаВозврата.Элементы.СоздатьНовуюВерсию.Доступность = Истина; + КонецЕсли; + Иначе + ФормаВозврата.СоздатьНовуюВерсию = Ложь; + ФормаВозврата.Элементы.СоздатьНовуюВерсию.Доступность = Ложь; + КонецЕсли; + + Результат = ФормаВозврата.ОткрытьМодально(); + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + КодВозврата = Результат.КодВозврата; + Если КодВозврата <> КодВозвратаДиалога.ОК Тогда + Возврат; + КонецЕсли; + + СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; + КомментарийКВерсии = Результат.КомментарийКВерсии; + + Иначе // СоздатьНовуюВерсию и КомментарийКВерсии переданы извне + + Если ХранитьВерсии Тогда + + // Если автор текущей версии - не текущий пользователь - то галочку «Не создавать новую версию» делаем недоступной + Если АвторТекущейВерсии <> Редактирует Тогда + СоздатьНовуюВерсию = Истина; + КонецЕсли; + + Иначе + СоздатьНовуюВерсию = Ложь; + КонецЕсли; + + КонецЕсли; + + Интерактивно = Ложь; + ВыбранныйПутьКФайлу = ""; + + ИмяФайлаСПутемВременное = ""; + + РазмерВМб = ФайлНовойВерсии.Размер() / (1024 * 1024); + ВремяИзменения = ФайлНовойВерсии.ПолучитьВремяИзменения(); + ВремяИзмененияУниверсальное = ФайлНовойВерсии.ПолучитьУниверсальноеВремяИзменения(); + РазмерФайла = ФайлНовойВерсии.Размер(); + + // Файл с признаком шифрован - при публикации снова шифруем для тех же сертификатов + Если ДанныеФайла.Зашифрован Тогда + + МассивСертификатов = Новый Массив; + + Для Каждого СтруктураСертификата Из ДанныеФайла.МассивСертификатовШифрования Цикл + + Отпечаток = СтруктураСертификата.Отпечаток; + + Сертификат = ЭлектронноЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток); + Если Сертификат = Неопределено Тогда + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отсутствует сертификат ""%1""'"), + СтруктураСертификата.Представление); + Предупреждение(Сообщение); + Возврат; + КонецЕсли; + + МассивСертификатов.Добавить(Сертификат); + + КонецЦикла; + + МенеджерКриптографии = ЭлектронноЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + + ИмяФайлаСПутемШифрованное = ПолныйПутьКФайлу + ".crp"; + МенеджерКриптографии.Зашифровать(ПолныйПутьКФайлу, ИмяФайлаСПутемШифрованное, МассивСертификатов); + ИмяФайлаСПутемВременное = ПолныйПутьКФайлу + ".bak"; + ПереместитьФайл(ПолныйПутьКФайлу, ИмяФайлаСПутемВременное); + ПереместитьФайл(ИмяФайлаСПутемШифрованное, ПолныйПутьКФайлу); + + КонецЕсли; + + ИмяФайла = ФайлНовойВерсии.Имя; + + ТекстПояснения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)... + |Пожалуйста, подождите.'"), + ИмяФайла, ?(РазмерВМб >= 1, Формат(РазмерВМб, "ЧДЦ=0"), Формат(РазмерВМб, "ЧДЦ=1; ЧН=0"))); + + Состояние(ТекстПояснения); + + ПомещаемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(ПолныйПутьКФайлу, ""); + ПомещаемыеФайлы.Добавить(Описание); + + ПомещенныеФайлы = Новый Массив; + + Если ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Интерактивно, ИдентификаторФормы) Тогда + Состояние(); + + Если ПомещенныеФайлы.Количество() = 1 Тогда + АдресВременногоХранилища = ПомещенныеФайлы[0].Хранение; + КонецЕсли; + + ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + ОтносительныйПутьКФайлу = ""; + + ИмяБезРасширения = ФайлНовойВерсии.ИмяБезРасширения; + Расширение = ФайлНовойВерсии.Расширение; + + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + + Если ДанныеФайла.РабочийКаталогВладельца <> "" Тогда // есть рабочий каталог + ОтносительныйПутьКФайлу = ПолныйПутьКФайлу; + Иначе + Позиция = Найти(ПолныйПутьКФайлу, ИмяКаталога); + Если Позиция <> 0 Тогда + ОтносительныйПутьКФайлу = Сред(ПолныйПутьКФайлу, СтрДлина(ИмяКаталога) + 1); + КонецЕсли; + КонецЕсли; + + АдресВременногоХранилищаТекста = ФайловыеФункцииКлиент.ИзвлечьТекстВоВременноеХранилище( + ПолныйПутьКФайлу, ИдентификаторФормы); + + ЭтоВебКлиент = Ложь; + + ТекстНеИзвлеченНаКлиенте = Ложь; + #Если ВебКлиент Тогда + ТекстНеИзвлеченНаКлиенте = Истина; + #КонецЕсли + + РаботаСФайлами.ОпубликоватьФайл( + ДанныеФайла.Ссылка, + СоздатьНовуюВерсию, + АдресВременногоХранилища, + КомментарийКВерсии, + ВремяИзменения, + ВремяИзмененияУниверсальное, + РазмерФайла, + ИмяБезРасширения, + Расширение, + ОтносительныйПутьКФайлу, + ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + ВРабочемКаталогеВладельца, + НеМенятьЗаписьВРабочемКаталоге, + ИдентификаторФормы); + + Если ПоказыватьОповещение Тогда + ПоказатьОповещениеПользователя( + НСтр("ru = 'Новая версия сохранена'"), + ДанныеФайла.НавигационнаяСсылка, + ДанныеФайла.ПолноеНаименованиеВерсии, + БиблиотекаКартинок.Информация32); + КонецЕсли; + + // удаляем зашифрованный файл из кеша + Если ДанныеФайла.Зашифрован Тогда + ПереместитьФайл(ИмяФайлаСПутемВременное, ПолныйПутьКФайлу); + КонецЕсли; + + Иначе + Состояние(); + КонецЕсли; + + КонецЕсли; +КонецПроцедуры // ОпубликоватьФайл() + +// Процедура предназначена для интерактивного создания нового Файла +// В частности, происходит вызов диалога выбора режима создания Файла +// Параметры: +// ВладелецФайла - определяет группу, в которой создается Элемент, если +// группа неизвестна в момент вызова этого метода - там будет Неопределено +Процедура СозданиеНовогоФайла(ВладелецФайла, ФормаВладелец, РежимСоздания = 1, НеОткрыватьКарточкуПослеСозданияИзФайла = Неопределено) Экспорт + Форма = РаботаСФайламиКлиентПовтИсп.ПолучитьФормуВыбораВариантаСозданияНовогоФайла(); + + Форма.РежимСоздания = РежимСоздания; + Результат = Форма.ОткрытьМодально(); + + Если Результат = КодВозвратаДиалога.Да Тогда + + СоздатьФайл(Форма.РежимСоздания, ВладелецФайла, ФормаВладелец, НеОткрыватьКарточкуПослеСозданияИзФайла); + + КонецЕсли; + +КонецПроцедуры // СозданиеНовогоФайла() + +// Процедура предназначена для копирования существующего Файла +// Параметры: +// ФайлОснование - откуда копируется Файл (тип - СправочникСсылка) +Процедура СкопироватьФайл(ВладелецФайла, ФайлОснование) Экспорт + + Параметры = Новый Структура("ФайлОснование, ВладелецФайла", ФайлОснование, ВладелецФайла); + Форма = ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", Параметры); + +КонецПроцедуры // СкопироватьФайл() + +// Находится ли в рабочем каталоге Файл для данной версии +Функция ФайлНаходитсяВЛокальномКэшеФайлов(ДанныеФайла, ТекущаяВерсия, ИмяФайлаСПутем, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца) + ИмяФайлаСПутем = ""; + + // Если это активная версия - берем из ДанныеФайла + Если ДанныеФайла <> Неопределено И ДанныеФайла.ТекущаяВерсия = ТекущаяВерсия Тогда + ИмяФайлаСПутем = ДанныеФайла.ИмяФайлаСПутемВРабочемКаталоге; + ВРабочемКаталогеНаЧтение = ДанныеФайла.ВРабочемКаталогеНаЧтение; + Иначе + ВРабочемКаталогеНаЧтение = Истина; + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + // Пытаемся найти такую запись в регистре сведений + ИмяФайлаСПутем = РаботаСФайлами.ПолучитьИмяФайлаСПутемИзРегистра(ТекущаяВерсия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + Если ИмяФайлаСПутем <> "" Тогда + // Тут надо еще на наличие на диске проверять + ФайлНаДиске = Новый Файл(ИмяФайлаСПутем); + Если ФайлНаДиске.Существует() Тогда + Возврат Истина; + Иначе + ИмяФайлаСПутем = ""; + // Тут же удалим из регистра - т.к. в регистре есть, а на диске нет + РаботаСФайлами.УдалитьИзРегистра(ТекущаяВерсия); + КонецЕсли; + КонецЕсли; + + Возврат Ложь; +КонецФункции + +// Освободить место для помещения файла - если место есть, ничего не делает +Процедура ОсвободитьМестоВРабочемКаталоге(РеквизитыВерсии) + #Если НЕ ВебКлиент Тогда + МаксРазмер = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().МаксимальныйРазмерЛокальногоКэшаФайлов; + + // Если размер РабочийКаталог стоит равным 0, то считать что никакого ограничения нет + // и умолчание в 10 Мб не использовать. + Если МаксРазмер = 0 Тогда + Возврат; + КонецЕсли; + + ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + МассивФайлов = НайтиФайлы(ИмяКаталога, "*.*"); + + РазмерФайловВРабочемКаталоге = 0; + КоличествоСуммарное = 0; + // Вычисляем полный размер файлов в рабочем каталоге + ФайловыеФункцииКлиент.ОбходФайловРазмер(ИмяКаталога, МассивФайлов, РазмерФайловВРабочемКаталоге, КоличествоСуммарное); + + Размер = РеквизитыВерсии.Размер; + Если РазмерФайловВРабочемКаталоге + Размер > МаксРазмер Тогда + ФайловыеФункцииКлиент.ОчиститьРабочийКаталог(РазмерФайловВРабочемКаталоге, Размер, Ложь); // ОчищатьВсе= Ложь + КонецЕсли; + #КонецЕсли +КонецПроцедуры + +// Получить Файл с сервера и зарегистрировать в локальном кеше +Функция ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ИмяФайлаСПутем, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы = Неопределено) + + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + + Если ИмяФайлаСПутем = "" Тогда + ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + // Формирование имени файла с расширением + ИмяФайла = ДанныеФайла.ПолноеНаименованиеВерсии; + Если НЕ ПустаяСтрока(ДанныеФайла.Расширение) Тогда + ИмяФайла = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ИмяФайла, ДанныеФайла.Расширение); + КонецЕсли; + + ИмяФайлаСПутем = ""; + Если НЕ ПустаяСтрока(ИмяФайла) Тогда + ИмяФайлаСПутем = ФайловыеФункцииКлиентСервер.ПолучитьУникальноеИмяСПутем(ИмяКаталога, ИмяФайла); + ИмяФайлаСПутем = ИмяКаталога + ИмяФайлаСПутем; + КонецЕсли; + + Если ПустаяСтрока(ИмяФайла) Тогда + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + Если ВРабочемКаталогеВладельца = Ложь Тогда + #Если Не ВебКлиент Тогда // в веб клиенте нельзя определить количество свободного места на диске + ОсвободитьМестоВРабочемКаталоге(ДанныеФайла); + #КонецЕсли + КонецЕсли; + + РазмерФайла = 0; + + + // Запись Файл в каталог + Попытка + + АдресФайла = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; + Если ДанныеФайла.Версия <> ДанныеФайла.ТекущаяВерсия Тогда + АдресФайла = РаботаСФайлами.ПолучитьНавигационнуюСсылкуДляОткрытия(ДанныеФайла.Версия, ИдентификаторФормы); + КонецЕсли; + + ИмяФайла = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + РазмерВМб = ДанныеФайла.Размер / (1024 * 1024); + + ТекстПояснения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)... + |Пожалуйста, подождите.'"), + ИмяФайла, ?(РазмерВМб >= 1, Формат(РазмерВМб, "ЧДЦ=0"), Формат(РазмерВМб, "ЧДЦ=1; ЧН=0"))); + + Состояние(ТекстПояснения); + + ПередаваемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(ИмяФайла, АдресФайла); + ПередаваемыеФайлы.Добавить(Описание); + + ФайлНаДискеПоИмени = Новый Файл(ИмяФайлаСПутем); + ПутьКФайлу = ФайлНаДискеПоИмени.Путь; + Если Прав(ПутьКФайлу,1) <> "\" Тогда + ПутьКФайлу = ПутьКФайлу + "\"; + КонецЕсли; + ИмяФайлаСПутем = ПутьКФайлу + ИмяФайла; // могло смениться расширение + + Если НЕ ПолучитьФайлы(ПередаваемыеФайлы,, ПутьКФайлу, Ложь) Тогда + Возврат Ложь; + КонецЕсли; + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда + УдалитьИзВременногоХранилища(АдресФайла); + КонецЕсли; + + Состояние(); + + Если ДанныеФайла.Зашифрован Тогда + + ПредставленияСертификатов = ""; + Для Каждого СтруктураСертификата Из ДанныеФайла.МассивСертификатовШифрования Цикл + + Отпечаток = СтруктураСертификата.Отпечаток; + + ТолькоВЛичномХранилище = Истина; + Сертификат = ЭлектронноЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище); + Если Сертификат <> Неопределено Тогда // тут собираем только личные сертификаты - с закрытым ключом + Если НЕ ПустаяСтрока(ПредставленияСертификатов) Тогда + ПредставленияСертификатов = ПредставленияСертификатов + Символы.ПС; + КонецЕсли; + ПредставленияСертификатов = ПредставленияСертификатов + СтруктураСертификата.Представление; + КонецЕсли; + + КонецЦикла; + + Пароль = ""; + Заголовок = НСтр("ru = 'Введите пароль для расшифровки'"); + ПараметрыФормы = Новый Структура("Заголовок, ПредставленияСертификатов, Файл", + Заголовок, ПредставленияСертификатов, ДанныеФайла.Ссылка); + КодВозврата = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВводПароляСОписаниями", ПараметрыФормы); + Если ТипЗнч(КодВозврата) = Тип("Строка") Тогда + Пароль = КодВозврата; + Иначе + УдалитьФайлы(ИмяФайлаСПутем); + ИмяФайлаСПутем = ""; + Возврат Ложь; + КонецЕсли; + + Попытка + МенеджерКриптографии = ЭлектронноЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Пароль; + + ИмяФайлаСПутемРасшифрованное = ИмяФайлаСПутем + ".dec"; + МенеджерКриптографии.Расшифровать(ИмяФайлаСПутем, ИмяФайлаСПутемРасшифрованное); + + УдалитьФайлы(ИмяФайлаСПутем); + ПереместитьФайл(ИмяФайлаСПутемРасшифрованное, ИмяФайлаСПутем); + Исключение + УдалитьФайлы(ИмяФайлаСПутем); + ВызватьИсключение; + КонецПопытки; + + КонецЕсли; + + // Установим время изменения файла таким, как оно стоит в текущей версии + ФайлНаДиске = Новый Файл(ИмяФайлаСПутем); + ФайлНаДиске.УстановитьВремяИзменения(ДатаФайлаВБазе); + + РазмерФайла = ФайлНаДиске.Размер(); // Т.к. размер на диске может отличаться от размера в базе (при добавлении из веб клиента) + + ФайлНаДиске.УстановитьТолькоЧтение(НаЧтение); + + Исключение + Предупреждение(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат Ложь; + КонецПопытки; + + ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + РаботаСФайлами.ЗанестиИнформациюФайлаВРегистр(ДанныеФайла.Версия, ИмяФайлаСПутем, ИмяКаталога, НаЧтение, РазмерФайла, ВРабочемКаталогеВладельца); + + Возврат Истина; +КонецФункции + +// Перерегистрировать В рабочем каталоге с другим флагом НаЧтение +Процедура ПеререгистрироватьВРабочемКаталоге(ТекущаяВерсия, ИмяФайлаСПутем, НаЧтение, ВРабочемКаталогеВладельца) + ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + РаботаСФайлами.ЗанестиИнформациюФайлаВРегистр(ТекущаяВерсия, ИмяФайлаСПутем, ИмяКаталога, НаЧтение, 0, ВРабочемКаталогеВладельца); + Файл = Новый Файл(ИмяФайлаСПутем); + Файл.УстановитьТолькоЧтение(НаЧтение); +КонецПроцедуры + +// При переименовании Файл и ВерсияФайла обновляет информацию в рабочем каталоге (имя файла на диске и в регистре) +Процедура ОбновитьИнформациюВРабочемКаталоге(ТекущаяВерсия, НовоеИмя) Экспорт + ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + ПолноеИмяФайла = ""; + + ВРабочемКаталогеНаЧтение = Истина; + ВРабочемКаталогеВладельца = Ложь; + ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(Неопределено, ТекущаяВерсия, ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + Если ФайлВРабочемКаталоге = Ложь Тогда + Возврат; + КонецЕсли; + + Попытка + Файл = Новый Файл(ПолноеИмяФайла); + ТолькоИмя = Файл.Имя; + РазмерФайла = Файл.Размер(); + ПутьБезИмени = Лев(ПолноеИмяФайла, СтрДлина(ПолноеИмяФайла) - СтрДлина(ТолькоИмя)); + НовоеПолноеИмя = ПутьБезИмени + НовоеИмя + Файл.Расширение; + ПереместитьФайл(ПолноеИмяФайла, НовоеПолноеИмя); + + РаботаСФайлами.УдалитьИзРегистра(ТекущаяВерсия); + РаботаСФайлами.ЗанестиИнформациюФайлаВРегистр(ТекущаяВерсия, НовоеПолноеИмя, ИмяКаталога, ВРабочемКаталогеНаЧтение, РазмерФайла, ВРабочемКаталогеВладельца); + Исключение + КонецПопытки; + +КонецПроцедуры + +// Перерегистрировать В рабочем каталоге с другим флагом НаЧтение - если там вообще есть такой Файл +Процедура ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца) + // Если Файл без файла - ничего не делаем в рабочем каталоге + Если ДанныеФайла.Версия.Пустая() Тогда + Возврат; + КонецЕсли; + + ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + ПолноеИмяФайла = ""; + + ВРабочемКаталогеНаЧтение = Истина; + ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(ДанныеФайла, ДанныеФайла.ТекущаяВерсия, ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + Если ФайлВРабочемКаталоге = Ложь Тогда + Возврат; + КонецЕсли; + + РаботаСФайлами.ЗанестиИнформациюФайлаВРегистр(ДанныеФайла.ТекущаяВерсия, ПолноеИмяФайла, ИмяКаталога, НаЧтение, 0, ВРабочемКаталогеВладельца); + Файл = Новый Файл(ПолноеИмяФайла); + Файл.УстановитьТолькоЧтение(НаЧтение); +КонецПроцедуры + +// Удаление файла со снятием атрибута readonly +Процедура УдалитьФайл(ПолноеИмяФайла, ЗадаватьВопрос = Неопределено, ШапкаВопроса = Неопределено) Экспорт + ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов; + Если ЗадаватьВопрос <> Неопределено Тогда + ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов = ЗадаватьВопрос; + КонецЕсли; + + Если ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов = Истина Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Удалить файл ""%1"" из основного рабочего каталога?'"), ПолноеИмяФайла); + + Если ШапкаВопроса <> Неопределено Тогда + ТекстВопроса = ШапкаВопроса + Символы.ПС + Символы.ПС + ТекстВопроса; + КонецЕсли; + + Если Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + Файл = Новый Файл(ПолноеИмяФайла); + Файл.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ПолноеИмяФайла); +КонецПроцедуры + +// Получает Файл из информационной базы на чтение на локальный диск - в локальный кэш +// и возвращает путь к этому файлу в параметре +Функция ПолучитьФайлВерсииВЛокальныйКэшФайловНаЧтение(ДанныеФайла, ПолноеИмяФайла, ИдентификаторФормы = Неопределено) + + ПолноеИмяФайла = ""; + НаЧтение = Истина; + + ДатаФайлаВБазе = ДанныеФайла.ДатаМодификацииУниверсальная; + ОбщегоНазначенияКлиент.ПреобразоватьЗимнееВремяКТекущему(ДатаФайлаВБазе); + + ПроинициализироватьПутьКРабочемуКаталогу(); + + ВРабочемКаталогеНаЧтение = Истина; + ВРабочемКаталогеВладельца = Ложь; + ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(ДанныеФайла, ДанныеФайла.Версия, ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + Если НЕ ФайлВРабочемКаталоге Тогда + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + + // Получаем путь файла в рабочем каталоге - с проверкой на уникальность + ИмяФайлаСПутем = ПолноеИмяФайла; + Если ИмяФайлаСПутем = "" Тогда + Предупреждение(НСтр("ru = 'Ошибка помещения файла в локальный кэш файлов.'")); + Возврат Ложь; + КонецЕсли; + + // Ниже - уже известно, что Файл в рабочем каталоге есть. + // Надо проверить его дату модификации и принять решение что делать дальше + // - перезаписать, спросить пользователя и т.д. + + ФайлВерсии = Новый Файл(ПолноеИмяФайла); + ДатаФайлаНаДиске = ФайлВерсии.ПолучитьВремяИзменения(); + РазмерФайлаНаДиске = ФайлВерсии.Размер(); + РазмерФайлаВБазе = ДанныеФайла.Размер; + + РазницаДат = ДатаФайлаНаДиске - ДатаФайлаВБазе; + Если РазницаДат < 0 Тогда + РазницаДат = -РазницаДат; + КонецЕсли; + + Если РазницаДат <= 1 Тогда // 1 секунда - допустимая разница (на Win95 может быть такое) + // Дата одинаковая, но размер отличается - странно, но возможно + Если РазмерФайлаВБазе <> 0 И РазмерФайлаНаДиске <> РазмерФайлаВБазе Тогда + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("РазмерФайлаНаСервере", РазмерФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("РазмерВРабочемКаталоге", РазмерФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Сообщение", НСтр("ru = 'Размер файла в рабочем каталоге и на сервере отличается. Перезаписать файл в рабочем каталоге?'")); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.РазмерФайлаВРабочемКаталогеОтличается", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Да Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла); + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Открыть существующий + Возврат Истина; + Иначе // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + Возврат Истина; // Все совпадает - и дата, и размер + ИначеЕсли ДатаФайлаНаДиске < ДатаФайлаВБазе Тогда // В рабочем каталоге более старый + Если ВРабочемКаталогеНаЧтение = Ложь Тогда // В рабочем каталоге на редактирование + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("ВремяИзмененияНаСервере", ДатаФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("ВРабочемКаталоге", ДатаФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Заголовок", "В рабочем каталоге более старый файл"); + + Сообщение = НСтр("ru = 'Файл на локальном компьютере, отмеченный как взятый на редактирование, имеет более раннюю дату изменения, чем на сервере. Открыть файл из локального каталога или взять из информационной базы и перезаписать?'"); + ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВРабочемКаталогеБолееНовыйФайл", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Да Тогда // Открыть существующий + Возврат Истина; + ИначеЕсли Ответ = КодВозвратаДиалога.Отмена Тогда // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла); + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + Иначе // В рабочем каталоге на чтение + // Перезапишем ни о чем не спросив + УдалитьФайл(ПолноеИмяФайла); + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + ИначеЕсли ДатаФайлаНаДиске > ДатаФайлаВБазе Тогда // В рабочем каталоге более новый (изменен пользователем со стороны) + ЗанятМной = (ДанныеФайла.Редактирует = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ТекущийПользователь); + Если (ВРабочемКаталогеНаЧтение = Ложь) И ЗанятМной Тогда // В рабочем каталоге на редактирование и занят текущим пользователем + Возврат Истина; // Ничего делать не надо + Иначе // В рабочем каталоге на чтение + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("ВремяИзмененияНаСервере", ДатаФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("ВРабочемКаталоге", ДатаФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Заголовок", "В рабочем каталоге более новый файл"); + + Сообщение = НСтр("ru = 'Файл на локальном компьютере имеет более позднюю дату, возможно, он был изменен. Открыть существующий или взять с сервера и перезаписать?'"); + ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); + + Результат = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВРабочемКаталогеБолееНовыйФайл", ПараметрыОткрытияФормы); + + Если Результат = КодВозвратаДиалога.Да Тогда // Открыть существующий + Возврат Истина; + ИначеЕсли Результат = КодВозвратаДиалога.Отмена Тогда // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла); + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + Возврат Ложь; +КонецФункции // ПолучитьФайлВерсииВРабочийКаталог() + +// Получает Файл из информационной базы на редактирование на локальный диск - в локальный кэш +// и возвращает путь к этому файлу в параметре +Функция ПолучитьФайлВерсииВЛокальныйКэшФайловНаРедактирование(ДанныеФайла, ПолноеИмяФайла, ИдентификаторФормы = Неопределено) + ПолноеИмяФайла = ""; + НаЧтение = Ложь; + + ДатаФайлаВБазе = ДанныеФайла.ДатаМодификацииУниверсальная; + ОбщегоНазначенияКлиент.ПреобразоватьЗимнееВремяКТекущему(ДатаФайлаВБазе); + РазмерФайлаВБазе = ДанныеФайла.Размер; + + ПроинициализироватьПутьКРабочемуКаталогу(); + + ВРабочемКаталогеНаЧтение = Истина; + ВРабочемКаталогеВладельца = Ложь; + ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(ДанныеФайла, ДанныеФайла.Версия, ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + Если ФайлВРабочемКаталоге = Ложь Тогда + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + + // Получаем путь файла в рабочем каталоге - с проверкой на уникальность + ИмяФайлаСПутем = ПолноеИмяФайла; + Если ИмяФайлаСПутем = "" Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Ошибка помещения файла в локальный кэш файлов.'")); + Возврат Ложь; + КонецЕсли; + + // Ниже - уже известно, что Файл в рабочем каталоге есть. + // Надо проверить его дату модификации и принять решение что делать дальше + // - перезаписать, спросить пользователя и т.д. + + ФайлВерсии = Новый Файл(ПолноеИмяФайла); + ДатаФайлаНаДиске = ФайлВерсии.ПолучитьВремяИзменения(); + РазмерФайлаНаДиске = ФайлВерсии.Размер(); + + РазницаДат = ДатаФайлаНаДиске - ДатаФайлаВБазе; + Если РазницаДат < 0 Тогда + РазницаДат = -РазницаДат; + КонецЕсли; + + Если РазницаДат <= 1 Тогда // 1 секунда - допустимая разница (на Win95 может быть такое) + // Дата одинаковая, но размер отличается - странно, но возможно + Если РазмерФайлаВБазе <> 0 И РазмерФайлаНаДиске <> РазмерФайлаВБазе Тогда + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("РазмерФайлаНаСервере", РазмерФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("РазмерВРабочемКаталоге", РазмерФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Сообщение", НСтр("ru = 'Размер файла в рабочем каталоге и на сервере отличается. Перезаписать файл в рабочем каталоге?'")); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.РазмерФайлаВРабочемКаталогеОтличается", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Да Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла); + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Открыть существующий + Возврат Истина; + Иначе // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + // Все совпадает - и дата, и размер + Если ВРабочемКаталогеНаЧтение = НаЧтение Тогда + Возврат Истина; + Иначе + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьВРабочемКаталоге(ДанныеФайла.Версия, ИмяФайлаСПутем, НаЧтение, ВРабочемКаталогеВладельца); + Возврат Истина; + КонецЕсли; + ИначеЕсли ДатаФайлаНаДиске < ДатаФайлаВБазе Тогда // В рабочем каталоге более старый + Если ВРабочемКаталогеНаЧтение = Ложь Тогда // В рабочем каталоге на редактирование + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("ВремяИзмененияНаСервере", ДатаФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("ВРабочемКаталоге", ДатаФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Заголовок", "В рабочем каталоге более старый файл"); + + Сообщение = НСтр("ru = 'Файл на локальном компьютере, отмеченный как взятый на редактирование, имеет более раннюю дату изменения, чем на сервере. Открыть файл из локального каталога или взять с сервера и перезаписать?'"); + ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВРабочемКаталогеБолееНовыйФайл", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Да Тогда // Открыть существующий + Возврат Истина; + ИначеЕсли Ответ = КодВозвратаДиалога.Отмена Тогда // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла); + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + Иначе // В рабочем каталоге на чтение + // Перезапишем ни о чем не спросив + УдалитьФайл(ПолноеИмяФайла); + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + ИначеЕсли ДатаФайлаНаДиске > ДатаФайлаВБазе Тогда // В рабочем каталоге более новый (изменен пользователем со стороны) + + Если ВРабочемКаталогеНаЧтение = Ложь Тогда // В рабочем каталоге на редактирование + Возврат Истина; // Ничего делать не надо + Иначе // В рабочем каталоге на чтение + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("ВремяИзмененияНаСервере", ДатаФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("ВРабочемКаталоге", ДатаФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Заголовок", "В рабочем каталоге более новый файл"); + + Сообщение = НСтр("ru = 'Файл на локальном компьютере, отмеченный как взятый на редактирование, имеет более позднюю дату изменения, чем на сервере. Открыть файл из локального каталога или взять с сервера и перезаписать?'"); + ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВРабочемКаталогеБолееНовыйФайл", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Да Тогда // Открыть существующий + Возврат Истина; + ИначеЕсли Ответ = КодВозвратаДиалога.Отмена Тогда // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла); + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + Возврат Ложь; +КонецФункции // ПолучитьФайлВерсииВРабочийКаталог() + +// Получает Файл из информационной базы на чтение на локальный диск - в рабочий каталог папки +// и возвращает путь к этому файлу в параметре +Функция ПолучитьФайлВерсииВРабочийКаталогНаЧтение(ДанныеФайла, ПолноеИмяФайла, ИдентификаторФормы = Неопределено) + + Перем Версия; + Перем ДатаПомещения; + + НаЧтение = Истина; + ВРабочемКаталогеВладельца = Истина; + + ДатаФайлаВБазе = ДанныеФайла.ДатаМодификацииУниверсальная; + ОбщегоНазначенияКлиент.ПреобразоватьЗимнееВремяКТекущему(ДатаФайлаВБазе); + + ПроинициализироватьПутьКРабочемуКаталогу(); + + Если ПолноеИмяФайла = "" Тогда + ПолноеИмяФайла = ДанныеФайла.РабочийКаталогВладельца + ДанныеФайла.ПолноеНаименованиеВерсии + "." + ДанныеФайла.Расширение; + КонецЕсли; + + // находим в рабочем каталоге по пути, а не по ВерсииФайла + Владелец = Неопределено; + НомерВерсии = Неопределено; + ВРегистреНаЧтение = Неопределено; + ВРегистреКодФайла = Неопределено; + ВРегистреПапка = Неопределено; + ФайлЕстьВРегистре = РаботаСФайлами.НайтиВРегистреПоПути(ПолноеИмяФайла, Версия, ДатаПомещения, Владелец, НомерВерсии, + ВРегистреНаЧтение, ВРегистреКодФайла, ВРегистреПапка); + + Если ФайлЕстьВРегистре Тогда + // проверить что уже есть Файл по этому пути + ФайлНаДиске = Новый Файл(ПолноеИмяФайла); + Если НЕ ФайлНаДиске.Существует() Тогда + РаботаСФайлами.УдалитьИзРегистра(Версия); + ФайлЕстьВРегистре = Ложь; + КонецЕсли; + КонецЕсли; + + Если НЕ ФайлЕстьВРегистре Тогда // на Файл нет ссылки в регистре + + // проверить что уже есть Файл по этому пути + ФайлНаДиске = Новый Файл(ПолноеИмяФайла); + Если ФайлНаДиске.Существует() Тогда + + ДатаФайлаВБазе = ДанныеФайла.ДатаМодификацииУниверсальная; + ОбщегоНазначенияКлиент.ПреобразоватьЗимнееВремяКТекущему(ДатаФайлаВБазе); + РазмерФайлаВБазе = ДанныеФайла.Размер; + + ДатаФайлаНаДиске = ФайлНаДиске.ПолучитьВремяИзменения(); + РазмерФайлаНаДиске = ФайлНаДиске.Размер(); + + РазницаДат = ДатаФайлаНаДиске - ДатаФайлаВБазе; + Если РазницаДат < 0 Тогда + РазницаДат = -РазницаДат; + КонецЕсли; + + // размер и дата модификации одинаковы - используем его - зарегистрируем в кеше + Если РазницаДат <= 1 И РазмерФайлаВБазе = РазмерФайлаНаДиске Тогда + ФайлНаДиске.УстановитьТолькоЧтение(НаЧтение); + ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + РаботаСФайлами.ЗанестиИнформациюФайлаВРегистр(ДанныеФайла.Версия, ПолноеИмяФайла, ИмяКаталога, НаЧтение, РазмерФайлаВБазе, ВРабочемКаталогеВладельца); + Возврат Истина; // используем находящийся на диске Файл + КонецЕсли; + + Если РазницаДат > 1 Тогда + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ПолноеИмяФайла); + ПараметрыОткрытияФормы.Вставить("ВремяИзмененияНаСервере", ДатаФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("ВРабочемКаталоге", ДатаФайлаНаДиске); + + Если ДатаФайлаНаДиске < ДатаФайлаВБазе Тогда + ПараметрыОткрытияФормы.Вставить("Заголовок", "В рабочем каталоге более старый файл"); + Иначе + ПараметрыОткрытияФормы.Вставить("Заголовок", "В рабочем каталоге более новый файл"); + КонецЕсли; + + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Файл ""%1"" в рабочем каталоге на локальном компьютере уже есть, но его дата изменения отличается от даты в информационной базе. Открыть файл из локального каталога или взять из информационной базы и перезаписать?'"), + Строка(ДанныеФайла.Ссылка)); + ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВРабочемКаталогеБолееНовыйФайл", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Да Тогда // Открыть существующий + ФайлНаДиске.УстановитьТолькоЧтение(НаЧтение); + ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + РаботаСФайлами.ЗанестиИнформациюФайлаВРегистр(ДанныеФайла.Версия, ПолноеИмяФайла, ИмяКаталога, НаЧтение, РазмерФайлаВБазе, ВРабочемКаталогеВладельца); + Возврат Истина; + ИначеЕсли Ответ = КодВозвратаДиалога.Отмена ИЛИ Ответ = Неопределено Тогда // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла); + Возврат ПолучитьССервераИЗарегистрироватьВРабочемКаталоге(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + + Иначе + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%3"" в рабочем каталоге уже есть, но его размер отличается от даты на сервере. + | Размер файла в рабочем каталоге: %1 + | Размер файла на сервере: %2 + |Переименуйте его или переместите в другой каталог. '"), + РазмерФайлаНаДиске, РазмерФайлаВБазе, ПолноеИмяФайла); + + Предупреждение(СтрокаСообщения); + Возврат Ложь; // отмена операции + + КонецЕсли; + КонецЕсли; + + // на Файл нет ссылки в регистре и файла на диске тоже нет + Возврат ПолучитьССервераИЗарегистрироватьВРабочемКаталоге(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; // на Файл нет ссылки в регистре + + + // Файл по пути в рабочем каталоге имеет ссылку в регистре сведений + Если Версия <> ДанныеФайла.ТекущаяВерсия Тогда // в раб каталоге лежит Файл не той ВерсииФайла (или вообще другой объект Файл) + + Если Владелец = ДанныеФайла.Ссылка И ВРегистреНаЧтение = Истина Тогда // на диске тот же Файл, но другой ВерсииФайла - и при этом на чтение + Возврат ПолучитьССервераИЗарегистрироватьВРабочемКаталоге(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + + СтрокаСообщения = ""; + + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В рабочем каталоге уже есть файл ""%1"", связанный с другим файлом информационной базы. + | Код файла на сервере: %2 + | Код файла на локальном компьютере: %3 '"), + ПолноеИмяФайла, + ДанныеФайла.КодФайла, + ВРегистреКодФайла); + + Если ДанныеФайла.Владелец = ВРегистреПапка Тогда // одна и та же папка + СтрокаСообщения = СтрокаСообщения + Символы.ПС + НСтр("ru = 'Переименуйте один из файлов в информационной базе.'"); + Иначе + СтрокаСообщения = СтрокаСообщения + Символы.ПС + НСтр("ru = 'Измените рабочий каталог одной из папок в информационной базе + | (У двух папок не должно быть одинакового рабочего каталога).'"); + КонецЕсли; + + Предупреждение(СтрокаСообщения); + Возврат Ложь; + + Иначе // Файл по пути в рабочем каталоге - нужной нам версии и на него есть ссылка в регистре + + // Ниже - уже известно, что Файл в рабочем каталоге есть. + // Надо проверить его дату модификации и принять решение что делать дальше + // - перезаписать, спросить пользователя и т.д. + + ИмяФайлаСПутем = ПолноеИмяФайла; + ВРабочемКаталогеНаЧтение = ВРегистреНаЧтение; + + ФайлВерсии = Новый Файл(ПолноеИмяФайла); + ДатаФайлаНаДиске = ФайлВерсии.ПолучитьВремяИзменения(); + РазмерФайлаНаДиске = ФайлВерсии.Размер(); + РазмерФайлаВБазе = ДанныеФайла.Размер; + + РазницаДат = ДатаФайлаНаДиске - ДатаФайлаВБазе; + Если РазницаДат < 0 Тогда + РазницаДат = -РазницаДат; + КонецЕсли; + + Если РазницаДат <= 1 Тогда // 1 секунда - допустимая разница (на Win95 может быть такое) + // Дата одинаковая, но размер отличается - странно, но возможно + Если РазмерФайлаВБазе <> 0 И РазмерФайлаНаДиске <> РазмерФайлаВБазе Тогда + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("РазмерФайлаНаСервере", РазмерФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("РазмерВРабочемКаталоге", РазмерФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Сообщение", НСтр("ru = 'Размер файла в рабочем каталоге и на сервере отличается. Перезаписать файл в рабочем каталоге?'")); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.РазмерФайлаВРабочемКаталогеОтличается", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Да Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла, Ложь); // в рабочем каталоге настройка подтверждения при удалении не используется + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Открыть существующий + Возврат Истина; + Иначе // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + Возврат Истина; // Все совпадает - и дата, и размер + ИначеЕсли ДатаФайлаНаДиске < ДатаФайлаВБазе Тогда // В рабочем каталоге более старый + Если ВРабочемКаталогеНаЧтение = Ложь Тогда // В рабочем каталоге на редактирование + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("ВремяИзмененияНаСервере", ДатаФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("ВРабочемКаталоге", ДатаФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Заголовок", "В рабочем каталоге более старый файл"); + + Сообщение = НСтр("ru = 'Файл на локальном компьютере, отмеченный как взятый на редактирование, имеет более раннюю дату изменения, чем на сервере. Открыть файл из локального каталога или взять с сервера и перезаписать?'"); + ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВРабочемКаталогеБолееНовыйФайл", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Да Тогда // Открыть существующий + Возврат Истина; + ИначеЕсли Ответ = КодВозвратаДиалога.Отмена Тогда // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла, Ложь); // в рабочем каталоге настройка подтверждения при удалении не используется + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + Иначе // В рабочем каталоге на чтение + // Перезапишем ни о чем не спросив + УдалитьФайл(ПолноеИмяФайла, Ложь); // в рабочем каталоге настройка подтверждения при удалении не используется + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + ИначеЕсли ДатаФайлаНаДиске > ДатаФайлаВБазе Тогда // В рабочем каталоге более новый (изменен пользователем со стороны) + ЗанятМной = (ДанныеФайла.Редактирует = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ТекущийПользователь); + Если (ВРабочемКаталогеНаЧтение = Ложь) И ЗанятМной Тогда // В рабочем каталоге на редактирование и занят текущим пользователем + Возврат Истина; // Ничего делать не надо + Иначе // В рабочем каталоге на чтение + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("ВремяИзмененияНаСервере", ДатаФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("ВРабочемКаталоге", ДатаФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Заголовок", "В рабочем каталоге более новый файл"); + + Сообщение = НСтр("ru = 'Файл на локальном компьютере имеет более позднюю дату, возможно, он был изменен. Открыть существующий или взять с сервера и перезаписать?'"); + ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); + + Результат = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВРабочемКаталогеБолееНовыйФайл", ПараметрыОткрытияФормы); + + Если Результат = КодВозвратаДиалога.Да Тогда // Открыть существующий + Возврат Истина; + ИначеЕсли Результат = КодВозвратаДиалога.Отмена Тогда // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла, Ложь); // в рабочем каталоге настройка подтверждения при удалении не используется + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + Возврат Ложь; + КонецЕсли; + + + Возврат Ложь; +КонецФункции // ПолучитьФайлВерсииВРабочийКаталог() + +// Получает Файл из информационной базы на редактирование на локальный диск - в рабочий каталог папки +// и возвращает путь к этому файлу в параметре +Функция ПолучитьФайлВерсииВРабочийКаталогНаРедактирование(ДанныеФайла, ПолноеИмяФайла, ИдентификаторФормы = Неопределено) + + Перем Версия; + Перем ДатаПомещения; + + НаЧтение = Ложь; + ВРабочемКаталогеВладельца = Истина; + + ДатаФайлаВБазе = ДанныеФайла.ДатаМодификацииУниверсальная; + ОбщегоНазначенияКлиент.ПреобразоватьЗимнееВремяКТекущему(ДатаФайлаВБазе); + + ПроинициализироватьПутьКРабочемуКаталогу(); + + Если ПолноеИмяФайла = "" Тогда + ПолноеИмяФайла = ДанныеФайла.РабочийКаталогВладельца + ДанныеФайла.ПолноеНаименованиеВерсии + "." + ДанныеФайла.Расширение; + КонецЕсли; + + // находим в рабочем каталоге по пути, а не по ВерсииФайла + Владелец = Неопределено; + НомерВерсии = Неопределено; + ВРегистреНаЧтение = Неопределено; + ВРегистреКодФайла = Неопределено; + ВРегистреПапка = Неопределено; + ФайлЕстьВРегистре = РаботаСФайлами.НайтиВРегистреПоПути(ПолноеИмяФайла, Версия, ДатаПомещения, Владелец, НомерВерсии, + ВРегистреНаЧтение, ВРегистреКодФайла, ВРегистреПапка); + + Если ФайлЕстьВРегистре Тогда + // проверить что уже есть Файл по этому пути + ФайлНаДиске = Новый Файл(ПолноеИмяФайла); + Если НЕ ФайлНаДиске.Существует() Тогда + РаботаСФайлами.УдалитьИзРегистра(Версия); + ФайлЕстьВРегистре = Ложь; + КонецЕсли; + КонецЕсли; + + Если НЕ ФайлЕстьВРегистре Тогда // на Файл нет ссылки в регистре + + // проверить что уже есть Файл по этому пути + ФайлНаДиске = Новый Файл(ПолноеИмяФайла); + Если ФайлНаДиске.Существует() Тогда + + ДатаФайлаВБазе = ДанныеФайла.ДатаМодификацииУниверсальная; + ОбщегоНазначенияКлиент.ПреобразоватьЗимнееВремяКТекущему(ДатаФайлаВБазе); + РазмерФайлаВБазе = ДанныеФайла.Размер; + + ДатаФайлаНаДиске = ФайлНаДиске.ПолучитьВремяИзменения(); + РазмерФайлаНаДиске = ФайлНаДиске.Размер(); + + РазницаДат = ДатаФайлаНаДиске - ДатаФайлаВБазе; + Если РазницаДат < 0 Тогда + РазницаДат = -РазницаДат; + КонецЕсли; + + // размер и дата модификации одинаковы - используем его - зарегистрируем в кеше + Если РазницаДат <= 1 И РазмерФайлаВБазе = РазмерФайлаНаДиске Тогда + ФайлНаДиске.УстановитьТолькоЧтение(НаЧтение); + ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + РаботаСФайлами.ЗанестиИнформациюФайлаВРегистр(ДанныеФайла.Версия, ПолноеИмяФайла, ИмяКаталога, НаЧтение, РазмерФайлаВБазе, ВРабочемКаталогеВладельца); + Возврат Истина; // используем находящийся на диске Файл + КонецЕсли; + + Если РазницаДат > 1 Тогда + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%3"" в рабочем каталоге уже есть, но его дата изменения отличается от даты на сервере. + | Дата изменения файла в рабочем каталоге: %1 + | Дата изменения файла на сервере: %2 + |Переименуйте его или переместите в другой каталог. '"), + ДатаФайлаНаДиске, ДатаФайлаВБазе, ПолноеИмяФайла); + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ПолноеИмяФайла); + ПараметрыОткрытияФормы.Вставить("ВремяИзмененияНаСервере", ДатаФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("ВРабочемКаталоге", ДатаФайлаНаДиске); + + Если ДатаФайлаНаДиске < ДатаФайлаВБазе Тогда + ПараметрыОткрытияФормы.Вставить("Заголовок", "В рабочем каталоге более старый файл"); + Иначе + ПараметрыОткрытияФормы.Вставить("Заголовок", "В рабочем каталоге более новый файл"); + КонецЕсли; + + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Файл ""%1"" в рабочем каталоге на локальном компьютере уже есть, но его дата изменения отличается от даты на сервере. Открыть файл из локального каталога или взять с сервера и перезаписать?'"), + Строка(ДанныеФайла.Ссылка)); + ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВРабочемКаталогеБолееНовыйФайл", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Да Тогда // Открыть существующий + ФайлНаДиске.УстановитьТолькоЧтение(НаЧтение); + ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + РаботаСФайлами.ЗанестиИнформациюФайлаВРегистр(ДанныеФайла.Версия, ПолноеИмяФайла, ИмяКаталога, НаЧтение, РазмерФайлаВБазе, ВРабочемКаталогеВладельца); + Возврат Истина; // используем находящийся на диске Файл + ИначеЕсли Ответ = КодВозвратаДиалога.Отмена ИЛИ Ответ = Неопределено Тогда // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла); + Возврат ПолучитьССервераИЗарегистрироватьВРабочемКаталоге(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + + Иначе + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%3"" в рабочем каталоге уже есть, но его размер отличается от даты на сервере. + | Размер файла в рабочем каталоге: %1 + | Размер файла на сервере: %2 + |Переименуйте его или переместите в другой каталог. '"), + РазмерФайлаНаДиске, РазмерФайлаВБазе, ПолноеИмяФайла); + + Предупреждение(СтрокаСообщения); + Возврат Ложь; // отмена операции + + КонецЕсли; + КонецЕсли; + + // на Файл нет ссылки в регистре и файла на диске тоже нет + Возврат ПолучитьССервераИЗарегистрироватьВРабочемКаталоге(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; // на Файл нет ссылки в регистре + + + // Файл по пути в рабочем каталоге имеет ссылку в регистре сведений + Если Версия <> ДанныеФайла.ТекущаяВерсия Тогда // в раб каталоге лежит Файл не той ВерсииФайла (или вообще другой объект Файл) + + Если Владелец = ДанныеФайла.Ссылка И ВРегистреНаЧтение = Истина Тогда // на диске тот же Файл, но другой ВерсииФайла - и при этом на чтение + Возврат ПолучитьССервераИЗарегистрироватьВРабочемКаталоге(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + + СтрокаСообщения = ""; + + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В рабочем каталоге уже есть файл ""%1"", связанный с другим файлом информационной базы. + | Код файла на сервере: %2 + | Код файла на локальном компьютере: %3 '"), + ПолноеИмяФайла, + ДанныеФайла.КодФайла, + ВРегистреКодФайла); + + Если ДанныеФайла.Владелец = ВРегистреПапка Тогда // одна и та же папка + СтрокаСообщения = СтрокаСообщения + Символы.ПС + НСтр("ru = 'Переименуйте один из файлов в информационной базе.'"); + Иначе + СтрокаСообщения = СтрокаСообщения + Символы.ПС + НСтр("ru = 'Измените рабочий каталог одной из папок в информационной базе + | (У двух папок не должно быть одинакового рабочего каталога).'"); + КонецЕсли; + + Предупреждение(СтрокаСообщения); + Возврат Ложь; + + Иначе // Файл по пути в рабочем каталоге - нужной нам версии и на него есть ссылка в регистре + + // Ниже - уже известно, что Файл в рабочем каталоге есть. + // Надо проверить его дату модификации и принять решение что делать дальше + // - перезаписать, спросить пользователя и т.д. + + ИмяФайлаСПутем = ПолноеИмяФайла; + ВРабочемКаталогеНаЧтение = ВРегистреНаЧтение; + + ФайлВерсии = Новый Файл(ПолноеИмяФайла); + ДатаФайлаНаДиске = ФайлВерсии.ПолучитьВремяИзменения(); + РазмерФайлаНаДиске = ФайлВерсии.Размер(); + РазмерФайлаВБазе = ДанныеФайла.Размер; + + РазницаДат = ДатаФайлаНаДиске - ДатаФайлаВБазе; + Если РазницаДат < 0 Тогда + РазницаДат = -РазницаДат; + КонецЕсли; + + Если РазницаДат <= 1 Тогда // 1 секунда - допустимая разница (на Win95 может быть такое) + // Дата одинаковая, но размер отличается - странно, но возможно + Если РазмерФайлаВБазе <> 0 И РазмерФайлаНаДиске <> РазмерФайлаВБазе Тогда + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("РазмерФайлаНаСервере", РазмерФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("РазмерВРабочемКаталоге", РазмерФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Сообщение", НСтр("ru = 'Размер файла в рабочем каталоге и на сервере отличается. Перезаписать файл в рабочем каталоге?'")); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.РазмерФайлаВРабочемКаталогеОтличается", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Да Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла, Ложь); // в рабочем каталоге настройка подтверждения при удалении не используется + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Открыть существующий + Возврат Истина; + Иначе // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + // Все совпадает - и дата, и размер + Если ВРабочемКаталогеНаЧтение = НаЧтение Тогда + Возврат Истина; + Иначе + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьВРабочемКаталоге(ДанныеФайла.Версия, ИмяФайлаСПутем, НаЧтение, ВРабочемКаталогеВладельца); + Возврат Истина; + КонецЕсли; + ИначеЕсли ДатаФайлаНаДиске < ДатаФайлаВБазе Тогда // В рабочем каталоге более старый + Если ВРабочемКаталогеНаЧтение = Ложь Тогда // В рабочем каталоге на редактирование + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("ВремяИзмененияНаСервере", ДатаФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("ВРабочемКаталоге", ДатаФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Заголовок", "В рабочем каталоге более старый файл"); + + Сообщение = НСтр("ru = 'Файл на локальном компьютере, отмеченный как взятый на редактирование, имеет более раннюю дату изменения, чем на сервере. Открыть файл из локального каталога или взять с сервера и перезаписать?'"); + ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВРабочемКаталогеБолееНовыйФайл", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Да Тогда // Открыть существующий + Возврат Истина; + ИначеЕсли Ответ = КодВозвратаДиалога.Отмена Тогда // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла, Ложь); // в рабочем каталоге настройка подтверждения при удалении не используется + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + Иначе // В рабочем каталоге на чтение + // Перезапишем ни о чем не спросив + УдалитьФайл(ПолноеИмяФайла, Ложь); // в рабочем каталоге настройка подтверждения при удалении не используется + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + ИначеЕсли ДатаФайлаНаДиске > ДатаФайлаВБазе Тогда // В рабочем каталоге более новый (изменен пользователем со стороны) + + Если ВРабочемКаталогеНаЧтение = Ложь Тогда // В рабочем каталоге на редактирование + Возврат Истина; // Ничего делать не надо + Иначе // В рабочем каталоге на чтение + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("ВремяИзмененияНаСервере", ДатаФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("ВРабочемКаталоге", ДатаФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Заголовок", "В рабочем каталоге более новый файл"); + + Сообщение = НСтр("ru = 'Файл на локальном компьютере, отмеченный как взятый на редактирование, имеет более позднюю дату изменения, чем на сервере. Открыть файл из локального каталога или взять с сервера и перезаписать?'"); + ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВРабочемКаталогеБолееНовыйФайл", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Да Тогда // Открыть существующий + Возврат Истина; + ИначеЕсли Ответ = КодВозвратаДиалога.Отмена Тогда // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла, Ложь); // в рабочем каталоге настройка подтверждения при удалении не используется + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайла, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + Возврат Ложь; + КонецЕсли; + + + Возврат Ложь; +КонецФункции // ПолучитьФайлВерсииВРабочийКаталог() + +// Получить Файл из информационной базы на локальный диск и возвращает путь +//к этому файлу в параметре +Функция ПолучитьФайлВерсииВРабочийКаталог(ДанныеФайла, ПолноеИмяФайла, ИдентификаторФормы = Неопределено) Экспорт + + ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + Если ИмяКаталога = Неопределено ИЛИ ПустаяСтрока(ИмяКаталога) Тогда + Возврат Ложь; + КонецЕсли; + + РабочийКаталогВладельца = ДанныеФайла.РабочийКаталогВладельца; + + НаЧтение = ДанныеФайла.НаЧтение; + Если (НаЧтение И РабочийКаталогВладельца = "") Или ДанныеФайла.Версия <> ДанныеФайла.ТекущаяВерсия Тогда + Возврат ПолучитьФайлВерсииВЛокальныйКэшФайловНаЧтение(ДанныеФайла, ПолноеИмяФайла, ИдентификаторФормы); + ИначеЕсли РабочийКаталогВладельца = "" Тогда + Возврат ПолучитьФайлВерсииВЛокальныйКэшФайловНаРедактирование(ДанныеФайла, ПолноеИмяФайла, ИдентификаторФормы); + ИначеЕсли НаЧтение И РабочийКаталогВладельца <> "" Тогда + Возврат ПолучитьФайлВерсииВРабочийКаталогНаЧтение(ДанныеФайла, ПолноеИмяФайла, ИдентификаторФормы); + ИначеЕсли НаЧтение = Ложь И РабочийКаталогВладельца <> "" Тогда + Возврат ПолучитьФайлВерсииВРабочийКаталогНаРедактирование(ДанныеФайла, ПолноеИмяФайла, ИдентификаторФормы); + КонецЕсли; + +КонецФункции // ПолучитьФайлВерсииВРабочийКаталог() + +// Получить Файл с сервера и зарегистрировать в рабочем каталоге +Функция ПолучитьССервераИЗарегистрироватьВРабочемКаталоге(ДанныеФайла, ПолноеИмяФайлаВРабочемКаталоге, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы) + + ПолноеИмяФайла = ""; + + ДатаФайлаВБазе = ДанныеФайла.ДатаМодификацииУниверсальная; + ОбщегоНазначенияКлиент.ПреобразоватьЗимнееВремяКТекущему(ДатаФайлаВБазе); + + ПроинициализироватьПутьКРабочемуКаталогу(); + + ВРабочемКаталогеНаЧтение = Истина; + ВРабочемКаталогеВладельца = Ложь; + ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(ДанныеФайла, ДанныеФайла.Версия, ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + Если ФайлВРабочемКаталоге Тогда + // Получаем путь файла в рабочем каталоге - с проверкой на уникальность + ИмяФайлаСПутем = ПолноеИмяФайла; + Если ИмяФайлаСПутем = "" Тогда + Предупреждение(НСтр("ru = 'Ошибка помещения файла в рабочий каталог.'")); + Возврат Ложь; + КонецЕсли; + + // Ниже - уже известно, что Файл в рабочем каталоге есть. + // Надо проверить его дату модификации и принять решение что делать дальше + // - перезаписать, спросить пользователя и т.д. + + ФайлВерсии = Новый Файл(ПолноеИмяФайла); + ДатаФайлаНаДиске = ФайлВерсии.ПолучитьВремяИзменения(); + РазмерФайлаНаДиске = ФайлВерсии.Размер(); + РазмерФайлаВБазе = ДанныеФайла.Размер; + + РазницаДат = ДатаФайлаНаДиске - ДатаФайлаВБазе; + Если РазницаДат < 0 Тогда + РазницаДат = -РазницаДат; + КонецЕсли; + + Если РазницаДат <= 1 Тогда // 1 секунда - допустимая разница (на Win95 может быть такое) + // Дата одинаковая, но размер отличается - странно, но возможно + Если РазмерФайлаВБазе <> 0 И РазмерФайлаНаДиске <> РазмерФайлаВБазе Тогда + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("РазмерФайлаНаСервере", РазмерФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("РазмерВРабочемКаталоге", РазмерФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Сообщение", НСтр("ru = 'Размер файла в рабочем каталоге и на сервере отличается. Перезаписать файл в рабочем каталоге?'")); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.РазмерФайлаВРабочемКаталогеОтличается", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Да Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла, Ложь); // в рабочем каталоге настройка подтверждения при удалении не используется + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Открыть существующий + Возврат Истина; + Иначе // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + // Все совпадает - и дата, и размер - удаляем и потом получаем в рабочий каталог папки + УдалитьФайл(ПолноеИмяФайла, Ложь); // в рабочем каталоге настройка подтверждения при удалении не используется + + ИначеЕсли ДатаФайлаНаДиске < ДатаФайлаВБазе Тогда // В рабочем каталоге более старый + Если ВРабочемКаталогеНаЧтение = Ложь Тогда // В рабочем каталоге на редактирование + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("ВремяИзмененияНаСервере", ДатаФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("ВРабочемКаталоге", ДатаФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Заголовок", "В рабочем каталоге более старый файл"); + + Сообщение = НСтр("ru = 'Файл на локальном компьютере, отмеченный как взятый на редактирование, имеет более раннюю дату изменения, чем на сервере. Открыть файл из локального каталога или взять с сервера и перезаписать?'"); + ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВРабочемКаталогеБолееНовыйФайл", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Да Тогда // Открыть существующий + Возврат Истина; + ИначеЕсли Ответ = КодВозвратаДиалога.Отмена Тогда // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла, Ложь); // в рабочем каталоге настройка подтверждения при удалении не используется + КонецЕсли; + Иначе // В рабочем каталоге на чтение + // Перезапишем ни о чем не спросив + УдалитьФайл(ПолноеИмяФайла, Ложь); // в рабочем каталоге настройка подтверждения при удалении не используется + КонецЕсли; + ИначеЕсли ДатаФайлаНаДиске > ДатаФайлаВБазе Тогда // В рабочем каталоге более новый (изменен пользователем со стороны) + ЗанятМной = (ДанныеФайла.Редактирует = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ТекущийПользователь); + Если (ВРабочемКаталогеНаЧтение = Ложь) И ЗанятМной Тогда // В рабочем каталоге на редактирование и занят текущим пользователем + Возврат Истина; // Ничего делать не надо - т.е. не надо удалять из локал кеш и класть в рабочий каталог - т.к. пропадут изменения + Иначе // В рабочем каталоге на чтение + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ИмяФайлаСПутем); + ПараметрыОткрытияФормы.Вставить("ВремяИзмененияНаСервере", ДатаФайлаВБазе); + ПараметрыОткрытияФормы.Вставить("ВРабочемКаталоге", ДатаФайлаНаДиске); + ПараметрыОткрытияФормы.Вставить("Заголовок", "В рабочем каталоге более новый файл"); + + Сообщение = НСтр("ru = 'Файл на локальном компьютере имеет более позднюю дату, возможно, он был изменен. Открыть существующий или взять с сервера и перезаписать?'"); + ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); + + Результат = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВРабочемКаталогеБолееНовыйФайл", ПараметрыОткрытияФормы); + + Если Результат = КодВозвратаДиалога.Да Тогда // Открыть существующий + Возврат Истина; + ИначеЕсли Результат = КодВозвратаДиалога.Отмена Тогда // Выйти ничего не делая + ПолноеИмяФайла = ""; + Возврат Ложь; + ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда // Перезаписать + УдалитьФайл(ПолноеИмяФайла, Ложь); // в рабочем каталоге настройка подтверждения при удалении не используется + КонецЕсли; + + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ДанныеФайла, ПолноеИмяФайлаВРабочемКаталоге, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы); +КонецФункции + +// Функция предназначена для открытия файла соответствующим приложением +// +Процедура ОткрытьФайлПриложением(ДанныеФайла, ИмяОткрываемогоФайла) + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если РасширениеПодключено Тогда + // Открыть Файл + Попытка + + ЗапуститьПриложение(ИмяОткрываемогоФайла); + + Исключение + + Инфо = ИнформацияОбОшибке(); + Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Описание=""%1""'"), + Инфо.Описание)); + + КонецПопытки; + КонецЕсли; +КонецПроцедуры // ОткрытьФайл() + +// Сохранение на диск Файла +// +Функция СохранитьКак(ДанныеФайла) Экспорт + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + РасширениеПодключеноКрипто = ПодключитьРасширениеРаботыСКриптографией(); + + Если РасширениеПодключено Тогда + + // проверим - если файл уже есть в кеше, и он новее чем в базе - дадим диалог с выбором + ПутьКФайлуВКеше = ""; + Если ДанныеФайла.РедактируетТекущийПользователь Тогда + ПроинициализироватьПутьКРабочемуКаталогу(); + ВРабочемКаталогеНаЧтение = Истина; + ВРабочемКаталогеВладельца = Ложь; + ПолноеИмяФайла = ""; + ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(ДанныеФайла, ДанныеФайла.Версия, ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + + Если ФайлВРабочемКаталоге = Истина Тогда + + ДатаФайлаВБазе = ДанныеФайла.ДатаМодификацииУниверсальная; + ОбщегоНазначенияКлиент.ПреобразоватьЗимнееВремяКТекущему(ДатаФайлаВБазе); + + ФайлВерсии = Новый Файл(ПолноеИмяФайла); + ДатаФайлаНаДиске = ФайлВерсии.ПолучитьВремяИзменения(); + + Если ДатаФайлаНаДиске > ДатаФайлаВБазе Тогда // В рабочем каталоге более новый (изменен пользователем со стороны) + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ПолноеИмяФайла); + + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Дата изменения файла ""%1"" на локальном компьютере более поздняя, чем в информационной базе. Возможно, он был изменен.'"), + Строка(ДанныеФайла.Ссылка)); + ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); + + Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.РежимСозданияФайлаДляСохранитьКак", ПараметрыОткрытияФормы); + + Если Ответ = КодВозвратаДиалога.Отмена ИЛИ Ответ = Неопределено Тогда + Возврат ""; + КонецЕсли; + + Если Ответ = 1 Тогда // На основе файла на локальном компьютере + ПутьКФайлуВКеше = ПолноеИмяФайла; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + ПутьВыбора = ДанныеФайла.ПапкаДляСохранитьКак; + Если ПутьВыбора = Неопределено ИЛИ ПутьВыбора = "" Тогда + + ПутьВыбора = ""; + #Если НЕ ВебКлиент Тогда + + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Данная операция не поддерживается в базовой версии.'")); + Возврат ""; + КонецЕсли; + + Оболочка = Новый COMОбъект("MSScriptControl.ScriptControl"); + Оболочка.Language = "vbscript"; + Оболочка.AddCode(" + |Function SpecialFoldersName(Name) + |set Shell=CreateObject(""WScript.Shell"") + |SpecialFoldersName=Shell.SpecialFolders(Name) + |End Function"); + ПутьВыбора = Оболочка.Run("SpecialFoldersName", "MyDocuments"); + #КонецЕсли + + КонецЕсли; + + Пароль = ""; + СохранятьСРасшифровкой = Ложь; + РасширениеДляЗашифрованныхФайлов = ""; + Если ДанныеФайла.Зашифрован Тогда + + ПредставленияСертификатов = ""; + Для Каждого СтруктураСертификата Из ДанныеФайла.МассивСертификатовШифрования Цикл + + Отпечаток = СтруктураСертификата.Отпечаток; + + ТолькоВЛичномХранилище = Истина; + Сертификат = ЭлектронноЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище); + Если Сертификат <> Неопределено Тогда // тут собираем только личные сертификаты - с закрытым ключом + Если НЕ ПустаяСтрока(ПредставленияСертификатов) Тогда + ПредставленияСертификатов = ПредставленияСертификатов + Символы.ПС; + КонецЕсли; + ПредставленияСертификатов = ПредставленияСертификатов + СтруктураСертификата.Представление; + КонецЕсли; + + КонецЦикла; + + Заголовок = НСтр("ru = 'Выбор режима сохранения'"); + ПараметрыФормы = Новый Структура("Заголовок, ПредставленияСертификатов", + Заголовок, ПредставленияСертификатов); + КодВозврата = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВыборСохраненияШифрованногоФайла", ПараметрыФормы); + Если ТипЗнч(КодВозврата) = Тип("Структура") Тогда + + Пароль = КодВозврата.Пароль; + РасширениеДляЗашифрованныхФайлов = КодВозврата.РасширениеДляЗашифрованныхФайлов; + + Если КодВозврата.СохранятьСРасшифровкой = 1 Тогда + СохранятьСРасшифровкой = Истина; + Иначе + СохранятьСРасшифровкой = Ложь; + КонецЕсли; + + Иначе + Возврат ""; + КонецЕсли; + + КонецЕсли; + + ИмяСРасширением = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + Расширение = ДанныеФайла.Расширение; + + Если НЕ СохранятьСРасшифровкой Тогда + ИмяСРасширением = ИмяСРасширением + "." + РасширениеДляЗашифрованныхФайлов; + Расширение = РасширениеДляЗашифрованныхФайлов; + КонецЕсли; + + // выбираем путь к файлу на диске + ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); + ВыборФайла.МножественныйВыбор = Ложь; + ВыборФайла.ПолноеИмяФайла = ИмяСРасширением; + Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Все файлы (*.%1)|*.%1'"), Расширение, Расширение); + ВыборФайла.Фильтр = Фильтр; + ВыборФайла.Каталог = ПутьВыбора; + + Если ВыборФайла.Выбрать() Тогда + + АдресФайла = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; + + ИмяФайла = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + РазмерВМб = ДанныеФайла.Размер / (1024 * 1024); + + ТекстПояснения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется сохранение файла ""%1"" (%2 Мб)... + |Пожалуйста, подождите.'"), + ИмяФайла, ?(РазмерВМб >= 1, Формат(РазмерВМб, "ЧДЦ=0"), Формат(РазмерВМб, "ЧДЦ=1; ЧН=0"))); + + Состояние(ТекстПояснения); + + Файл = Новый Файл(ВыборФайла.ПолноеИмяФайла); + Если Файл.Существует() Тогда + Если ПутьКФайлуВКеше <> ВыборФайла.ПолноеИмяФайла Тогда + Файл.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ВыборФайла.ПолноеИмяФайла); + КонецЕсли; + КонецЕсли; + + Если ПутьКФайлуВКеше = "" Тогда + + ПередаваемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(ВыборФайла.ПолноеИмяФайла, АдресФайла); + ПередаваемыеФайлы.Добавить(Описание); + + ПутьКФайлу = Файл.Путь; + Если Прав(ПутьКФайлу,1) <> "\" Тогда + ПутьКФайлу = ПутьКФайлу + "\"; + КонецЕсли; + + // Сохраним Файл из БД на диск + Если ПолучитьФайлы(ПередаваемыеФайлы,, ПутьКФайлу, Ложь) Тогда + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда + УдалитьИзВременногоХранилища(АдресФайла); + КонецЕсли; + + Если СохранятьСРасшифровкой Тогда + ИмяФайлаСПутем = ВыборФайла.ПолноеИмяФайла; + + Попытка + МенеджерКриптографии = ЭлектронноЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Пароль; + + ИмяФайлаСПутемРасшифрованное = ИмяФайлаСПутем + ".dec"; + МенеджерКриптографии.Расшифровать(ИмяФайлаСПутем, ИмяФайлаСПутемРасшифрованное); + + УдалитьФайлы(ИмяФайлаСПутем); + ПереместитьФайл(ИмяФайлаСПутемРасшифрованное, ИмяФайлаСПутем); + Исключение + УдалитьФайлы(ИмяФайлаСПутем); + ВызватьИсключение; + КонецПопытки; + КонецЕсли; + + + НовыйФайл = Новый Файл(ВыборФайла.ПолноеИмяФайла); + + ДатаСоздаваемогоФайлаНаДиске = ДанныеФайла.ДатаМодификацииУниверсальная; + ОбщегоНазначенияКлиент.ПреобразоватьЗимнееВремяКТекущему(ДатаСоздаваемогоФайлаНаДиске); + + НовыйФайл.УстановитьВремяИзменения(ДатаСоздаваемогоФайлаНаДиске); + + Состояние(НСтр("ru = 'Файл успешно сохранен'"), , ВыборФайла.ПолноеИмяФайла); + КонецЕсли; + Иначе + Если ПутьКФайлуВКеше <> ВыборФайла.ПолноеИмяФайла Тогда + КопироватьФайл(ПутьКФайлуВКеше, ВыборФайла.ПолноеИмяФайла); + КонецЕсли; + Состояние(НСтр("ru = 'Файл успешно сохранен'"), , ВыборФайла.ПолноеИмяФайла); + КонецЕсли; + + ПутьВыбораПрежний = ПутьВыбора; + Файл = Новый Файл(ВыборФайла.ПолноеИмяФайла); + ПутьВыбора = Файл.Путь; + Если ПутьВыбораПрежний <> ПутьВыбора Тогда + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПапкаДляСохранитьКак", ПутьВыбора); + КонецЕсли; + + Возврат ВыборФайла.ПолноеИмяФайла; + КонецЕсли; + + Иначе // веб клиент + АдресФайла = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; + + ИмяФайла = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + РазмерВМб = ДанныеФайла.Размер / (1024 * 1024); + + ТекстПояснения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется сохранение файла ""%1"" (%2 Мб)... + |Пожалуйста, подождите.'"), + ИмяФайла, ?(РазмерВМб >= 1, Формат(РазмерВМб, "ЧДЦ=0"), Формат(РазмерВМб, "ЧДЦ=1; ЧН=0"))); + + Состояние(ТекстПояснения); + + // Сохраним Файл из БД на диск + ПолучитьФайл(АдресФайла, ИмяФайла, Истина); + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда + УдалитьИзВременногоХранилища(АдресФайла); + КонецЕсли; + КонецЕсли; + + Возврат ""; +КонецФункции + +// открыть Windows проводник, выбрав в нем указанный файл +Функция ОткрытьПроводникСФайлом(Знач ПолноеИмяФайла) Экспорт + #Если НЕ ВебКлиент Тогда + Если ПолноеИмяФайла <> "" Тогда + ФайлНаДиске = Новый Файл(ПолноеИмяФайла); + Если ФайлНаДиске.Существует() Тогда + + Если Лев(ПолноеИмяФайла, 0) <> """" Тогда + ПолноеИмяФайла = """" + ПолноеИмяФайла + """"; + КонецЕсли; + + Парам = "explorer.exe /select, " + ПолноеИмяФайла; + ЗапуститьПриложение(Парам); + Возврат Истина; + КонецЕсли; + КонецЕсли; + #КонецЕсли + + Возврат Ложь; +КонецФункции + +// Процедура открывает проводник Windows, позиционируясь на Файл +// +Процедура КаталогФайла(ДанныеФайла) Экспорт + + // Если Файл без файла - эта операция не имеет смысла + Если ДанныеФайла.Версия.Пустая() Тогда + Возврат; + КонецЕсли; + + #Если НЕ ВебКлиент Тогда + ПолноеИмяФайла = ФайловыеФункцииКлиент.ПолучитьПутьФайлаВРабочемКаталоге(ДанныеФайла); + Если ОткрытьПроводникСФайлом(ПолноеИмяФайла) = Истина Тогда + Возврат; + КонецЕсли; + + ИмяФайла = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + + КодВозврата = Вопрос(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" отсутствует в рабочем каталоге! Получить файл с сервера?'"), ИмяФайла), + РежимДиалогаВопрос.ДаНет); + + Если КодВозврата = КодВозвратаДиалога.Да Тогда + ПолучитьФайлВерсииВРабочийКаталог(ДанныеФайла, ПолноеИмяФайла); + ОткрытьПроводникСФайлом(ПолноеИмяФайла); + КонецЕсли; + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии) Тогда + УдалитьИзВременногоХранилища(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии); + КонецЕсли; + #Иначе + Предупреждение(НСтр("ru = 'В Веб-клиенте данная функция не поддерживается.'")); + #КонецЕсли +КонецПроцедуры + +// Открывает диалог вопроса со списком Файлов или информации о Файлах +// +Функция ДиалогВопросаСоСписком(Список, СообщениеВопрос, СообщениеЗаголовок, Заголовок) + Параметры = Новый Структура; + Параметры.Вставить("СообщениеВопрос", СообщениеВопрос); + Параметры.Вставить("СообщениеЗаголовок", СообщениеЗаголовок); + Параметры.Вставить("Заголовок", Заголовок); + Параметры.Вставить("Файлы", Список); + + Результат = ОткрытьФормуМодально("Справочник.Файлы.Форма.ФормаВопроса", Параметры); + Возврат (Результат = КодВозвратаДиалога.Да); + +КонецФункции + +// Обработчик события Перетаскивание в формах объектов - владельцев Файл (кроме формы ХранилищеФайлов) +// +Процедура ОбработкаПеретаскиванияВЛинейныйСписок(ПараметрыПеретаскивания, ВладелецФайлаСписка, ЭтаФорма, + НеОткрыватьКарточкуПослеСозданияИзФайла = Неопределено) Экспорт + + Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") И ПараметрыПеретаскивания.Значение.ЭтоФайл() = Истина Тогда + + СоздатьДокументНаОсновеФайла(ПараметрыПеретаскивания.Значение.ПолноеИмя, ВладелецФайлаСписка, ЭтаФорма, НеОткрыватьКарточкуПослеСозданияИзФайла); + + ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") И ПараметрыПеретаскивания.Значение.ЭтоФайл() = Ложь Тогда + + Предупреждение(Нстр("ru = 'Выберите для импорта только файлы, но не каталоги.'")); + Возврат; + + ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("СправочникСсылка.Файлы") Тогда + + ПеренестиФайлВПриложенныеФайлы(ПараметрыПеретаскивания.Значение, ВладелецФайлаСписка); + + ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда + + Если ПараметрыПеретаскивания.Значение.Количество() >= 1 И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Файл") Тогда + Для Каждого ФайлПринятый Из ПараметрыПеретаскивания.Значение Цикл + Если Не ФайлПринятый.ЭтоФайл() Тогда // только файлы, но не каталоги + Предупреждение(Нстр("ru = 'Выберите для импорта только файлы, но не каталоги.'")); + Возврат; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если ПараметрыПеретаскивания.Значение.Количество() >= 1 И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Файл") Тогда + Для Каждого ФайлПринятый Из ПараметрыПеретаскивания.Значение Цикл + НеОткрыватьКарточкуПослеСозданияИзФайла = Истина; + СоздатьДокументНаОсновеФайла(ФайлПринятый.ПолноеИмя, ВладелецФайлаСписка, ЭтаФорма, НеОткрыватьКарточкуПослеСозданияИзФайла); + КонецЦикла; + КонецЕсли; + + Если ПараметрыПеретаскивания.Значение.Количество() >= 1 И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("СправочникСсылка.Файлы") Тогда + ПеренестиФайлыВПриложенныеФайлы(ПараметрыПеретаскивания.Значение, ВладелецФайлаСписка); + КонецЕсли; + + КонецЕсли; +КонецПроцедуры + +// переносит файл из одного списка приложенных файлов в другой +Процедура ПеренестиФайлВПриложенныеФайлы(ФайлСсылка, ВладелецФайла) + + Результат = РаботаСФайлами.ПолучитьДанныеДляПереносаВПриложенныеФайлы(ФайлСсылка, ВладелецФайла).Получить(ФайлСсылка); + + Если Результат = "Скопировать" Тогда + + СозданФайл = РаботаСФайлами.СкопироватьФайлВПриложенных(ФайлСсылка, ВладелецФайла); + Оповестить("СозданФайл", Новый Структура("Владелец, Файл", ВладелецФайла, СозданФайл)); + + ПоказатьОповещениеПользователя( + "Создание:", + ПолучитьНавигационнуюСсылку(СозданФайл), + Строка(СозданФайл), + БиблиотекаКартинок.Информация32); + + ИначеЕсли Результат = "Обновить" Тогда + + ОбновленФайл = РаботаСФайлами.ОбновитьФайлВПриложенных(ФайлСсылка, ВладелецФайла); + + ПоказатьОповещениеПользователя( + "Изменение:", + ПолучитьНавигационнуюСсылку(ОбновленФайл), + Строка(ОбновленФайл), + БиблиотекаКартинок.Информация32); + + КонецЕсли; + +КонецПроцедуры + +// переносит файлы из одного списка приложенных файлов в другой +Процедура ПеренестиФайлыВПриложенныеФайлы(МассивФайлов, ВладелецФайла) + + Если МассивФайлов.Количество() = 1 Тогда + ПеренестиФайлВПриложенныеФайлы(МассивФайлов[0], ВладелецФайла); + Иначе + + Результат = РаботаСФайлами.ПолучитьДанныеДляПереносаВПриложенныеФайлы(МассивФайлов, ВладелецФайла); + + МассивОбновить = Новый Массив; + МассивСкопировать = Новый Массив; + Для Каждого ФайлСсылка Из МассивФайлов Цикл + Если Результат.Получить(ФайлСсылка) = "Скопировать" Тогда + МассивСкопировать.Добавить(ФайлСсылка); + ИначеЕсли Результат.Получить(ФайлСсылка) = "Обновить" Тогда + МассивОбновить.Добавить(ФайлСсылка); + КонецЕсли; + КонецЦикла; + + Если МассивСкопировать.Количество() > 0 Тогда + РаботаСФайлами.СкопироватьФайлВПриложенных(МассивСкопировать, ВладелецФайла); + КонецЕсли; + + Если МассивОбновить.Количество() > 0 Тогда + РаботаСФайлами.ОбновитьФайлВПриложенных(МассивОбновить, ВладелецФайла); + КонецЕсли; + + ОбщееКоличество = МассивСкопировать.Количество() + МассивОбновить.Количество(); + Если ОбщееКоличество > 0 Тогда + + ПолноеОписание = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файлы (%1 шт) перенесены в %2'"), + ОбщееКоличество, + ВладелецФайла); + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Файлы перенесены'"), + , + ПолноеОписание, + БиблиотекаКартинок.Информация32); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Выбирает на диске файл и создает из него новую версию - реализация низкоуровневая +Процедура ОбновитьИзФайлаНаДискеРеализация(ДанныеФайла, ИдентификаторФормы, ДиалогПолноеИмяФайла, + СоздатьНовуюВерсию = Неопределено, КомментарийКВерсии = Неопределено) Экспорт + + // данные файла могли измениться - обновим + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаИРабочийКаталог(ДанныеФайла.Ссылка); + + ПредыдущаяВерсия = ДанныеФайла.Версия; + + ФайлНаДиске = Новый Файл(ДиалогПолноеИмяФайла); + ИмяИРасширениеФайлаНаДиске = ФайлНаДиске.Имя; + ИмяИРасширениеФайлаВБазе = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + ВремяИзмененияВыбранное = ФайлНаДиске.ПолучитьВремяИзменения(); + + РедактируетТекущийПользователь = ДанныеФайла.РедактируетТекущийПользователь; + + ДатаФайлаВБазе = ДанныеФайла.ДатаМодификацииУниверсальная; + ОбщегоНазначенияКлиент.ПреобразоватьЗимнееВремяКТекущему(ДатаФайлаВБазе); + + Если ВремяИзмененияВыбранное < ДатаФайлаВБазе Тогда // в кеше более новый + СтрокаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" на сервере имеет более позднюю дату изменения (%2), чем выбранный файл (%3). + |Операция прервана.'"), + Строка(ДанныеФайла.Ссылка), ДатаФайлаВБазе, ВремяИзмененияВыбранное); + Предупреждение(СтрокаОшибки); + Возврат; + КонецЕсли; + + + // проверим - есть ли файл в локальном кеше + ПроинициализироватьПутьКРабочемуКаталогу(); + ВРабочемКаталогеНаЧтение = Истина; + ВРабочемКаталогеВладельца = Ложь; + ПолноеИмяФайла = ""; + ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(Неопределено, ПредыдущаяВерсия, ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + + Если РедактируетТекущийПользователь Тогда // файл уже был занят + + Если ФайлВРабочемКаталоге = Истина Тогда + ФайлВКеше = Новый Файл(ПолноеИмяФайла); + ВремяИзмененияВКеше = ФайлВКеше.ПолучитьВремяИзменения(); + + Если ВремяИзмененияВыбранное < ВремяИзмененияВКеше Тогда // в кеше более новый + СтрокаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" в рабочем каталоге имеет более позднюю дату изменения (%2), чем выбранный файл (%3). + |Операция прервана.'"), + Строка(ДанныеФайла.Ссылка), ВремяИзмененияВКеше, ВремяИзмененияВыбранное); + Предупреждение(СтрокаОшибки); + Возврат; + КонецЕсли; + + #Если НЕ ВебКлиент Тогда + Попытка + // проверяем что файл занят приложением + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.Прочитать(ПолноеИмяФайла); + Исключение + СтрокаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл в основном рабочем каталоге + |""%1"" + |открыт для редактирования. + |Закончите редактирование перед выполнением обновления из файла на диске.'"), + ПолноеИмяФайла); + Предупреждение(СтрокаОшибки); + Возврат; + КонецПопытки; + #КонецЕсли + + КонецЕсли; + + КонецЕсли; + + Если ФайлВРабочемКаталоге И ИмяИРасширениеФайлаНаДиске <> ИмяИРасширениеФайлаВБазе Тогда + Попытка + ФайловыеФункцииКлиент.УдалитьФайлИзРабочегоКаталога(ДанныеФайла.ТекущаяВерсия, Истина); + ФайлВРабочемКаталоге = Ложь; + Исключение + Инфо = ИнформацияОбОшибке(); + Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Описание=""%1""'"), Инфо.Описание)); + + Возврат; + КонецПопытки; + КонецЕсли; + + Если Не РедактируетТекущийПользователь Тогда + + СтрокаОшибки = ""; + Если Не РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки) Тогда + Предупреждение(СтрокаОшибки); + Возврат; + КонецЕсли; + + СтрокаОшибки = ""; + Если Не РаботаСФайлами.ЗанятьФайл(ДанныеФайла, СтрокаОшибки, ИдентификаторФормы) Тогда + Предупреждение(СтрокаОшибки); + Возврат; + КонецЕсли; + + НаЧтение = Ложь; + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + + КонецЕсли; + + ПереданныйПолныйПутьКФайлу = ""; + + Если ФайлВРабочемКаталоге Тогда + КопироватьФайл(ДиалогПолноеИмяФайла, ПолноеИмяФайла); + Иначе + ПереданныйПолныйПутьКФайлу = ДиалогПолноеИмяФайла; + КонецЕсли; + + Если РедактируетТекущийПользователь Тогда // файл уже был занят + + ОпубликоватьФайл(ДанныеФайла.Ссылка, + ИдентификаторФормы, + Неопределено, + Неопределено, + Неопределено, + Неопределено, + ПереданныйПолныйПутьКФайлу, + СоздатьНовуюВерсию, + КомментарийКВерсии); + + Иначе + + ЗакончитьРедактирование( + ДанныеФайла.Ссылка, + ИдентификаторФормы, + ДанныеФайла.ХранитьВерсии, + ДанныеФайла.РедактируетТекущийПользователь, + ДанныеФайла.Редактирует, + ДанныеФайла.АвторТекущейВерсии, + ПереданныйПолныйПутьКФайлу, + СоздатьНовуюВерсию, + КомментарийКВерсии); + + КонецЕсли; + + Если ИмяИРасширениеФайлаНаДиске <> ИмяИРасширениеФайлаВБазе ИЛИ НЕ ФайлВРабочемКаталоге Тогда + + // обновим данные + ДанныеФайла = РаботаСФайлами.ПолучитьДанныеФайлаДляОткрытия( + ДанныеФайла.Ссылка, Неопределено, ИдентификаторФормы); + + // получим в кеш + ПолучитьФайлВерсииВРабочийКаталог(ДанныеФайла, ПолноеИмяФайла); + КонецЕсли; +КонецПроцедуры + +// Выбирает на диске файл и создает из него новую версию +// +Процедура ОбновитьИзФайлаНаДиске(ДанныеФайла, ИдентификаторФормы) Экспорт + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + Если РасширениеПодключено Тогда + + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + + ПутьВыбора = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПрограммы", "ПапкаДляОбновитьИзФайла"); + Если ПутьВыбора = Неопределено ИЛИ ПутьВыбора = "" Тогда + + #Если НЕ ВебКлиент Тогда + + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Данная операция не поддерживается в базовой версии.'")); + Возврат; + КонецЕсли; + + Оболочка = Новый COMОбъект("MSScriptControl.ScriptControl"); + Оболочка.Language = "vbscript"; + Оболочка.AddCode(" + |Function SpecialFoldersName(Name) + |set Shell=CreateObject(""WScript.Shell"") + |SpecialFoldersName=Shell.SpecialFolders(Name) + |End Function"); + ПутьВыбора = Оболочка.Run("SpecialFoldersName", "MyDocuments"); + #Иначе + ПутьВыбора = ""; + #КонецЕсли + КонецЕсли; + + Диалог.Заголовок = НСтр("ru = 'Выбор файла'"); + Диалог.ПредварительныйПросмотр = Ложь; + Диалог.ПроверятьСуществованиеФайла = Ложь; + Диалог.МножественныйВыбор = Ложь; + Диалог.Каталог = ПутьВыбора; + Диалог.ПолноеИмяФайла = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + Диалог.Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл (*.%1)|*.%1|Все файлы (*.*)|*.*'"), ДанныеФайла.Расширение, ДанныеФайла.Расширение); + + Если Диалог.Выбрать() Тогда + + ПутьВыбораПрежний = ПутьВыбора; + ФайлНаДиске = Новый Файл(Диалог.ПолноеИмяФайла); + ПутьВыбора = ФайлНаДиске.Путь; + Если ПутьВыбораПрежний <> ПутьВыбора Тогда + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПапкаДляОбновитьИзФайла", ПутьВыбора); + КонецЕсли; + + ОбновитьИзФайлаНаДискеРеализация(ДанныеФайла, ИдентификаторФормы, Диалог.ПолноеИмяФайла); + + КонецЕсли; + + КонецЕсли; +КонецПроцедуры + +Процедура ПоказатьЗанятыеФайлыПриЗавершенииРаботы(Отказ) Экспорт + + ТекущийПользователь = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ТекущийПользователь; + + ЗанятыеФайлы = РаботаСФайлами.ПолучитьЗанятыеФайлы(, ТекущийПользователь); + Если ЗанятыеФайлы.Количество() > 0 Тогда + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("СообщениеВопрос", НСТР("ru = 'Завершить работу с программой?'")); + ПараметрыФормы.Вставить("СообщениеЗаголовок", НСТР("ru = 'Следующие файлы заняты вами для редактирования:'")); + ПараметрыФормы.Вставить("Заголовок", НСТР("ru = 'Завершение работы'")); + ПараметрыФормы.Вставить("Редактирует", ТекущийПользователь); + + Результат = ОткрытьФормуМодально("Справочник.Файлы.Форма.СписокЗанятыхСВопросом", ПараметрыФормы); + Если Результат <> КодВозвратаДиалога.Да Тогда + Отказ = Истина; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// сохраняет путь к каталогу в настройках +Процедура СохранитьПутьККаталогуВНастройках(ИмяКаталога) + РаботаСФайлами.СохранитьПутьКРабочемуКаталогуПользователя(ИмяКаталога); + ОбновитьПовторноИспользуемыеЗначения(); +КонецПроцедуры + +// Проинициализировать параметр сеанса ПутьКРабочемуКаталогуПользователя, проверив корректность пути, и откорректировав если нужно +Процедура ПроинициализироватьПутьКРабочемуКаталогу() Экспорт + ПараметрСеансаРабочийКаталог = РаботаСФайламиКлиентПовтИсп.ПолучитьПараметрСеансаРабочийКаталог(); + Если Не ПустаяСтрока(ПараметрСеансаРабочийКаталог) Тогда // уже проинициализировано + Возврат; + КонецЕсли; + + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + Если ИмяКаталога = Неопределено Тогда + ИмяКаталога = ФайловыеФункцииКлиент.ПолучитьПутьККаталогуДанныхПользователя(); + Если Не ПустаяСтрока(ИмяКаталога) Тогда + СохранитьПутьККаталогуВНастройках(ИмяКаталога); + Иначе + Возврат; + КонецЕсли; + Иначе + РаботаСФайлами.УстановитьПараметрСеансаПутьКРабочемуКаталогуПользователя(ИмяКаталога); + ОбновитьПовторноИспользуемыеЗначения(); + КонецЕсли; + +#Если Не ВебКлиент Тогда + // Создать каталог для файлов + Попытка + СоздатьКаталог(ИмяКаталога); + ИмяКаталогаТестовое = ИмяКаталога + "ПроверкаДоступа\"; + СоздатьКаталог(ИмяКаталогаТестовое); + УдалитьФайлы(ИмяКаталогаТестовое); + Исключение + // нет прав на создание каталога, или такой путь отсутствует - сбрасываем в настройки по умолчанию + ИмяКаталога = ФайловыеФункцииКлиент.ПолучитьПутьККаталогуДанныхПользователя(); + СохранитьПутьККаталогуВНастройках(ИмяКаталога); + КонецПопытки; +#КонецЕсли + +КонецПроцедуры + +// Шифрует объект - Файл, Версия +Функция Зашифровать(ОбъектСсылка, МассивСертификатов, УникальныйИдентификаторФормы, ДанныеФайла, + МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, МассивАдресов) Экспорт + + КоличествоВерсий = ДанныеФайла.КоличествоВерсий; + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + РасширениеПодключеноФайл = ПодключитьРасширениеРаботыСФайлами(); + РасширениеПодключеноКрипто = ПодключитьРасширениеРаботыСКриптографией(); + + МассивОтпечатков = Новый Массив; + Для Каждого Сертификат Из МассивСертификатов Цикл + Отпечаток = Base64Строка(Сертификат.Отпечаток); + + КомуВыданСертификат = ЭлектронноЦифроваяПодписьКлиент.ПолучитьПредставлениеПользователя(Сертификат.Субъект); + Представление = КомуВыданСертификат; + + ОтпечатокСтруктура = Новый Структура("Отпечаток, Представление", Отпечаток, Представление); + МассивОтпечатков.Добавить(ОтпечатокСтруктура); + КонецЦикла; + + МассивОбъектовШифрования = Новый Массив; + МассивАдресов = Новый Массив; + + Если ТипЗнч(ОбъектСсылка) = Тип("СправочникСсылка.Файлы") Тогда + + Если КоличествоВерсий > 1 Тогда + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сейчас будет выполнено шифрование всех %1 версий файла. Это может занять продолжительное время. Продолжить шифрование файла?'"), + КоличествоВерсий); + + Если Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет) <> КодВозвратаДиалога.Да Тогда + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + МассивВерсий = РаботаСФайлами.ПолучитьДанныеФайлаИНавигационнуюСсылкуВсехВерсийФайла(ОбъектСсылка, УникальныйИдентификаторФормы); + Если МассивВерсий.Количество() = 0 Тогда + Возврат Ложь; + КонецЕсли; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется получение всех версий файла ""%1""'"), + ОбъектСсылка); + Состояние(ТекстСообщения, 0); + + Счетчик = 0; + Для Каждого СтруктураВерсии Из МассивВерсий Цикл + + Прогресс = Счетчик / МассивВерсий.Количество() * 100; + Состояние(ТекстСообщения, Прогресс); + + ДанныеФайла = СтруктураВерсии.ДанныеФайла; + АдресФайла = СтруктураВерсии.НавигационнаяСсылкаВерсии; + + ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайла); + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда + МассивАдресов.Добавить(АдресФайла); + КонецЕсли; + + ОбъектДляПодписи = Новый Структура("ДвоичныеДанныеФайла, ВерсияСсылка", + ДвоичныеДанныеФайла, СтруктураВерсии.ВерсияСсылка); + + МассивОбъектовШифрования.Добавить(ОбъектДляПодписи); + Счетчик = Счетчик + 1; + + КонецЦикла; + + Состояние(); + + КонецЕсли; + + МенеджерКриптографии = ЭлектронноЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + + МассивДанныхДляЗанесенияВБазу = Новый Массив; + + Для Каждого ОбъектДляШифрования Из МассивОбъектовШифрования Цикл + + ДвоичныеДанныеФайла = ОбъектДляШифрования.ДвоичныеДанныеФайла; + ВерсияСсылка = ОбъектДляШифрования.ВерсияСсылка; + + ШифрованныйФайлДвоичныеДанные = МенеджерКриптографии.Зашифровать(ДвоичныеДанныеФайла, МассивСертификатов); + АдресВременногоХранилища = ПоместитьВоВременноеХранилище(ШифрованныйФайлДвоичныеДанные, УникальныйИдентификаторФормы); + + ДанныеДляЗаписиНаСервере = Новый Структура("АдресВременногоХранилища, ВерсияСсылка", АдресВременногоХранилища, ВерсияСсылка); + МассивДанныхДляЗанесенияВБазу.Добавить(ДанныеДляЗаписиНаСервере); + + КонецЦикла; + + Возврат Истина; + +КонецФункции + +// Расшифрует объект - Файл, Версия +Функция Расшифровать(ОбъектСсылка, УникальныйИдентификаторФормы, ДанныеФайла, + МассивДанныхДляЗанесенияВБазу, МассивАдресов) Экспорт + + КоличествоВерсий = ДанныеФайла.КоличествоВерсий; + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + + РасширениеПодключеноФайл = ПодключитьРасширениеРаботыСФайлами(); + РасширениеПодключеноКрипто = ПодключитьРасширениеРаботыСКриптографией(); + + ПредставленияСертификатов = ""; + Для Каждого СтруктураСертификата Из ДанныеФайла.МассивСертификатовШифрования Цикл + + Отпечаток = СтруктураСертификата.Отпечаток; + + ТолькоВЛичномХранилище = Истина; + Сертификат = ЭлектронноЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище); + Если Сертификат <> Неопределено Тогда // тут собираем только личные сертификаты - с закрытым ключом + Если НЕ ПустаяСтрока(ПредставленияСертификатов) Тогда + ПредставленияСертификатов = ПредставленияСертификатов + Символы.ПС; + КонецЕсли; + ПредставленияСертификатов = ПредставленияСертификатов + СтруктураСертификата.Представление; + КонецЕсли; + + КонецЦикла; + + Пароль = ""; + Заголовок = НСтр("ru = 'Введите пароль для расшифровки'"); + ПараметрыФормы = Новый Структура("Заголовок, ПредставленияСертификатов, Файл", + Заголовок, ПредставленияСертификатов, ОбъектСсылка); + КодВозврата = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВводПароляСОписаниями", ПараметрыФормы); + Если ТипЗнч(КодВозврата) = Тип("Строка") Тогда + Пароль = КодВозврата; + Иначе + Возврат Ложь; + КонецЕсли; + + МассивОбъектовШифрования = Новый Массив; + МассивАдресов = Новый Массив; + + Если ТипЗнч(ОбъектСсылка) = Тип("СправочникСсылка.Файлы") Тогда + + Если КоличествоВерсий > 1 Тогда + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сейчас будет выполнена расшифровка всех %1 версий файла. Это может занять продолжительное время. Продолжить расшифровку файла?'"), + КоличествоВерсий); + + Если Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет) <> КодВозвратаДиалога.Да Тогда + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется получение всех версий файла ""%1""'"), + ОбъектСсылка); + + Состояние(ТекстСообщения, 0); + МассивВерсий = РаботаСФайлами.ПолучитьДанныеФайлаИНавигационнуюСсылкуВсехВерсийФайла(ОбъектСсылка, УникальныйИдентификаторФормы); + + Счетчик = 0; + Для Каждого СтруктураВерсии Из МассивВерсий Цикл + + Прогресс = Счетчик / МассивВерсий.Количество() * 100; + Состояние(ТекстСообщения, Прогресс); + + ДанныеФайла = СтруктураВерсии.ДанныеФайла; + АдресФайла = СтруктураВерсии.НавигационнаяСсылкаВерсии; + + ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайла); + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда + МассивАдресов.Добавить(АдресФайла); + КонецЕсли; + + ОбъектДляПодписи = Новый Структура("ДвоичныеДанныеФайла, ВерсияСсылка", + ДвоичныеДанныеФайла, СтруктураВерсии.ВерсияСсылка); + + МассивОбъектовШифрования.Добавить(ОбъектДляПодписи); + Счетчик = Счетчик + 1; + + КонецЦикла; + + Состояние(); + + КонецЕсли; + + МенеджерКриптографии = ЭлектронноЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Пароль; + + МассивДанныхДляЗанесенияВБазу = Новый Массив; + + Для Каждого ОбъектДляШифрования Из МассивОбъектовШифрования Цикл + + ДвоичныеДанныеФайла = ОбъектДляШифрования.ДвоичныеДанныеФайла; + ВерсияСсылка = ОбъектДляШифрования.ВерсияСсылка; + + ДвоичныеДанныеРасшифрованные = МенеджерКриптографии.Расшифровать(ДвоичныеДанныеФайла); + АдресВременногоХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеРасшифрованные, УникальныйИдентификаторФормы); + + ДанныеДляЗаписиНаСервере = Новый Структура("АдресВременногоХранилища, ВерсияСсылка", АдресВременногоХранилища, ВерсияСсылка); + МассивДанныхДляЗанесенияВБазу.Добавить(ДанныеДляЗаписиНаСервере); + + КонецЦикла; + + Возврат Истина; + +КонецФункции + +// По окончании Зашифровать нотифицирует +Процедура ИнформироватьОШифровании(МассивФайловВРабочемКаталогеДляУдаления, ВладелецФайла, + ОбъектСсылка) Экспорт + + ОповеститьОбИзменении(ОбъектСсылка); + СтруктураОповещения = Новый Структура("Владелец", + ВладелецФайла); + Оповестить("ПрисоединенныйФайлЗашифрован", СтруктураОповещения); + + // удаляем из рабочего каталога все версии файла + Для Каждого ПутьФайла Из МассивФайловВРабочемКаталогеДляУдаления Цикл + РаботаСФайламиКлиент.УдалитьФайл(ПутьФайла, Ложь); // не задавать вопрос + КонецЦикла; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" зашифрован'"), + ОбъектСсылка); + Состояние(ТекстСообщения); + +КонецПроцедуры + +// По окончании Расшифровать нотифицирует +Процедура ИнформироватьОРасшифровании(ВладелецФайла, ОбъектСсылка) Экспорт + + ОповеститьОбИзменении(ОбъектСсылка); + СтруктураОповещения = Новый Структура("Владелец", + ВладелецФайла); + Оповестить("ПрисоединенныйФайлЗашифрован", СтруктураОповещения); + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" расшифрован'"), + ОбъектСсылка); + Состояние(ТекстСообщения); + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиент/РаботаСФайламиКлиент.mdo b/SSL/src/CommonModules/РаботаСФайламиКлиент/РаботаСФайламиКлиент.mdo new file mode 100644 index 000000000..98a51a23f --- /dev/null +++ b/SSL/src/CommonModules/РаботаСФайламиКлиент/РаботаСФайламиКлиент.mdo @@ -0,0 +1,12 @@ + + + РаботаСФайламиКлиент + + ru + Работа с файлами клиент + + Реализация интерактивных команд работы с элементами справочника Файлы + true + true + true + diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиКлиентПовтИсп/Module.bsl new file mode 100644 index 000000000..f1c5cdcf2 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСФайламиКлиентПовтИсп/Module.bsl @@ -0,0 +1,42 @@ +//////////////////////////////////////////////////////////////////////////////// +// МОДУЛЬ СОДЕРЖИТ ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ФАЙЛАМИ +// +// + +// Возвращает структуру, содержащую различные персональные настройки +Функция ПолучитьПерсональныеНастройкиРаботыСФайлами() Экспорт + Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ПерсональныеНастройкиРаботыСФайлами; +КонецФункции + +// Возвращает форму, которая используется при создании нового файла +// для выбора варианта создания +Функция ПолучитьФормуВыбораВариантаСозданияНовогоФайла() Экспорт + ДоступнаКомандаСканировать = РаботаСоСканеромКлиент.ДоступнаКомандаСканировать(); + + ПараметрыФормы = Новый Структура("ДоступнаКомандаСканировать", ДоступнаКомандаСканировать); + Возврат ПолучитьФорму("Справочник.Файлы.Форма.ФормаНового", ПараметрыФормы); +КонецФункции + +// Возвращает параметр сеанса ПутьКРабочемуКаталогуПользователя +Функция ПолучитьПараметрСеансаРабочийКаталог() Экспорт + Возврат РаботаСФайлами.ПараметрыСеансаПутьКРабочемуКаталогуПользователя(); +КонецФункции + +// Возвращает форму, которая используется для информирования +// пользователей об особенностях заема и редактирования файлов +// в веб-клиенте +Функция ПолучитьФормуНапоминанияПриРедактировании() Экспорт + Возврат ПолучитьФорму("Справочник.Файлы.Форма.ФормаНапоминанияПриРедактировании"); +КонецФункции + +// Возвращает форму, которая используется для информирования +// пользователей об особенностях возврата файлов в веб-клиенте +Функция ПолучитьФормуНапоминанияПередПоместитьФайл() Экспорт + Возврат ПолучитьФорму("Справочник.Файлы.Форма.ФормаНапоминанияПередПоместитьФайл"); +КонецФункции + +// Возвращает форму, которая используется при возврате отредактированного +// файла на сервер +Функция ПолучитьФормуВозвратаФайла() Экспорт + Возврат ПолучитьФорму("Справочник.Файлы.Форма.ФормаВозвратаФайла"); +КонецФункции diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиентПовтИсп/РаботаСФайламиКлиентПовтИсп.mdo b/SSL/src/CommonModules/РаботаСФайламиКлиентПовтИсп/РаботаСФайламиКлиентПовтИсп.mdo new file mode 100644 index 000000000..948498da3 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСФайламиКлиентПовтИсп/РаботаСФайламиКлиентПовтИсп.mdo @@ -0,0 +1,11 @@ + + + РаботаСФайламиКлиентПовтИсп + + ru + Работа с файлами клиент повт исп + + true + true + DuringSession + diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl new file mode 100644 index 000000000..bf79f539f --- /dev/null +++ b/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl @@ -0,0 +1,194 @@ +//////////////////////////////////////////////////////////////////////////////// +// Модуль процедур, исполняемых на сервере и на клиенте + +// Определяет, можно ли занять файл и, если нет, то формирует строку ошибки +Функция МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки = "") Экспорт + + Если ДанныеФайла.ПометкаУдаления = Истина Тогда + СтрокаОшибки = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Нельзя занять файл ""%1"", т.к. он помечен на удаление.'"), + Строка(ДанныеФайла.Ссылка)); + Возврат Ложь; + КонецЕсли; + + + Если ДанныеФайла.Редактирует.Пустая() + Или ДанныеФайла.РедактируетТекущийПользователь Тогда + + Возврат Истина; + + Иначе + + СтрокаОшибки = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" уже редактируется пользователем ""%2""!'"), + Строка(ДанныеФайла.Ссылка), Строка(ДанныеФайла.Редактирует)); + Возврат Ложь; + + КонецЕсли; + +КонецФункции + +// Возвращает Истина, если в имени папки или файла все символы допустимы для файловой системы (т.е. на диске можно создать каталог с таким именем) +Функция ИмяПапкиИлиФайлаСостоитИзДопустимыхСимволовДляФайловойСистемы(ИмяПапки) Экспорт + + Если Найти(ИмяПапки, "/") > 0 Тогда + Возврат Ложь; + КонецЕсли; + + Если Найти(ИмяПапки, ":") > 0 Тогда + Возврат Ложь; + КонецЕсли; + + Если Найти(ИмяПапки, "?") > 0 Тогда + Возврат Ложь; + КонецЕсли; + + Если Найти(ИмяПапки, "\") > 0 Тогда + Возврат Ложь; + КонецЕсли; + + Если Найти(ИмяПапки, "|") > 0 Тогда + Возврат Ложь; + КонецЕсли; + + Если Найти(ИмяПапки, "*") > 0 Тогда + Возврат Ложь; + КонецЕсли; + + Если Найти(ИмяПапки, """") > 0 Тогда + Возврат Ложь; + КонецЕсли; + + Если Найти(ИмяПапки, "<") > 0 Тогда + Возврат Ложь; + КонецЕсли; + + Если Найти(ИмяПапки, ">") > 0 Тогда + Возврат Ложь; + КонецЕсли; + + Если Найти(ИмяПапки, "..\") > 0 Тогда + Возврат Ложь; + КонецЕсли; + + Если Найти(ИмяПапки, "../") > 0 Тогда + Возврат Ложь; + КонецЕсли; + + Если ИмяПапки = "." Тогда + Возврат Ложь; + КонецЕсли; + + Если ИмяПапки = ".." Тогда + Возврат Ложь; + КонецЕсли; + + Возврат Истина; +КонецФункции + +// Получается индекс пиктограммы файла - индекс в картинке ПиктограммыФайлов +Функция ПолучитьИндексПиктограммыФайла(Знач РасширениеФайлаТолькоТекст) Экспорт + + Если РасширениеФайлаТолькоТекст = Неопределено Тогда + Возврат 0; + КонецЕсли; + + РасширениеФайлаБезТочки = РасширениеФайлаТолькоТекст; + + Если Лев(РасширениеФайлаБезТочки, 1) = "." Тогда + РасширениеФайлаБезТочки = Сред(РасширениеФайлаБезТочки, 2); + КонецЕсли; + + Расширение = "." + НРег(РасширениеФайлаБезТочки) + ";"; + + Если Найти(".dt;.1cd;.cf;.cfu;",Расширение) <> 0 Тогда + Возврат 6; //Файлы 1С + ИначеЕсли Расширение = ".mxl;" Тогда + Возврат 8; //Табличный Файл + ИначеЕсли Найти(".txt;.log;.ini;",Расширение) <> 0 Тогда + Возврат 10; // Текстовый Файл + ИначеЕсли Расширение = ".epf;" Тогда + Возврат 12; //Внешние обработки + ИначеЕсли Найти(".ico;.wmf;.emf;",Расширение) <> 0 Тогда + Возврат 14; // Картинки + ИначеЕсли Найти(".htm;.html;.url;.mht;.mhtml;",Расширение) <> 0 Тогда + Возврат 16; // HTML + ИначеЕсли Найти(".doc;.dot;.rtf;.docx;",Расширение) <> 0 Тогда + Возврат 18; // Файл Microsoft Word + ИначеЕсли Найти(".xls;.xlw;.xlsx;",Расширение) <> 0 Тогда + Возврат 20; // Файл Microsoft Excel + ИначеЕсли Найти(".ppt;.pptx;.pps;",Расширение) <> 0 Тогда + Возврат 22; // Файл Microsoft PowerPoint + ИначеЕсли Найти(".vsd;",Расширение) <> 0 Тогда + Возврат 24; // Файл Microsoft Visio + ИначеЕсли Найти(".mpp;",Расширение) <> 0 Тогда + Возврат 26; // Файл Microsoft Visio + ИначеЕсли Найти(".mdb;.adp;.mda;.mde;.ade;",Расширение) <> 0 Тогда + Возврат 28; // База данных Microsoft Access + ИначеЕсли Найти(".xml;",Расширение) <> 0 Тогда + Возврат 30; // xml + ИначеЕсли Найти(".msg;",Расширение) <> 0 Тогда + Возврат 32; // Письмо электронной почты + ИначеЕсли Найти(".zip;.rar;.arj;.cab;.lzh;.ace;",Расширение) <> 0 Тогда + Возврат 34; // Архивы + ИначеЕсли Найти(".exe;.com;.bat;.cmd;",Расширение) <> 0 Тогда + Возврат 36; // Исполняемые файлы + ИначеЕсли Найти(".grs;",Расширение) <> 0 Тогда + Возврат 38; // Графическая схема + ИначеЕсли Найти(".geo;",Расширение) <> 0 Тогда + Возврат 40; // Географическая схема + ИначеЕсли Найти(".jpg;.jpeg;.jp2;.jpe;",Расширение) <> 0 Тогда + Возврат 42; // jpg + ИначеЕсли Найти(".bmp;.dib;",Расширение) <> 0 Тогда + Возврат 44; // bmp + ИначеЕсли Найти(".tif;",Расширение) <> 0 Тогда + Возврат 46; // tif + ИначеЕсли Найти(".gif;",Расширение) <> 0 Тогда + Возврат 48; // gif + ИначеЕсли Найти(".png;",Расширение) <> 0 Тогда + Возврат 50; // png + ИначеЕсли Найти(".pdf;",Расширение) <> 0 Тогда + Возврат 52; // pdf + ИначеЕсли Найти(".odt;",Расширение) <> 0 Тогда + Возврат 54; // Open Office writer + ИначеЕсли Найти(".odf;",Расширение) <> 0 Тогда + Возврат 56; // Open Office math + ИначеЕсли Найти(".odp;",Расширение) <> 0 Тогда + Возврат 58; // Open Office Impress + ИначеЕсли Найти(".odg;",Расширение) <> 0 Тогда + Возврат 60; // Open Office draw + ИначеЕсли Найти(".ods;",Расширение) <> 0 Тогда + Возврат 62; // Open Office calc + ИначеЕсли Найти(".mp3;",Расширение) <> 0 Тогда + Возврат 64; + ИначеЕсли Найти(".erf;",Расширение) <> 0 Тогда + Возврат 66; // Внешние отчеты + Иначе + Возврат 4; + КонецЕсли; + +КонецФункции // () + +// Возвращает Истина, если файл с таким расширением можно загружать +Функция РасширениеФайлаРазрешеноДляЗагрузки(ЗапретЗагрузкиФайловПоРасширению, СписокЗапрещенныхРасширений, РасширениеФайла) Экспорт + Если ЗапретЗагрузкиФайловПоРасширению = Ложь Тогда + Возврат Истина; + КонецЕсли; + + РасширениеФайлаБезТочки = РасширениеФайла; + + Если Лев(РасширениеФайлаБезТочки, 1) = "." Тогда + РасширениеФайлаБезТочки = Сред(РасширениеФайлаБезТочки, 2); + КонецЕсли; + + Расширение = НРег(РасширениеФайлаБезТочки); + СписокЗапрещенныхРасширенийНижнийРегистр = НРег(СписокЗапрещенныхРасширений); + + Если Найти(СписокЗапрещенныхРасширенийНижнийРегистр, Расширение) <> 0 Тогда + Возврат Ложь; + КонецЕсли; + + Возврат Истина; +КонецФункции // РасширениеФайлаРазрешеноДляЗагрузки() diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/РаботаСФайламиКлиентСервер.mdo b/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/РаботаСФайламиКлиентСервер.mdo new file mode 100644 index 000000000..b233d60b2 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/РаботаСФайламиКлиентСервер.mdo @@ -0,0 +1,12 @@ + + + РаботаСФайламиКлиентСервер + + ru + Работа с файлами клиент сервер + + true + true + true + true + diff --git a/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl new file mode 100644 index 000000000..eba8912b3 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl @@ -0,0 +1,31 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Подключение управления доступом в подсистеме РаботаСФайлами. + +Функция ВозможноЗанятьФайл(ДанныеФайла, СтрокаОшибки = "") Экспорт + + Возврат Истина; + +КонецФункции + +Процедура ПередЗаписьюФайла(ЭтотОбъект, Отказ) Экспорт + +КонецПроцедуры + +// Функция ПометкаУдаленияРазрешена, при использовании ограничения +// пометки удаления проверяет, разрешена ли текущему пользователю +// пометка удаления папки файлов или файла. +// +// Параметры: +// Ссылка - СправочникСсылка.ПапкиФайлов, СправочникСсылка.Файлы, +// <ссылка на владельца>. +// +// Возвращаемое значение: +// Булево. +// +Функция ПометкаУдаленияРазрешена(Ссылка) Экспорт + + Возврат Истина; + +КонецФункции + diff --git a/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/РаботаСФайламиПереопределяемый.mdo b/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/РаботаСФайламиПереопределяемый.mdo new file mode 100644 index 000000000..6b982984c --- /dev/null +++ b/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/РаботаСФайламиПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + РаботаСФайламиПереопределяемый + + ru + Работа с файлами переопределяемый + + true + true + diff --git a/SSL/src/CommonModules/РаботаСФайламиПовтИсп/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиПовтИсп/Module.bsl new file mode 100644 index 000000000..312bf2824 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСФайламиПовтИсп/Module.bsl @@ -0,0 +1,37 @@ +//////////////////////////////////////////////////////////////////////////////// +// МОДУЛЬ СОДЕРЖИТ ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ФАЙЛАМИ +// +// + +// Возвращает тип платформы сервера +Функция ТипПлатформыСервера() Экспорт + СисИнфо = Новый СистемнаяИнформация; + Возврат СисИнфо.ТипПлатформы; +КонецФункции + +// Возвращает путь модуля криптографии для текущего компьютера +Функция ПутьМодуляКриптографии() Экспорт + + ТипПлатформыСервера = ТипПлатформыСервера(); + Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда + Возврат ""; // в Windows путь модуля криптографии не нужен + КонецЕсли; + + ИмяКомпьютера = ИмяКомпьютера(); + ПутьМодуля = ""; + + УстановитьПривилегированныйРежим(Истина); + + // Подготовить структуру отбора по измерениям + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("ИмяКомпьютера", ИмяКомпьютера); + + // Получить структуру с данными ресурсов записи + СтруктураРесурсов = РегистрыСведений.ПутиМодулейКриптографииСерверовЛинукс.Получить(СтруктураОтбора); + + // Получить путь из регистра + ПутьМодуля = СтруктураРесурсов.ПутьМодуляКриптографии; + + Возврат ПутьМодуля; + +КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/РаботаСФайламиПовтИсп/РаботаСФайламиПовтИсп.mdo b/SSL/src/CommonModules/РаботаСФайламиПовтИсп/РаботаСФайламиПовтИсп.mdo new file mode 100644 index 000000000..0ba00789a --- /dev/null +++ b/SSL/src/CommonModules/РаботаСФайламиПовтИсп/РаботаСФайламиПовтИсп.mdo @@ -0,0 +1,11 @@ + + + РаботаСФайламиПовтИсп + + ru + Работа с файлами повт исп + + true + true + DuringSession + diff --git a/SSL/src/CommonModules/РаботаСоСканеромКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСоСканеромКлиент/Module.bsl new file mode 100644 index 000000000..ed388ab72 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСоСканеромКлиент/Module.bsl @@ -0,0 +1,156 @@ +// Устанавливает компоненту сканирования +Процедура УстановитьКомпоненту() Экспорт + + Если КомпонентаTwain = Неопределено Тогда + КодВозврата = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаTWAIN", "twain", ТипВнешнейКомпоненты.Native); + + Если КодВозврата Тогда + Состояние(НСтр("ru = 'Компонента сканирования уже установлена!'")); + Иначе + УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаTWAIN"); + КодВозврата = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаTWAIN", "twain", ТипВнешнейКомпоненты.Native); + + Если КодВозврата Тогда + РаботаСФайлами.ОчиститьНастройкиФормНовогоФайла(); + ОбновитьПовторноИспользуемыеЗначения(); + Оповестить("КомпонентаСканированияУстановлена"); + КонецЕсли; + КонецЕсли; + + КомпонентаTwain = Новый("AddIn.twain.AddInNativeExtension"); + Иначе + Состояние(НСтр("ru = 'Компонента сканирования уже установлена!'")); + КонецЕсли; + +КонецПроцедуры + +// Проинициализировать компоненту сканирования +Функция ПроинициализироватьКомпоненту() Экспорт + Если КомпонентаTwain = Неопределено Тогда + КодВозврата = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаTWAIN", "twain", ТипВнешнейКомпоненты.Native); + + Если Не КодВозврата Тогда + Возврат Ложь; + КонецЕсли; + + КомпонентаTwain = Новый("AddIn.twain.AddInNativeExtension"); + КонецЕсли; + + Возврат Истина; +КонецФункции + +// Вернет версию компоненты сканирования +Функция ВерсияКомпонентыСканирования() Экспорт + + Если Не ПроинициализироватьКомпоненту() Тогда + Возврат НСтр("ru= 'Компонента сканирования не установлена'"); + КонецЕсли; + + Возврат КомпонентаTwain.Версия(); +КонецФункции // ВерсияКомпонентыСканирования() + +// Вернет массив строк - устройства TWAIN +Функция ПолучитьУстройства() Экспорт + Массив = Новый Массив; + + Если Не ПроинициализироватьКомпоненту() Тогда + Возврат Массив; + КонецЕсли; + + СтрокаУстройств = КомпонентаTwain.ПолучитьУстройства(); + + Для Индекс = 1 По СтрЧислоСтрок(СтрокаУстройств) Цикл + Строка = СтрПолучитьСтроку(СтрокаУстройств, Индекс); + Массив.Добавить(Строка); + КонецЦикла; + + Возврат Массив; +КонецФункции // ПолучитьУстройства() + + + +// Вызвать диалог сканирования и показать диалог просмотра картинки +Процедура СканироватьИПоказатьДиалогПросмотра(ВладелецФайла, УникальныйИдентификатор, ЭтаФорма, + НеОткрыватьКарточкуПослеСозданияИзФайла = Неопределено) Экспорт + + СистемнаяИнформация = Новый СистемнаяИнформация(); + ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; + + ПараметрыОткрытия = Новый Структура("ВладелецФайла, НеОткрыватьКарточкуПослеСозданияИзФайла, ИдентификаторКлиента", + ВладелецФайла, НеОткрыватьКарточкуПослеСозданияИзФайла, ИдентификаторКлиента); + ОткрытьФормуМодально("Справочник.Файлы.Форма.РезультатСканирования", ПараметрыОткрытия); + +КонецПроцедуры + +// Вернет Истина, если доступна команда Сканировать - установлена компонента сканирования и есть хоть один сканер +Функция ДоступнаКомандаСканировать() Экспорт + + Если Не ПроинициализироватьКомпоненту() Тогда + Возврат Ложь; + КонецЕсли; + + Если КомпонентаTwain.ЕстьУстройства() тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции // ДоступнаКомандаСканировать() + + +// Получает настройку сканера по имени +// +// Параметры +// ИмяУстройства - Строка - Имя сканера +// +// ИмяНастройки - Строка - имя настройки, например "XRESOLUTION" или "PIXELTYPE" или "ROTATION" или "SUPPORTEDSIZES" +// +// +// Возвращаемое значение: +// Число - значение настройки сканера +// +Функция ПолучитьНастройку(ИмяУстройства, ИмяНастройки) Экспорт + + Попытка + Возврат КомпонентаTwain.ПолучитьНастройку(ИмяУстройства, ИмяНастройки); + Исключение + Возврат -1; + КонецПопытки; + +КонецФункции // ПолучитьНастройку() + +// Сохраняет в настройках цветность и разрешение +Процедура СохранитьВНастройкахПараметрыСканера(Разрешение, Цветность, Поворот, РазмерБумаги) Экспорт + + МассивСтруктур = Новый Массив; + + СистемнаяИнформация = Новый СистемнаяИнформация(); + ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "НастройкиСканирования/Разрешение"); + Элемент.Вставить("Настройка", ИдентификаторКлиента); + Элемент.Вставить("Значение", Разрешение); + МассивСтруктур.Добавить(Элемент); + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "НастройкиСканирования/Цветность"); + Элемент.Вставить("Настройка", ИдентификаторКлиента); + Элемент.Вставить("Значение", Цветность); + МассивСтруктур.Добавить(Элемент); + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "НастройкиСканирования/Поворот"); + Элемент.Вставить("Настройка", ИдентификаторКлиента); + Элемент.Вставить("Значение", Поворот); + МассивСтруктур.Добавить(Элемент); + + Элемент = Новый Структура; + Элемент.Вставить("Объект", "НастройкиСканирования/РазмерБумаги"); + Элемент.Вставить("Настройка", ИдентификаторКлиента); + Элемент.Вставить("Значение", РазмерБумаги); + МассивСтруктур.Добавить(Элемент); + + ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур); + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonModules/РаботаСоСканеромКлиент/РаботаСоСканеромКлиент.mdo b/SSL/src/CommonModules/РаботаСоСканеромКлиент/РаботаСоСканеромКлиент.mdo new file mode 100644 index 000000000..9871401e8 --- /dev/null +++ b/SSL/src/CommonModules/РаботаСоСканеромКлиент/РаботаСоСканеромКлиент.mdo @@ -0,0 +1,10 @@ + + + РаботаСоСканеромКлиент + + ru + Работа со сканером клиент + + true + true + diff --git a/SSL/src/CommonModules/РегламентныеЗаданияГлобальный/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияГлобальный/Module.bsl new file mode 100644 index 000000000..fe7459abe --- /dev/null +++ b/SSL/src/CommonModules/РегламентныеЗаданияГлобальный/Module.bsl @@ -0,0 +1,62 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ОБРАБОТКИ СИСТЕМНЫХ СОБЫТИЙ + +// Процедура УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий уведомляет +// пользователей о невыполнении регламентных заданий и "зависании" фоновых заданий. +// Процедура работает только если информационная база файловая. Для серверной ИБ +// ответственность за выполнение регламентных заданий лежит на администраторе сервера 1С. +// Подключает в процедуре РегламентныеЗаданияКлиент.ПриНачалеРаботыСистемы(). +// +Процедура УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий() Экспорт + + ПериодУведомления = Неопределено; // Минут. + Если РегламентныеЗаданияСервер.НужноУведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий(ПериодУведомления) Тогда + ОписаниеОшибки = ""; + ЗаданияОбрабатываютсяНормально = Неопределено; + РегламентныеЗаданияСервер.ТекущийСеансОбрабатываетЗадания(ЗаданияОбрабатываютсяНормально, , ОписаниеОшибки); + Если НЕ ЗаданияОбрабатываютсяНормально Тогда + РегламентныеЗаданияКлиент.ПриОшибкеОбработкиРегламентныхЗаданий(ОписаниеОшибки); + КонецЕсли; + ПодключитьОбработчикОжидания("УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий", ПериодУведомления * 60, Истина); + КонецЕсли; + +КонецПроцедуры // УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий() + +// Процедура ОбработкаРегламентныхЗаданийВОсновномСеансе() вызывается +// обработчиком ожидания, который подключается в +// РегламентныеЗаданияКлиент.ПриНачалеРаботыСистемы(). +// Для обработки в отдельном сеансе применяется форма +// Обработки.РегламентныеИФоновыеЗадания.Форма.ОбработкаРегламентныхЗаданий. +// +Процедура ОбработкаРегламентныхЗаданийВОсновномСеансе() Экспорт + + Если РегламентныеЗаданияСервер.ТекущийСеансОбрабатываетЗадания() Тогда + РегламентныеЗаданияСервер.ОбработатьРегламентныеЗадания(, Истина); + ПодключитьОбработчикОжидания("ОбработкаРегламентныхЗаданийВОсновномСеансе", 60, Истина); + КонецЕсли; + +КонецПроцедуры // ОбработкаРегламентныхЗаданийВОсновномСеансе() + +Процедура ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданийЧерезОбработчикОжидания() Экспорт + + Результат = РегламентныеЗаданияКлиент.ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданий(); + + Если Результат.Отказ Тогда + Предупреждение(Результат.ОписаниеОшибки); + + ИначеЕсли Результат.ВыполненаПопыткаОткрытия Тогда + + ПодключитьОбработчикОжидания("АктивизироватьГлавноеОкноТекущегоСеансаПослеЗапускаОтдельногоСеансаОбработкиРегламентныхЗаданий", 2, Истина); + КонецЕсли; + +КонецПроцедуры + +Процедура АктивизироватьГлавноеОкноТекущегоСеансаПослеЗапускаОтдельногоСеансаОбработкиРегламентныхЗаданий() Экспорт + + ОсновноеОкно = РегламентныеЗаданияКлиент.ОсновноеОкно(); + Если ОсновноеОкно <> Неопределено Тогда + ОсновноеОкно.Активизировать(); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/РегламентныеЗаданияГлобальный/РегламентныеЗаданияГлобальный.mdo b/SSL/src/CommonModules/РегламентныеЗаданияГлобальный/РегламентныеЗаданияГлобальный.mdo new file mode 100644 index 000000000..a2e3f920a --- /dev/null +++ b/SSL/src/CommonModules/РегламентныеЗаданияГлобальный/РегламентныеЗаданияГлобальный.mdo @@ -0,0 +1,12 @@ + + + РегламентныеЗаданияГлобальный + + ru + Регламентные задания глобальный + + true + true + true + true + diff --git a/SSL/src/CommonModules/РегламентныеЗаданияКлиент/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияКлиент/Module.bsl new file mode 100644 index 000000000..523ea40db --- /dev/null +++ b/SSL/src/CommonModules/РегламентныеЗаданияКлиент/Module.bsl @@ -0,0 +1,210 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ОБРАБОТКИ СИСТЕМНЫХ СОБЫТИЙ +// + +// Обработчик события ПриНачалеРаботыСистемы вызывается +// для выполнения действий, требуемых для подсистемы РегламентныеЗадания. +// +Процедура ПриНачалеРаботыСистемы() Экспорт + + Если Найти(ПараметрЗапуска, "DoScheduledJobs") <> 0 Тогда + Предупреждать = (Найти(ПараметрЗапуска, "SkipMessageBox") = 0); + ОтдельныйСеанс = (Найти(ПараметрЗапуска, "AloneIBSession") <> 0); + #Если ВебКлиент Тогда + ЗавершитьРаботуСистемы(Ложь); + #КонецЕсли + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая Тогда + ЗаданияОбрабатываютсяНормально = Неопределено; + ОписаниеОшибки = ""; + Если РегламентныеЗаданияСервер.ТекущийСеансОбрабатываетЗадания(ЗаданияОбрабатываютсяНормально, Истина, ОписаниеОшибки) Тогда + УстановитьЗаголовокПриложения(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Обработка регламентных заданий: %1'"), + ПолучитьЗаголовокПриложения() )); + Если ОтдельныйСеанс Тогда + // Обрабатывать в отдельном сеансе. + ОсновноеОкно = ОсновноеОкно(); + Если ОсновноеОкно = Неопределено Тогда + ОткрытьФорму("Обработка.РегламентныеИФоновыеЗадания.Форма.РабочийСтолОтдельногоСеансаОбработкиРегламентныхЗаданий" ); + Иначе + ОткрытьФорму("Обработка.РегламентныеИФоновыеЗадания.Форма.РабочийСтолОтдельногоСеансаОбработкиРегламентныхЗаданий",,,, ОсновноеОкно); + КонецЕсли; + Если ОткрытьФормуМодально("Обработка.РегламентныеИФоновыеЗадания.Форма.ОбработкаРегламентныхЗаданий") = "Перезапустить" Тогда + ЗавершитьРаботуСистемы(Ложь, Истина, " /C""" + ПараметрЗапуска + """"); + КонецЕсли; + ЗавершитьРаботуСистемы(Ложь); + Иначе + // Обрабатывать в этом сеансе. + ПодключитьОбработчикОжидания("ОбработкаРегламентныхЗаданийВОсновномСеансе", 1, Истина); + КонецЕсли; + Иначе + Если Предупреждать Тогда + Если ЗаданияОбрабатываютсяНормально Тогда + Предупреждение(НСтр("ru = 'Сеанс, обрабатывающий регламентные задания, уже открыт!'")); + Иначе + Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Сеанс, обрабатывающий регламентные задания, уже открыт! + | + |%1'"), ОписаниеОшибки )); + КонецЕсли; + КонецЕсли; + Если ОтдельныйСеанс Тогда + ЗавершитьРаботуСистемы(Ложь); + КонецЕсли; + КонецЕсли; + Иначе + Если Предупреждать Тогда + Предупреждение(НСтр("ru = 'Регламентные задания обрабатываются на сервере!'")); + КонецЕсли; + Если ОтдельныйСеанс Тогда + ЗавершитьРаботуСистемы(Ложь); + КонецЕсли; + КонецЕсли; + + ИначеЕсли СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая Тогда + + ПараметрыТолькоЧтение = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ПараметрыОткрытияСеансаОбработкиРегламентныхЗаданий; + + Если ПараметрыТолькоЧтение.Отказ Тогда + ПриОшибкеОбработкиРегламентныхЗаданий(ПараметрыТолькоЧтение.ОписаниеОшибки); + ИначеЕсли ПараметрыТолькоЧтение.ТребуетсяОткрытьОтдельныйСеанс Тогда + ПодключитьОбработчикОжидания("ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданийЧерезОбработчикОжидания", 1, Истина); + КонецЕсли; + + Если ПараметрыТолькоЧтение.УведомлятьОНекорректномСостоянииОбработки Тогда + ПодключитьОбработчикОжидания("УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий", ПараметрыТолькоЧтение.ПериодУведомления * 60, Истина); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры // ПриНачалеРаботыСистемы() + + +//////////////////////////////////////////////////////////////////////////////// +// МЕТОДЫ РАСШИРЕНИЯ МЕНЕДЖЕРА РЕГЛАМЕНТНЫХ ЗАДАНИЙ +// + +// Функция ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданий() запускает новый сеанс, +// обрабатывающий регламентные задания. +// Только для тонкого и обычного клиентов (Web не поддерживается). +// +// Возвращаемое значение: +// Структура +// Отказ - Булево. +// ОписаниеОшибки - Строка. +// +Функция ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданий() Экспорт + + Параметры = РегламентныеЗаданияСервер.ПараметрыОткрытияСеансаОбработкиРегламентныхЗаданий(Ложь); + + Если НЕ Параметры.Отказ И Параметры.ТребуетсяОткрытьОтдельныйСеанс Тогда + ПопыткаОткрытьОтдельныйСеансОбработкиРегламентныхЗаданий(Параметры); + КонецЕсли; + + Возврат Параметры; + +КонецФункции // ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданий() + +// Процедура ПопыткаОткрытьОтдельныйСеансОбработкиРегламентныхЗаданий() +// делает попытку открытия нового сеанса, обрабатывающего регламентные задания. +// +// Параметры: +// Параметры - Структура, используемые свойства: +// ДополнительныеПараметрыКоманднойСтроки - Строка. +// Отказ - Булево, выходной параметр. +// ОписаниеОшибки - Строка, выходной параметр. +// +Процедура ПопыткаОткрытьОтдельныйСеансОбработкиРегламентныхЗаданий(Знач Параметры) Экспорт + + #Если НЕ ВебКлиент Тогда + Попытка + Параметры.ВыполненаПопыткаОткрытия = Истина; + ЗапуститьСистему( + ?(Найти(ВРег(ПараметрЗапуска), "/DEBUG") = Неопределено, "", "/DEBUG ") + + Параметры.ДополнительныеПараметрыКоманднойСтроки); + Исключение + Параметры.ОписаниеОшибки = ОписаниеОшибки(); + Параметры.Отказ = Истина; + КонецПопытки; + #Иначе + Параметры.Отказ = Истина; + Параметры.ОписаниеОшибки = НСтр("ru = 'Обработка регламентных заданий в + |отдельном сеансе веб-клиента невозможна! + | + |Для обработки регламентных заданий, необходимо, + |чтобы администратор настроил запуск обычного + |или тонкого клиента на веб-сервере!'"); + #КонецЕсли + Параметры.ОписаниеОшибки = ?(ПустаяСтрока(Параметры.ОписаниеОшибки), + "", + СтрЗаменить(НСтр("ru = 'Ошибка открытия сеанса обработки регламентных заданий: + | + |%1'"), "%1", Параметры.ОписаниеОшибки)); + +КонецПроцедуры // ПопыткаОткрытьОтдельныйСеансОбработкиРегламентныхЗаданий() + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЧИЕ ПРОЦЕДУРЫ +// + +// Процедура ПриОшибкеОбработкиРегламентныхЗаданий вызывается +// из процедуры РегламентныеЗаданияГлобальный.УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий() +// и РегламентныеЗаданияКлиент.ПриНачалеРаботыСистемы(). +// Вызов происходит, если обнаружено, что что-то не так в обработке регламентных заданий: +// нет сеанса обработки, "висит" сеанс, сеанс долго "не работает". +// +// Параметры: +// ОписаниеОшибки - Строка +// +Процедура ПриОшибкеОбработкиРегламентныхЗаданий(ОписаниеОшибки) Экспорт + + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ПараметрыОткрытияСеансаОбработкиРегламентныхЗаданий.ТекущийПользовательАдминистратор Тогда + ПоказатьОповещениеПользователя( + НСтр("ru = 'Регламентные задания не обрабатываются.'"), + "e1cib/app/Обработка.РегламентныеИФоновыеЗадания", + ОписаниеОшибки, + БиблиотекаКартинок.ОшибкаОбработкиРегламентныхЗаданий); + Иначе + ПоказатьОповещениеПользователя( + НСтр("ru = 'Регламентные задания не обрабатываются.'"), + , + ОписаниеОшибки + Символы.ПС + НСтр("ru = 'Обратитесь к администратору.'"), + БиблиотекаКартинок.ОшибкаОбработкиРегламентныхЗаданий); + КонецЕсли; + + +КонецПроцедуры + +// Процедура ПодключитьГлобальныйОбработчикОжидания() применяется +// из экранных форм, т.к. в модуле формы метод переопределен. +// +Процедура ПодключитьГлобальныйОбработчикОжидания(ИмяПроцедуры, Интервал, Однократно = Ложь) Экспорт + + ПодключитьОбработчикОжидания(ИмяПроцедуры, Интервал, Однократно); + +КонецПроцедуры + +// Процедура ОтключитьГлобальныйОбработчикОжидания() применяется +// из экранных форм, т.к. в модуле формы метод переопределен. +// +Процедура ОтключитьГлобальныйОбработчикОжидания(ИмяПроцедуры) Экспорт + + ОтключитьОбработчикОжидания(ИмяПроцедуры); + +КонецПроцедуры + +Функция ОсновноеОкно() Экспорт + + ОсновноеОкно = Неопределено; + + Окна = ПолучитьОкна(); + Если Окна <> Неопределено Тогда + Для каждого Окно Из Окна Цикл + Если Окно.Основное Тогда + ОсновноеОкно = Окно; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат ОсновноеОкно; + +КонецФункции diff --git a/SSL/src/CommonModules/РегламентныеЗаданияКлиент/РегламентныеЗаданияКлиент.mdo b/SSL/src/CommonModules/РегламентныеЗаданияКлиент/РегламентныеЗаданияКлиент.mdo new file mode 100644 index 000000000..f61f181d2 --- /dev/null +++ b/SSL/src/CommonModules/РегламентныеЗаданияКлиент/РегламентныеЗаданияКлиент.mdo @@ -0,0 +1,11 @@ + + + РегламентныеЗаданияКлиент + + ru + Регламентные задания клиент + + true + true + true + diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl new file mode 100644 index 000000000..03d6bdcce --- /dev/null +++ b/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl @@ -0,0 +1,1287 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ОБЩЕГО НАЗНАЧЕНИЯ + +// Процедура ВызватьИсключениеЕслиНетПраваАдминистрирования вызывает исключение, +// если у пользователя нет права администрирования. +// +Процедура ВызватьИсключениеЕслиНетПраваАдминистрирования() + + ВыполняетсяПроцедураОбработатьРегламентныеЗадания = ХранилищеОбщихНастроек.Загрузить("ВыполняетсяПроцедураОбработатьРегламентныеЗадания"); + Если ТипЗнч(ВыполняетсяПроцедураОбработатьРегламентныеЗадания) <> Тип("Булево") Тогда + ВыполняетсяПроцедураОбработатьРегламентныеЗадания = Ложь; + КонецЕсли; + + Если НЕ ВыполняетсяПроцедураОбработатьРегламентныеЗадания И + НЕ ПравоДоступа("Администрирование", Метаданные) Тогда + + ВызватьИсключение(НСтр("ru = 'У пользователя нет права администрирования!'")); + КонецЕсли; + +КонецПроцедуры // ВызватьИсключениеЕслиНетПраваАдминистрирования() + +// Процедура ДобавитьВСписокЗначенийИменаПользователей добавляет +// в Список имена пользователей, как они заданы в конфигураторе. +// +// Параметры: +// Список - СписокЗначений - обычно СписокВыбора ПоляВвода. +// +Процедура ДобавитьВСписокЗначенийИменаПользователей(Список) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + + // Заполним список имен пользователей информационной базы для выбора + МассивПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей(); + Для каждого Пользователь Из МассивПользователей Цикл + Список.Добавить(Пользователь.Имя); + КонецЦикла; + +КонецПроцедуры // ДобавитьВСписокЗначенийИменаПользователей() + +// Функция ТекущийСеансОбрабатываетЗадания определяет, что текущий сеанс обрабатывает задания, +// если это не так и указано установить текущий сеанс в этом качестве, то производится попытка +// установки. +// +// Параметры: +// ЗаданияОбрабатываютсяНормально - Булево - Истина, если нет отклонений в выполнении заданий. +// УстановитьТекущийСеансКакСеансОбрабатывающийЗадания - Булево - Истина, если требуется установить +// текущий сеанс, как сеанс в котором будет происходить обработка, если не удалось установить, +// тогда функция вернет Ложь. +// ОписаниеОшибки - Строка - Если НЕ ЗаданияОбрабатываютсяНормально, тогда описание отклонения: +// либо обработка долго не стартует, либо долго выполняется. +// +// Возвращаемое значение: +// Булево. +// +Функция ТекущийСеансОбрабатываетЗадания(ЗаданияОбрабатываютсяНормально = Неопределено, + Знач УстановитьТекущийСеансКакСеансОбрабатывающийЗадания = Ложь, + ОписаниеОшибки = "") Экспорт + + Если НЕ ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + ЗаданияОбрабатываютсяНормально = Истина; + ОписаниеОшибки = НСтр("ru = 'Задания обрабатываются на сервере!'"); + Возврат Ложь; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + НачатьТранзакцию(); + Попытка + Состояние = ПолучитьСостояниеОбработкиРегламентныхЗаданий(Истина); + Сеансы = ПолучитьСеансыИнформационнойБазы(); + НайденСеансОбрабатывающийЗадания = Ложь; + ТекущийСеансОбрабатываетЗадания = Ложь; + ЗаданияОбрабатываютсяНормально = Истина; + + // Найдем сеанс обработки заданий, установленный в константе СостояниеОбработкиРегламентныхЗаданий, + // среди активных сеансов, и текущий сеанс (начало текущего сеанса может понадобится + // для инициализации Структуры). + Для каждого Сеанс Из Сеансы Цикл + Если Сеанс.НомерСеанса = НомерСеансаИнформационнойБазы() Тогда + ТекущийСеанс = Сеанс; + КонецЕсли; + Если Сеанс.НомерСеанса = Состояние.НомерСеанса + И Сеанс.НачалоСеанса = Состояние.НачалоСеанса Тогда + НайденныйСеанс = Сеанс; + НайденСеансОбрабатывающийЗадания = Истина; + ТекущийСеансОбрабатываетЗадания = (Сеанс.НомерСеанса = НомерСеансаИнформационнойБазы()); + КонецЕсли; + КонецЦикла; + Если НЕ НайденСеансОбрабатывающийЗадания И УстановитьТекущийСеансКакСеансОбрабатывающийЗадания Тогда + МоментТекущегоВремени = ТекущаяДата(); + Состояние.НомерСеанса = ТекущийСеанс.НомерСеанса; + Состояние.НачалоСеанса = ТекущийСеанс.НачалоСеанса; + Состояние.ИмяКомпьютера = ИмяКомпьютера(); + Состояние.ИмяПриложения = ТекущийСеанс.ИмяПриложения; + Состояние.ИмяПользователя = ИмяПользователя(); + Состояние.ИдентификаторОчередногоЗадания = Неопределено; + Состояние.НачалоОбработкиОчередногоЗадания = МоментТекущегоВремени; + Состояние.ОкончаниеОбработкиОчередногоЗадания = МоментТекущегоВремени; + ОбновитьСостояниеОбработкиРегламентныхЗаданий(Состояние); + НайденСеансОбрабатывающийЗадания = Истина; + ТекущийСеансОбрабатываетЗадания = Истина; + ЗафиксироватьТранзакцию(); + Иначе + ОтменитьТранзакцию(); + КонецЕсли; + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Если НЕ НайденСеансОбрабатывающийЗадания Тогда + ОписаниеОшибки = НСтр("ru = 'Нет сеанса, обрабатывающего регламентные задания!'"); + ЗаданияОбрабатываютсяНормально = Ложь; + ИначеЕсли Состояние.Настройки.БлокировкаОбработкиРегламентныхЗаданий Тогда + ОписаниеОшибки = НСтр("ru = 'Выполнение регламентных заданий заблокировано!'"); + ЗаданияОбрабатываютсяНормально = Ложь; + ИначеЕсли НЕ ЗначениеЗаполнено(Состояние.ОкончаниеОбработкиОчередногоЗадания) Тогда + // Если после завершения очередного задания прошло более часа, значит задержка запуска. + Если ТекущаяДата() - 360 > Состояние.ОкончаниеОбработкиОчередногоЗадания Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Запуск обработки регламентных заданий задерживается более 1 часа! + |Возможно требуется проверка и перезапуск сеанса. Запуск ожидается + | на компьютере: %1, + | в приложении: %2, + | от имени пользователя: %3, + | в сеансе номер: %4.'"), + Строка(Состояние.ИмяКомпьютера), + Строка(Состояние.ИмяПриложения), + Строка(Состояние.ИмяПользователя), + Строка(Состояние.НомерСеанса) ); + ЗаданияОбрабатываютсяНормально = Ложь; + КонецЕсли; + + Иначе + // Если обработка продолжается более 1 часа, значить она слишком затянулась. + Если ТекущаяДата() - 360 > Состояние.НачалоОбработкиОчередногоЗадания Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("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', СвойстваПоследнегоФоновогоЗадания.Конец )); + КонецЕсли; + Если ОбработатьРегламентноеЗадание Тогда + ОбработатьРегламентноеЗадание(Задание); + ФоновоеЗаданиеВыполнялось = Истина; + КонецЕсли; + КонецЕсли; + Состояние.ОкончаниеОбработкиОчередногоЗадания = ТекущаяДата(); + ОбновитьСостояниеОбработкиРегламентныхЗаданий(Состояние, "ОкончаниеОбработкиОчередногоЗадания"); + КонецЦикла; + // Если последнее выполненное задание найти не удалось, тогда + // сбросим его Идентификатор, чтобы начать проверку регламентных заданий с первого. + ИдентификаторПоследнегоЗадания = Неопределено; + КонецЦикла; + + // Запрещаем вызов привилегированных функций после выполнения этой процедуры. + ХранилищеОбщихНастроек.Сохранить("ВыполняетсяПроцедураОбработатьРегламентныеЗадания", , Ложь); + +КонецПроцедуры // ОбработатьРегламентныеЗадания() + +// Процедура УстановитьНастройкиОбработкиРегламентныхЗаданий устанавливает +// настройки для файлового режима обработки заданий. +// +// Параметры: +// Настройки - Структура. +// +Процедура УстановитьНастройкиОбработкиРегламентныхЗаданий(Настройки) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Настройки = ОбновитьНастройки(Настройки); + + НачатьТранзакцию(); + Попытка + Состояние = ПолучитьСостояниеОбработкиРегламентныхЗаданий(Истина); + Если Состояние.Настройки.БлокировкаОбработкиРегламентныхЗаданий <> Настройки.БлокировкаОбработкиРегламентныхЗаданий Тогда + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + КонецЕсли; + Состояние.Настройки = Настройки; + ОбновитьСостояниеОбработкиРегламентныхЗаданий(Состояние); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры // УстановитьНастройкиОбработкиРегламентныхЗаданий() + +// Процедура ПолучитьНастройкиОбработкиРегламентныхЗаданий получает настройки +// для файлового режима обработки заданий. +// +// Возвращаемое значение: +// Настройки - Структура. +// +Функция ПолучитьНастройкиОбработкиРегламентныхЗаданий() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Возврат ПолучитьСостояниеОбработкиРегламентныхЗаданий().Настройки; + +КонецФункции // ПолучитьНастройкиОбработкиРегламентныхЗаданий() + +// Функция возвращает представление регламентного задания, +// это по порядку исключения незаполненных реквизитов: +// Наименование, Метаданные.Синоним, Метаданные.Имя. +// +// Параметры: +// Задание - РегламентноеЗадание, Строка - если строка, тогда УникальныйИдентификатор строкой. +// +// Возвращаемое значение: +// Строка. +// +Функция ПредставлениеРегламентногоЗадания(Знач Задание) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + + Если ТипЗнч(Задание) = Тип("РегламентноеЗадание") Тогда + РегламентноеЗадание = Задание; + Иначе + РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(Задание)); + КонецЕсли; + + Если РегламентноеЗадание <> Неопределено Тогда + Представление = РегламентноеЗадание.Наименование; + Если ПустаяСтрока(РегламентноеЗадание.Наименование) Тогда + // Применим синоним вместо наименования + Представление = РегламентноеЗадание.Метаданные.Синоним; + Если ПустаяСтрока(Представление) Тогда + // Применим имя вместо синонима + Представление = РегламентноеЗадание.Метаданные.Имя; + КонецЕсли + КонецЕсли; + Иначе + Представление = ТекстНеОпределено(); + КонецЕсли; + + Возврат Представление; + +КонецФункции // ПредставлениеРегламентногоЗадания() + +// Служебная функция, возвращающая текст "<не определено>" с локализацией. +// Используется для целей локализации +// +Функция ТекстНеОпределено() Экспорт + + Возврат НСтр("ru = '<не определено>'"); + +КонецФункции + +// Функция ПолучитьРегламентноеЗадание получает РегламентноеЗадание из информационной +// базы по строке уникального идентификатора. +// +// Параметры: +// Идентификатор - Строка уникального идентификатора РегламентногоЗадания. +// +// Возвращаемое значение: +// РегламентноеЗадание. +// +Функция ПолучитьРегламентноеЗадание(Знач Идентификатор) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + + РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(Идентификатор)); + + Если РегламентноеЗадание = Неопределено Тогда + ВызватьИсключение( НСтр("ru = 'Задание не найдено в списке! + |Возможно, оно удалено другим пользователем!'") ); + КонецЕсли; + + Возврат РегламентноеЗадание; + +КонецФункции // ПолучитьРегламентноеЗадание() + +// Процедура ОбработатьРегламентноеЗаданиеВручную предназначена для +// "ручного" немедленного выполнения процедуры регламентного задания +// либо в сеансе клиента (в файловой ИБ), либо в фоновом задании на сервере (в серверной ИБ). +// Применяется в любом режиме соединения. +// "Ручной" режим запуска не влияет на выполнение регламентного задания по аварийному +// и основному расписаниям, т.к. не указывается ссылка на регламентное задание у фонового задания. +// Тип ФоновоеЗадание не допускает установки такой ссылки, поэтому для файлового режима применяется +// тоже правило. +// +// Параметры: +// Задание - РегламентноеЗадание, Строка уникального идентификатора РегламентногоЗадания. +// МоментЗапуска - Неопределено, Дата(дата и время). Для файловой ИБ устанавливает переданный +// момент, как момент запуска. Для серверной ИБ - возвращает момент запуска +// фонового задания по факту. +// ИдентификаторФоновогоЗадания - Строка - идентификатор запущенного фонового задания. +// +// +Процедура ОбработатьРегламентноеЗаданиеВручную(Знач Задание, + МоментЗапуска = Неопределено, + ИдентификаторФоновогоЗадания = "") Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + + Задание = ?(ТипЗнч(Задание) = Тип("РегламентноеЗадание"), Задание, ПолучитьРегламентноеЗадание(Задание)); + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + ОбработатьРегламентноеЗадание(Задание, Истина, МоментЗапуска, ИдентификаторФоновогоЗадания); + // Обновление состояния уже выполнено в вызванной процедуре. + Иначе + НачатьТранзакцию(); + Попытка + Состояние = ПолучитьСостояниеОбработкиРегламентныхЗаданий(Истина); + НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запуск вручную: %1'"), ПредставлениеРегламентногоЗадания(Задание)); + ФоновоеЗадание = ФоновыеЗадания.Выполнить(Задание.Метаданные.ИмяМетода, Задание.Параметры, Задание.Ключ, НаименованиеФоновогоЗадания); + ИдентификаторФоновогоЗадания = Строка(ФоновоеЗадание.УникальныйИдентификатор); + Состояние.Соответствие_ИФЗ_ИРЗ_ЗапущенныеНаСервереВручную.Вставить( ИдентификаторФоновогоЗадания, Строка(Задание.УникальныйИдентификатор) ); + МоментЗапуска = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ФоновоеЗадание.УникальныйИдентификатор).Начало; + ОбновитьСостояниеОбработкиРегламентныхЗаданий(Состояние); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецЕсли; + +КонецПроцедуры // ОбработатьРегламентноеЗаданиеВручную() + +// Функция НужноУведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий возвращает +// значение флажка настройки обработки регламентных заданий. +// +// Возвращаемое значение: +// Булево. +// +Функция НужноУведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий(ПериодУведомления) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + УведомлятьОНекорректномСостоянии = Ложь; + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Состояние = ПолучитьСостояниеОбработкиРегламентныхЗаданий(); + ПериодУведомления = Состояние.Настройки.ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданий; + ПериодУведомления = ?(ПериодУведомления <= 0, 1, ПериодУведомления); + УведомлятьОНекорректномСостоянии = Состояние.Настройки.УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий; + Иначе + ПериодУведомления = 1; + КонецЕсли; + + Возврат УведомлятьОНекорректномСостоянии; + +КонецФункции // НужноУведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий() + +// Функция СообщенияИОписанияОшибокРегламентногоЗадания возвращает +// многострочную Строку содержащую Сообщения и ОписаниеИнформацииОбОшибке, +// последнее фоновое задание найдено по идентификатору регламентного задания +// и сообщения/ошибки есть. +// +// Параметры: +// Задание - РегламентноеЗадание, Строка - УникальныйИдентификатор +// РегламентногоЗадания строкой. +// +// Возвращаемое значение: +// Строка. +// +Функция СообщенияИОписанияОшибокРегламентногоЗадания(Знач Задание) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + + ИдентификаторРегламентногоЗадания = ?(ТипЗнч(Задание) = Тип("РегламентноеЗадание"), Строка(Задание.УникальныйИдентификатор), Задание); + СвойстваПоследнегоФоновогоЗадания = ПолучитьСвойстваПоследнегоФоновогоЗаданияОбработкиРегламентногоЗадания(ИдентификаторРегламентногоЗадания); + Возврат ?(СвойстваПоследнегоФоновогоЗадания = Неопределено, + "", + СообщенияИОписанияОшибокФоновогоЗадания(СвойстваПоследнегоФоновогоЗадания.Идентификатор) ); + +КонецФункции // СообщенияИОписанияОшибокРегламентногоЗадания() + +// Возвращает параметры открытия сеанса обработки регламентных заданий. +// +// Параметры: +// ПоНастройкеАвтоОткрытия - Булево - открывать сеанс, если настроено выполнять +// автоматическое открытие и не серверная ИБ и не Веб-клиент и +// сеанс уже не открыт. В других случаях устанавливается Отказ. +// +// Возвращаемое значение: +// Структура - ТребуетсяОткрытьОтдельныйСеанс - Булево - Истина. +// ДополнительныеПараметрыКоманднойСтроки - Строка - дополнительные параметры командной строки для +// открытия сеанса обработки регламентных заданий. +// ВыполненаПопыткаОткрытия - Булево - Ложь, для использования в вызывающей процедуре. +// УведомлятьОНекорректномСостоянииОбработки - Булево. +// ПериодУведомления - Число. +// Отказ - Булево. +// ОписаниеОшибки - Строка. +// +Функция ПараметрыОткрытияСеансаОбработкиРегламентныхЗаданий(Знач ПоНастройкеАвтоОткрытия = Ложь) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Результат = Новый Структура; + Результат.Вставить("ТребуетсяОткрытьОтдельныйСеанс", Ложь); + Результат.Вставить("ВыполненаПопыткаОткрытия", Ложь); + Результат.Вставить("ДополнительныеПараметрыКоманднойСтроки", ""); + Результат.Вставить("УведомлятьОНекорректномСостоянииОбработки", Ложь); + Результат.Вставить("ПериодУведомления", Неопределено); + Результат.Вставить("Отказ", Ложь); + Результат.Вставить("ОписаниеОшибки", ""); + + Если ПоНастройкеАвтоОткрытия Тогда + Результат.Вставить("ТекущийПользовательАдминистратор", ПравоДоступа("Администрирование", Метаданные, ПользователиИнформационнойБазы.ТекущийПользователь())); + КонецЕсли; + + Результат.УведомлятьОНекорректномСостоянииОбработки = НужноУведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий(Результат.ПериодУведомления); + + Состояние = ПолучитьСостояниеОбработкиРегламентныхЗаданий(); + + Если ПоНастройкеАвтоОткрытия И НЕ Состояние.Настройки.АвтоматическиОткрыватьОтдельныйСеансОбработкиРегламентныхЗаданий Тогда + Возврат Результат; + КонецЕсли; + + Если НЕ ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Если ПоНастройкеАвтоОткрытия Тогда + Возврат Результат; + Иначе + Результат.Отказ = Истина; + Результат.ОписаниеОшибки = НСтр("ru = 'Регламентные задания обрабатываются на сервере!'"); + Возврат Результат; + КонецЕсли; + КонецЕсли; + + ЗаданияОбрабатываютсяНормально = Неопределено; + ТекущийСеансОбрабатываетЗадания(ЗаданияОбрабатываютсяНормально); + Если ЗаданияОбрабатываютсяНормально Тогда + Если ПоНастройкеАвтоОткрытия Тогда + Возврат Результат; + Иначе + Результат.Отказ = Истина; + Результат.ОписаниеОшибки = НСтр("ru = 'Сеанс, выполняющий регламентные задания, уже открыт!'"); + Возврат Результат; + КонецЕсли; + КонецЕсли; + + НомерТекущегоСеанса = НомерСеансаИнформационнойБазы(); + // Определим начало текущего сеанса. + НачалоТекущегоСеанса = '00010101'; + Сеансы = ПолучитьСеансыИнформационнойБазы(); + Для каждого Сеанс Из Сеансы Цикл + Если Сеанс.НомерСеанса = НомерТекущегоСеанса Тогда + НачалоТекущегоСеанса = Сеанс.НачалоСеанса; + Прервать; + КонецЕсли; + КонецЦикла; + Результат.ДополнительныеПараметрыКоманднойСтроки = """" + + " /C""DoScheduledJobs SkipMessageBox AloneIBSession " + + "SessionNumber=" + НомерТекущегоСеанса + " SessionStarted=" + НачалоТекущегоСеанса + """"; + + Результат.ТребуетсяОткрытьОтдельныйСеанс = Истина; + + Возврат Результат; + +КонецФункции // ПараметрыОткрытияСеансаОбработкиРегламентныхЗаданий() + +Функция ПолучитьРасписаниеРегламентногоЗадания(Знач Идентификатор) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + + Возврат ПолучитьРегламентноеЗадание(Идентификатор).Расписание; + +КонецФункции + +Процедура УстановитьРасписаниеРегламентногоЗадания(Знач Идентификатор, Знач Расписание) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Задание = ПолучитьРегламентноеЗадание(Идентификатор); + Задание.Расписание = Расписание; + Задание.Записать(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ МЕТОДЫ ОБОБЩЕННОГО МЕНЕДЖЕРА ФОНОВЫХ ЗАДАНИЙ +// +// Обобщенный менеджер фоновых заданий работает как файловом, так и серверном режиме +// эксплуатации информационной базы. + +// Функция ПолучитьТаблицуСвойствФоновыхЗаданий() "эмулирует" функцию +// ФоновыеЗадания.ПолучитьФоновыеЗадания() для любого режима соединения. +// Структуру таблицы смотри в функции ПроверитьТаблицуФоновыхЗаданий(). +// +// Параметры: +// Отбор - Структура - допустимые поля: +// УникальныйИдентификатор, Ключ, Состояние, Начало, Конец, +// Наименование, ИмяМетода, РегламентноеЗадание. +// ВсегоЗаданий - Число - возвращает общее количество заданий без учета отбора. +// ПрочитанноеСостояние - Неопределено, только для внутреннего использования. +// +// Возвращаемое значение: +// ТаблицаЗначений - возвращается таблица после отбора. +// +Функция ПолучитьТаблицуСвойствФоновыхЗаданий(Отбор = Неопределено, ВсегоЗаданий = 0, Знач ПрочитанноеСостояние = Неопределено) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + + Если ПрочитанноеСостояние = Неопределено Тогда + НачатьТранзакцию(); + КонецЕсли; + Попытка + Если ПрочитанноеСостояние = Неопределено Тогда + Состояние = ПолучитьСостояниеОбработкиРегламентныхЗаданий(Истина); + Иначе + Состояние = ПрочитанноеСостояние; + КонецЕсли; + ТаблицаОбновлена = НЕ ПроверитьТаблицуФоновыхЗаданий(Состояние.ТаблицаФоновыхЗаданий); + Таблица = Состояние.ТаблицаФоновыхЗаданий; + Если НЕ ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + // Дополним таблицу фоновых заданий. + // 1. Определим момент с которого нужно дополнять. + // Для этого найдем первое активное задание, выполняемое на сервере. + // Если такового нет, тогда последнее задание выполняемое на сервере. + // Дата начала его выполнения и будет началом периода. + СтрокиАктивных = Таблица.НайтиСтроки(Новый Структура("НаСервере, Состояние", Истина, СостояниеФоновогоЗадания.Активно)); + Начало = Неопределено; + Если СтрокиАктивных.Количество() <> 0 Тогда + // Выберем минимальную дату начала. + Начало = СтрокиАктивных[0].Начало; + Для каждого Строка Из СтрокиАктивных Цикл + Начало = ?(Строка.Начало < Начало, Строка.Начало, Начало); + КонецЦикла; + Иначе + ПоследняяСтрока = Таблица.Найти(Истина, "НаСервере"); + Если ПоследняяСтрока <> Неопределено Тогда + Начало = ПоследняяСтрока.Начало; + КонецЕсли; + КонецЕсли; + Если Начало = Неопределено Тогда + ТекущиеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(); + Иначе + ТекущиеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Новый Структура("Начало", Начало)); + КонецЕсли; + + // 2. Обновим совпадающие и вставим новые фоновые задания. + // Считаем, что список заданий отсортирован по убыванию колонки Начало. + // 2.1. По ходу цикла проверим, что все задания в таблице со статусом Активно были получены с сервера. + // Если на сервере их уже по какой-то причине нет, тогда устанавливаем статус: Завершено. + АктивныеЗадания = Таблица.НайтиСтроки(Новый Структура("Состояние", СостояниеФоновогоЗадания.Активно)); + НомерЗадания = ТекущиеФоновыеЗадания.Количество() - 1; + Пока НомерЗадания >= 0 Цикл + Задание = ТекущиеФоновыеЗадания[НомерЗадания]; + НайденныеСтроки = Таблица.НайтиСтроки(Новый Структура("Идентификатор, Начало", Строка(Задание.УникальныйИдентификатор), Задание.Начало)); + Если НайденныеСтроки.Количество() = 0 Тогда + Строка = Таблица.Вставить(0); + ТаблицаОбновлена = Истина; + Иначе + Строка = НайденныеСтроки[0]; + Если Строка.Состояние <> СостояниеФоновогоЗадания.Активно Тогда + // Не имеет смысла обновлять те неактивные задания, которые уже + // есть в таблице. Они попали в список повторно. + НомерЗадания = НомерЗадания - 1; + Продолжить; + КонецЕсли; + ТаблицаОбновлена = Истина; + // Проверка активных задач в таблице, удаленных на сервере, путем удаления найденных из списка. + АктивныеЗадания.Удалить(АктивныеЗадания.Найти(Строка)); + КонецЕсли; + ЗаполнитьЗначенияСвойств(Строка, Задание); + Строка.НаСервере = Истина; + Строка.Идентификатор = Задание.УникальныйИдентификатор; + Строка.ИдентификаторРегламентногоЗадания = ?(Задание.РегламентноеЗадание = Неопределено, + // Может быть уже установлен, если была обработка вручную. + Строка.ИдентификаторРегламентногоЗадания, + Задание.РегламентноеЗадание.УникальныйИдентификатор); + Строка.ОписаниеИнформацииОбОшибке = ?(Задание.ИнформацияОбОшибке = Неопределено, "", ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке)); + НомерЗадания = НомерЗадания - 1; + КонецЦикла; + // 2.3. Сбросим состояние Активно для активных заданий в таблице, но не найденных на сервере. + ТаблицаОбновлена = ТаблицаОбновлена ИЛИ АктивныеЗадания.Количество() > 0; + Для каждого ПотерянноеАктивноеЗадание Из АктивныеЗадания Цикл + ПотерянноеАктивноеЗадание.Состояние = СостояниеФоновогоЗадания.Завершено; + КонецЦикла; + + // 3. Установим идентификаторы регламентных заданий тем фоновым заданиям, которые были выполнены вручную. + // И удалим несуществующие (устаревшие) соответствия. + ЗапущенныеВручную = Состояние.Соответствие_ИФЗ_ИРЗ_ЗапущенныеНаСервереВручную; + ТаблицаОбновлена = ТаблицаОбновлена ИЛИ ЗапущенныеВручную.Количество() > 0; + + МассивКлючейУдалить = Новый Массив; + Для каждого КлючИЗначение из ЗапущенныеВручную Цикл + Строка = Таблица.Найти(КлючИЗначение.Ключ, "Идентификатор"); + Если Строка = Неопределено Тогда + МассивКлючейУдалить.Добавить(КлючИЗначение.Ключ); + Иначе + Строка.ИдентификаторРегламентногоЗадания = КлючИЗначение.Значение; + КонецЕсли; + КонецЦикла; + Для каждого Ключ Из МассивКлючейУдалить Цикл + ЗапущенныеВручную.Удалить(Ключ); + КонецЦикла; + + КонецЕсли; + // Почистим лишние задания (больше 1000). + НомерЗадания = Таблица.Количество()-1; + Пока НомерЗадания >= 1000 Цикл + Таблица.Удалить(НомерЗадания); + НомерЗадания = НомерЗадания - 1; + КонецЦикла; + Если ПрочитанноеСостояние = Неопределено Тогда + Если ТаблицаОбновлена Тогда + ОбновитьСостояниеОбработкиРегламентныхЗаданий(Состояние); + ЗафиксироватьТранзакцию(); + Иначе + ОтменитьТранзакцию(); + КонецЕсли; + Иначе + Таблица = Таблица.Скопировать(); + КонецЕсли; + ВсегоЗаданий = Таблица.Количество(); + Исключение + Если ПрочитанноеСостояние = Неопределено Тогда + ОтменитьТранзакцию(); + КонецЕсли; + ВызватьИсключение; + КонецПопытки; + + // Отбор фоновых заданий. + Если Отбор <> Неопределено Тогда + Начало = Неопределено; + Конец = Неопределено; + Состояние = Неопределено; + Если Отбор.Свойство("Начало") Тогда + Начало = ?(ЗначениеЗаполнено(Отбор.Начало), Отбор.Начало, Неопределено); + Отбор.Удалить("Начало"); + КонецЕсли; + Если Отбор.Свойство("Конец") Тогда + Конец = ?(ЗначениеЗаполнено(Отбор.Конец), Отбор.Конец, Неопределено); + Отбор.Удалить("Конец"); + КонецЕсли; + Если Отбор.Свойство("Состояние") Тогда + Если ТипЗнч(Отбор.Состояние) = Тип("Массив") Тогда + Состояние = Отбор.Состояние; + Отбор.Удалить("Состояние"); + КонецЕсли; + КонецЕсли; + Если Отбор.Количество() <> 0 Тогда + Строки = Таблица.НайтиСтроки(Отбор); + Иначе + Строки = Таблица; + КонецЕсли; + // Выполним дополнительный фильтр по периоду и состоянию (если отбор определен). + НомерЭлемента = Строки.Количество() - 1; + Пока НомерЭлемента >= 0 Цикл + Если Начало <> Неопределено И Начало > Строки[НомерЭлемента].Начало ИЛИ + Конец <> Неопределено И Конец < ?(ЗначениеЗаполнено(Строки[НомерЭлемента].Конец), Строки[НомерЭлемента].Конец, ТекущаяДата()) ИЛИ + Состояние <> Неопределено И Состояние.Найти(Строки[НомерЭлемента].Состояние) = Неопределено Тогда + Строки.Удалить(НомерЭлемента); + КонецЕсли; + НомерЭлемента = НомерЭлемента - 1; + КонецЦикла; + // Удалим лишние строки из таблицы. + Если ТипЗнч(Строки) = Тип("Массив") Тогда + НомерСтроки = ВсегоЗаданий - 1; + Пока НомерСтроки >= 0 Цикл + Если Строки.Найти(Таблица[НомерСтроки]) = Неопределено Тогда + Таблица.Удалить(Таблица[НомерСтроки]); + КонецЕсли; + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + КонецЕсли; + КонецЕсли; + + Возврат Таблица; + +КонецФункции // ПолучитьТаблицуСвойствФоновыхЗаданий() + +// Функция возвращает свойства ФоновогоЗадания по строке уникального идентификатора. +// +// Параметры: +// Идентификатор - Строка - уникального идентификатора ФоновогоЗадания. +// ИменаСвойств - Строка, если заполнено, возвращается структура с указанными свойствами. +// ПрочитанноеСостояние - Неопределено, только для внутреннего использования. +// +// Возвращаемое значение: +// СтрокаТаблицыЗначений, Структура - свойства ФоновогоЗадания. +// +Функция ПолучитьСвойстваФоновогоЗадания(Идентификатор, ИменаСвойств = "", ПрочитанноеСостояние = Неопределено) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + + Отбор = Новый Структура("Идентификатор", Идентификатор); + ТаблицаСвойствФоновыхЗаданий = ПолучитьТаблицуСвойствФоновыхЗаданий(Отбор,, ПрочитанноеСостояние); + + Если ТаблицаСвойствФоновыхЗаданий.Количество() = 0 Тогда + ВызватьИсключение( НСтр("ru = 'Фоновое задание не найдено!'") ); + КонецЕсли; + + Если ЗначениеЗаполнено(ИменаСвойств) Тогда + Результат = Новый Структура(ИменаСвойств); + ЗаполнитьЗначенияСвойств(Результат, ТаблицаСвойствФоновыхЗаданий[0]); + Иначе + Результат = ТаблицаСвойствФоновыхЗаданий[0]; + КонецЕсли; + + Возврат Результат; + +КонецФункции // ПолучитьСвойстваФоновогоЗадания() + +// Функция ПолучитьСвойстваПоследнегоФоновогоЗаданияОбработкиРегламентногоЗадания возвращает +// свойства последнего фонового задания выполненного по регламентного заданию, если оно есть. +// Процедура работает, как в файл-серверном, так и в клиент-серверном режимах. +// +// Параметры: +// РегламентноеЗадание - РегламентноеЗадание, Строка - строка уникального идентификатора РегламентногоЗадания. +// ПрочитанноеСостояние - Неопределено, только для внутреннего использования. +// +// Возвращаемое значение: +// СтрокаТаблицыЗначений, Неопределено. +// +Функция ПолучитьСвойстваПоследнегоФоновогоЗаданияОбработкиРегламентногоЗадания(РегламентноеЗадание, ПрочитанноеСостояние = Неопределено) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + + ИдентификаторРегламентногоЗадания = ?(ТипЗнч(РегламентноеЗадание) = Тип("РегламентноеЗадание"), Строка(РегламентноеЗадание.УникальныйИдентификатор), РегламентноеЗадание); + ТаблицаСвойствФоновыхЗаданий = ПолучитьТаблицуСвойствФоновыхЗаданий(Новый Структура("ИдентификаторРегламентногоЗадания", ИдентификаторРегламентногоЗадания),, ПрочитанноеСостояние); + ТаблицаСвойствФоновыхЗаданий.Сортировать("Конец Возр"); + + Если ТаблицаСвойствФоновыхЗаданий.Количество() = 0 Тогда + СвойстваФоновогоЗадания = Неопределено; + ИначеЕсли НЕ ЗначениеЗаполнено(ТаблицаСвойствФоновыхЗаданий[0].Конец) Тогда + СвойстваФоновогоЗадания = ТаблицаСвойствФоновыхЗаданий[0]; + Иначе + СвойстваФоновогоЗадания = ТаблицаСвойствФоновыхЗаданий[ТаблицаСвойствФоновыхЗаданий.Количество()-1]; + КонецЕсли; + + Возврат СвойстваФоновогоЗадания; + +КонецФункции // ПолучитьСвойстваПоследнегоФоновогоЗаданияОбработкиРегламентногоЗадания() + +// Процедура ОтменитьФоновоеЗадание отменяет фоновое задание, если +// это возможно, а именно, если оно выполняется на сервере, и активно. +// +// Параметры: +// Идентификатор - Строка уникального идентификатора ФоновогоЗадания. +// +// Возвращаемое значение: +// Булево - НЕ Отказ. +// +Процедура ОтменитьФоновоеЗадание(Идентификатор) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + + Если ПолучитьСвойстваФоновогоЗадания(Идентификатор, "Состояние").Состояние <> СостояниеФоновогоЗадания.Активно Тогда + ВызватьИсключение( НСтр("ru = 'Задание не выполняется, его нельзя отменить!'") ); + + ИначеЕсли ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + ВызватьИсключение( НСтр("ru ='Действие возможно только для серверной информационной базы! + |Невозможно отменить фоновое задание, + |выполняемое в сеансе файловой информационной базы! + | + |Если фоновое задание выполняется слишком долго и его нужно + |непременно прекратить, закройте сеанс, в котором + |обрабатываются регламентные задания. + | + |Если сеанс не закрывается, а приложение не отвечает, + |можно снять его принудительно, однако есть риск + |потерять изменения выполненные в фоновом задании!'") ); + КонецЕсли; + + Отбор = Новый Структура("УникальныйИдентификатор", Новый УникальныйИдентификатор(Идентификатор)); + МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); + Если МассивФоновыхЗаданий.Количество() = 1 Тогда + МассивФоновыхЗаданий[0].Отменить(); + Иначе + ВызватьИсключение( НСтр("ru = 'Фоновое задание не найдено на сервере!'") ); + КонецЕсли; + +КонецПроцедуры // ОтменитьФоновоеЗадание() + +// Функция СообщенияИОписанияОшибокФоновогоЗадания возвращает +// многострочную Строку содержащую Сообщения и ОписаниеИнформацииОбОшибке, +// если фоновое задание найдено по идентификатору и сообщения/ошибки есть. +// +// Параметры: +// Задание - Строка - УникальныйИдентификатор ФоновогоЗадания строкой. +// +// Возвращаемое значение: +// Строка. +// +Функция СообщенияИОписанияОшибокФоновогоЗадания(Идентификатор) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + + СвойстваФоновогоЗадания = ПолучитьСвойстваФоновогоЗадания(Идентификатор); + Строка = ""; + Для каждого Сообщение Из СвойстваФоновогоЗадания.СообщенияПользователю Цикл + Строка = Строка + ?(Строка = "", + Сообщение, + " + | + |" + Сообщение); + КонецЦикла; + Если ЗначениеЗаполнено(СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке) Тогда + Строка = Строка + ?(Строка = "", + СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке, + " + | + |" + СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке); + КонецЕсли; + + Возврат Строка; + +КонецФункции // СообщенияИОписанияОшибокФоновогоЗадания() + +// Процедура ОчиститьИсториюФоновыхЗаданий очищает таблицу +// хранения выполненных и выполняемых (в случае с серверным режимом) фоновых заданий. +// +Процедура ОчиститьИсториюФоновыхЗаданий() Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + + НачатьТранзакцию(); + Попытка + Состояние = ПолучитьСостояниеОбработкиРегламентныхЗаданий(Истина); + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Состояние.ТаблицаФоновыхЗаданий = Неопределено; + Иначе + ТекущиеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(); + Идентификаторы = Новый Соответствие; + Для каждого ФоновоеЗадание Из ТекущиеФоновыеЗадания Цикл + Идентификаторы.Вставить(Строка(ФоновоеЗадание.УникальныйИдентификатор), 1); + КонецЦикла; + Индекс = Состояние.ТаблицаФоновыхЗаданий.Количество()-1; + Пока Индекс >=0 Цикл + Если Идентификаторы.Получить(Состояние.ТаблицаФоновыхЗаданий[Индекс].Идентификатор) <> 1 Тогда + Состояние.ТаблицаФоновыхЗаданий.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + КонецЕсли; + ПроверитьТаблицуФоновыхЗаданий(Состояние.ТаблицаФоновыхЗаданий); + ОбновитьСостояниеОбработкиРегламентныхЗаданий(Состояние); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ МЕТОДЫ ОБОБЩЕННОГО МЕНЕДЖЕРА ФОНОВЫХ ЗАДАНИЙ + +// Функция ПроверитьТаблицуФоновыхЗаданий проверяет структуру ТаблицыЗначений +// для хранения выполненных/выполняемых фоновых заданий, +// и создает пустую таблицу, если есть различия. +// +// Параметры: +// Таблица - ТаблицаЗначений - таблица у которой будет проверяться структура. +// +// Возвращаемое значение: +// Булево - когда Истина структура была правильная. +// +Функция ПроверитьТаблицуФоновыхЗаданий(Таблица) + + НоваяТаблица = Новый ТаблицаЗначений; + НоваяТаблица.Колонки.Добавить("НаСервере", Новый ОписаниеТипов("Булево")); + НоваяТаблица.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); + НоваяТаблица.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка")); + НоваяТаблица.Колонки.Добавить("Ключ", Новый ОписаниеТипов("Строка")); + НоваяТаблица.Колонки.Добавить("Начало", Новый ОписаниеТипов("Дата")); + НоваяТаблица.Колонки.Добавить("Конец", Новый ОписаниеТипов("Дата")); + НоваяТаблица.Колонки.Добавить("ИдентификаторРегламентногоЗадания", Новый ОписаниеТипов("Строка")); + НоваяТаблица.Колонки.Добавить("Состояние", Новый ОписаниеТипов("СостояниеФоновогоЗадания")); + НоваяТаблица.Колонки.Добавить("ИмяМетода", Новый ОписаниеТипов("Строка")); + НоваяТаблица.Колонки.Добавить("Расположение", Новый ОписаниеТипов("Строка")); + НоваяТаблица.Колонки.Добавить("ОписаниеИнформацииОбОшибке", Новый ОписаниеТипов("Строка")); + НоваяТаблица.Колонки.Добавить("ПопыткаЗапуска", Новый ОписаниеТипов("Число")); + НоваяТаблица.Колонки.Добавить("СообщенияПользователю", Новый ОписаниеТипов("Массив")); + НоваяТаблица.Индексы.Добавить("Идентификатор, Начало"); + СтруктураПравильная = Истина; + Если ТипЗнч(Таблица) = Тип("ТаблицаЗначений") Тогда + Для каждого Колонка Из НоваяТаблица.Колонки Цикл + // Будем проводить только проверку наличия имен колонок без проверки типов. + Если Таблица.Колонки.Найти(Колонка.Имя) = Неопределено Тогда + СтруктураПравильная = Ложь; + КонецЕсли; + КонецЦикла; + Иначе + СтруктураПравильная = Ложь; + КонецЕсли; + + Если НЕ СтруктураПравильная Тогда + Таблица = НоваяТаблица; + КонецЕсли; + + Возврат СтруктураПравильная; + +КонецФункции // ПроверитьТаблицуФоновыхЗаданий() + +// Функция ОбновитьНастройки служит для заполнения/восстановления структуры свойств +// настроек, хранимых в структуре "Состояние" свойства Настройки. +// +// Параметры: +// Настройки - Неопределено, Структура. +// +// Возвращаемое значение: +// Структура - обновленные настройки. +// +Функция ОбновитьНастройки(Знач Настройки = Неопределено) + + НоваяСтруктураНастроек = Новый Структура(); + НоваяСтруктураНастроек.Вставить("БлокировкаОбработкиРегламентныхЗаданий", Ложь); + // Если нужно и можно, то при запуске клиентского приложения автоматически открывать сеанс обработки регламентных заданий. + НоваяСтруктураНастроек.Вставить("АвтоматическиОткрыватьОтдельныйСеансОбработкиРегламентныхЗаданий", Ложь); + // Если задания не обрабатываются или обработка "висит", уведомлять пользователя. + НоваяСтруктураНастроек.Вставить("УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий", Ложь); + // Период, минут. + НоваяСтруктураНастроек.Вставить("ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданий", 15); + + // Копирование существующих свойств. + Если ТипЗнч(Настройки) = Тип("Структура") Тогда + Для каждого КлючИзначение Из НоваяСтруктураНастроек Цикл + Если Настройки.Свойство(КлючИзначение.Ключ) Тогда + Если ТипЗнч(НоваяСтруктураНастроек[КлючИзначение.Ключ]) = ТипЗнч(Настройки[КлючИзначение.Ключ]) Тогда + НоваяСтруктураНастроек[КлючИзначение.Ключ] = Настройки[КлючИзначение.Ключ]; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если НЕ (НоваяСтруктураНастроек.ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданий >= 1 И + НоваяСтруктураНастроек.ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданий <= 99 ) Тогда + + НоваяСтруктураНастроек.ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданий = 15; + КонецЕсли; + + Возврат НоваяСтруктураНастроек; + +КонецФункции + +// Функция ПолучитьСостояниеОбработкиРегламентныхЗаданий возвращает +// структуру, описывающую состояние обработки заданий. +// +Функция ПолучитьСостояниеОбработкиРегламентныхЗаданий(Заблокировать = Ложь) + + // Подготовка данных для проверки или начальной установки свойств прочитанного состояния. + НоваяСтруктура = Новый Структура(); + НоваяСтруктура.Вставить("Настройки", Новый Структура); + // Соответствие идентификаторов фоновых заданий идентификаторам регламентных заданий, + // тех фоновых заданий, которые были запущены на сервере вручную. + НоваяСтруктура.Вставить("Соответствие_ИФЗ_ИРЗ_ЗапущенныеНаСервереВручную", Новый Соответствие()); + // Хранение истории выполнения фоновых заданий. + НоваяСтруктура.Вставить("ТаблицаФоновыхЗаданий", Новый ТаблицаЗначений); + НоваяСтруктура.Вставить("НомерСеанса", 0); + НоваяСтруктура.Вставить("НачалоСеанса", '00010101'); + НоваяСтруктура.Вставить("ИмяКомпьютера", ""); + НоваяСтруктура.Вставить("ИмяПриложения", ""); + НоваяСтруктура.Вставить("ИмяПользователя", ""); + НоваяСтруктура.Вставить("ИдентификаторОчередногоЗадания", ""); + НоваяСтруктура.Вставить("НачалоОбработкиОчередногоЗадания", '00010101'); + НоваяСтруктура.Вставить("ОкончаниеОбработкиОчередногоЗадания", '00010101'); + + Если Заблокировать Тогда + Блокировка = Новый БлокировкаДанных; + Элемент = Блокировка.Добавить("Константа.СостояниеОбработкиРегламентныхЗаданий"); + Элемент.Режим = РежимБлокировкиДанных.Исключительный; + Блокировка.Заблокировать(); + КонецЕсли; + + Состояние = Константы.СостояниеОбработкиРегламентныхЗаданий.Получить().Получить(); + + // Копирование существующих свойств. + Если ТипЗнч(Состояние) = Тип(НоваяСтруктура) Тогда + Для каждого КлючИзначение Из НоваяСтруктура Цикл + Если Состояние.Свойство(КлючИзначение.Ключ) Тогда + Если ТипЗнч(НоваяСтруктура[КлючИзначение.Ключ]) = ТипЗнч(Состояние[КлючИзначение.Ключ]) Тогда + НоваяСтруктура[КлючИзначение.Ключ] = Состояние[КлючИзначение.Ключ]; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + НоваяСтруктура.Настройки = ОбновитьНастройки(НоваяСтруктура.Настройки); + + ПроверитьТаблицуФоновыхЗаданий(НоваяСтруктура.ТаблицаФоновыхЗаданий); + + Возврат НоваяСтруктура; + +КонецФункции + +// Процедура ОбновитьСостояниеОбработкиРегламентныхЗаданий() сохраняет +// в константе СостояниеОбработкиРегламентныхЗаданий переданное состояние. +// +// Параметры: +// Состояние - Структура - изменённое значение функции +// ПолучитьСостояниеОбработкиРегламентныхЗаданий(). +// ИзмененныеСвойства - Неопределено, Строка; +// Неопределено - требуется записать состояние (есть внешняя транзакция); +// Строка - список имен свойств, разделенный запятыми, +// которые необходимо обновить в отдельной транзакции. +// +Процедура ОбновитьСостояниеОбработкиРегламентныхЗаданий(Состояние, Знач ИзмененныеСвойства = Неопределено) + + Если ИзмененныеСвойства = Неопределено Тогда + Константы.СостояниеОбработкиРегламентныхЗаданий.Установить(Новый ХранилищеЗначения(Состояние)); + Иначе + НачатьТранзакцию(); + Попытка + ТекущееСостояние = ПолучитьСостояниеОбработкиРегламентныхЗаданий(Истина); + ЗаполнитьЗначенияСвойств(ТекущееСостояние, Состояние, ИзмененныеСвойства); + Состояние = ТекущееСостояние; + Константы.СостояниеОбработкиРегламентныхЗаданий.Установить(Новый ХранилищеЗначения(Состояние)); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецЕсли; + +КонецПроцедуры // ОбновитьСостояниеОбработкиРегламентныхЗаданий() + +// Процедура ОбработатьРегламентноеЗадание предназначена +// только для режима "файл-сервер", используется в процедуре +// ОбработатьРегламентныеЗадания() +// +// Параметры: +// Состояние - Структура. +// Задание - РегламентноеЗадание. +// ЗапускВручную - Булево. +// МоментЗапуска - Неопределено, Дата(дата и время).Устанавливает значение, к момент запуска. +// ИдентификаторФоновогоЗадания - Строка - идентификатор запущенного фонового задания. +// +Процедура ОбработатьРегламентноеЗадание(Знач Задание, + Знач ЗапускВручную = Ложь, + Знач МоментЗапуска = Неопределено, + ИдентификаторФоновогоЗадания = "") + + НачатьТранзакцию(); + Попытка + Состояние = ПолучитьСостояниеОбработкиРегламентныхЗаданий(Истина); + СвойстваПоследнегоФоновогоЗадания = ПолучитьСвойстваПоследнегоФоновогоЗаданияОбработкиРегламентногоЗадания(Задание, Состояние); + + ИмяМетода = Задание.Метаданные.ИмяМетода; + НаименованиеФоновогоЗадания = ?(ЗапускВручную, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запуск вручную: %1'"), + ПредставлениеРегламентногоЗадания(Задание)), + ""); + + МоментЗапуска = ?(ТипЗнч(МоментЗапуска) <> Тип("Дата") ИЛИ НЕ ЗначениеЗаполнено(МоментЗапуска), + ТекущаяДата(), + МоментЗапуска); + Таблица = Состояние.ТаблицаФоновыхЗаданий; + // Создадим новое фоновое задание в таблице. + СвойстваФоновогоЗадания = Таблица.Вставить(0); + СвойстваФоновогоЗадания.Идентификатор = Строка(Новый УникальныйИдентификатор()); + ИдентификаторФоновогоЗадания = СвойстваФоновогоЗадания.Идентификатор; + СвойстваФоновогоЗадания.ПопыткаЗапуска = ?(СвойстваПоследнегоФоновогоЗадания <> Неопределено И + СвойстваПоследнегоФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно, + СвойстваПоследнегоФоновогоЗадания.ПопыткаЗапуска + 1, + 1); + СвойстваФоновогоЗадания.Наименование = НаименованиеФоновогоЗадания; + СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания + = Строка(Задание.УникальныйИдентификатор); + СвойстваФоновогоЗадания.Расположение = "\\" + ИмяКомпьютера(); + СвойстваФоновогоЗадания.ИмяМетода = ИмяМетода; + СвойстваФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.Активно; + СвойстваФоновогоЗадания.Начало = МоментЗапуска; + // Подготовка команды для выполнения метода вместо фонового задания. + СтрокаПараметров = ""; + Индекс = Задание.Параметры.Количество()-1; + Пока Индекс >= 0 Цикл + Если НЕ ПустаяСтрока(СтрокаПараметров) Тогда + СтрокаПараметров = СтрокаПараметров + ", "; + КонецЕсли; + СтрокаПараметров = СтрокаПараметров + "Задание.Параметры[" + Индекс + "]"; + Индекс = Индекс - 1; + КонецЦикла; + // + ОбновитьСостояниеОбработкиРегламентныхЗаданий(Состояние); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + ПолучитьСообщенияПользователю(Истина); + Попытка + Выполнить("" + ИмяМетода + "(" + СтрокаПараметров + ");"); + СвойстваФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.Завершено; + Исключение + СвойстваФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно; + СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + // Зафиксируем окончание выполнения метода. + СвойстваФоновогоЗадания.Конец = ТекущаяДата(); + СвойстваФоновогоЗадания.СообщенияПользователю = ПолучитьСообщенияПользователю(Истина); + + // Обновление свойств состояния. + НачатьТранзакцию(); + Попытка + Состояние = ПолучитьСостояниеОбработкиРегламентныхЗаданий(Истина); + ТекущиеСвойстваФоновогоЗадания = Состояние.ТаблицаФоновыхЗаданий.Найти(СвойстваФоновогоЗадания.Идентификатор, "Идентификатор"); + Если ТекущиеСвойстваФоновогоЗадания <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ТекущиеСвойстваФоновогоЗадания, + СвойстваФоновогоЗадания, + "Состояние, + |ОписаниеИнформацииОбОшибке, + |Конец, + |СообщенияПользователю"); + ОбновитьСостояниеОбработкиРегламентныхЗаданий(Состояние); + ЗафиксироватьТранзакцию(); + Иначе + // Если в процессе выполнения была очищена таблица фоновых заданий, обновление состояния не требуется. + ОтменитьТранзакцию(); + КонецЕсли; + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + +КонецПроцедуры // ОбработатьРегламентноеЗадание() diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСервер/РегламентныеЗаданияСервер.mdo b/SSL/src/CommonModules/РегламентныеЗаданияСервер/РегламентныеЗаданияСервер.mdo new file mode 100644 index 000000000..ea6f02bf1 --- /dev/null +++ b/SSL/src/CommonModules/РегламентныеЗаданияСервер/РегламентныеЗаданияСервер.mdo @@ -0,0 +1,11 @@ + + + РегламентныеЗаданияСервер + + ru + Регламентные задания сервер + + true + true + true + diff --git a/SSL/src/CommonModules/СоединенияИБ/Module.bsl b/SSL/src/CommonModules/СоединенияИБ/Module.bsl new file mode 100644 index 000000000..e044bcd7b --- /dev/null +++ b/SSL/src/CommonModules/СоединенияИБ/Module.bsl @@ -0,0 +1,580 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ БЛОКИРОВКИ И ЗАВЕРШЕНИЯ СОЕДИНЕНИЙ С ИБ + +// Устанавливает блокировку соединений ИБ. +// +// Параметры +// ТекстСообщения – Строка – текст, который будет частью сообщения об ошибке +// при попытке установки соединения с заблокированной +// информационной базой. +// +// КодРазрешения - Строка - строка, которая должна быть добавлена к параметру +// командной строки "/uc" или к параметру строки +// соединения "uc", чтобы установить соединение с +// информационной базой несмотря на блокировку. +// +// Возвращаемое значение: +// Булево – Истина, если блокировка установлена успешно. +// Ложь, если для выполнения блокировки недостаточно прав. +// +Функция УстановитьБлокировкуСоединений(Знач ТекстСообщения = "", + Знач КодРазрешения = "КодРазрешения") Экспорт + + Если НЕ ПравоДоступа("Администрирование", Метаданные) Тогда + Возврат Ложь; + КонецЕсли; + + Блокировка = Новый БлокировкаСеансов; + Блокировка.Установлена = Истина; + Блокировка.Начало = ТекущаяДата(); + Блокировка.КодРазрешения = КодРазрешения; + Блокировка.Сообщение = СформироватьСообщениеБлокировки(ТекстСообщения, КодРазрешения); + УстановитьБлокировкуСеансов(Блокировка); + Возврат Истина; + +КонецФункции + +// Определяет, установлена ли блокировка соединений при пакетном +// обновлении конфигурации информационной базы +// +Функция УстановленаБлокировкаСоединений() Экспорт + + ТекущийРежим = ПолучитьБлокировкуСеансов(); + Возврат ТекущийРежим.Установлена; + +КонецФункции + +// Определяет, установлена ли блокировка соединений при пакетном +// обновлении конфигурации информационной базы +// +Функция ПараметрыБлокировкиСеансов() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ТекущийРежим = ПолучитьБлокировкуСеансов(); + + Возврат Новый Структура( + "Установлена,Начало,Конец,Сообщение,ИнтервалОжиданияЗавершенияРаботыПользователей,КоличествоСеансов,ТекущаяДатаСеанса", + ТекущийРежим.Установлена, + ТекущийРежим.Начало, + ТекущийРежим.Конец, + ТекущийРежим.Сообщение, + 5 * 60, // 5 минут; интервал ожидания завершения пользователей после установки + // блокировки информационной базы (в секундах). + ПолучитьСоединенияИнформационнойБазы().Количество(), + ТекущаяДатаСеанса() + ); + +КонецФункции + +// Снять блокировку информационной базы. +// +// Возвращаемое значение: +// Булево – Истина, если операция выполнена успешно. +// Ложь, если для выполнения операции недостаточно прав. +// +Функция РазрешитьРаботуПользователей() Экспорт + + Если НЕ ПравоДоступа("Администрирование", Метаданные) Тогда + Возврат Ложь; + КонецЕсли; + + ТекущийРежим = ПолучитьБлокировкуСеансов(); + Если ТекущийРежим.Установлена Тогда + НовыйРежим = Новый БлокировкаСеансов; + НовыйРежим.Установлена = Ложь; + УстановитьБлокировкуСеансов(НовыйРежим); + КонецЕсли; + Возврат Истина; + +КонецФункции + +// Отключить все активные соединения ИБ (кроме текущего сеанса). +// +// Параметры +// ПараметрыАдминистрированияИБ – Структура – параметры администрирования ИБ. +// +// Возвращаемое значение: +// Булево – результат отключения соединений. +// +Функция ОтключитьСоединениеИБ(ПараметрыАдминистрированияИБ, НомерСоединения, Сообщение) Экспорт + + Если ПолучитьСоединенияИнформационнойБазы().Количество() <= 1 Тогда + Возврат Истина; // Отключены все пользователи, кроме текущего сеанса + КонецЕсли; + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Сообщение = ПолучитьНазванияСоединенийИБ(ТекстНеУдалосьЗавершитьРаботуПользователей()); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Предупреждение, , , Сообщение); + Возврат Ложь; // Невозможно принудительно отсоединить подключения в файловом режиме работы + КонецЕсли; + + Попытка + Возврат РазорватьСоединение(ПараметрыАдминистрированияИБ, НомерСоединения); + Исключение + Сообщение = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , Сообщение); + Возврат Ложь; + КонецПопытки; + +КонецФункции + +// Осуществляет попытку подключиться к кластеру серверов и получить список +// активных соединений к ИБ и использованием указанных параметров администрирования. +// +// Параметры +// ПараметрыАдминистрированияИБ – Структура – параметры администрирования ИБ +// ВыдаватьСообщения – Булево – разрешить вывод интерактивных сообщений. +// +// Возвращаемое значение: +// Булево – Истина, если проверка завершена успешно. +// +Процедура ПроверитьПараметрыАдминистрированияИБ(ПараметрыАдминистрированияИБ, + Знач ПодробноеСообщениеОбОшибке = Ложь) Экспорт + + Попытка + Соединения = ПолучитьАктивныеСоединенияИБ(ПараметрыАдминистрированияИБ); + Исключение + Сообщение = НСтр("ru = 'Не удалось подключиться к кластеру серверов.'"); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, + Сообщение + Символы.ПС + ОписаниеОшибки()); + Если ПодробноеСообщениеОбОшибке Тогда + Сообщение = Сообщение + " " + ИнформацияОбОшибке().Описание; + КонецЕсли; + ВызватьИсключение Сообщение; + КонецПопытки; + +КонецПроцедуры + +// Выполнить завершение активных сеансов. +// +// Возвращаемое значение: +// Булево - строковый код ошибки; пустая строка - в случае успешного завершения. +// +Функция ОтключитьСоединенияИБПоПараметрамЗапуска(Знач ПараметрЗапуска) Экспорт + + ПараметрыАдминистрированияИБ = СоединенияИБ.ПолучитьПараметрыАдминистрированияИБ(); + ПараметрыЗапуска = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПараметрЗапуска,";"); + + Если ПараметрыЗапуска.Количество() > 1 Тогда + ПараметрыАдминистрированияИБ.ИмяАдминистратораИБ = Врег(ПараметрыЗапуска[1]); + КонецЕсли; + + Если ПараметрыЗапуска.Количество() > 2 Тогда + ПараметрыАдминистрированияИБ.ПарольАдминистратораИБ = Врег(ПараметрыЗапуска[2]); + КонецЕсли; + + Результат = ОтключитьСоединенияИБ(ПараметрыАдминистрированияИБ); + + Возврат Результат; + +КонецФункции + +// Отключить все активные соединения ИБ (кроме текущего сеанса). +// +// Параметры +// ПараметрыАдминистрированияИБ – Структура – параметры администрирования ИБ. +// +// Возвращаемое значение: +// Булево – результат отключения соединений. +// +Функция ОтключитьСоединенияИБ(ПараметрыАдминистрированияИБ) Экспорт + + Если ПолучитьСоединенияИнформационнойБазы().Количество() <= 1 Тогда + Возврат Истина; // Отключены все пользователи, кроме текущего сеанса + КонецЕсли; + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Сообщение = ПолучитьНазванияСоединенийИБ(ТекстНеУдалосьЗавершитьРаботуПользователей()); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Предупреждение, , , Сообщение); + Возврат Ложь; // Невозможно принудительно отсоединить подключения в файловом режиме работы + КонецЕсли; + + Попытка + Соединения = ПолучитьАктивныеСоединенияИБ(ПараметрыАдминистрированияИБ); + Для каждого Соединение Из Соединения.Соединения Цикл + // Разрываем Connections с ИБ + СтрСообщения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Разрывается соединение: Пользователь %1, компьютер %2, установлено %3, режим %4'"), + Соединение.UserName, + Соединение.HostName, + Соединение.ConnectedAt, + Соединение.AppID ); + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Информация, , , СтрСообщения); + Соединения.СоединениеСРабочимПроцессом.Disconnect(Соединение); + КонецЦикла; + + Возврат ПолучитьСоединенияИнформационнойБазы().Количество() <= 1; + Исключение + ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), + УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки); + Возврат Ложь; + КонецПопытки; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// СЕРВИСНЫЕ ФУНКЦИИ +// + +// Возвращает текст сообщения блокировки сеансов. +// +Функция СформироватьСообщениеБлокировки(Знач Сообщение, Знач КодРазрешения) Экспорт + + ПараметрыАдминистрированияИБ = ПолучитьПараметрыАдминистрированияИБ(); + ПризнакФайловогоРежима = Ложь; + ПутьКИБ = ПутьКИнформационнойБазе(ПризнакФайловогоРежима, ПараметрыАдминистрированияИБ.ПортКластераСерверов); + СтрокаПутиКИнформационнойБазе = ?(ПризнакФайловогоРежима = Истина, "/F", "/S") + ПутьКИБ; + ТекстСообщения = ""; + Если НЕ ПустаяСтрока(Сообщение) Тогда + ТекстСообщения = Сообщение + Символы.ПС + Символы.ПС; + КонецЕсли; + + ТекстСообщения = ТекстСообщения + + НСтр("ru = '%1 + |Чтобы принудительно разблокировать информационную базу, воспользуйтесь консолью кластера серверов или запустите ""1С:Предприятие"" с параметрами: + |ENTERPRISE %2 /CРазрешитьРаботуПользователей /UC%3'"); + + ТекстСообщения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстСообщения, + СоединенияИБКлиентСервер.ТекстДляАдминистратора(), + СтрокаПутиКИнформационнойБазе, + НСтр("ru = '<код разрешения>'")); + + Возврат ТекстСообщения; + +КонецФункции + +// Возвращает текстовую константу для формирования сообщений. +// Используется в целях локализации. +// +Функция ТекстНеУдалосьЗавершитьРаботуПользователей() Экспорт + + Возврат НСтр("ru = 'Не удалось завершить работу пользователей:'"); + +КонецФункции + +// Возвращает текстовую константу для формирования сообщений. +// +Функция СобытиеЖурналаРегистрации() + + Возврат НСтр("ru = 'Завершение работы пользователей'"); + +КонецФункции + +Функция НовыеПараметрыАдминистрированияИБ(Знач ИмяАдминистратораИБ = "", + Знач ПарольАдминистратораИБ = "", + Знач ИмяАдминистратораКластера = "", + Знач ПарольАдминистратораКластера = "", + Знач ПортКластераСерверов = 0, + Знач ПортАгентаСервера = 0) Экспорт + + Возврат Новый Структура("ИмяАдминистратораИБ, + |ПарольАдминистратораИБ, + |ИмяАдминистратораКластера, + |ПарольАдминистратораКластера, + |ПортКластераСерверов, + |ПортАгентаСервера", + ИмяАдминистратораИБ, + ПарольАдминистратораИБ, + ИмяАдминистратораКластера, + ПарольАдминистратораКластера, + ПортКластераСерверов, + ПортАгентаСервера); + +КонецФункции + +Функция ПолучитьНазванияСоединенийИБ(Знач Сообщение) Экспорт + + Результат = Сообщение; + Для каждого Соединение Из ПолучитьСоединенияИнформационнойБазы() Цикл + Если Соединение.НомерСоединения <> НомерСоединенияИнформационнойБазы() Тогда + Результат = Результат + Символы.ПС + " - " + Соединение; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Получить сохраненные параметры администрирования кластера серверов. +// +Функция ПолучитьПараметрыАдминистрированияИБ() Экспорт + + СтруктураНастроек = Константы.ПараметрыАдминистрированияИБ.Получить().Получить(); + Если ТипЗнч(СтруктураНастроек) <> Тип("Структура") Тогда + Возврат НовыеПараметрыАдминистрированияИБ(); + Иначе + Возврат СтруктураНастроек; + КонецЕсли; + +КонецФункции + +Процедура ЗаписатьПараметрыАдминистрированияИБ(Параметры) Экспорт + + Константы.ПараметрыАдминистрированияИБ.Установить(Новый ХранилищеЗначения(Параметры)); + +КонецПроцедуры + +Функция ПолучитьАктивныеСоединенияИБ(НастройкаБлокировки, + Знач ВсеКромеТекущего = Истина) + + Результат = Новый Структура("СоединениеСРабочимПроцессом, Соединения", Неопределено, Новый Массив); + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + ВызватьИсключение НСтр("ru = 'Невозможно получить список активных соединения в Файловом варианте системы'"); + КонецЕсли; + + ПодстрокиСтрокиСоединения = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + СтрокаСоединенияИнформационнойБазы(), ";"); + + ИмяСервера = СтроковыеФункцииКлиентСервер.СократитьДвойныеКавычки(Сред(ПодстрокиСтрокиСоединения[0], 7)); + ИмяИБ = СтроковыеФункцииКлиентСервер.СократитьДвойныеКавычки(Сред(ПодстрокиСтрокиСоединения[1], 6)); + + COMСоединитель = Новый COMОбъект(ОбщегоНазначения.ИмяCOMСоединителя()); + + РазделительПорта = Найти(ИмяСервера, ":"); + Если РазделительПорта > 0 Тогда + ИмяИПортСервера = ИмяСервера; + ИмяСервера = Сред(ИмяИПортСервера, 1, РазделительПорта - 1); + НомерПортаКластера = Число(Сред(ИмяИПортСервера, РазделительПорта + 1)); + ИначеЕсли НастройкаБлокировки.ПортКластераСерверов <> 0 Тогда + НомерПортаКластера = НастройкаБлокировки.ПортКластераСерверов; + Иначе + НомерПортаКластера = COMСоединитель.RMngrPortDefault; + КонецЕсли; + + ИдентификаторАгентаСервера = ИмяСервера; + Если НастройкаБлокировки.ПортАгентаСервера <> 0 Тогда + ИдентификаторАгентаСервера = ИдентификаторАгентаСервера + ":" + + Формат(НастройкаБлокировки.ПортАгентаСервера, "ЧГ=0"); + КонецЕсли; + + // Подключение к агенту сервера + АгентСервера = COMСоединитель.ConnectAgent(ИдентификаторАгентаСервера); + + // Найдем необходимый нам кластер + Для каждого Кластер Из АгентСервера.GetClusters() Цикл + + Если Кластер.MainPort <> НомерПортаКластера Тогда + Продолжить; + КонецЕсли; + + АгентСервера.Authenticate(Кластер, НастройкаБлокировки.ИмяАдминистратораКластера, + НастройкаБлокировки.ПарольАдминистратораКластера); + + // Получаем список рабочих процессов + WorkingProcesses = АгентСервера.GetWorkingProcesses(Кластер); + Для каждого WorkingProcess Из WorkingProcesses Цикл + + Если WorkingProcess.Running <> 1 Тогда + Продолжить; + КонецЕсли; + + // Для каждого рабочего процесса создаем соединение с рабочим процессом + ConnectToWorkProcess = COMСоединитель.ConnectWorkingProcess("tcp://" + WorkingProcess.HostName + + ":" + Формат(WorkingProcess.MainPort, "ЧГ=0")); + ConnectToWorkProcess.AddAuthentication(НастройкаБлокировки.ИмяАдминистратораИБ, + НастройкаБлокировки.ПарольАдминистратораИБ); + Результат.СоединениеСРабочимПроцессом = ConnectToWorkProcess; + // Получаем список ИБ рабочего процесса + InfoBases = ConnectToWorkProcess.GetInfoBases(); + Для каждого InfoBase Из InfoBases Цикл + // Ищем нужную базу + Если ВРег(InfoBase.Name) <> ВРег(ИмяИБ) Тогда + Продолжить; + КонецЕсли; + + // Получаем массив соединений с ИБ + Connections = ConnectToWorkProcess.GetInfoBaseConnections(InfoBase); + Для каждого Connection Из Connections Цикл + Если НЕ ВсеКромеТекущего ИЛИ (НомерСоединенияИнформационнойБазы() <> connection.ConnID) Тогда + Результат.Соединения.Добавить(Connection); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + КонецЦикла; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция РазорватьСоединение(ПараметрыСоединенияССервером1СПредприятие, + знач НомерСоединениеДляРазрыва) + + Результат = Новый Структура("СоединениеСРабочимПроцессом, Соединения", Неопределено, Новый Массив); + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + ВызватьИсключение НСтр("ru = 'Невозможно получить список активных соединения в Файловом варианте системы'"); + КонецЕсли; + + ПодстрокиСтрокиСоединения = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + СтрокаСоединенияИнформационнойБазы(), ";"); + + ИмяСервера = СтроковыеФункцииКлиентСервер.СократитьДвойныеКавычки(Сред(ПодстрокиСтрокиСоединения[0], 7)); + ИмяИБ = СтроковыеФункцииКлиентСервер.СократитьДвойныеКавычки(Сред(ПодстрокиСтрокиСоединения[1], 6)); + + COMСоединитель = Новый COMОбъект(ОбщегоНазначения.ИмяCOMСоединителя()); + + РазделительПорта = Найти(ИмяСервера, ":"); + Если РазделительПорта > 0 Тогда + ИмяИПортСервера = ИмяСервера; + ИмяСервера = Сред(ИмяИПортСервера, 1, РазделительПорта - 1); + НомерПортаКластера = Число(Сред(ИмяИПортСервера, РазделительПорта + 1)); + ИначеЕсли ПараметрыСоединенияССервером1СПредприятие.ПортКластераСерверов <> 0 Тогда + НомерПортаКластера = ПараметрыСоединенияССервером1СПредприятие.ПортКластераСерверов; + Иначе + НомерПортаКластера = COMСоединитель.RMngrPortDefault; + КонецЕсли; + + ИдентификаторАгентаСервера = ИмяСервера; + Если ПараметрыСоединенияССервером1СПредприятие.ПортАгентаСервера <> 0 Тогда + ИдентификаторАгентаСервера = ИдентификаторАгентаСервера + ":" + + Формат(ПараметрыСоединенияССервером1СПредприятие.ПортАгентаСервера, "ЧГ=0"); + КонецЕсли; + + // Подключение к агенту сервера + АгентСервера = COMСоединитель.ConnectAgent(ИдентификаторАгентаСервера); + + // Найдем необходимый нам кластер + Для каждого Кластер Из АгентСервера.GetClusters() Цикл + + Если Кластер.MainPort <> НомерПортаКластера Тогда + Продолжить; + КонецЕсли; + + АгентСервера.Authenticate(Кластер, ПараметрыСоединенияССервером1СПредприятие.ИмяАдминистратораКластера, + ПараметрыСоединенияССервером1СПредприятие.ПарольАдминистратораКластера); + + // Получаем список рабочих процессов + WorkingProcesses = АгентСервера.GetWorkingProcesses(Кластер); + Для каждого WorkingProcess Из WorkingProcesses Цикл + + Если WorkingProcess.Running <> 1 Тогда + Продолжить; + КонецЕсли; + + // Для каждого рабочего процесса создаем соединение с рабочим процессом + ConnectToWorkProcess = COMСоединитель.ConnectWorkingProcess("tcp://" + WorkingProcess.HostName + + ":" + Формат(WorkingProcess.MainPort, "ЧГ=0")); + ConnectToWorkProcess.AddAuthentication(ПараметрыСоединенияССервером1СПредприятие.ИмяАдминистратораИБ, + ПараметрыСоединенияССервером1СПредприятие.ПарольАдминистратораИБ); + // Получаем список ИБ рабочего процесса + InfoBases = ConnectToWorkProcess.GetInfoBases(); + + Для каждого InfoBase Из InfoBases Цикл + // Ищем нужную базу + Если ВРег(InfoBase.Name) <> ВРег(ИмяИБ) Тогда + Продолжить; + КонецЕсли; + + // Получаем массив соединений с ИБ + Connections = ConnectToWorkProcess.GetInfoBaseConnections(InfoBase); + Для каждого Connection Из Connections Цикл + Если НомерСоединениеДляРазрыва = Connection.ConnID Тогда + ConnectToWorkProcess.Disconnect(Connection); + СтрСообщение = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Разорвано соединение: Пользователь %1, компьютер %2, установлено %3, режим %4'"), + Connection.UserName, + Connection.HostName, + Connection.ConnectedAt, + Connection.AppID); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация, , , СтрСообщение); + Возврат Истина; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + КонецЦикла; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +// Получить строку соединения ИБ, если задан нестандартный порт кластера серверов. +// +// Параметры +// ПортКластераСерверов - Число - нестандартный порт кластера серверов +// +// Возвращаемое значение: +// Строка - строка соединения ИБ +// +Функция ПолучитьСтрокуСоединенияИнформационнойБазы(Знач ПортКластераСерверов = 0) Экспорт + + Результат = СтрокаСоединенияИнформационнойБазы(); + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() ИЛИ (ПортКластераСерверов = 0) Тогда + Возврат Результат; + КонецЕсли; + + ПодстрокиСтрокиСоединения = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Результат, ";"); + ИмяСервера = СтроковыеФункцииКлиентСервер.СократитьДвойныеКавычки(Сред(ПодстрокиСтрокиСоединения[0], 7)); + ИмяИБ = СтроковыеФункцииКлиентСервер.СократитьДвойныеКавычки(Сред(ПодстрокиСтрокиСоединения[1], 6)); + Результат = "Srvr=" + """" + ИмяСервера + ":" + + Формат(ПортКластераСерверов, "ЧГ=0") + """;" + + "Ref=" + """" + ИмяИБ + """;"; + Возврат Результат; + +КонецФункции + +// Определение пути к информационной базе +// +Функция ПутьКИнформационнойБазе(ПризнакФайловогоРежима = Неопределено, Знач ПортКластераСерверов = 0) Экспорт + + СтрокаСоединения = ПолучитьСтрокуСоединенияИнформационнойБазы(ПортКластераСерверов); + + ПозицияПоиска = Найти(Врег(СтрокаСоединения), "FILE="); + + Если ПозицияПоиска = 1 Тогда // файловая ИБ + + ПутьКИБ = Сред(СтрокаСоединения, 6, СтрДлина(СтрокаСоединения) - 6); + ПризнакФайловогоРежима = Истина; + + Иначе + ПризнакФайловогоРежима = Ложь; + + ПозицияПоиска = Найти(Врег(СтрокаСоединения), "SRVR="); + + Если НЕ (ПозицияПоиска = 1) Тогда + Возврат Неопределено; + КонецЕсли; + + ПозицияТочкиСЗапятой = Найти(СтрокаСоединения, ";"); + НачальнаяПозицияКопирования = 6 + 1; + КонечнаяПозицияКопирования = ПозицияТочкиСЗапятой - 2; + + ИмяСервера = Сред(СтрокаСоединения, НачальнаяПозицияКопирования, КонечнаяПозицияКопирования - НачальнаяПозицияКопирования + 1); + + СтрокаСоединения = Сред(СтрокаСоединения, ПозицияТочкиСЗапятой + 1); + + // позиция имени сервера + ПозицияПоиска = Найти(Врег(СтрокаСоединения), "REF="); + + Если НЕ (ПозицияПоиска = 1) Тогда + Возврат Неопределено; + КонецЕсли; + + НачальнаяПозицияКопирования = 6; + ПозицияТочкиСЗапятой = Найти(СтрокаСоединения, ";"); + КонечнаяПозицияКопирования = ПозицияТочкиСЗапятой - 2; + + ИмяИБНаСервере = Сред(СтрокаСоединения, НачальнаяПозицияКопирования, КонечнаяПозицияКопирования - НачальнаяПозицияКопирования + 1); + + ПутьКИБ = """" + ИмяСервера + "\" + ИмяИБНаСервере + """"; + КонецЕсли; + + Возврат ПутьКИБ; + +КонецФункции diff --git a/SSL/src/CommonModules/СоединенияИБ/СоединенияИБ.mdo b/SSL/src/CommonModules/СоединенияИБ/СоединенияИБ.mdo new file mode 100644 index 000000000..c33032c24 --- /dev/null +++ b/SSL/src/CommonModules/СоединенияИБ/СоединенияИБ.mdo @@ -0,0 +1,10 @@ + + + СоединенияИБ + + ru + Соединения ИБ + + true + true + diff --git a/SSL/src/CommonModules/СоединенияИБГлобальный/Module.bsl b/SSL/src/CommonModules/СоединенияИБГлобальный/Module.bsl new file mode 100644 index 000000000..a6f031c62 --- /dev/null +++ b/SSL/src/CommonModules/СоединенияИБГлобальный/Module.bsl @@ -0,0 +1,113 @@ +/////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ ОЖИДАНИЯ + +// Выполнить завершение текущего сеанса, если установлена блокировка соединений +// с информационной базой. +// +Процедура КонтрольРежимаЗавершенияРаботыПользователей() Экспорт + + // Получим текущее значение параметров блокировки + ТекущийРежим = СоединенияИБ.ПараметрыБлокировкиСеансов(); + БлокировкаУстановлена = ТекущийРежим.Установлена; + + Если НЕ БлокировкаУстановлена Тогда + Возврат; + КонецЕсли; + + ВремяНачалаБлокировки = ТекущийРежим.Начало; + ВремяОкончанияБлокировки = ТекущийРежим.Конец; + + ИнтервалПредупреждения = ТекущийРежим.ИнтервалОжиданияЗавершенияРаботыПользователей; + ИнтервалЗакрытьСЗапросом = 0; + ИнтервалЗакрытьБезЗапроса = - ИнтервалПредупреждения / 5; + ИнтервалПрекратить = - ИнтервалПредупреждения / 2.5; + ТекущийМомент = ТекущаяДата(); + + Если ВремяОкончанияБлокировки <> '00010101' И ТекущийМомент > ВремяОкончанияБлокировки Тогда + Возврат; + КонецЕсли; + + ТекстСообщения = СоединенияИБКлиентСервер.ИзвлечьСообщениеБлокировки(ТекущийРежим.Сообщение); + + Если НЕ ЗначениеЗаполнено(ВремяНачалаБлокировки) + ИЛИ ВремяНачалаБлокировки - ТекущийМомент <= ИнтервалПрекратить Тогда + + ЗавершитьРаботуСистемы(Истина); + + ИначеЕсли ВремяНачалаБлокировки - ТекущийМомент <= ИнтервалЗакрытьБезЗапроса Тогда + + Предупреждение(НСтр("ru = 'Работа системы завершается.'"), 30); + ЗавершитьРаботуСистемы(Ложь); + + ИначеЕсли ВремяНачалаБлокировки - ТекущийМомент <= ИнтервалЗакрытьСЗапросом Тогда + + Предупреждение(НСтр("ru = 'Работа системы завершается.'"), 30); + ЗавершитьРаботуСистемы(Истина); + + ИначеЕсли ВремяНачалаБлокировки - ТекущийМомент <= ИнтервалПредупреждения Тогда + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Работа системы будет завершена в %1.'"), + ВремяНачалаБлокировки); + Предупреждение(ТекстСообщения, 30); + + КонецЕсли; + +КонецПроцедуры + +// Выполнить завершение активных сеансов, если превышено время ожидания, а затем +// завершить текущий сеанс. +// +Процедура ЗавершитьРаботуПользователей() Экспорт + + // Получим текущее значение параметров блокировки + ТекущийРежим = СоединенияИБ.ПараметрыБлокировкиСеансов(); + + КоличествоСеансов = ТекущийРежим.КоличествоСеансов; + Если КоличествоСеансов <= 1 Тогда + // Отключены все пользователи, кроме текущего сеанса + // В последнюю очередь завершается сеанс, запущенный с параметром "ЗавершитьРаботуПользователей". + // Такой порядок отключений необходим для обновления конфигурации с помощью пакетного файла + ЗавершитьРаботуСистемы(Ложь); + Возврат; + КонецЕсли; + + БлокировкаУстановлена = ТекущийРежим.Установлена; + Если НЕ БлокировкаУстановлена Тогда + Возврат; + КонецЕсли; + + ВремяНачалаБлокировки = ТекущийРежим.Начало; + ИнтервалОтключения = - ТекущийРежим.ИнтервалОжиданияЗавершенияРаботыПользователей; + ТекущийМомент = ТекущаяДата(); + ПринудительноеЗавершение = НЕ ЗначениеЗаполнено(ВремяНачалаБлокировки) + ИЛИ ВремяНачалаБлокировки - ТекущийМомент <= ИнтервалОтключения; + + Если НЕ ПринудительноеЗавершение Тогда + + ТекстСообщения = НСтр("ru = 'Активных соединений: %1. + |Следующая проверка соединений будет выполнена через минуту.'"); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстСообщения, КоличествоСеансов); + Состояние(НСтр("ru = 'Выполняется завершение сеансов'"), , + ТекстСообщения, БиблиотекаКартинок.Информация32); + + Возврат; + КонецЕсли; + + // после начала блокировки сеансы всех пользователей должны быть отключены + // если этого не произошло пробуем принудительно прервать соединения + ОтключитьОбработчикОжидания("ЗавершитьРаботуПользователей"); + + Результат = СоединенияИБ.ОтключитьСоединенияИБПоПараметрамЗапуска(ПараметрЗапуска); + Если Результат Тогда + Состояние(НСтр("ru = 'Завершение сеансов выполнено успешно'"), , + НСтр("ru = 'Работа системы завершается...'"), БиблиотекаКартинок.Информация32); + ЗавершитьРаботуСистемы(Ложь); + Иначе + Состояние(НСтр("ru = 'Завершение сеансов не выполнено!'"), + НСтр("ru = 'Подробности см. в Журнале регистрации.'"), + БиблиотекаКартинок.Предупреждение32); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/СоединенияИБГлобальный/СоединенияИБГлобальный.mdo b/SSL/src/CommonModules/СоединенияИБГлобальный/СоединенияИБГлобальный.mdo new file mode 100644 index 000000000..1346b0d26 --- /dev/null +++ b/SSL/src/CommonModules/СоединенияИБГлобальный/СоединенияИБГлобальный.mdo @@ -0,0 +1,12 @@ + + + СоединенияИБГлобальный + + ru + Соединения ИБГлобальный + + true + true + true + true + diff --git a/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl b/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl new file mode 100644 index 000000000..abb47c1ef --- /dev/null +++ b/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl @@ -0,0 +1,106 @@ +// Процедура подключает обработчик ожидания КонтрольРежимаЗавершенияРаботыПользователей +// +Процедура УстановитьКонтрольРежимаЗавершенияРаботыПользователей() Экспорт + + Если ПолучитьСкоростьКлиентскогоСоединения() <> СкоростьКлиентскогоСоединения.Обычная Тогда + Возврат; + КонецЕсли; + + РежимБлокировки = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ПараметрыБлокировкиСеансов; + ТекущееВремя = РежимБлокировки.ТекущаяДатаСеанса; + Если РежимБлокировки.Установлена + И (НЕ ЗначениеЗаполнено(РежимБлокировки.Начало) ИЛИ ТекущееВремя >= РежимБлокировки.Начало) + И (НЕ ЗначениеЗаполнено(РежимБлокировки.Конец) ИЛИ ТекущееВремя <= РежимБлокировки.Конец) Тогда + // Если пользователь зашел в базу, в которой установлена режим блокировки, значит использовался ключ /UC. + // Завершать работу такого пользователя не следует + Возврат; + КонецЕсли; + + ПодключитьОбработчикОжидания("КонтрольРежимаЗавершенияРаботыПользователей", 60); + +КонецПроцедуры + +// Обработать параметры запуска, связанные с завершение и разрешение соединений ИБ. +// +// Параметры +// ЗначениеПараметраЗапуска – Строка – главный параметр запуска +// ПараметрыЗапуска – Массив – дополнительные параметры запуска, разделенные +// символом ";". +// +// Возвращаемое значение: +// Булево – Истина, если требуется прекратить выполнение запуска системы. +// +Функция ОбработатьПараметрыЗапуска(Знач ЗначениеПараметраЗапуска, Знач ПараметрыЗапуска) Экспорт + + // Обработка параметров запуска программы - + // ЗапретитьРаботуПользователей и РазрешитьРаботуПользователей + Если ЗначениеПараметраЗапуска = Врег("РазрешитьРаботуПользователей") Тогда + + Если НЕ СоединенияИБ.РазрешитьРаботуПользователей() Тогда + ТекстСообщения = НСтр("ru = 'Параметр запуска РазрешитьРаботуПользователей не отработан. Нет прав на администрирование информационной базы.'"); + Предупреждение(ТекстСообщения); + Возврат Ложь; + КонецЕсли; + + ЗавершитьРаботуСистемы(Ложь); + Возврат Истина; + + // Параметр может содержать две дополнительные части, разделенные символом ";" - + // имя и пароль администратора ИБ, от имени которого происходит подключение к кластеру серверов + // в клиент-серверном варианте развертывания системы. Их необходимо передавать в случае, + // если текущий пользователь не является администратором ИБ. + // См. использование в процедуре ЗавершитьРаботуПользователей(). + ИначеЕсли ЗначениеПараметраЗапуска = Врег("ЗавершитьРаботуПользователей") Тогда + + // поскольку блокировка еще не установлена, то при входе в систему + // для данного пользователя был подключен обработчик ожидания завершения работы. + // Отключаем его. Так как для этого пользователя подключается специализированный обработчики ожидания + // "ЗавершитьРаботуПользователей", который ориентирован на то, что данный пользователь + // должен быть отключен последним. + ОтключитьОбработчикОжидания("КонтрольРежимаЗавершенияРаботыПользователей"); + + Если НЕ СоединенияИБ.УстановитьБлокировкуСоединений() Тогда + ТекстСообщения = НСтр("ru = 'Параметр запуска ЗавершитьРаботуПользователей не отработан. Нет прав на администрирование информационной базы.'"); + Предупреждение(ТекстСообщения); + Возврат Ложь; + КонецЕсли; + + ПодключитьОбработчикОжидания("ЗавершитьРаботуПользователей", 60); + ЗавершитьРаботуПользователей(); + Возврат Истина; + + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Подключить обработчик ожидания КонтрольРежимаЗавершенияРаботыПользователей или +// ЗавершитьРаботуПользователей в зависимости от параметра УстановитьБлокировкуСоединений. +// +Процедура УстановитьОбработчикиОжиданияЗавершенияРаботыПользователей(Знач УстановитьБлокировкуСоединений) Экспорт + + Если УстановитьБлокировкуСоединений Тогда + // поскольку блокировка еще не установлена, то при входе в систему + // для данного пользователя был подключен обработчик ожидания завершения работы. + // Отключаем его. Так как для этого пользователя подключается специализированный обработчик ожидания + // "ЗавершитьРаботуПользователей", который ориентирован на то, что данный пользователь + // должен быть отключен последним. + + ОтключитьОбработчикОжидания("КонтрольРежимаЗавершенияРаботыПользователей"); + ПодключитьОбработчикОжидания("ЗавершитьРаботуПользователей", 60); + ЗавершитьРаботуПользователей(); + ПоказатьОповещениеПользователя(НСтр("ru = 'Режим блокировки'"), + "e1cib/app/Обработка.БлокировкаСоединенийСИнформационнойБазой", + НСтр("ru = 'Установлена блокировка соединений с информационной базой.'"), + БиблиотекаКартинок.Информация32); + Иначе + ОтключитьОбработчикОжидания("ЗавершитьРаботуПользователей"); + ПодключитьОбработчикОжидания("КонтрольРежимаЗавершенияРаботыПользователей", 60); + ПоказатьОповещениеПользователя(НСтр("ru = 'Режим блокировки'"), + "e1cib/app/Обработка.БлокировкаСоединенийСИнформационнойБазой", + НСтр("ru = 'Снята блокировка соединений с информационной базой.'"), + БиблиотекаКартинок.Информация32); + КонецЕсли; + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonModules/СоединенияИБКлиент/СоединенияИБКлиент.mdo b/SSL/src/CommonModules/СоединенияИБКлиент/СоединенияИБКлиент.mdo new file mode 100644 index 000000000..96e9ae1de --- /dev/null +++ b/SSL/src/CommonModules/СоединенияИБКлиент/СоединенияИБКлиент.mdo @@ -0,0 +1,11 @@ + + + СоединенияИБКлиент + + ru + Соединения ИБКлиент + + true + true + true + diff --git a/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl b/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl new file mode 100644 index 000000000..1180c741f --- /dev/null +++ b/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl @@ -0,0 +1,18 @@ +// Возвращает текстовую константу для формирования сообщений. +// Используется в целях локализации. +// +Функция ТекстДляАдминистратора() Экспорт + + Возврат НСтр("ru = 'Для администратора:'"); + +КонецФункции + +// Возвращает пользовательский текст сообщения блокировки сеансов. +// +Функция ИзвлечьСообщениеБлокировки(Знач Сообщение) Экспорт + + ИндексМаркера = Найти(Сообщение, ТекстДляАдминистратора()); + Возврат ?(ИндексМаркера > 0, Сред(Сообщение, 1, ИндексМаркера - 3), Сообщение); + +КонецФункции + diff --git a/SSL/src/CommonModules/СоединенияИБКлиентСервер/СоединенияИБКлиентСервер.mdo b/SSL/src/CommonModules/СоединенияИБКлиентСервер/СоединенияИБКлиентСервер.mdo new file mode 100644 index 000000000..13a76bc78 --- /dev/null +++ b/SSL/src/CommonModules/СоединенияИБКлиентСервер/СоединенияИБКлиентСервер.mdo @@ -0,0 +1,12 @@ + + + СоединенияИБКлиентСервер + + ru + Соединения ИБКлиент сервер + + true + true + true + true + diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl new file mode 100644 index 000000000..ebd55820a --- /dev/null +++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl @@ -0,0 +1,6 @@ +// Возвращает структуру параметров, необходимых для инициализации +// конфигурации на клиенте. +// +Функция ПараметрыРаботыКлиента() Экспорт + Возврат СтандартныеПодсистемыПереопределяемый.ПараметрыРаботыКлиента(); +КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/СтандартныеПодсистемыКлиентПовтИсп.mdo b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/СтандартныеПодсистемыКлиентПовтИсп.mdo new file mode 100644 index 000000000..047323da6 --- /dev/null +++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/СтандартныеПодсистемыКлиентПовтИсп.mdo @@ -0,0 +1,11 @@ + + + СтандартныеПодсистемыКлиентПовтИсп + + ru + Стандартные подсистемы клиент повт исп + + true + true + DuringSession + diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыПереопределяемый/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыПереопределяемый/Module.bsl new file mode 100644 index 000000000..a7ebbb0fa --- /dev/null +++ b/SSL/src/CommonModules/СтандартныеПодсистемыПереопределяемый/Module.bsl @@ -0,0 +1,267 @@ +// Неинтерактивное обновление данных ИБ при смене версии библиотеки +// Обязательная "точка входа" обновления ИБ в библиотеке. +Процедура ВыполнитьОбновлениеИнформационнойБазы() Экспорт + + ОбновлениеИнформационнойБазы.ВыполнитьИтерациюОбновления("СтандартныеПодсистемы", ВерсияБиблиотеки(), + ОбработчикиОбновления()); + +КонецПроцедуры + +// Возвращает номер версии Библиотеки стандартных подсистем. +// +Функция ВерсияБиблиотеки() Экспорт + + Возврат "1.0.7.5"; + +КонецФункции + +// Возвращает список процедур-обработчиков обновления библиотеки +// +// Возвращаемое значение: +// Структура - описание полей структуры см. в функции +// ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления() +Функция ОбработчикиОбновления() + + Обработчики = ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(); + + // Подключаются процедуры-обработчики обновления библиотеки + + // УправлениеДоступом + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Процедура = "УправлениеДоступом.ОбновитьПоставляемыеПрофилиИГруппыДоступа"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Процедура = "УправлениеДоступом.ОбновитьТаблицыРолейПрофилейГруппДоступа"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Процедура = "УправлениеДоступом.ОбновитьЗависимостиПравДоступа"; + // Конец УправлениеДоступом + + // РаботаСПочтовымиСообщениями + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.0.0"; + Обработчик.Процедура = "ЭлектроннаяПочта.ЗаполнитьСистемнуюУчетнуюЗапись"; + // Конец РаботаСПочтовымиСообщениями + + // КонтактнаяИнформация + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.1.1"; + Обработчик.Процедура = "УправлениеКонтактнойИнформациейПереопределяемый.КонтактнаяИнформацияОбновлениеИБ"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.1.3"; + Обработчик.Процедура = "УправлениеКонтактнойИнформацией.ЗагрузитьСтраныМира"; + // Конец КонтактнаяИнформация + + // АдресныйКлассификатор + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.1.1"; + Обработчик.Процедура = "АдресныйКлассификатор.ЗагрузитьАдресныеОбъектыПервогоУровня"; + // Конец АдресныйКлассификатор + + // БизнесПроцессыИЗадачи + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.2.2"; + Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ОбновлениеИнформационнойБазы"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.6.6"; + Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ОбновлениеИнформационнойБазыПредметСтрокой"; + // Конец БизнесПроцессыИЗадачи + + // ПолнотекстовыйПоиск + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.3.10"; + Обработчик.Процедура = "ПолнотекстовыйПоискСервер.ИнициализироватьФункциональнуюОпциюПолнотекстовыйПоиск"; + // Конец ПолнотекстовыйПоиск + + // ПолучениеФайловИзИнтернета + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.4.1"; + Обработчик.Процедура = "ПолучениеФайловИзИнтернета.ОбновлениеХранимыхНастроекПрокси"; + // Конец ПолучениеФайловИзИнтернета + + // ВерсионированиеОбъектов + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Процедура = "ВерсионированиеОбъектов.ОбновитьНастройкиВерсионированияОбъектов"; + // Конец ВерсионированиеОбъектов + + // Пользователи + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.5.2"; + Обработчик.Процедура = "Пользователи.ЗаполнитьИдентификаторыПользователей"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.5.15"; + Обработчик.Процедура = "Пользователи.ЗаполнениеРегистраСоставГруппПользователей"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.6.5"; + Обработчик.Процедура = "ВнешниеПользователи.ЗаполнитьСоставГруппВнешнихПользователей"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.6.5"; + Обработчик.Процедура = "ВнешниеПользователи.ДляВнешнихПользователейСоздатьПользователейИБ"; + // Конец Пользователи + + // РаботаСФайлами + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.5.2"; // при обновлении на 1.0.5.2 сработает обработчик + Обработчик.Процедура = "РаботаСФайлами.ЗаполнитьНомерВерсииИзКодаСправочника"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.5.2"; // при обновлении на 1.0.5.2 сработает обработчик + Обработчик.Процедура = "РаботаСФайлами.ЗаполнитьТипХраненияФайлаВБазе"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.5.7"; // при обновлении на 1.0.5.7 сработает обработчик + Обработчик.Процедура = "РаботаСФайлами.СменитьИндексПиктограммы"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.6.3"; // при обновлении на 1.0.6.3 сработает обработчик + Обработчик.Процедура = "РаботаСФайлами.ЗаполнитьПутиТома"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.7.1"; + Обработчик.Процедура = "РаботаСФайлами.ПерезаписатьВсеФайлы"; + // Конец РаботаСФайлами + + // ЭЦП + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.7.1"; + Обработчик.Процедура = "ОбщегоНазначения.ЗаполнитьНазначенияСертификатовЭЦП"; + // Конец ЭЦП + + // Свойства + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.6.7"; + Обработчик.Процедура = "УправлениеСвойствами.ОбновитьСписокДополнительныхСвойств"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.7.1"; + Обработчик.Процедура = "УправлениеСвойствами.ОбновитьПереименованныеРоли_БСП_1_0_7_1"; + // Конец Свойства + + // Валюты + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.5.9"; + Обработчик.Процедура = "РаботаСКурсамиВалют.ОбновитьФорматХраненияПрописиНаРусскомЯзыке"; + // Конец Валюты + + // КалендарныеГрафики + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.6.2"; + Обработчик.Процедура = "КалендарныеГрафики.СоздатьПроизводственныйКалендарьНа2010Год"; + // Конец КалендарныеГрафики + + // ФизическиеЛица + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.6.5"; + Обработчик.Процедура = "ФизическиеЛица.ЗаполнитьДокументыФизическихЛицПоКлассификаторуМВД"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.6.8"; + Обработчик.Процедура = "ФизическиеЛица.ПреобразоватьУдостоверенияЛичностиВДокументы"; + // Конец ФизическиеЛица + + // ДополнительныеОтчетыИОбработки + Если Метаданные.Имя <> "УправлениеТорговлей" Тогда + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.7.1"; + Обработчик.Процедура = "ДополнительныеОтчетыИОбработки.ОбновитьПользовательскиеНастройкиДоступаКОбработкам"; + КонецЕсли; + // Конец ДополнительныеОтчетыИОбработки + + Возврат Обработчики; + +КонецФункции + +// Возвращает структуру параметров, необходимых для инициализации +// конфигурации на клиенте. +// +Функция ПараметрыРаботыКлиента() Экспорт + + Параметры = Новый Структура(); + + // СтандартныеПодсистемы + Параметры.Вставить("ОшибкаАвторизации", Пользователи.ОшибкаАвторизации()); + Если ЗначениеЗаполнено(Параметры.ОшибкаАвторизации) Тогда + Возврат Новый ФиксированнаяСтруктура(Параметры); + КонецЕсли; + Параметры.Вставить("ИнформационнаяБазаЗаблокированаДляОбновления", + ОбновлениеИнформационнойБазы.ПроверитьНевозможностьОбновленияИнформационнойБазы()); + Параметры.Вставить("НеобходимоОбновлениеИнформационнойБазы", + ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы()); + Параметры.Вставить("АвторизованныйПользователь", Пользователи.АвторизованныйПользователь()); + Параметры.Вставить("ЭтоБазоваяВерсияКонфигурации", ЭтоБазоваяВерсияКонфигурации()); + + Параметры.Вставить("ЗаголовокПриложения", СокрЛП(Константы.ЗаголовокСистемы.Получить())); + + Параметры.Вставить("ПодробнаяИнформация", Метаданные.ПодробнаяИнформация); + Параметры.Вставить("ИнформационнаяБазаФайловая", ОбщегоНазначения.ИнформационнаяБазаФайловая()); + // Конец СтандартныеПодсистемы + + // ЗавершениеРаботыПользователей + Параметры.Вставить("ПараметрыБлокировкиСеансов", Новый ФиксированнаяСтруктура(СоединенияИБ.ПараметрыБлокировкиСеансов())); + // Конец ЗавершениеРаботыПользователей + + // ОбновлениеКонфигурации + Параметры.Вставить("НастройкиОбновления", + Новый ФиксированнаяСтруктура(ОбновлениеКонфигурации.ПолучитьНастройкиОбновления())); + // Конец ОбновлениеКонфигурации + + // ПроверкаЛегальностиПолученияОбновлений + Параметры.Вставить("ЭтоГлавныйУзел", ПланыОбмена.ГлавныйУзел() = Неопределено); + // Конец ПроверкаЛегальностиПолученияОбновлений + + // ПолучениеФайловИзИнтернета + Параметры.Вставить("НастройкиПроксиСервера", ПолучениеФайловИзИнтернета.ПолучитьНастройкуПроксиСервера()); + // Конец ПолучениеФайловИзИнтернета + + // РаботаСФайлами + Параметры.Вставить("ПерсональныеНастройкиРаботыСФайлами", + Новый ФиксированнаяСтруктура(РаботаСФайлами.ПолучитьПерсональныеНастройкиРаботыСФайламиСервер())); + // Конец РаботаСФайлами + + // ЭЦП + Параметры.Вставить("ПерсональныеНастройкиРаботыСЭЦП", + Новый ФиксированнаяСтруктура(ЭлектронноЦифроваяПодпись.ПолучитьПерсональныеНастройкиРаботыСЭЦПСервер())); + // Конец ЭЦП + + // РегламентныеЗадания + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Параметры.Вставить("ПараметрыОткрытияСеансаОбработкиРегламентныхЗаданий", + Новый ФиксированнаяСтруктура(РегламентныеЗаданияСервер.ПараметрыОткрытияСеансаОбработкиРегламентныхЗаданий(Истина))); + КонецЕсли; + // Конец РегламентныеЗадания + + // Для установки параметров инициализации системы можно использовать шаблон: + // + // Параметры.Вставить(<ИмяПараметра>, <код получения значения параметра>); + // + + Возврат Новый ФиксированнаяСтруктура(Параметры); + +КонецФункции + +// Возвращает признак, является ли конфигурация базовой. +// +// Пример реализации: +// Если конфигурации выпускаются парами, то в имени базовой версии +// может включаться дополнительное слово "Базовая". Тогда логика +// определения базовой версии выглядит таким образом: +// +// Возврат Найти(ВРег(Метаданные.Имя), "БАЗОВАЯ") > 0; +// +// Возвращаемое значение: +// Булево - Истина, если конфигурация - базовая. +// +Функция ЭтоБазоваяВерсияКонфигурации() Экспорт + + Возврат Найти(ВРег(Метаданные.Имя), "БАЗОВАЯ") > 0; + +КонецФункции diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыПереопределяемый/СтандартныеПодсистемыПереопределяемый.mdo b/SSL/src/CommonModules/СтандартныеПодсистемыПереопределяемый/СтандартныеПодсистемыПереопределяемый.mdo new file mode 100644 index 000000000..2bf873336 --- /dev/null +++ b/SSL/src/CommonModules/СтандартныеПодсистемыПереопределяемый/СтандартныеПодсистемыПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + СтандартныеПодсистемыПереопределяемый + + ru + Переопределяемый модуль библиотеки стандартных подсистем + + true + true + diff --git a/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl b/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl new file mode 100644 index 000000000..2b28480bf --- /dev/null +++ b/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl @@ -0,0 +1,487 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ СО СТРОКАМИ + +// Функция "расщепляет" строку на подстроки, используя заданный +// разделитель. Разделитель может иметь любую длину. +// Если в качестве разделителя задан пробел, рядом стоящие пробелы +// считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр +// игнорируются. +// Например, +// РазложитьСтрокуВМассивПодстрок(",один,,,два", ",") возвратит массив значений из пяти элементов, +// три из которых - пустые строки, а +// РазложитьСтрокуВМассивПодстрок(" один два", " ") возвратит массив значений из двух элементов +// +// Параметры: +// Стр - строка, которую необходимо разложить на подстроки. +// Параметр передается по значению. +// Разделитель - строка-разделитель, по умолчанию - запятая. +// +// Возвращаемое значение: +// массив значений, элементы которого - подстроки +// +Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт + + МассивСтрок = Новый Массив(); + Если Разделитель = " " Тогда + Стр = СокрЛП(Стр); + Пока 1 = 1 Цикл + Поз = Найти(Стр, Разделитель); + Если Поз = 0 Тогда + МассивСтрок.Добавить(Стр); + Возврат МассивСтрок; + КонецЕсли; + МассивСтрок.Добавить(Лев(Стр, Поз - 1)); + Стр = СокрЛ(Сред(Стр, Поз)); + КонецЦикла; + Иначе + ДлинаРазделителя = СтрДлина(Разделитель); + Пока 1 = 1 Цикл + Поз = Найти(Стр, Разделитель); + Если Поз = 0 Тогда + Если (СокрЛП(Стр) <> "") Тогда + МассивСтрок.Добавить(Стр); + КонецЕсли; + Возврат МассивСтрок; + КонецЕсли; + МассивСтрок.Добавить(Лев(Стр,Поз - 1)); + Стр = Сред(Стр, Поз + ДлинаРазделителя); + КонецЦикла; + КонецЕсли; + +КонецФункции + +// Возвращает строку, полученную из массива элементов, разделенных символом разделителя +// +// Параметры: +// Массив - Массив - массив элементов из которых необходимо получить строку +// Разделитель - Строка - любой набор символов, который будет использован как разделитель между элементами в строке +// +// Возвращаемое значение: +// Результат - Строка - строка, полученная из массива элементов, разделенных символом разделителя +// +Функция ПолучитьСтрокуИзМассиваПодстрок(Массив, Разделитель = ",") Экспорт + + // возвращаемое значение функции + Результат = ""; + + Для Каждого Элемент ИЗ Массив Цикл + + Подстрока = ?(ТипЗнч(Элемент) = Тип("Строка"), Элемент, Строка(Элемент)); + + РазделительПодстрок = ?(ПустаяСтрока(Результат), "", Разделитель); + + Результат = Результат + РазделительПодстрок + Подстрока; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Сравнить две строки версий. +// +// Параметры +// СтрокаВерсии1 – Строка – номер версии в формате РР.{П|ПП}.ЗЗ.СС +// СтрокаВерсии2 – Строка – второй сравниваемый номер версии +// +// Возвращаемое значение: +// Число – больше 0, если СтрокаВерсии1 > СтрокаВерсии2; 0, если версии равны. +// +Функция СравнитьВерсии(Знач СтрокаВерсии1, Знач СтрокаВерсии2) Экспорт + + Строка1 = ?(ПустаяСтрока(СтрокаВерсии1), "0.0.0.0", СтрокаВерсии1); + Строка2 = ?(ПустаяСтрока(СтрокаВерсии2), "0.0.0.0", СтрокаВерсии2); + Версия1 = РазложитьСтрокуВМассивПодстрок(Строка1, "."); + Если Версия1.Количество() <> 4 Тогда + ВызватьИсключение ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неправильный формат строки версии: %1'"), СтрокаВерсии1); + КонецЕсли; + Версия2 = РазложитьСтрокуВМассивПодстрок(Строка2, "."); + Если Версия2.Количество() <> 4 Тогда + ВызватьИсключение ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неправильный формат строки версии: %1'"), СтрокаВерсии2); + КонецЕсли; + + Результат = 0; + Для Разряд = 0 По 3 Цикл + Результат = Число(Версия1[Разряд]) - Число(Версия2[Разряд]); + Если Результат <> 0 Тогда + Возврат Результат; + КонецЕсли; + КонецЦикла; + Возврат Результат; + +КонецФункции + +// Подставляет параметры в строку. Максимально возможное число параметров - 9. +// Параметры в строке задаются как %<номер параметра>. Нумерация параметров +// начинается с единицы. +// +// Параметры +// СтрокаПодстановки – Строка – шаблон строки с параметрами (вхождениями вида "%ИмяПараметра"). +// Параметр - Строка - параметр +// Возвращаемое значение: +// Строка – текстовая строка с подставленными параметрами +// +// Пример: +// Строка = ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк"); +// +Функция ПодставитьПараметрыВСтроку( Знач СтрокаПодстановки, + Знач Параметр1, + Знач Параметр2 = Неопределено, + Знач Параметр3 = Неопределено, + Знач Параметр4 = Неопределено, + Знач Параметр5 = Неопределено, + Знач Параметр6 = Неопределено, + Знач Параметр7 = Неопределено, + Знач Параметр8 = Неопределено, + Знач Параметр9 = Неопределено) Экспорт + + Если СтрокаПодстановки = Неопределено ИЛИ СтрДлина(СтрокаПодстановки) = 0 Тогда + Возврат ""; + КонецЕсли; + + Результат = ""; + НачПозиция = 1; + Позиция = 1; + Пока Позиция <= СтрДлина(СтрокаПодстановки) Цикл + СимволСтроки = Сред(СтрокаПодстановки, Позиция, 1); + Если СимволСтроки <> "%" Тогда + Позиция = Позиция + 1; + Продолжить; + КонецЕсли; + Результат = Результат + Сред(СтрокаПодстановки, НачПозиция, Позиция - НачПозиция); + Позиция = Позиция + 1; + СимволСтроки = Сред(СтрокаПодстановки, Позиция, 1); + + Если СимволСтроки = "%" Тогда + Позиция = Позиция + 1; + НачПозиция = Позиция; + Продолжить; + КонецЕсли; + + Попытка + НомерПараметра = Число(СимволСтроки); + Исключение + ВызватьИсключение НСтр("ru='Входная строка СтрокаПодстановки имеет неверный формат: %'" + СимволСтроки); + КонецПопытки; + + Если СимволСтроки = "1" Тогда + ЗначениеПараметра = Параметр1; + ИначеЕсли СимволСтроки = "2" Тогда + ЗначениеПараметра = Параметр2; + ИначеЕсли СимволСтроки = "3" Тогда + ЗначениеПараметра = Параметр3; + ИначеЕсли СимволСтроки = "4" Тогда + ЗначениеПараметра = Параметр4; + ИначеЕсли СимволСтроки = "5" Тогда + ЗначениеПараметра = Параметр5; + ИначеЕсли СимволСтроки = "6" Тогда + ЗначениеПараметра = Параметр6; + ИначеЕсли СимволСтроки = "7" Тогда + ЗначениеПараметра = Параметр7; + ИначеЕсли СимволСтроки = "8" Тогда + ЗначениеПараметра = Параметр8; + ИначеЕсли СимволСтроки = "9" Тогда + ЗначениеПараметра = Параметр9; + Иначе + ВызватьИсключение НСтр("ru='Входная строка СтрокаПодстановки имеет неверный формат: %'" + ЗначениеПараметра); + КонецЕсли; + Если ЗначениеПараметра = Неопределено Тогда + ЗначениеПараметра = ""; + Иначе + ЗначениеПараметра = Строка(ЗначениеПараметра); + КонецЕсли; + Результат = Результат + ЗначениеПараметра; + Позиция = Позиция + 1; + НачПозиция = Позиция; + + КонецЦикла; + + Если (НачПозиция <= СтрДлина(СтрокаПодстановки)) Тогда + Результат = Результат + Сред(СтрокаПодстановки, НачПозиция, СтрДлина(СтрокаПодстановки) - НачПозиция + 1); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Подставляет параметры в строку. Неограниченное число параметров в строке. +// Параметры в строке задаются как %<номер параметра>. Нумерация параметров +// начинается с единицы. +// +// Параметры +// СтрокаПодстановки – Строка – шаблон строки с параметрами (вхождениями вида "%1"). +// МассивПараметров - Массив - массив строк, которые соответствуют параметрам в строке подстановки +// +// Возвращаемое значение: +// Строка – текстовая строка с подставленными параметрами +// +// Пример: +// МассивПараметров = Новый Массив; +// МассивПараметров = МассивПараметров.Добавить("Вася"); +// МассивПараметров = МассивПараметров.Добавить("Зоопарк"); +// +// Строка = ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), МассивПараметров); +// +Функция ПодставитьПараметрыВСтрокуИзМассива(Знач СтрокаПодстановки, знач МассивПараметров) Экспорт + + СтрокаРезультата = СтрокаПодстановки; + + Для Индекс = 1 По МассивПараметров.Количество() Цикл + Если Не ПустаяСтрока(МассивПараметров[Индекс-1]) Тогда + СтрокаРезультата = СтрЗаменить(СтрокаРезультата, "%"+Строка(Индекс), МассивПараметров[Индекс-1]); + КонецЕсли; + КонецЦикла; + + Возврат СтрокаРезультата; + +КонецФункции + +// Проверяет содержит ли строка только цифры. +// +// Параметры: +// СтрокаПроверки - строка для проверки. +// УчитыватьЛидирующиеНули - Булево - нужно ли учитывать лидирующие нули. +// УчитыватьПробелы - Булево - нужно ли учитывать пробелы. +// +// Возвращаемое значение: +// Истина - строка содержит только цифры; +// Ложь - строка содержит не только цифры. +// +Функция ТолькоЦифрыВСтроке(Знач СтрокаПроверки, Знач УчитыватьЛидирующиеНули = Истина, Знач УчитыватьПробелы = Истина) Экспорт + + Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда + Возврат Ложь; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда + Возврат Истина; + КонецЕсли; + + Если НЕ УчитыватьПробелы Тогда + СтрокаПроверки = СтрЗаменить(СтрокаПроверки, " ", ""); + КонецЕсли; + + Если НЕ УчитыватьЛидирующиеНули Тогда + НомерПервойЦифры = 0; + Для а = 1 По СтрДлина(СтрокаПроверки) Цикл + НомерПервойЦифры = НомерПервойЦифры + 1; + КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1)); + Если КодСимвола <> 48 Тогда + Прервать; + КонецЕсли; + КонецЦикла; + СтрокаПроверки = Сред(СтрокаПроверки, НомерПервойЦифры); + КонецЕсли; + + Для а = 1 По СтрДлина(СтрокаПроверки) Цикл + КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1)); + Если НЕ (КодСимвола >= 48 И КодСимвола <= 57) Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции // ТолькоЦифрыВСтроке() + +// Удаляет двойные кавычки с начала и конца строки, если они есть. +// +// Параметры: +// Строка - входная строка; +// +// Возвращаемое значение: +// Строка - строка без двойных кавычек. +// +Функция СократитьДвойныеКавычки(Знач Строка) Экспорт + + Результат = Строка; + Пока Найти(Результат, """") = 1 Цикл + Результат = Сред(Результат, 2); + КонецЦикла; + Пока Найти(Результат, """") = СтрДлина(Результат) Цикл + Результат = Сред(Результат, 1, СтрДлина(Результат) - 1); + КонецЦикла; + Возврат Результат; + +КонецФункции + +// Процедура удаляет из строки указанное количество символов справа +// +Процедура УдалитьПоследнийСимволВСтроке(Текст, ЧислоСимволов) Экспорт + + Текст = Лев(Текст, СтрДлина(Текст) - ЧислоСимволов); + +КонецПроцедуры + +// Находит символ в строке с конца +// +Функция НайтиСимволСКонца(Знач СтрокаВся, Знач ОдинСимвол) Экспорт + + НачальнаяПозиция = 1; + ДлинаСтроки = СтрДлина(СтрокаВся); + + Для ТекущаяПозиция = 1 По СтрДлина(СтрокаВся) Цикл + РеальнаяПозиция = ДлинаСтроки - ТекущаяПозиция + 1; + ТекущийСимвол = Сред(СтрокаВся, РеальнаяПозиция, 1); + Если ТекущийСимвол = ОдинСимвол Тогда + Возврат РеальнаяПозиция; + КонецЕсли; + КонецЦикла; + + Возврат 0; + +КонецФункции + +// Функция проверяет, является ли переданная в неё строка уникальным идентификатором +// +Функция ЭтоУникальныйИдентификатор(ИдентификаторСтрока) Экспорт + + УИСтрока = ИдентификаторСтрока; + Шаблон = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"; + + Если СтрДлина(Шаблон) <> СтрДлина(УИСтрока) Тогда + Возврат Ложь; + КонецЕсли; + Для Сч = 1 По СтрДлина(УИСтрока) Цикл + Если КодСимвола(Шаблон, сч) = 88 И + ((КодСимвола(УИСтрока, сч) < 48 ИЛИ КодСимвола(УИСтрока, сч) > 57) И (КодСимвола(УИСтрока, сч) < 97 или КодСимвола(УИСтрока, сч) > 102)) Тогда + Возврат ложь; + ИначеЕсли КодСимвола(Шаблон, сч) = 45 И КодСимвола(УИСтрока, сч) <> 45 Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +// Формирует строку повторяющихся символов заданной длины +// +Функция СформироватьСтрокуСимволов(Символ, КоличествоСимволов) Экспорт + + // возвращаемое значение функции + Результат = ""; + + Для Индекс = 1 ПО КоличествоСимволов Цикл + + Результат = Результат + Символ; + + КонецЦикла; + + Возврат Результат; +КонецФункции + +// Дополняет переданную в качестве первого параметра строку символами слева\справа до заданной длины и возвращает ее +// Незначащие символы слева и справа удаляются +// По умолчанию функция добавляет строку нулями слева +// +// Параметры: +// Строка - Строка - исходная строка, которую необходимо дополнить символами до заданной длины +// ДлинаСтроки - Число - требуемая конечная длина строки +// Символ - Строка - (необязательный) значение символа, которым необходимо дополнить строку +// Режим - Строка - (необязательный) [Слева|Справа] режим добавления символов к исходной строке: слева или справа +// +// Пример 1: +// Строка = "1234"; ДлинаСтроки = 10; Символ = "0"; Режим = "Слева" +// Возврат: "0000001234" +// +// Пример 2: +// Строка = " 1234 "; ДлинаСтроки = 10; Символ = "#"; Режим = "Справа" +// Возврат: "1234######" +// +// Возвращаемое значение: +// Строка - строка, дополненная символами слева или справа +// +Функция ДополнитьСтроку(Знач Строка, Знач ДлинаСтроки, Знач Символ = "0", Знач Режим = "Слева") Экспорт + + Если ПустаяСтрока(Символ) Тогда + Символ = "0"; + КонецЕсли; + + // длина символа не должна превышать единицы + Символ = Лев(Символ, 1); + + // удаляем крайние пробелы слева и справа строки + Строка = СокрЛП(Строка); + + КоличествоСимволовНадоДобавить = ДлинаСтроки - СтрДлина(Строка); + + Если КоличествоСимволовНадоДобавить > 0 Тогда + + СтрокаДляДобавления = СформироватьСтрокуСимволов(Символ, КоличествоСимволовНадоДобавить); + + Если ВРег(Режим) = "СЛЕВА" Тогда + + Строка = СтрокаДляДобавления + Строка; + + ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда + + Строка = Строка + СтрокаДляДобавления; + + КонецЕсли; + + КонецЕсли; + + Возврат Строка; + +КонецФункции + +// Удаляет повторяющиеся символы слева/справа в переданной строке +// +// Параметры: +// Строка - Строка - исходная строка, из которой необходимо удалить повторяющиеся символы +// Символ - Строка - значение символа, который необходимо удалить +// Режим - Строка - (необязательный) [Слева|Справа] режим добавления символов к исходной строке: слева или справа +// +Функция УдалитьПовторяющиесяСимволы(Знач Строка, Знач Символ, Знач Режим = "Слева") Экспорт + + Если ВРег(Режим) = "СЛЕВА" Тогда + + Пока Лев(Строка, 1)= Символ Цикл + + Строка = Сред(Строка, 2); + + КонецЦикла; + + ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда + + Пока Прав(Строка, 1)= Символ Цикл + + Строка = Лев(Строка, СтрДлина(Строка) - 1); + + КонецЦикла; + + КонецЕсли; + + Возврат Строка; +КонецФункции + +// Получает номер версии конфигурации без номера сборки +// +// Параметры: +// Версия - Строка - версия конфигурации в формате РР.ПП.ЗЗ.СС, +// где СС – номер сборки, который будет удален +// +// Возвращаемое значение: +// Строка - номер версии конфигурации без номера сборки в формате РР.ПП.ЗЗ +// +Функция ВерсияКонфигурацииБезНомераСборки(Знач Версия) Экспорт + + Массив = РазложитьСтрокуВМассивПодстрок(Версия, "."); + + Если Массив.Количество() < 3 Тогда + Возврат Версия; + КонецЕсли; + + Результат = "[Редакция].[Подредакция].[Релиз]"; + Результат = СтрЗаменить(Результат, "[Редакция]", Массив[0]); + Результат = СтрЗаменить(Результат, "[Подредакция]", Массив[1]); + Результат = СтрЗаменить(Результат, "[Релиз]", Массив[2]); + + Возврат Результат; +КонецФункции + + + diff --git a/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/СтроковыеФункцииКлиентСервер.mdo b/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/СтроковыеФункцииКлиентСервер.mdo new file mode 100644 index 000000000..a9d9ab4bd --- /dev/null +++ b/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/СтроковыеФункцииКлиентСервер.mdo @@ -0,0 +1,12 @@ + + + СтроковыеФункцииКлиентСервер + + ru + Строковые функции клиент сервер + + true + true + true + true + diff --git a/SSL/src/CommonModules/УправлениеДоступом/Module.bsl b/SSL/src/CommonModules/УправлениеДоступом/Module.bsl new file mode 100644 index 000000000..1a1e576bb --- /dev/null +++ b/SSL/src/CommonModules/УправлениеДоступом/Module.bsl @@ -0,0 +1,4310 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ: программный интерфейс прикладного разработчика. + +// Функция ЕстьРоль проверяет, что у текущего пользователя есть роль в +// в одном из профилей тех групп доступа в которые он входит, +// например, роль ПросмотрЖурналаРегистрации, роль ПечатьНепроведенныхДокументов, ... +// +// Параметры: +// Роль - Строка - имя роли. +// НаборыЗначенийДоступа - ТаблицаЗначений(НомерНабора, ВидДоступа, ЗначениеДоступа), +// пустую подготовленную таблицу можно получить с помощью функции +// УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(). +// Пользователь - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи, Неопределено. +// Если не заполнено, тогда право проверяется для текущего пользователя. +// Возвращаемое значение: +// Булево. +// +Функция ЕстьРоль(Знач Роль, Знач НаборыЗначенийДоступа = Неопределено, Знач Пользователь = Неопределено) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Пользователь = ?(ЗначениеЗаполнено(Пользователь), Пользователь, Пользователи.АвторизованныйПользователь()); + + Если Пользователи.ЭтоПолноправныйПользовательИБ(Пользователь) Тогда + Возврат Истина; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Пользователь", Пользователь); + Запрос.УстановитьПараметр("Роль", Роль); + Запрос.УстановитьПараметр("ВидДоступаПользователи", ?(ТипЗнч(Пользователь) = Тип("СправочникСсылка.Пользователи"), + ПланыВидовХарактеристик.ВидыДоступа.Пользователи, + ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи)); + + Если НаборыЗначенийДоступа = Неопределено ИЛИ НЕ ОграничиватьДоступНаУровнеЗаписей() Тогда + // Проверка, что роль назначается пользователю через группу доступа по профилю. + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ПО (ПользователиИГруппыПользователей.ВидДоступа = &ВидДоступаПользователи) + | И (ПользователиИГруппыПользователей.ЗначениеДоступа = &Пользователь) + | И (ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ) + | И (ПользователиИГруппыПользователей.ГруппаДоступа = ГруппыДоступаПользователи.Пользователь) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли + | ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка + | И (ПрофилиГруппДоступаРоли.Роль = &Роль)"; + Иначе + + // Проверка, что роль назначается пользователю через группу доступа по профилю с разрешенными наборами значений доступа. + + Запрос.УстановитьПараметр("НаборыЗначенийДоступа", НаборыЗначенийДоступа); + Запрос.УстановитьПараметр("СвойстваВидовДоступа", СвойстваВидаДоступа()); + + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | НаборыЗначенийДоступа.НомерНабора, + | НаборыЗначенийДоступа.ВидДоступа, + | НаборыЗначенийДоступа.ЗначениеДоступа + |ПОМЕСТИТЬ НаборыЗначенийДоступаБезСвойств + |ИЗ + | &НаборыЗначенийДоступа КАК НаборыЗначенийДоступа + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | СвойстваВидовДоступа.ВидДоступа, + | СвойстваВидовДоступа.ВидДоступаБезГруппЗначенияДоступа, + | СвойстваВидовДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, + | СвойстваВидовДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа + |ПОМЕСТИТЬ СвойстваВидовДоступа + |ИЗ + | &СвойстваВидовДоступа КАК СвойстваВидовДоступа + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | НаборыЗначенийДоступа.НомерНабора, + | НаборыЗначенийДоступа.ВидДоступа, + | НаборыЗначенийДоступа.ЗначениеДоступа, + | СвойстваВидовДоступа.ВидДоступаБезГруппЗначенияДоступа, + | СвойстваВидовДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, + | СвойстваВидовДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа, + | ВЫБОР + | КОГДА НаборыЗначенийДоступа.ВидДоступа В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) + | ТОГДА ЕСТЬNULL(ТипыСсылок.ТипТаблицы, НЕОПРЕДЕЛЕНО) + | ИНАЧЕ НЕОПРЕДЕЛЕНО + | КОНЕЦ КАК ТипЗначенияДоступа, + | ТипыСсылок.Таблица + |ПОМЕСТИТЬ НаборыЗначенийДоступа + |ИЗ + | НаборыЗначенийДоступаБезСвойств КАК НаборыЗначенийДоступа + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылок + | ПО (ТИПЗНАЧЕНИЯ(НаборыЗначенийДоступа.ЗначениеДоступа) = ТИПЗНАЧЕНИЯ(ТипыСсылок.ТипТаблицы)) + | ЛЕВОЕ СОЕДИНЕНИЕ СвойстваВидовДоступа КАК СвойстваВидовДоступа + | ПО НаборыЗначенийДоступа.ВидДоступа = СвойстваВидовДоступа.ВидДоступа + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа + |ПОМЕСТИТЬ ГруппыДоступа + |ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ПО (ПользователиИГруппыПользователей.ВидДоступа = &ВидДоступаПользователи) + | И (ПользователиИГруппыПользователей.ЗначениеДоступа = &Пользователь) + | И (ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ) + | И (ПользователиИГруппыПользователей.ГруппаДоступа = ГруппыДоступаПользователи.Пользователь) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли + | ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка + | И (ПрофилиГруппДоступаРоли.Роль = &Роль) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | ГруппыДоступа КАК ГруппыДоступа + |ГДЕ + | ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | (ВЫБРАТЬ РАЗЛИЧНЫЕ + | Наборы.НомерНабора + | ИЗ + | НаборыЗначенийДоступа КАК Наборы + | ) КАК НомераНаборов + | ГДЕ + | (НЕ ЛОЖЬ В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ЛОЖЬ + | ИЗ + | НаборыЗначенийДоступа КАК НаборыЗначений + | ГДЕ + | НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + | И (НЕ ВЫБОР + | КОГДА НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + | ТОГДА НаборыЗначений.ЗначениеДоступа <> НЕОПРЕДЕЛЕНО + | КОГДА НаборыЗначений.ТипЗначенияДоступа <> НЕОПРЕДЕЛЕНО + | ТОГДА ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + | ГДЕ + | ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.ГруппаДоступа + | И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + | И НаборыЗначений.ВидДоступа В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения)) + | КОГДА НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + | ТОГДА ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + | ПО + | ИерархияЗначений.ИспользоватьПраваСсылки + | И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + | И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + | И ПраваПоЗначениям.Таблица = НаборыЗначений.Таблица + | И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + | И ПраваПоЗначениям.Чтение + | И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ПО + | ПользователиИГруппыПользователей.ВидДоступа = &ВидДоступаПользователи + | И ПользователиИГруппыПользователей.ЗначениеДоступа = &Пользователь + | И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь) + | И (НЕ ЛОЖЬ В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ЛОЖЬ + | ИЗ + | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + | ПО + | ИерархияЗначений.ИспользоватьПраваСсылки + | И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + | И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + | И ПраваПоЗначениям.Таблица = НаборыЗначений.Таблица + | И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + | И ПраваПоЗначениям.ЧтениеЗапрещено + | И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ПО + | ПользователиИГруппыПользователей.ВидДоступа = &ВидДоступаПользователи + | И ПользователиИГруппыПользователей.ЗначениеДоступа = &Пользователь + | И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь)) + | ИНАЧЕ (НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + | ИЛИ (НЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + | ГДЕ + | ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + | И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + | И ВидыЗначений.ТолькоВидДоступа = ИСТИНА))) + | И ВЫБОР + | КОГДА НаборыЗначений.ВидДоступа = &ВидДоступаПользователи + | И ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ГДЕ + | ПользователиИГруппыПользователей.ВидДоступа = &ВидДоступаПользователи + | И ПользователиИГруппыПользователей.ЗначениеДоступа = &Пользователь + | И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа) + | ИЛИ ВЫБОР + | КОГДА НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + | ТОГДА ВЫБОР + | КОГДА ИСТИНА В + | (ВЫБРАТЬ + | ИСТИНА + | ИЗ + | РегистрСведений.ЗначенияГруппДоступа КАК Значения + | ГДЕ + | Значения.ГруппаДоступа = ГруппыДоступа.ГруппаДоступа + | И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + | И Значения.ТолькоВидДоступа = ЛОЖЬ + | И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа) + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ + | ИНАЧЕ ВЫБОР + | КОГДА ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияГруппДоступа КАК Значения + | ПО + | ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + | И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + | И Значения.ГруппаДоступа = ГруппыДоступа.ГруппаДоступа + | И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + | И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + | И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа) + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ + | КОНЕЦ = ВЫБОР + | КОГДА ИСТИНА В + | (ВЫБРАТЬ + | ИСТИНА + | ИЗ + | РегистрСведений.ЗначенияГруппДоступа КАК Виды + | ГДЕ + | Виды.ГруппаДоступа = ГруппыДоступа.ГруппаДоступа + | И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + | И Виды.ТолькоВидДоступа = ИСТИНА) + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ + | КОНЕЦ))))"; + КонецЕсли; + + Возврат НЕ Запрос.Выполнить().Пустой(); + +КонецФункции + +// Функция ЕстьПравоПоЗначениюДоступа проверяет, что у пользователя есть право, +// устанавливаемое по значению доступа, например, по папке файлов могут устанавливаться +// права "УправлениеПравами", "ЧтениеПапокФайлов", "ЧтениеФайлов", которые являются +// как правами для папки файлов, так и правами для файлов или для двух элементов данных +// сразу - "ЧтениеПапокИФайлов". +// +// Параметры: +// Право - Строка. +// ЗначениеДоступа - СправочникСсылка, ПланВидовХарактеристикСсылка, Неопределено - значение, +// для которого нужно проверить разрешенность права, например, ссылка на папку файлов. +// Пользователь - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи, Неопределено. Если не заполнено, +// тогда право проверяется для текущего пользователя. +// +// Возвращаемое значение: +// Булево. +// +Функция ЕстьПравоПоЗначениюДоступа(Знач Право, Знач ЗначениеДоступа, Знач Пользователь = Неопределено) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Пользователь = ?(ЗначениеЗаполнено(Пользователь), Пользователь, Пользователи.АвторизованныйПользователь()); + + Если Пользователи.ЭтоПолноправныйПользовательИБ(Пользователь) Тогда + Возврат Истина; + КонецЕсли; + + // Подготовка массива из ролей, хотя бы одна из которых требуется для права по значению доступа. + ОписаниеПрава = ВозможныеПраваПоЗначениюДоступа(ЗначениеДоступа.Метаданные().ПолноеИмя()).Найти(Право, "Имя"); + Если ОписаниеПрава = Неопределено Тогда + ВызватьИсключение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найдено право ""%1"" таблицы ""%2""'"), Право, ЗначениеДоступа.Метаданные().ПолноеИмя())); + КонецЕсли; + + // Проверка, что хотя бы одна из ролей назначается пользователю через профиль его групп доступа. + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа + |ПОМЕСТИТЬ ГруппыДоступаПользователя + |ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ПО (ПользователиИГруппыПользователей.ВидДоступа = &ВидДоступаПользователи) + | И (ПользователиИГруппыПользователей.ЗначениеДоступа = &Пользователь) + | И (ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ) + | И (ПользователиИГруппыПользователей.ГруппаДоступа = ГруппыДоступаПользователи.Пользователь) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли + | ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка + | И (ПрофилиГруппДоступаРоли.Роль В (&Роли)) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | ГруппыДоступаПользователя КАК ГруппыДоступаПользователя"); + Запрос.УстановитьПараметр("Пользователь", Пользователь); + Запрос.УстановитьПараметр("Роли", ОписаниеПрава.ТребуемаяРоль); + Запрос.УстановитьПараметр("ВидДоступаПользователи", ?(ТипЗнч(Пользователь) = Тип("СправочникСсылка.Пользователи"), + ПланыВидовХарактеристик.ВидыДоступа.Пользователи, + ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи)); + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + ЕстьПраво = НЕ Запрос.Выполнить().Пустой(); + + Если ЕстьПраво Тогда + + // Проверка, что по виду доступа ограничение установлено в каждой группе доступа пользователя. + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | КОЛИЧЕСТВО(ГруппыДоступаПользователя.ГруппаДоступа) КАК КоличествоГруппДоступа, + | СУММА(ВЫБОР + | КОГДА ЗначенияГруппДоступа.ГруппаДоступа ЕСТЬ NULL + | ТОГДА 0 + | ИНАЧЕ 1 + | КОНЕЦ) КАК КоличествоВключенныхОграничений + |ИЗ + | ГруппыДоступаПользователя КАК ГруппыДоступаПользователя + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияГруппДоступа КАК ЗначенияГруппДоступа + | ПО ГруппыДоступаПользователя.ГруппаДоступа = ЗначенияГруппДоступа.ГруппаДоступа + | И (ЗначенияГруппДоступа.ВидДоступа = &ВидДоступа) + | И (ЗначенияГруппДоступа.ТолькоВидДоступа)"; + Запрос.УстановитьПараметр("ВидДоступа", ВидыДоступаТаблицы(ЗначениеДоступа.Метаданные().ПолноеИмя())[0]); + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + + // Проверка права пользователя по значению доступа. + Если Выборка.КоличествоГруппДоступа = Выборка.КоличествоВключенныхОграничений И + ЗначениеДоступа <> Неопределено И + ОграничиватьДоступНаУровнеЗаписей() Тогда + + Запрос.Текст = + "ВЫБРАТЬ + | ИСТИНА КАК ЗначениеИстина + |ГДЕ + | ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + | ПО + | ИерархияЗначений.ВидДоступа = &ВидДоступа + | И ИерархияЗначений.ЗначениеДоступа = &ЗначениеДоступа + | И ИерархияЗначений.ИспользоватьПраваСсылки + | И ПраваПоЗначениям.Право = &Право + | И (НЕ ПраваПоЗначениям.Запрещено) + | И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + | И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ПО + | ПользователиИГруппыПользователей.ВидДоступа = &ВидДоступаПользователи + | И ПользователиИГруппыПользователей.ЗначениеДоступа = &Пользователь + | И ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ + | И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь) + | И (НЕ ЛОЖЬ В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ЛОЖЬ + | ИЗ + | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + | ПО + | ИерархияЗначений.ВидДоступа = &ВидДоступа + | И ИерархияЗначений.ЗначениеДоступа = &ЗначениеДоступа + | И ИерархияЗначений.ИспользоватьПраваСсылки + | И ПраваПоЗначениям.Право = &Право + | И ПраваПоЗначениям.Запрещено + | И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + | И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ПО + | ПользователиИГруппыПользователей.ВидДоступа = &ВидДоступаПользователи + | И ПользователиИГруппыПользователей.ЗначениеДоступа = &Пользователь + | И ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ + | И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь))"; + Запрос.УстановитьПараметр("ЗначениеДоступа", ЗначениеДоступа); + Запрос.УстановитьПараметр("Право", Право); + ЕстьПраво = НЕ Запрос.Выполнить().Пустой(); + КонецЕсли; + КонецЕсли; + + Возврат ЕстьПраво; + +КонецФункции // ЕстьПравоПоЗначениюДоступа() + +// Функция РазрешеноУправлениеПравамиПоЗначениямДоступа проверяет у текущего пользователя +// есть право "УправлениеПравами", разрешающее изменять +// права заданного значения доступа для пользователей и групп пользователей +// или права различных значений доступа для заданного пользователя или группы пользователей. +// +// Параметры: +// СсылкаНаОбъект - СправочникСсылка.Пользователи, СправочникСсылка.ГруппыПользователей, +// или значение доступа СправочникСсылка, ПланВидовХарактеристикСсылка, +// для которого нужно проверить разрешенность права, например, ссылка на папку файлов. +// ОписаниеОшибки - Строка, заполнена когда разрешения нет. +// ТолькоПросмотр - Булево, только для внутренних нужд - не использовать. +// +// Возвращаемое значение: +// Булево. +// +Функция РазрешеноУправлениеПравамиПоЗначениямДоступа(Знач СсылкаНаОбъект, ОписаниеОшибки, ТолькоПросмотр = Неопределено) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Если Пользователи.ЭтоПолноправныйПользовательИБ() Тогда + Возврат Истина; + КонецЕсли; + + РазрешеноУправлениеПравами = Истина; + ЭтоЗначениеДоступа = НЕ (ТипЗнч(СсылкаНаОбъект) = Тип("СправочникСсылка.Пользователи") ИЛИ + ТипЗнч(СсылкаНаОбъект) = Тип("СправочникСсылка.ГруппыПользователей") ИЛИ + ТипЗнч(СсылкаНаОбъект) = Тип("СправочникСсылка.ВнешниеПользователи") ИЛИ + ТипЗнч(СсылкаНаОбъект) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") ); + + // Проверка разрешения на управление правами значений доступа для заданного пользователя или группы пользователей. + // Т.к. команда "привязана" к роли ДобавлениеИзменениеПользователейИГруппДоступа, вызывает исключение, только при нестандартном сценарии. + Если НЕ ЭтоЗначениеДоступа Тогда + + ЕстьРольДобавлениеИзменениеПользователейИГруппДоступа = ЕстьРоль("ДобавлениеИзменениеПользователейИГруппДоступа"); + + Если ( ТипЗнч(СсылкаНаОбъект) = Тип("СправочникСсылка.ВнешниеПользователи") ИЛИ + ТипЗнч(СсылкаНаОбъект) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") ) И + НЕ ЕстьРоль("ЧтениеВнешнихПользователей") И + НЕ ЕстьРоль("ДобавлениеИзменениеВнешнихПользователей") И + НЕ ЕстьРольДобавлениеИзменениеПользователейИГруппДоступа Тогда + + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'У вас нет ни одной из ролей: + |%1, + |%2, + |%3.'"), + Метаданные.Роли.ДобавлениеИзменениеПользователейИГруппДоступа.Синоним, + Метаданные.Роли.ДобавлениеИзменениеВнешнихПользователей.Синоним, + Метаданные.Роли.ЧтениеВнешнихПользователей.Синоним); + РазрешеноУправлениеПравами = Ложь; + + ИначеЕсли ( ТипЗнч(СсылкаНаОбъект) = Тип("СправочникСсылка.Пользователи") ИЛИ + ТипЗнч(СсылкаНаОбъект) = Тип("СправочникСсылка.ГруппыПользователей") ) И + НЕ ЕстьРольДобавлениеИзменениеПользователейИГруппДоступа Тогда + + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'У вас нет роли ""%1""'"), Метаданные.Роли.ДобавлениеИзменениеПользователейИГруппДоступа.Синоним); + РазрешеноУправлениеПравами = Ложь; + КонецЕсли; + + ТолькоПросмотр = НЕ ЕстьРольДобавлениеИзменениеПользователейИГруппДоступа; + + // Проверка разрешения на управление правами заданного значения доступа. + ИначеЕсли НЕ ЕстьПравоПоЗначениюДоступа("УправлениеПравами", СсылкаНаОбъект) Тогда + ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 ""%2"" недоступна для управления правами.'"), СсылкаНаОбъект.Метаданные().ПредставлениеОбъекта, СсылкаНаОбъект); + РазрешеноУправлениеПравами = Ложь; + КонецЕсли; + + Возврат РазрешеноУправлениеПравами; + +КонецФункции // РазрешеноУправлениеПравамиПоЗначениямДоступа() + +// Функция возвращает значение ПараметрСеанса.ОграничиватьДоступПоВиду, +// установленное по значению Константа.ОграничиватьДоступНаУровнеЗаписей. +// +Функция ОграничиватьДоступНаУровнеЗаписей() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Возврат(ПараметрыСеанса.ОграничиватьДоступПоВиду <> ""); + +КонецФункции // ОграничиватьДоступНаУровнеЗаписей() + +// Функция НовоеОписаниеПрофиляГруппДоступа возвращает структуру для +// удобства описания начальных профилей. +// Чтобы задать предустановленный вид доступа, +// нужно в представлении задать строку Предустановленный. +// Чтобы добавить значение доступа нужно задать +// полное имя предопределенного элемента, например, +// "Справочник.ГруппыПользователей.ВсеПользователи". +// +Функция НовоеОписаниеПрофиляГруппДоступа() Экспорт + + Возврат( Новый Структура("Идентификатор, + |Наименование, + |Роли, + |ВидыДоступа, + |ЗначенияДоступа", + "", + "", + Новый Массив, + Новый СписокЗначений, + Новый СписокЗначений) ); + +КонецФункции // НовоеОписаниеПрофиляГруппДоступа() + +// Функция ТаблицаНаборыЗначенийДоступа возвращает пустую таблицу, +// которая заполняется для передачи в функцию ЕстьРоль() и в процедуры +// ЗаполнитьНаборыЗначенийДоступа(Таблица), определенные прикладным разработчиком. +// +// Возвращаемое значение: +// ТаблицаЗначений с полями: +// НомерНабора - Число (необязательно, если набор один), +// ВидДоступа - ПланВидовХарактеристикСсылка.ВидыДоступа, (обязательно), +// ЗначениеДоступа - Неопределено, СправочникСсылка или др. (обязательно), +// Чтение - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, +// Добавление - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, +// Изменение - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, +// Удаление - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, +// +Функция ТаблицаНаборыЗначенийДоступа() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Таблица = Новый ТаблицаЗначений; + Таблица.Колонки.Добавить("НомерНабора", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(4, 0, ДопустимыйЗнак.Неотрицательный))); + Таблица.Колонки.Добавить("ВидДоступа", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыДоступа")); + Таблица.Колонки.Добавить("ЗначениеДоступа", Метаданные.РегистрыСведений.НаборыЗначенийДоступа.Измерения.ЗначениеДоступа.Тип); + Таблица.Колонки.Добавить("Чтение", Новый ОписаниеТипов("Булево")); + Таблица.Колонки.Добавить("Добавление", Новый ОписаниеТипов("Булево")); + Таблица.Колонки.Добавить("Изменение", Новый ОписаниеТипов("Булево")); + Таблица.Колонки.Добавить("Удаление", Новый ОписаниеТипов("Булево")); + + Возврат Таблица; + +КонецФункции + +// Процедура ЗаполнитьНаборыЗначенийДоступа заполняет наборы значений доступа объекта, +// используя процедуру ЗаполнитьНаборыЗначенийДоступа(Таблица), +// созданную прикладным разработчиком в модуле объекта, +// тип которого задан в одной из подписок на событие +// "ЗаписатьНаборыЗначенийДоступа" или "ЗаписатьЗависимыеНаборыЗначенийДоступа". +// +// Параметры: +// Объект - СправочникОбъект, ДокументОбъект, ..., или СправочникСсылка, ДокументСсылка, ... +// Если передана ссылка, то по ней будет получен объект. +// Таблица - ТабличнаяЧасть, +// РегистрСведенийНаборЗаписей.НаборыЗначенийДоступа, +// Неопределено, тогда будет создана таблица значений +// УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(), содержащая поля: +// НомерНабора - Число (необязательно, если набор один), +// ВидДоступа - ПланВидовХарактеристикСсылка.ВидыДоступа, (обязательно), +// ЗначениеДоступа - Неопределено, СправочникСсылка или др. (обязательно), +// Чтение - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, +// Добавление - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, +// Изменение - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, +// Удаление - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, +// СсылкаНаПодчиненныйОбъект - ЛюбаяСсылка, используется, когда нужно заполнить наборы значений доступа объекта-владельца +// для подчиненного объекта. +// +Процедура ЗаполнитьНаборыЗначенийДоступа(Знач Объект, Таблица, Знач СсылкаНаПодчиненныйОбъект = Неопределено) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + // Если передана ссылка, тогда получить объект. + Объект = ?(Объект = Объект.Ссылка, Объект.ПолучитьОбъект(), Объект); + + Если НЕ Метаданные.ПодпискиНаСобытия.ЗаписатьНаборыЗначенийДоступа.Источник.СодержитТип(ТипЗнч(Объект)) И + НЕ Метаданные.ПодпискиНаСобытия.ЗаписатьЗависимыеНаборыЗначенийДоступа.Источник.СодержитТип(ТипЗнч(Объект)) Тогда + ВызватьИсключение(СтрЗаменить(НСтр("ru = 'Неверные параметры! + |Тип объекта ""%1"" + |не найден ни в одной из подписок на события + |""Записать наборы значений доступа"", + |""Записать зависимые наборы значений доступа"".'"), "%1", ТипЗнч(Объект))); + КонецЕсли; + + Если СсылкаНаПодчиненныйОбъект <> Неопределено Тогда + + Таблица = ТаблицаНаборыЗначенийДоступа(); + Объект.ЗаполнитьНаборыЗначенийДоступа(Таблица); + // Добавление пустого набора, чтобы установить все флажки прав и упорядочить строки наборов. + ДобавитьНаборыЗначенийДоступа(Таблица, ТаблицаНаборыЗначенийДоступа()); + Иначе + Если Таблица = Неопределено Тогда + Таблица = ТаблицаНаборыЗначенийДоступа(); + КонецЕсли; + Объект.ЗаполнитьНаборыЗначенийДоступа(Таблица); + КонецЕсли; + + Если Таблица.Количество() = 0 Тогда + // Если это условие отключить, тогда зациклится регламентное задание + // заполнения регистров ограничения доступа. + ВызватьИсключение(СтрЗаменить(НСтр("ru = 'Объект ""%1"" сформировал пустой набор значений доступа!'"),"%1", ТипЗнч(Объект))); + КонецЕсли; + + Если СсылкаНаПодчиненныйОбъект <> Неопределено Тогда + // Добавление наборов проверки прав Чтения, Изменения "ведущего" объекта-владельца, + // при формировании зависимых наборов значений в процедурах, + // подготовленных прикладным разработчиком. + // + // Действие не требуется при заполнении конечного набора (даже включающего зависимые наборы), + // т.к. в стандартных шаблонах проверка прав встроена в логику работы вида доступа "Объект". + + Если НЕ Метаданные.РегистрыСведений.НаборыЗначенийДоступа.Измерения.ЗначениеДоступа.Тип.СодержитТип(ТипЗнч(Объект.Ссылка)) Тогда + ВызватьИсключение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В измерении ""ЗначениеДоступа"" регистра сведений ""Наборы значений доступа"" + |не задан тип ""%1"" для значения ""%2""'"), + Строка(ТипЗнч(Объект.Ссылка)), + Строка(Объект.Ссылка) )); + КонецЕсли; + + // Подготовка наборов объекта по отдельным правам. + НаборыЧтения = ТаблицаНаборыЗначенийДоступа(); + НаборыДобавления = ТаблицаНаборыЗначенийДоступа(); + НаборыИзменения = ТаблицаНаборыЗначенийДоступа(); + Для каждого Строка Из Таблица Цикл + Если Строка.Чтение Тогда + НоваяСтрока = НаборыЧтения.Добавить(); + НоваяСтрока.НомерНабора = Строка.НомерНабора + 1; + НоваяСтрока.ВидДоступа = Строка.ВидДоступа; + НоваяСтрока.ЗначениеДоступа = Строка.ЗначениеДоступа; + КонецЕсли; + Если Строка.Добавление Тогда + НоваяСтрока = НаборыДобавления.Добавить(); + НоваяСтрока.НомерНабора = (Строка.НомерНабора + 1)*2; + НоваяСтрока.ВидДоступа = Строка.ВидДоступа; + НоваяСтрока.ЗначениеДоступа = Строка.ЗначениеДоступа; + КонецЕсли; + Если Строка.Изменение Тогда + НоваяСтрока = НаборыИзменения.Добавить(); + НоваяСтрока.НомерНабора = (Строка.НомерНабора + 1)*3; + НоваяСтрока.ВидДоступа = Строка.ВидДоступа; + НоваяСтрока.ЗначениеДоступа = Строка.ЗначениеДоступа; + КонецЕсли; + КонецЦикла; + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ЗависимостиПравДоступа.ПриПроверкеПраваЧтение, + | ЗависимостиПравДоступа.ПриПроверкеПраваДобавление, + | ЗависимостиПравДоступа.ПриПроверкеПраваИзменение, + | ЗависимостиПравДоступа.ПриПроверкеПраваУдаление, + | ЗависимостиПравДоступа.ОтключитьПроверкуПравВедущейТаблицы + |ИЗ + | РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа + |ГДЕ + | ЗависимостиПравДоступа.ПодчиненнаяТаблица = &ПодчиненнаяТаблица + | И ЗависимостиПравДоступа.ТипВедущейТаблицы = &ТипВедущейТаблицы"); + Запрос.УстановитьПараметр("ПодчиненнаяТаблица", СсылкаНаПодчиненныйОбъект.Метаданные().ПолноеИмя()); + МассивТипов = Новый Массив; + МассивТипов.Добавить(ТипЗнч(Объект.Ссылка)); + ОписаниеТипов = Новый ОписаниеТипов(МассивТипов); + Запрос.УстановитьПараметр("ТипВедущейТаблицы", ОписаниеТипов.ПривестиЗначение(Неопределено)); + ЗависимостиПрав = Запрос.Выполнить().Выгрузить(); + + Таблица.Очистить(); + + Если ЗависимостиПрав.Количество() = 0 Тогда + + // Добавление наборов по стандартному правилу. + + // Проверка права Чтения "ведущего" объекта-владельца наборов + // при проверке права Чтения "подчиненного" объекта. + Строка = Таблица.Добавить(); + Строка.НомерНабора = 1; + Строка.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения; + Строка.ЗначениеДоступа = Объект.Ссылка; + Строка.Чтение = Истина; + + // Проверка права Изменения "ведущего" объекта-владельца наборов + // при проверке прав Добавления, Изменения, Удаления "подчиненного" объекта. + Строка = Таблица.Добавить(); + Строка.НомерНабора = 2; + Строка.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения; + Строка.ЗначениеДоступа = Объект.Ссылка; + Строка.Добавление = Истина; + Строка.Изменение = Истина; + Строка.Удаление = Истина; + + // Пометка прав, требующих проверки наборов ограничения права чтения "ведущего" объекта-владельца. + НаборыЧтения.ЗаполнитьЗначения(Истина, "Чтение"); + // Пометка прав, требующих проверки наборов ограничения права изменения "ведущего" объекта-владельца. + НаборыИзменения.ЗаполнитьЗначения(Истина, "Добавление, Изменение, Удаление"); + + ДобавитьНаборыЗначенийДоступа(НаборыЧтения, НаборыИзменения); + ДобавитьНаборыЗначенийДоступа(Таблица, НаборыЧтения, Истина); + Иначе + // Проверка права Чтения "ведущего" объекта-владельца наборов + // при проверке прав "подчиненного" объекта. + + ЗависимостиПрав = ЗависимостиПрав[0]; + НаборыПравДляУмножения = Таблица.Скопировать(); + НаборыОграниченийДляУмножения = Таблица.Скопировать(); + + ДобавитьНаборыДляПрава("Чтение", ЗависимостиПрав, Таблица, НаборыПравДляУмножения, НаборыОграниченийДляУмножения, НаборыЧтения, НаборыДобавления, НаборыИзменения, Объект.Ссылка); + ДобавитьНаборыДляПрава("Добавление", ЗависимостиПрав, Таблица, НаборыПравДляУмножения, НаборыОграниченийДляУмножения, НаборыЧтения, НаборыДобавления, НаборыИзменения, Объект.Ссылка); + ДобавитьНаборыДляПрава("Изменение", ЗависимостиПрав, Таблица, НаборыПравДляУмножения, НаборыОграниченийДляУмножения, НаборыЧтения, НаборыДобавления, НаборыИзменения, Объект.Ссылка); + ДобавитьНаборыДляПрава("Удаление", ЗависимостиПрав, Таблица, НаборыПравДляУмножения, НаборыОграниченийДляУмножения, НаборыЧтения, НаборыДобавления, НаборыИзменения, Объект.Ссылка); + + Если НаборыПравДляУмножения.Количество() > 0 Тогда + ДобавитьНаборыЗначенийДоступа(НаборыПравДляУмножения, НаборыОграниченийДляУмножения, Истина); + Если НаборыПравДляУмножения.Количество() > 0 Тогда + ДобавитьНаборыЗначенийДоступа(Таблица, НаборыПравДляУмножения); + КонецЕсли; + КонецЕсли; + + КонецЕсли; + КонецЕсли; + +КонецПроцедуры // ЗаполнитьНаборыЗначенийДоступа() + +// Процедура ДобавитьНаборыЗначенийДоступа позволяет добавить к одной таблице наборов +// значений доступа другую таблицу, либо логическим сложением, либо логическим умножением. +// Результат помещается в приемник. +// +// Параметры: +// Приемник, +// Источник - ТабличнаяЧасть или ТаблицаЗначений +// с полями, как в таблице, возвращаемой функцией +// УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(), +// Умножение - Булево, определяет способ логического объединения наборов приемника и источника. +// Упростить - Булево, определяет требуется ли упрощение наборов после добавления. +// +// СсылкаНаОбъект - не использовать (предназначена для внутреннего использования). +// +Процедура ДобавитьНаборыЗначенийДоступа(Приемник, Знач Источник, Знач Умножение = Ложь, Знач Упростить = Ложь, Знач СсылкаНаОбъект = Неопределено) Экспорт + + Если Источник.Количество() = 0 И Приемник.Количество() = 0 Тогда + Возврат; + + ИначеЕсли Умножение И ( Источник.Количество() = 0 ИЛИ Приемник.Количество() = 0 ) Тогда + Приемник.Очистить(); + Источник.Очистить(); + Возврат; + + КонецЕсли; + + Запрос = Новый Запрос; + Если Приемник.Количество() = 0 Тогда + Запрос.УстановитьПараметр("Приемник", Источник); + Запрос.УстановитьПараметр("Источник", Приемник); + Иначе + Запрос.УстановитьПараметр("Приемник", Приемник); + Запрос.УстановитьПараметр("Источник", Источник); + КонецЕсли; + + // Подготовка временных таблиц приемника. + Запрос.Текст = + "ВЫБРАТЬ + | Приемник.НомерНабора + 1 КАК НомерНабора, + | Приемник.ВидДоступа, + | Приемник.ЗначениеДоступа, + | Приемник.Чтение, + | Приемник.Добавление, + | Приемник.Изменение, + | Приемник.Удаление + |ПОМЕСТИТЬ Приемник + |ИЗ + | &Приемник КАК Приемник + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПраваБезНормализации.НомерНабора, + | ВЫБОР + | КОГДА (НЕ ПраваБезНормализации.Чтение) + | И (НЕ ПраваБезНормализации.Добавление) + | И (НЕ ПраваБезНормализации.Изменение) + | И (НЕ ПраваБезНормализации.Удаление) + | ТОГДА ИСТИНА + | ИНАЧЕ ПраваБезНормализации.Чтение + | КОНЕЦ КАК Чтение, + | ВЫБОР + | КОГДА (НЕ ПраваБезНормализации.Чтение) + | И (НЕ ПраваБезНормализации.Добавление) + | И (НЕ ПраваБезНормализации.Изменение) + | И (НЕ ПраваБезНормализации.Удаление) + | ТОГДА ИСТИНА + | ИНАЧЕ ПраваБезНормализации.Добавление + | КОНЕЦ КАК Добавление, + | ВЫБОР + | КОГДА (НЕ ПраваБезНормализации.Чтение) + | И (НЕ ПраваБезНормализации.Добавление) + | И (НЕ ПраваБезНормализации.Изменение) + | И (НЕ ПраваБезНормализации.Удаление) + | ТОГДА ИСТИНА + | ИНАЧЕ ПраваБезНормализации.Изменение + | КОНЕЦ КАК Изменение, + | ВЫБОР + | КОГДА (НЕ ПраваБезНормализации.Чтение) + | И (НЕ ПраваБезНормализации.Добавление) + | И (НЕ ПраваБезНормализации.Изменение) + | И (НЕ ПраваБезНормализации.Удаление) + | ТОГДА ИСТИНА + | ИНАЧЕ ПраваБезНормализации.Удаление + | КОНЕЦ КАК Удаление, + | ПраваБезНормализации.ДлинаНабора + |ПОМЕСТИТЬ ПраваНаборовПриемника + |ИЗ + | (ВЫБРАТЬ + | Приемник.НомерНабора КАК НомерНабора, + | МАКСИМУМ(Приемник.Чтение) КАК Чтение, + | МАКСИМУМ(Приемник.Добавление) КАК Добавление, + | МАКСИМУМ(Приемник.Изменение) КАК Изменение, + | МАКСИМУМ(Приемник.Удаление) КАК Удаление, + | КОЛИЧЕСТВО(Приемник.НомерНабора) КАК ДлинаНабора + | ИЗ + | Приемник КАК Приемник + | + | СГРУППИРОВАТЬ ПО + | Приемник.НомерНабора) КАК ПраваБезНормализации + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | МАКСИМУМ(Приемник.НомерНабора) КАК НомерНабораПриемника + |ПОМЕСТИТЬ Максимальный + |ИЗ + | Приемник КАК Приемник"; + + // Подготовка временных таблиц источника. + Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + + "ВЫБРАТЬ + | Источник.НомерНабора + 1 КАК НомерНабора, + | Источник.ВидДоступа, + | Источник.ЗначениеДоступа, + | Источник.Чтение, + | Источник.Добавление, + | Источник.Изменение, + | Источник.Удаление + |ПОМЕСТИТЬ Источник + |ИЗ + | &Источник КАК Источник + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПраваБезНормализации.НомерНабора, + | ВЫБОР + | КОГДА (НЕ ПраваБезНормализации.Чтение) + | И (НЕ ПраваБезНормализации.Добавление) + | И (НЕ ПраваБезНормализации.Изменение) + | И (НЕ ПраваБезНормализации.Удаление) + | ТОГДА ИСТИНА + | ИНАЧЕ ПраваБезНормализации.Чтение + | КОНЕЦ КАК Чтение, + | ВЫБОР + | КОГДА (НЕ ПраваБезНормализации.Чтение) + | И (НЕ ПраваБезНормализации.Добавление) + | И (НЕ ПраваБезНормализации.Изменение) + | И (НЕ ПраваБезНормализации.Удаление) + | ТОГДА ИСТИНА + | ИНАЧЕ ПраваБезНормализации.Добавление + | КОНЕЦ КАК Добавление, + | ВЫБОР + | КОГДА (НЕ ПраваБезНормализации.Чтение) + | И (НЕ ПраваБезНормализации.Добавление) + | И (НЕ ПраваБезНормализации.Изменение) + | И (НЕ ПраваБезНормализации.Удаление) + | ТОГДА ИСТИНА + | ИНАЧЕ ПраваБезНормализации.Изменение + | КОНЕЦ КАК Изменение, + | ВЫБОР + | КОГДА (НЕ ПраваБезНормализации.Чтение) + | И (НЕ ПраваБезНормализации.Добавление) + | И (НЕ ПраваБезНормализации.Изменение) + | И (НЕ ПраваБезНормализации.Удаление) + | ТОГДА ИСТИНА + | ИНАЧЕ ПраваБезНормализации.Удаление + | КОНЕЦ КАК Удаление, + | ПраваБезНормализации.ДлинаНабора + |ПОМЕСТИТЬ ПраваНаборовИсточника + |ИЗ + | (ВЫБРАТЬ + | Источник.НомерНабора КАК НомерНабора, + | МАКСИМУМ(Источник.Чтение) КАК Чтение, + | МАКСИМУМ(Источник.Добавление) КАК Добавление, + | МАКСИМУМ(Источник.Изменение) КАК Изменение, + | МАКСИМУМ(Источник.Удаление) КАК Удаление, + | МАКСИМУМ(Источник.НомерНабора) КАК ДлинаНабора + | ИЗ + | Источник КАК Источник + | + | СГРУППИРОВАТЬ ПО + | Источник.НомерНабора) КАК ПраваБезНормализации"; + + // Выполнение операции логического сложения или логического умножения. + Если Умножение Тогда + Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | (Приемник.НомерНабора - 1) * Максимальный.НомерНабораПриемника + Источник.НомерНабора КАК НомерНабора, + | Приемник.НомерНабора КАК НомерНабораПриемника, + | Источник.НомерНабора КАК НомерНабораИсточника, + | ВЫБОР + | КОГДА ПраваНаборовПриемника.Чтение + | И ПраваНаборовИсточника.Чтение + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК Чтение, + | ВЫБОР + | КОГДА ПраваНаборовПриемника.Добавление + | И ПраваНаборовИсточника.Добавление + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК Добавление, + | ВЫБОР + | КОГДА ПраваНаборовПриемника.Изменение + | И ПраваНаборовИсточника.Изменение + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК Изменение, + | ВЫБОР + | КОГДА ПраваНаборовПриемника.Удаление + | И ПраваНаборовИсточника.Удаление + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК Удаление, + | ПраваНаборовПриемника.ДлинаНабора + ПраваНаборовИсточника.ДлинаНабора КАК ДлинаНабора + |ПОМЕСТИТЬ ПраваУмноженныхНаборов + |ИЗ + | Приемник КАК Приемник + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПраваНаборовПриемника КАК ПраваНаборовПриемника + | ПО Приемник.НомерНабора = ПраваНаборовПриемника.НомерНабора + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Источник КАК Источник + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПраваНаборовИсточника КАК ПраваНаборовИсточника + | ПО Источник.НомерНабора = ПраваНаборовИсточника.НомерНабора + | ПО (ПраваНаборовПриемника.Чтение + | И ПраваНаборовИсточника.Чтение + | ИЛИ ПраваНаборовПриемника.Добавление + | И ПраваНаборовИсточника.Добавление + | ИЛИ ПраваНаборовПриемника.Изменение + | И ПраваНаборовИсточника.Изменение + | ИЛИ ПраваНаборовПриемника.Удаление + | И ПраваНаборовИсточника.Удаление) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Максимальный КАК Максимальный + | ПО (ИСТИНА)"; + Если НЕ Упростить Тогда + Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + + "ВЫБРАТЬ + | ПраваУмноженныхНаборов.НомерНабора, + | Приемник.ВидДоступа, + | Приемник.ЗначениеДоступа, + | ПраваУмноженныхНаборов.Чтение, + | ПраваУмноженныхНаборов.Добавление, + | ПраваУмноженныхНаборов.Изменение, + | ПраваУмноженныхНаборов.Удаление + |ИЗ + | ПраваУмноженныхНаборов КАК ПраваУмноженныхНаборов + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Приемник КАК Приемник + | ПО ПраваУмноженныхНаборов.НомерНабораПриемника = Приемник.НомерНабора + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ПраваУмноженныхНаборов.НомерНабора, + | Источник.ВидДоступа, + | Источник.ЗначениеДоступа, + | ПраваУмноженныхНаборов.Чтение, + | ПраваУмноженныхНаборов.Добавление, + | ПраваУмноженныхНаборов.Изменение, + | ПраваУмноженныхНаборов.Удаление + |ИЗ + | ПраваУмноженныхНаборов КАК ПраваУмноженныхНаборов + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Источник КАК Источник + | ПО ПраваУмноженныхНаборов.НомерНабораИсточника = Источник.НомерНабора"; + Иначе + Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + + "ВЫБРАТЬ + | ПраваУмноженныхНаборов.НомерНабора, + | Приемник.ВидДоступа, + | Приемник.ЗначениеДоступа, + | ПраваУмноженныхНаборов.Чтение, + | ПраваУмноженныхНаборов.Добавление, + | ПраваУмноженныхНаборов.Изменение, + | ПраваУмноженныхНаборов.Удаление, + | ПраваУмноженныхНаборов.ДлинаНабора + |ПОМЕСТИТЬ ВсеНаборы + |ИЗ + | ПраваУмноженныхНаборов КАК ПраваУмноженныхНаборов + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Приемник КАК Приемник + | ПО ПраваУмноженныхНаборов.НомерНабораПриемника = Приемник.НомерНабора + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ПраваУмноженныхНаборов.НомерНабора, + | Источник.ВидДоступа, + | Источник.ЗначениеДоступа, + | ПраваУмноженныхНаборов.Чтение, + | ПраваУмноженныхНаборов.Добавление, + | ПраваУмноженныхНаборов.Изменение, + | ПраваУмноженныхНаборов.Удаление, + | ПраваУмноженныхНаборов.ДлинаНабора + |ИЗ + | ПраваУмноженныхНаборов КАК ПраваУмноженныхНаборов + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Источник КАК Источник + | ПО ПраваУмноженныхНаборов.НомерНабораИсточника = Источник.НомерНабора"; + КонецЕсли; + ИначеЕсли НЕ Упростить Тогда + Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | Приемник.НомерНабора КАК НомерНабора, + | Приемник.ВидДоступа, + | Приемник.ЗначениеДоступа, + | ПраваНаборовПриемника.Чтение, + | ПраваНаборовПриемника.Добавление, + | ПраваНаборовПриемника.Изменение, + | ПраваНаборовПриемника.Удаление + |ИЗ + | Приемник КАК Приемник + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПраваНаборовПриемника КАК ПраваНаборовПриемника + | ПО Приемник.НомерНабора = ПраваНаборовПриемника.НомерНабора + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | Источник.НомерНабора + Максимальный.НомерНабораПриемника, + | Источник.ВидДоступа, + | Источник.ЗначениеДоступа, + | ПраваНаборовИсточника.Чтение, + | ПраваНаборовИсточника.Добавление, + | ПраваНаборовИсточника.Изменение, + | ПраваНаборовИсточника.Удаление + |ИЗ + | Источник КАК Источник + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПраваНаборовИсточника КАК ПраваНаборовИсточника + | ПО Источник.НомерНабора = ПраваНаборовИсточника.НомерНабора + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Максимальный КАК Максимальный + | ПО (ИСТИНА)"; + Иначе + Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | Приемник.НомерНабора КАК НомерНабора, + | Приемник.ВидДоступа, + | Приемник.ЗначениеДоступа, + | ПраваНаборовПриемника.Чтение, + | ПраваНаборовПриемника.Добавление, + | ПраваНаборовПриемника.Изменение, + | ПраваНаборовПриемника.Удаление, + | ПраваНаборовПриемника.ДлинаНабора + |ПОМЕСТИТЬ ВсеНаборы + |ИЗ + | Приемник КАК Приемник + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПраваНаборовПриемника КАК ПраваНаборовПриемника + | ПО Приемник.НомерНабора = ПраваНаборовПриемника.НомерНабора + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | Источник.НомерНабора + Максимальный.НомерНабораПриемника, + | Источник.ВидДоступа, + | Источник.ЗначениеДоступа, + | ПраваНаборовИсточника.Чтение, + | ПраваНаборовИсточника.Добавление, + | ПраваНаборовИсточника.Изменение, + | ПраваНаборовИсточника.Удаление, + | ПраваНаборовИсточника.ДлинаНабора + |ИЗ + | Источник КАК Источник + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПраваНаборовИсточника КАК ПраваНаборовИсточника + | ПО Источник.НомерНабора = ПраваНаборовИсточника.НомерНабора + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Максимальный КАК Максимальный + | ПО (ИСТИНА)"; + КонецЕсли; + + Если НЕ Упростить Тогда + + Если ТипЗнч(Приемник) = Тип("ТаблицаЗначений") Тогда + // Подготовка результата с избавлением от типа NULL в колонках таблицы значений. + НаборЗаписей = РегистрыСведений.НаборыЗначенийДоступа.СоздатьНаборЗаписей(); + НаборЗаписей.Загрузить(Запрос.Выполнить().Выгрузить()); + Приемник = НаборЗаписей.Выгрузить(, "НомерНабора, ВидДоступа, ЗначениеДоступа, Чтение, Добавление, Изменение, Удаление"); + Иначе + Приемник.Загрузить(Запрос.Выполнить().Выгрузить()); + КонецЕсли; + + Возврат; + КонецЕсли; + + // Подготовка номеров всех наборов для определения копий наборов по правам. + Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВсеНаборы.НомерНабора, + | ВсеНаборы.Чтение, + | ВсеНаборы.Добавление, + | ВсеНаборы.Изменение, + | ВсеНаборы.Удаление, + | ВсеНаборы.ДлинаНабора + |ПОМЕСТИТЬ ВсеНомераНаборов + |ИЗ + | ВсеНаборы КАК ВсеНаборы"; + + // Определение копий наборов в пределах прав. + // "Копии" возникают из-за правил раскрытия скобок в логических выражениях: + // Для наборов в пределах права и наборов разных прав: + // 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 в колонках таблицы значений. + НаборЗаписей = РегистрыСведений.НаборыЗначенийДоступа.СоздатьНаборЗаписей(); + НаборЗаписей.Загрузить(Запрос.Выполнить().Выгрузить()); + Приемник = НаборЗаписей.Выгрузить(, "НомерНабора, ВидДоступа, ЗначениеДоступа, Чтение, Добавление, Изменение, Удаление"); + Иначе + Приемник.Загрузить(Запрос.Выполнить().Выгрузить()); + КонецЕсли; + Иначе + // Выбор наборов и загрузка в РегистрСведенийНаборЗаписей.НаборыЗначенийДоступа. + Запрос.УстановитьПараметр("СсылкаНаОбъект", СсылкаНаОбъект); + Запрос.УстановитьПараметр("СвойстваВидовДоступа", СвойстваВидаДоступа()); + Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + + "ВЫБРАТЬ + | СвойстваВидовДоступа.ВидДоступа, + | СвойстваВидовДоступа.ВидДоступаБезГруппЗначенияДоступа, + | СвойстваВидовДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, + | СвойстваВидовДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа + |ПОМЕСТИТЬ СвойстваВидовДоступа + |ИЗ + | &СвойстваВидовДоступа КАК СвойстваВидовДоступа + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | &СсылкаНаОбъект КАК Объект, + | НомераНаборовСПравами.НомерНабора, + | ВсеНаборы.ВидДоступа, + | ВсеНаборы.ЗначениеДоступа, + | НомераНаборовСПравами.Чтение, + | НомераНаборовСПравами.Добавление, + | НомераНаборовСПравами.Изменение, + | НомераНаборовСПравами.Удаление, + | СвойстваВидовДоступа.ВидДоступаБезГруппЗначенияДоступа, + | СвойстваВидовДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, + | СвойстваВидовДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа, + | ВЫБОР + | КОГДА НомераНаборовСПравами.Чтение + | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения) + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + | КОНЕЦ КАК ВидДоступаПравоЧтения, + | ВЫБОР + | КОГДА НомераНаборовСПравами.Добавление + | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления) + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + | КОНЕЦ КАК ВидДоступаПравоДобавления, + | ВЫБОР + | КОГДА НомераНаборовСПравами.Изменение + | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + | КОНЕЦ КАК ВидДоступаПравоИзменения, + | ЕСТЬNULL(ТипыСсылок.ТипТаблицы, НЕОПРЕДЕЛЕНО) КАК ТипЗначенияДоступа + |ИЗ + | НомераНаборовСПравами КАК НомераНаборовСПравами + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеНаборы КАК ВсеНаборы + | ПО НомераНаборовСПравами.НомерНабора = ВсеНаборы.НомерНабора + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылок + | ПО (ТИПЗНАЧЕНИЯ(ВсеНаборы.ЗначениеДоступа) = ТИПЗНАЧЕНИЯ(ТипыСсылок.ТипТаблицы)) + | И (ВсеНаборы.ВидДоступа В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения))) + | ЛЕВОЕ СОЕДИНЕНИЕ СвойстваВидовДоступа КАК СвойстваВидовДоступа + | ПО (ВсеНаборы.ВидДоступа = СвойстваВидовДоступа.ВидДоступа)"; + Приемник.Загрузить(Запрос.Выполнить().Выгрузить()); + КонецЕсли; + +КонецПроцедуры + +// Процедура ОбновитьПоставляемыеПрофилиИГруппыДоступа обновляет +// поставляемые профили, и при необходимости обновляет группы доступа этих профилей. +// Создаются не найденные поставляемые профили групп доступа. +// +// Параметры: +// ТолькоНеИзмененные - Булево, обновлять только те поставляемые профили групп доступа, +// у которых реквизит ПоставляемыйПрофильИзменен = Ложь. +// ОбновлятьГруппыДоступа - Булево, обновлять группы доступа +// обновляемых профилей групп доступа. +// УдаляемыеВидыДоступаБезНастройки - Булево, обновлять только те группы доступа, +// обновляемых профилей групп доступа, у которых настройки видов доступа +// остались неизменными, т.е. все значения, кроме указанных запрещены и +// список заданных значений пуст. +// +Процедура ОбновитьПоставляемыеПрофилиИГруппыДоступа(ТолькоНеИзмененные = Истина, ОбновлятьГруппыДоступа = Истина, УдаляемыеВидыДоступаБезНастройки = Истина) Экспорт + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ПрофилиГруппДоступа.ПоставляемыйПрофильИзменен, + | ПрофилиГруппДоступа.Ссылка + |ИЗ + | Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа"); + ТекущиеПрофили = Запрос.Выполнить().Выгрузить(); + + ОписанияПрофилей = ОписанияНачальногоЗаполненияПрофилейГруппДоступа(); + ОбновленныеПрофили = Новый Массив; + ОбновленныеГруппыДоступа = Новый Массив; + + Для каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл + + Профиль = Справочники.ПрофилиГруппДоступа.ПолучитьСсылку(Новый УникальныйИдентификатор(ОписаниеПрофиля.Идентификатор)); + СтрокаТекущегоПрофиля = ТекущиеПрофили.Найти(Профиль, "Ссылка"); + ПрофильОбновлен = Ложь; + + Если СтрокаТекущегоПрофиля = Неопределено Тогда + // Создание нового поставляемого профиля. + ОбновитьПрофильГруппДоступа(ОписаниеПрофиля); + ИначеЕсли НЕ СтрокаТекущегоПрофиля.ПоставляемыйПрофильИзменен ИЛИ НЕ ТолькоНеИзмененные Тогда + // Обновление поставляемого профиля. + ПрофильОбновлен = ОбновитьПрофильГруппДоступа(ОписаниеПрофиля, Истина); + КонецЕсли; + + Если ОбновлятьГруппыДоступа Тогда + ПрофильОбновлен = ПрофильОбновлен ИЛИ ОбновитьГруппыДоступаПрофиля(Профиль, УдаляемыеВидыДоступаБезНастройки); + КонецЕсли; + + Если ПрофильОбновлен Тогда + ОбновленныеПрофили.Добавить(Профиль); + КонецЕсли; + КонецЦикла; + + // Обновление ролей пользователей. + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПользователиИГруппыПользователей.ЗначениеДоступа КАК Пользователь + |ИЗ + | РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ПО (ПользователиИГруппыПользователей.ВидДоступа В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи))) + | И (ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ) + | И ПользователиИГруппыПользователей.ГруппаДоступа = ГруппыДоступаПользователи.Пользователь + | И (ГруппыДоступаПользователи.Ссылка.Профиль В (&Профили)) + | И (ТИПЗНАЧЕНИЯ(ПользователиИГруппыПользователей.ЗначениеДоступа) = ТИП(Справочник.Пользователи) + | ИЛИ ТИПЗНАЧЕНИЯ(ПользователиИГруппыПользователей.ЗначениеДоступа) = ТИП(Справочник.ВнешниеПользователи))"); + Запрос.УстановитьПараметр("Профили", ОбновленныеПрофили); + ПользователиДляОбновления = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Пользователь"); + УправлениеДоступом.ОбновитьРолиПользователей(ПользователиДляОбновления); + +КонецПроцедуры + +// Процедура ОбновитьПереименованныеРоли позволяет +// выполнить обновление имен ролей в профилях групп доступа, +// если они были переименованы в конфигураторе, например, +// при обновлении информационной базы. +// +// Параметры: +// ПереименованныеРоли - ТаблицаЗначений (СтароеИмяРоли, НовоеИмяРоли) +// если НовоеИмяРоли не задано, роль удаляется. +// +Процедура ОбновитьПереименованныеРоли(ПереименованныеРоли) Экспорт + + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПрофилиГруппДоступаРоли.Ссылка + |ИЗ + | Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли + |ГДЕ + | ПрофилиГруппДоступаРоли.Роль В(&СтарыеИменаРолей)"); + Запрос.УстановитьПараметр("СтарыеИменаРолей", ПереименованныеРоли.ВыгрузитьКолонку("СтароеИмяРоли")); + ОбновляемыеПрофили = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + + Для каждого ОбновляемыйПрофиль Из ОбновляемыеПрофили Цикл + ПрофильОбъект = ОбновляемыйПрофиль.ПолучитьОбъект(); + ПрофильОбъект.ОбменДанными.Загрузка = Истина; + Для каждого ПереименованнаяРоль Из ПереименованныеРоли Цикл + НайденнаяСтрока = ПрофильОбъект.Роли.Найти(ПереименованнаяРоль.СтароеИмяРоли, "Роль"); + Если НайденнаяСтрока <> Неопределено Тогда + Если ЗначениеЗаполнено(ПереименованнаяРоль.НовоеИмяРоли) Тогда + НайденнаяСтрока.Роль = ПереименованнаяРоль.НовоеИмяРоли; + Иначе + ПрофильОбъект.Роли.Удалить(НайденнаяСтрока); + КонецЕсли; + КонецЕсли; + КонецЦикла; + ПрофильОбъект.Записать(); + КонецЦикла; + + Для каждого ОбновляемыйПрофиль Из ОбновляемыеПрофили Цикл + ПрофильОбъект = ОбновляемыйПрофиль.ПолучитьОбъект(); + ПрофильОбъект.Записать(); + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ: общего назначения. + +// Функция СвойстваВидаДоступа возвращает свойства вида доступа, используя функцию +// УправлениеДоступомСерверПовтИсп.СвойстваВидовДоступа(). +// +// Параметры: +// ВидДоступа - ПланВидовХарактеристикСсылка.ВидыДоступа, Неопределено. +// +// Возвращаемое значение: +// Неопределено - когда для вида доступа свойств не найдено, +// ТаблицаЗначений или СтрокаТаблицыЗначений с полями: +// описание которых см. в комментарии к функции +// УправлениеДоступомСерверПовтИсп.СвойстваВидовДоступа(). +// +// +Функция СвойстваВидаДоступа(Знач ВидДоступа = Неопределено) Экспорт + + СвойстваВидовДоступа = УправлениеДоступомСерверПовтИсп.СвойстваВидовДоступа().Скопировать(); + + Если ВидДоступа = Неопределено Тогда + + Возврат СвойстваВидовДоступа; + Иначе + Возврат СвойстваВидовДоступа.Найти(ВидДоступа, "ВидДоступа"); + КонецЕсли; + +КонецФункции + +// Функция ВидыДоступаТаблицы возвращает массив видов доступа +// для таблицы с указанным именем. +// +// Параметры: +// Таблица - Строка, как в фукнции ПолноеИмя() объекта метаданных. +// +// Возвращаемое значение: +// Массив - элементы типа ПланВидовХарактеристикСсылка.ВидыДоступа. +// +Функция ВидыДоступаТаблицы(Знач Таблица) Экспорт + + ВидыДоступа = Новый Массив; + + Для каждого СвойстваВидаДоступа Из УправлениеДоступомСерверПовтИсп.СвойстваВидовДоступа() Цикл + + Если СвойстваВидаДоступа.Таблицы.Найти(Таблица) <> Неопределено Тогда + + ВидыДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа); + КонецЕсли; + КонецЦикла; + + Возврат ВидыДоступа; + +КонецФункции + +// Функция ВозможныеПраваПоЗначениюДоступа возвращает описание возможных прав +// по значению доступа имя таблицы которого, передается в качестве параметра. +// Подробнее о возможных правах см. в комментарии к функции +// УправлениеДоступомСерверПовтИсп.ВозможныеПраваПоЗначениямДоступа(). +// +// Параметры: +// Таблица - Строка, Неопределено - полное имя таблицы значений доступа, +// для которых нужно получить описание возможных прав, +// когда Неопределено, возвращается таблица всех описаний, +// заданных прикладным разработчиком. +// +// Возвращаемое значение: +// ТаблицаЗначений с полями, +// описание которых см. в комментарии к функции +// УправлениеДоступомСерверПовтИсп.ВозможныеПраваПоЗначениямДоступа(). +// Если задан параметр Таблица, возвращаются только её описания. +// +Функция ВозможныеПраваПоЗначениюДоступа(Таблица = Неопределено) Экспорт + + ВозможныеПрава = УправлениеДоступомСерверПовтИсп.ВозможныеПраваПоЗначениямДоступа(); + + Если Таблица = Неопределено Тогда + Строки = Неопределено; + Иначе + Строки = ВозможныеПрава.НайтиСтроки(Новый Структура("ВладелецПрав", Таблица)); + КонецЕсли; + + Возврат ВозможныеПрава.Скопировать(Строки); + +КонецФункции + +// Процедура ОбновитьРолиПользователей обновляет список ролей пользователей +// информационной базы по их текущим принадлежностям к группам доступа. +// Пользователи с ролью "ПолныеПрава" игнорируется. +// +// Параметры: +// Пользователи - Массив элементов СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи. +// ЕстьОшибки - Булево. Возвращает истина, когда были ошибки, записанные в журнал регистрации. +// +Процедура ОбновитьРолиПользователей(Знач Пользователи, ЕстьОшибки = Ложь) Экспорт + + Если НЕ ПользователиПереопределяемый.ЗапретРедактированияРолей() Тогда + // Роли устанавливаются механизмами подсистем Пользователи и ВнешниеПользователи. + Возврат; + КонецЕсли; + + Если Пользователи.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | Пользователи.Ссылка КАК Пользователь + |ПОМЕСТИТЬ ВсеПользователи + |ИЗ + | Справочник.Пользователи КАК Пользователи + |ГДЕ + | Пользователи.Ссылка В(&Пользователи) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ГруппыДоступаПользователи.Пользователь + |ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + |ГДЕ + | ГруппыДоступаПользователи.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.Администраторы) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ВнешниеПользователи.Ссылка + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + |ГДЕ + | ВнешниеПользователи.Ссылка В(&Пользователи) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВсеПользователи.Пользователь, + | ВЫБОР + | КОГДА (НЕ Пользователи.Ссылка ЕСТЬ NULL ) + | ТОГДА Пользователи.ИдентификаторПользователяИБ + | КОГДА (НЕ ВнешниеПользователи.Ссылка ЕСТЬ NULL ) + | ТОГДА ВнешниеПользователи.ИдентификаторПользователяИБ + | ИНАЧЕ НЕОПРЕДЕЛЕНО + | КОНЕЦ КАК ИдентификаторПользователяИБ + |ИЗ + | ВсеПользователи КАК ВсеПользователи + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи + | ПО (Пользователи.Ссылка = ВсеПользователи.Пользователь) + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВнешниеПользователи КАК ВнешниеПользователи + | ПО (ВнешниеПользователи.Ссылка = ВсеПользователи.Пользователь)"); + Запрос.УстановитьПараметр("Пользователи", Пользователи); + ОбновляемыеПользователи = Запрос.Выполнить().Выгрузить(); + + // Подготовка таблицы старых ролей пользователей. + СтарыеРолиПользователей = Новый ТаблицаЗначений; + СтарыеРолиПользователей.Колонки.Добавить("Пользователь", Новый ОписаниеТипов("СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи")); + СтарыеРолиПользователей.Колонки.Добавить("Роль", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200))); + + ТекущийНомер = ОбновляемыеПользователи.Количество() - 1; + Пока ТекущийНомер >= 0 Цикл + // Проверка необходимости обработки пользователя. + ИдентификаторПользователяИБ = ОбновляемыеПользователи[ТекущийНомер].ИдентификаторПользователяИБ; + Если ТипЗнч(ИдентификаторПользователяИБ) = Тип("УникальныйИдентификатор") Тогда + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ИдентификаторПользователяИБ); + Иначе + ПользовательИБ = Неопределено; + КонецЕсли; + Если ПользовательИБ = Неопределено ИЛИ ПустаяСтрока(ПользовательИБ.Имя) Тогда + ОбновляемыеПользователи.Удалить(ОбновляемыеПользователи[ТекущийНомер]); + Иначе + Для каждого Роль Из ПользовательИБ.Роли Цикл + СтараяРольПользователя = СтарыеРолиПользователей.Добавить(); + СтараяРольПользователя.Пользователь = ОбновляемыеПользователи[ТекущийНомер].Пользователь; + СтараяРольПользователя.Роль = Роль.Имя; + КонецЦикла; + КонецЕсли; + ТекущийНомер = ТекущийНомер - 1; + КонецЦикла; + + // Подготовка списка ролей отсутствующих в метаданных и которые нужно переустановить. + Запрос.Текст = + "ВЫБРАТЬ + | СтарыеРолиПользователей.Пользователь, + | СтарыеРолиПользователей.Роль + |ПОМЕСТИТЬ СтарыеРолиПользователей + |ИЗ + | &СтарыеРолиПользователей КАК СтарыеРолиПользователей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВсеДоступныеРоли.Имя КАК Имя + |ПОМЕСТИТЬ ВсеДоступныеРоли + |ИЗ + | &ВсеДоступныеРоли КАК ВсеДоступныеРоли + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ГруппыДоступаПользователи.Пользователь + |ПОМЕСТИТЬ Администраторы + |ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + |ГДЕ + | ГруппыДоступаПользователи.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.Администраторы) + | И ГруппыДоступаПользователи.Пользователь В(&ОбновляемыеПользователи) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | СтарыеРолиПользователей.Пользователь + |ИЗ + | СтарыеРолиПользователей КАК СтарыеРолиПользователей + |ГДЕ + | СтарыеРолиПользователей.Роль = ""ПолныеПрава"" + | И (НЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + | ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ГДЕ + | ГруппыДоступаПользователи.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.Администраторы) + | И ГруппыДоступаПользователи.Пользователь В (&ОбновляемыеПользователи))) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СтарыеРолиПользователей.Пользователь + |ПОМЕСТИТЬ СнятыеАдминистраторы + |ИЗ + | СтарыеРолиПользователей КАК СтарыеРолиПользователей + |ГДЕ + | СтарыеРолиПользователей.Роль = ""ПолныеПрава"" + | И (НЕ СтарыеРолиПользователей.Пользователь В + | (ВЫБРАТЬ + | Администраторы.Пользователь + | ИЗ + | Администраторы КАК Администраторы)) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПользователиИГруппыПользователей.ЗначениеДоступа КАК Пользователь, + | Роли.Ссылка КАК Профиль, + | Роли.Роль + |ПОМЕСТИТЬ ВсеНовыеРолиПользователей + |ИЗ + | Справочник.ПрофилиГруппДоступа.Роли КАК Роли + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ПО (ПользователиИГруппыПользователей.ВидДоступа В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи))) + | И (ПользователиИГруппыПользователей.ЗначениеДоступа В (&ОбновляемыеПользователи)) + | И (ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ) + | И (ПользователиИГруппыПользователей.ГруппаДоступа = ГруппыДоступаПользователи.Пользователь) + | ПО Роли.Ссылка = ГруппыДоступаПользователи.Ссылка.Профиль + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВсеНовыеРолиПользователей.Пользователь, + | ВсеНовыеРолиПользователей.Роль + |ПОМЕСТИТЬ НовыеРолиПользователей + |ИЗ + | ВсеНовыеРолиПользователей КАК ВсеНовыеРолиПользователей + |ГДЕ + | ВсеНовыеРолиПользователей.Роль <> ""ПолныеПрава"" + | И ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + | ИЗ + | ВсеДоступныеРоли КАК ВсеДоступныеРоли + | ГДЕ + | ВсеДоступныеРоли.Имя = ВсеНовыеРолиПользователей.Роль) + | И (НЕ ВсеНовыеРолиПользователей.Пользователь В + | (ВЫБРАТЬ + | Администраторы.Пользователь + | ИЗ + | Администраторы КАК Администраторы)) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | Администраторы.Пользователь, + | ""ПолныеПрава"" + |ИЗ + | Администраторы КАК Администраторы + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СтарыеРолиПользователей.Пользователь + |ПОМЕСТИТЬ ИзмененныеПользователи + |ИЗ + | СтарыеРолиПользователей КАК СтарыеРолиПользователей + | ЛЕВОЕ СОЕДИНЕНИЕ НовыеРолиПользователей КАК НовыеРолиПользователей + | ПО (НовыеРолиПользователей.Пользователь = СтарыеРолиПользователей.Пользователь) + | И (НовыеРолиПользователей.Роль = СтарыеРолиПользователей.Роль) + |ГДЕ + | НовыеРолиПользователей.Роль ЕСТЬ NULL + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | НовыеРолиПользователей.Пользователь + |ИЗ + | НовыеРолиПользователей КАК НовыеРолиПользователей + | ЛЕВОЕ СОЕДИНЕНИЕ СтарыеРолиПользователей КАК СтарыеРолиПользователей + | ПО НовыеРолиПользователей.Пользователь = СтарыеРолиПользователей.Пользователь + | И НовыеРолиПользователей.Роль = СтарыеРолиПользователей.Роль + |ГДЕ + | СтарыеРолиПользователей.Роль ЕСТЬ NULL + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | СнятыеАдминистраторы.Пользователь + |ИЗ + | СнятыеАдминистраторы КАК СнятыеАдминистраторы + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВсеНовыеРолиПользователей.Пользователь, + | ВсеНовыеРолиПользователей.Профиль, + | ВсеНовыеРолиПользователей.Роль + |ИЗ + | ВсеНовыеРолиПользователей КАК ВсеНовыеРолиПользователей + |ГДЕ + | (НЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + | ИЗ + | ВсеДоступныеРоли КАК ВсеДоступныеРоли + | ГДЕ + | ВсеДоступныеРоли.Имя = ВсеНовыеРолиПользователей.Роль))"; + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + Запрос.УстановитьПараметр("ВсеДоступныеРоли", ПользователиСерверПовтИсп.ВсеРоли(Истина)); + Запрос.УстановитьПараметр("ОбновляемыеПользователи", ОбновляемыеПользователи); + Запрос.УстановитьПараметр("СтарыеРолиПользователей", СтарыеРолиПользователей); + + // Регистрация ошибок имен ролей в профилях групп доступа. + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + ЗаписьЖурналаРегистрации(НСтр("ru = 'Управление доступом.Роль не найдена в метаданных'"), + УровеньЖурналаРегистрации.Ошибка, + , + , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru= 'При обновлении ролей пользователя ""<%1>"" роль ""<%2>"" профиля групп доступа ""<%3>"" не найдена в метаданных!'"), + СокрЛП(Выборка.Пользователь.Наименование), + Выборка.Роль, + Выборка.Профиль), + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + ЕстьОшибки = Истина; + КонецЦикла; + + // Обновление ролей пользователейИБ. + Запрос.Текст = + "ВЫБРАТЬ + | ИзмененныеПользователиИРоли.Пользователь, + | ИзмененныеПользователиИРоли.Роль + |ПОМЕСТИТЬ ИзмененныеПользователиИРоли + |ИЗ + | (ВЫБРАТЬ + | НовыеРолиПользователей.Пользователь КАК Пользователь, + | НовыеРолиПользователей.Роль КАК Роль + | ИЗ + | НовыеРолиПользователей КАК НовыеРолиПользователей + | ГДЕ + | НовыеРолиПользователей.Пользователь В + | (ВЫБРАТЬ + | ИзмененныеПользователи.Пользователь + | ИЗ + | ИзмененныеПользователи КАК ИзмененныеПользователи) + | + | ОБЪЕДИНИТЬ + | + | ВЫБРАТЬ + | Пользователи.Ссылка, + | """" + | ИЗ + | Справочник.Пользователи КАК Пользователи + | ГДЕ + | Пользователи.Ссылка В + | (ВЫБРАТЬ + | ИзмененныеПользователи.Пользователь + | ИЗ + | ИзмененныеПользователи КАК ИзмененныеПользователи) + | + | ОБЪЕДИНИТЬ + | + | ВЫБРАТЬ + | ВнешниеПользователи.Ссылка, + | """" + | ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + | ГДЕ + | ВнешниеПользователи.Ссылка В + | (ВЫБРАТЬ + | ИзмененныеПользователи.Пользователь + | ИЗ + | ИзмененныеПользователи КАК ИзмененныеПользователи)) КАК ИзмененныеПользователиИРоли + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ИзмененныеПользователиИРоли.Пользователь, + | ИзмененныеПользователиИРоли.Роль + |ИЗ + | ИзмененныеПользователиИРоли КАК ИзмененныеПользователиИРоли + | + |УПОРЯДОЧИТЬ ПО + | ВЫБОР + | КОГДА (ИзмененныеПользователиИРоли.Пользователь, ""ПолныеПрава"") В + | (ВЫБРАТЬ + | ИзмененныеПользователиИРоли.Пользователь, + | ИзмененныеПользователиИРоли.Роль + | ИЗ + | ИзмененныеПользователиИРоли КАК ИзмененныеПользователиИРоли) + | ТОГДА 0 + | ИНАЧЕ 1 + | КОНЕЦ, + | ИзмененныеПользователиИРоли.Пользователь, + | ИзмененныеПользователиИРоли.Роль"; + Выборка = Запрос.Выполнить().Выбрать(); + + ПользовательИБ = Неопределено; + Пока Выборка.Следующий() Цикл + Если НЕ ЗначениеЗаполнено(Выборка.Роль) Тогда + Если ПользовательИБ <> Неопределено Тогда + ПользовательИБ.Записать(); + КонецЕсли; + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ОбновляемыеПользователи.Найти(Выборка.Пользователь, "Пользователь").ИдентификаторПользователяИБ); + ПользовательИБ.Роли.Очистить(); + Иначе + ПользовательИБ.Роли.Добавить(Метаданные.Роли[Выборка.Роль]); + КонецЕсли; + КонецЦикла; + Если ПользовательИБ <> Неопределено Тогда + ПользовательИБ.Записать(); + КонецЕсли; + +КонецПроцедуры + +// Процедура УстановитьПараметрыСеансаОграниченияДоступа устанавливает +// параметры сеанса по текущим настройкам констант и групп доступа пользователей. +// Вызывается ПриНачалеРаботыСистемы +// +Процедура УстановитьПараметрыСеансаОграниченияДоступа(ИмяПараметра, УстановленныеПараметры) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Если НЕ (Лев(ИмяПараметра, СтрДлина("ОграничиватьДоступПоВиду")) = "ОграничиватьДоступПоВиду" ИЛИ + Лев(ИмяПараметра, СтрДлина("ВидыДоступа")) = "ВидыДоступа") Тогда + + Возврат; + КонецЕсли; + + Если НЕ Константы.ОграничиватьДоступНаУровнеЗаписей.Получить() Тогда + // Для корректной работы препроцессора в ограничениях доступа, требуется инициализации всех + // параметров сеанса, которые могут быть востребованы в работе препроцессора. + Если ИмяПараметра = "ВидыДоступаЕдинственныеДляТипаЗначенияДоступа" ИЛИ + ИмяПараметра = "ВидыДоступаБезГруппЗначенияДоступа" Тогда + ПараметрыСеанса[ИмяПараметра] = Новый ФиксированныйМассив(Новый Массив); + Иначе + ПараметрыСеанса[ИмяПараметра] = ""; + КонецЕсли; + УстановленныеПараметры.Добавить(ИмяПараметра); + Возврат; + КонецЕсли; + + // Следующие виды доступа не самостоятельные, + // поэтому не учитываются при расчете необходимости ограничения в целом. + // В стандартных шаблонах проверка по этим видам доступа всегда выполняется, + // а в препроцессоре проверка использования не выполнятся. + ПараметрыСеанса.ОграничиватьДоступПоВидуУсловие = ""; + ПараметрыСеанса.ОграничиватьДоступПоВидуОбъект = ""; + УстановленныеПараметры.Добавить("ОграничиватьДоступПоВидуУсловие"); + УстановленныеПараметры.Добавить("ОграничиватьДоступПоВидуОбъект"); + + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВидыДоступаПрофилейГруппДоступа.ВидДоступа + |ИЗ + | Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ВидыДоступаПрофилейГруппДоступа + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ПО (ПользователиИГруппыПользователей.ВидДоступа = &ВидДоступаПользователи) + | И (ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь) + | И (ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ) + | И (ПользователиИГруппыПользователей.ГруппаДоступа = ГруппыДоступаПользователи.Пользователь) + | ПО ГруппыДоступа.Ссылка = ГруппыДоступаПользователи.Ссылка + | ПО (ГруппыДоступа.Профиль = ВидыДоступаПрофилейГруппДоступа.Ссылка)"); + Запрос.УстановитьПараметр("ВидДоступаПользователи", ?(ЗначениеЗаполнено(ПараметрыСеанса.ТекущийПользователь), + ПланыВидовХарактеристик.ВидыДоступа.Пользователи, + ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи)); + Запрос.УстановитьПараметр("ТекущийПользователь", ?(ЗначениеЗаполнено(ПараметрыСеанса.ТекущийПользователь), + ПараметрыСеанса.ТекущийПользователь, + ПараметрыСеанса.ТекущийВнешнийПользователь)); + ОграничиваемыеВидыДоступа = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ВидДоступа"); + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ВидыДоступа.Ссылка КАК ВидДоступа + |ИЗ + | ПланВидовХарактеристик.ВидыДоступа КАК ВидыДоступа + |ГДЕ + | ВидыДоступа.Предопределенный"); + Выборка = Запрос.Выполнить().Выбрать(); + + КаждыйВидЕдинственный = Истина; + КаждыйВидБезГрупп = Истина; + + ВидыДоступаБезОграничения = Новый Массив; + ВидыДоступаЕдинственныеДляТипаЗначенияДоступа = Новый Массив; + ВидыДоступаБезГруппЗначенияДоступа = Новый Массив; + ВидыДоступаЧерезПраваПоЗначениямДоступа = Новый Массив; + + Пока Выборка.Следующий() Цикл + + СвойстваВидаДоступа = СвойстваВидаДоступа(Выборка.ВидДоступа); + + Если СвойстваВидаДоступа.ВидДоступаИспользуетсяВсегда Тогда + // Такие виды доступа не самостоятельные, поэтому не учитываются при расчете + // необходимости ограничения в целом. + // В стандартных шаблонах проверка по этим видам доступа всегда выполняется, + // а в препроцессоре проверка использования не выполнятся. + ОписаниеВидаДоступа = ""; + + ИначеЕсли НЕ СвойстваВидаДоступа.ВидДоступаИспользуется Тогда + ОписаниеВидаДоступа = ""; + ВидыДоступаБезОграничения.Добавить(Выборка.ВидДоступа); + + ИначеЕсли ОграничиваемыеВидыДоступа.Найти(Выборка.ВидДоступа) = Неопределено Тогда + ОписаниеВидаДоступа = ""; + ВидыДоступаБезОграничения.Добавить(Выборка.ВидДоступа); + + ИначеЕсли СвойстваВидаДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа Тогда + ОписаниеВидаДоступа = "ЧерезПраваПоЗначениямДоступа"; + ВидыДоступаЧерезПраваПоЗначениямДоступа.Добавить(Выборка.ВидДоступа); + Иначе + Если СвойстваВидаДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа Тогда + ОписаниеВидаДоступа = "ЕдинственныйВид, "; + ВидыДоступаЕдинственныеДляТипаЗначенияДоступа.Добавить(Выборка.ВидДоступа); + Иначе + ОписаниеВидаДоступа = "ОдинИзМногихВидов,"; + КаждыйВидЕдинственный = Ложь; + КонецЕсли; + Если СвойстваВидаДоступа.ВидДоступаБезГруппЗначенияДоступа Тогда + ОписаниеГрупп = "БезГрупп"; + ВидыДоступаБезГруппЗначенияДоступа.Добавить(Выборка.ВидДоступа); + Иначе + ОписаниеГрупп = ?(СвойстваВидаДоступа.ВидДоступаСОднойГруппойЗначенияДоступа, "ОднаГруппа", "МножествоГрупп"); + КаждыйВидБезГрупп = Ложь; + КонецЕсли; + ОписаниеВидаДоступа = ОписаниеВидаДоступа + ОписаниеГрупп; + КонецЕсли; + ИмяВидаДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПолучитьИмяПредопределенного(Выборка.ВидДоступа); + ПараметрыСеанса["ОграничиватьДоступПоВиду" + ИмяВидаДоступа] = ОписаниеВидаДоступа; + УстановленныеПараметры.Добавить("ОграничиватьДоступПоВиду" + ИмяВидаДоступа); + КонецЦикла; + + ПараметрыСеанса.ВидыДоступаБезОграничения = Новый ФиксированныйМассив(ВидыДоступаБезОграничения); + УстановленныеПараметры.Добавить("ВидыДоступаБезОграничения"); + + ПараметрыСеанса.ВидыДоступаЕдинственныеДляТипаЗначенияДоступа = Новый ФиксированныйМассив(ВидыДоступаЕдинственныеДляТипаЗначенияДоступа); + УстановленныеПараметры.Добавить("ВидыДоступаЕдинственныеДляТипаЗначенияДоступа"); + + ПараметрыСеанса.ВидыДоступаБезГруппЗначенияДоступа = Новый ФиксированныйМассив(ВидыДоступаБезГруппЗначенияДоступа); + УстановленныеПараметры.Добавить("ВидыДоступаБезГруппЗначенияДоступа"); + + ПараметрыСеанса.ВидыДоступаЧерезПраваПоЗначениямДоступа = ?(ВидыДоступаЧерезПраваПоЗначениямДоступа.Количество() = 0, + "", + Новый ФиксированныйМассив(ВидыДоступаЧерезПраваПоЗначениямДоступа)); + УстановленныеПараметры.Добавить("ВидыДоступаЧерезПраваПоЗначениямДоступа"); + + Если КаждыйВидЕдинственный И КаждыйВидБезГрупп Тогда + ПараметрыСеанса.ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп"; + ИначеЕсли КаждыйВидЕдинственный Тогда + ПараметрыСеанса.ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный"; + ИначеЕсли КаждыйВидБезГрупп Тогда + ПараметрыСеанса.ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп"; + Иначе + ПараметрыСеанса.ОграничиватьДоступПоВиду = "Да"; + КонецЕсли; + УстановленныеПараметры.Добавить("ОграничиватьДоступПоВиду"); + +КонецПроцедуры // УстановитьПараметрыСеансаОграниченияДоступа() + +// Процедура ОбновитьТаблицыГруппДоступа проверяет и, если нужно, +// обновляет состав РегистрСведений.ТаблицыГруппДоступа для одной +// или всех групп доступа пользователей, в которых есть пользователи. +// Процедура использует таблицу Справочник.ПрофилиГруппДоступ.ТаблицыРолей. +// +// Параметры: +// ГруппаДоступа - СправочникСсылка.ГруппыДоступа. +// +Процедура ОбновитьТаблицыГруппДоступа(Знач ГруппаДоступа) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ТаблицыПрофиля.Таблица, + | ПользователиГрупп.Пользователь, + | ТаблицыПрофиля.Добавление КАК Добавление, + | ТаблицыПрофиля.Изменение КАК Изменение, + | ТаблицыПрофиля.Удаление КАК Удаление, + | ТаблицыПрофиля.ТипТаблицы КАК ТипТаблицы, + | ВЫБОР + | КОГДА ТаблицыПрофиля.Добавление + | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления) + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + | КОНЕЦ КАК ВидДоступаПравоДобавления, + | ВЫБОР + | КОГДА ТаблицыПрофиля.Изменение + | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + | КОНЕЦ КАК ВидДоступаПравоИзменения + |ПОМЕСТИТЬ ТаблицыПользователейГруппы + |ИЗ + | (ВЫБРАТЬ + | ТаблицыРолей.Таблица КАК Таблица, + | МАКСИМУМ(ТаблицыРолей.Добавление) КАК Добавление, + | МАКСИМУМ(ТаблицыРолей.Изменение) КАК Изменение, + | МАКСИМУМ(ТаблицыРолей.Удаление) КАК Удаление, + | МАКСИМУМ(ТаблицыРолей.ТипТаблицы) КАК ТипТаблицы + | ИЗ + | Справочник.ПрофилиГруппДоступа.ТаблицыРолей КАК ТаблицыРолей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа + | ПО (ГруппыДоступа.Профиль = ТаблицыРолей.Ссылка) + | И (ГруппыДоступа.Ссылка = &ГруппаДоступа) + | + | СГРУППИРОВАТЬ ПО + | ТаблицыРолей.Таблица) КАК ТаблицыПрофиля + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ПользователиГрупп + | ПО (ПользователиГрупп.Ссылка = &ГруппаДоступа) + | И ((НЕ ПользователиГрупп.Пользователь В (НЕОПРЕДЕЛЕНО, ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка), ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка)))) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + | ЛЕВОЕ СОЕДИНЕНИЕ ТаблицыПользователейГруппы КАК ТаблицыПользователейГруппы + | ПО (ТаблицыПользователейГруппы.Таблица = ТаблицыГруппДоступа.Таблица) + | И (ТаблицыПользователейГруппы.Пользователь = ТаблицыГруппДоступа.Пользователь) + | И (ТаблицыПользователейГруппы.Добавление = ТаблицыГруппДоступа.Добавление) + | И (ТаблицыПользователейГруппы.Изменение = ТаблицыГруппДоступа.Изменение) + | И (ТаблицыПользователейГруппы.Удаление = ТаблицыГруппДоступа.Удаление) + | И (ТаблицыПользователейГруппы.ТипТаблицы = ТаблицыГруппДоступа.ТипТаблицы) + | И (ТаблицыПользователейГруппы.ВидДоступаПравоДобавления = ТаблицыГруппДоступа.ВидДоступаПравоДобавления) + | И (ТаблицыПользователейГруппы.ВидДоступаПравоИзменения = ТаблицыГруппДоступа.ВидДоступаПравоИзменения) + |ГДЕ + | ТаблицыГруппДоступа.ГруппаДоступа = &ГруппаДоступа + | И ТаблицыПользователейГруппы.Таблица ЕСТЬ NULL + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + |ИЗ + | ТаблицыПользователейГруппы КАК ТаблицыПользователейГруппы + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + | ПО ТаблицыПользователейГруппы.Таблица = ТаблицыГруппДоступа.Таблица + | И ТаблицыПользователейГруппы.Пользователь = ТаблицыГруппДоступа.Пользователь + | И (ТаблицыГруппДоступа.ГруппаДоступа = &ГруппаДоступа) + | И ТаблицыПользователейГруппы.Добавление = ТаблицыГруппДоступа.Добавление + | И ТаблицыПользователейГруппы.Изменение = ТаблицыГруппДоступа.Изменение + | И ТаблицыПользователейГруппы.Удаление = ТаблицыГруппДоступа.Удаление + | И ТаблицыПользователейГруппы.ТипТаблицы = ТаблицыГруппДоступа.ТипТаблицы + | И ТаблицыПользователейГруппы.ВидДоступаПравоДобавления = ТаблицыГруппДоступа.ВидДоступаПравоДобавления + | И ТаблицыПользователейГруппы.ВидДоступаПравоИзменения = ТаблицыГруппДоступа.ВидДоступаПравоИзменения + |ГДЕ + | ТаблицыГруппДоступа.Таблица ЕСТЬ NULL "); + Запрос.УстановитьПараметр("ГруппаДоступа", ГруппаДоступа); + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + Если НЕ Запрос.Выполнить().Пустой() Тогда + Запрос.Текст = + "ВЫБРАТЬ + | ТаблицыПользователейГруппы.Таблица, + | ТаблицыПользователейГруппы.Пользователь, + | &ГруппаДоступа КАК ГруппаДоступа, + | ТаблицыПользователейГруппы.Добавление, + | ТаблицыПользователейГруппы.Изменение, + | ТаблицыПользователейГруппы.Удаление, + | ТаблицыПользователейГруппы.ТипТаблицы, + | ТаблицыПользователейГруппы.ВидДоступаПравоДобавления, + | ТаблицыПользователейГруппы.ВидДоступаПравоИзменения + |ИЗ + | ТаблицыПользователейГруппы КАК ТаблицыПользователейГруппы"; + НаборЗаписей = РегистрыСведений.ТаблицыГруппДоступа.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ГруппаДоступа.Установить(ГруппаДоступа); + НаборЗаписей.Загрузить(Запрос.Выполнить().Выгрузить()); + НаборЗаписей.Записать(); + КонецЕсли; + +КонецПроцедуры + +// Процедура ЗаписатьЗначенияГруппДоступа перезаписывает в РегистрСведений.ЗначенияГруппДоступа +// ЗначенияДоступа разрешенные/запрещенные для группы доступа. +// Производится проверка на необходимость записи - если различий нет, запись не выполняется. +// +// Параметры: +// ГруппаДоступа - СправочникСсылка.ГруппыДоступа. +// +Процедура ЗаписатьЗначенияГруппДоступа(Знач ГруппаДоступа) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ГруппаДоступа", ГруппаДоступа); + Запрос.УстановитьПараметр("ПрофильГруппыДоступа", ОбщегоНазначения.ПолучитьЗначениеРеквизита(ГруппаДоступа, "Профиль")); + Запрос.Текст = + "ВЫБРАТЬ + | ВидыДоступаПрофиля.ВидДоступа КАК ВидДоступа, + | ИСТИНА КАК ТолькоВидДоступа, + | НЕОПРЕДЕЛЕНО КАК ЗначениеДоступа + |ПОМЕСТИТЬ ЗначенияГруппы + |ИЗ + | Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ВидыДоступаПрофиля + |ГДЕ + | ВидыДоступаПрофиля.Ссылка = &ПрофильГруппыДоступа + | И ВидыДоступаПрофиля.Предустановленный + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ВидыДоступа.ВидДоступа, + | ИСТИНА, + | НЕОПРЕДЕЛЕНО + |ИЗ + | Справочник.ГруппыДоступа.ВидыДоступа КАК ВидыДоступа + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ПредустановленныеВидыДоступа + | ПО ВидыДоступа.Ссылка.Профиль = ПредустановленныеВидыДоступа.Ссылка + | И ВидыДоступа.ВидДоступа = ПредустановленныеВидыДоступа.ВидДоступа + |ГДЕ + | (НЕ ВидыДоступа.ДоступРазрешен) + | И ВидыДоступа.Ссылка = &ГруппаДоступа + | И (НЕ ЕСТЬNULL(ПредустановленныеВидыДоступа.Предустановленный, ЛОЖЬ)) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ЗначенияДоступаПрофиля.ВидДоступа, + | ЛОЖЬ, + | ЗначенияДоступаПрофиля.ЗначениеДоступа + |ИЗ + | Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ВидыДоступаПрофиля + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ЗначенияДоступа КАК ЗначенияДоступаПрофиля + | ПО (ВидыДоступаПрофиля.Предустановленный) + | И (ВидыДоступаПрофиля.Ссылка = &ПрофильГруппыДоступа) + | И (ЗначенияДоступаПрофиля.Ссылка = &ПрофильГруппыДоступа) + | И ВидыДоступаПрофиля.ВидДоступа = ЗначенияДоступаПрофиля.ВидДоступа + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ЗначенияДоступа.ВидДоступа, + | ЛОЖЬ, + | ЗначенияДоступа.ЗначениеДоступа + |ИЗ + | Справочник.ГруппыДоступа.ВидыДоступа КАК ВидыДоступа + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ПредустановленныеВидыДоступа + | ПО ВидыДоступа.Ссылка.Профиль = ПредустановленныеВидыДоступа.Ссылка + | И ВидыДоступа.ВидДоступа = ПредустановленныеВидыДоступа.ВидДоступа + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.ЗначенияДоступа КАК ЗначенияДоступа + | ПО (ВидыДоступа.Ссылка = &ГруппаДоступа) + | И (ЗначенияДоступа.Ссылка = &ГруппаДоступа) + | И ВидыДоступа.ВидДоступа = ЗначенияДоступа.ВидДоступа + | И ((НЕ ВидыДоступа.ДоступРазрешен = ЗначенияДоступа.ДоступРазрешен)) + | И ((НЕ ЕСТЬNULL(ПредустановленныеВидыДоступа.Предустановленный, ЛОЖЬ))) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | РегистрСведений.ЗначенияГруппДоступа КАК ЗначенияГруппДоступа + | ЛЕВОЕ СОЕДИНЕНИЕ ЗначенияГруппы КАК ЗначенияГруппы + | ПО (ЗначенияГруппы.ВидДоступа = ЗначенияГруппДоступа.ВидДоступа) + | И (ЗначенияГруппы.ТолькоВидДоступа = ЗначенияГруппДоступа.ТолькоВидДоступа) + | И (ЗначенияГруппы.ЗначениеДоступа = ЗначенияГруппДоступа.ЗначениеДоступа) + |ГДЕ + | ЗначенияГруппДоступа.ГруппаДоступа = &ГруппаДоступа + | И ЗначенияГруппы.ВидДоступа ЕСТЬ NULL + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + |ИЗ + | ЗначенияГруппы КАК ЗначенияГруппы + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияГруппДоступа КАК ЗначенияГруппДоступа + | ПО (ЗначенияГруппДоступа.ГруппаДоступа = &ГруппаДоступа) + | И ЗначенияГруппы.ВидДоступа = ЗначенияГруппДоступа.ВидДоступа + | И ЗначенияГруппы.ТолькоВидДоступа = ЗначенияГруппДоступа.ТолькоВидДоступа + | И ЗначенияГруппы.ЗначениеДоступа = ЗначенияГруппДоступа.ЗначениеДоступа + |ГДЕ + | ЗначенияГруппДоступа.ВидДоступа ЕСТЬ NULL "; + + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + Если НЕ Запрос.Выполнить().Пустой() Тогда + + Запрос.Текст = + "ВЫБРАТЬ + | &ГруппаДоступа КАК ГруппаДоступа, + | ЗначенияГруппы.ВидДоступа, + | ЗначенияГруппы.ТолькоВидДоступа, + | ЗначенияГруппы.ЗначениеДоступа + |ИЗ + | ЗначенияГруппы КАК ЗначенияГруппы"; + НаборЗаписей = РегистрыСведений.ЗначенияГруппДоступа.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ГруппаДоступа.Установить(ГруппаДоступа); + НаборЗаписей.Загрузить(Запрос.Выполнить().Выгрузить()); + НаборЗаписей.Записать(); + + КонецЕсли; + +КонецПроцедуры + +// Процедура ПодготовкаЗаписиНаборовЗначенийДоступа упрощает наборы значений доступа +// и готовит их к записи в регистр сведений или табличную часть. +// Вызывается из обработчика ПередЗаписью регистра сведений НаборыЗначенийДоступа. +// +Процедура ПодготовкаНаборовЗначенийДоступаПередЗаписью(СсылкаНаОбъект, Таблица) Экспорт + + УправлениеДоступом.ДобавитьНаборыЗначенийДоступа(Таблица, УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(), Ложь, Истина, СсылкаНаОбъект); + + // Нормализация ресурсов Чтение, Добавление, Изменение, Удаление. + НомерНабора = -1; + Для каждого Строка Из Таблица Цикл + Если НомерНабора = -1 Тогда + ТипыОбъекта = Новый Массив; + ТипыОбъекта.Добавить(ТипЗнч(СсылкаНаОбъект)); + ОписаниеТипаОбъекта = Новый ОписаниеТипов(ТипыОбъекта); + Строка.ТипОбъекта = ОписаниеТипаОбъекта.ПривестиЗначение(Неопределено); + КонецЕсли; + Если НомерНабора = Строка.НомерНабора Тогда + Строка.Чтение = Ложь; + Строка.Добавление = Ложь; + Строка.Изменение = Ложь; + Строка.Удаление = Ложь; + Строка.ВидДоступаПравоЧтения = ПланыВидовХарактеристик.ВидыДоступа.ПустаяСсылка(); + Строка.ВидДоступаПравоДобавления = ПланыВидовХарактеристик.ВидыДоступа.ПустаяСсылка(); + Строка.ВидДоступаПравоИзменения = ПланыВидовХарактеристик.ВидыДоступа.ПустаяСсылка(); + Иначе + НомерНабора = Строка.НомерНабора; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Функция ПоставляемыйПрофильИзменен проверяет изменен ли поставляемый профиль +// по сравнению с описанием из функции ОписанияНачальногоЗаполненияПрофилейГруппДоступа() +// +// Параметры: +// Профиль - СправочникСсылка.ПрофилиГруппДоступа +// (возвращается реквизит ПоставляемыйПрофильИзменен), +// - СправочникОбъект.ПрофилиГруппДоступа +// (возвращается результат сравнения заполнения объекта +// с описанием в переопределяемом общем модуле). +// +// Возвращаемое значение: +// Булево. +// +Функция ПоставляемыйПрофильИзменен(Профиль) Экспорт + + Если ТипЗнч(Профиль) = Тип("СправочникСсылка.ПрофилиГруппДоступа") Тогда + Возврат ОбщегоНазначения.ПолучитьЗначениеРеквизита(Профиль, "ПоставляемыйПрофильИзменен"); + КонецЕсли; + + ОписанияПрофилей = ОписанияНачальногоЗаполненияПрофилейГруппДоступа(); + + ОписаниеНайдено = Ложь; + Для каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл + Если ОписаниеПрофиля.Идентификатор = Строка(Профиль.Ссылка.УникальныйИдентификатор()) Тогда + ОписаниеНайдено = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ОписаниеНайдено Тогда + + Если ВРег(Профиль.Наименование) <> ВРег(ОписаниеПрофиля.Наименование) Тогда + Возврат Истина; + КонецЕсли; + + Если Профиль.Роли.Количество() <> ОписаниеПрофиля.Роли.Количество() + ИЛИ Профиль.ВидыДоступа.Количество() <> ОписаниеПрофиля.ВидыДоступа.Количество() + ИЛИ Профиль.ЗначенияДоступа.Количество() <> ОписаниеПрофиля.ЗначенияДоступа.Количество() Тогда + Возврат Истина; + КонецЕсли; + + Для каждого СтрокаРоли Из Профиль.Роли Цикл + Если ОписаниеПрофиля.Роли.Найти(СтрокаРоли.Роль) = Неопределено Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Для каждого ОписаниеВидаДоступа Из ОписаниеПрофиля.ВидыДоступа Цикл + Отбор = Новый Структура; + Отбор.Вставить("ВидДоступа", ПланыВидовХарактеристик.ВидыДоступа[ОписаниеВидаДоступа.Значение]); + Отбор.Вставить("Предустановленный", ОписаниеВидаДоступа.Представление = "Предустановленный"); + Отбор.Вставить("ДоступРазрешен", ОписаниеВидаДоступа.Представление = "ВначалеВсеРазрешены"); + Если Профиль.ВидыДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Для каждого ОписаниеЗначенияДоступа Из ОписаниеПрофиля.ЗначенияДоступа Цикл + Отбор = Новый Структура; + Отбор.Вставить("ВидДоступа", ПланыВидовХарактеристик.ВидыДоступа[ОписаниеЗначенияДоступа.Значение]); + Запрос = Новый Запрос(СтрЗаменить("Выбрать Значение(%1) КАК Значение", "%1", ОписаниеЗначенияДоступа.Представление)); + Отбор.Вставить("ЗначениеДоступа", Запрос.Выполнить().Выгрузить()[0].Значение); + Если Профиль.ЗначенияДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ: начальное заполнение. + +// Процедура ЕстьНачальноеЗаполнениеПрофиляГруппДоступа определяет наличие начального +// заполнения для профиля групп доступа в переопределяемом модуле. +// +// Параметры: +// Профиль - СправочникСсылка.ПрофилиГруппДоступа. +// +// Возвращаемое значение: +// Булево. +// +Функция ЕстьНачальноеЗаполнениеПрофиляГруппДоступа(Знач Профиль) Экспорт + + ОписанияПрофилей = ОписанияНачальногоЗаполненияПрофилейГруппДоступа(); + + ОписаниеНайдено = Ложь; + Для каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл + Если ОписаниеПрофиля.Идентификатор = Строка(Профиль.УникальныйИдентификатор()) Тогда + ОписаниеНайдено = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Возврат ОписаниеНайдено; + +КонецФункции + +// Процедура НачальноеЗаполнениеПрофилейГруппДоступа создает элементы +// в справочнике ПрофилиГруппДоступа, свойственные прикладному решению, +// и позволяет восстановить ранее заполненный элемент по его уникальному идентификатору, +// если для него предусмотрено начальное заполнение. +// Поиск начального заполнения осуществляется по строке уникального идентификатора профиля. +// +// Параметры: +// Профиль - Неопределено, СправочникСсылка.ПрофилиГруппДоступа. +// Если для указанного профиля описание начального заполнения найдено, +// содержимое профиля полностью замещается. +// +Процедура НачальноеЗаполнениеПрофилейГруппДоступа(Знач Профиль = Неопределено, ОбновитьГруппыДоступа = Ложь, УдаляемыеВидыДоступаБезНастройки = Истина) Экспорт + + ОписанияПрофилей = ОписанияНачальногоЗаполненияПрофилейГруппДоступа(); + + Для каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл + Если Профиль = Неопределено ИЛИ ОписаниеПрофиля.Идентификатор = Строка(Профиль.УникальныйИдентификатор()) Тогда + ОбновитьПрофильГруппДоступа(ОписаниеПрофиля); + Если ОбновитьГруппыДоступа Тогда + ОбновитьГруппыДоступаПрофиля(Профиль, УдаляемыеВидыДоступаБезНастройки); + КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Функция ОбновитьПрофильГруппДоступа замещает имеющийся или +// создает новый профиль групп доступа по его начальному описанию. +// +// Параметры: +// ОписаниеПрофиля - Структура (см. функцию НовоеОписаниеПрофиляГруппДоступа()). +// +// Возвращаемое значение: +// Булево. Истина - профиль изменен. +// +Функция ОбновитьПрофильГруппДоступа(ОписаниеПрофиля, НеОбновлятьРолиПользователей = Ложь) Экспорт + + ПрофильИзменен = Ложь; + + УникальныйИдентификаторПрофиля = Новый УникальныйИдентификатор(ОписаниеПрофиля.Идентификатор); + ПрофильСсылка = Справочники.ПрофилиГруппДоступа.ПолучитьСсылку(УникальныйИдентификаторПрофиля); + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа + |ГДЕ + | ПрофилиГруппДоступа.Ссылка = &Ссылка"); + Запрос.УстановитьПараметр("Ссылка", ПрофильСсылка); + Если Запрос.Выполнить().Пустой() Тогда + // Элемента данных нет, нужно создать новый. + ПрофильОбъект = Справочники.ПрофилиГруппДоступа.СоздатьЭлемент(); + ПрофильОбъект.УстановитьСсылкуНового(Справочники.ПрофилиГруппДоступа.ПолучитьСсылку(УникальныйИдентификаторПрофиля)); + ПрофильИзменен = Истина; + Иначе + ПрофильОбъект = ПрофильСсылка.ПолучитьОбъект(); + ПрофильИзменен = УправлениеДоступом.ПоставляемыйПрофильИзменен(ПрофильОбъект); + КонецЕсли; + + + Если ПрофильИзменен Тогда + ЗаблокироватьДанныеДляРедактирования(ПрофильОбъект.Ссылка, ПрофильОбъект.ВерсияДанных); + + ПрофильОбъект.Наименование = ОписаниеПрофиля.Наименование; + + ПрофильОбъект.Роли.Очистить(); + Для каждого Роль Из ОписаниеПрофиля.Роли Цикл + Строка = ПрофильОбъект.Роли.Добавить(); + Строка.Роль = Роль; + КонецЦикла; + + ПрофильОбъект.ВидыДоступа.Очистить(); + Для каждого ОписаниеВидаДоступа Из ОписаниеПрофиля.ВидыДоступа Цикл + Строка = ПрофильОбъект.ВидыДоступа.Добавить(); + Строка.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа[ОписаниеВидаДоступа.Значение]; + Строка.Предустановленный = ОписаниеВидаДоступа.Представление = "Предустановленный"; + Строка.ДоступРазрешен = ОписаниеВидаДоступа.Представление = "ВначалеВсеРазрешены"; + КонецЦикла; + + ПрофильОбъект.ЗначенияДоступа.Очистить(); + Для каждого ОписаниеЗначенияДоступа Из ОписаниеПрофиля.ЗначенияДоступа Цикл + СтрокаЗначения = ПрофильОбъект.ЗначенияДоступа.Добавить(); + СтрокаЗначения.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа[ОписаниеЗначенияДоступа.Значение]; + Запрос = Новый Запрос(СтрЗаменить("Выбрать Значение(%1) КАК Значение", "%1", ОписаниеЗначенияДоступа.Представление)); + СтрокаЗначения.ЗначениеДоступа = Запрос.Выполнить().Выгрузить()[0].Значение; + КонецЦикла; + + Если НеОбновлятьРолиПользователей Тогда + ПрофильОбъект.ДополнительныеСвойства.Вставить("НеОбновлятьРолиПользователей"); + КонецЕсли; + ПрофильОбъект.Записать(); + РазблокироватьДанныеДляРедактирования(ПрофильОбъект.Ссылка); + КонецЕсли; + + Возврат ПрофильИзменен; + +КонецФункции + +// Процедура ОбновитьТаблицыРолейПрофилейГруппДоступа обновляет +// ТаблицыРолей каждого ПрофильГруппДоступа. +// +Процедура ОбновитьТаблицыРолейПрофилейГруппДоступа() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ПраваОМДРолей", УправлениеДоступомСерверПовтИсп.ОграничиваемыеПраваОбъектовМетаданныхРолей()); + Запрос.УстановитьПараметр("ТипыСсылок", УправлениеДоступомСерверПовтИсп.ТипыСсылок()); + + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + Запрос.Текст = + "ВЫБРАТЬ + | ПраваОМДРолей.Роль, + | ПраваОМДРолей.Таблица, + | ПраваОМДРолей.Добавление, + | ПраваОМДРолей.Изменение, + | ПраваОМДРолей.Удаление, + | ПраваОМДРолей.ТипТаблицы + |ПОМЕСТИТЬ ПраваОМДРолей + |ИЗ + | &ПраваОМДРолей КАК ПраваОМДРолей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ТипыСсылок.Таблица, + | ТипыСсылок.ТипТаблицы + |ПОМЕСТИТЬ НовыеТипыСсылок + |ИЗ + | &ТипыСсылок КАК ТипыСсылок + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор) КАК Профиль + |ИЗ + | Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК СтарыеТипыСсылок + | ЛЕВОЕ СОЕДИНЕНИЕ НовыеТипыСсылок КАК НовыеТипыСсылок + | ПО (НовыеТипыСсылок.Таблица = СтарыеТипыСсылок.Таблица) + | И (НовыеТипыСсылок.ТипТаблицы = СтарыеТипыСсылок.ТипТаблицы) + |ГДЕ + | СтарыеТипыСсылок.Ссылка = ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор) + | И НовыеТипыСсылок.Таблица ЕСТЬ NULL + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор) + |ИЗ + | НовыеТипыСсылок КАК НовыеТипыСсылок + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК СтарыеТипыСсылок + | ПО (СтарыеТипыСсылок.Ссылка = ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор)) + | И НовыеТипыСсылок.Таблица = СтарыеТипыСсылок.Таблица + | И НовыеТипыСсылок.ТипТаблицы = СтарыеТипыСсылок.ТипТаблицы + |ГДЕ + | СтарыеТипыСсылок.Таблица ЕСТЬ NULL + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ТипыСсылок.Ссылка + |ИЗ + | Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылок + |ГДЕ + | ТипыСсылок.Ссылка <> ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор) + |ИЗ + | Справочник.ПрофилиГруппДоступа.ТаблицыРолей КАК ТаблицыРолей + |ГДЕ + | ТаблицыРолей.Ссылка = ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | СтарыеТаблицы.Ссылка + |ИЗ + | Справочник.ПрофилиГруппДоступа.ТаблицыРолей КАК СтарыеТаблицы + | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ + | РолиПрофиля.Ссылка КАК Профиль, + | ПраваОМДРолей.Роль КАК Роль, + | ПраваОМДРолей.Таблица КАК Таблица, + | ПраваОМДРолей.Добавление КАК Добавление, + | ПраваОМДРолей.Изменение КАК Изменение, + | ПраваОМДРолей.Удаление КАК Удаление, + | ПраваОМДРолей.ТипТаблицы КАК ТипТаблицы + | ИЗ + | ПраваОМДРолей КАК ПраваОМДРолей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофиля + | ПО ПраваОМДРолей.Роль = РолиПрофиля.Роль) КАК НовыеТаблицы + | ПО (НовыеТаблицы.Профиль = СтарыеТаблицы.Ссылка) + | И (НовыеТаблицы.Роль = СтарыеТаблицы.Роль) + | И (НовыеТаблицы.Таблица = СтарыеТаблицы.Таблица) + | И (НовыеТаблицы.Добавление = СтарыеТаблицы.Добавление) + | И (НовыеТаблицы.Изменение = СтарыеТаблицы.Изменение) + | И (НовыеТаблицы.Удаление = СтарыеТаблицы.Удаление) + | И (НовыеТаблицы.ТипТаблицы = СтарыеТаблицы.ТипТаблицы) + |ГДЕ + | НовыеТаблицы.Роль ЕСТЬ NULL + | И СтарыеТаблицы.Ссылка <> ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | НовыеТаблицы.Профиль + |ИЗ + | (ВЫБРАТЬ + | РолиПрофиля.Ссылка КАК Профиль, + | ПраваОМДРолей.Роль КАК Роль, + | ПраваОМДРолей.Таблица КАК Таблица, + | ПраваОМДРолей.Добавление КАК Добавление, + | ПраваОМДРолей.Изменение КАК Изменение, + | ПраваОМДРолей.Удаление КАК Удаление, + | ПраваОМДРолей.ТипТаблицы КАК ТипТаблицы + | ИЗ + | ПраваОМДРолей КАК ПраваОМДРолей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофиля + | ПО ПраваОМДРолей.Роль = РолиПрофиля.Роль) КАК НовыеТаблицы + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ТаблицыРолей КАК СтарыеТаблицы + | ПО НовыеТаблицы.Профиль = СтарыеТаблицы.Ссылка + | И НовыеТаблицы.Роль = СтарыеТаблицы.Роль + | И НовыеТаблицы.Таблица = СтарыеТаблицы.Таблица + | И НовыеТаблицы.Добавление = СтарыеТаблицы.Добавление + | И НовыеТаблицы.Изменение = СтарыеТаблицы.Изменение + | И НовыеТаблицы.Удаление = СтарыеТаблицы.Удаление + | И НовыеТаблицы.ТипТаблицы = СтарыеТаблицы.ТипТаблицы + |ГДЕ + | СтарыеТаблицы.Роль ЕСТЬ NULL + | И НовыеТаблицы.Профиль <> ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор)"; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + Объект = Выборка.Профиль.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка, Объект.ВерсияДанных); + Объект.ДополнительныеСвойства.Вставить("НеОбновлятьРеквизитПоставляемыйПрофильИзменен"); + Объект.Записать(); + РазблокироватьДанныеДляРедактирования(Объект.Ссылка); + КонецЦикла; + +КонецПроцедуры + +// Процедура ОбновитьЗависимостиПравДоступа обновляет +// содержимое регистра сведений ЗависимостиПравДоступа, +// если прикладной разработчик изменил зависимости. +// +Процедура ОбновитьЗависимостиПравДоступа() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + НаборЗаписей = РегистрыСведений.ЗависимостиПравДоступа.СоздатьНаборЗаписей(); + УправлениеДоступомПереопределяемый.ЗаполнитьЗависимостиПравДоступа(НаборЗаписей); + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | НовыеЗаписи.ПодчиненнаяТаблица, + | НовыеЗаписи.ТипВедущейТаблицы, + | НовыеЗаписи.ОтключитьПроверкуПравВедущейТаблицы, + | НовыеЗаписи.ПриПроверкеПраваЧтение, + | НовыеЗаписи.ПриПроверкеПраваДобавление, + | НовыеЗаписи.ПриПроверкеПраваИзменение, + | НовыеЗаписи.ПриПроверкеПраваУдаление + |ПОМЕСТИТЬ НовыеЗаписи + |ИЗ + | &НовыеЗаписи КАК НовыеЗаписи + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | РегистрСведений.ЗависимостиПравДоступа КАК СтарыеЗаписи + | ЛЕВОЕ СОЕДИНЕНИЕ НовыеЗаписи КАК НовыеЗаписи + | ПО СтарыеЗаписи.ПодчиненнаяТаблица = НовыеЗаписи.ПодчиненнаяТаблица + | И СтарыеЗаписи.ТипВедущейТаблицы = НовыеЗаписи.ТипВедущейТаблицы + | И СтарыеЗаписи.ОтключитьПроверкуПравВедущейТаблицы = НовыеЗаписи.ОтключитьПроверкуПравВедущейТаблицы + | И СтарыеЗаписи.ПриПроверкеПраваЧтение = НовыеЗаписи.ПриПроверкеПраваЧтение + | И СтарыеЗаписи.ПриПроверкеПраваДобавление = НовыеЗаписи.ПриПроверкеПраваДобавление + | И СтарыеЗаписи.ПриПроверкеПраваИзменение = НовыеЗаписи.ПриПроверкеПраваИзменение + | И СтарыеЗаписи.ПриПроверкеПраваУдаление = НовыеЗаписи.ПриПроверкеПраваУдаление + |ГДЕ + | НовыеЗаписи.ПодчиненнаяТаблица ЕСТЬ NULL + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + |ИЗ + | НовыеЗаписи КАК НовыеЗаписи + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗависимостиПравДоступа КАК СтарыеЗаписи + | ПО НовыеЗаписи.ПодчиненнаяТаблица = СтарыеЗаписи.ПодчиненнаяТаблица + | И НовыеЗаписи.ТипВедущейТаблицы = СтарыеЗаписи.ТипВедущейТаблицы + | И НовыеЗаписи.ОтключитьПроверкуПравВедущейТаблицы = СтарыеЗаписи.ОтключитьПроверкуПравВедущейТаблицы + | И НовыеЗаписи.ПриПроверкеПраваЧтение = СтарыеЗаписи.ПриПроверкеПраваЧтение + | И НовыеЗаписи.ПриПроверкеПраваДобавление = СтарыеЗаписи.ПриПроверкеПраваДобавление + | И НовыеЗаписи.ПриПроверкеПраваИзменение = СтарыеЗаписи.ПриПроверкеПраваИзменение + | И НовыеЗаписи.ПриПроверкеПраваУдаление = СтарыеЗаписи.ПриПроверкеПраваУдаление + |ГДЕ + | СтарыеЗаписи.ПодчиненнаяТаблица ЕСТЬ NULL "); + Запрос.УстановитьПараметр("НовыеЗаписи", НаборЗаписей); + + Если НЕ Запрос.Выполнить().Пустой() Тогда + НаборЗаписей.Записать(); + КонецЕсли; + +КонецПроцедуры + +// Процедура ЗаполнитьТаблицыРолейПрофиляГруппДоступа +// заполняет табличную часть ТаблицыРолей профиля групп доступа. +// +// Параметры: +// Профиль - СправочникОбъект.ПрофилиГруппДоступа. +// +Процедура ЗаполнитьТаблицыРолейПрофиляГруппДоступа(Знач Профиль) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ПраваОМДРолей = УправлениеДоступомСерверПовтИсп.ОграничиваемыеПраваОбъектовМетаданныхРолей(); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ПраваОМДРолей", ПраваОМДРолей); + Запрос.УстановитьПараметр("РолиПрофиля", Профиль.Роли.ВыгрузитьКолонку("Роль")); + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПраваОМДРолей.Роль, + | ПраваОМДРолей.Таблица, + | ПраваОМДРолей.Добавление, + | ПраваОМДРолей.Изменение, + | ПраваОМДРолей.Удаление, + | ПраваОМДРолей.ТипТаблицы + |ПОМЕСТИТЬ ТаблицыРолей + |ИЗ + | &ПраваОМДРолей КАК ПраваОМДРолей + |ГДЕ + | ПраваОМДРолей.Роль В(&РолиПрофиля) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ТаблицыРолей.Роль, + | ТаблицыРолей.Таблица, + | ТаблицыРолей.Добавление, + | ТаблицыРолей.Изменение, + | ТаблицыРолей.Удаление, + | ТаблицыРолей.ТипТаблицы + |ИЗ + | ТаблицыРолей КАК ТаблицыРолей"; + + Профиль.ТаблицыРолей.Загрузить(Запрос.Выполнить().Выгрузить()); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ: обработчики подписок на события и регламентного задания. + +// Процедура ЗаписатьГруппыИВидыДоступа перезаписывает группы и виды доступа ЗначенияДоступа, +// в РегистрСведений.ГруппыЗначенийДоступа, используя объект или ссылку на объект. +// Процедура вызывается из УправлениеДоступомСобытия.ЗаписатьГруппыДоступа(), +// но может быть вызвана из любого места, например, при включении ограничения доступа на уровне записи. +// +// Параметры: +// Объект - объект или ссылка на объект (обычно Справочник<Объект|Ссылка>). +// В случае вызова с клиента можно передать только ссылку, а нужен объект. +// Если получена ссылка, то по ней будет получен объект. +// Ссылка объекта должна быть типа ОписаниеТипов измерения Значение +// в РегистрСведений.ГруппыЗначенийДоступа. +// +Процедура ЗаписатьГруппыИВидыДоступа(Знач Объект, Отказ = Ложь) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + // Если передача параметра Объект производилась с клиента на сервер, + // то передавалась ссылка, и объект требуется получить. + Объект = ?(Объект = Объект.Ссылка, Объект.ПолучитьОбъект(), Объект); + + Если ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.Пользователи") ИЛИ + ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.ГруппыПользователей") ИЛИ + ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.ВнешниеПользователи") ИЛИ + ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда + + // Проверка, что тип объектов авторизации совпадает с использованным в группах доступа + Если ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда + + Запрос = Новый Запрос( + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ПРЕДСТАВЛЕНИЕ(ГруппыДоступаПользователи.Ссылка) КАК СсылкаПредставление, + | ГруппыДоступаПользователи.Ссылка.ТипПользователей + |ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВнешниеПользователи КАК ВнешниеПользователи + | ПО (ГруппыДоступаПользователи.Пользователь = &ВнешнийПользователь) + | И (ВнешниеПользователи.Ссылка = &ВнешнийПользователь) + | И (ГруппыДоступаПользователи.Ссылка.ТипПользователей <> НЕОПРЕДЕЛЕНО) + | И (ТИПЗНАЧЕНИЯ(ВнешниеПользователи.ОбъектАвторизации) <> ТИПЗНАЧЕНИЯ(ГруппыДоступаПользователи.Ссылка.ТипПользователей))"); + Запрос.УстановитьПараметр("ВнешнийПользователь", Объект.Ссылка); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + ПредставлениеДругогоТипаОбъектаАвторизации = Метаданные.НайтиПоТипу(ТипЗнч(Выборка.ТипОбъектовАвторизации)).Синоним; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Внешний пользователь ""%1"" используется в группе доступа ""%2"" с другим типом объектов информационной базы ""%3""!'"), Строка(Объект.Ссылка), Выборка.СсылкаПредставление, ПредставлениеДругогоТипаОбъектаАвторизации), , , , Отказ); + Возврат; + КонецЕсли; + + ИначеЕсли ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда + + Запрос = Новый Запрос( + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ПРЕДСТАВЛЕНИЕ(ГруппыДоступаПользователи.Ссылка) КАК СсылкаПредставление, + | ГруппыДоступаПользователи.Ссылка.ТипПользователей + |ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыВнешнихПользователей КАК ГруппыВнешнихПользователей + | ПО (ГруппыДоступаПользователи.Пользователь = &ГруппаВнешнихПользователей) + | И (ГруппыВнешнихПользователей.Ссылка = &ГруппаВнешнихПользователей) + | И (ГруппыВнешнихПользователей.ТипОбъектовАвторизации <> НЕОПРЕДЕЛЕНО) + | И (ГруппыДоступаПользователи.Ссылка.ТипПользователей <> НЕОПРЕДЕЛЕНО) + | И (ГруппыВнешнихПользователей.ТипОбъектовАвторизации <> ГруппыДоступаПользователи.Ссылка.ТипПользователей)"); + Запрос.УстановитьПараметр("ГруппаВнешнихПользователей", Объект.Ссылка); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + ПредставлениеДругогоТипаОбъектаАвторизации = Метаданные.НайтиПоТипу(ТипЗнч(Выборка.ТипПользователей)).Синоним; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Группа внешних пользователей ""%1"" используется в группе доступа ""%2"" с другим типом объектов информационной базы ""%3""!'"), Строка(Объект.Ссылка), Выборка.СсылкаПредставление, ПредставлениеДругогоТипаОбъектаАвторизации), , , , Отказ); + Возврат; + КонецЕсли; + КонецЕсли; + + ИзмененныеПользователи = Новый Массив; + Если ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.Пользователи") ИЛИ + ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда + + ИзмененныеПользователи.Добавить(Объект.Ссылка); + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + // Подготовка таблицы подчиненности пользователей. + Если НЕ УправлениеДоступомПереопределяемый.ТаблицаПодчиненностиПользователей(Запрос.МенеджерВременныхТаблиц) Тогда + Запрос.Текст = + "ВЫБРАТЬ + | Пользователи.Ссылка КАК Пользователь, + | Пользователи.Ссылка КАК ПодчиненныйПользователь + |ПОМЕСТИТЬ ТаблицаПодчиненностиПользователей + |ИЗ + | Справочник.Пользователи КАК Пользователи + |ГДЕ + | ЛОЖЬ"; + Запрос.Выполнить(); + КонецЕсли; + + // 1. Подготовка состава групп пользователей для расширения доступа пользователей, + // имеющих подчиненных пользователей, например, для руководителей сотрудников. + Запрос.Текст = + "ВЫБРАТЬ + | СоставГруппПользователей.ГруппаПользователей КАК ГруппаПользователей, + | ТаблицаПодчиненностиПользователей.Пользователь + |ПОМЕСТИТЬ РасширенныйСоставГруппПользователей + |ИЗ + | ТаблицаПодчиненностиПользователей КАК ТаблицаПодчиненностиПользователей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + | ПО ТаблицаПодчиненностиПользователей.ПодчиненныйПользователь = СоставГруппПользователей.Пользователь + | И (ТИПЗНАЧЕНИЯ(СоставГруппПользователей.Пользователь) = ТИП(Справочник.Пользователи)) + | И (ТИПЗНАЧЕНИЯ(ТаблицаПодчиненностиПользователей.Пользователь) = ТИП(Справочник.Пользователи)) + | И (ТаблицаПодчиненностиПользователей.Пользователь <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | СоставГруппПользователей.ГруппаПользователей, + | СоставГруппПользователей.Пользователь + |ИЗ + | РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + |ГДЕ + | ТИПЗНАЧЕНИЯ(СоставГруппПользователей.Пользователь) = ТИП(Справочник.Пользователи) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СоставГруппПользователей.ГруппаПользователей КАК ГруппаВнешнихПользователей, + | ТаблицаПодчиненностиПользователей.Пользователь КАК ВнешнийПользователь + |ПОМЕСТИТЬ РасширенныйСоставГруппВнешнихПользователей + |ИЗ + | ТаблицаПодчиненностиПользователей КАК ТаблицаПодчиненностиПользователей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + | ПО ТаблицаПодчиненностиПользователей.ПодчиненныйПользователь = СоставГруппПользователей.Пользователь + | И (ТИПЗНАЧЕНИЯ(СоставГруппПользователей.Пользователь) = ТИП(Справочник.ВнешниеПользователи)) + | И (ТИПЗНАЧЕНИЯ(ТаблицаПодчиненностиПользователей.Пользователь) = ТИП(Справочник.ВнешниеПользователи)) + | И (ТаблицаПодчиненностиПользователей.Пользователь <> ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка)) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | СоставГруппПользователей.ГруппаПользователей, + | СоставГруппПользователей.Пользователь + |ИЗ + | РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + |ГДЕ + | ТИПЗНАЧЕНИЯ(СоставГруппПользователей.Пользователь) = ТИП(Справочник.ВнешниеПользователи) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |УНИЧТОЖИТЬ ТаблицаПодчиненностиПользователей"; + Запрос.Выполнить(); + + // Подготовка таблицы дополнительных групп пользователей - групп доступа исполнителей (например задач). + Если НЕ УправлениеДоступомПереопределяемый.ТаблицаГруппИсполнителей(Запрос.МенеджерВременныхТаблиц) Тогда + Запрос.Текст = + "ВЫБРАТЬ + | Пользователи.Ссылка КАК ГруппаИсполнителей, + | Пользователи.Ссылка КАК Пользователь + |ПОМЕСТИТЬ ВсеПользователиГруппИсполнителей + |ИЗ + | Справочник.Пользователи КАК Пользователи + |ГДЕ + | ЛОЖЬ + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВнешниеПользователи.Ссылка КАК ГруппаИсполнителей, + | ВнешниеПользователи.Ссылка КАК ВнешнийПользователь + |ПОМЕСТИТЬ ВсеВнешниеПользователиГруппИсполнителей + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + |ГДЕ + | ЛОЖЬ"; + Запрос.Выполнить(); + Иначе + // Получение таблицы всех пользователей групп исполнителей: + // пользователей групп исполнителей плюс пользователей групп пользователей групп исполнителей. + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ТаблицаГруппИсполнителей.ГруппаИсполнителей, + | РасширенныйСоставГруппПользователей.Пользователь + |ПОМЕСТИТЬ ВсеПользователиГруппИсполнителей + |ИЗ + | ТаблицаГруппИсполнителей КАК ТаблицаГруппИсполнителей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РасширенныйСоставГруппПользователей КАК РасширенныйСоставГруппПользователей + | ПО ТаблицаГруппИсполнителей.Пользователь = РасширенныйСоставГруппПользователей.ГруппаПользователей + | И (ТИПЗНАЧЕНИЯ(ТаблицаГруппИсполнителей.ГруппаИсполнителей) <> ТИП(Справочник.ГруппыПользователей)) + | И (ТИПЗНАЧЕНИЯ(ТаблицаГруппИсполнителей.ГруппаИсполнителей) <> ТИП(Справочник.Пользователи)) + | И ((НЕ ТаблицаГруппИсполнителей.ГруппаИсполнителей В (&ПустыеСсылкиВозможныхЗначений))) + | И (ТИПЗНАЧЕНИЯ(ТаблицаГруппИсполнителей.Пользователь) = ТИП(Справочник.Пользователи)) + | И (ТаблицаГруппИсполнителей.Пользователь <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ТаблицаГруппИсполнителей.ГруппаИсполнителей КАК ГруппаИсполнителей, + | РасширенныйСоставГруппВнешнихПользователей.ВнешнийПользователь + |ПОМЕСТИТЬ ВсеВнешниеПользователиГруппИсполнителей + |ИЗ + | ТаблицаГруппИсполнителей КАК ТаблицаГруппИсполнителей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РасширенныйСоставГруппВнешнихПользователей КАК РасширенныйСоставГруппВнешнихПользователей + | ПО ТаблицаГруппИсполнителей.Пользователь = РасширенныйСоставГруппВнешнихПользователей.ГруппаВнешнихПользователей + | И (ТИПЗНАЧЕНИЯ(ТаблицаГруппИсполнителей.ГруппаИсполнителей) <> ТИП(Справочник.ГруппыВнешнихПользователей)) + | И (ТИПЗНАЧЕНИЯ(ТаблицаГруппИсполнителей.ГруппаИсполнителей) <> ТИП(Справочник.ВнешниеПользователи)) + | И ((НЕ ТаблицаГруппИсполнителей.ГруппаИсполнителей В (&ПустыеСсылкиВозможныхЗначений))) + | И (ТИПЗНАЧЕНИЯ(ТаблицаГруппИсполнителей.Пользователь) = ТИП(Справочник.ВнешниеПользователи)) + | И (ТаблицаГруппИсполнителей.Пользователь <> ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка)) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |УНИЧТОЖИТЬ ТаблицаГруппИсполнителей"; + // Подготовка массива пустых ссылок, для фильтрации в запросе, с целью предотвратить ошибку записи набора с пустыми значениями. + ПустыеСсылкиВозможныхЗначений = Новый Массив; + Для каждого ТипЗначения Из Метаданные.РегистрыСведений.ГруппыЗначенийДоступа.Измерения.ЗначениеДоступа.Тип.Типы() Цикл + ПустыеСсылкиВозможныхЗначений.Добавить(ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(Метаданные.НайтиПоТипу(ТипЗначения).ПолноеИмя()).ПустаяСсылка()); + КонецЦикла; + Запрос.УстановитьПараметр("ПустыеСсылкиВозможныхЗначений", ПустыеСсылкиВозможныхЗначений); + Запрос.Выполнить(); + КонецЕсли; + + // 2. Подготовка состава групп пользователей для использования групп пользователей, как значений доступа. + // 3. Подготовка состава групп пользователей для использования дополнительных групп пользователей + // (групп исполнителей), например, при адресации задач. + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЗаписиПользователей.ГруппаДоступа, + | ЗаписиПользователей.ЗначениеДоступа + |ПОМЕСТИТЬ НовыеЗаписиПользователей + |ИЗ + | (ВЫБРАТЬ + | РасширенныйСоставГруппПользователей.ГруппаПользователей КАК ЗначениеДоступа, + | РасширенныйСоставГруппПользователей.Пользователь КАК ГруппаДоступа + | ИЗ + | РасширенныйСоставГруппПользователей КАК РасширенныйСоставГруппПользователей + | ГДЕ + | ТИПЗНАЧЕНИЯ(РасширенныйСоставГруппПользователей.ГруппаПользователей) = ТИП(Справочник.ГруппыПользователей) + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ГруппыПользователейПользователей.ГруппаПользователей, + | ПользователиГруппПользователей.ГруппаПользователей + | ИЗ + | РасширенныйСоставГруппПользователей КАК ГруппыПользователейПользователей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РасширенныйСоставГруппПользователей КАК ПользователиГруппПользователей + | ПО ГруппыПользователейПользователей.Пользователь = ПользователиГруппПользователей.Пользователь + | И (ТИПЗНАЧЕНИЯ(ГруппыПользователейПользователей.ГруппаПользователей) = ТИП(Справочник.ГруппыПользователей)) + | И (ТИПЗНАЧЕНИЯ(ПользователиГруппПользователей.ГруппаПользователей) = ТИП(Справочник.ГруппыПользователей)) + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | РасширенныйСоставГруппПользователей.Пользователь, + | РасширенныйСоставГруппПользователей.ГруппаПользователей + | ИЗ + | РасширенныйСоставГруппПользователей КАК РасширенныйСоставГруппПользователей + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ВсеПользователиГруппИсполнителей.Пользователь, + | ВсеПользователиГруппИсполнителей.ГруппаИсполнителей + | ИЗ + | ВсеПользователиГруппИсполнителей КАК ВсеПользователиГруппИсполнителей + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ВсеПользователиГруппИсполнителей.ГруппаИсполнителей, + | РасширенныйСоставГруппПользователей.ГруппаПользователей + | ИЗ + | ВсеПользователиГруппИсполнителей КАК ВсеПользователиГруппИсполнителей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РасширенныйСоставГруппПользователей КАК РасширенныйСоставГруппПользователей + | ПО ВсеПользователиГруппИсполнителей.Пользователь = РасширенныйСоставГруппПользователей.Пользователь) КАК ЗаписиПользователей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |УНИЧТОЖИТЬ РасширенныйСоставГруппПользователей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЗаписиВнешнихПользователей.ГруппаДоступа, + | ЗаписиВнешнихПользователей.ЗначениеДоступа + |ПОМЕСТИТЬ НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации + |ИЗ + | (ВЫБРАТЬ + | РасширенныйСоставГруппВнешнихПользователей.ГруппаВнешнихПользователей КАК ЗначениеДоступа, + | РасширенныйСоставГруппВнешнихПользователей.ВнешнийПользователь КАК ГруппаДоступа + | ИЗ + | РасширенныйСоставГруппВнешнихПользователей КАК РасширенныйСоставГруппВнешнихПользователей + | ГДЕ + | ТИПЗНАЧЕНИЯ(РасширенныйСоставГруппВнешнихПользователей.ГруппаВнешнихПользователей) = ТИП(Справочник.ГруппыВнешнихПользователей) + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ГруппыВнешнихПользователейПользователей.ГруппаВнешнихПользователей, + | ВнешниеПользователиГруппВнешнихПользователей.ГруппаВнешнихПользователей + | ИЗ + | РасширенныйСоставГруппВнешнихПользователей КАК ГруппыВнешнихПользователейПользователей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РасширенныйСоставГруппВнешнихПользователей КАК ВнешниеПользователиГруппВнешнихПользователей + | ПО ГруппыВнешнихПользователейПользователей.ВнешнийПользователь = ВнешниеПользователиГруппВнешнихПользователей.ВнешнийПользователь + | И (ТИПЗНАЧЕНИЯ(ГруппыВнешнихПользователейПользователей.ГруппаВнешнихПользователей) = ТИП(Справочник.ГруппыВнешнихПользователей)) + | И (ТИПЗНАЧЕНИЯ(ВнешниеПользователиГруппВнешнихПользователей.ГруппаВнешнихПользователей) = ТИП(Справочник.ГруппыВнешнихПользователей)) + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | РасширенныйСоставГруппВнешнихПользователей.ВнешнийПользователь, + | РасширенныйСоставГруппВнешнихПользователей.ГруппаВнешнихПользователей + | ИЗ + | РасширенныйСоставГруппВнешнихПользователей КАК РасширенныйСоставГруппВнешнихПользователей + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ВсеВнешниеПользователиГруппИсполнителей.ВнешнийПользователь, + | ВсеВнешниеПользователиГруппИсполнителей.ГруппаИсполнителей + | ИЗ + | ВсеВнешниеПользователиГруппИсполнителей КАК ВсеВнешниеПользователиГруппИсполнителей + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ВсеВнешниеПользователиГруппИсполнителей.ГруппаИсполнителей, + | РасширенныйСоставГруппВнешнихПользователей.ГруппаВнешнихПользователей + | ИЗ + | ВсеВнешниеПользователиГруппИсполнителей КАК ВсеВнешниеПользователиГруппИсполнителей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РасширенныйСоставГруппВнешнихПользователей КАК РасширенныйСоставГруппВнешнихПользователей + | ПО ВсеВнешниеПользователиГруппИсполнителей.ВнешнийПользователь = РасширенныйСоставГруппВнешнихПользователей.ВнешнийПользователь) КАК ЗаписиВнешнихПользователей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |УНИЧТОЖИТЬ РасширенныйСоставГруппВнешнихПользователей + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации.ГруппаДоступа, + | НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации.ЗначениеДоступа + |ПОМЕСТИТЬ НовыеЗаписиВнешнихПользователей + |ИЗ + | НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации КАК НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ВнешниеПользователи.ГруппаДоступа.ОбъектАвторизации, + | ВнешниеПользователи.ЗначениеДоступа + |ИЗ + | (ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВЫРАЗИТЬ(НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации.ГруппаДоступа КАК Справочник.ВнешниеПользователи) КАК ГруппаДоступа, + | ВЫРАЗИТЬ(НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации.ЗначениеДоступа КАК Справочник.ВнешниеПользователи) КАК ЗначениеДоступа + | ИЗ + | НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации КАК НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации + | ГДЕ + | (ВЫРАЗИТЬ(НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации.ГруппаДоступа КАК Справочник.ВнешниеПользователи)) <> ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка) + | И (ВЫРАЗИТЬ(НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации.ГруппаДоступа КАК Справочник.ВнешниеПользователи)) <> НЕОПРЕДЕЛЕНО + | И (ВЫРАЗИТЬ(НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации.ЗначениеДоступа КАК Справочник.ВнешниеПользователи)) <> ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка) + | И (ВЫРАЗИТЬ(НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации.ЗначениеДоступа КАК Справочник.ВнешниеПользователи)) <> НЕОПРЕДЕЛЕНО) КАК ВнешниеПользователи + |ГДЕ + | ВнешниеПользователи.ГруппаДоступа.ОбъектАвторизации <> НЕОПРЕДЕЛЕНО + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | ВнешниеПользователи.ГруппаДоступа, + | ВнешниеПользователи.ЗначениеДоступа.ОбъектАвторизации + |ИЗ + | (ВЫБРАТЬ + | НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации.ГруппаДоступа КАК ГруппаДоступа, + | ВЫРАЗИТЬ(НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации.ЗначениеДоступа КАК Справочник.ВнешниеПользователи) КАК ЗначениеДоступа + | ИЗ + | НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации КАК НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации + | ГДЕ + | (ВЫРАЗИТЬ(НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации.ЗначениеДоступа КАК Справочник.ВнешниеПользователи)) <> ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка) + | И (ВЫРАЗИТЬ(НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации.ЗначениеДоступа КАК Справочник.ВнешниеПользователи)) <> НЕОПРЕДЕЛЕНО) КАК ВнешниеПользователи + |ГДЕ + | ВнешниеПользователи.ЗначениеДоступа.ОбъектАвторизации <> НЕОПРЕДЕЛЕНО + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |УНИЧТОЖИТЬ НовыеЗаписиВнешнихПользователейБезОбъектовАвторизации"; + Запрос.Выполнить(); + + // Получение записей для удаления. + Запрос.Текст = + "ВЫБРАТЬ + | ПользователиИГруппыПользователей.ВидДоступа, + | ПользователиИГруппыПользователей.ЗначениеДоступа, + | ПользователиИГруппыПользователей.ТолькоВидДоступа, + | ПользователиИГруппыПользователей.ГруппаДоступа + |ИЗ + | РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ЛЕВОЕ СОЕДИНЕНИЕ НовыеЗаписиПользователей КАК НовыеЗаписиПользователей + | ПО ПользователиИГруппыПользователей.ЗначениеДоступа = НовыеЗаписиПользователей.ЗначениеДоступа + | И ПользователиИГруппыПользователей.ГруппаДоступа = НовыеЗаписиПользователей.ГруппаДоступа + |ГДЕ + | ПользователиИГруппыПользователей.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + | И ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ + | И НовыеЗаписиПользователей.ЗначениеДоступа ЕСТЬ NULL + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ПользователиИГруппыПользователей.ВидДоступа, + | ПользователиИГруппыПользователей.ЗначениеДоступа, + | ПользователиИГруппыПользователей.ТолькоВидДоступа, + | ПользователиИГруппыПользователей.ГруппаДоступа + |ИЗ + | РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ЛЕВОЕ СОЕДИНЕНИЕ НовыеЗаписиВнешнихПользователей КАК НовыеЗаписиВнешнихПользователей + | ПО ПользователиИГруппыПользователей.ЗначениеДоступа = НовыеЗаписиВнешнихПользователей.ЗначениеДоступа + | И ПользователиИГруппыПользователей.ГруппаДоступа = НовыеЗаписиВнешнихПользователей.ГруппаДоступа + |ГДЕ + | ПользователиИГруппыПользователей.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + | И ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ + | И НовыеЗаписиВнешнихПользователей.ЗначениеДоступа ЕСТЬ NULL "; + Выборка = Запрос.Выполнить().Выбрать(); + + МенеджерЗаписи = РегистрыСведений.ГруппыЗначенийДоступа.СоздатьМенеджерЗаписи(); + Пока Выборка.Следующий() Цикл + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка); + Если ( ТипЗнч(МенеджерЗаписи.ЗначениеДоступа) = Тип("СправочникСсылка.Пользователи") ИЛИ + ТипЗнч(МенеджерЗаписи.ЗначениеДоступа) = Тип("СправочникСсылка.ВнешниеПользователи") ) И + ИзмененныеПользователи.Найти(МенеджерЗаписи.ЗначениеДоступа) = Неопределено Тогда + + ИзмененныеПользователи.Добавить(МенеджерЗаписи.ЗначениеДоступа); + КонецЕсли; + + МенеджерЗаписи.Удалить(); + КонецЦикла; + + // Получение записей для добавления. + Запрос.Текст = + "ВЫБРАТЬ + | ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) КАК ВидДоступа, + | НовыеЗаписиПользователей.ЗначениеДоступа, + | ЛОЖЬ КАК ТолькоВидДоступа, + | НовыеЗаписиПользователей.ГруппаДоступа + |ИЗ + | НовыеЗаписиПользователей КАК НовыеЗаписиПользователей + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ПО (ПользователиИГруппыПользователей.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи)) + | И (ПользователиИГруппыПользователей.ЗначениеДоступа = НовыеЗаписиПользователей.ЗначениеДоступа) + | И (ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ) + | И (ПользователиИГруппыПользователей.ГруппаДоступа = НовыеЗаписиПользователей.ГруппаДоступа) + |ГДЕ + | ПользователиИГруппыПользователей.ВидДоступа ЕСТЬ NULL + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи), + | НовыеЗаписиВнешнихПользователей.ЗначениеДоступа, + | ЛОЖЬ, + | НовыеЗаписиВнешнихПользователей.ГруппаДоступа + |ИЗ + | НовыеЗаписиВнешнихПользователей КАК НовыеЗаписиВнешнихПользователей + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + | ПО (ПользователиИГруппыПользователей.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи)) + | И (ПользователиИГруппыПользователей.ЗначениеДоступа = НовыеЗаписиВнешнихПользователей.ЗначениеДоступа) + | И (ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ) + | И (ПользователиИГруппыПользователей.ГруппаДоступа = НовыеЗаписиВнешнихПользователей.ГруппаДоступа) + |ГДЕ + | ПользователиИГруппыПользователей.ВидДоступа ЕСТЬ NULL "; + + НаборЗаписей = РегистрыСведений.ГруппыЗначенийДоступа.СоздатьНаборЗаписей(); + НаборЗаписей.Загрузить(Запрос.Выполнить().Выгрузить()); + + Для каждого Запись Из НаборЗаписей Цикл + Если ( ТипЗнч(Запись.ЗначениеДоступа) = Тип("СправочникСсылка.Пользователи") ИЛИ + ТипЗнч(Запись.ЗначениеДоступа) = Тип("СправочникСсылка.ВнешниеПользователи") ) И + ИзмененныеПользователи.Найти(Запись.ЗначениеДоступа) = Неопределено Тогда + + ИзмененныеПользователи.Добавить(Запись.ЗначениеДоступа); + КонецЕсли; + КонецЦикла; + Если НаборЗаписей.Количество() > 0 Тогда + НаборЗаписей.Записать(Ложь); + КонецЕсли; + + // Обновление ролей пользователей, для которых роли могли быть изменены. + Если Объект.Ссылка = Справочники.ГруппыПользователей.ВсеПользователи ИЛИ + Объект.Ссылка = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | СоставГруппПользователей.Пользователь + |ИЗ + | РегистрСведений.СоставГруппПользователей КАК СоставГруппПользователей + |ГДЕ + | СоставГруппПользователей.ГруппаПользователей = &ПредопределеннаяГруппа"); + Запрос.УстановитьПараметр("ПредопределеннаяГруппа", Объект.Ссылка); + + ИзмененныеПользователи = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Пользователь"); + КонецЕсли; + + ЕстьОшибки = Ложь; + ОбновитьРолиПользователей(ИзмененныеПользователи, ЕстьОшибки); + Если ЕстьОшибки И НЕ Объект.ДополнительныеСвойства.Свойство("ЕстьОшибки") Тогда + Объект.ДополнительныеСвойства.Вставить("ЕстьОшибки"); + КонецЕсли; + Иначе + + ВидыДоступа = ВидыДоступаТаблицы(Объект.Метаданные().ПолноеИмя()); + ВидДоступаЧерезПраваПоЗначениямДоступа = (ВидыДоступа.Количество() = 1) И СвойстваВидаДоступа(ВидыДоступа[0]).ВидДоступаЧерезПраваПоЗначениямДоступа; + + Если ВидДоступаЧерезПраваПоЗначениямДоступа Тогда + + ВидДоступа = ВидыДоступа[0]; + + // Подготовка групп доступа (родителей) значения доступа. + НаборЗаписей = РодителиЗначенияДоступа(Объект.Ссылка, ВидДоступа); + + // Проверка изменения состава родителей. + Запрос = Новый Запрос( + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа + |ГДЕ + | ГруппыЗначенийДоступа.ЗначениеДоступа = &ЗначениеДоступа + | И ГруппыЗначенийДоступа.ВидДоступа = &ВидДоступа + | И (НЕ (ГруппыЗначенийДоступа.ТолькоВидДоступа, ГруппыЗначенийДоступа.ГруппаДоступа) В (&НовыеРодители)) + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ИСТИНА + |ГДЕ + | (НЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + | ИЗ + | РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа + | ГДЕ + | ГруппыЗначенийДоступа.ЗначениеДоступа = &ЗначениеДоступа + | И ГруппыЗначенийДоступа.ВидДоступа = &ВидДоступа))"); + Запрос.УстановитьПараметр("ВидДоступа", ВидДоступа); + Запрос.УстановитьПараметр("ЗначениеДоступа", Объект.Ссылка); + Запрос.УстановитьПараметр("НовыеРодители", НаборЗаписей.Выгрузить(, "ТолькоВидДоступа, ГруппаДоступа")); + СоставРодителейИзменился = НЕ Запрос.Выполнить().Пустой(); + + НаборЗаписей.Записать(); + + Если СоставРодителейИзменился Тогда + + // Обновление состава родителей элементов в иерархии текущего значения. + Запрос = Новый Запрос(СтрЗаменить( + "ВЫБРАТЬ + | ТаблицаСИерархией.Ссылка КАК ПодчиненнаяСсылка + |ИЗ + | ПодставляемаяТаблица КАК ТаблицаСИерархией + |ГДЕ + | ТаблицаСИерархией.Ссылка В ИЕРАРХИИ(&ЗначениеДоступа) + | И ТаблицаСИерархией.Ссылка <> &ЗначениеДоступа", "ПодставляемаяТаблица", Объект.Метаданные().ПолноеИмя())); + Запрос.УстановитьПараметр("ЗначениеДоступа", Объект.Ссылка); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + РодителиЗначенияДоступа(Выборка.ПодчиненнаяСсылка, ВидДоступа).Записать(); + КонецЦикла; + КонецЕсли; + + Иначе + + НаборЗаписей = РегистрыСведений.ГруппыЗначенийДоступа.СоздатьНаборЗаписей(); + + Если ОграничиватьДоступНаУровнеЗаписей() Тогда + // Заполнение группы значений для каждого вида доступа. + Для каждого ВидДоступа Из ВидыДоступа Цикл + Свойства = СвойстваВидаДоступа(ВидДоступа); + ПостфиксИмени = ?(Свойства.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, "", ПланыВидовХарактеристик.ВидыДоступа.ПолучитьИмяПредопределенного(ВидДоступа)); + + Если НЕ Свойства.ВидДоступаЕдинственныйДляТипаЗначенияДоступа И НЕ Объект["ВидДоступа" + ПостфиксИмени] Тогда + // Когда значение не разрешено по виду доступа. + Запись = НаборЗаписей.Добавить(); + Запись.ВидДоступа = ВидДоступа; + Запись.ЗначениеДоступа = Объект.Ссылка; + Запись.ТолькоВидДоступа = Истина; + Запись.ГруппаДоступа = Неопределено; + ИначеЕсли Свойства.ВидДоступаСОднойГруппойЗначенияДоступа Тогда + Запись = НаборЗаписей.Добавить(); + Запись.ВидДоступа = ВидДоступа; + Запись.ЗначениеДоступа = Объект.Ссылка; + Запись.ТолькоВидДоступа = Ложь; + Запись.ГруппаДоступа = Объект["ГруппаДоступа" + ПостфиксИмени]; + Иначе + Для каждого СтрокаТЧ Из Объект["ГруппыДоступа" + ПостфиксИмени] Цикл + Запись = НаборЗаписей.Добавить(); + Запись.ВидДоступа = ВидДоступа; + Запись.ЗначениеДоступа = Объект.Ссылка; + Запись.ТолькоВидДоступа = Ложь; + Запись.ГруппаДоступа = СтрокаТЧ["ГруппаДоступа" + ПостфиксИмени]; + КонецЦикла; + КонецЕсли; + КонецЦикла; + + Если НаборЗаписей.Количество() = 0 Тогда + // Если это условие отключить, тогда зациклится регламентное задание + // "Заполнение данных для ограничения доступа". + ВызватьИсключение(НСтр("ru = 'Попытка записать пустой набор групп доступа или видов доступа!'")); + КонецЕсли; + КонецЕсли; + + НаборЗаписей.Отбор.ЗначениеДоступа.Установить(Объект.Ссылка); + НаборЗаписей.Записать(); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры // ЗаписатьГруппыИВидыДоступа() + +// Процедура ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей перезаполняет наборы значений доступа +// табличной части объекта, когда для ограничения доступа к нему самому используются наборы, +// используя процедуру УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступа(). +// +// Параметры: +// Объект - СправочникОбъект, ДокументОбъект, ..., или СправочникСсылка, ДокументСсылка, ... +// В случае вызова с клиента можно передать только ссылку, а нужен объект. +// Если получена ссылка, то по ней будет получен объект. +// +Процедура ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей(Знач Объект) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + // Если передача параметра Объект производилась с клиента на сервер, + // то передавалась ссылка, и объект требуется получить. + Объект = ?(Объект = Объект.Ссылка, Объект.ПолучитьОбъект(), Объект); + + Если Метаданные.НайтиПоТипу(ТипЗнч(Объект)).ТабличныеЧасти.Найти("НаборыЗначенийДоступа") = Неопределено Тогда + ВызватьИсключение(СтрЗаменить(НСтр("ru = 'Неверные параметры! + |Тип объекта ""%1"" + |не найдена табличная часть ""Наборы значений доступа"".'"), "%1", ТипЗнч(Объект))); + КонецЕсли; + + Объект.НаборыЗначенийДоступа.Очистить(); + + Если ОграничиватьДоступНаУровнеЗаписей() Тогда + + НаборЗаписей = РегистрыСведений.НаборыЗначенийДоступа.СоздатьНаборЗаписей(); + ЗаполнитьНаборыЗначенийДоступа(Объект, НаборЗаписей); + + ПодготовкаНаборовЗначенийДоступаПередЗаписью(Объект.Ссылка, НаборЗаписей); + + Объект.ДополнительныеСвойства.Вставить("НаборЗаписейНаборовЗначенийДоступа", НаборЗаписей); + + Объект.НаборыЗначенийДоступа.Загрузить(НаборЗаписей.Выгрузить()); + КонецЕсли; + +КонецПроцедуры // ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей() + +// Процедура ЗаписатьНаборыЗначенийДоступа перезаписывает наборы значений доступа проверяемого объекта +// в РегистрСведений.НаборыЗначенийДоступа, используя процедуру УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступа(). +// +// Процедура вызывается из УправлениеДоступомСобытия.ЗаписатьНаборыЗначенийДоступа(), +// но может быть вызвана из любого места, например, при включении ограничения доступа на уровне записей. +// +// Параметры: +// Объект - СправочникОбъект, ДокументОбъект, ..., или СправочникСсылка, ДокументСсылка, ... +// В случае вызова с клиента можно передать только ссылку, а нужен объект. +// Если получена ссылка, то по ней будет получен объект. +// +Процедура ЗаписатьНаборыЗначенийДоступа(Знач Объект) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + // Если передача параметра Объект производилась с клиента на сервер, + // то передавалась ссылка, и объект требуется получить. + Объект = ?(Объект = Объект.Ссылка, Объект.ПолучитьОбъект(), Объект); + + Если НЕ Метаданные.ПодпискиНаСобытия.ЗаписатьНаборыЗначенийДоступа.Источник.СодержитТип(ТипЗнч(Объект)) Тогда + ВызватьИсключение(СтрЗаменить(НСтр("ru = 'Неверные параметры! + |Тип объекта ""%1"" + |не найден в подписке на события + |""Записать наборы значений доступа"".'"), "%1", ТипЗнч(Объект))); + КонецЕсли; + + Если Метаданные.РегистрыСведений.НаборыЗначенийДоступа.Измерения.Объект.Тип.Типы().Найти(ТипЗнч(Объект.Ссылка)) = Неопределено Тогда + ВызватьИсключение(СтрЗаменить(НСтр("ru = 'Ошибка при записи наборов значений доступа: + |в регистре сведений НаборыЗначенийДоступа в измерении Объект + |не задан тип %1'"), "%1", Метаданные.НайтиПоТипу(ТипЗнч(Объект.Ссылка)).ПолноеИмя())); + КонецЕсли; + + НаборЗаписей = РегистрыСведений.НаборыЗначенийДоступа.СоздатьНаборЗаписей(); + + Если ОграничиватьДоступНаУровнеЗаписей() Тогда + + Если Метаданные.НайтиПоТипу(ТипЗнч(Объект)).ТабличныеЧасти.Найти("НаборыЗначенийДоступа") = Неопределено Тогда + ЗаполнитьНаборыЗначенийДоступа(Объект, НаборЗаписей); + Иначе + Если Объект.ДополнительныеСвойства.Свойство("НаборЗаписейНаборовЗначенийДоступа") Тогда + // Записывается объект с уже заполненной табличной частью НаборыЗначенийДоступа + НаборЗаписей = Объект.ДополнительныеСвойства.НаборЗаписейНаборовЗначенийДоступа; + Для каждого Запись Из НаборЗаписей Цикл + Запись.Объект = Объект.Ссылка; + КонецЦикла; + НаборЗаписей.ДополнительныеСвойства.Вставить("НаборыЗначенийДоступаПодготовлены"); + Иначе + // Записывается объект с ещё незаполненной табличной частью НаборыЗначенийДоступа, + // например, при записи зависимых наборов значений доступа из процедуры + // УправлениеДоступомПереопределяемый.ПриИзмененииНаборовЗначенийДоступа() + // Требуется выполнить запись наборов с заполнением табличной части + Попытка + ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка, Объект.ВерсияДанных); + Объект.ОбменДанными.Загрузка = Истина; + Объект.ДополнительныеСвойства.Вставить("ЗаписатьНаборыЗначенийДоступа"); + Объект.ДополнительныеСвойства.Вставить("ЗаписатьЗависимыеНаборыЗначенийДоступа"); + Объект.Записать(); + РазблокироватьДанныеДляРедактирования(Объект.Ссылка); + Исключение + // Если объект уже заблокирован, значит выполняется попытка обновления + // связанного набора значений в транзакции записи объекта. + // В таких случаях, например, когда новый бизнес-процесс "родитель" + // зависит по наборам значений от своих бизнес-процессов "дочек", + // необходимо: + // 1) выполнить старт программно + // - установится блокировка бизнес-процесса "родителя" перед стартом, + // - создадутся бизнес-процессы "дочки". + // 2) в форме бизнес-процесса "родителя" выполнить запись после старта + // - обновятся наборы значений доступа бизнес-процесса "родителя" + // с учетом наборов значений бизнес-процессов "дочек". + КонецПопытки; + Возврат; + КонецЕсли; + КонецЕсли; + + НаборЗаписей.Отбор.Объект.Установить(Объект.Ссылка); + НаборЗаписей.Записать(); + + УправлениеДоступомПереопределяемый.ПриИзмененииНаборовЗначенийДоступа(Объект); + Иначе + Запрос = Новый Запрос( + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначенийДоступа + |ГДЕ + | НаборыЗначенийДоступа.Объект = &СсылкаНаОбъект"); + + Запрос.УстановитьПараметр("СсылкаНаОбъект", Объект.Ссылка); + + Если НЕ Запрос.Выполнить().Пустой() Тогда + // Очистка устаревшего набора. + // Запись нового набора будет выполнена регламентным заданием, + // после включения ограничения на уровне записей. + НаборЗаписей.Отбор.Объект.Установить(Объект.Ссылка); + НаборЗаписей.Записать(); + + // Очистка устаревших зависимых наборов. + УправлениеДоступомПереопределяемый.ПриИзмененииНаборовЗначенийДоступа(Объект); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры // ЗаписатьНаборыЗначенийДоступа() + +// Процедура ЗаписатьЗависимыеНаборыЗначенийДоступа, так же как и процедура +// УправлениеДоступом.ЗаписатьНаборыЗначенийДоступа вызывает процедуру прикладного разработчика +// УправлениеДоступомПереопределяемый.ПриИзмененииНаборовЗначенийДоступа(), +// которая используется для перезаписи зависимых наборов значений доступа. +// +// Процедура вызывается из УправлениеДоступомСобытия.ЗаписатьЗависимыеНаборыЗначенийДоступа(), +// состав типов подписки дополняет (без пересечения) состав типов подписки ЗаписатьНаборыЗначенийДоступа, +// теми типами, для которых выполнять запись наборов в регистр сведений НаборыЗначенийДоступа +// не требуется, но сами наборы входят в состав других наборов, например, наборы некоторых файлов +// из справочника "Файлы" могут входить в состав некоторых бизнес-процессов "Задание", созданных +// на основании файлов, при этом наборы файлов записывать в регистр не требуется. +// +// Параметры: +// Объект - СправочникОбъект, ДокументОбъект, ..., или СправочникСсылка, ДокументСсылка, ... +// В случае вызова с клиента можно передать только ссылку, а нужен объект. +// Если получена ссылка, то по ней будет получен объект. +// +Процедура ЗаписатьЗависимыеНаборыЗначенийДоступа(Знач Объект) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + // Если передача параметра Объект производилась с клиента на сервер, + // то передавалась ссылка, и объект требуется получить. + Объект = ?(Объект = Объект.Ссылка, Объект.ПолучитьОбъект(), Объект); + + Если НЕ Метаданные.ПодпискиНаСобытия.ЗаписатьЗависимыеНаборыЗначенийДоступа.Источник.СодержитТип(ТипЗнч(Объект)) Тогда + ВызватьИсключение(СтрЗаменить(НСтр("ru = 'Неверные параметры! + |Тип объекта ""%1"" + |не найден в подписке на события + |""Записать зависимые наборы значений доступа"".'"), "%1", ТипЗнч(Объект))); + КонецЕсли; + + УправлениеДоступомПереопределяемый.ПриИзмененииНаборовЗначенийДоступа(Объект); + +КонецПроцедуры // ЗаписатьНаборыЗначенийДоступа() + +// Процедура ЗаполнениеДанныхДляОграниченияДоступаОбработчикЗадания напрямую +// из регламентного задания ЗаполнениеДанныхДляОграниченияДоступа +// Используется для переадресации вызова процедуре с параметром: +// ЗаполнениеДанныхДляОграниченияДоступа() +// +Процедура ЗаполнениеДанныхДляОграниченияДоступаОбработчикЗадания() Экспорт + + ЗаполнениеДанныхДляОграниченияДоступа(); + +КонецПроцедуры + +// Процедура ЗаполнениеДанныхДляОграниченияДоступа вызывается из регламентного задания +// ЗаполнениеДанныхДляОграниченияДоступа через обработчик +// ЗаполнениеДанныхДляОграниченияДоступаОбработчикЗадания +// Процедура выполняет последовательное заполнение данных, необходимых для работы +// подсистемы УправленияДоступом в режиме ограничения доступа на уровне записей, +// в связи с чем, запускается после включения этого режима и работает до окончания заполнения +// Сведения о состоянии работы, процедура записываются в журнал регистрации +// Заполнение реализуется порциями за счет удаления вторичных данных +// в отключенном режиме ограничения доступа на уровне записей, поэтому все данные актуальны +// При отсутствии ограничения на уровне записей, выполняется только обновление вторичных данных +// Возможно вызывать программно, например, при обновлении информационной базы +// Также для целей обновления есть форма Справочник.ГруппыДоступа.ОбновлениеДанныхОграниченияДоступа, +// с помощью которой можно сделать интерактивное обновление данных ограничения доступа +// при обновлении информационной базы +// +Процедура ЗаполнениеДанныхДляОграниченияДоступа(КоличествоДанных = 0) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Если ОграничиватьДоступНаУровнеЗаписей() Тогда + + ЗаписатьГруппыИВидыДоступа(Справочники.ГруппыПользователей.ВсеПользователи); + + // Заполнение РегистрСведений.ГруппыЗначенийДоступа. + Для каждого Тип Из Метаданные.ПодпискиНаСобытия.ЗаписатьГруппыИВидыДоступа.Источник.Типы() Цикл + + Если Тип = Тип("ПланВидовХарактеристикОбъект.ВидыДоступа") Тогда + Продолжить; + КонецЕсли; + + Таблица = Метаданные.НайтиПоТипу(Тип).ПолноеИмя(); + + ВидыДоступа = ВидыДоступаТаблицы(Таблица); + Если ВидыДоступа.Количество() = 1 И + ( ВидыДоступа[0] = ПланыВидовХарактеристик.ВидыДоступа.Пользователи ИЛИ + ВидыДоступа[0] = ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи ) Тогда + Продолжить; + КонецЕсли; + + Если КоличествоДанных < 1000 И Тип <> Тип("Строка") Тогда + + Запрос = Новый Запрос(СтрЗаменить( + "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000 + | Таблица.Ссылка + |ИЗ + | ПодставляемаяТаблица КАК Таблица + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК РегистрСведенийГруппыЗначенийДоступа + | ПО Таблица.Ссылка = РегистрСведенийГруппыЗначенийДоступа.ЗначениеДоступа + |ГДЕ + | РегистрСведенийГруппыЗначенийДоступа.ЗначениеДоступа ЕСТЬ NULL ", "ПодставляемаяТаблица", Таблица)); + Выгрузка = Запрос.Выполнить().Выгрузить(); + КоличествоДанных = КоличествоДанных + Выгрузка.Количество(); + + Для каждого СтрокаТЧ Из Выгрузка Цикл + ЗаписатьГруппыИВидыДоступа(СтрокаТЧ.Ссылка); + КонецЦикла; + + КонецЕсли; + КонецЦикла; + + Если КоличествоДанных < 1000 Тогда + + // Заполнение РегистрСведений.НаборыЗначенийДоступа. + Для каждого Тип Из Метаданные.ПодпискиНаСобытия.ЗаписатьНаборыЗначенийДоступа.Источник.Типы() Цикл + + Если Тип = Тип("ПланВидовХарактеристикОбъект.ВидыДоступа") Тогда + Продолжить; + КонецЕсли; + + ЗаполнитьТабличнуюЧасть = Метаданные.НайтиПоТипу(Тип).ТабличныеЧасти.Найти("НаборыЗначенийДоступа") <> Неопределено; + + Если КоличествоДанных < 1000 И Тип <> Тип("Строка") Тогда + + Запрос = Новый Запрос(СтрЗаменить( + "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000 + | Таблица.Ссылка + |ИЗ + | ПодставляемаяТаблица КАК Таблица + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НаборыЗначенийДоступа КАК РегистрСведенийНаборыЗначенийДоступа + | ПО Таблица.Ссылка = РегистрСведенийНаборыЗначенийДоступа.Объект + |ГДЕ + | РегистрСведенийНаборыЗначенийДоступа.Объект ЕСТЬ NULL ", "ПодставляемаяТаблица", Метаданные.НайтиПоТипу(Тип).ПолноеИмя())); + Выгрузка = Запрос.Выполнить().Выгрузить(); + КоличествоДанных = КоличествоДанных + Выгрузка.Количество(); + + Для каждого СтрокаТЧ Из Выгрузка Цикл + Если ЗаполнитьТабличнуюЧасть Тогда + // Запись наборов табличной части и наборов регистра (без зависимых наборов). + Объект = СтрокаТЧ.Ссылка.ПолучитьОбъект(); + Объект.ОбменДанными.Загрузка = Истина; + Объект.ДополнительныеСвойства.Вставить("ЗаписатьНаборыЗначенийДоступа"); + Объект.Записать(); + Иначе + // Запись только наборов регистра (без зависимых наборов). + ЗаписатьНаборыЗначенийДоступа(СтрокаТЧ.Ссылка); + КонецЕсли; + КонецЦикла; + + КонецЕсли; + КонецЦикла; + КонецЕсли; + + КонецЕсли; + + Если КоличествоДанных < 1000 Тогда + // Обновление вторичных данных в наборах значений доступа: свойств видов доступа , и других. + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | СвойстваВидовДоступа.ВидДоступа, + | СвойстваВидовДоступа.ВидДоступаБезГруппЗначенияДоступа, + | СвойстваВидовДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, + | СвойстваВидовДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа + |ПОМЕСТИТЬ ТаблицаСвойств + |ИЗ + | &СвойстваВидовДоступа КАК СвойстваВидовДоступа + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000 + | НаборыЗначенийДоступа.Объект, + | НаборыЗначенийДоступа.НомерНабора, + | НаборыЗначенийДоступа.ВидДоступа, + | НаборыЗначенийДоступа.ЗначениеДоступа, + | НаборыЗначенийДоступа.Чтение, + | НаборыЗначенийДоступа.Добавление, + | НаборыЗначенийДоступа.Изменение, + | НаборыЗначенийДоступа.Удаление, + | ЕСТЬNULL(СвойстваВидовДоступа.ВидДоступаБезГруппЗначенияДоступа, ЛОЖЬ) КАК ВидДоступаБезГруппЗначенияДоступа, + | ЕСТЬNULL(СвойстваВидовДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, ЛОЖЬ) КАК ВидДоступаЕдинственныйДляТипаЗначенияДоступа, + | ЕСТЬNULL(СвойстваВидовДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа, ЛОЖЬ) КАК ВидДоступаЧерезПраваПоЗначениямДоступа, + | ВЫБОР + | КОГДА НаборыЗначенийДоступа.Чтение + | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения) + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + | КОНЕЦ КАК ВидДоступаПравоЧтения, + | ВЫБОР + | КОГДА НаборыЗначенийДоступа.Добавление + | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления) + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + | КОНЕЦ КАК ВидДоступаПравоДобавления, + | ВЫБОР + | КОГДА НаборыЗначенийДоступа.Изменение + | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + | КОНЕЦ КАК ВидДоступаПравоИзменения, + | НаборыЗначенийДоступа.ТипОбъекта, + | ЕСТЬNULL(ТипыСсылок.ТипТаблицы, НЕОПРЕДЕЛЕНО) КАК ТипЗначенияДоступа + |ИЗ + | РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначенийДоступа + | ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаСвойств КАК СвойстваВидовДоступа + | ПО НаборыЗначенийДоступа.ВидДоступа = СвойстваВидовДоступа.ВидДоступа + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылок + | ПО (ТИПЗНАЧЕНИЯ(НаборыЗначенийДоступа.ЗначениеДоступа) = ТИПЗНАЧЕНИЯ(ТипыСсылок.ТипТаблицы)) + | И (НаборыЗначенийДоступа.ВидДоступа В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения))) + |ГДЕ + | (НЕ(НаборыЗначенийДоступа.ВидДоступаБезГруппЗначенияДоступа = ЕСТЬNULL(СвойстваВидовДоступа.ВидДоступаБезГруппЗначенияДоступа, ЛОЖЬ) + | И НаборыЗначенийДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа = ЕСТЬNULL(СвойстваВидовДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, ЛОЖЬ) + | И НаборыЗначенийДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа = ЕСТЬNULL(СвойстваВидовДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа, ЛОЖЬ) + | И НаборыЗначенийДоступа.ТипЗначенияДоступа = ЕСТЬNULL(ТипыСсылок.ТипТаблицы, НЕОПРЕДЕЛЕНО) + | И НаборыЗначенийДоступа.ВидДоступаПравоЧтения = ВЫБОР + | КОГДА НаборыЗначенийДоступа.Чтение + | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения) + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + | КОНЕЦ + | И НаборыЗначенийДоступа.ВидДоступаПравоДобавления = ВЫБОР + | КОГДА НаборыЗначенийДоступа.Добавление + | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления) + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + | КОНЕЦ + | И НаборыЗначенийДоступа.ВидДоступаПравоИзменения = ВЫБОР + | КОГДА НаборыЗначенийДоступа.Изменение + | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + | КОНЕЦ))"); + Запрос.УстановитьПараметр("СвойстваВидовДоступа", СвойстваВидаДоступа()); + Выгрузка = Запрос.Выполнить().Выгрузить(); + КоличествоДанных = КоличествоДанных + Выгрузка.Количество(); + + Для каждого СтрокаТЧ Из Выгрузка Цикл + МенеджерЗаписи = РегистрыСведений.НаборыЗначенийДоступа.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, + СтрокаТЧ, + "Объект, + |НомерНабора, + |ВидДоступа, + |ЗначениеДоступа, + |Чтение, + |Добавление, + |Изменение, + |Удаление, + |ВидДоступаБезГруппЗначенияДоступа, + |ВидДоступаЕдинственныйДляТипаЗначенияДоступа, + |ВидДоступаЧерезПраваПоЗначениямДоступа, + |ВидДоступаПравоЧтения, + |ВидДоступаПравоДобавления, + |ВидДоступаПравоИзменения, + |ТипОбъекта, + |ТипЗначенияДоступа"); + МенеджерЗаписи.Записать(); + КонецЦикла; + КонецЕсли; + + Если КоличествоДанных < 1000 Тогда + // Обновление вторичных данных в наборах значений доступа: ТипОбъекта + + Запрос = Новый Запрос( + "ВЫБРАТЬ ПЕРВЫЕ 1000 + | ТипыОбъектов.Объект + |ИЗ + | (ВЫБРАТЬ + | НаборыЗначенийДоступа.Объект КАК Объект, + | ВЫБОР + | КОГДА НаборыЗначенийДоступа.ТипОбъекта <> НЕОПРЕДЕЛЕНО + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ КАК ТипЗадан, + | ВЫБОР + | КОГДА НаборыЗначенийДоступа.ТипОбъекта <> НЕОПРЕДЕЛЕНО + | И НаборыЗначенийДоступа.ТипОбъекта <> ТипыСсылок.ТипТаблицы + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ КАК НеверныйТип + | ИЗ + | РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначенийДоступа + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылок + | ПО (ТИПЗНАЧЕНИЯ(НаборыЗначенийДоступа.Объект) = ТИПЗНАЧЕНИЯ(ТипыСсылок.ТипТаблицы))) КАК ТипыОбъектов + | + |СГРУППИРОВАТЬ ПО + | ТипыОбъектов.Объект + | + |ИМЕЮЩИЕ + | (СУММА(ТипыОбъектов.ТипЗадан) <> 1 + | ИЛИ СУММА(ТипыОбъектов.НеверныйТип) <> 0)"); + Выгрузка = Запрос.Выполнить().Выгрузить(); + КоличествоДанных = КоличествоДанных + Выгрузка.Количество(); + + НаборЗаписей = РегистрыСведений.НаборыЗначенийДоступа.СоздатьНаборЗаписей(); + НаборЗаписей.ДополнительныеСвойства.Вставить("ВосстановлениеНаборовЗначенийДоступа"); + Для каждого СтрокаТЧ Из Выгрузка Цикл + + НаборЗаписей.Отбор.Объект.Установить(СтрокаТЧ.Объект); + НаборЗаписей.Прочитать(); + ПерваяЗапись = Истина; + + Для каждого Запись Из НаборЗаписей Цикл + + Если ПерваяЗапись Тогда + ТипыОбъекта = Новый Массив; + ТипыОбъекта.Добавить(ТипЗнч(Запись.Объект)); + ОписаниеТипаОбъекта = Новый ОписаниеТипов(ТипыОбъекта); + + Запись.ТипОбъекта = ОписаниеТипаОбъекта.ПривестиЗначение(Неопределено); + ПерваяЗапись = Ложь; + Иначе + Запись.ТипОбъекта = Неопределено; + КонецЕсли; + КонецЦикла; + НаборЗаписей.Записать(); + КонецЦикла; + КонецЕсли; + + Если КоличествоДанных < 1000 Тогда + ЗаписьЖурналаРегистрации(НСтр("ru = 'Управление доступом.Заполнение данных для ограничения доступа'"), + УровеньЖурналаРегистрации.Информация, , , НСтр("ru = 'Завершено заполнение данных для ограничения доступа'"), + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + + Задание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа); + Задание.Использование = Ложь; + Задание.Записать(); + Иначе + ЗаписьЖурналаРегистрации(НСтр("ru = 'Управление доступом.Заполнение данных для ограничения доступа'"), + УровеньЖурналаРегистрации.Информация, , , НСтр("ru = 'Выполнена запись порции данных для ограничения доступа'"), + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + + Задание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа); + Задание.Использование = Истина; + Задание.Записать(); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ИНТЕРФЕЙСНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Функция СформироватьДанныеВыбораЗначенияДоступа возвращает список +// значений доступа не помеченных на удаление. +// Используется в обработчиках событий ОкончаниеВводаТекста и АвтоПодбор. +// +// Параметры: +// Текст - Строка, символы введенные пользователем. +// ВключаяГруппы - Булево, если Истина, включать группы пользователей и внешних пользователей. +// ВидДоступа - ПланыВидовХарактеристикСсылка.ВидыДоступа, значения доступа которого выбираются. +// +Функция СформироватьДанныеВыбораЗначенияДоступа(Знач Текст, Знач ВидДоступа, ВключаяГруппы = Истина) Экспорт + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Текст", Текст + "%"); + Запрос.УстановитьПараметр("ВключаяГруппы", ВключаяГруппы); + Запрос.Текст = + "ВЫБРАТЬ + | ПредставленияПеречислений.Ссылка, + | ПредставленияПеречислений.Наименование КАК Наименование + |ПОМЕСТИТЬ ПредставленияПеречислений + |ИЗ + | &ПредставленияПеречислений КАК ПредставленияПеречислений + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ + | НЕОПРЕДЕЛЕНО КАК Ссылка, + | """" КАК Наименование + |ГДЕ + | ЛОЖЬ"; + + ЗапросПредставленийПеречислений = Новый Запрос; + ЗапросПредставленийПеречислений.Текст = + "ВЫБРАТЬ + | """" КАК Ссылка, + | """" КАК Наименование + |ГДЕ + | ЛОЖЬ"; + + Для каждого Тип Из ВидДоступа.ТипЗначения.Типы() Цикл + + МетаданныеТипа = Метаданные.НайтиПоТипу(Тип); + + ПолноеИмяТаблицы = МетаданныеТипа.ПолноеИмя(); + + Если ( Метаданные.Справочники.Содержит(МетаданныеТипа) + ИЛИ Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеТипа) ) + И МетаданныеТипа.Иерархический + И МетаданныеТипа.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов + И НЕ ВключаяГруппы Тогда + + УсловиеДляГруппы = "НЕ Таблица.ЭтоГруппа"; + Иначе + УсловиеДляГруппы = "Истина"; + КонецЕсли; + + Если Метаданные.Перечисления.Содержит(МетаданныеТипа) Тогда + // + ЗапросПредставленийПеречислений.Текст = ЗапросПредставленийПеречислений.Текст + Символы.ПС + Символы.ПС + " ОБЪЕДИНИТЬ ВСЕ " + Символы.ПС + Символы.ПС; + ЗапросПредставленийПеречислений.Текст = ЗапросПредставленийПеречислений.Текст + СтрЗаменить( + "ВЫБРАТЬ + | Таблица.Ссылка, + | ПРЕДСТАВЛЕНИЕ(Таблица.Ссылка) КАК Наименование + |ИЗ + | &ПолноеИмяТаблицы КАК Таблица", "&ПолноеИмяТаблицы", ПолноеИмяТаблицы); + Иначе + Запрос.Текст = Запрос.Текст + Символы.ПС + Символы.ПС + " ОБЪЕДИНИТЬ ВСЕ " + Символы.ПС + Символы.ПС; + Запрос.Текст = Запрос.Текст + СтрЗаменить(СтрЗаменить( + "ВЫБРАТЬ + | Таблица.Ссылка, + | Таблица.Наименование + |ИЗ + | &ПолноеИмяТаблицы КАК Таблица + |ГДЕ + | (НЕ Таблица.ПометкаУдаления) + | И Таблица.Наименование ПОДОБНО &Текст + | И &УсловиеДляГруппы", "&ПолноеИмяТаблицы", ПолноеИмяТаблицы), "&УсловиеДляГруппы", УсловиеДляГруппы); + КонецЕсли; + КонецЦикла; + + Запрос.УстановитьПараметр("ПредставленияПеречислений", ЗапросПредставленийПеречислений.Выполнить().Выгрузить()); + Запрос.Текст = Запрос.Текст + Символы.ПС + Символы.ПС + " ОБЪЕДИНИТЬ ВСЕ " + Символы.ПС + Символы.ПС; + Запрос.Текст = Запрос.Текст + + "ВЫБРАТЬ + | ПредставленияПеречислений.Ссылка, + | ПредставленияПеречислений.Наименование + |ИЗ + | ПредставленияПеречислений КАК ПредставленияПеречислений + |ГДЕ + | ПредставленияПеречислений.Наименование ПОДОБНО &Текст"; + + ДанныеВыбора = Новый СписокЗначений; + + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + + ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование); + КонецЦикла; + + Возврат ДанныеВыбора; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ. + +// Функция РодителиЗначенияДоступа заполняет НаборЗаписей, +// родителями значения доступа, включая себя, как родителя. +// +// Параметры: +// ЗначениеДоступа - СправочникСсылка, ПланВидовХарактеристикСсылка. +// ВидДоступа - ПланВидовХарактеристикСсылка.ВидыДоступа - для заполнения. +// +// Возвращаемое значение: +// НаборЗаписей - РегистрСведенийНаборЗаписей.ГруппыЗначенийДоступа. +// +Функция РодителиЗначенияДоступа(ЗначениеДоступа, ВидДоступа) + + // Получение флажка наследования права родителей для значения доступа. + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ГруппыЗначенийДоступа.НаследоватьПраваРодителей + |ИЗ + | РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа + |ГДЕ + | ГруппыЗначенийДоступа.ВидДоступа = &ВидДоступа + | И ГруппыЗначенийДоступа.ЗначениеДоступа = &ЗначениеДоступа + | И ГруппыЗначенийДоступа.ГруппаДоступа = &ЗначениеДоступа"); + Запрос.УстановитьПараметр("ЗначениеДоступа", ЗначениеДоступа); + Запрос.УстановитьПараметр("ВидДоступа", ВидДоступа); + Выборка = Запрос.Выполнить().Выбрать(); + НаследоватьПраваРодителей = ?(Выборка.Следующий(), Выборка.НаследоватьПраваРодителей, Истина); + + НаборЗаписей = РегистрыСведений.ГруппыЗначенийДоступа.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ВидДоступа.Установить(ВидДоступа); + НаборЗаписей.Отбор.ЗначениеДоступа.Установить(ЗначениеДоступа); + + ТекущийРодитель = ЗначениеДоступа; + Пока ЗначениеЗаполнено(ТекущийРодитель) Цикл + + Запись = НаборЗаписей.Добавить(); + Запись.ВидДоступа = ВидДоступа; + Запись.ЗначениеДоступа = ЗначениеДоступа; + Запись.ГруппаДоступа = ТекущийРодитель; + Запись.НаследоватьПраваРодителей = ?(ЗначениеДоступа = Запись.ГруппаДоступа, НаследоватьПраваРодителей, Ложь); + Запись.ИспользоватьПраваСсылки = ?(ЗначениеДоступа = Запись.ГруппаДоступа, Истина, НаследоватьПраваРодителей); + Запись.СвязьСРодителем = ЗначениеДоступа <> Запись.ГруппаДоступа; + + ТекущийРодитель = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ТекущийРодитель, "Родитель"); + КонецЦикла; + + Возврат НаборЗаписей; + +КонецФункции // ЗаполнитьРодителейЗначенияДоступа() + +Процедура ДобавитьНаборыДляПрава(Право, ЗависимостиПрав, Таблица, НаборыПравДляУмножения, НаборыОграниченийДляУмножения, НаборыЧтения, НаборыДобавления, НаборыИзменения, СсылкаНаВедущийОбъект) + + // Определение права, которое требуется проверить. + ВидДоступаПроверяемогоПрава = Неопределено; + // Определение наборов ограничения, которые требуется использовать. + НаборыОграничений = Неопределено; + + Если ЗависимостиПрав["ПриПроверкеПрава" + Право] = "Чтение" Тогда + НаборыОграничений = НаборыЧтения; + ВидДоступаПроверяемогоПрава = ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения; + + ИначеЕсли ЗависимостиПрав["ПриПроверкеПрава" + Право] = "Добавление" Тогда + НаборыОграничений = НаборыДобавления; + ВидДоступаПроверяемогоПрава = ПланыВидовХарактеристик.ВидыДоступа.ПравоДобавления; + + ИначеЕсли ЗависимостиПрав["ПриПроверкеПрава" + Право] = "Изменение" Тогда + НаборыОграничений = НаборыИзменения; + ВидДоступаПроверяемогоПрава = ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения; + КонецЕсли; + + Если ЗависимостиПрав.ОтключитьПроверкуПравВедущейТаблицы Тогда + ВидДоступаПроверяемогоПрава = Неопределено; + КонецЕсли; + + Если ВидДоступаПроверяемогоПрава <> Неопределено И НаборыОграничений <> Неопределено Тогда + + Строка = НаборыПравДляУмножения.Добавить(); + Строка.НомерНабора = НаборыПравДляУмножения.Количество(); + Строка.ВидДоступа = ВидДоступаПроверяемогоПрава; + Строка.ЗначениеДоступа = СсылкаНаВедущийОбъект; + Строка[Право] = Истина; + + НовыеНаборы = НаборыОграничений.Скопировать(); + НовыеНаборы.ЗаполнитьЗначения(Истина, Право); + ДобавитьНаборыЗначенийДоступа(НаборыОграниченийДляУмножения, НовыеНаборы); + + ИначеЕсли ВидДоступаПроверяемогоПрава <> Неопределено Тогда + + НовыеНаборы = НаборыПравДляУмножения.Скопировать(); + НовыеНаборы.Очистить(); + Строка.НомерНабора = НаборыПравДляУмножения.Количество(); + Строка.ВидДоступа = ВидДоступаПроверяемогоПрава; + Строка.ЗначениеДоступа = СсылкаНаВедущийОбъект; + Строка[Право] = Истина; + ДобавитьНаборыЗначенийДоступа(Таблица, НовыеНаборы); + + ИначеЕсли НаборыОграничений <> Неопределено Тогда + + НовыеНаборы = НаборыОграничений.Скопировать(); + НовыеНаборы.ЗаполнитьЗначения(Истина, Право); + ДобавитьНаборыЗначенийДоступа(Таблица, НовыеНаборы); + + КонецЕсли; + +КонецПроцедуры + +Функция ОбновитьГруппыДоступаПрофиля(Профиль, УдаляемыеВидыДоступаБезНастройки) Экспорт + + ГруппаДоступаОбновлена = Ложь; + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ГруппыДоступа.Ссылка + |ИЗ + | Справочник.ГруппыДоступа КАК ГруппыДоступа + |ГДЕ + | (ГруппыДоступа.Профиль = &Профиль + | ИЛИ &Профиль = ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор) + | И ГруппыДоступа.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.Администраторы))"); + + Запрос.УстановитьПараметр("Профиль", Профиль.Ссылка); + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + // Проверка необходимости/возможности обновления группы доступа. + ГруппаДоступа = Выборка.Ссылка.ПолучитьОбъект(); + + Если ГруппаДоступа.Ссылка = Справочники.ГруппыДоступа.Администраторы + И ГруппаДоступа.Профиль <> Справочники.ПрофилиГруппДоступа.Администратор Тогда + // Установка профиля Администратор, если не задан. + ГруппаДоступа.Профиль = Справочники.ПрофилиГруппДоступа.Администратор; + КонецЕсли; + + // Проверка состава видов доступа. + СоставВидовДоступаИзменен = Ложь; + ЕстьУдаляемыеВидыДоступаСНастройкой = Ложь; + Если ГруппаДоступа.ВидыДоступа.Количество() <> Профиль.ВидыДоступа.НайтиСтроки(Новый Структура("Предустановленный", Ложь)).Количество() Тогда + СоставВидовДоступаИзменен = Истина; + Иначе + Для каждого СтрокаВидаДоступа Из ГруппаДоступа.ВидыДоступа Цикл + Если Профиль.ВидыДоступа.НайтиСтроки(Новый Структура("ВидДоступа, Предустановленный", СтрокаВидаДоступа.ВидДоступа, Ложь)).Количество() = 0 Тогда + СоставВидовДоступаИзменен = Истина; + Если ГруппаДоступа.ЗначенияДоступа.Найти(СтрокаВидаДоступа.ВидДоступа, "ВидДоступа") <> Неопределено Тогда + ЕстьУдаляемыеВидыДоступаСНастройкой = Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если СоставВидовДоступаИзменен + И ( НЕ УдаляемыеВидыДоступаБезНастройки + ИЛИ НЕ ЕстьУдаляемыеВидыДоступаСНастройкой ) Тогда + // Обновление группы доступа. + // 1. Удаление лишних видов доступа и значений доступа (если есть). + ТекущийНомерСтроки = ГруппаДоступа.ВидыДоступа.Количество()-1; + Пока ТекущийНомерСтроки >= 0 Цикл + ТекущийВидДоступа = ГруппаДоступа.ВидыДоступа[ТекущийНомерСтроки].ВидДоступа; + Если Профиль.ВидыДоступа.НайтиСтроки(Новый Структура("ВидДоступа, Предустановленный", ТекущийВидДоступа, Ложь)).Количество() = 0 Тогда + СтрокиЗначенийВидаДоступа = ГруппаДоступа.ЗначенияДоступа.НайтиСтроки(Новый Структура("ВидДоступа", ТекущийВидДоступа)); + Для каждого СтрокаЗначения Из СтрокиЗначенийВидаДоступа Цикл + ГруппаДоступа.ЗначенияДоступа.Удалить(СтрокаЗначения); + КонецЦикла; + ГруппаДоступа.ВидыДоступа.Удалить(ТекущийНомерСтроки); + КонецЕсли; + ТекущийНомерСтроки = ТекущийНомерСтроки - 1; + КонецЦикла; + // 2. Добавление новых видов доступа (если есть). + Для каждого СтрокаВидаДоступа Из Профиль.ВидыДоступа Цикл + Если НЕ СтрокаВидаДоступа.Предустановленный + И ГруппаДоступа.ВидыДоступа.Найти(СтрокаВидаДоступа.ВидДоступа, "ВидДоступа") = Неопределено Тогда + + НоваяСтрока = ГруппаДоступа.ВидыДоступа.Добавить(); + НоваяСтрока.ВидДоступа = СтрокаВидаДоступа.ВидДоступа; + НоваяСтрока.ДоступРазрешен = СтрокаВидаДоступа.ДоступРазрешен; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если ГруппаДоступа.Модифицированность() Тогда + ЗаблокироватьДанныеДляРедактирования(ГруппаДоступа.Ссылка, ГруппаДоступа.ВерсияДанных); + ГруппаДоступа.ДополнительныеСвойства.Вставить("НеОбновлятьРолиПользователей"); + ГруппаДоступа.Записать(); + ГруппаДоступаОбновлена = Истина; + РазблокироватьДанныеДляРедактирования(ГруппаДоступа.Ссылка); + КонецЕсли; + КонецЦикла; + + Возврат ГруппаДоступаОбновлена; + +КонецФункции + +Функция ОписанияНачальногоЗаполненияПрофилейГруппДоступа() + + ОписанияПрофилей = УправлениеДоступомПереопределяемый.ОписанияНачальногоЗаполненияПрофилейГруппДоступа(); + + // Описание для заполнения предопределенного профиля "Администратор". + ОписаниеПрофиляАдминистратор = НовоеОписаниеПрофиляГруппДоступа(); + ОписаниеПрофиляАдминистратор.Идентификатор = Строка(Справочники.ПрофилиГруппДоступа.Администратор.УникальныйИдентификатор()); + ОписаниеПрофиляАдминистратор.Наименование = "Администратор"; + ОписаниеПрофиляАдминистратор.Роли.Добавить("ПолныеПрава"); + ОписанияПрофилей.Добавить(ОписаниеПрофиляАдминистратор); + + Возврат ОписанияПрофилей; + +КонецФункции + diff --git a/SSL/src/CommonModules/УправлениеДоступом/УправлениеДоступом.mdo b/SSL/src/CommonModules/УправлениеДоступом/УправлениеДоступом.mdo new file mode 100644 index 000000000..f217f62a8 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеДоступом/УправлениеДоступом.mdo @@ -0,0 +1,10 @@ + + + УправлениеДоступом + + ru + Управление доступом + + true + true + diff --git a/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl new file mode 100644 index 000000000..ae7181836 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl @@ -0,0 +1,201 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПЕРЕОПРЕДЕЛЯЕМЫЕ ФУНКЦИИ УПРАВЛЕНИЯ ДОСТУПОМ + +// Функция ОписанияНачальногоЗаполненияПрофилейГруппДоступа возвращает +// массив структур, которые будут использованы для начального заполнения и +// восстановления начального заполнения профилей. +// +// Пустая структура может быть получена при помощи функции +// УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа(). +// +// Возвращаемое значение: +// Массив. +// +Функция ОписанияНачальногоЗаполненияПрофилейГруппДоступа() Экспорт + + ОписанияПрофилей = Новый Массив; + + Возврат ОписанияПрофилей; + +КонецФункции // ОписанияНачальногоЗаполненияПрофилейГруппДоступа() + +// Процедура ЗаполнитьСвойстваВидаДоступа заполняет свойства видов доступа, +// заданных прикладным разработчиком, как предопределенные элементы +// в плане видов характеристик ВидыДоступа. +// Структуру свойств см. в функции, вызывающей эту процедуру: +// УправлениеДоступомСерверПовтИсп.СвойстваВидовДоступа(). +// +// Параметры: +// Свойства - СтрокаТаблицыЗначений, содержащая поля, +// описание которых см. в комментарии к функции +// УправлениеДоступомСерверПовтИсп.СвойстваВидовДоступа(). +// +Процедура ЗаполнитьСвойстваВидаДоступа(Знач Свойства) Экспорт + + // Свойства + Если Свойства.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ДополнительныеСведения Тогда + Свойства.Таблицы.Добавить("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения"); + // Конец Свойства + + // УчетныеЗаписиЭлектроннойПочты + ИначеЕсли Свойства.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.УчетныеЗаписиЭлектроннойПочты Тогда + Свойства.Таблицы.Добавить("Справочник.УчетныеЗаписиЭлектроннойПочты"); + // Конец УчетныеЗаписиЭлектроннойПочты + + КонецЕсли; + +КонецПроцедуры + +// Процедура ЗаполнитьВозможныеПраваПоЗначениямДоступа заполняет +// описания возможных прав значений доступа. +// Структуру описаний см. в функции, вызывающей эту процедуру: +// УправлениеДоступомСерверПовтИсп.ВозможныеПраваПоЗначениямДоступа(). +// +// Параметры: +// ВозможныеПрава - ТаблицаЗначений, содержащая поля, +// описание которых см. в комментарии к функции +// УправлениеДоступомСерверПовтИсп.ВозможныеПраваПоЗначениямДоступа(). +// +Процедура ЗаполнитьВозможныеПраваПоЗначениямДоступа(Знач ВозможныеПрава) Экспорт + +КонецПроцедуры + +// Функция ТаблицаПодчиненностиПользователей, возвращает в менеджере временных таблиц +// таблицу, содержащую пользователей, подчиненных другим пользователям, +// для расширения доступа пользователей доступом подчиненных пользователей. +// +// Например, если есть справочник Подразделения у которого есть руководитель (пользователь) +// и состав сотрудников (пользователей), то можно сделать выборку из этого справочника +// и поместить во временную таблицу. +// При записи групп пользователей, будет учтено, что руководители (пользователи) должны +// иметь доступ, включающий доступ их подчиненных (пользователей). +// При изменении связи Руководитель<->Подчиненный, например, при изменении руководителя +// в подразделении, нужно вызвать в модуле УправлениеДоступом процедуру +// ЗаписатьГруппыИВидыДоступа(Справочник.ГруппыПользователей.ВсеПользователи), чтобы +// произошло обновление связей, при котором используется эта процедура. +// +// При записи связей выполняется обновление ролей пользователей информационной базы (если нужно), +// при этом возможны ошибки, например, если роль была переименована. +// Чтобы при интерактивной записи нового руководителя сообщить о ошибке, нужно +// сделать вызов в таком виде: +// +////Процедура ПриЗаписи(Отказ) +//// +//// ВсеПользователи = Справочники.ГруппыПользователей.ВсеПользователи.ПолучитьОбъект(); +//// УправлениеДоступом.ЗаписатьГруппыИВидыДоступа(ВсеПользователи); +//// Если ВсеПользователи.ДополнительныеСвойства.Свойство("ЕстьОшибки") Тогда +//// ДополнительныеСвойства.Вставить("ЕстьОшибки"); +//// КонецЕсли; +//// +////КонецПроцедуры +// +// А в форме подразделения разместить обработчики событий: +// +////&НаСервере +////Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) +//// +//// Если ТекущийОбъект.ДополнительныеСвойства.Свойство("ЕстьОшибки") Тогда +//// ПараметрыЗаписи.Вставить("ЕстьОшибки"); +//// КонецЕсли; +//// +////КонецПроцедуры +// +////&НаКлиенте +////Процедура ПослеЗаписи(ПараметрыЗаписи) +//// +//// Если ПараметрыЗаписи.Свойство("ЕстьОшибки") Тогда +//// Предупреждение(НСтр("ru = 'При записи возникли ошибки (см. журнал регистрации)'")); +//// КонецЕсли; +//// +////КонецПроцедуры +// +// +// Параметры: +// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц в который можно поместить таблицу подчиненности пользователей. +// +// Возвращаемое значение: +// Булево. - если Истина, МенеджерВременныхТаблиц - содержит временную таблицу "ТаблицаПодчиненностиПользователей", +// с колонками Пользователь и ПодчиненныйПользователь, имеющих тип СправочникСсылка.Пользователи. +// +Функция ТаблицаПодчиненностиПользователей(МенеджерВременныхТаблиц) Экспорт + + Возврат Ложь; + +КонецФункции // ТаблицаПодчиненностиПользователей() + +// Функция ТаблицаГруппИсполнителей, возвращает в менеджере временных таблиц +// таблицу, содержащую пользователей некоторой дополнительной группы пользователей, +// +// например, группы доступа исполнителей задач, которая соответствует +// ключу адресации (например, РольИсполнителя + ОсновнойОбъектАдресации + ДополнительныйОбъектАдресации). +// +// Функция вызывается из процедуры УправлениеДоступом.ЗаписатьГруппыИВидыДоступа() при обновлении соответствия +// пользователей и групп пользователей, выполняемом, обычно при изменении пользователя, группы пользователя +// или некоторой дополнительной группы пользователей. +// +// Причем, при изменении состава дополнительных групп пользователей, вызов должен сделать прикладной разработчик +// "ЗаписатьГруппыИВидыДоступа(Справочник.ГруппыПользователей.ВсеПользователи);". +// +// +// Параметры: +// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц в который можно поместить таблицу групп исполнителей. +// +// Возвращаемое значение: +// Булево - если Истина, МенеджерВременныхТаблиц - содержит временную таблицу "ТаблицаГруппИсполнителей", с колонками +// ГруппаИсполнителей (например, СправочникСсылка.ГруппыДоступаИсполнителей) и +// Пользователь (тип СправочникСсылка.Пользователи). +// +Функция ТаблицаГруппИсполнителей(МенеджерВременныхТаблиц) Экспорт + + Возврат Ложь; + +КонецФункции // ТаблицаГруппИсполнителей() + +// Процедура ПриИзмененииНаборовЗначенийДоступа объекта позволяет +// реализовать перезапись зависимых наборов значений доступа других объектов. +// +// Вызывается из процедур: +// УправлениеДоступом.ЗаписатьНаборыЗначенийДоступа(), +// УправлениеДоступом.ЗаписатьЗависимыеНаборыЗначенийДоступа(). +// +// +// Параметры: +// Объект СправочникОбъект, ДокументОбъект, ... +// Содержит процедуру ЗаполнитьНаборыЗначенийДоступа(). +// +Процедура ПриИзмененииНаборовЗначенийДоступа(Знач Объект) Экспорт + + +КонецПроцедуры // СсылкиОбъектовЗависимыхНаборовЗначенийДоступа() + +// Процедура ЗаполнитьЗависимостиПравДоступа заполняет зависимости прав доступа +// "подчиненного" объекта, например, задачи ЗадачаИсполнителя, +// от "ведущего" объекта, например, бизнес-процесса Задание, +// которые отличаются от стандартных, а именно, когда +// в стандартном шаблоне ограничения доступа используется вид доступа "Объект": +// 1) при чтении "подчиненного" объекта +// проверяется наличие права чтения "ведущего" объекта +// и проверяется отсутствие ограничения чтения "ведущего" объекта; +// 2) при добавлении, изменении, удалении "подчиненного" объекта +// проверяется наличие права изменения "ведущего" объекта +// и проверяется отсутствие ограничения изменения "ведущего" объекта. +// +// Параметры: +// Таблица - РегистрСведенийНаборЗаписей.ЗависимостиПравДоступа. +// Допустимые значения ресурсов ПланВидовХарактеристикСсылка: +// .ПравоЧтения, .ПравоДобавления, .ПравоИзменения. +// +// Если задано недопустимое значение, будет установлено значение по умолчанию: +// для права Чтение - ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения, +// для прав Добавление, Изменение, Удаление - ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения. +// +// Следует иметь в виду, что обычная "жесткость" условия ограничения доступа +// уменьшается в порядке "Добавление", "Изменение", "Чтение", +// Т.е. то, что можно добавить, можно и изменить и прочитать, +// соответственно, то что можно изменить можно и прочитать, но не наоборот. +// +Процедура ЗаполнитьЗависимостиПравДоступа(Знач Таблица) Экспорт + + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/УправлениеДоступомПереопределяемый.mdo b/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/УправлениеДоступомПереопределяемый.mdo new file mode 100644 index 000000000..98e055bac --- /dev/null +++ b/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/УправлениеДоступомПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + УправлениеДоступомПереопределяемый + + ru + Управление доступом переопределяемый + + true + true + diff --git a/SSL/src/CommonModules/УправлениеДоступомСерверПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСерверПовтИсп/Module.bsl new file mode 100644 index 000000000..968794bc1 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеДоступомСерверПовтИсп/Module.bsl @@ -0,0 +1,293 @@ + +// Функция СвойстваВидовДоступа возвращает таблицу свойств видов доступа, +// созданную на основе данных, заполняемых в процедуре, подготовленной прикладным разработчиком: +// УправлениеДоступомПереопределяемый.ЗаполнитьСвойстваВидаДоступа(ВидДоступа). +// +// Возвращаемое значение: +// ТаблицаЗначений с полями: +// ВидДоступа - ПланВидовХарактеристикСсылка.ВидыДоступа, +// ВидДоступаИспользуется - Булево (начальное значение Истина), +// Таблицы - Массив имен таблиц значений доступа (в формате функции ПолноеИмя() объекта метаданных), +// ВидДоступаЧерезПраваПоЗначениямДоступа - Булево (начальное значение Ложь), +// ВидДоступаЕдинственныйДляТипаЗначенияДоступа - Булево (начальное значение Истина), +// ВидДоступаБезГруппЗначенияДоступа - Булево (начальное значение Истина), +// ВидДоступаСОднойГруппойЗначенияДоступа - Булево (начальное значение Истина). +// +Функция СвойстваВидовДоступа() Экспорт + + СвойстваВидовДоступа = Новый ТаблицаЗначений; + СвойстваВидовДоступа.Колонки.Добавить("ВидДоступа", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыДоступа")); + СвойстваВидовДоступа.Колонки.Добавить("ВидДоступаИспользуется", Новый ОписаниеТипов("Булево")); + СвойстваВидовДоступа.Колонки.Добавить("Таблицы", Новый ОписаниеТипов("Массив")); + СвойстваВидовДоступа.Колонки.Добавить("ВидДоступаЧерезПраваПоЗначениямДоступа", Новый ОписаниеТипов("Булево")); + СвойстваВидовДоступа.Колонки.Добавить("ВидДоступаЕдинственныйДляТипаЗначенияДоступа", Новый ОписаниеТипов("Булево")); + СвойстваВидовДоступа.Колонки.Добавить("ВидДоступаБезГруппЗначенияДоступа", Новый ОписаниеТипов("Булево")); + СвойстваВидовДоступа.Колонки.Добавить("ВидДоступаСОднойГруппойЗначенияДоступа", Новый ОписаниеТипов("Булево")); + // Свойство для управления интерфейсом и отказом записи профиля групп доступа. + СвойстваВидовДоступа.Колонки.Добавить("ВидДоступаИспользуетсяВсегда", Новый ОписаниеТипов("Булево")); + + НачальныеЗначенияСвойств = Новый Структура; + НачальныеЗначенияСвойств.Вставить("Таблицы", Новый Массив); + НачальныеЗначенияСвойств.Вставить("ВидДоступаИспользуется", Истина); + НачальныеЗначенияСвойств.Вставить("ВидДоступаЧерезПраваПоЗначениямДоступа", Ложь); + НачальныеЗначенияСвойств.Вставить("ВидДоступаЕдинственныйДляТипаЗначенияДоступа", Истина); + НачальныеЗначенияСвойств.Вставить("ВидДоступаБезГруппЗначенияДоступа", Истина); + НачальныеЗначенияСвойств.Вставить("ВидДоступаСОднойГруппойЗначенияДоступа", Истина); + + // Подготовка свойств всех видов доступа. + ЗапросВидовДоступа = Новый Запрос( + "ВЫБРАТЬ + | ВидыДоступа.Ссылка КАК ВидДоступа + |ИЗ + | ПланВидовХарактеристик.ВидыДоступа КАК ВидыДоступа + |ГДЕ + | ВидыДоступа.Предопределенный"); + Выборка = ЗапросВидовДоступа.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + Свойства = СвойстваВидовДоступа.Добавить(); + ЗаполнитьЗначенияСвойств(Свойства, НачальныеЗначенияСвойств); + Свойства.ВидДоступа = Выборка.ВидДоступа; + Свойства.Таблицы = Новый Массив; + + Если Свойства.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения ИЛИ + Свойства.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПравоДобавления ИЛИ + Свойства.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения Тогда + + Свойства.ВидДоступаИспользуетсяВсегда = Истина; + Иначе + УправлениеДоступомПереопределяемый.ЗаполнитьСвойстваВидаДоступа(Свойства); + + // Неизменяемые свойства вида доступа Пользователи и вида доступа ВнешниеПользователи + Если Свойства.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.Пользователи Тогда + Если Свойства.Таблицы.Найти("Справочник.Пользователи") = Неопределено Тогда + Свойства.Таблицы.Добавить("Справочник.Пользователи"); + КонецЕсли; + Если Свойства.Таблицы.Найти("Справочник.ГруппыПользователей") = Неопределено Тогда + Свойства.Таблицы.Добавить("Справочник.ГруппыПользователей"); + КонецЕсли; + Свойства.ВидДоступаЕдинственныйДляТипаЗначенияДоступа = Истина; + Свойства.ВидДоступаБезГруппЗначенияДоступа = Ложь; + Свойства.ВидДоступаСОднойГруппойЗначенияДоступа = Ложь; + + ИначеЕсли Свойства.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи Тогда + Если Свойства.Таблицы.Найти("Справочник.ВнешниеПользователи") = Неопределено Тогда + Свойства.Таблицы.Добавить("Справочник.ВнешниеПользователи"); + КонецЕсли; + Если Свойства.Таблицы.Найти("Справочник.ГруппыВнешнихПользователей") = Неопределено Тогда + Свойства.Таблицы.Добавить("Справочник.ГруппыВнешнихПользователей"); + КонецЕсли; + Свойства.ВидДоступаЕдинственныйДляТипаЗначенияДоступа = Истина; + Свойства.ВидДоступаБезГруппЗначенияДоступа = Ложь; + Свойства.ВидДоступаСОднойГруппойЗначенияДоступа = Ложь; + КонецЕсли; + + Свойства.ВидДоступаИспользуетсяВсегда = Ложь; + КонецЕсли; + КонецЦикла; + + Возврат СвойстваВидовДоступа; + +КонецФункции + +// Функция ВозможныеПраваПоЗначениямДоступа возвращает таблицу описаний возможных прав значений доступа, +// созданную с использованием процедуры, подготовленной прикладным разработчиком: +// УправлениеДоступомПереопределяемый.ЗаполнитьВозможныеПраваПоЗначениямДоступа(). +// +// Описание возможных прав - это описание связей: +// <владелец прав> - <право> - <таблица прав> - <ограничиваемые права таблицы>, +// где +// владелец прав - это таблица, по элементам которой записываются назначенные права, +// например, Справочник.ПапкиФайлов; +// право - это набор из ограничиваемых, интерактивных, дополнительных прав, +// например, ДобавлениеИзменениеПапокИФайлов, ЭлектроннаяПодписьФайлов; +// таблица прав - это таблица, для которой предназначены ограничиваемые права, +// например Справочник.ПапкиФайлов, Справочник.Файлы; +// ограничиваемые права - это права чтение, добавление, изменение, удаление к объектам метаданных. +// +// <Таблиц прав> и <ограничиваемых прав> может не быть, например, в случае дополнительных прав ПометкаУдаления. +// Эти связи требуются при заполнения данных для стандартных шаблонов ограничения доступа. +// +// Возвращаемое значение: +// ТаблицаЗначений +// ВладелецПрав - Строка - полное имя таблицы значения доступа, +// Имя - Строка - идентификатор права, например, ЧтениеПапокИФайлов, +// право с имененем "УправлениеПравами" должно быть обязательно определено для общей формы настройки прав +// "Права доступа", "Управление правами" - это право на изменение прав по владельцу прав, +// которое проверяется при открытии ОбщаяФорма.ПраваПоЗначениямДоступа; +// Синоним - Строка - полное наименование права, например, "Чтение папок и файлов"; +// Сокращение - Строка - краткое наименование права среди прав одного владельца, например "Чтение"; +// Заголовок - Строка - заголовок права в форме "Права по значениям доступа", например "Чт"; +// НачальноеЗначение - Булево - начальное значение флажка права при добавлении новой строки в форме "Права по значениям доступа"; +// ТребуемыеПрава - Массив строк - имена прав, требуемых для от этого права, +// например, право "ДобавлениеПапокИФайлов" требует право "ЧтениеПапокИФайлов" и +// право "ИзменениеПапокИФайлов" +// ТребуемаяРоль - Массив строк - содержащий роли, хотя бы одна из которых, обязательна для работы права, +// используется в функции УправлениеДоступом.ЕстьПраво(); +// ЧтениеВТаблицах - Массив строк - полные имена таблиц, для которых устанавливается право чтения +// (требуется для работы шаблонов ограничения доступа); +// ДобавлениеВТаблицах - Массив строк - полные имена таблиц, для которых устанавливается право добавления +// (требуется для работы шаблонов ограничения доступа); +// ИзменениеВТаблицах - Массив строк - полные имена таблиц, для которых устанавливается право изменения +// (требуется для работы шаблонов ограничения доступа); +// УдалениеВТаблицах - Массив строк - полные имена таблиц, для которых устанавливается право удаления +// (требуется для работы шаблонов ограничения доступа); +// +Функция ВозможныеПраваПоЗначениямДоступа() Экспорт + + ВозможныеПрава = Новый ТаблицаЗначений(); + ВозможныеПрава.Колонки.Добавить("ВладелецПрав", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150))); + ВозможныеПрава.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(60))); + ВозможныеПрава.Колонки.Добавить("Синоним", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150))); + ВозможныеПрава.Колонки.Добавить("Сокращение", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150))); + ВозможныеПрава.Колонки.Добавить("Заголовок", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(20))); + ВозможныеПрава.Колонки.Добавить("НачальноеЗначение", Новый ОписаниеТипов("Булево")); + ВозможныеПрава.Колонки.Добавить("ТребуемыеПрава", Новый ОписаниеТипов("Массив")); + ВозможныеПрава.Колонки.Добавить("ТребуемаяРоль", Новый ОписаниеТипов("Массив")); + ВозможныеПрава.Колонки.Добавить("ЧтениеВТаблицах", Новый ОписаниеТипов("Массив")); + ВозможныеПрава.Колонки.Добавить("ДобавлениеВТаблицах", Новый ОписаниеТипов("Массив")); + ВозможныеПрава.Колонки.Добавить("ИзменениеВТаблицах", Новый ОписаниеТипов("Массив")); + ВозможныеПрава.Колонки.Добавить("УдалениеВТаблицах", Новый ОписаниеТипов("Массив")); + + УправлениеДоступомПереопределяемый.ЗаполнитьВозможныеПраваПоЗначениямДоступа(ВозможныеПрава); + + Возврат ВозможныеПрава; + +КонецФункции + +// Функция ОграничиваемыеПраваОбъектовМетаданныхРолей возвращает таблицу, +// содержащую права Чтение, Добавление, Изменение, Удаление +// доступа, заданные в ролях по все объектам метаданных. +// Таблица применяется при обновлении таблиц ролей в профилях групп доступа +// и при получении списка профилей групп доступа, в которых требуется +// выполнить обновление этих таблиц. +// +Функция ОграничиваемыеПраваОбъектовМетаданныхРолей() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + // Подготовка структуры имен коллекций метаданных, которые нужно проанализировать + // на доступность ролям группы доступа. + ИменаКоллекцийОбъектовМетаданных = Новый Структура; + ИменаКоллекцийОбъектовМетаданных.Вставить("Справочники", "Справочник"); + ИменаКоллекцийОбъектовМетаданных.Вставить("Документы", "Документ"); + ИменаКоллекцийОбъектовМетаданных.Вставить("ЖурналыДокументов", "ЖурналДокументов"); + ИменаКоллекцийОбъектовМетаданных.Вставить("ПланыВидовХарактеристик", "ПланВидовХарактеристик"); + ИменаКоллекцийОбъектовМетаданных.Вставить("ПланыСчетов", "ПланСчетов"); + ИменаКоллекцийОбъектовМетаданных.Вставить("ПланыВидовРасчета", "ПланВидовРасчета"); + ИменаКоллекцийОбъектовМетаданных.Вставить("РегистрыСведений", "РегистрСведений"); + ИменаКоллекцийОбъектовМетаданных.Вставить("РегистрыНакопления", "РегистрНакопления"); + ИменаКоллекцийОбъектовМетаданных.Вставить("РегистрыБухгалтерии", "РегистрБухгалтерии"); + ИменаКоллекцийОбъектовМетаданных.Вставить("РегистрыРасчета", "РегистрРасчета"); + ИменаКоллекцийОбъектовМетаданных.Вставить("БизнесПроцессы", "БизнесПроцесс"); + ИменаКоллекцийОбъектовМетаданных.Вставить("Задачи", "Задача"); + // Подготовка структуры наличия права добавления у коллекций метаданных. + ПравоДобавления = Новый Структура; + ПравоДобавления.Вставить("Справочники", Истина); + ПравоДобавления.Вставить("Документы", Истина); + ПравоДобавления.Вставить("ЖурналыДокументов", Ложь); + ПравоДобавления.Вставить("ПланыВидовХарактеристик", Истина); + ПравоДобавления.Вставить("ПланыСчетов", Истина); + ПравоДобавления.Вставить("ПланыВидовРасчета", Истина); + ПравоДобавления.Вставить("РегистрыСведений", Ложь); + ПравоДобавления.Вставить("РегистрыНакопления", Ложь); + ПравоДобавления.Вставить("РегистрыБухгалтерии", Ложь); + ПравоДобавления.Вставить("РегистрыРасчета", Ложь); + ПравоДобавления.Вставить("БизнесПроцессы", Истина); + ПравоДобавления.Вставить("Задачи", Истина); + // Подготовка структуры наличия права изменения у коллекций метаданных. + ПравоИзменения = Новый Структура; + ПравоИзменения.Вставить("Справочники", Истина); + ПравоИзменения.Вставить("Документы", Истина); + ПравоИзменения.Вставить("ЖурналыДокументов", Ложь); + ПравоИзменения.Вставить("ПланыВидовХарактеристик", Истина); + ПравоИзменения.Вставить("ПланыСчетов", Истина); + ПравоИзменения.Вставить("ПланыВидовРасчета", Истина); + ПравоИзменения.Вставить("РегистрыСведений", Истина); + ПравоИзменения.Вставить("РегистрыНакопления", Истина); + ПравоИзменения.Вставить("РегистрыБухгалтерии", Истина); + ПравоИзменения.Вставить("РегистрыРасчета", Истина); + ПравоИзменения.Вставить("БизнесПроцессы", Истина); + ПравоИзменения.Вставить("Задачи", Истина); + // Подготовка структуры наличия права удаления у коллекций метаданных. + ПравоУдаления = Новый Структура; + ПравоУдаления.Вставить("Справочники", Истина); + ПравоУдаления.Вставить("Документы", Истина); + ПравоУдаления.Вставить("ЖурналыДокументов", Ложь); + ПравоУдаления.Вставить("ПланыВидовХарактеристик", Истина); + ПравоУдаления.Вставить("ПланыСчетов", Истина); + ПравоУдаления.Вставить("ПланыВидовРасчета", Истина); + ПравоУдаления.Вставить("РегистрыСведений", Ложь); + ПравоУдаления.Вставить("РегистрыНакопления", Ложь); + ПравоУдаления.Вставить("РегистрыБухгалтерии", Ложь); + ПравоУдаления.Вставить("РегистрыРасчета", Ложь); + ПравоУдаления.Вставить("БизнесПроцессы", Истина); + ПравоУдаления.Вставить("Задачи", Истина); + + ПраваОМДРолей = Справочники.ПрофилиГруппДоступа.СоздатьЭлемент().ТаблицыРолей.Выгрузить(); + + Для каждого КлючИЗначение Из ИменаКоллекцийОбъектовМетаданных Цикл + + Для каждого ОбъектМетаданных Из Метаданные[КлючИЗначение.Ключ] Цикл + + Таблица = КлючИЗначение.Значение + "." + ОбъектМетаданных.Имя; + + // Подготовка пустой ссылки, как идентификатора типа для таблиц объектов. + Если ПравоДобавления[КлючИЗначение.Ключ] Тогда + ОписаниеТипаТаблицы = Новый ОписаниеТипов(КлючИЗначение.Значение + "Ссылка." + ОбъектМетаданных.Имя); + ТипТаблицы = ОписаниеТипаТаблицы.ПривестиЗначение(Неопределено); + Иначе + ТипТаблицы = Неопределено; + КонецЕсли; + + Для каждого Роль Из Метаданные.Роли Цикл + + Если ПравоДоступа("Чтение", ОбъектМетаданных, Роль) Тогда + + НоваяСтрока = ПраваОМДРолей.Добавить(); + НоваяСтрока.Роль = Роль.Имя; + НоваяСтрока.Таблица = Таблица; + НоваяСтрока.Добавление = ПравоДобавления[КлючИЗначение.Ключ] И ПравоДоступа("Добавление", ОбъектМетаданных, Роль); + НоваяСтрока.Изменение = ПравоИзменения [КлючИЗначение.Ключ] И ПравоДоступа("Изменение", ОбъектМетаданных, Роль); + НоваяСтрока.Удаление = ПравоУдаления [КлючИЗначение.Ключ] И ПравоДоступа("Удаление", ОбъектМетаданных, Роль); + + // Установка пустой ссылки, как идентификатора типа для таблиц объектов. + НоваяСтрока.ТипТаблицы = ТипТаблицы; + КонецЕсли; + КонецЦикла; + + КонецЦикла; + КонецЦикла; + + Возврат ПраваОМДРолей; + +КонецФункции + +// Функция ТипыСсылок возвращает таблицу, +// содержащую имена таблиц объектов метаданных и +// пустую ссылку, как "тип" этой таблицы. +// Результат применяется для обновления табличной части +// ТипыСсылок профиля групп доступа Администратор. +// +Функция ТипыСсылок() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ТипыСсылок = Справочники.ПрофилиГруппДоступа.СоздатьЭлемент().ТипыСсылок.Выгрузить(); + + МассивТипов = Новый Массив; + МассивТипов.Добавить(); + Для каждого Тип Из ТипыСсылок.Колонки["ТипТаблицы"].ТипЗначения.Типы() Цикл + МассивТипов[0] = Тип; + ОписаниеТипа = Новый ОписаниеТипов(МассивТипов); + Строка = ТипыСсылок.Добавить(); + Строка.ТипТаблицы = ОписаниеТипа.ПривестиЗначение(Неопределено); + Строка.Таблица = Метаданные.НайтиПоТипу(ТипЗнч(Строка.ТипТаблицы)).ПолноеИмя(); + КонецЦикла; + + ТипыСсылок.Свернуть("ТипТаблицы, Таблица"); + + Возврат ТипыСсылок; + +КонецФункции diff --git a/SSL/src/CommonModules/УправлениеДоступомСерверПовтИсп/УправлениеДоступомСерверПовтИсп.mdo b/SSL/src/CommonModules/УправлениеДоступомСерверПовтИсп/УправлениеДоступомСерверПовтИсп.mdo new file mode 100644 index 000000000..4c4ff5721 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеДоступомСерверПовтИсп/УправлениеДоступомСерверПовтИсп.mdo @@ -0,0 +1,11 @@ + + + УправлениеДоступомСерверПовтИсп + + ru + Управление доступом сервер повт исп + + true + true + DuringSession + diff --git a/SSL/src/CommonModules/УправлениеДоступомСобытия/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСобытия/Module.bsl new file mode 100644 index 000000000..3efb7be05 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеДоступомСобытия/Module.bsl @@ -0,0 +1,84 @@ + +// Обработчик ЗаписатьГруппыИВидыДоступа события ПриЗаписи подписки на события +// "ЗаписатьГруппыИВидыДоступа" вызывает метод записи групп доступа и видов доступа +// в РегистрСведений.ГруппыЗначенийДоступа, для требуемых объектов метаданных. +// +Процедура ЗаписатьГруппыИВидыДоступа(Знач Объект, Отказ) Экспорт + + Если Объект.ОбменДанными.Загрузка И НЕ Объект.ДополнительныеСвойства.Свойство("ЗаписатьГруппыИВидыДоступа") Тогда + Возврат; + КонецЕсли; + + #Если Сервер Тогда + УправлениеДоступом.ЗаписатьГруппыИВидыДоступа(Объект, Отказ); + #Иначе + УправлениеДоступом.ЗаписатьГруппыИВидыДоступа(Объект.Ссылка, Отказ); + #КонецЕсли + +КонецПроцедуры // ЗаписатьГруппыИВидыДоступа() + +// Обработчик ЗаписатьНаборыЗначенийДоступа события ПриЗаписи подписки на события +// "ЗаписатьНаборыЗначенийДоступа" вызывает метод записи значений доступа объекта +// в РегистрСведений.НаборыЗначенийДоступа. +// Возможен случай использования подсистемы "УправлениеДоступом", когда +// указанной подписки не существует, если наборы значений доступа не применяются. +// +Процедура ЗаписатьНаборыЗначенийДоступа(Знач Объект, Отказ) Экспорт + + Если Объект.ОбменДанными.Загрузка И НЕ Объект.ДополнительныеСвойства.Свойство("ЗаписатьНаборыЗначенийДоступа") Тогда + Возврат; + КонецЕсли; + + #Если Сервер Тогда + УправлениеДоступом.ЗаписатьНаборыЗначенийДоступа(Объект); + #Иначе + УправлениеДоступом.ЗаписатьНаборыЗначенийДоступа(Объект.Ссылка); + #КонецЕсли + +КонецПроцедуры // ЗаписатьНаборыЗначенийДоступа() + +// Обработчик ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей события ПередЗаписью подписки на события +// "ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей" вызывает метод заполнения значений доступа +// табличной части объекта, если для ограничения доступа к нему самому используются наборы. +// Возможен случай использования подсистемы "УправлениеДоступом", когда +// указанной подписки не существует, если для указанной цели наборы не применяются. +// +// Для документов и справочников нужно использовать разные подписки с одним и тем же обработчиком. +// +Процедура ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей(Знач Объект, Отказ = Неопределено, РежимЗаписи = Неопределено, РежимПроведения = Неопределено) Экспорт + + Если Объект.ОбменДанными.Загрузка И НЕ Объект.ДополнительныеСвойства.Свойство("ЗаписатьНаборыЗначенийДоступа") Тогда + Возврат; + КонецЕсли; + + #Если Сервер Тогда + УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей(Объект); + #Иначе + УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей(Объект.Ссылка); + #КонецЕсли + +КонецПроцедуры // ЗаписатьНаборыЗначенийДоступа() + +// Обработчик ЗаписатьЗависимыеНаборыЗначенийДоступа события ПриЗаписи подписки на события +// "ЗаписатьЗависимыеНаборыЗначенийДоступа" вызывает метод записи обновления зависимых +// наборов значений доступа в регистре сведений НаборыЗначенийДоступа. +// +// Возможен случай использования подсистемы "УправлениеДоступом", когда +// указанной подписки не существует, если зависимые наборы значений доступа не применяются. +// +Процедура ЗаписатьЗависимыеНаборыЗначенийДоступа(Знач Объект, Отказ) Экспорт + + Если Объект.ОбменДанными.Загрузка И НЕ Объект.ДополнительныеСвойства.Свойство("ЗаписатьЗависимыеНаборыЗначенийДоступа") Тогда + Возврат; + КонецЕсли; + + #Если Сервер Тогда + УправлениеДоступом.ЗаписатьЗависимыеНаборыЗначенийДоступа(Объект); + #Иначе + УправлениеДоступом.ЗаписатьЗависимыеНаборыЗначенийДоступа(Объект.Ссылка); + #КонецЕсли + +КонецПроцедуры // ЗаписатьНаборыЗначенийДоступа() + + + diff --git a/SSL/src/CommonModules/УправлениеДоступомСобытия/УправлениеДоступомСобытия.mdo b/SSL/src/CommonModules/УправлениеДоступомСобытия/УправлениеДоступомСобытия.mdo new file mode 100644 index 000000000..dbe35998a --- /dev/null +++ b/SSL/src/CommonModules/УправлениеДоступомСобытия/УправлениеДоступомСобытия.mdo @@ -0,0 +1,12 @@ + + + УправлениеДоступомСобытия + + ru + Управление доступом события + + true + true + true + true + diff --git a/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСобытия/Module.bsl b/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСобытия/Module.bsl new file mode 100644 index 000000000..bc8b90ff3 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСобытия/Module.bsl @@ -0,0 +1,57 @@ +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ ЭКСПОРТНЫХ ФУНКЦИЙ + +Процедура ОбновлениеАгрегатов() Экспорт + + Для Каждого ТекущийРегистр Из Метаданные.РегистрыНакопления Цикл + Если ТекущийРегистр.ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Обороты Тогда + Если РегистрыНакопления[ТекущийРегистр.Имя].ПолучитьРежимАгрегатов() + И РегистрыНакопления[ТекущийРегистр.Имя].ПолучитьИспользованиеАгрегатов() Тогда + РегистрыНакопления[ТекущийРегистр.Имя].ОбновитьАгрегаты(); + КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура ПерестроениеАгрегатов() Экспорт + + Для Каждого ТекущийРегистр Из Метаданные.РегистрыНакопления Цикл + Если ТекущийРегистр.ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Обороты Тогда + Если РегистрыНакопления[ТекущийРегистр.Имя].ПолучитьРежимАгрегатов() + И РегистрыНакопления[ТекущийРегистр.Имя].ПолучитьИспользованиеАгрегатов() Тогда + РегистрыНакопления[ТекущийРегистр.Имя].ПерестроитьИспользованиеАгрегатов(); + КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура УстановкаПериодаРассчитанныхИтогов() Экспорт + + НаДату = НачалоМесяца(ТекущаяДата())-1; + ПересчетРегистров(РегистрыНакопления, НаДату, Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки); + ПересчетРегистров(РегистрыБухгалтерии, НаДату); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ СЛУЖЕБНЫХ ФУНКЦИЙ + +Процедура ПересчетРегистров(МенеджерРегистров, НаДату, ОграничениеПоВидуРегистра = Неопределено) + + Для Каждого МенеджерРегистра ИЗ МенеджерРегистров Цикл + + МетаданныеРегистра = Метаданные.НайтиПоТипу(ТипЗнч(МенеджерРегистра)); + + Если ОграничениеПоВидуРегистра <> Неопределено И МетаданныеРегистра.ВидРегистра <> ОграничениеПоВидуРегистра Тогда + Продолжить; + КонецЕсли; + + Если МенеджерРегистра.ПолучитьПериодРассчитанныхИтогов() < НаДату Тогда + МенеджерРегистра.УстановитьПериодРассчитанныхИтогов(НаДату); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСобытия/УправлениеИтогамиИАгрегатамиСобытия.mdo b/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСобытия/УправлениеИтогамиИАгрегатамиСобытия.mdo new file mode 100644 index 000000000..cb5b54296 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСобытия/УправлениеИтогамиИАгрегатамиСобытия.mdo @@ -0,0 +1,12 @@ + + + УправлениеИтогамиИАгрегатамиСобытия + + ru + Управление итогами и агрегатами события + + true + true + true + true + diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl new file mode 100644 index 000000000..2066cd841 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl @@ -0,0 +1,450 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ЧТЕНИЕ КОНТАКТНОЙ ИНФОРМАЦИИ ОБЪЕКТОВ ДРУГИМИ ПОДСИСТЕМАМИ + +// Получить значение определенного вида контактной информации у объекта +Функция ПолучитьКонтактнуюИнформацияОбъекта(Ссылка, ВидКонтактнойИнформации) Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | КонтактнаяИнформация.Представление + |ИЗ + | Справочник." + Ссылка.Метаданные().Имя + ".КонтактнаяИнформация КАК КонтактнаяИнформация + |ГДЕ + | КонтактнаяИнформация.Ссылка = &Ссылка + | И КонтактнаяИнформация.Вид = &Вид"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.УстановитьПараметр("Вид", ВидКонтактнойИнформации); + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Возврат Выборка.Представление; + Иначе + Возврат ""; + КонецЕсли; + +КонецФункции + + + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ И МОДУЛЯ ОБЪЕКТА + +// Обработчик для события формы ПриСозданииНаСервере +Процедура ПриСозданииНаСервере(Форма, Объект, ИмяЭлементаДляРазмещения) Экспорт + + масРеквизитов = Новый Массив; + + // Создадим таблицу значений + ИмяОписания = "__КИ_ОписаниеДополнительныхРеквизитов"; + масРеквизитов.Добавить(Новый РеквизитФормы(ИмяОписания, Новый ОписаниеТипов("ТаблицаЗначений"))); + масРеквизитов.Добавить(Новый РеквизитФормы("ИмяРеквизита", Новый ОписаниеТипов("Строка"), ИмяОписания)); + масРеквизитов.Добавить(Новый РеквизитФормы("ЗначенияПолей", Новый ОписаниеТипов("СписокЗначений"), ИмяОписания)); + масРеквизитов.Добавить(Новый РеквизитФормы("ТолькоРоссийский", Новый ОписаниеТипов("Булево"), ИмяОписания)); + масРеквизитов.Добавить(Новый РеквизитФормы("Тип", Новый ОписаниеТипов("ПеречислениеСсылка.ТипыКонтактнойИнформации"), ИмяОписания)); + масРеквизитов.Добавить(Новый РеквизитФормы("Вид", Новый ОписаниеТипов("СправочникСсылка.ВидыКонтактнойИнформации"), ИмяОписания)); + масРеквизитов.Добавить(Новый РеквизитФормы("ТипНомер", Новый ОписаниеТипов("Число"), ИмяОписания)); + + + // Получим список видов КИ + ИмяСправочника = Объект.Ссылка.Метаданные().Имя; + ГруппаВидовКИ = Справочники.ВидыКонтактнойИнформации["Справочник" + ИмяСправочника]; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ВидыКонтактнойИнформации.Ссылка КАК Вид, + | ВидыКонтактнойИнформации.Наименование, + | ВидыКонтактнойИнформации.Тип, + | ВидыКонтактнойИнформации.РедактированиеТолькоВДиалоге, + | ВидыКонтактнойИнформации.АдресТолькоРоссийский, + | ВидыКонтактнойИнформации.ПометкаУдаления КАК ПометкаУдаления, + | ИСТИНА КАК Использовать + |ИЗ + | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации + |ГДЕ + | ВидыКонтактнойИнформации.Родитель = &ГруппаВидовКИ + | + |УПОРЯДОЧИТЬ ПО + | ПометкаУдаления, + | ВидыКонтактнойИнформации.РеквизитДопУпорядочивания"; + + Запрос.УстановитьПараметр("ГруппаВидовКИ", ГруппаВидовКИ); + УстановитьПривилегированныйРежим(Истина); + КонтактнаяИнформация = Запрос.Выполнить().Выгрузить(); + УстановитьПривилегированныйРежим(Ложь); + + + // Добавим нужные реквизиты + Если ТипЗнч(Объект.КонтактнаяИнформация) = Тип("ТаблицаЗначений") Тогда + ТабЗн = Объект.КонтактнаяИнформация; + Иначе + ТабЗн = Объект.КонтактнаяИнформация.Выгрузить(); + КонецЕсли; + + Номер = 0; + соотвВидИмя = Новый Соответствие; + Для Каждого Стр Из КонтактнаяИнформация Цикл + + СтрВКИ = ТабЗн.Найти(Стр.Вид, "Вид"); + Если СтрВКИ = Неопределено И Стр.ПометкаУдаления Тогда + Стр.Использовать = Ложь; + Продолжить; + КонецЕсли; + + Номер = Номер + 1; + ИмяРеквизита = "__КИ_Поле" + Номер; + масРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизита, Новый ОписаниеТипов("Строка"), , Стр.Наименование, Истина)); + + соотвВидИмя.Вставить(Стр.Вид, ИмяРеквизита); + + КонецЦикла; + + // Добавим новые реквизиты + Форма.ИзменитьРеквизиты(масРеквизитов); + + // Создадим элементы на форме и заполним значения реквизитов + Родитель = ?(ПустаяСтрока(ИмяЭлементаДляРазмещения), Форма, Форма.Элементы[ИмяЭлементаДляРазмещения]); + Для Каждого Стр Из КонтактнаяИнформация Цикл + + Если Не Стр.Использовать Тогда + Продолжить; + КонецЕсли; + + Вид = Стр.Вид; + ИмяРеквизита = соотвВидИмя.Получить(Вид); + Элемент = Форма.Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), Родитель); + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.ПутьКДанным = ИмяРеквизита; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; + + Если Стр.Тип = Перечисления.ТипыКонтактнойИнформации.Другое Тогда + Элемент.Высота = 5; + Элемент.МногострочныйРежим = Истина; + КонецЕсли; + + Если ДляТипаКонтактнойИнформацииДоступноРедактированиеВДиалоге(Стр.Тип) Тогда + Элемент.КнопкаВыбора = Истина; + Если Стр.РедактированиеТолькоВДиалоге Тогда + Элемент.РедактированиеТекста = Ложь; + Элемент.ЦветФона = WebЦвета.Кремовый; + КонецЕсли; + Элемент.УстановитьДействие("НачалоВыбора", "Подключаемый_КонтактнаяИнформацияНачалоВыбора"); + Элемент.УстановитьДействие("ПриИзменении", "Подключаемый_КонтактнаяИнформацияПриИзменении"); + КонецЕсли; + + + новСтр = Форма.__КИ_ОписаниеДополнительныхРеквизитов.Добавить(); + новСтр.ИмяРеквизита = ИмяРеквизита; + новСтр.ТолькоРоссийский = Стр.АдресТолькоРоссийский; + новСтр.Вид = Вид; + новСтр.Тип = Стр.Тип; + новСтр.ТипНомер = ПоТипуКонтактнойИнформацииПолучитьНомер(Стр.Тип); + + СтрВКИ = ТабЗн.Найти(Стр.Вид, "Вид"); + Если СтрВКИ <> Неопределено Тогда + + Форма[ИмяРеквизита] = СтрВКИ.Представление; + новСтр.ЗначенияПолей = ПреобразоватьСтрокуВСписокПолей(СтрВКИ.ЗначенияПолей); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Обработчик для события формы ПередЗаписьюНаСервере +Процедура ПередЗаписьюНаСервере(Форма, ТекущийОбъект, Отказ = Ложь) Экспорт + + ТекущийОбъект.КонтактнаяИнформация.Очистить(); + + Для Каждого Стр Из Форма.__КИ_ОписаниеДополнительныхРеквизитов Цикл + + Представление = Форма[Стр.ИмяРеквизита]; + Если ПустаяСтрока(Представление) Тогда + Продолжить; + КонецЕсли; + + новСтр = ТекущийОбъект.КонтактнаяИнформация.Добавить(); + новСтр.Тип = Стр.Тип; + новСтр.Вид = Стр.Вид; + новСтр.Представление = Представление; + + Если Стр.ЗначенияПолей.Количество() > 0 Тогда + новСтр.ЗначенияПолей = ПреобразоватьСписокПолейВСтроку(Стр.ЗначенияПолей); + КонецЕсли; + + // Заполним значения дополнительных реквизитов таб. части + Если Стр.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда + // Email + СообщениеОбОшибке = ""; + ЗаполнитьРеквизитыТабличнойЧастиДляАдресаЭлектроннойПочты(новСтр, СообщениеОбОшибке); + Если НЕ ПустаяСтрока(СообщениеОбОшибке) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщениеОбОшибке, , Стр.ИмяРеквизита); + Отказ = Истина; + КонецЕсли; + ИначеЕсли Стр.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + // Адрес + ЗаполнитьРеквизитыТабличнойЧастиДляАдреса(новСтр, Стр.ЗначенияПолей); + ИначеЕсли Стр.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон ИЛИ Стр.Тип = Перечисления.ТипыКонтактнойИнформации.Факс Тогда + // Телефон/факс + ЗаполнитьРеквизитыТабличнойЧастиДляТелефона(новСтр, Стр.ЗначенияПолей); + ИначеЕсли Стр.Тип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда + // WWW + ЗаполнитьРеквизитыТабличнойЧастиДляВебСтраницы(новСтр); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ЗАПОЛНЕНИЕ ДОПОЛНИТЕЛЬНЫХ РЕКВИЗИТОВ ТАБЛИЧНОЙ ЧАСТИ "КОНТАКТНАЯ ИНФОРМАЦИЯ" + +// Для адреса +Процедура ЗаполнитьРеквизитыТабличнойЧастиДляАдреса(СтрокаТабличнойЧасти, ЗначенияПолей) + + Для Каждого ЗначениеПоля Из ЗначенияПолей Цикл + Если ВРег(ЗначениеПоля.Представление) = "СТРАНА" Тогда + СтрокаТабличнойЧасти.Страна = ЗначениеПоля.Значение; + ИначеЕсли ВРег(ЗначениеПоля.Представление) = "РЕГИОН" Тогда + СтрокаТабличнойЧасти.Регион = ЗначениеПоля.Значение; + ИначеЕсли ВРег(ЗначениеПоля.Представление) = "ГОРОД" Тогда + СтрокаТабличнойЧасти.Город = ЗначениеПоля.Значение; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Для адреса электронной почты +Процедура ЗаполнитьРеквизитыТабличнойЧастиДляАдресаЭлектроннойПочты(СтрокаТабличнойЧасти, СообщениеОбОшибке = "") + + Попытка + Результат = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(СтрокаТабличнойЧасти.Представление); + Исключение + СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат; + КонецПопытки; + + Если Результат.Количество() > 0 Тогда + СтрокаТабличнойЧасти.АдресЭП = Результат[0].Адрес; + + Поз = Найти(СтрокаТабличнойЧасти.АдресЭП, "@"); + Если Поз <> 0 Тогда + СтрокаТабличнойЧасти.ДоменноеИмяСервера = Сред(СтрокаТабличнойЧасти.АдресЭП, Поз+1); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Для телефона и факса +Процедура ЗаполнитьРеквизитыТабличнойЧастиДляТелефона(СтрокаТабличнойЧасти, ЗначенияПолей) + + КодСтраны = ""; + КодГорода = ""; + НомерТелефона = ""; + + Для Каждого ЗначениеПоля Из ЗначенияПолей Цикл + Если ВРег(ЗначениеПоля.Представление) = "КОДСТРАНЫ" Тогда + КодСтраны = ЗначениеПоля.Значение; + ИначеЕсли ВРег(ЗначениеПоля.Представление) = "КОДГОРОДА" Тогда + КодГорода = ЗначениеПоля.Значение; + ИначеЕсли ВРег(ЗначениеПоля.Представление) = "НОМЕРТЕЛЕФОНА" Тогда + НомерТелефона = ЗначениеПоля.Значение; + КонецЕсли; + КонецЦикла; + + Если Лев(КодСтраны, 1) = "+" Тогда + КодСтраны = Сред(КодСтраны, 2); + КонецЕсли; + + Поз = Найти(НомерТелефона, ","); + Если Поз <> 0 Тогда + НомерТелефона = Лев(НомерТелефона, Поз-1); + КонецЕсли; + + Поз = Найти(НомерТелефона, Символы.ПС); + Если Поз <> 0 Тогда + НомерТелефона = Лев(НомерТелефона, Поз-1); + КонецЕсли; + + СтрокаТабличнойЧасти.НомерТелефонаБезКодов = УбратьРазделителиВНомерТелефона(НомерТелефона); + СтрокаТабличнойЧасти.НомерТелефона = УбратьРазделителиВНомерТелефона(КодСтраны + КодГорода + НомерТелефона); + +КонецПроцедуры + +Функция УбратьРазделителиВНомерТелефона(Знач СтрНомер) + + Поз = Найти(СтрНомер, ","); + Если Поз <> 0 Тогда + СтрНомер = Лев(СтрНомер, Поз-1); + КонецЕсли; + + СтрНомер = СтрЗаменить(СтрНомер, "-", ""); + СтрНомер = СтрЗаменить(СтрНомер, " ", ""); + СтрНомер = СтрЗаменить(СтрНомер, "+", ""); + + Возврат СтрНомер; + +КонецФункции + +// Для веб страницы +Процедура ЗаполнитьРеквизитыТабличнойЧастиДляВебСтраницы(СтрокаТабличнойЧасти) + + Стр = СтрокаТабличнойЧасти.Представление; + + // Вырежем имя протокола + Поз = Найти(Стр, "://"); + Если Поз <> 0 Тогда + ЛевЧасть = НРег(Лев(Стр, Поз-1)); + Если (ЛевЧасть = "http") ИЛИ (ЛевЧасть = "https") Тогда + Стр = Сред(Стр, Поз + 3); + КонецЕсли; + КонецЕсли; + + // Вырежем слева www + Если НРег(Лев(Стр, 4)) = "www." Тогда + Стр = Сред(Стр, 5); + КонецЕсли; + + Поз = Найти(Стр, "/"); + СтрокаТабличнойЧасти.ДоменноеИмяСервера = ?(Поз = 0, Стр, Лев(Стр, Поз-1)); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ + +// Проверить по типу контактной информации, доступно ли редактирование в диалоге +Функция ДляТипаКонтактнойИнформацииДоступноРедактированиеВДиалоге(Тип) + + Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + Возврат Истина; + ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда + Возврат Истина; + ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Факс Тогда + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; + +КонецФункции + +// По типу контактной информации получить номер. +// +// Номер используется при определении способа редактирования вида контактной +// информации: +// 1 - Адрес +// 2 - Телефон или факс +// 0 - Все остальные типы +// +Функция ПоТипуКонтактнойИнформацииПолучитьНомер(Тип) + + Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + Возврат 1; + ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Телефон ИЛИ Тип = Перечисления.ТипыКонтактнойИнформации.Факс Тогда + Возврат 2; + Иначе + Возврат 0; + КонецЕсли; + +КонецФункции + +// Преобразовать список полей в строку +Функция ПреобразоватьСписокПолейВСтроку(СоответствиеПолей) + + Результат = ""; + Для Каждого Элемент Из СоответствиеПолей Цикл + + Значение = Элемент.Значение; + Если ПустаяСтрока(Значение) Тогда + Продолжить; + КонецЕсли; + + Результат = Результат + ?(Результат = "", "", Символы.ПС) + + Элемент.Представление + "=" + СтрЗаменить(Значение, Символы.ПС, Символы.ПС + Символы.Таб); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Преобразовать строку полей в список значений +Функция ПреобразоватьСтрокуВСписокПолей(СтрокаПолей) + + Результат = Новый СписокЗначений; + ПоследнийЭлемент = Неопределено; + + Для Сч = 1 По СтрЧислоСтрок(СтрокаПолей) Цикл + Стр = СтрПолучитьСтроку(СтрокаПолей, Сч); + Если Лев(Стр, 1) = Символы.Таб Тогда + Если ПоследнийЭлемент <> Неопределено Тогда + ПоследнийЭлемент.Значение = ПоследнийЭлемент.Значение + Символы.ПС + Сред(Стр, 2); + КонецЕсли; + Иначе + Поз = Найти(Стр, "="); + Если Поз <> 0 Тогда + ПоследнийЭлемент = Результат.Добавить(Сред(Стр, Поз+1), Лев(Стр, Поз-1)); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + + +//////////////////////////////////////////////////////////////////////////////// +// ОБНОВЛЕНИЕ ИНФОРМАЦИОННОЙ БАЗЫ + +// Обновить один вид контактной информации +Процедура ОбновитьВидКИ(ВидКИ, Тип, МожноИзменятьСпособРедактирования, РедактированиеТолькоВДиалоге, АдресТолькоРоссийский) Экспорт + + Объект = ВидКИ.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка); + Объект.Тип = Тип; + Объект.МожноИзменятьСпособРедактирования = МожноИзменятьСпособРедактирования; + Объект.РедактированиеТолькоВДиалоге = РедактированиеТолькоВДиалоге; + Объект.АдресТолькоРоссийский = АдресТолькоРоссийский; + Объект.Записать(); + +КонецПроцедуры + +// Загрузить справочник стран мира +Процедура ЗагрузитьСтраныМира() Экспорт + + // Получим список уже загруженных стран + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | СтраныМира.Код КАК Код + |ИЗ + | Справочник.СтраныМира КАК СтраныМира + | + | УПОРЯДОЧИТЬ ПО Код"; + + ТабКоды = Запрос.Выполнить().Выгрузить(); + + Макет = Справочники.СтраныМира.ПолучитьМакет("Классификатор"); + ТабЗн = ОбщегоНазначения.ПрочитатьXMLВТаблицу(Макет.ПолучитьТекст()).Данные; + + Для Каждого Стр Из ТабЗн Цикл + Если ТабКоды.Найти(Стр.Code, "Код") <> Неопределено Тогда + Продолжить; + КонецЕсли; + + Элемент = Справочники.СтраныМира.СоздатьЭлемент(); + Элемент.Код = Стр.Code; + Элемент.Наименование = Стр.ShortName; + Элемент.КодАльфа2 = Стр.Alpha2; + Элемент.КодАльфа3 = Стр.Alpha3; + Элемент.НаименованиеПолное = Стр.FullName; + Элемент.Записать(); + + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/УправлениеКонтактнойИнформацией.mdo b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/УправлениеКонтактнойИнформацией.mdo new file mode 100644 index 000000000..1e375f46c --- /dev/null +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/УправлениеКонтактнойИнформацией.mdo @@ -0,0 +1,10 @@ + + + УправлениеКонтактнойИнформацией + + ru + Управление контактной информацией + + true + true + diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/Module.bsl new file mode 100644 index 000000000..c542b5ce4 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/Module.bsl @@ -0,0 +1,1218 @@ + +// Используются ли в конфигурации классификаторы +Функция ИспользуютсяКлассификаторы() Экспорт + + Возврат Истина; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ФУНКЦИИ, ВЫЗЫВАЕМЫЕ ИЗ ФОРМЫ ВВОДА АДРЕСА + +// функция из исходной строки формирует строку для поиска данных в запросе +Функция СформироватьСтрокуДляПоискаВЗапросе(Знач СтрокаПоиска) Экспорт + + // АдресныйКлассификатор + ИтоговаяСтрокаДляПоиска = СтрокаПоиска; + ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "~", "~~"); + ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "%", "~%"); + ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "_", "~_"); + ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "[", "~["); + ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "-", "~-"); + + Возврат ИтоговаяСтрокаДляПоиска; + // Конец АдресныйКлассификатор + +КонецФункции + +// Найти по индексу записи в адресном классификаторе +Функция НайтиЗаписиВАКПоИндексу(Индекс) Экспорт + + // АдресныйКлассификатор + Результат = Новый Структура; + Результат.Вставить("Количество", 0); + Результат.Вставить("НайденныйРегион", ""); + Результат.Вставить("НайденныйРайон", ""); + + // Проверим правильность ввода индекса + Если СтрДлина(Индекс) <> 6 Тогда + Возврат Результат; + КонецЕсли; + + // Найдем записи по индексу + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | АдресныйКлассификатор.ТипАдресногоЭлемента, + | АдресныйКлассификатор.Код, + | АдресныйКлассификатор.Наименование + "" "" + АдресныйКлассификатор.Сокращение Как Наименование + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК АдресныйКлассификатор + |ГДЕ + | АдресныйКлассификатор.Индекс = &Индекс"; + Запрос.УстановитьПараметр("Индекс", Индекс); + Выборка = Запрос.Выполнить().Выбрать(); + + // Если ничего не нашли + Если Выборка.Количество() = 0 Тогда + Возврат Результат; + КонецЕсли; + + // Запомним наименования найденных записей + ТипПоКоду = Новый Соответствие; + ИмяПоКоду = Новый Соответствие; + + Пока Выборка.Следующий() Цикл + ТипАдресногоЭлемента = Выборка.ТипАдресногоЭлемента; + Код = Выборка.Код; + + Если ТипАдресногоЭлемента < 6 Тогда + // не дом + ИмяПоКоду.Вставить(Код, СокрП(Выборка.Наименование)); + КонецЕсли; + + ТипПоКоду.Вставить(Код, ТипАдресногоЭлемента); + КонецЦикла; + + // Определим коды объектов, наименования которых нужно найти + мНужноИскать = Новый Массив; + сНужноИскать = Новый Соответствие; + + Для Каждого Найденный Из ТипПоКоду Цикл + ТипАдресногоЭлемента = Найденный.Значение; + Код = Найденный.Ключ; + + Пока ТипАдресногоЭлемента > 1 Цикл + ТипАдресногоЭлемента = ТипАдресногоЭлемента - 1; + Маска = ПолучитьМаскуПоТипу(ТипАдресногоЭлемента); + Код = Код - (Код % Маска); + + Если (ТипПоКоду.Получить(Код) = Неопределено) И (сНужноИскать.Получить(Код) = Неопределено) Тогда + сНужноИскать.Вставить(Код, ТипАдресногоЭлемента); + мНужноИскать.Добавить(Код); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + // Получим недостающие наименования + Если мНужноИскать.Количество() <> 0 Тогда + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | АдресныйКлассификатор.ТипАдресногоЭлемента, + | АдресныйКлассификатор.Код, + | АдресныйКлассификатор.Наименование + "" "" + АдресныйКлассификатор.Сокращение Как Наименование + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК АдресныйКлассификатор + |ГДЕ + | АдресныйКлассификатор.Код В(&масКодов)"; + Запрос.УстановитьПараметр("масКодов", мНужноИскать); + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + ИмяПоКоду.Вставить(Выборка.Код, СокрП(Выборка.Наименование)); + ТипПоКоду.Вставить(Выборка.Код, Выборка.ТипАдресногоЭлемента); + КонецЦикла; + КонецЕсли; + + // Определим какие не нужно выводить записи и какие есть различные регионы и районы + ВсеРегионы = Новый Соответствие; + ВсеРайоны = Новый Соответствие; + НеВыводитьВТаблицу = Новый Соответствие; + + Для Каждого Элемент Из ТипПоКоду Цикл + ТипАдресногоЭлемента = Элемент.Значение; + Код = Элемент.Ключ; + + Если ТипАдресногоЭлемента = 1 Тогда + ВсеРегионы.Вставить(Код, Истина); + НайденныйРегион = Код; + + ИначеЕсли ТипАдресногоЭлемента = 2 Тогда + ВсеРайоны.Вставить(Код, Истина); + НайденныйРайон = Код; + + КонецЕсли; + + Если ТипАдресногоЭлемента = 6 Тогда + Продолжить; + КонецЕсли; + + Пока ТипАдресногоЭлемента > 1 Цикл + ТипАдресногоЭлемента = ТипАдресногоЭлемента - 1; + Маска = ПолучитьМаскуПоТипу(ТипАдресногоЭлемента); + Код = Код - (Код % Маска); + НеВыводитьВТаблицу.Вставить(Код, Истина); + КонецЦикла; + КонецЦикла; + + Результат.НайденныйРегион = ?(ВсеРегионы.Количество() = 1, ИмяПоКоду.Получить(НайденныйРегион), ""); + Результат.НайденныйРайон = ?(ВсеРайоны.Количество() = 1, ИмяПоКоду.Получить(НайденныйРайон), ""); + + // Определим уровень детализации выводимой информации о городе / населенном пункте + Если ВсеРегионы.Количество() > 1 Тогда + ДетализацияДоУровня = 1; + ИначеЕсли ВсеРайоны.Количество() > 1 Тогда + ДетализацияДоУровня = 2; + Иначе + ДетализацияДоУровня = 3; + КонецЕсли; + + + // Очистим таблицу + НайденныеЗаписиПоИндексу = Новый ТаблицаЗначений; + НайденныеЗаписиПоИндексу.Колонки.Добавить("Улица", Новый ОписаниеТипов("Строка")); + НайденныеЗаписиПоИндексу.Колонки.Добавить("Описание", Новый ОписаниеТипов("Строка")); + НайденныеЗаписиПоИндексу.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка")); + + // Заполним таблицу с найденными записями + Для Каждого Элемент Из ТипПоКоду Цикл + ТипАдресногоЭлемента = Элемент.Значение; + Код = Элемент.Ключ; + + Если (ТипАдресногоЭлемента = 6) ИЛИ (НеВыводитьВТаблицу.Получить(Код) <> Неопределено) Тогда + Продолжить; + КонецЕсли; + + новСтр = НайденныеЗаписиПоИндексу.Добавить(); + новСтр.Улица = ?(ТипАдресногоЭлемента = 5, ИмяПоКоду.Получить(Код), "< Без улицы >"); + новСтр.Код = Формат(Код, "ЧГ="); + новСтр.Описание = ""; + + // Получим описание + ТипАдресногоЭлемента = ?(ТипАдресногоЭлемента = 5, 4, ТипАдресногоЭлемента); + Пока ТипАдресногоЭлемента >= ДетализацияДоУровня Цикл + Код = Код - (Код % ПолучитьМаскуПоТипу(ТипАдресногоЭлемента)); + Если ПолучитьТипАдресногоЭлемента(Код) = ТипАдресногоЭлемента Тогда + новСтр.Описание = новСтр.Описание + ?(новСтр.Описание = "", "", ", ") + ИмяПоКоду.Получить(Код); + КонецЕсли; + + ТипАдресногоЭлемента = ТипАдресногоЭлемента - 1; + КонецЦикла; + КонецЦикла; + + НайденныеЗаписиПоИндексу.Сортировать("Улица, Код"); + + Количество = НайденныеЗаписиПоИндексу.Количество(); + Результат.Вставить("Количество", Количество); + + Если Количество = 1 Тогда + + КодАдресногоЭлемента = Число(НайденныеЗаписиПоИндексу[0].Код); + ПоКодуАдресногоЭлементаВСтруктуруПолучитьЕгоКомпоненты(КодАдресногоЭлемента, Результат); + + ИначеЕсли Количество > 1 Тогда + + АдресВХранилище = ПоместитьВоВременноеХранилище(НайденныеЗаписиПоИндексу, Новый УникальныйИдентификатор); + Результат.Вставить("АдресВХранилище", АдресВХранилище); + + КонецЕсли; + + Возврат Результат; + // Конец АдресныйКлассификатор + +КонецФункции + +// Получить компоненты адресного элемента по его коду +Процедура ПоКодуАдресногоЭлементаВСтруктуруПолучитьЕгоКомпоненты(КодАдресногоЭлемента, Результат) Экспорт + + // АдресныйКлассификатор + Регион = ""; + Район = ""; + Город = ""; + НаселенныйПункт = ""; + Улица = ""; + + ПолучитьПоКодуАдресногоЭлементаЕгоКомпоненты(КодАдресногоЭлемента, Регион, Район, Город, НаселенныйПункт, Улица, ""); + + Результат.Вставить("Регион", Регион); + Результат.Вставить("Район", Район); + Результат.Вставить("Город", Город); + Результат.Вставить("НаселенныйПункт", НаселенныйПункт); + Результат.Вставить("Улица", Улица); + // Конец АдресныйКлассификатор + +КонецПроцедуры + +// Функция определяет индекс по переданным региону, району, городу, населенному пункту, +// улице, дому и корпусу +// +// Параметры: +// НазваниеРегиона - название региона( с сокращением) +// НазваниеРайона - название района( с сокращением) +// НазваниеГорода - название города( с сокращением) +// НазваниеНаселенногоПункта - название населенного пункта( с сокращением) +// Улица - название улицы ( с сокращением) +// НомерДома - номер дома, для которого необходимо получить индекс +// НомерКорпуса - номер корпуса +// +// Возвращаемое значение: +// Строка - шестизначный почтовый индекс +// +Функция ПолучитьИндекс(Знач НазваниеРегиона, Знач НазваниеРайона, Знач НазваниеГорода, Знач НазваниеНаселенногоПункта, Знач НазваниеУлицы, Знач НомерДома, Знач НомерКорпуса) Экспорт + + // АдресныйКлассификатор + РодительИндекса = ПолучитьПустуюСтруктуруАдреса(); + Индекс = ""; + + Регион = ПолучитьАдресныйЭлемент(НазваниеРегиона, 1); + Если Регион.Код > 0 Тогда + РодительИндекса = Регион; + Если НЕ ПустаяСтрока(Регион.Индекс) Тогда + Индекс = Регион.Индекс; + КонецЕсли; + КонецЕсли; + + Район = ПолучитьАдресныйЭлемент(НазваниеРайона, 2, РодительИндекса.Код); + Если Район.Код > 0 Тогда + РодительИндекса = Район; + Если НЕ ПустаяСтрока(Район.Индекс) Тогда + Индекс = Район.Индекс; + КонецЕсли; + КонецЕсли; + + Город = ПолучитьАдресныйЭлемент(НазваниеГорода, 3, РодительИндекса.Код); + Если Город.Код > 0 Тогда + РодительИндекса = Город; + Если НЕ ПустаяСтрока(Город.Индекс) Тогда + Индекс = Город.Индекс; + КонецЕсли; + КонецЕсли; + + НаселенныйПункт = ПолучитьАдресныйЭлемент(НазваниеНаселенногоПункта, 4, РодительИндекса.Код); + Если НаселенныйПункт.Код > 0 Тогда + РодительИндекса = НаселенныйПункт; + Если НЕ ПустаяСтрока(НаселенныйПункт.Индекс) Тогда + Индекс = НаселенныйПункт.Индекс; + КонецЕсли; + КонецЕсли; + + Улица = ПолучитьАдресныйЭлемент(НазваниеУлицы, 5, РодительИндекса.Код); + Если Улица.Код > 0 Тогда + ИндексУлицы = ПолучитьИндексПоУлицеДомуКорпусу(Улица, НомерДома, НомерКорпуса); + Если НЕ ПустаяСтрока(ИндексУлицы) Тогда + Индекс = ИндексУлицы; + КонецЕсли; + КонецЕсли; + + Возврат Индекс; + // Конец АдресныйКлассификатор + +КонецФункции + +// Обработчик автоподбора в адресном элементе +Функция АвтоПодборТекстВАдресномЭлементе(Текст, Регион, Район, Город, НаселенныйПункт, УровеньЭлемента) Экспорт + + // АдресныйКлассификатор + СтруктураОграничений = ПолучитьСтруктуруОграниченийПоАдресу(Регион, Район, Город, НаселенныйПункт, "", УровеньЭлемента); + РезультатЗапроса = ПолучитьРезультатЗапросаАвтоподбораДляРегистра(Текст, СтруктураОграничений, 51); + + Количество = РезультатЗапроса.Количество(); + Если (Количество = 0) Тогда + Возврат Неопределено; + КонецЕсли; + + Результат = Новый СписокЗначений; + Для Каждого Стр Из РезультатЗапроса Цикл + Результат.Добавить(СокрЛП(Стр.Наименование) + " " + СокрЛП(Стр.Сокращение)); + КонецЦикла; + + Возврат Результат; + // Конец АдресныйКлассификатор + +КонецФункции + +// АдресныйКлассификатор + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ФУНКЦИИ, ВЫЗЫВАЕМЫЕ ИЗ ФОРМЫ ВЫБОРА АДРЕСНОГО КЛАССИФИКАТОРА + +// Функция возвращает структуру ограничений по переданным параметрам +// уже заполненным адресным полям +// +// Параметры: +// Параметры: +// НазваниеРегиона - название региона( с сокращением) +// НазваниеРайона - название района( с сокращением) +// НазваниеГорода - название города( с сокращением) +// НазваниеНаселенногоПункта - название населенного пункта( с сокращением) +// +Функция ВернутьСтруктуруОграниченийПоРодителю(Знач НазваниеРегиона, Знач НазваниеРайона, Знач НазваниеГорода, + Знач НазваниеНаселенногоПункта, Знач НазваниеУлицы, КодРодителя) Экспорт + + СтруктураОграничений = Новый Структура(); + РодительскийЭлемент = ВернутьСтрокуАдресногоКлассификатораПоАдреснымЭлементам(НазваниеРегиона, НазваниеРайона, НазваниеГорода, + НазваниеНаселенногоПункта, НазваниеУлицы); + + КодРодителя = РодительскийЭлемент.Код; + + // по коду определяем уровень элемента + ТипЭлемента = ПолучитьТипАдресногоЭлемента(КодРодителя); + ДобавитьКодВСтруктуру(СтруктураОграничений, "КодАдресногоОбъектаВКоде", Цел(КодРодителя / МаскаРегиона()), ТипЭлемента, 1); + ДобавитьКодВСтруктуру(СтруктураОграничений, "КодРайонаВКоде", Цел(КодРодителя / МаскаРайона()) % 1000, ТипЭлемента, 2); + ДобавитьКодВСтруктуру(СтруктураОграничений, "КодГородаВКоде", Цел(КодРодителя / МаскаГорода()) % 1000, ТипЭлемента, 3); + ДобавитьКодВСтруктуру(СтруктураОграничений, "КодНаселенногоПунктаВКоде", Цел(КодРодителя / МаскаНасПункта()) % 1000, ТипЭлемента, 4); + ДобавитьКодВСтруктуру(СтруктураОграничений, "КодУлицыВКоде", Цел(КодРодителя / МаскаУлицы())% 10000, ТипЭлемента, 5); + + Возврат СтруктураОграничений; + +КонецФункции + +// Функция возвращает строку адресного классификатора по значениям адресных элементов +Функция ВернутьСтрокуАдресногоКлассификатораПоАдреснымЭлементам(Знач НазваниеРегиона, Знач НазваниеРайона, Знач НазваниеГорода, + Знач НазваниеНаселенногоПункта, Знач НазваниеУлицы) Экспорт + + РодительскийЭлемент = Неопределено; + КодРодителяРодителя = 0; + + Регион = ПолучитьАдресныйЭлемент(НазваниеРегиона, 1); + Если Регион.Код > 0 Тогда + РодительскийЭлемент = Регион; + КодРодителяРодителя = Регион.Код; + КонецЕсли; + + Район = ПолучитьАдресныйЭлемент(НазваниеРайона, 2, КодРодителяРодителя); + Если Район.Код > 0 Тогда + РодительскийЭлемент = Район; + КодРодителяРодителя = Район.Код; + КонецЕсли; + + Город = ПолучитьАдресныйЭлемент(НазваниеГорода, 3, КодРодителяРодителя); + Если Город.Код > 0 Тогда + РодительскийЭлемент = Город; + КодРодителяРодителя = Город.Код; + КонецЕсли; + + НаселенныйПункт = ПолучитьАдресныйЭлемент(НазваниеНаселенногоПункта, 4, КодРодителяРодителя); + Если НаселенныйПункт.Код > 0 Тогда + РодительскийЭлемент = НаселенныйПункт; + КодРодителяРодителя = НаселенныйПункт.Код; + КонецЕсли; + + Улица = ПолучитьАдресныйЭлемент(НазваниеУлицы, 5, КодРодителяРодителя); + Если Улица.Код > 0 Тогда + РодительскийЭлемент = Улица; + КодРодителяРодителя = Улица.Код; + КонецЕсли; + + Если РодительскийЭлемент = Неопределено Тогда + Возврат ПолучитьПустуюСтруктуруАдреса() + Иначе + Возврат РодительскийЭлемент; + КонецЕсли; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ПОИСКА ПО СТРОКЕ + +//Функция Строит запрос автоподбора для регистра +Функция ПолучитьРезультатЗапросаАвтоподбораДляРегистра(Знач Текст, СтруктураПараметров, КоличествоЭлементов) + + Объект = Метаданные.РегистрыСведений.АдресныйКлассификатор; + + СтрокаОтборовПоСтруктуре = ""; + + Запрос = СоздатьЗапросДляСпискаАвтоподбора(Текст, СтрокаОтборовПоСтруктуре, СтруктураПараметров, "ТаблицаРегистра"); + + СтрокаПолей = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + Строка(КоличествоЭлементов) + " + | ТаблицаРегистра.* "; + + Запрос.Текст = СтрокаПолей + " + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК ТаблицаРегистра + |ГДЕ "; + + + // формируем ограничения по полям для поиска + ОграничениеПоПолю = "(ТаблицаРегистра.Наименование ПОДОБНО &ТекстАвтоПодбора СПЕЦСИМВОЛ ""~"") "; + + Запрос.Текст = Запрос.Текст +" + | (" + ОграничениеПоПолю + ") " + СтрокаОтборовПоСтруктуре; + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +// Функция создает объект запрос и устанавливает у него параметры ТекстАвтоПодбора и ТекстАвтоПодбораЧисло +// убирает лишние символы в строке поиска +Функция СоздатьЗапросДляСпискаАвтоподбора(СтрокаПоиска, СтрокаОтборовПоСтруктуре, СтруктураПараметров, ИмяТаблицыОграничений) + + Запрос = Новый Запрос; + + СтрокаПоиска = СформироватьСтрокуДляПоискаВЗапросе(СтрокаПоиска); + + Запрос.УстановитьПараметр("ТекстАвтоПодбора" , (СтрокаПоиска + "%")); + Попытка + Запрос.УстановитьПараметр("ТекстАвтоПодбораЧисло", Число(СтрокаПоиска)); + Исключение + Запрос.УстановитьПараметр("ТекстАвтоПодбораЧисло", Неопределено); + КонецПопытки; + + // Устанавливает ограничения + СтрокаОтборовПоСтруктуре = ""; + Для Каждого ЭлементСтруктуры Из СтруктураПараметров Цикл + Ключ = ЭлементСтруктуры.Ключ; + Значение = ЭлементСтруктуры.Значение; + + Запрос.УстановитьПараметр(Ключ, Значение); + СтрокаОтборовПоСтруктуре = СтрокаОтборовПоСтруктуре + " + | И + | " + ИмяТаблицыОграничений + "." + Ключ + " В (&"+ Ключ + ")"; + КонецЦикла; + + Возврат Запрос; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ С АДРЕСНЫМ КОДОМ + +// Функция возвращает маску для определения номера элемента в структуре кода +// +// Параметры: +// Нет +// +// Возвращаемое значение: +// Число - маска с единица в значимых разрядах и нулями в остальных +// +Функция МаскаРегиона() + Возврат 10000000000000000000; +КонецФункции + +// Функция возвращает маску для определения номера элемента в структуре кода +// +// Параметры: +// Нет +// +// Возвращаемое значение: +// Число - маска с единица в значимых разрядах и нулями в остальных +// +Функция МаскаРайона() + Возврат 10000000000000000; +КонецФункции + +// Функция возвращает маску для определения номера элемента в структуре кода +// +// Параметры: +// Нет +// +// Возвращаемое значение: +// Число - маска с единица в значимых разрядах и нулями в остальных +// +Функция МаскаГорода() + Возврат 10000000000000; +КонецФункции + +// Функция возвращает маску для определения номера элемента в структуре кода +// +// Параметры: +// Нет +// +// Возвращаемое значение: +// Число - маска с единица в значимых разрядах и нулями в остальных +// +Функция МаскаНасПункта() + Возврат 10000000000; +КонецФункции + +// Функция возвращает маску для определения номера элемента в структуре кода +// +// Параметры: +// Нет +// +// Возвращаемое значение: +// Число - маска с единица в значимых разрядах и нулями в остальных +// +Функция МаскаУлицы() + Возврат 1000000; +КонецФункции + +// Функция возвращает маску для определения номера элемента в структуре кода +// +// Параметры: +// Нет +// +// Возвращаемое значение: +// Число - маска с единица в значимых разрядах и нулями в остальных +// +Функция МаскаДома() + Возврат 100; +КонецФункции + +// Функция возвращает маску для определения номера элемента в структуре кода +// +// Параметры: +// Нет +// +// Возвращаемое значение: +// Число - маска с единица в значимых разрядах и нулями в остальных +// +Функция МаскаКвартиры() + Возврат 100; +КонецФункции + +// Функция ставит в соответствие типу адресного элемента маску, +// через которую выделяется его значимый код +// +// Параметры: +// ТипАдресногоЭлемента - число - тип адресного элемента. +// +// Возвращаемое значение: +// Число - маска, при делении на которую выделяется значимый код +// адресного элемента +// +Функция ПолучитьМаскуПоТипу(ТипАдресногоЭлемента) + + Если ТипАдресногоЭлемента = 1 Тогда + Возврат МаскаРегиона(); + + ИначеЕсли ТипАдресногоЭлемента = 2 Тогда + Возврат МаскаРайона(); + + ИначеЕсли ТипАдресногоЭлемента = 3 Тогда + Возврат МаскаГорода(); + + ИначеЕсли ТипАдресногоЭлемента = 4 Тогда + Возврат МаскаНасПункта(); + + ИначеЕсли ТипАдресногоЭлемента = 5 Тогда + Возврат МаскаУлицы(); + + ИначеЕсли ТипАдресногоЭлемента = 6 Тогда + Возврат МаскаДома(); + + Иначе + Возврат МаскаКвартиры(); + + КонецЕсли; + +КонецФункции + +// Функция ставит в соответствие типу адресного элемента маску, +// через которую выделяется его значимый код +// +// Параметры: +// ТипАдресногоЭлемента - число - тип адресного элемента. +// +// Возвращаемое значение: +// Число - маска, при делении на которую выделяется значимый код +// адресного элемента +// +Функция ПолучитьТипАдресногоЭлемента(КодЭлемента) + + Если КодЭлемента = 0 Тогда + Возврат 0; + КонецЕсли; + + Если КодЭлемента % МаскаРегиона() < 100 Тогда // регион 21 ноль и АА + Возврат 1; + + ИначеЕсли КодЭлемента % МаскаРайона() < 100 Тогда // район 18 ноль и АА + Возврат 2; + + ИначеЕсли КодЭлемента % МаскаГорода() < 100 Тогда // город 15 ноль и АА + Возврат 3; + + ИначеЕсли КодЭлемента % МаскаНасПункта() < 100 Тогда // населенный пункт 12 ноль и АА + Возврат 4; + + ИначеЕсли КодЭлемента % МаскаУлицы() < 100 Тогда // улица 8 ноль и АА + Возврат 5; + + ИначеЕсли КодЭлемента % МаскаДома() < 100 Тогда // дом 4 ноль и АА + Возврат 6; + + Иначе // квартира + Возврат 7; + + КонецЕсли; + +КонецФункции + +// Процедура по коду адресного элемента возвращает строковые представления его иерархии +Функция ПолучитьПоКодуАдресногоЭлементаЕгоКомпоненты(КодАдресногоЭлемента, Регион, Район, Город, НаселенныйПункт, Улица, Дом) + + Элемент = ПолучитьСтруктуруАдресногоЭлемента(КодАдресногоЭлемента); + + Если Элемент.ТипАдресногоЭлемента >= 6 Тогда + Дом = ПолучитьИмяАдресногоЭлементаПоКоду(КодАдресногоЭлемента - КодАдресногоЭлемента%МаскаДома(), 6); + КонецЕсли; + + Если Элемент.ТипАдресногоЭлемента >= 5 Тогда + Улица = ПолучитьИмяАдресногоЭлементаПоКоду(КодАдресногоЭлемента - КодАдресногоЭлемента%МаскаУлицы(), 5); + КонецЕсли; + + Если Элемент.ТипАдресногоЭлемента >= 4 Тогда + НаселенныйПункт = ПолучитьИмяАдресногоЭлементаПоКоду(КодАдресногоЭлемента - КодАдресногоЭлемента%МаскаНасПункта(), 4); + КонецЕсли; + + Если Элемент.ТипАдресногоЭлемента >= 3 Тогда + Город = ПолучитьИмяАдресногоЭлементаПоКоду(КодАдресногоЭлемента - КодАдресногоЭлемента%МаскаГорода(), 3); + КонецЕсли; + + Если Элемент.ТипАдресногоЭлемента >= 2 Тогда + Район = ПолучитьИмяАдресногоЭлементаПоКоду(КодАдресногоЭлемента - КодАдресногоЭлемента%МаскаРайона(), 2); + КонецЕсли; + + Если Элемент.ТипАдресногоЭлемента >= 1 Тогда + Регион = ПолучитьИмяАдресногоЭлементаПоКоду(КодАдресногоЭлемента - КодАдресногоЭлемента%МаскаРегиона(), 1); + КонецЕсли; + + Возврат Элемент; + +КонецФункции + +Функция ПолучитьСтруктуруАдресногоЭлемента(КодЭлемента) + + КодРазбора = КодЭлемента; + ТипАдресногоЭлемента = ПолучитьТипАдресногоЭлемента(КодРазбора); + + КодАдресногоОбъекта = Цел(КодРазбора / МаскаРегиона()); + КодРазбора = КодРазбора % МаскаРегиона(); + + КодРайона = Цел(КодРазбора / МаскаРайона()); + КодРазбора = КодРазбора % МаскаРайона(); + + КодГорода = Цел(КодРазбора / МаскаГорода()); + КодРазбора = КодРазбора % МаскаГорода(); + + КодНаселенногоПункта = Цел(КодРазбора / МаскаНасПункта()); + КодРазбора = КодРазбора % МаскаНасПункта(); + + КодУлицы = Цел(КодРазбора / МаскаУлицы()); + + ТексЗапроса = "ВЫБРАТЬ + | АдресныйКлассификатор.Код, + | АдресныйКлассификатор.КодАдресногоОбъектаВКоде, + | АдресныйКлассификатор.Наименование, + | АдресныйКлассификатор.Сокращение, + | АдресныйКлассификатор.Индекс, + | АдресныйКлассификатор.ТипАдресногоЭлемента, + | АдресныйКлассификатор.КодРайонаВКоде, + | АдресныйКлассификатор.КодГородаВКоде, + | АдресныйКлассификатор.КодНаселенногоПунктаВКоде, + | АдресныйКлассификатор.КодУлицыВКоде + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК АдресныйКлассификатор + | + |ГДЕ + | АдресныйКлассификатор.ТипАдресногоЭлемента = &ТипАдресногоЭлемента И + | АдресныйКлассификатор.КодАдресногоОбъектаВКоде = &КодАдресногоОбъекта И + | АдресныйКлассификатор.КодРайонаВКоде = &КодРайона И + | АдресныйКлассификатор.КодГородаВКоде = &КодГорода И + | АдресныйКлассификатор.КодНаселенногоПунктаВКоде = &КодНаселенногоПункта И + | АдресныйКлассификатор.КодУлицыВКоде = &КодУлицы И + | АдресныйКлассификатор.Код = &КодЭлемента"; + + Запрос = Новый Запрос(ТексЗапроса); + Запрос.УстановитьПараметр("ТипАдресногоЭлемента", ТипАдресногоЭлемента); + Запрос.УстановитьПараметр("КодАдресногоОбъекта", КодАдресногоОбъекта); + Запрос.УстановитьПараметр("КодРайона", КодРайона); + Запрос.УстановитьПараметр("КодГорода", КодГорода); + Запрос.УстановитьПараметр("КодНаселенногоПункта", КодНаселенногоПункта); + Запрос.УстановитьПараметр("КодУлицы", КодУлицы); + Запрос.УстановитьПараметр("КодЭлемента", Число(КодЭлемента)); + + РезультатЗапроса = Запрос.Выполнить(); + + Если РезультатЗапроса.Пустой() Тогда + Возврат ПолучитьПустуюСтруктуруАдреса(); + КонецЕсли; + + Выборка = РезультатЗапроса.Выбрать(); + + Выборка.Следующий(); + + Возврат Новый Структура("Код,Наименование,Сокращение,ТипАдресногоЭлемента,Индекс,КодАдресногоОбъектаВКоде,КодРайонаВКоде,КодГородаВКоде,КодНаселенногоПунктаВКоде,КодУлицыВКоде", + Выборка.Код, + Выборка.Наименование, + Выборка.Сокращение, + Выборка.ТипАдресногоЭлемента, + Выборка.Индекс, + Выборка.КодАдресногоОбъектаВКоде, + Выборка.КодРайонаВКоде, + Выборка.КодГородаВКоде, + Выборка.КодНаселенногоПунктаВКоде, + Выборка.КодУлицыВКоде); + +КонецФункции + +// Функция возвращает имя адресного элемента определенного уровня по коду +Функция ПолучитьИмяАдресногоЭлементаПоКоду(КодЭлемента, ТипАдресногоЭлемента) + + ИмяАдресногоЭлемента = ""; + // сначала по коду определим уровень элемента, если не совпадет с требуемым, то к БД не обращаемся + ТипЭлемента = ПолучитьТипАдресногоЭлемента(КодЭлемента); + Если ТипЭлемента <> ТипАдресногоЭлемента Тогда + Возврат ИмяАдресногоЭлемента; + КонецЕсли; + + АдресныйЭлемент = ПолучитьСтруктуруАдресногоЭлемента(КодЭлемента); + Если АдресныйЭлемент.ТипАдресногоЭлемента = ТипАдресногоЭлемента Тогда + ИмяАдресногоЭлемента = ПолучитьНазвание(АдресныйЭлемент); + КонецЕсли; + + Возврат ИмяАдресногоЭлемента; + +КонецФункции + +// Функция возвращает структуру с набором полей как у записи регистра сведений +// АдресныйКлассификатор с пустым набором значений +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Структура - структуру с набором полей как у записи регистра сведений +// АдресныйКлассификатор с пустым набором значений +// +Функция ПолучитьПустуюСтруктуруАдреса() + + Возврат Новый Структура("Код,Наименование,Сокращение,ТипАдресногоЭлемента,Индекс,КодАдресногоОбъектаВКоде,КодРайонаВКоде,КодГородаВКоде,КодНаселенногоПунктаВКоде,КодУлицыВКоде", 0, "", "", 0, "", 0, 0, 0, 0, 0); + +КонецФункции + +// Функция формирует строку с названием адресного элемента, +// которое состоит из наименования и сокращения +// +// Параметры: +// АдресныйЭлемент - элемент справочника Адресный классификатор. +// +// Возвращаемое значение: +// Название адресного элемента +// +Функция ПолучитьНазвание(АдресныйЭлемент) + + Если АдресныйЭлемент.Код = 0 Тогда + Возврат ""; + Иначе + Возврат СокрЛП(АдресныйЭлемент.Наименование) + " " + СокрЛП(АдресныйЭлемент.Сокращение) + КонецЕсли; + +КонецФункции + +// Процедура переносит строку из запроса в Структуру +Процедура ПеренестиСтрокуВыборкиВСтруктуру(РезультатЗапроса, СтрокаВыборки, СтруктураЭлемента) + + Если СтруктураЭлемента = Неопределено + ИЛИ РезультатЗапроса = Неопределено + ИЛИ СтрокаВыборки = Неопределено Тогда + Возврат; + КонецЕсли; + + СтруктураЭлемента.Очистить(); + Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл + СтруктураЭлемента.Вставить(Колонка.Имя, СтрокаВыборки[Колонка.Имя]); + КонецЦикла; + +КонецПроцедуры // ПеренестиСтрокуВыборкиВСтруктуру() + +// Функция создает структуру по строке выборки +Функция СоздатьСтруктуруПоСтрокеВыборки(РезультатЗапроса, СтрокаВыборки) + + РезультирующаяСтруктура = Новый Структура; + ПеренестиСтрокуВыборкиВСтруктуру(РезультатЗапроса, СтрокаВыборки, РезультирующаяСтруктура); + Возврат РезультирующаяСтруктура; + +КонецФункции + +// Функция по полному наименованию адресного элемента выдает отдельно его имя, и отдельно его адресное сокращение +Функция ПолучитьИмяИАдресноеСокращение(Знач СтрокаЭлемента, АдресноеСокращение) + + Буфер = СокрП(СтрокаЭлемента); + ПозицияПослПробела = Найти(Буфер, " "); + + Если ПозицияПослПробела = 0 Тогда + Возврат СтрокаЭлемента; + КонецЕсли; + + Пока СтрЧислоВхождений(Буфер, " ") > 1 Цикл + Буфер = Лев(Буфер, ПозицияПослПробела - 1) + "_" + Сред(Буфер, ПозицияПослПробела + 1); + ПозицияПослПробела = Найти(Буфер, " "); + КонецЦикла; + + ТекстЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | АдресныеСокращения.Сокращение + |ИЗ + | РегистрСведений.АдресныеСокращения КАК АдресныеСокращения + |ГДЕ + | АдресныеСокращения.Сокращение = &Сокращение"; + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Сокращение", Сред(СтрокаЭлемента, ПозицияПослПробела + 1)); + + Если Запрос.Выполнить().Пустой() Тогда + Возврат СтрокаЭлемента; + КонецЕсли; + + Если ПустаяСтрока(СокрЛП(Лев(СтрокаЭлемента, ПозицияПослПробела - 1))) Тогда + Возврат СтрокаЭлемента; + Иначе + АдресноеСокращение = Сред(СтрокаЭлемента, ПозицияПослПробела + 1); + Возврат Лев(СтрокаЭлемента, ПозицияПослПробела - 1); + КонецЕсли; + +КонецФункции + +// Процедура раскладывает код адресного элемента на составляющие: +// Код Региона, код района, код города, код населенного пункта, код улицы и код дома +Процедура РазложитьКодАдресногоЭлементаНаСоставляющие(Знач Код, КодАдресногоОбъекта, КодРайона, КодГорода, КодНаселенногоПункта, КодУлицы, КодДома) + + КодЭлемента = Код; + + КодАдресногоОбъекта = Цел(КодЭлемента / МаскаРегиона()); + КодЭлемента = КодЭлемента % МаскаРегиона(); + + КодРайона = Цел(КодЭлемента / МаскаРайона()); + КодЭлемента = КодЭлемента % МаскаРайона(); + + КодГорода = Цел(КодЭлемента / МаскаГорода()); + КодЭлемента = КодЭлемента % МаскаГорода(); + + КодНаселенногоПункта = Цел(КодЭлемента / МаскаНасПункта()); + КодЭлемента = КодЭлемента % МаскаНасПункта(); + + КодУлицы = Цел(КодЭлемента / МаскаУлицы()); + КодЭлемента = КодЭлемента % МаскаУлицы(); + + КодДома = Цел(КодЭлемента / МаскаДома()); + +КонецПроцедуры // РазложитьКодАдресногоЭлементаНаСоставляющие() + +// Функция ищет требуемый адресный элемент по названию и типу +// и возвращает первый найденный. В качестве дополнения может +// быть задан элемент "родитель" +// +// Параметры: +// НазваниеЭлемента - название адресного элемента ( с сокращением) +// ТипЭлемента - тип искомого адресного элемента +// ЭлементРодитель - элемент "родитель" +// +// Возвращаемое значение: +// Найденный элемент справочника Адресный классификатор или пустая ссылка в случае неудачи +// +Функция ПолучитьАдресныйЭлемент(НазваниеЭлемента, ТипЭлемента, КодЭлементаРодителя = 0) + + Перем КодАдресногоОбъекта, КодРайона, КодГорода, КодНаселенногоПункта, КодУлицы, КодДома; + + Если (СокрЛП(НазваниеЭлемента) = "") ИЛИ (ТипЭлемента = 0) Тогда + Возврат ПолучитьПустуюСтруктуруАдреса(); + КонецЕсли; + + // смотрим есть ли в имени адресное сокращение этого уровня + // если есть, то ищем по наименованию и адресному сокращению + АдресноеСокращение = ""; + НазваниеЭлемента = ПолучитьИмяИАдресноеСокращение(НазваниеЭлемента, АдресноеСокращение); + + Запрос = Новый Запрос(); + + ОграничениеПоКоду = ""; + Если КодЭлементаРодителя > 0 Тогда // проверка на соответствие подчинению родителю + ТипАдрЭлемента = ПолучитьТипАдресногоЭлемента(КодЭлементаРодителя); + МаскаРодителя = ПолучитьМаскуПоТипу(ТипАдрЭлемента); + + Если ТипАдрЭлемента <= 5 Тогда + + КодЭлемента = КодЭлементаРодителя; + + РазложитьКодАдресногоЭлементаНаСоставляющие(КодЭлемента, КодАдресногоОбъекта, КодРайона, КодГорода, КодНаселенногоПункта, КодУлицы, КодДома); + + Если КодАдресногоОбъекта <> 0 Тогда + ОграничениеПоКоду = ОграничениеПоКоду + Символы.ПС + " И (АдресныйКлассификатор.КодАдресногоОбъектаВКоде = &КодАдресногоОбъектаВКоде)"; + Запрос.УстановитьПараметр("КодАдресногоОбъектаВКоде", КодАдресногоОбъекта); + КонецЕсли; + + Если КодРайона <> 0 Тогда + ОграничениеПоКоду = ОграничениеПоКоду + Символы.ПС + " И (АдресныйКлассификатор.КодРайонаВКоде = &КодРайонаВКоде)"; + Запрос.УстановитьПараметр("КодРайонаВКоде", КодРайона); + КонецЕсли; + + Если КодГорода <> 0 Тогда + ОграничениеПоКоду = ОграничениеПоКоду + Символы.ПС + " И (АдресныйКлассификатор.КодГородаВКоде = &КодГородаВКоде)"; + Запрос.УстановитьПараметр("КодГородаВКоде", КодГорода); + КонецЕсли; + + Если КодНаселенногоПункта <> 0 Тогда + ОграничениеПоКоду = ОграничениеПоКоду + Символы.ПС + " И (АдресныйКлассификатор.КодНаселенногоПунктаВКоде = &КодНаселенногоПунктаВКоде)"; + Запрос.УстановитьПараметр("КодНаселенногоПунктаВКоде", КодНаселенногоПункта); + КонецЕсли; + + Если КодУлицы <> 0 Тогда + ОграничениеПоКоду = ОграничениеПоКоду + Символы.ПС + " И (АдресныйКлассификатор.КодУлицыВКоде = &КодУлицыВКоде)"; + Запрос.УстановитьПараметр("КодУлицыВКоде", КодУлицы); + КонецЕсли; + + Иначе + // ограничиваем по коду элемента + КонечноеЗначениеКода = КодЭлементаРодителя + МаскаРодителя - 1; + + ОграничениеПоКоду = Символы.ПС + " И (АдресныйКлассификатор.Код Между &НачальноеЗначениеКода И &КонечноеЗначениеКода)"; + Запрос.УстановитьПараметр("НачальноеЗначениеКода", КодЭлементаРодителя); + Запрос.УстановитьПараметр("КонечноеЗначениеКода", КонечноеЗначениеКода); + КонецЕсли; + + КонецЕсли; + + // ограничение на адресное сокращение + Если АдресноеСокращение <> "" Тогда + ОграничениеПоКоду = ОграничениеПоКоду + Символы.ПС + " И (АдресныйКлассификатор.Сокращение = &АдресноеСокращение)"; + Запрос.УстановитьПараметр("АдресноеСокращение", АдресноеСокращение); + КонецЕсли; + + Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 + | АдресныйКлассификатор.Код, + | АдресныйКлассификатор.КодАдресногоОбъектаВКоде, + | АдресныйКлассификатор.Наименование, + | АдресныйКлассификатор.Сокращение, + | АдресныйКлассификатор.Индекс, + | АдресныйКлассификатор.ТипАдресногоЭлемента, + | АдресныйКлассификатор.КодРайонаВКоде, + | АдресныйКлассификатор.КодГородаВКоде, + | АдресныйКлассификатор.КодНаселенногоПунктаВКоде, + | АдресныйКлассификатор.КодУлицыВКоде + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК АдресныйКлассификатор + | + |ГДЕ + | АдресныйКлассификатор.Наименование = &Наименование И + | АдресныйКлассификатор.ТипАдресногоЭлемента = &ТипАдресногоЭлемента " + + ОграничениеПоКоду; + + Запрос.УстановитьПараметр("Наименование", НазваниеЭлемента); + Запрос.УстановитьПараметр("ТипАдресногоЭлемента", ТипЭлемента); + + РезультатЗапроса = Запрос.Выполнить(); + + Если РезультатЗапроса.Пустой() Тогда + Возврат ПолучитьПустуюСтруктуруАдреса(); + КонецЕсли; + + Выборка = РезультатЗапроса.Выбрать(); + Выборка.Следующий(); + + Возврат СоздатьСтруктуруПоСтрокеВыборки(РезультатЗапроса, Выборка); + +КонецФункции + +// Процедура добавляет не нулевое значение кода в структуру +Процедура ДобавитьКодВСтруктуру(ДанныеСтруктуры, ИмяЭлемента, КодЭлемента, УровеньРодителя, УровеньЭлемента) + + Если (КодЭлемента <> 0) ИЛИ (УровеньРодителя >= УровеньЭлемента) Тогда + ДанныеСтруктуры.Вставить(ИмяЭлемента, КодЭлемента); + КонецЕсли; + +КонецПроцедуры + +//Функция по адресу возвращает структуру ограничений +Функция ПолучитьСтруктуруОграниченийПоАдресу(ПолеРегиона, ПолеРайона, ПолеГорода, ПолеНаселенногоПункта, ИмяУлицы, УровеньЭлемента) + + Если УровеньЭлемента > 1 Тогда + + КодРодителя = Неопределено; + СтруктураОграничений = ВернутьСтруктуруОграниченийПоРодителю(ПолеРегиона, ПолеРайона, ПолеГорода, ПолеНаселенногоПункта, ИмяУлицы, КодРодителя); + + Иначе + СтруктураОграничений = Новый Структура(); + КонецЕсли; + СтруктураОграничений.Вставить("ТипАдресногоЭлемента", УровеньЭлемента); + + Возврат СтруктураОграничений; + +КонецФункции + +// Функция определяет входимость числа в заданный диапазон +// При этом диапазон задается как это описано в комментарии к функции ЧислоВИнтервале +// +// Параметры: +// Номер - (число, строка) номер дома с корпусом +// Интервал - (строка), интервал чисел (домов) +// +// Возвращаемое значение: +// Истина - если заданное число входит в диапазон, +// Ложь - если не входит +// +Функция ВходитВИнтервал(Знач Номер, Интервал) + + Если ПустаяСтрока("" + Номер) Тогда + Возврат Ложь; + КонецЕсли; + + Если НЕ СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Номер, Ложь) Тогда + Возврат ВРЕГ(СтрЗаменить("" + Номер, " ", "")) = ВРЕГ(СтрЗаменить("" + Интервал, " ", "")); + КонецЕсли; + + Номер = Число(Номер); + + ТолькоЧислоИнтервал = СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Интервал, Ложь); + + Если ТолькоЧислоИнтервал Тогда + Если Номер = Число(Интервал) Тогда + Возврат Истина; + КонецЕсли; + КонецЕсли; + + Если Найти(Интервал,"Ч") > 0 Тогда // диапазон четных чисел + Интервал = СтрЗаменить(Интервал, "Ч", ""); + Четность = 2; + + ИначеЕсли Найти(Интервал,"Н") > 0 Тогда // диапазон нечетных чисел + Интервал = СтрЗаменить(Интервал, "Н", ""); + Четность = 1; + + ИначеЕсли (Найти(Интервал, "-") = 0) И ТолькоЧислоИнтервал Тогда + // интервал это дом представленный в виде строки + Возврат Ложь; + + Иначе + Четность=0; + + КонецЕсли; + + Интервал = СтрЗаменить(Интервал, ")", ""); // на всякий случай уберем скобки + Интервал = СтрЗаменить(Интервал, "(", ""); + Позиция = Найти(Интервал, "-"); + Попали = 0; + + Если Позиция <> 0 Тогда + МинЗначение = Число(Лев(Интервал, Позиция - 1)); + МаксЗначение = Число(Сред(Интервал, Позиция + 1)); + Если (Номер >= МинЗначение) И (Номер <= МаксЗначение) Тогда + Попали = 1; + КонецЕсли; + + ИначеЕсли ПустаяСтрока(Интервал) Тогда + // случай когда интервал был равен Ч или Н + Попали = 1; + + Иначе + Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Интервал, Ложь) Тогда + Если Номер = Число(Интервал) Тогда + Попали = 1; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если (Попали = 1) И ( + ((Четность = 2) И (Номер % 2 = 0)) ИЛИ + ((Четность = 1) И (Номер % 2 = 1)) ИЛИ + (Четность = 0)) Тогда + Возврат Истина; + + КонецЕсли; + + Возврат Ложь; + +КонецФункции // ВходитВИнтервал() + +// Функция определяет входимость: +// 1. Номера дома (представленного в виде строки) +// где Номер дома, это строка вида: +// <СтрокаДом> пример: 58А, 32/1, 50А/8 +// +// 2. Номера дома и номера корпуса (строения), в виде строки: +// <СтрокаДом>к<СтрокаКорпус>, пример: 32к1 это дом 32 корпус 1, +// <СтрокаДом>/<СтрокаКорпус>, пример: 32/1 это дом 32 корпус 1, +// <СтрокаДом>стр<СтрокаКорпус>, пример: 32стр1 это дом 32 корпус 1, +// +// 3. Числа (номера дома) в заданный интервал чисел +// При этом интервал задается строкой вида: +// <Диапазон>[,<Диапазон>] +// где Диапазон, это строка вида: +// [Ч/Н]<Число>[-<Число>] +// Префикс Ч или Н диапазона обозначает четность и нечетность входящих в него чисел +// Пример: в интервал Ч12-14,Н1-5,20-29 входят числа 1,3,5,12,14 и все с 20 по 29 +// +// Параметры: +// Номер - (число, строка) номер дома с корпусом +// Интервал - (строка), интервал чисел (домов) +// +// Истина - если заданное число входит в диапазон, +// Ложь - если не входит +// +Функция НомерДомаВИнтервале(Номер, Знач Интервал) + + Пока НЕ ПустаяСтрока(Интервал) Цикл + + Позиция = Найти(Интервал, ","); + Если Позиция = 0 Тогда + Возврат ВходитВИнтервал(Номер, Интервал); + Иначе + Если ВходитВИнтервал(Номер, СокрЛП(Лев(Интервал, Позиция - 1))) Тогда + Возврат Истина; + Иначе + Интервал = Сред(Интервал, Позиция + 1); + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции // НомерДомаВИнтервале() + +// Функция определяет индекс по переданным улице, дому и корпусу +// +// Параметры: +// Улица - элемент справочника адресный классификатор с требуемой улицей +// НомерДома - номер дома, для которого необходимо получить индекс +// НомерКорпуса - номер корпуса +// +// Возвращаемое значение: +// Строка - шестизначный почтовый индекс +// +Функция ПолучитьИндексПоУлицеДомуКорпусу(Улица, НомерДома, НомерКорпуса) + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Уровень", 6); + Запрос.УстановитьПараметр("НижнийКод", Цел(Улица.Код / 1000000) * 1000000); + Запрос.УстановитьПараметр("ВерхнийКод", Цел(Улица.Код / 1000000+ 1) * 1000000); + + Запрос.Текст = + "ВЫБРАТЬ + | АдресныйКлассификатор.Наименование, + | АдресныйКлассификатор.Индекс + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК АдресныйКлассификатор + | + |ГДЕ + | АдресныйКлассификатор.ТипАдресногоЭлемента = &Уровень И + | АдресныйКлассификатор.Код МЕЖДУ &НижнийКод И &ВерхнийКод"; + + + Выборка = Запрос.Выполнить().Выбрать(); + ИндексДома = ""; + + Пока Выборка.Следующий() Цикл + + Если НЕ ПустаяСтрока(Выборка.Индекс) Тогда + Интервал = Врег(СокрЛП(Выборка.Наименование)); + + Если НомерДомаВИнтервале(СокрЛП(НомерДома), Интервал) Тогда + ИндексДома = Выборка.Индекс; + + ИначеЕсли (НомерДомаВИнтервале(СокрЛП(НомерДома) + ?(НЕ ПустаяСтрока(НомерКорпуса), "К", "") + СокрЛП(НомерКорпуса), Интервал)) Тогда + Возврат Выборка.Индекс; + + ИначеЕсли (НомерДомаВИнтервале(СокрЛП(НомерДома) + ?(НЕ ПустаяСтрока(НомерКорпуса), "/", "") + СокрЛП(НомерКорпуса), Интервал)) Тогда + Возврат Выборка.Индекс; + + ИначеЕсли (НомерДомаВИнтервале(СокрЛП(НомерДома) + ?(НЕ ПустаяСтрока(НомерКорпуса), "стр", "") + СокрЛП(НомерКорпуса), Интервал)) Тогда + Возврат Выборка.Индекс; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Если ПустаяСтрока(ИндексДома) Тогда + Возврат Улица.Индекс; + Иначе + Возврат ИндексДома; + КонецЕсли; + +КонецФункции + +// Конец АдресныйКлассификатор + diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/УправлениеКонтактнойИнформациейКлассификаторы.mdo b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/УправлениеКонтактнойИнформациейКлассификаторы.mdo new file mode 100644 index 000000000..fce288b98 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/УправлениеКонтактнойИнформациейКлассификаторы.mdo @@ -0,0 +1,10 @@ + + + УправлениеКонтактнойИнформациейКлассификаторы + + ru + Управление контактной информацией классификаторы + + true + true + diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторыКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторыКлиент/Module.bsl new file mode 100644 index 000000000..43c182fd2 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторыКлиент/Module.bsl @@ -0,0 +1,9 @@ +// Открыть форму загрузки адресного классификатора. +// +Процедура ЗагрузитьАдресныйКлассификатор() Экспорт + + // АдресныйКлассификатор + АдресныйКлассификаторКлиент.ЗагрузитьАдресныйКлассификатор(); + // Конец АдресныйКлассификатор + +КонецПроцедуры diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторыКлиент/УправлениеКонтактнойИнформациейКлассификаторыКлиент.mdo b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторыКлиент/УправлениеКонтактнойИнформациейКлассификаторыКлиент.mdo new file mode 100644 index 000000000..1bd526dd2 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторыКлиент/УправлениеКонтактнойИнформациейКлассификаторыКлиент.mdo @@ -0,0 +1,10 @@ + + + УправлениеКонтактнойИнформациейКлассификаторыКлиент + + ru + Управление контактной информацией классификаторы клиент + + true + true + diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl new file mode 100644 index 000000000..1ea8a460a --- /dev/null +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl @@ -0,0 +1,154 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ СВЯЗАННЫХ С ТАБЛИЦЕЙ КОНТАКТНОЙ ИНФОРМАЦИИ НА ФОРМАХ + +// Событие ПриИзменении в колонке Представление таблицы контактной информации +Процедура ПредставлениеПриИзменении(Форма, Элемент) Экспорт + + СтрДанные = ПолучитьСтрокуДополнительныхЗначений(Форма, Элемент); + Если (СтрДанные <> Неопределено) И (СтрДанные.ТипНомер = 2) Тогда + Значение = Элемент.ТекстРедактирования; + ЗаполнитьПоляВЗаписиПоПредставлениюТелефон(Значение, СтрДанные.ЗначенияПолей); + КонецЕсли; + +КонецПроцедуры + +// Событие НачалоВыбора в колонке Представление таблицы контактной информации +Процедура ПредставлениеНачалоВыбора(Форма, Элемент, Модифицированность, СтандартнаяОбработка) Экспорт + + СтандартнаяОбработка = Ложь; + + СтрДанные = ПолучитьСтрокуДополнительныхЗначений(Форма, Элемент); + Если (СтрДанные = Неопределено) И (СтрДанные.ТипНомер = 0) Тогда + Возврат; + КонецЕсли; + + Если СтрДанные.ТипНомер = 1 Тогда + ИмяФормыРедактирования = "ОбщаяФорма.ВводАдреса"; + Иначе + ИмяФормыРедактирования = "ОбщаяФорма.ВводТелефона"; + КонецЕсли; + + Пар = Новый Структура; + Пар.Вставить("ЗначенияПолей", СтрДанные.ЗначенияПолей); + Пар.Вставить("Вид", СтрДанные.Вид); + Пар.Вставить("БылиВнесеныИзменения", Ложь); + Пар.Вставить("Представление", Элемент.ТекстРедактирования); + Пар.Вставить("РедактированиеТолькоВДиалоге", Не Элемент.РедактированиеТекста); + Пар.Вставить("АдресТолькоРоссийский", СтрДанные.ТолькоРоссийский); + + Результат = ОткрытьФормуМодально(ИмяФормыРедактирования, Пар); + + Если ТипЗнч(Результат) = Тип("Структура") Тогда + Форма[Элемент.Имя] = Результат.Представление; + СтрДанные.ЗначенияПолей = Результат.ЗначенияПолей; + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ + +Функция ПолучитьСтрокуДополнительныхЗначений(Форма, Элемент) + + Отбор = Новый Структура("ИмяРеквизита", Элемент.Имя); + Строки = Форма.__КИ_ОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); + + Возврат ?(Строки.Количество() = 0, Неопределено, Строки[0]); + +КонецФункции + +// По полю Представление заполнить остальные поля в записи для телефона +Процедура ЗаполнитьПоляВЗаписиПоПредставлениюТелефон(Представление, СписокПолей) + + текСтр = СокрЛП(Представление); + СписокПолей.Очистить(); + КодСтраны = ""; + КодГорода = ""; + НомерТелефона = ""; + Добавочный = ""; + Комментарий = ""; + + // вырежем добавочный номер с комментарием + ПозДоб = Найти(ВРЕГ(текСтр), "ДОБ."); + Если ПозДоб <> 0 Тогда + ДобавочныйСКомментарием = СокрЛП(Сред(текСтр, ПозДоб+4)); + + текСтр = СокрЛП(Лев(текСтр, ПозДоб-1)); + + Если Прав(текСтр, 1) = "," Тогда + текСтр = Лев(текСтр, СтрДлина(текСтр)-1); + КонецЕсли; + + ПозДоб = Найти(ВРЕГ(ДобавочныйСКомментарием), ", "); + + Если ПозДоб <> 0 Тогда + Добавочный = СокрЛП(Лев(ДобавочныйСКомментарием, ПозДоб-1)); + Комментарий = СокрЛП(Сред(ДобавочныйСКомментарием, ПозДоб+2)); + Иначе + Добавочный = ДобавочныйСКомментарием; + КонецЕсли; + + КонецЕсли; + + // вырежем код города + Поз = Найти(текСтр, "("); + Если Поз <> 0 Тогда + КодСтраны = СокрЛП(Лев(текСтр, Поз-1)); + + текСтр = СокрЛП(Сред(текСтр, Поз+1)); + Поз = Найти(текСтр, ")"); + + Если Поз <> 0 Тогда + КодГорода = СокрЛП(Лев(текСтр, Поз-1)); + текСтр = СокрЛП(Сред(текСтр, Поз+1)); + КонецЕсли; + КонецЕсли; + + Поз = Найти(текСтр, ", "); + // Если добавочного номера нет - ориентируемся по номеру телефона и комментарию + Если ПозДоб = 0 И Поз <> 0 Тогда + // вырежем комментарий + НомерТелефона = СокрЛП(Лев(текСтр, Поз-1)); + Комментарий = СокрЛП(Сред(текСтр, Поз+2)); + Иначе + // все оставшееся это номер + НомерТелефона = текСтр; + КонецЕсли; + + // Поправим представление + Представление = СформироватьПредставлениеТелефона(КодСтраны, КодГорода, НомерТелефона, Добавочный, Комментарий); + СписокПолей.Добавить(КодСтраны, "КодСтраны"); + СписокПолей.Добавить(КодГорода, "КодГорода"); + СписокПолей.Добавить(НомерТелефона, "НомерТелефона"); + СписокПолей.Добавить(Добавочный, "Добавочный"); + СписокПолей.Добавить(Комментарий, "Комментарий"); + +КонецПроцедуры + +// Процедура формирует строковое представление телефона +Функция СформироватьПредставлениеТелефона(КодСтраны, КодГорода, НомерТелефона, Добавочный, Комментарий) Экспорт + + Представление = СокрЛП(КодСтраны); + + Если Не ПустаяСтрока(КодГорода) Тогда + Представление = Представление + ?(ПустаяСтрока(Представление), "", " ") + "(" + СокрЛП(КодГорода) + ")"; + КонецЕсли; + + Если Не ПустаяСтрока(НомерТелефона) Тогда + Представление = Представление + ?(ПустаяСтрока(Представление), "", " ") + СокрЛП(НомерТелефона); + КонецЕсли; + + Если НЕ ПустаяСтрока(Добавочный) Тогда + Представление = Представление + ?(ПустаяСтрока(Представление), "", ", ") + "доб. " + СокрЛП(Добавочный); + КонецЕсли; + + Если НЕ ПустаяСтрока(Комментарий) Тогда + Представление = Представление + ?(ПустаяСтрока(Представление), "", ", ") + СокрЛП(Комментарий); + КонецЕсли; + + Возврат Представление; + +КонецФункции diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/УправлениеКонтактнойИнформациейКлиент.mdo b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/УправлениеКонтактнойИнформациейКлиент.mdo new file mode 100644 index 000000000..60de67884 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/УправлениеКонтактнойИнформациейКлиент.mdo @@ -0,0 +1,11 @@ + + + УправлениеКонтактнойИнформациейКлиент + + ru + Управление контактной информацией клиент + + true + true + true + diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/Module.bsl new file mode 100644 index 000000000..b81da6802 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/Module.bsl @@ -0,0 +1,46 @@ + +// Процедура обновления ИБ для справочника видов контактной информации. +// +// Инструкция: +// Для каждого объекта, владельца КИ, для каждого соответствующего ему вида КИ добавить +// строчку вида: УправлениеКонтактнойИнформацией.ОбновитьВидКИ(.....). При этом, +// важен порядок в котором будут осуществляться эти вызовы, чем раньше вызов для вида КИ, +// тем выше этот вид КИ будет располагаться на форме объекта. +// +// Параметры функции УправлениеКонтактнойИнформацией.ОбновитьВидКИ: +// 1. Вид КИ - Ссылка на предопределенный вид КИ. +// 2. Тип КИ - Ссылка на перечисление +// 3. МожноИзменятьСпособРедактирования - Определяет, можно ли в режиме Предприятие изменить способ редактирования, +// например, для адресов, которые попадают в регл. отчетность, нужно +// запретить возможность изменения. +// 4. РедактированиеТолькоВДиалоге - Если установить Истина, то будет значение вида КИ можно будет +// редактировать только в форме ввода (имеет смысл только для +// адресов, телефонов и факсов). +// 5. АдресТолькоРоссийский - Если установить Истина, то для адресов можно будет ввести +// только российский адрес (имеет смысл только для адресов). +// +// +Процедура КонтактнаяИнформацияОбновлениеИБ() Экспорт + + // СтандартныеПодсистемы + + // Справочник "Пользователи" + УправлениеКонтактнойИнформацией.ОбновитьВидКИ(Справочники.ВидыКонтактнойИнформации.EmailПользователя, Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты, Истина, Ложь, Ложь); + + // Организации + + // Справочник "Организации" + УправлениеКонтактнойИнформацией.ОбновитьВидКИ(Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации, Перечисления.ТипыКонтактнойИнформации.Адрес, Истина, Ложь, Истина); + УправлениеКонтактнойИнформацией.ОбновитьВидКИ(Справочники.ВидыКонтактнойИнформации.ФактАдресОрганизации, Перечисления.ТипыКонтактнойИнформации.Адрес, Истина, Ложь, Ложь); + УправлениеКонтактнойИнформацией.ОбновитьВидКИ(Справочники.ВидыКонтактнойИнформации.ТелефонОрганизации, Перечисления.ТипыКонтактнойИнформации.Телефон, Истина, Ложь, Ложь); + УправлениеКонтактнойИнформацией.ОбновитьВидКИ(Справочники.ВидыКонтактнойИнформации.ФаксОрганизации, Перечисления.ТипыКонтактнойИнформации.Факс, Истина, Ложь, Ложь); + УправлениеКонтактнойИнформацией.ОбновитьВидКИ(Справочники.ВидыКонтактнойИнформации.EmailОрганизации, Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты, Истина, Ложь, Ложь); + УправлениеКонтактнойИнформацией.ОбновитьВидКИ(Справочники.ВидыКонтактнойИнформации.ПочтовыйАдресОрганизации, Перечисления.ТипыКонтактнойИнформации.Адрес, Истина, Ложь, Ложь); + УправлениеКонтактнойИнформацией.ОбновитьВидКИ(Справочники.ВидыКонтактнойИнформации.ДругаяИнформацияОрганизации, Перечисления.ТипыКонтактнойИнформации.Другое, Истина, Ложь, Ложь); + // Конец Организации + + // Конец СтандартныеПодсистемы + + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/УправлениеКонтактнойИнформациейПереопределяемый.mdo b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/УправлениеКонтактнойИнформациейПереопределяемый.mdo new file mode 100644 index 000000000..0cfd33faa --- /dev/null +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/УправлениеКонтактнойИнформациейПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + УправлениеКонтактнойИнформациейПереопределяемый + + ru + Управление контактной информацией переопределяемый + + true + true + diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСобытия/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСобытия/Module.bsl new file mode 100644 index 000000000..10e08fd93 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСобытия/Module.bsl @@ -0,0 +1,28 @@ +Процедура ОбработкаЗаполненияКИ(Источник, ДанныеЗаполнения, СтандартнаяОбработка) Экспорт + + Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + // Заполним наименование + Наименование = ""; + Если ДанныеЗаполнения.Свойство("Наименование", Наименование) Тогда + Источник.Наименование = Наименование; + КонецЕсли; + + // Заполним контактную информацию + КонтактнаяИнформация = Неопределено; + Если ДанныеЗаполнения.Свойство("КонтактнаяИнформация", КонтактнаяИнформация) Тогда + Для Каждого Стр Из КонтактнаяИнформация Цикл + + новСтр = Источник.КонтактнаяИнформация.Добавить(); + ЗаполнитьЗначенияСвойств(новСтр, Стр); + + Если ТипЗнч(Стр.ЗначенияПолей) = Тип("СписокЗначений") Тогда + новСтр.ЗначенияПолей = Новый ХранилищеЗначения(Стр.ЗначенияПолей); + КонецЕсли; + + КонецЦикла; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСобытия/УправлениеКонтактнойИнформациейСобытия.mdo b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСобытия/УправлениеКонтактнойИнформациейСобытия.mdo new file mode 100644 index 000000000..c62c6f552 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСобытия/УправлениеКонтактнойИнформациейСобытия.mdo @@ -0,0 +1,12 @@ + + + УправлениеКонтактнойИнформациейСобытия + + ru + Управление контактной информацией события + + true + true + true + true + diff --git a/SSL/src/CommonModules/УправлениеПечатью/Module.bsl b/SSL/src/CommonModules/УправлениеПечатью/Module.bsl new file mode 100644 index 000000000..e5157d38c --- /dev/null +++ b/SSL/src/CommonModules/УправлениеПечатью/Module.bsl @@ -0,0 +1,320 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ, ФОРМИРУЮЩИЕ РЕЗУЛЬТАТЫ ДЛЯ КОМАНД ПЕЧАТИ + +// Сформировать печатные формы +Процедура СформироватьПечатныеФормы(ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов, ПараметрыПечати, + КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт + + // Получим менеджер печати + МенеджерПечати = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяМенеджераПечати); + + // Подготовим коллекцию для формируемых печатных форм + КоллекцияПечатныхФорм = ПодготовитьКоллекциюПечатныхФорм(ИменаМакетов); + + // Подготовим структуру параметров вывода + ПараметрыВывода = ПодготовитьСтруктуруПараметровВывода(); + + ОбъектыПечати = Новый СписокЗначений; + + // Сформируем печатные формы + МенеджерПечати.Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода); + + // Проверим, все ли макеты были сформированы + Для Каждого Стр Из КоллекцияПечатныхФорм Цикл + Если Стр.ТабличныйДокумент = Неопределено Тогда + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В обработчике печати не был сформирован табличный документ для: %1'"), + Стр.ИмяМакета); + ВызватьИсключение(ТекстСообщенияОбОшибке); + КонецЕсли; + + Стр.ТабличныйДокумент.КоличествоЭкземпляров = Стр.Экземпляров; + КонецЦикла; + +КонецПроцедуры + +// Сформировать печатные формы для непосредственного вывода на принтер +Процедура СформироватьПечатныеФормыДляБыстройПечати( + ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов, ПараметрыПечати, + ТабличныеДокументы, ОбъектыПечати, ПараметрыВывода, Отказ) Экспорт + + Если НЕ ПравоДоступа("Вывод", Метаданные) Тогда + Отказ = Истина; + Возврат; + Иначе + Отказ = Ложь; + КонецЕсли; + + КоллекцияПечатныхФорм = Неопределено; + ОбъектыПечати = Новый СписокЗначений; + + СформироватьПечатныеФормы(ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов, ПараметрыПечати, + КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода); + + ТабличныеДокументы = Новый СписокЗначений; + + Для Каждого Стр Из КоллекцияПечатныхФорм Цикл + Если (ТипЗнч(Стр.ТабличныйДокумент) = Тип("ТабличныйДокумент")) И (Стр.ТабличныйДокумент.ВысотаТаблицы <> 0) Тогда + ТабличныеДокументы.Добавить(Стр.ТабличныйДокумент, Стр.СинонимМакета); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Сформировать печатные формы для непосредственного вывода на принтер +// в серверном режиме в обычном приложении +Процедура СформироватьПечатныеФормыДляБыстройПечатиОбычноеПриложение( + ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов, ПараметрыПечати, + Адрес, ОбъектыПечати, ПараметрыВывода, Отказ) Экспорт + + Перем ОбъектыПечатиСЗ, ТабличныеДокументы; + + СформироватьПечатныеФормыДляБыстройПечати( + ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов, ПараметрыПечати, + ТабличныеДокументы, ОбъектыПечатиСЗ, ПараметрыВывода, Отказ); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + ОбъектыПечати = Новый Соответствие; + + Для Каждого ОбъектПечати Из ОбъектыПечатиСЗ Цикл + ОбъектыПечати.Вставить(ОбъектПечати.Представление, ОбъектПечати.Значение); + КонецЦикла; + + Адрес = ПоместитьВоВременноеХранилище(ТабличныеДокументы); + +КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// ФУНКЦИИ И ПРОЦЕДУРЫ, ИСПОЛЬЗУЕМЫЕ МОДУЛЯМИ МЕНЕДЖЕРОВ ОБЪЕКТОВ ПРИ ФОРМИРОВАНИИ ТАБЛИЧНЫХ ДОКУМЕНТОВ + +// Проверить, нужно ли печатать макет +Функция НужноПечататьМакет(КоллекцияПечатныхФорм, ИмяМакета) Экспорт + + Возврат КоллекцияПечатныхФорм.Найти(ВРег(ИмяМакета), "ИмяВРЕГ") <> Неопределено; + +КонецФункции + +// Вывести табличный документ в коллекцию печатных форм +Процедура ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, ИмяМакета, СинонимМакета, ТабличныйДокумент, Картинка = Неопределено, ПолныйПутьКМакету = "") Экспорт + + Стр = КоллекцияПечатныхФорм.Найти(ВРег(ИмяМакета), "ИмяВРЕГ"); + + Если Стр <> Неопределено Тогда + Стр.ТабличныйДокумент = ТабличныйДокумент; + Стр.СинонимМакета = СинонимМакета; + Стр.Картинка = Картинка; + Стр.ПолныйПутьКМакету = ПолныйПутьКМакету; + КонецЕсли; + +КонецПроцедуры + +// Задать область печати объекта в табличном документе. +// Применяется для связывания области в табличном документе, с объектом печати (ссылка). +// Необходимо вызывать при формировании очередной области печатной формы в табличном +// документе. +// Параметры: +// ТабличныйДокумент - табличный документ - табличный документ печатной формы +// НомерСтрокиНачало - число - позиция начала очередной области в документе +// ОбъектыПечати - СписокЗначений - список объектов печати +// Ссылка - ссылка на объект ИБ - объект печати +// +Процедура ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, Ссылка) Экспорт + + Элемент = ОбъектыПечати.НайтиПоЗначению(Ссылка); + Если Элемент = Неопределено Тогда + ИмяОбласти = "Документ_" + Формат(ОбъектыПечати.Количество() + 1, "ЧН=; ЧГ="); + ОбъектыПечати.Добавить(Ссылка, ИмяОбласти); + Иначе + ИмяОбласти = Элемент.Представление; + КонецЕсли; + + НомерСтрокиОкончание = ТабличныйДокумент.ВысотаТаблицы; + ТабличныйДокумент.Область(НомерСтрокиНачало, , НомерСтрокиОкончание, ).Имя = ИмяОбласти; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ НЕЭКСПОРТНЫЕ ФУНКЦИИ + +// Подготовить коллекцию печатных форм - таблицу значений используемые при формировании печатных форм +// +Функция ПодготовитьКоллекциюПечатныхФорм(ИменаМакетов) Экспорт + + Макеты = Новый ТаблицаЗначений; + Макеты.Колонки.Добавить("ИмяМакета"); + Макеты.Колонки.Добавить("ИмяВРЕГ"); + Макеты.Колонки.Добавить("СинонимМакета"); + Макеты.Колонки.Добавить("ТабличныйДокумент"); + Макеты.Колонки.Добавить("Экземпляров"); + Макеты.Колонки.Добавить("Картинка"); + Макеты.Колонки.Добавить("ПолныйПутьКМакету"); + + СтрИмен = СтрЗаменить(ИменаМакетов, ",", Символы.ПС); + Для Сч = 1 По СтрЧислоСтрок(СтрИмен) Цикл + Имя = СтрПолучитьСтроку(СтрИмен, Сч); + Стр = Макеты.Найти(Имя, "ИмяМакета"); + Если Стр = Неопределено Тогда + Стр = Макеты.Добавить(); + Стр.ИмяМакета = Имя; + Стр.ИмяВРЕГ = ВРег(Имя); + Стр.Экземпляров = 1; + Иначе + Стр.Экземпляров = Стр.Экземпляров + 1; + КонецЕсли; + КонецЦикла; + + Возврат Макеты; + +КонецФункции + +// Подготовить структуру параметров вывода для менеджера объекта формирующего печатные формы +// +Функция ПодготовитьСтруктуруПараметровВывода() Экспорт + + ПараметрыВывода = Новый Структура; + ПараметрыВывода.Вставить("ДоступнаПечатьПоКомплектно", Ложь); + ПараметрыВывода.Вставить("ПолучательЭлектронногоПисьма", Неопределено); + ПараметрыВывода.Вставить("ОтправительЭлектронногоПисьма", Неопределено); + + Возврат ПараметрыВывода; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ ФУНКЦИОНАЛЬНОСТИ ДЛЯ РАБОТЫ С ШАБЛОНАМИ ОФИСНЫХ ДОКУМЕНТОВ + +// Добавляет к параметру НаборОбластей новую запись об области +// Параметры +// НаборОбластей - массив - набор областей (массив структур) +// ИмяОбласти - строка - имя добавляемой области +// ТипОбласти - строка - тип области: +// ВерхнийКолонтитул +// НижнийКолонтитул +// Общая +// СтрокаТаблицы +// Список +// +Процедура ДобавитьОписаниеОбласти(НаборОбластей, знач ИмяОбласти, знач ТипОбласти) Экспорт + + НоваяОбласть = Новый Структура; + + НоваяОбласть.Вставить("ИмяОбласти", ИмяОбласти); + НоваяОбласть.Вставить("ТипОбласти", ТипОбласти); + + НаборОбластей.Вставить(ИмяОбласти, НоваяОбласть); + +КонецПроцедуры + +// Интерфейс для вызова из клиентских модулей печати форм по макетам офисных документов. +// Получает за один вызов всю необходимую информацию: данные объектов по макетам, двоичные +// данные макетов, описание областей макетов. +// Параметры: +// ИмяМенеджераПечати - строка - имя для обращения к менеджеру объекта, например "Документ.<Имя документа>" +// ИменаМакетов - строка - имена макетов, по которым будут формироваться печатные формы +// СоставДокументов - массив ссылок - ссылки на объекты информационной базы (должны быть одного типа) +// +Функция ПолучитьМакетыИДанныеОбъектов(знач ИмяМенеджераПечати, + знач ИменаМакетов, + знач СоставДокументов) Экспорт + + МассивИменМакетов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрЗаменить(ИменаМакетов, " ", ""), ","); + + МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяМенеджераПечати); + МакетыИДанные = МенеджерОбъекта.ПолучитьДанныеПечати(СоставДокументов, МассивИменМакетов); + МакетыИДанные.Вставить("ЛокальныйКаталогФайловПечати", ПолучитьЛокальныйКаталогФайловПечати()); + + Возврат МакетыИДанные; + +КонецФункции + +// Возвращает макет по полному пути к макету. +// Параметры: +// ПолныйПутьКМакету - Строка - формат полного пути: +// "Документ.<ИмяДокумента>.<ИмяМакета>" +// "Обработка.<ИмяОбработки>.<ИмяМакета>" +// "ОбщийМакет.<ИмяМакета>" +// Возвращаемое значение: +// для макета типа MXL - табличный документ +// для макетов DOC и ODT - двоичные данные +// +Функция ПолучитьМакет(ПолныйПутьКМакету) Экспорт + + ЧастиПути = СтрЗаменить(ПолныйПутьКМакету, ".", Символы.ПС); + + Если СтрЧислоСтрок(ЧастиПути) = 3 Тогда + ПутьКМетаданным = СтрПолучитьСтроку(ЧастиПути, 1) + "." + СтрПолучитьСтроку(ЧастиПути, 2); + ПутьКОбъектуМетаданных = СтрПолучитьСтроку(ЧастиПути, 3); + ИначеЕсли СтрЧислоСтрок(ЧастиПути) = 2 Тогда + ПутьКМетаданным = СтрПолучитьСтроку(ЧастиПути, 1); + ПутьКОбъектуМетаданных = СтрПолучитьСтроку(ЧастиПути, 2); + Иначе + ВызватьИсключение НСтр("ru = 'Некорректные параметры функции.'"); + КонецЕсли; + + Запрос = Новый Запрос; + + Запрос.Текст = "Выбрать Макет КАК Макет, Использование КАК Использование + |ИЗ + | РегистрСведений.ПользовательскиеМакетыПечати + |ГДЕ + | Объект=&Объект + | И ИмяМакета=&ИмяМакета + | И Использование"; + + Запрос.Параметры.Вставить("Объект", ПутьКМетаданным); + Запрос.Параметры.Вставить("ИмяМакета", ПутьКОбъектуМетаданных); + + УстановитьПривилегированныйРежим(Истина); + + Выборка = Запрос.Выполнить().Выбрать(); + + УстановитьПривилегированныйРежим(Ложь); + + Если Выборка.Следующий() Тогда + Результат = Выборка.Макет.Получить(); + Если Найти(ПутьКОбъектуМетаданных, "ПФ_MXL") Тогда + Результат = ПолучитьТабличныйДокументПоДвоичнымДанным(Результат); + КонецЕсли; + Иначе + Если СтрЧислоСтрок(ЧастиПути) = 3 Тогда + Результат = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПутьКМетаданным).ПолучитьМакет(ПутьКОбъектуМетаданных); + Иначе + Результат = ПолучитьОбщийМакет(ПутьКОбъектуМетаданных); + КонецЕсли; + КонецЕсли; + + Если Результат = Неопределено Тогда + ВызватьИсключение "Некорректные данные пользовательского макета"; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьТабличныйДокументПоДвоичнымДанным(ДвоичныеДанные) Экспорт + + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); + ДвоичныеДанные.Записать(ИмяВременногоФайла); + ТабличныйДокумент = Новый ТабличныйДокумент; + ТабличныйДокумент.Прочитать(ИмяВременногоФайла); + УдалитьФайлы(ИмяВременногоФайла); + + Возврат ТабличныйДокумент; + +КонецФункции + +Функция ПолучитьЛокальныйКаталогФайловПечати() Экспорт + + Значение = ХранилищеОбщихНастроек.Загрузить("ЛокальныйКаталогФайловПечати"); + Возврат ?(Значение = Неопределено, "", Значение); + +КонецФункции + +Процедура СохранитьЛокальныйКаталогФайловПечати(Каталог) Экспорт + + ХранилищеОбщихНастроек.Сохранить("ЛокальныйКаталогФайловПечати", , Каталог); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/УправлениеПечатью/УправлениеПечатью.mdo b/SSL/src/CommonModules/УправлениеПечатью/УправлениеПечатью.mdo new file mode 100644 index 000000000..2f17d776a --- /dev/null +++ b/SSL/src/CommonModules/УправлениеПечатью/УправлениеПечатью.mdo @@ -0,0 +1,10 @@ + + + УправлениеПечатью + + ru + Управление печатью + + true + true + diff --git a/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl new file mode 100644 index 000000000..0b8c3194d --- /dev/null +++ b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl @@ -0,0 +1,564 @@ +////////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ ФУНКЦИОНАЛЬНОСТИ ДЛЯ РАБОТЫ С ШАБЛОНАМИ ОФИСНЫХ ДОКУМЕНТОВ + +// Описание структур данных: +// +// Handler - структура используемая для связи с COM объектами +// - COMСоединение - COMОбъект +// - Тип - строка - либо "DOC" либо "odt" +// - ИмяФайла - строка - имя файла шаблона (заполняется только для шаблона) +// - ТипПоследнегоВывода - тип последней выводимой области +// - (см. ТипОбласти) +// +// Область в документе +// - COMСоединение - COMОбъект +// - Тип - строка - либо "DOC" либо "odt" +// - Start - позиция начала области +// - End - позиция окончания области +// + +//////////////////////////////////////////////////////////////////////////////// +// Экспортные функции + +// Создаем COM соединение с COM объектом Word.Application, создает в нем +// единственный документ. Подготавливает +// +Функция ИнициализироватьПечатнуюФормуMSWord(НастройкиСтраницыМакета) Экспорт + + Handler = Новый Структура("Тип", "DOC"); + + Попытка + COMОбъект = Новый COMОбъект("Word.Application"); + Исключение + СообщениеОбОшибке = НСтр("ru = 'Не удалось сформировать печатную форму документа. Убедитесь, что на компьютере установлена программа Microsoft Word. Подробности: '") + + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ВызватьИсключение СообщениеОбОшибке; + КонецПопытки; + + Handler.Вставить("COMСоединение", COMОбъект); + + Попытка + COMОбъект.Documents.Add(); + Исключение + COMОбъект.Quit(0); + COMОбъект = 0; + Handler.COMОбъект = 0; + + СообщениеОбОшибке = НСтр("ru = 'Не удалось сформировать печатную форму документа. Подробности: '") + + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ВызватьИсключение СообщениеОбОшибке; + КонецПопытки; + + Для Каждого Настройка Из НастройкиСтраницыМакета Цикл + Попытка + COMОбъект.ActiveDocument.PageSetup[Настройка.Ключ] = Настройка.Значение; + Исключение + // глухая попытка..исключение на случай, если те, или иные настройки + // не поддерживаются данной версией программы + КонецПопытки; + КонецЦикла; + + Возврат Handler; + +КонецФункции + +// Создает COM соединение с COM объектом Word.Application и открывает +// в нем макет. Файл макета сохраняется на основе двоичных данных +// переданных в параметрах функции. +// +// Параметры: +// ДвоичныеДанныеМакета - ДвоичныеДанные - двоичные данные макета +// Возвращаемое значение: +// структура - ссылка макет +// +Функция ПолучитьМакетMSWord(знач ДвоичныеДанныеМакета, знач ИмяВременногоФайла = "") Экспорт + + Handler = Новый Структура("Тип", "DOC"); + + Попытка + COMОбъект = Новый COMОбъект("Word.Application"); + Исключение + ВызватьИсключение(НСтр("ru = 'Ошибка работы с приложением MS Word. Необходимо проверить правильность установки приложения.'")); + КонецПопытки; + +#Если НЕ ВебКлиент Тогда + ИмяВременногоФайла = ПолучитьИмяВременногоФайла("DOC"); + ДвоичныеДанныеМакета.Записать(ИмяВременногоФайла); +#КонецЕсли + + Попытка + COMОбъект.Documents.Open(ИмяВременногоФайла); + Исключение + COMОбъект.Quit(0); + COMОбъект = 0; + Handler.COMОбъект = 0; + УдалитьФайлы(ИмяВременногоФайла); + ВызватьИсключение(НСтр("ru = 'Ошибка при открытии шаблона.'")+КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Handler.Вставить("COMСоединение", COMОбъект); + Handler.Вставить("ИмяФайла", ИмяВременногоФайла); + Handler.Вставить("ЭтоМакет", Истина); + + Handler.Вставить("НастройкиСтраницыМакета", Новый Соответствие); + + Для Каждого ИмяНастройки Из НастройкиПараметровСтраницы() Цикл + Попытка + Handler.НастройкиСтраницыМакета.Вставить(ИмяНастройки, COMОбъект.ActiveDocument.PageSetup[ИмяНастройки]); + Исключение + // глухая попытка..исключение на случай, если те, или иные настройки + // не поддерживаются данной версией программы + КонецПопытки; + КонецЦикла; + + Возврат Handler; + +КонецФункции + +// Закрывает соединение с COM объектом Word.Application +// Параметры: +// Handler - ссылка на печатную форму или макет +// ЗакрытьПриложение - булево - требуется ли закрыть приложение +// +Процедура ЗакрытьСоединение(Handler, знач ЗакрытьПриложение) Экспорт + + Если ЗакрытьПриложение Тогда + Handler.COMСоединение.Quit(0); + КонецЕсли; + + Handler.COMСоединение = 0; + + Если Handler.Свойство("ИмяФайла") Тогда + УдалитьФайлы(Handler.ИмяФайла); + КонецЕсли; + +КонецПроцедуры + +// Устанавливает свойство видимости у приложения MS Word +// Handler - ссылка на печатную форму +// +Процедура ПоказатьДокументMSWord(знач Handler) Экспорт + + COMСоединение = Handler.COMСоединение; + COMСоединение.Application.Visible = Истина; + COMСоединение.Activate(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Функции для получения областей из макета + +// Получает область из макета. +// Параметры +// Handler - ссылка на макет +// ИмяОбласти - имя области в макете +// СмещениеНачало - смещение относительно начала области +// смещение по умолчанию: 1 - означает что область берется без символа +// перевода строки, за операторной скобкой открытия области +// СмещениеОкончание - смещение относительно окончания области, +// смещение по умолчанию: -11 - означает что область берется без символа +// перевода строки, перед операторной скобкой закрытия области +// +Функция ПолучитьОбластьМакетаMSWord(знач Handler, + знач ИмяОбласти, + знач СмещениеНачало = 1, + знач СмещениеОкончание = -1) Экспорт + + Результат = Новый Структура("Document,Start,End"); + + ПозицияНачало = СмещениеНачало + ПолучитьПозициюНачалаОбласти(Handler.COMСоединение, ИмяОбласти); + ПозицияОкончание = СмещениеОкончание + ПолучитьПозициюОкончанияОбласти(Handler.COMСоединение, ИмяОбласти); + + Результат.Document = Handler.COMСоединение.ActiveDocument; + Результат.Start = ПозицияНачало; + Результат.End = ПозицияОкончание; + + Возврат Результат; + +КонецФункции + +// Получает область верхнего колонтитула первой области макета +// Параметры +// Handler - ссылка на макет +// Возвращаемое значение +// ссылка на верхний колонтитул +// +Функция ПолучитьОбластьВерхнегоКолонтитула(знач Handler) Экспорт + + Возврат Новый Структура("Header", Handler.COMСоединение.ActiveDocument.Sections(1).Headers.Item(1)); + +КонецФункции + +// Получает область нижнего колонтитула первой области макета +// Параметры +// Handler - ссылка на макет +// Возвращаемое значение +// ссылка на нижний колонтитул +// +Функция ПолучитьОбластьНижнегоКолонтитула(Handler) Экспорт + + Возврат Новый Структура("Footer", Handler.COMСоединение.ActiveDocument.Sections(1).Footers.Item(1)); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Функции для добавления областей к печатной форме + +// начало: функции работы с колонтитулами документа MS Word + +// Добавляет нижний колонтитул в печатную форму из макета. +// Параметры +// ПечатнаяФорма - ссылка на печатную форму +// ОбластьHandler - ссылка на область в макете +// Параметры - список параметров для замены на значения +// ДанныеОбъекта - данные объекта для заполнения +// +Процедура ДобавитьНижнийКолонтитул(знач ПечатнаяФорма, + знач ОбластьHandler) Экспорт + + ОбластьHandler.Footer.Range.Copy(); + ПечатнаяФорма.COMСоединение.ActiveDocument.Sections(1).Footers.Item(1).Range.Paste(); + +КонецПроцедуры + +// Добавляет верхний колонтитул в печатную форму из макета. +// Параметры +// ПечатнаяФорма - ссылка на печатную форму +// ОбластьHandler - ссылка на область в макете +// Параметры - список параметров для замены на значения +// ДанныеОбъекта - данные объекта для заполнения +// +Процедура ЗаполнитьПараметрыНижнегоКолонтитула(знач ПечатнаяФорма, + знач ДанныеОбъекта = Неопределено) Экспорт + + Для Каждого ПараметрЗначение Из ДанныеОбъекта Цикл + Если ТипЗнч(ПараметрЗначение.Значение) <> Тип("Массив") Тогда + ВыполнитьЗаменуВНижнемКолонтитуле(ПечатнаяФорма.COMСоединение, + ПараметрЗначение.Ключ, + ПараметрЗначение.Значение); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Функция ВыполнитьЗаменуВНижнемКолонтитуле(COMСоединение, ТекстДляПоиска, ТекстЗамены) + + Range = COMСоединение.ActiveDocument.Sections(1).Footers.Item(1).Range; + Поиск = Range.Find; + Поиск.ClearFormatting(); + Поиск.Execute("{v8 " + ТекстДляПоиска + "}"); + Если Поиск.Found Тогда + Range.Text = ТекстЗамены; + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Добавляет верхний колонтитул в печатную форму из макета. +// Параметры +// ПечатнаяФорма - ссылка на печатную форму +// ОбластьHandler - ссылка на область в макете +// Параметры - список параметров для замены на значения +// ДанныеОбъекта - данные объекта для заполнения +// +Процедура ДобавитьВерхнийКолонтитул(знач ПечатнаяФорма, + знач ОбластьHandler) Экспорт + + ОбластьHandler.Header.Range.Copy(); + ПечатнаяФорма.COMСоединение.ActiveDocument.Sections(1).Headers.Item(1).Range.Paste(); + +КонецПроцедуры + +// Добавляет верхний колонтитул в печатную форму из макета. +// Параметры +// ПечатнаяФорма - ссылка на печатную форму +// ОбластьHandler - ссылка на область в макете +// Параметры - список параметров для замены на значения +// ДанныеОбъекта - данные объекта для заполнения +// +Процедура ЗаполнитьПараметрыВерхнегоКолонтитула(знач ПечатнаяФорма, + знач ДанныеОбъекта = Неопределено) Экспорт + + Для Каждого ПараметрЗначение Из ДанныеОбъекта Цикл + Если ТипЗнч(ПараметрЗначение.Значение) <> Тип("Массив") Тогда + ВыполнитьЗаменуВВерхнемКолонтитуле(ПечатнаяФорма.COMСоединение, + ПараметрЗначение.Ключ, + ПараметрЗначение.Значение); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Функция ВыполнитьЗаменуВВерхнемКолонтитуле(COMСоединение, ТекстДляПоиска, ТекстЗамены) + + Range = COMСоединение.ActiveDocument.Sections(1).Headers.Item(1).Range; + Поиск = Range.Find; + Поиск.ClearFormatting(); + Поиск.Execute("{v8 " + ТекстДляПоиска + "}"); + Если Поиск.Found Тогда + Range.Text = ТекстЗамены; + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// конец: функции работы с колонтитулами документа MS Word + +// Добавляет область в печатную форму из макета, при этом заменяя +// параметры в области значениями из данных объекта. +// Применяется при одиночном выводе области. +// +// Параметры +// ПечатнаяФорма - ссылка на печатную форму +// ОбластьHandler - ссылка на область в макете. +// ПереходНаСледСтроку - булево, требуется ли вставлять разрыв после вывода области +// +// Возвращаемое значение: +// КоординатыОбласти +// +Функция ПрисоединитьОбласть(знач ПечатнаяФорма, + знач ОбластьHandler, + знач ПереходНаСледСтроку = Истина, + знач ПрисоединитьСтрокуТаблицы = Ложь) Экспорт + + ОбластьHandler.Document.Range(ОбластьHandler.Start, ОбластьHandler.End).Copy(); + + ПФ_ActiveDocument = ПечатнаяФорма.COMСоединение.ActiveDocument; + ПозицияОкончанияДокумента = ПФ_ActiveDocument.Range().End; + ОбластьВставки = ПФ_ActiveDocument.Range(ПозицияОкончанияДокумента-1, ПозицияОкончанияДокумента-1); + + Если ПрисоединитьСтрокуТаблицы Тогда + ОбластьВставки.PasteAppendTable(); + Иначе + ОбластьВставки.Paste(); + КонецЕсли; + + // возвращаем границы вставленной области + Результат = Новый Структура("Document, Start, End", + ПФ_ActiveDocument, + ПозицияОкончанияДокумента-1, + ПФ_ActiveDocument.Range().End-1); + + Если ПереходНаСледСтроку Тогда + ВставитьРазрывНаНовуюСтроку(ПечатнаяФорма); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Добавляет область списка в печатную форму из макета, при этом заменяя +// параметры в области значениями из данных объекта. +// Применяется при выводе данных списка (маркированного или нумерованного) +// +// Параметры +// ОбластьПечатнойФормы - ссылка на область в печатной форме +// ДанныеОбъекта - ДанныеОбъекта +// +Процедура ЗаполнитьПараметры(знач ОбластьПечатнойФормы, + знач ДанныеОбъекта = Неопределено) Экспорт + + Для Каждого ПараметрЗначение Из ДанныеОбъекта Цикл + Если ТипЗнч(ПараметрЗначение.Значение) <> Тип("Массив") Тогда + ВыполнитьЗамену(ОбластьПечатнойФормы.Document, + ПараметрЗначение.Ключ, + ПараметрЗначение.Значение); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Функция ВыполнитьЗамену(знач ActiveDocument, ТекстДляПоиска, ТекстЗамены) + + Range = ActiveDocument.Content; + Поиск = Range.Find; + Поиск.ClearFormatting(); + Поиск.Execute("{v8 " + ТекстДляПоиска + "}"); + Если Поиск.Found Тогда + Range.Text = Строка(ТекстЗамены); + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// начало: работа с коллекциями + +// Добавляет область списка в печатную форму из макета, при этом заменяя +// параметры в области значениями из данных объекта. +// Применяется при выводе данных списка (маркированного или нумерованного) +// +// Параметры +// ПечатнаяФорма - ссылка на печатную форму +// ОбластьHandler - ссылка на область в макете. +// Параметры - строка, перечень параметров, которые требуется заменить +// ДанныеОбъекта - ДанныеОбъекта +// ПереходНаСледСтроку - булево, требуется ли вставлять разрыв после вывода области +// +Процедура ПрисоединитьИЗаполнитьНабор(знач ПечатнаяФорма, + знач ОбластьHandler, + знач ДанныеОбъекта = Неопределено, + знач ПереходНаСледСтроку = Истина) Экспорт + + ОбластьHandler.Document.Range(ОбластьHandler.Start, ОбластьHandler.End).Copy(); + + ActiveDocument = ПечатнаяФорма.COMСоединение.ActiveDocument; + + Для Каждого ДанныеСтроки Из ДанныеОбъекта Цикл + ПозицияВставки = ActiveDocument.Range().End; + ОбластьВставки = ActiveDocument.Range(ПозицияВставки-1, ПозицияВставки-1); + ОбластьВставки.Paste(); + + Если ТипЗнч(ДанныеСтроки) = Тип("Структура") Тогда + Для Каждого ПараметрЗначение Из ДанныеСтроки Цикл + ВыполнитьЗамену(ActiveDocument, ПараметрЗначение.Ключ, ПараметрЗначение.Значение); + КонецЦикла; + КонецЕсли; + КонецЦикла; + + Если ПереходНаСледСтроку Тогда + ВставитьРазрывНаНовуюСтроку(ПечатнаяФорма); + КонецЕсли; + +КонецПроцедуры + +// Добавляет область списка в печатную форму из макета, при этом заменяя +// параметры в области значениями из данных объекта. +// Применяется при выводе строки таблицы. +// +// Параметры +// ПечатнаяФорма - ссылка на печатную форму +// ОбластьHandler - ссылка на область в макете. +// ИмяТаблицы - наименование таблицы (для доступа к данным) +// ДанныеОбъекта - ДанныеОбъекта +// ПереходНаСледСтроку - булево, требуется ли вставлять разрыв после вывода области +// +Процедура ПрисоединитьИЗаполнитьОбластьТаблицы(знач ПечатнаяФорма, + знач ОбластьHandler, + знач ДанныеОбъекта = Неопределено, + знач ПереходНаСледСтроку = Истина, + знач ПрисоединениеКСуществующейСтроке = Истина) Экспорт + + ОбластьHandler.Document.Range(ОбластьHandler.Start, ОбластьHandler.End).Copy(); + + ActiveDocument = ПечатнаяФорма.COMСоединение.ActiveDocument; + + Для Каждого ДанныеСтрокиТаблицы Из ДанныеОбъекта Цикл + ПозицияВставки = ActiveDocument.Range().End; + ОбластьВставки = ActiveDocument.Range(ПозицияВставки-1, ПозицияВставки-1); + + Если ПрисоединениеКСуществующейСтроке Тогда + ОбластьВставки.PasteAppendTable(); + Иначе + ОбластьВставки.Paste(); + КонецЕсли; + + Если ТипЗнч(ДанныеСтрокиТаблицы) = Тип("Структура") Тогда + Для Каждого ПараметрЗначение Из ДанныеСтрокиТаблицы Цикл + ВыполнитьЗамену(ActiveDocument, ПараметрЗначение.Ключ, ПараметрЗначение.Значение); + КонецЦикла; + КонецЕсли; + ПрисоединениеКСуществующейСтроке = Истина; + КонецЦикла; + + Если ПереходНаСледСтроку Тогда + ВставитьРазрывНаНовуюСтроку(ПечатнаяФорма); + КонецЕсли; + +КонецПроцедуры + +// конец: работа с коллекциями + +// Вставляет разрыв на следующую строку +// Параметры +// Handler - ссылка на документ MS Word в который требуется вставить разрыв +// +Процедура ВставитьРазрывНаНовуюСтроку(знач Handler) Экспорт + + ActiveDocument = Handler.COMСоединение.ActiveDocument; + ПозицияОкончанияДокумента = ActiveDocument.Range().End; + ActiveDocument.Range(ПозицияОкончанияДокумента-1, ПозицияОкончанияДокумента-1).InsertParagraphAfter(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Служебные не экспортные функции + +Функция ПолучитьПозициюНачалаОбласти(знач COMСоединение, знач ИдентификаторОбласти) + + ИдентификаторОбласти = "{v8 Область." + ИдентификаторОбласти + "}"; + + ВесьДокумент = COMСоединение.ActiveDocument.Content; + ВесьДокумент.Select(); + + Поиск = COMСоединение.Selection.Find; + Поиск.Text = ИдентификаторОбласти; + Поиск.ClearFormatting(); + Поиск.Forward = Истина; + Поиск.Execute(); + + Если Поиск.Found Тогда + Возврат COMСоединение.Selection.End; + КОнецЕсли; + + ВОзврат -1; + +КонецФункции + +Функция ПолучитьПозициюОкончанияОбласти(знач COMСоединение, знач ИдентификаторОбласти) + + ИдентификаторОбласти = "{/v8 Область." + ИдентификаторОбласти + "}"; + + ВесьДокумент = COMСоединение.ActiveDocument.Content; + ВесьДокумент.Select(); + + Поиск = COMСоединение.Selection.Find; + Поиск.Text = ИдентификаторОбласти; + Поиск.ClearFormatting(); + Поиск.Forward = Истина; + Поиск.Execute(); + + Если Поиск.Found Тогда + Возврат COMСоединение.Selection.Start; + КОнецЕсли; + + ВОзврат -1; + + +КонецФункции + +Функция НастройкиПараметровСтраницы() + + МассивНастроек = Новый Массив; + МассивНастроек.Добавить("Orientation"); + МассивНастроек.Добавить("TopMargin"); + МассивНастроек.Добавить("BottomMargin"); + МассивНастроек.Добавить("LeftMargin"); + МассивНастроек.Добавить("RightMargin"); + МассивНастроек.Добавить("Gutter"); + МассивНастроек.Добавить("HeaderDistance"); + МассивНастроек.Добавить("FooterDistance"); + МассивНастроек.Добавить("PageWidth"); + МассивНастроек.Добавить("PageHeight"); + МассивНастроек.Добавить("FirstPageTray"); + МассивНастроек.Добавить("OtherPagesTray"); + МассивНастроек.Добавить("SectionStart"); + МассивНастроек.Добавить("OddAndEvenPagesHeaderFooter"); + МассивНастроек.Добавить("DifferentFirstPageHeaderFooter"); + МассивНастроек.Добавить("VerticalAlignment"); + МассивНастроек.Добавить("SuppressEndnotes"); + МассивНастроек.Добавить("MirrorMargins"); + МассивНастроек.Добавить("TwoPagesOnOne"); + МассивНастроек.Добавить("BookFoldPrinting"); + МассивНастроек.Добавить("BookFoldRevPrinting"); + МассивНастроек.Добавить("BookFoldPrintingSheets"); + МассивНастроек.Добавить("GutterPos"); + + Возврат МассивНастроек; + +КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/УправлениеПечатьюMSWordКлиент.mdo b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/УправлениеПечатьюMSWordКлиент.mdo new file mode 100644 index 000000000..7706f2d10 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/УправлениеПечатьюMSWordКлиент.mdo @@ -0,0 +1,10 @@ + + + УправлениеПечатьюMSWordКлиент + + ru + Управление печатью MS Word клиент + + true + true + diff --git a/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl new file mode 100644 index 000000000..4a070b946 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl @@ -0,0 +1,406 @@ +//////////////////////////////////////////////////////////////////////////////// +// Open Office Writer - специфичные функции + +// Описание ссылки на печатную форму и макет +// Структура с полями: +// ServiceManager - сервис менеджер, сервис open office +// Desktop - приложение Open Office (сервис UNO) +// Document - документ (печатная форма) +// Тип - тип печатной формы ("ODT") +// +// + +//////////////////////////////////////////////////////////////////////////////// +// Экспортные функции + +Функция ИнициализироватьПечатнуюФормуOOWriter() Экспорт + + Попытка + ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager"); + Исключение + ВызватьИсключение(НСтр("ru = 'Ошибка при связи с сервис менеджером (com.sun.star.ServiceManager). Обратитесь к администратору системы.'")); + КонецПопытки; + + Попытка + Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop"); + Исключение + ВызватьИсключение(НСтр("ru = 'Ошибка при запуске сервиса Desktop (com.sun.star.frame.Desktop). Обратитесь к администратору системы.'")); + КонецПопытки; + + Параметры = ПолучитьComSafeArray(); +#Если Не ВебКлиент Тогда + Параметры.SetValue(0, СвойствоЗначение(ServiceManager, "Hidden", Истина)); +#КонецЕсли + + Document = Desktop.LoadComponentFromURL("private:factory/swriter", "_blank", 0, Параметры); + +#Если ВебКлиент Тогда + Document.getCurrentController().getFrame().getContainerWindow().setVisible(Ложь); +#КонецЕсли + + // Подготавливаем ссылку на макет + Handler = Новый Структура("ServiceManager,Desktop,Document,Тип"); + Handler.ServiceManager = ServiceManager; + Handler.Desktop = Desktop; + Handler.Document = Document; + + Возврат Handler; + +КонецФункции + +// Параметры: +// ДвоичныеДанныеМакета - ДвоичныеДанные - двоичные данные макета +// Возвращаемое значение: +// структура - ссылка макет +// +Функция ПолучитьМакетOOWriter(знач ДвоичныеДанныеШаблона, ИмяВременногоФайла) Экспорт + + Handler = Новый Структура("ServiceManager,Desktop,Document,ИмяФайла"); + + Попытка + ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager"); + Исключение + ВызватьИсключение(НСтр("ru = 'Ошибка при связи с сервис менеджером (com.sun.star.ServiceManager). Обратитесь к администратору системы.'")); + КонецПопытки; + + Попытка + Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop"); + Исключение + ВызватьИсключение(НСтр("ru = 'Ошибка при запуске сервиса Desktop (com.sun.star.frame.Desktop). Обратитесь к администратору системы.'")); + КонецПопытки; + +#Если НЕ ВебКлиент Тогда + ИмяВременногоФайла = ПолучитьИмяВременногоФайла("ODT"); + ДвоичныеДанныеШаблона.Записать(ИмяВременногоФайла); +#КонецЕсли + + Параметры = ПолучитьComSafeArray(); +#Если Не ВебКлиент Тогда + Параметры.SetValue(0, СвойствоЗначение(ServiceManager, "Hidden", Истина)); +#КонецЕсли + + Document = Desktop.LoadComponentFromURL("file:///" + ИмяВременногоФайла, "_blank", 0, Параметры); + +#Если ВебКлиент Тогда + Document.getCurrentController().getFrame().getContainerWindow().setVisible(Ложь); +#КонецЕсли + + // Подготавливаем ссылку на макет + Handler.ServiceManager = ServiceManager; + Handler.Desktop = Desktop; + Handler.Document = Document; + Handler.ИмяФайла = ИмяВременногоФайла; + + Возврат Handler; + +КонецФункции + +Функция ПолучитьComSafeArray() + +#Если ВебКлиент Тогда + scr = Новый COMОбъект("MSScriptControl.ScriptControl"); + scr.language = "javascript"; + scr.eval("Массив=new Array()"); + Возврат scr.eval("Массив"); +#Иначе + Возврат Новый COMSafeArray("VT_DISPATCH", 1); +#КонецЕсли + +КонецФункции + +Функция ЗакрытьСоединение(Handler, знач ЗакрытьПриложение) Экспорт + + Если ЗакрытьПриложение Тогда + Handler.Document.Close(0); + КонецЕсли; + + Handler.Document = Неопределено; + Handler.Desktop = Неопределено; + Handler.ServiceManager = Неопределено; + ScriptControl = Неопределено; + + Если Handler.Свойство("ИмяФайла") Тогда + УдалитьФайлы(Handler.ИмяФайла); + КонецЕсли; + + Handler = Неопределено; + +КонецФункции + +// Устанавливает свойство видимости у приложения OO Writer +// Handler - ссылка на печатную форму +// +Процедура ПоказатьДокументOOWriter(знач Handler) Экспорт + + ContainerWindow = Handler.Document.getCurrentController().getFrame().getContainerWindow(); + ContainerWindow.setVisible(Истина); + ContainerWindow.setFocus(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Блок функций для работы с макетом + +// Получает область из макета. +// Параметры +// Handler - ссылка на макет +// ИмяОбласти - имя области в макете +// СмещениеНачало - смещение относительно начала области +// смещение по умолчанию: 1 - означает что область берется без символа +// перевода строки, за операторной скобкой открытия области +// СмещениеОкончание - смещение относительно окончания области, +// смещение по умолчанию: -11 - означает что область берется без символа +// перевода строки, перед операторной скобкой закрытия области +// +Функция ПолучитьОбластьМакета(знач Handler, знач ИмяОбласти) Экспорт + + Результат = Новый Структура("Document,Start,End"); + + Результат.Start = ПолучитьПозициюНачалаОбласти(Handler.Document, ИмяОбласти); + Результат.End = ПолучитьПозициюОкончанияОбласти(Handler.Document, ИмяОбласти); + Результат.Document = Handler.Document; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьОбластьВерхнегоКолонтитула(знач МакетСсылка) Экспорт + + Возврат Новый Структура("Document, ServiceManager", МакетСсылка.Document, МакетСсылка.ServiceManager); + +КонецФункции + +Функция ПолучитьОбластьНижнегоКолонтитула(МакетСсылка) Экспорт + + Возврат Новый Структура("Document, ServiceManager", МакетСсылка.Document, МакетСсылка.ServiceManager); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Блок функций для работы с печатной формой + +// Вставляет разрыв на следующую строку +// Параметры +// Handler - ссылка на документ MS Word в который требуется вставить разрыв +// +Процедура ВставитьРазрывНаНовуюСтроку(знач Handler) Экспорт + + oText = Handler.Document.getText(); + oCursor = oText.createTextCursor(); + oCursor.gotoEnd(False); + oText.insertControlCharacter(oCursor, 0, False); + +КонецПроцедуры + +Процедура ДобавитьВерхнийКолонтитул(знач ПечатнаяФорма, + знач Область) Экспорт + + Макет_oTxtCrsr = УстановитьОсновнойКурсорНаВерхнийКолонтитул(Область); + Пока Макет_oTxtCrsr.goRight(1, Истина) Цикл + КонецЦикла; + TransferableObject = Область.Document.getCurrentController().Frame.controller.getTransferable(); + + УстановитьОсновнойКурсорНаВерхнийКолонтитул(ПечатнаяФорма); + ПечатнаяФорма.Document.getCurrentController().insertTransferable(TransferableObject); + +КонецПроцедуры + +Процедура ДобавитьНижнийКолонтитул(знач ПечатнаяФорма, + знач Область) Экспорт + + Макет_oTxtCrsr = УстановитьОсновнойКурсорНаНижнийКолонтитул(Область); + Пока Макет_oTxtCrsr.goRight(1, Истина) Цикл + КонецЦикла; + TransferableObject = Область.Document.getCurrentController().Frame.controller.getTransferable(); + + УстановитьОсновнойКурсорНаНижнийКолонтитул(ПечатнаяФорма); + ПечатнаяФорма.Document.getCurrentController().insertTransferable(TransferableObject); + +КонецПроцедуры + +// Добавляет область в печатную форму из макета, при этом заменяя +// параметры в области значениями из данных объекта. +// Применяется при одиночном выводе области. +// +// Параметры +// ПечатнаяФорма - ссылка на печатную форму +// ОбластьHandler - ссылка на область в макете. +// ПереходНаСледСтроку - булево, требуется ли вставлять разрыв после вывода области +// +// Возвращаемое значение: +// КоординатыОбласти +// +Процедура ПрисоединитьОбласть(знач ПечатнаяФормаHandler, + знач ОбластьHandler, + знач ПереходНаСледСтроку = Истина, + знач ПрисоединитьСтрокуТаблицы = Ложь) Экспорт + + Макет_oTxtCrsr = ОбластьHandler.Document.getCurrentController().getViewCursor(); + Макет_oTxtCrsr.gotoRange(ОбластьHandler.Start, Ложь); + + Если НЕ ПрисоединитьСтрокуТаблицы Тогда + Макет_oTxtCrsr.goRight(1, Ложь); + КонецЕсли; + + Макет_oTxtCrsr.gotoRange(ОбластьHandler.End, Истина); + + TransferableObject = ОбластьHandler.Document.getCurrentController().Frame.controller.getTransferable(); + ПечатнаяФормаHandler.Document.getCurrentController().insertTransferable(TransferableObject); + + Если ПрисоединитьСтрокуТаблицы Тогда + УдалитьСтроку(ПечатнаяФормаHandler); + КонецЕсли; + + Если ПереходНаСледСтроку Тогда + ВставитьРазрывНаНовуюСтроку(ПечатнаяФормаHandler); + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаполнитьПараметры(ПечатнаяФорма, Данные) Экспорт + + Для Каждого КлючЗначение Из Данные Цикл + Если ТипЗнч(КлючЗначение) <> Тип("Массив") Тогда + ПФ_oDoc = ПечатнаяФорма.Document; + ПФ_ReplaceDescriptor = ПФ_oDoc.createReplaceDescriptor(); + ПФ_ReplaceDescriptor.SearchString = "{v8 " + КлючЗначение.Ключ + "}"; + ПФ_ReplaceDescriptor.ReplaceString = Строка(КлючЗначение.Значение); + ПФ_oDoc.replaceAll(ПФ_ReplaceDescriptor); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура ПрисоединитьИЗаполнитьКоллекцию(знач ПечатнаяФормаHandler, + знач ОбластьHandler, + знач Данные, + знач ЭтоСтрокаТаблицы = Ложь, + знач ПереходНаСледСтроку = Истина) Экспорт + + Макет_oTxtCrsr = ОбластьHandler.Document.getCurrentController().getViewCursor(); + Макет_oTxtCrsr.gotoRange(ОбластьHandler.Start, Ложь); + + Если НЕ ЭтоСтрокаТаблицы Тогда + Макет_oTxtCrsr.goRight(1, Ложь); + КонецЕсли; + Макет_oTxtCrsr.gotoRange(ОбластьHandler.End, Истина); + + TransferableObject = ОбластьHandler.Document.getCurrentController().Frame.controller.getTransferable(); + + Для Каждого СтрокаСДанными Из Данные Цикл + ПечатнаяФормаHandler.Document.getCurrentController().insertTransferable(TransferableObject); + Если ЭтоСтрокаТаблицы Тогда + УдалитьСтроку(ПечатнаяФормаHandler); + КонецЕсли; + ЗаполнитьПараметры(ПечатнаяФормаHandler, СтрокаСДанными); + КонецЦикла; + + Если ПереходНаСледСтроку Тогда + ВставитьРазрывНаНовуюСтроку(ПечатнаяФормаHandler); + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьОсновнойКурсорНаТелоДокумента(знач ДокументСсылка) Экспорт + + oDoc = ДокументСсылка.Document; + oViewCursor = oDoc.getCurrentController().getViewCursor(); + oTextCursor = oDoc.Text.createTextCursor(); + oViewCursor.gotoRange(oTextCursor, Ложь); + oViewCursor.gotoEnd(Ложь); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Служебные функции + +// Получает специальную структуру, через которую объектам UNO устанавливаются +// параметры. +// +Функция СвойствоЗначение(знач ServiceManager, знач Свойство, знач Значение) + + PropertyValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); + PropertyValue.Name = Свойство; + PropertyValue.Value = Значение; + + Возврат PropertyValue; + +КонецФункции + +Функция ПолучитьПозициюНачалаОбласти(знач xDocument, знач ИмяОбласти) + + ТекстДляПоиска = "{v8 Область." + ИмяОбласти + "}"; + + xSearchDescr = xDocument.createSearchDescriptor(); + xSearchDescr.SearchString = ТекстДляПоиска; + xSearchDescr.SearchCaseSensitive = Ложь; + xSearchDescr.SearchWords = Истина; + xFound = xDocument.findFirst(xSearchDescr); + Если xFound = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Не найдено начало области макета:'") + " " + ИмяОбласти; + КонецЕсли; + Возврат xFound.End; + +КонецФункции + +Функция ПолучитьПозициюОкончанияОбласти(знач xDocument, знач ИмяОбласти) + + ТекстДляПоиска = "{/v8 Область." + ИмяОбласти + "}"; + + xSearchDescr = xDocument.createSearchDescriptor(); + xSearchDescr.SearchString = ТекстДляПоиска; + xSearchDescr.SearchCaseSensitive = Ложь; + xSearchDescr.SearchWords = Истина; + xFound = xDocument.findFirst(xSearchDescr); + Если xFound = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Не найден конец области макета:'") + " " + ИмяОбласти; + КонецЕсли; + Возврат xFound.Start; + +КонецФункции + +Процедура УдалитьСтроку(ПечатнаяФормаHandler) + + oFrame = ПечатнаяФормаHandler.Document.getCurrentController().Frame; + + dispatcher = ПечатнаяФормаHandler.ServiceManager.CreateInstance ("com.sun.star.frame.DispatchHelper"); + + oViewCursor = ПечатнаяФормаHandler.Document.getCurrentController().getViewCursor(); + + dispatcher.executeDispatch(oFrame, ".uno:GoUp", "", 0, ПолучитьComSafeArray()); + + Пока oViewCursor.TextTable <> Неопределено Цикл + dispatcher.executeDispatch(oFrame, ".uno:GoUp", "", 0, ПолучитьComSafeArray()); + КонецЦикла; + + dispatcher.executeDispatch(oFrame, ".uno:Delete", "", 0, ПолучитьComSafeArray()); + + Пока oViewCursor.TextTable <> Неопределено Цикл + dispatcher.executeDispatch(oFrame, ".uno:GoDown", "", 0, ПолучитьComSafeArray()); + КонецЦикла; + +КонецПроцедуры + +Функция УстановитьОсновнойКурсорНаВерхнийКолонтитул(знач ДокументСсылка) Экспорт + + xCursor = ДокументСсылка.Document.getCurrentController().getViewCursor(); + PageStyleName = xCursor.getPropertyValue("PageStyleName"); + oPStyle = ДокументСсылка.Document.getStyleFamilies().getByName("PageStyles").getByName(PageStyleName); + oPStyle.HeaderIsOn = Истина; + HeaderTextCursor = oPStyle.getPropertyValue("HeaderText").createTextCursor(); + xCursor.gotoRange(HeaderTextCursor, Ложь); + Возврат xCursor; + +КонецФункции + +Функция УстановитьОсновнойКурсорНаНижнийКолонтитул(знач ДокументСсылка) Экспорт + + xCursor = ДокументСсылка.Document.getCurrentController().getViewCursor(); + PageStyleName = xCursor.getPropertyValue("PageStyleName"); + oPStyle = ДокументСсылка.Document.getStyleFamilies().getByName("PageStyles").getByName(PageStyleName); + oPStyle.FooterIsOn = Истина; + FooterTextCursor = oPStyle.getPropertyValue("FooterText").createTextCursor(); + xCursor.gotoRange(FooterTextCursor, Ложь); + Возврат xCursor; + +КонецФункции diff --git a/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/УправлениеПечатьюOOWriterКлиент.mdo b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/УправлениеПечатьюOOWriterКлиент.mdo new file mode 100644 index 000000000..283ffd1f1 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/УправлениеПечатьюOOWriterКлиент.mdo @@ -0,0 +1,10 @@ + + + УправлениеПечатьюOOWriterКлиент + + ru + Управление печатью OpenOffice.org Writer клиент + + true + true + diff --git a/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl new file mode 100644 index 000000000..d150421d0 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl @@ -0,0 +1,626 @@ + +// Выполнить команду печати, которая открывает результат в форме печати документов +Процедура ВыполнитьКомандуПечати(ИмяМенеджераПечати, ИменаМакетов, ПараметрКоманды, ВладелецФормы, ПараметрыПечати = Неопределено) Экспорт + + // Проверим количество объектов + Если НЕ ПроверитьКоличествоПереданныхОбъектов(ПараметрКоманды) Тогда + Возврат; + КонецЕсли; + + // Получим ключ уникальности открываемой формы + КлючУникальности = Строка(Новый УникальныйИдентификатор); + + ПараметрыОткрытия = Новый Структура("ИмяМенеджераПечати,ИменаМакетов,ПараметрКоманды,ПараметрыПечати"); + ПараметрыОткрытия.ИмяМенеджераПечати = ИмяМенеджераПечати; + ПараметрыОткрытия.ИменаМакетов = ИменаМакетов; + ПараметрыОткрытия.ПараметрКоманды = ПараметрКоманды; + ПараметрыОткрытия.ПараметрыПечати = ПараметрыПечати; + + // Откроем форму печати документов + ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, ВладелецФормы, КлючУникальности); + +КонецПроцедуры + +// Выполнить команду печати, которая результат выводит на принтер +Процедура ВыполнитьКомандуПечатиНаПринтер(ИмяМенеджераПечати, ИменаМакетов, ПараметрКоманды, ПараметрыПечати = Неопределено) Экспорт + + Перем ТабличныеДокументы, ОбъектыПечати, ПараметрыВывода, Адрес, ОбъектыПечатиСоотв, Отказ; + + // Проверим количество объектов + Если НЕ ПроверитьКоличествоПереданныхОбъектов(ПараметрКоманды) Тогда + Возврат; + КонецЕсли; + + ПараметрыВывода = Неопределено; + + // Сформируем табличные документы +#Если ТолстыйКлиентОбычноеПриложение Тогда + УправлениеПечатью.СформироватьПечатныеФормыДляБыстройПечатиОбычноеПриложение( + ИмяМенеджераПечати, ИменаМакетов, ПараметрКоманды, ПараметрыПечати, + Адрес, ОбъектыПечатиСоотв, ПараметрыВывода, Отказ); + Если НЕ Отказ Тогда + ОбъектыПечати = Новый СписокЗначений; + ТабличныеДокументы = ПолучитьИзВременногоХранилища(Адрес); + Для Каждого ОбъектПечати Из ОбъектыПечатиСоотв Цикл + ОбъектыПечати.Добавить(ОбъектПечати.Значение, ОбъектПечати.Ключ); + КонецЦикла; + КонецЕсли; +#Иначе + УправлениеПечатью.СформироватьПечатныеФормыДляБыстройПечати( + ИмяМенеджераПечати, ИменаМакетов, ПараметрКоманды, ПараметрыПечати, + ТабличныеДокументы, ОбъектыПечати, ПараметрыВывода, Отказ); +#КонецЕсли + + Если Отказ Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Нет прав для вывода печатной формы на принтер, обратитесь к администратору системы.'")); + Возврат; + КонецЕсли; + + // Распечатаем + РаспечататьТабличныеДокументы(ТабличныеДокументы, ОбъектыПечати, + ПараметрыВывода.ДоступнаПечатьПоКомплектно); + +КонецПроцедуры + +// Вывести табличные документы на принтер +Процедура РаспечататьТабличныеДокументы(ТабличныеДокументы, ОбъектыПечати, + знач ДоступнаПечатьПоКомплектно) Экспорт + + #Если ВебКлиент Тогда + ДоступнаПечатьПоКомплектно = Ложь; + #КонецЕсли + + Если ДоступнаПечатьПоКомплектно Тогда + Для Каждого Элемент Из ОбъектыПечати Цикл + ИмяОбласти = Элемент.Представление; + Для Каждого Элемент Из ТабличныеДокументы Цикл + ТабДок = Элемент.Значение; + Область = ТабДок.Области.Найти(ИмяОбласти); + Если Область = Неопределено Тогда + Продолжить; + КонецЕсли; + ТабДок.ОбластьПечати = Область; + ТабДок.Напечатать(Истина); + КонецЦикла; + КонецЦикла; + Иначе + Для Каждого Элемент Из ТабличныеДокументы Цикл + ТабДок = Элемент.Значение; + ТабДок.Напечатать(Истина); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +// Перед выполнение команды печати проверить, был ли передан хотя бы один объект, так как +// для команд с множественным режимом использования может быть передан пустой массив. +Функция ПроверитьКоличествоПереданныхОбъектов(ПараметрКоманды) + + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") И ПараметрКоманды.Количество() = 0 Тогда + Возврат Ложь; + Иначе + Возврат Истина; + КонецЕсли; + +КонецФункции + +Функция ПроверитьДокументыПроведены(ПараметрКоманды) Экспорт + + МассивНепроведенныхДокументов = ОбщегоНазначения.ПроверитьПроведенностьДокументов(ПараметрКоманды); + КоличествоНепроведенныхДокументов = МассивНепроведенныхДокументов.Количество(); + + Если КоличествоНепроведенныхДокументов > 0 Тогда + + Если КоличествоНепроведенныхДокументов = 1 Тогда + ТекстВопроса = НСтр("ru = 'Чтобы распечатать документ, его требуется провести. Выполнить проведение документа и продолжить?'"); + Иначе + ТекстВопроса = НСтр("ru = 'Чтобы распечатать документы, их требуется провести. Выполнить проведение документов и продолжить?'"); + КонецЕсли; + + КодОтвета = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); + + Если КодОтвета = КодВозвратаДиалога.Да Тогда + + ТипПроведенныхДокументов = Неопределено; + МассивНепроведенныхДокументов = ОбщегоНазначения.ПровестиДокументы(МассивНепроведенныхДокументов, ТипПроведенныхДокументов); + + ОповеститьОбИзменении(ТипПроведенныхДокументов); + Иначе + Возврат Ложь; + КонецЕсли; + + КонецЕсли; + + ШаблонСообщения = НСтр("ru = 'Документ %1 не проведен. Печать не возможна.'"); + Для Каждого ЭлементНД Из МассивНепроведенныхДокументов Цикл + Найденный = ПараметрКоманды.Найти(ЭлементНД); + Если Найденный <> Неопределено Тогда + ПараметрКоманды.Удалить(Найденный); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Строка(ЭлементНД)), ЭлементНД); + КонецЕсли; + КонецЦикла; + + Если ПараметрКоманды.Количество() > 0 Тогда + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ ФУНКЦИОНАЛЬНОСТИ ДЛЯ РАБОТЫ С МАКЕТАМИ ОФИСНЫХ ДОКУМЕНТОВ +// +// Краткое описание: +// Секция содержит интерфейсные функции (API), используемые при создании +// печатных форм основанных на офисных документах. На данный момент поддерживается +// два офисных пакета MS Office (шаблоны MS Word) и Open Office (шаблоны OO Writer). +// +//////////////////////////////////////////////////////////////////////////////// +// типы используемых данных (определяется конкретными реализациями) +// СсылкаПечатнаяФорма - ссылка на печатную форму +// СсылкаМакет - ссылка на макет +// Область - ссылка на область в печатной форме или макете (структура) +// доопределяется в интерфейсном модуле служебной информацией +// об области +// ОписаниеОбласти - описание области макета (см. ниже) +// ДанныеЗаполнения - либо структура, либо массив структур (для случая +// списков и таблиц +//////////////////////////////////////////////////////////////////////////////// +// ОписаниеОбласти - структура, описывающая подготовленные пользователем области макета +// ключ ИмяОбласти - имя области +// ключ ТипТипОбласти - ВерхнийКолонтитул +// НижнийКолонтитул +// Общая +// СтрокаТаблицы +// Список +// + +//////////////////////////////////////////////////////////////////////////////// +// Функции инициализации и закрытия ссылок + +// Создает соединение с выходной печатной формой. +// Необходимо вызвать перед любыми действиями над формой. +// Параметры: +// ТипДокумента - строка - тип печатной формы либо "ODT" либо "ODT" +// +// Возвращаемое значение: +// СсылкаПечатнаяФорма +// +Функция ИнициализироватьПечатнуюФорму(знач ТипДокумента, знач НастройкиСтраницыМакета = Неопределено) Экспорт + + Если ВРег(ТипДокумента) = "DOC" Тогда + ПечатнаяФорма = УправлениеПечатьюMSWordКлиент.ИнициализироватьПечатнуюФормуMSWord(НастройкиСтраницыМакета); + ПечатнаяФорма.Вставить("Тип", "DOC"); + ПечатнаяФорма.Вставить("ПоследняяВыведеннаяОбласть", Неопределено); + Возврат ПечатнаяФорма; + ИначеЕсли ВРег(ТипДокумента) = "ODT" Тогда + ПечатнаяФорма = УправлениеПечатьюOOWriterКлиент.ИнициализироватьПечатнуюФормуOOWriter(); + ПечатнаяФорма.Вставить("Тип", "ODT"); + ПечатнаяФорма.Вставить("ПоследняяВыведеннаяОбласть", Неопределено); + Возврат ПечатнаяФорма; + КонецЕсли; + +КонецФункции + +// Создает соединение с макетом. В дальнейшем это соединение используется +// при получении из него областей (тегов и таблиц). +// +// Параметры: +// ДвоичныеДанныеМакета - ДвоичныеДанные - двоичные данные макета +// ТипШаблона - тип макета, либо "ODT", либо "ODT" +// Возвращаемое значение: +// СсылкаМакет +// +Функция ИнициализироватьМакет(знач ДвоичныеДанныеМакета, знач ТипМакета, знач ПутьККаталогу = "", знач ИмяМакета = "") Экспорт + +#Если ВебКлиент Тогда + + ТекстСообщения = НСтр("ru = 'Не подключено расширение для работы с файлами в Веб-клиенте.'"); + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(ТекстСообщения); + + Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда + Возврат Неопределено; + КонецЕсли; + + Если ПустаяСтрока(ИмяМакета) Тогда + ИмяВременногоФайла = Строка(Новый УникальныйИдентификатор) + "." + НРег(ТипМакета); + Иначе + ИмяВременногоФайла = ИмяМакета + "." + НРег(ТипМакета); + КонецЕсли; + + ПолучаемыеФайлы = Новый Соответствие; + ПолучаемыеФайлы.Вставить(ИмяВременногоФайла, ДвоичныеДанныеМакета); + + Результат = ПолучитьФайлыВКаталогФайловПечати(ПутьККаталогу, ПолучаемыеФайлы); + + Если Результат = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + ИмяВременногоФайла = Результат + ИмяВременногоФайла; +#Иначе + ИмяВременногоФайла = ""; +#КонецЕсли + + Если ВРег(ТипМакета) = "DOC" Тогда + Макет = УправлениеПечатьюMSWordКлиент.ПолучитьМакетMSWord(ДвоичныеДанныеМакета, ИмяВременногоФайла); + Макет.Вставить("Тип", "DOC"); + Возврат Макет; + ИначеЕсли ВРег(ТипМакета) = "ODT" Тогда + Макет = УправлениеПечатьюOOWriterКлиент.ПолучитьМакетOOWriter(ДвоичныеДанныеМакета, ИмяВременногоФайла); + Макет.Вставить("Тип", "ODT"); + Макет.Вставить("НастройкиСтраницыМакета", Неопределено); + Возврат Макет; + КонецЕсли; + +КонецФункции + +#Если ВебКлиент Тогда +// Функция получает файл(ы) c сервера в локальный каталог на диск и возвращает +// имя каталога, в который они были сохранены +// Параметры: +// ПутьККаталогу - строка - путь к каталогу, в который должны быть сохранены файлы +// ПолучаемыеФайлы - соответствие - +// ключ - имя файла +// значение - двоичные данные файла +// +Функция ПолучитьФайлыВКаталогФайловПечати(ПутьККаталогу, ПолучаемыеФайлы) Экспорт + + ТребуетсяУстановитьКаталогПечати = Истина; + + Если ЗначениеЗаполнено(ПутьККаталогу) Тогда + Файл = Новый Файл(ПутьККаталогу); + Если НЕ Файл.Существует() Тогда + ТребуетсяУстановитьКаталогПечати = Ложь; + КонецЕсли; + КонецЕсли; + + Если ТребуетсяУстановитьКаталогПечати Тогда + Результат = ОткрытьФормуМодально("РегистрСведений.ПользовательскиеМакетыПечати.Форма.НастройкаКаталогаФайловПечати"); + Если ТипЗнч(Результат) = Тип("Строка") Тогда + ПутьККаталогу = Результат; + Иначе + Возврат Неопределено; + КонецЕсли; + КонецЕсли; + + ПовторятьПечать = Истина; + + Пока ПовторятьПечать Цикл + ПовторятьПечать = Ложь; + Попытка + ФайлыВоВременномХранилище = ПолучитьАдресаФайловВоВременномХранилище(ПолучаемыеФайлы); + + ОписанияФайлов = Новый Массив; + + Для Каждого ФайлВоВременномХранилище Из ФайлыВоВременномХранилище Цикл + ОписанияФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ФайлВоВременномХранилище.Ключ,ФайлВоВременномХранилище.Значение)); + КонецЦикла; + + Если НЕ ПолучитьФайлы(ОписанияФайлов, , ПутьККаталогу, Ложь) Тогда + Возврат Неопределено; + КонецЕсли; + Исключение + СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Результат = ОткрытьФормуМодально("РегистрСведений.ПользовательскиеМакетыПечати.Форма.ДиалогПовтораПечати", Новый Структура("СообщениеОбОшибке", СообщениеОбОшибке)); + Если ТипЗнч(Результат) = Тип("Строка") Тогда + ПовторятьПечать = Истина; + ПутьККаталогу = Результат; + Иначе + Возврат Неопределено; + КонецЕсли; + КонецПопытки; + КонецЦикла; + + Если Прав(ПутьККаталогу, 1) <> "\" Тогда + ПутьККаталогу = ПутьККаталогу + "\"; + КонецЕсли; + + Возврат ПутьККаталогу; + +КонецФункции + +// Помещает набор двоичных данных во временное хранилище +// Параметры: +// НаборЗначений - соответствие, ключ - ключ, связанный с двоичными данными +// значение - ДвоичныеДанные +// Возвращаемое значение: +// соответствие: ключ - ключ, связанный с адресом во временном хранилище +// значение - адрес во временном хранилище +// +Функция ПолучитьАдресаФайловВоВременномХранилище(НаборЗначений) + + Результат = Новый Соответствие; + + Для Каждого КлючЗначение Из НаборЗначений Цикл + Результат.Вставить(КлючЗначение.Ключ, ПоместитьВоВременноеХранилище(КлючЗначение.Значение)); + КонецЦикла; + + Возврат Результат; + +КонецФункции +#КонецЕсли + +// Освобождает ссылки в созданном интерфейсе связи с офисным приложением. +// Необходимо вызывать каждый раз после завершения формирования макета и выводе +// печатной формы пользователю. +// Параметры: +// 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(СсылкаМакет, ОписаниеОбласти.ИмяОбласти); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "Список" Тогда + Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьМакетаMSWord(СсылкаМакет, ОписаниеОбласти.ИмяОбласти, 1, 0); + Иначе + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Тип области не указан или указан не корректно: %1.'"), ОписаниеОбласти.ТипОбласти); + КонецЕсли; + + Если Область <> Неопределено Тогда + Область.Вставить("ОписаниеОбласти", ОписаниеОбласти); + КонецЕсли; + ИначеЕсли СсылкаМакет.Тип = "ODT" Тогда + + Если ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда + Область = УправлениеПечатьюOOWriterКлиент.ПолучитьОбластьВерхнегоКолонтитула(СсылкаМакет); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда + Область = УправлениеПечатьюOOWriterКлиент.ПолучитьОбластьНижнегоКолонтитула(СсылкаМакет); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "Общая" + ИЛИ ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" + ИЛИ ОписаниеОбласти.ТипОбласти = "Список" Тогда + Область = УправлениеПечатьюOOWriterКлиент.ПолучитьОбластьМакета(СсылкаМакет, ОписаниеОбласти.ИмяОбласти); + Иначе + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Тип области не указан или указан не корректно: %1.'"), ОписаниеОбласти.ИмяОбласти); + КонецЕсли; + + Если Область <> Неопределено Тогда + Область.Вставить("ОписаниеОбласти", ОписаниеОбласти); + КонецЕсли; + КонецЕсли; + + Возврат Область; + +КонецФункции + +// Присоединяет область в печатную форму из макета. +// Применяется при одиночном выводе области. +// +// Параметры +// ПечатнаяФорма - СсылкаПечатнаяФорма - ссылка на печатную форму +// ОбластьМакета - Область - область из макета +// ПереходНаСледующуюСтроку - булево, требуется ли вставлять разрыв после вывода области +// +Процедура ПрисоединитьОбласть(знач ПечатнаяФорма, + знач ОбластьМакета, + знач ПереходНаСледующуюСтроку = Истина) Экспорт + + Попытка + ОписаниеОбласти = ОбластьМакета.ОписаниеОбласти; + + Если ПечатнаяФорма.Тип = "DOC" Тогда + + ВыведеннаяОбласть = Неопределено; + + Если ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда + УправлениеПечатьюMSWordКлиент.ДобавитьВерхнийКолонтитул(ПечатнаяФорма, ОбластьМакета); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда + УправлениеПечатью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Клиент.ВставитьРазрывНаНовуюСтроку(ПечатнаяФорма); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/УправлениеПечатьюКлиент/УправлениеПечатьюКлиент.mdo b/SSL/src/CommonModules/УправлениеПечатьюКлиент/УправлениеПечатьюКлиент.mdo new file mode 100644 index 000000000..da85e2efe --- /dev/null +++ b/SSL/src/CommonModules/УправлениеПечатьюКлиент/УправлениеПечатьюКлиент.mdo @@ -0,0 +1,11 @@ + + + УправлениеПечатьюКлиент + + ru + Управление печатью клиент + + true + true + true + diff --git a/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl new file mode 100644 index 000000000..f533c72df --- /dev/null +++ b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl @@ -0,0 +1,30 @@ + +// Функция формирования печатной формы по внешнему источнику. +// ИсточникДанных - Произвольный - источник данных +// ПараметрыИсточника - Произвольный - параметры источника печати +// +// параметры, заполняемые в функции: +// КоллекцияПечатныхФорм - ТаблицаЗначений - таблица печатных форм, +// структура совпадает с той, что формируется при печати +/// обычным способом +// ОбъектыПечати - СписокЗначений - список объектов для печати +// ПараметрыВывода - Структура - ключи и значения совпадает с теми, +// то формируется при печати обычным способом +// +Функция ПечатьПоВнешнемуИсточнику(ИсточникДанных, + ПараметрыИсточника, + КоллекцияПечатныхФорм, + ОбъектыПечати, + ПараметрыВывода) Экспорт + + // ДополнительныеОтчетыИОбработки + Если ТипЗнч(ИсточникДанных) = Тип("СправочникСсылка.ДополнительныеОтчетыИОбработки") Тогда + ДополнительныеОтчетыИОбработки.ПечатьПоВнешнемуИсточнику( + ИсточникДанных, ПараметрыИсточника, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода); + Возврат Истина; + КонецЕсли; + // Конец ДополнительныеОтчетыИОбработки + + Возврат Ложь; + +КонецФункции diff --git a/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/УправлениеПечатьюПереопределяемый.mdo b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/УправлениеПечатьюПереопределяемый.mdo new file mode 100644 index 000000000..3f7423df1 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/УправлениеПечатьюПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + УправлениеПечатьюПереопределяемый + + ru + Управление печатью переопределяемый + + true + true + diff --git a/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl new file mode 100644 index 000000000..d094a5962 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl @@ -0,0 +1,891 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ФУНКЦИИ И ПРОЦЕДУРЫ + +// Вызывается из обработчика ПриСозданииНаСервере формы объекта со свойствами +// +Процедура ПриСозданииНаСервере(Форма, Объект, ИмяЭлементаДляРазмещения = Неопределено) Экспорт + + ИспользоватьДопРеквизиты = ИспользоватьДопРеквизиты(Объект.Ссылка); + + Если ЗначениеЗаполнено(Объект.Ссылка) Тогда + НаборСвойствОбъекта = ПолучитьДоступныеНаборыСвойств(Объект.Ссылка); + Иначе + ИмяТипа = ОбщегоНазначения.ВидОбъектаПоСсылке(Объект.Ссылка) + "Объект." + Объект.Ссылка.Метаданные().Имя; + ОбъектЗначение = ДанныеФормыВЗначение(Объект, Тип(ИмяТипа)); + НаборСвойствОбъекта = ПолучитьДоступныеНаборыСвойств(ОбъектЗначение); + КонецЕсли; + + // Создадим основные объекты на форме + СоздатьОсновныеОбъектыФормы(Форма, ИмяЭлементаДляРазмещения, НаборСвойствОбъекта, ИспользоватьДопРеквизиты); + + // Если функциональной опцией использование доп.реквизитов отключено, то больше ничего не делаем + Если Не Форма.__Свойства_ИспользоватьСвойства Тогда + Возврат; + КонецЕсли; + + Форма.__Свойства_ОсновнойНабор = НаборСвойствОбъекта; + + Если ИспользоватьДопРеквизиты Тогда + // Создадим остальные реквизиты и разместим их на форме + ЗаполнитьДополнительныеРеквизитыНаФорме(Форма, Объект, НаборСвойствОбъекта); + КонецЕсли; + +КонецПроцедуры + +// Вызывается из обработчика ПередЗаписьюНаСервере формы объекта со свойствами +// +Процедура ПередЗаписьюНаСервере(Форма, ТекущийОбъект) Экспорт + + Если Форма.__Свойства_ИспользоватьСвойства И Форма.__Свойства_ИспользоватьДопРеквизиты Тогда + // Перенесем значения доп.реквизитов из реквизитов форм в объект + ПеренестиЗначенияСвойствИзРеквизитовФормы(Форма, ТекущийОбъект); + КонецЕсли; + +КонецПроцедуры + +// Обновить отображаемые данные на форме объекта со свойствами +// +Процедура ОбновитьЭлементыДополнительныхРеквизитов(Форма, Объект) Экспорт + + Если НЕ Форма.__Свойства_ИспользоватьСвойства + ИЛИ НЕ Форма.__Свойства_ИспользоватьДопРеквизиты Тогда + Возврат; + КонецЕсли; + + НаборСвойствОбъекта = ПолучитьДоступныеНаборыСвойств(Объект); + Форма.__Свойства_ОсновнойНабор = НаборСвойствОбъекта; + + // Перенесем значения доп.реквизитов из реквизитов форм в объект + ПеренестиЗначенияСвойствИзРеквизитовФормы(Форма, Объект); + + // Создадим реквизиты и разместим их на форме + ЗаполнитьДополнительныеРеквизитыНаФорме(Форма, Объект, НаборСвойствОбъекта) + +КонецПроцедуры + +// Используется при записи элементов справочников, которые являются видами объектов со свойствами +// Если есть справочник Сущности к которому применяется подсистема Свойства, для него создан +// справочник ВидыСущностей, то при записи элемента ВидыСущностей необходимо вызывать эту процедуру +// +// Параметры: +// ВидОбъекта - объект, запись которого выполняется +// ИмяОбъектаСоСвойствами - имя объекта со свойствами вид которого записывается +// +Процедура ПередЗаписьюВидаОбъекта(ВидОбъекта, ИмяОбъектаСоСвойствами) Экспорт + + Если Не ЗначениеЗаполнено(ВидОбъекта.НаборСвойств) Тогда + ОбъектНабора = Справочники.НаборыДополнительныхРеквизитовИСведений.СоздатьЭлемент(); + Иначе + Если Не НаборСвойствНужноИзменить(ВидОбъекта) Тогда + Возврат; + КонецЕсли; + + ОбъектНабора = ВидОбъекта.НаборСвойств.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(ОбъектНабора.Ссылка); + КонецЕсли; + + ОбъектНабора.Наименование = ВидОбъекта.Наименование; + ОбъектНабора.Родитель = Справочники.НаборыДополнительныхРеквизитовИСведений[ИмяОбъектаСоСвойствами]; + ОбъектНабора.ПометкаУдаления = ВидОбъекта.ПометкаУдаления; + ОбъектНабора.Записать(); + ВидОбъекта.НаборСвойств = ОбъектНабора.Ссылка; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ФУНКЦИИ ДЛЯ ПОЛУЧЕНИЯ И РЕДАКТИРОВАНИЯ НАБОРОВ СВОЙСТВ + +// По владельцу свойства (ссылке) получает его свойства и их значения +// Параметры: +// ВладелецСвойств - ссылка - ссылка на объект информационной базы - владелец свойств +// ПолучатьДопРеквизиты - булево - в результат включать доп. реквизиты +// ПолучатьДопСведения - булево - в результат включать доп. сведения +// +Функция ПолучитьСписокСвойств(ВладелецСвойств, ПолучатьДопРеквизиты = Истина, ПолучатьДопСведения = Истина) Экспорт + + Если НЕ (ПолучатьДопРеквизиты ИЛИ ПолучатьДопСведения) Тогда + Возврат Новый Массив; + КонецЕсли; + + НаборСвойств = ПолучитьДоступныеНаборыСвойств(ВладелецСвойств); + + Если ТипЗнч(НаборСвойств) = Тип("СписокЗначений") Тогда + МассивСвойств = НаборСвойств.ВыгрузитьЗначения(); + Иначе // элемент справочника + МассивСвойств = Новый Массив; + МассивСвойств.Добавить(НаборСвойств); + КонецЕсли; + + ТекстЗапросаДопРеквизиты = + "ВЫБРАТЬ + | ТаблицаСвойств.Свойство КАК Свойство + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК ТаблицаСвойств + |ГДЕ + | ТаблицаСвойств.Ссылка В (&МассивСвойств)"; + + ТекстЗапросаДопСведения = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ТаблицаСвойств.Свойство КАК Свойство + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения КАК ТаблицаСвойств + |ГДЕ + | ТаблицаСвойств.Ссылка В (&МассивСвойств)"; + + Запрос = Новый Запрос; + + Если ПолучатьДопРеквизиты И ПолучатьДопСведения Тогда + Запрос.Текст = ТекстЗапросаДопСведения + + " + | ОБЪЕДИНИТЬ ВСЕ + |" + + ТекстЗапросаДопРеквизиты; + + ИначеЕсли ПолучатьДопРеквизиты Тогда + Запрос.Текст = ТекстЗапросаДопРеквизиты; + ИначеЕсли ПолучатьДопСведения Тогда + Запрос.Текст = ТекстЗапросаДопСведения; + КонецЕсли; + + Запрос.Параметры.Вставить("МассивСвойств", МассивСвойств); + + Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Свойство"); + + Возврат Результат; + +КонецФункции + +// Возвращает значения дополнительных свойств объекта +// Параметры: +// ВладелецСвойств - ссылка - ссылка на объект информационной базы - владелец свойств +// ПолучатьДопРеквизиты - булево - получать значения доп. реквизитов +// ПолучатьДопСведения - булево - получать значения доп. сведений +// МассивСвойств - Массив - массив свойств, значения которых следует получить, если не передано, +// заполняется по набору собственных свойств объекта +// Возвращаемое значение - таблица значений - колонки "Свойство" и "Значение" +// +Функция ПолучитьЗначенияСвойств(ВладелецСвойств, ПолучатьДопРеквизиты = Истина, ПолучатьДопСведения = Истина,МассивСвойств = Неопределено) Экспорт + + Если МассивСвойств = Неопределено Тогда + МассивСвойств = ПолучитьСписокСвойств(ВладелецСвойств, ПолучатьДопРеквизиты, ПолучатьДопСведения); + КонецЕсли; + + ИмяОбъектаСоСвойствами = ОбщегоНазначения.ИмяТаблицыПоСсылке(ВладелецСвойств); + + ТекстЗапросаДопРеквизиты = + "ВЫБРАТЬ [РАЗРЕШЕННЫЕ] + | ТаблицаСвойств.Свойство КАК Свойство, + | ТаблицаСвойств.Значение КАК Значение + |ИЗ + | [ИмяОбъектаСоСвойствами].ДополнительныеРеквизиты КАК ТаблицаСвойств + |ГДЕ + | ТаблицаСвойств.Ссылка = &ВладелецСвойств + | И ТаблицаСвойств.Свойство В (&МассивСвойств)"; + + ТекстЗапросаДопСведения = + "ВЫБРАТЬ [РАЗРЕШЕННЫЕ] + | ТаблицаСвойств.Свойство КАК Свойство, + | ТаблицаСвойств.Значение КАК Значение + |ИЗ + | РегистрСведений.ДополнительныеСведения КАК ТаблицаСвойств + |ГДЕ + | ТаблицаСвойств.Объект = &ВладелецСвойств + | И ТаблицаСвойств.Свойство В (&МассивСвойств)"; + + Запрос = Новый Запрос; + + Если ПолучатьДопРеквизиты И ПолучатьДопСведения Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапросаДопРеквизиты, "[РАЗРЕШЕННЫЕ]", "РАЗРЕШЕННЫЕ") + + " + | ОБЪЕДИНИТЬ ВСЕ + |" + + СтрЗаменить(ТекстЗапросаДопСведения, "[РАЗРЕШЕННЫЕ]", ""); + + ИначеЕсли ПолучатьДопРеквизиты Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапросаДопРеквизиты, "[РАЗРЕШЕННЫЕ]", "РАЗРЕШЕННЫЕ"); + ИначеЕсли ПолучатьДопСведения Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапросаДопСведения, "[РАЗРЕШЕННЫЕ]", "РАЗРЕШЕННЫЕ"); + КонецЕсли; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяОбъектаСоСвойствами]", ИмяОбъектаСоСвойствами); + + Запрос.Параметры.Вставить("ВладелецСвойств", ВладелецСвойств); + Запрос.Параметры.Вставить("МассивСвойств", МассивСвойств); + Запрос.Текст = ТекстЗапроса; + + Результат = Запрос.Выполнить().Выгрузить(); + + Возврат Результат; + +КонецФункции + +// Проверяет, есть ли у объекта свойство +// Параметры: +// ВладелецСвойств - ссылка - ссылка на объект информационной базы - владелец свойств +// Свойство - ПВХ.ДополнительныеРеквизитыИСведения - +// +Функция ПроверитьСвойствоУОбъекта(ВладелецСвойств, Свойство) Экспорт + + МассивСвойств = ПолучитьСписокСвойств(ВладелецСвойств); + + Если МассивСвойств.Найти(Свойство) = Неопределено Тогда + Возврат Ложь; + Иначе + Возврат Истина; + КонецЕсли; + +КонецФункции + +// Возвращает массив ссылок на элементы справочника ЗначенияСвойствОбъектов, +// у которых владелец - переданное свойство +// Параметр: +// Свойство - ПВХ ДополнительныеРеквизитыИСведения - владелец свойств +// +Функция ПолучитьСписокЗначенийСвойств(Свойство) Экспорт + + ТексЗапроса = + "ВЫБРАТЬ + | Ссылка КАК Ссылка + |ИЗ + | Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов + |ГДЕ + | ЗначенияСвойствОбъектов.Владелец = &Свойство"; + + Запрос = Новый Запрос; + Запрос.Текст = ТексЗапроса; + Запрос.Параметры.Вставить("Свойство", Свойство); + Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + + Возврат Результат; + +КонецФункции + +// Записывает дополнительные реквизиты и сведения владельцу свойств +// Изменения происходят в транзакции. +// Параметры +// ВладелецСвойств - ссылка/объект - ссылка на владельца свойств +// ТаблицаСвойствИЗначений - таблицаЗначений - с колонками +// Свойство - ПВХ.ДополнительныеРеквизитыИСведения +// Значение - любое значение, допустимое в рамках свойства +// +Процедура ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений) Экспорт + + ТаблицаДопРеквизитов = Новый ТаблицаЗначений; + ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения")); + ТаблицаДопРеквизитов.Колонки.Добавить("Значение"); + + ТаблицаДопСведений = ТаблицаДопРеквизитов.СкопироватьКолонки(); + + Для Каждого СтрокаТаблицыСвойств Из ТаблицаСвойствИЗначений Цикл + Если СтрокаТаблицыСвойств.Свойство.ЭтоДополнительноеСведение Тогда + НоваяСтрока = ТаблицаДопСведений.Добавить(); + Иначе + НоваяСтрока = ТаблицаДопРеквизитов.Добавить(); + КонецЕсли; + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицыСвойств, "Свойство,Значение"); + КонецЦикла; + + ЕстьДопРеквизиты = ТаблицаДопРеквизитов.Количество() > 0; + ЕстьДопСведения = ТаблицаДопСведений.Количество() > 0; + + МассивСвойств = ПолучитьСписокСвойств(ВладелецСвойств); + + МассивДопРеквизитов = Новый Массив; + МассивДопСведений = Новый Массив; + + Для Каждого ДопСвойство Из МассивСвойств Цикл + Если ДопСвойство.ЭтоДополнительноеСведение Тогда + МассивДопСведений.Добавить(ДопСвойство); + Иначе + МассивДопРеквизитов.Добавить(ДопСвойство); + КонецЕсли; + КонецЦикла; + + НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); + + Если ЕстьДопРеквизиты Тогда + ВладелецСвойствОбъект = ВладелецСвойств.ПолучитьОбъект(); + ЗаблокироватьДанныеДляРедактирования(ВладелецСвойствОбъект.Ссылка); + Для Каждого ДопРеквизит Из ТаблицаДопРеквизитов Цикл + Если МассивДопРеквизитов.Найти(ДопРеквизит.Свойство) = Неопределено Тогда + Продолжить; + КонецЕсли; + МассивСтрок = ВладелецСвойствОбъект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопРеквизит.Свойство)); + Если МассивСтрок.Количество() Тогда + СтрокаСвойства = МассивСтрок[0]; + Иначе + СтрокаСвойства = ВладелецСвойствОбъект.ДополнительныеРеквизиты.Добавить(); + КонецЕсли; + ЗаполнитьЗначенияСвойств(СтрокаСвойства, ДопРеквизит, "Свойство,Значение"); + КонецЦикла; + ВладелецСвойствОбъект.Записать(); + КонецЕсли; + + Если ЕстьДопСведения Тогда + Для Каждого ДопСведение Из ТаблицаДопСведений Цикл + Если МассивДопСведений.Найти(ДопСведение.Свойство) = Неопределено Тогда + Продолжить; + КонецЕсли; + + МенеджерЗаписи = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи(); + + МенеджерЗаписи.Объект = ВладелецСвойств; + МенеджерЗаписи.Свойство = ДопСведение.Свойство; + МенеджерЗаписи.Значение = ДопСведение.Значение; + + МенеджерЗаписи.Записать(Истина); + КонецЦикла; + + КонецЕсли; + + ЗафиксироватьТранзакцию(); + +КонецПроцедуры + +// Проверяет, используется ли дополнительные реквизиты с объектом +// +Функция ИспользоватьДопРеквизиты(ВладелецСвойств) Экспорт + + Возврат ВладелецСвойств.Метаданные().ТабличныеЧасти.Найти("ДополнительныеРеквизиты") <> Неопределено; + +КонецФункции + +// Проверяет, используется ли дополнительные сведения объектом +// +Функция ИспользоватьДопСведения(ВладелецСвойств) Экспорт + + Возврат Метаданные.НайтиПоПолномуИмени("ОбщаяКоманда.ДополнительныеСведения") <> Неопределено И + Метаданные.ОбщиеКоманды.ДополнительныеСведения.ТипПараметраКоманды.Типы().Найти(ТипЗнч(ВладелецСвойств)) <> Неопределено; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ЭКСПОРТНЫЕ ФУНКЦИИ И ПРОЦЕДУРЫ + +// По объекту или ссылке на объект получить набор или список наборов доступных ему свойств +// Параметры: +// ВладелецСвойств - ссылка на объект или сам объект +Функция ПолучитьДоступныеНаборыСвойств(ВладелецСвойств) Экспорт + + ДоступныеНаборы = УправлениеСвойствамиПереопределяемый.ПолучитьДоступныеНаборыСвойствПоОбъекту(ВладелецСвойств); + + Если ДоступныеНаборы = Неопределено Тогда + Возврат ПолучитьОсновнойНаборСвойствДляОбъекта(ВладелецСвойств); + Иначе + Возврат ДоступныеНаборы; + КонецЕсли; + +КонецФункции + +// Получить заполненную таблицу значений свойств объекта +// +Функция ПолучитьТаблицуЗначенийСвойств(ДополнительныеСвойстваОбъекта, Набор, ЭтоДополнительноеСведение) Экспорт + + масСвойств = ДополнительныеСвойстваОбъекта.ВыгрузитьКолонку("Свойство"); + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | НаборыСвойствДополнительныеРеквизиты.Свойство КАК Свойство, + | МИНИМУМ(НаборыСвойствДополнительныеРеквизиты.НомерСтроки) КАК Порядок + |ПОМЕСТИТЬ ВсеСвойстваНабора + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК НаборыСвойствДополнительныеРеквизиты + |ГДЕ + | НаборыСвойствДополнительныеРеквизиты.Ссылка В(&Набор) + | И (НЕ НаборыСвойствДополнительныеРеквизиты.Ссылка.ПометкаУдаления) + | И (НЕ НаборыСвойствДополнительныеРеквизиты.Ссылка.ЭтоГруппа) + | И (НЕ &ЭтоДополнительноеСведение) + | + |СГРУППИРОВАТЬ ПО + | НаборыСвойствДополнительныеРеквизиты.Свойство + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | НаборыСвойствДополнительныеСведения.Свойство, + | МИНИМУМ(НаборыСвойствДополнительныеСведения.НомерСтроки) + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения КАК НаборыСвойствДополнительныеСведения + |ГДЕ + | НаборыСвойствДополнительныеСведения.Ссылка В(&Набор) + | И (НЕ НаборыСвойствДополнительныеСведения.Ссылка.ПометкаУдаления) + | И (НЕ НаборыСвойствДополнительныеСведения.Ссылка.ЭтоГруппа) + | И &ЭтоДополнительноеСведение + | + |СГРУППИРОВАТЬ ПО + | НаборыСвойствДополнительныеСведения.Свойство + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | ДополнительныеРеквизитыИСведения.Ссылка КАК Свойство + |ПОМЕСТИТЬ ЗаполненныеСвойства + |ИЗ + | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения + |ГДЕ + | ДополнительныеРеквизитыИСведения.Ссылка В(&масСвойств) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ВсеСвойстваНабора.Свойство, + | ВсеСвойстваНабора.Порядок, + | ЛОЖЬ КАК Удалено + |ПОМЕСТИТЬ ВсеСвойства + |ИЗ + | ВсеСвойстваНабора КАК ВсеСвойстваНабора + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ЗаполненныеСвойства.Свойство, + | 0, + | ИСТИНА + |ИЗ + | ЗаполненныеСвойства КАК ЗаполненныеСвойства + | ЛЕВОЕ СОЕДИНЕНИЕ ВсеСвойстваНабора КАК ВсеСвойстваНабора + | ПО ЗаполненныеСвойства.Свойство = ВсеСвойстваНабора.Свойство + |ГДЕ + | ВсеСвойстваНабора.Свойство ЕСТЬ NULL + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ВсеСвойства.Свойство, + | ДополнительныеРеквизитыИСведения.Наименование, + | ДополнительныеРеквизитыИСведения.ТипЗначения, + | ДополнительныеРеквизитыИСведения.ФорматСвойства, + | ДополнительныеРеквизитыИСведения.МногострочноеПолеВвода, + | ВсеСвойства.Удалено КАК Удалено + |ИЗ + | ВсеСвойства КАК ВсеСвойства + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения + | ПО ВсеСвойства.Свойство = ДополнительныеРеквизитыИСведения.Ссылка + | + |УПОРЯДОЧИТЬ ПО + | Удалено, + | ВсеСвойства.Порядок"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + Запрос.УстановитьПараметр("ЭтоДополнительноеСведение", ЭтоДополнительноеСведение); + Запрос.УстановитьПараметр("масСвойств", масСвойств); + Запрос.УстановитьПараметр("Набор", Набор); + + ТабСвойства = Запрос.Выполнить().Выгрузить(); + ТабСвойства.Индексы.Добавить("Свойство"); + ТабСвойства.Колонки.Добавить("Значение"); + + Для Каждого Стр Из ДополнительныеСвойстваОбъекта Цикл + СтрСвойства = ТабСвойства.Найти(Стр.Свойство, "Свойство"); + Если СтрСвойства <> Неопределено Тогда + /////////////////////////////////////////////////////////////// + // поддержка строк неограниченной длины + Если НЕ ЭтоДополнительноеСведение + И ИспользоватьНеограниченнуюСтроку(СтрСвойства.ТипЗначения, СтрСвойства.МногострочноеПолеВвода) + И НЕ ПустаяСтрока(Стр.ТекстоваяСтрока) Тогда + СтрСвойства.Значение = Стр.ТекстоваяСтрока; + // + /////////////////////////////////////////////////////////////// + Иначе + СтрСвойства.Значение = Стр.Значение; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат ТабСвойства; + +КонецФункции + +// Считывает и возвращает значения доп. сведений +// +Функция ПрочитатьЗначенияСвойствИзРегистраСведений(ВладелецСвойства) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ДополнительныеСведения.Свойство, + | ДополнительныеСведения.Значение + |ИЗ + | РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения + |ГДЕ + | ДополнительныеСведения.Объект = &Объект"; + Запрос.УстановитьПараметр("Объект", ВладелецСвойства); + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ФУНКЦИИ И ПРОЦЕДУРЫ + +// По объекту или по ссылке на объект и по имени реквизита, содержащего вид объекта +// получает основной набор свойств. +// Для ссылки на справочник "Сущности" функция вернет +// предопределенный элемент справочника НаборыДополнительныхРеквизитовИСведений "Справочник_Сущности". +// Если передан параметр ВидОбъектаИмяРеквизита, функция вернет ссылку на +// набор свойств, содержащийся в Ссылка.<ВидОбъектаИмяРеквизита> +// +Функция ПолучитьОсновнойНаборСвойствДляОбъекта(ВладелецСвойств) + + МетаданныеОбъекта = ВладелецСвойств.Метаданные(); + ИмяОбъекта = МетаданныеОбъекта.Имя; + + ПереданОбъект = Ложь; + Если ОбщегоНазначения.ЗначениеСсылочногоТипа(ВладелецСвойств) Тогда + Ссылка = ВладелецСвойств; + Иначе + ПереданОбъект = Истина; + Ссылка = ВладелецСвойств.Ссылка; + КонецЕсли; + + ВидОбъекта = ОбщегоНазначения.ВидОбъектаПоСсылке(Ссылка); + ВидОбъектаИмяРеквизита = УправлениеСвойствамиПереопределяемый.ПолучитьИмяРеквизитаВидаОбъекта(Ссылка); + Если ВидОбъектаИмяРеквизита = "" Тогда + Если ВидОбъекта = "Справочник" или ВидОбъекта = "ПланВидовХарактеристик" Тогда + Если ОбщегоНазначения.ОбъектЯвляетсяГруппой(ВладелецСвойств) Тогда + Возврат Неопределено; + КонецЕсли; + КонецЕсли; + ИмяЭлемента = ВидОбъекта + "_" + ИмяОбъекта; + Возврат Справочники.НаборыДополнительныхРеквизитовИСведений[ИмяЭлемента]; + + Иначе + Если ПереданОбъект = Истина Тогда + Возврат ОбщегоНазначения.ПолучитьЗначениеРеквизита(ВладелецСвойств[ВидОбъектаИмяРеквизита], "НаборСвойств"); + + Иначе + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ОбъектВладелецСвойств." + ВидОбъектаИмяРеквизита + ".НаборСвойств КАК Набор + |ИЗ + | " + ВидОбъекта + "." + ИмяОбъекта + " КАК ОбъектВладелецСвойств + |ГДЕ + | ОбъектВладелецСвойств.Ссылка = &Ссылка"; + + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Результат = Запрос.Выполнить(); + + Если НЕ Результат.Пустой() Тогда + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + Если ЗначениеЗаполнено(Выборка.Набор) Тогда + Возврат Выборка.Набор; + Иначе + Возврат Справочники.НаборыДополнительныхРеквизитовИСведений.ПустаяСсылка(); + КонецЕсли; + Иначе + Возврат Справочники.НаборыДополнительныхРеквизитовИСведений.ПустаяСсылка(); + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + +КонецФункции + +// Создать основные объекты (реквизиты, команды, элементы) на форме объекта со свойствами +Процедура СоздатьОсновныеОбъектыФормы(Форма, ИмяЭлементаДляРазмещения, НаборСвойствОбъекта, ИспользоватьДопРеквизиты) + + масРеквизитов = Новый Массив; + + // Проверим значение функциональной опции "Использование свойств" + ОпцияИспользоватьСвойства = Форма.ПолучитьФункциональнуюОпциюФормы("ИспользоватьДополнительныеРеквизитыИСведения"); + РеквизитИспользоватьСвойства = Новый РеквизитФормы("__Свойства_ИспользоватьСвойства", Новый ОписаниеТипов("Булево")); + масРеквизитов.Добавить(РеквизитИспользоватьСвойства); + + Если ОпцияИспользоватьСвойства Тогда + + РеквизитИспользоватьДопРеквизиты = Новый РеквизитФормы("__Свойства_ИспользоватьДопРеквизиты", Новый ОписаниеТипов("Булево")); + масРеквизитов.Добавить(РеквизитИспользоватьДопРеквизиты); + + // Добавим реквизит "ОсновнойНабор" + ИмяТипа = ?(ТипЗнч(НаборСвойствОбъекта) = Тип("СписокЗначений"), "СписокЗначений", "СправочникСсылка.НаборыДополнительныхРеквизитовИСведений"); + РеквизитОсновнойНабор = Новый РеквизитФормы("__Свойства_ОсновнойНабор", Новый ОписаниеТипов(ИмяТипа)); + масРеквизитов.Добавить(РеквизитОсновнойНабор); + + Если ИспользоватьДопРеквизиты Тогда + // Добавим реквизит таблицу значений "ОписаниеДополнительныхРеквизитов" с колонками + ИмяОписания = "__Свойства_ОписаниеДополнительныхРеквизитов"; + РеквизитОписание_0 = Новый РеквизитФормы(ИмяОписания, Новый ОписаниеТипов("ТаблицаЗначений")); + РеквизитОписание_1 = Новый РеквизитФормы("ИмяРеквизитаЗначение", Новый ОписаниеТипов("Строка"), ИмяОписания); + РеквизитОписание_2 = Новый РеквизитФормы("ИмяРеквизитаСвойство", Новый ОписаниеТипов("Строка"), ИмяОписания); + РеквизитОписание_3 = Новый РеквизитФормы("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"), ИмяОписания); + масРеквизитов.Добавить(РеквизитОписание_0); + масРеквизитов.Добавить(РеквизитОписание_1); + масРеквизитов.Добавить(РеквизитОписание_2); + масРеквизитов.Добавить(РеквизитОписание_3); + + // Добавим реквизит с именем элемента в котором будут размещаться поля ввода + РеквизитИмяЭлемента = Новый РеквизитФормы("__Свойства_ИмяЭлементаДляРазмещения", Новый ОписаниеТипов("Строка")); + масРеквизитов.Добавить(РеквизитИмяЭлемента); + КонецЕсли; + + // Команду формы добавляем только если установлена роль "ДобавлениеИзменениеБазовойНСИ" или + // это полноправный пользователь + Если РольДоступна(Метаданные.Роли.ДобавлениеИзменениеБазовойНСИ) + Или Пользователи.ЭтоПолноправныйПользовательИБ() Тогда + // Добавляем команду + Команда = Форма.Команды.Добавить("РедактироватьСоставСвойств"); + Команда.Заголовок = НСтр("ru = 'Изменить состав доп. реквизитов и сведений'"); + Команда.Действие = "Подключаемый_РедактироватьСоставСвойств"; + Команда.Подсказка = НСтр("ru = 'Изменить состав дополнительных реквизитов и сведений'"); + Команда.Картинка = БиблиотекаКартинок.НастройкаСписка; + + Кнопка = Форма.Элементы.Добавить("РедактироватьСоставСвойств", Тип("КнопкаФормы"), Форма.КоманднаяПанель); + Кнопка.ТолькоВоВсехДействиях = Истина; + Кнопка.ИмяКоманды = "РедактироватьСоставСвойств"; + КонецЕсли; + КонецЕсли; + + Форма.ИзменитьРеквизиты(масРеквизитов); + + Форма.__Свойства_ИспользоватьСвойства = ОпцияИспользоватьСвойства; + + Если ОпцияИспользоватьСвойства Тогда + Форма.__Свойства_ИспользоватьДопРеквизиты = ИспользоватьДопРеквизиты; + КонецЕсли; + + Если ОпцияИспользоватьСвойства И ИспользоватьДопРеквизиты Тогда + Форма.__Свойства_ИмяЭлементаДляРазмещения = ИмяЭлементаДляРазмещения; + КонецЕсли; + +КонецПроцедуры + +/////////////////////////////////////////////////////////////// +// поддержка многострочного поля ввода +Функция ИспользоватьНеограниченнуюСтроку(ТипЗначенияСвойства, МногострочноеПолеВвода) Экспорт + + Если ТипЗначенияСвойства.СодержитТип(Тип("Строка")) + И ТипЗначенияСвойства.Типы().Количество() = 1 + И МногострочноеПолеВвода > 1 Тогда + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; + +КонецФункции +// +/////////////////////////////////////////////////////////////// + +// Создадим реквизиты с значениями свойств и разместить их на форме +Процедура ЗаполнитьДополнительныеРеквизитыНаФорме(Форма, Объект, НаборСвойствОбъекта) + + Если НаборСвойствОбъекта = Неопределено Тогда + Набор = Форма.__Свойства_ОсновнойНабор; + Иначе + Набор = НаборСвойствОбъекта; + КонецЕсли; + + Таблица = ПолучитьТаблицуЗначенийСвойств(Объект.ДополнительныеРеквизиты.Выгрузить(), Набор, Ложь); + Таблица.Колонки.Добавить("ИмяРеквизитаЗначение"); + Таблица.Колонки.Добавить("ИмяРеквизитаСвойство"); + Таблица.Колонки.Добавить("Булево"); + + УдалитьСтарыеРеквизиты(Форма); + Форма.__Свойства_ОписаниеДополнительныхРеквизитов.Очистить(); + + // Создадим реквизиты + Номер = 0; + ДобавляемыеРеквизиты = Новый Массив(); + Для Каждого СтрРеквизит Из Таблица Цикл + + Номер = Номер + 1; + ТипЗначенияСвойства = СтрРеквизит.ТипЗначения; + + /////////////////////////////////////////////////////////////// + // поддержка строк неограниченной длины + Если ИспользоватьНеограниченнуюСтроку(ТипЗначенияСвойства, СтрРеквизит.МногострочноеПолеВвода) Тогда + ТипЗначенияСвойства = Новый ОписаниеТипов("Строка"); + КонецЕсли; + // + /////////////////////////////////////////////////////////////// + + СтрРеквизит.ИмяРеквизитаЗначение = "ДополнительныйРеквизитЗначение" + Формат(Номер, "ЧГ=0"); + Реквизит = Новый РеквизитФормы(СтрРеквизит.ИмяРеквизитаЗначение, ТипЗначенияСвойства, , СтрРеквизит.Наименование, Истина); + ДобавляемыеРеквизиты.Добавить(Реквизит); + + СтрРеквизит.ИмяРеквизитаСвойство = ""; + Если ТипЗначенияСодержитЗначенияСвойств(ТипЗначенияСвойства) Тогда + СтрРеквизит.ИмяРеквизитаСвойство = "ДополнительныйРеквизитСвойство" + Формат(Номер, "ЧГ=0"); + Реквизит = Новый РеквизитФормы(СтрРеквизит.ИмяРеквизитаСвойство, Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"), , , Истина); + ДобавляемыеРеквизиты.Добавить(Реквизит); + КонецЕсли; + + СтрРеквизит.Булево = ОбщегоНазначения.ОписаниеТипаСостоитИзТипа(ТипЗначенияСвойства, Тип("Булево")); + + КонецЦикла; + Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); + + // Создадим элементы формы + Для Каждого СтрРеквизит Из Таблица Цикл + + новСтр = Форма.__Свойства_ОписаниеДополнительныхРеквизитов.Добавить(); + новСтр.ИмяРеквизитаЗначение = СтрРеквизит.ИмяРеквизитаЗначение; + новСтр.ИмяРеквизитаСвойство = СтрРеквизит.ИмяРеквизитаСвойство; + новСтр.Свойство = СтрРеквизит.Свойство; + + Форма[СтрРеквизит.ИмяРеквизитаЗначение] = СтрРеквизит.Значение; + + ИмяЭлементаДляРазмещения = Форма.__Свойства_ИмяЭлементаДляРазмещения; + Родитель = ?(ИмяЭлементаДляРазмещения = "", Неопределено, Форма.Элементы[ИмяЭлементаДляРазмещения]); + Элемент = Форма.Элементы.Добавить(СтрРеквизит.ИмяРеквизитаЗначение, Тип("ПолеФормы"), Родитель); + + Если СтрРеквизит.Булево И ПустаяСтрока(СтрРеквизит.ФорматСвойства) Тогда + Элемент.Вид = ВидПоляФормы.ПолеФлажка + Иначе + Элемент.Вид = ВидПоляФормы.ПолеВвода; + КонецЕсли; + + Элемент.ПутьКДанным = СтрРеквизит.ИмяРеквизитаЗначение; + Элемент.Подсказка = СтрРеквизит.Свойство.Подсказка; + + Если СтрРеквизит.Свойство.МногострочноеПолеВвода > 0 Тогда + Элемент.МногострочныйРежим = Истина; + Элемент.Высота= СтрРеквизит.Свойство.МногострочноеПолеВвода; + КонецЕсли; + + Если НЕ ПустаяСтрока(СтрРеквизит.ФорматСвойства) Тогда + Элемент.Формат = СтрРеквизит.ФорматСвойства; + Элемент.ФорматРедактирования = СтрРеквизит.ФорматСвойства; + КонецЕсли; + + Если СтрРеквизит.Удалено Тогда + Элемент.ЦветТекстаЗаголовка = ЦветаСтиля.УдаленныйДополнительныйРеквизитЦвет; + Элемент.ШрифтЗаголовка = ШрифтыСтиля.УдаленныйДополнительныйРеквизитШрифт; + КонецЕсли; + + Если СтрРеквизит.ИмяРеквизитаСвойство <> "" Тогда + Связь = Новый СвязьПараметраВыбора("Отбор.Владелец", СтрРеквизит.ИмяРеквизитаСвойство); + масСвязи = Новый Массив; + масСвязи.Добавить(Связь); + Элемент.СвязиПараметровВыбора = Новый ФиксированныйМассив(масСвязи); + Форма[СтрРеквизит.ИмяРеквизитаСвойство] = СтрРеквизит.Свойство; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Перенести значения свойств из реквизитов формы в табличную часть объекта +Процедура ПеренестиЗначенияСвойствИзРеквизитовФормы(Форма, Объект) + + Объект.ДополнительныеРеквизиты.Очистить(); + + Для Каждого Стр Из Форма.__Свойства_ОписаниеДополнительныхРеквизитов Цикл + Значение = Форма[Стр.ИмяРеквизитаЗначение]; + Если ЗначениеЗаполнено(Значение) Тогда + Если ТипЗнч(Значение) = Тип("Булево") И Значение = Ложь Тогда + Продолжить; + КонецЕсли; + + новСтр = Объект.ДополнительныеРеквизиты.Добавить(); + новСтр.Свойство = Стр.Свойство; + новСтр.Значение = Значение; + + /////////////////////////////////////////////////////////////// + // поддержка строк неограниченной длины + Свойство = Стр.Свойство.ПолучитьОбъект(); + Если ИспользоватьНеограниченнуюСтроку(Свойство.ТипЗначения, Свойство.МногострочноеПолеВвода) Тогда + новСтр.ТекстоваяСтрока = Значение; + КонецЕсли; + // + /////////////////////////////////////////////////////////////// + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Удалить старые реквизиты и элементы формы +Процедура УдалитьСтарыеРеквизиты(Форма) + + // Удалим старые реквизиты и элементы + масУдалять = Новый Массив; + Для Каждого СтрРеквизит Из Форма.__Свойства_ОписаниеДополнительныхРеквизитов Цикл + + масУдалять.Добавить(СтрРеквизит.ИмяРеквизитаЗначение); + Если Не ПустаяСтрока(СтрРеквизит.ИмяРеквизитаСвойство) Тогда + масУдалять.Добавить(СтрРеквизит.ИмяРеквизитаСвойство); + КонецЕсли; + + Форма.Элементы.Удалить(Форма.Элементы[СтрРеквизит.ИмяРеквизитаЗначение]); + + КонецЦикла; + + Если масУдалять.Количество() Тогда + Форма.ИзменитьРеквизиты(, масУдалять); + КонецЕсли; + +КонецПроцедуры + +// Проверить, что тип значения свойства содержит ссылку на справочник ЗначенияСвойствОбъектов +Функция ТипЗначенияСодержитЗначенияСвойств(ТипЗначения) + + Возврат ТипЗначения.Типы().Найти(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")) <> Неопределено; + +КонецФункции + +// проверка того, что элемент набора свойств нужно изменить из-за изменений в виде объекта +Функция НаборСвойствНужноИзменить(ВидОбъекта) + Результат = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ВидОбъекта.НаборСвойств, "Наименование,ПометкаУдаления"); + Возврат (Результат.Наименование <> ВидОбъекта.Наименование) ИЛИ (Результат.ПометкаУдаления <> ВидОбъекта.ПометкаУдаления); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ ОБНОВЛЕНИЯ ИНФОРМАЦИОННОЙ БАЗЫ + +Процедура ОбновитьСписокДополнительныхСвойств() Экспорт + + НаборыДополнительныхРеквизитовИСведений = Справочники.НаборыДополнительныхРеквизитовИСведений.Выбрать(); + + Пока НаборыДополнительныхРеквизитовИСведений.Следующий() Цикл + + ДопСведения = Новый Массив; + + НаборСвойствОбъект = НаборыДополнительныхРеквизитовИСведений.Ссылка.ПолучитьОбъект(); + + Для Каждого Запись Из НаборСвойствОбъект.ДополнительныеРеквизиты Цикл + Если Запись.Свойство.ЭтоДополнительноеСведение Тогда + ДопСведения.Добавить(Запись); + КонецЕсли; + КонецЦикла; + + Если ДопСведения.Количество() > 0 Тогда + + Для Каждого ДопСведение Из ДопСведения Цикл + НоваяСтрока = НаборСвойствОбъект.ДополнительныеСведения.Добавить(); + НоваяСтрока.Свойство = ДопСведение.Свойство; + НаборСвойствОбъект.ДополнительныеРеквизиты.Удалить( + НаборСвойствОбъект.ДополнительныеРеквизиты.Индекс(ДопСведение)); + + КонецЦикла; + НаборСвойствОбъект.Записать(); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ОбновитьПереименованныеРоли_БСП_1_0_7_1() Экспорт + + Если Метаданные.НайтиПоПолномуИмени("ОбщийМодуль.УправлениеДоступом") <> Неопределено Тогда + + УправлениеДоступомМодуль = Вычислить("УправлениеДоступом"); + + ПереименованныеРоли = Новый ТаблицаЗначений; + ПереименованныеРоли.Колонки.Добавить("СтароеИмяРоли"); + ПереименованныеРоли.Колонки.Добавить("НовоеИмяРоли"); + + ПереименованнаяРоль = ПереименованныеРоли.Добавить(); + ПереименованнаяРоль.СтароеИмяРоли = "ДобавлениеИзменениеДополнительныхСведений"; + ПереименованнаяРоль.НовоеИмяРоли = "ИзменениеДополнительныхСведений"; + + УправлениеДоступомМодуль.ОбновитьПереименованныеРоли(ПереименованныеРоли); + + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/УправлениеСвойствами/УправлениеСвойствами.mdo b/SSL/src/CommonModules/УправлениеСвойствами/УправлениеСвойствами.mdo new file mode 100644 index 000000000..91ceb1324 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеСвойствами/УправлениеСвойствами.mdo @@ -0,0 +1,10 @@ + + + УправлениеСвойствами + + ru + Управление свойствами + + true + true + diff --git a/SSL/src/CommonModules/УправлениеСвойствамиКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствамиКлиент/Module.bsl new file mode 100644 index 000000000..e390d6d60 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеСвойствамиКлиент/Module.bsl @@ -0,0 +1,57 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ОБЩЕГО НАЗНАЧЕНИЯ + +// Выполнить редактирование состава свойств +// +Процедура РедактироватьСоставСвойств(Форма, Ссылка) Экспорт + + Наборы = Форма.__Свойства_ОсновнойНабор; + // Если вернули СправочникСсылка.НаборыДополнительныхРеквизитовИСведений, то это объект с одним набором свойств + Если ТипЗнч(Наборы) = Тип("СправочникСсылка.НаборыДополнительныхРеквизитовИСведений") Тогда + Если ЗначениеЗаполнено(Наборы) Тогда + ПараметрыФормыНабораСвойств = Новый Структура("Ключ", Форма.__Свойства_ОсновнойНабор); + ОткрытьФорму("Справочник.НаборыДополнительныхРеквизитовИСведений.Форма.ФормаЭлемента", ПараметрыФормыНабораСвойств); + Иначе + Предупреждение(НСтр("ru = 'Нельзя получить набор свойств объекта. Возможно не заполнены необходимые реквизиты.'")); + КонецЕсли; + + // ...Иначе - это объект у которого может быть несколько наборов свойств + // и требуется выбрать редактируемый набор + Иначе + Если Наборы.Количество() = 1 Тогда + Элемент = Наборы.Получить(0); + Иначе + Элемент = Наборы.ВыбратьЭлемент(); + Если Элемент = Неопределено Тогда + Возврат; + КонецЕсли; + + КонецЕсли; + ПараметрыФормыНабораСвойств = Новый Структура("Ключ", Элемент.Значение); + ОткрытьФорму("Справочник.НаборыДополнительныхРеквизитовИСведений.Форма.ФормаЭлемента", ПараметрыФормыНабораСвойств); + + КонецЕсли; + +КонецПроцедуры + +// Проверить, связано ли оповещение с изменением набора свойств и нужно ли +// обрабатывать его в текущей форме +Функция ОбрабатыватьОповещения(Форма, ИмяСобытия, Параметр) Экспорт + + Если (ИмяСобытия <> "ИзмененНаборСвойств") ИЛИ Не Форма.__Свойства_ИспользоватьСвойства Тогда + Возврат Ложь; + + ИначеЕсли Форма.__Свойства_ОсновнойНабор = Параметр Тогда + Возврат Истина; + + ИначеЕсли (ТипЗнч(Форма.__Свойства_ОсновнойНабор) = Тип("СписокЗначений")) + И (Форма.__Свойства_ОсновнойНабор.НайтиПоЗначению(Параметр) <> Неопределено) Тогда + Возврат Истина; + + Иначе + + Возврат Ложь; + + КонецЕсли; + +КонецФункции diff --git a/SSL/src/CommonModules/УправлениеСвойствамиКлиент/УправлениеСвойствамиКлиент.mdo b/SSL/src/CommonModules/УправлениеСвойствамиКлиент/УправлениеСвойствамиКлиент.mdo new file mode 100644 index 000000000..3beee1523 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеСвойствамиКлиент/УправлениеСвойствамиКлиент.mdo @@ -0,0 +1,11 @@ + + + УправлениеСвойствамиКлиент + + ru + Управление свойствами клиент + + true + true + true + diff --git a/SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/Module.bsl new file mode 100644 index 000000000..4bf187967 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/Module.bsl @@ -0,0 +1,24 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПЕРЕОПРЕДЕЛЯЕМЫЕ ФУНКЦИИ ПОДСИСТЕМЫ СВОЙСТВА + +// Получить доступные наборы свойств для объекта +// +// Возвращаемые значения: +// Список значений (в т.ч. пустой), если объект может содержать несколько наборов свойств +// НеОпределено если объект не может содержать несколько наборов свойств +// +Функция ПолучитьДоступныеНаборыСвойствПоОбъекту(Объект) Экспорт + + Возврат Неопределено; + +КонецФункции + +// Возвращает имя реквизита объекта-владельца свойств в котором содержится вид объекта +Функция ПолучитьИмяРеквизитаВидаОбъекта(Ссылка) Экспорт + + Возврат ""; + +КонецФункции + + diff --git a/SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/УправлениеСвойствамиПереопределяемый.mdo b/SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/УправлениеСвойствамиПереопределяемый.mdo new file mode 100644 index 000000000..b5f87ff60 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/УправлениеСвойствамиПереопределяемый.mdo @@ -0,0 +1,10 @@ + + + УправлениеСвойствамиПереопределяемый + + ru + Управление свойствами переопределяемый + + true + true + diff --git a/SSL/src/CommonModules/ФайловыеФункции/Module.bsl b/SSL/src/CommonModules/ФайловыеФункции/Module.bsl new file mode 100644 index 000000000..80c4f058a --- /dev/null +++ b/SSL/src/CommonModules/ФайловыеФункции/Module.bsl @@ -0,0 +1,140 @@ +// Извлекает текст из файлов на диске +Процедура ИзвлечениеТекста() Экспорт + + ТипПлатформыСервера = РаботаСФайламиПовтИсп.ТипПлатформыСервера(); + Если ТипПлатформыСервера <> ТипПлатформы.Windows_x86 И ТипПлатформыСервера <> ТипПлатформы.Windows_x86_64 Тогда + Возврат; // извлечение текста работает только под Windows + КонецЕсли; + + ИмяСРасширениемФайла = ""; + + Попытка + ЗаписьЖурналаРегистрации("Извлечение текста", + УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Начато регламентное извлечение текста'")); + + Запрос = Новый Запрос; + + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 100 + | ВерсииФайлов.Ссылка КАК Ссылка, + | ВерсииФайлов.СтатусИзвлеченияТекста КАК СтатусИзвлеченияТекста, + | ВерсииФайлов.ТипХраненияФайла КАК ТипХраненияФайла + |ИЗ + | Справочник.ВерсииФайлов КАК ВерсииФайлов + |ГДЕ + | (ВерсииФайлов.СтатусИзвлеченияТекста = &Статус + | ИЛИ ВерсииФайлов.СтатусИзвлеченияТекста = ЗНАЧЕНИЕ(Перечисление.СтатусыИзвлеченияТекстаФайлов.ПустаяСсылка)) + | И ВерсииФайлов.Зашифрован = &Зашифрован"; + + Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен); + Запрос.УстановитьПараметр("Зашифрован", Ложь); + + Результат = Запрос.Выполнить(); + ТаблицаВыгрузки = Результат.Выгрузить(); + + Для Каждого Строка Из ТаблицаВыгрузки Цикл + ТекущаяВерсия = Строка.Ссылка.ПолучитьОбъект(); + + ИмяСРасширениемФайла = ТекущаяВерсия.ПолноеНаименование + "." + ТекущаяВерсия.Расширение; + + ИмяФайлаСПутем = ""; + ТипХраненияФайла = Строка.ТипХраненияФайла; + + Попытка + + Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + ДвоичныеДанныеФайла = ТекущаяВерсия.ФайлХранилище.Получить(); + + ИмяФайлаСПутем = ПолучитьИмяВременногоФайла(ТекущаяВерсия.Расширение); + // Сохраним файл из БД на диск + ДвоичныеДанныеФайла.Записать(ИмяФайлаСПутем); + Иначе // тут файл на диске + + Если НЕ ТекущаяВерсия.Том.Пустая() Тогда + ИмяФайлаСПутем = РаботаСФайлами.ПолныйПутьТома(ТекущаяВерсия.Том) + ТекущаяВерсия.ПутьКФайлу; + КонецЕсли; + + КонецЕсли; + + + Текст = ""; + + Если ИмяФайлаСПутем <> "" Тогда + // Извлекаем текст из файла + Извлечение = Новый ИзвлечениеТекста(ИмяФайлаСПутем); + Текст = Извлечение.ПолучитьТекст(); + ТекущаяВерсия.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен; + КонецЕсли; + + Исключение // Ничего не пишем - это нормальная ситуация - когда Текст некому извлечь + ТекущаяВерсия.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.ИзвлечьНеУдалось; + КонецПопытки; + + Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда + УдалитьФайлы(ИмяФайлаСПутем); + КонецЕсли; + + ТекущаяВерсия.ТекстХранилище = Новый ХранилищеЗначения(Текст, Новый СжатиеДанных); + + ФайлЗаблокирован = Ложь; + + Файл = ТекущаяВерсия.Владелец; + Если Файл.ТекущаяВерсия = Строка.Ссылка Тогда + Попытка + ЗаблокироватьДанныеДляРедактирования(Файл); + ФайлЗаблокирован = Истина; + Исключение + Продолжить; // ничего не сообщаем, обрабатываем следующий объект ВерсииФайлов + КонецПопытки; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + НачатьТранзакцию(); + Попытка + ТекущаяВерсия.Записать(); + + Если Файл.ТекущаяВерсия = Строка.Ссылка Тогда + ФайлОбъект = Файл.ПолучитьОбъект(); + ФайлОбъект.ТекстХранилище = ТекущаяВерсия.ТекстХранилище; + ФайлОбъект.Записать(); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + УстановитьПривилегированныйРежим(Ложь); + + Если ФайлЗаблокирован Тогда + РазблокироватьДанныеДляРедактирования(Файл); + КонецЕсли; + + Исключение + ОтменитьТранзакцию(); + УстановитьПривилегированныйРежим(Ложь); + + Если ФайлЗаблокирован Тогда + РазблокироватьДанныеДляРедактирования(Файл); + КонецЕсли; + + ВызватьИсключение; + КонецПопытки; + + КонецЦикла; + + ЗаписьЖурналаРегистрации("Извлечение текста", + УровеньЖурналаРегистрации.Информация, , , + НСтр("ru = 'Закончено регламентное извлечение текста'")); + Исключение + + ОписаниеОшибкиИнфо = ОписаниеОшибки(); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Во время регламентного извлечения текста из файла ""%1"" произошла неизвестная ошибка.'"), + ИмяСРасширениемФайла); + ТекстСообщения = ТекстСообщения + Строка(ОписаниеОшибкиИнфо); + + ЗаписьЖурналаРегистрации("Извлечение текста", + УровеньЖурналаРегистрации.Ошибка, , , + ТекстСообщения); + + КонецПопытки; +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ФайловыеФункции/ФайловыеФункции.mdo b/SSL/src/CommonModules/ФайловыеФункции/ФайловыеФункции.mdo new file mode 100644 index 000000000..8a5b2d8ad --- /dev/null +++ b/SSL/src/CommonModules/ФайловыеФункции/ФайловыеФункции.mdo @@ -0,0 +1,10 @@ + + + ФайловыеФункции + + ru + Файловые функции + + true + true + diff --git a/SSL/src/CommonModules/ФайловыеФункцииКлиент/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииКлиент/Module.bsl new file mode 100644 index 000000000..778c426a8 --- /dev/null +++ b/SSL/src/CommonModules/ФайловыеФункцииКлиент/Module.bsl @@ -0,0 +1,1027 @@ + +// Функция возвращает каталог "Мои Документы" + имя текущего пользователя +Функция КаталогПоследнейВыгрузки() Экспорт + Путь = ""; + #Если Не ВебКлиент Тогда + + Путь = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ИмяПапкиВыгрузки", "ИмяПапкиВыгрузки"); + Если Путь = Неопределено Тогда + Если НЕ СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + Оболочка = Новый COMОбъект("MSScriptControl.ScriptControl"); + Оболочка.Language = "vbscript"; + Оболочка.AddCode(" + |Function SpecialFoldersName(Name) + |set Shell=CreateObject(""WScript.Shell"") + |SpecialFoldersName=Shell.SpecialFolders(Name) + |End Function"); + Путь = НормализоватьКаталог(Оболочка.Run("SpecialFoldersName", "MyDocuments")); + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ИмяПапкиВыгрузки", "ИмяПапкиВыгрузки", Путь); + КонецЕсли; + КонецЕсли; + + #КонецЕсли + Возврат Путь; +КонецФункции + +// Функция добавляет концевой слэш к имени каталога, если это надо +// а также удаляет все запрещенные символы из имени каталога +// кроме того, "/" заменяется на "\" +Функция НормализоватьКаталог(ИмяКаталога) Экспорт + Результат = СокрЛП(ИмяКаталога); + + // Запомним наличие "Диск:" в начале пути и потом вернем ":" после имени диска + СтрДиск = ""; + Если Сред(Результат, 2, 1) = ":" Тогда + СтрДиск = Сред(Результат, 1, 2); + Результат = Сред(Результат, 3); + Иначе + + // А здесь проверим, что у нас не UNC-путь (т.е. путь начинающийся на "\\") + Если Сред(Результат, 2, 2) = "\\" Тогда + СтрДиск = Сред(Результат, 1, 2); + Результат = Сред(Результат, 3); + КонецЕсли; + КонецЕсли; + + // Делаем слэши в Windows-стиле + Результат = СтрЗаменить(Результат, "/", "\"); + + // Добавляем финишный слэш + Результат = СокрЛП(Результат); + Если Прав(Результат,1) <> "\" Тогда + Результат = Результат + "\"; + КонецЕсли; + + // Заменим все двойные слэши на одинарные и получим полный путь + Результат = СтрДиск + СтрЗаменить(Результат, "\\", "\"); + + Возврат Результат; +КонецФункции + +// Процедура предназначена для проверки имени файла на наличие некорректных символов +// Параметры: +// СтрИмяФайла - Строка +// проверяемое имя файла +// ФлУдалятьНекорректные - Булево +// удалять или нет некорректные символы из переданной строки +Процедура КорректноеИмяФайла(СтрИмяФайла, ФлУдалятьНекорректные = Ложь) Экспорт + // Перечень запрещенных символов взят отсюда: http://support.microsoft.com/kb/100108/ru + // при этом были объединены запрещенные символы для файловых систем FAT и NTFS + СтрИсключения = """ / \ [ ] : ; | = , ? * < >"; + СтрИсключения = СтрЗаменить(СтрИсключения, " ", ""); + + ТекстОшибки = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В имени файла не должно быть следующих символов: %1'"), СтрИсключения); + + Результат = Истина; + + Для Сч=1 по СтрДлина(СтрИсключения) Цикл + Символ = Сред(СтрИсключения, Сч, 1); + Если Найти(СтрИмяФайла, Символ) <> 0 Тогда + Результат = Ложь; + Если ФлУдалятьНекорректные Тогда + СтрИмяФайла = СтрЗаменить(СтрИмяФайла, Символ, ""); + Иначе + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если Не Результат Тогда + ВызватьИсключение ТекстОшибки; + КонецЕсли; +КонецПроцедуры // КорректноеИмяФайла() + +// Рекурсивно обойти каталоги и посчитать количество файлов и их суммарный размер +Процедура ОбходФайловРазмер(Путь, МассивФайлов, РазмерСуммарный, КоличествоСуммарное) Экспорт + Для Каждого ВыбранныйФайл Из МассивФайлов Цикл + + Если ВыбранныйФайл.ЭтоКаталог() Тогда + НовыйПуть = Строка(Путь); + НовыйПуть = НовыйПуть + "\"; + НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя); + МассивФайловВКаталоге = НайтиФайлы(НовыйПуть, "*.*"); + + Если МассивФайловВКаталоге.Количество() <> 0 Тогда + ОбходФайловРазмер(НовыйПуть, МассивФайловВКаталоге, РазмерСуммарный, КоличествоСуммарное); + КонецЕсли; + + Продолжить; + КонецЕсли; + + РазмерСуммарный = РазмерСуммарный + ВыбранныйФайл.Размер(); + КоличествоСуммарное = КоличествоСуммарное + 1; + + КонецЦикла; +КонецПроцедуры + +// Получает относительный путь к файлу в рабочем каталоге - если есть в регистре сведений - оттуда, +// если нет - сгенерируем - и запишем в регистр сведений +Функция ПолучитьПутьФайлаВРабочемКаталоге(ДанныеФайла) Экспорт + ПутьДляВозврата = ""; + ИмяФайлаСПутем = ""; + РаботаСФайламиКлиент.ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + // Сперва пытаемся найти такую запись в регистре сведений + ИмяФайлаСПутем = ДанныеФайла.ИмяФайлаСПутемВРабочемКаталоге; + ВРабочемКаталогеНаЧтение = ДанныеФайла.ВРабочемКаталогеНаЧтение; + + Если ИмяФайлаСПутем <> "" Тогда + // Тут надо еще на наличие на диске проверять + ФайлНаДиске = Новый Файл(ИмяФайлаСПутем); + Если ФайлНаДиске.Существует() Тогда + Возврат ИмяФайлаСПутем; + КонецЕсли; + КонецЕсли; + + // Формирование имени файла с расширением + ИмяФайла = ДанныеФайла.ПолноеНаименованиеВерсии; + Расширение = ДанныеФайла.Расширение; + Если Не ПустаяСтрока(Расширение) Тогда + ИмяФайла = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ИмяФайла, Расширение); + КонецЕсли; + + ИмяФайлаСПутем = ""; + Если Не ПустаяСтрока(ИмяФайла) Тогда + Если ДанныеФайла.РабочийКаталогВладельца <> "" Тогда + ИмяФайлаСПутем = ДанныеФайла.РабочийКаталогВладельца + ДанныеФайла.ПолноеНаименованиеВерсии + "." + ДанныеФайла.Расширение; + Иначе + ИмяФайлаСПутем = ФайловыеФункцииКлиентСервер.ПолучитьУникальноеИмяСПутем(ИмяКаталога, ИмяФайла); + КонецЕсли; + КонецЕсли; + + Если ПустаяСтрока(ИмяФайла) Тогда + Возврат ""; + КонецЕсли; + + // Запишем в регистр имя файла + НаЧтение = Истина; + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + РаботаСФайлами.ЗаписатьИмяФайлаСПутемВРегистр(ДанныеФайла.Версия, ИмяФайлаСПутем, НаЧтение, ВРабочемКаталогеВладельца); + + Если ДанныеФайла.РабочийКаталогВладельца = "" Тогда + ПутьДляВозврата = ИмяКаталога + ИмяФайлаСПутем; + Иначе + ПутьДляВозврата = ИмяФайлаСПутем; + КонецЕсли; + + Возврат ПутьДляВозврата; +КонецФункции + +// Рекурсивный обход файлов в рабочем каталоге и сбор информации о них +Процедура ОбходФайловТаблица(Путь, МассивФайлов, ТаблицаФайлов) + #Если Не ВебКлиент Тогда + Перем Версия; + Перем ДатаПомещения; + + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + Для Каждого ВыбранныйФайл Из МассивФайлов Цикл + + Если ВыбранныйФайл.ЭтоКаталог() Тогда + НовыйПуть = Строка(Путь); + НовыйПуть = НовыйПуть + "\"; + НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя); + МассивФайловВКаталоге = НайтиФайлы(НовыйПуть, "*.*"); + + Если МассивФайловВКаталоге.Количество() <> 0 Тогда + ОбходФайловТаблица(НовыйПуть, МассивФайловВКаталоге, ТаблицаФайлов); + КонецЕсли; + + Продолжить; + КонецЕсли; + + // временные файлы Word не удаляем из рабочего каталога + Если Лев(ВыбранныйФайл.Имя, 1) = "~" И ВыбранныйФайл.ПолучитьНевидимость() = Истина Тогда + Продолжить; + КонецЕсли; + + ОтносительныйПуть = Сред(ВыбранныйФайл.ПолноеИмя, СтрДлина(ИмяКаталога) + 1); + + // Если не найдем на диске - то минимальная дата + // будет самой старой - и удалится при очистке из рабочего каталога самых старых файлов + ДатаПомещения = Дата('00010101'); + + Владелец = Неопределено; + НомерВерсии = Неопределено; + ВРегистреНаЧтение = Неопределено; + ВРегистреКодФайла = Неопределено; + ВРегистреПапка = Неопределено; + ФайлЕстьВРегистре = РаботаСФайлами.НайтиВРегистреПоПути(ОтносительныйПуть, Версия, ДатаПомещения, Владелец, НомерВерсии, + ВРегистреНаЧтение, ВРегистреКодФайла, ВРегистреПапка); + + Если ФайлЕстьВРегистре Тогда + РедактируетТекущийПользователь = РаботаСФайлами.ПолучитьРедактируетТекущийПользователь(Версия); + + // Если не занят текущим пользователем, можно удалить + Если Не РедактируетТекущийПользователь Тогда + Запись = Новый Структура; + Запись.Вставить("Путь", ОтносительныйПуть); + Запись.Вставить("Размер", ВыбранныйФайл.Размер()); + Запись.Вставить("Версия", Версия); + Запись.Вставить("ДатаПомещенияВРабочийКаталог", ДатаПомещения); + ТаблицаФайлов.Добавить(Запись); + КонецЕсли; + Иначе + Запись = Новый Структура; + Запись.Вставить("Путь", ОтносительныйПуть); + Запись.Вставить("Размер", ВыбранныйФайл.Размер()); + Запись.Вставить("Версия", Версия); + Запись.Вставить("ДатаПомещенияВРабочийКаталог", ДатаПомещения); + ТаблицаФайлов.Добавить(Запись); + КонецЕсли; + + КонецЦикла; + #КонецЕсли +КонецПроцедуры + +// Очистка рабочего каталога - для освобождения места - в первую очередь удаляет файлы +// наиболее давно помещенные в рабочий каталог +Процедура ОчиститьРабочийКаталог(РазмерФайловВРабочемКаталоге, РазмерДобавляемогоФайла, ОчищатьВсе) Экспорт + #Если Не ВебКлиент Тогда + РаботаСФайламиКлиент.ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + ТаблицаФайлов = Новый Массив; + + МассивФайлов = НайтиФайлы(ИмяКаталога, "*.*"); + + ОбходФайловТаблица(ИмяКаталога, МассивФайлов, ТаблицаФайлов); + + // Вызов сервера - для сортировки + // сортировка по дате - в начале будут самые давно помещенные в рабочий каталог + РаботаСФайлами.СортироватьМассивСтруктур(ТаблицаФайлов); + + МаксРазмер = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().МаксимальныйРазмерЛокальногоКэшаФайлов; + + СреднийРазмерФайла = 1000; + Если ТаблицаФайлов.Количество() <> 0 Тогда + СреднийРазмерФайла = РазмерФайловВРабочемКаталоге / ТаблицаФайлов.Количество(); + КонецЕсли; + + СколькоНадоОсвободитьМеста = МаксРазмер / 10; + Если СреднийРазмерФайла * 3 / 2 > СколькоНадоОсвободитьМеста Тогда + СколькоНадоОсвободитьМеста = СреднийРазмерФайла * 3 / 2; + КонецЕсли; + + СколькоОсталось = РазмерФайловВРабочемКаталоге + РазмерДобавляемогоФайла; + + Для Каждого Строка из ТаблицаФайлов Цикл + + Если Строка.Версия.Пустая() Тогда + ТекстВопроса = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1%2"" не найден на сервере. + |Удалить его из рабочего каталога?'"), + ИмяКаталога, Строка.Путь); + + + Если ОчищатьВсе = Ложь Тогда + ТекстВопроса = Нстр("ru = 'Выполняется очистка рабочего каталога при добавлении файла.'") + Символы.ПС + Символы.ПС + ТекстВопроса; + КонецЕсли; + + КодВозврата = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); + + Если КодВозврата = КодВозвратаДиалога.Нет Тогда + Продолжить; + КонецЕсли; + КонецЕсли; + + ПолныйПуть = ИмяКаталога + Строка.Путь; + ФайлНаДиске = Новый Файл(ПолныйПуть); + ФайлНаДиске.УстановитьТолькоЧтение(Ложь); + ШапкаВопроса = Нстр("ru = 'Выполняется очистка рабочего каталога при добавлении файла.'"); + РаботаСФайламиКлиент.УдалитьФайл(ПолныйПуть, Неопределено, ШапкаВопроса); + + ПутьСПодкаталогом = ИмяКаталога; + позиция = Найти(Строка.Путь, "\"); + Если позиция <> 0 Тогда + ПутьСПодкаталогом = ИмяКаталога + Лев(Строка.Путь, позиция); + КонецЕсли; + + // Если каталог стал пуст - удалить его + МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*.*"); + Если МассивФайловВКаталоге.Количество() = 0 Тогда + Если ПутьСПодкаталогом <> ИмяКаталога Тогда + УдалитьФайлы(ПутьСПодкаталогом); + КонецЕсли; + КонецЕсли; + + // Удалим из регистра сведений + РаботаСФайлами.УдалитьИзРегистра(Строка.Версия); + + СколькоОсталось = СколькоОсталось - Строка.Размер; + Если СколькоОсталось < МаксРазмер - СколькоНадоОсвободитьМеста Тогда + Если НЕ ОчищатьВсе Тогда + Прервать; // Освободили достаточно - выходим + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + Если ОчищатьВсе Тогда + РаботаСФайлами.ОчиститьВсеСвоиКромеЗанятых(); + КонецЕсли; + #КонецЕсли +КонецПроцедуры + +// Получить полный путь к файлу +Функция ПолучитьПолныйПутьКФайлуВРабочемКаталоге(ДанныеФайла) Экспорт + Возврат ДанныеФайла.ИмяФайлаСПутемВРабочемКаталоге; +КонецФункции + +// Удалить с диска и из регистра сведений +Процедура УдалитьФайлИзРабочегоКаталога(Ссылка, УдалитьДажеВРабочемКаталоге = Неопределено) Экспорт + РаботаСФайламиКлиент.ПроинициализироватьПутьКРабочемуКаталогу(); + ИмяКаталога = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ПутьКЛокальномуКэшуФайлов; + + ВРабочемКаталогеНаЧтение = Ложь; + ВРабочемКаталогеВладельца = Ложь; + ПутьВРегистре = РаботаСФайлами.ПолучитьИмяФайлаСПутемИзРегистра(Ссылка, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + + // Получить путь из регистра + ИмяФайлаСПутем = ПутьВРегистре; + Если ИмяФайлаСПутем <> "" Тогда + + // обычно в рабочем каталоге не удаляем - только если передан УдалитьДажеВРабочемКаталоге + Если Не ВРабочемКаталогеВладельца ИЛИ УдалитьДажеВРабочемКаталоге = Истина Тогда + + ФайлНаДиске = Новый Файл(ИмяФайлаСПутем); + Если ФайлНаДиске.Существует() Тогда + файл = Новый Файл(ИмяФайлаСПутем); + файл.УстановитьТолькоЧтение(Ложь); + РаботаСФайламиКлиент.УдалитьФайл(ИмяФайлаСПутем); + + ПутьСПодкаталогом = ИмяКаталога; + позиция = Найти(ПутьВРегистре, "\"); + Если позиция <> 0 Тогда + ПутьСПодкаталогом = ИмяКаталога + Лев(ПутьВРегистре, позиция); + КонецЕсли; + + МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*.*"); + Если МассивФайловВКаталоге.Количество() = 0 Тогда + Если ПутьСПодкаталогом <> ИмяКаталога Тогда + УдалитьФайлы(ПутьСПодкаталогом); + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + РаботаСФайлами.УдалитьИзРегистра(Ссылка); +КонецПроцедуры + + +// Разыменовать lnk файл +Функция РазыменоватьLnkФайл(ВыбранныйФайл) Экспорт + #Если Не ВебКлиент Тогда + + Если НЕ СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + ShellApp = Новый COMОбъект("shell.application"); + FolderObj = ShellApp.NameSpace(ВыбранныйФайл.Путь); // полный (только) путь на lnk-файл + FolderObjItem = FolderObj.items().item(ВыбранныйФайл.Имя); // только имя lnk-файла + Link = FolderObjItem.GetLink(); + Возврат Новый Файл(Link.path); + КонецЕсли; + + #КонецЕсли + + Возврат ВыбранныйФайл; +КонецФункции + +// Обход Файлов рекурсивный - для определения размера файлов +Процедура ОбходФайловДляПроверкиПредельногоРазмера( + МассивФайлов, + МассивСлишкомБольшихФайлов, + Рекурсивно, + КоличествоСуммарное, + Знач ПсевдоФайловаяСистема) Экспорт + + МаксРазмерФайла = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().МаксимальныйРазмерФайла; + + Для Каждого ВыбранныйФайл Из МассивФайлов Цикл + Попытка + + Если ВыбранныйФайл.Существует() Тогда + + Если ВыбранныйФайл.Расширение = ".lnk" Тогда + ВыбранныйФайл = РазыменоватьLnkФайл(ВыбранныйФайл); + КонецЕсли; + + Если ВыбранныйФайл.ЭтоКаталог() Тогда + + Если Рекурсивно Тогда + НовыйПуть = Строка(ВыбранныйФайл.Путь); + Если Прав(НовыйПуть, 1) <> "\" Тогда + НовыйПуть = НовыйПуть + "\"; + КонецЕсли; + НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя); + МассивФайловВКаталоге = ФайловыеФункцииКлиентСервер.НайтиФайлыПсевдо(ПсевдоФайловаяСистема, НовыйПуть); + + // Рекурсия + Если МассивФайловВКаталоге.Количество() <> 0 Тогда + ОбходФайловДляПроверкиПредельногоРазмера(МассивФайловВКаталоге, МассивСлишкомБольшихФайлов, Рекурсивно, КоличествоСуммарное, ПсевдоФайловаяСистема); + КонецЕсли; + КонецЕсли; + + Продолжить; + КонецЕсли; + + КоличествоСуммарное = КоличествоСуммарное + 1; + + // Размер файла слишком большой + Если ВыбранныйФайл.Размер() > МаксРазмерФайла Тогда + МассивСлишкомБольшихФайлов.Добавить(ВыбранныйФайл.ПолноеИмя); + Продолжить; + КонецЕсли; + + КонецЕсли; + + Исключение + Инфо = ИнформацияОбОшибке(); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Описание=""%1""'"), Инфо.Описание )); + КонецПопытки; + КонецЦикла; +КонецПроцедуры + +// Проверить Предельный Размер Файлов - вернет Ложь, если есть файлы, превышающие предельный размер, +// и пользователь в диалоге предупреждения о наличии таких файлов выбрал "Отмена" +Функция ПроверитьПредельныйРазмерФайлов(ВыбранныеФайлы, Рекурсивно, КоличествоСуммарное, Знач ПсевдоФайловаяСистема, РежимЗагрузки = Ложь) Экспорт + МассивСлишкомБольшихФайлов = Новый Массив; + + Путь = ""; + + МассивФайлов = Новый Массив; + КоличествоСуммарное = 0; + + Для Каждого ИмяФайла Из ВыбранныеФайлы Цикл + + Путь = ИмяФайла.Значение; + ВыбранныйФайл = Новый Файл(Путь); + + Попытка + ВыбранныйФайл = Новый Файл(ИмяФайла.Значение); + ВыбранКаталог = Ложь; + + Если ВыбранныйФайл.Существует() Тогда + ВыбранКаталог = ВыбранныйФайл.ЭтоКаталог(); + КонецЕсли; + + Если ВыбранКаталог Тогда + Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идет сбор информации о каталоге ""%1"". + |Пожалуйста, подождите.'"), Путь )); + + МассивФайловЭтогоКаталога = ФайловыеФункцииКлиентСервер.НайтиФайлыПсевдо(ПсевдоФайловаяСистема, Путь); + ОбходФайловДляПроверкиПредельногоРазмера(МассивФайловЭтогоКаталога, МассивСлишкомБольшихФайлов, Рекурсивно, КоличествоСуммарное, ПсевдоФайловаяСистема); + Иначе + МассивФайлов.Добавить(ВыбранныйФайл); + КонецЕсли; + Исключение + Инфо = ИнформацияОбОшибке(); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Описание=""%1""'"), Инфо.Описание )); + КонецПопытки; + КонецЦикла; + + Если МассивФайлов.Количество() <> 0 Тогда + ОбходФайловДляПроверкиПредельногоРазмера(МассивФайлов, МассивСлишкомБольшихФайлов, Рекурсивно, КоличествоСуммарное, ПсевдоФайловаяСистема); + КонецЕсли; + + // Был хоть один слишком большой файл + Если МассивСлишкомБольшихФайлов.Количество() <> 0 Тогда + + ФайлыБольшие = Новый СписокЗначений; + Параметры = Новый Структура; + + Для Каждого Файл Из МассивСлишкомБольшихФайлов Цикл + БольшойФайл = Новый Файл(Файл); + РазмерФайлаВМб = Цел(БольшойФайл.Размер() / (1024 * 1024)); + ТекстСтроки = Строка(Файл) + " (" + Строка(РазмерФайлаВМб) + " " + НСтр("ru = 'МБ)'"); + ФайлыБольшие.Добавить(ТекстСтроки); + КонецЦикла; + + Параметры.Вставить("ФайлыБольшие", ФайлыБольшие); + Параметры.Вставить("РежимЗагрузки", РежимЗагрузки); + Параметры.Вставить("Заголовок", "Предупреждение при загрузке файлов"); + + Результат = ОткрытьФормуМодально("Справочник.Файлы.Форма.ФормаВопросаИмпорта", Параметры); + ОбновитьПовторноИспользуемыеЗначения(); // т.к. системные настройки (макс размер) могли уже изменить + Возврат Результат = КодВозвратаДиалога.ОК; + + КонецЕсли; + + Возврат Истина; +КонецФункции + + +// Рекурсивная функция импорта файлов с диска - принимает массив файлов (или каталогов) +// - если файл, просто добавляет его, если каталог - создает группу и рекурсивно вызывает саму себя +Процедура ИмпортФайлов( + Владелец, + ФайлыАргумент, + Индикатор, + МассивИменФайловСОшибками, + МассивСтруктурВсехФайлов, + Комментарий, + ХранитьВерсии, + Рекурсивно, + КоличествоСуммарное, + Счетчик, + ИдентификаторФормы, + Знач ПсевдоФайловаяСистема, + ДобавленныеФайлы, + МассивВсехПапок, + РежимЗагрузки = Ложь) Экспорт + + Перем ПерваяПапкаСТакимЖеИменем; + Перем ДокГруппаСсылка; + + МаксРазмерФайла = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().МаксимальныйРазмерФайла; + ЗапретЗагрузкиФайловПоРасширению = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ЗапретЗагрузкиФайловПоРасширению; + СписокЗапрещенныхРасширений = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().СписокЗапрещенныхРасширений; + + Для Каждого ВыбранныйФайл Из ФайлыАргумент Цикл + Попытка + + Если ВыбранныйФайл.Существует() Тогда + + Если ВыбранныйФайл.Расширение = ".lnk" Тогда + ВыбранныйФайл = РазыменоватьLnkФайл(ВыбранныйФайл); + КонецЕсли; + + Если ВыбранныйФайл.ЭтоКаталог() Тогда + + Если Рекурсивно = Истина Тогда + НовыйПуть = Строка(ВыбранныйФайл.Путь); + ФайловыеФункцииКлиентСервер.ДобавитьСлешЕслиНужно(НовыйПуть); + НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя); + МассивФайлов = ФайловыеФункцииКлиентСервер.НайтиФайлыПсевдо(ПсевдоФайловаяСистема, НовыйПуть); + + // Создаем группу в справочнике - эквивалент папки на диске + Если МассивФайлов.Количество() <> 0 Тогда + ИмяФайла = ВыбранныйФайл.Имя; + + ПапкаУжеНайдена = Ложь; + + Если РаботаСФайлами.ЕстьПапкаСТакимИменем(ИмяФайла, Владелец, ПерваяПапкаСТакимЖеИменем) Тогда + + Если РежимЗагрузки Тогда + ПапкаУжеНайдена = Истина; + ДокГруппаСсылка = ПерваяПапкаСТакимЖеИменем; + Иначе + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Внимание! Папка ""%1"" уже существует. Продолжить импорт папки?'"), + ИмяФайла); + + КодВозврата = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); + + Если КодВозврата = КодВозвратаДиалога.Нет Тогда + Продолжить; + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + Если Не ПапкаУжеНайдена Тогда + ДокГруппаСсылка = РаботаСФайлами.СправочникиПапкиСоздатьЭлемент(ИмяФайла, Владелец); + КонецЕсли; + + ИмпортФайлов( + ДокГруппаСсылка, + МассивФайлов, + Индикатор, + МассивИменФайловСОшибками, + МассивСтруктурВсехФайлов, + Комментарий, + ХранитьВерсии, + Рекурсивно, + КоличествоСуммарное, + Счетчик, + ИдентификаторФормы, + ПсевдоФайловаяСистема, + ДобавленныеФайлы, + МассивВсехПапок, + РежимЗагрузки); + + МассивВсехПапок.Добавить(НовыйПуть); + КонецЕсли; + КонецЕсли; + + Продолжить; + КонецЕсли; + + Если Не ФайловыеФункцииКлиентСервер.ФайлМожноЗагружать(ВыбранныйФайл, МаксРазмерФайла, ЗапретЗагрузкиФайловПоРасширению, СписокЗапрещенныхРасширений, МассивИменФайловСОшибками) Тогда + Продолжить; + КонецЕсли; + + // Обновим индикатор прогресса + Счетчик = Счетчик + 1; + Индикатор = Счетчик * 100 / КоличествоСуммарное; // Считаем проценты + РазмерВМб = ВыбранныйФайл.Размер() / (1024 * 1024); + НадписьПодробнее = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Обрабатывается файл ""%1"" (%2 Мб)...'"), + ВыбранныйФайл.Имя, ? (РазмерВМб >= 1, Формат(РазмерВМб, "ЧДЦ=0"), Формат(РазмерВМб, "ЧДЦ=1; ЧН=0") ) ); + + ТекстСостояния = НСтр("ru = 'Импорт файлов с диска...'"); + Если РежимЗагрузки Тогда + ТекстСостояния = НСтр("ru = 'Загрузка файлов с диска...'"); + КонецЕсли; + + Состояние( + ТекстСостояния, + Индикатор, + НадписьПодробнее, + БиблиотекаКартинок.Информация32); + + // Создаем Элемент справочника Файлы + ИмяБезРасширения = ВыбранныйФайл.ИмяБезРасширения; + Расширение = ВыбранныйФайл.Расширение; + + Если РежимЗагрузки Тогда + Если РаботаСФайлами.ЕстьФайлСТакимИменем(ИмяБезРасширения, Владелец) Тогда + Запись = Новый Структура; + Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); + Запись.Вставить("Ошибка", НСтр("ru = 'Файл с таким именем уже есть в информационной базе'")); + МассивИменФайловСОшибками.Добавить(Запись); + Продолжить; + КонецЕсли; + КонецЕсли; + + АдресВременногоХранилищаФайла = ""; + + ПомещаемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(ВыбранныйФайл.ПолноеИмя, ""); + ПомещаемыеФайлы.Добавить(Описание); + + ПомещенныеФайлы = Новый Массив; + + Если Не ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ИдентификаторФормы) Тогда + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка помещения файла в хранилище: %1'"), ВыбранныйФайл.ПолноеИмя); + КонецЕсли; + + Если ПомещенныеФайлы.Количество() = 1 Тогда + АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение; + КонецЕсли; + + АдресВременногоХранилищаТекста = ИзвлечьТекстВоВременноеХранилище( + ВыбранныйФайл.ПолноеИмя, + ИдентификаторФормы); + + // Создаем элемент справочника Файлы + ФайловыеФункцииКлиентСервер.СоздатьЭлементСправочникаФайлы(ВыбранныйФайл, МассивСтруктурВсехФайлов, + Владелец, ИдентификаторФормы, Комментарий, ХранитьВерсии, ДобавленныеФайлы, + АдресВременногоХранилищаФайла, АдресВременногоХранилищаТекста); + + Иначе + Запись = Новый Структура; + Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); + Запись.Вставить("Ошибка", НСтр("ru = 'Файл отсутствует на диске'")); + МассивИменФайловСОшибками.Добавить(Запись); + КонецЕсли; + + Исключение + ОшибкаИнфо = ИнформацияОбОшибке(); + СообщениеОбОшибке = ""; + Если ОшибкаИнфо.Причина = Неопределено Тогда + СообщениеОбОшибке =ОшибкаИнфо.Описание; + Иначе + СообщениеОбОшибке = ОшибкаИнфо.Причина.Описание; + КонецЕсли; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщениеОбОшибке); + + Запись = Новый Структура; + Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); + Запись.Вставить("Ошибка", СообщениеОбОшибке); + МассивИменФайловСОшибками.Добавить(Запись); + + КонецПопытки; + КонецЦикла; +КонецПроцедуры + +// Импорт - с вспомогательными операциями типа проверки предельного размера и впоследствии удаления файлов и показа ошибок +// при импорте только одной папки - вернет на нее ссылку +Функция ИмпортФайловВыполнить( + ПапкаДляДобавления, + ВыбранныеФайлы, + Комментарий, + ХранитьВерсии, + УдалятьФайлыПослеДобавления, + Рекурсивно, + ИдентификаторФормы, + Знач ПсевдоФайловаяСистема, + ДобавленныеФайлы, + РежимЗагрузки = Ложь) Экспорт + + Перем ПерваяПапкаСТакимЖеИменем; + Перем ПапкаДляДобавленияТекущая; + + ВыбранКаталог = Ложь; + Путь = ""; + + КоличествоСуммарное = 0; + Если ПроверитьПредельныйРазмерФайлов(ВыбранныеФайлы, Рекурсивно, КоличествоСуммарное, ПсевдоФайловаяСистема, РежимЗагрузки) = Ложь Тогда + Состояние(); + Возврат Неопределено; + КонецЕсли; + + Состояние(); + + Если КоличествоСуммарное = 0 Тогда + + Если Не РежимЗагрузки Тогда + Предупреждение(НСтр("ru = 'Нет файлов для добавления'")); + КонецЕсли; + + Возврат Неопределено; + КонецЕсли; + + Индикатор = 0; + + МассивФайлов = Новый Массив; + Счетчик = 0; + МассивИменФайловСОшибками = Новый Массив; + МассивСтруктурВсехФайлов = Новый Массив; + МассивВсехПапок = Новый Массив; + + ПапкаДляДобавленияТекущая = Неопределено; + + Для Каждого ИмяФайла Из ВыбранныеФайлы Цикл + Попытка + ВыбранныйФайл = Новый Файл(ИмяФайла.Значение); + + ВыбранКаталог = Ложь; + Если ВыбранныйФайл.Существует() Тогда + ВыбранКаталог = ВыбранныйФайл.ЭтоКаталог(); + КонецЕсли; + + Если ВыбранКаталог Тогда + Путь = ИмяФайла.Значение; + МассивФайловЭтогоКаталога = ФайловыеФункцииКлиентСервер.НайтиФайлыПсевдо(ПсевдоФайловаяСистема, Путь); + + ИмяПапки = ВыбранныйФайл.Имя; + + ПапкаУжеНайдена = Ложь; + + Если РаботаСФайлами.ЕстьПапкаСТакимИменем(ИмяПапки, ПапкаДляДобавления, ПерваяПапкаСТакимЖеИменем) Тогда + + Если РежимЗагрузки Тогда + ПапкаУжеНайдена = Истина; + ПапкаДляДобавленияТекущая = ПерваяПапкаСТакимЖеИменем; + Иначе + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Внимание! Папка ""%1"" уже существует. Продолжить импорт папки?'"), + ИмяПапки); + + КодВозврата = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); + + Если КодВозврата = КодВозвратаДиалога.Нет Тогда + Продолжить; + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + Если Не ПапкаУжеНайдена Тогда + ПапкаДляДобавленияТекущая = РаботаСФайлами.СправочникиПапкиСоздатьЭлемент(ИмяПапки, ПапкаДляДобавления); + КонецЕсли; + + // Собственно импорт + ИмпортФайлов( + ПапкаДляДобавленияТекущая, + МассивФайловЭтогоКаталога, + Индикатор, + МассивИменФайловСОшибками, + МассивСтруктурВсехФайлов, + Комментарий, + ХранитьВерсии, + Рекурсивно, + КоличествоСуммарное, + Счетчик, + ИдентификаторФормы, + ПсевдоФайловаяСистема, + ДобавленныеФайлы, + МассивВсехПапок, + РежимЗагрузки); + МассивВсехПапок.Добавить(Путь); + + Иначе + МассивФайлов.Добавить(ВыбранныйФайл); + КонецЕсли; + Исключение + Инфо = ИнформацияОбОшибке(); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Описание=""%1""'"), Инфо.Описание )); + КонецПопытки; + КонецЦикла; + + Если МассивФайлов.Количество() <> 0 Тогда + // Собственно импорт + ИмпортФайлов( + ПапкаДляДобавления, + МассивФайлов, + Индикатор, + МассивИменФайловСОшибками, + МассивСтруктурВсехФайлов, + Комментарий, + ХранитьВерсии, + Рекурсивно, + КоличествоСуммарное, + Счетчик, + ИдентификаторФормы, + ПсевдоФайловаяСистема, + ДобавленныеФайлы, + МассивВсехПапок, + РежимЗагрузки); + КонецЕсли; + + Если МассивСтруктурВсехФайлов.Количество() > 1 Тогда + + ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Импорт файлов завершен. Импортировано %1 файлов'"), Строка(МассивСтруктурВсехФайлов.Количество()) ); + + Если РежимЗагрузки Тогда + ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Загрузка файлов завершена. Загружено %1 файлов'"), Строка(МассивСтруктурВсехФайлов.Количество()) ); + КонецЕсли; + + Состояние(ТекстСостояния); + Иначе + Состояние(); + КонецЕсли; + + Если УдалятьФайлыПослеДобавления = Истина Тогда + ФайловыеФункцииКлиентСервер.УдалитьФайлыПослеДобавления(МассивСтруктурВсехФайлов, МассивВсехПапок, РежимЗагрузки); + КонецЕсли; + + Если МассивСтруктурВсехФайлов.Количество() = 1 Тогда + Элемент0 = МассивСтруктурВсехФайлов[0]; + Ссылка = ПолучитьНавигационнуюСсылку(элемент0.Файл); + ПоказатьОповещениеПользователя( + НСтр("ru = 'Изменение:'"), + ссылка, + Элемент0.Файл, + БиблиотекаКартинок.Информация32); + КонецЕсли; + + // Вывод сообщений об ошибках + Если МассивИменФайловСОшибками.Количество() <> 0 Тогда + + Параметры = Новый Структура; + Параметры.Вставить("МассивИменФайловСОшибками", МассивИменФайловСОшибками); + Если РежимЗагрузки Тогда + Параметры.Вставить("Заголовок", "Отчет о загрузке файлов"); + КонецЕсли; + + ОткрытьФорму("Справочник.Файлы.Форма.ФормаОтчета", Параметры); + КонецЕсли; + + Если ВыбранныеФайлы.Количество() <> 1 Тогда + ПапкаДляДобавленияТекущая = Неопределено; + КонецЕсли; + + Возврат ПапкаДляДобавленияТекущая; +КонецФункции + +// Извлечь текст из файла и поместить во временное хранилище +Функция ИзвлечьТекстВоВременноеХранилище(ПолноеИмяФайла, ИдентификаторФормы) Экспорт + АдресВременногоХранилища = ""; + + #Если Не ВебКлиент Тогда + ИзвлекатьТекстыФайловНаСервере = РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ИзвлекатьТекстыФайловНаСервере; + Если Не ИзвлекатьТекстыФайловНаСервере Тогда + Попытка + Извлечение = Новый ИзвлечениеТекста(ПолноеИмяФайла); + Текст = Извлечение.ПолучитьТекст(); + Исключение + Текст = ""; + КонецПопытки; + КонецЕсли; + + Если ПустаяСтрока(Текст) Тогда + Возврат ""; + КонецЕсли; + + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); + ТекстовыйФайл = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8); + ТекстовыйФайл.Записать(Текст); + ТекстовыйФайл.Закрыть(); + + ПоместитьФайл(АдресВременногоХранилища, ИмяВременногоФайла, , Ложь, ИдентификаторФормы); + УдалитьФайлы(ИмяВременногоФайла); + #КонецЕсли + Возврат АдресВременногоХранилища; +КонецФункции + +// Функция получает путь к каталогу вида "C:\Documents and Settings\ИМЯ ПОЛЬЗОВАТЕЛЯ\Application Data\1C\ФайлыА8\" +Функция ПолучитьПутьККаталогуДанныхПользователя() Экспорт + ИмяКаталога = ""; +#Если Не ВебКлиент Тогда + + Если НЕ СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + Оболочка = Новый COMОбъект("WScript.Shell"); + Путь = Оболочка.ExpandEnvironmentStrings("%APPDATA%"); + Путь = Путь + "\1C\Файлы\"; + Путь = Путь + РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ИмяКонфигурации + "\"; + + ИмяКаталога = Путь + РаботаСФайламиКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСФайлами().ТекущийПользователь + " " + РаботаСФайлами.ПараметрыСеансаИдентификаторТекущегоПользователя() + "\"; + ИмяКаталога = СтрЗаменить(ИмяКаталога, "<", " "); + ИмяКаталога = СтрЗаменить(ИмяКаталога, ">", " "); + ИмяКаталога = СокрЛП(ИмяКаталога); + КонецЕсли; +#Иначе // ВебКлиент + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + Если РасширениеПодключено Тогда + + Режим = РежимДиалогаВыбораФайла.ВыборКаталога; + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + ДиалогОткрытияФайла.Каталог = ""; + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите путь к локальному кэшу файлов'"); + Если ДиалогОткрытияФайла.Выбрать() Тогда + ИмяКаталога = ДиалогОткрытияФайла.Каталог; + ИмяКаталога = ИмяКаталога + "\"; + КонецЕсли; + + КонецЕсли; +#КонецЕсли + Возврат ИмяКаталога; +КонецФункции + +// Возвращает имя с расширением- если расширение пусто - только имя +Функция ПолучитьИмяСРасширением(ПолноеНаименование, Расширение) Экспорт + ИмяСРасширением = ПолноеНаименование; + + Если Расширение <> "" Тогда + ИмяСРасширением = ИмяСРасширением + "." + Расширение; + КонецЕсли; + + Возврат ИмяСРасширением; +КонецФункции + +// Извлекает текст из файла на диске на клиенте и помещает результат на сервер +&НаКлиенте +Процедура ИзвлечьТекстВерсии(ВерсияСсылка, АдресФайла, Расширение, УникальныйИдентификатор) Экспорт +#Если НЕ ВебКлиент Тогда + + ИмяФайлаСПутем = ПолучитьИмяВременногоФайла(Расширение); + + Если Не ПолучитьФайл(АдресФайла, ИмяФайлаСПутем, Ложь) Тогда + Возврат; + КонецЕсли; + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда + УдалитьИзВременногоХранилища(АдресФайла); + КонецЕсли; + + РезультатИзвлечения = "НеИзвлечен"; + АдресВременногоХранилищаТекста = ""; + + Текст = ""; + Если ИмяФайлаСПутем <> "" Тогда + Попытка + // Извлекаем текст из файла + Извлечение = Новый ИзвлечениеТекста(ИмяФайлаСПутем); + Текст = Извлечение.ПолучитьТекст(); + РезультатИзвлечения = "Извлечен"; + + Если Не ПустаяСтрока(Текст) Тогда + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); + ТекстовыйФайл = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8); + ТекстовыйФайл.Записать(Текст); + ТекстовыйФайл.Закрыть(); + + ПоместитьФайл(АдресВременногоХранилищаТекста, ИмяВременногоФайла, , Ложь, УникальныйИдентификатор); + УдалитьФайлы(ИмяВременногоФайла); + КонецЕсли; + + Исключение // Ничего не пишем - это нормальная ситуация - когда Текст некому извлечь + РезультатИзвлечения = "ИзвлечьНеУдалось"; + КонецПопытки; + КонецЕсли; + + УдалитьФайлы(ИмяФайлаСПутем); + + РаботаСФайлами.ЗаписатьРезультатИзвлеченияТекста(ВерсияСсылка, + РезультатИзвлечения, АдресВременногоХранилищаТекста); + + Если Не ПустаяСтрока(АдресВременногоХранилищаТекста) Тогда + УдалитьИзВременногоХранилища(АдресВременногоХранилищаТекста); + КонецЕсли; + +#КонецЕсли +КонецПроцедуры diff --git a/SSL/src/CommonModules/ФайловыеФункцииКлиент/ФайловыеФункцииКлиент.mdo b/SSL/src/CommonModules/ФайловыеФункцииКлиент/ФайловыеФункцииКлиент.mdo new file mode 100644 index 000000000..93cd250dd --- /dev/null +++ b/SSL/src/CommonModules/ФайловыеФункцииКлиент/ФайловыеФункцииКлиент.mdo @@ -0,0 +1,12 @@ + + + ФайловыеФункцииКлиент + + ru + Файловые функции клиент + + Клиентские файловые операции + true + true + true + diff --git a/SSL/src/CommonModules/ФайловыеФункцииКлиентСервер/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииКлиентСервер/Module.bsl new file mode 100644 index 000000000..8367faac7 --- /dev/null +++ b/SSL/src/CommonModules/ФайловыеФункцииКлиентСервер/Module.bsl @@ -0,0 +1,299 @@ +// Получить уникальное имя файла в рабочем каталоге - если есть совпадения - будет имя типа A1\qqq.doc +// +Функция ПолучитьУникальноеИмяСПутем(ИмяКаталога, ИмяФайла) Экспорт + РезультирующийПуть = ""; + + Счетчик = 0; + ЦиклНомер = 0; + Успешно = Ложь; + + ГенераторСлучая = Неопределено; + #Если Не ВебКлиент Тогда + ГенераторСлучая = Новый ГенераторСлучайныхЧисел(Секунда(ТекущаяДата())); + #КонецЕсли + + Пока НЕ Успешно И ЦиклНомер < 100 Цикл + НомерКаталога = 0; + #Если Не ВебКлиент Тогда + НомерКаталога = ГенераторСлучая.СлучайноеЧисло(0, 25); + #Иначе + НомерКаталога = Секунда(ТекущаяДата()) % 26; + #КонецЕсли + + КодБукваA = КодСимвола("A", 1); + КодКаталога = КодБукваA + НомерКаталога; + + БукваКаталога = Символ(КодКаталога); + + ПодКаталог = ""; // Частичный путь + + // По умолчанию вначале будет класть в корень, а уже потом, + // если не сможет, то в A, B, ... Z, A1, B1, .. Z1, .. A2, B2 и т.д. + Если Счетчик = 0 Тогда + ПодКаталог = ""; + Иначе + ПодКаталог = БукваКаталога; + ЦиклНомер = Окр(Счетчик / 26); + + Если ЦиклНомер <> 0 Тогда + ЦиклНомерСтрока = Строка(ЦиклНомер); + ПодКаталог = ПодКаталог + ЦиклНомерСтрока; + КонецЕсли; + + ПодКаталог = ПодКаталог + "\"; + КонецЕсли; + + ПолныйПодКаталог = ИмяКаталога + ПодКаталог; + + // Создать каталог для файлов + КаталогНаДиске = Новый Файл(ПолныйПодКаталог); + Если НЕ КаталогНаДиске.Существует() Тогда + СоздатьКаталог(ПолныйПодКаталог); + КонецЕсли; + + ФайлПопытки = ПолныйПодКаталог + ИмяФайла; + Счетчик = Счетчик + 1; + + // Проверить, есть ли файл с таким именем + ФайлНаДиске = Новый Файл(ФайлПопытки); + Если НЕ ФайлНаДиске.Существует() Тогда // нет такого файла + РезультирующийПуть = ПодКаталог + ИмяФайла; + Успешно = Истина; + КонецЕсли; + КонецЦикла; + + Возврат РезультирующийПуть; +КонецФункции + +// Получить уникальное имя файла в рабочем каталоге - если есть совпадения - будет имя типа A1\qqq.doc +// +Функция ПолучитьМассивУникальныхИменСПутем(ИмяКаталога, МассивГлавныйИПодчиненные, МассивПолныхИмен) Экспорт + + Счетчик = 0; + ЦиклНомер = 0; + Успешно = Ложь; + + ГенераторСлучая = Неопределено; + #Если Не ВебКлиент Тогда + ГенераторСлучая = Новый ГенераторСлучайныхЧисел(Секунда(ТекущаяДата())); + #КонецЕсли + + Пока НЕ Успешно И ЦиклНомер < 100 Цикл + НомерКаталога = 0; + #Если Не ВебКлиент Тогда + НомерКаталога = ГенераторСлучая.СлучайноеЧисло(0, 25); + #Иначе + НомерКаталога = Секунда(ТекущаяДата()) % 26; + #КонецЕсли + + КодБукваA = КодСимвола("A", 1); + КодКаталога = КодБукваA + НомерКаталога; + + БукваКаталога = Символ(КодКаталога); + + ПодКаталог = ""; // Частичный путь + + // По умолчанию вначале будет класть в корень, а уже потом, + // если не сможет, то в A, B, ... Z, A1, B1, .. Z1, .. A2, B2 и т.д. + Если Счетчик = 0 Тогда + ПодКаталог = ""; + Иначе + ПодКаталог = БукваКаталога; + ЦиклНомер = Окр(Счетчик / 26); + + Если ЦиклНомер <> 0 Тогда + ЦиклНомерСтрока = Строка(ЦиклНомер); + ПодКаталог = ПодКаталог + ЦиклНомерСтрока; + КонецЕсли; + + ПодКаталог = ПодКаталог + "\"; + КонецЕсли; + + ПолныйПодКаталог = ИмяКаталога + ПодКаталог; + + + МассивПолныхИмен.Очистить(); + Успешно = Истина; + + Для Каждого ИмяИПуть Из МассивГлавныйИПодчиненные Цикл + + ФайлПопытки = ПолныйПодКаталог + ИмяИПуть; + + // Проверить, есть ли файл с таким именем + ФайлНаДиске = Новый Файл(ФайлПопытки); + + Если НЕ ФайлНаДиске.Существует() Тогда // нет такого файла + + // Создать каталог для файлов + СоздатьКаталог(ФайлНаДиске.Путь); + + РезультирующийПуть = ПодКаталог + ИмяИПуть; + МассивПолныхИмен.Добавить(РезультирующийПуть); + Иначе + МассивПолныхИмен.Очистить(); + Успешно = Ложь; + Прервать; // выход из цикла подчиненных файлов + КонецЕсли; + + КонецЦикла; + + + Счетчик = Счетчик + 1; + + КонецЦикла; + + Возврат Успешно; +КонецФункции + +// Вернет Истина если файл можно загружать (размер не превышает максимальный, расширение не запрещено) +Функция ФайлМожноЗагружать(ВыбранныйФайл, МаксРазмерФайла, ЗапретЗагрузкиФайловПоРасширению, + СписокЗапрещенныхРасширений, МассивИменФайловСОшибками) Экспорт + + // Размер файла слишком большой + Если ВыбранныйФайл.Размер() > МаксРазмерФайла Тогда + + РазмерВМб = ВыбранныйФайл.Размер() / (1024 * 1024); + РазмерВМбМакс = МаксРазмерФайла / (1024 * 1024); + + Запись = Новый Структура; + Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); + Запись.Вставить("Ошибка", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Размер файла (%1 Мб) превышает максимальный размер файла: (%2 Мб)'"), + ?(РазмерВМб >= 1, Формат(РазмерВМб, "ЧДЦ=0"), Формат(РазмерВМб, "ЧДЦ=1; ЧН=0")), + ?(РазмерВМбМакс >= 1, Формат(РазмерВМбМакс, "ЧДЦ=0"), Формат(РазмерВМбМакс, "ЧДЦ=1; ЧН=0")) + )); + МассивИменФайловСОшибками.Добавить(Запись); + + Возврат Ложь; + КонецЕсли; + + // расширение файла в списке запрещенных + РасширениеФайла = ВыбранныйФайл.Расширение; + Если Не РаботаСФайламиКлиентСервер.РасширениеФайлаРазрешеноДляЗагрузки(ЗапретЗагрузкиФайловПоРасширению, СписокЗапрещенныхРасширений, РасширениеФайла) Тогда + + Запись = Новый Структура; + Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); + Запись.Вставить("Ошибка", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Загрузка файлов с расширением ""%1"" запрещена. Обратитесь к администратору системы.'"), + РасширениеФайла)); + МассивИменФайловСОшибками.Добавить(Запись); + + Возврат Ложь; + КонецЕсли; + + // временные файлы Word не импортируем + Если Лев(ВыбранныйФайл.Имя, 1) = "~" И ВыбранныйФайл.ПолучитьНевидимость() = Истина Тогда + Возврат Ложь; + КонецЕсли; + + Возврат Истина; +КонецФункции + +// создает элемент справочника Файлы +Функция СоздатьЭлементСправочникаФайлы(ВыбранныйФайл, МассивСтруктурВсехФайлов, Владелец, + ИдентификаторФормы, Комментарий, ХранитьВерсии, ДобавленныеФайлы, + АдресВременногоХранилищаФайла, АдресВременногоХранилищаТекста, + Пользователь = Неопределено) Экспорт + + ИмяБезРасширения = ВыбранныйФайл.ИмяБезРасширения; + Расширение = ВыбранныйФайл.Расширение; + + Расширение = РасширениеБезТочки(ВыбранныйФайл.Расширение); + ВремяИзменения = ВыбранныйФайл.ПолучитьВремяИзменения(); + ВремяИзмененияУниверсальное = ВыбранныйФайл.ПолучитьУниверсальноеВремяИзменения(); + Размер = ВыбранныйФайл.Размер(); + + // Создадим карточку Файла в БД + ДокСсылка = РаботаСФайлами.СоздатьФайлСВерсией( + Владелец, + ИмяБезРасширения, + Расширение, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + АдресВременногоХранилищаФайла, + АдресВременногоХранилищаТекста, + Ложь, // это не веб клиент + Пользователь, + Комментарий); + + УдалитьИзВременногоХранилища(АдресВременногоХранилищаФайла); + Если Не ПустаяСтрока(АдресВременногоХранилищаТекста) Тогда + УдалитьИзВременногоХранилища(АдресВременногоХранилищаТекста); + КонецЕсли; + + ДобавленныйФайлИПуть = Новый Структура("ФайлСсылка, Путь", ДокСсылка, ВыбранныйФайл.Путь); + ДобавленныеФайлы.Добавить(ДобавленныйФайлИПуть); + + Запись = Новый Структура; + Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); + Запись.Вставить("Файл", ДокСсылка); + МассивСтруктурВсехФайлов.Добавить(Запись); + +КонецФункции + +// добавляет в конце "\" +Процедура ДобавитьСлешЕслиНужно(НовыйПуть) Экспорт + Если Прав(НовыйПуть, 1) <> "\" И Прав(НовыйПуть,1) <> "/" Тогда + НовыйПуть = НовыйПуть + "\"; + КонецЕсли; +КонецПроцедуры + +// удаляет файлы после импорта или загрузки +Процедура УдалитьФайлыПослеДобавления(МассивСтруктурВсехФайлов, МассивВсехПапок, РежимЗагрузки) Экспорт + + Для Каждого Элемент Из МассивСтруктурВсехФайлов Цикл + ВыбранныйФайл = Новый Файл(Элемент.ИмяФайла); + ВыбранныйФайл.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ВыбранныйФайл.ПолноеИмя); + КонецЦикла; + + Если РежимЗагрузки Тогда + Для Каждого Элемент Из МассивВсехПапок Цикл + НайденныеФайлы = НайтиФайлы(Элемент, "*.*"); + Если НайденныеФайлы.Количество() = 0 Тогда + ВыбранныйФайл = Новый Файл(Элемент); + ВыбранныйФайл.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ВыбранныйФайл.ПолноеИмя); + КонецЕсли; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +// Функция предназначена для преобразования расширения файла в следующий вид: без точки и в нижнем регистре +// Параметры: +// СтрРасширение - Строка. Расширение для преобразования +// Возвращаемое значение: +// Преобразованная Строка +Функция РасширениеБезТочки(СтрРасширение) Экспорт + Расширение = НРег(СокрЛП(СтрРасширение)); + Если Сред(Расширение, 1, 1) = "." Тогда + Расширение = Сред(Расширение, 2); + КонецЕсли; + Возврат Расширение; +КонецФункции // РасширениеБезТочки() + +// Возвращает массив файлов, эмулируя работу НайтиФайлы - но не по файловой системе, а по Соответствию +// если ПсевдоФайловаяСистема пуста - работает с файловой системой +Функция НайтиФайлыПсевдо(Знач ПсевдоФайловаяСистема, Путь) Экспорт + Если ПсевдоФайловаяСистема.Количество() = 0 Тогда + Файлы = НайтиФайлы(Путь, "*.*"); + Возврат Файлы; + КонецЕсли; + + Файлы = Новый Массив; + + ЗначениеНайденное = ПсевдоФайловаяСистема.Получить(Строка(Путь)); + Если ЗначениеНайденное <> Неопределено Тогда + Для Каждого ИмяФайла Из ЗначениеНайденное Цикл + Попытка + ФайлИзСписка = Новый Файл(ИмяФайла); + Файлы.Добавить(ФайлИзСписка); + Исключение + КонецПопытки; + КонецЦикла; + КонецЕсли; + + Возврат Файлы; +КонецФункции diff --git a/SSL/src/CommonModules/ФайловыеФункцииКлиентСервер/ФайловыеФункцииКлиентСервер.mdo b/SSL/src/CommonModules/ФайловыеФункцииКлиентСервер/ФайловыеФункцииКлиентСервер.mdo new file mode 100644 index 000000000..73637986f --- /dev/null +++ b/SSL/src/CommonModules/ФайловыеФункцииКлиентСервер/ФайловыеФункцииКлиентСервер.mdo @@ -0,0 +1,11 @@ + + + ФайловыеФункцииКлиентСервер + + ru + Файловые функции клиент сервер + + true + true + true + diff --git a/SSL/src/CommonModules/ФизическиеЛица/Module.bsl b/SSL/src/CommonModules/ФизическиеЛица/Module.bsl new file mode 100644 index 000000000..62730741a --- /dev/null +++ b/SSL/src/CommonModules/ФизическиеЛица/Module.bsl @@ -0,0 +1,130 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБНОВЛЕНИЕ ИНФОРМАЦИОННОЙ БАЗЫ + +// Процедура заполняет справочник ДокументыФизическихЛиц по классификатору МВД +// +Процедура ЗаполнитьДокументыФизическихЛицПоКлассификаторуМВД() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ВидыДокументовФизическихЛиц.Наименование + |ИЗ + | Справочник.ВидыДокументовФизическихЛиц КАК ВидыДокументовФизическихЛиц + |ГДЕ + | (НЕ ВидыДокументовФизическихЛиц.Предопределенный)"; + СписокДокументовИБ = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Наименование"); + + СписокДокументов = Новый Массив; + СписокДокументов.Добавить("Паспорт гражданина СССР"); + СписокДокументов.Добавить("Загранпаспорт гражданина СССР"); + СписокДокументов.Добавить("Свидетельство о рождении"); + СписокДокументов.Добавить("Удостоверение личности"); + СписокДокументов.Добавить("Справка об освобождении"); + СписокДокументов.Добавить("Паспорт Минморфлота"); + СписокДокументов.Добавить("Военный билет"); + СписокДокументов.Добавить("Дипломатический паспорт гражданина РФ"); + СписокДокументов.Добавить("Иностранный паспорт"); + СписокДокументов.Добавить("Свидетельство о регистрации ходатайства иммигранта о признании его беженцем"); + СписокДокументов.Добавить("Вид на жительство"); + СписокДокументов.Добавить("Удостоверение беженца"); + СписокДокументов.Добавить("Временное удостоверение личности гражданина РФ"); + СписокДокументов.Добавить("Загранпаспорт гражданина РФ"); + СписокДокументов.Добавить("Свидетельство о рождении, выданное уполномоченным органом иностранного государства"); + СписокДокументов.Добавить("Паспорт моряка"); + СписокДокументов.Добавить("Военный билет офицера запаса"); + СписокДокументов.Добавить("Иные документы, выдаваемые органами МВД"); + + Для Каждого Док Из СписокДокументов Цикл + Если СписокДокументовИБ.Найти(Док) = Неопределено Тогда + ДокОбъект = Справочники.ВидыДокументовФизическихЛиц.СоздатьЭлемент(); + ДокОбъект.Наименование = Док; + ДокОбъект.Записать(); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Процедура заполняет измерение ВидДокумента по ресурсу УдалитьВидДокумента, +// а также заполняет реквизит ЯвляетсяДокументомУдостоверяющимЛичность для существующих записей +// +Процедура ПреобразоватьУдостоверенияЛичностиВДокументы() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ДокументыФизическихЛиц.Физлицо КАК Физлицо + |ПОМЕСТИТЬ ВТ_Физлица + |ИЗ + | РегистрСведений.ДокументыФизическихЛиц КАК ДокументыФизическихЛиц + |ГДЕ + | (НЕ ДокументыФизическихЛиц.УдалитьВидДокумента = ЗНАЧЕНИЕ(Справочник.ВидыДокументовФизическихЛиц.ПустаяСсылка)) + | + |ИНДЕКСИРОВАТЬ ПО + | Физлицо + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ДокументыФизическихЛиц.Период КАК Период, + | ДокументыФизическихЛиц.Физлицо КАК Физлицо, + | ДокументыФизическихЛиц.УдалитьВидДокумента КАК ВидДокумента, + | ДокументыФизическихЛиц.Серия, + | ДокументыФизическихЛиц.Номер, + | ДокументыФизическихЛиц.ДатаВыдачи, + | ДокументыФизическихЛиц.СрокДействия, + | ДокументыФизическихЛиц.КемВыдан, + | ДокументыФизическихЛиц.КодПодразделения, + | ВЫБОР + | КОГДА ДокументыФизическихЛиц.УдалитьВидДокумента = ЗНАЧЕНИЕ(Справочник.ВидыДокументовФизическихЛиц.ПустаяСсылка) + | ТОГДА ЛОЖЬ + | ИНАЧЕ ИСТИНА + | КОНЕЦ КАК ЯвляетсяДокументомУдостоверяющимЛичность, + | ДокументыФизическихЛиц.Представление + |ИЗ + | РегистрСведений.ДокументыФизическихЛиц КАК ДокументыФизическихЛиц + |ГДЕ + | ДокументыФизическихЛиц.Физлицо В + | (ВЫБРАТЬ + | Физлица.Физлицо + | ИЗ + | ВТ_Физлица КАК Физлица) + | + |УПОРЯДОЧИТЬ ПО + | Физлицо, + | Период"; + Выборка = Запрос.Выполнить().Выбрать(); + + НаборЗаписей = РегистрыСведений.ДокументыФизическихЛиц.СоздатьНаборЗаписей(); + НаборЗаписей.ОбменДанными.Загрузка = Истина; + + ТекстСерия = НСтр("ru = ', серия: %1'"); + ТекстНомер = НСтр("ru = ', № %1'"); + ТекстДатаВыдачи = НСтр("ru = ', выдан: %1 года'"); + ТекстСрокДействия = НСтр("ru = ', действует до: %1 года'"); + ТекстКодПодразделения = НСтр("ru = ', № подр. %1'"); + + Пока Выборка.СледующийПоЗначениюПоля("Физлицо") Цикл + НаборЗаписей.Отбор.Физлицо.Установить(Выборка.Физлицо); + + Пока Выборка.Следующий() Цикл + Запись = НаборЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(Запись, Выборка); + + Если ПустаяСтрока(Запись.Представление) И Не Запись.ВидДокумента.Пустая() Тогда + Запись.Представление = "" + + Запись.ВидДокумента + + ?(ЗначениеЗаполнено(Запись.Серия), СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСерия, Запись.Серия), "") + + ?(ЗначениеЗаполнено(Запись.Номер), СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстНомер, Запись.Номер), "") + + ?(ЗначениеЗаполнено(Запись.ДатаВыдачи), СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстДатаВыдачи, Формат(Запись.ДатаВыдачи,"ДФ='дд ММММ гггг'")), "") + + ?(ЗначениеЗаполнено(Запись.СрокДействия), СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСрокДействия, Формат(Запись.СрокДействия,"ДФ='дд ММММ гггг'")), "") + + ?(ЗначениеЗаполнено(Запись.КемВыдан), ", " + Запись.КемВыдан, "") + + ?(ЗначениеЗаполнено(Запись.КодПодразделения) И Запись.ВидДокумента = Справочники.ВидыДокументовФизическихЛиц.ПаспортРФ, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстКодПодразделения, Запись.КодПодразделения), ""); + КонецЕсли; + КонецЦикла; + + НаборЗаписей.Записать(); + НаборЗаписей.Очистить(); + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ФизическиеЛица/ФизическиеЛица.mdo b/SSL/src/CommonModules/ФизическиеЛица/ФизическиеЛица.mdo new file mode 100644 index 000000000..b9a47f3d6 --- /dev/null +++ b/SSL/src/CommonModules/ФизическиеЛица/ФизическиеЛица.mdo @@ -0,0 +1,10 @@ + + + ФизическиеЛица + + ru + Физические лица + + true + true + diff --git a/SSL/src/CommonModules/ЭлектроннаяПочта/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПочта/Module.bsl new file mode 100644 index 000000000..1b01d0799 --- /dev/null +++ b/SSL/src/CommonModules/ЭлектроннаяПочта/Module.bsl @@ -0,0 +1,838 @@ +//////////////////////////////////////////////////////////////////////////////// +// МОДУЛЬ СОДЕРЖИТ РЕАЛИЗАЦИЮ МЕХАНИКИ РАБОТЫ С ЭЛЕКТРОННЫМИ СООБЩЕНИЯМИ +// (программные интерфейсы для внешнего использования) +// + +// Функция для отправки сообщений. Проверяет корректность заполнения учетной +// записи и вызывает функцию реализующую механику отправки +// +// см. параметры функции ОтправитьСообщение +// +Функция ОтправитьПочтовоеСообщение(знач УчетнаяЗапись, + знач ПараметрыПисьма) Экспорт + + Если ТипЗнч(УчетнаяЗапись) <> Тип("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты") + ИЛИ НЕ ЗначениеЗаполнено(УчетнаяЗапись) Тогда + ВызватьИсключение НСтр("ru = 'Учетная запись не заполнена или заполнена не правильно'"); + КонецЕсли; + + Если ПараметрыПисьма = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Не заданы параметры отправки.'"); + КонецЕсли; + + Кому = ""; + Если ПараметрыПисьма.Свойство("Кому", Кому) Тогда + Если ТипЗнч(Кому) = Тип("Строка") Тогда + ПараметрыПисьма.Кому = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Кому); + КонецЕсли; + Иначе + ВызватьИсключение НСтр("ru = 'Не указан ни один получатель письма.'"); + КонецЕсли; + + Копии = ""; + Если ПараметрыПисьма.Свойство("Копии", Копии) Тогда + Если ТипЗнч(Копии) = Тип("Строка") Тогда + ПараметрыПисьма.Копии = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Копии); + КонецЕсли; + КонецЕсли; + + СлепыеКопии = ""; + Если ПараметрыПисьма.Свойство("СлепыеКопии", СлепыеКопии) Тогда + Если ТипЗнч(СлепыеКопии) = Тип("Строка") Тогда + ПараметрыПисьма.СлепыеКопии = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(СлепыеКопии); + КонецЕсли; + КонецЕсли; + + АдресОтвета = Неопределено; + + // проверяем правильную заполненность АдресаОтвета + Если ПараметрыПисьма.Свойство("АдресОтвета", АдресОтвета) Тогда + ПараметрыПисьма.АдресОтвета = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(АдресОтвета); + КонецЕсли; + + Вложения = Неопределено; + + Если ПараметрыПисьма.Свойство("Вложения", Вложения) Тогда + Для Каждого Вложение Из Вложения Цикл + Если ЭтоАдресВременногоХранилища(Вложение.Значение) Тогда + Вложения.Вставить(Вложение.Ключ, ПолучитьИзВременногоХранилища(Вложение.Значение)); + КонецЕсли; + КонецЦикла; + ПараметрыПисьма.Вложения = Вложения; + КонецЕсли; + + Возврат ОтправитьСообщение(УчетнаяЗапись, ПараметрыПисьма); + +КонецФункции + +// Функция для загрузки сообщений. Проверяет корректность заполнения учетной +// записи и вызывает функцию реализующую механику загрузки сообщений. +// +// параметры к функции см. в функции ЗагрузитьСообщения +// +Функция ЗагрузитьПочтовыеСообщения(знач УчетнаяЗапись, + знач ПараметрыЗагрузки = Неопределено) Экспорт + + Если НЕ УчетнаяЗапись.ИспользоватьДляПолучения Тогда + ВызватьИсключение НСтр("ru = 'Учетная запись не предназначена для получения сообщений.'"); + КонецЕсли; + + Результат = ЗагрузитьСообщения(УчетнаяЗапись, ПараметрыЗагрузки); + + Возврат Результат; + +КонецФункции + +// Получает ссылку на учетную запись по виду назначения учетной записи +// Параметры: +// ВидНазначенияУчетнойЗаписи - Перечисления.ВидыНазначенияУчетныхЗаписей - +// вид назначения учетной записи +// Возвращаемое значение: +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - ссылка +// на описание учетной записи +// +Функция ПолучитьСистемнуюУчетнуюЗапись() Экспорт + + Возврат Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты; + +КонецФункции + +// Проверяет, что предопределенная системная учетная запись электронной почты +// доступна для использования +// +Функция ПроверитьСистемнаяУчетнаяЗаписьДоступна() Экспорт + + Если НЕ ПравоДоступа("Чтение", Метаданные.Справочники.УчетныеЗаписиЭлектроннойПочты) Тогда + Возврат Ложь; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | УчетныеЗаписиЭлектроннойПочты.Ссылка КАК Ссылка + |ИЗ + | Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты + |ГДЕ + | УчетныеЗаписиЭлектроннойПочты.Ссылка = &Ссылка"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.Параметры.Вставить("Ссылка", Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты); + Если Запрос.Выполнить().Пустой() Тогда + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +// Получить доступные учетные записи электронной почты +// Параметры: +// ДляОтправки - Булево - Если установлено Истина, то будут выбирать только записи, с которых можно отправлять почту +// ДляПриема - Булево - Если установлено Истина, то будут выбирать только записи, по которым можно получать почту +// Возвращаемое значение: +// ДоступныеУчетныеЗаписи - ТаблицаЗначений - С колонками: +// Ссылка - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - Ссылка на учетную запись +// Наименование - Строка - Наименование учетной записи +// Адрес - Строка - Адрес электронной почты +// +Функция ПолучитьДоступныеУчетныеЗаписи(знач ДляОтправки, + знач ДляПриема, + знач ВключатьСистемнуюУчетнуюЗапись) Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | УчетныеЗаписиЭлектроннойПочты.Ссылка КАК Ссылка, + | УчетныеЗаписиЭлектроннойПочты.Наименование КАК Наименование, + | УчетныеЗаписиЭлектроннойПочты.АдресЭлектроннойПочты КАК Адрес + |ИЗ + | Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты"; + + Если ДляОтправки ИЛИ ДляПриема Тогда + СтрУсловия = ?(ДляОтправки, "УчетныеЗаписиЭлектроннойПочты.ИспользоватьДляОтправки", ""); + СтрУсловия = СтрУсловия + ?(ДляОтправки И ДляПриема, " И ", ""); + СтрУсловия = СтрУсловия + ?(ДляПриема, "УчетныеЗаписиЭлектроннойПочты.ИспользоватьДляПолучения", ""); + ТекстЗапроса = ТекстЗапроса + " + |ГДЕ " + СтрУсловия; + Иначе + ТекстЗапроса = ТекстЗапроса + " + |ГДЕ"; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + + Если НЕ ВключатьСистемнуюУчетнуюЗапись Тогда + Запрос.Текст =Запрос.Текст + + " + | УчетныеЗаписиЭлектроннойПочты.Ссылка <> &СистемнаяУчетнаяЗапись"; + Запрос.Параметры.Вставить("СистемнаяУчетнаяЗапись", Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты); + КонецЕсли; + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Функция отправления - непосредственная реализация механики отправления +// электронного сообщения +// +// Функция, реализующая механику отправки сообщения электронной почты +// +// Параметры: +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - ссылка на +// учетную запись электронной почты +// ПараметрыПисьма - структура - содержит всю необходимую информацию о письме: +// содержит следующие ключи: +// Кому* - Массив структур, строка - интернет адрес получателя письма +// Адрес - строка - почтовый адрес +// Представление - строка - имя адресата +// Копии - массив структур, строка - интернет адреса получателей письма +// используется при формировании письма для поля копий +// в случае массива структур, формат каждой структуры: +// Адрес - строка - почтовый адрес (должно быть обязательно заполнено) +// Представление - строка - имя адресата +// СлепыеКопии - массив структур, строка - интернет адреса получателей письма +// используется при формировании письма для поля скрытых копий +// в случае массива структур, формат каждой структуры: +// Адрес - строка - почтовый адрес (должно быть обязательно заполнено) +// Представление - строка - имя адресата +// +// Тема* - строка - тема почтового сообщения +// Тело* - тело почтового сообщения (простой текст в кодировке win-1251) +// Вложения - соответствие +// ключ - наименованиеВложения - строка - наименование вложения +// значение - ДвоичныеДанные - данные вложения +// +// дополнительные ключи структуры, которые могут использоваться: +// АдресОтвета - соответствие - см. такие же поля как и кому +// Пароль - строка - пароль для доступа учетной записи +// ТипТекста - Строка / Перечисление.ТипыТекстовЭлектронныхПисем/ТипТекстаПочтовогоСообщения определяет тип переданного теста +// допустимые значения: +// HTML/ТипыТекстовЭлектронныхПисем.HTML - текст почтового сообщения в формате HTML +// ПростойТекст/ТипыТекстовЭлектронныхПисем.ПростойТекст - простой текст почтового сообщения. Отображается "как есть" (значение по умолчанию) +// РазмеченныйТекст/ТипыТекстовЭлектронныхПисем.РазмеченныйТекст - текст почтового сообщения в формате Rich Text +// +// прим.: параметры письма помеченные символом '*' являются обязательными +// т.е. к началу работы функции считается что они уже заполнены +// +// Возвращаемое значение: +// Строка - идентификатор отправленного почтового сообщения на smtp сервере +// +// ПРИМЕЧАНИЕ: функция может вызвать исключение, которое требуется обработать +// +Функция ОтправитьСообщение(знач УчетнаяЗапись, + знач ПараметрыПисьма) Экспорт + + // Объявление переменных перед первым использованием в качестве + // параметра метода Свойство структуры ПараметрыПисьма. + // Переменные содержат значения переданных в функцию параметров. + Перем Кому, Тема, Тело, Вложения, АдресОтвета, ТипТекста, Копии, СлепыеКопии; + + Если Не ПараметрыПисьма.Свойство("Тема", Тема) Тогда + Тема = ""; + КонецЕсли; + + Если Не ПараметрыПисьма.Свойство("Тело", Тело) Тогда + Тело = ""; + КонецЕсли; + + Кому = ПараметрыПисьма.Кому; + + Если ТипЗнч(Кому) = Тип("Строка") Тогда + Кому = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Кому); + КонецЕсли; + + ПараметрыПисьма.Свойство("Вложения", Вложения); + + Письмо = Новый ИнтернетПочтовоеСообщение; + Письмо.Тема = Тема; + + // формируем адрес получателя + Для Каждого ПочтовыйАдресПолучателя Из Кому Цикл + Получатель = Письмо.Получатели.Добавить(ПочтовыйАдресПолучателя.Адрес); + Получатель.ОтображаемоеИмя = ПочтовыйАдресПолучателя.Представление; + КонецЦикла; + + Если ПараметрыПисьма.Свойство("Копии", Копии) Тогда + // формируем адрес получателя поля Копии + Для Каждого ПочтовыйАдресПолучателяКопии Из Копии Цикл + Получатель = Письмо.Копии.Добавить(ПочтовыйАдресПолучателяКопии.Адрес); + Получатель.ОтображаемоеИмя = ПочтовыйАдресПолучателяКопии.Представление; + КонецЦикла; + КонецЕсли; + + Если ПараметрыПисьма.Свойство("СлепыеКопии", СлепыеКопии) Тогда + // формируем адрес получателя поля Копии + Для Каждого ПочтовыйАдресПолучателяСлепыеКопии Из СлепыеКопии Цикл + Получатель = Письмо.СлепыеКопии.Добавить(ПочтовыйАдресПолучателяСлепыеКопии.Адрес); + Получатель.ОтображаемоеИмя = ПочтовыйАдресПолучателяСлепыеКопии.Представление; + КонецЦикла; + КонецЕсли; + + // формируем адрес ответа, если необходимо + Если ПараметрыПисьма.Свойство("АдресОтвета", АдресОтвета) Тогда + Для Каждого ПочтовыйАдресОтвета Из АдресОтвета Цикл + ПочтовыйАдресОбратный = Письмо.ОбратныйАдрес.Добавить(ПочтовыйАдресОтвета.Адрес); + ПочтовыйАдресОбратный.ОтображаемоеИмя = ПочтовыйАдресОтвета.Представление; + КонецЦикла; + КонецЕсли; + + // добавляем к письму имя отправителя + Письмо.ИмяОтправителя = УчетнаяЗапись.ИмяПользователя; + Письмо.Отправитель.ОтображаемоеИмя = УчетнаяЗапись.ИмяПользователя; + Письмо.Отправитель.Адрес = УчетнаяЗапись.АдресЭлектроннойПочты; + + // добавляем вложения к письму + Если Вложения <> Неопределено Тогда + Для Каждого ЭлементВложение Из Вложения Цикл + Письмо.Вложения.Добавить(ЭлементВложение.Значение, ЭлементВложение.Ключ); + КонецЦикла; + КонецЕсли; + + // Установим строку с идентификаторами оснований + Если ПараметрыПисьма.Свойство("ИдентификаторыОснований") Тогда + Письмо.УстановитьПолеЗаголовка("References", ПараметрыПисьма.ИдентификаторыОснований); + КонецЕсли; + + // добавляем текст + Текст = Письмо.Тексты.Добавить(Тело); + Если ПараметрыПисьма.Свойство("ТипТекста", ТипТекста) Тогда + Если ТипЗнч(ТипТекста) = Тип("Строка") Тогда + Если ТипТекста = "HTML" Тогда + Текст.ТипТекста = ТипТекстаПочтовогоСообщения.HTML; + ИначеЕсли ТипТекста = "RichText" Тогда + Текст.ТипТекста = ТипТекстаПочтовогоСообщения.РазмеченныйТекст; + Иначе + Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст; + КонецЕсли; + ИначеЕсли ТипЗнч(ТипТекста) = Тип("ПеречислениеСсылка.ТипыТекстовЭлектронныхПисем") Тогда + Если ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTML + ИЛИ ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTMLСКартинками Тогда + Текст.ТипТекста = ТипТекстаПочтовогоСообщения.HTML; + ИначеЕсли ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.РазмеченныйТекст Тогда + Текст.ТипТекста = ТипТекстаПочтовогоСообщения.РазмеченныйТекст; + Иначе + Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст; + КонецЕсли; + Иначе + Текст.ТипТекста = ТипТекста; + КонецЕсли; + Иначе + Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст; + КонецЕсли; + + // Зададим важность + Важность = Неопределено; + Если ПараметрыПисьма.Свойство("Важность", Важность) Тогда + Письмо.Важность = Важность; + КонецЕсли; + + // Зададим кодировку + Кодировка = Неопределено; + Если ПараметрыПисьма.Свойство("Кодировка", Кодировка) Тогда + Письмо.Кодировка = Кодировка; + КонецЕсли; + + Если ПараметрыПисьма.Свойство("Пароль") Тогда + Профиль = СформироватьИнтернетПрофиль(УчетнаяЗапись, ПараметрыПисьма.Пароль); + Иначе + Профиль = СформироватьИнтернетПрофиль(УчетнаяЗапись); + КонецЕсли; + + Соединение = Новый ИнтернетПочта; + + Соединение.Подключиться(Профиль); + + Соединение.Послать(Письмо); + + Соединение.Отключиться(); + + Возврат Письмо.ИдентификаторСообщения; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Функция просмотра почты - непосредственная реализация механики отправления +// электронного сообщения +// +// Функция, реализующая механику загрузки сообщений с сервера электронной почты +// для указанной учетной записи электронной почты +// +// Параметры: +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - ссылка на +// учетную запись электронной почты +// +// ПараметрыЗагрузки - структура +// ключ "Колонки" - массив - массив строк названий колонок +// названия колонок должны соответствовать полям объекта +// ИнтернетПочтовоеСообщение +// ключ "РежимТестирования" - булево - если Истина то вызов сделан в режиме тестирования +// учетной записи - при этом выборка писем происходит, +// но в возвращаемом значении они не попадают; по умолчанию +// режим тестирования отключен +// ключ "ПолучениеЗаголовков" - булево - если Истина то в возвращаемом наборе есть только +// заголовки писем +// ЗаголовкиИдентификаторы - массив - заголовки или идентификаторы сообщений, полные +// сообщения по которым требуется получить +// +// ключ "Пароль" - строка - пароль для доступа к POP3 +// +// Возвращаемое значение: +// НаборСообщений*- таблица значений, содержит адаптированный вариант списка сообщений на сервере +// Колонки таблицы значений (по умолчанию): +// Важность, Вложения, ДатаОтправления, ДатаПолучения, Заголовок, ИмяОтправителя, +// Идентификатор, Копии, Обратный адрес, Отправитель, Получатели, Размер, Тексты, +// Кодировка, СпособКодированияНеASCIIСимволов, Частичное +// заполняется если статус Истина +// +// Прим. * - в режиме тестирования не участвует в формировании возвращаемого значения +// +Функция ЗагрузитьСообщения(знач УчетнаяЗапись, + знач ПараметрыЗагрузки = Неопределено) + + // Используется для проверки возможности входа на почтовый ящик + Перем РежимТестирования; + + // Получать только заголовки писем + Перем ПолучениеЗаголовков; + + // Заголовки или идентификаторы писем, полные сообщения по которым требуется получить + Перем ЗаголовкиИдентификаторы; + + Если ПараметрыЗагрузки.Свойство("РежимТестирования") Тогда + РежимТестирования = ПараметрыЗагрузки.РежимТестирования; + Иначе + РежимТестирования = Ложь; + КонецЕсли; + + Если ПараметрыЗагрузки.Свойство("ПолучениеЗаголовков") Тогда + ПолучениеЗаголовков = ПараметрыЗагрузки.ПолучениеЗаголовков; + Иначе + ПолучениеЗаголовков = Ложь; + КонецЕсли; + + Если ПараметрыЗагрузки.Свойство("Пароль") Тогда + Профиль = СформироватьИнтернетПрофиль(УчетнаяЗапись, ПараметрыЗагрузки.Пароль); + Иначе + Профиль = СформироватьИнтернетПрофиль(УчетнаяЗапись); + КонецЕсли; + + Если ПараметрыЗагрузки.Свойство("ЗаголовкиИдентификаторы") Тогда + ЗаголовкиИдентификаторы = ПараметрыЗагрузки.ЗаголовкиИдентификаторы; + Иначе + ЗаголовкиИдентификаторы = Новый Массив; + КонецЕсли; + + Соединение = Новый ИнтернетПочта; + + Соединение.Подключиться(Профиль); + + Если РежимТестирования ИЛИ ПолучениеЗаголовков Тогда + + НаборПисем = Соединение.ПолучитьЗаголовки(); + + Иначе + + Если УчетнаяЗапись.ОставлятьКопииСообщенийНаСервере Тогда + + Если УчетнаяЗапись.ПериодХраненияСообщенийНаСервере > 0 Тогда + + Заголовки = Соединение.ПолучитьЗаголовки(); + + НаборСообщенийДляУдаления = Новый Массив; + + Для Каждого ЭлементЗаголовок Из Заголовки Цикл + ТекущаяДата = ТекущаяДата(); + РазницаДат = (ТекущаяДата - ЭлементЗаголовок.ДатаОтправления) / (3600*24); + Если РазницаДат >= УчетнаяЗапись.ПериодХраненияСообщенийНаСервере Тогда + НаборСообщенийДляУдаления.Добавить(ЭлементЗаголовок); + КонецЕсли; + КонецЦикла; + + Соединение.УдалитьСообщения(НаборСообщенийДляУдаления); + КонецЕсли; + + УдалятьСообщенияПриВыбореССервера = Ложь; + + Иначе + + УдалятьСообщенияПриВыбореССервера = Истина; + + КонецЕсли; + + НаборПисем = Соединение.Выбрать(УдалятьСообщенияПриВыбореССервера, ЗаголовкиИдентификаторы); + + КонецЕсли; + + Соединение.Отключиться(); + + Если РежимТестирования Тогда + Возврат Истина; + КонецЕсли; + + Если ПараметрыЗагрузки.Свойство("Колонки") Тогда + НаборСообщений = ПолучитьАдаптированныйНаборПисем(НаборПисем, ПараметрыЗагрузки.Колонки); + Иначе + НаборСообщений = ПолучитьАдаптированныйНаборПисем(НаборПисем); + КонецЕсли; + + Возврат НаборСообщений; + +КонецФункции + +// Устанавливает соединение с сервером электронной почты +// Параметры: +// Профиль - ИнтернетПочтовыйПрофиль - профиль учетной записи электронной +// почты, через который необходимо установить соединение +// +// Возвращаемое значение: +// Соединение (тип ИнтернетПочта) +// +Функция УстановитьСоединениеССерверомЭлектроннойПочты(Профиль) Экспорт + + Соединение = Новый ИнтернетПочта; + Соединение.Подключиться(Профиль); + + Возврат Соединение; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Блок системных и вспомогательных функций подсистемы +// + +// По переданной ссылке на учетную запись формирует профиль почтового соединения +// +// Параметры +// УчетнаяЗапись - СправочникСсылка.УчетнаяЗаписьЭлектроннойПочты - +// параметры профиля в виде соответствия +// +// Возвращаемое значение +// Почтовый профиль (тип ИнтернетПочтовыйПрофиль) +// +Функция СформироватьИнтернетПрофиль(знач УчетнаяЗапись, + знач Пароль = Неопределено, + знач ФормироватьSMTPПрофиль = Истина, + знач ФормироватьPOP3Профиль = Истина) Экспорт + + Профиль = Новый ИнтернетПочтовыйПрофиль; + + Профиль.Пользователь = УчетнаяЗапись.Пользователь; + + Профиль.ВремяОжидания = УчетнаяЗапись.ВремяОжидания; + + Если ЗначениеЗаполнено(Пароль) Тогда + Профиль.Пароль = Пароль; + Иначе + Профиль.Пароль = УчетнаяЗапись.Пароль; + КонецЕсли; + + Если ФормироватьSMTPПрофиль Тогда + Профиль.АдресСервераSMTP = УчетнаяЗапись.SMTPСервер; + Профиль.ПортSMTP = УчетнаяЗапись.ПортSMTP; + + Если УчетнаяЗапись.SMTPАутентификация = Перечисления.ВариантыSMTPАутентификации.АналогичноPOP3 Тогда + Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию; + Профиль.ПользовательSMTP = УчетнаяЗапись.Пользователь; + Профиль.ПарольSMTP = УчетнаяЗапись.Пароль; + ИначеЕсли УчетнаяЗапись.SMTPАутентификация = Перечисления.ВариантыSMTPАутентификации.ЗадаетсяПараметрами Тогда + + Если УчетнаяЗапись.СпособSMTPАутентификации = Перечисления.СпособыSMTPАутентификации.CramMD5 Тогда + Профиль.АутентификацияSMTP = СпособSMTPАутентификации.CramMD5; + ИначеЕсли УчетнаяЗапись.СпособSMTPАутентификации = Перечисления.СпособыSMTPАутентификации.Login Тогда + Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login; + ИначеЕсли УчетнаяЗапись.СпособSMTPАутентификации = Перечисления.СпособыSMTPАутентификации.Plain Тогда + Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Plain; + ИначеЕсли УчетнаяЗапись.СпособSMTPАутентификации = Перечисления.СпособыSMTPАутентификации.БезАутентификации Тогда + Профиль.АутентификацияSMTP = СпособSMTPАутентификации.БезАутентификации; + Иначе + Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию; + КонецЕсли; + + Профиль.ПользовательSMTP = УчетнаяЗапись.ПользовательSMTP; + Профиль.ПарольSMTP = УчетнаяЗапись.ПарольSMTP; + + ИначеЕсли УчетнаяЗапись.SMTPАутентификация = Перечисления.ВариантыSMTPАутентификации.POP3ПередSMTP Тогда + Профиль.АутентификацияSMTP = СпособSMTPАутентификации.БезАутентификации; + Профиль.POP3ПередSMTP = Истина; + Иначе + Профиль.АутентификацияSMTP = СпособSMTPАутентификации.БезАутентификации; + КонецЕсли; + КонецЕсли; + + Если ФормироватьPOP3Профиль Тогда + Профиль.АдресСервераPOP3 = УчетнаяЗапись.POP3Сервер; + Профиль.ПортPOP3 = УчетнаяЗапись.ПортPOP3; + + Если УчетнаяЗапись.СпособPOP3Аутентификации = Перечисления.СпособыPOP3Аутентификации.APOP Тогда + Профиль.АутентификацияPOP3 = СпособPOP3Аутентификации.APOP; + ИначеЕсли УчетнаяЗапись.СпособPOP3Аутентификации = Перечисления.СпособыPOP3Аутентификации.CramMD5 Тогда + Профиль.АутентификацияPOP3 = СпособPOP3Аутентификации.CramMD5; + Иначе + Профиль.АутентификацияPOP3 = СпособPOP3Аутентификации.Обычная; + КонецЕсли; + КонецЕсли; + + Возврат Профиль; + +КонецФункции + +// Функция записывает адаптированный набор писем по переданным колонкам. +// Значения колонок, типы которых не поддерживаются для оперирования на клиенте +// преобразуются к строковому виду. +// +Функция ПолучитьАдаптированныйНаборПисем(знач НаборПисем, знач Колонки = Неопределено) + + Результат = СоздатьАдаптированноеОписаниеПисьма(Колонки); + + Для Каждого ПочтовоеСообщение Из НаборПисем Цикл + НоваяСтрока = Результат.Добавить(); + + Для Каждого НаименованиеКолонки Из Колонки Цикл + + Значение = ПочтовоеСообщение[НаименованиеКолонки]; + + Если ТипЗнч(Значение) = Тип("ИнтернетПочтовыеАдреса") Тогда + значение_итог = ""; + Для Каждого ОчереднойАдрес Из Значение Цикл + значение_вр = ОчереднойАдрес.Адрес; + Если ЗначениеЗаполнено(ОчереднойАдрес.ОтображаемоеИмя) Тогда + значение_вр = ОчереднойАдрес.ОтображаемоеИмя + " <" + значение_вр + ">"; + КонецЕсли; + Если ЗначениеЗаполнено(значение_вр) Тогда + значение_вр = значение_вр + "; " + КонецЕсли; + значение_итог = значение_итог + значение_вр; + КонецЦикла; + + Если ЗначениеЗаполнено(значение_итог) Тогда + значение_итог = сред(значение_итог, 1, СтрДлина(значение_итог)-2) + КонецЕсли; + + значение = значение_итог; + КонецЕсли; + + Если ТипЗнч(Значение) = Тип("ИнтернетПочтовыйАдрес") Тогда + значение_вр = Значение.Адрес; + Если ЗначениеЗаполнено(Значение.ОтображаемоеИмя) Тогда + значение_вр = Значение.ОтображаемоеИмя + " <" + значение_вр + ">"; + КонецЕсли; + значение = значение_вр; + КонецЕсли; + + Если ТипЗнч(Значение) = Тип("ВажностьИнтернетПочтовогоСообщения") Тогда + значение = Строка(Значение); + КонецЕсли; + + Если ТипЗнч(Значение) = Тип("СпособКодированияНеASCIIСимволовИнтернетПочтовогоСообщения") Тогда + значение = Строка(Значение); + КонецЕсли; + + Если ТипЗнч(Значение) = Тип("ИнтернетПочтовыеВложения") Тогда + значение_соотв = Новый Соответствие; + + Для Каждого ОчередноеВложение Из Значение Цикл + ИмяВложения = ОчередноеВложение.Имя; + ДвоичныеДанные = ОчередноеВложение.Данные; + значение_соотв.Вставить(ИмяВложения, ДвоичныеДанные); + КонецЦикла; + + значение = значение_соотв; + КонецЕсли; + + Если ТипЗнч(Значение) = Тип("ИнтернетТекстыПочтовогоСообщения") Тогда + значение_масс = Новый Массив; + Для Каждого ОчереднойТекст Из Значение Цикл + значение_соотв = Новый Соответствие; + + значение_соотв.Вставить("Данные", ОчереднойТекст.Данные); + значение_соотв.Вставить("Кодировка", ОчереднойТекст.Кодировка); + значение_соотв.Вставить("Текст", ОчереднойТекст.Текст); + значение_соотв.Вставить("ТипТекста", Строка(ОчереднойТекст.ТипТекста)); + + значение_масс.Добавить(значение_соотв); + КонецЦикла; + значение = значение_масс; + КонецЕсли; + + НоваяСтрока[НаименованиеКолонки] = Значение; + КонецЦикла; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Функция подготавливает таблицу, в которой впоследствии будут +// храниться сообщения с почтового сервера. +// +// Параметры +// Колонки - строка - список полей письма, через запятую, которые должны +// быть записаны в таблицу. Параметр меняет тип на массив. +// Возвращаемое значение +// ТаблицаЗначений - пустая таблица значений с колонками +// +Функция СоздатьАдаптированноеОписаниеПисьма(Колонки = Неопределено) + + Если Колонки <> Неопределено + И ТипЗнч(Колонки) = Тип("Строка") Тогда + Колонки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Колонки, ","); + Для Индекс = 0 По Колонки.Количество()-1 Цикл + Колонки[Индекс] = СокрЛП(Колонки[Индекс]); + КонецЦикла; + КонецЕсли; + + МассивКолонокПоУмолчанию = Новый Массив; + МассивКолонокПоУмолчанию.Добавить("Важность"); + МассивКолонокПоУмолчанию.Добавить("Вложения"); + МассивКолонокПоУмолчанию.Добавить("ДатаОтправления"); + МассивКолонокПоУмолчанию.Добавить("ДатаПолучения"); + МассивКолонокПоУмолчанию.Добавить("Заголовок"); + МассивКолонокПоУмолчанию.Добавить("ИмяОтправителя"); + МассивКолонокПоУмолчанию.Добавить("Идентификатор"); + МассивКолонокПоУмолчанию.Добавить("Копии"); + МассивКолонокПоУмолчанию.Добавить("ОбратныйАдрес"); + МассивКолонокПоУмолчанию.Добавить("Отправитель"); + МассивКолонокПоУмолчанию.Добавить("Получатели"); + МассивКолонокПоУмолчанию.Добавить("Размер"); + МассивКолонокПоУмолчанию.Добавить("Тема"); + МассивКолонокПоУмолчанию.Добавить("Тексты"); + МассивКолонокПоУмолчанию.Добавить("Кодировка"); + МассивКолонокПоУмолчанию.Добавить("СпособКодированияНеASCIIСимволов"); + МассивКолонокПоУмолчанию.Добавить("Частичное"); + + Если Колонки = Неопределено Тогда + Колонки = МассивКолонокПоУмолчанию; + КонецЕсли; + + Результат = Новый ТаблицаЗначений; + + Для Каждого НаименованиеКолонки Из Колонки Цикл + Результат.Колонки.Добавить(НаименованиеКолонки); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Блок функций первоначального заполнения и обновления ИБ +// + +// Выполняет заполнение системной учетной записи значениями по умолчанию +// +Процедура ЗаполнитьСистемнуюУчетнуюЗапись() Экспорт + + УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты.ПолучитьОбъект(); + УчетнаяЗапись.ЗаполнитьОбъектЗначениямиПоУмолчанию(); + УчетнаяЗапись.Записать(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// +// Блок функций для проверки учетной записи +// + +&НаСервере +Функция ПарольЗадан(УчетнаяЗапись) Экспорт + + Возврат ЗначениеЗаполнено(УчетнаяЗапись.Пароль); + +КонецФункции + +&НаСервере +Процедура ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(УчетнаяЗапись, ПарольПараметр, СообщениеОбОшибке, ДополнительноеСообщение) Экспорт + + СообщениеОбОшибке = ""; + ДополнительноеСообщение = ""; + + Если УчетнаяЗапись.ИспользоватьДляОтправки Тогда + Попытка + ПроверитьВозможностьОтправкиТестовогоСообщения(УчетнаяЗапись, ПарольПараметр); + Исключение + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при отправке сообщения: %1'"), + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) ); + КонецПопытки; + Иначе + ДополнительноеСообщение = Символы.ПС + НСтр("ru = 'Прим. учетная запись не используется для отправки электронных сообщений.'"); + КонецЕсли; + + Если УчетнаяЗапись.ИспользоватьДляПолучения Тогда + Попытка + ПроверитьВходНаСерверВходящейЭлектроннойПочты(УчетнаяЗапись, ПарольПараметр); + Исключение + Если ЗначениеЗаполнено(СообщениеОбОшибке) Тогда + СообщениеОбОшибке = СообщениеОбОшибке + Символы.ПС; + КонецЕсли; + + СообщениеОбОшибке = СообщениеОбОшибке + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка доступа к серверу входящих сообщений: %1'"), + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) ); + КонецПопытки; + Иначе + ДополнительноеСообщение = ДополнительноеСообщение + + Символы.ПС + + НСтр("ru = 'Прим. учетная запись не используется для получения электронных сообщений.'"); + КонецЕсли; + +КонецПроцедуры + +// Процедура проверяющая возможность отправления почтового сообщения через +// учетную запись +// +// Параметры +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - учетная запись, +// которую необходимо проверить +// +// Возвращаемое значение +// структура +// ключ "статус" - булево, если Истина - успешно вошли на сервер pop3 +// если Ложь - ошибка при входе на сервер pop3 +// ключ "СообщениеОбОшибке" - строка - если статус Ложь - содержит сообщение об ошибке +// +&НаСервере +Процедура ПроверитьВозможностьОтправкиТестовогоСообщения(знач УчетнаяЗапись, + знач Пароль = Неопределено) + + ПараметрыПисьма = Новый Структура; + + ПараметрыПисьма.Вставить("Тема", НСтр("ru = 'Тестовое сообщение 1С:Предприятие'")); + ПараметрыПисьма.Вставить("Тело", НСтр("ru = 'Это сообщение отправлено подсистемой электронной почты 1С:Предприятие'")); + ПараметрыПисьма.Вставить("Кому", УчетнаяЗапись.АдресЭлектроннойПочты); + Если Пароль <> Неопределено Тогда + ПараметрыПисьма.Вставить("Пароль", Пароль); + КонецЕсли; + + ЭлектроннаяПочта.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма); + +КонецПроцедуры + +// Процедура проверяющая возможность получения почтового сообщения через +// учетную запись +// +// Параметры +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - учетная запись, +// которую необходимо проверить +// +// Возвращаемое значение +// структура +// ключ "статус" - булево, если Истина - успешно вошли на сервер pop3 +// если Ложь - ошибка при входе на сервер pop3 +// ключ "СообщениеОбОшибке" - строка - если статус Ложь - содержит сообщение об ошибке +// +&НаСервере +Процедура ПроверитьВходНаСерверВходящейЭлектроннойПочты(знач УчетнаяЗапись, + знач Пароль = Неопределено) + + ПараметрыЗагрузки = Новый Структура("РежимТестирования", Истина); + + Если Пароль <> Неопределено Тогда + ПараметрыЗагрузки.Вставить("Пароль", Пароль); + КонецЕсли; + + ЭлектроннаяПочта.ЗагрузитьПочтовыеСообщения(УчетнаяЗапись, ПараметрыЗагрузки); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ЭлектроннаяПочта/ЭлектроннаяПочта.mdo b/SSL/src/CommonModules/ЭлектроннаяПочта/ЭлектроннаяПочта.mdo new file mode 100644 index 000000000..64205a5d0 --- /dev/null +++ b/SSL/src/CommonModules/ЭлектроннаяПочта/ЭлектроннаяПочта.mdo @@ -0,0 +1,10 @@ + + + ЭлектроннаяПочта + + ru + Электронная почта + + true + true + diff --git a/SSL/src/CommonModules/ЭлектроннаяПочтаКлиент/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПочтаКлиент/Module.bsl new file mode 100644 index 000000000..e99dd4947 --- /dev/null +++ b/SSL/src/CommonModules/ЭлектроннаяПочтаКлиент/Module.bsl @@ -0,0 +1,45 @@ + +// Открытие формы редактирования нового письма. +// Параметры +// Отправитель* - СписокЗначений, СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - +// учетная запись (список) с которой(которых) может быть отправлено +// почтовое сообщение. Если тип список значений, тогда +// представление - наименование учетной записи, +// значение - ссылка на учетную запись +// +// Получатель - СписокЗначений, Строка: +// если список значений, то представление - имя получателя +// значение - почтовый адрес +// если строка то список почтовых адресов, +// в формате правильного e-mail адреса* +// +// Тема - Строка - тема письма +// Текст - Строка - тело письма +// +// СписокФайлов - СписокЗначений, где +// представление - строка - наименование вложения +// значение - ДвоичныеДанные - двоичные данные вложения +// - Строка - адрес файла во временном хранилище +// - Строка - путь к файлу на клиенте +// +// УдалятьФайлыПослеОтправки - булево - удалять временные файлы после отправки сообщения +// +Процедура ОткрытьФормуОтправкиПочтовогоСообщения(знач Отправитель = Неопределено, + Получатель = Неопределено, + Тема = "", + Текст = "", + СписокФайлов = Неопределено, + УдалятьФайлыПослеОтправки = Ложь) Экспорт + + ПараметрыПисьма = Новый Структура; + + ПараметрыПисьма.Вставить("УчетнаяЗапись", Отправитель); + ПараметрыПисьма.Вставить("Кому", Получатель); + ПараметрыПисьма.Вставить("Тема", Тема); + ПараметрыПисьма.Вставить("Тело", Текст); + ПараметрыПисьма.Вставить("Вложения", СписокФайлов); + ПараметрыПисьма.Вставить("УдалятьФайлыПослеОтправки", УдалятьФайлыПослеОтправки); + + ОткрытьФорму("ОбщаяФорма.РедактированиеНовогоПисьма", ПараметрыПисьма); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ЭлектроннаяПочтаКлиент/ЭлектроннаяПочтаКлиент.mdo b/SSL/src/CommonModules/ЭлектроннаяПочтаКлиент/ЭлектроннаяПочтаКлиент.mdo new file mode 100644 index 000000000..36b032635 --- /dev/null +++ b/SSL/src/CommonModules/ЭлектроннаяПочтаКлиент/ЭлектроннаяПочтаКлиент.mdo @@ -0,0 +1,11 @@ + + + ЭлектроннаяПочтаКлиент + + ru + Электронная почта клиент + + true + true + true + diff --git a/SSL/src/CommonModules/ЭлектронноЦифроваяПодпись/Module.bsl b/SSL/src/CommonModules/ЭлектронноЦифроваяПодпись/Module.bsl new file mode 100644 index 000000000..1a2b3b4cf --- /dev/null +++ b/SSL/src/CommonModules/ЭлектронноЦифроваяПодпись/Module.bsl @@ -0,0 +1,391 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОСНОВНЫЕ МЕТОДЫ + +// Заносит информацию о одной ЭЦП +// +// Параметры +// Данные - Структура - информация для занесения в табличную часть +// ЭлектронноЦифровыеПодписи +Процедура ЗанестиИнформациюОднойПодписи(Данные) Экспорт + + ОбъектСсылка = Данные.ОбъектСсылка; + + Если ТипЗнч(ОбъектСсылка) = Тип("СправочникСсылка.Файлы") Тогда + + СсылкаРедактирует = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ОбъектСсылка, "Редактирует"); + Если НЕ СсылкаРедактирует.Пустая() Тогда + СтрокаИсключения = НСтр("ru = 'Нельзя подписать занятый файл: ""'") + Строка(ОбъектСсылка) + """"; + ВызватьИсключение СтрокаИсключения; + КонецЕсли; + + СсылкаЗашифрован = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ОбъектСсылка, "Зашифрован"); + Если СсылкаЗашифрован Тогда + СтрокаИсключения = НСтр("ru = 'Нельзя подписать зашифрованный файл: ""'") + Строка(ОбъектСсылка) + """"; + ВызватьИсключение СтрокаИсключения; + КонецЕсли; + + КонецЕсли; + + ЗанестиИнформациюОПодписи(Данные.ОбъектСсылка, Данные.НоваяПодписьДвоичныеДанные, + Данные.Отпечаток, Данные.ДатаПодписи, Данные.Комментарий, + Данные.ИмяФайлаПодписи, Данные.КомуВыданСертификат, + Данные.ВерсияАлгоритмаГенерацииФайла); + +КонецПроцедуры + +// удаляет записи из регистра ЭЦП +// +// Параметры +// МассивВыделенныеСтроки - Массив структур - массив структур - данные для поиска объекта и строки в его табличной части +// РеквизитПодписанИзменен - Булево - возвращаемое значение - если удалена последняя подпись, +// РеквизитПодписанИзменен примет значение Истина +Процедура УдалитьПодписи(МассивВыделенныеСтроки, РеквизитПодписанИзменен) Экспорт + + РеквизитПодписанИзменен = Ложь; + + Для Каждого ДанныеПодписи Из МассивВыделенныеСтроки Цикл + УдалитьПодпись(ДанныеПодписи, РеквизитПодписанИзменен); + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ МЕТОДЫ + +// Заносит информацию о подписи +// +// Параметры +// ОбъектСсылка - любая ссылка - объект, в табличную часть которого будет занесена информация о ЭЦП +// НоваяПодписьДвоичныеДанные - ДвоичныеДанные - двоичные данные подписи +// Отпечаток - Строка - Base64 закодированная строка с отпечатком сертификата подписавшего +// ДатаПодписи - Дата - дата подписи +// Комментарий - Строка - комментарий подписи +// ИмяФайлаПодписи - Строка - имя файла подписи (непусто только в случае если подпись добавлена из файла) +// КомуВыданСертификат - Строка - представление поля КомуВыдан сертификата +// ВерсияАлгоритмаГенерацииФайла - Число - версия алгоритма генерации файла для подписи +Процедура ЗанестиИнформациюОПодписи(ОбъектСсылка, НоваяПодписьДвоичныеДанные, + Отпечаток, ДатаПодписи, Комментарий, ИмяФайлаПодписи, + КомуВыданСертификат, ВерсияАлгоритмаГенерацииФайла) Экспорт + + ОбъектСсылкаДляЗаписи = ОбъектСсылка; + Если ТипЗнч(ОбъектСсылка) = Тип("СправочникСсылка.Файлы") Тогда + ОбъектСсылкаДляЗаписи = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ОбъектСсылка, "ТекущаяВерсия"); + + СсылкаРедактирует = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ОбъектСсылка, "Редактирует"); + Если НЕ СсылкаРедактирует.Пустая() Тогда + ВызватьИсключение НСтр("ru = 'Нельзя подписать занятый файл'"); + КонецЕсли; + КонецЕсли; + + НачатьТранзакцию(); + Попытка + ОбъектВерсия = ОбъектСсылкаДляЗаписи.ПолучитьОбъект(); + ОбъектВерсия.Заблокировать(); + + НоваяЗапись = ОбъектВерсия.ЭлектронноЦифровыеПодписи.Добавить(); + + НоваяЗапись.КомуВыданСертификат = КомуВыданСертификат; + НоваяЗапись.ВерсияАлгоритмаГенерацииФайла = ВерсияАлгоритмаГенерацииФайла; + НоваяЗапись.ДатаПодписи = ДатаПодписи; + НоваяЗапись.ИмяФайлаПодписи = ИмяФайлаПодписи; + НоваяЗапись.Комментарий = Комментарий; + НоваяЗапись.Отпечаток = Отпечаток; + НоваяЗапись.Подпись = Новый ХранилищеЗначения(НоваяПодписьДвоичныеДанные); + НоваяЗапись.УстановившийПодпись = ОбщегоНазначения.ТекущийПользователь(); + + ОбъектВерсия.Подписан = Истина; + ОбъектВерсия.ЗаписьПодписанногоОбъекта = Истина; // чтобы прошла запись ранее подписанной версии + + УстановитьПривилегированныйРежим(Истина); + ОбъектВерсия.Записать(); + УстановитьПривилегированныйРежим(Ложь); + + Если ТипЗнч(ОбъектСсылкаДляЗаписи) = Тип("СправочникСсылка.ВерсииФайлов") Тогда + ФайлСсылка = ОбъектСсылка; + + ФайлСсылкаПодписан = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ФайлСсылка, "Подписан"); + Если ФайлСсылкаПодписан = Ложь Тогда + ОбъектФайл = ФайлСсылка.ПолучитьОбъект(); + ОбъектФайл.Заблокировать(); + ОбъектФайл.Подписан = Истина; + + ОбъектФайл.Записать(); + КонецЕсли; + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Заносит информацию о массиве ЭЦП +// +// Параметры +// МассивДанныхДляЗанесенияВРегистр - Массив Структур - информация для занесения в табличную часть +// ЭлектронноЦифровыеПодписи +// МассивАдресов - массив строк - с навигационными ссылками файла во временном хранилище +Процедура ЗанестиИнформациюОПодписях(МассивДанныхДляЗанесенияВРегистр, МассивАдресов) Экспорт + + Для Каждого Данные Из МассивДанныхДляЗанесенияВРегистр Цикл + ОбъектСсылка = Данные.ОбъектСсылка; + + Если ТипЗнч(ОбъектСсылка) = Тип("СправочникСсылка.Файлы") Тогда + + СсылкаРедактирует = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ОбъектСсылка, "Редактирует"); + Если НЕ СсылкаРедактирует.Пустая() Тогда + СтрокаИсключения = НСтр("ru = 'Нельзя подписать занятый файл: ""'") + Строка(ОбъектСсылка) + """"; + ВызватьИсключение СтрокаИсключения; + КонецЕсли; + + СсылкаЗашифрован = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ОбъектСсылка, "Зашифрован"); + Если СсылкаЗашифрован Тогда + СтрокаИсключения = НСтр("ru = 'Нельзя подписать зашифрованный файл: ""'") + Строка(ОбъектСсылка) + """"; + ВызватьИсключение СтрокаИсключения; + КонецЕсли; + + КонецЕсли; + КонецЦикла; + + Для Каждого Данные Из МассивДанныхДляЗанесенияВРегистр Цикл + ЗанестиИнформациюОПодписи(Данные.ОбъектСсылка, Данные.НоваяПодписьДвоичныеДанные, + Данные.Отпечаток, Данные.ДатаПодписи, Данные.Комментарий, + Данные.ИмяФайлаПодписи, Данные.КомуВыданСертификат, + Данные.ВерсияАлгоритмаГенерацииФайла); + КонецЦикла; + + Для Каждого АдресФайла Из МассивАдресов Цикл + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда + УдалитьИзВременногоХранилища(АдресФайла); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Возвращает количество подписей у данного объекта +// +// Параметры +// ОбъектСсылка - СправочникСсылка - объект, в табличной части которого содержатся подписи +// +// Возвращаемое значение: +// Число - количество подписей +Функция КоличествоПодписей(ОбъектСсылка) + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | КОЛИЧЕСТВО(*) КАК ЧислоЗаписей + |ИЗ + | "; + + Запрос.Текст = Запрос.Текст + ОбщегоНазначения.ИмяТаблицыПоСсылке(ОбъектСсылка); + Запрос.Текст = Запрос.Текст + ".ЭлектронноЦифровыеПодписи КАК ЭлектронноЦифровыеПодписи + |ГДЕ + | ЭлектронноЦифровыеПодписи.Ссылка = &ОбъектСсылка"; + + Запрос.Параметры.Вставить("ОбъектСсылка", ОбъектСсылка); + + ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); + + ЧислоЗаписей = 0; + Если ВыборкаЗапроса.Следующий() Тогда + ЧислоЗаписей = ВыборкаЗапроса.ЧислоЗаписей; + КонецЕсли; + + Возврат ЧислоЗаписей; + +КонецФункции + +// удаляет одну запись из регистра ЭЦП +// +// Параметры +// ДанныеПодписи - Структура - данные для поиска объекта и строки в его табличной части +// РеквизитПодписанИзменен - Булево - возвращаемое значение - если удалена последняя подпись, +// РеквизитПодписанИзменен примет значение Истина +Процедура УдалитьПодпись(ДанныеПодписи, РеквизитПодписанИзменен) Экспорт + + Если НЕ РольДоступна("ПолныеПрава") Тогда + Если ДанныеПодписи.УстановившийПодпись <> ОбщегоНазначения.ТекущийПользователь() Тогда + ВызватьИсключение НСтр("ru = 'У вас нет прав на удаление подписи.'"); + КонецЕсли; + КонецЕсли; + + НомерСтроки = ДанныеПодписи.НомерСтроки; + ОбъектСсылка = ДанныеПодписи.Объект; + + НачатьТранзакцию(); + Попытка + ОбъектВерсия = ОбъектСсылка.ПолучитьОбъект(); + ОбъектВерсия.Заблокировать(); + + КоличествоПодписейДоУдаления = КоличествоПодписей(ОбъектСсылка); + + СтрокаТабличнойЧасти = ОбъектВерсия.ЭлектронноЦифровыеПодписи.Найти(НомерСтроки, "НомерСтроки"); + Если СтрокаТабличнойЧасти <> Неопределено Тогда + ОбъектВерсия.ЭлектронноЦифровыеПодписи.Удалить(СтрокаТабличнойЧасти); + КонецЕсли; + + Если КоличествоПодписейДоУдаления > 1 Тогда + ОбъектВерсия.Подписан = Истина; + Иначе + ОбъектВерсия.Подписан = Ложь; + КонецЕсли; + + ОбъектВерсия.ЗаписьПодписанногоОбъекта = Истина; // чтобы прошла запись ранее подписанной версии + + УстановитьПривилегированныйРежим(Истина); + ОбъектВерсия.Записать(); + УстановитьПривилегированныйРежим(Ложь); + + Если КоличествоПодписейДоУдаления <= 1 Тогда + РеквизитПодписанИзменен = Истина; + + Если ТипЗнч(ОбъектСсылка) = Тип("СправочникСсылка.ВерсииФайлов") Тогда + ФайлСсылка = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ОбъектСсылка, "Владелец"); + ФайлСсылкаПодписан = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ФайлСсылка, "Подписан"); + + Если ФайлСсылкаПодписан = Истина Тогда + ОбъектФайл = ФайлСсылка.ПолучитьОбъект(); + ОбъектФайл.Заблокировать(); + ОбъектФайл.Подписан = Ложь; + ОбъектФайл.Записать(); + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Получает все подписи объекта +// +// Параметры +// ОбъектСсылка - СправочникСсылка - объект, в табличной части которого содержатся подписи +// УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы +// МассивВозврата - Массив - массив структур с возвращаемыми значениями +Процедура ПолучитьВсеПодписи(ОбъектСсылка, УникальныйИдентификатор, МассивВозврата) Экспорт + + ОбъектСсылкаВЗапрос = ОбъектСсылка; + Если ТипЗнч(ОбъектСсылка) = Тип("СправочникСсылка.Файлы") Тогда + ОбъектСсылкаВЗапрос = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ОбъектСсылка, "ТекущаяВерсия"); + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ЭлектронноЦифровыеПодписи.КомуВыданСертификат КАК КомуВыданСертификат, + | ЭлектронноЦифровыеПодписи.Подпись КАК Подпись, + | ЭлектронноЦифровыеПодписи.ИмяФайлаПодписи КАК ИмяФайлаПодписи + |ИЗ + | Справочник.ВерсииФайлов.ЭлектронноЦифровыеПодписи КАК ЭлектронноЦифровыеПодписи + |ГДЕ + | ЭлектронноЦифровыеПодписи.Ссылка = &ОбъектСсылка"; + + Запрос.Параметры.Вставить("ОбъектСсылка", ОбъектСсылкаВЗапрос); + ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); + + Пока ВыборкаЗапроса.Следующий() Цикл + ДвоичныеДанные = ВыборкаЗапроса.Подпись.Получить(); + АдресПодписи = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор); + + СтруктураВозврата = Новый Структура("АдресПодписи, КомуВыданСертификат, ИмяФайлаПодписи", + АдресПодписи, ВыборкаЗапроса.КомуВыданСертификат, ВыборкаЗапроса.ИмяФайлаПодписи); + МассивВозврата.Добавить(СтруктураВозврата); + КонецЦикла; + +КонецПроцедуры + +// добавляет ЭЦП из сообщения почты +// +// Параметры +// ОбъектСсылка - СправочникСсылка - объект, в табличной части которого содержатся подписи +// МассивФайловПодписей - Массив Структур - информация для занесения в табличную часть +// ЭлектронноЦифровыеПодписи +Процедура ДобавитьЭЦПИзСообщения(ОбъектСсылка, МассивФайловПодписей) Экспорт + + ДатаПодписи = ТекущаяДата(); + + МассивДанныхДляЗанесенияВРегистр = Новый Массив; + + Для Каждого ОбъектДляПодписи Из МассивФайловПодписей Цикл + + НоваяПодписьДвоичныеДанные = ОбъектДляПодписи.ДвоичныеДанные; + ИмяФайлаПодписи = ОбъектДляПодписи.Имя; + + ОбъектСсылкаДляПодписи = ОбъектСсылка; + + Отпечаток = ОбъектДляПодписи.Отпечаток; + КомуВыданСертификат = ОбъектДляПодписи.КомуВыданСертификат; + + ДанныеДляЗанесенияВРегистр = Новый Структура("ОбъектСсылка, НоваяПодписьДвоичныеДанные, Отпечаток, ДатаПодписи, Комментарий, ИмяФайлаПодписи, КомуВыданСертификат, ВерсияАлгоритмаГенерацииФайла", + ОбъектСсылкаДляПодписи, + НоваяПодписьДвоичныеДанные, + Отпечаток, + ДатаПодписи, + "", // Комментарий, + ИмяФайлаПодписи, + КомуВыданСертификат, + 0 //ВерсияАлгоритмаГенерацииФайла + ); + + МассивДанныхДляЗанесенияВРегистр.Добавить(ДанныеДляЗанесенияВРегистр); + + КонецЦикла; + + МассивАдресов = Новый Массив; + ЗанестиИнформациюОПодписях(МассивДанныхДляЗанесенияВРегистр, МассивАдресов); + +КонецПроцедуры + +// Возвращает структуру, содержащую различные персональные настройки по работе с ЭЦП +// Возвращаемое значение: +// Структура - структура с настройками +Функция ПолучитьПерсональныеНастройкиРаботыСЭЦПСервер() Экспорт + Настройки = Новый Структура; + + УстановитьПривилегированныйРежим(Истина); + + ПровайдерЭЦП = Константы.ПровайдерЭЦП.Получить(); + Настройки.Вставить("ПровайдерЭЦП", ПровайдерЭЦП); + ТипПровайдераЭЦП = Константы.ТипПровайдераЭЦП.Получить(); + Настройки.Вставить("ТипПровайдераЭЦП", ТипПровайдераЭЦП); + ВыполнятьПроверкуЭЦПНаСервере = Константы.ВыполнятьПроверкуЭЦПНаСервере.Получить(); + Настройки.Вставить("ВыполнятьПроверкуЭЦПНаСервере", ВыполнятьПроверкуЭЦПНаСервере); + + АлгоритмПодписи = Константы.АлгоритмПодписи.Получить(); + Настройки.Вставить("АлгоритмПодписи", АлгоритмПодписи); + АлгоритмХеширования = Константы.АлгоритмХеширования.Получить(); + Настройки.Вставить("АлгоритмХеширования", АлгоритмХеширования); + АлгоритмШифрования = Константы.АлгоритмШифрования.Получить(); + Настройки.Вставить("АлгоритмШифрования", АлгоритмШифрования); + + ПутьМодуляКриптографии = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "ПутьМодуляКриптографии"); + Если ПутьМодуляКриптографии = Неопределено Тогда + ПутьМодуляКриптографии = ""; + КонецЕсли; + Настройки.Вставить("ПутьМодуляКриптографии", ПутьМодуляКриптографии); + + ДействияПриСохраненииСЭЦП = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "ДействияПриСохраненииСЭЦП"); + Если ДействияПриСохраненииСЭЦП = Неопределено Тогда + ДействияПриСохраненииСЭЦП = Перечисления.ДействияПриСохраненииСЭЦП.Спрашивать; + КонецЕсли; + + СтрокаДействияПриСохраненииСЭЦП = ""; + Если ДействияПриСохраненииСЭЦП = Перечисления.ДействияПриСохраненииСЭЦП.Спрашивать Тогда + СтрокаДействияПриСохраненииСЭЦП = "Спрашивать"; + ИначеЕсли ДействияПриСохраненииСЭЦП = Перечисления.ДействияПриСохраненииСЭЦП.СохранятьВсеПодписи Тогда + СтрокаДействияПриСохраненииСЭЦП = "СохранятьВсеПодписи"; + КонецЕсли; + + Настройки.Вставить("ДействияПриСохраненииСЭЦП", СтрокаДействияПриСохраненииСЭЦП); + + Возврат Настройки; +КонецФункции diff --git a/SSL/src/CommonModules/ЭлектронноЦифроваяПодпись/ЭлектронноЦифроваяПодпись.mdo b/SSL/src/CommonModules/ЭлектронноЦифроваяПодпись/ЭлектронноЦифроваяПодпись.mdo new file mode 100644 index 000000000..64de3cc88 --- /dev/null +++ b/SSL/src/CommonModules/ЭлектронноЦифроваяПодпись/ЭлектронноЦифроваяПодпись.mdo @@ -0,0 +1,10 @@ + + + ЭлектронноЦифроваяПодпись + + ru + Электронно цифровая подпись + + true + true + diff --git a/SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиент/Module.bsl b/SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиент/Module.bsl new file mode 100644 index 000000000..b4f6d6744 --- /dev/null +++ b/SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиент/Module.bsl @@ -0,0 +1,474 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОСНОВНЫЕ МЕТОДЫ + +// Формирует подпись объекта +// +// Параметры +// МенеджерКриптографии - МенеджерКриптографии - менеджер криптографии +// ОбъектСсылкаДляПодписи - любая ссылка - ссылка на подписываемый объект +// ДвоичныеДанныеФайла - ДвоичныеДанные - двоичные данные подписи +// СтруктураПараметровПодписи - Структура - информация о подписи - выбранный сертификат, пароль, комментарий +// ВерсияАлгоритмаГенерацииФайла - Число - версия алгоритма генерации файла для подписи +// +// Возвращаемое значение: +// Структура - данные для занесения в табличную часть ЭЦП +Функция СформироватьПодпись(МенеджерКриптографии, ОбъектСсылкаДляПодписи, + ДвоичныеДанныеФайла, СтруктураПараметровПодписи, ВерсияАлгоритмаГенерацииФайла) Экспорт + + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + ПодключитьРасширениеРаботыСКриптографией(); + + МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = СтруктураПараметровПодписи.Пароль; + ДатаПодписи = ТекущаяДата(); + + НоваяПодписьДвоичныеДанные = МенеджерКриптографии.Подписать(ДвоичныеДанныеФайла, СтруктураПараметровПодписи.Сертификат); + + Отпечаток = Base64Строка(СтруктураПараметровПодписи.Сертификат.Отпечаток); + КомуВыданСертификат = ПолучитьПредставлениеПользователя(СтруктураПараметровПодписи.Сертификат.Субъект); + + ДанныеДляЗанесенияВРегистр = Новый Структура("ОбъектСсылка, НоваяПодписьДвоичныеДанные, Отпечаток, ДатаПодписи, Комментарий, ИмяФайлаПодписи, КомуВыданСертификат, ВерсияАлгоритмаГенерацииФайла", + ОбъектСсылкаДляПодписи, + НоваяПодписьДвоичныеДанные, + Отпечаток, + ДатаПодписи, + СтруктураПараметровПодписи.Комментарий, + "", // ИмяФайлаПодписи + КомуВыданСертификат, + ВерсияАлгоритмаГенерацииФайла); + + Возврат ДанныеДляЗанесенияВРегистр; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ МЕТОДЫ + +// По окончании подписания нотифицирует о подписании +// +// Параметры +// ОбъектСсылка - любая ссылка - объект, в табличную часть которого будет занесена информация о ЭЦП +Процедура ИнформироватьОПодписанииОбъекта(ОбъектСсылка) Экспорт + + ОповеститьОбИзменении(ОбъектСсылка); + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Установлена подпись для ""%1""'"), + ОбъектСсылка); + Состояние(ТекстСообщения); + +КонецПроцедуры + +// добавляет ЭЦП из файла +// +// Параметры +// ОбъектСсылка - любая ссылка - объект, в табличную часть которого будет занесена информация о ЭЦП +// МассивФайловПодписей - Массив структур - массив структур (ПутьКФайлу, Комментарий) +// УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы +// ВладелецФайла - любая ссылка - значение реквизита ВладелецФайла у ОбъектСсылка +Процедура ДобавитьЭЦП(ОбъектСсылка, МассивФайловПодписей, УникальныйИдентификатор, ВладелецФайла) Экспорт + + МенеджерКриптографии = ПолучитьМенеджерКриптографии(); + + ДатаПодписи = ТекущаяДата(); + + МассивДанныхДляЗанесенияВРегистр = Новый Массив; + + Для Каждого ОбъектДляПодписи Из МассивФайловПодписей Цикл + + ИмяФайлаСПутем = ОбъектДляПодписи.ПутьКФайлу; + ОбъектСсылкаДляПодписи = ОбъектСсылка; + + НоваяПодписьДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайлаСПутем); + + Сертификат = Неопределено; + Сертификаты = МенеджерКриптографии.ПолучитьСертификатыИзПодписи(НоваяПодписьДвоичныеДанные); + Если Сертификаты.Количество() <> 0 Тогда + Сертификат = Сертификаты[0]; + КонецЕсли; + + Файл = Новый Файл(ИмяФайлаСПутем); + ИмяФайлаПодписи = Файл.Имя; + + Отпечаток = Base64Строка(Сертификат.Отпечаток); + КомуВыданСертификат = ПолучитьПредставлениеПользователя(Сертификат.Субъект); + + ДанныеДляЗанесенияВРегистр = Новый Структура("ОбъектСсылка, НоваяПодписьДвоичныеДанные, Отпечаток, ДатаПодписи, Комментарий, ИмяФайлаПодписи, КомуВыданСертификат, ВерсияАлгоритмаГенерацииФайла", + ОбъектСсылкаДляПодписи, + НоваяПодписьДвоичныеДанные, + Отпечаток, + ДатаПодписи, + ОбъектДляПодписи.Комментарий, + ИмяФайлаПодписи, + КомуВыданСертификат, + 0 //ВерсияАлгоритмаГенерацииФайла + ); + + МассивДанныхДляЗанесенияВРегистр.Добавить(ДанныеДляЗанесенияВРегистр); + + КонецЦикла; + + МассивАдресов = Новый Массив; + ЭлектронноЦифроваяПодпись.ЗанестиИнформациюОПодписях(МассивДанныхДляЗанесенияВРегистр, МассивАдресов); + + ОповеститьОбИзменении(ОбъектСсылка); + Оповестить("ОбъектПодписан", ОбъектСсылка); + Оповестить("ПрисоединенныйФайлПодписан", ВладелецФайла); + + ТекстСообщения = ""; + Если МассивФайловПодписей.Количество() = 1 Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Добавлена подпись из файла для ""%1""'"), + ОбъектСсылка); + Иначе + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Добавлены подписи из файла для ""%1""'"), + ОбъектСсылка); + КонецЕсли; + + Состояние(ТекстСообщения); + +КонецПроцедуры + +// Процедура предназначена для коррекции имени файла - замена некорректных символов на пробел +// +// Параметры +// СтрИмяФайла - Строка - Имя файла +Процедура КорректноеИмяФайла(СтрИмяФайла) + + // Перечень запрещенных символов взят отсюда: http://support.microsoft.com/kb/100108/ru. + // При этом были объединены запрещенные символы для файловых систем FAT и NTFS. + СтрИсключения = """ / \ [ ] : ; | = , ? * < >"; + СтрИсключения = СтрЗаменить(СтрИсключения, " ", ""); + + Для Сч=1 по СтрДлина(СтрИсключения) Цикл + Символ = Сред(СтрИсключения, Сч, 1); + Если Найти(СтрИмяФайла, Символ) <> 0 Тогда + СтрИмяФайла = СтрЗаменить(СтрИмяФайла, Символ, " "); + КонецЕсли; + КонецЦикла; + + СтрИмяФайла = СокрЛП(СтрИмяФайла); + +КонецПроцедуры // КорректноеИмяФайла() + +// "Сохранить как" вместе с подписями - все или выбранные +// +// Параметры +// ОбъектСсылка - СправочникСсылка - объект, в табличной части которого содержатся подписи +// ПолноеИмяФайла - Строка - полное имя с путем, под которым сохранен файл +// УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы +// МассивВозврата - Массив - массив структур подписей. Если Неопределено - сохраняем все подписи +Процедура СохранитьПодписи(ОбъектСсылка, ПолноеИмяФайла, УникальныйИдентификатор, МассивВозврата = Неопределено) Экспорт + + Если МассивВозврата = Неопределено Тогда + МассивВозврата = Новый Массив; + ЭлектронноЦифроваяПодпись.ПолучитьВсеПодписи(ОбъектСсылка, УникальныйИдентификатор, МассивВозврата); + КонецЕсли; + + ОсновнойФайл = Новый Файл(ПолноеИмяФайла); + Путь = ОсновнойФайл.Путь; + + МассивИмен = Новый Массив; + МассивИмен.Добавить(ОсновнойФайл.Имя); + + Для Каждого СтруктураПодписи Из МассивВозврата Цикл + ИмяФайлаПодписи = СтруктураПодписи.ИмяФайлаПодписи; + Если ПустаяСтрока(ИмяФайлаПодписи) Тогда + ИмяФайлаПодписи = Строка(ОбъектСсылка) + "-" + Строка(СтруктураПодписи.КомуВыданСертификат) + ".p7s"; + КонецЕсли; + КорректноеИмяФайла(ИмяФайлаПодписи); + + ПолныйПутьПодписи = Путь; + ФайловыеФункцииКлиентСервер.ДобавитьСлешЕслиНужно(ПолныйПутьПодписи); + ПолныйПутьПодписи = ПолныйПутьПодписи + ИмяФайлаПодписи; + + ФайлПоИмени = Новый Файл(ПолныйПутьПодписи); + ФайлСуществует = ФайлПоИмени.Существует(); + + Счетчик = 0; + ИмяФайлаПодписиБезПостфикса = ФайлПоИмени.ИмяБезРасширения; + Пока ФайлСуществует Цикл + Счетчик = Счетчик + 1; + ИмяФайлаПодписи = ИмяФайлаПодписиБезПостфикса + " (" + Строка(Счетчик) + ")" + ".p7s"; + КорректноеИмяФайла(ИмяФайлаПодписи); + + ПолныйПутьПодписи = Путь; + ФайловыеФункцииКлиентСервер.ДобавитьСлешЕслиНужно(ПолныйПутьПодписи); + ПолныйПутьПодписи = ПолныйПутьПодписи + ИмяФайлаПодписи; + + ФайлДляПроверки = Новый Файл(ПолныйПутьПодписи); + ФайлСуществует = ФайлДляПроверки.Существует(); + КонецЦикла; + + Файл = Новый Файл(ПолныйПутьПодписи); + МассивИмен.Добавить(Файл.Имя); + ПередаваемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(ПолныйПутьПодписи, СтруктураПодписи.АдресПодписи); + ПередаваемыеФайлы.Добавить(Описание); + + ПутьКФайлу = Файл.Путь; + Если Прав(ПутьКФайлу,1) <> "\" Тогда + ПутьКФайлу = ПутьКФайлу + "\"; + КонецЕсли; + + // Сохраним Файл из БД на диск + ПолучитьФайлы(ПередаваемыеФайлы,, ПутьКФайлу, Ложь); + + УдалитьИзВременногоХранилища(СтруктураПодписи.АдресПодписи); + КонецЦикла; + + Если МассивВозврата.Количество() <> 0 Тогда + Текст = НСтр("ru = 'Каталог:'") + Символы.ПС; + Текст = Текст + Путь; + Текст = Текст + Символы.ПС + Символы.ПС; + Текст = Текст + НСтр("ru = 'Файлы:'") + Символы.ПС; + + Для Каждого ИмяФайла Из МассивИмен Цикл + Текст = Текст + ИмяФайла + Символы.ПС; + КонецЦикла; + + ПараметрыФормы = Новый Структура("Текст", Текст); + ОткрытьФорму("Справочник.Файлы.Форма.ФормаОтчетаОСохранении", ПараметрыФормы); + + КонецЕсли; + +КонецПроцедуры + +// Получает назначение сертификата ЭЦП +// +// Параметры +// ФиксированныйМассивСвойств - ФиксированныйМассив - массив расширенных свойств сертификата (EKU) +Функция ПолучитьНазначение(ФиксированныйМассивСвойств) + + Назначение = ""; + + Для Индекс = 0 По ФиксированныйМассивСвойств.Количество() - 1 Цикл + Назначение = Назначение + ФиксированныйМассивСвойств.Получить(Индекс); + Назначение = Назначение + Символы.ПС; + КонецЦикла; + + Возврат Назначение; + +КонецФункции + +// Получает представление поля КомуВыдан или КемВыдан сертификата ЭЦП +// +// Параметры +// СтруктураПользователя - Структура - структура поля КомуВыдан или КемВыдан сертификата +// Возвращаемое значение - таблица значений - колонки "Свойство" и "Значение" +// +// Возвращаемое значение: +// Строка - представление +Функция ПолучитьПредставлениеПользователя(СтруктураПользователя) Экспорт + + Представление = ""; + CN = ""; + Если СтруктураПользователя.Свойство("CN", CN) Тогда + Представление = Представление + CN; + КонецЕсли; + O = ""; + Если СтруктураПользователя.Свойство("O", O) Тогда + Представление = Представление + ", " + O; + КонецЕсли; + OU = ""; + Если СтруктураПользователя.Свойство("OU", OU) Тогда + Представление = Представление + ", " + OU; + КонецЕсли; + + Возврат Представление; + +КонецФункции + +// Заполняет структуру полями сертификата +// +// Параметры +// Сертификат - СертификатКриптографии - сертификат криптографии +// +// Возвращаемое значение: +// Структура - структура с полями сертификата +Функция ЗаполнитьСтруктуруСертификата(Сертификат) Экспорт + + КомуВыдан = ПолучитьПредставлениеПользователя(Сертификат.Субъект); + КемВыдан = ПолучитьПредставлениеПользователя(Сертификат.Издатель); + ДействителенДо = Сертификат.ДатаОкончания; + + EKU = Неопределено; + Если Сертификат.РасширенныеСвойства.Свойство("EKU", EKU) Тогда + Назначение = ПолучитьНазначение(EKU); + КонецЕсли; + + Отпечаток = Base64Строка(Сертификат.Отпечаток); + + СтруктураВозврата = Новый Структура("КомуВыдан, КемВыдан, ДействителенДо, Назначение, Отпечаток", + КомуВыдан, КемВыдан, ДействителенДо, Назначение, Отпечаток); + + Возврат СтруктураВозврата; +КонецФункции + +// Находит сертификат по строке отпечатка +// +// Параметры +// Отпечаток - Строка - base64 кодированный отпечаток сертификата +// ТолькоВЛичномХранилище - Булево - вести поиск только в личном хранилище +// +// Возвращаемое значение: +// СертификатКриптографии - сертификат криптографии +Функция ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище = Ложь) Экспорт + + ДвоичныеДанныеОтпечатка = Base64Значение(Отпечаток); + + МенеджерКриптографии = ПолучитьМенеджерКриптографии(); + + ХранилищеСертификатов = Неопределено; + Если ТолькоВЛичномХранилище Тогда + ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты); + Иначе + ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(); + КонецЕсли; + Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(ДвоичныеДанныеОтпечатка); + + Возврат Сертификат; + +КонецФункции + +// Заполняет структуру полями сертификата +// +// Параметры +// Отпечаток - Строка - base64 кодированный отпечаток сертификата +// +// Возвращаемое значение: +// Структура - структура с полями сертификата +Функция ЗаполнитьСтруктуруСертификатаПоОтпечатку(Отпечаток) Экспорт + + ДвоичныеДанныеОтпечатка = Base64Значение(Отпечаток); + + МенеджерКриптографии = ПолучитьМенеджерКриптографии(); + + ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(); + Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(ДвоичныеДанныеОтпечатка); + + Если Сертификат = Неопределено Тогда + Отказ = Истина; + Предупреждение(НСтр("ru = 'Сертификат не найден'")); + Возврат Неопределено; + КонецЕсли; + + Возврат ЗаполнитьСтруктуруСертификата(Сертификат); + +КонецФункции + +// Получает массив структур сертификатов +// +// Параметры +// ДляШифрования - Булево - если Истина, то берутся также и сертификаты получателей +// +// Возвращаемое значение: +// Массив - массив структур с полями сертификата +Функция ПолучитьМассивСтруктурСертификатов(ДляШифрования) Экспорт + + МассивСтруктурСертификатов = Новый Массив; + + МенеджерКриптографии = ПолучитьМенеджерКриптографии(); + + ТекущаяДата = ТекущаяДата(); + + // для подписи + Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты); + СертификатыХранилища = Хранилище.ПолучитьВсе(); + + МассивСтрокОтпечатков = Новый Массив; + + Для Каждого Сертификат Из СертификатыХранилища Цикл + Если Сертификат.ДатаОкончания < ТекущаяДата Тогда + Продолжить; // отфильтровываем истекшие сертификаты + КонецЕсли; + + СтруктураСертификата = ЗаполнитьСтруктуруСертификата(Сертификат); + Если СтруктураСертификата <> Неопределено Тогда + СтрокаОтпечатка = Base64Строка(Сертификат.Отпечаток); + + Если МассивСтрокОтпечатков.Найти(СтрокаОтпечатка) = Неопределено Тогда + МассивСтрокОтпечатков.Добавить(СтрокаОтпечатка); + МассивСтруктурСертификатов.Добавить(СтруктураСертификата); + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + Если ДляШифрования Тогда + Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.СертификатыПолучателей); + СертификатыХранилища = Хранилище.ПолучитьВсе(); + + Для Каждого Сертификат Из СертификатыХранилища Цикл + Если Сертификат.ДатаОкончания < ТекущаяДата Тогда + Продолжить; // отфильтровываем истекшие сертификаты + КонецЕсли; + + СтруктураСертификата = ЗаполнитьСтруктуруСертификата(Сертификат); + Если СтруктураСертификата <> Неопределено Тогда + СтрокаОтпечатка = Base64Строка(Сертификат.Отпечаток); + + Если МассивСтрокОтпечатков.Найти(СтрокаОтпечатка) = Неопределено Тогда + МассивСтрокОтпечатков.Добавить(СтрокаОтпечатка); + МассивСтруктурСертификатов.Добавить(СтруктураСертификата); + КонецЕсли; + КонецЕсли; + + КонецЦикла; + КонецЕсли; + + + Возврат МассивСтруктурСертификатов; + +КонецФункции + +// Создает на клиенте менеджер криптографии. Пароль не устанавливается +// +// Возвращаемое значение: +// МенеджерКриптографии - менеджер криптографии +Функция ПолучитьМенеджерКриптографии() Экспорт + + ПодключитьРасширениеРаботыСКриптографией(); + + ПровайдерЭЦП = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ПровайдерЭЦП; + ПутьМодуляКриптографии = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ПутьМодуляКриптографии; + ТипПровайдераЭЦП = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ТипПровайдераЭЦП; + + МенеджерКриптографии = Новый МенеджерКриптографии(ПровайдерЭЦП, ПутьМодуляКриптографии, ТипПровайдераЭЦП); + + МенеджерКриптографии.АлгоритмПодписи = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().АлгоритмПодписи; + МенеджерКриптографии.АлгоритмХеширования = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().АлгоритмХеширования; + МенеджерКриптографии.АлгоритмШифрования = ЭлектронноЦифроваяПодписьКлиентПовтИсп.ПолучитьПерсональныеНастройкиРаботыСЭЦП().АлгоритмШифрования; + + Возврат МенеджерКриптографии; +КонецФункции + +// Открывает форму просмотра сертификата ЭЦП +// +// Параметры +// ТекущиеДанные - Структура - структура с данными файла +// +Процедура ОткрытьСертификат(ТекущиеДанные) Экспорт + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентПодMacOS() Тогда + Возврат; + КонецЕсли; + + ПодключитьРасширениеРаботыСФайлами(); + ПодключитьРасширениеРаботыСКриптографией(); + + Если ТекущиеДанные.Объект <> Неопределено И (НЕ ТекущиеДанные.Объект.Пустая()) Тогда + Отпечаток = ТекущиеДанные.Отпечаток; + + СтруктураСертификата = ЭлектронноЦифроваяПодписьКлиент.ЗаполнитьСтруктуруСертификатаПоОтпечатку(Отпечаток); + Если СтруктураСертификата <> Неопределено Тогда + ПараметрыФормы = Новый Структура("СтруктураСертификата, Отпечаток", СтруктураСертификата, Отпечаток); + СтруктураВозврата = ОткрытьФормуМодально("ОбщаяФорма.ФормаСертификатаЭЦП", ПараметрыФормы); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиент/ЭлектронноЦифроваяПодписьКлиент.mdo b/SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиент/ЭлектронноЦифроваяПодписьКлиент.mdo new file mode 100644 index 000000000..4582bd869 --- /dev/null +++ b/SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиент/ЭлектронноЦифроваяПодписьКлиент.mdo @@ -0,0 +1,10 @@ + + + ЭлектронноЦифроваяПодписьКлиент + + ru + Электронно цифровая подпись клиент + + true + true + diff --git a/SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиентПовтИсп/Module.bsl new file mode 100644 index 000000000..cd007efa3 --- /dev/null +++ b/SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиентПовтИсп/Module.bsl @@ -0,0 +1,5 @@ + +// Возвращает структуру, содержащую различные персональные настройки +Функция ПолучитьПерсональныеНастройкиРаботыСЭЦП() Экспорт + Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ПерсональныеНастройкиРаботыСЭЦП; +КонецФункции diff --git a/SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиентПовтИсп/ЭлектронноЦифроваяПодписьКлиентПовтИсп.mdo b/SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиентПовтИсп/ЭлектронноЦифроваяПодписьКлиентПовтИсп.mdo new file mode 100644 index 000000000..3258765ec --- /dev/null +++ b/SSL/src/CommonModules/ЭлектронноЦифроваяПодписьКлиентПовтИсп/ЭлектронноЦифроваяПодписьКлиентПовтИсп.mdo @@ -0,0 +1,11 @@ + + + ЭлектронноЦифроваяПодписьКлиентПовтИсп + + ru + Электронно цифровая подпись клиент повт исп + + true + true + DuringSession + diff --git a/SSL/src/CommonPictures/АрхивАнкета/Picture.png b/SSL/src/CommonPictures/АрхивАнкета/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..5449f887b2d2d6542571fffc49c1f80714d26d7c GIT binary patch literal 794 zcmV+#1LgdQP)^Op&=PTsbsavk3ngW6cHAfk^d5k5!Dar5y}RA_PHT!DIGlSv?m6c<_gn=b1WVN4dcZtAGEs^MO5B-j$tkxQum&lv zmSp5nS>Rd_^NJ6u^rc1bff{;lTZXKW38Li7hp)FJ8Jnzn zpQNU0H|5WZ+y~iad}7rfGBzhsL($3(l$3J|_hcCyj&W$S&*ABVDLBW>%$c+;3tOp8 zhMB)xSKS4CS}j2sYhnV{=bb^SATWLQ{yoGSE<>$WL!;3^rQ}wf0ZTCR#*9ZZYPdY} z7`gvu=Nf?;d7(B>^Li?$tXLnXa{}o*Rm@~4L`c<*dh&MCN7@G_SoPswbBtwb{y5Bhr)%&0W*y9Sy~6W9>)9?LHItGgiE@HYTU~|T287q| zL?((VYj=bsDZ}IOFw>>NbnraS&VIiiChOP#$>`@;TKr{H|Nf?FVRrhWd>$MOqM`X2 zPL>>_&_Zxed6BG*2Q3m%uJui)oDP$U=Vj;>_6?bKX=94cF;DCi9GpMLbd=?oroRFV Y0L!3Vg#HtZxBvhE07*qoM6N<$f{|Ktg8%>k literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/АрхивАнкета/АрхивАнкета.mdo b/SSL/src/CommonPictures/АрхивАнкета/АрхивАнкета.mdo new file mode 100644 index 000000000..384cd42b6 --- /dev/null +++ b/SSL/src/CommonPictures/АрхивАнкета/АрхивАнкета.mdo @@ -0,0 +1,8 @@ + + + АрхивАнкета + + ru + Архив анкета + + diff --git a/SSL/src/CommonPictures/ВидыОпераций/Picture.png b/SSL/src/CommonPictures/ВидыОпераций/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..1fc4d489556facf778e946f676196272e94f4e5a GIT binary patch literal 469 zcmV;`0V@89P)VUeFo=dk%F;;M7-%%b zVDqC@dhb2=)j+C}=Y`huBl=nHNzVP;ALpK2;Gbjp=>zEDa88_;R+QBNz}9Z?_%0G? z`i$S~#A;2wO$C6>VB`=RXf@-UrZF%+nbC_sihahGbvit?hQ9T)i+=|e{*b-6Wa6Tb zwRXm?er1;%lFzH>lG_2fu^xY~Iv=4E2lh5w3-Cw(fbZnXJHYAnPFJJGrI(W$L6aE- z!q@K5+~|}UzSWNP{=P8!+J$tYlTLAxAp^fTRW~B}ht; z)Lur3_~nW#1n6F%P+#qAP= + + ВидыОпераций + + ru + Виды операций + + diff --git a/SSL/src/CommonPictures/Внимание/Picture.png b/SSL/src/CommonPictures/Внимание/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..20650a72ee48f3433487c0b9adce63532c7aad44 GIT binary patch literal 3580 zcmVKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0009gNklvanS1Bn?>jE0h3X3j z&f?)YhXY6PzZ8qbqnS+RgYM4uDdRVyC`5;&jh)iowT+F9bGcmZ_eXj4u*v0e@oYBx z*$WwOwj~jzqi>9Gyd6aF-7=*+D>yZu#oO^uR#sNd6pKX{AOtWsHy3|$WMuiok?_nD zqsM9O8AV4DsBjDrLeV5`JsDct+A;fgpK^8k>9Mh~kCv8}0u3-UH1y%rV2~Xi9S3U= zZx^M*TsZe87vDaM3WX52L?ohlc5;Fvsmk=gz`z9nT__Ze9*kFC86NCFygdkNh;b3? z%I)wUUUtQSNO<6`|P;_YL72gFh{aXP!> zhr-sHAM2hyWh8~!Xk*Z-XGCe@@gUxyYl%LpZ@YF|L*|%-liEb%*8hV0000 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/Внимание/Внимание.mdo b/SSL/src/CommonPictures/Внимание/Внимание.mdo new file mode 100644 index 000000000..8f51f0b28 --- /dev/null +++ b/SSL/src/CommonPictures/Внимание/Внимание.mdo @@ -0,0 +1,8 @@ + + + Внимание + + ru + Внимание + + diff --git a/SSL/src/CommonPictures/ВыполнитьЗапускОбменаДанными/Picture.png b/SSL/src/CommonPictures/ВыполнитьЗапускОбменаДанными/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb3e41913baa3199bb399e9324f0f86caeef22a GIT binary patch literal 754 zcmVsaD8?!-AkAp5X0N6pqbJVD$iQ&@@kNDAr&hGeiYP7&u!!F1XBK%zkXPgviVG%f zY7{zs=SZZOfYdBgRolPew#oO@WpuBA%*D;Ydvp1r*=yGwU-ZRP#r7`HfR``> zn841zf6C|W*BAXjW|A1cBm+?MH<$tt+s8EgoS#`l)$@0c6YjsdC5h|>CXaeO+2;dQNqBaMD#x+1LJQ7Mg~?6PWEr# zzy9Dj-SdhWS&?ax#5ZPUCg$INezO3%%6SGW=)w^ynOro`-iXZ#9w}VCMYf>VFL z_<#vXck}5LU5vcHEtpvunbIAq7`kV*GB9%j#43~dRZ)7j0`N?K+FZf8YY5sC!1VKK}pKk04OE03m`PJ^D%wbvkuW6|q1-mrvn#Qx!50RVH;vht kSQt55mCt;{r3N6t00PMcY$b213;+NC07*qoM6N<$f-HP)xc~qF literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ВыполнитьЗапускОбменаДанными/ВыполнитьЗапускОбменаДанными.mdo b/SSL/src/CommonPictures/ВыполнитьЗапускОбменаДанными/ВыполнитьЗапускОбменаДанными.mdo new file mode 100644 index 000000000..1ad19cfd1 --- /dev/null +++ b/SSL/src/CommonPictures/ВыполнитьЗапускОбменаДанными/ВыполнитьЗапускОбменаДанными.mdo @@ -0,0 +1,12 @@ + + + ВыполнитьЗапускОбменаДанными + + ru + Выполнить запуск обмена данными + + + 7 + 5 + + diff --git a/SSL/src/CommonPictures/ДлительнаяОперация48/Picture.gif b/SSL/src/CommonPictures/ДлительнаяОперация48/Picture.gif new file mode 100644 index 0000000000000000000000000000000000000000..1fd0d58fe9dca449f3f7c0afbaa9dd278140e33c GIT binary patch literal 4988 zcmY+HX;c%39>p_B$TA6#u!SXIUzK231OfySAOc~TpdeIGpddSlKoMI=U=orL5JVsX zRR|&i0?J~odqGf9tHtG6Y^}wmiWVPk^|`^kSo@B?GhgQ8+;e~TfA55Zt@384uuv@2 z12GDD|7LO67x{J9(r++wRf60bUA(s)Ir9ZF5rbUVusGdHW1`bOyO|0D1Qp@?hKB?*z#2z3=;+ktdgt%U>hUZy_^Z zAuqd;8x6?6uOh#xkw1J#>K;{khuor!Aayo?$X)pcPC?!ODV{o z%}XZ)$nhZLVgd5>#^RB%#Y5c1yW8H4uYZ3u5*d$MJm|gnuM*^JD)M6?a$kwu7B7vj zM_%4t`l)j9rU-dEgiL23=hiJ=D@2~QBl8!QPDL+`ryvi0Kwiu)9T&bG4MuK#y>v3} z-7t6QLdnt?g#4JlG?Di1MD*flz`L<^$S>-}-{p(5O60~)&b^N%@+0Af;NSh1$S)Uzoau?G#imZdY zO{OL0_@NPpee{@HqV*wg_OHYGRLi*{{Ogh4CSeITP{IjT%s;ZW!pZ_H4;$nZ%$|19 z53)7>W;|6-O2FneIi^U)h-(kn=SFZJHu-Ej``nmn6H2o(99;5#HvZ%cAZn)X>P>gX zYSTPdY;D068DUHxI<6ldy^1@=qfuCBQQM)`7p=*(j8u0?{v7{k5)kE9khb z)o#IOEy;O>_bGc&wT3_SOwNv7+cE|6Vx_%ncL!HG%`^!tlOLYLO9M=r=GQVOBUaB! z{Ck`1c=9R|pn6D{Mf=!MCeyPvU)d*rg<_witq$@qQc|E9XBv7Hr#o)c!%sMyzO_;7 zl?e=hqaH&YC4zZMvXyxZtA?=BQN7-*$T^fi5c(P4DP%c5l~hS8xRo-7Beg;=>{iOT zO_n}m6BvVtv5Lw608yM_WPf&HzDk^~7k*$H5Moa25&U(9&(8V?ngh`<0h0(Y6(Hn35Taiho%xv6Fn>+VRCXwi zNgjGg(|He!0e-nMCcf;cK=IK2!sHf|fuf)y zSv4S>bjK?6YjDKglnF2y{IU{{o*g<VOzP{pv6y5}7l6mYbvc;I&tU|d5Sw7Z=J*tfzgkQD)iDoG4!Kp0ru0GcuK zTqN!dU0z=0jPz-7dimqW8NakbFCLe-G^BuU$_%7O<(oEeGZ|C&|Gek22JipoGQEhf zxgGW*EZ@HdRlCQ>fBpft|3&b4qk9;9;+^~EZZ-FFDcUG9ims7ztU@gI6d1#D1s_9* z+Ms~7s5o3av&3D&i*Iby6&T5rb~VQHDCavRQ1QGtwcOV;rT+Hs^;&3(AD*jlWm@@b>xqa8BOlSrmm4SH z)#SfK)>K76_R|+@x=?#CD_)=UR)?4=EA{;?mD{&lR3*U?nI^qfKU>k)Jbu!7hZ$%d zK>DH5dwL`3NI)G$3;jtBR&z1wC>@QQ{=c1(x(FapSpx``S8bO@0-W4@c1r{+my-t= zHNX}SoEh2D+t&hg7J?81HV60b7hoI07-e2&95{^iUGG4Z3z*?`!3)$87jh=pfm^mS z%r0Jlj)=jw+}Yf~h`dcw`th3=%<|xzykrX!)*?r62BtlFeDbT#hPCa<_j)W*GI7Hz z=DlloFsFqU+n+t|PQDx@-EtsL$h~_vNMGQS_|({m^6C3gsQ;05`XgC3d<|K2rV~L+ zSrtntz{Te@z{UJTTstnyxj~EH+<|lQR2DJAd)f=4s?GTa4&pGtmr|XqeFupw`zlJ- z;f?|(slk)4+kxS`w8CzDOhK5d(oP|v#R|+D@LLU|@4-3^_68ymnP~B6t2cRJVa@FZ zht~^aZ@0mMhX--HBdqLSU(~B?Q*oA#an-8Xsvn%}9MhlC(5v@h_1;IfsEE4$MD4=^ zYMGi`h4#uhV_uEv%T4P_Z1LndcHG`MzK9j7|YtgNZbEDZvo zx?ONdhF9mFuCiJS?Cx4d*MJuk2SWk@y)Vyfa1XRrTqt1YgR#3w&{41QFgP`zeK|}J zx{IMoyOCC21{R84!OOEOD4;GKN-v3vE4d58nPIcD5s*t?ACUX}1?2jlT`q0dT0o>a58^-W?+cTAd3#iZQ!2C<)He4xwhZ@LbB zq^mfQNMP3RnFI&(svQy!f{zdr-WHA#`rxA)Vb4x6DG}GVzdxMX__2a*nf*s_PK7)E zsoq%3(Y|oJyVM+SDw-BKz;;gOaPiU7BE0pL=@>hhzboER7#|<*;485Y())dSg&!P} zw3_7UN%D^3OLZn2A3D@iqZ^}8HpZ}wB&|9yYxUZ?Qd_ZS7e8m{5A-Ujx1L97<*dzF zLrq1poIc0QLW3DqBjsc2Gvi>HTp?zFkZ*N8J}mt=Hy znt=h;P+H%9FjNu1VU!Jfl|%J5jMiZ&U3IW8gJIJFl^%Nc)xytxzk>pu)y=UGI0`=;%XtGY+kJurb19sLxH~I6_f5Pj-5z{Orne4+tg16Px zf80l^fA&#*$A@XOw|n0g+iYyqa42!#kY*CW%!DMZ0YB^EZYS8+0auX4Q`2Kke%L=b z7~B=zB-akSp7uAv!QZUcvoaQ2@~`}%$x=OqiuJU!^Tawt!C2it{wQG51_t=T*Ut@s zD+||@%kV0!N5voEJmIDtT+-{YnTe3lb?UMIsI>-bI!-00%$(K-(b;=(yDNRQnM*0D>85W}|Y;O%|z8PVIFGDF;ipy`C2snFnyT zxJ$Gk_S{^aG&S%MJCY}%JzM~3egA&Mij-su77DR5R&$Xj%Q?8ONWHV?EOnuly?>@W zoYv8ro3TwhWLfboYVH2Y=%K-1EDCEskNii(J`~G@Mg$tJlF7xIUR8`I#9oC%nDOCR-755|MBIWfq@zT4VIe%$NM*@Q27y$eqYsQ*>p`i>kx`zM00aapbGFDbo1D0oiU|wylF~h6Hs|;$Aamri0GLm;o zU3PXdx}_QFRx?gNTmp8MftyAOdkaUbk!NkK#?eX~1sR94Hqc z!EvA&SW6?NLt*SW$QX`gn74BP4r}hO2xy@x@2~fN<=?4I#Lk_Aru2QA5*@8tFsmwT z?R}2UWE`x9ZI75iGd}s?*^%KLv)av0`@K? zi-ML*?Fgo#Hh+rLLcgs|&qqP*Y+L6d&0f*tXeG62?KIVu8awuAAC{OK_E@h}2**xK z4bCY1bPe>$$LqxQp57kVD>GuW1=`;A3Nv0ef#AT^k=PS(^WmGLq&e~P^NE>~<)q(%lptl}C~EF%q!t1jWN)sbLo zT!1PrQWK*AhQbC=kFfJO0Awr<{T_tO2FA)j@$#=m&#}X7#P(p>*z|yzSSJT$O{qDB zKY~}L%Nab_SODZt{VEQ){JYuyB4r_`YxHr-?ePqT;Fd~UbYsTaecz=K7US)%X!UG_ z;Tpu?QkFiKXUqeASi4fkSARAnKf!e5ADHa0b^)?l8I`=oz{w|MTW!EPQJYB5K_%mo zzZIEcJEX-LSPHBa z)b@=>hh+#;nBWPc4Xp9oiap)GFJFRtGh`aUv!G&Za!mop0IvDo>5I}8D|7F#F~x-SmP zC}(VGabX-2^B}L+84OOQeG7^4lz3wJPBpAUH`h)qy>}iRlJ1k6tXMd&2=OIHC1yrn zN0(>3CXiS5a}CR(%Z{Zj%v<9DpNsiKRIf&iI4P=FBc_^*RpundGkNC9W(v{Y0Ii5~ zz;z@tqe(7GbF_DYzG$FSVn^s0!4>!rm_=ess_x1d?SXMUym$jNI)(GuBz9RjK0R(N zc3#cIobT|l6VnW?Op{AVuvQYj;QX(@{XVO0=tryG6qO|mAMx>>pVl)ibz{Zo8LSc* zVja}EcV0R0G1`uY<|>B1RPV8H(y@GMO@LMyJYV*C98iB3$cNjj`9BfcfM{4ulfytD zz^PV>jq}*-Krnf&GB&WeISh1`3)-6l)8#avn+>?g^Ed;563XokOjd&V-I1i@0|MXi z?!2Ni%`7lL$q)d7uvFe2c_C@4;n!QrO%_`K21jZ86_{aG=EZ1${`7hV6)IEHo;@>z zl*ZswuQG!ZH@^ccxLQghM^@=Q@-p7C+paMc4=8dS@=vwV#Sh8;Zoo^&k*9lSanf5p zFL~#g5qtmd|KxvAeW($5ONm7O4^*MXHX%{`oH}`^AVD*`aLk=@0&eeK2YM&Wi|@u^ zlKRB<34=Ji@i4z&aI?A(P5e$*)`?;sAEc7{w7Ld$dBZ&2Zbz2Mun7}$AW27z!uy%; zbmhkr?u)smWTLli-EzJrCL2X>Oo`c^%XiY3-8Y*H!8U^lBG&U{sX8b?zr@43!r`Zh uvKZk?H(r-aAvX!yJnK3smsaX~$O-|TT;=BP7+PyLrKL12UD6z2-~R&Y&ZBPt literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ДлительнаяОперация48/ДлительнаяОперация48.mdo b/SSL/src/CommonPictures/ДлительнаяОперация48/ДлительнаяОперация48.mdo new file mode 100644 index 000000000..29d5e90ec --- /dev/null +++ b/SSL/src/CommonPictures/ДлительнаяОперация48/ДлительнаяОперация48.mdo @@ -0,0 +1,8 @@ + + + ДлительнаяОперация48 + + ru + Длительная операция + + diff --git a/SSL/src/CommonPictures/ДобавитьДопСвойствоВНабор/Picture.png b/SSL/src/CommonPictures/ДобавитьДопСвойствоВНабор/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..7785a1c1c9030cbc69c0f865ebd78bc59dad0fe4 GIT binary patch literal 540 zcmV+%0^|LOP)8lJ6FP>uf{p&Zw&tE?ne*OBz@b%NDjsx@BD=`e%cj;EqvR!9-i{b+qF24E2 z@ScH_L6jY+==)cOe}DfneE9a0;mW-y45zoQW;njImk}ilc3!w$v~J(I-qOS%hQrT+ zHvRd}z{17AaPHAphL0aVGJJafmf_u-cMM4mYCr?9gu&v?hkIKyf*B6K_`$%)#K^$N z_#cRYwlgsSX%L?oOn?8+f;|vpeQk@YW~^nfk>q6f{}19VknjHg`v=5-z+M1(my_`i z_GolBQ0-%7`p?ikcWrNWv_Heu_rDoF|7Bp%5NBuj&%?v;Ta1I@*H=!4L$_YwP6tkU zYJGeh%nXwjt?NyS3SxNumx?J!dSZZnX + + ДобавитьДопСвойствоВНабор + + ru + Добавить доп свойство в набор + + diff --git a/SSL/src/CommonPictures/ДобавитьПростойВопрос/Picture.png b/SSL/src/CommonPictures/ДобавитьПростойВопрос/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..d2949b0aeded9786a03bfa4ec7dc3fdb48b8b265 GIT binary patch literal 486 zcmV@P)lOeT!kC1_Vk2 zR|z`n)>6-sQ%+ZSaXc&3nC z$P)~m3A)uY06aHH7GIAc9OY`!qJ0hD)^CBWL7<*lPS3dn% z^A!Ku+VB*Mh&&maDiD cSN{ip0iLqjX5xnPu>b%707*qoM6N<$g5y-!GXMYp literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ДобавитьПростойВопрос/ДобавитьПростойВопрос.mdo b/SSL/src/CommonPictures/ДобавитьПростойВопрос/ДобавитьПростойВопрос.mdo new file mode 100644 index 000000000..7d76ec963 --- /dev/null +++ b/SSL/src/CommonPictures/ДобавитьПростойВопрос/ДобавитьПростойВопрос.mdo @@ -0,0 +1,8 @@ + + + ДобавитьПростойВопрос + + ru + Добавить простой вопрос + + diff --git a/SSL/src/CommonPictures/ДобавитьРазделАнкеты/Picture.png b/SSL/src/CommonPictures/ДобавитьРазделАнкеты/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..bf43eb7415dd84baa9b699174ad9b74ba6b208ad GIT binary patch literal 628 zcmV-)0*n2LP)syK~-i9^P{f{O=F|10AISg#WzZvx}38 z)?{aji(6`5wf>XR|G4t0vOZ}QAJfVj(aIXpGCHJZ2Afsi{n`hAn>7Knom+P*}~x@hUrFmMup zj$Q58-+LGx8KY7dl-D&;QP-5>&JY;W!Jyv+Fbo5sJt$k_L==W67ojqe&936-!&lr` zKxpAx;tSiWFXRYw-7?)*MCSVAlm#XLa9kIWMlehR+p-V`UleL-YXCf}1dHPinfV?7 zrruig-<)AS>ilNGXBylH?8LM}3M(X&LU_U9Y;@e9ot}s69?CS3S~w}i>b3%1+?1<-<&UnN8dq8? z{fDp}H}ddm<7aavV6s!<&0qFPCt9!-&>UKptz)T?#j!l!#@C@$_w9#?*AJA O0000~ literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ДобавитьРазделАнкеты/ДобавитьРазделАнкеты.mdo b/SSL/src/CommonPictures/ДобавитьРазделАнкеты/ДобавитьРазделАнкеты.mdo new file mode 100644 index 000000000..15ba951e9 --- /dev/null +++ b/SSL/src/CommonPictures/ДобавитьРазделАнкеты/ДобавитьРазделАнкеты.mdo @@ -0,0 +1,8 @@ + + + ДобавитьРазделАнкеты + + ru + Добавить раздел анкеты + + diff --git a/SSL/src/CommonPictures/ДобавитьТабличныйВопрос/Picture.png b/SSL/src/CommonPictures/ДобавитьТабличныйВопрос/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ce88532944deac818bbc7506ce635a246b80be GIT binary patch literal 621 zcmV-z0+RiSP)gh3X-6Updw-zbW`*}5rGg< zNr_l_VM%3_DTJF9togAy3+A@>WAFR!Jzc!I4OB8*p8xqh59dH$^o%-1&!|(d zfhfsOOiiGtOaLA{|0skh5T?K|4XUW#;nD&x?_Ohk@F4(BS1Z20ezrPlIez{IMd`SS zv}hnL8YDtG$vK_aq{{r548YQ_AAEcNieCQ!z5W4K{zQ3k`)Y0mLkH(=(}9qvt*PeF z<0iDE$&)hyQnHG>sg7`93g5Zw)Vn+Yv~+k`S&jlwYPVAa@Me6Hn(ED%8LO4;bv2BA z3II^=@??vr-wpHj>3v!{y8zI1-7=W{IR`*wBtu5B0Z>*}S}?G1V2VdqPUGwA$KB!0 z5|peh0A`-WvIUYP7Z}8UM{v4Yv&8_iqFM%;t^@F8>N`uZID2-tkxEGzc~7dj-Ai-3 zw?I==rI28Ury;wUNG3^}xx+V4>_byzPTqN)Bal}KWJUdlU?vzOrsWK}{eu7nS|k#+ z3=~zt5a4!O1cm@vQaF6z82V~^>qhs{3nFC*@%ihl7#f)nDMN_$w6*-~<$I!J4JD>Q zRbvCyjTYwrv}GM!oo&Q4m + + ДобавитьТабличныйВопрос + + ru + Добавить табличный вопрос + + diff --git a/SSL/src/CommonPictures/ДобавитьУсловныйВопрос/Picture.png b/SSL/src/CommonPictures/ДобавитьУсловныйВопрос/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..d2cd7a363c9a2d768a7aac74bdb4b2134b1aa35c GIT binary patch literal 584 zcmV-O0=NB%P)^bB*+@S{8>(IhrEaiN^499szG8(;!lty`2S94f5P(okE$Qzm0E+#7 z2#-ukA@R>C5fQo5_e%aIHWHThQ$dN1ghfQ8rL$Mmg~bdHpG6Qyu=5r(GjZBm8Yw9$ z_8crZ731;sHkvxRIZ#vUZlIc`&c()K1(%&<$F?oxa+=3r>Bl^QV71!}py>uhrfC5X z9(oUe^*di)&aoo6vHx%_mu@}rXu6?O^z!u^W_1W2IYh#MXzUZ|706_>m=12-ZavM- z=93;x(+pHCr*r=7Wo+AaSNk@bU~+nz1#9gI^<4u19&LU;g~C5Le&&j3hT$>(FZ=>4 W&nMel!pq(O0000 + + ДобавитьУсловныйВопрос + + ru + Добавить условный вопрос + + diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерх/Picture.png b/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерх/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..e22a24ad2139ad536f482560681a59191910ea06 GIT binary patch literal 429 zcmV;e0aE^nP)uzhf{17HCzh{hE( zKHiat2J^Y~Y>^9gnYQ+iPlpy*1V)!*=~8@4|rOGqUX zSe;ASXJ_Y^Bd!XF2$PAizUr1`*?U0{pnrYZK1X0$zvhR*0p8~bIs{an>uBn_>*a_n zV|JRK5l7H&GpMQx)kgs{$(w)yc+~399Yb_NmL&|Qr+gH2Oel&9Me$K!@k8Pjm<&&~ z7Z?UV1L1F#BpIWz8E=AkOvch;1_6P~0dur1dcDG3xpcj + + ДокументЗаписанКоннекторВерх + + ru + Документ записан коннектор верх + + diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерхНиз/Picture.png b/SSL/src/CommonPictures/ДокументЗаписанКоннекторВерхНиз/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..1eca2ff2f4763b82cbcc0401e7298278be914263 GIT binary patch literal 430 zcmV;f0a5;mP)GpER94+Y zqI9=OyR*-MZg$$;^^z|$Z|2SSzV{{%LYE?uiHj5di=;4^DOf%)-SYF$J}c zcf=#X?DlFV&t0~eHujHCiHJ6CsHzIpM*%a*n}7j$)T+=OO>~+pOBhIv`zUCcP!tu4;-kRgo5U+H8J;RH zFbuv2!rv-MGKQj)-UP9zjQP1V0s + + ДокументЗаписанКоннекторВерхНиз + + ru + Документ записан коннектор верх низ + + diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛево/Picture.png b/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛево/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..ae87b47365366149492cfeb1269c31fec1247bbb GIT binary patch literal 431 zcmV;g0Z{&lP)--ZvJWj2<=lE7ov7{pRSa70PQejaFF(5(o z`>>dZr`-^t6%d;k_jKqJ{dlj`QLpLvtYH&C#uK2HKk%dJPCY;*#G(|p?CG)yRp0;P)s)1WMXIRx;mmZ7OvaCRsyEw4eC9w_+ z6ECGV=sLRt`+t`tg3;hiXFxbeu)Hu2o@07ox~?s@eg!+p=Wg#;w(dH6cPS)t#hw~_ Z(JumblsWe~F + + ДокументЗаписанКоннекторЛево + + ru + Документ записан коннектор лево + + diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоВерх/Picture.png b/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоВерх/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a5870f40dfa1f1dd781c427b1812128327179d GIT binary patch literal 439 zcmV;o0Z9IdP))!<&uVvA1nh%y8`6mJHA!T&RYc@@mLhI ziJ1NE?EIq3)d3*{1JT~PznkX&WiSi_RZ;Am0_f&nc&Wut=Yfs6NptTs;{$*y0dg-z zlvLHVIV1=e9inFxu$lp&QZXP&5+n}?hE8YzwF%%!E<$w-(J4XT(J?aE7*MI|5Jd^1 z=;6SmheSKj4LlcKp=tCCtoP3I0(!#3jRBFcfa!@b_!z1NhU3^=?JZb~?A`Uv%u=SY hcZWJT + + ДокументЗаписанКоннекторЛевоВерх + + ru + Документ записан коннектор лево верх + + diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоНиз/Picture.png b/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоНиз/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..b733d0f236835a30c409d1e15cd98202dec5fb15 GIT binary patch literal 438 zcmV;n0ZIOeP)#Uk+!2wMk@5EhF;I-mwa zrKp@5EQX_ZmG#xkleD~@JR*b;!!&E%Fv-FBHMzLGC!4#;Id>mh4a(&eWbU$#=kf|HLcj+F z@LT{BiTI%#;;#n8dV4$-26zrHY6+#Hj<+u?0!VoRl)@`MHQmXZMFFvB1k>@TvvzWN z*5Rpu5Q4r)cg^XRWjQg!Fwj)h$ti$g{dgm5^3l0}ZD!osIZm?xP$59}seq!Uc{T?{ z5yJ!YjQn;p0F=unWLbvXK!Irx8bECVcu)$^Ttjr5C<aPzdR}4s!3`uIBz@mpl zD=Qu@SHgRRhy?ZNB;y>>zVi_@% literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоНиз/ДокументЗаписанКоннекторЛевоНиз.mdo b/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоНиз/ДокументЗаписанКоннекторЛевоНиз.mdo new file mode 100644 index 000000000..e058554d6 --- /dev/null +++ b/SSL/src/CommonPictures/ДокументЗаписанКоннекторЛевоНиз/ДокументЗаписанКоннекторЛевоНиз.mdo @@ -0,0 +1,8 @@ + + + ДокументЗаписанКоннекторЛевоНиз + + ru + Документ записан коннектор лево низ + + diff --git a/SSL/src/CommonPictures/ДокументЗаписанКоннекторНиз/Picture.png b/SSL/src/CommonPictures/ДокументЗаписанКоннекторНиз/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..bed431a9004ce0b1d37da6d9e32013e01846496c GIT binary patch literal 431 zcmV;g0Z{&lP)6PcYB4&xxS^}^1MTJu*-j1-A<$i|TGMcQUvacr(_j-pj7Si} zA?B@^NVtA^(z%=<8 z2!E?2$rz2z^aqH?WGpRa5D>T+Fjw1RzgxH~m#$YfOZ~aK3yFcM + + ДокументЗаписанКоннекторНиз + + ru + Документ записан коннектор низ + + diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерх/Picture.png b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерх/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..e42e1169f891150d9873079746dc5bfb0c1ed75d GIT binary patch literal 568 zcmV-80>}M{P)@PUX56@wxekh)NOAh;D5{vF-uP7sUOozRVh zT2L2?ttEERM51GC++ z*Zc6!)eBE?ND&b-iNoUS?gk%})*BS6b&ky~{5>V`|iIzlSeH1EW-7 zwb;A{v;dEHYSJC_0dO(>fd``+0Qa>h$DciCs~TWLi*atRX2Vjma|7+Ur&Mjc`B^Z~ zrc=6za6PNjW5Kq;A>w1B?1&9vS(Y6lLitz0hI!PW@AR#eRb?tQzudH-W+^SQ8&Q3sMk#*kqD8F>_w*?o#1U|0j zDVHl9i&Zs1-`Mab4jN6u;RxaICJroX69-L`PoGz)RNOsK{)~Zu%3x^s#(@5i%Be$f zJc{cKrsLWEF87`dc%NQeICFDxWADz3{GOccuKgGOSHA%m(ekI6Z + + ДокументПомеченНаУдалениеКоннекторВерх + + ru + Документ помечен на удаление коннектор верх + + diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерхНиз/Picture.png b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерхНиз/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..82c834eae1d4dafb645213f9ca9a54711cef7eff GIT binary patch literal 571 zcmV-B0>u4^P)^C5L8n8ZYpuZddo$WpVt&cr8)P;AgNWbx zaN^p9r&vr85z=D^#qDx|8;WZU3e`GC<`(`|2|Rg`BHZia-C{a!g(xBdz{}(NrIqwf zJ~DfKs+XayVP=xcg#8{W)tU|B1eiU%R|=I10DS?KZ#Ty|`*zW)6t}0FFRK+Q#WLB| z=5=5l@OXPvTs}7dmr@^iFdPNoel*O{XV2NJdKrpFIJY}$!VZ-hEi!;%7^aH|rC$XT=1_g^Q@2;L%2Z;0scAq>hj?1!@~hX> zbpCO}oYcBGuVl1hD`*I0v>e4!iFW2wRd($N+X2>~Ue^hQLWJ73ubbYqORxcS;A1vN zsZ?&;tg2pmMg}`5Xfz21Lj;2z6c|Pa1x=k#pI0cC?K4pRtX{85e_-dvfZl-0i32el zime9S@@!9+{mcZsPbC*l-%4(*-FlJ7v1|sNzUrOvGy4C&^KVcx9+YHS&P@OS002ov JPDHLkV1i7C16Ke5 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерхНиз/ДокументПомеченНаУдалениеКоннекторВерхНиз.mdo b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерхНиз/ДокументПомеченНаУдалениеКоннекторВерхНиз.mdo new file mode 100644 index 000000000..4868b0105 --- /dev/null +++ b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторВерхНиз/ДокументПомеченНаУдалениеКоннекторВерхНиз.mdo @@ -0,0 +1,8 @@ + + + ДокументПомеченНаУдалениеКоннекторВерхНиз + + ru + Документ помечен на удаление коннектор верх низ + + diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛево/Picture.png b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛево/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..9970e41190656616aaca660f4a10ef835ce74bb1 GIT binary patch literal 561 zcmV-10?z%3P)0-&UCjm@@eQ;ga3 zr?O1Fv;tHFET+=rRduTqa3~6g`g~@ + + ДокументПомеченНаУдалениеКоннекторЛево + + ru + Документ помечен на удаление коннектор лево + + diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоВерх/Picture.png b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоВерх/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..f4b133d62fc563f4cab8618808586c6c481a8176 GIT binary patch literal 567 zcmV-70?7S|P)yvp*_U1d6%UhMRCv9_9Hmy=sp zFP*t(0st%?9}y0_9UM@|S5Ql3#-7go$r5lowLsA8CiUV?ycJ?;1gY@@%{HX#(@n2i zmWcEPxj&yF*yTbmt(zb=fXAc5;=8H=(Cv}=df_Z5UcEN;>To&vlGD)(MOI3j2kL-C zq)({24#4S!cibEZ0dOM}`zrEka(yFA(&iJ za2n9r6CgS`K!0xl!!Vjh2!WQ%HDR`A-+mms1BHvp^vuD%{o$$s@wW;9>$Qzzvv-*9 zw%w-=tugc53Q!TSq+}^*+D0efmSu+a1kHe{-)4YvxrX2G$G@q)u3FW!bM+}SAA$Fu zvuIjzQ?o2f>=+EU2b3#Sd_F%u-#;oa%-e0QpjzX@$4?ZC=09j`nz390}9 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоВерх/ДокументПомеченНаУдалениеКоннекторЛевоВерх.mdo b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоВерх/ДокументПомеченНаУдалениеКоннекторЛевоВерх.mdo new file mode 100644 index 000000000..1f1b204fa --- /dev/null +++ b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоВерх/ДокументПомеченНаУдалениеКоннекторЛевоВерх.mdo @@ -0,0 +1,8 @@ + + + ДокументПомеченНаУдалениеКоннекторЛевоВерх + + ru + Документ помечен на удаление коннектор лево верх + + diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоНиз/Picture.png b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоНиз/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..d859d691467704d57730b48a092141c8a3e7a02f GIT binary patch literal 567 zcmV-70?7S|P)Ip^GkJ zQ3+9CR7i}uiq>LjQ5LMCI8KkppXcqube?UlJ@CQ<@ALieJn#2;`4$-yneecnB{JcV zSPBmpY)D_^r3TE4(ik@G+u5DoST zMbiK{Gxvd81AYK*`h6UUJz=XX5%l+Ra-Y8md+;dM-N?;KPEGt#G`!J=X(0rY3u&x6 zIC{K<1_$Wx^`h%~^9UhOv)L6Fp8fcB{4V4##*)(q_Vfp;Iz-;50Vvhh+Gg3Z%Eq0i z4=*$Q+ze0=u#nD>SJkyjz%I)S?e-Y~H~xtM%H}WUEU|4c&>m2(RB^jKxZN9cpz9lSP_2>r^qE4z_y&z_lO&lQ=ic@Jms95GNC>mZ zP(!U{Y};xV8cA~Y<;<~jiT1s>#C98-`l(z#HLCxw<}bkH!A6!8X=eZc002ovPDHLk FV1j8c4AuYu literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоНиз/ДокументПомеченНаУдалениеКоннекторЛевоНиз.mdo b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоНиз/ДокументПомеченНаУдалениеКоннекторЛевоНиз.mdo new file mode 100644 index 000000000..8bde1d648 --- /dev/null +++ b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторЛевоНиз/ДокументПомеченНаУдалениеКоннекторЛевоНиз.mdo @@ -0,0 +1,8 @@ + + + ДокументПомеченНаУдалениеКоннекторЛевоНиз + + ru + Документ помечен на удаление коннектор лево низ + + diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторНиз/Picture.png b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторНиз/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..2e6cb273f9cdc3f5c32063eae0006775157a4d11 GIT binary patch literal 569 zcmV-90>=G`P)ZgxQL1OViE_2b7s!WcYbH!@HKi|ax;5GMCf>KCM=tg zeQABJpIhv$Iz?reMC6b(@62aLZeO0TC@w0+{M7oV?AlyxY1QTNQrP@Kz-76A>&m&u z=*%P{BqImKX0?J1O2sDmT7x5t%YUl`9=?d<_c(cip9NsJWY88M{x5C@mW1M-H&@07eAL2`)O0`rWTWDPc z+JFaBL9se*0GyA1dRsH+f7X1Mt3HFcGL zTKJ@%eoCdbYPsZ5bsP04ne~o1E1WzK#%waw zpz5A&-(o!L0zSl7mS?Z8^w+Mx$Zk$|gF#>Q=7rPh|Gx8YEPf*7|89sR00000NkvXX Hu0mjfYK96M literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторНиз/ДокументПомеченНаУдалениеКоннекторНиз.mdo b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторНиз/ДокументПомеченНаУдалениеКоннекторНиз.mdo new file mode 100644 index 000000000..29a699dae --- /dev/null +++ b/SSL/src/CommonPictures/ДокументПомеченНаУдалениеКоннекторНиз/ДокументПомеченНаУдалениеКоннекторНиз.mdo @@ -0,0 +1,8 @@ + + + ДокументПомеченНаУдалениеКоннекторНиз + + ru + Документ помечен на удаление коннектор низ + + diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторВерх/Picture.png b/SSL/src/CommonPictures/ДокументПроведенКоннекторВерх/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..6fa792ea6c06b27456998920e8e5e2022cea7c27 GIT binary patch literal 574 zcmV-E0>S->P)Y2B)@+{^E!IY91ag!nt9Tx8-0&OM2u{u3@8f2UPbJ8S;Hq%ra+cH77#Qg89SrBsJC+0L>uQVLf^wIWndAZs zsWgeCaReAF3P{X;=BJ)E>s1~%^?r?goBihA^P%DDq7Foaby`iq^jt1yu5C6O`uq>G zwg8OWQkII9E3CBzuqY6poF%2}Ma2~!55b07PPFgWiUKm3EUK!amT+Jf=pMS5xe|*; zfO8f=7MMuPqW^isfZt~kmz6o_kM;6PjcUy;LG9Vych{^A77Y|dMNwdl*U8t^BqtxW zQRCf2XX{nm;^ofkOEk9xiN|IDLRJSxmXA}PNT+oi8|t|H@)%pTHlQdT&OX@-V2YPNBjK{8v`1l?F|4H@o>kN5fkt>I{Ie!(b0lOJAeE^ zQ`gubU$w6iLl>qabEvM?hfh2DM}WV-u~h83wKg + + ДокументПроведенКоннекторВерх + + ru + Документ проведен коннектор верх + + diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторВерхНиз/Picture.png b/SSL/src/CommonPictures/ДокументПроведенКоннекторВерхНиз/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..ee69535687364afe4a7e12b98100d17eddfb1209 GIT binary patch literal 583 zcmV-N0=WH&P)zHVs>}SW;UBiBjt&qK5{(gh53G_F#ntz4TzvTN%}hJwzB0 zk%ATl5oH-YHnkF3SWc%=P=u|#ll0!59?XkZ*A5)`&UeoFo&R^>LqzzWH#hG6lP@nK zI79@1lh?Y=0h`HT-ZGW+kMH=s&W@IYu^wA;o^;}B=K~QD!!(z=Van}iad|oTLE1XH zV+$1&ES@%;OffK&uzWa~A}fNs*n`_uM5H#@efd^TY`)&P7*JESD%UG0a=RE$PcuE0 zA(b``0X;bZsfo}0)-zVTLh(>j?Pt%1YU}RF(_UXr1tP*~f8~RqhvBV&b3vXe{qbBn*yk+!s&;*0j%b+ z_#`E33U=54Wu*$yt+f<5=He^+IyrDB%(|eT@Rk68t+}`9Yo7&pGuZ!n*U|nZOFMh~ zZlrBse}%826hjxr;*)6ZhI@~iy7~a}e%0p2m? + + ДокументПроведенКоннекторВерхНиз + + ru + Документ проведен коннектор верх низ + + diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторЛево/Picture.png b/SSL/src/CommonPictures/ДокументПроведенКоннекторЛево/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..90d42fc767b4874434c1c8a9f0e7e61ffa76116f GIT binary patch literal 594 zcmV-Y0O~CLTT#^Bik2J% zL9hoyQA;Tz7V#hiTl5f#8oNowBGj0l-D>$Yh8?gv)Yh>J`Hf%ba^T_hvGXxYrmOd6=P0FA)wJ!YYV^^|I9*!)L?>rvhw5=; zD^W5f;r+*ik;#+A!6OR$6E(ChEPm5XORb2GOp1T`=Klu8UYVb{6P zv@2fvt6ei)K?Cqv%0R9@Vld#t&Q=cDf{biIf%Nk?-q2Twu1vHYJ>Dn2h%VnT{ex0j zh11DH5WElsFMh~r4Bp?3@bfds(=~Ltn-G0Bf#9)TBtE1;2ocQ+R1IHJ-=HWm`u7UB zxp)Z&`~7e_IgCF$RZ&$1ug0^mb!#CLK}S1>lZX32stySc-o}mjbJ(}v1M!d_08HSw z;f>dZnSvL_BMifs%oG_LK2TtXVGa3K3SNI4Fh# + + ДокументПроведенКоннекторЛево + + ru + Документ проведен коннектор лево + + diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоВерх/Picture.png b/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоВерх/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..42202735640f84948abe08b0d9d77e10cb2c6836 GIT binary patch literal 598 zcmV-c0;&CpP)rcJ=oT+jvYAgJHOxW`#E1Y94HW1PI=RX-T_RR z!-d;VeP+pWFyE)rimk-|#MoxxN$=$|!+A+vcZNoU5JJ=Sjj8G4*?YhE_-#_$x;Jz> zS0}9pP0xn-`aPJ<>DdrzA+VMdW3?1<%v=8=7b33*)H-YOIxMnU2*;8nmlG_ma1I#G z3kXH#SyB_(dW%v_t;@m5dRO*tbnH!4UI#)5b~|=$=$=mhABM?fLXE|;wE>`|*RoJ- zHXCcXyRA7rF!D(PSQQZb6=7Lb^NLFpg*tZ)mpa=WqmTR702whrDy3t$+p!mLplgDa zO^Zs)V5L7EOI|aKQ3qy15ymH`7@wFzk#%;KTTo=3RC0-#P=uF19&$I(Rq8$3;1LVf zegh!2s$sL)aXMW%oh}yCFs=8u(=*yeT+Fkh+RUTRH#yQ=M=%gZk|mF9w5RiP_BV-y zO5+|Uy>HLc(CEfyQ@Hy21VC0i=Z_+6YKs9-QKoRb=>XEd4e4p^LoilHL0sMXEdz0ljh5!Hn07*qoM6N<$f<*EbLjV8( literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоВерх/ДокументПроведенКоннекторЛевоВерх.mdo b/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоВерх/ДокументПроведенКоннекторЛевоВерх.mdo new file mode 100644 index 000000000..091aa1a7d --- /dev/null +++ b/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоВерх/ДокументПроведенКоннекторЛевоВерх.mdo @@ -0,0 +1,8 @@ + + + ДокументПроведенКоннекторЛевоВерх + + ru + Документ проведен коннектор лево верх + + diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоНиз/Picture.png b/SSL/src/CommonPictures/ДокументПроведенКоннекторЛевоНиз/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..3f39f5589d5380005c89259eb59c2287d5ab0ed8 GIT binary patch literal 599 zcmV-d0;v6oP)Jhc6vCaL&j1|Gq!p$ASM0+e&fa&eM)8 z$$lu)P+s9y=KsXmX6H%gEhY@p!oRhhq!gW@APV&v=%fT ziSl(MZ02|*iXjA!+#DSCY-$4)FIGe3wSZD@Nk)g+4m(rvB+11DvrC)<`ZEHev1u06 zgxPOVawzqAI9cH{&jyFy6lZiGgkZO4*Sgyc!!T=`&4wC}o4o~~8R^_8HfLFTxvinb z=o$DV0W1p$|BA7wsu{((ib8o=37481J%f+C(|{E*Kq{r|OPgkuy56GT zd^~y0@{Kw$5sfiCI>zwm7>ca3v%rob>!gwkOhjY6{Qi)8p_aVBu}Z&~adcY%sbvkP z(}maT!|U}iqfSx(U_0%D4a|#acDS>6^!X-7Ysv|SrjTUGFI(;D{EYl2kx;4HQa5@#PzCHn9iYJ3}2&Y$|uy)X3g_9{h*P04(A!*VPZ^ zGF3OVbx4wAS*DJQXZLIJoTDey>@Ifaqp5<);2Z_=k>~HaUNvp-*6C + + ДокументПроведенКоннекторЛевоНиз + + ru + Документ проведен коннектор лево низ + + diff --git a/SSL/src/CommonPictures/ДокументПроведенКоннекторНиз/Picture.png b/SSL/src/CommonPictures/ДокументПроведенКоннекторНиз/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..f9ec7525e9a1bb77e8d711d64634e7a2803f6e5e GIT binary patch literal 581 zcmV-L0=oT)P)oeMKEOlqqhM5*;qNH2>Z0-+ufl&HjlUV7=dlsS5?!za?b8J$y9mwN)S@tPfTfOwZ@@rtfe#(7t~&V+(H~`6CL36wFV#`e+|n3+aP7rKtAZsRRrR5&;P;gAIXl6LJ5j1V zo9S-7fV-rauJ~S>TN+8foB;@173c=Es+0 z8;W*Y2&yU-qC1-?axBM}4i3_OGt8!jAmJVL0G8(A&W|G|!Sk`yvwg=>1xGvEbt}?4 zdN|+>RHAFbbaD=#tM&H%&Y= + + ДокументПроведенКоннекторНиз + + ru + Документ проведен коннектор низ + + diff --git a/SSL/src/CommonPictures/ДополнительныеРеквизитыСведения/Picture.png b/SSL/src/CommonPictures/ДополнительныеРеквизитыСведения/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..99f9efa905c2bf8eeb69a889eba2793361bb3d42 GIT binary patch literal 1230 zcmV;<1Tp)GP)AHIP0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$a7jc#RCwC#n15)MRT#&=?|Xmm+H`Xb z8Y#^%D@?am;wGV{NV#qkDoV438%vB@U`gh-0tXTEA6H){kRb^^T?>bbsZDBI{t3S{A#xj_-PL+k(180tHzFBxDC*@A^YYsSnu;>MF z8SnE}k{51akzu!S)ek>09hP}1X0|W_xSR3_C(b8^>nZL^~Yw);=N%qanTW* zphzA_f!;A4g2anZ5(~MJD1FR2ERHtlL|0F;n{F!eYYtFk2~_ey4%~_ohC+GqpBE+D;(v5&~tv4JIbTRmO%Y86dSAaM4L2w=q^A{BFOizU0ZZ?3p zhk-OZ2HgJt#GlWtgkm$J?P}u~e$4?q&x4}|aEc|dxS^&P4iIqi;$QlNi4p`+)Mb_? z1okG92(vNz@k108oW5{UODn2AAp!`ScuCat)%Tc5j=^uTEkb|ATc92nvYNI-^8Jok zb4uVTtF#Om4J5O*!yJqMiHCAeqE%mg!6Ao>O*2w%3fAKMr+?-`A?(c1h&a?7cs zmmF~bS|T^wSo~JlBmo|KI1`4=1A;qO1d9I^JjEhwyS4(oI3RmAZ2REn#m}2Fpb#f|w$#I7W{Z^tiPs~-6(m@Gq9ftW_VTk!>161SM1a!i{O6BV z#OF?EFt69o4vYNx>2jYEn_sWX{`4bsRaA#-^ACUJOy(Ppet(AhX=OopXH91EW9e%V zaQVp6va2_3uP`|;v7;i_IX8zKdhEqhjnlya@%SHJ_J;lM%3W!$fSx+DXW8L&3s~22 zDd9%H7m>hpKQm9IA_dWKv9 s&3N^9`IT + + ДополнительныеРеквизитыСведения + + ru + Дополнительные реквизиты сведения + + diff --git a/SSL/src/CommonPictures/ДополнительныеСведения/Picture.png b/SSL/src/CommonPictures/ДополнительныеСведения/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..38948fcc434248d984cc4067a6dae1d9bfd2edfe GIT binary patch literal 483 zcmV<90UZ8`P)s)NTuM-ui!@%JwycmV4;UXFJ1%-VnL+f!HTuJGrP`CVo~V!(u5(CWcKZQ zKa#*&3$q;I-w%47PiGySi3|XjGw&AE+4kik89$(?Owhz`CUSPo(BjtKD1Vn~s zo>;)+pxf)iK{*df8Bm(I6qn{g7;!1oGUJV~QYu2yY_nCjv*n#BbHNUHF%rQl&v*rL z`4B2Qo7}N|X6pdUX#mis47$%fzd--}12)#zK=W=|B4{a%BoTB@%Zyi`7|+4QU7PJX zU?i52P~eFuKQHl&S72d2hNZ=V^y9C?MS+Y5M;HvIICx`wCym4LZitRNO84!`^Y-wNThQ4@fg z(g+Tyb`UA;&#sz&0n3(?)&tv4t&iL_v+jELCFZ!i0()D_4C!X--&e2h!hdcv{?0!F Z3;+jRE4IXVn@s=!002ovPDHLkV1jve(Y*iw literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ДополнительныеСведения/ДополнительныеСведения.mdo b/SSL/src/CommonPictures/ДополнительныеСведения/ДополнительныеСведения.mdo new file mode 100644 index 000000000..02cf3298a --- /dev/null +++ b/SSL/src/CommonPictures/ДополнительныеСведения/ДополнительныеСведения.mdo @@ -0,0 +1,8 @@ + + + ДополнительныеСведения + + ru + Дополнительные сведения + + diff --git a/SSL/src/CommonPictures/ЗавершитьРедактированиеМакета/Picture.png b/SSL/src/CommonPictures/ЗавершитьРедактированиеМакета/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..824eb38057a4b49d40ef0a251c2f690720317828 GIT binary patch literal 509 zcmV%k$UH0~nf8seOTU-!Oo5RLTugHx_S8DU}ey*O5}HV`nZt{lgmoj)d>) zWnbO9%xSdmHv*_Ay z=tm7&Tj2THLuQ|yBi=p4;rMa-I{V4Jyu!%nAjLPI(9x5ICaRy0OwQcdzPOV|t@x9T ztEu7P109h_8@Z*+051Gt^&5e`j-~Cebhk!snTOhT1(p*7F@o)_0K9+q#f4u?mskEN z@Jf1m!#JC&4hHzI0Kl4yCO6icoQ|IK!T`Sj?-tU$X)$=o00000NkvXXu0mjfEJ^T? literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ЗавершитьРедактированиеМакета/ЗавершитьРедактированиеМакета.mdo b/SSL/src/CommonPictures/ЗавершитьРедактированиеМакета/ЗавершитьРедактированиеМакета.mdo new file mode 100644 index 000000000..5c874527b --- /dev/null +++ b/SSL/src/CommonPictures/ЗавершитьРедактированиеМакета/ЗавершитьРедактированиеМакета.mdo @@ -0,0 +1,8 @@ + + + ЗавершитьРедактированиеМакета + + ru + Завершить редактирование макета + + diff --git a/SSL/src/CommonPictures/ЗакрепитьВариантОтчета/Picture.png b/SSL/src/CommonPictures/ЗакрепитьВариантОтчета/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..74779abb01dc1c70acb931c745cae615bb0d3bf6 GIT binary patch literal 635 zcmV->0)+jEP){qU7a*l^@f*%|&Xf0jzwbLjN=Z4Zf-+ax0gkm^92nE&<3I|hA~@By zflG&cV%-$cJ>MZ#tzaOm(a}^%_dzc$H4erS25+a9 zNTstRr{{1MB>t9Kg1ud0O@p>kDd3bV#mAf73O5h?aI28j?XIaPfbDy*_q15^Bp=`I z=36vHG-DCV=F!XoXWM-=Zmp-Pp%zzep|n+TVy9PlES-CUKX@^rGx&SC2&!>cVF(pV zH%ea>eJA~#dGv;u9b)sYHWGTCsYDhd7NvcYqcnh)PRo3HmJ4+;Mlw!@pG~nMT$qbF zI|G9|SB{njh|k6ehr-;yb*&iW>(Apd@O_eaa-Ji5cGK0lU#tco{(m_C9Pmeg0RW#I V002ovPDHLkV1ft<7DWI6 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ЗакрепитьВариантОтчета/ЗакрепитьВариантОтчета.mdo b/SSL/src/CommonPictures/ЗакрепитьВариантОтчета/ЗакрепитьВариантОтчета.mdo new file mode 100644 index 000000000..47bed237f --- /dev/null +++ b/SSL/src/CommonPictures/ЗакрепитьВариантОтчета/ЗакрепитьВариантОтчета.mdo @@ -0,0 +1,8 @@ + + + ЗакрепитьВариантОтчета + + ru + Закрепить вариант отчета + + diff --git a/SSL/src/CommonPictures/ЗаставкаОбновленияКонфигурации/Picture.bmp b/SSL/src/CommonPictures/ЗаставкаОбновленияКонфигурации/Picture.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5e62e83cb7fb517fa5dde1bcaa0e853ba3ddfe16 GIT binary patch literal 515256 zcmeF42Y3`omgnp4yZdf;XK(kWcW0*Q?&(G#KnQ`b!U`{}Fp}`zgRsJT0TQ0Zd+)vX zUU(2rLf#9HyqBsn!xZlPS+3r{SV!@qFLvM{onjSr~Ichpm@RGYqA9kJc*2siBC*UP0P*8mt~nT z#*N1J+W#~QXco{c@Bs^G{I;3LS5Q=JY{K)DwDi3Ee3=l&fp3l9ANae~nl%e(7I^<& z`ELum+0-6PE$^sg{HGbRFAEY)I%>tSQKHCBszcqe;_8*JZ zQL}(%0h_Xb#_zw0-_My*(fdRO858M;g}v(z>-j$LY_rBqwg5{<<+Gjj9Lh|(f-u+)oHQZsW^q1{rquDnUj zuxwh_(TGiptT(OemJX;Syh*X%w60rrsTGtTS486Lk{#4Wl$HwmSbADl)IJ|6gQK4p z+pD&eT3Q-W`H%v`;vjXeTCr@R(NeeULZwvQ4vMt2t99#A-GvtGMoZmNK{x9@YQ5y% zV(pgAVin8TinV|KX27E`OXpJSYNK_j_P2Dl-esv;#Ss=Ou^1s5ZBRv` z423c^N>u5?;$(41ypVvsdQS0k)Z~|coZtVnzXn|sgR%>rWaU4~$a|Qc`yegHqWh^isw^$21g7Vr z=i|&g92J~X5R#(@_yx}MB|H$|o#PkryFnViZQ+j4#-Lf?>#@M^jNdA@Q6^GEFicK% z9O1DFvk~!#5VV#7*U()3vs`^}E>NBSBr{Jzwczyq)a-jHId@aCZY5>jc$X3ICjC0} zI_;WJdNH9Ld(r2{+svCunRk-2@1_d%P&(dCMKUtNIDz;?hF+7_Dmc~wSv0UX8b$!IhXM6 z!t>-yFH&$U&VW1B_LWzuS6-%EdY%kgpHD~v zhR-G>pLv;f=2iOXcR44al>C#a1wyD~NGG%D$t)tubc3lKyWVD>e4BOpW%}vosX+U= z_;)xJP6(XCYsU}WNzM{6mWXJL-(Sz2qm5Lvz^`wC-yFZKnXRUdh!j61LV`q*C<9z= z854?_YkZQK4{9PLayKPg1Vi3tBKmRVWg4)0UiGaL-knZNKK&~F)Z46+$$2N!^a9K| ztcY^?$xq7q5S#($Ny<6-BJH%|yI)95y7V#?{(WFrq{i=G|Blc`pjqJSvA}PI-$k&k zBwH(KdJKVWWO|4oNxqCoGhA)qXCpQOW+#iNh+y`M)JxA(5Z{1reL6nr)bmu~F~gsR zC!J^fG@d`n?+3m|+{ZNhHU(b!Bja0LM4Ormo=XYUj+l+0InT;Tc zL?iS>^|qg87d*E+e8v10uf3@6rQ=-~HC)^lkCqk-iy@oPrjl%M;oeUfnVPOUnjpU zJ~xs{lyq$xgBKt5a(Dsq{*)j|24dTJs<(~wJ&`W*Jn7tv)Uz*APQ6M$k(75LQ#LXC z*TuFK*EN3s`nQ8N0?h(nl?A>keyeXx;*A^eiliVnu&u_nB}_@;-A5!V^Vz}LWUi?@w@5)mhn#p^bB;RQhwOiAK3b-V}@n3i`}Nz?|m;cX+S z1Ku`L_K>)DBDFw}wLryoDd{2#rv<7NDUb%av(X~TV>$F#HpGr*(o%(8qC*Z<4^c61 zIhz9YQhu~#lwITZuYWseBhW1HRawA>`K^Yx)x}8^hnr(!Qse;YsVSKx2M%}MgVY@4 zPa})^>dVxN2}$RXMuOyQ1h&)krwXxMm_}kv>*K<8ws0EcrqHo0A%W^Fax{w`$s|WI zwgt9drCoxzja+KXN50NHnTotW#J0^r5;HXwY^%W#Qy2tJvqD^Y zL_imiw&HY}bTCai0HqrCr|9=47wk#0D1T3qDoaZNI-uLZR0EDW1OfISI!=hw3aHbg z%9B9>x$?L$kILE$*ZBSG-wxUcGz)xH7O*LPoAXJ;dpAm`Bu?gVxYbwO@qT+yw*C>` zY){R(os<s+0dgaxtxhN^ezqFD1~?C-ONejmgL|D+u={P^&Nq46U+1c* z-uxnSV`BOSa5^r{1nKCMwb3bSqLNleyj>Okc4gS>6``+}e?Zu^BJ9n|@VBcY->r#G zUK5kDHYRmlTpCWeF)>piIvn(zU2pUDzRSk|4x||lrO8LkEXU(Toj1L!<$v4!?V=4( zvw%%mK&Ml)J5YY)(~Mtam-&Z;pKV%o+q{CSvObAe4NzSQ5XpdeV=^!!_kIf2{=+No zSd%3AeEi$fi79ZnPiDyCg+F(!#K0|A@4?5oxm{GN(so zPmjo+79q-FLgS2xtT|z6bHmdXge5HreY-s5m5@U8Rgp=nqf^8)AuerGLgv;NnF8c* zgj2pRx!^#G{!qH4PJCj%Q{%Ty-5J_oGz-|i1#~*ZE7TkhE53gEW4oUuddahyGD)ny zLS~tmG)K6_t2amn#PY3oQ**FjHdX+{$|Psw-ibw|upmh$5e~PB-0DOi7b$*9(ufF; zD7hlS+Xl7~%uYf8TSP@f^!h~>ykTH_U2NK#=oFB3WyCvBc6sQVg<&cF;i?}IkvTUkZE+ZIu6XAW z?^Z`AuZvCD7@x5@F%vPC9j|hBzsW;r1rHfSbuf61-?o3dXd~1tU{e;*=@4m-r;6}V zM)P+WF@31w_U|dhNvvosennlrRjdPOnw7*?$ngC!fo)|qK(VY8mTwhvlj)Zdl?A1c zQldKCD!G+tu?UhVI+}&FY%voF1RhM6_AB1Dh-V|1{VHec^DKD18{&nZy*es&RaElI zh_{G!EDd`*KO$vTMAnq(e1YmhPVBOI|i39hyXX=C1T zV?xII_;iG#S4Jf-ho2q#W=Y6fzwp!aMy&~e>&tY#Ch9<$! zo)lFuHijb5F)Eh-x*8qB#zz@^!_$^1?l{6YBB+v>jtI}quqbW)Z=1R~w83Z=uyG6M zbhpJv8S!Pu+=m(X%x*5?7~&)9AbPGKE|Nfi-d`xO8VL>$$|=CZ0Vfp8lHf}Tsp^*! zM0f;iN?jFSN=Utc@ODCySiu!>5`5Ue>}?~?tzcU%MYKe`!7dU2$zdg9dw;43ZzGKa zX&vi@G+XZ$yxVOvOruc2PMj1B;^o%JQA<9 z-+E`J^=o`NQmoy2QC)Q#-?ag=pQnfwT(Ro564kbp7IFjI${RQ8`;jtUh}@fO*z>Mn zr-+keAvF)!MzS6fNLEC?TN<7OY|jkK@`;p3{$rRuIu?O#j`E8<5Cp}eh;L~6;t)ac zfM*e!|7~Nphc+C|0yb>{o$eIUsg=(dzz@dv9T9uJh%b7nP**$APJHK$U!R*A86VFplSe62`h#iU>F6_S7^$OiY>*0L83i(&F&sxnb#(BJ#Z>`G`oPccgJ-B>&<9s#S6i z3ubM1N>#?>x%lRfj1Y}q>bJZj-;a%?7oUAB|HNoCQqBoul;MAzGE*I!dP1N){AaG@ z=IgPA5)EppZmK1ELTFb@RMdJ#ZXQ}tVpAOGNYGy7PQCceMrlnEcWhvG6H>nwD zDOO^$nAAR&ZpHRuGvQ5&r4jX#Qu|oii)~uki&Y{LU#l%@1*NsH%er0NwC+%9JvjO~ z+SO9+VBKP=TUSsoslc!}wGkCd-O_@J+Gr`&ZfbcuDAIb9AaF zLjHFi*?;Yt-SsRPbf1lm7LNWGp*S8v=bwG-`#T@ux2^dE+ITbzXcqYASU}~sIecM> zK%3r?QJ{Oe;Qii=_X}gVUljL`E=@6ff2IO{75^%#QIH9&+))MP-sPp%{b zBCA9s1BxIw-fxdeS{|OXAS`WqXwJAWX?Xa1?{Fi0;*tMgjfv*{Z!xz`hIYFoP<(8h zadZ?P7jN_q;XaARv9ZQpmr3(AhHmEw+6BM=?(t~+{)+A!ZK#?BY{3Hm6n>jm1BAED z1-6w%T-8tsmdeK5Bwizj!;P#GINW%>T!czuQr1MiU5W^IX!?|p{4pV9c*y$^Ap)QO zXpIczqa%608?@zmL+8V?x@q~*QQ@WmjE*q&4WK}H_j7b?%oiBg`QVSmPi*0jMH_== z0nGw7WdXr&CIZz~iPy#A9>2{07U#k8t;!0naJ9v!XT+k{BAEmwW+jWPELEUld)rIA zG?}?RK_mlW)xVVySV8KYZ%F3Ekb+Sm6y)~)r;uBPGzi`A25Yg-fM^NoBf~!M#0cf1 zB6zRMwApGy|C?-d)ZdG6jo&tPXJ~`bEMWT<(CG@J(Wc;rbtFV^y*R(4$Ra2jQe!Ei zzCVpxoNSyBZ%L~2k=CxZSP(E(c-y9w60w4-h;VPhyY6wq;a(l}ZbjJZg(1n)L$W74 z(|bSTBcA=;W@=}3bc1V zLfkg!M+BQTEuQ)>t!VtV{o6$wp=JS_vVcyfeCSc}kF%7Rbe3sOQGBvd`G)VQJhm^L zE{P=zqsYQ&r9>qX5)pCH7)kb~5askr&0U$@D?$Hc@ECE|5Se1!}_67iV?u^Qke zHBJ(px+e17s)#qs!r#md&6x5mZ(OkC9n41r8&Uq98WqGx2k~Lg_<&H}10fM)ZzKE? z%*O=rkwKyY=voWJ9r~EJ*(#e=4eDDL_dW+<7R2~&+M4!KT%o@LK>dw#x zqglZAEuhnh?=_~2Ps8B7bRqG97}LkT)Sw3fAbU~;r~MS7LlN?> zB=JE4F%5}R;iF+n4hbeB#b+b28sO`^ZHR4)FWO{oOvqf1S8s&3owPDsd=$a&S?biF zY@Z;*s31Dxsc}S*(Hn66TQwqxk9f*QKIOxLxknUhp1@q63pGn%O%hqd7p!q2YZcGB zB4s>?k9sP8NF1WzeE3s_fOm`4hGCC|Gp)9Nq73E;kas^zTCOv|amN$jL;XK_MH;_t z|8~(vs9C_KETGfjqc8w1mM}$F1LeLH_{!>ccugN&KbA#yCBey-{lf&U{lg`pFv%~> zFgMgNC&Vx}#IWtP0iPoiXHY(HBbbeMCGouk@#RPr+ZpS{!rNHHHEBh-SV`6YSqiW{ z?x|ta6Efln8~(%yjd;R;k%m9v#Uu`Y$~_~QYob84dlc^(#`}iy0U^9!2=5)ry&`$r zSV8ngFIa~dHXP)BDh>f(dtafhOZEM4C>T~6(f&!n;T{qwT<}f@Efy#GD=Y=;Nzw%tRtK0zVsX+-yj|XCswNlBi^S zTMSvRcV{WZtoxLCPK~H(hSk~}4^N8Ss z5IlLp(P+{m?)^xdf9MlF=n3}<=ZzCs<9OB$L6ygR$bHswt>kf72FS%vJoF9|L7%PujLY~dusf)^_xW-pJo9Yvw%*wIx=}}G``HMe4;ll4Y_;D zhZ{2xpH{!!xbt=Px`dqBK{?Z(H;HG>qg6^p`!8I#_kPmIGP1)-2yt@l91Q$Wg--DMxc6qZ0gSuX_FshPPmsj@qXrn`u=}>ly=k zhX#JGtWPyE$mnrEZo63;d`~=r3V+?=$16j{bHgOF?{2v?jo-F@vuNYfEMQ|6(CNlL zk|sXRoAM-k*3%5%pj5x$q(#r(s9GBKZduqntQ0l>Su$un=2rUH+v#J3(njA(9eFd= z`)2B}fQ%slnNuHTOns6w>2blhhmv<7^$uhs0(nWnMecT-cpWKSo`*>9i*z_#a6qoK z!!3=4;C#SE|NDHvW9}Ny+#=av;8|%z32*-68v1}kL+-uIl0enM?BzN zj}foKrOV?W>2;0{yQcuyJSxk0MCD#_4ModcJ}{6sj$tjM*r59yE#UDlQuoue$ufQ4 z2drVdI0=sZ8%_e=<6jP~HX7V_$V2cvjF%F zUX~P~c#-uzMF(AGeU8(f$7#pIr0ov5(`nl26m7px?s%NE-y^#p6qUAHr9S5vPBH?z z`$35g_j%W&#OqM$@;IRI`>yf;DS>K%y}Nv9Q4P7vA-8bm8pHa+nN~K{#vymaE>T)! z-aGgXH|eg3TQ~XHfPWGo9^c~;uNTi+MX;f_#Ze+cZ|V8biuzlKnIIh0dV|#W3KMR< z`R7VjELUO8^7BtL|J&y74{bo21#H;@I^EDaT*%BtFcMH1a)Y&*sc+aXuj$DAD)qBn zdgRvVnCnm@yXibbn{BdFlk7$l3!K~LpyE2CpuTs0UC%s30O0<9L_?IPL>B~44w~e7 zkXWnpe$w+S9dcV4j5?~KWg&^pNFH{ZcM4+l<5<^6e8??6_;#TN-Qu4VPS|m;+-!vb z2cq-fo4m_I?vlVd1hFAEK7Dwx^W!A_uJNWT@HC)cwm6~Hctl-!2v}c*$@t1;YW%k4 z8$}zNW&sYiJrNlp`AefNjFv9I2Bs^0w| zt>KZ|;%7rsUww;-df?gXG3$(1U`i7x+XoSb+q?_ly0e`JfL8Fjl2@FxLkJaMwkKZYL-X9H=x7yvf@J@w#!W8-g$a z9Ghq_Dbv|3r$t3M^U!-nw{;RiC?6ULuFiCU>J?dC+WE(t|80YJh&Ck60=8=b@H;?& z3L1Ko4+j*1^Ba6{0QX!cxlPo!1*!++yDyhouaK&_in4XftPuMdmSL2`$|{mJ*4MJik}_=gx^qxfst4%Kx|sG zvqdOt9Lf5@wGAlJuJ#!S0GB3U8-jn_cC*MCL?5-KztXwy4elDw8sW6cCK}bfA1~D( z8gkp{d4ROqDEGd^1j37sw&bRIb?U`x{I=cOL>rlA0h_ddP6uEQzhfM6*9ZjmK1~N) z0>zEPZt$LaiPt)L&=ubAB=y)zI_x1WmrI>aQ1^qR#X>{-oy2XW)N-l8;{tPACV6g> zKbPNdyZ4r^PP<4CxWa(6S*RD$b<-wbIpiAm4CM8qnHL=8>%}>3;_-Ff-%10_^?s-X z@Lm^K1Al$DQxtVeH|!dCm3O(#U1C}5r)=Q0!d;d=sGwUhse3UnoVM{YL)YWNr^hf< zuA?k+Aw@UU>piFW-!^%RXoJ!$V6zs`>AD>vopzEAJLG1|3^gX@yUZ#O96e6q1dj|f zs!sX98%D45)Z;Sie3n9Uoi&()kSXPuQRvM)1k&0rPlRx;j5%eGn^vTfdLM z&-PG+inTiIB;Afu;Byc-eT@%7MHT910jQ$G72YR+H;iB{g4uv8eBc${|7sB-4&4te zpsy-ruV_@-`(8yz#OStGLad_?9#Bdn`difh3U7lzcog%x#RptQVqoDeOP^9I_$`d> zhOzMyeTQALAiC0`j%~nIZV@g)T!ng3=4;gWZL@cYHZaWswrK&KuGLnl!$#6^J8|~O z|DkL4cb?g;*U4?x%dOW*T@F$Z6ux-hOT6=G+Tk?qSgKCZewX>c>)i7m>-3;>bqr*^ z5Klm#y`=MQ(n(Rr-K2oLp@G|cl$m_Bh2kT$z82KgYsAlK{I=11L>rc7 z0b8|zPS^GkuOGqMJY?_!`u1-Ys1n?y+777hK|=fcJKxPTPgkZ>EToqH`Q$fO;zu2uEkIAAOYIiHL~f0?+eaXL#p5%w@Wv`OmcV8s2glZ!({? zT*6ze+rwkMsc#gxVRRxx#(sdtcve@9dQgS~`JA&UwXosW4)#nWFe}Q+t!8+Ww(k<4( zEce?2w{V?1ZzCNs8(Nz1tnk`T`<&%{&lSo9KQo*Ap5|SyaF=k_<}T|GUY_B-&kBid z7nEQHq7zqm&y&3Sao%woci+fcEa6T3dHpG@&N${gj5!bH4g;i0eI@5%yw)i0GKRa1 zkq)w_9hdGsVziIq^CmhGF_A!Fgq<81Na6YZSv)xo*B#jo&tThiHS+EMU790Kb9W zQ@qPnUO$XAeayfWv{=;tEFW-=cRfrSEYjCsVrYMe0Nwz3G4(nnnA9X?QgSg zio4u#8v&1H%U==)B`HsxaomKQ=ReJKO19;{BhT5ZP{Rslt4X1F| zX}l3MwG_Ed;LZnGm5Z#tA9tOibW=N9^=~+p3r$nXsep)P0iCW7(0d9=g1pOR;f1RR zhns5=SPp`=Lv(zBKzO?Y0^aQpDLP2oD*~1PSHbTa%pIj#LEWtOH(6K2hEH<@N!&M* z_Nq3K_M1pMv)XLHye7q|faF5K$;PHa@jj=y*G2Ave=1yH?UwPTe%!@}RUg8t^kbEK zGKX%0(Dt2KxekKXcI{aC4x+Kz0A9TsR44=7#j0$3M#%qM^@(td+byA7nRqITrLTKTbSJ;R;fFy=*cR02*(<*(~MPy>g!Hq zChuHn7ZDg#0QeaK=ZLzrStVlU;!2P6GY>TX+lKEHZD^VWY|jEZUGJmZqCQ7?r^~$V zGu8o9eP}->)aMxQeuS&EcH2Sf%+Vtj-flk?+GkRaBLcMUS6SQZrK?Q<^FpBDD0c_E z*O7LL+O8$mYPA}naoY0`?|y)H-pX4q6*1}RgO~$o?ZGN^Waay?vb&hw3|8Jv0J}WY zK?n$U=)$V@<#k5z`s0;Y^#tA!u@T@FLPe45WMhqya&>R1f!d<({Z!cqVV2q4@d~TC zNr87s>K8+}vgta_hzCXOv7|Wf&43r}sKYOx&YR5P?rZs}I~u=j?*`FEq*=g*Euho6 zOl0^+JrXc5)#tg5ci+d|FhLl^Jn&EZ0~|E%b(D8K#M|$qZ9(e;wB=^G&TM@%09a{h zyO%=U4)dPJx%(B?76>n`{2c-V+x&tO08S6uDxtlR`vzCWulk~#YE+H-iFrM%t@-e5d; z@#nQx@%osIoWg4_7s9TFV|iUa?!1OMjy2SnO6tus0^u(6cwJv!Z#u8FlDo|1HP?t^ zagv7PMSHEa++{JZvrIXB9CzNqs+?inhNfA-_AH>&mG@xf5Hp54u?k+SQcvdCpE+z}RW69Rx0dsH zyOknd+j<9e+fLnf&^EiN>k6snOnr+@r1dVU3PAuwIoe%htuGf>tBVYByTsfN@Q#~! zvxUUfmo%J7>P{xLMw4oTN#)+ep@&@FQ!dvLBC1PWyo9UWgOvrm7qUuiSXCbcG`Qnc zR{0vY4`$B0xZ_3U5Fnxx6(2E2>^jGscXIn@tlB|d`6{ckg4f!_f4U?)O)xlbVbyo? zT5Cj9yV_x1cNRw<`=`u4h@q#`DOP_LuXK+)1c>vL4`mKF1lJM9M*rF?tlWAy?j?P3 za|_}#b$qBZeErF+2(UlI?`aypZSU^TMxccB`lPh$U?Y(5XPO@ERp>iIDD&LtPq-~LiZ6l=JNlZ+ZpTjDg6Tjj* zp4VHz9d58H=RjQk(_2>Q0du^->_b?+Io#nMD;LeGoM-l-tm0$lypKEFWOY{ahThD< z&ro%R?0nc*V<*Sc3Eiq46UYa-tDWE#o-*hC-0?E2>(8ql1;53C4!1#c-e5X+9m|~$ zF{d-E!Au3)#V~BywDPCnYC8=#)Ca$<8bz9lMbkz6q#-vovtV>s%M$Y&%D|R<`}@75AvE@d83)U&R9}@ ztHF5>bGpEt4~yx{O7~ce?IH`M?qc3xu85YP0*T4RnH&j&_2&sSm?P2#T_^K;{(|T( zD@!CBS~3cYR$ONoordd?f+9|+oD-)lte|euEHRyV?79{|vAO$08<1uJTeblB-JRJZ z-rQA@h2=mvn7x>lJ;>~PvkJ(_1EdEP)j+vypM1Lk657itPCQ_5H&aBZOVMmrexUH| zKSXX*dnbZE6}u=oB*6AqkxSheh+WPr2eA5clq75&QyBhB=CJfP_S7^O+l#&EuwL%Ng~Y< zEpWk+3x1e6pJcAeq@#(-7BE|2Y_7P@<~7F3btV$9S!i|%VZc_>_-)HKiZ(XQ0yby? zovuQ6Rsk=$fZ{61Rh9$fKzJW!w~hU{lmB%*FY8Up!37_pXt40bg$7Dx`xTTOqA%Z# zz=Pawvi5DUTFOe_}I!+fE*yV39 zuoKzX*i>cVtDrABtFPgpzsh6fK)jd()t|ts3@LCNs&6n+pjU0QRK(fT&e-)~skE-Y zfR_v8&RfNsm*6o7T|~Yj!`q?;vzXHez2k6w{h7>~(}i_-_7Kt%6>0po!TUoSl4b#0 zwt!AowjZt_o1^DiW;iCbIu{{{DZzdH<)a2!N1s0|dn_vKu7-*gyBj zfw^|Q^l;+K`3QuUn_QZv3I7`*nsQx9p}G(|Px$VnQg7lofH;pJE|ZwxAE*XzRdriu z@-h$J|1bS}yGus#qNLhrRSL|1RL-NNGF`ID56r7Gl_D5Y-?xYma=|$pAXGA+1J9*s zp=fM~QO)4h*YST#d;hPg@0~Y^5dzHhXB5>eOn(YBoXu*Cm&^9Z!IF+OC&+@(Dy=Q0 z8QU7aZTbGt#->@omMx&ueLIep=}y1v!hYz=e(cJA>c+};6F4sioMYP3hyAbA_d5Rm zKdu=obYT_Xo%c|r`0M3+P`lpwWqak=_0Wq5OmAl2_rt;=aO;&o4dN}B6UEt_2D0iS znG1r%vlJ&4BnD6+vm@Jh7RRqce~f?M4E{7iC=kL9YPZ=O07hEhhlJGaYCeYV`{&wE z&{tnb>nvnK3luG8wdXUJg{<)cWBoNomwgC#$`c)!wFPJFByqHJHzv%;4qE z8r8wrpEY6tbtaKIlRv21lZbu)ys|xWYELE>NQ=rmlU(O@_&mk{^bxCZ^~d^6Vsdk zxmotzNcnD3x$Xt_T`AHJRf(xkWfHVVsRY-N-%`$lIrL`ELpf$8;W{_*6K|C_o?BEZ zq-SxLW$aI}{Evag^1HdqR90)cP>t!V`ZS>$)0p!#R&5HahH`2NDZ3oT80^OCD-0=c z=uuE*x?E+7TxF(QbvCK$BO>C?qh#l9`kK>;(-3{NDTeBPa@7fj8Y@YiJ-jw34((!f zwy}l_#X|#=m*3wrev@c)I?WJ5`3S#jPb3X}nafmCd6>TbEGh`C(pm+!KXU;Hl}O*sG7gMQnQmT61NOr_r+VBb$* z-?gLPd(a;|=wCgBe)6Jay%_XUSA$)5gIyP9*A)>Gk*`v|TT!7M0dh=C_Gi_x>L2D8 zeR)IVc;F2hIMB1X%Pd}d7IT@!YRzCZA%)P+lUc>%tkMxyc?PRGfmNQ&9Lz#p-Bc^0 zoKiwlS*3AuId6TXdBlF8-mX!O{aC5|Kt0L|6Q%N<@*Sqj6-P+rn&npLQBb~ne)*QU z4wDS!8|OGLlj~rO*_{lIcpVGB@q|IZ8<{GbdF9)z!NL#ldkU#Dg(yBZYqG#tV}ew7 zy25W2*k)S0F5rd2!(kymc0=>OZTn`?MyFZ8#w?)IRoYA|FQyLjslyyvVFtCIOw0Mu zvcu_L2h#6)(QiHJx9#b-9cY=Aw9H=iZEsN*Tvt>E&bp^bf9XeW|bB*y8z~}m{pm~ z9H)Lt${BDHi$L^>BMtWBrHcNvl0PzA^2+xtfGUiU>_-^NwaKe6Rkk0buh71r;uN|3 zWXY~^PQ`W9ewe=EaDC-HyvkNqZ9Bu8mk6Y|F5-<9*BOhJH1^|Fudy2YS)B=_&eRf` zM(Ru>wWpFseu&KQT2rJtQ{`f)2Can_S!uDxZyUQcwBcwLuz3sUbQL#Kheg!EPmw=$ zP&JoUoJA{4qva=2yK&U6AGI4sf85W$o6o*$MTJ^Z_~PKVsI;bKI@0eu%RhJ)l<7>$ zw5Me{35oXR^oI_#TyI)&409aMs!d>3C$g&Jgq)BTGTBtGI-XUT!m5DK(}k)iLI?XJ z%>EdwGQ-rOwts%CkTnnabgo;le#{n=}guf$e&7TjyE))!<(YM*b3NyH#Su*;jT;gv74Iz zZS(hwHbBh+wqyaF&S496SSa9K*`HQM3C**r%%fFi(7$fu|NhwcUyqI7-R9q1;@=$M ze>`XW<0f9FEB)8=#(zJ||7!yK?+L8TSVNg1(jS-dKYO!34`zQj!T;?(|I;b{?P+6W ze`dGc_{|;T_s5NY#HnucGG~o;oB1~njnKCjjTM%2hXuUq6y`Kt(NtD>J}Y;fRbFOp zQQJRR&R|Z8s!XSqMjIS_j)XUY|)%awddC6qH{aNWU|I*u3r{HU~$ zR9Z=)ii?PYf^Cqy610s~+Q=N|ieXfpDgNb9-Ivu~$naf|b6R|09(D`)lL>&Nu$$A}e#6 zeRGT3&n0$i=^sLkKh7Y3Sxo;tpZsZ+^oO(TPkyY-686n~<9~z$&-|MQM*Fp_%mx0R zp~nBZ$Nzkj|DWXdKb+t{9%BD}Ta^D9X0+SRD*cRUNLqE4qN%jvNfG?6I)_%BX>L?^ zeO~D}S+0aP{AaQ%b42h2m*${cps4sMn@R;2Samk7vVuD7U=BM_Qiom4VLL4pTDDLp ze=!E9+0+T;ELv?2b=XbI9wa~QpnrJ%zRV3?_6+;?SH}O0;y;~bwfx8*L%97Fju-O( z^Tqp$Q}wks^Z$-{-wgaV)4E7y8E?Ey^S{4>+eI6qW&xYBfKFF;A8WLZHCo9UtYmeT z(P|3_KCXD~(GAp-^RGv#JE~eky4mpE=K<)n-xWY1DBQ!#g`wmeXo8MawVHY+7x$V6DSgL*%ob&sQ)xlU6v(DxG9i{j8{|vh(xGDpRq}mR?XFYzDur zfL*MP2Ne1^t)P{+eVE@{X;lmiKdq2kEvx#{zwRafl4Sh$B>nSQ`rlV6D*qGj8SST4 zmyka_l$?{q1IQZ>s?kgnl-*nTV12gPtzvHKdKYd z^$=~ai`L&k>*Hy#j@DU09VZ){X3EZf)EV)6OwBG(f+z68O9=ncKrqB+uValNfP9Uj)vPf*as}irOK9~4 zv?^TH`J@_fzMfXPPwNB-TDQMJ+XWO68XNDI>TfWB#O-c~K5c%9@EoWa!SIpG*2=Ni zge(6^p_?l7bUiG)Y&5jGDLnqBC#lPB>b!|mT}2$1kjjfmWlT?6aK3;z&L_@usne>` z$gQ#*{N6^ZEu_wKD0&vkmx9w3R!jEV1-~697u6)GnlGs_pVeK&>iN?eQ=}%#d7)PD zCe~WXo2=x=Z)y1_U&Ae!~AXy^T6<7ZstMX6>R?wo~Utisx;`ZxNZ9B;q6$HpuqdWT(ke z6$p_NRg)!P+u5HA`O!+F3ab0lx{Fz3z`s_m1S=5lV?lqyV{h6mR;9HH%{1 zA2P4|tn*#k;kKFLw`hmEwB>QR@h+*|b%Arxy`7@Aw`i%tUeMYlj8%_jZg9RqW%D6o z7lh|PsZ#f%yhGbwrwumiTU{~rYzK#6wYsJEX%Mh0TER9U*WU63+y<{zc`wS89Hov`3@b zLFtL?7ckrP0&zWGike&^ZST;QkEv@YZTN(`1kf4)`624KOQARrzMEFrL7f*XkrOo@ zqL%Q#!S5-O6JFMY3%*l!njygpHz8c*_k592136AIRGTfUb?5mMv%>X%#`FSjzLqyL z>-cRg{{5BQHQF#W3)qGQbUN>NJ_b&993LH{D3*_o6`nU_YKajpI3zZsO&ST09Q7#P zC7!#yVZ9Uhgjha4j!lSVK2cs!2(x+F^2H917@qx8oiBc4jbpGt$CNc|p3y&uXw9>`tp%b+{_dpspnPNUxG z0c~}bxb8B*ad*FG#r1n4hY|2@tjP5uXOb6?B^>VGh_L zP`uV+)^G)Dx`sDjCn&D*+cs_qZ4{aXz8VYYbb`~Lp;58iJI18pF-EX_VjP>AKz$SG zpm(HIGWC5!Houj(B+I+gq=OmKu}o=yy0j}zUL0l^ds#m>%rHOB;2UX}9Vz)nDTW`(q59OW@ zh}V6B&`qPAa_bAE<9*uko|W#31V+Fcel}DL-q-}c;l#T=q>Z1M1&TkTO~M4u>)oa` z&r|0E6u7PKOKbSi8i;`?s&3}D>Tp+DFO}adJIykAbO?Im}q9U>B6TRNAlsC!XbD(GXqS+cIS1V=wtD<3K?9Z)GI98#>svKbf_ zr`FX9N=pUpmQ71tZTU!fJ17!Dhhn9=skU2oSyxb3RqR;HA(jsRgi64pFw3u4*DZ~x zpxv@dtynhIz1Dp!yDUAeE2tNf<=A5F)|42v^81UlPc{?lg4C{{+VQ3COMNu zk3!k>NH#r|!%pV0(*z?(M1)bY@$>u^GtgIb;Fz}{mgK~lu*4-h{5Yrf!8U$VEF^$evfsyPdnYG9uH{e zdm_c9$wkuiQgI2KUn0$}qCa(eOdBiME>7`K!SaUpk&{SWR*4kC>T|95jcB*xZCAz2 zTY#@h)LKj%uH?r)nm_mvet$L2 zf;Ldi0-6QBs0G09L_Q{gk51sD68Ojj?j3K0d=mMTL^k^co%@O|dP7#emDjzKx1`9s zQl$fF($NgV(G2NmmV7jmK*uu4?rb(Ji}lH1TeH}?Y<4t`cMbCn7TA6RaQc)G*+&+%1rFe83P_LH1&^i=_D_p=MSB(Sh*hS4oF^wDl9(1U|P} zg%pQV9zvUi&~}e#n=7=*K{LfMF*%JXT)| z{5BKa1oB0K=%9G5Mf8Za{`VLC)7DO=S>QKs0i8~u`URW$g3eJ;z5Fd%^G@EFEN@Mb zcc;qmtq*6&Co&Nak&kDQW7*`GaIcxlW`Oy)qEk6+R}LGV#d>A2%{lB`EGvY$6h4wU?25PLDqgCg}a!wi!{3}b=~10TyBZz1?iLGI?4i>TRU z0=2wG!1%UL1*9!%8bVcp=wNwMY5e}p-)-6jY8Lpi7SQRoBum@iSf@yP zQ{{tc@{tVrc%}?mAIpM>!fb`sCT0V=CT5?=;nq5x!}sR!NtwJ$CR?1t&gSyd3dI3( z=u`nekjj<^(`_$=M~+3-3q?W(zX$8XLJ=yE z+jZg*NZUQ7EkcW^c_@WIbb!41GwS}3BC?LKOvgY$aq*J>E-JE3fNhoE(}dgYuv9L0 zK(4$Izn6Ad-|&HOeqTP3$B7i<3am;KAu&Zb%5w{HQR&Vp*tS}270r3%^`(&2jQ0+5B)8Kak1yq_Hh;=_;^1h62y?qXoqmLa}5~ESY>) z8h2fq7bZ3rMhh)aG#}I#0>!1tPYi=@=m*}=_YTl|UN^WY*tSp{{Pql_?Sp8Gu%c3M zu2Q^32<`BQc77mSa8;ciij4M#TcuhHM9yHfsZurY8|7rF(q_4WGLczx9;vl}nuHXT z$p&X%8F3OsQ3|C*PDG;?Kl$z7Y}yrS7Wl#z(CI*HA>maE-&#fW$z1+Rr4n5w@rGv<+&U;^ive0K`l z_?j(?qw^yLyr(~u$6b@=J|l~Oa|PZdOMraJQ+e=hdDtCk=xxKGoBIAY4BZ0^ZLdl# zu9B8lN$UXO6-eEKXv;96QYqdtgm!#H;ih*E6p4yLIOHB}dI)O-NcGoC&NGF>Ef9{3 z!nu+?UgudW)tFBTIgRD7ripHa{I()D<}V>Fe)5I?wzbn~7Wl1OK&Shqoc?5g)t^T2 zdp*J_*=#^21IW88W#23|GKE3Phh8M26myN8FKz-vPztVYdu}Z|MQ@o}lJ~~nKc?sgPaPCjL5`&JrU#{FM}!*hk!mj%G4E>AC1tPNCKHLB!ROO4;Z^_xw*KFtDO*aH6meygkn#Zft$%Ma)B17;mWU__bMJd)1W zMbI5Dsfpj8fp81daoW9a*{WxB*K4G*@O3W{TKS;=ZQ}QBdBj~If$-ZB1Ydl}EfH7g zbIZ`{G3oG(xMnijZaA?2y9mqoQnjSgOBCa-J<= zQqy^=gmmyqS6Pj2L5lDgmJ><4L9Pn0UcEpF?mWJGxyzd%jg%k`5GqeW3i>gHgRRyQK^Hb{en0lJ! z@mNGrnjMy!0p4acKOwp9lWHv%UU=0RQl-nZ@+DStx#DmyM%K7U0k6GOgi2~HDMcE; zf8+O>c6piwzO)6t5Wg*MG=QxV8YNOtF6XgpdF*yRy`RtS_t8!^wdZvDfm5P%CiI_olOz&&6CO z<~Y@S75^AAC729`+kMZhyYeuL?#QF=OLHS6pD4qCSji(wwnli%2nqq=@W?v{QLiV| z(=3lCA_U(2h}8U;)J)ZJsTp)aYI6!3=6tzuh{+pK1%rTW_?m*vEHJF9S?RRO}6 zBH^1hM)r$KHE<7k$64+zdT>X_X`dA7hz@i%mS9GMtQ2HcSc-;;;jQ_B1D zP>b%#qaNa=Pckuq3`rzIo|7R7(x5m)muQ1qG-)0!;N2pcwv48o!l+j;^|Vr_$F%uz zsrgBhnw=ERH`K%|WF|J;MxFMv3iuq{9$I5Db)0Iz7w2mJOlvMHDzyAeHGY5TKW^=O zngxF27WfQ)TbK=O1DWu%5$L#)M<3=1X29dyL#7hBl9(Eu(1XQ0f&zJynHLPh_Ovm7fz*i&H|) z6*W60H9aZR749*oJrt{3InR?35f=!DP_bwQJ@V1@Pk!Tn zhuY<77SJs4%PsH$euLSdHJn`t%!Z$RDUV*uqj&O1P(F##!^wuMnQc^<{a$4@NUZQ% zY(g*i`_GY8Pa_b%|B-zCIeV^fJ&qXtk^XT?x|>GUhRWma$crLr*DJ&?l5Tj#x?LtU zc1yMQO6|_b>tC`#H%Yaf(y05S)?TURZfRhE+&4h3dr)#gy5C9J?X=YOx;)~cJoJG) zcHAn}mEwi+7&v*BUChm$Qh4M;OcakW1W*q;S;F3u0#&fwz$ z$j?D!!6W(SC-S^NsqrCc^K&{cl=?iP{Q~5kSBOubaKX2{;T_M(lb+B?k7@TS@}x&( z;0=Nnc;0Q!Nv+OGy>80G0tLJWEBv0L@Eh2+Xz&XH4N4?~;-wyOQu`RWV4OJ^O|NHlRA8OaGS>SK6fKI0-WFs7LE{|Q#qXGH!b{>6@PlF0bq+VgRGRvq2 zvk@Li6wDSfFKQd(mrt+7feHGcmsf47SQQ#isU}}uz&{XX@s7}C|M#2BA89h z6OgK(ZNheOxPCcT`{QShFuZ@1BSJB8^nE-L!E!u9VkDj*iGLeB)YGf^$Ot#8nT9~P zDFZQ=BS!8YNf*ZmEs3EEqv*5{GUBm35C{*Hy`Rdy3B(5u_p2fr1b7R{1L2n^%9EoF zBO;|PQKWM;^-zQvP2qf>Q>4IKr8q#|?5qf(v=1g7BB^_XNgbjo-q?5WGdNu06&^B& z3(R?&$PPy=MId~&=70aLZ$$0lH4FR=7SQQ1`-qGY09#?Uk|lyUNHGlwK$>GCpB=;g zID^07UL{zLe*?TniVNa7aS{nBAh&bL86{?qe@>{vbmrE#!v6-gEm{;!=R{DSAbDV* zJOcbqBt9?6;MYa!0;>jJe5IhcmVfd${QYW&XcqWATR^81DSpW8 zQ<$v=MwHmddlApJd4b}1$ly_fe=6WX6jgxKb8;ou^jba;UMjx z&C~ir&l82>Mm&X(#t4ds>B+r3g7^t0Vn4)hi!bgUL+8JuBVW+|uS-|I*L2`(I`sva zl}KhJ$kSsDKGBB0F_L=(Yxe)!I}a#1jx)bg_Sy11-<|K?y(fofTW84<&+@Y}wkgguj0T{Lb2bQ2`40S%Hf# za)ROolurB>f&PjxCgLiqi5lO4(%1X6AGzIsBH>MuUpKM$hWK;c{N5Hu=Mbd~54Gx# zwrD?Y(dhT#Chd_1<=*;eNo8yb!TZzm!nDn*2vawxwDRPd1~#WY8HyWNQ6>BS8uiNk z+MHH4{V4nP@7X2Ku}go$zVWi*3;$pr`0eMRh`vLCtQGJCzr{Z_0g z>95=T-;&=?*66=#qAkzqgiiiyAOCR+`+u#e!;f3pqb)>n{SiWVi}p~Xa(7j)ZHHP$!60LxL^DO^K z8+(LM?GjqpBQ5&Ft=j!{>Ma{1b2dk(NNk%TQ#Y!#Z1CD9c6B40BSI4^s$)~PsZ)2T zH2*GYWJK|+jXFIQ?{tn&JR;JtF&_Pnr3!& zGn>|1ZLOMc71?`(}1<)MJj74Rs(LfEhvlL@@b@~EIQTB zZ~DfknO#Fua6EL*4Tn=v63y(d1aB} zEwQOv)oCMv{Nl9i``T6m-Uh#05(qb5Tk7BYvofcP6*n89C=up#vhRP&K0E;bN!Ip@ z3Q)k$3V55}hDZF|z5)JD1ADho|5JnZc5Up1YE>dUCBFs2Y2nH*d-((H?4gcSp_4t( z!b-NPx0Wln8VHZfEsMsKMlUI8{#~bE)6TALGr}AStp>kmRO;VftIVQB z;p9T0x0s1AyOqsuVQawetj!k{pn$Ix@BzPR{{6=Wf;an9BYUSor=uW#SC#OESL?L> z?DLI`I4ziM`6YzY_PNjZGMa^3C*mf4FDO?Ql*i_8i_I^KT>t6t^li$Na&=0XT3oMR z)4{GLgtr^CHW1#y=#0yge@V0O4)#EYF%eIOPIg}lo4-|EP)`H!;7NK+Zvr)7M{5|T0|dT+W1XxE2r*OuQ;R?ceB}TMkwlF zv)hfZ<}}`4W^cf#0R?=lfIs<7TNWlh(5#K=6=98z8A^-r4Pj1;3V+gLAe`WRe-Han zJDX3;7W^Lhowr??w>?G(zkbv3wRI}36C^*$XrN_-^uf*nb;@paPA{8HR z!Rfp>u^i=OSlt@b(!R^2Z3;gO@t=0Fn_c<6vPr$WQ(f5_S=c;W+^LW9yH>w!r#h3C zeVh1AAjkYWYwJY?DBy1ee9!MugzNM!Q>S;C8-wXr6w)d8@APwed3noDbzZ74w>-A8 zS-q!MTh*biXc@kxO)+NM-K?mWO>fXI-=$7(G~$#pYb0R(iNA*;dJhG%Rsj4?ocftu zj-s*JsCFo%tO=%hmr4BoXn;SmN4tgm->Lbnu4rcW^k}QPv=!~j(w69To!aakHoKS2 zY}Kb6(5|Y{XP;rSdPc+QO056R+I~?13iw$8@O$LcX5(F^v7(S1;p*<7wmKAd@_$o0 z@%zI8{={DG-o4sQyVP53fm|yqTG>5)+Ny4C6?swGV+&g&G~q7lV>8?IDW7T6>-3_t zY*ycB0Kfe_5YcxiFa`y{Zxg?bcbOWmQ?yedr94RQG93{v`2EyA?dSWoC41DHQ}Vlw z-A(+aDR{TGvO`_c8o9AkG3MM|Z0cd{iVCf0fXxQK$6&Om0tKKzLILo5gx{l%aQd`9 zsvQff8=Y5#C+FY$v}X=zKi#h_*kwhyG5>DU@9Af&dMIdjb!*Gpql;Q2#eMqB9yaZS zHmyRNJuo`?rinP_-x!ln019NK0QhaDwv7AshcDJew$F>L6l#X!8@23tJQ}8GEYs>d&H;%xYC_c*XGX}p` z^=d1-wPo!}X=~*Aer;Nfe)%D_D8LBYGJxM0j!*y!WTgQ3ZR0n2!NrR3x~O(MtZYuT zL7|!7gz#s{i*i7_eUB;;ZsIpvb%x#5r?2eQm(vuyJ#t%j^vXKz^26%vAvTL%VfH7( z>ME>1$;x(77z+4Z0r1<#@5B_Gb`6i$)7B^vbzdqkiiO_-;SZ7*Wfv_+N&IftmeKpm ze!l9A5$+;{pJ6NewB=pOlFsP0HL=T%=`+vpSp$65*<=8}{XQ7ce<+Zp0^oNlej95E z4KE6#-3d>Jm94fZxSikR1t*Fx-J@NfK==*YwWV$Bu71Aqj1dfYpW!Rcu;tw}3y;mK zicUMO%}DTj=2M;o!I52P66q1+r8C{7%j9b7DCm zZEZzfl8P5zh|Fz^DgcB^XK1*SvXs9hA%(Emi6hSjj`)Li%xIR zXAH$L|IX56Q5*_DfusW9w=2KJi%j~cz9Jl><=}E_D<^)F7v;$V+8ukeAMDVUwzHLI z`HKEzSlMsDI}!BK7Iofdk!$Of8G*Pl1y2ObzcDJI02Ihd0r1|BGwYa_;T z@O2|!^f>WbOu--Auidm$EA3z_2Ke%`ra%ZcD9)F3X(h*FH=d5p8PsPCCJ_#PXJxr4 z3B{nk_JttX>5 z^eNK^`HTT0fZrI7Pyh;Kr2zQt%5R#28_Nle^XiSQ36F*qnu5#ys~+F0J+(hYczVC~ z=q_z}2U}+6w}EiJypJz9t(8>7ZtIB_^)rER@H;EZMPVoa1;Fq0{EpK}$4#^;3T;g| ztk4&k;&b|s1N@(B*ei9Z!)w*-DOx!=$PI+s!yvn@Mw?%uF71x~uveKr#Agg*{*BQH z1)xB73V`3~`JFf>Q#ZUQwRBj0Fh(aG3xux@a;LB+Xq?e=?;u|~U?AKQmJjjU>h<|2 z)ulbLd7Y7>vpP+|G5^labWs`#_+A033a-zZBpr zZSXc&KExNc=p~ifot;W)N94Lb75w)7P=o+bAZrD{?+o}Y)`E+*gmhBq1erL*W;YFd-9gG8d_5~FA zEsvSjmN-qpUk-3uMQHb*Eb3q-)!HKBcb~GbeR$3pZFM#Fuk!a`MDL+MmI{F1nekgr z!5dUM=9rx{KIhRbw063DV8G@DALMs-vs>%5g`L`xeyy}CdVNo9O=VqEOKbnYKqL~; zbe(e^kH@q8--+T-01Eg>0q{Euej8J8+8Ue?UKQ2$W;O+<6Chp*@+Ap`)4NO&mJz>u zh~N6cPJPK)y|gE`pksLb>00pHM?()?g#tM%0Dfo8@5B_GPUjH|QFK~}vT@{d9;cbN zNGDIr1B2%ye2_2h=fv+jTG`S;y|hnV*fG5E6!@L9J);3A;3oyZ@9g+(9PMBnux2bo zQTGO7az_*wgo`Qo;*rU>F$E`_pEZ^cE^J}ThFIwtePMTOBj(?J8hPj|6v$lx@H-oR ziz&G9qSVEVDfp($rr;mjrr_j4q51c14Lb3A@fm$lkFpW|@7(PfEkFT3DFA+F$?wG0 z;Ku1Zw5e5PSlJs?J_^NMCf_pa)gZsqGzDK4;J4Q66qW_~;5xA7KJ9*}t~akN9)wS?qCq0cezCb##1;RrWgXVNE_O^o!zY|k%oztd-heOJ`U~)$k=`FEGXbS#bkl#b7rk9trFG_$fY-bDV ziQkF&_W;|3^XGH7XS4tX{GP#_NqfZsXs+xQ%_UeW1*`u#y=O^~Hsh(go! zH-d%>h4_8vSzgk>ZtoEM=J0>#!Jg3s6!4P*;CF8P7N=v@(ziSz<8;ilpJS2><=qf} zh@2;e&zsM$W4E=j#QYol_S3jSU!g!g6ac?-;CFH%q0VUvUNfxh4yvDIu#k`t{z8!7 zMz1h~hX3T&7Qt`$Px4{UXafrPNdfRXcYf1CaN~4i^>9$xn3)UZtq{K}$QOlqNfTQ@ z{0{Luhu9|U|Lv!dhrU9A+!X-7bLDqDxgCn4SB7Hc8BD=x{{2yiKNjS-hxo1StfYl6 zB42orgWtKEGg^QGzES}E&W+z<6$%}VDHakQ3>rtPrG1OJDX}T|q7Yv|r|>lMMYN(2 z{PxwjLua8tJ`@1I^TKah2(HCxN5YC=v@ED)@)q+?^cFM3=XbODv;_Pt_?-`9MjKGT zX9|GdIrCe7i&?L*>fsojPM>!EO`r2@pl>n5d|q#Y-)DF!=HEUWdFU<_$Xx;OJ3stB zm)Mbz)kM{!bS_VbrJaIr4Dr`Pd`UmMg_eN#g5SBDGFpHFzEc4F&IiAZO~HBcTb`<6 z`W7>zh2S5D`J;pUhB|h8H!lt0{iW{)A36*La#R5P&JVxO34YVLYP68>KuD!UCTYDW zo5K7TA$}8m!qdsX?;H&o)uDh76#&2U#BcI~Cl7U?x0s>W<_ykNBNxi=qI_XJo8Jz8 z`*7@`%TOR!1;Fq8@tYQc8{456M;j~K1L~R}ciMmvNV7B;sH>rZkuWYmWO zK2!kw&Lh7K7dWRK3F$4Su@F3iZ!tGV_)~O>Ln~W21pl`Whab8O1#(gV{LUZ04HpW1 z$U}$nDB8(jWOG1spMM*x2#5LWy=+M{yL|xs&dHEb84CDN0q{Go{7$-1=v>UOvNNEp z4W&6(ZQU?`zmMHTyP%xq8?pb14+kK+3{g7LP{5xGfZzG$x6xX> zi5aU1tE1YHK$Ny4bf1FL62d<;>JN6a&G3Kwa}1)_P++VIfZyZ5Z(|jTMypWtQ=v#% zx>YE|?|0hSQyqM3WqngiYyZGNBofhdopT0moggWujCaOfcv$fE+_ci#C;4JJOsG(O~s=|_elv=@py zzu)U)Z@04Dr@-$#S~i-30^U~u{2m{E3l~bAs-Fx+HU->Pq0kbPj|SQAn%SG0KfBS*=Pz1cwYhV zdmQ*JPvoIPF^yFy>0Bu5qu{sqhZ=ea1@f){_&sj?PJBymtU@^vjFg4k_Cldom~XbQ zofVjW=iR>1AQbSj0^s-f@|zZd>!-sp+6%?Sg<>p0>14a`{?f}M4Sj=Xb}o{Spo2SocT?w2+0M0A{5)?d?F9M!u)W6 z@5T2!ULI-a8x+XD0^s*J@;k8?q0Z}K`pK|T9#C9P#9STZ`|$mI{_PtrLIE!;0Dg}f zzeiS~@Oon}EA_xo^b^+)dG>?fULI-a8x+XD0^s-f^4mDnm_DShiE77!(G9NKfrH=q zH*d5E1w5?)_&vV-PPkAsRvXjF1-^C2&4mJfdwQgyb5J1v3V`3^%x_u+PA6j0cCxgJ zaF5|ai90PM1i$ld-e?gDcv=DQdp!9);sQ6eldX=ZiS580_p$=NJw4LUIVg~S1;Fod z=Xc^zdfE;=svQqTHwRRwRVd(h{>>XLLIF=J0Dg}L^V1QGol_2 z&?-Vbr3(f8_Vh?Y=b%9T6#%~{g5OCON=-~X9*AxWswqF@0l)Ka-e?gDcv=DQd!qPF z$2ru+v{S(-orw8SDi=8T?dg$*&Ow3vD*%3vKflFZgycf0kFlz-axf6X{5$`aj25AQ z{}cefCyL*+mu$UatO7q8jM0gh_78b5|MuVTLyw_AP6~kE6U1-vAw8#!P)>xR+lCbT zDnjr(Crd_UDBwQ@!0(CTxA>60F2+uWV!MW-AKUgK1i$?^{Lo`4kdp%7_k{3!bQQSD zs*F|Ov30h+2*K~1EE$!dfd3Q#zbB60;y5*46VVO_W1EAT#RU$2`)~N6$50?A1;Fo# z<9Biuc;ZC*6fSV^J10vA~-uEE$!dfd3Q#zbBO6#zrV~oLY56IZS)W25A-e=yu@X zxBrG8dJF|}QULs(P=3o*;A%yXHbT+NtH8nUoGclYp@9Ds0KX@m-+G*m!>kHMcLvV; ziU<7m-|$0^p+HUwfZr3yZ{Y%O)Z_FDvuZfDKM*s!z`^gFEE$!dfd3Q#zbBgCNf&qx z?FAl+Z8Yr#4u1P@_@T#8ASVUD?+NGk$cOYgxxmYUs&s*a-#J+_DnkMPDFA*?G{55s zej6^7%20HBfX;GA9;XI=`)~N6$50?A1;Fo#5~Iu27m8HkjPxWK`0{|!I%7z*U10Qfyg{BB}#a)DO{qdSI_ z)j_r<#KG^JEE$!dfd3Q#zbA>`^c9bIg}G-ax-Q`Y2fzI{{Lo`4kdp%7_hj(9g&AM* zkPDnPvN|{v-2i^)WW=Zp1$?Ri_&q87=I6vKOgfJKctE_ug#W~+LlE7D0%KMH{GJSc z(-QCmzj;keKOKs0HC|zY-(xmnRD=RPRRH{+M1Jd>&Qhxi$94piH9-ddw@=3)x(x-! zssQ*sN&Kd-=*b0Muh4Py>b}G)%zf4MO)ahc0|SvrMALQ7c|0B;>;G5Og91>%`wD>H zlf`fPie8+>6IBln8DC+7-`*c?=phuys{-KnB=K9gz#BAH6V*-xBAdYPyxKJyg93g~ z0Q{azexGa9IGx2q8xfWTHTb{%FyPQfD3C`5!0*ZAx8VY>Q}xPWWqUw5P+bTAcOFd} zO+f+AD*%2^9>2v#;0-FTim1DXq6e$MZ_kf6bPx*UQvvXM^7w6R1kN~pg;^6-_YXx6 zRn=ntolo0FTTsC33V`2}%I{`IE^t;G(~brrhpWMFuMao$4+`W}0q}d0`5hO>(N_c` zN5JpAnl>7P0-jd@{GM!n(?+rls(v!89Krib&kr|r5DMf~0q}cL`Q2i;z=_}N^ssUi z{LZUsqcJGpc?H1lN#}RsEKK@}9{l$FXhR2~KzRZY!wvm|0(n&c{GMcf$Hhj3v=KP?omb07V^F~R z3V`1Qz;9YYNE?BJ-`*c?=phuys{-J60q~oapwub)arjU2YT9TF3V2=t@OyIkowz%F zMPIKHzj1zp=f@j52nF(~0Qg-9{HB8(jQKbColnz7TTsCB3V`1Q!0%@LT%*d4*Mi@k zA8+U&6v(Fn;P<5STPz{e!S8(9HQIs#eoz4Xo_u~MKH_c)mrnuP*TV4M{IzYBoht%)Vzn17G6t)qD; z;57xnZ}8h|HjVy30lz2!euLkBv32wl3V2Nc@Vij>eGdK;uMIBr2MUa{0^m3JJ)(?)8iKAI4;8_L0Z}8i*#*L0a0go#HeisJ6X$j$pI-I}b@zI9v zL4o`#0Dgnt`L!st1_hwNL@5A%7Yx5E>Kd9_TKfkEB9Vxu>zwm=JU&r&fcroJC~)B^ z0Dcz?zfXYQ7vA{66GMT?Q~>-g7=BmOH)8%hnPUO>h5{Fw0^oPS@Eh+hFSNmf=Y;~3 ztN{28eowLq;`UGg3XD+!@EiOdqv@a;6o3MgtN{3Zf$*EwqUelijM1-*u*83wrbQD$ zM8Z+yl72(OQIRg<@|O}ROI%ta1EDabh#=zhD*`2olxXOzh|4UBoEZ$6f9X<&&NBld zE+SM+rckK%tq?>Tci~zm zo(u{=0XGG}Z}8jAK9C0mpg`d&0Dgntg=?L7GAIBA+!O%6!EZPFKpqr;0)?vp_ziv+ zu65$cpa2wbQvm!1zuoKuc~Aff6s`i`H~3w+)`=&B0#LwB0q`6AcC!!UK>;XGxC(&Z z;CJC#C!P!nKmj)ez;E!|%|4I^1)xCTDgb_i--T6(>zrk-e`#>HPfC7c9 z0Qe1l7p`^U$)Erfa8m&M2EX0x19?yY3KXsa;5YbPxYmg$g91>%O#$#5{C2Ys@R00rC>0KdU+H~T;y z6o3MSs{r^7eiyEF;>n-@6mU}j{06_>>;rjF016bY0^m3JUAWeXCxZe|z)b=08~k>& z59C1sC{VZxfZyPE;acYf^JG7pdXXihd~{10x=dLNiBKRz1;B6cJ3~`JF=qub1apSP zobQ7iC~%$v;J4TL9goM)`#+A0aZn&bFlSh793Bu&dQ$=L+w1(ENW0CDPmM>mYoT^)%&E8su z6)o+^OQ#0io89xy6ZVQ5f3-BjX7gLj{v=Kh?^IGgk5eQT8r=8ZGk?7ADsv0Jx#dfg zIN04}snv9J+iQ!zB}#61ZZXxR0#wpm*F8=xSlUc`34Vj$X^kY~0(SGXR6Sk(-V1a8 z!Cs6~o-Xf3n);+sWrrRS=75%j= z+}l{O{+D-t^w`Z+yFQYM_9`+Kaw6}|Cio>%7H5D^7({IxXhy-RQNd-HEr z+6~s6BKh6hbn=Ore<`y*Tm7OK1TsZNEQ3#`%SeV5E$zrl*^W!Z=@u?k%vny=AHT$o`0NV7z3Uis?%=@xPHz$g?9B}Rh(pI#zBQLY6`0O=*Z!Z7%m4DIS zTJ6--&!>N0W>LgkQN+!;E(Ow7w6r5H?G-8I^(EgH1?;)9qKMeND6f`YdZwi^ZN&`R zcPd8hzyIhpPPy*sA~%!Y%sn3TJV!UYMs3>tC*&qK-;3Pg(mQTfNu*35zrTHj+x+|1 zl4Py`@VEa{;6Hyoc**?m^|wSR%v})~L$J`!dzT*OH~oEWx7lA__l333-tp;gSG|4D z)W@#)7n0wWnfh-_z9Pnfy#@35ptw^3r*uno`(;)YsUw#1hdzEmwrR;KOn%ctww%~W z&un>Gx|AIek=p(1>}7WR{wMZCOGR-x=3++0X`iFN(5M}!Mx4@9K1s?%Lb9b1dWA_P zQ!-fan{tW1lF;(~rMZ2YsT0&KEz`dh<}%sF$NK)#h2PJ4`V% zoI;bvWN1|N48us>xc7i<>5*6Y9Ssc-o-Jnk>Yd++g@>fIcGn+!bH)D=mo$xga@N0< z<&Um^Riw)l8Ijf93&`>^LcSUb^v3j=tN)IslCLbfWX;pJH5}TUVS|=p;_~$N_htJc z^5>uYK$f&*jUT_q+%@rp?><~i&un>Gx|AJ}5n455DQ5n^CbMLDb42FKh&flrWv(Sc zFGi@0C6O*gMW=MxY}$x@GVQ`|Dx9`KS%3!-v$M| z|M-#Gtj9lV<}<#TOcCi>{nFfB1PkrFcj;Arr*xjQo!sMMr2TC*pT2nax?e1+KeR~} zvsk?xuW1X|D>|io_|qF?YZP%RCezJ@sYfzhL|(e>f5-xstnuTwbXT+N=< zvX+dyQ7b+5==mxwHHj@Zkab7kCKOr+3spy9Jm?YW|&J>8Nb+jog%;;yDvjS4)kSQsIA|7bH!E^m3VRRO zmL7SP-?V1XVz4w(JD2@eMV3bB(qi3C1?=fADKxE=&AJp5S+XQW=#P3!`KOEjoh)F< zns|QG1GsnXgPetq*7McubnUGCI~ zJ>8O$@?Q4Dv|jKryFOC3Ed4O{Cviy`E5DumC$qj265Kt~%gbuDum1bM#eW_A+TR4f zH9hp5;^8s4y=4^(?YwvCReqn``i^A)(VvhmCP`W0fu6nZKE3^oN4si|$dZ;u=u&2h zh*JT3x_e4T)j_8QEfviVFwjwN$)#7AvVbLPQus~J;L^2&AN|_$kmgI-5sFBNnhQ9^ z%@t+bURY+CBlcos74}4#BI?RZr-=C$E^+d9r(9Jcnx!o9g^o)LE?M@LE$=&B>YB60 z%5SIjCtvxz;r9Mv@o-Hfe)*-ri~lb8wJ!wU+M;_8w|Vc8SNTmV%j_d*u&dE*hL$+J z+7wkDyW(F~@BUci+8eRdaw_1IPSxuVZhU6W-&zW6ef0sSJ6cMnd4Or3lLagl$B*Cg zj@fpNDw6Nq@|^NgHhZf4U708%DttZ0tpQjDatR~ISb7EZY`-TWj@ z@s#fxWeXxg#1)GNof;A87KgW(yb${>>C|Rcu5{7(So!^}D^sr@6qE1!ejGa);1~aw z;KhFxoK+Myqpl%(u09fP(a%w03p>{sJJ+lkaRjgOdw8gi)(lu|U%V%ihOaA8T6Q8X zxBT;c=E5)E{y#;!IZ?!Ab@u}96+ij;JWGL(AD`>qpyj^u($Ws~+9_)S_)WLYwrln! zG_pssBjv9@EE7fKjb+~zxkEiImMprI70r=cimiF-R(o}kB5q;NHQzeJxW)f1KBgpE zTcDeX-`c+Bgk0b$`CS0(2fzEp03p0+*6_(8{#D}l-v^7%=l6|?h2!)}a!(t(ak}x3 zz<2*^VAp8|etVVQG-7Co+ea0F`M?Ly(R^LXj z>r}ugT~vJUkvWzE^xibXJIY(9E{}&vd!Tdb-xCOdS{LaMbVfm-P>ES7T0_WeCPffl4`?8x1Bom$+wfGHJ zh3VxbU7iYR0?(CUoh~W-)3dP#m5ccG#lwfYIrx3y^4rBE#mKO`!0lBezuQjjCAWzz zu=A~-ibiCLj97-9OqY?g6$u9RzsKc!DcO#USng=Kl*N*fN#*z0x<+5eSbLG!+FbV3 zzBZc5)5`C(Qp*-7V!wqsSH_)+(RW7nEJ_g-?OC$H%p(?l+uIZ=g6rX|0j($jgu#3OBQ=>&Gl=bAV6u_Gl z@G!s0z-f86-Db@xlHXLg`B*v49qGHC&p!FBT&ZF%oMBuHtPBe$i%t6+EkMt_qA2N9 zo;pQ=7Mfe0A+7(!Qr>>)bVqy1(G=INi3VGa?-(s_I+Q|olbj@}=jhWuXWsQdHZqpy zOh@7qpS~sAH%BtRm+X#H#PUa=`7Y*oCQG-8%H}Fg@l0GX_NN^aza^C^Lf{dXV*is} zr`YBHm|X4Mq{r{Sdz9I-)?>d?XlbFi{PJH69;nCU+i?GTo8O_cT`!h=)ya4%-OO*h zol=TRU8gM3j#F;R^tI32F7KYQfF)5D&guy#h2QR7lO1_w;nyvFq)VAgkqyr;u@`Vk z5fzc-OsQo%LC_|-^8Ko z9!@g*=a0t-;p=xLeJ12onSN>T?LQkI_1t$?vdlmJ;Jmk+MyNd?T ze(;kY+Q)%NDFlAgSD5DU;q<8H^lZzEx)aauv|W=OIkEZo<_?Ou%oP#)$Cvgh=88_a zPU+$<_FVZGv_{A&*Pd=qk?pud$Q$kAMWL*$+|@1y4c_$dW8$|3tLFJPW$mqD zKb)Fe1x~;|KEUc?ye>w+MyOYK>Aa-x{44(^P=0Lm&E?u1`WG)6qSu-4tWNsNEjRM^ zrRVuA#tQjmX{iZ)KTjK;(7+;BH|<yfu7$mk(P^lK>;X`1HTE_mSEvA zU2fc?KmN1W?C&PsDc}5$!JB4=_tiSSusqbG@9#QqQf_b4t0|a&V>m(qD3Fx`Iq=)7 z9G$Fwf!|qKE(${dC;)yJ%qkb~8^aL_K!L0j0KdWStPBQ)p#T&p7zMy@@Vj7)5f1_d zpg>j%fZyPERtAH@Pyh-Pi~`^{_+2o@hzEfJP#`M>z;Ez7D}zB{C;$ZtMgi~}{4N+{ z#DhQqD3Fx`;5Yc4mBFAe6o3K+qX75~eiw`};z6JQ6v#>e@EiQj%3x3!3P6E^Q2_h~ zzYE3~@gPtD3S^}K_ziw%WiTiV1)xB|C;)zg-vwigcn~N61+r2A{06_XG8hzw0#Kk} z6ac@$?}9N#JO~tk0$C{leuLjx84LcflAV9s~+Nfvgk&zYB)n6?F|w zt!-xq1|yLO&cDpcicuH}_)`J!yI}ZzvaX?7@H-j>zx_EJ(Q7D>l>*>*!SMT3Lt{%@ z`@rB}1pLm*hEW&__*DV$yI}Zzy0NLXy<>22C>o9Gy3RR|$K!srOY|EGK!NlMTtxr< Ee>xFQZvX%Q literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ЗаставкаОбновленияКонфигурации/ЗаставкаОбновленияКонфигурации.mdo b/SSL/src/CommonPictures/ЗаставкаОбновленияКонфигурации/ЗаставкаОбновленияКонфигурации.mdo new file mode 100644 index 000000000..b987629b6 --- /dev/null +++ b/SSL/src/CommonPictures/ЗаставкаОбновленияКонфигурации/ЗаставкаОбновленияКонфигурации.mdo @@ -0,0 +1,8 @@ + + + ЗаставкаОбновленияКонфигурации + + ru + Заставка обновления конфигурации + + diff --git a/SSL/src/CommonPictures/Зашифрован/Picture.png b/SSL/src/CommonPictures/Зашифрован/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..9a02865c27eb464dcefa895df07aed5ed7bb17c3 GIT binary patch literal 342 zcmV-c0jd6pP)N#Gl$Y4 zBI+8xJs^Zw(hbry?FJM@an=B~ZMO%cl&7BO o<@AJ30Oh(ai=ybQ(-Tzt20w7-v=p5_x&QzG07*qoM6N<$f+n<&!vFvP literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/Зашифрован/Зашифрован.mdo b/SSL/src/CommonPictures/Зашифрован/Зашифрован.mdo new file mode 100644 index 000000000..3eb8c1134 --- /dev/null +++ b/SSL/src/CommonPictures/Зашифрован/Зашифрован.mdo @@ -0,0 +1,8 @@ + + + Зашифрован + + ru + Зашифрован + + diff --git a/SSL/src/CommonPictures/ЗначокЗаставкиОбновленияКонфигурации/Picture.ico b/SSL/src/CommonPictures/ЗначокЗаставкиОбновленияКонфигурации/Picture.ico new file mode 100644 index 0000000000000000000000000000000000000000..4dcdb185df18bb746458e4782361699bb6ea4a7c GIT binary patch literal 1150 zcmZQzU<5(|0R|vYV8~!$U=RbcG=LZ+qyWT>V3L8s0VszK{{R2ah!3yKunGp^M zH()n|Xb|2|?D>Cvp&J<6c;5QIuE6y_P~CT2_CGqlyUpkCt!+B{_J11`H=cd_*LT*2 zc95DqooT-xpWXX+YfbR~J)J2)oQ4wr9I^SP&ikJISBiM~-+SK+FqZLr`CmZm#eX)5 z>k~n41epWGU!gSI%^ + + ЗначокЗаставкиОбновленияКонфигурации + + ru + Значок заставки обновления конфигурации + + diff --git a/SSL/src/CommonPictures/ИерархическийСписок/Picture.png b/SSL/src/CommonPictures/ИерархическийСписок/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..724ac5395e459d2a68dfd906de4bdd18f6698943 GIT binary patch literal 431 zcmV;g0Z{&lP)gw_yCZy zB|+ceOg~!(Fbm{@yosxx1L^;N{{AJ1K_D=*@-s*u2(us?n>Ftc!^=-Uz-&%d7KWwS zPQ-Zu20p)j%E0*R4}|^u55qq!!NY{lfH@_RV0z7pWegz^u?)ZdVX=`JhXEk}{Qk!X zVKXo?96xppMd6c24;cc&q8QL)4Q{|6pl#ow&KH-KWzaSC>J zK~V_egXI4)u;Fk4Fxr0p`V9#Wpci0l3@`lqhrhz;gA3=+p7cmLYffxV66R#O1Yp}YV9002ovPDHLkV1fg0yng@y literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ИерархическийСписок/ИерархическийСписок.mdo b/SSL/src/CommonPictures/ИерархическийСписок/ИерархическийСписок.mdo new file mode 100644 index 000000000..dd8a18ece --- /dev/null +++ b/SSL/src/CommonPictures/ИерархическийСписок/ИерархическийСписок.mdo @@ -0,0 +1,8 @@ + + + ИерархическийСписок + + ru + Иерархический список + + diff --git a/SSL/src/CommonPictures/Информация/Picture.png b/SSL/src/CommonPictures/Информация/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..24fea125422918574eaa7c328593afa7b801be3a GIT binary patch literal 831 zcmV-F1Hk-=P)mlz^bYV1R@u!Jwc6J=05d z)6?avVlW=8MW-={pCp2mMxoN$eEUPS;QL)%NTW_Wb|3;npF;4lcc31cOd z4H~q_kw5TZ{o2llVK_nOdjy|{Aq1Ho1i^7}Ct)gD*P2x7I^n`V5OPVbs|v~*liK0- z=kd(e+AtA~Q0^L8=)UiZ;#xY)##@sKr}7j`mxJYfykA(B1eY$HMQKDsydj0SY9x17 z=U-6%Il4tg^*j%ZvAfaw_Jmc|jGxvac5NTCZ|3pv#$`Od*^5_m3(_ZIesu>bo4cA_ z*S+t!E>z~aRYWk#YufRfk}|dj)A8X4d7O-CQ0NBYTlhpwyMvk z(o7a0>jtpA5N^QHcDf5!A3TvyIFssu!#r?ZfzDM#RUM+{`{tK^ome_z)a`(J!MwbL zPXv40UokU&T@nmFdWM>YMkp0!V9>xKA$8V(W7}Xjx7oHh|psU%yp0r7>Z&B ze61J}Gn#6*tBU0Yeo6G2*~Ekl^x zUtdIREP|?1YEZEbLswBzYCu(i2z?8mh>4u-<=3F!I7vSsBc1>niaSel>ERwlOC(xS zvN&fRO?gLM9BLS#zTA+-*^LFfn|;1T!*@$eqB1x%1Uc7X*h#ZJ)qSxy*>e60Tpq!v z%^#8^QC)_ncmx~sGx+c}y+Xw!l)okPpXO+ND4%8vO>YVo$oXF>i}go<0RS}a5_tA7h|K^1002ov JPDHLkV1o8AavuNy literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/Информация/Информация.mdo b/SSL/src/CommonPictures/Информация/Информация.mdo new file mode 100644 index 000000000..93285ffab --- /dev/null +++ b/SSL/src/CommonPictures/Информация/Информация.mdo @@ -0,0 +1,8 @@ + + + Информация + + ru + Информация + + diff --git a/SSL/src/CommonPictures/Информация32/Picture.png b/SSL/src/CommonPictures/Информация32/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..dd7660e7506e02acd033273c94693ffd065e5f3d GIT binary patch literal 784 zcmV+r1MmEaP))Egmd6~lsEn(0OMIK!@zTa zVv74d@E7QGcU1( zjq~@@Awvh8G6j^u{xz1ICGZ%D)`*-cItUO7ur=}z0e1Zxfv|}@P9DzY!=J!b;hl_oxcOI3=YLy6&-1Gy!eGy(UWcRj@PLLdHj*sNQ||FHi^y z9?Gfi_oxDZI#*0LH?1Tjxi%A=E2toY~nVv-oNbss3W^N8RnMg@u35FNb zJWi?0O#%b#atR4?_ZAyJP4zmq$n^90-pO-;o`ioh$kn?rx+&FpC%^zotl9n5)`g=0 O0000 + + Информация32 + + ru + Информация (32x32) + + diff --git a/SSL/src/CommonPictures/ИспользоватьПользовательскийМакет/Picture.png b/SSL/src/CommonPictures/ИспользоватьПользовательскийМакет/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..8db50524ffc55cd0fce8f1e96507dfc9d163db7e GIT binary patch literal 662 zcmV;H0%`q;P)|diwsF6C4_LGbbvNGP~yVMq??G!n+g%6peX4?33ZWpQFvoA zgI#nXp@?+Qt~^DUhuoC4W~MG@&N;X5+q#g=)=c`tbMd_V|G(#bc^^gb+3F__QjY^k z{HHRQY3^>Sy9yvE6^g=4_1v1_bWv0q^#$te?Kok#OeV}PE!?i$OMaF}z!%2`-w!NrI^&`Me!on4d3g*#6h+#*hiR{nWJz2m%I! zAqt??YOy<~*ni>*j<##WiJ26fyiQN^O$rZ`EK|1vPy&R2j*gB<<>cfbiXyd-8yIvh zvGwph6oMK6m6$Lu6aHXGF@X^%kNJ!SE*LlkB)(QYBmB8g& zj~E)Y#{2|;bMiY?H|_x7^7vTvc#);hsd%;8A=oEuL(f`TJIhR^3E@D|?%b>acW6t^ z#dAu4%_*tm>i6-X)k5c>1CMu!MXwjhA1GOKVpuzikA!v<8++68i;ji+zdb^1Y*i9c w-@I$CYIeBi{l7fx0%n(77v_ii`q%UP2E07$$tPt!P5=M^07*qoM6N<$g2d1`<^TWy literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ИспользоватьПользовательскийМакет/ИспользоватьПользовательскийМакет.mdo b/SSL/src/CommonPictures/ИспользоватьПользовательскийМакет/ИспользоватьПользовательскийМакет.mdo new file mode 100644 index 000000000..ad39e2d9c --- /dev/null +++ b/SSL/src/CommonPictures/ИспользоватьПользовательскийМакет/ИспользоватьПользовательскийМакет.mdo @@ -0,0 +1,8 @@ + + + ИспользоватьПользовательскийМакет + + ru + Использовать пользовательский макет + + diff --git a/SSL/src/CommonPictures/ИспользоватьПоставляемыйМакет/Picture.png b/SSL/src/CommonPictures/ИспользоватьПоставляемыйМакет/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d87692bb66501b090e0103990041f8c395a8f7 GIT binary patch literal 503 zcmV-K(zx`}Y z(_56AMO*^Nn~+E(DheWz2!TMr;yGcK8{~2Zu~@9?R87;Ydt3F z-*44*qe2345%nrO9uMhX+bD`cCX>PKc5|<%pUuz7VuQ}xZHft`QYot#kH-O+ntRLe z^8v!auBy+ITAYo|xx8MKKvh+IJ|COuEoSEzI6D4M_x*Ddv(&)ZP*?AiC5)!RU-Ejr z1+$+SX6F}>W%;~dR@i|oOT@>g`H|kL7;|U$H-lr70NCyJVuL?_HTBJMGT;C7iKA3F z@oM@3zzv7vH2N^Q{XY5O?z@%MwWE{#$Er)YiaX&)rav70*4hzze923Dq;gpSI{L<8 t_F!aBUH?+8=URiklkAH_b>sVWJ!g3lwtp)(!La}U002ovPDHLkV1gLD> literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ИспользоватьПоставляемыйМакет/ИспользоватьПоставляемыйМакет.mdo b/SSL/src/CommonPictures/ИспользоватьПоставляемыйМакет/ИспользоватьПоставляемыйМакет.mdo new file mode 100644 index 000000000..fb2ead6c4 --- /dev/null +++ b/SSL/src/CommonPictures/ИспользоватьПоставляемыйМакет/ИспользоватьПоставляемыйМакет.mdo @@ -0,0 +1,8 @@ + + + ИспользоватьПоставляемыйМакет + + ru + Использовать поставляемый макет + + diff --git a/SSL/src/CommonPictures/ИсторияВерсий/Picture.png b/SSL/src/CommonPictures/ИсторияВерсий/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb42cebadcf66cd3b8e1dc1d4c5c974b3b1017c GIT binary patch literal 751 zcmVRkalvXMUBHFRCq9~#WiGJ8ZW(D~pq7p3nQB)AE5ZOXF z8Ag=az7ptYkyy59Hib^xWX;T-d%x3Jk8mdBke(68^65MNn@Mznf7U7)7LC%&>+t&nR9DwhQ&Y>`+qY?|e}ZOy*X$~&0qCob|M;LP9?s3rP8q zL1W`{?2{}WKdp-bMrLKBRCq1j_tRi>$uxo|y;vf6+LEx;H3V3D*F|yaG7P0NAaz6( z(D|i{Krj>rBs%Oo+*!+HOE8pBT3CjuK#6cKcOHW(9})N!psMPz09pj{(bKsZKyR0G zuBQ)r<~!y(7#f#GPzfOsnuD)ttZ~y7U*j4!WbeYA+m`Sz*(MC!Qr_~T!c~3cEVb=! zoaSUUX$t^va~8^*KhI+cma- hL3#0_jhFrh_zfOmWO1`l1PA~C002ovPDHLkV1lwqX}bUb literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ИсторияВерсий/ИсторияВерсий.mdo b/SSL/src/CommonPictures/ИсторияВерсий/ИсторияВерсий.mdo new file mode 100644 index 000000000..748ac2890 --- /dev/null +++ b/SSL/src/CommonPictures/ИсторияВерсий/ИсторияВерсий.mdo @@ -0,0 +1,8 @@ + + + ИсторияВерсий + + ru + История версий + + diff --git a/SSL/src/CommonPictures/КартинкаВДеревеСвойств/Picture.png b/SSL/src/CommonPictures/КартинкаВДеревеСвойств/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..37c958e024b8d3ce7b6daa7b0e3dd49488d00765 GIT binary patch literal 631 zcmV--0*L*IP)!Uj}d)V90QDGS(=2?Cv6D2XSw^Bl;QucnO9mEJpruby zWO!vA7=_<4`5&6$^qQHKm4TI&4JLb$jrHvsgUDkuU;Hb^kHh2sw)0x<6#H0L(kt} zoU5(~)-q96`hWi8r;G$0@bB**hW~%QGW`Ai0=p_S7ySGA9!2`gkKaJo|Km-+{}8Mq z`R08_kfT2R`TLu=Gyrk{2><%dK$Hvqpysah$4~gsbwuC3Pkb6+VqyYj2WAGwf9%9% z{Qs;}D~KQ=@DJoe4j|?yQrmYbI{=vf{{xwfEFwf{Vr2RTBp9g~0{ + + КартинкаВДеревеСвойств + + ru + Картинка в дереве свойств + + diff --git a/SSL/src/CommonPictures/КартинкаЗакончитьРедактирование/Picture.png b/SSL/src/CommonPictures/КартинкаЗакончитьРедактирование/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..5710ba6b8d1c7f16ad3a2858b30b3b90f2328859 GIT binary patch literal 755 zcmVE~2qDti!k<7Z%?6bafk6;KNr4sAMIkjT2%)-?y67T}ya^L8EJlb#f=UFTN##%3 zmeZ+cTW9CY{hhCK1{*WiO%J?$@6Y!<=l#z2eiR`D3XZnluhr+U{ozo^$S@2 zI#poo#RJ!QTdglctwE*5f>}2ow@Ql@l0xq4~5@1ZM|ll%w$_A1>fTiw)9V>vbQ zS*Uw5^eNANw=-VrxOofLTARXq3w?tN)1%$o-01j;jtOzY5qK_ea!+M`PYmm5JYWQy zUmqtbxPG=C)@?y`z_;F_V@)kn^J~ZD^uPuIgP!!1?A!%ofjJ&G7XS=%B2><#3VVy~T3qkissI}Qpv)dsd6NIKfq!6N_ z2Y&ZAc)w30ur!ta8dWNUq_9^L@eCtV9fsg~56(Fcfe%6O2eGmoM2=nqQ(3Y6k!5j{ zKrAAyhGLn;tcFdhXJk;w($b)#6jUYxwx|SNuLzoE{F~>1khamGao#zz2$AQ($U+*u z85*__y4+&qlvQBG!{f{3q9E_RuxSnyJa6A&14SK{ho*&+U!+{qA{N!irHGs-G)+H~ llaAI$UkB3){15&JFaX5AB)>&)8J++D002ovPDHLkV1n-TS9bsa literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/КартинкаЗакончитьРедактирование/КартинкаЗакончитьРедактирование.mdo b/SSL/src/CommonPictures/КартинкаЗакончитьРедактирование/КартинкаЗакончитьРедактирование.mdo new file mode 100644 index 000000000..d8fa8dc7e --- /dev/null +++ b/SSL/src/CommonPictures/КартинкаЗакончитьРедактирование/КартинкаЗакончитьРедактирование.mdo @@ -0,0 +1,8 @@ + + + КартинкаЗакончитьРедактирование + + ru + Картинка закончить редактирование + + diff --git a/SSL/src/CommonPictures/КартинкаЗанять/Picture.png b/SSL/src/CommonPictures/КартинкаЗанять/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..adfc96cad97ac2289167a635bd32bb06d2ea85cc GIT binary patch literal 731 zcmV<10wn#3P)0x;zuyF zww5m4?$^vXyY1FO!b@iN&71lC=Dpv0L$5B?>Bl0GNX7HK zwXIU&Q!f9)4etinb^;%~zklH7xeJ%3T-T+kR0^hPLi&(on=|j;KKQY=`bv`Ukbt7i zV(HAI%U7?DFD-s0b2A@!y>7jcaGf2CY5o%!;4L1eSpF3YHlv}3jrFvbr0|1G0RWSX;KJU2N#Q!bT= zuIu2Qhg}IMrK`olhVOFhFrp|^po5L`}2x=|Y zEpb#*b-<}D!}z-aJvj*5TOp%|vi<`i&|uT3D}Hf8$bOp)wkg0}y|I`kGfIK;PPkS$ zLxOCS4bsZMaXk`d>aZw0B?2`XYpASsfW{60wV$w90(w&#U%D27WxJ%QG=yvuw`EIf z%{EaBjF#YKi8MXO0@tpkPiz>TJR z;B0<}rnsCcje(+#dOU}K-(8sh{mkK%U{|X`Q$4;nZcG#nJ0SQczyM!0A!z=go8$lh N002ovPDHLkV1mo@P}Tqd literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/КартинкаЗанять/КартинкаЗанять.mdo b/SSL/src/CommonPictures/КартинкаЗанять/КартинкаЗанять.mdo new file mode 100644 index 000000000..5ad7f4a5e --- /dev/null +++ b/SSL/src/CommonPictures/КартинкаЗанять/КартинкаЗанять.mdo @@ -0,0 +1,8 @@ + + + КартинкаЗанять + + ru + Картинка занять + + diff --git a/SSL/src/CommonPictures/КартинкаОпубликовать/Picture.png b/SSL/src/CommonPictures/КартинкаОпубликовать/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..7ffee0b12d0c72fe20c9f8ac136ab01324098032 GIT binary patch literal 675 zcmV;U0$lxxP)4DJm8hMOnM|UY%$P~Zv>{ytyl~)g@44sQ&wGRXV5OYM*WQ4(>$01k!%lo~r+6p;E0$-=cFvYz^gLA)vj{XDr zn4UCXiA{lya|p4*g_0S_cJ9~}ybkujJ2MEU^#u9@4`DFspw*~x%4Ju0!ya#CNd^8{ zdbzdkBJ9>0up*OBwpE#sO-m3(QGwidV_o&mZCemTpvis~^AlkhbtH89jRFOUP#`be zVXvy#wuMYC+I6oJ8j`@DxQK){llKQky8X-)@_w z6EvOffThw6NkySK8KqVxeYZ!R^|lsOF!F##B+ej{$tXT6 zRe^W6+))3{4byxaZ0H3dKZA%Zg+UNFqRe1%EyghXUnB$#(gdkMt<{zHl*gtP*N!&S zV{TyqJkKix%H=3eKsKAjgckQfsEAFUL0#r&`abUecCyo7Lg?^!{3ZfQ4C#^yAas^!__Tw4)lUEb002ov JPDHLkV1l>+HT3`h literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/КартинкаОпубликовать/КартинкаОпубликовать.mdo b/SSL/src/CommonPictures/КартинкаОпубликовать/КартинкаОпубликовать.mdo new file mode 100644 index 000000000..079540a85 --- /dev/null +++ b/SSL/src/CommonPictures/КартинкаОпубликовать/КартинкаОпубликовать.mdo @@ -0,0 +1,8 @@ + + + КартинкаОпубликовать + + ru + Картинка опубликовать + + diff --git a/SSL/src/CommonPictures/КартинкаОсвободить/Picture.png b/SSL/src/CommonPictures/КартинкаОсвободить/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..043029b5f7399ad6b9189cb37c243aa278ace9c8 GIT binary patch literal 751 zcmVs{8U3cAG zS}IM{45WOD3Jal-qTYf&DCq04hd|LDw0emkq1vciwTIq=$;0;>ExSuV#FcU2(I;Z2OGDyTsnU8^pN8?G!luxFboJEf^2o{)yo@S78jmSRIxxb zcKgh^3q7+lAIRj`D9h)~=OQW^jYd!HX>SkjJJ50WXC`}5szxBo@-Z>U)WkT?8^+=I z;L!Pdj}m8BR?!KcTrRk5LxCm9F76S+=;+9yD*}65z{~rks%Bfsi>D7!t3rA`e2|y%t4F#f5;w2+ z`5K#=p{lAxsTRA{+}1+2?Y;~mhfpEvT<2oo-Wuk{2gt|SY+L{dQ5(~?EUhq8*UCie z+D>48vJa6kN1(=6ysCuu3Mv(LZVvjdWoY4@u-ti4?2q2=x3+C}8oAuGR7iw#p{?P; zGB}u{m4>H?h$3LD29D`evMZ&@x%%MFK*4LJl}K&R4_ER*_6LfPq^O{QCLs3}rWb;S zKMf~T>DaL~EPwj3>d|sl!G$Eu67uCrha_skqiHxs9^7^|sFW*5wcd$D_KR0*#H*1~ zBdMDNNdSt!R^Y+EL@Jr>c;p`fusl3Nhm}s2mW~WLXu!>-;8{8ls>k2IhL=~AF^_$l zd4^bhJ#14)$}FESmw@C_(e+2`V6T3LB01|#MI}=7DFN%9p89^@W|W|+WueF}+Z@#U hD@aPWiUhv}7y#*l8j(yy(f|Me002ovPDHLkV1k3CYMKB5 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/КартинкаОсвободить/КартинкаОсвободить.mdo b/SSL/src/CommonPictures/КартинкаОсвободить/КартинкаОсвободить.mdo new file mode 100644 index 000000000..69c8ac1dc --- /dev/null +++ b/SSL/src/CommonPictures/КартинкаОсвободить/КартинкаОсвободить.mdo @@ -0,0 +1,8 @@ + + + КартинкаОсвободить + + ru + Картинка освободить + + diff --git a/SSL/src/CommonPictures/КартинкаОткрыть/Picture.png b/SSL/src/CommonPictures/КартинкаОткрыть/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..f8afd949752c76bdc74ded86373aafdc2cd1962a GIT binary patch literal 441 zcmV;q0Y?6bP)?K&fWXOu(|-`Cnb4V z4BP+x`v+$;GBPrJ{q%tWs{w!hK`=hR#*8BxLEtwqNnF4CnBnW!uUIv6b8|E3s>$It z;McFe4C3PAcwO-K&wtzo`~~7W4}mWD_6@rWxVRVuwUqI=;P)Q}5m9jl5qvKA_YaQ? z{`_UQd;dPeH#8S8LTN6b3uFW|aT_2kz|G)jrq95{h-NF2w>fde!iDo^PkW}GB`OCB jb28n6yN=TA3=m)dP7S0cIbPH}00000NkvXXu0mjfP{GMT literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/КартинкаОткрыть/КартинкаОткрыть.mdo b/SSL/src/CommonPictures/КартинкаОткрыть/КартинкаОткрыть.mdo new file mode 100644 index 000000000..aa0ed2e44 --- /dev/null +++ b/SSL/src/CommonPictures/КартинкаОткрыть/КартинкаОткрыть.mdo @@ -0,0 +1,8 @@ + + + КартинкаОткрыть + + ru + Картинка открыть + + diff --git a/SSL/src/CommonPictures/КартинкаРедактировать/Picture.png b/SSL/src/CommonPictures/КартинкаРедактировать/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..b8265ecc18d7096717121994f72a5c1c024c3f71 GIT binary patch literal 645 zcmV;00($+4P)RCwBA`2YVu0}SiLij*SriNTB@ z0t9@!t*&!fJ=b`@P4$76MA{_=B)~5$%JA{+YX*6KmIZ}z0qc?FAU4Mf&uV_;{{Ptj zDgVQcDEx0-Rr3GuzkmP#{QV2TfByboviHpYL+5Y&?_0P&5ZMLH2l!?dafvfmeqemh z@PqvwLzGS;!^RJD7>;kd!k{N>$?)vuYX(69eujH*J~0UMa4?7o3x==Tb>xzzzQzrZ z1DFmJJ@5PY@Yl3=SAQ{_yLO#n@8iu31=b}D4;6PaEIicBprNb)b}2h22gBo!-x(gg z`@-<>C8%GS_5? zb~0vo_w2qHiUA-X#S?YfT{eaRWXSC+&l%PQ-DLRxN|52o>*HX*{`>b2j6v+LpFY6D zkOetFOM{;y?V(9~37ICl03!;IDa3{M|@VEFTo0gOR_jTt2lP!0GEjL}@5W`>5P z1q@f2+ZaAF{$=?3{V&7Qmv0yzJ%7!>&CSiAt0srrfM37|AF4u5 zUNHUl&wtzo`~~6*H}5li{q~Ik8{p>RVi43)#^ZwDe;7nW#Ti5xa06fh!{dTKe;MxH zzt8Xu%>|55nhWRx839e)1_%pqGdP;*1H%E$RwQq8;);a}=g*$@Og+m$3=rmIx&?O~ fEH{!100ImEY33h%mxLlv00000NkvXXu0mjfev&SE literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/КартинкаРедактировать/КартинкаРедактировать.mdo b/SSL/src/CommonPictures/КартинкаРедактировать/КартинкаРедактировать.mdo new file mode 100644 index 000000000..1c587662d --- /dev/null +++ b/SSL/src/CommonPictures/КартинкаРедактировать/КартинкаРедактировать.mdo @@ -0,0 +1,8 @@ + + + КартинкаРедактировать + + ru + Картинка редактировать + + diff --git a/SSL/src/CommonPictures/КартинкаСохранитьКак/Picture.png b/SSL/src/CommonPictures/КартинкаСохранитьКак/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..4e9282921ef9c80c554e027343dd2bbcc0a8be74 GIT binary patch literal 649 zcmV;40(Sk0P)SGYkW>EEbDB42Q!T@pv4PB#q_#em^pq4ASZJ z3MjyYKPE0ElgUD@Rx@(BoI$N#uN&2B)o8cdMmC#e>u5CkUKpZ2THjnHL*#Jz)iU6( zHk(bfS}o|h4zd9p$HD9MqSx!8(P%)^GzcTiB5NymZtH^qE8KWeWd;3yA10Ft!C>%T zA&pa~jD^YGx62j$>2$Hz*k>o(?RKP6DGUfO-C#DG;c~fHZYIF#lS|-v4)5NGAR55! zcEjm(PKiu&6m$xpvMb{^VX#knFPF;@MG?hf5mXOqHk%EhP>AIy1AcTf4V*f09Ls@o zaENxuvdm7Rf+Z3OCMb=O+h8MQFb1Fv07VCMgQ)FWLO!2|q9_=?6)G-uRaH?cl~`=7 zg#%LeP1;4L(}C~I1w?P$#LKN$EO+H}rZ8Kvi{kJRUX| zj|sRKI6EbtWzK}Hw;%RyUB7%~iUDDd?-jzJ+nxEm=dD&m0)9MAzxY7_rdv=CG%UJ2 zSj5prAKIvmGthKMJ3Hu3FyIbHD`DVsoIe_1!7-0(mzKeE6Q_=RSc?g>0ls`Le2hIP j;D2nv!fy}fe+3u-chMg~5@QH400000NkvXXu0mjfCq) + + КартинкаСохранитьКак + + ru + Картинка сохранить как + + diff --git a/SSL/src/CommonPictures/КоллекцияВариантыВажностиЗадачи/Picture.png b/SSL/src/CommonPictures/КоллекцияВариантыВажностиЗадачи/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..8a2626b491040f462fa2363ee6198056f27be5d9 GIT binary patch literal 589 zcmV-T0yI#GFKD+ZzV>6?KTtTa^?K3=**a+oLBs zFg7*?O!#y&G5iPP0R+2$zJ134!XP$DNr>_Pf4J`$2d=2S^ZD+5IGbUpB_Uw3c^z1k zK8CSL@&F4969X#?GnoCK@$W$T;{?eS83=$J&%^?eW*yjwm`bzn#qj;-Uod|B;V*-+ zsw@LY4y1-&j(_cC8u8Rh{uu~^*fbRhA8mksVL> z*5-?c3{2lXGyMMZ=QCCXpwNV2WB`f@^T@*gAPi#T(nCx9%F`s`l!oy49byd6Kx}Mk b00ImE1dcP^Od>0200000NkvXXu0mjfpePOE literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/КоллекцияВариантыВажностиЗадачи/КоллекцияВариантыВажностиЗадачи.mdo b/SSL/src/CommonPictures/КоллекцияВариантыВажностиЗадачи/КоллекцияВариантыВажностиЗадачи.mdo new file mode 100644 index 000000000..737b54023 --- /dev/null +++ b/SSL/src/CommonPictures/КоллекцияВариантыВажностиЗадачи/КоллекцияВариантыВажностиЗадачи.mdo @@ -0,0 +1,8 @@ + + + КоллекцияВариантыВажностиЗадачи + + ru + Коллекция варианты важности задачи + + diff --git a/SSL/src/CommonPictures/КоллекцияВидыАктивныхПользователей/Picture.png b/SSL/src/CommonPictures/КоллекцияВидыАктивныхПользователей/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..60a86cbba0c297adaea75ec9f96f58e86e99ada8 GIT binary patch literal 775 zcmV+i1Ni)jP)y6fGf4=dc4d zzcx@)&&SSjXX`zSNqB~OF2n~8hxd8U`}_aSw<;QqVl7LJH7?EK#)0Au+w3;8yLT{9 z77<0*%;_&YKS!^B9+(_hDO3qVCSc7s)$G`wS8<}O1pM3|P`{{(jAS85rY@{hKnX*3 z3wj49$_sPSuy<<)_F0XvWNYCMG7cq|RS83O1-|wN4Y}z8<|c+A3L%&?!l1_JO-clm zFk}J^m6l#Q=-;VMT8D@zK;UScv}=DT5m3UA3GB~{G%{1;4QjO-(MSYhSU|~^ltv{2 zN*FSM0_VN1(e69-+Ksl;x}x%QHt2n?)@Yt75r{MR>EUBgB_Y*R_{zA;nUJA!xm*ha z)45wY1^VRkmBsqYZ#!OVdU|?r#Bqwb?U}g}oStp@QtKF5F1+f^NQ`mZoK~5inPQT9 z{eijQrM7Q36EW2Pg%^=s-N9_F`$6k-O;b}73QXYtVEN1NxjiG(L)NVlMZY>y_N+z6B&KAOe&bJ5k_0=wM~pU(&KFkxN@ zgJC!)!*YIdY|Ro5X9Z#2$@2m}_-1hJemgStI;_{Gf}vTE^)iMeP;IqZq0{NII-fp9 zCuzjPDT>0GYBxR(jgiGHc#d~0B|yR*A)W`vg}|~Q2w@RC8LP+~&2kADlEB5jzP@gY z#R8kn7Hh`Ct7@;}CB>rk(*Svucu4T2ieCt4Kr + + КоллекцияВидыАктивныхПользователей + + ru + Виды активных пользователей + + Коллекция видов активных пользователей + diff --git a/SSL/src/CommonPictures/КоллекцияВидыСобытийЖурналаРегистрации/Picture.png b/SSL/src/CommonPictures/КоллекцияВидыСобытийЖурналаРегистрации/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..34dbb581108b430538f54b37ca97bce646ca723e GIT binary patch literal 4275 zcmV;k5KQlhP)eanCpg zNlrB91adNyF_Y+Y>71DnHOit0(jd@4nkCu|4M@{XZ&lS*uU;*0nLnB)fHZ1we&@VX z@74X?@BMx6z31NFB5)CDX=%v^Zm`*G0f1aCHw0{0x^!v$V)|prT?KeP8N}QG>gVkf z4u?bGaQJ?o*ZUPClP(439TrDjvGh?xs2f*j^C6+E- zx|=V+17PjiwR!j6d#?$kKX0FKI2>5CXwj0gva+jlxt!nWbXvNu4E`QlIx2K zivQO#4gF-dv}nrn>vn!d7kSN^H4ogFFFYN{_u725laSqBuq<-P7(*W)razv@eu(?W z_uhN&Zvp-9r#-d}EiEm}fp5B8E>V&sOw+_PO;V|p+27y)rTkxN6m^!3i9&u08mwxW5PN(&*uC5pN z@87>Z5{VdJ24QLRrKP21035ceSW_%1P%Hl64hf<(J|rsS#Z^VSZ7*>$ck3 z+RZz6?i{=XuJGtBb6)i%SAy!fgsEBw5Fz}xkW`qd-v_zH+(7ncieHu6AcXwMZsXuCI~`#Bog`a zSjuM>|3}r;)pt&rGDRvYD??EfL{S95>2y+3Qi9v<7E`IzY=^_)C@d`8cj(X|>vDNZ zXACH;tg6}`sGU)#6W>+Hyo#@@Mad#9tw)}Qa*RhM~KlRj8E3fm}ADKR9j(~1}ra~qI zdJeK_tYiW!7DdvtR9008@gpB!T{FAs=+>=U_h0S=08F1g-M3`Pl3$mXmzVkdel$%Z zoleu*+RE|c$MN}mn5K!_?Z)A7_(f4{dgq;Y-Ucpu60Tjlc5X>Y$sLm>O~UW@bL`l$ zP+eW!{;gZLUiA99{r20xR#jECtiHZpFin$OE=M+-Mb~w5xg46NkxV8r41?0rQX!E@ zOfd}O)b{P$k6bQy5n$oMg--;l>&ud!N=_$p^r=}kZQaQ~-+47JF29C%KiEZ|n&osd zN4B7j(g{~qHa0dsJqD&=x92@(n;Zn84uo>-Q;KoB0*_xzIUEj$CfICGO|1+GR(uHK zqXXpHc97e@3*-0^jAKX0ZQDrp-8abY*n)ZLBnzjE7u`AS`FrlUCwRFN0I*`kiWSAh z#X+aj$?)(ni9~{J+qSW6*)qQKo$s(?#}1OoB#A@jdhaSJDG^jv<-~~-baZsk+1W{NZ!f*Qy&ODvkoNX=KKke* z1_uYJs;Ux1QT*Ps&pw-fx!lEYI2_Q@>3ghTErV*7AvHrhl_jeilzC)90J6G4JT=lb zsAf?rrx70>z9$?G2QCEMd2jeO_oT8Jj@mi2-STaAU3DvYQ@?_%wxD_UJ&o60s9#V} zaKjXbmTzS=%-&Pze?36n@*g5q){%bqEwX!BvCUb4=bu&!#)&SBlgF_VF=n}>Ah76i zCjjsOw*~?MQmGWlWD-?X(RH2D(oz6&xg4of3RP7}CX5J@ix)2@6bf

    VYyGGn6Y z7S&fw+8`p z4Ox}}5Jiz-Feu)6=ba5Nzx?u+bNMTZ^6lE%S_DBL7!0DSDwbt2e*AbkIy#mEd(RzT z6vfF7hl6xFO*)-M*L4maJjgZITr;vjvdmRiUB!nVeu!mRBoYa9UB~bDW3$-`FPFb; zy4`h#WJAwpNoNew8H22D(SPz7n;yAM0C4=vdMj8`j^Oi|O-3AF0F%`XPMvGQNqS=Kq-Ac-^x1_nh4XDK%9h>LNyB2q9xYHbd&A z7fHYOmZdb`Bmks0y>6v`_X|W{04trwj2kG1K{6qJ>I6DRZUJrtI)E-<{l%0D3JS^u zK|t4aGMNnNbQ;q%>F(}k&6+g;JoL~*l$Ms_^?DHm0lVFfD2n8Axsr3SzW@F2&kcn_ zbtNSwq|+mjpUdSUo6S;JS4UxC;qOPWHOnq<;#~}l)sql?#^n- z1ZrZKL_A778YMO~L^PfRU?`Tbl4^=XJWf0sB@vIJCWc9=D%ouI+)zZYOZLb7Go6s@ z1#=iNC?N(VFcP5mP6X`OjuQ+iq$p3)31^1}w;BK@#~4 z7q|xa0q`p>aaAM|iJYpcBoYY{i3G7&jG>_+VzC$ir%s(h(=_7oII&oaL?S^lnMBhx z+-~=I{1ru6K5^nia=9FqWu1*6EXzXIb?WQuDJUpdaiI;eETii>mSrJ|BC;%Fnj-vg$BuJjU?Q zAhDrAQmK)gN55u}NvBC`DTapzQR6YP>M*hX9)J_0K#}XFe64W0cY1!sVMw+@x(m4^ zid+(f{wE>PO7Y~Q6i)HYZ@Hp)!Dzp9PCw9N+5rno5WsH7`HknG z;j2R4iXVa`flWpbL{hRsQHitW5_2&AocE5gls^9W726-1*^VzC&is?y)zkE*JDqd4FC*0<)CmzURuLLt)WG?`3>{QP`89uI?qgJ_yY zU0of;#l_R+&!2zR7f2)$U8?%G{E{FDG&MCbZ{9rG+S=&t?WMW7ndau^vrgrx6c-nl zj>Sus<+J>CT_2OboYl0=AN{4xxax}8lFKfTkOeZj1(ror%~*YL4J->uuuxw+xN&3K zD1Sv!R!p8enOrW1uIr@JX_hQm0>J6hr$-WMmc@)2GdOtg;0n(80`YkK$mp>y%QCVo zGi%l?wr}6gjvYIYWtnI+N>fu4`}XZaQ4|cr;P~<5magmD#^R-_>N~owcgV6lUKGVK z`OA?=WGEaCuZw=X`~JdlSCZ97j-G@p;&(ZOj^3DMlST3snLwUQq1(pEy<0F0V;wLA zu=dKz+skJ8rxi>zAZG#+l>CvQTkirOxc-lD`g?#$#cYYPhTyzMKRJ2*Q-hgJ!C>&M zf9)JlAHH_F%X8`oXc^)U-EE~`e+Bzh^8m=a^(yg)?zSu~iQsXP^oQ7Y;@Iim{O&hz zjzx?y?)-~LVrXdS^&>})EGaK9KfCyXAW&3PL?V$umSq%0!R2z{@p#z3e?PHU>~$ak zaP!SK&#S4asTntJ9Hwa^2m-~$#r*P@zr-|69(dpZ1_lNIm_B_vTefVO*4WtCuxHPn zwm08=b7xUeQF`&>#Y!@nMAvm*c;N*As;fs_thTl`+S*3;nxZH;91fx*GG=yltULcg z5dk8R$YURDe4{&a{4bRG9E7}f@|6*fcYMevh^9`+Yp2ZTV7Ox!o7cZ~V&le*kDS2} zY@*}ws_O$F*g(t!$qS+#Wx_ZP4rM{GpZPBj1RGb}62hJ5dlF#Xx^<~O)&37}?m1xE zCN&`D*>PMk5l6!uB$o@xS( z!3Q4f610_wPpeyIignGiT03 z6vgw7=s+MqPfrhmAe{HiojVt=*L&9)wM_-4$2;F|ejGk}&XEW$Mphv+>0R{w~904C%1xO&d zKnj4Zgl8uG!P?(D;EI3-c&@vC(bpE01^?~GO_N2d^8knvVlD#?CzivBl}TY$P2^|q z?=z{M@YFNUJo7YPVm&}nl!}IihR0{knpHD(>Qn$aJ39dg27~x~K6dZk&9-gZj<&bA zKMs5XBZ(ZF&Gy=J&pk&rn>|}Quq+F|-w$xsp&Y%#?RGoMmMyd1d+)uQfJ|d!W1hp| zm|I_8|I-Bv76=0a1Lrw=qfTN$K>?dLZ??Q%?@PyzAOFLbQ4bI<__j}*Hf@#7X8Y;% znR6t2o(t2o$fT0A?bv2$n)YmGXXle#kOF&`i`A=N z;s2=^G-=YLwho!EruG!_~<*ODfSl}otE5q$}1CU50 z=;TDBYP~3kdprKRw^h@$Q=eyy%M@2I7@TRd*?a)G zTrM^+Fz{LBU8;*c|`>002ovPDHLkV1fkDNr?ae literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/КоллекцияВидыСобытийЖурналаРегистрации/КоллекцияВидыСобытийЖурналаРегистрации.mdo b/SSL/src/CommonPictures/КоллекцияВидыСобытийЖурналаРегистрации/КоллекцияВидыСобытийЖурналаРегистрации.mdo new file mode 100644 index 000000000..eb40c030e --- /dev/null +++ b/SSL/src/CommonPictures/КоллекцияВидыСобытийЖурналаРегистрации/КоллекцияВидыСобытийЖурналаРегистрации.mdo @@ -0,0 +1,9 @@ + + + КоллекцияВидыСобытийЖурналаРегистрации + + ru + Виды событий журнала регистрации + + Коллекция картинок видов событий + diff --git a/SSL/src/CommonPictures/КоллекцияДляПомеченныхНаУдалениеОбъектов/Picture.png b/SSL/src/CommonPictures/КоллекцияДляПомеченныхНаУдалениеОбъектов/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..22b442f0849eb48d33c37f9fe50c1c8fc4ecbe9d GIT binary patch literal 707 zcmV;!0zCbRP) zx{hUSCDvyBkz7vQe>poHHC+UH1$4Q7dvg3mWL`^Vgleu((h4=nkZ&7X+QQ1J7=HUs zBQ_H)d$Y*S3Ox6n;o)}LIVWo|6tW7?6a$a#8S2X3e^V9CL|0&IP9)W@ z6v8%8F4vIGuH*fOkDvjosn0;Qwu$xP21JPkMca`sh{$IJ$jA0O0Np__wIW214ZF~&YQ2#Eg@08;bVS|6 zRs(yIZ#x4Fz4yw4T9w=h{~W~m)%jw)NAhj>xgz4-$oEu%1}t3zAT6>rjO!$NEgxx- zJ>!4pouZzhE&@setRjL@WUx|&yvbOVAuGBG_0+T%8A + + КоллекцияДляПомеченныхНаУдалениеОбъектов + + ru + Картинки для помеченных на удаление объектов + + коллекция картинок для обработки удаления помеченных объектов + diff --git a/SSL/src/CommonPictures/КоллекцияКартинокДеревоАнкеты/Picture.png b/SSL/src/CommonPictures/КоллекцияКартинокДеревоАнкеты/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..8d0774817b2584ccf3b3e330b3a99d7417909b84 GIT binary patch literal 1776 zcmVOk1^DENaDAMN!n+CRI{56zfKn#YT)) z@ga)_5!siw&%EiK``!#Q?>%6|KTUd)o0)s&o;&wD-#Pc58N@IQAcTOEyzKb=8~42@ z>P&J#jD_gjT^R^}z2&bN@!1hzC#?PdSrF@h*CJy^M-A&&Ow%+PGSC~vCwu}%lO8|D z4H?M5>^;Z81RfS8q78?ymo0sme>VHS;y_^laB}EW0mE1rU>jwjz}L$i^x9USkqV4P z1DMSwc>JUq;$}^Q7M&3qn{)(AX_*Eljt_;p`ZlNUve@uGswjtziSHo=+gbX?@S@K) zY{8S7(Zy4HVOQF2>_9X0@>GGBrw1_@J#GX{ie4=9^z>AzQr8?=Wpf}aw~vO$0rLG) z=4J{NgeG{nqjj&wWd}DG9CRBVw)pfSDUl=c>4!{$!LP-jjeF#WC0<~Oq(!C6f`tz;q=ve&=r~e0{X)0Z!;O< zKnralPCB{&2dJueBwAeTl0@j+KM*_90!kNGV4XZ??gwbo_vsx`Wa=Fb3MF=0b%!CI zxz~WH$ge>*=kib5I=NCQn%7g+_Vwuan;BvUnk0d?7c#^|XJ8Xq*89W@tUo z<~p&xr4I9|7NlcGA5TfBT%TJr7Y{9_C<-i88&LXc5wHj4&G7WfpFkTN z?E?bU(}E&A*sv+)#!Ch5kosmLtXLQ&((ST2l$(Qim$3&ZKlW)wrDQTiDST%CR(w2L zBXHr$ub^C`fk`+WBHm7fNZf>i{oALuy4rSNP}W9DpAIQ6tHAcM&g^B_-dCuT3ff*c z-I!5Bd7W0P6OC!EuOaEj&BKaLZ-7g`r8}JHAwik2^KdRBg-qf=HU(Lk_Teg+YKuXY zi@f8MWdqdiH45BsZffNB9mL?m+v4hUkLu3;ML|16pe=fY5!l|Y1xipWghWJ>Ce-N- z`c4lBsbngwo3J$n^0Kx;MP(%)flUqd)=e5a7}=JmLK$2(vBL%fkg~Ypf|sIr-R- zV;%RL-9s5X6;k+%#z?h)SDxR6McUbI4VwtEqX`sRN~wNgRl5X?x>X z8dO$Q@e#;x?k2W?7Qa9#QwYixOG#7h!x<)AXgV#ByRqk_r=VFNEU=Lyhw_9uI~-m_ zq>@Qc_<6dw;&=9nU7jq0>E@=ge*e+5<2NBrL7G8ib^Qmx(c<&F@n<3vD&9xj`be?o z7t}-0ED#oK>0N6CPM)p?A0Hpc$w(3D7A@ZZSy*@VQW5E=Y|VsQ=QEwoDV0p(z^t2( zCo*di3!7TnRpfIFx6jvq1A{|GkdNnA{5%|sSBln-QI995z_9s+2k_;9{TQ}Z#KZ(* zd(@RZ|0n3zA5l-Dg$2R_^9>pby@RYEJJZ!+ZrGZS?XynmloW|%BKzN2LJ5kPIV| + + КоллекцияКартинокДеревоАнкеты + + ru + Коллекция картинок дерево анкеты + + diff --git a/SSL/src/CommonPictures/КоллекцияКартинокДоступныеАнкеты/Picture.png b/SSL/src/CommonPictures/КоллекцияКартинокДоступныеАнкеты/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..cca03e1e31b402dba8f3612237f638d6544d36d4 GIT binary patch literal 941 zcmV;e15*5nP)>0!6))I!Tdw=f| zn1O!<|RZ7^{?qn=k561IM%mh97UAF{r9RTrDmMk^k|Rfq@xIND`xuorRIX$T>h% zH%_$l@}k$>SRL@^_g{vI<*9J~kDtFVEaPNm#S8%~`rb`wWDqK-2lEBFSQ(fY85w3A znZ%`)&eP@Asc5sS{JuZd5LmMHAUrOU{OlR7UcUjC*Vfcvur<=gaKO7gTNqY<=7Q_X zotw*Ws$&%c!@5lj&Xz_Dk{Zek?W@Ze9_k%oFR(6Q*ekc$Pd7ni*5w6n(oh`m>-Qh9 zAyK|A3@J4|4BvnLW>8X6X5i-LW{{GEgy-LX|1ccDZs);Zp~lG|cG zeO7v^4B~>kV9PH^t!4mQ{&+LPxog)Mg!Ncc9r`41pg7>~pTA%qfGh{arJS4`q__k* z?iVCF{(%b{Q~=U<+Q6N`6lnQ5VI>Be(sl-AF+K(XZZ@#xr}6EU&xaI3Jiw#^ zvfSFjgyGof6%5NSEM$1{@+H`EzOT~j4op0gjh+T}9cYboJHWuO3C)9M&~lXlUcjT4 zXsG&vAZaAAVW#`ZhkMzrlw29s1>I!uTcXDB{na0^&taCs3lUmjlSrli5#^r$51iTc zf8C{N|9zW`*P^Ro#8w?s3upz3|L50WX5d$4W?*|NzHU?PnP7A^009O7f;|OjmjaJJ P00000NkvXXu0mjfPJF_x literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/КоллекцияКартинокДоступныеАнкеты/КоллекцияКартинокДоступныеАнкеты.mdo b/SSL/src/CommonPictures/КоллекцияКартинокДоступныеАнкеты/КоллекцияКартинокДоступныеАнкеты.mdo new file mode 100644 index 000000000..a6d8bfa99 --- /dev/null +++ b/SSL/src/CommonPictures/КоллекцияКартинокДоступныеАнкеты/КоллекцияКартинокДоступныеАнкеты.mdo @@ -0,0 +1,8 @@ + + + КоллекцияКартинокДоступныеАнкеты + + ru + Коллекция картинок доступные анкеты + + diff --git a/SSL/src/CommonPictures/КоллекцияПиктограммЭлементов/Picture.png b/SSL/src/CommonPictures/КоллекцияПиктограммЭлементов/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce5b02d7e0b560972c4acc3b22713f79bf0d7bf GIT binary patch literal 1026 zcmV+d1pWJoP)XZCY5^WERhd>2tl;eSrutL9Vc^+0+9WM)Irz`hC`AI*HX7W;`TCP=UtT~}n;raE5zO#Ni-493vsVEcyO&GE zj!+M4w~ayvrYvzDjrAw-^6{qD;#t&cVGr91;PcAh31FCa$AwJ6ngEY47F;J%CnbRn zN~E`XR{bw%@6$cx;kjki+C9;7y!>$F#=;rY$V1_HT?Cw(54-?W?H*Ky^`vAJqH+D) z@}{Z<9}@%t1R?ZFxh+E9CC9q^Rl~u@o1C+!Q;#U>^$BBaaCK%bUEz9eDgtx?B+<_% zFM=w6ii{5O1+r$$8_jY=dv9k)(UaSCl*N11aPUUjf9hH}D-Ql@qAF2W##zgA4(FhHXTBGv10E)so6)z}a_fG={un&xL z!jKe`UbZ^OGwz9(HxiZt2g}whW0O@uQ3s1(4wGvv$B( z23b}>lI38X2`sS^D>7JkK7z3&TeC~r+CLclwFhnBsDHrbM4-m$ipdA}0Br$U#v+(n zfr2A@qwp5{LKYb!2+2tx^*cj+&fM*`AMceUsixj}t0d|>%kvfC*T&+*`T8O7x&R!< zvGXti5V4xub!g-f8;wVt0G=I(K{G28>M8;E-G(ulE5W;YS5iNJ1c#fIs{PwGuwuiX zZiaut2P1%JPdJffyGcy^VY7?ITXnPIWoD&q{VvFeJA(b_*mkv(i8lQuNSGf`RC%N$;F|yg0QK_O^DTq(6aWAK07*qoM6N<$f_E9=9RL6T literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/КоллекцияПиктограммЭлементов/КоллекцияПиктограммЭлементов.mdo b/SSL/src/CommonPictures/КоллекцияПиктограммЭлементов/КоллекцияПиктограммЭлементов.mdo new file mode 100644 index 000000000..971099bf3 --- /dev/null +++ b/SSL/src/CommonPictures/КоллекцияПиктограммЭлементов/КоллекцияПиктограммЭлементов.mdo @@ -0,0 +1,8 @@ + + + КоллекцияПиктограммЭлементов + + ru + Коллекция пиктограмм элементов + + diff --git a/SSL/src/CommonPictures/КоннекторВерхНиз/Picture.png b/SSL/src/CommonPictures/КоннекторВерхНиз/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..bbca1693d34de78018d983fc3d879962f9ab7d58 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rk*a2Ar`&K2?v-rEo$EPaPo57 z6Wx42>|Zf)#eVqzzy1`D!ZB7Kk(&<120V) + + КоннекторВерхНиз + + ru + Коннектор верх низ + + diff --git a/SSL/src/CommonPictures/КоннекторВерхПраво/Picture.png b/SSL/src/CommonPictures/КоннекторВерхПраво/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..10280787f7a6c922cbf343522c89f45071a6b354 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hMq2tAr`&K2?v;sn(q92IC;6P zMCrkVBFDfLr|VO!j^F<#&& + + КоннекторВерхПраво + + ru + Коннектор верх право + + diff --git a/SSL/src/CommonPictures/КоннекторВерхПравоНиз/Picture.png b/SSL/src/CommonPictures/КоннекторВерхПравоНиз/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..eebd4b0abfdd863f6cfbb8f7808dffe1f985ff28 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9-c0aAr`&K2?v-rEo$EPaPo57 z6Wx42>|Ze*(o0yhS38O6|MR0P|JpZ7N=Qf)DgFItXkcKF;>!O2==w?zmPZBUj(#~B cj^Ydq-u2RkW?hnhfo3vzy85}Sb4q9e0N0T!f&c&j literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/КоннекторВерхПравоНиз/КоннекторВерхПравоНиз.mdo b/SSL/src/CommonPictures/КоннекторВерхПравоНиз/КоннекторВерхПравоНиз.mdo new file mode 100644 index 000000000..1576ef2b7 --- /dev/null +++ b/SSL/src/CommonPictures/КоннекторВерхПравоНиз/КоннекторВерхПравоНиз.mdo @@ -0,0 +1,8 @@ + + + КоннекторВерхПравоНиз + + ru + Коннектор верх право низ + + diff --git a/SSL/src/CommonPictures/КоннекторЛевоНизПраво/Picture.png b/SSL/src/CommonPictures/КоннекторЛевоНизПраво/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..73dd9152e2bc9adc2cbc42afdf94d7af45a75a07 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9-c0aAr`&K2@*RW{Qv)dFZ0_r zM`j}>=Kn?p1_mjuzyBmBBqW^Z=KRCI`12y>e~Y^nSGT@A%2|};{QvTqr!I^$#N9S= ccXYBcaF)rf + + КоннекторЛевоНизПраво + + ru + Коннектор лево низ право + + diff --git a/SSL/src/CommonPictures/КоннекторЛевоПраво/Picture.png b/SSL/src/CommonPictures/КоннекторЛевоПраво/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..7954b4a2f9372f7c35ab215143574953c73e646e GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`o}Mm_Ar`&K2@ + + КоннекторЛевоПраво + + ru + Коннектор лево право + + diff --git a/SSL/src/CommonPictures/КоннекторПравоНиз/Picture.png b/SSL/src/CommonPictures/КоннекторПравоНиз/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..00ffc2502293f8047f8d559954aaad05044fa822 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ww^AIAr`&K2@ + + КоннекторПравоНиз + + ru + Коннектор право низ + + diff --git a/SSL/src/CommonPictures/КонтактнаяИнформация/Picture.png b/SSL/src/CommonPictures/КонтактнаяИнформация/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..b8ce3e62a2783c86f5013ede87cdb58b0b5a57ba GIT binary patch literal 3275 zcmV;+3^enJP)BMqLqr9O^jI;(aPawO;XXA!z&)y7!%zD6$MJU zMLfU(hfD5b?wL1l|9;Hi0Aoz5uqst+*ZkG}`gpJB|G)nJzq=`hVc=03xHM(i#z4$c zP+}+wCfe1Ti;{zKIP3GRHGii0QvdG&P^3|PtCpZ7pbT@W%RL)W!I3vH8}F)3=IIR`Eln^~ z#`_{|@tk9i0N@$`Q7Fe8h7XV{o5TW%Nz+#CZL}DK_CC8%(p&)mjelsw5WkdF3#Y@~ z)>`0F9B>!AL#3tyOcpaljEDq@$Qw3)_$4&7b`U0bc7OqJV%O?tl4+Z*eKO3LRsgMc@XllXpIC=c-@O)e~N|Gi^=$ehY}2Kqj@BV)rK{u3Jw%{7hi)Q0SS zOE-2w>I9iotkPMS<@gxhr@2(hr#@-d>hrU|+LhO*Es8^N&e<5-pw|*oHA^QgZz`=V zZj*}@orxo-yPvvx!fW%%4Z#&nH&d}M`EPIcUHQR5gHx709R~&1FT)_oAn^0@1Cdw? ze1Qm>+gpGqas#oa9NyXRGQ9i2mnmdSUnZE68au&FE>c;IR+sbVyYWBKw;A%Yc4gkPZIGUA<;~_8qEC~1lh>1=F9|V9kji462+EB}6D zX1taH>XKVfU!m!3dzuED*$lMF1a;TdY@fe869Kv&!_kf4+O=KQLM2E-QTLd4*8`ya3S|6Xr$cWh5;7= zM+()Na-g{sf(a;ZA04c_LkatD7g_65}8D8t$?EmmTLRXCZY6m?L}9I5|MX>HL8QvTP1{Z|kWX?qsz z`@->#Q&bB`pasLdg2y<0KE`9jFu2sN2W8M`FyWjl)z_hY*T`5o|=KD5Q_B^PYzuZ~%}L_G2zp)2V}+CLOdJ&5-bG zKJ|OXO`1Cu)I~R-?uHs{xaw)6fh|{+R)8ut6s%}`A_N@0d68x#ADhjZK4r=JGpHS& zpa0ASySh>$W36hGmGb>EXdM0<`gsF25_l&W?N`ts`9YbN;)@;5#eF>eLBhSM2m z-rL0n2-uF<1*~H==OOX5_Iw&(q7i+o+GGLRKLjc;=(7qX;1?bT-x;}3s5d~N&H%S@ zA*k!rFg$DmOqz)s4IcaX6nl`yKG0TMdeVl3GZcmMAMCe&&GASYx8^$?2+tF!9a7kl&EkQ)lbr@p%se0B0tRW!en}w(KL9z;V?WW={T9>bGM& z8mXOT{eAhxVz@2hvo64>HDDma?KV7ug0Mng0Azi!jhpbo`Uw0$Ms!p}B7$6hCI9jo znzmhKQO==~qoc=f8tU&eBd?%Hh~J1jw{Lq1X%k{}rZefZSTvGnFR6DY8oG#-j};x9 zMe-2e(CZ|}SYZ#k3wVC~3)#-!uh;8=he2wKzynmt%YiX;fK?faHs(QtsoPzJ8=IiG zI2)>N6oQ*b3}Nx}@9FEGSzI)H1Qs(wV@4%nt}ne%wuYe@cK#R_B!|b3-V_iRFr(zc zRUrn$k!QD^E9t943mUhssU6Iy9|RG+eJ~ALOga#ml?c8@Ha;2Rr+Byk_-aHDBan9Q znox&1pob85~*CfGDc;mJ{rQ%%b+C`iIOR)JEX)KuP3 zMh!3FSJI)1dgpN z)LeON{CguKH_zItUh(x35}g&YE6P6QLst&WVT08%vm5rz-}gQ;M1#{gKn~N~mLeEE z0yttZzMFzBM5Bny0SRirc<~sFpS~Eb*yI3{Q(&UL2`YX*05uI=WUS^MfT;|bNDgRZ z0sxqr9=C$?UBvRpsh2@oZo$D6dQs0;U3FV*OdmO@J!ob_xy(h@)4gl?xkIxDz53F7yxOAxs zWbXYp6cmR8on2jE#4!@F1PJA0^(IHVR4RcxHMQNRB5V-QonDP!`}L86ZxX9p)$ibn zf9sowiOH(Jq!}b zfKa~k{0TTJT5f@T+wM}IW{VXB=w68EI=jF}CWpjfOF$`$0>{?4??KUk1E8<*AC#Ik zcfr#~2DLZufacn577)bucZ+kGL@+jxArLw`P5t-Bw8eJ2s+tox*dMfx<1eRVGN){L!VYb5-w& z0rzgp}%%q;?*+44{>gYet;y$tFH6gSSz zqaSTq{|ErClb?MT;Cw+*i9)u9+COp~OwI`G2Q7cv>)`(hFaQs?^Uar458(g+002ov JPDHLkV1jv@I;Q{t literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/КонтактнаяИнформация/КонтактнаяИнформация.mdo b/SSL/src/CommonPictures/КонтактнаяИнформация/КонтактнаяИнформация.mdo new file mode 100644 index 000000000..bb5ed0d91 --- /dev/null +++ b/SSL/src/CommonPictures/КонтактнаяИнформация/КонтактнаяИнформация.mdo @@ -0,0 +1,8 @@ + + + КонтактнаяИнформация + + ru + Контактная информация + + diff --git a/SSL/src/CommonPictures/НастройкаОбработкиРегламентныхЗаданий/Picture.png b/SSL/src/CommonPictures/НастройкаОбработкиРегламентныхЗаданий/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..708bc331004e439aa033a27d8b588505e034348e GIT binary patch literal 882 zcmV-&1C9KNP)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+3a>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!emuYC010pY`FH~05-Xu$ma5<;t#RoL^~HvaAfw*Rl?;7iKYY+NeEf5lJzZ^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 + + НастройкаОбработкиРегламентныхЗаданий + + ru + Настройка обработки регламентных заданий + + + 14 + 13 + + diff --git a/SSL/src/CommonPictures/ОбработатьРегламентноеЗаданиеВручную/Picture.png b/SSL/src/CommonPictures/ОбработатьРегламентноеЗаданиеВручную/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..43f862f9fc4ab19713b1cad4935e2c9951fbefd3 GIT binary patch literal 827 zcmV-B1H}A^P)fAXyz3gbB%Oo!IM$MhO?R{;@Z`sc_ZY5Zj=y&2+Xel_Lw3TL8?S7 z7fl0%vFDxlG1JdH(!7;=Vphs9i@i&7>9je?SldVTdt z2Lc>ep-BTY5;3T01i;O3kTr1#Ns)eJyD7RMb6l`t685F%D3l2r*kC6 zJ5Z%d{X^q35Ikl@AU5uT-wIlhSRjakm<&VMVuR7i0ALLdkfn(S`d!nU5Idle_h=H7 z2$dAB!s*6c@N=;XWGO6ANW%jPb9A?R`^Q5g?f@@h5<$iiS>SC=dAv}6`4qhOTxBnv z(GxtN!IIypRZ}mXz8#9VCT8ORh5$uJ3m7fA-0#FCN+UodC*a-3*F?jE1A9B%H+s(v z6bt#IT+`U)nDPg!cW%q3wiq+Pq*HN|zk33p&7k4Jy&XVG2_O-OTT$ngDDU$CT+NRM zE5D3+tfBB~L11A?ji2GbY&B;3+Os`|q*x*sEEkliuM0`y)?a{s)k4(YdZ@Li4vP(W z)GLinTGy2OX^cAu@E?T}lWRr({NfGuO{Tsl>)-tmU;w(0VRWpw + + ОбработатьРегламентноеЗаданиеВручную + + ru + Обработать регламентное задание вручную + + + 14 + 8 + + diff --git a/SSL/src/CommonPictures/ОтдельныйСеансОбработкиРегламентныхЗаданий/Picture.png b/SSL/src/CommonPictures/ОтдельныйСеансОбработкиРегламентныхЗаданий/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..7b4c372893d8a884ed4832ec5f3d11ec4830c8e6 GIT binary patch literal 681 zcmV;a0#^NrP)~~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% zXotF6s51Roc9-eQ)u;b + + ОтдельныйСеансОбработкиРегламентныхЗаданий + + ru + Отдельный сеанс обработки регламентных заданий + + + 10 + 2 + + diff --git a/SSL/src/CommonPictures/ОткрепитьВариантОтчета/Picture.png b/SSL/src/CommonPictures/ОткрепитьВариантОтчета/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..e61990314c24cd1aaaeca25edbbc37d42b8f1b92 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W~!3HFs%y=IPq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6)AYSIEGZ*O8WEvzdf@lqcHQ-gDV;rv-L??WGRF(2qZ9+ Xb~8&)R2RAmRLkJ$>gTe~DWM4f4OAoR literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ОткрепитьВариантОтчета/ОткрепитьВариантОтчета.mdo b/SSL/src/CommonPictures/ОткрепитьВариантОтчета/ОткрепитьВариантОтчета.mdo new file mode 100644 index 000000000..0bababb09 --- /dev/null +++ b/SSL/src/CommonPictures/ОткрепитьВариантОтчета/ОткрепитьВариантОтчета.mdo @@ -0,0 +1,8 @@ + + + ОткрепитьВариантОтчета + + ru + Открепить вариант отчета + + diff --git a/SSL/src/CommonPictures/ОткрытьМакет/Picture.png b/SSL/src/CommonPictures/ОткрытьМакет/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..9b629fb50b73180e396d95be2cce9992ac4f2501 GIT binary patch literal 527 zcmV+q0`UEbP)xrk*Y%-v?Dmxl0H&r?W=EvjcNjnhD$^3@r)F+SDU}eSuO+2aM<*^l{hK!d0txl%a$nuI z#s}AE6TnwcC=_}Ive_)DRH~&tslouy6XbHae|B{or?ua>IUWW;{}VJl83xEd7dtB& zjS`E+h(sbZ8jW^feKZVEK(SbC9a@$JK)v#u%7=&e-bYZ1q1~q$7(R)0>iEt_(^uO7 z&kxp2P%f8ACX;-Am1pmXju0W$bO(EPFr?0CB;myn9I zS+N)951zSrtNZsSP8`~`?R$NnS_#&P=3=*vbZY=;A*Z9BOlF+@?N} zdfqX683+-JY&7n@G6#egi@Y=v)W7 RyU_pu002ovPDHLkV1jN?@74eS literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ОткрытьМакет/ОткрытьМакет.mdo b/SSL/src/CommonPictures/ОткрытьМакет/ОткрытьМакет.mdo new file mode 100644 index 000000000..da7ddcf59 --- /dev/null +++ b/SSL/src/CommonPictures/ОткрытьМакет/ОткрытьМакет.mdo @@ -0,0 +1,8 @@ + + + ОткрытьМакет + + ru + Открыть макет + + diff --git a/SSL/src/CommonPictures/ОтменитьРедактированиеМакета/Picture.png b/SSL/src/CommonPictures/ОтменитьРедактированиеМакета/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..1fce96b26f296bdb517beaa0641472828d40d185 GIT binary patch literal 586 zcmV-Q0=4~#P)+RL zMKS4Muri8uA{AL+cSaCn`Z;Gck{!PH?Lr&HChiXp@AHTEf8a6fJa+!ZH{G!xsHRLb zRwVDf8oYKIKru+^X;SCP76XX9^c2X+>!Djh2&wCOStEpy2l~#v{Hs?0@&e}Pl4Yf@ za;*N3D*!nO!CG;ld;Y!Zk>A_bA(?=S4>bQ()`mS0bYss1zuCY9EP zM%VnatKGHxE`$t2(b$VkZOyyp<6n!?olYmFj7H^^%ZROR)ZOh+X(Shn!iR~}f^S2= zQe!b$^t`@ogCCC`VDvO&?&?6AO~~i(s2GhQTbyZ z@57t1ueT$$1mrW)Q1bNuAaSYpO>LFBjn7j^UpwaQ4UkUqGdzwKOMEo0WMJ6XbaU$U z_*`O*4Yk9Cn4aeQo%h5aPp0gh^??-|0L1SP983?7ok_)KT9J9`9F|G@j{3mbz9$d= Y0E)Egnoy41lmGw#07*qoM6N<$f@=mCfdBvi literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ОтменитьРедактированиеМакета/ОтменитьРедактированиеМакета.mdo b/SSL/src/CommonPictures/ОтменитьРедактированиеМакета/ОтменитьРедактированиеМакета.mdo new file mode 100644 index 000000000..1a1416734 --- /dev/null +++ b/SSL/src/CommonPictures/ОтменитьРедактированиеМакета/ОтменитьРедактированиеМакета.mdo @@ -0,0 +1,8 @@ + + + ОтменитьРедактированиеМакета + + ru + Отменить редактирование макета + + diff --git a/SSL/src/CommonPictures/ОтправитьEmail/Picture.bmp b/SSL/src/CommonPictures/ОтправитьEmail/Picture.bmp new file mode 100644 index 0000000000000000000000000000000000000000..610a5454db33314c7f782364e6742d5d3273515d GIT binary patch literal 826 zcmZuuOH30{6s>VB!4P9*CmLhI21Pe@p>bh!(Sk7;H$VcI2vX@xKM;zk--MVTBz~f4 zOpG5e3Y1P;D-^^|flfO!{Y+`0*iuXX(4iD;HHe9~P`lB|eP`}H@7(+DeeW!vx0|#5 z@c@s)D$cK69PT#H$?xw3|3?dkSTqQs6XK&n)2NWp-GC6tf7MnELSl${q78Sq8zUVQ zD<_kkQ{gV7tHW#%kr-;#qJ=C_(wN9(ky_&NxpbQ?RpUut`S$&)f8*NRnuv&Ynana; zgIKlVofH~FfgxgYuem1Fekj4?6fDxX-)p{%M?3JDPB;bh#psTg3-isNsNH zec>rl_RN1`R(;<0;5d-@hf_VCTI!R;iiv48YOr>G4&96hisrjdx|C;aBCcLhG9@hX zhz~+Ynd-C?=UN<Q9&~=A+UjubWV+)`YJ?yG00mm<`SmN(7+%9WzR@T$U z9@=MIu3ekc z80xh2CV#|}VdqM3GZf5QRVmxoy7hZ=Ez6os-83f2zpqAO$BZ?vmt literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ОтправитьEmail/ОтправитьEmail.mdo b/SSL/src/CommonPictures/ОтправитьEmail/ОтправитьEmail.mdo new file mode 100644 index 000000000..a8f1bfce5 --- /dev/null +++ b/SSL/src/CommonPictures/ОтправитьEmail/ОтправитьEmail.mdo @@ -0,0 +1,12 @@ + + + ОтправитьEmail + + ru + Отправить email + + + 1 + 1 + + diff --git a/SSL/src/CommonPictures/Ошибка32/Picture.png b/SSL/src/CommonPictures/Ошибка32/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..9a379deec17a600376132d916569e0a048932b24 GIT binary patch literal 2499 zcmV;!2|V_RP)_uEos44kZ=;);~D$T_uQE~_ulipS0B!uv6DDa#F75m z=j?O#`v3P@Ywxp{;yqmF78jIK$`TP5rE*wq31#J!);55Mi7_T14Lb;dQbb>U@6mV{F!7UF@9-TOL_s0jl z^5aprb6P~Kp^*tjhQ}#a8gCydu(!9(#zvEk^_!rGonq;iyHV$#ZeG3o^SzCg=AFD@ zy|v?OiwoZH(Yg7#)Av1APxN1R+pX!ziD`ZE#2Mr$^an4FjfW2~Kx z=43TrexQ2ncpAs?>U~rBy=O13r0*!;+~R`U7@wIx^?|d0Wtz<|nj|W`|HKEWS88BV zlu6(aDM+6@O|!l~E}A z=O<<%@{!Po*zXGnFlmIO>1{~*xVx_uDA#9D%F{qTpU8CTcde2Dp^piDBcNy8rVmCXO(1lnDs^%oAacl7RSK zS6kMw0#A#G7u;CByJ!UCcQJvV3J3W$)4{?m$DCzRhm}OgTKD7&JM|A>}ZKI9B_&p>I zv+XsGAy+`TIh1XKws6L#-b4;y4~>)dI>gPTe)9R?_n_B?UJrroK7%_x)!%+Y zRBF&7SW06#9@@==mjgG)j%Q18a%y>?Hkjz3yVo(LQd8v%NyqU}xjf42!|_nIi}qZU z|KqA27kGOWaPO% zxtGrj*$%ZozLo8J|M4Aqm;Spy!)%tVAAF1G<~0Dk={dCRpluKB7Eo^faAMn*7I*ge zEBRu1Wn*inXPv*eA`i|F$HnnU*XjnpZ&|ie9w?(-59PWUEQ{Pd_hFT5#LXpw%a|EWLw%Qk?0 z+fweVFTZht$(gS=dVKx2+iRs0Q+I)-P)cP-0Nwu$AN-9`fFJ;J00ARlK#V{tTwZyD zs8Qb?x#!Gxu3UQQnJX7x+BqOSJQJS3xFQdo9QETk-cr@-y7I&OcRIUXy)lN9%V%Eb zC#167KKl1o|JicDa>35p$Ox~lypEsq_G+ik{KNY4>rZa2HJ88q&8O412{;JFgY!cj z-|sb@(b4OcAD(P(+^AT&f+{ygP>u)A0l9Z5>Oc&37A`E8o7?OBcKLPD)!K6I*s*Wy zZg2kUr5Aqm+LyoibaFfAI~695QmQdD^}e$;JNJ3L*ZzcOJB887Sw<$NDEBL(+Ydwl z?RJZetyR`;TqlvV>rPBOrwXO-ZEvnUf9+TQwS1@Q=-o;)4HUKQP7WTKy|3n#9?l2h zN5U|uA;!t)3Y04~KoN#MyX{?+?Zo+VrKJZ4UrB8HC#%a>URZnm*RKKo6HmQp?!@!1 z#c5xN4HT794cp5f8EA|huMSVlT7Ec>n5xp6+(30Z_1x=zw|%|Uy#AZ^*3GMFl5B(Y z-l-;h&jM}<`KShQP|8!_iHM_=vH(ORRZ2wyAwmcwPds(ujx&Di_5Y8~@bAfUaqIv9 N002ovPDHLkV1lB1@aO;l 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..43e22e9b6 --- /dev/null +++ b/SSL/src/CommonPictures/Ошибка32/Ошибка32.mdo @@ -0,0 +1,8 @@ + + + Ошибка32 + + ru + Ошибка + + diff --git a/SSL/src/CommonPictures/ОшибкаОбработкиРегламентныхЗаданий/Picture.png b/SSL/src/CommonPictures/ОшибкаОбработкиРегламентныхЗаданий/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..c3687db9032f4f8ce2325c0314ea731c9ce4e7b5 GIT binary patch literal 802 zcmV+-1Ks?IP)xI@u7kLvI2}+?|ND7uhV4#xuF`aF5 zPG{=A+UDlA^U?dBd6r%TJ@9Pf;r;*K|MNdP%!=)t;A^NANI_~}LyZu$9!>9_{i~S* zHU&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;VPHQGZKh2eT1~Rols}o>(CHQ4p4i@_ + + ОшибкаОбработкиРегламентныхЗаданий + + ru + Ошибка обработки регламентных заданий + + + 14 + 3 + + diff --git a/SSL/src/CommonPictures/Папка/Picture.png b/SSL/src/CommonPictures/Папка/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..6a095465dab5675e3f28543c503547fccf7b63c2 GIT binary patch literal 440 zcmV;p0Z0CcP)fUtbtt@x%zFfBky}G@U^o9*F<`{$cq4=PSeC?=Nr!6sigTe!fSIh5sM} zK={{p2BJ*(^9$7gCMG5Z#{bL=jQ`k)i~RqrXfF5%vVjAL`H4(E-_Z>C|BnF_ql_#f zL}_Pa`UWHzkzMfb;`^7koqv7(M3ezvzI+23!gK*{fRrr5va`FU{sX2g1LB;(cu`L3 i*Ge#Rz;h!&fB^u`wXakG;;n7~0000 + + Папка + + ru + Папка + + diff --git a/SSL/src/CommonPictures/Папки/Picture.png b/SSL/src/CommonPictures/Папки/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..a217e192f11c849a4d5f2375fbe120c956dd27c4 GIT binary patch literal 731 zcmV<10wn#3P)30f54l@#9!dSn@NwT^#e3En3xbvJTwMl)Px#6VFE;( z@TF8JyX}6=IJ^CT)fSpGhDn~;yz|a8`|L9_?-IrscC!iCBpz~L27OYPQ{AdX<6cA8M?Y+b%(B@ zt+T6|!!o`!KO6k`W{h#aL*?>K0h*?PYU|MC_&-~eQj*Bs6Ow%@bcwHyJ{Lv@Gj%`^1Q2Eep%q2o z%pwzmiB_Wv@*Un~2omqemReGnpIVH<*%(B7WCCx` z_vFV8Q1E)ZcGMx z5SWZ4^8$R$c=YMjUCJwyzcdR-ti`8{<-%h84tU+~25;_hR92XA@a0oA66iG#&}e6O z&9(1wV5c%$E N002ovPDHLkV1lFlPCftt literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/Папки/Папки.mdo b/SSL/src/CommonPictures/Папки/Папки.mdo new file mode 100644 index 000000000..82322c5c9 --- /dev/null +++ b/SSL/src/CommonPictures/Папки/Папки.mdo @@ -0,0 +1,8 @@ + + + Папки + + ru + Папки + + diff --git a/SSL/src/CommonPictures/ПараметрыОбменаДанными/Picture.png b/SSL/src/CommonPictures/ПараметрыОбменаДанными/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..59e723013e03286489074bbf0877eb035492df7b GIT binary patch literal 831 zcmV-F1Hk-=P)>TJnzGEp2I;HWB4DC+r`AfsJKu4()Mv~@H!)2ssxNl z&W3C@JzkcFL_ICaIQKR;rD#eX61m|ifZPsN*Y%V%P{yWS3#I7b2$UY59iJGvheinC z^WvwSsHF+fp%@TzyPO(Ky&pz|Ow5jLPBMR&`NKUnlx;|gEd|4`98_k2hw5TIL% z7DA_61FcpI6vYRLL;_(n4XncinFlh$>9BB}*A}FKv^`I8V(LhIN%rN~dctaT!2J9? zM90KJL4IC^e?S0OH?6=hCTMPM`QeqY+kwx^>FDUejg3$6%*=c_#vIYt|K^cO^%^Uc z&s=RR@Z=-kTWEXHhIyn2SeA1UIFN({D~(2`l$Oz;R*%Bw<~meWRUxktJYlg|k_`sk z2tgnS2oM9G6qL$BWiUB831*Y=gV|(C{_7Te(c045pf{|havYID5TuA + + ПараметрыОбменаДанными + + ru + Параметры обмена данными + + diff --git a/SSL/src/CommonPictures/Переключатель/Picture.png b/SSL/src/CommonPictures/Переключатель/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..5d8d7a20d31fc99e9347fefba9a5b29f4ce09ca9 GIT binary patch literal 735 zcmV<50wDc~P)*6hF`3XvFTju($!xSgG`(r?ukB;cy}&ckVh1HL=69>*Y^@YJRCt zD}T72=pH^^{`&S{BS+*fhqaO1w*QG<{Wh9PACWsUC!xlAn8Rj5JiQ|`0q!%k(nzdx z&kN^I>mER|d+4%O`7)a58Whx6H*BNCq`2w3A>7AfOzr0g&+$31&D!~Z+8R(IZLsyi zKgkkh70I5X5JVZ(!g9c@7cVmNZ4bbx{^(D14g5FRwoLR6UV+P=X!`(M_Yo-3d;Jz9 zIT#d~CP&gprbi(walh=++DG&bO@nRCDABO|>?+h~lI1AjCW+JnG0KRw??x!L9j$$* zQCTnG`|5l2kKKa6VhH17@o^TC2rrhH)h3B>Y2K{mu`+)R)UJEX_aD27;WPKWomshf z{g90{q(BlJ@L1Qeiavk~XF=E2AxjjCxpQ8UAO=0+IN-wU3AD6CAqo`4s=_oX41g>( z0jM>{3 + + Переключатель + + ru + Переключатель + + diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя/Picture.png b/SSL/src/CommonPictures/ПиктограммыПользователя/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..63fb95d2a158d283ba12e5623de4d0f230de20b0 GIT binary patch literal 2009 zcmV;~2PXK5P)bKnWGlkXi$=^)fa#iB2Y+kSMOkRBB^1Rcz9zBE75P=D2fg%vOjKOouw1nFk9L2w{S&D* z%@UGfp^TNGN3%h6aud*5o%sB~uRb{ShvT;5lYpbAP*u}{@kVq4z4a-toO(J z>OY)Pka|t4y&OnJIQ^D8mNUkG>z}9soK=9+XfRYxJ(Lh=1_0#cW=QgKGbA3D0y@LI z|LFRk25xLD65T(W%lEyTmz_~&8EgUTu%fTG4|hJfvE^(tcQughOTL}9XIts!zvMiy zBw*gNf8&kMBxlaN{yT+Le;vOK}JY>@I|IzbLTw0bRT4@>pu)VEI(lcy^$w}g` zk9-eM=7Tiqu~fxlV2oPhPrQ5D`^o(5L=Fx^zhB<7f7|VwaQEMO{)foQUmH-yf=5@p zQ1qkAyNkB{eL?z?V&eLzUn0NLx3ItE?sHJ4klxS!oUcHfnXiX`=6X> z`6ot=mJzd+#`d-@2>|T zyZehT95X{gVb8r!G1(6Y96KXpU&%LP20I%Z4evbKRr~ujzt#R24+4NfnpuVz8AQSe zQNrW>V2zQdF)UqI{*L&G;u&vu>8FL$%&T#m

    c3s#%U^J2kU&+mR_ z-LrqQ_qTvDk3!%%B=OGUe$7vfk{UZsn$va?1Od_Inv-|;-*cJAMS+G(Fkoj#6CAn@ z*!x>Rn)K5dTXr2G7UkwCGu1!KH}v1HsI%Bzz`ZwEnuI9O5GIU}O46}$(^D8~{3AU3 zeX;Iy$X6wm?N`P>b^1TUrNQn10Ed7Bp*WcLA6@?h0N3n`tDmcUzwzt~rTW^+dcp3j zA0=Z;)n%IYK%anD|B0?)8%lYrJrLdn06qUYZ+7tx@N_SDMu&KH0Yn!KSyC2alb1mK z-Et%sZU)D6gXK-&Tn5PHiV^_ec>ylo0f9AvXLLv@d=iV-?G1>X7N(4US|*b{8{!T) z1(>TBz!3sJ?;lb1KXWu%t+f2zrpNF08`{OGY3?3sU%cnUBhYB2Ulo7#?T5Q2oVP{R z)+m~6IT|JG?q@Pn?}`wC=Llsr$mO|6tfi z?cnJ@7(Qm!?{We;`;nS<^5)nCTv9taM{T%2ZhtUm*|Ju?r|(rGa2f#X;~XLLqQC=0 zB8*HbKGsWcYna8#G%HrCd3OdrysN|drE%D|UX6tbc|O_lkNU*x-GQ-@+F>h=SkO$k z4(0Ng^b_JLviv;Nju-7xblOI7-##vnEizn8xar*B0A8NMKXz3&zT=bM|BDTd)0HoI z<2)UrrUB+GJW>apR? z3pGeiO@T6A0n$k!Au;Ks@$tjGXgKkqw}Xen6H+M%sS2$I2DgTJ_{ykmH9;wL;kC!| zBEm*;hj4j~wyq*^6UkY}Wn9GMAM$HOUi^o^MskNxc)}A-RHU788)o9rV>5 z4)1n&lOBY>jB5j}@a8`hHj+Dp!p}Gf2No_GpePznl1BQ%R0x6qCrN^$7%()8Io^H4 z;zdyaAOXj5plN2#3|0<6BAfmkI~+EWJA}(~6D}wK7%e6^DH1AGG6X?@Ab5T+%=dT1 z!r|Qx-7|Lvy!sD?jkbdsFMz7;Yc~5#4q(FJX_~6x7)Qm?wMqa=k4Kh!y`OQ8BSEUT z7A`w`qUqp+$F`(}(;W^!?J(n^$qVYa@Av9I1a|g(-41-e7k$k$Z0I}J@aG>04xWA{ rko#Gdtuc;%aUooGekSMt)&Kth)HeP^&V)xP00000NkvXXu0mjfcVWX; literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя/ПиктограммыПользователя.mdo b/SSL/src/CommonPictures/ПиктограммыПользователя/ПиктограммыПользователя.mdo new file mode 100644 index 000000000..5790f6bb0 --- /dev/null +++ b/SSL/src/CommonPictures/ПиктограммыПользователя/ПиктограммыПользователя.mdo @@ -0,0 +1,8 @@ + + + ПиктограммыПользователя + + ru + Пиктограммы пользователя + + diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя01/Picture.png b/SSL/src/CommonPictures/ПиктограммыПользователя01/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..07c033e54c464b105adef7ee5ea965928ab26361 GIT binary patch literal 607 zcmV-l0-*hgP)1vjamKM3@`C0GN_oV3F7ttZ%6YXb})-Dg|ATr7uc-C6=10HMYjJKN)dY|v8kBn^}KiTk{))=hR?0W}DDoyzB1!*;XmKba@2}{fYiqfk)O7#?!6C=+ zM1r^`xL3U&{M!-V$0*B76Q0s)GnN>iO-&|}I)UJj1EA$g*x_CHX=j-RsaOO#6XV#P zoF|zAvd&M(H!~eySUjw{(Q>M!qM>u{+W;~#g_Slb^C#Lf1voMdf$YBannQjwaT-AL z6x@w%DSa9UJhE1K|CgrjZr7D(9}j*Sp9$H&7#xj-c3=pL3RoP0QVI4`&0xl$&&uJiiM0QrRl_*Fg;EM3bTp|Wq$JDjZd+ABEhuc$iIh5; t&?(wbh-F!5LLjAqp)1mu|LpPq@&ih{1uhIuQJw$*002ovPDHLkV1ftb9X9{~ literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя01/ПиктограммыПользователя01.mdo b/SSL/src/CommonPictures/ПиктограммыПользователя01/ПиктограммыПользователя01.mdo new file mode 100644 index 000000000..e77e4fda5 --- /dev/null +++ b/SSL/src/CommonPictures/ПиктограммыПользователя01/ПиктограммыПользователя01.mdo @@ -0,0 +1,8 @@ + + + ПиктограммыПользователя01 + + ru + Пиктограммы пользователя 01 + + diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя02/Picture.png b/SSL/src/CommonPictures/ПиктограммыПользователя02/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..fad489a570f4a095540eebaf3495cdc16697be04 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl=l?|paXU1LS!so8Osr*lr{d>`=FF#N(7_*$w5i;RUU6;|VDlgG#}!|V)z z_%6)Vb9Xdad%bPVvrbnvcru2-ZD7_eb{-dw#A;RnL0KL5RF%J4SiFY9S_8x$s9 zCQ0X5C + + ПиктограммыПользователя02 + + ru + Пиктограммы пользователя 02 + + diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя03/Picture.png b/SSL/src/CommonPictures/ПиктограммыПользователя03/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..e16f12d680fbc53452bf5380f4a556dc0a89729d GIT binary patch literal 757 zcmV1v7=1gLosU{hXb!sLm-s2?*(!`(!C891Oif&X~2)fXX*QE%$6IX(YDCwq@ z(nXsLf}q%nrM4#Vg5Z5(Ml+0Nl8F=N-2OBF`A-*;7=sJn)wlVckB9Fiv%MwgZ*2$| zm;TljL3Vw;#WzH+kODt4g-4qj1AtW9n!t}t#n(cUzX=da{;OH8AX*kCwR25idL_~Y zlcUuOW7j)=`*n3gZRW?NGc$Wy6NiBEi2!YMxZSdHOrz!Y1Fik?$#X`b_t@+?2}H5L z>)zKq>bbw|(v5t_cz^+Lqp2at6+S7~R7Ut?WqmMX@j7aZIm9b+l-w{OcYr_d=tqDr z0Q%4KW(Nhw0bobZJyO|W@}@=CuD#4!&_pr!25TroU8N-b-fWzxVB|-N@5-f`xjA`$ z7|pKU_w*lrS=5XP_@3b7yEMx8@Enu~gXfAbZ=KGTN-{Y-`1mIc&;j+Tr+skl z@^#acpF=l(pqPG!Gt|ex-3tUt;Y*L&4acZy*h1hwA@`<_zdEm;)d2;N`upmzl0~G` zi*(aO;tL6sLwM>e%Bm8?*B+#*ej}dy3L*1&Du-c&+l)~cUrJCCJyeUS61@Bn=KCcF zShD&s055VQ{P*lFjdclPWd?fC`}qq1fs&w4VaSbfGo#U!6)c}tU{zf5{QU@hgCDu} zFimsaB=$GQnf~4UF99K4M-Nrfopb5RN`&yZlN#Yndy=YHHPJ`~mTB{Qcb;fSabo=^ zfIbRPDgZ(}9Pn|4z;+xg+eJtpAq1A?VA>9rZPVHPcI@_Ng+Kusp6B5>F1GDpS`IU& z$MAh0)3UH_7uOMpazG1%HV#noMACDM$4@myf#|rZESlII09wW%B_pL neMc*8{p!YqNa-gjy=ea*Bq39-%9|i800000NkvXXu0mjf4%%uZ literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя03/ПиктограммыПользователя03.mdo b/SSL/src/CommonPictures/ПиктограммыПользователя03/ПиктограммыПользователя03.mdo new file mode 100644 index 000000000..c7866678a --- /dev/null +++ b/SSL/src/CommonPictures/ПиктограммыПользователя03/ПиктограммыПользователя03.mdo @@ -0,0 +1,8 @@ + + + ПиктограммыПользователя03 + + ru + Пиктограммы пользователя 03 + + diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя04/Picture.png b/SSL/src/CommonPictures/ПиктограммыПользователя04/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..7d14995d3f02a82000b8511adf42c6fcdf412a4a GIT binary patch literal 667 zcmV;M0%ZM(P)M_Hz3Haep=_w~PX|M#|tOhutx-|}$I?>p!4!T*+bgL+bXxa`#CK=RYP ztdw*0yE4Vl=cOS){u7|3zNoFSq3YI=aBW&$MR8hMz}r+1SbRS)Zj7w$RRA8JB!A#e z-Ti@wwc7mDTe)B*-7Vdc%AS&Rs>-q{$xk7sD`(d;^8th^cehuxK4`;r@c46h@n(#! zOEttJUy+tcQM%2qesO7klTUZ>dJ$k-$ zdtGy<^cS}+Zy=?OW5}y4`#8m^3_z!|P70k!{N!5~E!JzW@sW989>=fHD98002ovPDHLkV1gER BGXnqs literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя04/ПиктограммыПользователя04.mdo b/SSL/src/CommonPictures/ПиктограммыПользователя04/ПиктограммыПользователя04.mdo new file mode 100644 index 000000000..70307563a --- /dev/null +++ b/SSL/src/CommonPictures/ПиктограммыПользователя04/ПиктограммыПользователя04.mdo @@ -0,0 +1,8 @@ + + + ПиктограммыПользователя04 + + ru + Пиктограммы пользователя 04 + + diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя05/Picture.png b/SSL/src/CommonPictures/ПиктограммыПользователя05/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..317379276cf573194bb8c3e3765e47f8ab20cc02 GIT binary patch literal 629 zcmV-*0*d{KP)K#R$g`Y`*XkRZtJCqZVPo-^L@W__&ESL&g}EGdA;62 z03ej~C11tQ4FERQ0jaB{qDNKTS0cmV(#UYQRF;%I+JVaM^_T%bu8kX0B)Zr?0FW<$ zwXrNdRzX&7(RJZ{L4BxxK0sjddP0HTY0hsX}Mc z#k>x(B&oqeDCry3kpO^ukDmMe8!Z^g@1VaDsP?20n16LUsJZbJx$FKn_DBqp|vYV1EJgp3L+2;%2%I!J~B145X$_;cr+Q> zb@@Rf0zrB8tWv=5QlM4MHgxGhuRpG^}-X`G4>S)KUUqNsi8> P00000NkvXXu0mjfKVKeV literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя05/ПиктограммыПользователя05.mdo b/SSL/src/CommonPictures/ПиктограммыПользователя05/ПиктограммыПользователя05.mdo new file mode 100644 index 000000000..85ce33869 --- /dev/null +++ b/SSL/src/CommonPictures/ПиктограммыПользователя05/ПиктограммыПользователя05.mdo @@ -0,0 +1,8 @@ + + + ПиктограммыПользователя05 + + ru + Пиктограммы пользователя 05 + + diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя06/Picture.png b/SSL/src/CommonPictures/ПиктограммыПользователя06/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..c6fca7249e9322d3af20f7d09973e515a7813a1e GIT binary patch literal 565 zcmV-50?Pe~P)GgntIvrg6z5?vg?Yd$;5KuPAJ$+e~+KR-ZpwVn#gS$ zw|4B{+orx+FW)Z~LI-x6lnPla)1cE|VdZP-^o||a5Vs*-lT%|yo~wl~Y_Df16;=^j z1+ESHUhLSx@5JwRgnd4L!s&EUwQa15i7>>8bNAL38eT9B-)95fQcbF-ZZA2TgCmtn zHD=k4n7gHWB!B!&ve7aCW?Q}HyRMcBz-Tn;dhj-PVQE84R)4avR!m-e80%*=>iXjs zE=|4m91a~DuU2^!-s53lzmLy(g_VtMWFjL_U|ANbrXhrZp-YUi + + ПиктограммыПользователя06 + + ru + Пиктограммы пользователя 06 + + diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя07/Picture.png b/SSL/src/CommonPictures/ПиктограммыПользователя07/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..5f4a3ec3eb55d091605174b18b9c73bc10812f2f GIT binary patch literal 593 zcmV-X0AlUBn9p!ERY~DBZ45KKcFtE%b*v?EGSli zbrUTDsT(sC36eB*)F4w)3*%>B3$%x4_Gu%ZKmp^W%BGUm{1F9jT?>AxlzA zoin{}i^eKcRFW~Uz3UlkZFB&p4mUZrw-k4YckOBb0>H=CJ&woi1`nu73q?0cboV}q zNRx+d-?*CGRBBy*F{<4GjDi4w!RDQRV#wXc@9)^`?@UNT7)gbh=@~{|hK}4CVPGY| z1rXX>@5I#*{-Y@Ne`|Au1S}LTGfhYI4r%%j@7lt>017X#fIa6T;ND z1>&m4-Q5Ra-8QsXgc@H4NlrHwEHM(DpIcDU1jZ%=fRmG71aWCOoo(tQ9!4R|)}yLMGsOc($f(t7x49_^cP- zbnS0=76?4H|1tkp9l@ZhtN;1=;mEY^{L<&)B}};(<(epE-eR z(Zi=7QNr51r>sfqPrZ59WWpJ;?jeWR5gh0(ZxAjRros1^%(YjKct0OzJSH(GN2%B@ z?o!;fON@UQ{QagVr;zf@Im665HUO$NR1#0bq0&B`?dJdtb9ouDL>x7x;q#SY+cuVE fWliNQ>_5;?0wC{I`?unR00000NkvXXu0mjfRCE`K literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя07/ПиктограммыПользователя07.mdo b/SSL/src/CommonPictures/ПиктограммыПользователя07/ПиктограммыПользователя07.mdo new file mode 100644 index 000000000..aef032035 --- /dev/null +++ b/SSL/src/CommonPictures/ПиктограммыПользователя07/ПиктограммыПользователя07.mdo @@ -0,0 +1,8 @@ + + + ПиктограммыПользователя07 + + ru + Пиктограммы пользователя 07 + + diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя08/Picture.png b/SSL/src/CommonPictures/ПиктограммыПользователя08/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..ce3c43d81e7b2d96543a4f47e6f619f78b92614b GIT binary patch literal 461 zcmV;;0W$uHP)!REB zPGX`F0ziL)WvuGKcFfFrJzH(1YS7)mA+K3s z)>1ek)&(G6T0m4NbT&J5WQ8YCT|+DPj<}c~V6i5a=^M50h7Xs}*aoJLNG1QY7A+dFo3aKIZZ{+B!( zdrQ}`d(HTiKOEAmQ}fd$O)$QFx?VSATL~GG#bvg`FN6_Nla`1*G9g#@H{$N*^v{6F z{rwf!pv^~gf|Mv=?P3?VuaDrx7bJuv8r)UAa(S}}Jb(FB^X(BSS6CoAVXoCs=R#Ua z1GShd_P^Z$$rk_sqLfBXRlsphP)b2*@dX!{4gOCbVT7^=Tg)-V00000NkvXXu0mjf Dqrk*$ literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя08/ПиктограммыПользователя08.mdo b/SSL/src/CommonPictures/ПиктограммыПользователя08/ПиктограммыПользователя08.mdo new file mode 100644 index 000000000..ad80dad3a --- /dev/null +++ b/SSL/src/CommonPictures/ПиктограммыПользователя08/ПиктограммыПользователя08.mdo @@ -0,0 +1,8 @@ + + + ПиктограммыПользователя08 + + ru + Пиктограммы пользователя 08 + + diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя09/Picture.png b/SSL/src/CommonPictures/ПиктограммыПользователя09/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..a05283dca7bff1036bb3cea396d3ec251d577371 GIT binary patch literal 727 zcmV;|0x127P)Nkl16!qU=Bg#Cj=173<88s31h@vj~94SIcJl8o#6#W5@~j(&N~ z0wa;s<0=zA4`Kfhv5=o*H7;vU*OPGbrS&~`&y`+js%5nW5P;Fy*)Y0p&5j&H_am%J z2z$Db0|Wega|6>b(6u-P+v~}#*n_Ej#y>c~{hJpq3%~&Q=Ds#&Xkj$D4^8oqmcJ6y zkV(#3N{X|P{B6f^mhB|2d`H!S#0@{08B1!cQ(g>x5)2KIR6xWiq%9O9CvTU!W%EfJ zz>A(w>Z`VPTb-+%5~mem_RU-Yz%+CanFN$2`6^VcjRmd;edW&_vkhe*SFa&MyiwEtaJMYEb|H002ov JPDHLkV1hvFQ#1eo literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя09/ПиктограммыПользователя09.mdo b/SSL/src/CommonPictures/ПиктограммыПользователя09/ПиктограммыПользователя09.mdo new file mode 100644 index 000000000..ac2d27de3 --- /dev/null +++ b/SSL/src/CommonPictures/ПиктограммыПользователя09/ПиктограммыПользователя09.mdo @@ -0,0 +1,8 @@ + + + ПиктограммыПользователя09 + + ru + Пиктограммы пользователя 09 + + diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя10/Picture.png b/SSL/src/CommonPictures/ПиктограммыПользователя10/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..442c76111a3db472eabc41e39bb7cc824c247d59 GIT binary patch literal 645 zcmV;00($+4P)c#Pm|kjW8$`<+RK{`5)!4?C!s=xw+^(c7>( z^X{oAt8(|bcNB1-TA{I~nCc1}GYKx`3zGp>+{&5y(}SnT8JH}kjJ*6n|Mh0#;m?Rn z8keFouX6CO07s$wB(jB^SOAlQ2e-T=!XYHH1w&-Wq!OI-y5*ziZ^x$tH^0VW%RXB$ zc(3yj@67=1Ey{(OmJWx=hA>Hmlxzca`WbpUPBs}Qn@-T$dBx<~e`w2|`hAXaS54FN zw_~e;$z(tV&~+U{k0UgdoH0jH?GZ#aMRdv!fPHTp_S!Zw>5mw?O2!DIY zgbs#|WZp@_a55TAQdD|aYi+t{1qe*N(O!(cwsv{ysI<#Sx!KKsU~ql`pV63JB*#f}gH zA;e~y$+B*j0bq;jUsjzPyUI#oLO5Cm5eL^fOrH=jk>6&88 fA>Wh1a6iBgN>ua=WUqpZ00000NkvXXu0mjfnqn`S literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя10/ПиктограммыПользователя10.mdo b/SSL/src/CommonPictures/ПиктограммыПользователя10/ПиктограммыПользователя10.mdo new file mode 100644 index 000000000..0f1ec79c6 --- /dev/null +++ b/SSL/src/CommonPictures/ПиктограммыПользователя10/ПиктограммыПользователя10.mdo @@ -0,0 +1,8 @@ + + + ПиктограммыПользователя10 + + ru + Пиктограммы пользователя 10 + + diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя11/Picture.png b/SSL/src/CommonPictures/ПиктограммыПользователя11/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f0445eb51a5126b8db1a762ec934918e259c27 GIT binary patch literal 567 zcmV-70?7S|P)>PQy)}dDGWdm=0Z{Hu!_wzizAHPQfXnMgtH0YWF zSeB&8))?0Vps)w&uJ&;g3}S3XG6UH940BOy$xDWZdjTMVNd!}!KY!Ya4=@jO;pwrr zCc6&klP5dz0Q=N=jmkT24Z7Cv&q&VO-peXEe`u((7z*e4&tDqm)l`&c#$y047E+9@9Uo*`@jFL@~EPF`J~6 z+e9wpkQSI|3aC2t!$y7HDX$>g(yK86qk3tFv~L~4z8OFQw`sk;OMcm8>Uno5SUPp-%fuhqHVMmC>? zHrZ1<)2WLp-+%2;CZA=eR74OgD2jrj)bG}hh7JCYegd#p$BmlJbv6J1002ovPDHLk FV1mhL2ND1P literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя11/ПиктограммыПользователя11.mdo b/SSL/src/CommonPictures/ПиктограммыПользователя11/ПиктограммыПользователя11.mdo new file mode 100644 index 000000000..1d8087229 --- /dev/null +++ b/SSL/src/CommonPictures/ПиктограммыПользователя11/ПиктограммыПользователя11.mdo @@ -0,0 +1,8 @@ + + + ПиктограммыПользователя11 + + ru + Пиктограммы пользователя 11 + + diff --git a/SSL/src/CommonPictures/ПиктограммыПользователя12/Picture.png b/SSL/src/CommonPictures/ПиктограммыПользователя12/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..e90f5ae441e5e539a561fe4871cbd7e54c1c7827 GIT binary patch literal 511 zcmVGT7>1ulb3JIxvM4BJE0q}03K6K6pi2lIWiLi2!9#ON3L-iPA`*1W5{yI;3|5Sw zP~3xooh$_vBwcM+cipnhacpoc_%zy$;~@T=b*p74l{E= z^mBA@aVDG`UgWi_fvS>qLfz(m!|6%_7i4}JCn+($F{aT2MGV#;?u5HK4QEbSWK!D* z%iye>1J@k4K_ny=<%gxNs_Sh zc|^`ad9cwm4=b)4JcIoZWD0N|*5AHc?Z`zo!(uZUo_fF0aW@oPbsGl22w0OIa)r9> z(a^owPfLdVSJNvW41%4v{^^A4PsX2KY?p5Xbom0T{n#az{?3b!GsIpUJm<}5cTt02 zDD<%EYDK?kne1sQ3rh>gvKL8`*iOdrd40sDl6_1}^d9*^L3;UNk7>E*xwg6nRa2qj zr{d(L&cd|*1aePP(X)rhvKJu)LI_9Kk + + ПиктограммыПользователя12 + + ru + Пиктограммы пользователя 12 + + diff --git a/SSL/src/CommonPictures/ПиктограммыФайлов/Picture.png b/SSL/src/CommonPictures/ПиктограммыФайлов/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..be4f80442c0b1ed8b35986b2e33d6b6218d93629 GIT binary patch literal 19265 zcmV)pK%2jbP)mBta6~ zEl6++30l0k6)L=Sth9xeIu)Q)fVMy>F2UU;5Fl7c2*e0+J@^02p5*RwcL^l4@Atjk zcDdZ`KKsnf&i-tEGt1KHboh7EZ*k|7myq`8MD`f1Rtud@3#~?H_|!t^>;xCS?o_|7 z&HB>w_nl3`u&AcBhNoNd`RxJZ<7I;BC6kwh(BGVd9uHV7_CE6Gp70)HWRB`kQ~bYM z5`ke6}5%`ceC8q?)zEDf~G;~t+=kbe0f8)T2jOd@)dcsi@m^R3)1IC zPnEw2{6F3Q|Hc1r;)nNYX5I}O&zLdeCAC`3q1Rxu*`S}stwqOP9|wojyD({F{~mU_ zf6ed#tr%zQr!N*WUo{#HuEY>uMLbY|p+pj48Zakad*?hq?j(gzN zcP8}z+wuQo{h?EX&r!i$Aez=cc*oYz=-YoQ{zcXQf8GCQ{Tl$O*!G`$us^nEM2x-T zRA5H63&q`(j9uN^hmWpJeDb+1q<7*2jW+K+cR!xM-9H>cmj*fmkczx> zdE9#Q!h25KQz`IKL;UJJ=Zee3GJ&mfySRHmCMt6lYGot;GkN$PTj$gSzufWc^w4}R#eY13NZQ-j5UJMvNd0p=j-Fxr<^|#ZPk6n7EAjUJ`Ta*2j^78WT^b42E zwRt^fXXjnyV>j6oYXi?>u}sHSZcEj@`%*)&S=H~qHN~&qnZpPmsgeV!LIbs;90ei` z%0y}?iQq1kDUmA{;r@m}F9iSEzBxLzMg_G}0i{w7l|l-ILPoGsvdf?%zo}IUockp6 zh2T?HOxNiRH7z+$4HendO7f{xF`sI+h8)wN&mYHM2>!d@aNa2l<34F8Hx+VC@v6T!h&!dSXTxQFFqtPDMTVMxwZt$ zH?(;n_{5ce=#&Z-6mkV*Vkx8&vWujUi1dHU#4^a`a=dqYCyrizQ0w^W>W-@PM@{kn z)OO=$;*x#C$1QK*=8DGauA?dOXYSkq(q8QVp45jt*K#=Xg%+RLoV=wUWhAYr4g7!0 z=17Nm`1ql$r~vgnxWC!czct0vZPo9eG(vM*1Tf22)5E~TFjSq`{nfLhG4dsj(Q!)SL5sbr1^_P&(N8JEFsE8gl4ywK?-@Yl{i5Z2)N>Te5g^#A{9{Ua}U zW0R2gXp-$Gmz2@-5G2`OCuZa~>fgNGumbDg&GX{9{|(Cj*4D^TV0pdA7Ao6RlvxKC zC)SdNgN}dkqVW|FokIayT2=;6Hz8UysXyvMLh?>)A^g1f`m13cHO<|kG(d77&XLqB-mJcSnF-f>r4G>8E-du(Qn+?b-hQlh|((3Fm!CA zD0eU3I`Vt9f*{X`pK|s3-8t8jbEsA(0#i$hu4DSKhB&t@XrUyEwNule=6!m0-fe@f zrg&yE1~2l;J~ZZ8zyXvqfXa#OMYy}8JESi+p^+RzW<7cGNR)2=u*x&I5pv)RDAGo31x`OA&D zcxPHD^LO3u2`>yU63H>)bzgGS*MyCE#RDh)5Tjx9Ks>ybgS(dw;8LRJ3&E=tDs=pC zh6yXpDTbt^Odq)Q@_=)oHO9}p-VwWDT>irUh|VWcTaG)-Dz z_@ujf%NBI&){VK&m83iLnR|4S|5iMRA#k zIIe1J+<6c(xe}@O6OmNHMNx^zy7rCyxl6wK@mD&M|M%ckcyRX?f||4gm!(}NQ{3f# z`RDOpX(q?tgI6LqD-GkH9)!2LVBPJ|DbHO0n&9OMIf~LRVM5acxNEZ4{gK#@n|4t6 zE6wEiJMhNxI|U!a{l^9C!a|;}{?>RyH?7i#GWc(?_WZw^;)Ql8n51?kZt%|?MIq`tY7RDeTnAIo$@S)^WWe%(-ybnJ}81K%c}RiuSS&E2m*TtmFs zrq$Zc2y$|9hEOO#hgMB@J9r3cgtv#S?p9NLrQpTbvFrK_?--?#+-K>;x3xN_Fjmh& z-cexns4@uhtoX9BvQdW<(xDOtGLgx$av69W7E>oGR5XSW1?jCPXdd2RU7b30x|;LV z6whRba8>y7a3XG`7wVmp2EJ%f#~mZuha&2D2|n?bR_edxw9z%eOO;;Oak?DIkMofF zM1=Py)y3zVv#@k}INtwaFFJRrD5lNluZDOgi{$(&+qyx2G8WyI`0430pEF`jim(|EoeJsS&l{tTs3{lf54c|GRXl2uvI z>dH_ga>q~0>fxPf0TuF9{o?Q?1$=VE$D$v`{aA+Z_I^mY`V>lu1Y%JET1V8wg==?e z9ZxI+6HZxHj^Z14k+A0suHH>X^t91v8yf|cMvI$|3T@y28sd#cyi6*oQYO7fyjk#q zIuiTeh;EHG4gB;24Cw_i-yKYhA;)5Oz1}abir~jH;ggb*moy0v$Gn6~Sld1l^+v8j zy0ZXWsRH$U1W=Jrp0nkrTI~&w?1sy~3v2dpz`;F@Yl45{@%?S27@fm-#ct1{ABd^Z z+3agg@f8CJsi}zS)f<0q*$iz!L(JW98tbO_#^j&RV*i4HvES@E=O_sBT=*Y$|KKdt zWWMe-YFMWv^&_Z7Dl~R(0f z1OfqWB&FfUjkLnCBcXy;_0Yapc&+)xmzxUVmHo z{}%txcHlx|*okW|zYAxtg4T5;r*?h**|Mn0!`sh}|E~yu=#<`F!R0}x$*%a3l+3Me zFP2X+d)T>keF``{9(X*y@n|BSSG2Ru_)F_*il@PgO`E)M^xGq7H*o~=^7Kn&Jbfyy z7_AAth=ha$a;yNG_ve%S64S&i=ti}vFQ^gTPjsl0N}WGDpm76I1uZd*3Jq~7jv=mW zys;W4#w>KJ5APrW3bWGIC7)S!g#6g1Ciw7P|52LXi^&VW!rRkEp;ePmi+dz+5+bWi z2AM>Pj576F@{`R6pr-hLdSkIzw6T`*>#WHL^{SZ2-?YZtX!MA&B zHEZ^;-r6&Fv(bH2FL?Lh;PwL@GK?prQq|O@g$G-;c&<`927h~P5$;r+~q8YWLiAR5fl7|TEi=w$T70nSkizx+$S=m z&lerhE~FbcLJpqhW+8G&H>^FvGU0cexMNZNn&PKxG)(43%&vn3y%`5+7tDx1bDXuBX;2exO7zueHQr5NGBQaBRr$n&OE8&m1c*F0R^ue}Q=O;Kj!I{qUG*g~tZX;2z`$ z`rEWMC-yrEf;4E6;7Jj-HEY@W)~Z)Wb*b)jV45~R`qd@3jo)jEx3@L*;R~A#E3={sO36hDRPj) zeSpW@960$n&sXUbbo4N#rubhET+-G__50bD8xzjMq_-bLq&rocv8AbabegW>kIs z_1F6BN>^976G#5^#S246)(}s>s}xGzJD;sd$WOk94qdyUWkeI=z$ze-%Hi+pjgkF( z!pp-AN6%fwy4Bx;L+m-PhIG8wc@yIR|Bd)}-+Pb9FE+aL9}Z`z{&xJATereVz{gl` z2`Rtk1>qYr)0pYhS$}UAj2zgH;N5ZT+$F61bS>P3a?Iqf({~LYz!`qYc zYc#cjua3^L^53RDtN&I#yw*nGg6?|zNtH`;tlZ(G$!MigI-xf3{}llcg-l9rh71~2 zq17l!Il|gSxs%=E_xy~szSmD})3pKC)f7)NHvlgtc;Ps^0Qhp@bR^tJVB!gB1!{cs z$x3((YF{J#tjJDp@C7Ll2pfR4=o=KLq`_nBa%j@h!9REvEHSxh3L?yj6QQ2b7wiUp zaQA9}lFZ|Q&<&)~@8}xh|1?E~h!;uslUHt{eX~Xu<&SPv5zsh%)oGa$;)2NKzSjUaYwj`x2*kI$y`KzQA7BGBDXQjlZnzcs}V9orQR z>jpw3Q6alXiaRLcp=sTwU@6%QzDKKI#GSv72p>hQ;U{+&BJ+M86e~wV zA@qjQ%^!36Hb9-IZh(t3bIjXYfMEu_k~nc0DYt43AK7~>bw*<{auwLK=Ridu;irnJ zL@Jd6d(Yg5Z(swsvc(AUY*1_X{Tp63op*A#6a&Y&;P}=OWIs+p&ciHxd}sn*>$woE zBI=_|EkOH5{ubr0DZWSJ_WI{Xsf2rW846hnlob}^>UTGgm7B*LlPguoEtc7o-!;X5 zwYXyX46)mB@IVHlW9s8yK~0JB=RQ-D@3h9lWsK=x>gK zAkT|m_3igq{_#inc=@LY3iQX(h{JgL^Z*`)IbNbfMO+K6RvEKu*Z1)?!JD#_NZWB( z)yy=s5$C8W-naz?1u@wh9Xobp^x5Puc0y8A1Q#D4QxK#0X_|j+;)`zXiOdglaUZ5= zg_E)q$dG5@YH2+Bc@6|m;s*_#PVCIb5%poDOVSbQaQfZ|zV{;dZ4kgZrjb+yIpzC`)dGZ9;uV2T;ZtVjL2A$WVy2k`Uu!j*Gph*_^6 z%z9DyC%Fa0whAKnaxD3J9YTUa@Wwlf5K_kvS1+D}QiT_aw^ja`bLKGRPf5B9c23@l z!MADxFE=64BM%YUAOa=Cj$HoDFQ^|Hj#;lSMjan_Bqhc}D=B|5_-d9vr-t=6;;nrs zTbsH6cJ%lue@8yp^W&8^0v9Ud3_hi$+!H zYRaW$Wy^nFG~)w%l{dczOFt@IQ8cyE?lq_o)2c;K%d#t7Q?3-7@?4Deg_1au2@pRhC(WB9J1!rz<5+Wl%W0W{Ga$2=%Pe;zc%2dI{!?(tGoklW9Aj|}B z=^?PZ-Jz05p_V3r|JPL@qm(wHz9u>?c>Cg^oZXDv&n)mb+2p=R`x9roMtJi8$Zva3 zm_Fa0I?C?ol}sYCd8{UQI(kO;4?g(7K@dr6y=Yaf;mx+?WM4sp6Es5u3fFZ5hUgF_#%AUL?Yj-IWFJJgp-RKoQShu zFC@^^e`|^_HOxRPEu=vrK6V|sjwkuK`14RQq)+amQ_DHVlyRixiqVnSm95*ht2Mk# zs!vTln|=b9GcF;jNiV%|B#y_P_?@U9P@g<69IQWNG%`80idQL1pyLam8a4)Ot}}$C z`RKqV!dppqy@eo=$j$J;D>1c)FDlhLfyaMsgpu>huzO8=oF$^;^9@h&-t-_u(L{YB zTVs3nC70CU(1j!nZriNZ@N~gax@L!Q+RDzKi!ge&4<0>m#g~VtGUfgL>`GitxQ~Qu z_i^Pc(KD})t~Ia z3|?3VF+Pn;+;1&|o)^!o;SsQ8`3FlEF+q$1sT}d~cM-3-SsfoLuBLcXK!g|x8`tYG zvuC#_kB%B%D{}PD&qsAh+i4)&s5h5%vnxk1YKk|?@Q8>Ah{a;&lj^G*pG}1N(iw0z zdu!XMycUbc9BNaOViP6@(&3tzXZ^okx2u8{M4y zBSmqW*cN$pYXeUg2c+AwWfg7m(MK%P_pMuFk&+UJCQV{6e*AvZ@e13ocJRjJ9pa}V zE-r%kZZs8)e_NhY+xXdLHqy@yzZ-w6O?(V#pZ$jRVHw&-XV#|lH}mgw8$EwKp$ z8fPnMoD|YH^t<`rACU%Z5<~9ce#1R9G;U4t3w1h{nQhutE|*`TQ-w_q-SXv7j~xpQ zkH^^h^jLU!I9yy@=;5@Q;=`g}=4;iOIv>t`dDiegkx0wTMp1DIo)YIYB+ws9qQlp1 z-igFQx#q?{HsM9#vk5-H&j)h30!zO76@hi@L+Ig;G9?!s{e3Zx z=$03Wud@7sbzT_0xF8*Q)t;qJw5{$BmZZW`RM>tR}7qn?)&v}z?-JOM+R zn4X8CyxdCH&}!7ssU^_Ja_!8Kv5bId6(y(+p63=t{Qo*&^Yv3-WCfey&c@o6Z$p;3%G-%w2+3>iL_rkk+p+i()QOMvb^EHJeh$@tvcPHL4^`Fib&m(Q~5bVj{n($6RZz8zuBuL9uy^ZBBD=SOMc>Fk^ zj;|N;3QMr~s~^#(fj{^H0rNHuV*r8A=b>30XTi#qD`^3jEL^zoPkZ=@gQMW*|z*57B$A-5n5gb}R zggT)e;ZqskBP^KQdle+4VIDm#HsQUzyuyw37nI}VmDAz@E&f5c>I| zw73|afsJwY?g4}a`J+Mo5UBVS{h#1x+r$4pr!@`m;l8vnjvuJNb6i+x6u`xd@k4Rq zfxd4Qmy|(TD#pYqlknHsB;0v;9os&csSn;Mi-=6onMO~EFJa;@F13$;diWD)l|%tg z2)Dq~1u2dEhYCN(cc;F>j-x+7E7xJ;g{zo2@jt||&%w3p`*1FxJ$ay5m@*)o;r;Vu zvIW0PT5cEra`$oIt67*i^lgkY!<+M~uWUs9MxMZ(OF+|(L`F*ip)*Y>AP-d$>NTr_ zN4GOD-GHYV9OnG=O)vKF&V6QMY@3Nly?6=D%<$&?+m2bj6?^4Rso1!)0IyDIh*?W6 zBjtEk(uc%M`_U}6hgn4y{H0~~@dADcX@6(DJ15KnZ_dw4VH1Ig@~+ zzr-QWLx8q@yW+j=Kfo)bj{Y7S0!at2X2IXn32hqrnE2@%U+m#MgZvo&=(i>z*9_mK zsjrFOe51h&iF`WIH98zjeW(v!+%zh_6^#C%$6bUQ@Yc7zD#-wA{56^uUZO%m+fOhL z0u%nq#T70^7KKKtE3Qh$|A{N`^y=xJz!zUDe?-J)0& zWvAh4a42T3&^v4V4c~$NpP7sot^J0m3#S%#b)Y$Z{>uGK|Ks`i0%rKlYqxixBGb^j z`Vxs!P8CRIVG)LSO+uFIT?DZkK*v#mzF~>>z9ZsYIA3}idCEde@|Xw@wyvzgJhP1- z)vgn1eV-~ZIiVjR1kVrHDfB5-l_D(PdLtPOa}bBz49jwuyda2VrTQ0bf! zV!}SjpKjte1}Thz3G46XK?_^;w}sbgW)f#ijFTs$E%3#~Q<(ip{u2{F4PLOU+SeGg zF#p~B?@`2rG4k8Omyq`N;JM-qX@7Hkv7!B!y*}Nd{b^9b7_6WhwWVng!?@A!A6X4x znYX_+e%#)@P?VNd!oN$Nf4ZmU7u$5u%m;2+Wo7hLnN0A4`Y`l3-RZg?RtY7Q@YK=8 z#0kvv$1=k^IXR(Ovu3z>@#5rhAAFy%^^3&|@{5W?!(vb34a^(?9>K+-tG|aco6cr#D`%!V0W+p+AZ#ydzI}^@e^Xgp_H@n_3}$NofKxmtF`g)b$4O- zZTV2f?Xyom!N(tdfDbh}`}_H>4yQ!t(k zXrpuHavpjgN@&6;P#VCXyHbW~ML^V+!%VjEEO7b3$elEu;Sb!m8%{nGn7Js0qec_s zG{_0RjWeB1gBQzUVvrplkJuG4M4}UuGqxfCLeq<>VF^PBgwAO<-)!N*VxwrvNU#aN zX4x+$d~r-$@aV|!Tc49l$)J&yK~Z=En!;fHXi|9&xKcUT0v`GMss6W*XwQ2{w3mn& z6binDHi4fA5X2lCD7%vQB~A5i=q1)q?fOmnKP{nwr{b%CLTT zT2O+&4xGTndl{HAYN)}G5J4o8z{QCVl|l|4U&wJ5@_nvdySBoZL1GL4*31wnW{rR+ z;SX50&V;YK>=h2j*WaV;iw#0IH#gG=nnJ_ETZ=xlG$gI;PL7=i&=%f}2(P@CdNcL+ zIdsF+g`8%`xEFIdbxHq2?^#R7lD;#M=ju&IvS~j3^8T-XnNB`8sl>%`ywIszaP+si zY#wXf#WR(IACB;A-kMnG^5#TedjGS&UYOQ;Xse8&Z?%df{lAZ)|C_GE<#M!MEII11 zMa=pgEA86EkcFYQ@!I=X{lvfcqcv^rPD`%OZeMvKg}3l<>egYMR#;} zHq>9naXuDzA#urdpLP&EEQIRD72LDBHg$KT9OA$XXbZVo{~Q?mzazY=O*HB+nTR0z z{LfpB&;WP15nC{4P#dsm|L;EyVuijcap!W-rd>mHZKhW+-P*Ln$o{QO(+hq-mTZ{n zqqE?5g!l7tNA{@Rm`?bUx*bEO2w%7gSQh*;sR(cMd7Ifyf`9v`D0`F!wN#B$@kCB4 z*(QE{Fx0I64)9vyTIgPzilLOhrGBabErU5fBPTy!$1Gyndn~!8(9IxhL^!kcE@JoW z!Y94@Sny9B7;fTsgfGjJK(+Ec)T8{pCsxSIas5sFrR5ci$IG(ltMfh{N9z|Am0iwDzv*4GCr4XlOGr@~SFZIIQ zxg$-150jB?NEOb^7c+Z{P;V1|Rd~wZjXwV`4L9jBbAF59!j67SaHB*rjhVJWGdHNf zx;ayaK|{7P_4ahx$eicd*dOPP!ZDuc{NUFHG0>rcFdH0G}?uiP=}C+vKOgi@%Om z1Tn_9s!L?57EdE7&wf5+QwCe(>$p2J&z~3JAAaN}E+pq--oO@M4{Hyj z{GB^@b|>Q+9>4v*84>G+C|}}^ClY4nCgCSKfOKaW`CCT*mJokZOg_uW_j&IxYMnKA zE$rc4or$a&-5YfY|21;IsQRS=(DK+e&;*8}XxSRqK(iOO(9DgB0EU*y+%OMl*vs6o zhxhjokoxz>6TAJ5>B+{SncKX(rlmdfB(-Wbw4Wq7S%Cf*HL zf?!c|wB>dN+k=N~1)JeZ+QK>5zud@c4=-a$A(=b^ApBqKIsmawObq#4lnjXkSHKko z#9b%0qQY){XfT6ja9ICl9`JC4cXsh%`X7(*KPyTe$be!QQ?Juxu ze`D50g-so6%Gj{z1BUbNSn*rqRZ=O6W{qOnfAUE^Km9Bk+naI9h*Gl|0I?Wc?b{dZ z$B&_H+LSrQ;c$#W5Usrch)uU#*Fiv!R_H%w*k~s-sGs{3iewof7t&h zBipT5BpvP<9E{+A0K^W6Vlvz3fA$+Lq!fe0y==j=@2fYM=`@b;0sejvO^JpR;XgXR z;-!xR*SrqrkowR}dB-81PTiC%)wuC6m$)4Y)DINEncAg>I#$IW7~l^v;rAi@;$My; z(Ayn6E_o)RJ5-AwcjklBV;sE3{{SavC+5vkoIS6B6Tbmk(zaFdBLn4Meg+}+fA%Z% z_burla;LrQkl!zCC}IY7XWCyNxq?vHQSd!mL&|eCWz;*WzY!l$Cjg?UdjHpB!-r70 z6aS1OK;Dq{)vCWIaajho8w_7B51hD12hKT$ex+aIud4ccdS!q+e+F~^BY#{9H)s9e zX;I9Z5E=Mw`B27<20x@kk2&+$cz^K{#`foM9P1x*d|G-M!hiaVsXzC~4SjIL%KtLo zB$6C#zIzJSpFTvhOew})m%y1A01D#!lr{DNXJQ-phI{LkxQzgaHGY2oMJQalfZ_Li zZ!y@d0^scHjQlavIY$47TMEm7om-0W! zW_g>P$wY^#z@0S<`;+4sAr8iuHW=Nc(do++ScYJXL~iMW+QfH%Wa9T+@fwudE~5P9 zD25+T)AgAh0-a2y6gX-5Jje)vfX9JGrX&wLQC?-l##m5Zd7c$70B*0jK;x#)PQ9euQc@7}4Mss1T3k!W%764Hn3+uzv#Xz*g3Cbae8%eqIy zdQRn9^?#F6yYL0%x_mU}21Ba#!+mKww7eYfghJHU^dJtoln6d&EPQX7O-tMwKW^$9 z2r=+yjUSAV&HJH#l{}ti{C9T#nOQ#VogLyl#Y-GRTye#$p=cgjd5&Fb#uIpvXF#Q{ z=>LxJO?>FNdj3v7y^T79&LeMZPmBIvCeg3kBTuXdAgJOkXX2^V5{&EJL_e#8WKBMa*v8I>rRp<*y1~Y=d88#;+m$mKD$l!+zg{ z^It8)t@D?NEYqTO&z4N^gC3L1m6&CR-x0p&oR(Gci^P=;XgX~r{puvMJ}$=mm%3ri zj*FNQ8)?B`6<%TB_gOL?^|qfz@uUG3{4{_;UsX%r)Jni6Ub|T+ z=J;2;_?!4|Pa2KZ2QJ{z^zr8H&!qWywTZdJ$vRNt%-4GPx#|N#LbemBlNKL8U4rd_ z$H13{BaGV|yE)s?qTER;X+O&3k=euR%=&-nn9*o;=n{m(XX*Q&sFX$t?-{d8ZEdzP zKFp`L7zf?#Z8BMji9d00SF}8M4v!4&&o3{9#0qbn!Lf9ytrYIcgMRk#GFe6aeZK4p z^to)}570hFNfqU<%>A>?K}ScMdHtL1zlhAyy$t+CHu-I3eOMoN#BYr^)qmb%;ILW! zN&8##TW5FB=_|H^AjV9OUGo<^#A}FyXyh;daxv5X+V4JO`X9%R3^N8eXtpx5nEa_z zVBNU`WpuPDz(LQkm+EhhH?RM_m>x|3e{8Tn#TjY(_LD0_sp;AGnCr25;0m0XZ1INm z^@EuwepzPU;Z!Oe;+=(jVms;iJFI&TEeU@b;b;7>Ok!ISy;c>!gxDTpV%ObB&H|Nc zJz6(p7E!GZzYF2l82A-)hk?82EON&7)61V~@Uz{C44t#lveKj10P!1`GE`arCmAOD z^Wlgnef^hxQzd^!z5)$Hn}Ahv5yH%`!1inkN$6s5_?}=^@@L*Q$|C#*N5pavA|S`oO{7Yc6K}tm^tpl^Mhb)bn#*Jr4EmsmLEU)q>wz ze@GN+OZmZNnLdj|aw6CH4znOD;SK!vqa)GWhW};0-Oad-!#9^Oz}bEt>D{cSvd*7!nafrdok9f7O}fY`+o;q1EO zIC6*eW%$cy_A>E@@410_6Xsyk8?sX>oo}=b&L}KQWeDo2T0k?6g_6(nm=WGe0T2!s zfljXET74+)X6@2m_^ervt(5U3fmHI_6?csmkcLrN_ zUqtTEt_*+Vo;Bw8Uq6)Euq5hww-1`P0Wm zne#t3q+jVGTD8UUFTcU&Pv4@j<>6i|Oj`6cX213(RDW%cF-(WC_nL(mNBD-n9)M)> z5QhKJn4V!a_$x-Nh`=n972%eyh_o|J?`M;~O-CD~DBvCdi`?=c*ADhaysYqFZa$5# zf4cz5gfR?%=_{iu)xTxCwz~4XOt>c{f!(+pgq=p=8*iHAQt7_@nTIhnM zbj=Pr?L{dTLta!2MR6JKrljNQwfl?=o-=)91%DOzkAFP|$;^KG`cLRpiCv|`DdSBC6h39P?E9_=-vXWe%g(=<5x}j zmv7D<#q>qnb8qeAfBWqykw5(z{wHSq2KhtR0ErCe0J|Hu=!ke`uLXr5zQZKyFMV!~b|p1%Ho|H!EF)_Ovxy4`bi5SPc7UKVm-AUr!a$7MWk^ z%i`}!4N%(wkV^RQacHoQvA^{CXMAt-_E%LDo}cc<581$y-20D5Km#_9%O^UY11_;M zerfz0oa9b$;yW?M{KtOpKz=>-N7NByR)w#3Dja2dbCEkl-~NxsTIgT3-hoy!87}5) zcG%kJ@3ziyg#Y3TZ!F!TB>le!!=E;;uUY$FN6EuX25&EeqdJ=-ytg-X3P}6Mb}{Pz zivD*j5hafwS>SDDdst6{al~&6?`?MfGbi>k zJ6OwF`g>LU((n7ibFbDUf1auSEDbnC=fPD=A*(wc9DxtHu|#C5O95#H!1rO+_i%() zC4B|&KmSDT=y3-5)61;?UBlf|=Ny)wm{b_wQ~##$t>=Ume^;me2jcr;hFSgdr%bI> ze{20w*Sq5FDsL`YX8NRk`f-u0a_V^%_&#ROe@12h%VPWL!hf)^S$EXo<>0}Ca9qCL z99(A(uJD?ml{yP!TICXdNCwl0L>2g@`;OuB^+zCiS#N))&3&m7|KIW!m}ZBsu+H{w zZz^)s=>(Rgu-20LaKYmGRxc9HmRf}3?cwEl=O7H|i|{@BaAEKe)9;=4?SWLRPky+6 z|2`rkf2op_W|gbVyl;tIS1tT&uf2vYAFP6M(W@2w$FAc}hCy*@rJJ-muV|Id74?6r zN4_)5$ATM7oZat3t)>8Jnb&P9l;tRqE2YFS-bn|U9pTmLYpB2WOEW7oNL5Q7FU=y$oMdi~oG{>bG7Oh0_( z1JeILHtYY7&H43xSO;Mv4MK_2%+l~6)2iU=FNA>4hLmGiP*_KlT4A{zgU2@hZoyut zzMlZ$?B7l2_BeUXqW&oxSG}q#$twvEtG0Nx>Kv6f_B#>+=}jKlmFV`T$Zu@)^0gQ@O^Fa(~^*qaqW)iQ>EaMCtfKz$Y5Pt6 z$B3tezmt}a_D%dv{Q9+5bd~P^iYoB5{!R|~=e#`JY-$lO{QZqp%A38PO|^Lb9N}jT zZ41m%a`m7rWAX9idP+IbjL#}BqJIJfRNjIpB!+0Xv8gD+IGq5I<`3dU5( z3V;6cDq!(iaF$loKk|4y`TZvP zr`}wr37cWkAJ*9{mcb>hV@KEy{`}1x^f`P5ME=7}{?lx_(nj?|`Z~JCqZ=1cFNzB; zPi4q*i9OYJ*>aeg-mT_gb+L&;WIMM!)fiO$ejL;S^cjtzkl@oN#j}$l`=cb zzZ?IywSKxvt#pV#Ph0t&E8r}zxc`yI5}4oD?%H7Dx6bge4tm%Nf~eF=hj?cFk9T$v z{#Y~qYlJ_?f}c)Vv9$(>qwnVY_V6bspClFi6dbemk0kAXp0xj3L;Le>WN(;%H~vk7 zAr|M&Yguvs?cg&=Lp!}g?*DSL`+tnw|FdWD(XNvYpJ~q8wa_kH2u^A$bTejv{pb;0 zKn3hux1d?JtV;RB;EDa;^qY-1H?Jb2GHTax;!kK16&1xqH5upC5J7YG@PbmuW~MkW zHun#2+s^wO#**6q1~F3m&HEG&>& z$4jBqnAQMs#Bao3Ps&8dy8U=EwL+itApDvt_-Xm6kYMe473`PRR%F`km}dxpu&b;; z#j9`cM`Nq{_t>$cYJLtE9GALav)JHe>>$_TKqn;*c)?Y0vX6k>;!UVjvMTY&*oyEq z^KfBC#T2BTaXX>OKZip{4>>HqTn^KHwDosY^{402dRo`N&4G&g59-(3LVw(OQic}6 zCbtZEV9XjSj+#G z0Lbykwz^W8zO(ofXL@h@7P{dHcg-?Dw238o5Bn-5<<+{LSS+RU>uyzr_iqx*OpQ1< zFdF9kM|uxI?<0GdeAP{xHdz?3!Tw$*vyWw(@S=Z%3w6Hq<8drV6?y}wDtwc$AY{Ef z)RMnTOSC(xFMjyoL)(%M^?pSxDTor(X-Xb54io3lS-t3kDGBNS8l4I%(FIa}*AEGn zF3;c)&*FOE;@I~r_z!gNkC-c$MZQg@6f}#SLmSO4H#fI_UO^Ew909TlD$)bD9y*KF z%icipg9jMUt2>;C@ax^DH^rK^GR+q!K4TPls}?0!~2!azAO1PXlL-?ePwK zcuBAt!Uda&=;3rcfRAR;24t&pH$>sFXO zWg5Z)>%p5imK{O0)Q;Ww6lSog-* zci~~>l%vQd)v7bW86=<1Fr|V9KUvW0AA9_^@SZL#Bn)V8_xUpgam$NQQZB=hBWExy zrmsQou}r!rHl`o8?L2}(gL*+ODykd=wu7gJSawXLMg6b#?+Szb!GHn%9^ANjE5^8n zN8RhIp^5nz>1r`jwNgCQDv?KYo|0TKQ>Q=%`Tj^JM=IHaX7y@4U}=a$d^4i|?sV^h zA~XJjom(S1;SLgmF&BnKtEv8=nHv>tsbw-h%)hsHum*@DJdyvflK+UkcH0wHi=fhL zOdj3`!@oYue0qgCWB&5KC@g!z9QXAI!H)N?IV^)UJ|#T`1(W7l@Duq@^=}Vz{-uwz{34MUj|&z(w{2M!UaYK-+-ak&>faVI@wc(;_4-)5^#Joa+M4h?!uthJ zXZS7pUzZjPKRu@B&#xhWz5{-_4gOY^{55QUM|eL&`&;lE+TYL6{*UL?@cui%i-T?4 z|1O66Pmb+c`)OrRQW984k3!d>1JJZ7bYwS5L;X|(HaLz7Wsdjt#fjkqE&G4}o>czf z?AfzpqoShro2L-Dd-tV^1Y9s zcqPt)|8&oa`rGoM64DAQ`C!>aO0tU(=I`!M|5)P#iT`!azW)WwAczj*e)|uCIs-pn zTZ3&=7tmP_%%Z2v$O_|x!)^e?CY~+Bi5~A;@W*u@MD^bk3V7iGkS&cvb$nO-+8i(4 ze85^C9?Fyf-3lW0{=2%tx;L`2nWr?UF8)k7wnj^YOPlJYfUpwl1u0FFuI=HQ67%o! zxP{I}{=NrysP^=ZWfqb6tz9p#H*72{7SW=u$?UVvvr%gezv$?j0c_s{bG(l$3rE^D zgpt3`x%=4LLH|~lJ#C5bKVXPJ>ty5DY|hn^f=l&$LSn(=c^QHjWaYlJTL1g|e`0#{f**F~gog$*M)c6G zEzr54pJ{&Oop}A|?}7dMm?>~~l9EkpfH=Z8ZWxB!BZi{Xz#p+`7vc>ItCIWAopkAn zX&RUh>6q?rF0jscv!3$eWJmMZ!t>e0A&3Yy)qh071N`1J)W{!3>+j>^8+Y&O`4|r( zIGC*J9)s{CML(4(KZofbagMs8BYdkm0u;VG+f;wj|4)(r-^ZNaxOsVb{Seh)_Lryf zHbVd*T!JgQAe;WjVlx4dj!j0v-`{_ibvbO|`$tSbQS36v4g777Z^PMc!!7E6^}?N3 zBKi!T*|gi8V=?Ye(Rb3TcKbgJ4wy>AGWCB)cw_%J)<61c61KL~k2w7nUKheo*I3M@ zUAyHNGulpHfHJsC6WGdg(-|B+BflfO_48L1zy2B55o}|N`qNYNzd7c&#y>B=vHUda zz{p#j`dj1Oge+W)?etvylZJL<_$LjGWa>|+{W5=7lb_-#f6lnx4*4qu7YN?hKg3S| zt6YCa`0BL3Ej(qeZvS(He^!1Y*50#c`qz&BvBvwjvT?X=_4pOyQtaBk4=vla#-00* zDrVl8ZD9=?Fy|<3%%8V~?->zx)_8jEU*R2X@{{)GS@ZvA#zzl-+P(S{1+=Ggk8c~L zcv2F^Vr$FzK|aM^ZHDe-bNH9$#mu(%4#P_L$x~O2IMTMAmzn)nO7x$nIscCzzQHmM z9`)_h$3g!$dkSN14>SCqO)B_F{|D*+#^(=hw`{eloEEO`9tdw#-y+aq zZ!0P+aEPbtL?-*w ze(s3wMBX+r)qhz0J#1>xs9O9C*VMlpwsTeW7tGj>Z4njv?^)^(77?C2A7~;zfHp81 z?9v<1aRktLc7o1@_;6fL6cw*`i026FU~AjgD&+6Qqu9{4m!7{t!z%0l)>u`I>i_Np z%`?@%IzCuc`o|n!9skRG+dg$Z#{9OLd3FOj0%Lz$g>5fS&=G%ZSC&r5ejFo zPT;wOGB;BtPKB%_9#U}@v9LIFQsBGhy!P+{^1uqhf>4z51XFJ8M_Kkkyqs_t;gf;92@rd0PcIVbNQ!`wICyM$#3PmMj1B>6)uQuXwu~{jLANfiwfeXXVP3 zMUL>EuFjm~h!(7(ySLHj%%##mKOgs|_fuKhA{wz+!690rNSI+viCBDk@T`T^zTZAh zY>V^&d-yjd#Wu<2y43L~6?yeObGa~%>^+WM^u5-vo3F9{#igZNE*xi4(PC^+#j!Zt zEso0K2;XQ@Y;vKN!xEOtnvni?iu`oO(Es|_=zkfbB4@tS_Hmy+EINd4XA2DtJx#l{ zjYF02K0ZE;;sSs1E6&RFn))E6NTE;^5q>t|Z)D`p`g6XN%0s%Z-t=Vuv-W>Sc$by-@p9-^8dH;+u}B6n^cG27QRDc_iFR|`}-p8K@zjuh<#XW!3`Qz z`pp*Jf8+oZ@Z3?Sv=r@#vvK6qC3M(*3@O70z$kx+aUDw<@_5(JiNG5-E7+|Rg#mu}raT&s3?;-rMXkATs?S(zF4iT+sk zEH;M|mt|T5!ybO)@&z$DY$4aJR9a_B@cXq#>(NfeCjW zVR!R}O#gRtbt(Lp|6hLd*ndnQ!C?P^UAG?nUP;WJ z`ExBenXM6h;P>b9h0O7jCXB;VHXlBvGIZJ-hd;LbiFVuf;r{4h$l-9|A(Pp~$JUTP z)&~EdfBjW${(rju75sD&Zt8if^rDb`S|1#-qap3`@7asrcbrDMZF_P5rQ!c|^?woi zr#k+ZW&EaM{l465I&2#s4aiINK@Yks$T)9GGl0AzF1hOU#69*OY}ZO_8rX~@ha^uvxbT*)~mdwl$%Usu?} zuU+{zv~n5PLMJ5LeqaK&Zxz7=KPJDv{5x|z-I5P9A3;87dQg9rO2@1y!{f1NsP7;R zT!jz4cgsb#eCaS=Wo9mPx^NawaF`X)_pwe*Cq>$ z_!qPlt0WQ@&&7orSvPGQ@B4z~|1+FmNk1S{H2zWf{%(p*V`68dc zfBFCW`L7*bZ!Z7nv@E(-TW}TJbV!-5<3_P3?cpz8ycn!i$iWr}aqiqXnOU%g>*C^4 zykNnCSyuS=&+&{W*u$5Ul>Dd`i`iUPSM8H0Pbzu0EnBwy)e-(*{{R2^i9Anuf%>P~ z`akFLd$YKTgH&(em82xsADcF{>$8isz1OWjiuYE0{)5gD-m}d{XX^iQorF-8UNK>z>%07*qoM6N<$f?%Fv4FCWD literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПиктограммыФайлов/ПиктограммыФайлов.mdo b/SSL/src/CommonPictures/ПиктограммыФайлов/ПиктограммыФайлов.mdo new file mode 100644 index 000000000..99c9a10de --- /dev/null +++ b/SSL/src/CommonPictures/ПиктограммыФайлов/ПиктограммыФайлов.mdo @@ -0,0 +1,8 @@ + + + ПиктограммыФайлов + + ru + Пиктограммы файлов + + diff --git a/SSL/src/CommonPictures/Подписан/Picture.png b/SSL/src/CommonPictures/Подписан/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..b3703f23f4869ca18b38712c856c691c0220a5f3 GIT binary patch literal 477 zcmV<30V4j1P)+L+UYOA@e~t*f8G!#;(98NLGAiY8@a z40?=Y2ArAbJ@A=D=(#;4gCcGJGPkTH!!DOpw;#bAc%?82I;>y5Ini2nQ*PK9=Pcq| zj?q_<$9UFfDK*d>b)9mLUZ=q&m;uXRoWcn(56a*hT!A(40Zzguws<`aFNs5^tE%%I zMqcMxLk=VZ`M!e(umHBe59i%xk7V3gu*b-U;bYQcl#RN2&R)!OZbqN;uK)u8qFi7q Ti2X%-00000NkvXXu0mjfd(F-q literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/Подписан/Подписан.mdo b/SSL/src/CommonPictures/Подписан/Подписан.mdo new file mode 100644 index 000000000..bad300b67 --- /dev/null +++ b/SSL/src/CommonPictures/Подписан/Подписан.mdo @@ -0,0 +1,8 @@ + + + Подписан + + ru + Подписан + + diff --git a/SSL/src/CommonPictures/ПодсистемаАдминистрирование/Picture.png b/SSL/src/CommonPictures/ПодсистемаАдминистрирование/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..05e6260e96c8e24f28a791be019fb4cc9bc7f93d GIT binary patch literal 3378 zcmV-24bAe2P)fBR5G9G(H&Pg8_XfF#=H^AiVh`Pfff;6QdACq(pd7EDH~6A;`86 z1HEnA?cUFI&pC6y`1`(@v%9@-Y0(hb})?=bum% z<&qcw<99dqaY<8#&6d92wY^;6JH<#rF$fg|f#O&;DnY2CSX3)RLrR6$PK)1u;aexC zuLt1sJx00U#0mlgJX+}9w9hDP*cS!ZnJ$j@20=KYrF&qc3kX9GDJ>&zi!g8y`VQ=N z1-{!R83)ycGR$Tbn(9q9>+@Aj4aXI<$NJW)eq!p#5tm5O{6)UJC&&G&ea7voZhB!%s~8`C15E5Cgth z-J92itOC)=!{% z_B}MF-+=;Gqee4yTl=~ZklJ#OBQOt;z*;G)zD2r@ZsZ7Tl7KD7L`X7y1RaoM$W>&a z2<`eLTCF-fPeZd_MXPxh?ZrC1u!;=hJxj^ubjVy0eFACpqJ9@vrLPBWof)P^U#@YD zk3F*v$Du`B4X%@dV=J(^+O`k{p0ANu3TY#`7nWD$e^$s=polu3#W7t*#8?z9pNp@F zRz~6Scla+^;L;g^G2?`ooA)H5DAXuQLPEe+&Sf1b=V{;*BH)-d@~Z$Jg}~Vv2P3!r zL>95d+DUoKsflp}ii+vkBfL&WDy1QpA+drc{U)19F)mCLO4{`&U|RvJsdr`Yl#m2` zKSI9ea|o3bMsL0snx^6Qy^730AsI%z==AaTL~6jynZr=k2-WHY>I`zDf8SGYzy0=O zhYlS&nB00y{Ih4zo;R=20u~zcWfb~K(6bl%zI0*f?@W`q9hjS&!(ZO~JGSrG$rP%y zS&E?N@<=h=W^*~@^TRNhes+$KsK{7hB2jn?*IOLhxhr5cb6pof7+`#y7UXBo^Tur3 zmMdla!3Q5aa76-{YzjTYo0wr-RHsfdRn|y?xm?f4Y6`gUY?ES3|IZbM(P%UB9NKsQUtHLajSPFQhY zk;k6v?wg&R#Y->!>1hIZ=86``6#J3w9cJNj_+tZ}NRRCr?AAQbwRx^BNz`hK$gR5< zjd~sZH{6UA!K4T(#UyX!vXV$XpG8++ABI>XJZfKv>v?olo9-8&wb($T*@V@q;rNLO zv`rHRt>}`d>4)fAH;UauC1IWM!1udXS;*#DXg0&hZ-Ac9@VFp*7|&jyR9H=?;o1!} z9bjN&JKlQb2)_LJJE?tE;Y0)xl|%xmO(3AV3Gw+kU^a^MGy^?=TIxeOM_hdYQeFVv z^Z6_fn&+a(>aQtrJXs`0x2ms-Koqd?vQI%Vm^}o?mD#io|T)2*&iXR+=F=#1)SZRrH*&5O!La1$r7O_df@glA&uLW)`1dO$C z-1q&RB=Gp^2*@nMAF`iOqbkIJ68IkDqD3+3MosBP%|;WYo{ix1P%u)|IHdMt%|}xE zUJ%8ggNp$7JKzHe-XVCK=WJR*e#djd&8$cUw1|!Rsw#0O$0Nx!;zT5R9*=(OG~ikl zIIRT&)Ntm^8T9qj4RmT^Qf<&zO4hf+kaWj#* z276M%0%O$vKBmy|RT0P(*PwsHM(O8mTEk=7Y}F6bWeC8rWeXwJxoIBz)Ok85vxNk$ z;G7`t1hA|JL0k*O)Fxv>x{n~?EoonX?u^rQU4Jpxs!2)hwe|8^qbEv(QUDw1T%}fery7F@Z?BO~-ZYr9h2+-IKXK zZtg@Y5+&}_;QYKMTfkh?s(Y+KPe1eY=~WR3JvM5s<4C1Tth^iOI&0_`UC5{5`A)`(x7pM<2Kf1w9zza8Gcz;w zO9k*{Dsj?EbjB_@#1<@&K}_ii+M*5G8##9Z5z&DTl`$TTW6>Ms+Bi&$J~ zW5CjPqyi#IBqmVQye=QN0VF%wu<=pF zM1{p~iY>@g%U#m6lB}K2LPP=>$*Y*2o)$fjXiiq|Lb-x|yjgCbIK%-%jX^8QGI#;X zFjVySWKc|J;glGR)`w_KeT2DVz+yW>qs2C$|5lXxMv?Cx#?a_4+&|izjEQm6cdTk- z+6*w=4lrYdQsVBBMU2;F=(Zw&MGF1JFMr-xHGxfEIr-el*LUojo0xc{v{pl|x0}^9 zl*71asYQW{f=I4m;#Ok%%B58~$mH4nZrr>B-Rt(Ccm3@UNruG;AAIn>1f=T*GMNkt z`5bQVE@Drgk<7r6Br$7=x}nN*Gt<-cOZ7mPje#5QIsCN~Z`^bDVtMxQTDkd%o?Xj{ zEGsv4J;#)*d}xP6LI`RWoA3HD1~=?LPj@%L>T(cq92eVeWftQq<_9sLpPD!&GK^@I zQ79Hs>f+oxG!J|I6n0u)<$Zh6Y_?d1FI@w!_=ZOOjsNWhqcZ>32W+!-$6~F1gRa`! z&8Ai0WR_8))a&lY5aa{@8ah;`AkU95UOsc%FAZLqt z^#od{0u1yHqf#!5V)*zAzkmL@kM)Y_oY3afNXaMf$TG>QZ{IR9NHc2$oZA1Z=bzoX z_pWVXFXuw=6vw&XoUoACT1ltVlDNp2c5bXE_Yk5UJ9hNhRBG$)mtTIRv}R2o1_lNguvz38 zu<5h`KPOrepMf1nlZwqO_WDf6RlN4k&MAqnsRKLbC065TkXZE>8TG7zH#snuQ%nsCEz5-!d<;mI{*Lx literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПодсистемаАдминистрирование/ПодсистемаАдминистрирование.mdo b/SSL/src/CommonPictures/ПодсистемаАдминистрирование/ПодсистемаАдминистрирование.mdo new file mode 100644 index 000000000..a924ad049 --- /dev/null +++ b/SSL/src/CommonPictures/ПодсистемаАдминистрирование/ПодсистемаАдминистрирование.mdo @@ -0,0 +1,8 @@ + + + ПодсистемаАдминистрирование + + ru + Подсистема администрирование + + diff --git a/SSL/src/CommonPictures/ПодсистемаАнкетирование/Picture.png b/SSL/src/CommonPictures/ПодсистемаАнкетирование/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..efe0e88800d4221c4ac68193e0a06165dd8d1e40 GIT binary patch literal 3441 zcmV-%4UY1OP)5M$ z??=W=CX<*D*bD@d2nZ9Cf^wlsDN98JEACR(TD!FcrORqrm_;m0%Lk%ZilE?9un@Kk z6bJ>1gr^qDW(W}SnhBGc>FJ(+zx%%T{Qtc@nK596q_yx*{<;0Q{onJQ|2yY==U%~e zUHmwT|+egO4PIv9U34mZIbX8|(*T!fx zhTXe&01qDuV-W9!76pKLk<0 z^zm8Pwu^ebjzY0G{#T8GcN$OK^Y5{>9mDt6_3CQJaq6~fAFxcj@_aI+=WC+%<*$4d z$@%#siNxHjszqxJ-Oxgz5TfnfV1TljEDj$zj8HK2@afthoJtmYryxH1$ag*}Sk}Yw zt^sxu9NWT?iUg@|16Gf$0$aIQD56@cq0!K>kj^5PFR&d!e_uCVc>Y-!dLz4fMdZ$C zIB-a;CH^$jADO>&=MS@|8pLM?V9&R24NAf5<&~RIGhKwN3SK;3$BMy0qDn7RMFI18 zFc_qul_1hO>~geQL?0WLWuajhSV%2kc6Juo=~pl)7tkIFz-Z_*vZ_o(S8>0%PFeJyW=3(^?G47Tl0FWElF8Rjnc35&PKO@%bOzbMw_Zcka6Xmo19{K@`Vz zIZoaUV8f~bGP=HCVnb+BnBoT_NEP~oMu@9ZS-5BnR zAwcWcr35HoAjvWcy3MYITBX#}vLN2~KR0cJKg#6o)q}l=$Kxp0bY#*gSQIBBea;dA+qpFxRz2G?01okAQKP7bqUcqXw>>8k ziSWtBrcKMgW1!{|bEpx=XJ%$msg`Mn!u-32X`_^yBAQ8XiJoQ3TJ(D6?XuIE#K0H@ z8Z1dAE(hQ7q(U`^s$NFEzJR#ejj$X=d$@xGTlfBT{G9X7J8#)IcCJLbcpLrBp{X zZ(&efj~lMI1@G$_IeBL(t{hs-D5nsn_{n8*FbRMZ5GGnCC3?_5#;mf!JqRl@H=gBX zZ+hn(sO*K_M!`qkOeG4)E|g&zHdKN>YwX9r-th@6N)B*RMu3gAHC zwH=?mwbHU3Afv|Ja2F@NOfsR#TP_op?Z%1YBK@KRL7Evu`!o9P97CuHY~iqf8#RmH-A$~ z9fd~Hq*!S3Uz}(e099%mW3+IzF3LWE;1H@bohC)$vOEa*sBE_$8$TZC8D*t?%U_h0zq%o8NiG-PKC+<3+J zaM}4+a`3KS{hByzo`L2NCHiF21;-Q&6-ZQNzJaSKfggo37-ZUyKbuPT2WuRMKxz0aKCBl{x>#zYxIhK8Rgs zjA?(9G7#AfopLw}JaZ`so|S;f+ytI@^B2_rQZ`9h_|Jd*F*dH*!uQ5;mSieF`&jfN zy;_8$SD=Pvk`N`T;=B)dxn)hgWg8z1k@RgK=m{>;1Ta`RIptpf4Z+Y z27ZxbgcilFzt zyzmy<+BM{|RDo^YdQP0bJ2b!(nP|}kp!r~v#Cj;TLan-rEAXT2k zIepu>k;D*Av1WZ(x*LA{Qmjm2c;gTbPA2&dghHWbTL!?gj1LB7jVr_S^y^r=>2k=# z``4%_30R)b+mt@6)B15%|HZtx*-e$|oTwK|YX%#oEHyBa%L6#GP~<&uG#Y8$4hW3@ zB-~uGB0qZoD+$0#%I)oxBKH%BhUIYOS*)h${iD=`=(uFvr_dc6@I;;PHnUkjXoqt1 zN2#+T2~FMILMqQ~Pe)O2G*H(K@|=UYnJn*pv#Byx#Xm$;@${1A zxXXbo%|w=gLh>jgu{LC=fUz53^!eUXvF(&%fQ%k%dSCDhP&sh`>0%8*k@QQw&hxpZ zj9@f!4N}GZIKTgVY+3tJO0Db%1e#?a!E0_<@JfCh@VH4$BSh;5Rhb-+=Bf6-nYUcALsw>u^_q1W`gHC}RHA$DpkI2u251a8c(90R*W>V3m~#o`zv^O-eP|`zwiDxRDO@c0lwh zK_yE)fF>hftP`CqR2#-IIz8+IF!%zVt*m`x#i#tP0NAqngPLW3OfOW1Z6nQFNm*0T z6;n`6J_aM$iJBM(DEB)ABHA;8Kv07cj**u|zBBHUo>%hIs_1$Ys-~yV8`qGS%W?@_ zC^r}Y8BNLLCqf^P;?v4LWdN65_mdmwaKn@L{>Mlt(y`q#>f6jlj3ZNy*HkesxvO0+c*6xyiId_ zPcNN%)B9)qgl4fwdt0mBaNT9=&t2DdQAZ?nsVq2~1;>gAu8oi)LnX=uf+0$|CMvW$ zwYp9*pusX~2rB{x*PMg9@7{xIr8fDqNB-~gjBUQLY&Lw_F#hMg2Q)2sLeorA%?sUn z*ORRMd&S?O*q5%`{tsub>E9YPtSxH2e7+<&5vmHjnU8gA{IOHLp>nmFOl5fhmuvby z-(b^Ux4t9;m0S9h@-Km*nfvZtPbcX34BH(xzjWP>b2g0jZ*8kLF4Stq2SnFWf|Sj| zu`bL^&k)^A%0T8DzNeeUSA65`mOrIDjc3xbKed6LSlbt_zUacy;oc8Xa^3LKAKqM7 z*R6xEAIskO(!? TEZ+&g00000NkvXXu0mjfqNcA1 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПодсистемаАнкетирование/ПодсистемаАнкетирование.mdo b/SSL/src/CommonPictures/ПодсистемаАнкетирование/ПодсистемаАнкетирование.mdo new file mode 100644 index 000000000..9daf06dde --- /dev/null +++ b/SSL/src/CommonPictures/ПодсистемаАнкетирование/ПодсистемаАнкетирование.mdo @@ -0,0 +1,8 @@ + + + ПодсистемаАнкетирование + + ru + Подсистема анкетирование + + diff --git a/SSL/src/CommonPictures/ПодсистемаБизнесПроцессыИЗадачи/Picture.png b/SSL/src/CommonPictures/ПодсистемаБизнесПроцессыИЗадачи/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..7a25a3a5ef82515554ff3f90c700845e9c21573d GIT binary patch literal 3554 zcmV<84IT1{P)_Uj&UbEhvnSIUsd0%sT{(tT+YZM&39;EVHzwgzZ*?Z4-&iTG`&RoIs zJiOHs1Oex}?*ESmE>0xkyXbCz>3I#KE!g(L(?5Uufq(nonzj@E?|L*|o+<9|o>AX-VcFxW%;?Ut^=<4o)APSf|JpXA9%E8R@OBdjhgGZhaB52KR2tIxvJ=V`S1P#v+4Bl zR4O?WFv8WkX&I`jA{^}i1C&|J;MnnFP!)CW`2rADL*f%pe&Zv8X99j|<0fP`511&&^|IW(Jw5gXq)ph=ycXb#qz^=qDvj%_ox!`?8D0y`TB&52xM= zz^YQnb?nig5yq6%hhQjxbS{gNCx4DqIt{}JaN`4d0D-`n+X(3Vs1ZPRJ~T8)U@Yu? zViND)Jc54Bfu|b%mSy%kl`3NGksFey)Av5~)lcr+x$Ds%w2T9SD2|z0jJzvj%{dlstYVrR=pJpNx_xfBf#P9TnOQ0LcT(I|QILL5JK5`TE@Rg}wB9tlNJp)+qA z27q0CRL!oM7abXS)@kFHSObA%yhBsdLY|8*NDF5|97&SGFu7LhWzY_|D_-1SK<}*KI zppvO1s+8l?(=#YnN)(|W|EzAiD9%k%nn~~|JxioobUuAHby^JvMu})}qyXizLef~k z{{8#8;zS~p$Fj_iEWg9yFh74Yxb+vU=jWR?Z93yKn+jY#m!|q4qf)8CBBdfi?Q2;f z+yB_D5fQ>D+B(Tl5sEA!naObZ92y=XuU0r9+cGI-()|3xAO5Si7g^#}gCx=_%^^tq z$u4H;J{BZdm}nV*PV|hD62l30BB*Oz+ZU;-MxznRXAK&ULYQlHBHoVQO}xtg?xmMr zIwLZS)GRtIYD>#<8{}+}h3hm813(38%nK&i8Bdp7E`vxoN}hGO_X!~f z!OlyiGKNOh`(0^a83CeFFXL&8m{JvaM$ksAiMAHD6rFH}hYXUTWD$dGO)8wlGPs^#pHkExUm$*M0=QI`B9G zF%S1Y^>sY@oA2RJ`Tzt87}T!7uASe(_`!oT8z__-1}|_-ZdsLWwin(qFt*AIucL1` zhN*Ox=fAG26D0w(9eDLBMF?R7^ zlN^R{_10}fZlBTD5tYvY2U-TeajmOW zYJKZanhh64Ae+tN(|_?L{Q8y0QS#={sLS~5_PcP^@Sj7JRbHW);X&d>|Jnf}cymN$ zM+SfaW1MlQc4X6&)QZTEX{VEm?2FagcRzWobrFEDMPkya$Eo_VnYPY{c|{B0Z$AD_ z+`sp3-1@P<$2FrLz{L1C8Qcxiw5eU5hDp-Oyw8Uk+VMo3A0wn%I*pw*lF(fGBm!i7 znTi=p9}4omx692x3E;UsUs1hM{$e&h2D~bYE;Vs97D`40Kl{b65p6SY+lO`&S-bhK z5E+WhMH?^SbMdAtuH@3nyq>4InbirCz?>#vD%FF_FTcDgq4TdJ5jBv_Pz84R=sD3c z0AeXO#>hshfRShehHK#HY#IGS8+bin1*lfaV=6g|(xJoT={6#=%nf6T$u}X0(99h3 z!7Qgzqe z2MsA20aWR_OqMMhPv;){*T5TKXp8=ltzw1-7|A07Ygn8w@EJH94!!LN{K+~Xu>7ZR zdt^m!<`BQOHg4d3BXMqU-D$uiQk&G!S#<7Dpcy8W8K&a>$g>qA1vJM1rLhZQDrGeA|6T9foe!j zFYv+sv1g7X>8l-VU}JqA8<)=qz?dEk@D`Y<1A`FMs1m1ML2r8(PR-`2bM#we?~Np4 z|DgB*rd;BNv#WyOtB^p^1QjqMu+D}f8s>9F;*oRobSl$Ef2gi7zQ&Z6wt3C~L{Z#q zR?9RQ31F>+AW8@+BGRus1%2%YG1R+;lhzYt8dM|#!heG1DaE5gDER+W_*j6b4{Sz& zqDPegMi*{5JBaa6?^VDz9tAi|x4kQD=ZFhX7yd1RIX!+5}~;1TeeDO6dQL|4o} zDw*N^QNC1X05qSQOWD})0qK5Pxo;c5^|yTY4m#ZN%ZLAVPz|;3aID&PyI$W`uH^fv zWJ1%+=+Nij*~e%oAw`+~Z)zt@h*|_fAOStvi*VNKX!+a>Ka4{4M1w-bHKvHhMcFZJ+<-wyi@0UGF1t z-T31F99~~Dog=TE%G~wh#3@GNyq`ACJNB0HJeTBiNA|&azOlByTlbpv-LOQw%h$Ue c!2by_04l)O5PKeXjsO4v07*qoM6N<$f}+;p8UO$Q literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПодсистемаБизнесПроцессыИЗадачи/ПодсистемаБизнесПроцессыИЗадачи.mdo b/SSL/src/CommonPictures/ПодсистемаБизнесПроцессыИЗадачи/ПодсистемаБизнесПроцессыИЗадачи.mdo new file mode 100644 index 000000000..50df88fd0 --- /dev/null +++ b/SSL/src/CommonPictures/ПодсистемаБизнесПроцессыИЗадачи/ПодсистемаБизнесПроцессыИЗадачи.mdo @@ -0,0 +1,8 @@ + + + ПодсистемаБизнесПроцессыИЗадачи + + ru + Подсистема бизнес процессы и задачи + + diff --git a/SSL/src/CommonPictures/ПодсистемаОбменДанными/Picture.png b/SSL/src/CommonPictures/ПодсистемаОбменДанными/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..69d038bfa6d09e9bb4cad85e57484224949e077b GIT binary patch literal 3977 zcmV;44|ed0P)D@jB_RCwC#S$m8ecYXiN?C$J)?{4qb z_TBl;kFy;+b{>#gj)_qNNeCc8qNGjJ5Za)YmR4<~B1o&EmI~BAlBg*yNL3M4K~O4M zFpp4Nsy-5Eqd38iZAkp~y?p1pz1`d0nVt8mpWp1PePc z`V z)-+z(P|AI%+}~gB>o37J z9H+6Mz9faxe~pd|->`k_mfN;%o|q_PbCCH*9JcG=%;dCrZg%p^$IqPl#6NuK;LK0m z0Z|^6P3!lU*JSo3qyT{*pgP@b5d6nNIrsvjYsA;>+%!J^;G^$-;J0qtx_wlf^AW(~ zAH%h9?D%VQU;mc__kHJ&k01J}IUq_VKfdMJ{`KScq(Tizzlp}oQe$bl`OvYyUH?0|y5W9iIFAm%s9hbo%U1>VSMrt`{l~cx!LI zN0kSm1|`%Rp;Mn%|NKhe#UYyaKRnllDXMS{ha=Z}*9ZvoSU{a@WC^U%8Y2M_qA?*PvxFUj_mqi zW%vd~Wy3DG0cx%X*2m|Ph ze$zHkv)ZVcZP>m8pTGrpkKj+9I{V+p4xfC0(O4ZGA<%9a*Hl-TKXt*vj zP({I*!BAtqtys<@2S0V{*()*D?GroqzvtdN_T@5ZmW+cI9jIG6nwCNEegs}PF+aaJ z_sYT7?j`tFuL}$P%156{Pwd`v+i+gl)!(PQ>F}8Y_dQ=bIy^P71(su?)SAT3z{9TW zThCi{9B4JQ z|G$3&RH z@4Wq!P!fGuuGOHbDiX;Q_!p{+Ra`hfJN3eMzV_G)&mVYRI5AvUyMNp5>-YIm7?+J7 zt(I;%+SJ_Bf3zj@mwO*MSARne-1_maKJo1D-Sy{^Uhii+#xE^875r)E990`~P_M*Y}zK;kn)o?J&3b*}3y$Q>g{| z$cE>0c^;eX67F9&HXFFE*{ChTciMHsR(`0+>hU13zyIJzP9N&ofxDml=3hMd*xeuA zGME*R7@-iUaJ2)%p+>WXCQZ{c1d@zoN?~m?qP~go%oNra+o%kUBU2bfB9(_s=Ryis zy|sY9`=8I@N5)Z}lQA3&;dg)Gmyu6Os8(w@KUafo*~ls$@+s17>pV=gddO}s|Heaq zGJW()4y>ZlG$Zq3)5Ua{#D-iFg9^bh6BeCGBw0iml2lD-RY|q1Z?c8ys-5i~7AeT)epG_d6 zfIX!VIJF~_N3O6F>1+jyC%%%tW+4k-=X}7j5(Aviu^(&{u`gs;m4y%thx zGYhoDnkJ=(3hTWoE{e#Yk4X1y-^t8)*f>^#Wm!mN)S_zm2&6MGI$*4c_86cmRkj!4gDB(8i0|MCP$h$ogDW>B`?BQ`J z^K6$H@K(6@e;)xG-PY&WtaQL4MTc_7|8T_}!XJNjPYw(WmNm0pV@)>^4wfJnbMTT0 z7G^pskqEq)CT)k-S$)Tj%E;qf6EZtjbJy#deU>ysk^>pGE6v#gjQmQ^w-y{-pQ4+V%U zj6R2vBT?mEjCgp_2@xpAbb51Oa!JD;^8B{7{p4mDirm>Q=wzS;%_3u%SZcOWsH@22 zODL8Hqn_|+!viHq{&StCPA0D${fl6^`d9`2QU-V~l%nf>-q+&X6ncJd4tNA#Z95#7 zWsKxf7$B`>*iZ@Hyg&``g@UFNkn$;H!XmUx5{nHLDm7rXN|xC`XIm!PEW=ER<90sH z@g$7F<5J{(0d7S$d=Ywy6R8_TTwD;C791tOK)Hba$~cjn?2Sepa=k3M&=`H0IzWOz zOLtLI4OEvkEY@47HC3u=8_TMO<(9?=`$#eBiETLy3{Svpa_h)(+0ah1(c1*oW_g)3 z?gxw(o0y|Cb<4JSe=<*7XBNE#)t&)@f+RI1U(BPgKZCx?AZNgKvS%G|DO6I(nYQnCB-MAeItIA`&t_ zGe;rIWhJDtxGI^hazGiVEGKLoGpDJVl`>qWutY7;Nn<+4X0h$-j1g=$%Y;YsZ418H z$*^FHuuJwqH0ws?=DSu@Ixcr(mR4gaEk`}zxXiMseX;sN&=Q^UqywEY?ZhY1s{@I2 z7F)M$M5d-g78FKsHo-O7to23SVe;vP0h+61LujLSosP7!O9E*nUYd9tKA z;h@HI+*I)T04C3e!D_jU)RyLR;t0H03xJEWL-=FBV{Hg8QE#KB5A^InRW-5DaK#AsjX0u+ z*AU$(hZnQa5wuPTnasAO3i|b&o*fWOBNVV@*wGDDgPNe5G3S#RxHcK-7S|S|-{vZS z%Yu2fl~JGNpk`b^ZeRn_`7tIiMb;tj>*@-Sm&zv^6X=|z<4aQYMi=kh^f))CDtrq+<3!)W!y8v#^?D_FO64El1B z&8e_im&h^=s&k!nY*Mt0Xtg>2^S|;rQY2nJwI-A@@B%imoS_aBP%e+4vaW*u!6CS< zqrLTjHajW#n>P@oAAz;G8w)r}h-P&-g$i@U811-G)B}McLgGf{V31uB>6=kn$C8x` zJeOzmRhGgM9KB9Q=3%v~u#9H3AMnUNQnD{%AU{wdJrEkAWU?p}G6)%*}_=dBBiE7PBRiR zoAqzC>)d_SqSa<5OlH7!M46_d5^`ulksVi#OuP}vq(h__z(5Xr-wz!6_`~AG(%atk z(P!R1vUcRYTw2}}`1VLbR@St&77VhErZ!*@w82_#864R7Fi)18l#CW(^bx-jF^S+o z>5^i1)Vni^tQ@O@0GCGWNYRCU#Jb^k9ALQ#EfbqdvzJZ1ecYKsAftIzv> zhjs;x214)>{LVVo4UdI{F(Ffe=~wPwUvEtH;|psvQGvzk8R5W68n;<5S*mALz zD}BD)1uPMWaG*Osi4i31M%<4C|NPm2B#zedVzoNahG2`VGzR01GaO+RBa0N=JfdqtkgS z;!w7AHnez2`SP^=>G)Y)yY^pby4!`=t~8$~AARENXa4N>gPFVbB;H*pHv4n^8|fw| zO~>jCfpL`mF4(ASf~eMQ%V%GOXtZoLxyANzmXdsW$uuhdiy? z@XojGaC)k0A3iy&PYY&`gC$IqQB(YI9aX_GRSZ5KXQtab%8K6VuHg!&x~ma8V8x(=o?fs2JRUNB j&X50h;AegOuK)u8BrccfZmD^C00000NkvXXu0mjf@EgHI literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПодсистемаОбменДанными/ПодсистемаОбменДанными.mdo b/SSL/src/CommonPictures/ПодсистемаОбменДанными/ПодсистемаОбменДанными.mdo new file mode 100644 index 000000000..49486a2d9 --- /dev/null +++ b/SSL/src/CommonPictures/ПодсистемаОбменДанными/ПодсистемаОбменДанными.mdo @@ -0,0 +1,8 @@ + + + ПодсистемаОбменДанными + + ru + Подсистема обмен данными + + diff --git a/SSL/src/CommonPictures/ПодсистемаРаботаСФайлами/Picture.png b/SSL/src/CommonPictures/ПодсистемаРаботаСФайлами/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..6c81ec17220c7e2294ece8f68b6d7917a938ba24 GIT binary patch literal 2569 zcmV+k3ikDhP)p1W1+OB~O)jKx&bYPzx`hz91nG+XL`MK?)TryQoy4Rokcq zQWCPqDQ<8aFNr<-zTM^UpF4ME&K+AQO>TjRUhC-G{r=zofB$yI5@QVa^X9^RzTNi# zicXsai ztCtq{7YlW)u9mR2Rs~59kH?L~cno`v?n5BC4da`AsHYd;L2m(CO#RsDinmRC}X z_4hdbul!>6=6@W(KVNy~^vM_AI#Mj;Q7WpCNA@Ezvm2B9AHw#dA2Wd{eg%@m$QlMh z!2l|iJY=^7qqd4h@fKS7>u41+DBZpRqfxq`S5pN;moB*7p2E^x;Y~?$;ma>wIrYH+ z_`?@2{p0fLo+qC97HY*+RPzg{)LYP?pkjp4s1~955|9SAA`l*irfKGLisCWp#osN< zZZJcoYfUIJGpScv{u|sz3$^q$7?sifX(I{WXE3f|?v7=u^uE2$_ArJ@<-DHGALFe*7*F6~P z34k7bdZ4Uf3BC?k_fmV`8;qDvU&^Iy-^*mPPA4+f{cu~0x?T8w?OPV=0%8z=S+qkh zXq1b0F0fIXfAlUa&=$`8upx5a621$@5?r9wdU^?T6hN#kU%xX=2e!Qa{w-kBUO#O_ z`skLS+FI{C#+X1K)}dm1Uy`J@X6ad#VrMt5Tjw3}fzAhe0Qy1LtyaOb!FlDA6j8 z$bgJc$ln%}3v6S*P=rZ63UM&1+9GAt36$VDhfSjiO8I_7qCWHda3YM@ zNW%1whmQ}L_g^DR$h>f)B5v#MZR?$xnH*a8y=-cUoO=HULm`hMo5xo#&Qi6hnCHsn zDw3mdL}L*;CtLR#*tuuMN^Hiux~Y>1L<@9?5gKtzj`p<* zQE7E0WzJ3VhcMBHYdIPVlQV~Vfk4#08Admb_r-h)vaUM>z%Zh*o{gmWk0Uqqgu4H8snK&m2Z|xs3T+X{h!3!D$)%1*vT92v9KSMPgI5?YJhDROE9-Ts*&uE!$lb ztqka`GBP=C!8BTEqE;!u9~?y3Q$wj%$L5I`f{g~A{_dF{IhTpWT88yil?*oL>^VNS zf}3a*#mGnmJm_f60%OJST7fF zFoq!%c0z&^3q9Byoz9&_#f!7~`>@82~Zf@4?lrOeB2oThA5OUB%uTASfb|>{hb(k zU7e83WM3F+vkE0R46T}li}FB2)8X<*NGgXiv0?N|0cLYv*d18to%eg06?E*gnS~29iG@AaO!A%J%hy8ZrNQsvD>5kfKmL`w3^K^nGh~n|9SD)#(Q)Z z2w?Lm(xO#9^YzlURBoJjWXtokcYrVqOB>bRcLLzpQ!oEGIX(FG^wQZ(y|RiX)ht@8 z3Nnn%xz~kL``SvEQg)hQ-BLLHMKD9@=j?7ja_stN<)6%i@V1^|LRvyd?xq( z0e9{RXj2(x|Vg{{=sz|v#^y|0zjbsmzymneAE z$WwQm9}|coDXf0S04xrsX}nAi|B0{J9zHNJdF;@(Lx=WFADNtp9Y_pEW~fJqm|$ET zK+?KMWKVQfsMhL`>0X~=z}?j5J?T?QtZ{a{rLzKGHsS@hHFF2yHAdsEej~HM@E7Iy zAOSDa{A(Jq$%&zvCqHp;|ATuc4@^zO_9RCl(_Y#-)^Sm-!^t5DKBB2ruvQ9TU#qk{ zKX-cW@}=`<-no2re00Ds%Wn1RyXj@#pjpb}Wp#NYhnAf9omgt~XMhH8KqkhLgR#$k z>cPE-_D$~HJU+BHITD`mdHvol7#hF*)$dkjixaQC_`=WLNM|ctK(6rxLF;_zB%gZM zKQY}U7_RI9jflnD==5YPapK9t2lwt8-8VHhv^x + + ПодсистемаРаботаСФайлами + + ru + Подсистема работа с файлами + + diff --git a/SSL/src/CommonPictures/ПодсистемаУправленияДоступом/Picture.png b/SSL/src/CommonPictures/ПодсистемаУправленияДоступом/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..e564e7074446aee8dca46d4d8eaa85e33515fca8 GIT binary patch literal 3854 zcmV+p5ApDcP)ey{uIaZU}mTf9JEK;O+-+RyQ?A+7$8`7x)M`~=TP=bcQ4=a+hv)}u^_rC9a zLxp_b$ItVZgrD;-`P^?pq0l9}@rwsPnf5$yzh15GSABojFiaSh4bybcXc_P#@q@WS z&w-CWesJc!-uqnEgnsOsO9bGbzx?RuB-{DjLU%sXp-PZ=TQ97_4=ZTt29_6=@x51G zg_Q274PU=&z0FiY=(+?Li+2Ou?0pYLU08q;iy_&OL?oh&@K!HhmI_$)`u=Qp zj+tKwf^Rc;tz|O!HY#-;%WDlZnr)sYPMn@Z!fTWIPheCPxxXyrK$9Mgg-y}wW{Nd+Pu>Dv6n z$$;BUc9@nW!EmSrS0a6Uv~33(gHLy+QOtIdUYrT09dx}ATxz5N%l4)(TLn4_oAn3kUF5`<0qSi$iKYV)@3&>J<1xIq!SFkPTKpFMa< z%-qF%F}P97(BYZ}9C^J00+dSt0+4O-=hQ(o9zl6|0nJ7orsbfkzjyjWk9_f)m)%bP z(nmg5*R<-WYqC9(MmAq93R#HRCMeTr1;_Pl3b>7FPUvP!NAZfS2QTJxFX=uIjzteH z&YTVeYqj;@n1&t%-r|5WS{f_?#x@XgZNyVa6pOj1er5ppQs_{*vI33m)6knR+B~f$ z=~4-fPGD`ViKVG|3L5ClW%1F)KK=C5`n!f&w(G#`)YxH3QXtXawA&3dNuOr5j+wD3$V{0^)2F8M=)e0BOdlQX z>EFHg+v%>tACLXp3xBn^vf#WI0Owt3MDWF8@yNiyz@Cwj5srJh$W)51F@h(bd=lg1 z<1b~i+210FclGbT`RslFlu6|7kHr*d%zV96MP;>ucwB`{1o8YJc0K$Bj7`naJGJrB zsS~soKy_~Vu-sgI>dY%Iy+9zwMJ+VU-eZ|eX3w?PUW@0R`}+9e;^MPcUwzGhsw(@3 zhljDWw6u?)o+Z$`->Jl1pLl$5`whd7zgk_qDi}m9{7z- zlarHE&p-eC)$auP#1l{Mc3tQ2#Kf5lr>GMSOZ&Z{o6aP=(g*sAg?)2p#v)zm1V}O5 zd;QHY-~0yVPrk-E5yF;{2N4^(8E>2%4_c`BI=ixjMl=!_yrtPC#5gA!l{y-%T1czS zy31#OuQWaOt#he$Zp`NsahBOv8;vH8969pcbGiQ5W1l`op!dh)arE{U)7|Hzl7H}j5khAqD{*!%#Y5NswrVO zo)=WdFa_!v`C zZtN>&lNLSC?A!|ENE9}GPPVg~ty02_nS?pG7o)4(kIgW;a=pm)_9L0jV0>*^D4L(e z;AuN73PIQpVMi2Mh8&VeD=U#M6t92J0Bqal@M$t5Kl#a>q9`?8Z?WW2D3LI|zb6bG zcLF^Cu)9BpUHLek`n%u8>tin<6_t^qh&vK-u9O-4aB>_-(RRD*!HevN!l58|k5;?9 zxQc429MIZ;a>IKDAWGS6YJsOY?;_6+RydI?f|W>xU3+$+yvBjmGEnG<AsQB-IteA;SJ>1Kl~W~oN+6MxSbge)yTd`Dlt zU;e4)z!x9dm0hSF-(hxUB27^NZE^dbe{|PPWW&ni&%8Z-F2zJkHJLS&ws`vV6l#?! zGF@G;n>t>6;|xmaV_03O;RaDRPR7k91{73KjUV^A`j#_Udz=PW5d5eKnQue&*SKku*)ijkn#gw~&dv*eWm9 z|GK!R(bmdu+4Yt2rd_e4&Ln?-Pd7h{=xvx9{bnb zw|waCtY;j@hwq$b5QC7^e#Q18itX=7mDg5LS}9*OH#G^j%m557=nE6jU-~K>Lxt6M zKfC0eWnr;T`q+{6ufh~d(K?=&~4GmIQ4s_u18n)|o z3iGr)`6gcYtqTG$+bv9w|0i;rZ$o$SR+zPuXqH~%jhASP=^kTwZ12nC`rTJ!zTAPa zQ`6|n^q|lQoETriYg&Z>deGm~jj8f$XnV}6W+6@iC)iq#FE69kYH>HPH;xko9tv^s zZ!`kiEw(wAKMTanT>_%#`{KEhf6M=>0gv57xWsyC4wX_A$ii9}_yGjaGLH_G-@-C_2aH@JZI`!}9%%mWB3btj3IN4SF7k2>bN5NaD ztyK|;sR0O+gH2S0YT&CAEJ6Z+?{j72aee=43b~U5t$JPnuCH=5r=hU4j2BLuTT|Pn zHLjDN3!IR%e4S@PEM`QsJ~6pNpuh>x4~CHl29Yuvt2(<;o90a>g*x%QGt*dQcM;hY z02&mpSeC_96$^L02r zzl2dPF^;n?-r8~*D*cZLUIcDZ7lJk%3_XE;lEP_Z@nUH+sXw2)HDy3ipg=` zk4$!up2gwFUqv(-f!*d(QaX#J#U_@Qs%&jBBr;jHK?<}p&kBSB{->fUmdaD``B5g{ zpGd}V==J0Lw;2et&7tKsm|0^5R-Kb}(*P{J9XxIk^T2zD`{FgI1nmU@@dD)giw{2Z z@W)2arO}T85Hy$?AII$EDN<+<@yyns&Bd}Q_>lo1sUSC~qi2g7Oij-ZV`*7~(Kv&s z0HE2ZHs?5%4c?f&++usAc#j+(-+0_Yd(t4Njs*3w7EEGWHv&otZ3spA8<~FxgwNfX zr6T|vgM(Xw=LbCB{>g1rE8*JPc2dk;SeZM4qi?RTyVOxqM9Zci!!G&Ca(aQ8Brkn* z_7q6D3@WGJrmrC-S}VxpLJWZ7pw(7>`-`p!!s%k~V<;~OGz6nE{z4@SQ)OdA8#v9`>N z>8CJ1y@pzYKB>jtO`jU=ph#0WC}9qpY7?P0uj^XBUp$$_+zj0*0}+`vdDK{hm9Q8v zyA7*r3;OVT@rRDU>ys|x*^+DO0f?boSNWD3t~s6U>3&<}n5S|6L1wtmjlEfYX!Dh3 zJeH2*H$Q$4SIND>gQ#Rz6i!^mKvE01E;uW?UZvV#uP;F|Th8uKqO`Cg$Lb{`t*ES- z(~X3}^3%BK%)UxJh>jzI4*<}H*sUh@)j~EA(K8*frtd23a8b9A8`8EF`&K(5;Tl5| znV;pE(6zS zy5e$KkU;oEF;h2QMaBhyC7z=^qX!NgFn+4PQvT7ycNWz|^4DU?u|MM*PM?s2( ziBk=4@l0&6!rQpU-S}OZfm`qE&#Zi-DppLpe0I>c^g)IYa + + ПодсистемаУправленияДоступом + + ru + Подсистема управления доступом + + diff --git a/SSL/src/CommonPictures/ПоказатьТолькоВыбранныеРоли/Picture.png b/SSL/src/CommonPictures/ПоказатьТолькоВыбранныеРоли/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..91c56a0a4ca9fe509223b7eda0e1f4cdde7c6af3 GIT binary patch literal 309 zcmV-50m}Y~P)p;Ey8d;ks-6xm z-WT51GI@OWM8{;5so>n~N3yks?XnDN0btlW@cW`Ljm8N8*AErDc7rlaaLz?Kuox49 zJwR0%_4fQlp6Ag-RgDAYpD@0Erc-3tRG3Bnz*xi1mW=~G6wXf${YADJK3u5&cJ=@f zVJ(3~BBtf8!wE>DF@MlM0JH$6)9U5;tlDpCYOl-ds=;1g(==caV#Vil00000NkvXX Hu0mjfMX`sF literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПоказатьТолькоВыбранныеРоли/ПоказатьТолькоВыбранныеРоли.mdo b/SSL/src/CommonPictures/ПоказатьТолькоВыбранныеРоли/ПоказатьТолькоВыбранныеРоли.mdo new file mode 100644 index 000000000..e3a84750f --- /dev/null +++ b/SSL/src/CommonPictures/ПоказатьТолькоВыбранныеРоли/ПоказатьТолькоВыбранныеРоли.mdo @@ -0,0 +1,8 @@ + + + ПоказатьТолькоВыбранныеРоли + + ru + Показать только выбранные роли + + diff --git a/SSL/src/CommonPictures/ПолнотекстовыйПоискДалее/Picture.png b/SSL/src/CommonPictures/ПолнотекстовыйПоискДалее/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..3b955e5159dbc1d86f125013fe0aafbdae4d595d GIT binary patch literal 3691 zcmeHJ=Tj4W68_ONbfkqM(gX`lnlI9eNYDTwbdfHd0759CNfAX62vS3DieNxNl!ycn zK}skBf=KU(l+YvnxchW}!_7T2yU*-AyB~IEcV?d=4E2~9_!s~H%=)mK$WvxJHC71C zsUN9m6gVY%Uzn9Y0E`^}HY$*n!vg?=fxC_l0^#O^_VIV~@fFh7(Gl|X^Ko(aat0uH zB-bR!GKIpeK1p$AHP;?qugdU>0wSV#NIRQV5!(yk@Q96Fvo$u3!JL!pTn@~vC3=tn zmK!%yaGBt$^(^jgyxBdaHNmmc58)x?)zyQa2lb0Ni-$d!Ue?HS?BdA_MIPV=GFDZ2 zSTM;5*3v%OD_u z3g9m5U8L6h4D8LKkdo9*&7c6UDI!hVR7n+S^-)fbI+92S0uwE zh~51B5RGpe)w_U3&oXN;Vh-FU_iW@x=?m^Md=J@+$0!|YUdSs%w5tl7XJBMp6>}^k zUYm_qKarpInTn6tJynlKL)O8AEKOWRQ*q4E0|)QGN@U_9iB?xbmQM)?5ra0&CuH(X;f}N!_N9k%8-nRa^eI8i0RPyi$?)UZ4gqeK zvrJz&@l7l_Uj*u#pwtd$ZfY`JY*J;@J~J12o}rK@U5nSWNqLy|!#f(jf^%8ZY&BnG zm6#W&*zZLx`$Esy^W-)2)IX-D)oO=uI0!4popVea7U_XNaf!4d4lsomktIS)ah%2? zt?hm#)MeTp$u=<2O({Rl8wvL`_pzhxLUPXzpVjNhrbbm8)BKI0{=d= z0;^4AdXZ-zU(E%z$d5&(eRqBbph5VvM5o9;Sr(V)zZ~v8f1+#u)RIrUjoWG7Qqep~ z(MiDapFl4DraT8S5|c`ddgTEkukv7nE6B-?yRB;~bH zjaUf#UQ4i}auwF{7G8W!_=0ernC&GN4!acCMV5{ibA}AUVputSMtx7%C`_uvq(r@+ z%{>P$zKlh6Ow2*5Bk@8R$+cKktkH{uj<0jIoXV|nGjRH%i^!5x_S=fi8uPR-^X0U0 z1?9%wWqCg!<#EdSclA*Pfe0CsCuJN80a;?*+1xs$5~y8g<4q9e{wC+VVW~ajXHK&$>6vNZ zXkERx0uQ7+;184ug`4R3m%HFyl3j8a9&}T&e5;yTzws;Qc8_omb5E!gjg*E|)sRPp zOGQM*KO-R{4I_@LeyiN8%Om6f-(1aH$=n@flrklNzV3RRab0ZPXh82D^#P}4%o6=h z=MKx#c%R-5YP)y``iDG3?i2jyngZlHme)&G$!Wa{>-5_*)1A<_{%HF3Ig(pla*JDW zpMLQrg814K*IC72sJaW@=e#3cVZwRLQ`N!IU2e3brKEMP;YxR^XO>G{U(EoztE*jd z3_pzTSV_DwnB$q}(D18%^e`dzrEX5^?fC2QZRsQFVI;bAgLDc$(_GygW4>el6R$sX zZ&`8~HDuw1;J3(T%2v)MeSBS!UC|Pljhf_~;Y_;He`UwSdqj5SaD`zdYvs)9ja`Rb zv0c<|uRzy%c7Y)kv`UyCI-o1i%eQ{HWLn{CSxed1B@0)6*Fyi?Ek)?7J6IBXMqmci z1XcR1)H^?fls3<|R@eVwV5d0ybM{!pFVv6mF16P1HwOmN+58A}MsJ*hfn)80o5{>#db?W?({3i{s z8bl`58bl+8B5)CB5AzOG_DM%ce;cPUo7@|QboNwVsOG7NQG8MFX*_8JX>qhK&nnU- z(0x85!=%oo%|y>^CFqyp(*)h*-*b{5bCt~Mmwv?O3y2fAn4AEgYJcMUb!k)F8#;2#svKUO_3bJ&siO~5)(I)%AS8x8TI(+ z7wC%j@Irbytz;7-3FU;S;3t1|H!|4K92ef;(t*~KAv6<`{)f)3LLfQx!9;5kEZvz32%}3d>M!F3}2}Q>Zqg-CG@V??2WF>-y8!q!&BG{V8I+y?> z!tVZ%pL99?vnR?J%^gO>zC#e+y&on7TWw5AnWc2yRY|$liWzv z=|_keOQhMR2WD(D5gF6}@}-VMw1q-iS!xH#yK?*PCnqk4wEJdckBmWU^M_ZVX?A#D z{OiiU?`{zmW-JWt2E%qRsF9J0+qIpm%dq8=Wp6yis`2e@qKDSt_s8qZ75p0s^Za(G z+Y{)*5RaY2?wan-ZW=`g#Z~LBkNDBe!t2GmA-NB2NajZsZ)zKUiH{65jt7NqvBU^) zsZ5YlSL#1V1Y39#b;EbO``4n!llUC@>lzm##tC{sMy+{Cp)W(v?&^}4Jj@WN%D(g2kv=2Yt64!GeD7XmY1W$ma%u8aSm-R`cVW-hv9H~exQDenkYyM~ zqF=c&054UHDo`sVl7Bxh&K0l~&}*nYi6G0)It8>TCRyYaURDH?yf?E z7}nrpHX%vDZx0(rj{cn8XZ`cA=D5na2{rZCzRAA#s}(Dmh5kw2aq7vylj(lFF1 zWp9<+MB4=GdoXGnuMR7EM#ISja@}MbQ4n|eQ1ckE)wl1|R{GtDqP`e*d?-VCv~?iX zpD%y^1pa3x(5W6ZblMCX8fj>9y59c{FePfkd#c&%-_$Y<9x;vo!XAxaqWK4P zPVe}{`avG2Dx_v1bzFb@ybK4|-`7_M2ON_>Oks6Tb#&{Nh+XFbPksh&-|a;($_V-S*dLw{V(j>qvrqs literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПолнотекстовыйПоискДалее/ПолнотекстовыйПоискДалее.mdo b/SSL/src/CommonPictures/ПолнотекстовыйПоискДалее/ПолнотекстовыйПоискДалее.mdo new file mode 100644 index 000000000..72aa1acb2 --- /dev/null +++ b/SSL/src/CommonPictures/ПолнотекстовыйПоискДалее/ПолнотекстовыйПоискДалее.mdo @@ -0,0 +1,8 @@ + + + ПолнотекстовыйПоискДалее + + ru + Полнотекстовый поиск далее + + diff --git a/SSL/src/CommonPictures/ПолнотекстовыйПоискНазад/Picture.png b/SSL/src/CommonPictures/ПолнотекстовыйПоискНазад/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..06ddead093be1dcf9c303b18ac56a30493daf17e GIT binary patch literal 3715 zcmeHJ`8O1P7yj5{?AgYWY|(=3eMR;#YB0tgvXy;{v5b(CC}Ctb$W~HAlrm(H2#uvt z#2`B{82e;@eSd!cg7=*Fo^$VW?z#6l=bq=>bMAeNFf-<06=nqhaG1cZB9D>#*tu93 zjw89US@aknK`{Fe0N8l{bvlrjF9-muskeav0^t>i3JmcI3=%gnFc1$44)pN$yA41D zxxg~qE}bTzJx;sLWurf|T9fT}A4p2!SUS1wOSqo_*N5CZy6y3atTuf7C-Y&}Z4U-m zVFig(Md$FIdQTE>Bw0JEuZWG7e~6BxE-&x>+H0K8pWp9A_i@FZp~vWNd+W z8kmsenP;QJAVKFvt4==9DF~`9-``>d836d9qx2=gYYwoqX`;;phAPrWpjL*>PegZDm_mOh+Ev=vkrz?4pv89SG*8ZciF?}q7352ECVYqZ%Ky0qQTsII` zrw0b7d3zYd;S5EJ{ml~<&Oz~b7#(OKX7*%X?^of&XMPtBUtgV=l9+1stI>Cbp6B*} z%t+>EW2Jau^9=A_b^wHTNS_bYbujaDGm~>3^M2IL_L4*2)j&yYiM8>=#;5d*fZME( zN_L)|9b^dVpsNmT_N{OLWE1a0x7z|`aNnrGysi%1RY;xK;d6m0JvIo|3bAM zGy7*gTnlIZXVJzMD81{6tGeuGTCQ;GpO}d~#ab+wr6*+7qA|qyp_)Os=w#j`ckO2- zb&mN79>@EXAm|Af!NOL-#zzoFy-pThR|$>8lWr+PlD#a@+!RJhSD5Ov*fQ~jL_Q12 z_Riok`U-uYG$)wUx_mI-~{)bp1~#3Pe9iagQY_ae6!*c6EH3VCeGLPFSWxz&;D@=$A&;?-A1#ke>o?1}a3Y zKUG|+>P3blQxSa@&ZSMx2M>1LIo>^rH!6ArE46a3`zn+yA@EiC_L`mkV6Y7XMb0P7=Ku(%QUA zNhYOd@iHq3p3`a(P;C!f;3+qp>hIg5zE@n`yp>1F+REBzn$GuR_~v;ukZOORy1P5& zMsY*9uBDXA1Npv%u1&*@Bm2qmFAVeBuO(ed>c}EzMG={@OtWaX92;#Lw9S^yFPzDs zBSntlKWOWR5V6IwV>PhEkFP4Rm2F{I|8c%4zSQ&m=eH~a$VyB5ORP(IODC2uZ@X?w zZ~JfeiFTjj5gpV-X+{O3Lc7EKf*L7hld4}T+A6***m{b17KapUs6k&|#}Ik4!?K~4 z{^d`~1D;0`GiQZY8u~x{*eb<-!j4uB`~Mv4)@qM_vuAn{E7IlkMT@Gpxk|H}y3;*f zP>wBc-N4K%+zh*Ee{+v;+WdXKOyQuSf9FV>!vukN*F{5H>-KK%0)zHfZTjbt&l8$n zHc5_aHA%$`#^lB@?-%ZA?h+4D|29ve*9F$hm|W;S)6LQm?hD_4&)~}-#+b|af?16z znd#FB1$J$IeRc?ky;yL1U<-6zWXD}))Ke~x#Q%+@fd7Wbu41WU zFL&Sz-5*&JCyf0P@nYUWxzL?xzVjE9Ute6bsI^4hLDA#}aWnRNo`jUO)QYF|nj=0R zgTp*=K7L3)_a!Vo7XKQ5KO*6;;aWBiiuVj;`SDEKP@C4{=@9yPzdV)vnLMj3lzY|e zXh}VEZlRZ07=FcG%^nk_9-qUL{Z3~#PFx?MAZR{Y9$+fUyZ#UxZ*JIBl3Zd@Q-{BH z<=I?;P3E@xm}a!WuGb@TqtLG^5Obs~I!)+Vz0`)O&DFu*xW3^#!}6Ci@-y;FksRJx zwX(ky>(14gd&tVBbIhRU{J)8$Cw!yLNbQ7djPU!#!%3yJ$SMS<09@gfY=ncLLj)d1 zfZh11GVXD>xFf~(Kp={MsYc+d-w)vQe-W8R>ax= z+HX{Gq|a7LPi@b)9tJg6wPlCykGPTb;!CC5kp=ghh&Bh6Z|a(cWypigW8rrh3h+PjT;;(JwvYx%cX}SST>G zY`;cxC{DiAzeuZ?K>hQyv_SNxsBu%>Q4CdS+C8*GE!DQLsNkH|+Rn^_^y%_j<%I=i zI$A$-N6|F+ey*>Rg%iQkps!E|iduo!In%l}e$S^mtu_X2O48g$r0cF%YE@|&#{?Zr z!rnRrQf||T%eGglP@AR{O%nCTy(b)V_r;!z$_Ys*Jj^)ykuceB+-*D{ zWh9lHS|BDS!XZppztx*QS^ln^x9?kw%@LXs@@9VgU~2DrpWXh@D%(y{Uvm|@Vk4OP zrsAzehg64HV=r23?d5)D??^NiPi+|QAc*Cj+t)orY>;-{JIcSC)3oQK4)+yk4>$It z`=6^Ef18Y+dZu~+)TBi1S)?E5;_fh{DFBhu0K~=tuyb^b3jl;F0w~@$~#Cq?zUMKL3{i+2QELh+a`8Y5F*23ZPE@bPv0NWR5P7~}m#bM4Q;#m-rQ)%$Ris78 fABVH*97l9uKvu!=WpQ5Zzv`M8nq95ZcX{w1*dn^d literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПолнотекстовыйПоискНазад/ПолнотекстовыйПоискНазад.mdo b/SSL/src/CommonPictures/ПолнотекстовыйПоискНазад/ПолнотекстовыйПоискНазад.mdo new file mode 100644 index 000000000..8503aad4a --- /dev/null +++ b/SSL/src/CommonPictures/ПолнотекстовыйПоискНазад/ПолнотекстовыйПоискНазад.mdo @@ -0,0 +1,8 @@ + + + ПолнотекстовыйПоискНазад + + ru + Полнотекстовый поиск назад + + diff --git a/SSL/src/CommonPictures/ПользователиВыполнитьСинхронизацию/Picture.png b/SSL/src/CommonPictures/ПользователиВыполнитьСинхронизацию/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a34cc7c2efd67841387c6d15fb340530512c33 GIT binary patch literal 528 zcmV+r0`L8aP)b45XQfa8gS@G5!xL+Mq43I`E>s4S%I1PQD&$Nt@xf zrkz->FGT)EN<#1paJ4ieCuhLg9T5BiZlolxFGL;y+<_q1?VlodAjla2N9&PeIi2Do z;aRw<7^tcWR~3UucouRx#UHIlj@^MErzqK2=+g`oB^xt9hzLZ4p3!NpYh;o>|4dQW z$RzcQPIG#HCoa+aw*>9PB}1Iif23k1o2^o-?5wSey&E6H?@Uh1YpS+ld2tDHI>j3R zkM;WFsut|*?SrGf0hedz`1RxaLsD^s=g!1Jls3c+ZHO6~ScsB7_TP`LWYv;B3jm?D z{jFR1&TDqL@nx$im<51a`Oe!vH1O>56c_9i*n0w~aoVHz+f`0`Y=vb@Z~OxvSMgkP Sbo%xH0000 + + ПользователиВыполнитьСинхронизацию + + ru + Выполнить синхронизацию + + diff --git a/SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыВКолонках/Picture.png b/SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыВКолонках/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..f49229beb13c5b3569162dd0663bc08bc3a0e20b GIT binary patch literal 4043 zcmV;+4>a(JP)ZAnByRCwC#o&Ap;RT;J~5xgb*bv1pS33hDd!0V)#Kov9uHu6RLnn;vYd$prBw(cqvxi^ale$V?m7x{-BbA zhSZlpOj^>F7I51xEcIS_x8*|gj&}e;V`OBc*=$Dd(Q2ZqBPB}~ z7nc@SSXx>_+W?{Id31ENwaRF71yk6kVzt!p{QSb)+}uz8c=!*mpTLO#A@k)=Zn%Bx z1yRJdt2&C(Qqm_+&PYi=_x;b}HGq)0=Dxq~y7FUD^wu^t;|yG8-S59Yd;A1Z8lW6V z&06QkO(j+@&dtxw%*@~{fU>AsDmO6$mx^CnT3T3Gn4SHg(HP|x89?|*&AMWBJhh&m zpT}7MrNA1fyHp*0xFyw})WpuOo+DrG5&#$&Ngq77lBzpe@~B(}c3yL?e1G)0HyI^R z4O;c=cBJGOBn_xKCE{t(&nls$`th>05w(t0mRaPQ8k|!N&e+E+-PEeNk77NRR>9!` zU%w^Q@6CYJ6WY%vuhUWa3wr+l-H~(}qL*8r8I$3-DQ!9FSV?xqFRKmN&v%yNX75^D zIdvEFa9J!dyXH7YRzIsHJs2>oA?LQd`mx$NQGVpPH*YaCpjD2x%9_Htm#}Rz_l;}b z(y1ddm?|>#B|1=})3`kJBi%z*IF~hhqJ4#rTimV1ZZUUJ?H3sgcCT8OQ@i8UY>u0( z!@%v^9{f|g4E&MgR8aU_N7V+^5;Yo#6&Qh{K@#o#oPk~-zK zM?X+@w&J6;~sn##OaMz{Ac+Hzjm&CX@!oO za>2S+ysGW4?&xSgyM=D^%xY1gh{YU5GuEH?hp03OAqZpI9z-G z%lo!pG%<1J*w|QKcgvupSfz`es|rse1gILs>WTzj0Ae*j?P4|0O#rBts(D^802w#{ zplSd>)c}C10Z=snlpl|$CIA4j8UTWc)n>5X|NO%^3t%XG@#=5qp=z7Zuey2{{w;{t z4*c$t%f5h-RdQEey!iZsMa`>)kgqoKD~?jQHyk7DGa8qrmrn+6Zyr?_diL5F$!IKc zUTwQNw8awsDr$(9!M))aDQY(wMJ}pNNClwKOba6!jYY=lTF+#LaxFI9d+XOf9xp%i z%l`yuq_j{o%q*#xyOKIMppN&YYU_2747}KJ+U4F`ueVitN2BLk2FGR~H?u+i6qBwtM-u zZ+_;1CtvNJ=(Y!Eq+=nq(AU&7cSWv{FDbdMt>zKCOHy|6>fP{yHTS>+jn(%*aX=1D zb=4ZH)oO8_xI`|Q7t7bi1Q5wnR z^Xi1AQFWop&fmRze*TxdlkhVAcgG#y`dqpny35_W$U=FcT;60mR{q}3dtNPUIS=2w zEi?lc7@4mn_wD<$yRxjHZR%kccll6)wNI>W6RV4)6z&bjNJgWts)fA-KNdSqF|u;* z%IkJUE*ZG>ZW;6HVpB?CTsU&;5P>fg@*c+8p>;dFN;-Muua_AUJZj?;ay!VOsu~o12@SKK|CxV}}kM-g9vL znOiT_>b>y%!(Y1ghuiP`6BoiF*ml$TXK$JeUe!~97#WTw1K{nK@7`*Aa`5#Jy|Qon zMH3Tej*X3Jn>?QKkE9FY@q4ep36LYrq{+GYdi)*+Um{_<9}eenH&!B=gEOA-95fh8ezHW`mkwssh?T2)}Yyu%sN zlO(O~rL9&T+20plnIghKUL<|DOeARUC1rI>yqdJ!9sM1vSt?W(>8@?tE-1sdz=Js} zqFz77?AzU@*Wl|rC~fJ#kt)XOEjR&+pI2K4-|j7m(Nts$!-6<%zg(80#{x@Aoq=10 zx8ts^Fe_L0?v5wPB3{<2#m&hIolVGEyIfwee|cUl%Ajk3CE@qg;~ArmEz7d&Cf4@O z>Rw}$xo=!q*hDO9dd61WxNY0{L>R~`G4XhAS;~EB;bR@qx@%s&au1v=oGd)2zBauE zpYLFGUlG&~!_?2Kchv0bE>VB^xSEfveZNE2ZwBs;)z(dMp|;gpzN5xpTw9LS2c{|* zG6>W|!Xs8c#upn4i`8V`h`Ml9FaJES{%YLJ_rQzcvE5uQ!F36<=~4K{YFl<64L;s; zf4})IE|-w5?CcY6`%@F1_|B)bdN2Ow(dK#Ea4*1sX&>Hq)mL_!6a<040vqq~OFJLUrX-EwW|-8z$DPt8Y)gk55rF?#ejhk@*vZUgB;VMbrAM({tzg|z%L2509Sa%vjhD@mBr^a?aS`+Q zovp;SZT~oZ?0QTL`(J9bKz3nxyswpu})I)q$^j$-a>H@Lf` zYp+gI#2>vqUH+iR4Z( zN)dG_dYkph!CuX7T2Y#*-s}}J9zuOjs%dVr9y)F+s?eKNeVjEO99%Vb<*4WapB(HK zXZSdTYVC+DDN*kL{O8pPBGIH0$s;w^xhuq*B2lT8qY_PoY6W#cvm|>wFW1!ypdVEW zLk#a3f;=s%*1ah%5efT>gl2`cByLJwkcU>=v{|B?5iMsa8OX#b_^dJ8}Gp>wfhpaWH4WYyd?EQ0$Mic}+K1t9-e&4q9X86`$m%UwfE zOgw(O!oA@bS)b9E+i!PR+dk*KkD|Sz<{eX0AD*1V$SS!jFAly^oT?k# zbR?}L3orG&8pkk1QFLkh+rn)C6_a%U z^x%8Svrqu4M$-|QyMEKhcEymv*}4pbYTT7$Uwwbqy6;c65}tT4xnWi0Q*Y0hCGoOa zN83fNS{LF~br*M2Rs+;cSu9jbtexuX#FgQ$ML0$ZZt~=%YSWEJR>rz~-`shR>O`yY zxQ{ESC2BQc+a+#XtzbT=Bui6jh1f`~JE<1N$8vXyU`?j_Z1aZ1ggpD`kCdZH zF3TYto6I_9%SjeGb^!?I8rJW(P_&TMgLK`(QxgHT&A71V3rAdMbLKGH!!7`WPfVK0 z?R33FAIj_@kY-VPpD9D`dy#(QuEIL&cfYLF|52@hT1!^VlGI%^>8jz{E$P&ztm$;B zg}v>9tdVsv^Xgv3oN=qQBxzM!upT92Q`Sa$?hzAgD7~r$&r&Ed`jo-F;TS0xjozxp zVF2Zw`egoO3!wuHOVh>u(k)LoDioe@R6TcvKChM+i*tFx5x~It$E$^@y1|1-0ZJXK z(Jw$yGwVEJHL?aMt*m)!0zf@7@PuhK5gZ`=1e|#_K;>jj1`be{3|yG`HxV3Q2!Y!F z$GVBt0CkDgOtt~a3b7iX9*>vlWl-ns2W)Vlvvd~4jdp51pi+R0NGVdv<4Vf zw9aK-jf4S8t84Co15^#4yJg54U>I?_u)AeQ8lW80YVLsp)FcD9ew&=9`~wUrT=U-@ z0K{r0(EwGNSre-PYBH}Tf&-KmVl_ZrV>Q2X3ox8XHJ?`l0KeSD z*Q{ByZrz6(jRkZK5I$0~)^OcY0(EO_?b!JE_@x`)z3r)g;WB`bx$?p@q-L$*dPFQt z%Rfs?OY`#!v$L}&PtF`aabjj>W_I?2`T2QSj{5)tiOh0>EVF4Dde1!LjMGmaU$<`E z+O=!Udtqv<9vvGSi*`QkwDk)M3yX_O?RFb)0t7OPmLiqYWSLX1U%yVORjyiNb=Tc8 zseAb@cUzQ#URsv4;K|?sVGw^x)mmjV>2BF-2HseHlK8TKBPF9}fRMEvy*Cm*+-j+{ xqx2ic0hBve#{~eW8URo=0HA6B=$ZcuFaVTJK1dgflqUcH002ovPDHLkV1i7e=8FIT literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыВКолонках/ПревьюТабличногоВопросаОтветыВКолонках.mdo b/SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыВКолонках/ПревьюТабличногоВопросаОтветыВКолонках.mdo new file mode 100644 index 000000000..1f0543d69 --- /dev/null +++ b/SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыВКолонках/ПревьюТабличногоВопросаОтветыВКолонках.mdo @@ -0,0 +1,8 @@ + + + ПревьюТабличногоВопросаОтветыВКолонках + + ru + Превью табличного вопроса ответы в колонках + + diff --git a/SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыВСтроках/Picture.png b/SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыВСтроках/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..8ff8195b6069746d70a22d69dd526d45d798a359 GIT binary patch literal 4004 zcmV;V4_okwP)MoC0LRCwC#o!hTnMIFcYxwOZY!!5K; zTZ@sPNR&V!7@jn#3NaCk4}!vjrpG5BG(O5dK#dOuFa=*IF+uJRhN6k0A?lM#2$F{2 zr7>wMr?yr~d(y+X>^;sobM|8P+}6y#t=s35lYM5*n(J@oyM8lk@4fbfSUJ}MfEqE0 z2>?(v0HA6B7$ehJNC+WcJDrXUs8_55P(mgqCMG8*)vG#mt6C{pvbx${U8mh{qiui^ z>UnBvYI=jI$#o22f8?vBhL@LDmX?-&`uh{F|MNT+1SmOQ{oJ+#w_mF~wnNp*OG`;# zxUe84edPO}$7BE{=dMTp^1!}ND(|hwPi8A{x$3@naq)xmcxiyjAZ2TBlP5J_y}Go# zw6L&%r2s0VYAIg#3S7#)-EOa}tSl~m*lJC2iwvL=NZERQb+)x$US7sh09C{ zk&`WMCqSK5J%CQuIyV9R`Z@t<<^_qO(R*j7H3^Xf`A25 z?dD70UjuRnbdXa?!;w2fD$Pi~-QgPs^%vG>uHLed$kOOxUtPX-W`E8$#E*AOz42Yk z66a>ItBYxg-L=3NIqj^+^wEH#rd+t?HTTuNrRd=!C+92;80pnnnNkFE3D+q*ZJ~1mKHNKHMKEl%N97eMW(k*;nZ?ecw_ijwIDF^~=XNKl*dd;BPJ^&* z`>;>rR^Z0epNqK8&2^3L%%Wznul)F021%caul(GO6w=!9*dcym^ml5whU#ymnz8~H z+I3Ea)g@E+%)+`%8W&p8jdW&I2~@GdU%Sx;{V&|?@Sz9nVjK<5Yf{Xtx7%Y@6mJ$!X%1^x?RQ%^#@czgLfuKSm{C-8u1K@@G39cG zzFL1nS%FL2?f?27`Da81Qp$icS9WM**E0snk8fePd3G`t8K^Y1z|`L94Y1QY6B}1X zXG^jedmx-+6k~R0`u>WF8QI98kLk|Pn^!6()H6nxmX^+)``|yP&m2E~;<0yTe{tZ} z7Lt?!Pl1n>b9>&)Bvo&0RUA40ICK6R1MHT(w>?C0QhPED2K0h@|#zm!d?J{ zaL1kB8(7tzCHPmqc7L5Lb@a{O-Ehm7n^P~AuPDF$<&#Of;*@W9h_#>hsF}Tr>QVhH zi3LV#tRbwxg)g#xBT-b3nA2Dw-c*S!sdNWJyrf7IBRdPC&-dB6q z;CV5Xy8w4AXzEX{hE_4a0+zG9$nReKlU?Qo2p zpyV#YXz&B~T=&F_f49R@V_7)9@BReBXDB_sYQ`MM@`jP6@#}7Z(JjD}KQWr%s~@=M zdKGx$#dn>DDqw`2dBfTDLVWSQit>8Y$xWHno4AnaL|C|E_dN>-Y-^h_#*)rJ{3zJ= zx6A2mVJBjObzXvTt zrLhxah2&aN=G8|;CD4aVji7T}91XT&^juj{PRq+=dLsk%I$F|ellX2L4UQ?wp5FH8 z=e96rXo}faA9~@al2e{L>SV$T$JmFm3SVMX`}*q*>eWcOo>#B#hTIzgMvr=na=2nu zb@$Y$e08_w4yy(e_zLVeE!mxRM_pBP41)v*(YAIc+?#zajb@jF|xrof+`APcuz#wlq# zZ({4vPHe{bE6QTl#_YMb!WHFo$9Xo;g>YT2l0RysvtKchF_q?ykA?nb-68!&$3~z6ji%_ zJ@2IlZ?TiU_Ucn#*mqZ*-YodXyMO!i^`9w2y$9~Q_3>xlu&yAE$RzqM!N@pxOG;w- zit@+TkKFG1Cg$CT-c0%RJQ3@=s{R(BDCl$GM!k>y{LgkvoRP_O^;LpV^-x+;2Fq7_ zvJQN=%(Dg;b$j+vQ9T+@y^lWgr_v5t{pM16WS#iV7T@ludc9b_0ibGBjjEfWYSEaz z5YIwsn&m6H_#Vb5Mm=R5J9fNg_A07J^|K@vD9yGyaRvVT(QE2ts4wl^e$|fMGuk$w>)5hH0FOavVFDS@&5p2chsrATGY>0h5S;tX#6jPV}X&%n&0jKs2hp*z%dv= zF-x0Kt-u|6|KZ$CS@;Ks|H=RWl+;&8UKtL~-J~m79zI+-VT*>R5e!=CWNhu`+36h+T2(WH7yrE8=;Dr-$9mE5PMweTZz zHFt^ZeA6!>ycIZs3C(F`2(v6V;%agMTXR1Q~)*AF~nNN^LeBe;O zE+A^ADGW~W?^olf(KHN~#9yVa*JvPWL|sdprG2{t016TG2%m7YZ|{zp+3W1-`9{@? z<(sg)NxNHi`^~%RWT;c~@9o^RyE*k@`HJ%E6KU!Bb_YP+Nc>g$W^Y%jUN4q!w5o+S zR@8BVHL6}LUrAGq@>3{?nkkJ1O3y(1>TOqS&5Z$oa_p)P2W?Q`HxQJ;SQq7<-v z)kVEyJ*L$SJ0E_MCD^VdM$}AH7|>n`PY$l*d(}KRxP=8Oq38mh9Bg}98MEWcocFG? z1gGC;vkg$lzB*3KeV+w@LR4L^g;PajpIRV`{a5JmM!G=55BfziSDs{xwf zt9{qelP8YXtp7#zsD75j0_9oSB&@(?v3sumM4c>k>eT$sox7S-FP5(;@4Pj-eRUnb zw8b0NEi6z4bFr@mU|$`7Y2b~mD%XqU8{(~}o1k8RM#(zq7kM0C+S+;5Y!*Isc40(4 zlC?Ms_r;HJ%Tm-Q>ofxEWNnlVzwD(uN(JYU6;aex^j3i=5N(fFUPzyf7iftP``>jD7uqw16= z9Ob#{o;0~J!d0v~+`Vn~y{>S_rsH6M=!te;Q-@z)a-bz@Q13(2-Eutdw_OR^R~atK%;j z08ogx9(-SoegP`0Yd$dwP&atWKR`27%{_2{Qmwv6b`Km`1C)MK-Aa1KD9Q$?gtF7_ zfum`F^1ExkUky;VH8`Iw1E?FQ8lZ0Qel-BT8USkJtNHb6fI<*MdA}O<0+dVGL-5te z8lbYWo*rS@08sLMHJS#f1l$7$Xoj!$eiIXC4N%0MdKh=hkS{>#q|FK(fPFOp)Olac z0vw>S3vk}q0%(e__Gubf1C-lQv#$ndjIZ`Rw(Rv^{TP!0l-ye^~A))8b=-rVA589-Is z^5mpf)l%`&OK;k=Y0H+6wOT8GcuJqVPtR@WJ`>3kwU2iytm8FUxpr2T&5EXO??p zxuBNb_wvgwyY$l8EnBv1-n_}U9j5#0shOD>mGhEIwyvzKtgf~@oeri1D9QwHO z<+6I~)-6)7^3e9xJ$K8b=;f=-vnmDMUX!#C+&BX$3)vf0(;G}V@0M+>z*}p-`mrWp zrDXIBP;zan*Ou$et!X`}T7F|SfNC$)F#!Oo1^`qI0Au9;0t^7|P5Y-tyD`TA0000< KMNUMnLSTZ+s_k6> literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыВСтроках/ПревьюТабличногоВопросаОтветыВСтроках.mdo b/SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыВСтроках/ПревьюТабличногоВопросаОтветыВСтроках.mdo new file mode 100644 index 000000000..b6c796aa7 --- /dev/null +++ b/SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыВСтроках/ПревьюТабличногоВопросаОтветыВСтроках.mdo @@ -0,0 +1,8 @@ + + + ПревьюТабличногоВопросаОтветыВСтроках + + ru + Превью табличного вопроса ответы в строках + + diff --git a/SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыСтрокиИКолонки/Picture.png b/SSL/src/CommonPictures/ПревьюТабличногоВопросаОтветыСтрокиИКолонки/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..ef180ad44c4335b315802cf62af95e9bedebbdea GIT binary patch literal 3584 zcmV+b4*&6qP)2 zF@C8400B|N1OTWS08ljmOd}=vPY5Bml}beh)E2t{WRsqro?@}6wrba+YNce!#6)?b zO1WG{+W^_rb8l~NX_DSz6;s$H<)z2Q#&6uX@zT2|e}DW6<^#w+-~GyhEo;80JhrZC z<)x*huU;LIl0Nw3uVXKO?6dagf7!J93(9+Ihl+BhEoa@=u8m&4f|myH38`G`O1W6| z)e|?yZj6kKU?u>+R4w&unSo2Km&@hx@$u2o>xDuux5xl|K`Phos|(e;WpZgfHa3Qt z06fC#s3%pe9&Sn9Vrx%{`=}S26fY`n}dD4i)h^?rS~)}KV`S6TrT0(s+xW% zDUG$}4da_SWY(~$OK!npDOGZ`5;Ui3;Vj)<2ZvPRC#vzgYSx##GUcvVV~FH{c}BAW z?&ZgKTgw%NqwJlkYQy?ywv89)ctz1s^N_n8nr)qSEN0fWDJww-e0AKo(%etf%q_QS zx1D;lnZ2`UeapS7DgCb_R&sBkZWyFxi?v)^^xQ>Nrw`{T^Ik_Uy)m`Zh?YEwNG`eI zp_KTI4zi4=aaWW5m4t|n5h$R(FqB^6fjEw@gR#Sr(5kcoTXdROQIH~ZWJ zOPZ~cnI*ld&7P&RSJb6bJGPEyv8ll#!6q)Xolbk^?{1k$yIZ#Fts!++Lvw347e)0M zqkxG0H+6qS*ehU`uVt~Gx?wI+e|6@esD$W3+No-ql?+o`>(=m!;-*M3QPLr`@^7|v z5-nEU)fV0jYnyhB;7rf;k<*thT|Ry0?1>X6cYZkV=9c@szMd9t+XO)NuR31Ce6~@? zdGNXS_N~8j-n`rT`uegs1BW07noK>{$n^}|cklq&X$Vc&G!3c-@5i!+pRs{yQ#JP{ z0K!r=ng$5YS0ifx&*2_80ICK6R1E;A8URo=0My{g7685)0Q~aRIBS65RBiC~p_efe zK=!z|^>wung*EqY3d|lK9D8T^if_>`Fqgl)^uixo_tjNlSHd$&kQarypy2qOEg?et zVLcJzMPV+;x33mBAIz0+RTo5vcg6*``!QEeRBdZJQ7H%5No^PP-VyZ0cHUes9ylHw3XfwT*43HtKJndOyzwu&-Sp6%EFc}t zH5J3E+s}1%h;5d1QMUL^-@B{Un?JI~$B$YQ$0KDpN~v}mmY~H%CB(x?mF%v$jH5ZS ziNC6rbMi`Xs!q8mGybWE?|$J|A4c6J3M-;rnM~%jCXOOin)q2%Aj)Db!OX7JGwHn3 zU@moD?Pwls;=ixX!MfUvf9m1o)xPzC>N?38D@M3tJ6cIdQ)#lyx`3)=Eqr%3o2+7! z^zy2GDw?@+V-tT>E%NoeI*Nb(^}k2EDr{Y0#&=cNj4=aAyA8{X2R48ItFmHp+pv<| zFqb;J)m*u-iASmytgEf@waCpsxaaxT{+5_th0U1yfGk0FyTmN%WkxlT-B;Emel(?$ zoi^9xDO_wAuuZ)2)xv41nX7g6&i%(^pNPU*0&Oj4CVu*n74cjuAYb;Txm(??OQ9Jkj$veY#yQ)6g#2Zx$tMA5F1LpGBSK9~5Ts^M_%$0{3 zIPXHqJ(w#jRg1#$<0rzq@*pn?bLEM-?f7c3_|PlgdGIIepBW6v9_t=kMmI&(Uh~smA4z&%T{NcKmcPIx z{pzzT=@SqzPQS?W>W-jf5ZE9E(2A=@4#0>u2gN#zYB%E^)lFNsA8{II++}# z1b@zdm@Au&l7RWyGE4FeTaOkj>Tej6QTFawb@ktL-N?Tj+z8n{LHoLF}U(mnZ@!F5>(NY}w?XLarelw(N-m_!nVZO7~41BvIgZ%8xcU-^SVfFNT zwg>eQ%g49!IdI7Lx?27{zAY#j1U5(kH1gH9MY)neFx$WeDS!s+>is|bn!c|7-R|Pj zN3j$@rg-@e|8RfHzlAmTE)L8h{~JDa`=Z7449w-Vs*?^mzU4nO_y8p43K)mq#1w@< z+mw!qx$>dv95pDt6mtbi5fcD}?yJr3Y#C7t=FN%kp1X7n$Ag~+&t~9eqn?c^SBXS097Xr$u4gRj%!I6X;k=3Rqb-Su(lNmd9B&a!WULEiq!P@ z9$Yo+YSCJAp1F9HPERg>6iL-Se75gVJ_u0|Wr; zYP$!HJ6&eqv6{tC4kywHPy36qArwBo!V%s={WB z!v!&`Y-&}Fxx!MlnCS-XMg;`D6mzkzo+(aW_=I)>Xx&%mWJt#GV6I%xz-5aLojeiV zl?QoImuT#)Ie2jyU@mWHcU^t^`~i#zka1t_reaheD#|=#d_tiO0d!I{oqJWMzYN71HX;`-7#Kb` zq5?7|+MU$lxsj$~rULV8Y3k2dm$!Px#_I}bY8eLJsM_HTN2jXln)1xGu#DG4y|{Wv zBuGB#y+!e&QqovUi=RXX`{1lmb#~kIzp*=WbX0T=&HL&A-;g4B6Bp*ni>d{WfB^E~tA|dW z4DZT=yeP~C1;-~_OO`IhQUDp_(;;Rqm?GjMK{0C=ow^a~K2uSV7Yp2NBtAdl;6 z!H<#yu&xFGX5awOwHdfD=ihj60DLt7WXM-rz*Pg_s{tT0zM2n*0)+3YkvTws>uQt@ z5SpqHHGt3SYD@wUny)r*mkGoU;1fLA0zlOO;Mok^2J>%#&{U1A0X$YUFZl;xT@3*K zsTyw$;Ptv12?K%!ZKF`2WFaR@f06^6MFpV>CCg1?Ut*b4dbbzo_Es!+;>uLbVj<4pmWdQhU z0Ps!KcxnK@XW)n!AUIXq-8EVVU|kIWGpOpGo}OZ{*xTESIRHFDDmQTkE+t(m_0FC> zJ8@af1RNlPKDlV0YZs;5rI(&HYgT{%r)mn;{s170Nab4Hb#AuDX{r&y3XU{V4h?Uf$y05QKWt%&9&iMHF#6-DLsbEKd zOs%4&ROMp1Z+73DIsHg;O3COMAp6=@+d{&_tx|M==hXm#%+)agKw$h|fB^szT_Z-2wH&Gd0000 + + ПревьюТабличногоВопросаОтветыСтрокиИКолонки + + ru + Превью табличного вопроса ответы строки и колонки + + diff --git a/SSL/src/CommonPictures/ПревьюТабличногоВопросаСоставной/Picture.png b/SSL/src/CommonPictures/ПревьюТабличногоВопросаСоставной/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ac268f8a21a129070114eaf733f7639e02ffc7 GIT binary patch literal 3542 zcmV;{4Jq=8P))4VAu92qvM@r1XWYHZPP!5R%g18~q0aUnoc$Nh3lNgf>mmz6eRG(o}+q zFVqrS38hwpkVLSSCY#OD&Fq=bp#kIp6u6GjnHl zBx+980H8$FF#!Oo1^`qI07Ima>_t%|w(WLX?8IBF0}vo1BO~>CJ>JHLdR50t7A!2Z z78Yr>T4);}Ks}F+jy9GUtuG=8`>wAR8lInT&dtsJ;`i4s{%aZw0tC*(U-;OeottBi ztxYW@cuv6hMJgEySyzfeX2}TCHZYIXio&RvYCK89*TrvNihZWNAG=KaZsV zih}B>yHp+D+!E5aWU+7eC&b4d0suopd+)hnifqryGk)mo+r3e2kDtHJD1j2tsH~{> z?b(<xp0la4&P_w^Do$4~aPnWW>Wd78?yRMl1UhDK$Uo7qe$n!OZl zSyBXx1$^yhir-rWGCQ=Nue`b=bA%L{6?wYD)D7{+uFp)pB|VYEN$;D=GSxHrXzSqK z-!A34H!X>rnM5tlr6y|AEPbT4b2_Al3gk89>@_dBuQp9ZkDa@|U(tXRKmJz4jI605 z-B)VbBRdN~iYJKE_+|6RhO=AtE{(1|$SUW3~tvOy6 zld^J7S8Mv_BzDGBTj}&N$DR#7}l0zwZI-wIKC}{EpGNxw)ySTkrkv z{i|26J^S|LnL`iOAovBX*Md-+q=$SU93DIT#tYxRZ^MT5uN*|zziG!P&ELcY5+jh02RdVtqA~tuLgiH ze6^O>&OeX60CHj1?(g=kYQq$K$0G;IWU0%Sez$eo*Q!%4mMQczMjadMT}`I;BG3<3)p^7Vz$fG6H!hrib`imED#i) z|7Qzdji~z+3hZHA3JnL#pt>C+>Uh^tbl0%$Fu>X_wePyR-IiBJ z>5$anQ{VjjkyCHSJ0dVS>{R{nEuH;z+U|VR$lByfJIhIysux)+seJ1i*^+JKP_A+) zN4A!D{Z??L>I?5cN5-vY174R z&AbpGwWvEQjVq3eUjAyOeD!k8HCDAoFlE@*T5@^VUDg%RmJDL;MAh1Dd;N9QYun3J zM@Z&8%ic_7c(m1FV2EHFb(R|HMwiP78K|nY_ZWYE^6$z1)8G1HIzqA^@1$c&AyUFx zRzdN%Vk-hgXNYYQl8zaF6^Dx=#J*IJy+v^nQ+<;BrDj@MksMm?)~W_fS0i2jWXBZ2 zl%c7Jc$*ka?Lo&*l&l@+DW!@G=F)bksrOy1=h#ejc%+l7rCWw~deqr#Xip*yR4+WA z*%BpLKIsU_eyt{bC2VJmtQ@M5g#Fhf5X%>oKVCeyQ}-n1<3}#}{P(=b)pr&B7GRXq@4%&UpMCK!YE86( z-evWagH-fDY7&Cwi#=HTzFKCOgGXh1_fcLg8cw;-yzu8>yR3X;DI8gQ-r3^mj-r=~ zLTU$wz;` z`t*SZRQ+Fg_1MFY{g9I;z>xXvnV;-@WWO5z#L>U`+^;tH_4SkEQ!{t4GC;udZ_nR> zBWZx}@w*1TVRH4YR)UyTL;{m#Ev>i<`Z zZ0}t+aib$_02r#M2jHtsxgcqP@P+Mnwd^D7Ca^C+;P|N;UkwmGes3cbzWM`%4G{Jm z-0$g*4{ptJ2^?Vff*!=WI?{b=wU4f6T@8?*vK2`VU|rqu)c_DSeyWarHCwi9hq?7d z|K73_-}{mp_4VHz-}UGZI1vI2nb*$#bjR2Cso{Hn`Ig6f%OYba*UA8LSX2+3$SXcw(<*6gy@()m9P&GhBX5clCi8%liK-Ihs z93ZS^H8XGk*46H(3;@W*Tlc@NM!x`s)iu8u1t=T53BA0m63Ftg8Vk40a@xn{5TD59oVs)+7{KJJ`VK0E-c}U1sb=QrQqi&3kjZaQa zKJf7yFTei~1_KD3?VnjEWUIRCk*GN({$u z2M`FtGmAB{m{1GvyMEoewQDCQCML$lR!Nt`(!P3he0)4kdCxs-n$70ILaW_wV@iN< zR?$MIVx=sm)oa#F2*HX&)mL|2Efb;_Taji#2)fmgbQE#n3?LMe8&!=ZMzvSVmS*6! z&VT*r2sl + + ПревьюТабличногоВопросаСоставной + + ru + Превью табличного вопроса составной + + diff --git a/SSL/src/CommonPictures/Предупреждение32/Picture.png b/SSL/src/CommonPictures/Предупреждение32/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..f082ad4b38579cccb570e8f4d8828c5d6ca51fdb GIT binary patch literal 1459 zcmV;k1x)&hP)Db@2|tdyiURJh z{rG z+W(Y57#c6vPkgmvIz`Yy54^%8g~k^Ku0r1gRu-$KAK4cs&b$DGpg#aYratw9fveCr zfiTRxT%SHyG2IeqAGFW<+AY@CZh`jE+GnUV#c<<^+2uFt-+ZJ5Ru-#f5LquxoPG}C zB>By2Z?XFJbynZL&dqCYA=-!7XX^3q;s@DRA1Q$_GG3`RKUdD$1+;Dv$1Uz}yo=TW zS_jHxl*LO{Occ5Olnq{YN1p6aU#5B)O=qwIWjWTb4w|0LeIhe(hj z#8w;VU<-g+c^AFAfz}zc&Z2b|JG+fnsLU)cj6VD6Z{JxQxB`E=I&J%r^Wtdp6v8eN zuS2{AdK=Mg@&yGX_dj0{&~4D$5N{#TI-++OKYkKFG#^@p4{t#f{-k=WUd~!3k|vTA zT0-)r3_?tyWMVn=*dYW7aq|Uoh0=)|S0=tQ5P_wI(@qdM-)~IKfQmp;0+K8&gxI#m zauoSurYG@1ACZW$=5hScoWFSSqV!F`lhJ}-_ zk}K4w&gOpc`~wLrEk5Ce@$mVPsgqzhh;l$VAP(T5CDp}7Q!}!fF<{SRvn!kHtljZxhNOJ?JkVCfD1UZTXb8}Zjlh+ z0shKGRI(v=c!XSOa$;6~e!hpm%3{?CLic-(=`&z>pb}^q0vSS!2jZa_N+2G!(PK&f z$x<6VhGyT6cxg-$kMh9q5alsGGe^fa=JyC>0K!l`mCI`{V-}NZl-?)=bb7P8uZQ&Z zot%4&%D>(RpxP+!+fzj!{MpfIoC4dkvCL@noh!Aexo@rC&HyOIzr)TpI^IED&hI{y<>ch!&dv_k`;5MtWx zP8}J N002ovPDHLkV1f>!%;5k4 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..2c118615a --- /dev/null +++ b/SSL/src/CommonPictures/Предупреждение32/Предупреждение32.mdo @@ -0,0 +1,8 @@ + + + Предупреждение32 + + ru + Предупреждение + + diff --git a/SSL/src/CommonPictures/ПриложитьФайл/Picture.png b/SSL/src/CommonPictures/ПриложитьФайл/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..b9b646a5c567b28f4ff61f3ee78567980e7f43da GIT binary patch literal 505 zcmVNI_7CggOKk9fD4F@!-vW zKo8PI@TAc#)>T*!kzla7q=B%=D#py44&gTA>~`_NgWr4a_df6Y`|^8==XqRYXlKF3 z;^@zVZ$GY`Pv{-6_DAlo^>qR$p6Bs=ZmC*oydJzeGY_PE$9sHy_kvZP)lAduiK^(Y z9!)516`Z&N_yqVx>~rD@9^NaZhYNWgOuu!WzMT1O<%YV>KrKLjaf;;+D;za`wXP=& zlm6lqyR|xnd=5j8YqlBXb7iXz6aN%=K-Y02IK^=4qVD zw)5-GcU&oP92X&C0f6RTq%AAxurHRbL{(MNnG95GVSobUtgAu!KE*K=9M?t4U>O>~ zW~I#JboI2i$LN;-X{=~OC7DVE_B4RCh4+OgZ)R(yqHXOR9O5`mD?#WwB7W&Fpesru zX@mg)!pt;okKeJ@zif3>Ai4zuS(}6&za9brG@HjEBOz?&QS-Ro7H}n{lT7GD0?isW vvuz2Rl``Xx%iA6G`yYx$F1OTO^gI6n2S||tvI{T>00000NkvXXu0mjfuodPY literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПриложитьФайл/ПриложитьФайл.mdo b/SSL/src/CommonPictures/ПриложитьФайл/ПриложитьФайл.mdo new file mode 100644 index 000000000..84163084c --- /dev/null +++ b/SSL/src/CommonPictures/ПриложитьФайл/ПриложитьФайл.mdo @@ -0,0 +1,8 @@ + + + ПриложитьФайл + + ru + Приложить файл + + diff --git a/SSL/src/CommonPictures/РабочийКаталогПоУмолчанию/Picture.png b/SSL/src/CommonPictures/РабочийКаталогПоУмолчанию/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..8ee7f218e5a9e98a9b4fa6fef8615bb2fe145bc7 GIT binary patch literal 617 zcmV-v0+#)WP)fUtbtt@x%zFfBky}G@U^o9*F<`{$cq4=PSeC?=Nr!6siflLdFcLX0lvx z1O9^y0O4QX83>uc!llZv;nr@3tyed(zrIxC05*V$iHU*nKQja4KX%ka!Y0bV!mS2o z|NRMZ-R1`u7#3V#&0uY(%W`-A#U6+Y{()@Z0AhY5&B6@Ff3PsLZ;xS6=9OS@R`Otw z<&|cbb#V!UwT&*r^~;Yy%8Vff{Qt)Qicv-u5rhHkk_@YkmNOU{sxgR)3NXytwE!#* z)BNDfdj>vLCPyZS3;tbv|ME7&ySJa<_~#!khIs9ChV$odF+6_qlEK(i4UA!$Ykjhw z0JR=q1f`~HYb=r;JmZW2vJH^KK-Dac>*kkx%oFd;;}DY)VEFU(KSZ;4=2LqOmlHvo zLPHqw + + РабочийКаталогПоУмолчанию + + ru + Рабочий каталог по умолчанию + + diff --git a/SSL/src/CommonPictures/РазорватьСоединение/Picture.png b/SSL/src/CommonPictures/РазорватьСоединение/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4710b8c04a8f82968ba53c4fe3e7ce7cd62f26 GIT binary patch literal 836 zcmV-K1H1f*P)chzN%|4~D3zf4VU$QeLMtg1LIf}1ty0sKc*z@L z)2UOZxyv`_N?%b;0K}AvL z;Lkc#85I9qiK1CwW6LIgu6F#D ze%3tG`tb4E^3*ks$oHx6P)gnZI3VaQ%YCTAv}+;%||=|#uH zjV48j(YStdZOsUhB+=UT3F#q1oYj0o(9{?#EZOS@vD1LuJxJC(O2UT6F*~3IEHoNz zf}S)$uP33^kw}#CkpH0yyc0pNOiu#XEHgK?*gbb`SaD6qKJpk6hCs_lS2{V4c8d{7H> zuv{l~<;6KXy6!<)HFfKHGO_I-^Wbx{fL<(;8_Viotna~QN+|ddVpH-5G>yZU7I6lc zI)<}72kno7sg*?%LoW9qb0*+cSq82LAL8r?K&OWCO%GOk=P{j;1^J>a{FQfM=g2{1 zP9H%q-`PA_1cAls+vipqy7QNnDk-Q9*gJ5B1Tm8P_7~s1-CO@tfB^tY)K;8HZ1?g2 O0000 + + РазорватьСоединение + + ru + Разорвать соединение + + diff --git a/SSL/src/CommonPictures/РазрешитьРедактированиеРеквизитовОбъекта/Picture.png b/SSL/src/CommonPictures/РазрешитьРедактированиеРеквизитовОбъекта/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..028338c5ac79d52a069373f1d1831e5ad982e7cd GIT binary patch literal 611 zcmV-p0-XJcP)>*VhzLE8hn^O-6=RGTV?=B1$NzI}tem;r`@t;@QUcltN(;sc z+N}DEcTXyEZ3I)U0T2@b5kR0^*27m?sA+MSDNNFL`k7yMJWzdUgNQK}Wh}}Xloph+ z+#kI`brZP2&-54WzP{#RjKx|3h?WTEtQB0>!F65SfWyPFUXqQYw4G>T`_2ZYr{9)RIj-xl^7^yB1^`wBE0)2xH~C&W%)T9a=xpsG`Ry0sdWWOi5_Gn9W6N$Q=r;pe zTVB3@K;y1jiq$Q2G@fE$yq~HDhxRQAdQRR$Yws-FP@s}PfJ{O0X?ld=t_g-GLkx`f zvyd!uXmgy4$M29SD1UNYXoE*oDioDwF + + РазрешитьРедактированиеРеквизитовОбъекта + + ru + Разрешить редактирование реквизитов объекта + + diff --git a/SSL/src/CommonPictures/РаспространяетсяВИерархии/Picture.png b/SSL/src/CommonPictures/РаспространяетсяВИерархии/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..84366587974cde0ca6a48f362f16e0bbc9a12814 GIT binary patch literal 434 zcmV;j0ZsmiP)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)`p8N2tnU!_;Q6|PSnr2qf`07*qoM6N<$f;zd!)Bpeg literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/РаспространяетсяВИерархии/РаспространяетсяВИерархии.mdo b/SSL/src/CommonPictures/РаспространяетсяВИерархии/РаспространяетсяВИерархии.mdo new file mode 100644 index 000000000..90b4826d8 --- /dev/null +++ b/SSL/src/CommonPictures/РаспространяетсяВИерархии/РаспространяетсяВИерархии.mdo @@ -0,0 +1,8 @@ + + + РаспространяетсяВИерархии + + ru + Распространяется в иерархии + + diff --git a/SSL/src/CommonPictures/РедактироватьМакет/Picture.png b/SSL/src/CommonPictures/РедактироватьМакет/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..0655cfacfb1ff10c29cd64d79e611725b74de5c9 GIT binary patch literal 543 zcmV+)0^t3LP)`EmAJxz*r9*7+|Wal$mc$7_6BavYd!F?>%8sENuT(+kUzWiF)e;T20uz=RDTgB0=I{N>7?f8wbV7% z`p`XVrM}0(HbW)L@EiX*{|e?PgNy(G002ovPDHLkV1mZB`G5cb literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/РедактироватьМакет/РедактироватьМакет.mdo b/SSL/src/CommonPictures/РедактироватьМакет/РедактироватьМакет.mdo new file mode 100644 index 000000000..f4285c295 --- /dev/null +++ b/SSL/src/CommonPictures/РедактироватьМакет/РедактироватьМакет.mdo @@ -0,0 +1,8 @@ + + + РедактироватьМакет + + ru + Редактировать макет + + diff --git a/SSL/src/CommonPictures/Сканирование/Picture.png b/SSL/src/CommonPictures/Сканирование/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..c3f874596c3086455b3c368d180782e551d39027 GIT binary patch literal 351 zcmV-l0igbgP)46M1(<1OpHNB zMuveAIT{x&TC@pB`4VFo8yg$LlP6CgUI2kpr%r9s(9rNzP*7la@ZbSXjWBtjdN2(( z;QICJn|OJ7eL+t9^5qMIsHiAb%{)9j3~%1N0c*Z-;|3%UL7HLC21()rKYsjR*t>Tx zTr=1Jpnxwa(T1!U=;h5|FGx#EqbLdr3}RTfejS{~W&lWYPEL*=(Fib x^yw2u6oSCZmoGt@n}C|@L43vm&y4^91^^9#YmsMh1S + + Сканирование + + ru + Сканирование + + diff --git a/SSL/src/CommonPictures/СостояниеОбменаДанными/Picture.png b/SSL/src/CommonPictures/СостояниеОбменаДанными/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..83e2d8f5bb669c2e92164bf724ac554b8ed8355f GIT binary patch literal 2224 zcmV;h2v7HkP)Z zYmAiD8OML;%w=bGXRp8lyGym83nQSk2rSUD+JHui#ef58Qa%_X6pfWaD^~o{DjL#2 ztJSF34_ZahiN*^kK~%t?7)w!t+(X<}SQggZ*_rn~=h6=Y#MH)^EGIc1-sJpp-sgXw z^MB4GxWpru%Z;B%{_=$eur5{ImId{>*psujEDm%V&?C zJ@4?zgTsl0jceIGbo_|d_MP1KY<|&q^J~|xy?WfZaeo`qP&ZYpD2c$zcrxn!y0H7$ zv19kHS+nNAH`j|x5c7o*&t|hLpI`CQhgybAOEiwj63^6uwUnI#ea8;-(XJ1p{z*Ss zv25A0X8`rT{P5d{t^CvShaPIGt51w=%2J!C1z;d7aHRh*dp_S2RX3^?>*j3y7T?*~ znOd@B$*b32S)N;+PSP+kOFVUc|DZtMSBG)DGP_SEHgDRr>9$?Fb_D>jOBMXAS+gF$ z^SUXkXU|_6%Zwh2NTn+BN{LL@lDYf}MrW^z?S1R@o4U&;-P6;v6EGL}ajVBXzHsKk z)eEm(7#mZ61<6)YBF^g=gfqLma%g@&wHV(t4m!H0fr45cGrr|DGw}J zx=dgUL;*w*CjTSgyh|7ik&e(- zqpU((P1%(3m5&sX8SOL0;od{jkGjWC@@0izwQAK%GslR|u@feNwO~SIqJ~HBUB)Nx zy+g;1zrY54NC_>iBPewrYin%HHgDg)eaoP)KrWXXk()gE$j>K^suzvJ5K@Aa2qBR| zKultd#cGYw8le=r(96oVcJ~6={@MNU#>U1Yx%P$i4OI;YArJ^+B8CtWAq3W1jMZqX z(MB^64e*C;YkGm~ywmeqvTf{jhvA(Qhx@`R zA6s^@+6Ns{u?Sn4Mqzb;RUWqNV3o@?ElN7Y;%^2mz}}Dcc8pLC!f~+9060bP9PmAa z?;rvX>w6HmNZ$ds2<`ymlZyWS{#Lfok&2~=bcn0miy~YII5N@2?@)($%EMD0Ej6v| z*s-HkSvzw?wF6P95}*z$Cv6Rx`g$_;^?=5j5VVgeyATx^KT=@~m&XSyK*x-Zky0t_ zxl_ad8;>L7aYQ_UNF=aAfH9yHHVTnJfbKa>N`*jUlMESYvGfML3=@^qkI6X7DB>~> z2CTIxt0?P;vMJLS^dW_0^5n@)Zda*E+5|f2LsZp*6qRde4Vn5nz+$Ze9b(EplpVC+ zM@oh`B|T)&0(|oEUdxn)$YK#h99fe=BodHFLL!O4Vzq%V09D2o`jDj(I-LSE2rNLL zd`*Q?=m+J4lo&LF7GT=+j)UDMx!^MEL9qbkGB%Y$#1q)q`5UG+L=nRGz<0qIym*TJ z2i_ZPuI6AVDlMo^RO6Lhj5S0uA}-@dQQ@_zRD@861j@%^vDR|v)RlNEoaPs7uzNtio3wJ|IQxVg<0)psmJY z(MFSy30~RtvYj{k`Zx3r^&>wtv$RbhRe<#^HuTV?vs^R%X8;8M*>k=EL6k9utV`t@CxNJP0@DZ{B0CK<=JPb9Z~quJZ%JXkCipXU5iwtGkSnX~Wq z9^I4KJ%7QJTSYM%Kp@ao0}vB2q>%ie_A>5y;%?L3eda;4m5Y2`edg$?fn;sZSEnaW zoz#x?&!PK{Gh^-|rp=r}`OEDf zs&rdhD-G!s0KKk9_o>tT{+SnooyShz0c_^~G(+T=TPxF>?^|_Wy1ij64ONX5J~+pT z!f_t``=dec7lk|c=-Yf}XJ@Lpx%GjeX|?9|o3pgFwbD>~e*c0;_vzETy7L4zBPTw! zW5>4NUTB6cr2rR34X_B3%Mr5D(b!-MupjssIQ_l&EXxs8`0;EZ|NZ#s)8{ldHe??0 yykM~uCT@+e*zgOP%zThYh!?kQdvpIc*Z&vFil`LX=!|jz0000 + + СостояниеОбменаДанными + + ru + Состояние обмена данными + + diff --git a/SSL/src/CommonPictures/СостояниеОбменаДаннымиОшибка/Picture.png b/SSL/src/CommonPictures/СостояниеОбменаДаннымиОшибка/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e9e5433a71e3a3128dfabcd7aad987d38b3b0c GIT binary patch literal 825 zcmV-91IGM`P)s5!J+0N&?J}H;WAC}AIo#TEvroE}DsW)fF`rht;bkOg;IE+{52IuI6 zHTHj7XZ??jWaISXx2C73KL8AXJ_^sy&b~V_RJuKO<0V}f973|$!+NDqxko5mxWu{Q zdA)W2yB7)r7jvttt4n~@0F#rGv%#hQJ2!5Q3)Vu?h9m)FAT^L2;My@tVED?A)E=x| zkMi9co12?IN)QBn!PTq3-W)yOBfV!3r9de}6iNiN!dZt)Q*4?d#*o(bxbyipdoc`q zz;h!fT0Qolg^oj<(ufG61gAX^K>(MgU^-Z1u$q)7r%oso>8TCEnnd?9~M8H4-lAsTR=hw?nc^AX?2iGa0W3@$l9 zwcDh-6|&|4=so4t_iGMaL^T>99;&N=_&)d<@G}Swms&VzgX!RE`>1Av{2yFU$)%HmCK*0iHV7Ob1Umnbhd=E2Gx$x%{scVkE-pV z>wn`l_R(Pz)sC^w(mYe*hql|Do16Pm&Ck!rE?<1@qpy~&8XY4w2@;1$vxYRPhYTA? z9Fe95{nRzyySrq6-`RZwsA+(;weNRU{@i^~uZJ%`d;Mu~wLP3Dq|*ThHk-v}Jly3` zZY|ukTe+UM78e)a2kd{&6a>MGz{2fkp2(F-MNa0j0PICE+Yc+ebMNc+X5wD|c6oW> z=uF28j?kt2{HvwnV>6;815nxC`J&UR-Un8I%5n2Qc`|7lFgQnC00000NkvXXu0mjf DM9PQ9 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/СостояниеОбменаДаннымиОшибка/СостояниеОбменаДаннымиОшибка.mdo b/SSL/src/CommonPictures/СостояниеОбменаДаннымиОшибка/СостояниеОбменаДаннымиОшибка.mdo new file mode 100644 index 000000000..79c330651 --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеОбменаДаннымиОшибка/СостояниеОбменаДаннымиОшибка.mdo @@ -0,0 +1,8 @@ + + + СостояниеОбменаДаннымиОшибка + + ru + Состояние обмена данными ошибка + + diff --git a/SSL/src/CommonPictures/СостояниеОбменаДаннымиУспех/Picture.png b/SSL/src/CommonPictures/СостояниеОбменаДаннымиУспех/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..95cf76abe7299465d5b704441648a882d8ec1d30 GIT binary patch literal 821 zcmV-51Iqk~P)O6CDS~f=SIdoypAmbKkpvT#Ol_XLSyobH2m(olo$;s4dnG zOp1LMj^1Y_M_7mpEy4EX1Oqtsg`FL z&x`}mRUOvu+@!hLOxnrsuUwk_;6p$Icss+j&(6I2@YEx(&Q?!(QxiwXdf9&w1i4I} z!xK{+ELFVq+l?m+kL7c}EdRCwSP$Uw_fEd_;M9rNpE-6$SS*Q2FwUTz#yCT2Qz9K9 zh2+@e{bIencEUYi8ynwj-Vn9L+JRE3v{svbZlX9+LIf@>Z)8hcjNkw)N~><*Db3BPBfH4N#sn;7cDVBml+^6j4SI>j;M%5IYhd_W%BC>!;Yn z6tV@h(?mKX0;KSU3OHvm&fstuYskn9-_^f$M=F!cvij(KUtL-GBFJaP&{hx03(`LQ zq(_kU33Z4vYWN>xnLXTcw{9=ZU;R?9zPK6+kv+F~eZfu_t0X2FvK^!WK^hR7c))?x z%#@Gv=?@=U)remPIv&8r)s4+&)Ld_P_0zM}Q(`;mA`lp70Puu|6p};Zck|Bj+g1ws z#*Y`TzYo~|n28#5Gl%Y7IDhVZZn{{dI8p+j6>m}R{L1C8FUQJ{U%2^NePPE;yBF-l zm^{h+-aX|DLWnHDom~4$T6fpD#`nOVyPN+3KV__14M8{H00000NkvXXu0mjfnsJS| literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/СостояниеОбменаДаннымиУспех/СостояниеОбменаДаннымиУспех.mdo b/SSL/src/CommonPictures/СостояниеОбменаДаннымиУспех/СостояниеОбменаДаннымиУспех.mdo new file mode 100644 index 000000000..e78b7a7fc --- /dev/null +++ b/SSL/src/CommonPictures/СостояниеОбменаДаннымиУспех/СостояниеОбменаДаннымиУспех.mdo @@ -0,0 +1,8 @@ + + + СостояниеОбменаДаннымиУспех + + ru + Состояние обмена данными успех + + diff --git a/SSL/src/CommonPictures/СтатусыСопоставленияОбъектов/Picture.png b/SSL/src/CommonPictures/СтатусыСопоставленияОбъектов/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..fb913018fdaac339c60f51d4d2ccc252b370adf3 GIT binary patch literal 1030 zcmV+h1o``kP)jhwJbab@nwae!vESXFyz)9dls3R&O%DAqJYnhan?%1<) zbEkjJWKL;nu+oYV)DS z#>Rq&t`A`uA$gVSBl@9wF#_wt|yD>a*m=@glTdxYA<)Eoi1Wg~&ch7QH9 z9&BxG{UV)CSN|6UjvqgMCffhfe!aDuCEccASX{e4!>4cU<@NYhKKpu_mdFMy+od7Y zj@lroO`;PTA0NN?q;BC!0f|JSZ84WS;)c7)S4;|(8b#g2v}`&9B0j*hY>N8YEMGD4 zZyjJEn>~_9B-$R=GjuNe&hY1(X7-$Gf7#Ol!2WH017gvzC{=5ejT*X9V|(v2jC^!~ zL!W#@w5J!{SeuoqHA;p>-@q;r*#EfUC0RbZZ?HdZ%nN58o=H!dJ{FJn*rJSOniw@3 zqh@1TE=zak8GrvZ01kY7k?^L?_*#M(h#0a1k^-=OJ#X+_`FseEw%b+2kV2XZLmKFiB>tUvCzBfCYx$^9DQR2IL0sa<#>RA5j!}q=T z2PS5}zh(y%AI*vnzvM&ox!}62=q9*;>mvGG{L^oc2w2Aewsbl%8M%^5~ znO@+|z5D!@`TbwRds0Btv;uH`IWt2fAk)?)q535hNuZ@kK@dQe1XRC7Ta!d2Aai$i zl3*}+9w_`1bLv?Bs^hRTGx;F(sPN#;6GGFp4;Ql8g9qLaySkzSD3ZWxaSh$mp&~dI z8$$|_fK2JuPmEniW>cxu2ajT2d3!Mh?EEjcm%C8k$jFE`@Z!Gy=nF$sU75MtIRLua zgKSY{Zv8OM^@&S2QmIq|_{9sUr^_6msH%E091fot8hKSznwoJOmzrK?;?lQvE|)u9 zuh&ljo-K1v<;3H06*wG=#g4{ev7>)}t53uA2QvMq584bGdH?_b07*qoM6N<$f~TeN A=l}o! literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/СтатусыСопоставленияОбъектов/СтатусыСопоставленияОбъектов.mdo b/SSL/src/CommonPictures/СтатусыСопоставленияОбъектов/СтатусыСопоставленияОбъектов.mdo new file mode 100644 index 000000000..ba116d14e --- /dev/null +++ b/SSL/src/CommonPictures/СтатусыСопоставленияОбъектов/СтатусыСопоставленияОбъектов.mdo @@ -0,0 +1,8 @@ + + + СтатусыСопоставленияОбъектов + + ru + Статусы сопоставления объектов + + diff --git a/SSL/src/CommonPictures/ТипыМакетов/Picture.png b/SSL/src/CommonPictures/ТипыМакетов/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..236dbe324a8ab77a849e11d3b0b42a82d9d8b7af GIT binary patch literal 2600 zcmV+@3fJ|CP)AHIP000T^NklgzdBHKWKfLRQaOqOA?&71e$?H@B4CS-!aE`Rj=^X|Rp-E+_H{O-B; zyeHu$FK*qlG9VyeTx@KQEKSo8LPJx9`>7ES6o}kt`SkV~88_lf;)e@>!lxexKvh-R z95QVV2bvJ*b$X7UG~ZM7((^k3hff>-VF`snuN5vg&0Fwnz8y;c7i(UP7`!_H0RiLY zXHU%P>g8Sg%w$d;Ke_n5&)&|y^@dp;l%q!*sc2)~yt^4YW;B`*G`F@8;O9s0_#QYF zmG4iUqx3@4=6Q=A^}lF2x4F2uSpKh|a!V)-dbMzwDSPgW3|qx%)6zA&x+LM=g4b6X zjX`6(YrE?7H^<(4#l6%14Kb`Q{!sw5$a<=pR92c!QEOMR*%f4mgT_{w3r%)TY??-+ z%|=9M08=KW&+JG-ww^=9@pnJ)C=bk;&ftED_!|w>+w3?Mh0SljPivdZnG@e*ZZMD( z8*U1VPA~wk0*>L?dF!g_HC+-?Xm=ftm#VfODc<-{SNc#Gw6SoJ>GrI&Nt)vvx6MtN z6y7_|G;hJiP9zM^&Rb_R2K6&Nl09A3w9dvv=b`C&2V=ea*XAr+S0Q>#mn6E4A(7hc z27pDgdU_4_?DS&bEhPY0YHB%r^duvPrCd&e-?As4nQ-!$na9?wWysJJ9I}(Xz2d05 zXvfd!$B+SinKm&Ue}8|zHJ{_lZ;x-ty?=>q>&q_|`3Ylsa#TaN9S2bAjp<$K+Jis! zmTM=~HJ^}#<%lK%`%5=YHcoo2Fs~B{e!`dz)BxypI**;InmTIhZ5?d)hzch*Dx%Yx zdPz!84!SxFYO9oPXp!|4@4d*WG7D!a?L3y#n?Ds*u-^2H}t$G`F-78xzHCnG=Z&4`t8(gP1m~L$B8n znLL&;DXH6lqJb$x5ARrg|M;tMKI5*1M|=zmU{%`qwAFj|9ob%5`VZa0+&-G>ESC%h zSwzI7>1NDyW;nUtl)vC}4+#TPh8_lbU2ZHPHkyRk=uV3`6}8h?%FyA53m?rHFNBYD z@gb5VaqE4{j~H4UDx(JIIaLNiX~EAgh)RnU7)+b0r}oFaKrFkztROFU7LwDBt?mNn zY88H8@P|vl5B1lg`kmp|nb(s(B87;s5UMR!`t|NfgU!zB^{L!jyUGAxqyQ)yG}hPslvx0xqGJFswAvd;?%fl6vy-a27LJzI za<=>j{<41nb&WP=PP>`4AM9cBs6;+FRLO*)z3AJg7gD*C;P4nA+b?noaZ7K_oWJ;< zS2=}zJJ24f#%gAenFf3&t(UIX84F>wmp3Ua1+d4Vc9(=&_Y;U&{ zas^optg%Ds!YB6T={QVm$Yc8MOf zJjS?T3tY}=aNg3yxKwbe&?dVstMFg61i!p^;X}5IP5t^08Alub+?6w%sHg~9TH6Tp z_hbB+5u^=GAuJ>qNs>HHC{CxRt!e_jPVxl({8Nu}@tfzNKS#c8(7nhYXJdM@QJWtV6%K%mnj+Dq* z@f>-Jml759Ru({UH-ZnK0+kjk^$iz&zaT+$L^#Qb@jlf8_~@gLJpCn0mU!A`v$;bC zG`D9!qeFP=d;qo8;%V#TI#l;AePgeyXqcKl5T^poZ5?)jt0M#<;gQHf=c%VZT)&*I z#Hn}_;Bu%tRgmmeJ+-NjyU;~y(NoLFS@9gX3zyQ?xxo5Kk(~-r5fMa(M}Xu8B?OWr zA>5a z=6Op!PwUV8%cLqQl{HoxZ1(mOr;|j6hmqRHcLu16dc_O?JXz4#?84sRUl6#0?NH#| z{l3fOi6i^t)az)KeVl_rBP1-G!2^;!LmzK=#HSsAI_ssXz^SU7u6Ebl?Z7X)2x%|> z+JS#lXRZ$GTej1gfCjh9auEJumlyDUi9T7}eXfV3V07 z?))X5`AwG+oZbUcQ3crCdoC!zb=P(vp!z~}iKU@6>ug0GfdN4%nhr$;r=~;EBos|z z*TDvynuK0wz+$QC1n{#RFQG3V!7cA?={E2)rREbe?ptQ+_5{G7Im;_TtYy}s&BVpU zb^3v5u~ + + ТипыМакетов + + ru + Типы макетов + + diff --git a/SSL/src/CommonPictures/УдалитьПользовательскийМакет/Picture.png b/SSL/src/CommonPictures/УдалитьПользовательскийМакет/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..be4685e9ebab349e19c358fee7e33657e8890cba GIT binary patch literal 512 zcmV+b0{{JqP)h1oo|3;cVkv%!& zbpTI6tyT+dC=?3h^ZCHLQjG#!*QZn}9Xqw%ZU=cflN|*>^bNYM90kb3hhfq*4bwCM zkW!L6cX1eSb}E}uK)qfMisf=S$oFlVI1n2<`00IDvVM1E?$hha0buUT=}Ffc3~kVA zwSqjC%kgKeh_Wpv-fdzek^t-!uBw=lo<5$A8UDaOb_2(8NDlhgsd0X-+~U&5O=c^P zr~On0Y%3<}-+z3)Ie&T4^Fb4%H%RKB6l@o-VZ`HLz@F`4^<0)3O(Ciu8ZV#M-us~! zJkS5~(Rz~qS(oqv69H-CyqfH&u7R6K0}u)1Z6 zR~Kd!z@FoxMFDhd$KJKNtZtbC;Qsb+k&w{u_PqZW8PWb0Tdg4g0000 + + УдалитьПользовательскийМакет + + ru + Удалить пользовательский макет + + diff --git a/SSL/src/CommonTemplates/СтруктураПодчиненности/Template.mxlx b/SSL/src/CommonTemplates/СтруктураПодчиненности/Template.mxlx new file mode 100644 index 000000000..47d05d908 --- /dev/null +++ b/SSL/src/CommonTemplates/СтруктураПодчиненности/Template.mxlx @@ -0,0 +1,2370 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 25 + + 0 + + 1 + + + + 14 + + 2 + + + + 15 + + 3 + + + + 16 + + 4 + + + + + 0 + + + + 0 + + + ru + я + + + + + + 14 + + 0 + + + + 16 + + 5 + + + + + + 1 + + 6 + + 1 + + 7 + ПредставлениеДокумента + Документ + + + + + 8 + + + + + 8 + + + + + 8 + + + + 7 + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + 16 + + 5 + + + + 24 + + 0 + + + + + + 2 + + + 14 + + 0 + + + + 16 + + 5 + + + + + + 3 + + 6 + + 1 + + 9 + ПредставлениеДокумента + Документ + + + + + 8 + + + + + 8 + + + + + 8 + + + + 7 + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + 14 + + 0 + + + + 16 + + 5 + + + + + + 4 + + 6 + + 1 + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 10 + Документ + + + + + 10 + + + + + 10 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + + 5 + + 6 + + 1 + + 13 + + + + 13 + + 10 + + + + + 10 + Документ + + + + + 10 + + + + + 10 + + + + + + 6 + + 6 + + 1 + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + Документ + + + + + 10 + + + + + 10 + + + + + + 7 + + 6 + + 1 + + 14 + + + + + 8 + + + + + 8 + + + + + 8 + + + + 7 + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 8 + + + + + 10 + + + + + 10 + Документ + + + + + 10 + + + + + 10 + + + + + + 8 + + 6 + + 1 + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 15 + Документ + + + + + 10 + + + + + 10 + + + + + + 9 + + 6 + + 1 + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 16 + Документ + + + + + 10 + + + + + 10 + + + + + + 10 + + 6 + + 1 + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 15 + Документ + + + + + 10 + + + + + 10 + + + + + + 11 + + 6 + + 1 + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 15 + Документ + + + + + 10 + + + + + 10 + + + + + + 12 + + 6 + + 1 + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + Документ + + + + + 10 + + + + + 10 + + + + + + 13 + + 6 + + 1 + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 17 + Документ + + + + + 17 + Документ + + + + + 10 + + + + + 10 + + + + + + 14 + + 6 + + 1 + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 10 + + + + + 18 + + + + + 19 + + + + + 10 + + + + + + 15 + + 6 + + 16 + + 5 + + + + + + 16 + + 6 + + 16 + + 5 + + + + + + 17 + + 6 + + 14 + + 0 + + + + 16 + + 5 + + + + + + 18 + + 6 + + 14 + + 0 + + + + 16 + + 5 + + + + + + 19 + + 6 + + 16 + + 5 + + + + + + 20 + + 6 + + 16 + + 5 + + + + + + 21 + + + 16 + + 5 + + + + + + 22 + + + 16 + + 5 + + + + + + 23 + + + 16 + + 5 + + + + + + 24 + + + 16 + + 5 + + + + + + 25 + + + 16 + + 5 + + + + + + 26 + + + 16 + + 5 + + + + + + 27 + + + 16 + + 5 + + + + + + 28 + + + 16 + + 5 + + + + + + 29 + + + 16 + + 5 + + + + + + 30 + + + 16 + + 5 + + + + + + 31 + + + 16 + + 5 + + + + + + 32 + + + 16 + + 5 + + + + + + 33 + + + 16 + + 5 + + + + + + 34 + + + 16 + + 5 + + + + + + 35 + + + 16 + + 5 + + + + + + 36 + + + 16 + + 5 + + + + + + 37 + + + 16 + + 5 + + + + + + 38 + + + 7 + + 20 + + + + 16 + + 5 + + + + + + Picture + 4 + 21 + 5 + 2 + 5 + 59 + 14 + 0 + 14 + 57 + false + RealSize + 0 + 1 + + + Picture + 5 + 21 + 6 + 0 + 6 + 57 + 14 + 0 + 14 + 57 + false + RealSize + 0 + 2 + + + Picture + 6 + 21 + 7 + 3 + 8 + 0 + 14 + 0 + 14 + 57 + false + RealSize + 0 + 3 + + + Picture + 15 + 21 + 10 + 0 + 10 + 57 + 14 + 0 + 14 + 57 + false + RealSize + 0 + 4 + + + Picture + 17 + 21 + 9 + 0 + 9 + 57 + 14 + 0 + 14 + 57 + false + RealSize + 0 + 5 + + + Picture + 22 + 21 + 12 + 0 + 12 + 57 + 14 + 0 + 14 + 57 + false + RealSize + 0 + 6 + + + Picture + 24 + 21 + 4 + 0 + 4 + 57 + 14 + 0 + 14 + 57 + false + RealSize + 0 + 7 + + + Picture + 23 + 22 + 8 + 0 + 8 + 57 + 14 + 0 + 14 + 57 + false + RealSize + 0 + 8 + + + Picture + 31 + 21 + 13 + 0 + 13 + 57 + 14 + 0 + 14 + 57 + false + RealSize + 0 + 9 + + + Picture + 45 + 21 + 4 + 0 + 4 + 57 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 10 + + + Picture + 46 + 21 + 5 + 2 + 5 + 59 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 11 + + + Picture + 47 + 21 + 6 + 3 + 7 + 0 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 12 + + + Picture + 48 + 21 + 7 + 0 + 7 + 57 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 13 + + + Picture + 49 + 21 + 8 + 0 + 8 + 57 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 14 + + + Picture + 50 + 21 + 10 + 0 + 10 + 57 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 15 + + + Picture + 51 + 21 + 11 + 0 + 11 + 57 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 16 + + + Picture + 52 + 21 + 12 + 0 + 12 + 57 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 17 + + + Picture + 53 + 21 + 13 + 0 + 13 + 57 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 18 + + + Picture + 54 + 21 + 14 + 0 + 14 + 57 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 19 + + + Picture + 55 + 21 + 16 + 0 + 16 + 57 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 20 + + + Picture + 56 + 21 + 17 + 0 + 17 + 57 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 21 + + + Picture + 57 + 21 + 18 + 0 + 18 + 57 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 22 + + + Picture + 58 + 21 + 19 + 0 + 19 + 57 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 23 + + + Picture + 59 + 21 + 20 + 0 + 20 + 57 + 16 + 0 + 16 + 57 + false + RealSize + 0 + 24 + + + 0 + + + + 1 + + + + 2 + + + + 3 + + + + 4 + + + + 5 + + + + 6 + + + + 7 + + + + 8 + + + + 9 + + + + 10 + + + + 11 + + + + 12 + + + + 13 + + + + 14 + + + + 15 + + + + 16 + + + + 17 + + + + 18 + + + + 19 + + + + 20 + + + + 21 + + + + 22 + + + + 23 + + + true + 8 + 39 + 39 + + 1 + 1 + 11 + + + 3 + 1 + 11 + + + 5 + 1 + 11 + + + 7 + 1 + 11 + + + -1 + 14 + + + -1 + 14 + + + -1 + 15 + + + -1 + 16 + + + Документ + + Rectangle + 1 + 1 + 1 + 12 + + + + ДокументЗаписан + + Rectangle + 5 + 5 + 14 + 14 + + + + ДокументЗаписанКоннекторВерх + + Rectangle + 16 + 16 + 16 + 16 + + + + ДокументЗаписанКоннекторВерхНиз + + Rectangle + 18 + 18 + 16 + 16 + + + + ДокументЗаписанКоннекторЛевоВерх + + Rectangle + 20 + 20 + 16 + 16 + + + + ДокументЗаписанКоннекторЛевоНиз + + Rectangle + 19 + 19 + 16 + 16 + + + + ДокументЗаписанКоннекторНиз + + Rectangle + 17 + 17 + 16 + 16 + + + + ДокументПомеченНаУдаление + + Rectangle + 7 + 7 + 14 + 14 + + + + ДокументПомеченНаУдалениеКоннекторВерх + + Rectangle + 10 + 10 + 16 + 16 + + + + ДокументПомеченНаУдалениеКоннекторВерхНиз + + Rectangle + 12 + 12 + 16 + 16 + + + + ДокументПомеченНаУдалениеКоннекторЛевоВерх + + Rectangle + 14 + 14 + 16 + 16 + + + + ДокументПомеченНаУдалениеКоннекторЛевоНиз + + Rectangle + 13 + 13 + 16 + 16 + + + + ДокументПомеченНаУделениеКоннекторНиз + + Rectangle + 11 + 11 + 16 + 16 + + + + ДокументПроведен + + Rectangle + 6 + 6 + 14 + 14 + + + + ДокументПроведенКоннекторВерх + + Rectangle + 4 + 4 + 16 + 16 + + + + ДокументПроведенКоннекторВерхНиз + + Rectangle + 6 + 6 + 16 + 16 + + + + ДокументПроведенКоннекторЛевоВерх + + Rectangle + 7 + 7 + 16 + 16 + + + + ДокументПроведенКоннекторЛевоНиз + + Rectangle + 8 + 8 + 16 + 16 + + + + ДокументПроведенКоннекторНиз + + Rectangle + 5 + 5 + 16 + 16 + + + + КоннекторВерхНиз + + Rectangle + 13 + 13 + 14 + 14 + + + + КоннекторВерхПраво + + Rectangle + 10 + 10 + 14 + 14 + + + + КоннекторВерхПравоНиз + + Rectangle + 9 + 9 + 14 + 14 + + + + КоннекторЛевоНизПраво + + Rectangle + 4 + 4 + 14 + 14 + + + + КоннекторЛевоПраво + + Rectangle + 12 + 12 + 14 + 14 + + + + КоннекторПравоНиз + + Rectangle + 8 + 8 + 14 + 14 + + + + Отступ + + Rectangle + 11 + 11 + 14 + 14 + + + + ТекущийДокумент + + Rectangle + 3 + 3 + 1 + 12 + + + + Solid + + + None + + + + + + + 26 + + + 25 + + + 24 + + + 23 + Center + + + Center + + + 60 + + + 0 + 72 + Left + Parameter + Row + + + 72 + + + 1 + 72 + Left + Parameter + Row + + + Center + Center + + + 26 + Center + Center + + + 72 + Center + Center + + + 2 + Center + Center + Row + + + 3 + 72 + Center + Center + Row + + + Center + Center + Row + + + 17 + Center + Center + Row + + + Center + Center + false + + + 17 + Center + Center + + + 47 + Center + Center + + + 0 + + + 1 + + + 1 + false + + \ No newline at end of file diff --git a/SSL/src/CommonTemplates/СтруктураПодчиненности/СтруктураПодчиненности.mdo b/SSL/src/CommonTemplates/СтруктураПодчиненности/СтруктураПодчиненности.mdo new file mode 100644 index 000000000..833ca47c0 --- /dev/null +++ b/SSL/src/CommonTemplates/СтруктураПодчиненности/СтруктураПодчиненности.mdo @@ -0,0 +1,8 @@ + + + СтруктураПодчиненности + + ru + Структура подчиненности + + diff --git a/SSL/src/Configuration/Configuration.mdo b/SSL/src/Configuration/Configuration.mdo new file mode 100644 index 000000000..89e3a0607 --- /dev/null +++ b/SSL/src/Configuration/Configuration.mdo @@ -0,0 +1,662 @@ + + + БиблиотекаСтандартныхПодсистем + + ru + Библиотека стандартных подсистем, редакция 1.0 + + + + + + + + + ManagedApplication + PersonalComputer + Russian + Фирма "1С" + 1.0.7.5 + http://downloads.v8.1c.ru/tmplts/ + true + + + true + + + OSBackup + true + + + OpenDataInDialogs + Language.Русский + + ru + Библиотека стандартных подсистем, редакция 1.0 + + + ru + Библиотека стандартных подсистем, редакция 1.0 + + + + + ru + Copyright © ЗАО "1C", 2009. Все права защищены + + + ru + http://www.1c.ru + + Managed + NotAutoFree + Version8_2 + 8.2.13 + + Русский + + ru + Русский + + ru + + Subsystem.СтандартныеПодсистемы + StyleItem.ВыполненнаяЗадача + StyleItem.ЗавершенныйБизнесПроцесс + StyleItem.НеСтартованныйБизнесПроцесс + StyleItem.ПользовательВыбранный + StyleItem.ПоясняющийОшибкуТекст + StyleItem.ПоясняющийТекст + StyleItem.ПросроченнаяЗадача + StyleItem.РольБезИсполнителей + StyleItem.УдаленныйДополнительныйРеквизитЦвет + StyleItem.УдаленныйДополнительныйРеквизитШрифт + StyleItem.ФайлЗанятыйДругимПользователем + StyleItem.ФайлЗанятыйТекущимПользователем + CommonPicture.АрхивАнкета + CommonPicture.ВидыОпераций + CommonPicture.Внимание + CommonPicture.ВыполнитьЗапускОбменаДанными + CommonPicture.ДлительнаяОперация48 + CommonPicture.ДобавитьДопСвойствоВНабор + CommonPicture.ДобавитьПростойВопрос + CommonPicture.ДобавитьРазделАнкеты + CommonPicture.ДобавитьТабличныйВопрос + CommonPicture.ДобавитьУсловныйВопрос + CommonPicture.ДокументЗаписанКоннекторВерх + CommonPicture.ДокументЗаписанКоннекторВерхНиз + CommonPicture.ДокументЗаписанКоннекторЛево + CommonPicture.ДокументЗаписанКоннекторЛевоВерх + CommonPicture.ДокументЗаписанКоннекторЛевоНиз + CommonPicture.ДокументЗаписанКоннекторНиз + CommonPicture.ДокументПомеченНаУдалениеКоннекторВерх + CommonPicture.ДокументПомеченНаУдалениеКоннекторВерхНиз + CommonPicture.ДокументПомеченНаУдалениеКоннекторЛево + CommonPicture.ДокументПомеченНаУдалениеКоннекторЛевоВерх + CommonPicture.ДокументПомеченНаУдалениеКоннекторЛевоНиз + CommonPicture.ДокументПомеченНаУдалениеКоннекторНиз + CommonPicture.ДокументПроведенКоннекторВерх + CommonPicture.ДокументПроведенКоннекторВерхНиз + CommonPicture.ДокументПроведенКоннекторЛево + CommonPicture.ДокументПроведенКоннекторЛевоВерх + CommonPicture.ДокументПроведенКоннекторЛевоНиз + CommonPicture.ДокументПроведенКоннекторНиз + CommonPicture.ДополнительныеРеквизитыСведения + CommonPicture.ДополнительныеСведения + CommonPicture.ЗавершитьРедактированиеМакета + CommonPicture.ЗакрепитьВариантОтчета + CommonPicture.ЗаставкаОбновленияКонфигурации + CommonPicture.Зашифрован + CommonPicture.ЗначокЗаставкиОбновленияКонфигурации + CommonPicture.ИерархическийСписок + CommonPicture.Информация + CommonPicture.Информация32 + CommonPicture.ИспользоватьПользовательскийМакет + CommonPicture.ИспользоватьПоставляемыйМакет + CommonPicture.ИсторияВерсий + CommonPicture.КартинкаВДеревеСвойств + CommonPicture.КартинкаЗакончитьРедактирование + CommonPicture.КартинкаЗанять + CommonPicture.КартинкаОпубликовать + CommonPicture.КартинкаОсвободить + CommonPicture.КартинкаОткрыть + CommonPicture.КартинкаРедактировать + CommonPicture.КартинкаСохранитьКак + CommonPicture.КоллекцияВариантыВажностиЗадачи + CommonPicture.КоллекцияВидыАктивныхПользователей + CommonPicture.КоллекцияВидыСобытийЖурналаРегистрации + CommonPicture.КоллекцияДляПомеченныхНаУдалениеОбъектов + CommonPicture.КоллекцияКартинокДеревоАнкеты + CommonPicture.КоллекцияКартинокДоступныеАнкеты + CommonPicture.КоллекцияПиктограммЭлементов + CommonPicture.КоннекторВерхНиз + CommonPicture.КоннекторВерхПраво + CommonPicture.КоннекторВерхПравоНиз + CommonPicture.КоннекторЛевоНизПраво + CommonPicture.КоннекторЛевоПраво + CommonPicture.КоннекторПравоНиз + CommonPicture.КонтактнаяИнформация + CommonPicture.НастройкаОбработкиРегламентныхЗаданий + CommonPicture.ОбработатьРегламентноеЗаданиеВручную + CommonPicture.ОтдельныйСеансОбработкиРегламентныхЗаданий + CommonPicture.ОткрепитьВариантОтчета + CommonPicture.ОткрытьМакет + CommonPicture.ОтменитьРедактированиеМакета + CommonPicture.ОтправитьEmail + CommonPicture.Ошибка32 + CommonPicture.ОшибкаОбработкиРегламентныхЗаданий + CommonPicture.Папка + CommonPicture.Папки + CommonPicture.ПараметрыОбменаДанными + CommonPicture.Переключатель + CommonPicture.ПиктограммыПользователя + CommonPicture.ПиктограммыПользователя01 + CommonPicture.ПиктограммыПользователя02 + CommonPicture.ПиктограммыПользователя03 + CommonPicture.ПиктограммыПользователя04 + CommonPicture.ПиктограммыПользователя05 + CommonPicture.ПиктограммыПользователя06 + CommonPicture.ПиктограммыПользователя07 + CommonPicture.ПиктограммыПользователя08 + CommonPicture.ПиктограммыПользователя09 + CommonPicture.ПиктограммыПользователя10 + CommonPicture.ПиктограммыПользователя11 + CommonPicture.ПиктограммыПользователя12 + CommonPicture.ПиктограммыФайлов + CommonPicture.Подписан + CommonPicture.ПодсистемаАдминистрирование + CommonPicture.ПодсистемаАнкетирование + CommonPicture.ПодсистемаБизнесПроцессыИЗадачи + CommonPicture.ПодсистемаОбменДанными + CommonPicture.ПодсистемаРаботаСФайлами + CommonPicture.ПодсистемаУправленияДоступом + CommonPicture.ПоказатьТолькоВыбранныеРоли + CommonPicture.ПолнотекстовыйПоискДалее + CommonPicture.ПолнотекстовыйПоискНазад + CommonPicture.ПользователиВыполнитьСинхронизацию + CommonPicture.ПревьюТабличногоВопросаОтветыВКолонках + CommonPicture.ПревьюТабличногоВопросаОтветыВСтроках + CommonPicture.ПревьюТабличногоВопросаОтветыСтрокиИКолонки + CommonPicture.ПревьюТабличногоВопросаСоставной + CommonPicture.Предупреждение32 + CommonPicture.ПриложитьФайл + CommonPicture.РабочийКаталогПоУмолчанию + CommonPicture.РазорватьСоединение + CommonPicture.РазрешитьРедактированиеРеквизитовОбъекта + CommonPicture.РаспространяетсяВИерархии + CommonPicture.РедактироватьМакет + CommonPicture.Сканирование + CommonPicture.СостояниеОбменаДанными + CommonPicture.СостояниеОбменаДаннымиОшибка + CommonPicture.СостояниеОбменаДаннымиУспех + CommonPicture.СтатусыСопоставленияОбъектов + CommonPicture.ТипыМакетов + CommonPicture.УдалитьПользовательскийМакет + SessionParameter.ВидыДоступаБезГруппЗначенияДоступа + SessionParameter.ВидыДоступаБезОграничения + SessionParameter.ВидыДоступаЕдинственныеДляТипаЗначенияДоступа + SessionParameter.ВидыДоступаЧерезПраваПоЗначениямДоступа + SessionParameter.ДатаОбновленияПовторноИспользуемыхЗначенийМРО + SessionParameter.ИспользуемыеПланыОбмена + SessionParameter.ОбменДаннымиВключен + SessionParameter.ОграничиватьДоступПоВиду + SessionParameter.ОграничиватьДоступПоВидуВнешниеПользователи + SessionParameter.ОграничиватьДоступПоВидуДополнительныеСведения + SessionParameter.ОграничиватьДоступПоВидуОбъект + SessionParameter.ОграничиватьДоступПоВидуПользователи + SessionParameter.ОграничиватьДоступПоВидуПравоДобавления + SessionParameter.ОграничиватьДоступПоВидуПравоИзменения + SessionParameter.ОграничиватьДоступПоВидуПравоЧтения + SessionParameter.ОграничиватьДоступПоВидуУсловие + SessionParameter.ОграничиватьДоступПоВидуУчетныеЗаписиЭлектроннойПочты + SessionParameter.ПравилаВыборочнойРегистрацииОбъектов + SessionParameter.ПравилаРегистрацииОбъектов + SessionParameter.ПредлагатьУстановкуРасширенияРаботыСФайлами + SessionParameter.ПутьКРабочемуКаталогуПользователя + SessionParameter.ТекущийВнешнийПользователь + SessionParameter.ТекущийПользователь + Role.Администрирование + Role.БазовыеПрава + Role.ВыводНаПринтерФайлБуферОбмена + Role.ВыполнениеОбменовДанными + Role.ДобавлениеИзменениеБазовойНСИ + Role.ДобавлениеИзменениеВариантовОтчетов + Role.ДобавлениеИзменениеВнешнихПользователей + Role.ДобавлениеИзменениеДополнительныхОтчетовИОбработок + Role.ДобавлениеИзменениеЗаданий + Role.ДобавлениеИзменениеОбменовДанными + Role.ДобавлениеИзменениеОпросов + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + Role.ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц + Role.ДобавлениеИзменениеПользователейИГруппДоступа + Role.ДобавлениеИзменениеРолейИсполнителей + Role.ДобавлениеИзменениеФизическихЛиц + Role.ДобавлениеИзменениеШаблоновАнкет + Role.ЗапускAutomation + Role.ЗапускВебКлиента + Role.ЗапускВнешнегоСоединения + Role.ЗапускТолстогоКлиента + Role.ЗапускТонкогоКлиента + Role.ИзменениеВыполнениеЗадач + Role.ИзменениеДополнительныхСведений + Role.ИзменениеМакетовПечатныхФорм + Role.ИзменениеТекущегоВнешнегоПользователя + Role.ИзменениеТекущегоПользователя + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + Role.ИспользованиеДополнительныхОтчетовИОбработок + Role.ИспользованиеУчетныхЗаписейЭлектроннойПочты + Role.ОбновлениеКонфигурацииБазыДанных + Role.ПолныеПрава + Role.ПроверкаДоступныхОбновленийКонфигурации + Role.ПросмотрЖурналаРегистрации + Role.РедактированиеРеквизитовОбъектов + Role.ЧтениеБазовойНСИ + Role.ЧтениеВнешнихПользователей + Role.ЧтениеДополнительныхСведений + Role.ЧтениеЗаданий + Role.ЧтениеЗадач + Role.ЧтениеОтветовНаВопросыАнкет + Role.ЧтениеПерсональныхДанныхФизическихЛиц + Role.ЧтениеФизическихЛиц + CommonTemplate.СтруктураПодчиненности + FilterCriterion.СвязанныеДокументы + FilterCriterion.ФайлыВТоме + CommonModule.АдресныйКлассификатор + CommonModule.АдресныйКлассификаторКлиент + CommonModule.АдресныйКлассификаторКлиентСервер + CommonModule.Анкетирование + CommonModule.АнкетированиеКлиент + CommonModule.АнкетированиеКлиентСервер + CommonModule.БизнесПроцессыИЗадачиКлиент + CommonModule.БизнесПроцессыИЗадачиПереопределяемый + CommonModule.БизнесПроцессыИЗадачиСервер + CommonModule.БизнесПроцессыИЗадачиСобытия + CommonModule.ВариантыОтчетов + CommonModule.ВариантыОтчетовКлиент + CommonModule.ВариантыОтчетовКлиентПереопределяемый + CommonModule.ВариантыОтчетовПереопределяемый + CommonModule.ВерсионированиеОбъектов + CommonModule.ВерсионированиеОбъектовСобытия + CommonModule.ВнешниеПользователи + CommonModule.ВнешниеПользователиСобытия + CommonModule.ДополнительныеОтчетыИОбработки + CommonModule.ДополнительныеОтчетыИОбработкиКлиент + CommonModule.ДополнительныеОтчетыИОбработкиКлиентСервер + CommonModule.ДополнительныеОтчетыИОбработкиПереопределяемый + CommonModule.ЗапретРедактированияРеквизитовОбъектов + CommonModule.ЗапретРедактированияРеквизитовОбъектовКлиент + CommonModule.КалендарныеГрафики + CommonModule.КомандыРаботыСФайлами + CommonModule.КонтрольДинамическогоОбновленияКонфигурации + CommonModule.КонтрольДинамическогоОбновленияКонфигурацииГлобальный + CommonModule.КонтрольДинамическогоОбновленияКонфигурацииКлиент + CommonModule.КонтрольЖурналаРегистрации + CommonModule.НастройкаПорядкаЭлементов + CommonModule.НастройкаПорядкаЭлементовКлиент + CommonModule.НастройкаПорядкаЭлементовСобытия + CommonModule.ОбменДаннымиКлиент + CommonModule.ОбменДаннымиПереопределяемый + CommonModule.ОбменДаннымиПовтИсп + CommonModule.ОбменДаннымиСервер + CommonModule.ОбменДаннымиСобытия + CommonModule.ОбменФайлами + CommonModule.ОбновлениеИнформационнойБазы + CommonModule.ОбновлениеИнформационнойБазыКлиент + CommonModule.ОбновлениеИнформационнойБазыКлиентПереопределяемый + CommonModule.ОбновлениеИнформационнойБазыПереопределяемый + CommonModule.ОбновлениеКонфигурации + CommonModule.ОбновлениеКонфигурацииКлиент + CommonModule.ОбновлениеКонфигурацииКлиентГлобальный + CommonModule.ОбновлениеКонфигурацииКлиентПереопределяемый + CommonModule.ОбновлениеКонфигурацииКлиентПовтИсп + CommonModule.ОбновлениеКонфигурацииПереопределяемый + CommonModule.ОбщегоНазначения + CommonModule.ОбщегоНазначенияКлиент + CommonModule.ОбщегоНазначенияКлиентПовтИсп + CommonModule.ОбщегоНазначенияКлиентСервер + CommonModule.ОбщегоНазначенияПереопределяемый + CommonModule.ПолнотекстовыйПоискКлиентПереопределяемый + CommonModule.ПолнотекстовыйПоискСервер + CommonModule.ПолучениеФайловИзИнтернета + CommonModule.ПолучениеФайловИзИнтернетаКлиент + CommonModule.ПолучениеФайловИзИнтернетаКлиентСервер + CommonModule.Пользователи + CommonModule.ПользователиКлиентПереопределяемый + CommonModule.ПользователиПереопределяемый + CommonModule.ПользователиСерверПовтИсп + CommonModule.ПрефиксацияОбъектовКлиентСервер + CommonModule.ПрефиксацияОбъектовПовтИсп + CommonModule.ПрефиксацияОбъектовСобытия + CommonModule.ПроверкаЛегальностиПолученияОбновленияКлиент + CommonModule.РаботаСКурсамиВалют + CommonModule.РаботаСКурсамиВалютКлиентСервер + CommonModule.РаботаСКурсамиВалютСобытия + CommonModule.РаботаСоСканеромКлиент + CommonModule.РаботаСПочтовымиСообщениями + CommonModule.РаботаСПочтовымиСообщениямиКлиент + CommonModule.РаботаСФайлами + CommonModule.РаботаСФайламиКлиент + CommonModule.РаботаСФайламиКлиентПовтИсп + CommonModule.РаботаСФайламиКлиентСервер + CommonModule.РаботаСФайламиПереопределяемый + CommonModule.РаботаСФайламиПовтИсп + CommonModule.РегламентныеЗаданияГлобальный + CommonModule.РегламентныеЗаданияКлиент + CommonModule.РегламентныеЗаданияСервер + CommonModule.СоединенияИБ + CommonModule.СоединенияИБГлобальный + CommonModule.СоединенияИБКлиент + CommonModule.СоединенияИБКлиентСервер + CommonModule.СтандартныеПодсистемыКлиентПовтИсп + CommonModule.СтандартныеПодсистемыПереопределяемый + CommonModule.СтроковыеФункцииКлиентСервер + CommonModule.УправлениеДоступом + CommonModule.УправлениеДоступомПереопределяемый + CommonModule.УправлениеДоступомСерверПовтИсп + CommonModule.УправлениеДоступомСобытия + CommonModule.УправлениеИтогамиИАгрегатамиСобытия + CommonModule.УправлениеКонтактнойИнформацией + CommonModule.УправлениеКонтактнойИнформациейКлассификаторы + CommonModule.УправлениеКонтактнойИнформациейКлассификаторыКлиент + CommonModule.УправлениеКонтактнойИнформациейКлиент + CommonModule.УправлениеКонтактнойИнформациейПереопределяемый + CommonModule.УправлениеКонтактнойИнформациейСобытия + CommonModule.УправлениеПечатью + CommonModule.УправлениеПечатьюMSWordКлиент + CommonModule.УправлениеПечатьюOOWriterКлиент + CommonModule.УправлениеПечатьюКлиент + CommonModule.УправлениеПечатьюПереопределяемый + CommonModule.УправлениеСвойствами + CommonModule.УправлениеСвойствамиКлиент + CommonModule.УправлениеСвойствамиПереопределяемый + CommonModule.ФайловыеФункции + CommonModule.ФайловыеФункцииКлиент + CommonModule.ФайловыеФункцииКлиентСервер + CommonModule.ФизическиеЛица + CommonModule.ЭлектроннаяПочта + CommonModule.ЭлектроннаяПочтаКлиент + CommonModule.ЭлектронноЦифроваяПодпись + CommonModule.ЭлектронноЦифроваяПодписьКлиент + CommonModule.ЭлектронноЦифроваяПодписьКлиентПовтИсп + EventSubscription.ЗаписатьВСписокБизнесПроцессов + EventSubscription.ЗаписатьГруппыИВидыДоступа + EventSubscription.ЗаписатьЗависимыеНаборыЗначенийДоступа + EventSubscription.ЗаписатьНаборыЗначенийДоступа + EventSubscription.ЗаполнитьКонтактнуюИнформацию + EventSubscription.ОбменДаннымиПередЗаписьюУзлаПланаОбмена + EventSubscription.ОбменДаннымиПередУдалениемУзлаПланаОбмена + EventSubscription.ОбновитьПредставлениеВнешнегоПользователя + EventSubscription.УстановитьПометкуУдаленияЗадач + ScheduledJob.ВыполнениеОбменаДанными + ScheduledJob.ЗагрузкаКурсовВалют + ScheduledJob.ЗаполнениеДанныхДляОграниченияДоступа + ScheduledJob.ЗапускДополнительныхОбработок + ScheduledJob.ИзвлечениеТекста + ScheduledJob.КонтрольЖурналаРегистрации + ScheduledJob.МониторингЗадач + ScheduledJob.ОбновлениеАгрегатов + ScheduledJob.ОбновлениеИндексаППД + ScheduledJob.ПерестроениеАгрегатов + ScheduledJob.СлияниеИндексаППД + ScheduledJob.УведомлениеИсполнителейОНовыхЗадачах + ScheduledJob.УстановкаПериодаРассчитанныхИтогов + SettingsStorage.ХранилищеВариантовОтчетов + FunctionalOption.АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО + FunctionalOption.ВариантыВерсионированияОбъектов + FunctionalOption.ИзменятьЗаданияЗаднимЧислом + FunctionalOption.ИспользоватьАнкетирование + FunctionalOption.ИспользоватьБизнесПроцессыИЗадачи + FunctionalOption.ИспользоватьВерсионированиеОбъекта + FunctionalOption.ИспользоватьВерсионированиеОбъектов + FunctionalOption.ИспользоватьВнешнихПользователей + FunctionalOption.ИспользоватьДатуИВремяВСрокахЗадач + FunctionalOption.ИспользоватьДатуНачалаЗадач + FunctionalOption.ИспользоватьДополнительныеОтчетыИОбработкиЗаполненияОбъекта + FunctionalOption.ИспользоватьДополнительныеОтчетыИОбработкиОтчеты + FunctionalOption.ИспользоватьДополнительныеОтчетыИОбработкиПечатныеФормы + FunctionalOption.ИспользоватьДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов + FunctionalOption.ИспользоватьДополнительныеРеквизитыИСведения + FunctionalOption.ИспользоватьОбменДанными + FunctionalOption.ИспользоватьПолнотекстовыйПоиск + FunctionalOption.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + FunctionalOption.ОграничиватьДоступНаУровнеЗаписей + FunctionalOption.ПрефиксИнформационнойБазы + FunctionalOption.ПрефиксыОрганизаций + FunctionalOptionsParameter.Организация + FunctionalOptionsParameter.ТипОбъектаКонфигурации + FunctionalOptionsParameter.ТипФормыСДополнительнымиОтчетамиИОбработками + CommonCommand.ВнешнийПользовательОбъектаАвторизации + CommonCommand.ВыполнитьОбменДанными + CommonCommand.ВыполнитьОбменДаннымиИнтерактивно + CommonCommand.ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта + CommonCommand.ДополнительныеОтчетыИОбработкиОтчеты + CommonCommand.ДополнительныеОтчетыИОбработкиПечатныеФормы + CommonCommand.ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов + CommonCommand.ДополнительныеСведения + CommonCommand.ЗадачиПоБизнесПроцессу + CommonCommand.ЗадачиПоПредмету + CommonCommand.ИсторияИзменений + CommonCommand.КартаМаршрутаБизнесПроцесса + CommonCommand.НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты + CommonCommand.НастроитьПараметрыТранспортаСообщенийОбмена + CommonCommand.ОбменДаннымиРазместитьФайлыВТомах + CommonCommand.ОткрытьПравилаКонвертацииОбъектов + CommonCommand.ОткрытьПравилаРегистрацииОбъектов + CommonCommand.ОткрытьСценарииОбменовДанными + CommonCommand.ОткрытьФормуУправленияОбменамиДанных + CommonCommand.ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + CommonCommand.ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + CommonCommand.ПерсональнаяНастройкаПроксиСервера + CommonCommand.ПраваВнешнегоПользователяПоЗначениямДоступа + CommonCommand.ПраваПоЗначениюДоступа + CommonCommand.ПраваПользователяПоЗначениямДоступа + CommonCommand.ПрисоединенныеФайлы + CommonCommand.РедактированиеМакетовПечатныхФорм + CommonCommand.РолеваяАдресацияПоОбъекту + CommonCommand.СозданиеНачальногоОбразаСФайлами + CommonCommand.СписокРеспондента + CommonCommand.СтруктураПодчиненности + CommonCommand.УстановитьРасширениеРаботыСФайлами + CommandGroup.ВыполнениеОбменаДанными + CommandGroup.ПараметрыОбменаДанными + CommandGroup.Печать + Constant.АдресатыПолученияОтчетаПоЖурналуРегистрации + Constant.АлгоритмПодписи + Constant.АлгоритмХеширования + Constant.АлгоритмШифрования + Constant.ВыполнятьПроверкуЭЦПНаСервере + Constant.ДатаОбновленияПовторноИспользуемыхЗначенийМРО + Constant.ДатаУведомленияОНовыхЗадачах + Constant.ЗаголовокСистемы + Constant.ЗапретЗагрузкиФайловПоРасширению + Constant.ИзвлекатьТекстыФайловНаСервере + Constant.ИзменятьЗаданияЗаднимЧислом + Constant.ИспользоватьАнкетирование + Constant.ИспользоватьБизнесПроцессыИЗадачи + Constant.ИспользоватьВерсионированиеОбъектов + Constant.ИспользоватьВнешнихПользователей + Constant.ИспользоватьДатуИВремяВСрокахЗадач + Constant.ИспользоватьДатуНачалаЗадач + Constant.ИспользоватьДополнительныеРеквизитыИСведения + Constant.ИспользоватьОбменДанными + Constant.ИспользоватьПолнотекстовыйПоиск + Constant.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Constant.МаксимальныйРазмерФайла + Constant.НастройкаПроксиСервера + Constant.ОграничиватьДоступНаУровнеЗаписей + Constant.ПараметрыАдминистрированияИБ + Constant.ПрефиксУзлаРаспределеннойИнформационнойБазы + Constant.ПровайдерЭЦП + Constant.СостояниеОбработкиРегламентныхЗаданий + Constant.СписокЗапрещенныхРасширений + Constant.СтатусОбновленияКонфигурации + Constant.ТипПровайдераЭЦП + Constant.ТипХраненияФайлов + CommonForm.ВводАдреса + CommonForm.ВводТелефона + CommonForm.ВопросОбУстановкеРасширенияРаботыСФайлами + CommonForm.ВсеОтчеты + CommonForm.ВыборОбъектовМетаданных + CommonForm.ВыборСертификатаЭЦПДляПодписи + CommonForm.ВыполнениеОбменаДанными + CommonForm.ДополнительныеОтчетыИОбработки + CommonForm.МастерАнкетыПоРазделам + CommonForm.НастройкаЛокальногоКэшаФайлов + CommonForm.НастройкаМоихОтчетовИОбработок + CommonForm.НастройкаПечатныхФормПередОтправкой + CommonForm.НастройкиЭЦП + CommonForm.ОписаниеИзмененийСистемы + CommonForm.ПанельОтчетов + CommonForm.ПараметрыАдминистрированияСервернойИБ + CommonForm.ПараметрыПроксиСервера + CommonForm.ПерсональныеНастройкиЭЦП + CommonForm.ПечатьДокументов + CommonForm.ПодтверждениеПароляУчетнойЗаписи + CommonForm.ПоискПоИндексу + CommonForm.ПраваПоЗначениямДоступа + CommonForm.РедактированиеЗначенийСвойств + CommonForm.РедактированиеНовогоПисьма + CommonForm.СозданиеНачальногоОбразаСФайлами + CommonForm.СтруктураПодчиненности + CommonForm.УправлениеОбменамиДанных + CommonForm.ФормаСертификатаЭЦП + Catalog.Валюты + Catalog.ВариантыОтветовАнкет + Catalog.ВариантыОтчетов + Catalog.ВерсииФайлов + Catalog.ВидыДокументовФизическихЛиц + Catalog.ВидыКонтактнойИнформации + Catalog.ВнешниеПользователи + Catalog.ВопросыШаблонаАнкеты + Catalog.ГруппыВнешнихПользователей + Catalog.ГруппыДоступа + Catalog.ГруппыИсполнителейЗадач + Catalog.ГруппыПользователей + Catalog.ДополнительныеОтчетыИОбработки + Catalog.ЗначенияСвойствОбъектов + Catalog.Календари + Catalog.НаборыДополнительныхРеквизитовИСведений + Catalog.НазначенияСертификатовЭЦП + Catalog.Организации + Catalog.ПапкиФайлов + Catalog.Пользователи + Catalog.ПрофилиГруппДоступа + Catalog.РолиИсполнителей + Catalog.СтраныМира + Catalog.СценарииОбменовДанными + Catalog.ТомаХраненияФайлов + Catalog.УчетныеЗаписиЭлектроннойПочты + Catalog.Файлы + Catalog.ФизическиеЛица + Catalog.ШаблоныАнкет + Document.Анкета + Document.НазначениеОпросов + Enum.ВариантыSMTPАутентификации + Enum.ВариантыВажностиЗадачи + Enum.ВариантыВерсионированияОбъектов + Enum.ВариантыПубликацииДополнительныхОтчетовИОбработок + Enum.ВерсииПодсистемыОбменаДанными + Enum.ВидыДополнительныхОтчетовИОбработок + Enum.ВидыПравилДляОбменаДанными + Enum.ВидыТранспортаСообщенийОбмена + Enum.ДействияПриОбмене + Enum.ДействияПриСохраненииСЭЦП + Enum.ДействияСФайламиПоДвойномуЩелчку + Enum.ИсточникиПравилДляОбменаДанными + Enum.ПоворотИзображения + Enum.ПолФизическогоЛица + Enum.ПриоритетыОбъектовОбмена + Enum.РазмерыБумаги + Enum.РазрешенияСканированногоИзображения + Enum.РезультатыВыполненияОбмена + Enum.СпособыPOP3Аутентификации + Enum.СпособыSMTPАутентификации + Enum.СпособыВызоваДополнительныхОбработок + Enum.СпособыСравненияВерсийФайлов + Enum.СтатусыИзвлеченияТекстаФайлов + Enum.ТипыВариантовОтчетов + Enum.ТипыВопросовШаблонаАнкеты + Enum.ТипыКонтактнойИнформации + Enum.ТипыОтветовНаВопрос + Enum.ТипыТабличныхВопросов + Enum.ТипыТекстовЭлектронныхПисем + Enum.ТипыХраненияФайлов + Enum.ФорматыСканированногоИзображения + Enum.ЦветностиИзображения + Report.АнализОпроса + Report.АнкетированиеАналитическийОтчет + Report.Задачи + Report.ОтчетПоБизнесПроцессам + Report.ОтчетПоВерсиям + Report.ОтчетПоЗаданиям + Report.СписокЗависшихЗадач + Report.СписокИстекающихЗадач + Report.СписокПросроченныхЗадач + Report.СправкаОбИсполнительскойДисциплине + DataProcessor.АвтоматическоеИзвлечениеТекстов + DataProcessor.АктивныеПользователи + DataProcessor.БлокировкаСоединенийСИнформационнойБазой + DataProcessor.ГрупповоеИзменениеОбъектов + DataProcessor.ЖурналРегистрации + DataProcessor.ЗагрузкаПравилКонвертацииОбъектов + DataProcessor.ЗагрузкаПравилРегистрацииОбъектов + DataProcessor.КартаМаршрутаБизнесПроцесса + DataProcessor.КонвертацияОбъектовИнформационныхБаз + DataProcessor.КонвертацияОбъектовРаспределенныхИнформационныхБаз + DataProcessor.КонтрольЖурналаРегистрации + DataProcessor.КурсыВалютРБК + DataProcessor.ЛегальностьПолученияОбновлений + DataProcessor.ОбновлениеКонфигурации + DataProcessor.ПолнотекстовыйПоискВДанных + DataProcessor.ПомощникСозданияОбменаДанными + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз + DataProcessor.РегламентныеИФоновыеЗадания + DataProcessor.СопоставлениеОбъектовИнформационныхБаз + DataProcessor.СписокРеспондента + DataProcessor.ТранспортСообщенийОбменаEMAIL + DataProcessor.ТранспортСообщенийОбменаFILE + DataProcessor.ТранспортСообщенийОбменаFTP + DataProcessor.УдалениеПомеченныхОбъектов + DataProcessor.УниверсальныйОбменДаннымиXML + DataProcessor.УправлениеИтогамиИАгрегатами + DataProcessor.УправлениеНастройкамиФорм + DataProcessor.УправлениеПолнотекстовымПоиском + InformationRegister.АдресныеСокращения + InformationRegister.АдресныйКлассификатор + InformationRegister.ВерсииОбъектов + InformationRegister.ВерсииОбъектовАдресногоКлассификатора + InformationRegister.ВерсииПодсистем + InformationRegister.ГруппыЗначенийДоступа + InformationRegister.ДокументыФизическихЛиц + InformationRegister.ДополнительныеСведения + InformationRegister.ЗависимостиПравДоступа + InformationRegister.ЗначенияГруппДоступа + InformationRegister.ИсполнителиЗадач + InformationRegister.КалендарныеГрафики + InformationRegister.КурсыВалют + InformationRegister.НаборыЗначенийДоступа + InformationRegister.НазначениеДополнительныхОбработок + InformationRegister.НастройкаВерсионированияОбъектов + InformationRegister.НастройкиТранспортаОбмена + InformationRegister.НомераСканированныхФайлов + InformationRegister.ОтветыНаВопросыАнкет + InformationRegister.ПользовательскиеМакетыПечати + InformationRegister.ПользовательскиеНастройкиДоступаКОбработкам + InformationRegister.ПраваПоЗначениямДоступа + InformationRegister.ПравилаДляОбменаДанными + InformationRegister.ПутиМодулейКриптографииСерверовЛинукс + InformationRegister.РабочиеКаталогиФайлов + InformationRegister.СоответствиеОбъектовИнформационныхБаз + InformationRegister.СоставГруппПользователей + InformationRegister.СостояниеОбменовДанными + InformationRegister.СостояниеУспешныхОбменовДанными + InformationRegister.СписокБизнесПроцессов + InformationRegister.ТаблицыГруппДоступа + InformationRegister.ФайлыВРабочемКаталоге + ChartOfCharacteristicTypes.ВидыДоступа + ChartOfCharacteristicTypes.ВопросыДляАнкетирования + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач + BusinessProcess.Задание + Task.ЗадачаИсполнителя + diff --git a/SSL/src/Configuration/Logo.png b/SSL/src/Configuration/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..043c67ce39a6f38e3f98d081eacb113f1b4bafda GIT binary patch literal 4363 zcmV+m5%lhfP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000IyNkloTlh6a|VErPk18MJ2{ZG)A#lsfAMQ?hgqO&;%NdsEvxy=PvG^;}2%qY2ChC zx_gq%o|$`Q=AL`L^WAgr42cMmS)7()c(g@I(Fy=FnZ=z_}IbZ}r0stf;Fg)5u0HpvZNe2EC0EI>%)Iu8zwR-@3!7QW{F@W97@_|y+l0Xq4 zrD!^UVgPrUZFS6&=LE0@fC9h(bgw_SH$g|e!Kb_41F!*r7r@;Bo}i6|S{r~2X4z*1 zLQ9eXKZZy9Tq(MjSsE3yq%(^E_&ABk=N+@pvy@UqN)Z8QPa+4-nSD-ENOEzSp-4Kh z`t3AB0cPndVJIGrdi}w1bzCVTW|09QWX^cU0W{lwzxj06>xmEv#Vpbvj0}&~>GcP1 zWtPLt5&;llmMF8_Z+NuRhDY0$&=3NU>eF3f1VRZ_W>^q%4&@@B?mEvb6Kqb4sh{=w zgOd}Mg)AE@O7?3^C*nD)oDSv4NOK}RwR@bRF_vXJ4n;2|gkag&inZPmnDE`+^#TA{ z1zQLJ7Us>1^?YEg698ftI-~ye^FGnH9DMAOL#QvwNOPuS=D!3$@VxGN_c?#?QPUYz zzq}X=)_nv3ms$3?KtaupCHW2CpQjl5pgUkwL1&DI;0#alrd=}32n9`^^06{1?7j zFu>}H)enaR8m&A9l-Y8>*m&6H#vQtHKG7u>B`~kI`?-=c;UhFg4mCzerd@n zpey1*pg(=oA!NzYS8C^PEy=F_p*TBr_RJY>3nIPkR_?490LocWB)!=t9vRppFeVVH zt0)oxa2Ho%?XHF%Z69p7r}5|J*6p2<*oUQ6jnV3t7fX9bhh#pqo?MS?wj89|hDGDM zB6Am4#^vs-r{0it^;GP$5OvdC`7&e9!&JLdm*|BK968!V0C3~fiE`$zc65ZJ;{zcP z5qEJV)m0S1U0m7YJQ2~+Pq(n;gow!8<$m(%E<9J&XlF0f?|vGi0-=$ti7k$gMmpe3 zO(zjSr2QNLK)B^ku_w7{ZzVi(m%fH?-(JT?AT+Fvg%KsOU5JRBsp$Y9JC@%`=h`CJ z|K)*;H+y%t%$h!lx^tYcZCMW1?rNZYrFrtxujgt1fgUv4WCTJpe7fs$uRqu}7Nta= zvgz?mta`nkdO?7WHJ$Bp6#&}9Q5YVLAKCO3#bKlA<^Z@2z*-_v|y_x{4w>^yX7T8o`RycQ*sLW?bii6|Wr*ThXwe|GHjd+uAuU zua}h7U2AwWi)MK=<^lWW?x<{aSpV^K^Y~c2>-w@E@L8j|PXiz_2-8f{_QI$MoinZzHG*AciLi(!O-JSY%f_3Ttab}eP(5=Vhyvj8kN`&_G(qR-55I6a!FB8w<4?032l& zYtQE-vs5WXCji6}2vz*}B_@HA}8J|wgJHvkaD99^)mfJy)W002ovPDHLk FV1hr Неопределено Тогда + Возврат; + КонецЕсли; + + // ОбменДанными + ОбменДаннымиСервер.УстановитьПараметрыСеанса(ИмяПараметра, УстановленныеПараметры); + // Конец ОбменДанными + + // УправлениеДоступом + УправлениеДоступом.УстановитьПараметрыСеансаОграниченияДоступа(ИмяПараметра, УстановленныеПараметры); + // Конец УправлениеДоступом + + // Пользователи + Пользователи.ОпределитьТекущегоПользователя(ИмяПараметра, УстановленныеПараметры); + // Конец Пользователи + + // Работа с файлами + РаботаСФайлами.НачальнаяУстановкаПараметраСеанса(ИмяПараметра, УстановленныеПараметры); + // Конец Работа с файлами + + // Базовая функциональность + ОбщегоНазначения.НачальнаяУстановкаПараметраСеанса(ИмяПараметра, УстановленныеПараметры); + // Конец Базовая функциональность + + // Конец СтандартныеПодсистемы + + // Для установки параметров сеанса можно использовать шаблон: + //Если ИмяПараметра = <ИмяПараметра> Тогда + // УстановленныеПараметры.Добавить(<ИмяПараметра>); + //ИначеЕсли + +КонецПроцедуры diff --git a/SSL/src/Configuration/Splash.bmp b/SSL/src/Configuration/Splash.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5bb38ca54559eb4e5b2abe5ebe09a2dbeb3287b6 GIT binary patch literal 100816 zcmeI5YtSCWb?0&I)_&Ql{g5hGbKd`R zdM-WlKCkr3nzve`GpA3VKHYQvb9%aa=K1XfPcMGc8O7g!=HI{P-&;BT6aIhG8NbN! zj5BT}{}=x48Rfr{!QuGuH}t^J1M{f|229SUt1;Lz^uY1s111MA7eFgf_Z&;#?U2L?>euj?^bGxWfK$v!^t#_{8$^v3ZwOSi zjz~Iu8 zL;DYsnlO`@JHqD-GRG*LP+oCSs=aE=9WXiWi8=ekU;Ld5u72Bs%T880^SsOd;f_b?gw}o-Fxl;j_rPTNxOk*nHRTPpYmuDm zo$B1X|6s~&=1_!0pd1gg+X;kwSJZ4wnwwU%dCQL9`M?)TG%md0k{fUP&clx`UG?~~ z=YO>9IgX@9macka$x5T0X+$`kC{=0SJVSQnS$2&KAWvUf$ZZ_y1m-(`@v{^q-m9IY6$*d$!n zikLXaEb`N5*PL_Fbzt&0-*frTR<3O>HDI#2e_}3^tdZ4r&d`o{(k2!2TSqvt!13dI z_8lap{ANzSB9tmIIiA%>=Q$=h2=}h2+5R*)t?1n!UIZTg_h)WlVmy_HW3%OzSq;oO zZIwk{oe>KoV@!7KM|=3($=#kSQ#f>o#Cdxy%#gyd-3(nx(7@)_s>MG zE`In@WU=xwT7E26JIeLOa+z_ov^cX=Wpi$Rw8y{lSUjEq!ci*29XESRcvzAS?A|w| zmLAx%?*RQt$I{{Dz;)rnOI9#OEkdF}kfkhNXBJ}Ol2@HrsI3mTi9A(N9n~H_di22` zEyt2~yzk0HYJxFfa-ut0PrBY3QD}=@t(t>Cdb1A#>FKV$2S_QunbWUGzf#SXq`A{- z5hF&@V^2PpR&gRZ7=RgPop(iZr2{6L`zPl1z+}#nRIKLsaUx;LZ01bMgPUt1_mr#1 z;$#m@QjqpqaXoq$wFHByem;SMkB$N^^9Uk1LonwN1)Ft z2cl&h9%Y#f0{VyBFyH$?Id(nsy_dhVVcV)Tuci&LB14?iu4|`zVzT?Xd>?e}*}rqo z{`NLZN>BvnnB-NTxfn$nDsr)EEn{wu*plUI#^O!?2UV$Uh7-qRlP<|Kq`|P_3Otw> z{_$7g{KmOoCvi5m$z+`2owKMx-vhxx}db4jeZpWVeq*k#YKoR$bkQGi{thpi=3&q1} zj@T2u;$+$hIdPH|R4n}X7r*bR1eiWg&IH5rFS)hUS#T(2lFl(^XfLNjoJ{*=C z`ld|RM=Ym`DQfGjif-JshfZcK!-TQLjL91PiBBZ*0 zaIrc8(jC-@J;mU;I{kcLa_Ne--oPnhl572r_ZJ&w z4QYhL1%Gfmv~2@A^ZaWe-u2PHEptaQ=au{Bcx}4U+XhTlcFSy;CjgT?f)Y{FiHcU! z9h2^$twiC$ySm58UHd3iXHQN5q->7Z6VGJD$%x6sww$r6U0I8h(0lhC;>h1sH$95A zw|@I+YcB{iK1btR_T`6-Xgv;N*VZoTBj8sezc9gyIUdHY03f8vAUQKFG+@%YcY2sC z7W6a6u6||hT7UWfJqhQI`=7T{!=%f6a?u0O9!s5Y0f;ephj~}+mFdy5!Q{*|&*U6W zI>FNulV$h{urI$oV_%@DK5p+GCn-Xz>(rb8NZA~*$MfRkvXyJKnW=3#aT1dVl9h=p zFv;=%Ty@`tpZ}L~u)6SFAN}T;=NIou!#DkUgz10oGeey8KA9Rp=kiy%7E&ySlryWv ztM}u0I9d*owGdwQD3?PH?4Dc*NtZy1)sDEfQOvBwRN|14WJm^^%wwkOBbK9ZirRXs zqL=7B)|MEdaFa3=6>A|iGjs;U;3%J7bngQ{TFFa46uRKkcb$95?GG(ow{`nIOQp`N zwGbS}G!M^{p@*k)YOwU9;gi>Y@~;~!ss+ea3Dm-PEzm`N_+f%NAY zlaKxQ#p}OupCxa3AY9-d|G604pTxfsjm3g;fksk+#+l6nY#|_Ej<*mLUu}i9Z3A6x z?t#f>sMHx?n8dAfk|}Afs7?<6W6@&ivop!x5v?Q`Wl)4vr%?IYx++W((3;jKt@vjb z-F4n4?od@mgHH&e9VlIJ@y*5@W3qkhil1yczg4&e$tZJlpbB+-5V@!@;Yp%c~z6C718rfrgvKcCM25jH8 zw=V0IEjw_X^fe2LG?YrU;czf1LRVD6uab$dSHvUtseL>hRMsmbT6ERH$GzgF(y0jtpk(mHoqQh*3$u#+8gaO*8{I8 zkE1v_8o18vvnycfUpI%ww@B@(Cne?sCb8(XoqL~oaU=J2wa%fU%sQGVp_m-+E=)h3 z5IK&?H5*_1*^3)CZQE5>Md0_qq(jjObQV|o_;JG|P_$YqF&PY~JGJLYFj*&H{47ka z-?-gJj}WR+N1o}xlH3bF_1C|0)}D=f3rvtN-ZA z+p!iIHH;dy6tpT2SrkMGs$4Bi@TPH{)@|Ir_?CM;>G1X8Ctq0f^?R@T`aPp`b3y#Y z*S<@_DwKG=W+YYL^UyQKT>kt9v&1aF`m6r}A3B)Va60ukX?5|a{M_0t&#d0)d)Bt^ z+)HY(M6>9h5hiyQak3L8H*VR%aFP@aHlc>UE%lf1ZZo`plO^u34PBl()de;BAjtxC; zfA1B1KlVMpe*>Hy$qW-rH1Yg$|D(@P#mT`WfPBXXZ*a$|BMc`2JaxjxH@p#KH1>uf zm6$|cgR>T)%j^$SC_m81aFO^6m>fSz7SlOI#ZbymA9#G#=N5g(Pp`S@ZXTkRKE1{{ zZ+X|B+iN0cU;Gtke(%v03}VB&$i#Aptb!OOtB%Fv-%Ki_oW(jj8pc|Wj2@p{v5rkM zJZH8FyTH~Rdzh#3(;VW}?Yn=xaviflJa^^D2brQ#bj$92bRA)tTY!PB;k}S|e!xDF zUO=}Dste!o{>5BtF1lmVoWwC{{$NZdV~wahqKB6a*gEpi<10=YCevsGPDlYrhLawc zM3sB35kwnjLeMp-TH=p)nHD!DHwa}Ktu~ujfyum4L(oPkHOZnPgK8DC;j8wN4`|); z2BKe_#GxB>rdew@Zzp`Me0g)4RmssfSt$^hTVCHyKwkaIHuwg%Akcc6wy0t3`u6ha z?!UbMDwFXe`vGi4#E$kndHBdNre1wHM2QBgY&M=pfJc^q$&)d5B^;@r;bHDrWQAB{ z&z212)DeALSLyv|3;GeW9zj31gE~x7$|Y5Ul?{O%{CHe7^GqxslV%2`Y-0_CHpg-~ zswMW^s~oE|^T@UVV3{fGVyOpvRvoeK)z_CkyJqE@%?u6dWSrj#lP|2_!jzJmG(AjK zk6kS!Vrm*E8If|Wc`&)+hHoQam}KVwO#S=tWp{t#iof&5rUV*5Bb@*;`Iu!Hhc8XV zl#?~bqt1lKXnDQ&o1fvq>QxQ{FXc~Ah`Hlx72wl^mFe|rjWARFHhmJr%p|Hdq}iz* zsSBoZ{L#*Bc6@R@Dy=d}t<;;w`~K<_4IiB<|tks#v+Zn}p*cntz50lk<25h8C zrRmu9zy01dW(-%H;Q(JuX5AlLd14+RSX+5Y&seBLNf{?EW%ybt>C87f)j$N7RY`Sy z^P!ZZ^3WlWdM?G?WepXT^{QBd*Qy!dPywH+O*w8=An4)-VXf5L0^yicGrS>$W#{V< z+HN1gfQHjz?&pMzT@@;X5nCyt_Db8DG06nXvoCF`TkX(_DwS6lyx zlc)lgY{|+5VW^t2HgHA551+^yyB1U1t$&$bXb4fi#MM&eDuBPbfcq#+YJ^`|uZm^H zNorJ84giBqT9H2hyKPR)5|e7Y)y|RF7#_1ND_vG~Gb#z2kFCsVV5T12AZ%GFRG5yqSxcQ!IZ@%ZYJDwIN>!2B36sIUL7GpHpf?O$b$FJENqyqNeL=PAC)d_IQcNPIPj2q|*4hv} z?WSN^w8-xr`EiowSaExY%jj^!!Uhw=Hn+!#)$6tvpVg9=E#sS(2a6vFvcxnJ{#Q4E zwAw3=_--Y?foYJaT>5`u-4?*M`jxGo%Q7r`aX6)v>10~SS34SNAFhEd>TR<*0hxB&`$ykOsD?!sN}26q6JWcsAvxR^^QkwqatkA(;U! znp3Nc$q@lnLMhAQVUlFy;n0&*F6^6!xwI!)j26-25w#Up+cxXjwEv`1)0z&Q0l_HFQR+<*4 zqA-X+#-Ck72tD%y*Mmu0N3j)7JJ!K+jLG;JMQ>dlk?z>8lXSj81(;Q0(wNNLJh^h+ z+Ra4ngN8{q<&>)(Tk_+~^e|aH@9Hf&F+_>U_OWa2FR`eVt?p?4=a{4{uGS1o;*VAV zouVbUwaSMvuu3*#GQD58S_Y5}ux#yw986M|no7X;+UYUPI_KiAmY6Jl<5@8|gUp#P zP!^%Gz-0M&=?XK6Il?4RWQ!cpl6S1YT3p-*e(G(Ap)jqt6DBE+6Q|QQfQkVsxf-%GPLdTOl3Iez2#31~r!ZSPArq4d z`*35@G5Iw&eb+Im-xG0sPJUl&^hsD?sm;lur-ey?*N}Lmtb04T!N~c8$(eZ}=K1O^ zwpl<1w>)+-wG#w0G1;I$DC~cVvwFhm`zxv{i9%PdPp4I~9e4oV)pjUWCCar)FHe== z1doy7_$ACEfYZ|GOX@P~!wis5{IKP^-&>ax6=$3nRIpGJsLLoCMeH@M$Q_?g50k~% z^#_lRUPT(KpWFYrdxi?`d+4W3@YrN;$kNjv>&Zap^gwYhEEh$5dZ3swA5WUwr$Cr7 zCyn=f6qvN6F!MQ8TP9)fITHiN?q1B_>?ck9ta|yt*7TLF)@72aH4^s9j^7>WwMIf1 z%;~)#)Af}RLuuxb7O{zfsjuHUpDpGKFI#jwSHYG;T4Rx1<>LgsV0O+aoy_f$E6DZY zUde;?A1(YQW?b}%(Wb6CC0YAj>k1G2oE|8V8HX{g1-YKBGC{yTeixXnr?^h5Oc1CH zU(FFOXzkBR;QiZIX(;mYd)NXx!W+yPW?{D7zfNdMP z?T*nW3+k%=)w+y zFFgC)deZXpSP-k$ks@;}^W$e;o)Gp@jl_eGuQ1Ku`{C1we;78L4_4i)}#NQ!Mq_Yi?V=d3zeh!zGK4 zp&@%XoqZ43gJoAeJYIG!VxKAKTB_f+_0+MNN1=6AHJ6&!*wt!h+LJ--yFaq{oQtkK z=b}Yra$?ch7djn?Yu|O@b(6wD096&7-~Es=ul>LueEF)s{5G+g5o}J2IzQ*sb?(5g z>j5SefMs279iQoex~w`rzcb7J*t*<0{^^6sx*mXU6UcP}4ZGy)ioj>rM4Fp}$q%N* zPAv{A7QXly)*-zi@Lk54CyXdCDeviK*2^MCrlgD6e5{{l5Am<k4tJ>6t9&xgG4JwI6%@I$HQQBS^(Y*&sn=7k)4o#^XF_kG$x@%v#J}kdJ z#&4M%EYeR_^}%Fihvc-VoAux@>^sBP;n;RIYou{gu7tiRW_IdkJ=z6RbyAm!rAJ$0o)BJEJk#?BCiy_KXEis+G`nyhFp2w%^-BX5?a z_V8Y4T1zXZHzsdtRc!)XVBM%0e8sVca3v;jBQ4@DD4FuGp`5$8`cShIcg3WlPPc%Y zC3?rP&8TX2PfWfsHB6c@7+Kjx;l*eN9-Xi43UKX%$*SKAsdPc>)rR9d!K8s7Os0T@ zGsSI#Id_?fj|MdK9T!-=GtjM=M6-ec7XfLWbnms{WbQB-@b5N2gqw~H@U*23n6$2& z5FW+J;uA^Jij%IN&P=M08k=)k z*&#WY%vuWxQI6}%WoEoevg@6L$p8j-uRvG`O&!jAA!K2jq8)8O3mHqQ98+PUM}vk6 zDD5FsnZcXgBqt_>3rvote`bS8tCVp{fL7=SY~VJ(Y3okC!EvLZxLW1G({1jzZ5>#; z1|uq6Fvz5*r$n4Q!I;ciHw!@$bZO^uGgc0M;7(u|Fk!sP`3(dZLq2sludy;q0T1N- zQA#UvLQModaR0#sE}#6>b=W3L`U~m7P_bbh9B;f7%aVlEmduF}(qCw^D13 z?u*H|OST^-=gAz8k6o<~!|?=W6my%J+MOdZ#-#;a&L@BvG|8?bd*DWd=I54g{(I6R~J7hLcBUq0(nKE36qd|QM$L-(X>s=ma9@RFxrp3O(M%88I- zEnzZ^-X>u!q+c>T%;#gjc2TOXQSP+;3588?#8jzbBM2)P&}n5A42~rVy2CXP)a3?f z5wBOvIwmQi(Zl!}Y5mrKq-scM52t2^3V3w^lPVKvZ%*K+r_`(MwSopqTk|~Yf{9xU z8o+S+`X#%Cc$>ugFq1G$W(vF5OB=SmxPB{NPtT9c=F_erlb}?lq>JTO#EtKzjj!>8 zoP0%Ljw;F;yQ&AfyL)>A(SS)LRTZPGFrf7Tp*mdZkJ4Nqy+Dh^;q^W|*nX*yFJsR}ISay6S}Sxy85448?PrqxwT{TVpwDdq;)nGKC z5+szcocZWhZ%hJ9wnmc@2_! zYoO9p1L0kn$XgpZDjzZ9m%p_>gGs%Q)U{Og1hX6Z!NTCvE7xmrr9Zd$pA3`5u^hxQ z%H?em*O^JM9d9a_wCY$^;oEk+MZw1=nc`9#ay(e&jh+frHg4TnpmEJ+f@E676e~)V z|5D1TR&a94`wI%y!$fy{40(w{`n&eiOlqLqELqc|V2t;gaY5i(3#SCJ(yKOrpSK z_m4X_Lxt@`{Lmf9T(jvl#@=ShiN_@2n#V;#H;<0|szP&zG`Fa-Y)*^bS6MP;;&~cO z^fE)^AGk$e>Zv-SKFhg`j(({VkDKIJ1 z$aDoW1pcSXB&>zt6C^GE$dfO~=eB0vCehz%XD!44_W8yCq-Fp9j>nnNA=jCVVA)ro zAKe=7CTsiXR`HQ_O9dcDDd&et$_?vmku`U0J`yT<34=9y`{}!8;pyh``_RRAqF1ct zBkoKQPgi-+=FVJ6CS6=>!FfM$V^%Ug2GS8oK3{AgdNc2SY9 z31<=p&R{?|eP=jtJ>>!u9Jt<=pzT?a$11#}E`^6Ql&EBi1Qlo~t65q^l{?KnCA5xV zs^=OJ1UL->oZ5q;4slZ%pVIw3+=d2`p7f4xNul(}tI`H;9<|;wxKuT_dLolgY;bY0eZi?>FTBBidJkY3kp(JF{q8v^|T)*4PZPi zTR`J?M_NO4GbU*-dx=0JM{oPQ!eoc%$<|IE1bXy94J>NB5aP!-yi47 z`)xB&fE_tmco=6qDRR2(T0(*zycnStKo$iUkfuxTAGSIpF`ZP|a|9 zB70yGgrk=&M-PZHkIFA4C1WN{ZhRJ|TeJR9t{Mc3=-;!R9 z%zX#t6E%~_+|vP>f<}MUYXX*;3z#W{ieI)|wVuydF+HofjB=SxUAA%^tN+TM4|KCr zeX2Qo$URv-03N$mZSP)oEoEC|6~@pSV{PA$Li!|raGh>pq~L$vSl%)rY_h;e#O5Z# zY$_vFcI5ciuDytr_JT$jPy@5|lv1rSK_I81OG269be{A8KGf9`8^?An#VeHj0Nfaa z#XBV<__6b@_;E`~vPJe}eQ=!>%c-Q$OF2*pML3-!O#X+orhzjbdZ0TbkJ~q$yBZJh z?CZ}8%LZiH7FnJ%yH?a`i;O8xq0;XQBf->ENm@}TQh7Q@n9Q2vVMmB>+);uZA#4!Q z9WA=WC+rtdCALkJcB;Hr}p$GTOzQP#Jp6zP9eUnFJU!Opb=Ea(MLnS6DqTa0Xj!6W(#yW!d z>6O}5S5>peq-w(kwyjf(qLe!n276*O;ig)LF!|AEN8aJ1JcwGdSt2=3OyT-GkS&?C zx_%It%7zFEa#{KR<&iN2DsT2K}K6-obZN< zF`4AKY%)~3o5y#*z zoZ4fXDluX7sJy#%7?oM^z;xkMgI46mIGj`-No)vspi$mHDh+UTY}XkNKN#TJoCuf< zqgD%gCLCJr%?ZTa4?Z(m!xUHo&NgHg;PmJ>dY&x6nIeqm6&jlcbJ8dq)+Ooau-gST9MlT z0YB83a&)kbFn>Xt$7izAs>>3wh%xmTFsXXnPL~g(25phiVAzBWmR>NEAbw^_x|nS< z@Y75p^Q{imW;+d(lfp@JGwD>xyuxJG9`xXs_z)=s5TXq|65Puj$lf{hQ^c(MRNh96 zI_-(PJ6uqniAgmQ{X{vf(J<*&LAYAIx~fD4RF(2Wcd34>5n*L2t$NG`6{d60K+>vx z2*8piuvE))=pL9XVrKWBk?w&>+n1-UNa3WpnRKdTUSTq8&p?BdnLpvRHmFlyVG!uv z3_*l(=R?f8Pvt#ViPpHJ8qA^9T5@%OjeyD{i5Xg*&Ib7f)*_0TI=&j9%Au`Bg_#P3 zF94VU3=>qwnBK8u+1MVwZB=ozGYQ}6k|~dvJ#FU8o8(kJ#+AaUs~O0rO6C{Eg(dN9UCcAAwh1K!qK5%ib+?iS6YjxKw7nxQUgMx znlVWi>GP`FpkoL6MD=5vi}l20_uqB5c_6Phljygk8CEq@IAzwZVyTjOg~_+5t#!0I z0ZzuLr{F`Wn<~d06sFasxdb#<>mXN?RM@eRGSynEC_JFL8AzgEJ>KNC(h#O>h@Kkn z_K>9pP#0OAtX-VC4b)zFw^AGQ)s6d}Q<&6(WwQ+d@E=t|*~sn&W$1atReCk&J7;$-P)nLCammR!AA zq*a^2Y5+w-D>zk5q9oih{Q1xeVusrcfHiKbJtqv4HdX89WfJ~Uf2KTQwsxZODV#Jn zlTMY)D@=YSry0S?aHEjik1O3&UC?|BF{@YQakZe<#TtY)$XL)&Yh44rtCD7hVKTjI z0AN&+)cYx7+Q5w2sS4eAa@7DUW%3*iZ`vWQ(@e6X_orW-%6kg;3m1T3ey95s&nfmn zgA`8M1DSNHWL{zNKjt(eIGK8n(FO)o;bETZO!y(%m?H*xFQ|l?r^;2vX{%AK^@`A= zBS0%+m?TR<;@ScM0xc*tn?bG`5R{lbTAf>{T|`|zb7MUKN`op+X%W+`Gil;mTh(t! zTP*eCXjQYEu+=RG<=Un!Z&vL($XnQ~Sk66uD|ZnoC`kn52s|@B&eNR@dRH>r?^MHiEMWqO(BeG2IU|ezPRqaxn8* zgPCnW``KnN-f1wi4X6c~rvoPY%<;HSIN|V9e|4teL7g5kW2(GsQ^LeDgY|cG5Tq z4?QqyxL@#TraKEqY+U u + + + + + + + АдресатыПолученияОтчетаПоЖурналуРегистрации + + ru + Адресаты получения отчета по журналу регистрации + + + String + + + true + + ru + Адреса электронной почты для получения отчета по критичным записям журнала регистрации + + + + Managed + diff --git a/SSL/src/Constants/АлгоритмПодписи/АлгоритмПодписи.mdo b/SSL/src/Constants/АлгоритмПодписи/АлгоритмПодписи.mdo new file mode 100644 index 000000000..cc647e793 --- /dev/null +++ b/SSL/src/Constants/АлгоритмПодписи/АлгоритмПодписи.mdo @@ -0,0 +1,21 @@ + + + + + + + + АлгоритмПодписи + + ru + Алгоритм подписи + + + String + + + true + + + Managed + diff --git a/SSL/src/Constants/АлгоритмХеширования/АлгоритмХеширования.mdo b/SSL/src/Constants/АлгоритмХеширования/АлгоритмХеширования.mdo new file mode 100644 index 000000000..858883ff2 --- /dev/null +++ b/SSL/src/Constants/АлгоритмХеширования/АлгоритмХеширования.mdo @@ -0,0 +1,21 @@ + + + + + + + + АлгоритмХеширования + + ru + Алгоритм хеширования + + + String + + + true + + + Managed + diff --git a/SSL/src/Constants/АлгоритмШифрования/АлгоритмШифрования.mdo b/SSL/src/Constants/АлгоритмШифрования/АлгоритмШифрования.mdo new file mode 100644 index 000000000..1aae2f90f --- /dev/null +++ b/SSL/src/Constants/АлгоритмШифрования/АлгоритмШифрования.mdo @@ -0,0 +1,21 @@ + + + + + + + + АлгоритмШифрования + + ru + Алгоритм шифрования + + + String + + + true + + + Managed + diff --git a/SSL/src/Constants/ВыполнятьПроверкуЭЦПНаСервере/ВыполнятьПроверкуЭЦПНаСервере.mdo b/SSL/src/Constants/ВыполнятьПроверкуЭЦПНаСервере/ВыполнятьПроверкуЭЦПНаСервере.mdo new file mode 100644 index 000000000..9760ff830 --- /dev/null +++ b/SSL/src/Constants/ВыполнятьПроверкуЭЦПНаСервере/ВыполнятьПроверкуЭЦПНаСервере.mdo @@ -0,0 +1,20 @@ + + + + + + + + ВыполнятьПроверкуЭЦПНаСервере + + ru + Выполнять проверку ЭЦП на сервере + + + Boolean + + true + + + Managed + diff --git a/SSL/src/Constants/ДатаОбновленияПовторноИспользуемыхЗначенийМРО/ValueManagerModule.bsl b/SSL/src/Constants/ДатаОбновленияПовторноИспользуемыхЗначенийМРО/ValueManagerModule.bsl new file mode 100644 index 000000000..9ca2f96a4 --- /dev/null +++ b/SSL/src/Constants/ДатаОбновленияПовторноИспользуемыхЗначенийМРО/ValueManagerModule.bsl @@ -0,0 +1,7 @@ + +Процедура ПередЗаписью(Отказ) + + // объекты данного типа не должны мигрировать при обмене + ОбменДанными.Получатели.Очистить(); + +КонецПроцедуры diff --git a/SSL/src/Constants/ДатаОбновленияПовторноИспользуемыхЗначенийМРО/ДатаОбновленияПовторноИспользуемыхЗначенийМРО.mdo b/SSL/src/Constants/ДатаОбновленияПовторноИспользуемыхЗначенийМРО/ДатаОбновленияПовторноИспользуемыхЗначенийМРО.mdo new file mode 100644 index 000000000..1f6ced8b6 --- /dev/null +++ b/SSL/src/Constants/ДатаОбновленияПовторноИспользуемыхЗначенийМРО/ДатаОбновленияПовторноИспользуемыхЗначенийМРО.mdo @@ -0,0 +1,22 @@ + + + + + + + + ДатаОбновленияПовторноИспользуемыхЗначенийМРО + + ru + Дата обновления повторно используемых значений МРО + + Актуальная дата обновления повторно-используемых значений механизма регистрации объектов в ИБ + + Date + + + true + + + Managed + diff --git a/SSL/src/Constants/ДатаУведомленияОНовыхЗадачах/ДатаУведомленияОНовыхЗадачах.mdo b/SSL/src/Constants/ДатаУведомленияОНовыхЗадачах/ДатаУведомленияОНовыхЗадачах.mdo new file mode 100644 index 000000000..fa7b98c5b --- /dev/null +++ b/SSL/src/Constants/ДатаУведомленияОНовыхЗадачах/ДатаУведомленияОНовыхЗадачах.mdo @@ -0,0 +1,22 @@ + + + + + + + + ДатаУведомленияОНовыхЗадачах + + ru + Дата уведомления о новых задачах + + не редактируется пользователем + + Date + + + true + + + Managed + diff --git a/SSL/src/Constants/ЗаголовокСистемы/ЗаголовокСистемы.mdo b/SSL/src/Constants/ЗаголовокСистемы/ЗаголовокСистемы.mdo new file mode 100644 index 000000000..e5157bb96 --- /dev/null +++ b/SSL/src/Constants/ЗаголовокСистемы/ЗаголовокСистемы.mdo @@ -0,0 +1,25 @@ + + + + + + + + ЗаголовокСистемы + + ru + Заголовок системы + + + String + + + true + + ru + Текст, учавствующий в формированиии заголовка главного окна программы + + + + Managed + diff --git a/SSL/src/Constants/ЗапретЗагрузкиФайловПоРасширению/ЗапретЗагрузкиФайловПоРасширению.mdo b/SSL/src/Constants/ЗапретЗагрузкиФайловПоРасширению/ЗапретЗагрузкиФайловПоРасширению.mdo new file mode 100644 index 000000000..f3396c4d4 --- /dev/null +++ b/SSL/src/Constants/ЗапретЗагрузкиФайловПоРасширению/ЗапретЗагрузкиФайловПоРасширению.mdo @@ -0,0 +1,20 @@ + + + + + + + + ЗапретЗагрузкиФайловПоРасширению + + ru + Запрет загрузки файлов по расширению + + + Boolean + + true + + + Managed + diff --git a/SSL/src/Constants/ИзвлекатьТекстыФайловНаСервере/ИзвлекатьТекстыФайловНаСервере.mdo b/SSL/src/Constants/ИзвлекатьТекстыФайловНаСервере/ИзвлекатьТекстыФайловНаСервере.mdo new file mode 100644 index 000000000..ed572ef18 --- /dev/null +++ b/SSL/src/Constants/ИзвлекатьТекстыФайловНаСервере/ИзвлекатьТекстыФайловНаСервере.mdo @@ -0,0 +1,21 @@ + + + + + + + + ИзвлекатьТекстыФайловНаСервере + + ru + Извлекать тексты файлов на сервере + + Если Истина - текст файлов будет извлекаться в фоновом задании на сервере. При этом все рабочие процессы сервера должны быть на компьютерах под управлением ОС Windows. + + Boolean + + true + + + Managed + diff --git a/SSL/src/Constants/ИзменятьЗаданияЗаднимЧислом/ИзменятьЗаданияЗаднимЧислом.mdo b/SSL/src/Constants/ИзменятьЗаданияЗаднимЧислом/ИзменятьЗаданияЗаднимЧислом.mdo new file mode 100644 index 000000000..0cff08bb8 --- /dev/null +++ b/SSL/src/Constants/ИзменятьЗаданияЗаднимЧислом/ИзменятьЗаданияЗаднимЧислом.mdo @@ -0,0 +1,28 @@ + + + + + + + + ИзменятьЗаданияЗаднимЧислом + + ru + Изменять задания задним числом + + + Boolean + + true + + ru + Разрешить менять дату выполнения задач, а при изменении автора, крайнего срока, важности и наименования задания изменять их в выполняющихся задачах + + + ru + Разрешить менять дату выполнения задач + + + + Managed + diff --git a/SSL/src/Constants/ИспользоватьАнкетирование/ИспользоватьАнкетирование.mdo b/SSL/src/Constants/ИспользоватьАнкетирование/ИспользоватьАнкетирование.mdo new file mode 100644 index 000000000..dc3d05675 --- /dev/null +++ b/SSL/src/Constants/ИспользоватьАнкетирование/ИспользоватьАнкетирование.mdo @@ -0,0 +1,20 @@ + + + + + + + + ИспользоватьАнкетирование + + ru + Использовать анкетирование + + + Boolean + + true + + + Managed + diff --git a/SSL/src/Constants/ИспользоватьБизнесПроцессыИЗадачи/ИспользоватьБизнесПроцессыИЗадачи.mdo b/SSL/src/Constants/ИспользоватьБизнесПроцессыИЗадачи/ИспользоватьБизнесПроцессыИЗадачи.mdo new file mode 100644 index 000000000..be0649cf3 --- /dev/null +++ b/SSL/src/Constants/ИспользоватьБизнесПроцессыИЗадачи/ИспользоватьБизнесПроцессыИЗадачи.mdo @@ -0,0 +1,20 @@ + + + + + + + + ИспользоватьБизнесПроцессыИЗадачи + + ru + Использовать бизнес-процессы и задачи + + + Boolean + + true + + + Managed + diff --git a/SSL/src/Constants/ИспользоватьВерсионированиеОбъектов/ValueManagerModule.bsl b/SSL/src/Constants/ИспользоватьВерсионированиеОбъектов/ValueManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Constants/ИспользоватьВерсионированиеОбъектов/ИспользоватьВерсионированиеОбъектов.mdo b/SSL/src/Constants/ИспользоватьВерсионированиеОбъектов/ИспользоватьВерсионированиеОбъектов.mdo new file mode 100644 index 000000000..55e7664c4 --- /dev/null +++ b/SSL/src/Constants/ИспользоватьВерсионированиеОбъектов/ИспользоватьВерсионированиеОбъектов.mdo @@ -0,0 +1,21 @@ + + + + + + + + ИспользоватьВерсионированиеОбъектов + + ru + Использовать версионирование объектов + + Хранение значения функциональной опции + + Boolean + + true + + + Managed + diff --git a/SSL/src/Constants/ИспользоватьВнешнихПользователей/ИспользоватьВнешнихПользователей.mdo b/SSL/src/Constants/ИспользоватьВнешнихПользователей/ИспользоватьВнешнихПользователей.mdo new file mode 100644 index 000000000..e2f5b8a56 --- /dev/null +++ b/SSL/src/Constants/ИспользоватьВнешнихПользователей/ИспользоватьВнешнихПользователей.mdo @@ -0,0 +1,20 @@ + + + + + + + + ИспользоватьВнешнихПользователей + + ru + Использовать внешних пользователей + + + Boolean + + true + + + Managed + diff --git a/SSL/src/Constants/ИспользоватьДатуИВремяВСрокахЗадач/ИспользоватьДатуИВремяВСрокахЗадач.mdo b/SSL/src/Constants/ИспользоватьДатуИВремяВСрокахЗадач/ИспользоватьДатуИВремяВСрокахЗадач.mdo new file mode 100644 index 000000000..e5bf6a883 --- /dev/null +++ b/SSL/src/Constants/ИспользоватьДатуИВремяВСрокахЗадач/ИспользоватьДатуИВремяВСрокахЗадач.mdo @@ -0,0 +1,28 @@ + + + + + + + + ИспользоватьДатуИВремяВСрокахЗадач + + ru + Использовать дату и время в сроках задач + + + Boolean + + true + + ru + Использовать дату со временем в полях со сроками задач + + + ru + Разрешить вводить время в датах выполнения задач + + + + Managed + diff --git a/SSL/src/Constants/ИспользоватьДатуНачалаЗадач/ИспользоватьДатуНачалаЗадач.mdo b/SSL/src/Constants/ИспользоватьДатуНачалаЗадач/ИспользоватьДатуНачалаЗадач.mdo new file mode 100644 index 000000000..5748ba3bb --- /dev/null +++ b/SSL/src/Constants/ИспользоватьДатуНачалаЗадач/ИспользоватьДатуНачалаЗадач.mdo @@ -0,0 +1,20 @@ + + + + + + + + ИспользоватьДатуНачалаЗадач + + ru + Использовать дату начала задач + + + Boolean + + true + + + Managed + diff --git a/SSL/src/Constants/ИспользоватьДополнительныеРеквизитыИСведения/ИспользоватьДополнительныеРеквизитыИСведения.mdo b/SSL/src/Constants/ИспользоватьДополнительныеРеквизитыИСведения/ИспользоватьДополнительныеРеквизитыИСведения.mdo new file mode 100644 index 000000000..10ed6d932 --- /dev/null +++ b/SSL/src/Constants/ИспользоватьДополнительныеРеквизитыИСведения/ИспользоватьДополнительныеРеквизитыИСведения.mdo @@ -0,0 +1,21 @@ + + + + + + + + ИспользоватьДополнительныеРеквизитыИСведения + + ru + Использовать дополнительные реквизиты и сведения + + Использовать дополнительные реквизиты и сведения + + Boolean + + true + + + Managed + diff --git a/SSL/src/Constants/ИспользоватьОбменДанными/ValueManagerModule.bsl b/SSL/src/Constants/ИспользоватьОбменДанными/ValueManagerModule.bsl new file mode 100644 index 000000000..9ca2f96a4 --- /dev/null +++ b/SSL/src/Constants/ИспользоватьОбменДанными/ValueManagerModule.bsl @@ -0,0 +1,7 @@ + +Процедура ПередЗаписью(Отказ) + + // объекты данного типа не должны мигрировать при обмене + ОбменДанными.Получатели.Очистить(); + +КонецПроцедуры diff --git a/SSL/src/Constants/ИспользоватьОбменДанными/ИспользоватьОбменДанными.mdo b/SSL/src/Constants/ИспользоватьОбменДанными/ИспользоватьОбменДанными.mdo new file mode 100644 index 000000000..0a948048d --- /dev/null +++ b/SSL/src/Constants/ИспользоватьОбменДанными/ИспользоватьОбменДанными.mdo @@ -0,0 +1,21 @@ + + + + + + + + ИспользоватьОбменДанными + + ru + Использовать обмен данными + + Флаг для одноименной функциональной опции + + Boolean + + true + + + Managed + diff --git a/SSL/src/Constants/ИспользоватьПолнотекстовыйПоиск/ИспользоватьПолнотекстовыйПоиск.mdo b/SSL/src/Constants/ИспользоватьПолнотекстовыйПоиск/ИспользоватьПолнотекстовыйПоиск.mdo new file mode 100644 index 000000000..5578a2abb --- /dev/null +++ b/SSL/src/Constants/ИспользоватьПолнотекстовыйПоиск/ИспользоватьПолнотекстовыйПоиск.mdo @@ -0,0 +1,20 @@ + + + + + + + + ИспользоватьПолнотекстовыйПоиск + + ru + Использовать полнотекстовый поиск + + Для хранения функциональной опции ИспользоватьПолнотекстовыйПоиск + + Boolean + + + + Managed + diff --git a/SSL/src/Constants/ИспользоватьЭлектронноЦифровыеПодписиИШифрование/ИспользоватьЭлектронноЦифровыеПодписиИШифрование.mdo b/SSL/src/Constants/ИспользоватьЭлектронноЦифровыеПодписиИШифрование/ИспользоватьЭлектронноЦифровыеПодписиИШифрование.mdo new file mode 100644 index 000000000..0837ad9bc --- /dev/null +++ b/SSL/src/Constants/ИспользоватьЭлектронноЦифровыеПодписиИШифрование/ИспользоватьЭлектронноЦифровыеПодписиИШифрование.mdo @@ -0,0 +1,20 @@ + + + + + + + + ИспользоватьЭлектронноЦифровыеПодписиИШифрование + + ru + Использовать электронно-цифровые подписи и шифрование + + + Boolean + + true + + + Managed + diff --git a/SSL/src/Constants/МаксимальныйРазмерФайла/МаксимальныйРазмерФайла.mdo b/SSL/src/Constants/МаксимальныйРазмерФайла/МаксимальныйРазмерФайла.mdo new file mode 100644 index 000000000..f2c717894 --- /dev/null +++ b/SSL/src/Constants/МаксимальныйРазмерФайла/МаксимальныйРазмерФайла.mdo @@ -0,0 +1,26 @@ + + + + + + + + МаксимальныйРазмерФайла + + ru + Максимальный размер файла + + Максимальный размер файла для импорта с диска + + Number + + 10 + + + true + + + 1073741824 + + Managed + diff --git a/SSL/src/Constants/НастройкаПроксиСервера/ValueManagerModule.bsl b/SSL/src/Constants/НастройкаПроксиСервера/ValueManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Constants/НастройкаПроксиСервера/НастройкаПроксиСервера.mdo b/SSL/src/Constants/НастройкаПроксиСервера/НастройкаПроксиСервера.mdo new file mode 100644 index 000000000..84070f092 --- /dev/null +++ b/SSL/src/Constants/НастройкаПроксиСервера/НастройкаПроксиСервера.mdo @@ -0,0 +1,21 @@ + + + + + + + + НастройкаПроксиСервера + + ru + Настройка прокси сервера + + Настройки прокси сервера для доступа к интернету на стороне сервера 1С:Предприятие + + ValueStorage + + true + + + Managed + diff --git a/SSL/src/Constants/ОграничиватьДоступНаУровнеЗаписей/ValueManagerModule.bsl b/SSL/src/Constants/ОграничиватьДоступНаУровнеЗаписей/ValueManagerModule.bsl new file mode 100644 index 000000000..45ea97f13 --- /dev/null +++ b/SSL/src/Constants/ОграничиватьДоступНаУровнеЗаписей/ValueManagerModule.bsl @@ -0,0 +1,54 @@ + +Перем ОграничениеДоступаНаУровнеЗаписейВключено; +Перем ОграничениеДоступаНаУровнеЗаписейИзменено; + +Процедура ПередЗаписью(Отказ) + + ОграничениеДоступаНаУровнеЗаписейВключено = Значение И НЕ Константы.ОграничиватьДоступНаУровнеЗаписей.Получить(); + ОграничениеДоступаНаУровнеЗаписейИзменено = Значение <> Константы.ОграничиватьДоступНаУровнеЗаписей.Получить(); + +КонецПроцедуры + +Процедура ПриЗаписи(Отказ) + + Если ОграничениеДоступаНаУровнеЗаписейВключено Тогда + + ЗаписьЖурналаРегистрации(НСтр("ru = 'Управление доступом.Заполнение данных для ограничения доступа'"), + УровеньЖурналаРегистрации.Информация, , , НСтр("ru = 'Начато заполнение данных для ограничения доступа'"), + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); + + // Дополнительно обновим таблицы прав, т.к. они будут использоваться + // в процедуре заполнения регистра сведений ТаблицыГруппДоступа. + УправлениеДоступом.ОбновитьТаблицыРолейПрофилейГруппДоступа(); + + // Обновим РегистрСведений.ТаблицыГруппДоступа, + // и РегистрСведений.ЗначенияГруппДоступа. + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ГруппыДоступа.Ссылка + |ИЗ + | Справочник.ГруппыДоступа КАК ГруппыДоступа + |ГДЕ + | (НЕ ГруппыДоступа.ЭтоГруппа)"); + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + УправлениеДоступом.ОбновитьТаблицыГруппДоступа(Выборка.Ссылка); + УправлениеДоступом.ЗаписатьЗначенияГруппДоступа(Выборка.Ссылка); + КонецЦикла; + + УстановитьПривилегированныйРежим(Истина); + Задание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа); + Задание.Использование = Истина; + Задание.Записать(); + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + + Если ОграничениеДоступаНаУровнеЗаписейИзменено Тогда + // Обновление параметров сеанса. + // Требуется для того, чтобы администратор не выполнял перезапуск. + УстановленныеПараметры = Новый Массив; + УправлениеДоступом.УстановитьПараметрыСеансаОграниченияДоступа("ОграничиватьДоступПоВиду", УстановленныеПараметры); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Constants/ОграничиватьДоступНаУровнеЗаписей/ОграничиватьДоступНаУровнеЗаписей.mdo b/SSL/src/Constants/ОграничиватьДоступНаУровнеЗаписей/ОграничиватьДоступНаУровнеЗаписей.mdo new file mode 100644 index 000000000..06a0a5ce8 --- /dev/null +++ b/SSL/src/Constants/ОграничиватьДоступНаУровнеЗаписей/ОграничиватьДоступНаУровнеЗаписей.mdo @@ -0,0 +1,24 @@ + + + + + + + + ОграничиватьДоступНаУровнеЗаписей + + ru + Ограничивать доступ на уровне записей + + + Boolean + + true + + ru + Включает режим ограничения прав доступа на уровне записей + + + + Managed + diff --git a/SSL/src/Constants/ПараметрыАдминистрированияИБ/ПараметрыАдминистрированияИБ.mdo b/SSL/src/Constants/ПараметрыАдминистрированияИБ/ПараметрыАдминистрированияИБ.mdo new file mode 100644 index 000000000..d7928f53f --- /dev/null +++ b/SSL/src/Constants/ПараметрыАдминистрированияИБ/ПараметрыАдминистрированияИБ.mdo @@ -0,0 +1,21 @@ + + + + + + + + ПараметрыАдминистрированияИБ + + ru + Параметры администрирования ИБ + + Параметры администрирования: ИмяАдминистратораИБ, ПарольАдминистратораИБ, ИмяАдминистратораКластера, ПарольАдминистратораКластера, ПортКластераСерверов, ПортАгентаСервера + + ValueStorage + + true + + + Managed + diff --git a/SSL/src/Constants/ПрефиксУзлаРаспределеннойИнформационнойБазы/ValueManagerModule.bsl b/SSL/src/Constants/ПрефиксУзлаРаспределеннойИнформационнойБазы/ValueManagerModule.bsl new file mode 100644 index 000000000..9ca2f96a4 --- /dev/null +++ b/SSL/src/Constants/ПрефиксУзлаРаспределеннойИнформационнойБазы/ValueManagerModule.bsl @@ -0,0 +1,7 @@ + +Процедура ПередЗаписью(Отказ) + + // объекты данного типа не должны мигрировать при обмене + ОбменДанными.Получатели.Очистить(); + +КонецПроцедуры diff --git a/SSL/src/Constants/ПрефиксУзлаРаспределеннойИнформационнойБазы/ПрефиксУзлаРаспределеннойИнформационнойБазы.mdo b/SSL/src/Constants/ПрефиксУзлаРаспределеннойИнформационнойБазы/ПрефиксУзлаРаспределеннойИнформационнойБазы.mdo new file mode 100644 index 000000000..0829d95de --- /dev/null +++ b/SSL/src/Constants/ПрефиксУзлаРаспределеннойИнформационнойБазы/ПрефиксУзлаРаспределеннойИнформационнойБазы.mdo @@ -0,0 +1,23 @@ + + + + + + + + ПрефиксУзлаРаспределеннойИнформационнойБазы + + ru + Префикс узла распределенной информационной базы + + + String + + 2 + + + true + + + Managed + diff --git a/SSL/src/Constants/ПровайдерЭЦП/ПровайдерЭЦП.mdo b/SSL/src/Constants/ПровайдерЭЦП/ПровайдерЭЦП.mdo new file mode 100644 index 000000000..5e7e563bb --- /dev/null +++ b/SSL/src/Constants/ПровайдерЭЦП/ПровайдерЭЦП.mdo @@ -0,0 +1,21 @@ + + + + + + + + ПровайдерЭЦП + + ru + Провайдер ЭЦП + + + String + + + true + + + Managed + diff --git a/SSL/src/Constants/СостояниеОбработкиРегламентныхЗаданий/СостояниеОбработкиРегламентныхЗаданий.mdo b/SSL/src/Constants/СостояниеОбработкиРегламентныхЗаданий/СостояниеОбработкиРегламентныхЗаданий.mdo new file mode 100644 index 000000000..2c1dc54de --- /dev/null +++ b/SSL/src/Constants/СостояниеОбработкиРегламентныхЗаданий/СостояниеОбработкиРегламентныхЗаданий.mdo @@ -0,0 +1,21 @@ + + + + + + + + СостояниеОбработкиРегламентныхЗаданий + + ru + Состояние обработки регламентных заданий + + Содержит тип Структура (см. модуль РегламентныеЗаданияСервер) + + ValueStorage + + true + + + Managed + diff --git a/SSL/src/Constants/СписокЗапрещенныхРасширений/СписокЗапрещенныхРасширений.mdo b/SSL/src/Constants/СписокЗапрещенныхРасширений/СписокЗапрещенныхРасширений.mdo new file mode 100644 index 000000000..9b821ae1a --- /dev/null +++ b/SSL/src/Constants/СписокЗапрещенныхРасширений/СписокЗапрещенныхРасширений.mdo @@ -0,0 +1,21 @@ + + + + + + + + СписокЗапрещенныхРасширений + + ru + Список запрещенных расширений + + + String + + + true + + + Managed + diff --git a/SSL/src/Constants/СтатусОбновленияКонфигурации/СтатусОбновленияКонфигурации.mdo b/SSL/src/Constants/СтатусОбновленияКонфигурации/СтатусОбновленияКонфигурации.mdo new file mode 100644 index 000000000..ae93f6c7b --- /dev/null +++ b/SSL/src/Constants/СтатусОбновленияКонфигурации/СтатусОбновленияКонфигурации.mdo @@ -0,0 +1,20 @@ + + + + + + + + СтатусОбновленияКонфигурации + + ru + Статус обновления конфигурации + + + ValueStorage + + true + + + Managed + diff --git a/SSL/src/Constants/ТипПровайдераЭЦП/ТипПровайдераЭЦП.mdo b/SSL/src/Constants/ТипПровайдераЭЦП/ТипПровайдераЭЦП.mdo new file mode 100644 index 000000000..dff40e5fd --- /dev/null +++ b/SSL/src/Constants/ТипПровайдераЭЦП/ТипПровайдераЭЦП.mdo @@ -0,0 +1,23 @@ + + + + + + + + ТипПровайдераЭЦП + + ru + Тип провайдера ЭЦП + + + Number + + 10 + + + true + + + Managed + diff --git a/SSL/src/Constants/ТипХраненияФайлов/ТипХраненияФайлов.mdo b/SSL/src/Constants/ТипХраненияФайлов/ТипХраненияФайлов.mdo new file mode 100644 index 000000000..b48de85e3 --- /dev/null +++ b/SSL/src/Constants/ТипХраненияФайлов/ТипХраненияФайлов.mdo @@ -0,0 +1,21 @@ + + + + + + + + ТипХраненияФайлов + + ru + Тип хранения файлов + + Глобальная настройка - где хранятся файлы - в базе как ХранилищеЗначения или в каталоге на диске + + EnumRef.ТипыХраненияФайлов + + true + + + Managed + diff --git a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form new file mode 100644 index 000000000..6686faa6e --- /dev/null +++ b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form @@ -0,0 +1,375 @@ + + + + ГруппаИнтервалВремени + 8 + + ИнтервалВремениВыполнения + 1 + + <key>ru</key> + <value>Интервал времени выполнения</value> + + true + true + + true + + + ИнтервалВремениВыполнения + + + OnChange + ИнтервалВремениВыполненияПриИзменении + + + ИнтервалВремениВыполненияРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + ИнтервалВремениВыполненияКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ДекорацияСек + 9 + + <key>ru</key> + <value>(сек)</value> + + true + true + + true + + + ДекорацияСекРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ДекорацияСекКонтекстноеМеню + 10 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа интервал времени</value> + + + ru + Группа интервал времени + + + ГруппаИнтервалВремениРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаСтатуса + 6 + + Статус + 4 + true + true + + true + + + Статус + + None + + СтатусРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + СтатусКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + 1 + true + + + + ЗапуститьСейчас + 11 + true + true + + true + + false + + ЗапуститьСейчасРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + UsualButton + Form.Command.ЗапуститьСейчас + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа статуса</value> + + + ru + Группа статуса + + + ГруппаСтатусаРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Закрыть + 3 + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.StandardCommand.Close + true + true + true + UserCmds + Auto + + Right + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + 50 + DontBlock + true + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.АвтоматическоеИзвлечениеТекстов + + + true + + + true + +

    true
    + + + ИнтервалВремениВыполнения + + <key>ru</key> + <value>Интервал времени выполнения</value> + + 2 + + Number + + 5 + + + + true + + + true + + + + Статус + + <key>ru</key> + <value>Статус</value> + + 3 + + String + + + + true + + + true + + + + ПрогнозируемоеВремяНачалаИзвлечения + + <key>ru</key> + <value>Прогнозируемое время начала извлечения</value> + + 4 + + Date + + + + true + + + true + + + + ЗапуститьСейчас + + <key>ru</key> + <value>Запустить сейчас</value> + + 1 + + ru + Запустить сейчас + + + true + + + + ЗапуститьСейчас + + + Auto + Auto + + + + + + + diff --git a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl new file mode 100644 index 000000000..e2ae4ff73 --- /dev/null +++ b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl @@ -0,0 +1,139 @@ +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ИнтервалВремениВыполнения = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("АвтоматическоеИзвлечениеТекстов", "ИнтервалВремениВыполнения"); + Если ИнтервалВремениВыполнения = 0 Тогда + ИнтервалВремениВыполнения = 60; + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("АвтоматическоеИзвлечениеТекстов", "ИнтервалВремениВыполнения", ИнтервалВремениВыполнения); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + #Если ВебКлиент Тогда + Отказ = Истина; + Предупреждение(НСтр("ru = 'В Веб-клиенте извлечение текстов не поддерживается.'")); + Возврат; + #КонецЕсли + + ПрогнозируемоеВремяНачалаИзвлечения = ТекущаяДата() + ИнтервалВремениВыполнения; + ПодключитьОбработчикОжидания("ИзвлечениеТекстовКлиент", ИнтервалВремениВыполнения); + + ПодключитьОбработчикОжидания("ОбновлениеОбратногоОтсчета", 1); + ОбновлениеОбратногоОтсчета(); +КонецПроцедуры + +&НаКлиенте +Процедура ИнтервалВремениВыполненияПриИзменении(Элемент) + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("АвтоматическоеИзвлечениеТекстов", "ИнтервалВремениВыполнения", ИнтервалВремениВыполнения); + ОтключитьОбработчикОжидания("ИзвлечениеТекстовКлиент"); + ПрогнозируемоеВремяНачалаИзвлечения = ТекущаяДата() + ИнтервалВремениВыполнения; + ПодключитьОбработчикОжидания("ИзвлечениеТекстовКлиент", ИнтервалВремениВыполнения); + ОбновлениеОбратногоОтсчета(); +КонецПроцедуры + +// обновляет обратный отсчет +&НаКлиенте +Процедура ОбновлениеОбратногоОтсчета() + + Осталось = ПрогнозируемоеВремяНачалаИзвлечения - ТекущаяДата(); + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'До начала извлечения текстов осталось %1 сек'"), + Осталось); + + Если Осталось <= 1 Тогда + ТекстСообщения = ""; + КонецЕсли; + + ИнтервалВремениВыполнения = Элементы.ИнтервалВремениВыполнения.ТекстРедактирования; + Статус = ТекстСообщения; + +КонецПроцедуры + +// Извлекает текст из файлов на диске на клиенте +&НаКлиенте +Процедура ИзвлечениеТекстовКлиент() + #Если НЕ ВебКлиент Тогда + + ПрогнозируемоеВремяНачалаИзвлечения = ТекущаяДата() + ИнтервалВремениВыполнения; + + ИмяСРасширениемФайла = ""; + + Состояние(НСтр("ru = 'Начато извлечение текста'")); + + Попытка + МассивВерсий = РаботаСФайлами.ПолучитьМассивВерсийДляИзвлеченияТекста(); + + Если МассивВерсий.Количество() = 0 Тогда + Состояние(НСтр("ru = 'Нет файлов для извлечения текста'")); + Возврат; + КонецЕсли; + + Для Индекс = 0 По МассивВерсий.Количество() - 1 Цикл + + ВерсияСсылка = МассивВерсий[Индекс]; + + СтруктураВозврата = РаботаСФайлами.ПолучитьДанныеФайлаИНавигационнуюСсылкуВерсии(, ВерсияСсылка, УникальныйИдентификатор); + ДанныеФайла = СтруктураВозврата.ДанныеФайла; + АдресФайла = СтруктураВозврата.НавигационнаяСсылкаВерсии; + + Если ДанныеФайла.СтатусИзвлеченияТекста <> "НеИзвлечен" Тогда + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда + УдалитьИзВременногоХранилища(АдресФайла); + КонецЕсли; + + Продолжить; // другой клиент уже обработал файл + КонецЕсли; + + ИмяСРасширением = ФайловыеФункцииКлиент.ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + ИмяСРасширениемФайла = ИмяСРасширением; + Прогресс = Индекс * 100 / МассивВерсий.Количество(); + Состояние(НСтр("ru = 'Идет извлечение текста файла'"), Прогресс, ИмяСРасширением); + Расширение = ДанныеФайла.Расширение; + + ФайловыеФункцииКлиент.ИзвлечьТекстВерсии(ВерсияСсылка, АдресФайла, Расширение, УникальныйИдентификатор); + КонецЦикла; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Извлечение текста завершено. Обработано файлов: %1'"), + МассивВерсий.Количество()); + Состояние(ТекстСообщения); + + Исключение + + ОписаниеОшибкиИнфо = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Во время извлечения текста из файла ""%1"" произошла неизвестная ошибка.'"), + ИмяСРасширениемФайла); + ТекстСообщения = ТекстСообщения + Строка(ОписаниеОшибкиИнфо); + Состояние(ТекстСообщения); + + // запись в журнал регистрации + ЗаписьЖурналаРегистрацииСервер(ТекстСообщения); + + КонецПопытки; + + #КонецЕсли +КонецПроцедуры + + +&НаСервере +Процедура ЗаписьЖурналаРегистрацииСервер(ТекстСообщения) + + ЗаписьЖурналаРегистрации("Извлечение текста файла", + УровеньЖурналаРегистрации.Ошибка, , , + ТекстСообщения); + +КонецПроцедуры + + +&НаКлиенте +Процедура ЗапуститьСейчас(Команда) + ИзвлечениеТекстовКлиент(); +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Help/ru.html b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Help/ru.html new file mode 100644 index 000000000..e7515237d --- /dev/null +++ b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Help/ru.html @@ -0,0 +1,3 @@ + +

    Если один или несколько рабочих процессов сервера работают под Линукс, а часть или все клиенты подключаются с помощью веб-клиента, то в информационной базе могут быть добавлены файлы, текст из которых не извлечен, и соответственно эти файлы не могут быть найдены полнотекстовым поиском по содержимому. В этом случае на одном из клиентских компьютеров, работающих под управлением ОС Microsoft Windows нужно запустить тонкий или толстый клиент, и на нем открыть обработку «Автоматическое извлечение текстов». Эта обработка в автоматическом режиме будет извлекать текст из файлов. По умолчанию интервал времени выполнения равен 60 секундам.

    +

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

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/АвтоматическоеИзвлечениеТекстов.mdo b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/АвтоматическоеИзвлечениеТекстов.mdo new file mode 100644 index 000000000..5a8ee948d --- /dev/null +++ b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/АвтоматическоеИзвлечениеТекстов.mdo @@ -0,0 +1,28 @@ + + + + + + + АвтоматическоеИзвлечениеТекстов + + ru + Автоматическое извлечение текстов + + true + DataProcessor.АвтоматическоеИзвлечениеТекстов.Form.Форма + + + ru + + + + Форма + + ru + Форма + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/DataProcessors/АктивныеПользователи/Commands/АктивныеПользователи/CommandModule.bsl b/SSL/src/DataProcessors/АктивныеПользователи/Commands/АктивныеПользователи/CommandModule.bsl new file mode 100644 index 000000000..6c22ba157 --- /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..db6099d50 --- /dev/null +++ b/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Form.form @@ -0,0 +1,1282 @@ + + + + <key>ru</key> + <value>Активные пользователи</value> + + + СписокПользователей + 2 + true + true + + true + + + СписокПользователей + + false + None + Add + Change + Copy + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + Пользователь + 4 + true + true + + true + + + СписокПользователей.ИмяПользователя + + + ПользовательРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ПользовательКонтекстноеМеню + 5 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Приложение + 8 + true + true + + true + + + СписокПользователей.Приложение + + + ПриложениеРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + ПриложениеКонтекстноеМеню + 9 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + НачалоРаботы + 10 + true + true + + true + + + СписокПользователей.НачалоРаботы + + + НачалоРаботыРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + НачалоРаботыКонтекстноеМеню + 11 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Компьютер + 12 + true + true + + true + + + СписокПользователей.Компьютер + + + КомпьютерРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + КомпьютерКонтекстноеМеню + 13 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Сеанс + 14 + true + true + + true + + + СписокПользователей.Сеанс + + + СеансРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + СеансКонтекстноеМеню + 15 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + None + + СписокПользователейКоманднаяПанель + 23 + Left + true + + + Selection + СписокПользователейВыбор + + + СписокПользователейСтрокаПоиска + 43 + + СписокПользователейСтрокаПоискаРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + СписокПользователейСтрокаПоискаКонтекстноеМеню + 44 + true + + СписокПользователей + + true + + + + СписокПользователейСостояниеПросмотра + 46 + + СписокПользователейСостояниеПросмотраРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + СписокПользователейСостояниеПросмотраКонтекстноеМеню + 47 + true + + ViewStatusAddition + СписокПользователей + + true + + + + СписокПользователейУправлениеПоиском + 49 + + СписокПользователейУправлениеПоискомРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + СписокПользователейУправлениеПоискомКонтекстноеМеню + 50 + true + + SearchControlAddition + СписокПользователей + + true + + + + СписокПользователейРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + СписокПользователейКонтекстноеМеню + 3 + + ЖурналРегистрацииКонтекст + 28 + true + true + + true + + false + + ЖурналРегистрацииКонтекстРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + Form.Command.ЖурналРегистрации + Normal + Auto + true + true + UserCmds + Auto + + + РазорватьСоединениеКонтекст + 32 + true + true + + true + + false + + РазорватьСоединениеКонтекстРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + Form.Command.РазорватьСоединение + Normal + Auto + true + true + UserCmds + Auto + + + ОбновитьКонтекст + 21 + true + true + + true + + false + + ОбновитьКонтекстРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + Form.Command.Обновить + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + + true + 80 + true + true + 4 + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + + СписокПользователей.НомерРисункаПользователя + + + CommonPicture.КоллекцияВидыАктивныхПользователей + + + Style.BorderColor + + None + None + None + true + +
    + + КоличествоАктивныхПользователей + 6 + true + true + + true + + + КоличествоАктивныхПользователей + + + КоличествоАктивныхПользователейРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + + КоличествоАктивныхПользователейКонтекстноеМеню + 7 + true + + LabelField + Left + Enter + true + Left + true + Left + + true + true + + + Top + true + + ФормаКоманднаяПанель + -1 + + ЖурналРегистрации + 16 + true + true + + true + + false + + ЖурналРегистрацииРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.Command.ЖурналРегистрации + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + СортировкаПоВозрастанию + 26 + true + true + + true + + false + + СортировкаПоВозрастаниюРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.Command.СортировкаПоВозрастанию + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + СортировкаПоУбыванию + 27 + true + true + + true + + false + + СортировкаПоУбываниюРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.Command.СортировкаПоУбыванию + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Обновить + 18 + true + true + + true + + false + + ОбновитьРасширеннаяПодсказка + 36 + 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 + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.РедактированиеРеквизитовОбъектов + + + true + Role.ПолныеПрава + + + false + + ПараметрыАдминистрированияИнформационнойБазыРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.Command.ПараметрыАдминистрированияИнформационнойБазы + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + РазорватьСоединение + 31 + true + true + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.РедактированиеРеквизитовОбъектов + + + true + Role.ПолныеПрава + + + false + + РазорватьСоединениеРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + Form.Command.РазорватьСоединение + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + Ignore + No + OK + Retry + Yes + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.АктивныеПользователи + + + true + + + true + +
    true
    +
    + + СписокПользователей + + <key>ru</key> + <value>Список пользователей</value> + + 2 + + ValueTable + + + true + + + true + + + НомерРисункаПользователя + + <key>ru</key> + <value>Номер рисунка пользователя</value> + + 1 + + Number + + 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 + + Date + + + + true + + + true + + + + Компьютер + + <key>ru</key> + <value>Компьютер</value> + + 5 + + String + + + + true + + + true + + + + Сеанс + + <key>ru</key> + <value>Сеанс</value> + + 6 + + Number + + 7 + true + + + + true + + + true + + + + ИмяПользователя + + <key>ru</key> + <value>Имя пользователя</value> + + 7 + + String + + + + true + + + true + + + + ПользовательСсылка + + <key>ru</key> + <value>Пользователь ссылка</value> + + 8 + + CatalogRef.ВнешниеПользователи + CatalogRef.Пользователи + + + true + + + true + + + + Соединение + + <key>ru</key> + <value>Соединение</value> + + 9 + + Number + + 5 + true + + + + true + + + true + + + + + КоличествоАктивныхПользователей + + <key>ru</key> + <value>Количество</value> + + 3 + + Number + + 10 + + + + true + + + true + + + + ИмяКолонкиСортировки + + <key>ru</key> + <value>Имя колонки сортировки</value> + + 4 + + String + + + + true + + + true + + + + НаправлениеСортировки + + <key>ru</key> + <value>Направление сортировки</value> + + 5 + + String + + 5 + + + + true + + + true + + + + НомерСеансаИнформационнойБазы + + <key>ru</key> + <value>Номер сеанса информационной базы</value> + + 6 + + Number + + 10 + + + + true + + + true + + + + ЖурналРегистрации + + <key>ru</key> + <value>Открыть журнал регистрации</value> + + 1 + + ru + Открыть журнал регистрации + + + true + + + StdPicture.EventLogByUser + + + + ОткрытьЖурналРегистрации + + + TextPicture + Auto + Auto + + + Обновить + + <key>ru</key> + <value>Обновить</value> + + 3 + + ru + Обновить + + + true + + Ctrl+Shift+R + + StdPicture.Refresh + + + + ОбновитьВыполнить + + + Auto + Auto + + + СортировкаПоВозрастанию + + <key>ru</key> + <value>Сортировка по возрастанию</value> + + 5 + + ru + Сортировка по возрастанию + + + true + + + StdPicture.SortListAsc + + + + СортироватьПоВозрастанию + + + Auto + Auto + + + СортировкаПоУбыванию + + <key>ru</key> + <value>Сортировка по убыванию</value> + + 6 + + ru + Сортировка по убыванию + + + true + + + StdPicture.SortListDesc + + + + СортироватьПоУбыванию + + + Auto + Auto + + + РазорватьСоединение + + <key>ru</key> + <value>Разорвать соединение</value> + + 2 + + ru + Разорвать соединение + + + true + + true + Role.Администрирование + + + Role.БазовыеПрава + + + Role.ВыводНаПринтерФайлБуферОбмена + + + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ИзменениеДополнительныхСведений + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеРолейИсполнителей + + + Role.ДобавлениеИзменениеФизическихЛиц + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИзменениеМакетовПечатныхФорм + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеДополнительныхСведений + + + Role.ЧтениеОтветовНаВопросыАнкет + + + Role.ЧтениеПерсональныхДанныхФизическихЛиц + + + + CommonPicture.РазорватьСоединение + + + + РазорватьСоединение + + + TextPicture + Auto + Auto + + + ПараметрыАдминистрированияИнформационнойБазы + + <key>ru</key> + <value>Параметры администрирования информационной базы</value> + + 4 + + ru + Параметры администрирования информационной базы + + + true + + + + ПараметрыАдминистрированияИнформационнойБазы + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Help/ru.html b/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Help/ru.html new file mode 100644 index 000000000..58659df71 --- /dev/null +++ b/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Help/ru.html @@ -0,0 +1,4 @@ + +

    Активные пользователи - это пользователи, которые сейчас работают с информационной базой. В этом списке отображаются не только пользователи, работающие с информационной базой при помощи приложений "Тонкий клиент", "Веб-клиент" или "Конфигуратор", но и такие пользователи как "COM-соединение", "WS-соединение", "Фоновое задание" и т.п.

    +

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

    +

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

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Module.bsl b/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Module.bsl new file mode 100644 index 000000000..a4349b44e --- /dev/null +++ b/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Module.bsl @@ -0,0 +1,235 @@ + +&НаКлиенте +Процедура ЗаполнитьСписок() + + // Для восстановления позиции запомним текущий сеанс + ТекущийСеанс = Неопределено; + ТекущиеДанные = Элементы.СписокПользователей.ТекущиеДанные; + + Если ТекущиеДанные <> Неопределено Тогда + ТекущийСеанс = ТекущиеДанные.Сеанс; + КонецЕсли; + + ЗаполнитьСписокПользователей(); + + // Восстанавливаем текущую строку по запомненному сеансу + Если ТекущийСеанс <> Неопределено Тогда + СтруктураПоиска = Новый Структура; + СтруктураПоиска.Вставить("Сеанс", ТекущийСеанс); + НайденныеСеансы = СписокПользователей.НайтиСтроки(СтруктураПоиска); + Если НайденныеСеансы.Количество() = 1 Тогда + Элементы.СписокПользователей.ТекущаяСтрока = НайденныеСеансы[0].ПолучитьИдентификатор(); + Элементы.СписокПользователей.ВыделенныеСтроки.Очистить(); + Элементы.СписокПользователей.ВыделенныеСтроки.Добавить(Элементы.СписокПользователей.ТекущаяСтрока); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СортировкаПоКолонке(Направление) + + Колонка = Элементы.СписокПользователей.ТекущийЭлемент; + Если Колонка = Неопределено Тогда + Возврат; + КонецЕсли; + + ИмяКолонкиСортировки = Колонка.Имя; + НаправлениеСортировки = Направление; + + ЗаполнитьСписок(); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСписокПользователей() + + СписокПользователей.Очистить(); + + СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы(); + + Для Каждого СеансИБ Из СеансыИнформационнойБазы Цикл + СтрПользователя = СписокПользователей.Добавить(); + + СтрПользователя.Приложение = ПредставлениеПриложения(СеансИБ.ИмяПриложения); + СтрПользователя.НачалоРаботы = СеансИБ.НачалоСеанса; + СтрПользователя.Компьютер = СеансИБ.ИмяКомпьютера; + СтрПользователя.Сеанс = СеансИБ.НомерСеанса; + СтрПользователя.Соединение = СеансИБ.НомерСоединения; + + Если СеансИБ.Пользователь <> Неопределено Тогда + СтрПользователя.Пользователь = СеансИБ.Пользователь.Имя; + СтрПользователя.ИмяПользователя = СеансИБ.Пользователь.ПолноеИмя; + СтрПользователя.ПользовательСсылка = НайтиСсылкуПоИдентификаторуПользователя(СеансИБ.Пользователь.УникальныйИдентификатор); + Иначе + СтрПользователя.Пользователь = ""; + СтрПользователя.ИмяПользователя = ""; + КонецЕсли; + + Если СеансИБ.НомерСеанса = НомерСеансаИнформационнойБазы Тогда + СтрПользователя.НомерРисункаПользователя = 0; + Иначе + СтрПользователя.НомерРисункаПользователя = 1; + КонецЕсли; + КонецЦикла; + + КоличествоАктивныхПользователей = СеансыИнформационнойБазы.Количество(); + СписокПользователей.Сортировать(ИмяКолонкиСортировки + " " + НаправлениеСортировки); + +КонецПроцедуры + +Функция НайтиСсылкуПоИдентификаторуПользователя(Идентификатор) + + Запрос = Новый Запрос; + + ШаблонТекстаЗапроса = "ВЫБРАТЬ + | Ссылка + |ИЗ + | %1 + |ГДЕ + | ИдентификаторПользователяИБ = &Идентификатор"; + + ТекстЗапросаПоПользователям = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонТекстаЗапроса, + "Справочник.Пользователи"); + + ТекстЗапросаПоВнешниемПользователям = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонТекстаЗапроса, + "Справочник.ВнешниеПользователи"); + + Запрос.Текст = ТекстЗапросаПоПользователям; + Запрос.Параметры.Вставить("Идентификатор", Идентификатор); + Результат = Запрос.Выполнить(); + + Если НЕ Результат.Пустой() Тогда + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + Возврат Выборка.Ссылка; + КонецЕсли; + + Запрос.Текст = ТекстЗапросаПоВнешниемПользователям; + Результат = Запрос.Выполнить(); + + Если НЕ Результат.Пустой() Тогда + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + Возврат Выборка.Ссылка; + КонецЕсли; + + Возврат Справочники.Пользователи.ПустаяСсылка(); + +КонецФункции + + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы, элементов формы и команд формы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + НомерСеансаИнформационнойБазы = НомерСеансаИнформационнойБазы(); + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Если Элементы.Найти("РазорватьСоединение") <> Неопределено Тогда + Элементы.РазорватьСоединение.Видимость = Ложь; + КонецЕсли; + Если Элементы.Найти("ПараметрыАдминистрированияИнформационнойБазы") <> Неопределено Тогда + Элементы.ПараметрыАдминистрированияИнформационнойБазы.Видимость = Ложь; + КонецЕсли; + КонецЕсли; + + // Вставить содержимое обработчика. + ИмяКолонкиСортировки = "НачалоРаботы"; + НаправлениеСортировки = "Возр"; + ЗаполнитьСписокПользователей(); + +КонецПроцедуры + +&НаКлиенте +Процедура РазорватьСоединение(Команда) + + Сообщение = ""; + + Если Элементы.СписокПользователей.ТекущиеДанные.Сеанс = НомерСеансаИнформационнойБазы Тогда + // Текущее соедеинение не разрываем - иначе останется сеанс + Предупреждение(НСтр("ru = 'Нельзя разорвать текущее соединение.'")); + Возврат; + КонецЕсли; + + Отключено = СоединенияИБ.ОтключитьСоединениеИБ(СоединенияИБ.ПолучитьПараметрыАдминистрированияИБ(), + Элементы.СписокПользователей.ТекущиеДанные.Соединение, + Сообщение); + + Если НЕ Отключено И Сообщение <> "" Тогда + Предупреждение(Сообщение); + КонецЕсли; + + ЗаполнитьСписок(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьВыполнить() + + ЗаполнитьСписок(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьЖурналРегистрации() + + Если Элементы.СписокПользователей.ВыделенныеСтроки.Количество() > 1 Тогда + Предупреждение(НСтр("ru = 'Для просмотра журнала регистрации выберите в списке только одного пользователя.'")); + Возврат; + КонецЕсли; + + ТекущиеДанные = Элементы.СписокПользователей.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Предупреждение(НСтр("ru = 'Невозможно открыть журнал регистрации для выбранного пользователя.'")); + Возврат; + КонецЕсли; + + ИмяПользователя = ТекущиеДанные.ИмяПользователя; + + ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", Новый Структура("Пользователь", ИмяПользователя)); + +КонецПроцедуры + +&НаКлиенте +Процедура СортироватьПоВозрастанию() + + СортировкаПоКолонке("Возр"); + +КонецПроцедуры + +&НаКлиенте +Процедура СортироватьПоУбыванию() + + СортировкаПоКолонке("Убыв"); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПользователейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Пользователь = Элементы.СписокПользователей.ТекущиеДанные.ПользовательСсылка; + + Если ЗначениеЗаполнено(Пользователь) Тогда + ПараметрыОткрытия = Новый Структура("Ключ", Пользователь); + Если ТипЗнч(Пользователь) = Тип("СправочникСсылка.Пользователи") Тогда + ОткрытьФорму("Справочник.Пользователи.Форма.ФормаЭлемента", ПараметрыОткрытия); + ИначеЕсли ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда + ОткрытьФорму("Справочник.ВнешниеПользователи.Форма.ФормаЭлемента", ПараметрыОткрытия); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПараметрыАдминистрированияИнформационнойБазы(Команда) + + ОткрытьФорму("ОбщаяФорма.ПараметрыАдминистрированияСервернойИБ"); + +КонецПроцедуры diff --git a/SSL/src/DataProcessors/АктивныеПользователи/АктивныеПользователи.mdo b/SSL/src/DataProcessors/АктивныеПользователи/АктивныеПользователи.mdo new file mode 100644 index 000000000..5f68156ff --- /dev/null +++ b/SSL/src/DataProcessors/АктивныеПользователи/АктивныеПользователи.mdo @@ -0,0 +1,37 @@ + + + + + + + АктивныеПользователи + + ru + Активные пользователи + + true + DataProcessor.АктивныеПользователи.Form.ФормаСпискаАктивныхПользователей + + ФормаСпискаАктивныхПользователей + + ru + Активные пользователи + + + + ru + + + PersonalComputer + MobileDevice + + + АктивныеПользователи + + ru + Активные пользователи + + NavigationPanelOrdinary + Auto + + diff --git a/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/Forms/Форма/Form.form b/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/Forms/Форма/Form.form new file mode 100644 index 000000000..87955aa2a --- /dev/null +++ b/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/Forms/Форма/Form.form @@ -0,0 +1,562 @@ + + + + ГруппаОсновные + 18 + + УстановитьБлокировкуСоединений + 2 + true + true + + true + + + Объект.УстановитьБлокировкуСоединений + + Right + + УстановитьБлокировкуСоединенийРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + УстановитьБлокировкуСоединенийКонтекстноеМеню + 3 + true + + CheckBoxField + Enter + true + Left + true + Left + + + + НачалоБлокировки + 4 + true + true + + true + + + Объект.НачалоБлокировки + + + НачалоБлокировкиРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + НачалоБлокировкиКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ОкончаниеБлокировки + 6 + true + true + + true + + + Объект.ОкончаниеБлокировки + + + ОкончаниеБлокировкиРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + ОкончаниеБлокировкиКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Сообщение + 8 + true + true + + true + + + Объект.Сообщение + + + СообщениеРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + СообщениеКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + Left + + true + 2 + true + true + true + true + + Style.BorderColor + + Normal + + + + ГруппаКодРазрешения + 42 + + КодРазрешения + 10 + true + true + + + true + Role.ПолныеПрава + + + + Объект.КодРазрешения + + Left + + КодРазрешенияРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + КодРазрешенияКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + ГруппаКодРазрешенияРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Основные</value> + + + ГруппаОсновныеРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ОсновнаяКоманднаяПанель + 1 + + КомандаУстановить + 15 + true + true + + true + + false + + КомандаУстановитьРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + Form.Command.Записать + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + КомандаЗакрыть + 16 + true + true + + true + + false + + КомандаЗакрытьРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + CommandBar + + Right + Form + + + Top + true + + ФормаКоманднаяПанель + -1 + + АктивныеПользователи + 41 + true + true + + true + + false + + АктивныеПользователиРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.Command.АктивныеПользователи + Normal + Auto + true + true + UserCmds + Auto + + + ПараметрыАдминистрированияИнформационнойБазы + 43 + + <key>ru</key> + <value>Параметры администрирования ИБ</value> + + true + true + + true + + false + + ПараметрыАдминистрированияИнформационнойБазыРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + Form.Command.ПараметрыАдминистрированияИнформационнойБазы + Normal + Auto + true + true + UserCmds + Auto + + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + CustomizeForm + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.БлокировкаСоединенийСИнформационнойБазой + + + true + + + true + +
    true
    +
    + + ЗапрашиватьАдминистратораИБ + + <key>ru</key> + <value>Запрашивать администратора ИБ</value> + + 2 + + Boolean + + + true + + + true + + + + Записать + + <key>ru</key> + <value>Записать</value> + + 1 + + ru + Записать режим блокировки + + + true + + + + ЗаписатьВыполнить + + + Auto + Auto + + + АктивныеПользователи + + <key>ru</key> + <value>Активные пользователи</value> + + 2 + + ru + Активные пользователи + + + true + + + StdPicture.ActiveUsers + + + + АктивныеПользователи + + + TextPicture + Auto + Auto + + + ПараметрыАдминистрированияИнформационнойБазы + + <key>ru</key> + <value>Параметры администрирования информационной базы</value> + + 3 + + ru + Параметры администрирования информационной базы + + + true + + + + ПараметрыАдминистрированияИнформационнойБазы + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/Forms/Форма/Help/ru.html b/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/Forms/Форма/Help/ru.html new file mode 100644 index 000000000..3f17c7ecb --- /dev/null +++ b/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/Forms/Форма/Help/ru.html @@ -0,0 +1,33 @@ + +

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

    +

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

    +

    Для снятия блокировки соединений до истечения срока блокировки нужно:

    +
  • +

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

    +
  • +

    Запустить данную обработку, указав в качестве действия блокировки "Снять блокировку соединений".

    +
  • +

    Нажать кнопку "Выполнить".

    +

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

    +

    Параметры сервисной обработки

    +
  • +

    В форме обработки можно указать:

    +
  • +

    Признак установки/снятия блокировки;

    +
  • +

    Период (время) начала действия  и окончания действия блокировки;

    +
  • +

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

    +
  • +

    Код разрешения - произвольная строка, используя которую в качестве параметра запуска "/UC" в дальнейшем можно будет войти в информационную базу, несмотря на установленную блокировку.

    +
  • +

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

    +

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

    +
  • +

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

    +
  • +

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

    +
  • +

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

    +
  • +

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

  • \ No newline at end of file diff --git a/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/Forms/Форма/Module.bsl new file mode 100644 index 000000000..6ac4358ab --- /dev/null +++ b/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/Forms/Форма/Module.bsl @@ -0,0 +1,122 @@ +//////////////////////////////////////////////////////////////////////////////// +// Обработчики команд + +&НаКлиенте +Процедура ЗаписатьВыполнить() + + ОчиститьСообщения(); + + Если Объект.УстановитьБлокировкуСоединений Тогда + + // проверки возможности установки блокировки + Если ЗначениеЗаполнено(Объект.ОкончаниеБлокировки) И Объект.НачалоБлокировки > Объект.ОкончаниеБлокировки Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Дата окончания блокировки не может быть меньше даты начала блокировки. Блокировка не установлена.'")); + Возврат; + КонецЕсли; + + Попытка + ПроверитьПредусловияБлокировки(); + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ИнформацияОбОшибке().Описание); + Возврат; + КонецПопытки; + + ТекстВопроса = НСтр("ru = 'После установки блокировки в информационной базе будет запущен + |режим завершения работы всех пользователей (включая Вас) + |на период действия блокировки. + |Вы действительно хотите установить блокировку?'"); + + ЗаголовокВопроса = НСтр("ru = 'Установка блокировки соединений с информационной базой'"); + + Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена, 60, КодВозвратаДиалога.Нет, + ЗаголовокВопроса); + + Если Ответ <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + КонецЕсли; + + УстановитьСнятьБлокировку(); + + СоединенияИБКлиент.УстановитьОбработчикиОжиданияЗавершенияРаботыПользователей( + Объект.УстановитьБлокировкуСоединений); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры + +&НаСервере +Процедура УстановитьСнятьБлокировку() + + РеквизитФормыВЗначение("Объект").ВыполнитьУстановку(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Элементы.ПараметрыАдминистрированияИнформационнойБазы.Видимость = Ложь; + КонецЕсли; + + Обработка = РеквизитФормыВЗначение("Объект"); + Обработка.ПолучитьПараметрыБлокировки(); + + ЗначениеВРеквизитФормы(Обработка, "Объект"); + +КонецПроцедуры + +&НаКлиенте +Процедура АктивныеПользователи(Команда) + + ОткрытьФорму("Обработка.АктивныеПользователи.Форма",,ЭтаФорма); + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ПроверитьПредусловияБлокировки() Экспорт + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + НазванияСоединенийИБ = ""; + Если НЕ АктивныТолькоКлиентскиеПриложения(НазванияСоединенийИБ) Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Существуют активные соединения, которые невозможно завершить. Блокировка не установлена. + |%1'"), + НазванияСоединенийИБ); + ВызватьИсключение ТекстСообщения; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция АктивныТолькоКлиентскиеПриложения(НазванияСоединенийИБ) + + Результат = Истина; + НазванияСоединенийИБ = ""; + Для каждого Соединение Из ПолучитьСоединенияИнформационнойБазы() Цикл + Если Соединение.НомерСоединения = НомерСоединенияИнформационнойБазы() Тогда + Продолжить; + КонецЕсли; + Если Соединение.ИмяПриложения <> "1CV8" И Соединение.ИмяПриложения <> "1CV8C" И + Соединение.ИмяПриложения <> "WebClient" Тогда + НазванияСоединенийИБ = НазванияСоединенийИБ + Символы.ПС + " - " + Соединение; + Результат = Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура ПараметрыАдминистрированияИнформационнойБазы(Команда) + + ОткрытьФорму("ОбщаяФорма.ПараметрыАдминистрированияСервернойИБ"); + +КонецПроцедуры diff --git a/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/ManagerModule.bsl b/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/ObjectModule.bsl b/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/ObjectModule.bsl new file mode 100644 index 000000000..454c005c9 --- /dev/null +++ b/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/ObjectModule.bsl @@ -0,0 +1,39 @@ +// Установить или снять блокировку информационной базы, +// исходя из значений реквизитов обработки. +// +Процедура ВыполнитьУстановку() Экспорт + + Блокировка = Новый БлокировкаСеансов; + Блокировка.Начало = НачалоБлокировки; + Блокировка.Конец = ОкончаниеБлокировки; + Блокировка.Сообщение = СоединенияИБ.СформироватьСообщениеБлокировки(Сообщение, КодРазрешения); + Блокировка.Установлена = УстановитьБлокировкуСоединений; + Блокировка.КодРазрешения = КодРазрешения; + + УстановитьБлокировкуСеансов(Блокировка); + +КонецПроцедуры + +// Зачитать параметры блокировки информационной базы +// в реквизиты обработки. +// +Процедура ПолучитьПараметрыБлокировки() Экспорт + + ТекущийРежим = ПолучитьБлокировкуСеансов(); + + УстановитьБлокировкуСоединений = ТекущийРежим.Установлена; + Сообщение = СоединенияИБКлиентСервер.ИзвлечьСообщениеБлокировки(ТекущийРежим.Сообщение); + КодРазрешения = ТекущийРежим.КодРазрешения; + + Если УстановитьБлокировкуСоединений Тогда + НачалоБлокировки = ТекущийРежим.Начало; + ОкончаниеБлокировки = ТекущийРежим.Конец; + Иначе + // Если блокировка не установлена, можно предположить, что + // пользователь открыл форму для установки блокировки. + // Поэтому устанавливаем дату блокировки равной текущей дате + НачалоБлокировки = ТекущаяДата(); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/БлокировкаСоединенийСИнформационнойБазой.mdo b/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/БлокировкаСоединенийСИнформационнойБазой.mdo new file mode 100644 index 000000000..0b4684e57 --- /dev/null +++ b/SSL/src/DataProcessors/БлокировкаСоединенийСИнформационнойБазой/БлокировкаСоединенийСИнформационнойБазой.mdo @@ -0,0 +1,112 @@ + + + + + + + БлокировкаСоединенийСИнформационнойБазой + + ru + Блокировка соединений с информационной базой + + true + DataProcessor.БлокировкаСоединенийСИнформационнойБазой.Form.Форма + + КодРазрешения + + ru + Код разрешения + + + String + + + + ru + Код разрешения, позволяющий войти в заблокированную базу. + + + + + + НачалоБлокировки + + ru + Начало действия блокировки + + + Date + + + + ru + Момент времени, с которого начинает действовать блокировка установки соединений с ИБ + + + + + + ОкончаниеБлокировки + + ru + Окончание действия блокировки + + + Date + + + + ru + Момент времени окончания действия блокировка установки соединений с ИБ + + + + + + Сообщение + + ru + Сообщение + + + String + + + + ru + Сообщение, объясняющее причину блокировки. Выводится пользователю при попытке установки соединения с заблокированной ИБ. + + + + + + УстановитьБлокировкуСоединений + + ru + Блокировка установки соединений включена + + + Boolean + + + ru + Флаг включения действия блокировки установки соединений с ИБ + + + + + + Форма + + ru + Блокировка соединений с информационной базой + + + + ru + + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Form.form new file mode 100644 index 000000000..b4a30dbf3 --- /dev/null +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Form.form @@ -0,0 +1,931 @@ + + + + <key>ru</key> + <value>Настройка параметров изменения</value> + + + ГруппаИзменятьВТранзакции + 48 + + ИзменятьВТранзакции + 1 + true + true + + true + + + ИзменятьВТранзакции + + Right + + OnChange + ИзменятьВТранзакцииПриИзменении + + + ИзменятьВТранзакцииРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ИзменятьВТранзакцииКонтекстноеМеню + 2 + true + + CheckBoxField + Enter + true + Left + true + + + + ПояснениеИзменятьВТранзакции + 7 + + <key>ru</key> + <value>При невозможности изменения объектов в транзакции, все изменения будут отменены</value> + + true + true + + true + + + ПояснениеИзменятьВТранзакцииРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + ПояснениеИзменятьВТранзакцииКонтекстноеМеню + 8 + true + + Label + true + true + + Style.ПоясняющийТекст + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа изменять в транзакции</value> + + + ru + Группа изменять в транзакции + + + ГруппаИзменятьВТранзакцииРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаПрерываниеПриОшибке + 39 + + ПрерыватьПриОшибке + 37 + true + true + + true + + + ПрерыватьПриОшибке + + Right + + ПрерыватьПриОшибкеРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + ПрерыватьПриОшибкеКонтекстноеМеню + 38 + true + + CheckBoxField + Enter + true + Left + true + + + + ПояснениеПрерыватьПриОшибке + 40 + + <key>ru</key> + <value>Предупреждать, если во время изменения объектов возникнут ошибки</value> + + true + true + + true + + + ПояснениеПрерыватьПриОшибкеРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + ПояснениеПрерыватьПриОшибкеКонтекстноеМеню + 41 + true + + Label + true + true + + Style.ПоясняющийТекст + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа прерывание при ошибке</value> + + + ru + Группа прерывание при ошибке + + + ГруппаПрерываниеПриОшибкеРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаОбрабатыватьРекурсивно + 47 + + ОбрабатыватьГруппыРекурсивно + 3 + true + true + + true + + + ОбрабатыватьРекурсивно + + Right + + ОбрабатыватьГруппыРекурсивноРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + ОбрабатыватьГруппыРекурсивноКонтекстноеМеню + 4 + true + + CheckBoxField + Enter + true + Left + true + + + + ПояснениеОбрабатыватьГруппыРекурсивно + 9 + + <key>ru</key> + <value>Обрабатывать дочерние элементы групп и родительских объектов</value> + + true + true + + true + + + ПояснениеОбрабатыватьГруппыРекурсивноРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + ПояснениеОбрабатыватьГруппыРекурсивноКонтекстноеМеню + 10 + true + + Label + true + true + + Style.ПоясняющийТекст + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа обрабатывать рекурсивно</value> + + + ru + Группа обрабатывать рекурсивно + + + ГруппаОбрабатыватьРекурсивноРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаНастройкиИзмененияПорциями + 29 + + ПустаяДекорация + 30 + true + true + + true + + + ПустаяДекорацияРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + ПустаяДекорацияКонтекстноеМеню + 31 + true + + Label + true + true + + Left + + + + ГруппаИзменятьПорциями + 13 + + ГруппаПереключатель + 14 + + НастройкаПорции + 11 + true + true + + true + + + НастройкаПорции + + None + + OnChange + ИзменятьПорциямиПриИзменении + + + НастройкаПорцииРасширеннаяПодсказка + 67 + 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 + Группа переключатель + + + ГруппаПереключательРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаПараметрыПорции + 32 + + ЧислоОбъектовВПорции + 33 + true + true + + true + + + ЧислоОбъектовВПорции + + None + + ЧислоОбъектовВПорцииРасширеннаяПодсказка + 70 + 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 + + ПроцентОбъектовВПорцииРасширеннаяПодсказка + 72 + 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 + Группа параметры порции + + + ГруппаПараметрыПорцииРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + true + + true + + + ru + Группа изменять порциями + + true + + ГруппаИзменятьПорциямиРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + + true + + + <key>ru</key> + <value>Группа настройки изменения порциями</value> + + + ru + Группа настройки изменения порциями + + + ГруппаНастройкиИзмененияПорциямиРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 5 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 6 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + 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 + + Boolean + + + true + + + true + + + + НастройкаПорции + + <key>ru</key> + <value>Настройка порции</value> + + 3 + + Number + + 1 + true + + + + true + + + true + + + + ЧислоОбъектовВПорции + + <key>ru</key> + <value>Порциями по</value> + + 4 + + Number + + 5 + true + + + + true + + + true + + + + ПроцентОбъектовВПорции + + <key>ru</key> + <value>Процент объектов в порции</value> + + 5 + + Number + + 3 + true + + + + true + + + true + + + + ПрерыватьПриОшибке + + <key>ru</key> + <value>Прерывать при ошибке</value> + + 6 + + Boolean + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + ИзменятьВТранзакции + + Boolean + + + + ОбрабатыватьРекурсивно + + Boolean + + + + НастройкаПорции + + Number + + 5 + true + + + + + ЧислоОбъектовВПорции + + Number + + 5 + true + + + + + ПроцентОбъектовВПорции + + Number + + 3 + true + + + + + ПрерыватьПриОшибке + + Boolean + + + + + + + diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Module.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Module.bsl new file mode 100644 index 000000000..752471328 --- /dev/null +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Module.bsl @@ -0,0 +1,67 @@ +////////////////////////////////////////////////////////////////////////////// +// Блок служебных процедур + +&НаКлиенте +Процедура УстановитьЭлементыФормы() + + Если ИзменятьВТранзакции Тогда + Элементы.ГруппаПрерываниеПриОшибке.Доступность = Ложь; + Иначе + Элементы.ГруппаПрерываниеПриОшибке.Доступность = Истина; + КонецЕсли; + +КонецПроцедуры + +////////////////////////////////////////////////////////////////////////////// +// Блок процедур - обработчиков команд формы + +&НаКлиенте +Процедура ОК(Команда) + + Настройки = Новый Структура; + Настройки.Вставить("ИзменятьВТранзакции", ИзменятьВТранзакции); + Настройки.Вставить("ОбрабатыватьРекурсивно", ОбрабатыватьРекурсивно); + Настройки.Вставить("НастройкаПорции", НастройкаПорции); + Настройки.Вставить("ПроцентОбъектовВПорции", ПроцентОбъектовВПорции); + Настройки.Вставить("ЧислоОбъектовВПорции", ЧислоОбъектовВПорции); + Настройки.Вставить("ПрерыватьПриОшибке", ПрерыватьПриОшибке); + + Закрыть(Настройки); + +КонецПроцедуры + +////////////////////////////////////////////////////////////////////////////// +// Блок процедур - обработчиков событий формы и элементов формы + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + УстановитьЭлементыФормы(); + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ИзменятьВТранзакции = Параметры.ИзменятьВТранзакции; + ОбрабатыватьРекурсивно = Параметры.ОбрабатыватьРекурсивно; + НастройкаПорции = Параметры.НастройкаПорции; + ПроцентОбъектовВПорции = Параметры.ПроцентОбъектовВПорции; + ЧислоОбъектовВПорции = Параметры.ЧислоОбъектовВПорции; + ПрерыватьПриОшибке = Параметры.ПрерыватьПриОшибке; + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменятьВТранзакцииПриИзменении(Элемент) + + УстановитьЭлементыФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменятьПорциямиПриИзменении(Элемент) + + УстановитьЭлементыФормы(); + +КонецПроцедуры diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/ConditionalAppearance.dcssca b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/ConditionalAppearance.dcssca new file mode 100644 index 000000000..7c4efab7c --- /dev/null +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/ConditionalAppearance.dcssca @@ -0,0 +1,23 @@ + + + + + + ТаблицаОперацийПредставление + + + + + Объект.Операции.ЗаблокированныйРеквизит + Equal + true + + + + + ЦветТекста + #C0C0C0 + + + + diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Form.form new file mode 100644 index 000000000..57b0829dc --- /dev/null +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Form.form @@ -0,0 +1,1871 @@ + + + + Страницы + 1 + + НастройкаИзменений + 2 + + ГруппаКнопок + 62 + + ИсторияОпераций + 57 + true + true + + true + + + ИсторияОперацийРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + UsualButton + Form.Command.ИсторияОпераций + Normal + Auto + 9 + true + true + UserCmds + Auto + + + ПараметрыИзменения + 58 + + НастроитьПараметрыИзменений + 44 + true + true + + true + + + НастроитьПараметрыИзмененийРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + Form.Command.НастроитьПараметрыИзменения + Normal + Auto + true + true + UserCmds + Auto + + + РазрешитьРедактированиеРеквизитов + 24 + true + true + + true + + + РазрешитьРедактированиеРеквизитовРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Form.Command.РазрешитьРедактированиеРеквизитов + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Параметры изменения</value> + + + ru + Параметры изменения + + + ПараметрыИзмененияРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + CommandBar + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа кнопок</value> + + + ru + Группа кнопок + + + ГруппаКнопокРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + 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 + + + Объект.Операции.Представление + + + ТаблицаОперацийПредставлениеРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + ТаблицаОперацийПредставлениеКонтекстноеМеню + 28 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаОперацийИзменять + 42 + true + true + + true + + + Объект.Операции.Изменять + + + ТаблицаОперацийИзменятьРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + ТаблицаОперацийИзменятьКонтекстноеМеню + 43 + true + + CheckBoxField + true + Left + true + + + + ТаблицаОперацийЗначение + 13 + true + true + + true + + + Объект.Операции.Значение + + + ТаблицаОперацийЗначениеРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + ТаблицаОперацийЗначениеКонтекстноеМеню + 14 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + + Отбор._Владелец + + Items.ТаблицаОпераций.CurrentData.Свойство + + + Normal + + + None + + ТаблицаОперацийКоманднаяПанель + 6 + Left + true + + + OnEditEnd + ТаблицаОперацийПриОкончанииРедактирования + + + Selection + ТаблицаОперацийВыбор + + + BeforeRowChange + ТаблицаОперацийПередНачаломИзменения + + + ТаблицаОперацийСтрокаПоиска + 75 + + ТаблицаОперацийСтрокаПоискаРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + + ТаблицаОперацийСтрокаПоискаКонтекстноеМеню + 76 + true + + ТаблицаОпераций + + true + + + + ТаблицаОперацийСостояниеПросмотра + 78 + + ТаблицаОперацийСостояниеПросмотраРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + ТаблицаОперацийСостояниеПросмотраКонтекстноеМеню + 79 + true + + ViewStatusAddition + ТаблицаОпераций + + true + + + + ТаблицаОперацийУправлениеПоиском + 81 + + ТаблицаОперацийУправлениеПоискомРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + ТаблицаОперацийУправлениеПоискомКонтекстноеМеню + 82 + true + + SearchControlAddition + ТаблицаОпераций + + true + + + + ТаблицаОперацийРасширеннаяПодсказка + 74 + 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 + + + ПодсказкаСтраницыДействийРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + + ПодсказкаСтраницыДействийКонтекстноеМеню + 26 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Настройка изменений</value> + + + ru + Настройка изменений + + + НастройкаИзмененийРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + + ИзменениеОбъектов + 3 + + ОбъектыДляИзменения + 29 + 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 + + + ИзменяемыеОбъекты.Изменять + + + ОбъектыДляИзмененияИзменятьРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + + ОбъектыДляИзмененияИзменятьКонтекстноеМеню + 54 + true + + CheckBoxField + Auto + true + Left + true + + + + ОбъектыДляИзмененияСсылка + 32 + true + true + + true + + + ИзменяемыеОбъекты.Ссылка + + + ОбъектыДляИзмененияСсылкаРасширеннаяПодсказка + 115 + 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 + + + ОбъектыДляИзмененияПометкаИзмененияПометитьВсеРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + Form.Command.ПометкаИзмененияПометитьВсе + Normal + Auto + true + true + UserCmds + Auto + + + ОбъектыДляИзмененияПометкаИзмененияСнятьВсе + 61 + true + true + + true + + + ОбъектыДляИзмененияПометкаИзмененияСнятьВсеРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + Form.Command.ПометкаИзмененияСнятьВсе + Normal + Auto + true + true + UserCmds + Auto + + + ОбъектыДляИзмененияОткрытьОбъектПоСсылке + 59 + true + true + + true + + + ОбъектыДляИзмененияОткрытьОбъектПоСсылкеРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + Form.Command.ОткрытьОбъектПоСсылке + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + ОбъектыДляИзмененияВыбор + + + ОбъектыДляИзмененияСтрокаПоиска + 104 + + ОбъектыДляИзмененияСтрокаПоискаРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + + ОбъектыДляИзмененияСтрокаПоискаКонтекстноеМеню + 105 + true + + ОбъектыДляИзменения + + true + + + + ОбъектыДляИзмененияСостояниеПросмотра + 107 + + ОбъектыДляИзмененияСостояниеПросмотраРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + ОбъектыДляИзмененияСостояниеПросмотраКонтекстноеМеню + 108 + true + + ViewStatusAddition + ОбъектыДляИзменения + + true + + + + ОбъектыДляИзмененияУправлениеПоиском + 110 + + ОбъектыДляИзмененияУправлениеПоискомРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + + ОбъектыДляИзмененияУправлениеПоискомКонтекстноеМеню + 111 + true + + SearchControlAddition + ОбъектыДляИзменения + + true + + + + ОбъектыДляИзмененияРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + + ОбъектыДляИзмененияКонтекстноеМеню + 30 + true + + Tree + true + true + true +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + ExpandTopLevel + true + true + + ИзменяемыеОбъекты.КодКартинки + + + CommonPicture.КоллекцияПиктограммЭлементов + + None + None + None + true +
    + + СтраницыПодсказокИзмененияОбъектов + 34 + + СтраницаПодсказкаПоКнопкеИзменить + 36 + + ПодсказкаПоКнопкеИзменить + 37 + + <key>ru</key> + <value> +Нажмите кнопку "Изменить" для изменения объектов.</value> + + true + true + + true + + + ПодсказкаПоКнопкеИзменитьРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + + ПодсказкаПоКнопкеИзменитьКонтекстноеМеню + 38 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница подсказка по кнопке изменить</value> + + + ru + Страница подсказка по кнопке изменить + + + СтраницаПодсказкаПоКнопкеИзменитьРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаПодсказкаПослеИзмененияЕстьОшибки + 35 + + ПодсказкаПослеИзмененияЕстьОшибки + 39 + + <key>ru</key> + <value>Не удалось изменить объекты. Измененно объектов %1 из %2.</value> + + true + true + + true + + + ПодсказкаПослеИзмененияЕстьОшибкиРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + + ПодсказкаПослеИзмененияЕстьОшибкиКонтекстноеМеню + 40 + true + + Label + true + true + + Style.ПоясняющийОшибкуТекст + + + Left + + + + ПерейтиВЖурналРегистрации + 41 + true + true + + true + + + ПерейтиВЖурналРегистрацииРасширеннаяПодсказка + 130 + Label + true + true + + Left + + + Hyperlink + Form.Command.ПерейтиВЖурналРегистрации + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Страница подсказка после изменения есть ошибки</value> + + + ru + Страница подсказка после изменения есть ошибки + + + СтраницаПодсказкаПослеИзмененияЕстьОшибкиРасширеннаяПодсказка + 128 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаПодсказкаУспешноеИзменение + 47 + + ПодсказкаУспешноеИзменение + 48 + + <key>ru</key> + <value>Изменение объектов успешно завершено. +Изменено объектов: %n.</value> + + true + true + + true + + + ПодсказкаУспешноеИзменениеРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + + ПодсказкаУспешноеИзменениеКонтекстноеМеню + 49 + true + + Label + true + true + + Style.ПоясняющийТекст + + + Left + Bottom + + + true + true + + true + + + <key>ru</key> + <value>Страница подсказка успешное изменение</value> + + + ru + Страница подсказка успешное изменение + + + СтраницаПодсказкаУспешноеИзменениеРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы подсказок изменения объектов</value> + + + ru + Страницы подсказок изменения объектов + + true + + СтраницыПодсказокИзмененияОбъектовРасширеннаяПодсказка + 125 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Изменение объектов</value> + + + ru + Изменение объектов + + + ИзменениеОбъектовРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + true + true + + true + + + <key>ru</key> + <value>Страницы</value> + + + ru + Страницы + + + СтраницыРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + Pages + + Auto + +
    + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаНазад + 23 + true + true + + true + + + ФормаНазадРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + Form.Command.Назад + Normal + Auto + true + true + UserCmds + Auto + + + ФормаДалее + 21 + true + true + + true + + + ФормаДалееРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + Form.Command.Далее + Normal + Auto + true + true + UserCmds + Auto + + + ФормаИзменить + 22 + + <key>ru</key> + <value>Изменить</value> + + true + true + + true + + + ФормаИзменитьРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + Form.Command.Изменить + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 20 + + <key>ru</key> + <value>Закрыть</value> + + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + + OnClose + ПриЗакрытии + + 70 + LockOwner + Use + UseList + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.ГрупповоеИзменениеОбъектов + + + true + + + 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> + + 3 + + Number + + 1 + true + + + + true + + + true + + + + ТОЧислоОбъектовВПорции + + <key>ru</key> + <value>Число объектов в порции</value> + + 5 + + Number + + 5 + true + + + + true + + + true + + + + ТОПроцентОбъектовВПорции + + <key>ru</key> + <value>Процент объектов в порции</value> + + 4 + + Number + + 3 + true + + + + true + + + true + + + + ЕстьФормаРазблокированияРеквизитов + + <key>ru</key> + <value>Есть форма разблокирования реквизитов</value> + + 6 + + Boolean + + + true + + + true + + + + ПолноеИмяФормыРаботыСБлокируемымиРеквизитами + + <key>ru</key> + <value>Полное имя формы работы с блокируемыми реквизитами</value> + + 7 + + String + + + + true + + + true + + + + ТекущийПользователь + + <key>ru</key> + <value>Текущий пользователь</value> + + 8 + + CatalogRef.ВнешниеПользователи + CatalogRef.Пользователи + + + true + + + true + + + + ТекущееСостояниеИзменения + + <key>ru</key> + <value>Текущее состояние изменения</value> + + 9 + + + true + + + true + + + + УчитыватьИерархию + + <key>ru</key> + <value>Учитывать иерархию</value> + + 10 + + Boolean + + + true + + + true + + + + ИсторияОперацийСписок + + <key>ru</key> + <value>История операций список</value> + + 11 + + ValueList + + + true + + + true + + + + + + + НекорректныйВызовОбработки + + <key>ru</key> + <value>Некорректный вызов обработки</value> + + 12 + + Boolean + + + true + + + true + + + + ОбрабатыватьРекурсивно + + <key>ru</key> + <value>Обрабатывать рекурсивно</value> + + 13 + + Boolean + + + true + + + true + + + + ПолноеИмя + + <key>ru</key> + <value>Полное имя</value> + + 14 + + String + + + + true + + + true + + + + ИзменитьТаблицуОбъектов + + <key>ru</key> + <value>Изменить таблицу объектов</value> + + 15 + + 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 + Role.ПолныеПрава + + + + + РазрешитьРедактированиеРеквизитовОбработчикКоманды + + + Auto + Auto + + + ПерейтиВЖурналРегистрации + + <key>ru</key> + <value>Перейти в журнал регистрации</value> + + 5 + + ru + Перейти в журнал регистрации + + + true + + + + ПерейтиВЖурналРегистрации + + + Auto + Auto + + + НастроитьПараметрыИзменения + + <key>ru</key> + <value>Настроить параметры изменения</value> + + 6 + + ru + Настроить параметры изменения + + + true + + + + НастроитьПараметрыИзменения + + + Auto + Auto + + + ИсторияОпераций + + <key>ru</key> + <value>История</value> + + 7 + + ru + История операций + + + true + + + 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 + + + МассивОбъектов + + true + + + + + + +
    diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Module.bsl new file mode 100644 index 000000000..ad1b90438 --- /dev/null +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Module.bsl @@ -0,0 +1,1490 @@ +/////////////////////////////////////////////////////////////////////////////// +// Создаваемые реквизиты в реквизите ИзменяемыеОбъекты имеют имена Реквизит_<поля> +// Создаваемые поля на форме в таблице формы ОбъектыДляИзменения имеют имена Элемент_<имя> +// +// ОПИСАНИЕ РЕКВИЗИТОВ +// +// --- Настройки транзакционной обработки --------------------------------------- +// ТОНастройкаПорции - число +// 1 - одной порцией +// 2 - порциями по числу объектов +// 3 - порциями по проценту объектов +// ТОПроцентОбъектовВПорции - содержит значение если НастройкаПорцииИзменения = 2 +// ТОЧислоОбъектовВПорции - содержит значение если НастройкаПорцииИзменения = 3 +// ------------------------------------------------------------------------------ +// +// --- Изменение блокируемых реквизитов ----------------------------------------- +// ЕстьФормаРазблокированияРеквизитов - имеет смысл использовать для объектов +// с блокируемыми реквизитами, Истина - если есть форма, для работы +// с блокируемыми реквизитами (ФормаРаботыСБлокируемымиРеквизитами). +// +// ПолноеИмяФормыРаботыСБлокируемымиРеквизитами - строка - полное имя формы для использования +// в функции ОткрытьФормуМодально, Например, +// "Справочник.Номенклатура.Форма.ФормаРаботыСБлокируемымиРеквизитами" +// ------------------------------------------------------------------------------ + +/////////////////////////////////////////////////////////////////////////////// +// Блок процедур и функций работы с историей изменений + +&НаСервере +Процедура ДобавитьИзменениеВИсторию(СтруктураИзменения, ПредставлениеИзменения) + + // Настройки истории изменений это массив структур с ключами: + // Изменение - массив со структурой изменения + // Представление - представление настройки пользователю + Настройки = ХранилищеОбщихНастроек.Загрузить("ГрупповоеИзменениеОбъектов", "ИсторияИзменений/"+ПолноеИмя,, ОбщегоНазначения.ТекущийПользователь()); + + Если Настройки = Неопределено Тогда + Настройки = Новый Массив; + КонецЕсли; + + Найденный = -1; + + Для Индекс = 0 ПО Настройки.ВГраница() Цикл + Если Настройки.Получить(Индекс).Представление = ПредставлениеИзменения Тогда + Найденный = Индекс; + Прервать; + КонецЕсли; + КонецЦикла; + + Если Найденный <> -1 Тогда + Настройки.Удалить(Найденный); + КонецЕсли; + + Настройки.Вставить(0, Новый Структура("Изменение, Представление", СтруктураИзменения, ПредставлениеИзменения)); + + Если Настройки.Количество() > 20 Тогда + Настройки.Удалить(19); + КонецЕсли; + + ХранилищеОбщихНастроек.Сохранить("ГрупповоеИзменениеОбъектов", "ИсторияИзменений/"+ПолноеИмя, Настройки, , ОбщегоНазначения.ТекущийПользователь()); + + ЗагрузитьИсториюОпераций(); + +КонецПроцедуры + +&НаСервере +Процедура ЗагрузитьИсториюОпераций() + + ИсторияОпераций = ХранилищеОбщихНастроек.Загрузить("ГрупповоеИзменениеОбъектов", "ИсторияИзменений/"+ПолноеИмя,, ОбщегоНазначения.ТекущийПользователь()); + + Если ИсторияОпераций = Неопределено Тогда + Возврат; + КонецЕсли; + + ИсторияОперацийСписок.Очистить(); + + Для Каждого ОписаниеОперации Из ИсторияОпераций Цикл + ИсторияОперацийСписок.Добавить(ОписаниеОперации.Изменение, ОписаниеОперации.Представление); + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьОперацииИзменения(МассивОпераций) + + ЕстьЗаблокированные = Ложь; + + Для Каждого ОписаниеИзменения Из МассивОпераций Цикл + + СтруктураПоиска = Новый Структура; + СтруктураПоиска.Вставить("ВидОперации", ОписаниеИзменения.ВидОперации); + + Если ОписаниеИзменения.ВидОперации = 1 Тогда // реквизит объекта + СтруктураПоиска.Вставить("ИмяРеквизита", ОписаниеИзменения.ИмяРеквизита); + Иначе + СтруктураПоиска.Вставить("Свойство", ОписаниеИзменения.Свойство); + КонецЕсли; + + НайденныеСтроки = Объект.Операции.НайтиСтроки(СтруктураПоиска); + + Если НайденныеСтроки.Количество() > 0 Тогда + Если НайденныеСтроки[0].ЗаблокированныйРеквизит Тогда + ЕстьЗаблокированные = Истина; + Продолжить; + КонецЕсли; + НайденныеСтроки[0].Значение = ОписаниеИзменения.Значение; + НайденныеСтроки[0].Изменять = Истина; + КонецЕсли; + + КонецЦикла; + + Если ЕстьЗаблокированные Тогда + Предупреждение(НСтр("ru = 'Некоторые реквизиты заблокированы для изменения, изменения не установлены.'")); + КонецЕсли; + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////// +// Блок вспомогательных процедур и функций + +&НаСервере +Процедура ЗаполнитьДеревоОбъектовДляИзменения(МассивЗаполненных) + + ТаблицаОтработанных = Новый ТаблицаЗначений; + МассивТипов = Новый Массив; + МассивТипов.Добавить(ТипЗнч(Параметры.МассивОбъектов[0])); + ТаблицаОтработанных.Колонки.Добавить("Ссылка", Новый ОписаниеТипов(МассивТипов)); + + Для Каждого Элемент Из МассивЗаполненных Цикл + ТаблицаОтработанных.Добавить().Ссылка = Элемент; + КонецЦикла; + + ОбъектМетаданных = Параметры.МассивОбъектов[0].Метаданные(); + + ВидОбъектаМетаданных = ОбщегоНазначения.ВидОбъектаПоСсылке(Параметры.МассивОбъектов[0]); + + ТекстЗапроса = + "ВЫБРАТЬ + | Ссылка + |Поместить + | Отработанные + |ИЗ + | &ТаблицаОтработанных КАК Отработанные + |; + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка, + | 0 КАК КодОшибки, + | ВЫБОР КОГДА Отработанные.Ссылка ЕСТЬ NULL + | ТОГДА Истина + | ИНАЧЕ Ложь + |КОНЕЦ КАК Изменять,"; + + Если УчитыватьИерархию Тогда + ТекстЗапроса = ТекстЗапроса + " + | ВЫБОР КОГДА Таблица.ПометкаУдаления ТОГДА + | ВЫБОР КОГДА Таблица.ЭтоГруппа ТОГДА 1 + | ИНАЧЕ 3 + | КОНЕЦ + | ИНАЧЕ + | ВЫБОР КОГДА Таблица.ЭтоГруппа ТОГДА 0 + | ИНАЧЕ 2 + | КОНЕЦ + | Конец КАК КодКартинки"; + Иначе + ТекстЗапроса = ТекстЗапроса + " + | ВЫБОР КОГДА Таблица.ПометкаУдаления ТОГДА 3 + | ИНАЧЕ 2 + | КОНЕЦ КАК КодКартинки"; + КонецЕсли; + + СчетчикДопРеквизитов = 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]; + + КонецЕсли; + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизита, ОписаниеТипов, "ИзменяемыеОбъекты", Операция.Представление)); + + КонецЦикла; + + УдаляемыеРеквизиты = Новый Массив; + + Для Каждого ИмяРеквизита Из ИменаУдаляемыхРеквизитов Цикл + УдаляемыеРеквизиты.Добавить("ИзменяемыеОбъекты."+ИмяРеквизита); + КонецЦикла; + + ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты); + + УдаляемыеПоляФормы = Новый Массив; + + Для Каждого ПолеФормы Из Элементы.ОбъектыДляИзменения.ПодчиненныеЭлементы Цикл + Если ТипЗнч(ПолеФормы) = Тип("ПолеФормы") И ПолеФормы.ПутьКДанным = "" Тогда + УдаляемыеПоляФормы.Добавить(ПолеФормы); + КонецЕсли; + КонецЦикла; + + Для Каждого ДобавленныйРеквизит Из ДобавляемыеРеквизиты Цикл + НовыйЭлементФормы = Элементы.Добавить(ПрефиксИмениПоляФормы()+ДобавленныйРеквизит.Имя, Тип("ПолеФормы"), Элементы.ОбъектыДляИзменения); + НовыйЭлементФормы.ПутьКДанным = "ИзменяемыеОбъекты."+ДобавленныйРеквизит.Имя; + КонецЦикла; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция РазницаМассивов(МассивИсточник, МассивВычитаемый) + + Результат = Новый Массив; + + Для Каждого ЭлементМассива Из МассивИсточник Цикл + Если МассивВычитаемый.Найти(ЭлементМассива) = Неопределено Тогда + Результат.Добавить(ЭлементМассива); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////// +// Блок процедур - обработчиков событий элементов формы + +&НаКлиенте +// Обработчик события ПередНачаломДобавления таблицы формы ТаблицаТаблицаОпераций +// +Процедура ТаблицаОперацийПередНачаломИзменения(Элемент, Отказ) + + Если (Элемент.ТекущийЭлемент.Имя = "ТаблицаОперацийИзменять" + ИЛИ Элемент.ТекущийЭлемент.Имя = "ТаблицаОперацийЗначение") + И Элемент.ТекущиеДанные.ЗаблокированныйРеквизит Тогда + ВопросПерейтиКРазблокированиюРеквизитов(); + Отказ = Истина; + Возврат; + КонецЕсли; + + УстановитьОграниченияВыбираемыхТиповИПараметрыВыбора(Элемент); + +КонецПроцедуры + +&НаКлиенте +// Обработчик события выбор таблицы формы ТаблицаТаблицаОпераций +// устанавливает ограничение типа для редактируемого реквизита +// +Процедура ТаблицаОперацийВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Если Поле.Имя = "ТаблицаОперацийЗначение" + И Элемент.ТекущиеДанные.ЗаблокированныйРеквизит Тогда + + ВопросПерейтиКРазблокированиюРеквизитов(); + СтандартнаяОбработка = Ложь; + + Возврат; + + КонецЕсли; + + УстановитьОграниченияВыбираемыхТиповИПараметрыВыбора(Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура ВопросПерейтиКРазблокированиюРеквизитов() + + ТекстВопроса = НСтр("ru = 'Внимание! Реквизит заблокирован, перейти к разблокированию реквизитов?'"); + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Да'")); + Кнопки.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'")); + + Результат = Вопрос(ТекстВопроса, Кнопки, , КодВозвратаДиалога.Да, НСтр("ru = 'Реквизит заблокирован'")); + + Если Результат = КодВозвратаДиалога.Да Тогда + РазрешитьРедактированиеРеквизитов(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьПараметрыВыбораСервер(ПараметрыВыбора, ПараметрыВыбораМассив) + + Для Индекс = 1 по СтрЧислоСтрок(ПараметрыВыбора) Цикл + + ПараметрыВыбораСтрока = СтрПолучитьСтроку(ПараметрыВыбора, Индекс); + + ПозицияИмениПоля = Найти(ПараметрыВыбораСтрока, ";") - 1; + ИмяПоляОтбора = Сред(ПараметрыВыбораСтрока, 1, ПозицияИмениПоля); + ПараметрыВыбораСтрока = Прав(ПараметрыВыбораСтрока, СтрДлина(ПараметрыВыбораСтрока)-ПозицияИмениПоля-1); + ПозицияИмениТипа = Найти(ПараметрыВыбораСтрока, ";") - 1; + ИмяТипа = Сред(ПараметрыВыбораСтрока, 1, ПозицияИмениТипа); + ПараметрыВыбораСтрока = Прав(ПараметрыВыбораСтрока, СтрДлина(ПараметрыВыбораСтрока)-ПозицияИмениТипа-1); + Значение = ПараметрыВыбораСтрока; + + ПараметрыВыбораМассив.Добавить(Новый ПараметрВыбора(ИмяПоляОтбора,XMLЗначение(Тип(ИмяТипа), Значение)) ); + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +// Устанавливает ограничения выбираемых типов значений и параметры выбора +// +Процедура УстановитьОграниченияВыбираемыхТиповИПараметрыВыбора(Элемент) + + Поле = Элемент.ПодчиненныеЭлементы.ТаблицаОперацийЗначение; + + ДопустимыеТипыСтрока = Элемент.ТекущиеДанные.ДопустимыеТипы; + + ДопустимыеТипыМассив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ДопустимыеТипыСтрока, ";"); + + МассивТипов = Новый Массив; + + Для Каждого ТипСтрока Из ДопустимыеТипыМассив Цикл + МассивТипов.Добавить(Тип(ТипСтрока)); + КонецЦикла; + + Поле.ОграничениеТипа = Новый ОписаниеТипов(МассивТипов); + + ПараметрыВыбораМассив = Новый Массив; + + Если НЕ ПустаяСтрока(Элемент.ТекущиеДанные.ПараметрыВыбора) Тогда +#Если ВебКлиент Тогда + УстановитьПараметрыВыбораСервер(Элемент.ТекущиеДанные.ПараметрыВыбора, ПараметрыВыбораМассив) +#Иначе + Для Индекс = 1 по СтрЧислоСтрок(Элемент.ТекущиеДанные.ПараметрыВыбора) Цикл + + ПараметрыВыбораСтрока = СтрПолучитьСтроку(Элемент.ТекущиеДанные.ПараметрыВыбора, Индекс); + + ПозицияИмениПоля = Найти(ПараметрыВыбораСтрока, ";") - 1; + ИмяПоляОтбора = Сред(ПараметрыВыбораСтрока, 1, ПозицияИмениПоля); + ПараметрыВыбораСтрока = Прав(ПараметрыВыбораСтрока, СтрДлина(ПараметрыВыбораСтрока)-ПозицияИмениПоля-1); + ПозицияИмениТипа = Найти(ПараметрыВыбораСтрока, ";") - 1; + ИмяТипа = Сред(ПараметрыВыбораСтрока, 1, ПозицияИмениТипа); + ПараметрыВыбораСтрока = Прав(ПараметрыВыбораСтрока, СтрДлина(ПараметрыВыбораСтрока)-ПозицияИмениТипа-1); + Значение = ПараметрыВыбораСтрока; + + ПараметрыВыбораМассив.Добавить(Новый ПараметрВыбора(ИмяПоляОтбора,XMLЗначение(Тип(ИмяТипа), Значение)) ); + + КонецЦикла; +#КонецЕсли + КонецЕсли; + + Если Не ПустаяСтрока(Элемент.ТекущиеДанные.СвязиПараметровВыбора) Тогда + + Для Индекс = 1 по СтрЧислоСтрок(Элемент.ТекущиеДанные.СвязиПараметровВыбора) Цикл + + СвязьПараметровВыбораСтрока = СтрПолучитьСтроку(Элемент.ТекущиеДанные.СвязиПараметровВыбора, Индекс); + РазложенныеСтроки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СвязьПараметровВыбораСтрока, ";"); + ИмяПараметра = СокрЛП(РазложенныеСтроки[0]); + ИмяРеквизита = СокрЛП(РазложенныеСтроки[1]); + НайденныеСтроки = Объект.Операции.НайтиСтроки(Новый Структура("ВидОперации,ИмяРеквизита", 1, ИмяРеквизита)); + Если НайденныеСтроки.Количество() = 1 Тогда + Значение = НайденныеСтроки[0].Значение; + Если ЗначениеЗаполнено(Значение) Тогда + ПараметрыВыбораМассив.Добавить(Новый ПараметрВыбора(ИмяПараметра, Значение)); + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Поле.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбораМассив); + + ВыборГруппИЭлементов = Элемент.ТекущиеДанные.ВыборГруппИЭлементов; + + Если ВыборГруппИЭлементов <> "" Тогда + Если ВыборГруппИЭлементов = "Группы" Тогда + Поле.ВыборГруппИЭлементов = ГруппыИЭлементы.Группы; + ИначеЕсли ВыборГруппИЭлементов = "ГруппыИЭлементы" Тогда + Поле.ВыборГруппИЭлементов = ГруппыИЭлементы.ГруппыИЭлементы; + ИначеЕсли ВыборГруппИЭлементов = "Элементы" Тогда + Поле.ВыборГруппИЭлементов = ГруппыИЭлементы.Элементы; + Иначе + Поле.ВыборГруппИЭлементов = ГруппыИЭлементы.Авто; + КонецЕсли; + Иначе + Поле.ВыборГруппИЭлементов = ГруппыИЭлементы.Авто; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаОперацийПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) + + Если Элемент.ТекущийЭлемент.Имя = "ТаблицаОперацийЗначение" Тогда + Если ОтменаРедактирования Тогда + + ИначеЕсли НЕ ЗначениеЗаполнено(Элемент.ТекущиеДанные.Значение) Тогда + Элемент.ТекущиеДанные.Изменять = Ложь; + ИзменитьТаблицуОбъектов = Истина; + Иначе + Элемент.ТекущиеДанные.Изменять = Истина; + ИзменитьТаблицуОбъектов = Истина; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбъектыДляИзмененияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Если Поле = Элементы.ОбъектыДляИзмененияСсылка Тогда + СтандартнаяОбработка = Ложь; + ОткрытьОбъектПоСсылке(); + КонецЕсли; + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////// +// Блок процедур - обработчиков событий формы + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если НекорректныйВызовОбработки Тогда + Отказ = Истина; + Предупреждение(НСтр("ru = 'Обработка используется только вместе с объектами информационной базы'"),0,НСтр("ru = ''")); + Возврат; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии() + + СохранитьНастройкиОбработки( + ПолноеИмя, + Объект.ИзменятьВТранзакции, + Объект.ПрерыватьПриОшибке, + ТОНастройкаПорции, + ТОПроцентОбъектовВПорции, + ТОЧислоОбъектовВПорции, + ОбрабатыватьРекурсивно); + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура СохранитьНастройкиОбработки(ПолноеИмя, ИзменятьВТранзакции, ПрерыватьПриОшибке, + ТОНастройкаПорции, ТОПроцентОбъектовВПорции, ТОЧислоОбъектовВПорции, ОбрабатыватьРекурсивно) + + СтруктураНастроек = Новый Структура; + + СтруктураНастроек.Вставить("ИзменятьВТранзакции", ИзменятьВТранзакции); + СтруктураНастроек.Вставить("ПрерыватьПриОшибке", ПрерыватьПриОшибке); + СтруктураНастроек.Вставить("ТОНастройкаПорции", ТОНастройкаПорции); + СтруктураНастроек.Вставить("ТОПроцентОбъектовВПорции", ТОПроцентОбъектовВПорции); + СтруктураНастроек.Вставить("ТОЧислоОбъектовВПорции", ТОЧислоОбъектовВПорции); + СтруктураНастроек.Вставить("ОбрабатыватьРекурсивно", ОбрабатыватьРекурсивно); + + ХранилищеОбщихНастроек.Сохранить("Обработка.ГрупповоеИзменениеОбъектов", ПолноеИмя, СтруктураНастроек, , ОбщегоНазначения.ТекущийПользователь()); + +КонецПроцедуры + +&НаСервере +Процедура ЗагрузитьНастройкиОбработки() + + СтруктураНастроек = ХранилищеОбщихНастроек.Загрузить("Обработка.ГрупповоеИзменениеОбъектов", ПолноеИмя, , ОбщегоНазначения.ТекущийПользователь()); + + Если СтруктураНастроек = Неопределено Тогда + Объект.ИзменятьВТранзакции = Истина; + Объект.ПрерыватьПриОшибке = Истина; + ТОНастройкаПорции = 1; + ТОПроцентОбъектовВПорции = 100; + ТОЧислоОбъектовВПорции = 1; + ОбрабатыватьРекурсивно = Ложь; + Иначе + Объект.ИзменятьВТранзакции = СтруктураНастроек.ИзменятьВТранзакции; + Объект.ПрерыватьПриОшибке = СтруктураНастроек.ПрерыватьПриОшибке; + ТОНастройкаПорции = СтруктураНастроек.ТОНастройкаПорции; + ТОПроцентОбъектовВПорции = СтруктураНастроек.ТОПроцентОбъектовВПорции; + ТОЧислоОбъектовВПорции = СтруктураНастроек.ТОЧислоОбъектовВПорции; + ОбрабатыватьРекурсивно = СтруктураНастроек.ОбрабатыватьРекурсивно; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + НекорректныйВызовОбработки = Ложь; + + Если ТипЗнч(Параметры.МассивОбъектов) <> Тип("Массив") Тогда + НекорректныйВызовОбработки = Истина; + Возврат; + КонецЕсли; + + // Оптимизация, для того, что бы не переформировывать таблицу + // изменяемых объектов при простом перелистывании + ИзменитьТаблицуОбъектов = Ложь; + + МетаданныеОбъекта = Параметры.МассивОбъектов[0].Метаданные(); + + ПолноеИмя = МетаданныеОбъекта.ПолноеИмя(); + + ТекущийПользователь = Пользователи.АвторизованныйПользователь(); + + // Подгружаем настройки обработки + ЗагрузитьНастройкиОбработки(); + + // Подгружаем историю операций с данным типом объектов + ЗагрузитьИсториюОпераций(); + + // Устанавливаем заголовок для таблицы изменяемых объектов + Элементы.ОбъектыДляИзмененияСсылка.Заголовок = МетаданныеОбъекта.Синоним; + + // Объект иерархический + УчитыватьИерархию = ОбъектМетаданныхИерархический(); + + // По переданному составу объектов и типу объекта заполнить допустимые действия с объектом + ЗаполнитьДеревоОбъектовИОпераций(); + + // Если нет заблокированных реквизитов скрываем кнопку "РазрешитьРедактированиеРеквизитов" + Если Объект.Операции.НайтиСтроки( + Новый Структура("ЗаблокированныйРеквизит", Истина) ).Количество() = 0 Тогда + Если Элементы.Найти("РазрешитьРедактированиеРеквизитов") <> Неопределено Тогда + Элементы.РазрешитьРедактированиеРеквизитов.Видимость = Ложь; + КонецЕсли; + Иначе + Если МетаданныеОбъекта.Формы.Найти("РазблокированиеРеквизитов") = Неопределено Тогда + ЕстьФормаРазблокированияРеквизитов = Ложь; + Иначе + ЕстьФормаРазблокированияРеквизитов = Истина; + ПолноеИмяФормыРаботыСБлокируемымиРеквизитами = ПолноеИмя + ".Форма.РазблокированиеРеквизитов"; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьДеревоОбъектовИОпераций() + + МассивЗаполненных = Новый Массив; + ЗаполнитьМассивИзмененных(МассивЗаполненных, ИзменяемыеОбъекты.ПолучитьЭлементы()); + + Объект.ОбъектыДляИзменения.Очистить(); + Объект.Операции.Очистить(); + ИзменяемыеОбъекты.ПолучитьЭлементы().Очистить(); + + ЗаполнитьДеревоОбъектовДляИзменения(МассивЗаполненных); + + ЗаполнитьСплошнойСписокОбъектовДляИзменения(ИзменяемыеОбъекты.ПолучитьЭлементы()); + + ОбъектОбработка = РеквизитФормыВЗначение("Объект"); + ОбъектОбработка.ЗаполнитьТаблицуОперацийСОбъектом(); + ЗначениеВРеквизитФормы(ОбъектОбработка, "Объект"); + + УстановитьСостояниеЭлементовФормы(Элементы, Объект.ОбъектыДляИзменения.Количество()); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////// +// Блок процедур - обработчиков команд + +&НаКлиенте +Процедура ИсторияОпераций(Команда) + + СтандартнаяОбработка = Ложь; + + Если ИсторияОперацийСписок.Количество() = 0 Тогда + Предупреждение(НСтр("ru = 'Для данного типа объектов нет истории ранее выполненных групповых изменений.'")); + Возврат; + КонецЕсли; + + СписокЗначений = Новый СписокЗначений; + + Для Каждого ОписаниеИзменения Из ИсторияОперацийСписок Цикл + СписокЗначений.Добавить(ОписаниеИзменения.Значение, ОписаниеИзменения.Представление); + КонецЦикла; + + Выбор = ВыбратьИзМеню(СписокЗначений, Элементы.ИсторияОпераций); + + Если Выбор <> Неопределено Тогда + УстановитьОперацииИзменения(Выбор.Значение); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Назад(Команда) + + Если Элементы.Страницы.ТекущаяСтраница = Элементы.ИзменениеОбъектов Тогда + Элементы.Страницы.ТекущаяСтраница = Элементы.НастройкаИзменений; + УстановитьСостояниеЭлементовФормы(Элементы); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Далее(Команда) + + ПерейтиНаСтраницуИзмененияОбъектов(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПерейтиНаСтраницуИзмененияОбъектов() + + Если Элементы.Страницы.ТекущаяСтраница = Элементы.НастройкаИзменений Тогда + Элементы.Страницы.ТекущаяСтраница = Элементы.ИзменениеОбъектов; + УстановитьСостояниеЭлементовФормы(Элементы); + Если ИзменитьТаблицуОбъектов Тогда + СформироватьИЗаполнитьДеревоИзменяемыхОбъектов(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОбъектПоСсылкеОбработчикКоманды(Команда) + + ОткрытьОбъектПоСсылке(); + +КонецПроцедуры + +&НаКлиенте +// Обработчик команды "Изменить" +// +Процедура ИзменитьОбработчикКоманды(Команда) + + Если Элементы.ФормаИзменить.Заголовок = НСтр("ru = 'Изменить'") Тогда + + Если Объект.Операции.НайтиСтроки(Новый Структура("Изменять", Истина)).Количество() = 0 Тогда + + ТекстВопроса = НСтр("ru = 'Внимание, не указано ни одного изменения, продолжить?'"); + Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ОКОтмена, , , "Изменение объектов"); + + Если Результат <> КодВозвратаДиалога.ОК Тогда + Возврат; + КонецЕсли; + + КонецЕсли; + + УстановитьКнопкиНаВремяИзменения(Истина); + + ПерейтиНаСтраницуИзмененияОбъектов(); + + ПодключитьОбработчикОжидания("ИзменитьОбъекты", 0.1, Истина); + + ИначеЕсли ТекущееСостояниеИзменения <> Неопределено Тогда + + ТекущееСостояниеИзменения.ПрерватьИзменение = Истина; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьКнопкиНаВремяИзменения(НачалоИзменения) + + Элементы.ФормаНазад.Доступность = НЕ НачалоИзменения; + Элементы.ФормаОтмена.Доступность = НЕ НачалоИзменения; + + Если НачалоИзменения Тогда + Элементы.ФормаИзменить.Заголовок = НСтр("ru = 'Прервать'"); + Иначе + Элементы.ФормаИзменить.Заголовок = НСтр("ru = 'Изменить'"); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ПодготовитьДеревоДляИзменения(КоллекцияЭлементов, ТекущиеИзменяемыеОбъекты) + + КоличествоИзменяемых = 0; + + Для Каждого ИзменяемыйЭлемент Из КоллекцияЭлементов Цикл + ИзменяемыйЭлемент.КодОшибки = 0; + Если ИзменяемыйЭлемент.Изменять Тогда + КоличествоИзменяемых = КоличествоИзменяемых + 1; + ТекущиеИзменяемыеОбъекты.Добавить(ИзменяемыйЭлемент.Ссылка, ИзменяемыйЭлемент.ПолучитьИдентификатор()); + КонецЕсли; + КоличествоИзменяемых = КоличествоИзменяемых + ПодготовитьДеревоДляИзменения(ИзменяемыйЭлемент.ПолучитьЭлементы(), ТекущиеИзменяемыеОбъекты); + КонецЦикла; + + Возврат КоличествоИзменяемых; + +КонецФункции + +&НаКлиенте +// Основной цикл изменения объектов +// +Процедура ИзменитьОбъекты() + + ОчиститьСообщения(); + + ТекущееСостояниеИзменения = Новый Структура; + + ТекущиеИзменяемыеОбъекты = Новый СписокЗначений; + + КоличествоОбъектовДляОбработки = ПодготовитьДеревоДляИзменения(ИзменяемыеОбъекты.ПолучитьЭлементы(), ТекущиеИзменяемыеОбъекты); + + Если КоличествоОбъектовДляОбработки = 0 Тогда + УстановитьКнопкиНаВремяИзменения(Ложь); + Предупреждение(НСтр("ru = 'Не указаны объекты для изменения'")); + Возврат; + КонецЕсли; + + ТекущееСостояниеИзменения.Вставить("ТекущиеИзменяемыеОбъекты", ТекущиеИзменяемыеОбъекты); + + Если Объект.ИзменятьВТранзакции Тогда + + Если ТОНастройкаПорции = 1 Тогда // обработка одним вызовом + + ПоказатьОповещениеПользователя(НСтр("ru = 'Групповое измнение объектов'"), ,НСтр("ru = 'Пожалуйста ждите, обработка может занять некоторое время...'")); + ПоказыватьПроцентОбработанных = Ложь; + + РазмерПорции = КоличествоОбъектовДляОбработки; + + Иначе + + ПоказыватьПроцентОбработанных = Истина; + + Если ТОНастройкаПорции = 2 Тогда // порциями по числу объектов + РазмерПорции = ?(ТОЧислоОбъектовВПорции < КоличествоОбъектовДляОбработки, + ТОЧислоОбъектовВПорции, КоличествоОбъектовДляОбработки); + Иначе // порциями по проценту объектов + РазмерПорции = Окр(КоличествоОбъектовДляОбработки * ТОПроцентОбъектовВПорции / 100); + Если РазмерПорции = 0 Тогда + РазмерПорции = 1; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + Иначе + + Если КоличествоОбъектовДляОбработки >= НетранзакционнаяПорцияГраницаПерехода() Тогда + // Число объектов - постоянная величина + РазмерПорции = НетранзакционнаяПорцияПолученияДанныхОбъектов(); + Иначе + // Число объектов - переменная величина, процент от общего числа + РазмерПорции = Окр(КоличествоОбъектовДляОбработки * НетранзакционнаяПорцияПолученияДанныхПроцент() / 100); + Если РазмерПорции = 0 Тогда + РазмерПорции = 1; + КонецЕсли; + КонецЕсли; + + Состояние(НСтр("ru = 'Обрабатываются объекты...'"), 0, НСтр("ru = 'Групповое измнение объектов'")); + + ПоказыватьПроцентОбработанных = Истина; + КонецЕсли; + + ТекущееСостояниеИзменения.Вставить("ЕстьЭлементыДляОбработки", Истина); + ТекущееСостояниеИзменения.Вставить("ТекущаяПозиция", 0); // позиция последнего обработанного элемента. 1 - первый элемент. + ТекущееСостояниеИзменения.Вставить("КоличествоОшибок", 0); // инициализируем счетчик ошибок + ТекущееСостояниеИзменения.Вставить("КоличествоИзмененных", 0); // инициализируем счетчик измененных + ТекущееСостояниеИзменения.Вставить("ОстанавливатьИзменениеПриОшибке", Объект.ПрерыватьПриОшибке); + ТекущееСостояниеИзменения.Вставить("КоличествоОбъектовДляОбработки", КоличествоОбъектовДляОбработки); + ТекущееСостояниеИзменения.Вставить("РазмерПорции", РазмерПорции); + ТекущееСостояниеИзменения.Вставить("ПоказыватьПроцентОбработанных", ПоказыватьПроцентОбработанных); + ТекущееСостояниеИзменения.Вставить("ПрерватьИзменение", Ложь); + + ПодключитьОбработчикОжидания("ИзменитьПорциюОбъектов", 0.1, Истина); + +КонецПроцедуры + +&НаКлиенте +// Используется для изменения порции объектов +Процедура ИзменитьПорциюОбъектов() + + Перем КоличествоОшибок, КоличествоИзмененных; + + НачальнаяПозиция = ТекущееСостояниеИзменения.ТекущаяПозиция; + ОконечнаяПозиция = ТекущееСостояниеИзменения.ТекущаяПозиция+ТекущееСостояниеИзменения.РазмерПорции; + + Пока Истина Цикл + ПорцияМассив = ПолучитьПорциюОбрабатываемыхОбъектов(НачальнаяПозиция+1, ОконечнаяПозиция); + + // Изменяем порцию на сервере + РезультатИзменения = ИзменитьНаСервере(ПорцияМассив, ТекущееСостояниеИзменения.ОстанавливатьИзменениеПриОшибке); + + // Переносим информацию по обработанным объектам в таблицу + ЗаполнитьСостояниеОбработанных(РезультатИзменения, КоличествоОшибок, КоличествоИзмененных); + + ТекущееСостояниеИзменения.КоличествоОшибок = КоличествоОшибок + ТекущееСостояниеИзменения.КоличествоОшибок; + ТекущееСостояниеИзменения.КоличествоИзмененных = КоличествоИзмененных + ТекущееСостояниеИзменения.КоличествоИзмененных; + + Если НЕ (ТекущееСостояниеИзменения.ОстанавливатьИзменениеПриОшибке И РезультатИзменения.ЕстьОшибки) Тогда + Прервать; + КонецЕсли; + + // При наличии ошибок в транзакции - откатываем всю транзакцию + Если Объект.ИзменятьВТранзакции Тогда + ТекстПредупреждения = НСтр("ru = 'При изменении объектов обнаружены ошибки - изменения отменены.'"); + ПодключитьОбработчикОжидания("ЗавершитьИзменениеОбъектов", 0.1, Истина); + Возврат; // досрочный выход из цикла и процедуры + КонецЕсли; + + ТекстВопроса = НСтр("ru = 'Внимание, при изменении объекта (группы объектов) обнаружены ошибки. + |Прервать изменение объектов и перейти к просмотру ошибок? + |'"); + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Прервать, НСтр("ru = 'Прервать'")); + Кнопки.Добавить(КодВозвратаДиалога.Пропустить, НСтр("ru = 'Продолжить'")); + Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Больше не спрашивать'")); + + Результат = Вопрос(ТекстВопроса, Кнопки, , КодВозвратаДиалога.Прервать, НСтр("ru = 'Ошибки при изменении объектов'")); + + Если Результат = Неопределено Или Результат = КодВозвратаДиалога.Прервать Тогда + ПодключитьОбработчикОжидания("ЗавершитьИзменениеОбъектов", 0.1, Истина); + Возврат; // досрочный выход из цикла и процедуры + КонецЕсли; + + Если Результат = КодВозвратаДиалога.Пропустить ИЛИ Результат = КодВозвратаДиалога.Нет Тогда + // переходим к дообработке объектов порции + + Если Результат = КодВозвратаДиалога.Нет Тогда + // более в этом цикле изменения не останавливаться по ошибке + ТекущееСостояниеИзменения.ОстанавливатьИзменениеПриОшибке = Ложь; + КонецЕсли; + + Если ПорцияМассив.Количество() <= 1 Тогда + Прервать; + КонецЕсли; + + Для Каждого СостояниеОбработанногоОбъекта Из РезультатИзменения.СостояниеОбработки Цикл + НачальнаяПозиция = НачальнаяПозиция + 1; + Если СостояниеОбработанногоОбъекта.Значение.КодОшибки > 1 Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Продолжить; + + КонецЕсли; + КонецЦикла; + + Элементы.ОбъектыДляИзменения.ТекущаяСтрока = ТекущееСостояниеИзменения.ТекущаяПозиция; + + ТекущееСостояниеИзменения.ТекущаяПозиция = ТекущееСостояниеИзменения.ТекущаяПозиция + ТекущееСостояниеИзменения.РазмерПорции; + + Если ТекущееСостояниеИзменения.ПоказыватьПроцентОбработанных Тогда + // вычисляем текущий процент обработанных объектов + ТекущийПроцент = ТекущееСостояниеИзменения.ТекущаяПозиция / ТекущееСостояниеИзменения.КоличествоОбъектовДляОбработки * 100; + Состояние(НСтр("ru = 'Обрабатываются объекты...'"), ТекущийПроцент, НСтр("ru = 'Групповое измнение объектов'")); + КонецЕсли; + + ЕстьЭлементыДляОбработки = ?(ТекущееСостояниеИзменения.ТекущаяПозиция < ТекущееСостояниеИзменения.КоличествоОбъектовДляОбработки, Истина, Ложь); + + Если ЕстьЭлементыДляОбработки И НЕ ТекущееСостояниеИзменения.ПрерватьИзменение Тогда + ПодключитьОбработчикОжидания("ИзменитьПорциюОбъектов", 0.1, Истина); + Иначе + ПодключитьОбработчикОжидания("ЗавершитьИзменениеОбъектов", 0.1, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +// Используется для изменения порции объектов +Процедура ЗавершитьИзменениеОбъектов() + + Если Объект.ИзменятьВТранзакции + И ТОНастройкаПорции = 1 Тогда // обработка одним вызовом + ПоказатьОповещениеПользователя(НСтр("ru = 'Групповое измнение объектов'"), , НСтр("ru = 'Обработка объектов завершена...'")); + КонецЕсли; + + ЗавершающиеДействияПриИзмененииСервер(); + + УстановитьКнопкиНаВремяИзменения(Ложь); + + ОповеститьОбИзменении(ТипЗнч(Параметры.МассивОбъектов[0])); + + ТекущееСостояниеИзменения = Неопределено; + +КонецПроцедуры + +&НаСервере +// Завершающие действия при изменении на сервере. +// - меняется текущая страница с результатом изменения +// - в историю изменений заносится текущее изменение +// +Процедура ЗавершающиеДействияПриИзмененииСервер() + + Если ТекущееСостояниеИзменения.КоличествоОшибок > 0 Тогда + + Элементы.СтраницыПодсказокИзмененияОбъектов.ТекущаяСтраница = + Элементы.СтраницаПодсказкаПослеИзмененияЕстьОшибки; + + Если Объект.ИзменятьВТранзакции Тогда + КоличествоИзмененных = 0; + Иначе + КоличествоИзмененных = Строка(ТекущееСостояниеИзменения.КоличествоИзмененных); + КонецЕсли; + + Элементы.ПодсказкаПослеИзмененияЕстьОшибки.Заголовок = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось изменить объекты. Измененно объектов %1 из %2.'"), + КоличествоИзмененных, + Строка(ТекущееСостояниеИзменения.КоличествоОбъектовДляОбработки)); + + Иначе + Элементы.СтраницыПодсказокИзмененияОбъектов.ТекущаяСтраница = + Элементы.СтраницаПодсказкаУспешноеИзменение; + Элементы.ПодсказкаУспешноеИзменение.Заголовок = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Изменение объектов успешно завершено. + |Изменено объектов: %1.'"), + Строка(ТекущееСостояниеИзменения.КоличествоИзмененных)); + + КонецЕсли; + + КоллекцияОпраций = Объект.Операции.НайтиСтроки(Новый Структура("Изменять", Истина)); + + ОписаниеИзменения = Новый Массив; + ШаблонПредставления = "[Поле]=<Значение>"; + ПредставлениеИзменения = ""; + + Для Каждого ОписаниеОперации Из КоллекцияОпраций Цикл + + СтруктураИзменения = Новый Структура; + СтруктураИзменения.Вставить("ВидОперации", ОписаниеОперации.ВидОперации); + СтруктураИзменения.Вставить("ИмяРеквизита", ОписаниеОперации.ИмяРеквизита); + СтруктураИзменения.Вставить("Свойство", ОписаниеОперации.Свойство); + СтруктураИзменения.Вставить("Значение", ОписаниеОперации.Значение); + + ОписаниеИзменения.Добавить(СтруктураИзменения); + ТекущаяОперация = СтрЗаменить(ШаблонПредставления, "[Поле]", СокрЛП(Строка(ОписаниеОперации.Представление))); + ТекущаяОперация = СтрЗаменить(ТекущаяОперация, "<Значение>", СокрЛП(Строка(ОписаниеОперации.Значение))); + ПредставлениеИзменения = ПредставлениеИзменения + ТекущаяОперация +"; "; + КонецЦикла; + + ПредставлениеИзменения = Лев(ПредставлениеИзменения, СтрДлина(ПредставлениеИзменения) - 2); + + ДобавитьИзменениеВИсторию(ОписаниеИзменения, ПредставлениеИзменения); + +КонецПроцедуры + +&НаКлиенте +// Параметры СостояниеОбработки - соответствие, +// ключ - ссылка на объект, значение - структура с ключами КодОшибки,СообщениеОбОшибке +// КодОшибки - 0 -ошибок нет +// СообщениеОбОшибке - текстовое представление ошибки +// +Процедура ЗаполнитьСостояниеОбработанных(РезультатИзменения, КоличествоОшибок, КоличествоИзмененных) + + КоличествоОшибок = 0; + КоличествоИзмененных = 0; + + Для Каждого СостояниеОбработанногоОбъекта Из РезультатИзменения.СостояниеОбработки Цикл + + НомерСтроки = -1; + + Идентификатор = Число(ТекущееСостояниеИзменения.ТекущиеИзменяемыеОбъекты.НайтиПоЗначению(СостояниеОбработанногоОбъекта.Ключ).Представление); + + ЭлементДерева = ИзменяемыеОбъекты.НайтиПоИдентификатору(Идентификатор); + + ЭлементДерева.КодОшибки = СостояниеОбработанногоОбъекта.Значение.КодОшибки; + + Если СостояниеОбработанногоОбъекта.Значение.КодОшибки > 1 Тогда + КоличествоОшибок = КоличествоОшибок + 1; + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + СостояниеОбработанногоОбъекта.Значение.СообщениеОбОшибке + + "(" + Строка(СостояниеОбработанногоОбъекта.Ключ) + ")", , + "ИзменяемыеОбъекты["+Строка(Идентификатор)+"].Ссылка"); + Иначе + КоличествоИзмененных = КоличествоИзмененных + 1; + + Если НЕ (Объект.ИзменятьВТранзакции И РезультатИзменения.ЕстьОшибки) Тогда + Для Каждого ИзмененныйРеквизит Из СостояниеОбработанногоОбъекта.Значение.ЗначенияИзмененныхРеквизитов Цикл + ИмяСвязанногоРеквизита = ПрефиксИмениРеквизита() + ИзмененныйРеквизит.Ключ; + Если ЭлементДерева.Свойство(ИмяСвязанногоРеквизита) Тогда + ЭлементДерева[ИмяСвязанногоРеквизита] = ИзмененныйРеквизит.Значение; + КонецЕсли; + КонецЦикла; + Для Каждого ИзмененныйРеквизит Из СостояниеОбработанногоОбъекта.Значение.ЗначенияИзмененныхДопРеквизитов Цикл + Если ЭлементДерева.Свойство(ИзмененныйРеквизит.Ключ) Тогда + ЭлементДерева[ИзмененныйРеквизит.Ключ] = ИзмененныйРеквизит.Значение; + КонецЕсли; + КонецЦикла; + Для Каждого ИзмененныйРеквизит Из СостояниеОбработанногоОбъекта.Значение.ЗначенияИзмененныхДопСведений Цикл + Если ЭлементДерева.Свойство(ИзмененныйРеквизит.Ключ) Тогда + ЭлементДерева[ИзмененныйРеквизит.Ключ] = ИзмененныйРеквизит.Значение; + КонецЕсли; + КонецЦикла; + + ЭлементДерева.Изменять = Ложь; + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +// Получает множество ссылок на обрабатываемые объекты в интервале +// +// Параметры +// НижняяГраница - индекс элемента. 1 - первый элемент +// ВерхняяГраница - индекс элемента, 1 - первый элемент +// +Функция ПолучитьПорциюОбрабатываемыхОбъектов(НижняяГраница, ВерхняяГраница) + + Порция = Новый Массив; + + Для Индекс = НижняяГраница По ВерхняяГраница Цикл + Если Индекс <= ТекущееСостояниеИзменения.КоличествоОбъектовДляОбработки Тогда + Порция.Добавить( + ИзменяемыеОбъекты.НайтиПоИдентификатору( + Число(ТекущееСостояниеИзменения.ТекущиеИзменяемыеОбъекты.Получить(Индекс-1).Представление)).Ссылка); + КонецЕсли; + КонецЦикла; + + Возврат Порция; + +КонецФункции + +&НаСервере +Функция ИзменитьНаСервере(ОбъектыДляОбработки, знач ОстанавливатьИзменениеПриОшибке) + + Результат = РеквизитФормыВЗначение("Объект").ВыполнитьИзменениеОбъектов(ОбъектыДляОбработки, ОстанавливатьИзменениеПриОшибке); + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура НастроитьПараметрыИзменения(Команда) + + Настройки = Новый Структура; + + Настройки.Вставить("ИзменятьВТранзакции", Объект.ИзменятьВТранзакции); + Настройки.Вставить("ОбрабатыватьРекурсивно", ОбрабатыватьРекурсивно); + Настройки.Вставить("ПрерыватьПриОшибке", Объект.ПрерыватьПриОшибке); + Настройки.Вставить("НастройкаПорции", ТОНастройкаПорции); + Настройки.Вставить("ПроцентОбъектовВПорции", ТОПроцентОбъектовВПорции); + Настройки.Вставить("ЧислоОбъектовВПорции", ТОЧислоОбъектовВПорции); + Настройки.Вставить("УчитыватьИерархию", УчитыватьИерархию); + + Результат = ОткрытьФормуМодально("Обработка.ГрупповоеИзменениеОбъектов.Форма.Настройка", Настройки); + + ПереформироватьСоставОперацийИДеревоОбъектов = Ложь; + + Если ТипЗнч(Результат) = Тип("Структура") Тогда + Если УчитыватьИерархию И ОбрабатыватьРекурсивно <> Результат.ОбрабатыватьРекурсивно Тогда + ОбрабатыватьРекурсивно = Результат.ОбрабатыватьРекурсивно; + ПереформироватьСоставОперацийИДеревоОбъектов = Истина; + КонецЕсли; + Объект.ИзменятьВТранзакции = Результат.ИзменятьВТранзакции; + Объект.ПрерыватьПриОшибке = Результат.ПрерыватьПриОшибке; + ТОНастройкаПорции = Результат.НастройкаПорции; + ТОПроцентОбъектовВПорции = Результат.ПроцентОбъектовВПорции; + ТОЧислоОбъектовВПорции = Результат.ЧислоОбъектовВПорции; + КонецЕсли; + + Если ПереформироватьСоставОперацийИДеревоОбъектов Тогда + ЗаполнитьДеревоОбъектовИОпераций(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПерейтиВЖурналРегистрации(Команда) + + ПараметрыЖР = Новый Структура("Пользователь", ТекущийПользователь); + + ОткрытьФормуМодально("Обработка.ЖурналРегистрации.Форма", ПараметрыЖР, ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура РазрешитьРедактированиеРеквизитовОбработчикКоманды(Команда) + + РазрешитьРедактированиеРеквизитов(); + +КонецПроцедуры + +&НаКлиенте +Процедура РазрешитьРедактированиеРеквизитов() + + ЗаблокированныеРеквизитыСтроки = Объект.Операции.НайтиСтроки(Новый Структура("ЗаблокированныйРеквизит", Истина)); + + Если ЕстьФормаРазблокированияРеквизитов Тогда + + РазрешенныеРеквизиты = ОткрытьФормуМодально(ПолноеИмяФормыРаботыСБлокируемымиРеквизитами); + + Если ТипЗнч(РазрешенныеРеквизиты) = Тип("Массив") + И РазрешенныеРеквизиты.Количество() > 0 Тогда + + Для Каждого ОписаниеОперацииСтрока Из ЗаблокированныеРеквизитыСтроки Цикл + Если ОписаниеОперацииСтрока.ЗаблокированныйРеквизит + И РазрешенныеРеквизиты.Найти(ОписаниеОперацииСтрока.ИмяРеквизита) <> Неопределено Тогда + ОписаниеОперацииСтрока.ЗаблокированныйРеквизит = Ложь; + КонецЕсли; + КонецЦикла; + + Если Объект.Операции.НайтиСтроки(Новый Структура("ЗаблокированныйРеквизит", Истина)).Количество() = 0 Тогда + Элементы.РазрешитьРедактированиеРеквизитов.Доступность = Ложь; + КонецЕсли; + + КонецЕсли; + Иначе + + МассивСсылок = Новый Массив; + + Для Каждого СтрокаИзменяемыйОбъект Из ИзменяемыеОбъекты Цикл + МассивСсылок.Добавить(СтрокаИзменяемыйОбъект.Ссылка); + КонецЦикла; + + СинонимыРеквизитов = Новый Массив; + + Для Каждого ОписаниеОперацииСтрока Из ЗаблокированныеРеквизитыСтроки Цикл + СинонимыРеквизитов.Добавить(ОписаниеОперацииСтрока.Представление); + КонецЦикла; + + Если ЗапретРедактированияРеквизитовОбъектовКлиент.ПроверитьСсылкиНаОбъект(МассивСсылок, СинонимыРеквизитов) Тогда + Элементы.РазрешитьРедактированиеРеквизитов.Доступность = Ложь; + + Для Каждого ОписаниеОперацииСтрока Из ЗаблокированныеРеквизитыСтроки Цикл + ОписаниеОперацииСтрока.ЗаблокированныйРеквизит = Ложь; + КонецЦикла; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОбъектПоСсылке() + + СтруктураПараметров = Новый Структура; + СтруктураПараметров.Вставить("ТолькоПросмотр", Истина); + СтруктураПараметров.Вставить("Ключ", Элементы.ОбъектыДляИзменения.ТекущиеДанные.Ссылка); + + ОткрытьФорму(ПолноеИмя + ".ФормаОбъекта", СтруктураПараметров); + +КонецПроцедуры + +&НаКлиенте +Процедура ПометкаИзмененияПометитьВсе(Команда) + + УстановитьЗначениеПометкиИзменения(ИзменяемыеОбъекты.ПолучитьЭлементы(), Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПометкаИзмененияСнятьВсе(Команда) + + УстановитьЗначениеПометкиИзменения(ИзменяемыеОбъекты.ПолучитьЭлементы(), Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьЗначениеПометкиИзменения(КоллекцияЭлементов, Значение) + + Для Каждого ЭлементКоллекции Из КоллекцияЭлементов Цикл + ЭлементКоллекции.Изменять = Значение; + УстановитьЗначениеПометкиИзменения(ЭлементКоллекции.ПолучитьЭлементы(), Значение); + КонецЦикла; + +КонецПроцедуры + + +/////////////////////////////////////////////////////////////////////////////// +// Служебные функции + +&НаКлиентеНаСервереБезКонтекста +Функция ПроверитьНеизменяемыйРеквизит(ИмяРеквизита) + + Если ИмяРеквизита = "Ссылка" + ИЛИ ИмяРеквизита = "Изменять" + ИЛИ ИмяРеквизита = "КодОшибки" + ИЛИ ИмяРеквизита = "КодКартинки" + Тогда + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; + +КонецФункции + +&НаСервере +Функция ОбъектМетаданныхИерархический() + + СсылкаПервого = Параметры.МассивОбъектов[0]; + ВидОбъектаПоСсылке = ОбщегоНазначения.ВидОбъектаПоСсылке(СсылкаПервого); + + Если ((ВидОбъектаПоСсылке = "Справочник" ИЛИ ВидОбъектаПоСсылке = "ПланВидовХарактеристик") И СсылкаПервого.Метаданные().Иерархический) + ИЛИ (ВидОбъектаПоСсылке = "ПланСчетов") Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ИмеетПрефикс(ИмяРеквизита, Префикс) + + Возврат Лев(ИмяРеквизита, СтрДлина(Префикс)) = Префикс; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ПрефиксИмениРеквизита() + Возврат "Реквизит_"; +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ПрефиксИмениДопРеквизита() + Возврат "ДопРеквизит_"; +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ПрефиксИмениДопСведения() + Возврат "ДопСведение_"; +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ПрефиксИмениПоляФормы() + Возврат "Элемент_"; +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция НетранзакционнаяПорцияГраницаПерехода() + + Возврат 100; // если в списке изменяемых более 100 объектов + // изменение происходит для постоянного количества объектов + // см . НетранзакционнаяПорцияПолученияДанныхОбъектов() + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция НетранзакционнаяПорцияПолученияДанныхПроцент() + + Возврат 10; // если в списке изменяемых менее 100 объектов + // изменение происходит порциями по проценту объектов от общей массы + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция НетранзакционнаяПорцияПолученияДанныхОбъектов() + + Возврат 10; // если в списке изменяемых более 100 объектов + // изменение происходит порциями по постоянному + // числу объектов + +КонецФункции diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ManagerModule.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ObjectModule.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ObjectModule.bsl new file mode 100644 index 000000000..ca3e8ff1b --- /dev/null +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ObjectModule.bsl @@ -0,0 +1,736 @@ +// Описание обработки +// Табличная часть Операции - содержит набор информации, описывающей изменения. +// Одна запись при этом описывает одно изменение. +// Реквизиты табличной части: +// ВидОперации - число - описывает ЧТО делать: +// 1 - изменение реквизита +// 2 - изменение дополнительного реквизита +// 3 - изменение дополнительного свойства +// ИмяРеквизита - строка - имя изменяемого реквизита (вид операции = 1) +// Свойство - ПВХ - ссылка на изменяемое свойство (вид операции = 2 или 3) +// Представление - строка - представление операции для пользователя, +// при ВидОперации = 1 - синоним реквизита +// при ВидОперации - 2 и 3 - наименование свойства +// Изменять - Булево - индикатор того, что операция должна быть совершена +// единственный способ очистки значений +// Значение - Новое значение +// ЗаблокированныйРеквизит - Булево - это заблокированный реквизит +// ДопустимыеТипы - Строка - содержит перечисление названий типов (через ";") +// + +Перем НетОшибок, + Ошибка_НеКлассифицированная, // устанавливается, если нельзя определить точную причину + Ошибка_ОбработкиПроверкиЗаполнения, // возникает, если обработка проверки заполнения вернула отказ + Ошибка_ЗаписиОбъекта, // возникает, если во время записи объекта возникло исключение + Ошибка_БлокировкиОбъекта, // возникает, при попытке блокировки объекта + Ошибка_ЗаписиДопСведений; // возникает, при попытке записи дополнительных сведений + +Перем УправлениеСвойствамиМодуль; + +// Процедура заполняет таблицу операций объекта: +// 1. Реквизиты +// 2. Свойства +// +Процедура ЗаполнитьТаблицуОперацийСОбъектом() Экспорт + + Перем + ИспользуетсяЗапретРедактированияРеквизитов; + + ПервыйИзменяемый = ОбъектыДляИзменения[0].Ссылка; + + ОбъектМетаданных = ПервыйИзменяемый.Метаданные(); + + // Получаем менеджер объекта для получения массивов не редактируемых + // интерактивно и блокируемых реквизитов + МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); + + БлокируемыеРеквизиты = Новый Массив; + + // Пытаемся определить, есть ли у объекта блокируемые реквизиты (подсистема запрета редактирования + // реквизитов объектов). Для этого в блоке Попытка .. Исключение пытаемся позвать у объекта метод + // ПолучитьБлокируемыеРеквизитыОбъекта. + Попытка + БлокируемыеРеквизитыОписание = МенеджерОбъекта.ПолучитьБлокируемыеРеквизитыОбъекта(); + Для Каждого БлокируемыйРеквизитОписание Из БлокируемыеРеквизитыОписание Цикл + БлокируемыеРеквизиты.Добавить( СокрЛП ( + СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + БлокируемыйРеквизитОписание, ";")[0] ) ); + КонецЦикла; + Исключение + КонецПопытки; + + Попытка + НеРедактируемые = МенеджерОбъекта.ПолучитьНеРедактируемыеИнтерактивноРеквизиты(); + Исключение + НеРедактируемые = Новый Массив; + КонецПопытки; + + ФильтруемыеРеквизиты = ПолучитьФильтрРедактированияПоТипу(ОбъектМетаданных); + + ////////////////////////////////////////////////////////////////////////////////////////// + // Фильтрация по отключенным функциональными опциями + + ЗакрытыеФункциональнымиОпциями = Новый ТаблицаЗначений; + ЗакрытыеФункциональнымиОпциями.Колонки.Добавить("ИмяРеквизита", Новый ОписаниеТипов("Строка")); + + Для Каждого ОписаниеФО Из Метаданные.ФункциональныеОпции Цикл + + Если СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ОписаниеФО.Хранение.ПолноеИмя(), ".")[0] <> "Константа" Тогда + Продолжить; + КонецЕсли; + ЗначениеФО = ПолучитьФункциональнуюОпцию(ОписаниеФО.Имя); + + Если ТипЗнч(ЗначениеФО) <> Тип("Булево") Тогда + Продолжить; + КонецЕсли; + + Если ЗначениеФО Тогда + Продолжить; + КонецЕсли; + + Для Каждого РеквизитОМ Из ОбъектМетаданных.Реквизиты Цикл + Если ОписаниеФО.Состав.Содержит(РеквизитОМ) Тогда + НоваяСтрока = ЗакрытыеФункциональнымиОпциями.Добавить(); + НоваяСтрока.ИмяРеквизита = РеквизитОМ.Имя; + КонецЕСли; + КонецЦикла; + КонецЦикла; + + ЗакрытыеФункциональнымиОпциями.Свернуть("ИмяРеквизита"); + + Для Каждого ЗакрытыйФО Из ЗакрытыеФункциональнымиОпциями Цикл + ФильтруемыеРеквизиты.Добавить(ЗакрытыйФО.ИмяРеквизита); + КонецЦикла; + + // Фильтрация по отключенным функциональными опциями + ////////////////////////////////////////////////////////////////////////////////////////// + + + Операции.Очистить(); + + ДобавитьРеквизитыВНабор(ОбъектМетаданных.СтандартныеРеквизиты, + НеРедактируемые, + ФильтруемыеРеквизиты, + БлокируемыеРеквизиты); + + ДобавитьРеквизитыВНабор(ОбъектМетаданных.Реквизиты, + НеРедактируемые, + ФильтруемыеРеквизиты, + БлокируемыеРеквизиты); + + Операции.Сортировать("Представление Возр"); + + Если УправлениеСвойствамиМодуль <> Неопределено Тогда + ИспользуютсяДопРеквизиты = УправлениеСвойствамиМодуль.ИспользоватьДопРеквизиты(ОбъектыДляИзменения[0].Ссылка); + ИспользуютсяДопСведения = УправлениеСвойствамиМодуль.ИспользоватьДопСведения (ОбъектыДляИзменения[0].Ссылка); + + Если УправлениеСвойствамиМодуль <> Неопределено И (ИспользуютсяДопРеквизиты ИЛИ ИспользуютсяДопСведения) Тогда + ДобавитьДополнительныеРеквизитыИСведенияВНабор(); + КонецЕсли; + Иначе + ИспользуютсяДопРеквизиты = Ложь; + ИспользуютсяДопСведения = Ложь; + КонецЕсли; + +КонецПроцедуры + +// Выполняет изменение в объектах +// +// Параметры: +// ОбъектыМассив - массив ссылок, подмножество (или полное множество) +// ссылок из ОбъектыДляИзменения, необязательный +// УправлениеТранзакцией - булево - используется функцией при рекурсивном вызове, +// что бы не устанавливать (не завершать) транзакцию +// +Функция ВыполнитьИзменениеОбъектов(ОбрабатываемыеОбъекты = Неопределено, + знач ОстанавливатьИзменениеПриОшибке = Неопределено) Экспорт + + РезультатИзменения = Новый Структура("ЕстьОшибки, СостояниеОбработки"); + РезультатИзменения.ЕстьОшибки = Ложь; + РезультатИзменения.СостояниеОбработки = Новый Соответствие; + + Если ОстанавливатьИзменениеПриОшибке = Неопределено Тогда + ОстанавливатьИзменениеПриОшибке = ПрерыватьПриОшибке; + КонецЕсли; + + Если ОбрабатываемыеОбъекты = Неопределено Тогда + ОбрабатываемыеОбъекты = Новый Массив; + Для Каждого СтрокаИзменяемыйОбъект Из ОбъектыДляИзменения Цикл + ОбрабатываемыеОбъекты.Добавить(СтрокаИзменяемыйОбъект.Ссылка); + КонецЦикла; + КонецЕсли; + + ПроверятьНаГруппу = ПроверятьНаГруппу(ОбрабатываемыеОбъекты[0]); + + Если ИзменятьВТранзакции Тогда + НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); + КонецЕсли; + + ОперацииИзменения = Операции.НайтиСтроки(Новый Структура("Изменять", Истина)); + + Для Каждого Ссылка Из ОбрабатываемыеОбъекты Цикл + + ИзменяемыйОбъект = Ссылка.ПолучитьОбъект(); + + Попытка + ЗаблокироватьДанныеДляРедактирования(ИзменяемыйОбъект.Ссылка); + Исключение + Инфо = ИнформацияОбОшибке(); + КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Инфо); + ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, Ошибка_БлокировкиОбъекта, КраткоеПредставлениеОшибки); + Если ИзменятьВТранзакции Тогда + ОтменитьТранзакцию(); + Возврат РезультатИзменения; + КонецЕсли; + Если ОстанавливатьИзменениеПриОшибке Тогда + Возврат РезультатИзменения; + КонецЕсли; + Продолжить; + КонецПопытки; + + ИзменяемыеРеквизитыОбъекта = Новый Массив; + ИзменяемыеДопРеквизитыОбъекта = Новый Соответствие; + ИзменяемыеДопСведенияОбъекта = Новый Соответствие; + + МассивЗаписейДопСведений = Новый Массив; + + /////////////////////////////////////////////////////////////////////////////////////// + // Отбор операций изменения по каждому объекту + // + + Для Каждого Операция Из ОперацииИзменения Цикл + + Если Операция.ВидОперации = 1 Тогда // изменение реквизита + + // для групп не устанавливаем реквизиты, которых у них нет + Если ПроверятьНаГруппу И ИзменяемыйОбъект.ЭтоГруппа Тогда + ЭтоСтандартныйРеквизит = Ложь; + Для Каждого ОписаниеСтандартногоРеквизита Из ИзменяемыйОбъект.Метаданные().СтандартныеРеквизиты Цикл + Если ОписаниеСтандартногоРеквизита.Имя = Операция.ИмяРеквизита Тогда + ЭтоСтандартныйРеквизит = Истина; + КонецЕсли; + КонецЦикла; + Если НЕ ЭтоСтандартныйРеквизит Тогда + Продолжить; + КонецЕсли; + КонецЕсли; + + ИзменяемыйОбъект[Операция.ИмяРеквизита] = Операция.Значение; + ИзменяемыеРеквизитыОбъекта.Добавить(Операция.ИмяРеквизита); + + ИначеЕсли Операция.ВидОперации = 2 Тогда // изменение доп реквизита + + Если Не СвойствоНужноИзменять(ИзменяемыйОбъект.Ссылка, Операция.Свойство) Тогда + Продолжить; + КонецЕсли; + + НайденнаяСтрока = ИзменяемыйОбъект.ДополнительныеРеквизиты.Найти(Операция.Свойство, "Свойство"); + + Если НайденнаяСтрока = Неопределено Тогда + НайденнаяСтрока = ИзменяемыйОбъект.ДополнительныеРеквизиты.Добавить(); + НайденнаяСтрока.Свойство = Операция.Свойство; + КонецЕсли; + + НайденнаяСтрока.Значение = Операция.Значение; + + ИмяРеквизитаФормы = ПрефиксИмениДопРеквизита() + СтрЗаменить(Строка(Операция.Свойство.УникальныйИдентификатор()), "-", "_"); + ИзменяемыеДопРеквизитыОбъекта.Вставить(ИмяРеквизитаФормы, Операция.Значение); + + ИначеЕсли Операция.ВидОперации = 3 Тогда // изменение доп сведения + + Если Не СвойствоНужноИзменять(ИзменяемыйОбъект.Ссылка, Операция.Свойство) Тогда + Продолжить; + КонецЕсли; + + МенеджерЗаписи = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи(); + + МенеджерЗаписи.Объект = ИзменяемыйОбъект.Ссылка; + МенеджерЗаписи.Свойство = Операция.Свойство; + МенеджерЗаписи.Значение = Операция.Значение; + + МассивЗаписейДопСведений.Добавить(МенеджерЗаписи); + + ИмяРеквизитаФормы = ПрефиксИмениДопСведения() + СтрЗаменить(Строка(Операция.Свойство.УникальныйИдентификатор()), "-", "_"); + ИзменяемыеДопСведенияОбъекта.Вставить(ИмяРеквизитаФормы, Операция.Значение); + + КонецЕсли; + + КонецЦикла; // Для Каждого Операция Из ОперацииИзменения Цикл + + // + // Отбор операций изменения по каждому объекту + /////////////////////////////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////////////////////////// + // Блок обработки проверки заполнения + // + + ПрерватьИзменение = Ложь; + ПроверкаЗаполненияУспешно = Истина; + + Попытка + Если ИзменяемыйОбъект.ПроверитьЗаполнение() Тогда + + Иначе + ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, Ошибка_ОбработкиПроверкиЗаполнения, + НСтр("ru = 'Ошибка проверки заполнения.'")+ПолучитьСтрокуСообщенийОбОшибках()); + Если ОстанавливатьИзменениеПриОшибке Или ИзменятьВТранзакции Тогда + ПрерватьИзменение = Истина; + КонецЕсли; + ПроверкаЗаполненияУспешно = Ложь; + КонецЕсли; + Исключение + Инфо = ИнформацияОбОшибке(); + КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Инфо); + ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, Ошибка_НеКлассифицированная, КраткоеПредставлениеОшибки); + Если ОстанавливатьИзменениеПриОшибке Или ИзменятьВТранзакции Тогда + ПрерватьИзменение = Истина; + КонецЕсли; + ПроверкаЗаполненияУспешно = Ложь; + КонецПопытки; + + Если ПрерватьИзменение Тогда + Если ИзменятьВТранзакции Тогда + ОтменитьТранзакцию(); + КонецЕсли; + + Возврат РезультатИзменения; + КонецЕсли; + + Если НЕ ПроверкаЗаполненияУспешно Тогда + Продолжить; + КонецЕсли; + + // + // Блок обработки проверки заполнения + /////////////////////////////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////////////////////////// + // Блок записи дополнительных сведений + // + + Если МассивЗаписейДопСведений.Количество() > 0 Тогда + + Если НЕ ИзменятьВТранзакции Тогда + // Если транзакция при изменении объектов не используется, включаем ее + // для изменения доп сведений в регистре + НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); + КонецЕсли; + + Попытка + Для Каждого МенеджерЗаписи Из МассивЗаписейДопСведений Цикл + МенеджерЗаписи.Записать(Истина); + КонецЦикла; + Исключение + Инфо = ИнформацияОбОшибке(); + + КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Инфо); + ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, Ошибка_ЗаписиДопСведений, КраткоеПредставлениеОшибки); + + ОтменитьТранзакцию(); + + Если ИзменятьВТранзакции ИЛИ ОстанавливатьИзменениеПриОшибке Тогда + Возврат РезультатИзменения; + КонецЕсли; + КонецПопытки; + + КонецЕсли; + + // + // Блок записи дополнительных сведений + /////////////////////////////////////////////////////////////////////////////////////// + + Попытка + ИзменяемыйОбъект.Записать(); + Исключение + Инфо = ИнформацияОбОшибке(); + Отказ = Истина; + КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Инфо); + ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, + Ошибка_ЗаписиОбъекта, + КраткоеПредставлениеОшибки + Символы.ПС + ПолучитьСтрокуСообщенийОбОшибках()); + Если ИзменятьВТранзакции Тогда // отменяем транзакцию на любом уровне рекурсии + ОтменитьТранзакцию(); + КонецЕсли; + Если ПрерыватьПриОшибке Тогда + Возврат РезультатИзменения; + КонецЕсли; + КонецПопытки; + + // Фиксируем транзакцию записи доп. свойств если запись объектов происходит + // не в транзакции + Если НЕ ИзменятьВТранзакции И МассивЗаписейДопСведений.Количество() > 0 Тогда + ЗафиксироватьТранзакцию(); + КонецЕсли; + + ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, НетОшибок,, + ИзменяемыйОбъект, ИзменяемыеРеквизитыОбъекта, + ИзменяемыеДопРеквизитыОбъекта, ИзменяемыеДопСведенияОбъекта); + + РазблокироватьДанныеДляРедактирования(ИзменяемыйОбъект.Ссылка); + + КонецЦикла; + + Если ИзменятьВТранзакции Тогда + ЗафиксироватьТранзакцию(); + КонецЕсли; + + Возврат РезультатИзменения; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////// +// Блок служебных процедур и функций + +Функция СвойствоНужноИзменять(Ссылка, Свойство) + + Если УправлениеСвойствамиМодуль = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + СтрокаИзменяемогоОбъекта = ОбъектыДляИзменения.Найти(Ссылка, "Ссылка"); + + Если СтрокаИзменяемогоОбъекта = Неопределено Тогда + Если НЕ УправлениеСвойствамиМодуль.ПроверитьСвойствоУОбъекта(Ссылка, Свойство) Тогда + Возврат Ложь; + КонецЕсли; + Иначе + СвойствоНайдено = Ложь; + + Если Свойство.ЭтоДополнительноеСведение Тогда + КоллекцияСвойств = СтрокаИзменяемогоОбъекта.СоставДопСведений; + Иначе + КоллекцияСвойств = СтрокаИзменяемогоОбъекта.СоставДопРеквизитов; + КонецЕсли; + + Если ПустаяСтрока(КоллекцияСвойств) Тогда + Возврат Ложь; + КонецЕсли; + + Для ИндексСтроки = 1 По СтрЧислоСтрок(КоллекцияСвойств) Цикл + СтрокаУИд = СтрПолучитьСтроку(КоллекцияСвойств, ИндексСтроки); + СвойствОбъекта = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолучитьСсылку(Новый УникальныйИдентификатор(СокрЛП(СтрокаУИд))); + Если Свойство = СвойствОбъекта Тогда // свойство найдено у объекта + СвойствоНайдено = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если Не СвойствоНайдено Тогда + Возврат Ложь; + КонецЕсли; + + КонецЕсли; + + Возврат Истина; + +КонецФункции + +Функция ПолучитьСтрокуСообщенийОбОшибках() + + ПредставлениеОшибки = ""; + МассивСообщений = ПолучитьСообщенияПользователю(Истина); + + Для Каждого СообщениеПользователю Из МассивСообщений Цикл + ПредставлениеОшибки = ПредставлениеОшибки + СообщениеПользователю.Текст + Символы.ПС; + КонецЦикла; + + Возврат ПредставлениеОшибки; + +КонецФункции + +Процедура ЗаполнитьРезультатИзменения(Результат, Ссылка, КодОшибки, СообщениеОбОшибке = "", + ИзменяемыйОбъект = Неопределено, ИзменяемыеРеквизитыОбъекта = Неопределено, + ИзменяемыеДопРеквизитыОбъекта = Неопределено, ИзменяемыеДопСведенияОбъекта = Неопределено) + + СостояниеИзменения = Новый Структура("КодОшибки,СообщениеОбОшибке"); + + Если КодОшибки = НетОшибок Тогда + СостояниеИзменения.Вставить("ЗначенияИзмененныхРеквизитов", Новый Соответствие); + Если ИзменяемыеРеквизитыОбъекта <> Неопределено Тогда + Для Каждого ИмяРеквизита Из ИзменяемыеРеквизитыОбъекта Цикл + СостояниеИзменения.ЗначенияИзмененныхРеквизитов.Вставить(ИмяРеквизита, ИзменяемыйОбъект[ИмяРеквизита]); + КонецЦикла; + КонецЕсли; + СостояниеИзменения.Вставить("ЗначенияИзмененныхДопРеквизитов", ИзменяемыеДопРеквизитыОбъекта); + СостояниеИзменения.Вставить("ЗначенияИзмененныхДопСведений", ИзменяемыеДопСведенияОбъекта); + Иначе + Результат.ЕстьОшибки = Истина; + КонецЕсли; + + СостояниеИзменения.КодОшибки = КодОшибки; + СостояниеИзменения.СообщениеОбОшибке = СообщениеОбОшибке; + + Результат.СостояниеОбработки.Вставить(Ссылка, СостояниеИзменения); + +КонецПроцедуры + +Функция ПрефиксИмениДопРеквизита() + Возврат "ДопРеквизит_"; +КонецФункции + +Функция ПрефиксИмениДопСведения() + Возврат "ДопСведение_"; +КонецФункции + +Функция ПроверятьНаГруппу(Ссылка) + + ВидОбъекта = ОбщегоНазначения.ВидОбъектаПоСсылке(Ссылка); + МетаданныеОбъекта = Ссылка.Метаданные(); + + Если ВидОбъекта = "Справочник" + И МетаданныеОбъекта.Иерархический + И МетаданныеОбъекта.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда + + Возврат Истина; + + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +Процедура ДобавитьДополнительныеРеквизитыИСведенияВНабор() + + ТаблицаДопРеквизитов = Новый ТаблицаЗначений; + ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения")); + ТаблицаДопРеквизитов.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка")); + ТаблицаДопРеквизитов.Колонки.Добавить("ТипЗначения", Новый ОписаниеТипов("ОписаниеТипов")); + + ТаблицаДопСведений = Новый ТаблицаЗначений; + ТаблицаДопСведений.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения")); + ТаблицаДопСведений.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка")); + ТаблицаДопСведений.Колонки.Добавить("ТипЗначения", Новый ОписаниеТипов("ОписаниеТипов")); + + Для Каждого ОбъектДляИзменения Из ОбъектыДляИзменения Цикл + + ВидОбъектаПоСсылке = ОбщегоНазначения.ВидОбъектаПоСсылке(ОбъектДляИзменения.Ссылка); + Если (ВидОбъектаПоСсылке = "Справочник" ИЛИ ВидОбъектаПоСсылке = "ПланВидовХарактеристик") + И ОбщегоНазначения.ОбъектЯвляетсяГруппой(ОбъектДляИзменения.Ссылка) Тогда + Продолжить; + КонецЕсли; + + ДопРеквизиты = УправлениеСвойствамиМодуль.ПолучитьСписокСвойств(ОбъектДляИзменения.Ссылка, , Ложь); + + Для Каждого СвойствоСсылка Из ДопРеквизиты Цикл + ОбъектДляИзменения.СоставДопРеквизитов = ОбъектДляИзменения.СоставДопРеквизитов + Строка(СвойствоСсылка.УникальныйИдентификатор()) + Символы.ПС; + НоваяСтрока = ТаблицаДопРеквизитов.Добавить(); + + ОбъектСвойство = СвойствоСсылка.ПолучитьОбъект(); + + НоваяСтрока.Свойство = ОбъектСвойство.Ссылка;; + НоваяСтрока.Наименование= ОбъектСвойство.Наименование; + НоваяСтрока.ТипЗначения = ОбъектСвойство.ТипЗначения; + КонецЦикла; + + ДопСведения = УправлениеСвойствамиМодуль.ПолучитьСписокСвойств(ОбъектДляИзменения.Ссылка, Ложь); + + Для Каждого СвойствоСсылка Из ДопСведения Цикл + ОбъектДляИзменения.СоставДопСведений = ОбъектДляИзменения.СоставДопСведений + Строка(СвойствоСсылка.УникальныйИдентификатор()) + Символы.ПС; + НоваяСтрока = ТаблицаДопСведений.Добавить(); + + ОбъектСвойство = СвойствоСсылка.ПолучитьОбъект(); + + НоваяСтрока.Свойство = ОбъектСвойство.Ссылка;; + НоваяСтрока.Наименование= ОбъектСвойство.Наименование; + НоваяСтрока.ТипЗначения = ОбъектСвойство.ТипЗначения; + КонецЦикла; + + КонецЦикла; + + ТаблицаДопРеквизитов.Свернуть("Свойство,Наименование,ТипЗначения"); + ТаблицаДопРеквизитов.Сортировать("Наименование Возр"); + ТаблицаДопСведений.Свернуть("Свойство,Наименование,ТипЗначения"); + ТаблицаДопСведений.Сортировать("Наименование Возр"); + + ДобавитьСвойствоВТаблицуОпераций(ТаблицаДопРеквизитов); + ДобавитьСвойствоВТаблицуОпераций(ТаблицаДопСведений, Ложь); + +КонецПроцедуры + +Процедура ДобавитьСвойствоВТаблицуОпераций(ТаблицаДопСвойств, ЭтоДопРеквизит = Истина) + + Для Каждого СтрокаТаблицы Из ТаблицаДопСвойств Цикл + НоваяОперация = Операции.Добавить(); + НоваяОперация.ВидОперации = ?(ЭтоДопРеквизит, 2, 3); + + НоваяОперация.Свойство = СтрокаТаблицы.Свойство; + НоваяОперация.Представление = СтрокаТаблицы.Наименование; + + ДопустимыеТипыСтрока = ""; + + Для Каждого Тип Из СтрокаТаблицы.ТипЗначения.Типы() Цикл + ПредставлениеТипа = ОбщегоНазначения.ПолучитьСтроковоеПредставлениеТипа(Тип); + ДопустимыеТипыСтрока = ПредставлениеТипа + ";" + ДопустимыеТипыСтрока; + КонецЦикла; + + ДопустимыеТипыСтрока = Лев(ДопустимыеТипыСтрока, СтрДлина(ДопустимыеТипыСтрока)-1); + + НоваяОперация.ДопустимыеТипы = ДопустимыеТипыСтрока; + + КонецЦикла; + +КонецПроцедуры + +// Добавляет в набор операций (фактически набор реквизитов и свойств) те, +// которые могут быть отредактированы +// В него не попадают: +// не редактируемые - зависят от настроек самого объекта метаданных +// фильтруемые - задаются для класса объектов метаданных +// В него попадают с исключением: +// БлокируемыеРеквизиты - реквизиты, которые могут редактироваться +// только при наличии у пользователя роли РедактированиеРеквизитовОбъектов +// Передаваемые параметры: +// Реквизиты - коллекция реквизитов (стандартных реквизитов) объекта метаданных +// НеРедактируемые, ФильтруемыеРеквизиты - массив - фильтр по реквизитам +// БлокируемыеРеквизиты - массив - блокируемые реквизиты +// +Процедура ДобавитьРеквизитыВНабор(Реквизиты, + НеРедактируемые, + ФильтруемыеРеквизиты, + БлокируемыеРеквизиты) + + Для Каждого ОписаниеРеквизита Из Реквизиты Цикл + + Если ТипЗнч(ОписаниеРеквизита) = Тип("ОписаниеСтандартногоРеквизита") Тогда + Если НЕ ПравоДоступа("Редактирование", ОбъектыДляИзменения[0].Ссылка.Метаданные(), , ОписаниеРеквизита.Имя) Тогда + Продолжить; + КонецЕсли; + Иначе + Если НЕ ПравоДоступа("Редактирование", ОписаниеРеквизита) Тогда + Продолжить; + КонецЕсли; + КонецЕсли; + + Если НеРедактируемые.Найти(ОписаниеРеквизита.Имя) <> Неопределено Тогда + Продолжить; + КонецЕсли; + + Если ФильтруемыеРеквизиты.Найти(ОписаниеРеквизита.Имя) <> Неопределено Тогда + Продолжить; + КонецЕсли; + + ВыборГруппИЭлементов = ""; + + Если ТипЗнч(ОписаниеРеквизита) = Тип("ОписаниеСтандартногоРеквизита") + И (ОписаниеРеквизита.Имя = "Родитель" ИЛИ ОписаниеРеквизита.Имя = "Parent") Тогда + ВыборГруппИЭлементов = "Группы"; + Иначе + ТипСсылочногоТипа = Ложь; + Для Каждого Тип Из ОписаниеРеквизита.Тип.Типы() Цикл + Если ОбщегоНазначения.ТипСсылочногоТипа(Тип) Тогда + ТипСсылочногоТипа = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + Если ТипСсылочногоТипа Тогда + Если ОписаниеРеквизита.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Группы Тогда + ВыборГруппИЭлементов = "Группы"; + ИначеЕсли ОписаниеРеквизита.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.ГруппыИЭлементы Тогда + ВыборГруппИЭлементов = "ГруппыИЭлементы"; + ИначеЕсли ОписаниеРеквизита.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы Тогда + ВыборГруппИЭлементов = "Элементы"; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + // собираем типы реквизита + ДопустимыеТипыСтрока = ""; + + Для Каждого Тип Из ОписаниеРеквизита.Тип.Типы() Цикл + ПредставлениеТипа = ОбщегоНазначения.ПолучитьСтроковоеПредставлениеТипа(Тип); + ДопустимыеТипыСтрока = ПредставлениеТипа + ";" + ДопустимыеТипыСтрока; + КонецЦикла; + + ДопустимыеТипыСтрока = Лев(ДопустимыеТипыСтрока, СтрДлина(ДопустимыеТипыСтрока)-1); + + // если нет доступных типов для изменения - реквизит не попадает в итоговый набор + Если ПустаяСтрока(ДопустимыеТипыСтрока) Тогда + Продолжить; + КонецЕсли; + + ПараметрыВыбораСтрока = ""; + + Для Каждого ОписаниеПараметраВыбора Из ОписаниеРеквизита.ПараметрыВыбора Цикл + ТекущийПВСтрока = "[ПолеОтбора];[ТипСтрока];[ЗначениеСтрока]"; + ТекущийПВСтрока = СтрЗаменить(ТекущийПВСтрока, "[ПолеОтбора]", ОписаниеПараметраВыбора.Имя); + ТекущийПВСтрока = СтрЗаменить(ТекущийПВСтрока, "[ТипСтрока]", ОбщегоНазначения.ПолучитьСтроковоеПредставлениеТипа(ТипЗнч(ОписаниеПараметраВыбора.Значение))); + ТекущийПВСтрока = СтрЗаменить(ТекущийПВСтрока, "[ЗначениеСтрока]", XMLСтрока(ОписаниеПараметраВыбора.Значение)); + ПараметрыВыбораСтрока = ПараметрыВыбораСтрока + ТекущийПВСтрока + Символы.ПС; + КонецЦикла; + + ПараметрыВыбораСтрока = Лев(ПараметрыВыбораСтрока, СтрДлина(ПараметрыВыбораСтрока)-1); + + СвязиПараметровВыбораСтрока = ""; + + Для Каждого ОписаниеСвязиПараметровВыбора Из ОписаниеРеквизита.СвязиПараметровВыбора Цикл + ТекущаяСПВСтрока = "[ИмяПараметра];[ИмяРеквизита]"; + ТекущаяСПВСтрока = СтрЗаменить(ТекущаяСПВСтрока, "[ИмяПараметра]", ОписаниеСвязиПараметровВыбора.Имя); + ТекущаяСПВСтрока = СтрЗаменить(ТекущаяСПВСтрока, "[ИмяРеквизита]", ОписаниеСвязиПараметровВыбора.ПутьКДанным); + СвязиПараметровВыбораСтрока = СвязиПараметровВыбораСтрока + ТекущаяСПВСтрока + Символы.ПС; + КонецЦикла; + + СвязиПараметровВыбораСтрока = Лев(СвязиПараметровВыбораСтрока, СтрДлина(СвязиПараметровВыбораСтрока)-1); + + НоваяОперация = Операции.Добавить(); + НоваяОперация.ИмяРеквизита = ОписаниеРеквизита.Имя; + НоваяОперация.Представление = ?(ПустаяСтрока(ОписаниеРеквизита.Синоним), ОписаниеРеквизита.Имя, ОписаниеРеквизита.Синоним); + НоваяОперация.ВидОперации = 1; // реквизит + НоваяОперация.ДопустимыеТипы = ДопустимыеТипыСтрока; + НоваяОперация.ПараметрыВыбора = ПараметрыВыбораСтрока; + НоваяОперация.СвязиПараметровВыбора = СвязиПараметровВыбораСтрока; + НоваяОперация.ВыборГруппИЭлементов = ВыборГруппИЭлементов; + + Если БлокируемыеРеквизиты.Найти(ОписаниеРеквизита.Имя) <> Неопределено Тогда + НоваяОперация.ЗаблокированныйРеквизит = Истина; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Получает массив реквизитов, редактирование которых не предусмотрено +// на уровне конфигурации +// +Функция ПолучитьФильтрРедактированияПоТипу(ОбъектМетаданных) + + ФильтрXML = Обработки.ГрупповоеИзменениеОбъектов.ПолучитьМакет("ФильтрРеквизитов").ПолучитьТекст(); + + ФильтрТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(ФильтрXML).Данные; + + // Реквизиты, блокируемые для любого типа объектов метаданных + ОбщийФильтр = ФильтрТаблица.НайтиСтроки(Новый Структура("ObjectType", "*")); + + // Реквизиты, блокируемые для указанного типа объектов метаданных + ФильтрПоТипуОМ = ФильтрТаблица.НайтиСтроки( + Новый Структура("ObjectType", + ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных)) ); + + ФильтруемыеРеквизиты = Новый Массив; + + Для Каждого СтрокаОписание Из ОбщийФильтр Цикл + ФильтруемыеРеквизиты.Добавить(СтрокаОписание.Attribute); + КонецЦикла; + + Для Каждого СтрокаОписание Из ФильтрПоТипуОМ Цикл + ФильтруемыеРеквизиты.Добавить(СтрокаОписание.Attribute); + КонецЦикла; + + Возврат ФильтруемыеРеквизиты; + +КонецФункции + +// нет информации 0 +НетОшибок = 1; +Ошибка_НеКлассифицированная = 2; +Ошибка_ОбработкиПроверкиЗаполнения = 3; +Ошибка_ЗаписиОбъекта = 4; +Ошибка_БлокировкиОбъекта = 5; +Ошибка_ЗаписиДопСведений = 6; + +// Для использования обработки без подсистемы свойств, связь с модулем УправлениеСвойствами +// вычисляется в режиме предприятия, а не на этапе компиляции +УправлениеСвойствамиМодуль = + ?(Метаданные.НайтиПоПолномуИмени("ОбщийМодуль.УправлениеСвойствами") = Неопределено, + Неопределено, + Вычислить("УправлениеСвойствами")); diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Templates/ФильтрРеквизитов/Template.txt b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Templates/ФильтрРеквизитов/Template.txt new file mode 100644 index 000000000..20248732d --- /dev/null +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Templates/ФильтрРеквизитов/Template.txt @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ГрупповоеИзменениеОбъектов.mdo b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ГрупповоеИзменениеОбъектов.mdo new file mode 100644 index 000000000..fef980f59 --- /dev/null +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ГрупповоеИзменениеОбъектов.mdo @@ -0,0 +1,350 @@ + + + + + + + ГрупповоеИзменениеОбъектов + + ru + Групповое изменение объектов + + true + DataProcessor.ГрупповоеИзменениеОбъектов.Form.Форма + + ИзменятьВТранзакции + + ru + Изменять в транзакции + + + Boolean + + + + + + ПрерыватьПриОшибке + + ru + Прерывать при ошибке + + + Boolean + + + + + + ИспользуютсяДопРеквизиты + + ru + Используются доп реквизиты + + + Boolean + + + + + + ИспользуютсяДопСведения + + ru + Используются доп сведения + + + Boolean + + + + + + + + + + Операции + + ru + Операции + + + Use + LineNumber + + Use + + + + + ВидОперации + + ru + Вид операции + + + Number + + 1 + true + + + + + + + + ИмяРеквизита + + ru + Имя реквизита (свойство) + + + String + + + + + + + + Свойство + + ru + Свойство + + + String + + 10 + + + + + + + + Представление + + ru + Представление + + + String + + + + + + + + Изменять + + ru + Изменять + + + Boolean + + + + + + + Значение + + ru + Значение + + + Boolean + String + Date + Number + AnyRef + + 10 + + + 1024 + + + Date + + + + + + + + ЗаблокированныйРеквизит + + 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 + + + + + + + Форма + + ru + Форма + + PersonalComputer + MobileDevice + + + Настройка + + ru + Настройка + + PersonalComputer + MobileDevice + + + ФильтрРеквизитов + + ru + Фильтр реквизитов + + TextDocument + + diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Commands/ЖурналРегистрации/CommandModule.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Commands/ЖурналРегистрации/CommandModule.bsl new file mode 100644 index 000000000..263911f7c --- /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..90ccb4d8a --- /dev/null +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Form.form @@ -0,0 +1,2527 @@ + + + + <key>ru</key> + <value>Журнал регистрации</value> + + + ГруппаОтбора + 103 + + КоличествоПоказываемыхСобытий + 101 + + <key>ru</key> + <value>Количество отбираемых событий</value> + + true + true + + true + + + КоличествоПоказываемыхСобытий + + + ru + Количество последних событий, отбираемых из заданного интервала дат + + + OnChange + КоличествоПоказываемыхСобытийПриИзменении + + + КоличествоПоказываемыхСобытийРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + + КоличествоПоказываемыхСобытийКонтекстноеМеню + 102 + true + + InputField + Right + Enter + true + Left + true + + true + true + true + + ru + ЧГ=0 + + true + + 1 + + + + ru + 200 событий + + + 200 + + + + + ru + 500 событий + + + 500 + + + + + ru + 1000 событий + + + 1000 + + + + + ru + 10000 событий + + + 10000 + + + + Style.BorderColor + + Normal + + + + ПредставлениеОтбора + 35 + + <key>ru</key> + <value>Отбор</value> + + true + true + + true + + + ПредставлениеОтбора + + + ПредставлениеОтбораРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + + ПредставлениеОтбораКонтекстноеМеню + 36 + true + + LabelField + Enter + true + Left + true + Left + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Группа отбора</value> + + + ru + Группа отбора + + + ГруппаОтбораРасширеннаяПодсказка + 128 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Журнал + 48 + + <key>ru</key> + <value>Журнал событий</value> + + true + true + + true + + + Журнал + + true + false + None + Add + Change + Copy + CopyToClipboard + EndEdit + MoveDown + MoveUp + + Дата + 51 + + <key>ru</key> + <value>Дата, время</value> + + true + true + + true + + + Журнал.Дата + + + ДатаРасширеннаяПодсказка + 148 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 52 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ГруппаПользовательКомпьютерПриложение + 53 + + ИмяПользователя + 54 + + <key>ru</key> + <value>Пользователь</value> + + true + true + + true + + + Журнал.ИмяПользователя + + + ИмяПользователяРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + + ИмяПользователяКонтекстноеМеню + 55 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Компьютер + 56 + + <key>ru</key> + <value>Компьютер</value> + + true + true + + true + + + Журнал.Компьютер + + + КомпьютерРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + + КомпьютерКонтекстноеМеню + 57 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ГруппаПриложение + 58 + + ПредставлениеПриложения + 59 + + <key>ru</key> + <value>Приложение</value> + + true + true + + true + + + Журнал.ПредставлениеПриложения + + + ПредставлениеПриложенияРасширеннаяПодсказка + 156 + Label + true + true + + Left + + + + ПредставлениеПриложенияКонтекстноеМеню + 60 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Сеанс + 80 + true + true + + true + + + Журнал.Сеанс + + + СеансРасширеннаяПодсказка + 158 + Label + true + true + + Left + + + + СеансКонтекстноеМеню + 81 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + ГруппаПриложениеРасширеннаяПодсказка + 155 + Label + true + true + + Left + + + ColumnGroup + + auto + true + + + true + true + + true + + + ГруппаПользовательКомпьютерПриложениеРасширеннаяПодсказка + 150 + Label + true + true + + Left + + + ColumnGroup + + Vertical + auto + true + + + + ГруппаСервер + 84 + + РабочийСервер + 85 + true + true + + true + + + Журнал.РабочийСервер + + + РабочийСерверРасширеннаяПодсказка + 161 + Label + true + true + + Left + + + + РабочийСерверКонтекстноеМеню + 86 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ОсновнойIPПорт + 89 + true + true + + true + + + Журнал.ОсновнойIPПорт + + + ОсновнойIPПортРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + + ОсновнойIPПортКонтекстноеМеню + 90 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ВспомогательныйIPПорт + 91 + true + true + + true + + + Журнал.ВспомогательныйIPПорт + + + ru + Вспомогательный IP порт + + + ВспомогательныйIPПортРасширеннаяПодсказка + 165 + Label + true + true + + Left + + + + ВспомогательныйIPПортКонтекстноеМеню + 92 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + + <key>ru</key> + <value>Группа сервер</value> + + + ru + Группа сервер + + + ГруппаСерверРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + ColumnGroup + + Vertical + auto + true + + + + ГруппаСобытие + 63 + + ПредставлениеСобытия + 64 + + <key>ru</key> + <value>Событие</value> + + true + true + + true + + + Журнал.ПредставлениеСобытия + + + ПредставлениеСобытияРасширеннаяПодсказка + 168 + Label + true + true + + Left + + + + ПредставлениеСобытияКонтекстноеМеню + 65 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Комментарий + 66 + + <key>ru</key> + <value>Комментарий</value> + + true + true + + true + + + Журнал.Комментарий + + + КомментарийРасширеннаяПодсказка + 170 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 67 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + ГруппаСобытиеРасширеннаяПодсказка + 167 + Label + true + true + + Left + + + ColumnGroup + + Vertical + auto + true + + + + ГруппаТранзакция + 68 + + СтатусТранзакции + 69 + + <key>ru</key> + <value>Статус транзакции</value> + + true + true + + true + + + Журнал.СтатусТранзакции + + + СтатусТранзакцииРасширеннаяПодсказка + 173 + Label + true + true + + Left + + + + СтатусТранзакцииКонтекстноеМеню + 70 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Транзакция + 71 + true + true + + true + + + Журнал.Транзакция + + + ТранзакцияРасширеннаяПодсказка + 175 + Label + true + true + + Left + + + + ТранзакцияКонтекстноеМеню + 72 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + ГруппаТранзакцияРасширеннаяПодсказка + 172 + Label + true + true + + Left + + + ColumnGroup + + Vertical + auto + true + + + + ГруппаДанные + 73 + + ПредставлениеМетаданных + 74 + + <key>ru</key> + <value>Метаданные</value> + + true + true + + true + + + Журнал.ПредставлениеМетаданных + + + ПредставлениеМетаданныхРасширеннаяПодсказка + 178 + Label + true + true + + Left + + + + ПредставлениеМетаданныхКонтекстноеМеню + 75 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Данные + 76 + true + true + + true + + + Журнал.Данные + + + ДанныеРасширеннаяПодсказка + 180 + Label + true + true + + Left + + + + ДанныеКонтекстноеМеню + 77 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ПредставлениеДанных + 78 + true + true + + true + + + Журнал.ПредставлениеДанных + + + ПредставлениеДанныхРасширеннаяПодсказка + 182 + Label + true + true + + Left + + + + ПредставлениеДанныхКонтекстноеМеню + 79 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + ГруппаДанныеРасширеннаяПодсказка + 177 + Label + true + true + + Left + + + ColumnGroup + + Vertical + auto + true + + + None + + ЖурналКоманднаяПанель + 50 + Left + + + Selection + ЖурналВыбор + + + ЖурналСтрокаПоиска + 139 + + ЖурналСтрокаПоискаРасширеннаяПодсказка + 141 + Label + true + true + + Left + + + + ЖурналСтрокаПоискаКонтекстноеМеню + 140 + true + + Журнал + + true + + + + ЖурналСостояниеПросмотра + 142 + + ЖурналСостояниеПросмотраРасширеннаяПодсказка + 144 + Label + true + true + + Left + + + + ЖурналСостояниеПросмотраКонтекстноеМеню + 143 + true + + ViewStatusAddition + Журнал + + true + + + + ЖурналУправлениеПоиском + 145 + + ЖурналУправлениеПоискомРасширеннаяПодсказка + 147 + Label + true + true + + Left + + + + ЖурналУправлениеПоискомКонтекстноеМеню + 146 + true + + SearchControlAddition + Журнал + + true + + + + ЖурналРасширеннаяПодсказка + 138 + Label + true + true + + Left + + + + ЖурналКонтекстноеМеню + 49 + + ОтборГруппаКонтекст + 107 + + УстановитьОтборПоЗначениюВТекущейКолонкеКонтекст + 98 + true + true + + true + + false + + УстановитьОтборПоЗначениюВТекущейКолонкеКонтекстРасширеннаяПодсказка + 134 + Label + true + true + + Left + + + Form.Command.УстановитьОтборПоЗначениюВТекущейКолонке + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + ЖурналКонтекстноеМенюОтключитьОтбор + 113 + true + true + + true + + + ЖурналКонтекстноеМенюОтключитьОтборРасширеннаяПодсказка + 135 + Label + true + true + + Left + + + Form.Command.ОтключитьОтбор + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Отбор группа контекст</value> + + + ru + Отбор группа контекст + + + ОтборГруппаКонтекстРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + + + + ПросмотрТекущегоСобытияВОтдельномОкнеКонтекст + 96 + true + true + + true + + false + + ПросмотрТекущегоСобытияВОтдельномОкнеКонтекстРасширеннаяПодсказка + 136 + Label + true + true + + Left + + + Form.Command.ПросмотрТекущегоСобытияВОтдельномОкне + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + ОткрытьДанныеДляПросмотраКонтекст + 97 + true + true + + true + + false + + ОткрытьДанныеДляПросмотраКонтекстРасширеннаяПодсказка + 137 + Label + true + true + + Left + + + Form.Command.ОткрытьДанныеДляПросмотра + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + + true + true + true + true +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + End + Enable + true + true + + Журнал.НомерРисунка + + + CommonPicture.КоллекцияВидыСобытийЖурналаРегистрации + + + Style.BorderColor + + None + None + None + true + +
    + Top + true + + ФормаКоманднаяПанель + -1 + + КомандыОтбора + 105 + + УстановитьИнтервалДатДляПросмотра + 108 + true + true + + true + + + УстановитьИнтервалДатДляПросмотраРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + Form.Command.УстановитьИнтервалДатДляПросмотра + Normal + Auto + true + true + UserCmds + Auto + + + УстановитьОтбор + 42 + true + true + + true + + false + + УстановитьОтборРасширеннаяПодсказка + 116 + Label + true + true + + Left + + + Form.Command.УстановитьОтбор + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + УстановитьОтборПоЗначениюВТекущейКолонке + 43 + true + true + + true + + false + + УстановитьОтборПоЗначениюВТекущейКолонкеРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + Form.Command.УстановитьОтборПоЗначениюВТекущейКолонке + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + ОтключитьОтбор + 44 + true + true + + true + + false + + ОтключитьОтборРасширеннаяПодсказка + 118 + Label + true + true + + Left + + + Form.Command.ОтключитьОтбор + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды отбора</value> + + + ru + Команды отбора + + + КомандыОтбораРасширеннаяПодсказка + 114 + Label + true + true + + Left + + + + + + ПросмотрТекущегоСобытияВОтдельномОкне + 38 + true + true + + true + + false + + ПросмотрТекущегоСобытияВОтдельномОкнеРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + Form.Command.ПросмотрТекущегоСобытияВОтдельномОкне + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + ОткрытьДанныеДляПросмотра + 40 + true + true + + true + + false + + ОткрытьДанныеДляПросмотраРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + Form.Command.ОткрытьДанныеДляПросмотра + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + КомандаОбновить + 106 + + ОбновитьТекущийСписок + 46 + true + true + + true + + false + + ОбновитьТекущийСписокРасширеннаяПодсказка + 122 + Label + true + true + + Left + + + Form.Command.ОбновитьТекущийСписок + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + <key>ru</key> + <value>Команда обновить</value> + + + ru + Команда обновить + + + КомандаОбновитьРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + + + + КомандыПоиска + 109 + + ФормаНайти + 110 + true + true + + true + + + ФормаНайтиРасширеннаяПодсказка + 124 + Label + true + true + + Left + + + Form.Item.Журнал.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ФормаОтменитьПоиск + 111 + true + true + + true + + + ФормаОтменитьПоискРасширеннаяПодсказка + 125 + Label + true + true + + Left + + + Form.Item.Журнал.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды поиска</value> + + + ru + Команды поиска + + + КомандыПоискаРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + + + + ИзменитьФорму + 104 + true + true + + true + + false + + ИзменитьФормуРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ВывестиСписок + 82 + true + true + + true + + false + + ВывестиСписокРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + Form.Item.Журнал.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + Close + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.ЖурналРегистрации + + + true + + + true + +
    true
    +
    + + ПредставлениеОтбора + + <key>ru</key> + <value>Представление отбора</value> + + 3 + + String + + + + true + + + true + + + + Журнал + + <key>ru</key> + <value>Журнал событий</value> + + 4 + + ValueTable + + + true + + + true + + + ВспомогательныйIPПорт + + <key>ru</key> + <value>Вспомог. IP порт</value> + + 1 + + Number + + 10 + + + + true + + + true + + + + Данные + + <key>ru</key> + <value>Данные</value> + + 2 + + Boolean + String + Date + AnyRef + + + + + true + + + true + + + + Дата + + <key>ru</key> + <value>Дата</value> + + 3 + + Date + + + + true + + + true + + + + ИмяПользователя + + <key>ru</key> + <value>Имя пользователя</value> + + 4 + + String + + + + true + + + true + + + + ИмяПриложения + + <key>ru</key> + <value>Имя приложения</value> + + 5 + + String + + + + true + + + true + + + + Комментарий + + <key>ru</key> + <value>Комментарий</value> + + 6 + + String + + + + true + + + true + + + + Компьютер + + <key>ru</key> + <value>Компьютер</value> + + 7 + + String + + + + true + + + true + + + + Метаданные + + <key>ru</key> + <value>Метаданные</value> + + 8 + + String + + + + true + + + true + + + + ОсновнойIPПорт + + <key>ru</key> + <value>Основной IP порт</value> + + 9 + + Number + + 10 + + + + true + + + true + + + + Пользователь + + <key>ru</key> + <value>Пользователь</value> + + 10 + + String + + + + true + + + true + + + + ПредставлениеДанных + + <key>ru</key> + <value>Представление данных</value> + + 11 + + String + + + + true + + + true + + + + ПредставлениеМетаданных + + <key>ru</key> + <value>Представление метаданных</value> + + 12 + + ValueList + String + + + + true + + + true + + + + ПредставлениеПриложения + + <key>ru</key> + <value>Представление приложения</value> + + 13 + + String + + + + true + + + true + + + + ПредставлениеСобытия + + <key>ru</key> + <value>Представление события</value> + + 14 + + String + + + + true + + + true + + + + РабочийСервер + + <key>ru</key> + <value>Рабочий сервер</value> + + 15 + + String + + + + true + + + true + + + + Сеанс + + <key>ru</key> + <value>Сеанс</value> + + 16 + + Number + + 10 + + + + true + + + true + + + + Событие + + <key>ru</key> + <value>Событие</value> + + 17 + + String + + + + true + + + true + + + + Соединение + + <key>ru</key> + <value>Соединение</value> + + 18 + + Number + + 10 + + + + true + + + true + + + + СтатусТранзакции + + <key>ru</key> + <value>Статус транзакции</value> + + 19 + + String + + + + true + + + true + + + + Транзакция + + <key>ru</key> + <value>Транзакция</value> + + 20 + + String + + + + true + + + true + + + + Уровень + + <key>ru</key> + <value>Уровень</value> + + 21 + + String + + + + true + + + true + + + + НомерРисунка + + <key>ru</key> + <value>Номер рисунка</value> + + 22 + + Number + + 1 + + + + true + + + true + + + + АдресДанных + + <key>ru</key> + <value>Адрес данных</value> + + 23 + + String + + + + true + + + true + + + + + ОтборЖурналаРегистрации + + <key>ru</key> + <value>Отбор журнала регистрации</value> + + 5 + + + true + + + true + + + + КоличествоПоказываемыхСобытий + + <key>ru</key> + <value>Количество показываемых событий</value> + + 7 + + Number + + 10 + true + + + + true + + + true + + ShowError + + + ИнтервалДат + + <key>ru</key> + <value>Интервал дат</value> + + 2 + + StandardPeriod + + + true + + + true + + + + ПросмотрТекущегоСобытияВОтдельномОкне + + <key>ru</key> + <value>Просмотр текущего события</value> + + 1 + + ru + Просмотр текущего события в отдельном окне + + + true + + + StdPicture.Properties + + + + ПросмотрТекущегоСобытияВОтдельномОкне + + + Auto + Auto + + + ОткрытьДанныеДляПросмотра + + <key>ru</key> + <value>Открыть данные для просмотра</value> + + 2 + + ru + Открыть данные для просмотра + + + true + + + StdPicture.ShowData + + + + ОткрытьДанныеДляПросмотра + + + Auto + Auto + + + УстановитьИнтервалДатДляПросмотра + + <key>ru</key> + <value>Установить интервал дат для просмотра</value> + + 3 + + ru + Установить интервал дат для просмотра + + + true + + + StdPicture.SetDateInterval + + + + УстановитьИнтервалДатДляПросмотра + + + Auto + Auto + + + УстановитьОтбор + + <key>ru</key> + <value>Установить отбор</value> + + 4 + + ru + Установить отбор + + + true + + + StdPicture.FilterCriterion + + + + УстановитьОтбор + + + Picture + Auto + Auto + + + УстановитьОтборПоЗначениюВТекущейКолонке + + <key>ru</key> + <value>Установить отбор по значению в текущей колонке</value> + + 5 + + ru + Установить отбор по значению в текущей колонке + + + true + + + StdPicture.FilterByCurrentValue + + + + УстановитьОтборПоЗначениюВТекущейКолонке + + + Auto + Auto + + + ОтключитьОтбор + + <key>ru</key> + <value>Отключить отбор</value> + + 6 + + ru + Отключить отбор + + + true + + + StdPicture.ClearFilter + + + + ОтключитьОтбор + + + Auto + Auto + + + ОбновитьТекущийСписок + + <key>ru</key> + <value>Обновить текущий список</value> + + 8 + + ru + Обновить текущий список + + + true + + F5 + + StdPicture.Refresh + + + + ОбновитьТекущийСписок + + + 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..8bc688c79 --- /dev/null +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Help/ru.html @@ -0,0 +1,4 @@ + +

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

    +

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

    +

    Установленный отбор кратко описан в верхней части формы.

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl new file mode 100644 index 000000000..a82558f2a --- /dev/null +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl @@ -0,0 +1,534 @@ +////////////////////////////////////////////////////////////////////////////////////////// +// Обработчики событий + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ОтборЖурналаРегистрации = Новый Структура; + + Если Не ПустаяСтрока(Параметры.Пользователь) Тогда + + ИмяПользователя = Параметры.Пользователь; + ОтборПоПользователю = Новый СписокЗначений; + ПоПользователю = ОтборПоПользователю.Добавить(ИмяПользователя); + Если ПустаяСтрока(ИмяПользователя) Тогда + ПоПользователю.Представление = Пользователи.ПолноеИмяНеУказанногоПользователя(); + Иначе + ПоПользователю.Представление = ИмяПользователя; + КонецЕсли; + + ОтборЖурналаРегистрации.Вставить("Пользователь", ОтборПоПользователю); + + КонецЕсли; + + Если ЗначениеЗаполнено(Параметры.СобытиеЖурналаРегистрации) Тогда + ОтборПоСобытию = Новый СписокЗначений; + ОтборПоСобытию.Добавить(Параметры.СобытиеЖурналаРегистрации, Параметры.СобытиеЖурналаРегистрации); + ОтборЖурналаРегистрации.Вставить("Событие", ОтборПоСобытию); + КонецЕсли; + + Если Параметры.Свойство("ДатаНачала") Тогда + ОтборЖурналаРегистрации.Вставить("ДатаНачала", Параметры.ДатаНачала); + КонецЕсли; + + Если Параметры.Свойство("ДатаОкончания") Тогда + ОтборЖурналаРегистрации.Вставить("ДатаОкончания", Параметры.ДатаОкончания); + КонецЕсли; + + КоличествоПоказываемыхСобытий = 200; + + ПрочитатьЖурнал(ОтборЖурналаРегистрации); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "УстановленОтборЖурналаРегистрации" И Источник = ЭтаФорма Тогда + ОтборЖурналаРегистрации.Очистить(); + + Для Каждого ЭлементСписка Из Параметр Цикл + ОтборЖурналаРегистрации.Вставить(ЭлементСписка.Представление, ЭлементСписка.Значение); + КонецЦикла; + + ОбновитьТекущийСписок(); + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ОбновитьТекущийСписок() Экспорт + + ПрочитатьЖурнал(ОтборЖурналаРегистрации); + + // Позиционирование в конец списка + Если Журнал.Количество() > 0 Тогда + Элементы.Журнал.ТекущаяСтрока = Журнал[Журнал.Количество() - 1].ПолучитьИдентификатор(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтключитьОтбор() + + ОтборЖурналаРегистрации.Очистить(); + ОбновитьТекущийСписок(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьДанныеДляПросмотра() + + ТекущиеДанные = Элементы.Журнал.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Или ТекущиеДанные.Данные = Неопределено Тогда + Предупреждение(НСтр("ru = 'Эта запись журнала регистрации не связана с данными (см. колонку ""Данные"")'")); + Возврат; + КонецЕсли; + + Попытка + ОткрытьЗначение(ТекущиеДанные.Данные); + Исключение + ТекстПредупреждения = НСтр("ru = 'Эта запись журнала регистрации связана с данными, но отобразить их невозможно. + |%1'"); + Если ТекущиеДанные.Событие = "_$Data$_.Delete" Тогда + // это - событие удаления + ТекстПредупреждения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстПредупреждения, + НСтр("ru = 'Данные удалены из информационной базы'")); + Иначе + ТекстПредупреждения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстПредупреждения, + НСтр("ru = 'Возможно, данные удалены из информационной базы'")); + КонецЕсли; + Предупреждение(ТекстПредупреждения); + КонецПопытки; + +КонецПроцедуры + +&НаКлиенте +Процедура ПросмотрТекущегоСобытияВОтдельномОкне() + + Данные = Элементы.Журнал.ТекущиеДанные; + Если Данные = Неопределено Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Дата", Данные.Дата); + ПараметрыФормы.Вставить("ИмяПользователя", Данные.ИмяПользователя); + ПараметрыФормы.Вставить("ПредставлениеПриложения", Данные.ПредставлениеПриложения); + ПараметрыФормы.Вставить("Компьютер", Данные.Компьютер); + ПараметрыФормы.Вставить("Событие", Данные.Событие); + ПараметрыФормы.Вставить("ПредставлениеСобытия", Данные.ПредставлениеСобытия); + ПараметрыФормы.Вставить("Комментарий", Данные.Комментарий); + ПараметрыФормы.Вставить("ПредставлениеМетаданных", Данные.ПредставлениеМетаданных); + ПараметрыФормы.Вставить("Данные", Данные.Данные); + ПараметрыФормы.Вставить("ПредставлениеДанных", Данные.ПредставлениеДанных); + ПараметрыФормы.Вставить("Транзакция", Данные.Транзакция); + ПараметрыФормы.Вставить("СтатусТранзакции", Данные.СтатусТранзакции); + ПараметрыФормы.Вставить("Сеанс", Данные.Сеанс); + ПараметрыФормы.Вставить("РабочийСервер", Данные.РабочийСервер); + ПараметрыФормы.Вставить("ОсновнойIPПорт", Данные.ОсновнойIPПорт); + ПараметрыФормы.Вставить("ВспомогательныйIPПорт", Данные.ВспомогательныйIPПорт); + + Если ЗначениеЗаполнено(Данные.АдресДанных) Тогда + ПараметрыФормы.Вставить("АдресДанных", Данные.АдресДанных); + КонецЕсли; + + ОткрытьФорму("Обработка.ЖурналРегистрации.Форма.ФормаСобытия", ПараметрыФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьИнтервалДатДляПросмотра() + + // Получение текущего периода + ДатаНачала = Неопределено; + ДатаОкончания = Неопределено; + ОтборЖурналаРегистрации.Свойство("ДатаНачала", ДатаНачала); + ОтборЖурналаРегистрации.Свойство("ДатаОкончания", ДатаОкончания); + ДатаНачала = ?(ТипЗнч(ДатаНачала) = Тип("Дата"), ДатаНачала, '00010101000000'); + ДатаОкончания = ?(ТипЗнч(ДатаОкончания) = Тип("Дата"), ДатаОкончания, '00010101000000'); + + Если ИнтервалДат.ДатаНачала <> ДатаНачала Тогда + ИнтервалДат.ДатаНачала = ДатаНачала; + КонецЕсли; + + Если ИнтервалДат.ДатаОкончания <> ДатаОкончания Тогда + ИнтервалДат.ДатаОкончания = ДатаОкончания; + КонецЕсли; + + // Редактирование текущего периода + Диалог = Новый ДиалогРедактированияСтандартногоПериода; + Диалог.Период = ИнтервалДат; + + Если Диалог.Редактировать() Тогда + // Обновление текущего периода + ИнтервалДат = Диалог.Период; + Если ИнтервалДат.ДатаНачала = '00010101000000' Тогда + ОтборЖурналаРегистрации.Удалить("ДатаНачала"); + Иначе + ОтборЖурналаРегистрации.Вставить("ДатаНачала", ИнтервалДат.ДатаНачала); + КонецЕсли; + Если ИнтервалДат.ДатаОкончания = '00010101000000' Тогда + ОтборЖурналаРегистрации.Удалить("ДатаОкончания"); + Иначе + ОтборЖурналаРегистрации.Вставить("ДатаОкончания", ИнтервалДат.ДатаОкончания); + КонецЕсли; + ОбновитьТекущийСписок(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьОтбор() + + СписокОтбора = Новый СписокЗначений; + + Для Каждого ЭлементСтруктуры Из ОтборЖурналаРегистрации Цикл + СписокОтбора.Добавить(ЭлементСтруктуры.Значение, ЭлементСтруктуры.Ключ); + КонецЦикла; + + ФормаОтбора = ОткрытьФорму("Обработка.ЖурналРегистрации.Форма.ОтборЖурналаРегистрации", + Новый Структура("Отбор", СписокОтбора), + ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьОтборПоЗначениюВТекущейКолонке() + + Данные = Элементы.Журнал.ТекущиеДанные; + Если Данные = Неопределено Тогда + Возврат; + КонецЕсли; + ИмяКолонкиПредставления = Элементы.Журнал.ТекущийЭлемент.Имя; + Если ИмяКолонкиПредставления = "Дата" Тогда + Возврат; + КонецЕсли; + ЗначениеОтбора = Данные[ИмяКолонкиПредставления]; + Представление = Данные[ИмяКолонкиПредставления]; + + ИмяЭлементаОтбора = ИмяКолонкиПредставления; + Если ИмяКолонкиПредставления = "ИмяПользователя" Тогда + ИмяЭлементаОтбора = "Пользователь"; + ЗначениеОтбора = Данные["Пользователь"]; + ИначеЕсли ИмяКолонкиПредставления = "ПредставлениеПриложения" Тогда + ИмяЭлементаОтбора = "ИмяПриложения"; + ЗначениеОтбора = Данные["ИмяПриложения"]; + ИначеЕсли ИмяКолонкиПредставления = "ПредставлениеСобытия" Тогда + ИмяЭлементаОтбора = "Событие"; + ЗначениеОтбора = Данные["Событие"]; + КонецЕсли; + + // По пустым строкам не отбираем + Если ТипЗнч(ЗначениеОтбора) = Тип("Строка") И ПустаяСтрока(ЗначениеОтбора) Тогда + // Для пользователя по умолчанию имя пустое, разрешаем отбирать + Если ИмяКолонкиПредставления <> "ИмяПользователя" Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + ТекущееЗначение = Неопределено; + Если ОтборЖурналаРегистрации.Свойство(ИмяЭлементаОтбора, ТекущееЗначение) Тогда + // Уже установлен отбор + ОтборЖурналаРегистрации.Удалить(ИмяЭлементаОтбора); + Иначе + Если ИмяЭлементаОтбора = "Данные" Или // не списочные отборы, только 1 значение + ИмяЭлементаОтбора = "Комментарий" Или + ИмяЭлементаОтбора = "Транзакция" Или + ИмяЭлементаОтбора = "ПредставлениеДанных" Тогда + ОтборЖурналаРегистрации.Вставить(ИмяЭлементаОтбора, ЗначениеОтбора); + Иначе + СписокОтбора = Новый СписокЗначений; + СписокОтбора.Добавить(ЗначениеОтбора, Представление); + ОтборЖурналаРегистрации.Вставить(ИмяЭлементаОтбора, СписокОтбора); + КонецЕсли; + КонецЕсли; + + ОбновитьТекущийСписок(); + +КонецПроцедуры + +&НаКлиенте +Процедура КоличествоПоказываемыхСобытийПриИзменении(Элемент) + + ОбновитьТекущийСписок(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЖурналВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ТекущиеДанные = Элементы.Журнал.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Поле.Имя = "Данные" Или Поле.Имя = "ПредставлениеДанных" Тогда + Если ТекущиеДанные.Данные <> Неопределено И (ТипЗнч(ТекущиеДанные.Данные) <> Тип("Строка") И ЗначениеЗаполнено(ТекущиеДанные.Данные)) Тогда + ОткрытьДанныеДляПросмотра(); + Возврат; + КонецЕсли; + КонецЕсли; + + Если Поле.Имя = "Дата" Тогда + УстановитьИнтервалДатДляПросмотра(); + Возврат; + КонецЕсли; + + ПросмотрТекущегоСобытияВОтдельномОкне(); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры + +&НаСервере +Процедура ПрочитатьЖурнал(Знач ОтборЖурналаНаКлиенте) + + // Удаление ранее подготовленных временных данных + ОписанияАдресов = Журнал.Выгрузить(, "АдресДанных"); + ОписанияАдресов.Свернуть("АдресДанных"); + Для каждого Адрес Из ОписанияАдресов.ВыгрузитьКолонку("АдресДанных") Цикл + Если ЗначениеЗаполнено(Адрес) Тогда + УдалитьИзВременногоХранилища(Адрес); + КонецЕсли; + КонецЦикла; + + // Подготовка Отбора + Отбор = Новый Структура; + Для Каждого ЭлементОтбора Из ОтборЖурналаНаКлиенте Цикл + Отбор.Вставить(ЭлементОтбора.Ключ, ЭлементОтбора.Значение); + КонецЦикла; + ПреобразованиеОтбора(Отбор); + + // Выгрузка отбираемых событий + СобытияЖурнала = Новый ТаблицаЗначений; + ВыгрузитьЖурналРегистрации(СобытияЖурнала, Отбор, , , КоличествоПоказываемыхСобытий); + СобытияЖурнала.Колонки.Добавить("НомерРисунка", Новый ОписаниеТипов("Число")); + СобытияЖурнала.Колонки.Добавить("АдресДанных", Новый ОписаниеТипов("Строка")); + + // Заполнение номеров картинок строк + Для Каждого СобытиеЖурнала Из СобытияЖурнала Цикл + + // Установка относительного номера картинки + Если СобытиеЖурнала.Уровень = УровеньЖурналаРегистрации.Информация Тогда + СобытиеЖурнала.НомерРисунка = 0; + ИначеЕсли СобытиеЖурнала.Уровень = УровеньЖурналаРегистрации.Предупреждение Тогда + СобытиеЖурнала.НомерРисунка = 1; + ИначеЕсли СобытиеЖурнала.Уровень = УровеньЖурналаРегистрации.Ошибка Тогда + СобытиеЖурнала.НомерРисунка = 2; + Иначе + СобытиеЖурнала.НомерРисунка = 3; + КонецЕсли; + // Установка абсолютного номера картинки + Если СобытиеЖурнала.СтатусТранзакции = СтатусТранзакцииЗаписиЖурналаРегистрации.НеЗавершена + ИЛИ СобытиеЖурнала.СтатусТранзакции = СтатусТранзакцииЗаписиЖурналаРегистрации.Отменена Тогда + СобытиеЖурнала.НомерРисунка = СобытиеЖурнала.НомерРисунка + 4; + КонецЕсли; + + // Преобразование массива метаданных в список значений + СписокПредставленийМетаданных = Новый СписокЗначений; + Если ТипЗнч(СобытиеЖурнала.ПредставлениеМетаданных) = Тип("Массив") Тогда + СписокПредставленийМетаданных.ЗагрузитьЗначения(СобытиеЖурнала.ПредставлениеМетаданных); + Иначе + СписокПредставленийМетаданных.Добавить(Строка(СобытиеЖурнала.ПредставлениеМетаданных)); + КонецЕсли; + СобытиеЖурнала.ПредставлениеМетаданных = СписокПредставленийМетаданных; + + // Обработка данных специальных событий + Если СобытиеЖурнала.Событие = "_$Access$_.Access" Тогда + СобытиеЖурнала.АдресДанных = ПоместитьВоВременноеХранилище(СобытиеЖурнала.Данные, УникальныйИдентификатор); + СобытиеЖурнала.Данные = ?(СобытиеЖурнала.Данные.Данные = Неопределено, "", "..."); + + ИначеЕсли СобытиеЖурнала.Событие = "_$Access$_.AccessDenied" Тогда + СобытиеЖурнала.АдресДанных = ПоместитьВоВременноеХранилище(СобытиеЖурнала.Данные, УникальныйИдентификатор); + Если СобытиеЖурнала.Данные.Свойство("Право") Тогда + СобытиеЖурнала.Данные = НСтр("ru = 'Право: '") + СобытиеЖурнала.Данные.Право; + Иначе + СобытиеЖурнала.Данные = НСтр("ru = 'Действие: '") + СобытиеЖурнала.Данные.Действие + ?(СобытиеЖурнала.Данные.Данные = Неопределено, "", ", ..."); + КонецЕсли; + + ИначеЕсли СобытиеЖурнала.Событие = "_$Session$_.Authentication" + ИЛИ СобытиеЖурнала.Событие = "_$Session$_.AuthenticationError" Тогда + СобытиеЖурнала.АдресДанных = ПоместитьВоВременноеХранилище(СобытиеЖурнала.Данные, УникальныйИдентификатор); + СобытиеЖурналаДанные = ""; + Для каждого КлючИЗначение ИЗ СобытиеЖурнала.Данные Цикл + Если ЗначениеЗаполнено(СобытиеЖурналаДанные) Тогда + СобытиеЖурналаДанные = СобытиеЖурналаДанные + ", ..."; + Прервать; + КонецЕсли; + СобытиеЖурналаДанные = КлючИЗначение.Ключ + ": " + КлючИЗначение.Значение; + КонецЦикла; + СобытиеЖурнала.Данные = СобытиеЖурналаДанные; + + ИначеЕсли СобытиеЖурнала.Событие = "_$User$_.Delete" Тогда + СобытиеЖурнала.АдресДанных = ПоместитьВоВременноеХранилище(СобытиеЖурнала.Данные, УникальныйИдентификатор); + СобытиеЖурналаДанные = ""; + Для каждого КлючИЗначение ИЗ СобытиеЖурнала.Данные Цикл + СобытиеЖурналаДанные = КлючИЗначение.Ключ + ": " + КлючИЗначение.Значение; + Прервать; + КонецЦикла; + СобытиеЖурнала.Данные = СобытиеЖурналаДанные; + + ИначеЕсли СобытиеЖурнала.Событие = "_$User$_.New" + ИЛИ СобытиеЖурнала.Событие = "_$User$_.Update" Тогда + СобытиеЖурнала.АдресДанных = ПоместитьВоВременноеХранилище(СобытиеЖурнала.Данные, УникальныйИдентификатор); + ИмяПользователяИБ = ""; + СобытиеЖурнала.Данные.Свойство("Имя", ИмяПользователяИБ); + СобытиеЖурнала.Данные = НСтр("ru = 'Имя: '") + ИмяПользователяИБ + ", ..."; + + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + // Уточнение имени пользователя + Если СобытиеЖурнала.Пользователь = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда + СобытиеЖурнала.ИмяПользователя = НСтр("ru = '<Неопределен>'"); + + ИначеЕсли СобытиеЖурнала.ИмяПользователя = "" Тогда + СобытиеЖурнала.ИмяПользователя = Пользователи.ПолноеИмяНеУказанногоПользователя(); + + ИначеЕсли ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(СобытиеЖурнала.Пользователь) = Неопределено Тогда + СобытиеЖурнала.ИмяПользователя = СобытиеЖурнала.ИмяПользователя + " " + НСтр("ru = '<Удален>'"); + + КонецЕсли; + УстановитьПривилегированныйРежим(Ложь); + КонецЦикла; + + ЗначениеВРеквизитФормы(СобытияЖурнала, "Журнал"); + + СформироватьПредставлениеОтбора(); + +КонецПроцедуры + +&НаСервере +Процедура ПреобразованиеОтбора(Отбор) + + Для Каждого ЭлементОтбора Из Отбор Цикл + Если ТипЗнч(ЭлементОтбора.Значение) = Тип("СписокЗначений") Тогда + ПреобразованиеЭлементаОтбора(Отбор, ЭлементОтбора); + ИначеЕсли ВРег(ЭлементОтбора.Ключ) = ВРег("Транзакция") Тогда + Если Найти(ЭлементОтбора.Значение, "(") = 0 Тогда + Отбор.Вставить(ЭлементОтбора.Ключ, "(" + ЭлементОтбора.Значение); + КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ПреобразованиеЭлементаОтбора(Отбор, ЭлементОтбора) + + // Эта процедура вызывается, если элемент отбора является списком значений, + // в отборе же должен быть массив значений. Преобразуем список в массив. + НовоеЗначение = Новый Массив; + + Для Каждого ЗначениеИзСписка Из ЭлементОтбора.Значение Цикл + Если ВРег(ЭлементОтбора.Ключ) = ВРег("Уровень") Тогда + // Уровни сообщений представлены строкой, требуется преобразование в значение перечисления + НовоеЗначение.Добавить(Обработки.ЖурналРегистрации.УровеньЖурналаРегистрацииЗначениеПоИмени(ЗначениеИзСписка.Значение)); + ИначеЕсли ВРег(ЭлементОтбора.Ключ) = ВРег("СтатусТранзакции") Тогда + // Статусы транзакций представлены строкой, требуется преобразование в значение перечисления + НовоеЗначение.Добавить(Обработки.ЖурналРегистрации.СтатусТранзакцииЗаписиЖурналаРегистрацииЗначениеПоИмени(ЗначениеИзСписка.Значение)); + Иначе + НовоеЗначение.Добавить(ЗначениеИзСписка.Значение); + КонецЕсли; + КонецЦикла; + + Отбор.Вставить(ЭлементОтбора.Ключ, НовоеЗначение); + +КонецПроцедуры + +&НаСервере +Процедура СформироватьПредставлениеОтбора() + + ПредставлениеОтбора = ""; + // Интервал + ДатаНачалаИнтервала = Неопределено; + ДатаОкончанияИнтервала = Неопределено; + Если Не ОтборЖурналаРегистрации.Свойство("ДатаНачала", ДатаНачалаИнтервала) Или + ДатаНачалаИнтервала = Неопределено Тогда + ДатаНачалаИнтервала = '00010101000000'; + КонецЕсли; + Если Не ОтборЖурналаРегистрации.Свойство("ДатаОкончания", ДатаОкончанияИнтервала) Или + ДатаОкончанияИнтервала = Неопределено Тогда + ДатаОкончанияИнтервала = '00010101000000'; + КонецЕсли; + Если Не (ДатаНачалаИнтервала = '00010101000000' И ДатаОкончанияИнтервала = '00010101000000') Тогда + ПредставлениеОтбора = ПредставлениеПериода(ДатаНачалаИнтервала, ДатаОкончанияИнтервала); + КонецЕсли; + + ДобавитьОграничениеВПредставлениеОтбора(ПредставлениеОтбора, "Пользователь"); + ДобавитьОграничениеВПредставлениеОтбора(ПредставлениеОтбора, "Событие"); + + // Остальные ограничения указываем просто по представлением, без указания значений ограничения + Для Каждого ЭлементОтбора Из ОтборЖурналаРегистрации Цикл + ИмяОграничения = ЭлементОтбора.Ключ; + Если ВРег(ИмяОграничения) = ВРег("ДатаНачала") + Или ВРег(ИмяОграничения) = ВРег("ДатаОкончания") + Или ВРег(ИмяОграничения) = ВРег("Пользователь") + Или ВРег(ИмяОграничения) = ВРег("Событие") Тогда + Продолжить; // Интервал и пользователя уже выводили + КонецЕсли; + + // Для некоторых ограничений меняем представление + Если ВРег(ИмяОграничения) = ВРег("ИмяПриложения") Тогда + ИмяОграничения = НСтр("ru = 'Приложение'"); + + ИначеЕсли ВРег(ИмяОграничения) = ВРег("СтатусТранзакции") Тогда + ИмяОграничения = НСтр("ru = 'Статус транзакции'"); + + ИначеЕсли ВРег(ИмяОграничения) = ВРег("ПредставлениеДанных") Тогда + ИмяОграничения = НСтр("ru = 'Представление данных'"); + + ИначеЕсли ВРег(ИмяОграничения) = ВРег("РабочийСервер") Тогда + ИмяОграничения = НСтр("ru = 'Рабочий сервер'"); + + ИначеЕсли ВРег(ИмяОграничения) = ВРег("ОсновнойIPПорт") Тогда + ИмяОграничения = НСтр("ru = 'Основной IP порт'"); + + ИначеЕсли ВРег(ИмяОграничения) = ВРег("ВспомогательныйIPПорт") Тогда + ИмяОграничения = НСтр("ru = 'Вспомогательный IP порт'"); + + КонецЕсли; + + Если Не ПустаяСтрока(ПредставлениеОтбора) Тогда + ПредставлениеОтбора = ПредставлениеОтбора + "; "; + КонецЕсли; + ПредставлениеОтбора = ПредставлениеОтбора + ИмяОграничения; + КонецЦикла; + + Если ПустаяСтрока(ПредставлениеОтбора) Тогда + ПредставлениеОтбора = НСтр("ru = 'Не установлен'"); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьОграничениеВПредставлениеОтбора(ПредставлениеОтбора, ИмяОграничения) + + СписокОграничений = ""; + Ограничение = ""; + + Если ОтборЖурналаРегистрации.Свойство(ИмяОграничения, СписокОграничений) Тогда + Для Каждого ЭлементСписка Из СписокОграничений Цикл + Если Не ПустаяСтрока(Ограничение) Тогда + Ограничение = Ограничение + ", "; + КонецЕсли; + Ограничение = Ограничение + ЭлементСписка.Представление; + КонецЦикла; + + Если Не ПустаяСтрока(ПредставлениеОтбора) Тогда + ПредставлениеОтбора = ПредставлениеОтбора + "; "; + КонецЕсли; + + ПредставлениеОтбора = ПредставлениеОтбора + Ограничение; + + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form new file mode 100644 index 000000000..94e12f9bc --- /dev/null +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form @@ -0,0 +1,2305 @@ + + + + ГруппаДаты + 192 + + Группа1 + 198 + + ИнтервалОтбора + 189 + true + true + + true + + + ИнтервалОтбора + + + OnChange + ИнтервалОтбораПриИзменении + + + ИнтервалОтбораРасширеннаяПодсказка + 202 + Label + true + true + + Left + + + + ИнтервалОтбораКонтекстноеМеню + 190 + true + + InputField + Enter + true + Left + true + + 10 + true + true + true + true + true + Normal + + + true + true + + true + + + Группа1РасширеннаяПодсказка + 201 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Группа2 + 199 + + ДатаНачала + 7 + + <key>ru</key> + <value>Начало</value> + + true + true + + true + + + ИнтервалОтбораДатаНачала + + + OnChange + ИнтервалОтбораДатаПриИзменении + + + ДатаНачалаРасширеннаяПодсказка + 205 + Label + true + true + + Left + + + + ДатаНачалаКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ДатаОкончания + 5 + + <key>ru</key> + <value>Окончание</value> + + true + true + + true + + + ИнтервалОтбораДатаОкончания + + + OnChange + ИнтервалОтбораДатаПриИзменении + + + ДатаОкончанияРасширеннаяПодсказка + 207 + Label + true + true + + Left + + + + ДатаОкончанияКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + Группа2РасширеннаяПодсказка + 204 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа даты</value> + + + ru + Группа даты + + + ГруппаДатыРасширеннаяПодсказка + 200 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Equal + Auto + Auto + + + + Группа + 195 + + Группа3 + 196 + + Пользователи + 150 + true + true + + true + + + СписокПользователей + + + ПользователиРасширеннаяПодсказка + 211 + Label + true + true + + Left + + + + ПользователиКонтекстноеМеню + 151 + true + + InputField + Enter + true + Left + true + + + StartChoice + ИсполнениеВыбора + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Приложения + 154 + true + true + + true + + + Приложения + + + ПриложенияРасширеннаяПодсказка + 213 + Label + true + true + + Left + + + + ПриложенияКонтекстноеМеню + 155 + true + + InputField + Enter + true + Left + true + + + StartChoice + ИсполнениеВыбора + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Компьютеры + 152 + true + true + + true + + + Компьютеры + + + КомпьютерыРасширеннаяПодсказка + 215 + Label + true + true + + Left + + + + КомпьютерыКонтекстноеМеню + 153 + true + + InputField + Enter + true + Left + true + + + StartChoice + ИсполнениеВыбора + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + Группа3РасширеннаяПодсказка + 210 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + Группа4 + 197 + + Важность + 41 + true + true + + true + + + Важность + + false + Left + + ПометкаВажности + 108 + true + true + + true + + + Важность.Check + + + ПометкаВажностиРасширеннаяПодсказка + 228 + Label + true + true + + Left + + + + ПометкаВажностиКонтекстноеМеню + 109 + true + + CheckBoxField + Enter + true + Left + true + Left + + + + ЗначениеВажности + 110 + true + true + + true + + + Важность.Value + + + ЗначениеВажностиРасширеннаяПодсказка + 230 + Label + true + true + + Left + + + + ЗначениеВажностиКонтекстноеМеню + 111 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + None + + ВажностьКоманднаяПанель + 143 + Right + + + ВажностьСтрокаПоиска + 219 + + ВажностьСтрокаПоискаРасширеннаяПодсказка + 221 + Label + true + true + + Left + + + + ВажностьСтрокаПоискаКонтекстноеМеню + 220 + true + + Важность + + true + + + + ВажностьСостояниеПросмотра + 222 + + ВажностьСостояниеПросмотраРасширеннаяПодсказка + 224 + Label + true + true + + Left + + + + ВажностьСостояниеПросмотраКонтекстноеМеню + 223 + true + + ViewStatusAddition + Важность + + true + + + + ВажностьУправлениеПоиском + 225 + + ВажностьУправлениеПоискомРасширеннаяПодсказка + 227 + Label + true + true + + Left + + + + ВажностьУправлениеПоискомКонтекстноеМеню + 226 + true + + SearchControlAddition + Важность + + true + + + + ВажностьРасширеннаяПодсказка + 218 + Label + true + true + + Left + + + + ВажностьКонтекстноеМеню + 42 + true + + 20 + true + true + 4 + true + Row + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + Auto + Auto + + Style.BorderColor + + None + None + None + true + + true + true + + true + + + Группа4РасширеннаяПодсказка + 217 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 209 + Label + true + true + + Left + + + UsualGroup + + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаОсновные + 191 + + ГруппаДанныеСвойства + 161 + + Метаданные + 162 + true + true + + true + + + Метаданные + + + МетаданныеРасширеннаяПодсказка + 242 + Label + true + true + + Left + + + + МетаданныеКонтекстноеМеню + 163 + true + + InputField + Enter + true + Left + true + + + StartChoice + ИсполнениеВыбора + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Данные + 51 + true + true + + true + + + Данные + + + ДанныеРасширеннаяПодсказка + 244 + Label + true + true + + Left + + + + ДанныеКонтекстноеМеню + 52 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ПредставлениеДанных + 53 + true + true + + true + + + ПредставлениеДанных + + + ПредставлениеДанныхРасширеннаяПодсказка + 246 + Label + true + true + + Left + + + + ПредставлениеДанныхКонтекстноеМеню + 54 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Данные</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + Данные + + + ГруппаДанныеСвойстваРасширеннаяПодсказка + 241 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + ГруппаОсновныеСвойства + 149 + + ГруппаОсновныеСтроковые + 156 + + События + 171 + true + true + + true + + + События + + None + + СобытияРасширеннаяПодсказка + 250 + Label + true + true + + Left + + + + СобытияКонтекстноеМеню + 172 + true + + InputField + Enter + true + Left + true + + + StartChoice + ИсполнениеВыбора + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Комментарий + 43 + true + true + + true + + + Комментарий + + Top + + КомментарийРасширеннаяПодсказка + 252 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 44 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа основные строковые</value> + + + ru + Группа основные строковые + + + ГруппаОсновныеСтроковыеРасширеннаяПодсказка + 249 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Событие</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + Основные свойства + + + ГруппаОсновныеСвойстваРасширеннаяПодсказка + 248 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа основные</value> + + + ru + Группа основные + + + ГруппаОсновныеРасширеннаяПодсказка + 240 + Label + true + true + + Left + + + UsualGroup + + Auto + WeakSeparation + true + true + Equal + Auto + Auto + + + + ГруппаПрочиеСвойства + 164 + + ГруппаСеансы + 59 + + Сеансы + 78 + + <key>ru</key> + <value>Номера</value> + + true + true + + true + + + СтрСеансы + + Left + + ru + Номера сеансов задаются через ; + + + СеансыРасширеннаяПодсказка + 256 + Label + true + true + + Left + + + + СеансыКонтекстноеМеню + 79 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + РабочиеСерверы + 165 + true + true + + true + + + РабочиеСерверы + + Left + + РабочиеСерверыРасширеннаяПодсказка + 258 + Label + true + true + + Left + + + + РабочиеСерверыКонтекстноеМеню + 166 + true + + InputField + Enter + true + Left + true + + + StartChoice + ИсполнениеВыбора + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ОсновныеIPПорты + 167 + true + true + + true + + + ОсновныеIPПорты + + + ОсновныеIPПортыРасширеннаяПодсказка + 260 + Label + true + true + + Left + + + + ОсновныеIPПортыКонтекстноеМеню + 168 + true + + InputField + Enter + true + Left + true + + + StartChoice + ИсполнениеВыбора + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ВспомогательныеIPПорты + 169 + true + true + + true + + + ВспомогательныеIPПорты + + + ВспомогательныеIPПортыРасширеннаяПодсказка + 262 + Label + true + true + + Left + + + + ВспомогательныеIPПортыКонтекстноеМеню + 170 + true + + InputField + Enter + true + Left + true + + + StartChoice + ИсполнениеВыбора + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Сеанс</value> + + + System.DefaultGUIFont + true + false + false + false + + + ГруппаСеансыРасширеннаяПодсказка + 255 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + LeftNarrowest + auto + Auto + Auto + + + + ГруппаТранзакция + 56 + + Транзакция + 76 + + <key>ru</key> + <value>Идентификатор</value> + + true + true + + true + + + Транзакция + + Left + + ТранзакцияРасширеннаяПодсказка + 265 + Label + true + true + + Left + + + + ТранзакцияКонтекстноеМеню + 77 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + СтатусТранзакции + 74 + + <key>ru</key> + <value>Статус завершения</value> + + true + true + + true + + + СтатусТранзакции + + false + Left + + ПометкаСтатуса + 118 + true + true + + true + + + СтатусТранзакции.Check + + + ПометкаСтатусаРасширеннаяПодсказка + 277 + Label + true + true + + Left + + + + ПометкаСтатусаКонтекстноеМеню + 119 + true + + CheckBoxField + Enter + true + Left + true + Left + + + + ЗначениеСтатуса + 120 + true + true + + true + + + СтатусТранзакции.Value + + + ЗначениеСтатусаРасширеннаяПодсказка + 279 + Label + true + true + + Left + + + + ЗначениеСтатусаКонтекстноеМеню + 121 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + None + + СтатусТранзакцииКоманднаяПанель + 145 + Right + + + СтатусТранзакцииСтрокаПоиска + 268 + + СтатусТранзакцииСтрокаПоискаРасширеннаяПодсказка + 270 + Label + true + true + + Left + + + + СтатусТранзакцииСтрокаПоискаКонтекстноеМеню + 269 + true + + СтатусТранзакции + + true + + + + СтатусТранзакцииСостояниеПросмотра + 271 + + СтатусТранзакцииСостояниеПросмотраРасширеннаяПодсказка + 273 + Label + true + true + + Left + + + + СтатусТранзакцииСостояниеПросмотраКонтекстноеМеню + 272 + true + + ViewStatusAddition + СтатусТранзакции + + true + + + + СтатусТранзакцииУправлениеПоиском + 274 + + СтатусТранзакцииУправлениеПоискомРасширеннаяПодсказка + 276 + Label + true + true + + Left + + + + СтатусТранзакцииУправлениеПоискомКонтекстноеМеню + 275 + true + + SearchControlAddition + СтатусТранзакции + + true + + + + СтатусТранзакцииРасширеннаяПодсказка + 267 + Label + true + true + + Left + + + + СтатусТранзакцииКонтекстноеМеню + 75 + true + + true + true + 4 + true + Row + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + Auto + Auto + true + + Style.BorderColor + + None + None + None + true + + true + true + + true + + + <key>ru</key> + <value>Транзакция</value> + + + System.DefaultGUIFont + true + false + false + false + + + ГруппаТранзакцияРасширеннаяПодсказка + 264 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + ГруппаПрочиеСвойстваРасширеннаяПодсказка + 254 + Label + true + true + + Left + + + UsualGroup + + Auto + WeakSeparation + true + true + Equal + Auto + Auto + + + + ГруппаКнопокФормы + 28 + + OK + 27 + true + true + + true + + false + + OKРасширеннаяПодсказка + 290 + Label + true + true + + Left + + + Form.Command.УстановитьОтборИЗакрытьФорму + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Отменить + 29 + true + true + + true + + false + + ОтменитьРасширеннаяПодсказка + 291 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + ГруппаКнопокФормыРасширеннаяПодсказка + 289 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + 90 + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + СписокПользователей + + <key>ru</key> + <value>Пользователи</value> + + 4 + + ValueList + + + true + + + true + + + СписокПользователей.Picture + + + СписокПользователей.Presentation + + + СписокПользователей.ValueType + + + + String + + + + + + События + + <key>ru</key> + <value>События</value> + + 5 + + ValueList + + + true + + + true + + + + + + + Компьютеры + + <key>ru</key> + <value>Компьютеры</value> + + 6 + + ValueList + + + true + + + true + + + Компьютеры.Picture + + + Компьютеры.Presentation + + + Компьютеры.ValueType + + + + String + + + + + + Приложения + + <key>ru</key> + <value>Приложения</value> + + 7 + + ValueList + + + true + + + true + + + Приложения.Picture + + + Приложения.ValueType + + + + String + + + + + + Важность + + <key>ru</key> + <value>Важность</value> + + 8 + + ValueList + + + true + + + true + + + Важность.Picture + + + Важность.ValueType + + + + String + + + + + + Комментарий + + <key>ru</key> + <value>Комментарий</value> + + 9 + + String + + + + true + + + true + + + + Метаданные + + <key>ru</key> + <value>Метаданные</value> + + 10 + + ValueList + + + true + + + true + + + Метаданные.Picture + + + Метаданные.Presentation + + + Метаданные.ValueType + + + + String + + + + + + Данные + + <key>ru</key> + <value>Данные</value> + + 11 + + AnyRef + + + true + + + true + + + + ПредставлениеДанных + + <key>ru</key> + <value>Представление данных</value> + + 12 + + String + + + + true + + + true + + + + СтатусТранзакции + + <key>ru</key> + <value>Статус транзакции</value> + + 13 + + ValueList + + + true + + + true + + + СтатусТранзакции.Picture + + + СтатусТранзакции.Presentation + + + СтатусТранзакции.ValueType + + + + String + + + + + + Транзакция + + <key>ru</key> + <value>Транзакция</value> + + 14 + + String + + + + true + + + true + + + + СтрСеансы + + <key>ru</key> + <value>Сеансы</value> + + 15 + + String + + + + true + + + true + + + + Сеансы + + <key>ru</key> + <value>Сеансы</value> + + 16 + + ValueList + + + true + + + true + + + + Number + + 10 + + + + + + РабочиеСерверы + + <key>ru</key> + <value>Рабочие серверы</value> + + 17 + + ValueList + + + true + + + true + + + РабочиеСерверы.Picture + + + РабочиеСерверы.Presentation + + + РабочиеСерверы.ValueType + + + + String + + + + + + ОсновныеIPПорты + + <key>ru</key> + <value>Основные IP порты</value> + + 18 + + ValueList + + + true + + + true + + + ОсновныеIPПорты.Picture + + + ОсновныеIPПорты.Presentation + + + ОсновныеIPПорты.ValueType + + + + Number + + 10 + + + + + + ВспомогательныеIPПорты + + <key>ru</key> + <value>Вспомог.IP порты</value> + + 19 + + ValueList + + + true + + + true + + + ВспомогательныеIPПорты.Picture + + + ВспомогательныеIPПорты.Presentation + + + ВспомогательныеIPПорты.ValueType + + + + Number + + 10 + + + + + + ПустаяСтрокаДляВыравнивания + + <key>ru</key> + <value>Пустая строка для выравнивания</value> + + 20 + + String + + + + true + + + true + + + + ИнтервалОтбора + + <key>ru</key> + <value>Интервал отбора</value> + + 22 + + StandardPeriod + + + true + + + true + + + + РедакторСоставаСвойстваИмяЭлемента + + <key>ru</key> + <value>Редактор состава свойства имя элемента</value> + + 2 + + String + + + + true + + + true + + + + ИнтервалОтбораДатаНачала + + <key>ru</key> + <value>Интервал отбора дата начала</value> + + 1 + + Date + + + + true + + + true + + + + ИнтервалОтбораДатаОкончания + + <key>ru</key> + <value>Интервал отбора дата окончания</value> + + 3 + + Date + + + + true + + + true + + + + УстановитьОтборИЗакрытьФорму + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + Установить отбор и закрыть форму + + + true + + + + УстановитьОтборИЗакрытьФорму + + + Auto + Auto + + + Отбор + + ValueList + + + + + + + diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Module.bsl new file mode 100644 index 000000000..d2873a74b --- /dev/null +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Module.bsl @@ -0,0 +1,376 @@ +///////////////////////////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции +&НаСервере +Процедура ЗаполнитьВажностьИСтатус() + // Заполнение ЭУ Важность + Важность.Добавить("Ошибка", Строка(УровеньЖурналаРегистрации.Ошибка)); + Важность.Добавить("Предупреждение", Строка(УровеньЖурналаРегистрации.Предупреждение)); + Важность.Добавить("Информация", Строка(УровеньЖурналаРегистрации.Информация)); + Важность.Добавить("Примечание", Строка(УровеньЖурналаРегистрации.Примечание)); + + // Заполнение ЭУ СтатусТранзакции + СтатусТранзакции.Добавить("НетТранзакции", Строка(СтатусТранзакцииЗаписиЖурналаРегистрации.НетТранзакции)); + СтатусТранзакции.Добавить("Зафиксирована", Строка(СтатусТранзакцииЗаписиЖурналаРегистрации.Зафиксирована)); + СтатусТранзакции.Добавить("НеЗавершена", Строка(СтатусТранзакцииЗаписиЖурналаРегистрации.НеЗавершена)); + СтатусТранзакции.Добавить("Отменена", Строка(СтатусТранзакцииЗаписиЖурналаРегистрации.Отменена)); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьПараметрыОтбора() + + СписокПараметровОтбора = Параметры.Отбор; + ЕстьОтборПоУровню = Ложь; + ЕстьОтборПоСтатусу = Ложь; + + Для Каждого ПараметрОтбора Из СписокПараметровОтбора Цикл + ИмяПараметра = ПараметрОтбора.Представление; + Значение = ПараметрОтбора.Значение; + + Если ВРег(ИмяПараметра) = ВРег("ДатаНачала") Тогда + // ДатаНачала/StartDate + ИнтервалОтбора.ДатаНачала = Значение; + ИнтервалОтбораДатаНачала = Значение; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("ДатаОкончания") Тогда + // ДатаОкончания/EndDate + ИнтервалОтбора.ДатаОкончания = Значение; + ИнтервалОтбораДатаОкончания = Значение; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("Пользователь") Тогда + // Пользователь/User + СписокПользователей = Значение; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("Событие") Тогда + // Событие/Event + События = Значение; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("Компьютер") Тогда + // Компьютер/Computer + Компьютеры = Значение; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("ИмяПриложения") Тогда + // ИмяПриложения/ApplicationName + Приложения = Значение; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("Комментарий") Тогда + // Комментарий/Comment + Комментарий = Значение; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("Метаданные") Тогда + // Метаданные/Metadata + Метаданные = Значение; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("Данные") Тогда + // Данные/Data + Данные = Значение; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("ПредставлениеДанных") Тогда + // ПредставлениеДанных/DataPresentation + ПредставлениеДанных = Значение; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("Транзакция") Тогда + // Транзакция/TransactionID + Транзакция = Значение; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("РабочийСервер") Тогда + // РабочийСервер/ServerName + РабочиеСерверы = Значение; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("Сеанс") Тогда + // Сеанс/Seance + Сеансы = Значение; + СтрСеансы = ""; + Для Каждого НомерСеанса Из Сеансы Цикл + СтрСеансы = СтрСеансы + ?(СтрСеансы = "", "", "; ") + НомерСеанса; + КонецЦикла; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("ОсновнойIPПорт") Тогда + // ОсновнойIPПорт/Port + ОсновныеIPПорты = Значение; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("ВспомогательныйIPПорт") Тогда + // ВспомогательныйIPПорт/SyncPort + ВспомогательныеIPПорты = Значение; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("Уровень") Тогда + // Уровень/Level + ЕстьОтборПоУровню = Истина; + Для Каждого ЭлементСпискаЗначений Из Важность Цикл + Если Значение.НайтиПоЗначению(ЭлементСпискаЗначений.Значение) <> Неопределено Тогда + ЭлементСпискаЗначений.Пометка = Истина; + КонецЕсли; + КонецЦикла; + + ИначеЕсли ВРег(ИмяПараметра) = ВРег("СтатусТранзакции") Тогда + // СтатусТранзакции/TransactionStatus + ЕстьОтборПоСтатусу = Истина; + Для Каждого ЭлементСпискаЗначений Из СтатусТранзакции Цикл + Если Значение.НайтиПоЗначению(ЭлементСпискаЗначений.Значение) <> Неопределено Тогда + ЭлементСпискаЗначений.Пометка = Истина; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + + Если Не ЕстьОтборПоУровню Тогда + Для Каждого ЭлементСпискаЗначений Из Важность Цикл + ЭлементСпискаЗначений.Пометка = Истина; + КонецЦикла; + КонецЕсли; + + Если Не ЕстьОтборПоСтатусу Тогда + Для Каждого ЭлементСпискаЗначений Из СтатусТранзакции Цикл + ЭлементСпискаЗначений.Пометка = Истина; + КонецЦикла; + КонецЕсли; + + +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьОтборЖурналаРегистрации() + + Сеансы.Очистить(); + Стр = СтрСеансы; + Стр = СтрЗаменить(Стр, ";", " "); + Стр = СтрЗаменить(Стр, ",", " "); + Стр = СокрЛП(Стр); + ТЧ = Новый ОписаниеТипов("Число"); + + Пока Не ПустаяСтрока(Стр) Цикл + Поз = Найти(Стр, " "); + + Если Поз = 0 Тогда + Значение = ТЧ.ПривестиЗначение(Стр); + Стр = ""; + Иначе + Значение = ТЧ.ПривестиЗначение(Лев(Стр, Поз-1)); + Стр = СокрЛП(Сред(Стр, Поз+1)); + КонецЕсли; + + Если Значение <> 0 Тогда + Сеансы.Добавить(Значение); + КонецЕсли; + КонецЦикла; + + Отбор = Новый СписокЗначений; + + // Дата начала, окончания + Если ИнтервалОтбораДатаНачала <> '00010101000000' Тогда + Отбор.Добавить(ИнтервалОтбораДатаНачала, "ДатаНачала"); + КонецЕсли; + Если ИнтервалОтбораДатаОкончания <> '00010101000000' Тогда + Отбор.Добавить(ИнтервалОтбораДатаОкончания, "ДатаОкончания"); + КонецЕсли; + + // Пользователь/User + Если СписокПользователей.Количество() > 0 Тогда + Отбор.Добавить(СписокПользователей, "Пользователь"); + КонецЕсли; + + // Событие/Event + Если События.Количество() > 0 Тогда + Отбор.Добавить(События, "Событие"); + КонецЕсли; + + // Компьютер/Computer + Если Компьютеры.Количество() > 0 Тогда + Отбор.Добавить(Компьютеры, "Компьютер"); + КонецЕсли; + + // ИмяПриложения/ApplicationName + Если Приложения.Количество() > 0 Тогда + Отбор.Добавить(Приложения, "ИмяПриложения"); + КонецЕсли; + + // Комментарий/Comment + Если Не ПустаяСтрока(Комментарий) Тогда + Отбор.Добавить(Комментарий, "Комментарий"); + КонецЕсли; + + // Метаданные/Metadata + Если Метаданные.Количество() > 0 Тогда + Отбор.Добавить(Метаданные, "Метаданные"); + КонецЕсли; + + // Данные/Data + Если (Данные <> Неопределено) И (Не Данные.Пустая()) Тогда + Отбор.Добавить(Данные, "Данные"); + КонецЕсли; + + // ПредставлениеДанных/DataPresentation + Если Не ПустаяСтрока(ПредставлениеДанных) Тогда + Отбор.Добавить(ПредставлениеДанных, "ПредставлениеДанных"); + КонецЕсли; + + // Транзакция/TransactionID + Если Не ПустаяСтрока(Транзакция) Тогда + Отбор.Добавить(Транзакция, "Транзакция"); + КонецЕсли; + + // РабочийСервер/ServerName + Если РабочиеСерверы.Количество() > 0 Тогда + Отбор.Добавить(РабочиеСерверы, "РабочийСервер"); + КонецЕсли; + + // Сеанс/Seance + Если Сеансы.Количество() > 0 Тогда + Отбор.Добавить(Сеансы, "Сеанс"); + КонецЕсли; + + // ОсновнойIPПорт/Port + Если ОсновныеIPПорты.Количество() > 0 Тогда + Отбор.Добавить(ОсновныеIPПорты, "ОсновнойIPПорт"); + КонецЕсли; + + // ВспомогательныйIPПорт/SyncPort + Если ВспомогательныеIPПорты.Количество() > 0 Тогда + Отбор.Добавить(ВспомогательныеIPПорты, "ВспомогательныйIPПорт"); + КонецЕсли; + + // Уровень/Level + СписокУровней = Новый СписокЗначений; + Для Каждого ЭлементСпискаЗначений Из Важность Цикл + Если ЭлементСпискаЗначений.Пометка Тогда + СписокУровней.Добавить(ЭлементСпискаЗначений.Значение, ЭлементСпискаЗначений.Представление); + КонецЕсли; + КонецЦикла; + Если СписокУровней.Количество() > 0 И СписокУровней.Количество() <> Важность.Количество() Тогда + Отбор.Добавить(СписокУровней, "Уровень"); + КонецЕсли; + + // СтатусТранзакции/TransactionStatus + СписокСтатусов = Новый СписокЗначений; + Для Каждого ЭлементСпискаЗначений Из СтатусТранзакции Цикл + Если ЭлементСпискаЗначений.Пометка Тогда + СписокСтатусов.Добавить(ЭлементСпискаЗначений.Значение, ЭлементСпискаЗначений.Представление); + КонецЕсли; + КонецЦикла; + Если СписокСтатусов.Количество() > 0 И СписокСтатусов.Количество() <> СтатусТранзакции.Количество() Тогда + Отбор.Добавить(СписокСтатусов, "СтатусТранзакции"); + КонецЕсли; + + Возврат Отбор; + +КонецФункции + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// Обработчики событий +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗаполнитьВажностьИСтатус(); + ЗаполнитьПараметрыОтбора(); + +КонецПроцедуры + +&НаКлиенте +Процедура ИсполнениеВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + Перем РедактируемыйСписок, ОтбираемыеПараметры; + + СтандартнаяОбработка = Ложь; + + РедакторСоставаСвойстваИмяЭлемента = Элемент.Имя; + + Если РедакторСоставаСвойстваИмяЭлемента = Элементы.Пользователи.Имя Тогда + РедактируемыйСписок = СписокПользователей; + ОтбираемыеПараметры = "Пользователь"; + ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.События.Имя Тогда + РедактируемыйСписок = События; + ОтбираемыеПараметры = "Событие"; + ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.Компьютеры.Имя Тогда + РедактируемыйСписок = Компьютеры; + ОтбираемыеПараметры = "Компьютер"; + ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.Приложения.Имя Тогда + РедактируемыйСписок = Приложения; + ОтбираемыеПараметры = "ИмяПриложения"; + ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.Метаданные.Имя Тогда + РедактируемыйСписок = Метаданные; + ОтбираемыеПараметры = "Метаданные"; + ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.РабочиеСерверы.Имя Тогда + РедактируемыйСписок = РабочиеСерверы; + ОтбираемыеПараметры = "РабочийСервер"; + ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.ОсновныеIPПорты.Имя Тогда + РедактируемыйСписок = ОсновныеIPПорты; + ОтбираемыеПараметры = "ОсновнойIPПорт"; + ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.ВспомогательныеIPПорты.Имя Тогда + РедактируемыйСписок = ВспомогательныеIPПорты; + ОтбираемыеПараметры = "ВспомогательныйIPПорт"; + Иначе + СтандартнаяОбработка = Истина; + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + + ПараметрыФормы.Вставить("РедактируемыйСписок", РедактируемыйСписок); + ПараметрыФормы.Вставить("ОтбираемыеПараметры", ОтбираемыеПараметры); + + // Открытие редактора свойства + ОткрытьФорму("Обработка.ЖурналРегистрации.Форма.РедакторСоставаСвойства", + ПараметрыФормы, + ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Перем РедактируемыйСписок, ОтбираемыеПараметры, СтандартнаяОбработка; + + Если ИмяСобытия = "ВыборЗначенийЭлементовОтбораЖурналаРегистрации" + И Источник = ЭтаФорма Тогда + Если РедакторСоставаСвойстваИмяЭлемента = Элементы.Пользователи.Имя Тогда + СписокПользователей = Параметр; + ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.События.Имя Тогда + События = Параметр; + ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.Компьютеры.Имя Тогда + Компьютеры = Параметр; + ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.Приложения.Имя Тогда + Приложения = Параметр; + ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.Метаданные.Имя Тогда + Метаданные = Параметр; + ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.РабочиеСерверы.Имя Тогда + РабочиеСерверы = Параметр; + ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.ОсновныеIPПорты.Имя Тогда + ОсновныеIPПорты = Параметр; + ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.ВспомогательныеIPПорты.Имя Тогда + ВспомогательныеIPПорты = Параметр; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьОтборИЗакрытьФорму(Команда) + + Оповестить("УстановленОтборЖурналаРегистрации", + ПолучитьОтборЖурналаРегистрации(), + ВладелецФормы); + Закрыть(); + +КонецПроцедуры + + +&НаКлиенте +Процедура ИнтервалОтбораПриИзменении(Элемент) + + ИнтервалОтбораДатаНачала = ИнтервалОтбора.ДатаНачала; + ИнтервалОтбораДатаОкончания = ИнтервалОтбора.ДатаОкончания; + +КонецПроцедуры + +&НаКлиенте +Процедура ИнтервалОтбораДатаПриИзменении(Элемент) + + ИнтервалОтбора.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод; + ИнтервалОтбора.ДатаНачала = ИнтервалОтбораДатаНачала; + ИнтервалОтбора.ДатаОкончания = ИнтервалОтбораДатаОкончания; + +КонецПроцедуры + + diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form new file mode 100644 index 000000000..457329e30 --- /dev/null +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form @@ -0,0 +1,651 @@ + + + + <key>ru</key> + <value>Выбор значений для отбора</value> + + + Список + 1 + true + true + + true + + + Список + + false + None + + Группа + 6 + + Пометка + 7 + true + true + + true + + + Список.Пометка + + + OnChange + ПометкаПриИзменении + + + ПометкаРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + ПометкаКонтекстноеМеню + 8 + true + + CheckBoxField + Enter + true + Left + true + + + + Представление + 4 + true + true + + true + + + Список.Представление + + + ПредставлениеРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ПредставлениеКонтекстноеМеню + 5 + true + + LabelField + true + Enter + true + Left + + true + true + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + СписокКоманднаяПанель + 3 + + УстановитьВсе + 9 + true + true + + true + + false + + УстановитьВсеРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + Form.Command.УстановитьВсе + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + СнятьВсе + 10 + true + true + + true + + false + + СнятьВсеРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + Form.Command.СнятьВсе + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + Right + + + СписокСтрокаПоиска + 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 + + + + СписокРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + Tree + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + ExpandAllLevels + true + true + + Style.BorderColor + + None + None + None + true + + + КнопкиФормы + 11 + + OK + 12 + true + true + + true + + false + + OKРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + Form.Command.ВыбратьСоставОтбора + Auto + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Отмена + 13 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопки формы</value> + + + ru + Кнопки формы + + + КнопкиФормыРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.ЖурналРегистрации + + + true + + + true + +
    true
    +
    + + Список + + <key>ru</key> + <value>Список</value> + + 2 + + ValueTree + + + true + + + true + + + Пометка + + <key>ru</key> + <value>Пометка</value> + + 1 + + Boolean + + + 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> + + 3 + + ValueList + + + true + + + true + + + + + + + ОтбираемыеПараметры + + <key>ru</key> + <value>Отбираемые параметры</value> + + 4 + + String + + + + true + + + true + + + + УстановитьВсе + + <key>ru</key> + <value>Установить все флажки</value> + + 1 + + ru + Установить все флажки + + + true + + + StdPicture.CheckAll + + + + УстановитьВсеФлажки + + + Auto + Auto + + + СнятьВсе + + <key>ru</key> + <value>Снять все флажки</value> + + 2 + + ru + Снять все флажки + + + true + + + StdPicture.UncheckAll + + + + СнятьВсеФлажки + + + Auto + Auto + + + ВыбратьСоставОтбора + + <key>ru</key> + <value>ОК</value> + + 3 + + ru + Выбрать состав отбора + + + true + + + + ВыбратьСоставОтбора + + + Auto + Auto + + + РедактируемыйСписок + + ValueList + + + + ОтбираемыеПараметры + + String + + + + + + + + +
    diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl new file mode 100644 index 000000000..8c3ecf8ab --- /dev/null +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl @@ -0,0 +1,291 @@ + +///////////////////////////////////////////////////////////////////////////////////////// +// Экспортируемые процедуры + +&НаКлиенте +Процедура УстановитьПараметрыРедактора(РедактируемыйСписок, ОтбираемыеПараметры) + СтруктураПараметровОтбора = ПолучитьЗначенияОтбораЖурналаРегистрацииПоКолонке(ОтбираемыеПараметры); + ЗначенияОтбора = СтруктураПараметровОтбора[ОтбираемыеПараметры]; + + Если ТипЗнч(ЗначенияОтбора) = Тип("Массив") Тогда + ЭлементыСписка = Список.ПолучитьЭлементы(); + Для Каждого ЭлементМассива Из ЗначенияОтбора Цикл + НовыйЭлемент = ЭлементыСписка.Добавить(); + НовыйЭлемент.Пометка = Ложь; + НовыйЭлемент.Значение = ЭлементМассива; + НовыйЭлемент.Представление = ЭлементМассива; + КонецЦикла; + ИначеЕсли ТипЗнч(ЗначенияОтбора) = Тип("Соответствие") Тогда + Если ОтбираемыеПараметры = "Событие" Или ОтбираемыеПараметры = "Event" Или + ОтбираемыеПараметры = "Метаданные" Или ОтбираемыеПараметры = "Metadata" Тогда + // Грузим как дерево + Для Каждого ЭлементСоответствия Из ЗначенияОтбора Цикл + НовыйЭлемент = ПолучитьВетвьДерева(ЭлементСоответствия.Значение); + НовыйЭлемент.Пометка = Ложь; + НовыйЭлемент.Значение = ЭлементСоответствия.Ключ; + КонецЦикла; + Иначе + // Грузим плоским списком + ЭлементыСписка = Список.ПолучитьЭлементы(); + Для Каждого ЭлементСоответствия Из ЗначенияОтбора Цикл + НовыйЭлемент = ЭлементыСписка.Добавить(); + НовыйЭлемент.Пометка = Ложь; + НовыйЭлемент.Значение = ЭлементСоответствия.Ключ; + Если (ОтбираемыеПараметры = "Пользователь" Или ОтбираемыеПараметры = "User") Тогда + // Для пользователей ключем служит имя + НовыйЭлемент.Значение = ЭлементСоответствия.Значение; + НовыйЭлемент.Представление = ЭлементСоответствия.Значение; + Если НовыйЭлемент.Значение = "" Тогда + // Случай для пользователя по умолчанию + НовыйЭлемент.Значение = ""; + НовыйЭлемент.Представление = Пользователи.ПолноеИмяНеУказанногоПользователя(); + КонецЕсли; + Иначе + НовыйЭлемент.Представление = ЭлементСоответствия.Значение; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; + + // Помечаем элементы дерева, если им есть соотвествие в РедактируемыйСписок + ОтметитьВстречающиесяЭлементы(Список.ПолучитьЭлементы(), РедактируемыйСписок); + + // проверяем список на наличие подчиненных элементов, если их нет, + // переводим ЭУ в режим Списка + ЭтоДерево = Ложь; + Для Каждого ЭлементДерева Из Список.ПолучитьЭлементы() Цикл + Если ЭлементДерева.ПолучитьЭлементы().Количество() > 0 Тогда + ЭтоДерево = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + Если Не ЭтоДерево Тогда + Элементы.Список.Отображение = ОтображениеТаблицы.Список; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьОтредактированныйСписок() + + РедактируемыйСписок = Новый СписокЗначений; + + РедактируемыйСписок.Очистить(); + ЕстьНеотмеченные = Ложь; + ПолучитьСписокПоддерева(РедактируемыйСписок, Список.ПолучитьЭлементы(), ЕстьНеотмеченные); + + Возврат РедактируемыйСписок; + +КонецФункции + +///////////////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры +&НаКлиенте +Функция ПолучитьВетвьДерева(Представление) + СтрокиПути = РазложитьСтрокуПоТочкам(Представление); + Если СтрокиПути.Количество() = 1 Тогда + ЭлементыДерева = Список.ПолучитьЭлементы(); + ИмяВетки = СтрокиПути[0]; + Иначе + // Собираем путь к ветке родителя из фрагментов пути + ПредставлениеПутиРодителя = ""; + Для Сч = 0 По СтрокиПути.Количество() - 2 Цикл + Если Не ПустаяСтрока(ПредставлениеПутиРодителя) Тогда + ПредставлениеПутиРодителя = ПредставлениеПутиРодителя + "."; + КонецЕсли; + ПредставлениеПутиРодителя = ПредставлениеПутиРодителя + СтрокиПути[Сч]; + КонецЦикла; + ЭлементыДерева = ПолучитьВетвьДерева(ПредставлениеПутиРодителя).ПолучитьЭлементы(); + ИмяВетки = СтрокиПути[СтрокиПути.Количество() - 1]; + КонецЕсли; + + Для Каждого ЭлементДерева Из ЭлементыДерева Цикл + Если ЭлементДерева.Представление = ИмяВетки Тогда + Возврат ЭлементДерева; + КонецЕсли; + КонецЦикла; + // Не нашли, придется создавать + ЭлементДерева = ЭлементыДерева.Добавить(); + ЭлементДерева.Представление = ИмяВетки; + ЭлементДерева.Пометка = Ложь; + Возврат ЭлементДерева; +КонецФункции + +// Функция раскладывает строку в массив строк, используя точку как разделитель +&НаКлиенте +Функция РазложитьСтрокуПоТочкам(Знач Представление) + Фрагменты = Новый Массив; + Пока Истина Цикл + Представление = СокрЛП(Представление); + ПозицияТочки = Найти(Представление, "."); + Если ПозицияТочки > 0 Тогда + Фрагмент = СокрЛП(Лев(Представление, ПозицияТочки - 1)); + Фрагменты.Добавить(Фрагмент); + Представление = Сред(Представление, ПозицияТочки + 1); + Иначе + Фрагменты.Добавить(СокрЛП(Представление)); + Прервать; + КонецЕсли; + КонецЦикла; + Возврат Фрагменты; +КонецФункции + +&НаСервере +Функция ПолучитьЗначенияОтбораЖурналаРегистрацииПоКолонке(ОтбираемыеПараметры) + Возврат ПолучитьЗначенияОтбораЖурналаРегистрации(ОтбираемыеПараметры); +КонецФункции + +&НаКлиенте +Процедура ПолучитьСписокПоддерева(РедактируемыйСписок, ЭлементыДерева, ЕстьНеотмеченные) + Для Каждого ЭлементДерева Из ЭлементыДерева Цикл + Если ЭлементДерева.ПолучитьЭлементы().Количество() <> 0 Тогда + ПолучитьСписокПоддерева(РедактируемыйСписок, ЭлементДерева.ПолучитьЭлементы(), ЕстьНеотмеченные); + Иначе + Если ЭлементДерева.Пометка Тогда + НовыйЭлементСписка = РедактируемыйСписок.Добавить(); + НовыйЭлементСписка.Значение = ЭлементДерева.Значение; + НовыйЭлементСписка.Представление = СобратьПредставление(ЭлементДерева); + Иначе + ЕстьНеотмеченные = Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура ОтметитьВстречающиесяЭлементы(ЭлементыДерева, РедактируемыйСписок) + Для Каждого ЭлементДерева Из ЭлементыДерева Цикл + Если ЭлементДерева.ПолучитьЭлементы().Количество() <> 0 Тогда + ОтметитьВстречающиесяЭлементы(ЭлементДерева.ПолучитьЭлементы(), РедактируемыйСписок); + Иначе + СобранноеПредставление = СобратьПредставление(ЭлементДерева); + Для Каждого ЭлементСписка Из РедактируемыйСписок Цикл + Если СобранноеПредставление = ЭлементСписка.Представление Тогда + ОтметитьЭлементДерева(ЭлементДерева, Истина); + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура ОтметитьЭлементДерева(ЭлементДерева, Пометка, ПроверятьСостояниеРодителя = Истина) + ЭлементДерева.Пометка = Пометка; + // Отметить все подчиненные элементы дерева + Для Каждого ПодчиненныйЭлементДерева Из ЭлементДерева.ПолучитьЭлементы() Цикл + ОтметитьЭлементДерева(ПодчиненныйЭлементДерева, Пометка, Ложь); + КонецЦикла; + // Проверить, не должно ли измениться состояние родителя + Если ПроверятьСостояниеРодителя Тогда + ПроверитьСостояниеПометкиВетви(ЭлементДерева.ПолучитьРодителя()); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьСостояниеПометкиВетви(Ветвь) + Если Ветвь = Неопределено Тогда + Возврат; + КонецЕсли; + ПодчиненныеВетви = Ветвь.ПолучитьЭлементы(); + Если ПодчиненныеВетви.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ЕстьИстина = Ложь; + ЕстьЛожь = Ложь; + Для Каждого ПодчиненнаяВетвь Из ПодчиненныеВетви Цикл + Если ПодчиненнаяВетвь.Пометка Тогда + ЕстьИстина = Истина; + Если ЕстьЛожь Тогда + Прервать; + КонецЕсли; + Иначе + ЕстьЛожь = Истина; + Если ЕстьИстина Тогда + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если ЕстьИстина Тогда + Если ЕстьЛожь Тогда + // есть и помеченные и непомеченные, у себя при необходимости ставим непомечено и проверяем родителя + Если Ветвь.Пометка Тогда + Ветвь.Пометка = Ложь; + ПроверитьСостояниеПометкиВетви(Ветвь.ПолучитьРодителя()); + КонецЕсли; + Иначе + // Все подчиненные помечены + Если Не Ветвь.Пометка Тогда + Ветвь.Пометка = Истина; + ПроверитьСостояниеПометкиВетви(Ветвь.ПолучитьРодителя()); + КонецЕсли; + КонецЕсли; + Иначе + // все подчиненные непомечены + Если Ветвь.Пометка Тогда + Ветвь.Пометка = Ложь; + ПроверитьСостояниеПометкиВетви(Ветвь.ПолучитьРодителя()); + КонецЕсли; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Функция СобратьПредставление(ЭлементДерева) + Если ЭлементДерева = Неопределено Тогда + Возврат ""; + КонецЕсли; + Если ЭлементДерева.ПолучитьРодителя() = Неопределено Тогда + Возврат ЭлементДерева.Представление; + КонецЕсли; + Возврат СобратьПредставление(ЭлементДерева.ПолучитьРодителя()) + "." + ЭлементДерева.Представление; +КонецФункции + +&НаКлиенте +Процедура УстановкаПометок(Значение) + Для Каждого ЭлементДерева Из Список.ПолучитьЭлементы() Цикл + ОтметитьЭлементДерева(ЭлементДерева, Значение, Ложь); + КонецЦикла; +КонецПроцедуры + +///////////////////////////////////////////////////////////////////////////////////////// +// Обработчики событий +&НаКлиенте +Процедура УстановитьВсеФлажки() + УстановкаПометок(Истина); +КонецПроцедуры + +&НаКлиенте +Процедура СнятьВсеФлажки() + УстановкаПометок(Ложь); +КонецПроцедуры + +&НаКлиенте +Процедура ПометкаПриИзменении(Элемент) + ОтметитьЭлементДерева(Элементы.Список.ТекущиеДанные, Элементы.Список.ТекущиеДанные.Пометка); +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьСоставОтбора(Команда) + + Оповестить("ВыборЗначенийЭлементовОтбораЖурналаРегистрации", + ПолучитьОтредактированныйСписок(), + ВладелецФормы); + Закрыть(); + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + РедактируемыйСписок = Параметры.РедактируемыйСписок; + ОтбираемыеПараметры = Параметры.ОтбираемыеПараметры; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + УстановитьПараметрыРедактора(РедактируемыйСписок, ОтбираемыеПараметры); + +КонецПроцедуры diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Form.form new file mode 100644 index 000000000..fceebe73b --- /dev/null +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Form.form @@ -0,0 +1,3021 @@ + + + + <key>ru</key> + <value>Событие</value> + + + ГруппаОсновные + 1 + + ГруппаДатаКомпьютер + 7 + + ИмяПользователя + 15 + true + true + + true + + + ИмяПользователя + + + ИмяПользователяРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + ИмяПользователяКонтекстноеМеню + 16 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Дата + 9 + true + true + + true + + + Дата + + + ДатаРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 10 + true + + InputField + true + Enter + true + Left + true + + true + true + false + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа дата компьютер</value> + + + ru + Группа дата компьютер + + + ГруппаДатаКомпьютерРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаПользовательПриложение + 8 + + ПредставлениеПриложения + 17 + true + true + + true + + + ПредставлениеПриложения + + + ПредставлениеПриложенияРасширеннаяПодсказка + 114 + Label + true + true + + Left + + + + ПредставлениеПриложенияКонтекстноеМеню + 18 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Компьютер + 11 + true + true + + true + + + Компьютер + + + КомпьютерРасширеннаяПодсказка + 116 + Label + true + true + + Left + + + + КомпьютерКонтекстноеМеню + 12 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа пользователь приложение</value> + + + ru + Группа пользователь приложение + + + ГруппаПользовательПриложениеРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа основные</value> + + + ru + Группа основные + + + ГруппаОсновныеРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаОсновое + 44 + + ГруппаДанные + 4 + + ПредставленияДанных + 47 + + ПростыеДанные + 48 + + ПредставлениеМетаданных + 21 + true + true + + true + + + ПредставлениеМетаданных + + + ru + Представление метаданных + + + ПредставлениеМетаданныхРасширеннаяПодсказка + 122 + Label + true + true + + Left + + + + ПредставлениеМетаданныхКонтекстноеМеню + 22 + true + + InputField + true + Enter + true + Left + true + + + Opening + ПредставлениеМетаданныхОткрытие + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Данные + 23 + true + true + + true + + + Данные + + + ДанныеРасширеннаяПодсказка + 124 + Label + true + true + + Left + + + + ДанныеКонтекстноеМеню + 24 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ПредставлениеДанных + 25 + + <key>ru</key> + <value>Представление</value> + + true + true + + true + + + ПредставлениеДанных + + Left + + ПредставлениеДанныхРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + + ПредставлениеДанныхКонтекстноеМеню + 26 + true + + InputField + true + Enter + true + Left + true + + true + 3 + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Простые данные</value> + + + ru + Простые данные + + + ПростыеДанныеРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ДанныеДоступа + 49 + + ПредставлениеМетаданныхДоступа + 54 + true + true + + true + + + ПредставлениеМетаданных + + + ru + Представление метаданных + + + ПредставлениеМетаданныхДоступаРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + + ПредставлениеМетаданныхДоступаКонтекстноеМеню + 55 + true + + InputField + true + Enter + true + Left + true + + + Opening + ПредставлениеМетаданныхОткрытие + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ТаблицаДанныхДоступа + 56 + true + true + + true + + + ТаблицаДанных + + Top + Add + CancelSearch + Change + Copy + Delete + EndEdit + Find + MoveDown + MoveUp + SortListAsc + SortListDesc + None + + ТаблицаДанныхДоступаКоманднаяПанель + 58 + Left + + + Selection + ТаблицаДанныхВыбор + + + ТаблицаДанныхДоступаСтрокаПоиска + 133 + + ТаблицаДанныхДоступаСтрокаПоискаРасширеннаяПодсказка + 135 + Label + true + true + + Left + + + + ТаблицаДанныхДоступаСтрокаПоискаКонтекстноеМеню + 134 + true + + ТаблицаДанныхДоступа + + true + + + + ТаблицаДанныхДоступаСостояниеПросмотра + 136 + + ТаблицаДанныхДоступаСостояниеПросмотраРасширеннаяПодсказка + 138 + Label + true + true + + Left + + + + ТаблицаДанныхДоступаСостояниеПросмотраКонтекстноеМеню + 137 + true + + ViewStatusAddition + ТаблицаДанныхДоступа + + true + + + + ТаблицаДанныхДоступаУправлениеПоиском + 139 + + ТаблицаДанныхДоступаУправлениеПоискомРасширеннаяПодсказка + 141 + Label + true + true + + Left + + + + ТаблицаДанныхДоступаУправлениеПоискомКонтекстноеМеню + 140 + true + + SearchControlAddition + ТаблицаДанныхДоступа + + true + + + + ТаблицаДанныхДоступаРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + + ТаблицаДанныхДоступаКонтекстноеМеню + 57 + + ТаблицаДанныхДоступаКонтекстноеМенюВывестиСписок + 103 + true + true + + true + + + ТаблицаДанныхДоступаКонтекстноеМенюВывестиСписокРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + Form.Item.ТаблицаДанныхДоступа.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + + true + 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>Данные доступа</value> + + + ДанныеДоступаРасширеннаяПодсказка + 128 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + + ДанныеОтказаПраваДоступа + 64 + + ПредставлениеМетаданныхОтказаПраваДоступа + 65 + true + true + + true + + + ПредставлениеМетаданных + + + ru + Представление метаданных + + + ПредставлениеМетаданныхОтказаПраваДоступаРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + + ПредставлениеМетаданныхОтказаПраваДоступаКонтекстноеМеню + 66 + true + + InputField + true + Enter + true + Left + true + + + Opening + ПредставлениеМетаданныхОткрытие + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ОтказПраваДоступа + 78 + true + true + + true + + + ОтказПраваДоступа + + + ОтказПраваДоступаРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + + ОтказПраваДоступаКонтекстноеМеню + 79 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Данные отказа права доступа</value> + + + ru + Данные отказа права доступа + + + ДанныеОтказаПраваДоступаРасширеннаяПодсказка + 150 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ДанныеОтказаДействияДоступа + 71 + + ПредставлениеМетаданныхОтказаДействияДоступа + 72 + true + true + + true + + + ПредставлениеМетаданных + + + ru + Представление метаданных + + + ПредставлениеМетаданныхОтказаДействияДоступаРасширеннаяПодсказка + 156 + Label + true + true + + Left + + + + ПредставлениеМетаданныхОтказаДействияДоступаКонтекстноеМеню + 73 + true + + InputField + true + Enter + true + Left + true + + + Opening + ПредставлениеМетаданныхОткрытие + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ОтказДействияДоступа + 80 + true + true + + true + + + ОтказДействияДоступа + + + ОтказДействияДоступаРасширеннаяПодсказка + 158 + Label + true + true + + Left + + + + ОтказДействияДоступаКонтекстноеМеню + 81 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаДанныхОтказаДействияДоступа + 74 + true + true + + true + + + ТаблицаДанных + + Top + Add + CancelSearch + Change + Copy + Delete + EndEdit + Find + MoveDown + MoveUp + SortListAsc + SortListDesc + None + + ТаблицаДанныхОтказаДействияДоступаКоманднаяПанель + 76 + Left + + + Selection + ТаблицаДанныхВыбор + + + ТаблицаДанныхОтказаДействияДоступаСтрокаПоиска + 162 + + ТаблицаДанныхОтказаДействияДоступаСтрокаПоискаРасширеннаяПодсказка + 164 + Label + true + true + + Left + + + + ТаблицаДанныхОтказаДействияДоступаСтрокаПоискаКонтекстноеМеню + 163 + true + + ТаблицаДанныхОтказаДействияДоступа + + true + + + + ТаблицаДанныхОтказаДействияДоступаСостояниеПросмотра + 165 + + ТаблицаДанныхОтказаДействияДоступаСостояниеПросмотраРасширеннаяПодсказка + 167 + Label + true + true + + Left + + + + ТаблицаДанныхОтказаДействияДоступаСостояниеПросмотраКонтекстноеМеню + 166 + true + + ViewStatusAddition + ТаблицаДанныхОтказаДействияДоступа + + true + + + + ТаблицаДанныхОтказаДействияДоступаУправлениеПоиском + 168 + + ТаблицаДанныхОтказаДействияДоступаУправлениеПоискомРасширеннаяПодсказка + 170 + Label + true + true + + Left + + + + ТаблицаДанныхОтказаДействияДоступаУправлениеПоискомКонтекстноеМеню + 169 + true + + SearchControlAddition + ТаблицаДанныхОтказаДействияДоступа + + true + + + + ТаблицаДанныхОтказаДействияДоступаРасширеннаяПодсказка + 161 + Label + true + true + + Left + + + + ТаблицаДанныхОтказаДействияДоступаКонтекстноеМеню + 75 + + ТаблицаДанныхОтказаДействияДоступаКонтекстноеМенюВывестиСписок + 104 + true + true + + true + + + ТаблицаДанныхОтказаДействияДоступаКонтекстноеМенюВывестиСписокРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + Form.Item.ТаблицаДанныхОтказаДействияДоступа.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + + true + 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>Данные отказа действия доступа</value> + + + ДанныеОтказаДействияДоступаРасширеннаяПодсказка + 155 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + + ДанныеАутентификации + 82 + + АутентификацияИмяПользователя + 87 + true + true + + true + + + АутентификацияИмяПользователя + + + АутентификацияИмяПользователяРасширеннаяПодсказка + 180 + Label + true + true + + Left + + + + АутентификацияИмяПользователяКонтекстноеМеню + 88 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + АутентификацияПользовательОС + 85 + true + true + + true + + + АутентификацияПользовательОС + + + АутентификацияПользовательОСРасширеннаяПодсказка + 182 + Label + true + true + + Left + + + + АутентификацияПользовательОСКонтекстноеМеню + 86 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + АутентификацияТекущийПользовательОС + 89 + true + true + + true + + + АутентификацияТекущийПользовательОС + + + АутентификацияТекущийПользовательОСРасширеннаяПодсказка + 184 + Label + true + true + + Left + + + + АутентификацияТекущийПользовательОСКонтекстноеМеню + 90 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Данные аутентификации</value> + + + ru + Данные аутентификации + + + ДанныеАутентификацииРасширеннаяПодсказка + 179 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ДанныеПользователяИБ + 91 + + ГоризонтальнаяГруппаСвойствПользователяИБ + 102 + + ТаблицаСвойствПользователяИБ + 94 + + <key>ru</key> + <value>Свойства пользователя</value> + + true + true + + true + + + ТаблицаДанных + + Top + Add + CancelSearch + Change + Copy + Delete + EndEdit + Find + MoveDown + MoveUp + SortListAsc + SortListDesc + None + + ТаблицаСвойствПользователяИБКоманднаяПанель + 96 + Left + + + Selection + ТаблицаДанныхВыбор + + + ТаблицаСвойствПользователяИБСтрокаПоиска + 190 + + ТаблицаСвойствПользователяИБСтрокаПоискаРасширеннаяПодсказка + 192 + Label + true + true + + Left + + + + ТаблицаСвойствПользователяИБСтрокаПоискаКонтекстноеМеню + 191 + true + + ТаблицаСвойствПользователяИБ + + true + + + + ТаблицаСвойствПользователяИБСостояниеПросмотра + 193 + + ТаблицаСвойствПользователяИБСостояниеПросмотраРасширеннаяПодсказка + 195 + Label + true + true + + Left + + + + ТаблицаСвойствПользователяИБСостояниеПросмотраКонтекстноеМеню + 194 + true + + ViewStatusAddition + ТаблицаСвойствПользователяИБ + + true + + + + ТаблицаСвойствПользователяИБУправлениеПоиском + 196 + + ТаблицаСвойствПользователяИБУправлениеПоискомРасширеннаяПодсказка + 198 + Label + true + true + + Left + + + + ТаблицаСвойствПользователяИБУправлениеПоискомКонтекстноеМеню + 197 + true + + SearchControlAddition + ТаблицаСвойствПользователяИБ + + true + + + + ТаблицаСвойствПользователяИБРасширеннаяПодсказка + 189 + Label + true + true + + Left + + + + ТаблицаСвойствПользователяИБКонтекстноеМеню + 95 + + ТаблицаСвойствПользователяИБКонтекстноеМенюВывестиСписок + 105 + true + true + + true + + + ТаблицаСвойствПользователяИБКонтекстноеМенюВывестиСписокРасширеннаяПодсказка + 188 + Label + true + true + + Left + + + Form.Item.ТаблицаСвойствПользователяИБ.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + + true + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + + + + ТаблицаРолейПользователяИБ + 98 + + <key>ru</key> + <value>Роли пользователя</value> + + true + true + + true + + + Роли + + Top + Add + CancelSearch + Change + Copy + Delete + EndEdit + Find + MoveDown + MoveUp + SortListAsc + SortListDesc + None + + ТаблицаРолейПользователяИБКоманднаяПанель + 100 + Left + + + Selection + ТаблицаДанныхВыбор + + + ТаблицаРолейПользователяИБСтрокаПоиска + 209 + + ТаблицаРолейПользователяИБСтрокаПоискаРасширеннаяПодсказка + 211 + Label + true + true + + Left + + + + ТаблицаРолейПользователяИБСтрокаПоискаКонтекстноеМеню + 210 + true + + ТаблицаРолейПользователяИБ + + true + + + + ТаблицаРолейПользователяИБСостояниеПросмотра + 212 + + ТаблицаРолейПользователяИБСостояниеПросмотраРасширеннаяПодсказка + 214 + Label + true + true + + Left + + + + ТаблицаРолейПользователяИБСостояниеПросмотраКонтекстноеМеню + 213 + true + + ViewStatusAddition + ТаблицаРолейПользователяИБ + + true + + + + ТаблицаРолейПользователяИБУправлениеПоиском + 215 + + ТаблицаРолейПользователяИБУправлениеПоискомРасширеннаяПодсказка + 217 + Label + true + true + + Left + + + + ТаблицаРолейПользователяИБУправлениеПоискомКонтекстноеМеню + 216 + true + + SearchControlAddition + ТаблицаРолейПользователяИБ + + true + + + + ТаблицаРолейПользователяИБРасширеннаяПодсказка + 208 + Label + true + true + + Left + + + + ТаблицаРолейПользователяИБКонтекстноеМеню + 99 + + ТаблицаРолейПользователяИБКонтекстноеМенюВывестиСписок + 106 + true + true + + true + + + ТаблицаРолейПользователяИБКонтекстноеМенюВывестиСписокРасширеннаяПодсказка + 207 + Label + true + true + + Left + + + Form.Item.ТаблицаРолейПользователяИБ.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + + true + 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> + + + ГоризонтальнаяГруппаСвойствПользователяИБРасширеннаяПодсказка + 187 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Данные пользователя ИБ</value> + + + ru + Данные пользователя ИБ + + + ДанныеПользователяИБРасширеннаяПодсказка + 186 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Представления данных</value> + + + ru + Представления данных + + + ПредставленияДанныхРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + Pages + + TabsOnBottom + Auto + +
    + true + true + + true + + + <key>ru</key> + <value>Данные</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + Данные + + + ГруппаДанныеРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + +
    + + ГруппаСобытие + 2 + + ПредставлениеСобытия + 13 + + <key>ru</key> + <value>Представление</value> + + true + true + + true + + + ПредставлениеСобытия + + None + + ПредставлениеСобытияРасширеннаяПодсказка + 227 + Label + true + true + + Left + + + + ПредставлениеСобытияКонтекстноеМеню + 14 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Комментарий + 19 + true + true + + true + + + Комментарий + + Top + + КомментарийРасширеннаяПодсказка + 229 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 20 + true + + InputField + true + Enter + true + Left + true + + true + 3 + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Событие</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + Событие + + + ГруппаСобытиеРасширеннаяПодсказка + 226 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Основное</value> + + + ru + Основное + + + ГруппаОсновоеРасширеннаяПодсказка + 118 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Equal + Auto + Auto + +
    + + ГруппаТранзакцияСоединение + 45 + + ГруппаСоединение + 6 + + Сеанс + 33 + true + true + + true + + + Сеанс + + + СеансРасширеннаяПодсказка + 233 + Label + true + true + + Left + + + + СеансКонтекстноеМеню + 34 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + РабочийСервер + 35 + true + true + + true + + + РабочийСервер + + + РабочийСерверРасширеннаяПодсказка + 235 + Label + true + true + + Left + + + + РабочийСерверКонтекстноеМеню + 36 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ОсновнойIPПорт + 38 + true + true + + true + + + ОсновнойIPПорт + + + ОсновнойIPПортРасширеннаяПодсказка + 237 + Label + true + true + + Left + + + + ОсновнойIPПортКонтекстноеМеню + 39 + true + + InputField + true + Enter + true + Left + true + + true + true + false + true + true + true + + Style.BorderColor + + Normal + + + + ВспомогательныйIPПорт + 40 + true + true + + true + + + ВспомогательныйIPПорт + + + ВспомогательныйIPПортРасширеннаяПодсказка + 239 + Label + true + true + + Left + + + + ВспомогательныйIPПортКонтекстноеМеню + 41 + true + + InputField + true + Enter + true + Left + true + + true + true + false + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Сеанс</value> + + + System.DefaultGUIFont + true + false + false + false + + + ГруппаСоединениеРасширеннаяПодсказка + 232 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + LeftNarrowest + auto + Auto + Auto + + + + ГруппаТранзакция + 5 + + Транзакция + 27 + true + true + + true + + + Транзакция + + + ТранзакцияРасширеннаяПодсказка + 242 + Label + true + true + + Left + + + + ТранзакцияКонтекстноеМеню + 28 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + СтатусТранзакции + 29 + true + true + + true + + + СтатусТранзакции + + + СтатусТранзакцииРасширеннаяПодсказка + 244 + Label + true + true + + Left + + + + СтатусТранзакцииКонтекстноеМеню + 30 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Транзакция</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + Транзакция + + + ГруппаТранзакцияРасширеннаяПодсказка + 241 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + ГруппаТранзакцияСоединениеРасширеннаяПодсказка + 231 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Equal + Auto + Auto + + + + ГруппаКнопок + 42 + + Закрыть + 43 + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 247 + Label + true + true + + Left + + + Form.StandardCommand.Close + PictureAndText + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Справка + 46 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 248 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа кнопок</value> + + + ru + Группа кнопок + + + ГруппаКнопокРасширеннаяПодсказка + 246 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + 100 + LockOwner + DefaultButton + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.ЖурналРегистрации + + + true + + + true + +
    true
    +
    + + Дата + + <key>ru</key> + <value>Дата, время</value> + + 2 + + Date + + + + 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 + + ValueList + 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> + + 9 + + String + + + + true + + + true + + + + СтатусТранзакции + + <key>ru</key> + <value>Статус завершения транзакции</value> + + 10 + + String + + + + true + + + true + + + + Сеанс + + <key>ru</key> + <value>Номер</value> + + 11 + + String + + + + true + + + true + + + + РабочийСервер + + <key>ru</key> + <value>Рабочий сервер</value> + + 12 + + String + + + + true + + + true + + + + ОсновнойIPПорт + + <key>ru</key> + <value>Основной IP порт</value> + + 13 + + String + + 12 + + + + true + + + true + + + + ВспомогательныйIPПорт + + <key>ru</key> + <value>Вспомог. IP порт</value> + + 14 + + String + + 12 + + + + true + + + true + + + + ИмяПользователя + + <key>ru</key> + <value>Пользователь</value> + + 15 + + String + + + + true + + + true + + + + ПредставлениеПриложения + + <key>ru</key> + <value>Приложение</value> + + 16 + + String + + + + true + + + true + + + + ТаблицаДанных + + <key>ru</key> + <value>Данные</value> + + 17 + + ValueTable + + + true + + + true + + + + ОтказПраваДоступа + + <key>ru</key> + <value>Отказ права</value> + + 18 + + String + + + + true + + + true + + + + ОтказДействияДоступа + + <key>ru</key> + <value>Отказ действия</value> + + 19 + + String + + + + true + + + true + + + + АутентификацияПользовательОС + + <key>ru</key> + <value>Пользователь ОС</value> + + 20 + + String + + + + true + + + true + + + + АутентификацияИмяПользователя + + <key>ru</key> + <value>Имя пользователя</value> + + 21 + + String + + + + true + + + true + + + + АутентификацияТекущийПользовательОС + + <key>ru</key> + <value>Текущий пользователь ОС</value> + + 22 + + String + + + + true + + + true + + + + Роли + + <key>ru</key> + <value>Роли</value> + + 23 + + ValueTable + + + true + + + true + + + + ВспомогательныйIPПорт + + String + + + + + Данные + + String + + + + + Дата + + Date + + + + + Транзакция + + String + + + + + Комментарий + + String + + + + + Компьютер + + String + + + + + ПредставлениеМетаданных + + ValueList + String + + + + + ОсновнойIPПорт + + String + + + + + ИмяПользователя + + String + + + + + ПредставлениеДанных + + String + + + + + ПредставлениеПриложения + + String + + + + + РабочийСервер + + String + + + + + Сеанс + + String + + + + + ПредставлениеСобытия + + String + + + + + СтатусТранзакции + + String + + + + + АдресДанных + + String + + + + + Событие + + 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..82da8cdba --- /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/ФормаСобытия/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Module.bsl new file mode 100644 index 000000000..35e6057ef --- /dev/null +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Module.bsl @@ -0,0 +1,146 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Дата = Параметры.Дата; + ИмяПользователя = Параметры.ИмяПользователя; + ПредставлениеПриложения = Параметры.ПредставлениеПриложения; + Компьютер = Параметры.Компьютер; + Событие = Параметры.Событие; + ПредставлениеСобытия = Параметры.ПредставлениеСобытия; + Комментарий = Параметры.Комментарий; + ПредставлениеМетаданных = Параметры.ПредставлениеМетаданных; + Данные = Параметры.Данные; + ПредставлениеДанных = Параметры.ПредставлениеДанных; + Транзакция = Параметры.Транзакция; + СтатусТранзакции = Параметры.СтатусТранзакции; + Сеанс = Параметры.Сеанс; + РабочийСервер = Параметры.РабочийСервер; + ОсновнойIPПорт = Параметры.ОсновнойIPПорт; + ВспомогательныйIPПорт = Параметры.ВспомогательныйIPПорт; + + // Для списка метаданных включается кнопка открытия + Если ТипЗнч(ПредставлениеМетаданных) = Тип("СписокЗначений") Тогда + Элементы.ПредставлениеМетаданных.КнопкаОткрытия = Истина; + Элементы.ПредставлениеМетаданныхДоступа.КнопкаОткрытия = Истина; + Элементы.ПредставлениеМетаданныхОтказаПраваДоступа.КнопкаОткрытия = Истина; + Элементы.ПредставлениеМетаданныхОтказаДействияДоступа.КнопкаОткрытия = Истина; + КонецЕсли; + + // Обработка данных специальных событий + Элементы.ДанныеДоступа.Видимость = Ложь; + Элементы.ДанныеОтказаПраваДоступа.Видимость = Ложь; + Элементы.ДанныеОтказаДействияДоступа.Видимость = Ложь; + Элементы.ДанныеАутентификации.Видимость = Ложь; + Элементы.ДанныеПользователяИБ.Видимость = Ложь; + Элементы.ПростыеДанные.Видимость = Ложь; + Элементы.ПредставленияДанных.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; + + Если Событие = "_$Access$_.Access" Тогда + Элементы.ПредставленияДанных.ТекущаяСтраница = Элементы.ДанныеДоступа; + Элементы.ДанныеДоступа.Видимость = Истина; + ДанныеСобытия = ПолучитьИзВременногоХранилища(Параметры.АдресДанных); + СоздатьТаблицуФормы("ТаблицаДанныхДоступа", "ТаблицаДанных", ДанныеСобытия.Данные); + Элементы.Комментарий.РастягиватьПоВертикали = Ложь; + Элементы.Комментарий.Высота = 1; + + ИначеЕсли Событие = "_$Access$_.AccessDenied" Тогда + ДанныеСобытия = ПолучитьИзВременногоХранилища(Параметры.АдресДанных); + + Если ДанныеСобытия.Свойство("Право") Тогда + Элементы.ПредставленияДанных.ТекущаяСтраница = Элементы.ДанныеОтказаПраваДоступа; + Элементы.ДанныеОтказаПраваДоступа.Видимость = Истина; + ОтказПраваДоступа = ДанныеСобытия.Право; + Иначе + Элементы.ПредставленияДанных.ТекущаяСтраница = Элементы.ДанныеОтказаДействияДоступа; + Элементы.ДанныеОтказаДействияДоступа.Видимость = Истина; + ОтказДействияДоступа = ДанныеСобытия.Действие; + СоздатьТаблицуФормы("ТаблицаДанныхОтказаДействияДоступа", "ТаблицаДанных", ДанныеСобытия.Данные); + Элементы.Комментарий.РастягиватьПоВертикали = Ложь; + Элементы.Комментарий.Высота = 1; + КонецЕсли; + + ИначеЕсли Событие = "_$Session$_.Authentication" + ИЛИ Событие = "_$Session$_.AuthenticationError" Тогда + ДанныеСобытия = ПолучитьИзВременногоХранилища(Параметры.АдресДанных); + Элементы.ПредставленияДанных.ТекущаяСтраница = Элементы.ДанныеАутентификации; + Элементы.ДанныеАутентификации.Видимость = Истина; + ДанныеСобытия.Свойство("Имя", АутентификацияИмяПользователя); + ДанныеСобытия.Свойство("ПользовательОС", АутентификацияПользовательОС); + ДанныеСобытия.Свойство("ТекущийПользовательОС", АутентификацияТекущийПользовательОС); + + ИначеЕсли Событие = "_$User$_.Delete" + ИЛИ Событие = "_$User$_.New" + ИЛИ Событие = "_$User$_.Update" Тогда + ДанныеСобытия = ПолучитьИзВременногоХранилища(Параметры.АдресДанных); + Элементы.ПредставленияДанных.ТекущаяСтраница = Элементы.ДанныеПользователяИБ; + Элементы.ДанныеПользователяИБ.Видимость = Истина; + СвойстваПользователяИБ = Новый ТаблицаЗначений; + СвойстваПользователяИБ.Колонки.Добавить("Имя"); + СвойстваПользователяИБ.Колонки.Добавить("Значение"); + МассивРолей = Неопределено; + Для каждого КлючИЗначение ИЗ ДанныеСобытия Цикл + Если КлючИЗначение.Ключ = "Роли" Тогда + МассивРолей = КлючИЗначение.Значение; + Продолжить; + КонецЕсли; + НоваяСтрока = СвойстваПользователяИБ.Добавить(); + НоваяСтрока.Имя = КлючИЗначение.Ключ; + НоваяСтрока.Значение = КлючИЗначение.Значение; + КонецЦикла; + СоздатьТаблицуФормы("ТаблицаСвойствПользователяИБ", "ТаблицаДанных", СвойстваПользователяИБ); + Если МассивРолей <> Неопределено Тогда + РолиПользователяИБ = Новый ТаблицаЗначений; + РолиПользователяИБ.Колонки.Добавить("Роль",, НСтр("ru = 'Роль'")); + Для каждого ТекущаяРоль Из МассивРолей Цикл + РолиПользователяИБ.Добавить().Роль = ТекущаяРоль; + КонецЦикла; + СоздатьТаблицуФормы("ТаблицаРолейПользователяИБ", "Роли", РолиПользователяИБ); + КонецЕсли; + Элементы.Комментарий.РастягиватьПоВертикали = Ложь; + Элементы.Комментарий.Высота = 1; + + Иначе + Элементы.ПредставленияДанных.ТекущаяСтраница = Элементы.ПростыеДанные; + Элементы.ПростыеДанные.Видимость = Истина; + КонецЕсли; + +КонецПроцедуры + +Процедура СоздатьТаблицуФормы(Знач ИмяПоляТаблицыФормы, Знач ИмяРеквизитаДанныеФормыКоллекция, Знач ТаблицаЗначений) + + Если ТипЗнч(ТаблицаЗначений) <> Тип("ТаблицаЗначений") Тогда + ТаблицаЗначений = Новый ТаблицаЗначений; + ТаблицаЗначений.Колонки.Добавить("Неопределено", , " "); + КонецЕсли; + + // Добавление реквизитов в таблицу формы + ДобавляемыеРеквизиты = Новый Массив; + Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ИмяРеквизитаДанныеФормыКоллекция, Колонка.Заголовок)); + КонецЦикла; + ИзменитьРеквизиты(ДобавляемыеРеквизиты); + + // Добавление элементов форму + Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл + ЭлементРеквизита = Элементы.Добавить(ИмяПоляТаблицыФормы + Колонка.Имя, Тип("ПолеФормы"), Элементы[ИмяПоляТаблицыФормы]); + ЭлементРеквизита.ПутьКДанным = ИмяРеквизитаДанныеФормыКоллекция + "." + Колонка.Имя; + КонецЦикла; + + ЗначениеВРеквизитФормы(ТаблицаЗначений, ИмяРеквизитаДанныеФормыКоллекция); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеМетаданныхОткрытие(Элемент, СтандартнаяОбработка) + + ОткрытьЗначение(ПредставлениеМетаданных); + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаДанныхВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ОткрытьЗначение(Элемент.ТекущиеДанные[Сред(Поле.Имя, СтрДлина(Элемент.Имя)+1)]); + +КонецПроцедуры diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/ManagerModule.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/ManagerModule.bsl new file mode 100644 index 000000000..cbc1256a0 --- /dev/null +++ b/SSL/src/DataProcessors/ЖурналРегистрации/ManagerModule.bsl @@ -0,0 +1,34 @@ + +// Возвращает значение перечисления соответствующе строковому имени статус события +// +Функция СтатусТранзакцииЗаписиЖурналаРегистрацииЗначениеПоИмени(Имя) Экспорт + + ЗначениеПеречисления = Неопределено; + Если Имя = "Зафиксирована" Тогда + ЗначениеПеречисления = СтатусТранзакцииЗаписиЖурналаРегистрации.Зафиксирована; + ИначеЕсли Имя = "НеЗавершена" Тогда + ЗначениеПеречисления = СтатусТранзакцииЗаписиЖурналаРегистрации.НеЗавершена; + ИначеЕсли Имя = "НетТранзакции" Тогда + ЗначениеПеречисления = СтатусТранзакцииЗаписиЖурналаРегистрации.НетТранзакции; + ИначеЕсли Имя = "Отменена" Тогда + ЗначениеПеречисления = СтатусТранзакцииЗаписиЖурналаРегистрации.Отменена; + КонецЕсли; + Возврат ЗначениеПеречисления; + +КонецФункции + +Функция УровеньЖурналаРегистрацииЗначениеПоИмени(Имя) Экспорт + + ЗначениеПеречисления = Неопределено; + Если Имя = "Информация" Тогда + ЗначениеПеречисления = УровеньЖурналаРегистрации.Информация; + ИначеЕсли Имя = "Ошибка" Тогда + ЗначениеПеречисления = УровеньЖурналаРегистрации.Ошибка; + ИначеЕсли Имя = "Предупреждение" Тогда + ЗначениеПеречисления = УровеньЖурналаРегистрации.Предупреждение; + ИначеЕсли Имя = "Примечание" Тогда + ЗначениеПеречисления = УровеньЖурналаРегистрации.Примечание; + КонецЕсли; + Возврат ЗначениеПеречисления; + +КонецФункции 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/ЖурналРегистрации/ЖурналРегистрации.mdo b/SSL/src/DataProcessors/ЖурналРегистрации/ЖурналРегистрации.mdo new file mode 100644 index 000000000..039f9092b --- /dev/null +++ b/SSL/src/DataProcessors/ЖурналРегистрации/ЖурналРегистрации.mdo @@ -0,0 +1,69 @@ + + + + + + + ЖурналРегистрации + + ru + Журнал регистрации + + true + DataProcessor.ЖурналРегистрации.Form.ЖурналРегистрации + + ЖурналРегистрации + + ru + Журнал регистрации + + + + ru + + + PersonalComputer + MobileDevice + + + ОтборЖурналаРегистрации + + ru + Отбор журнала регистрации + + PersonalComputer + MobileDevice + + + РедакторСоставаСвойства + + ru + Редактор состава свойства + + PersonalComputer + MobileDevice + + + ФормаСобытия + + ru + Событие + + + + ru + + + PersonalComputer + MobileDevice + + + ЖурналРегистрации + + ru + Журнал регистрации + + NavigationPanelOrdinary + Auto + + diff --git a/SSL/src/DataProcessors/ЗагрузкаПравилКонвертацииОбъектов/ObjectModule.bsl b/SSL/src/DataProcessors/ЗагрузкаПравилКонвертацииОбъектов/ObjectModule.bsl new file mode 100644 index 000000000..6eda8d237 --- /dev/null +++ b/SSL/src/DataProcessors/ЗагрузкаПравилКонвертацииОбъектов/ObjectModule.bsl @@ -0,0 +1,588 @@ +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПЕРЕМЕННЫЕ + +Перем ФлагОшибки Экспорт; // глобальный флаг ошибки + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПЕРЕМЕННЫЕ МОДУЛЯ + +Перем ТипСтрока; +Перем ТипБулево; +Перем ТипЧисло; +Перем ТипДата; + +Перем ЗначениеПустойДаты; + +Перем СообщенияОбОшибках; // Соответствие. Ключ - код ошибки, Значение - описание ошибки + +Перем ДеревоПравилВыгрузкиДанных; // дерево значений с правилами выгрузки данных + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Возвращает структуру правил обмена +Функция ПолучитьСтруктуруПравилОбмена(ИмяФайла) Экспорт + + ЗагрузитьПравила(ИмяФайла); + + Если ФлагОшибки Тогда + Возврат Неопределено; + КонецЕсли; + + // получаем таблицу выгрузки данных из дерева значений + ПравилаВыгрузкиДанных = ПолучитьТаблицуПравилВыгрузкиДанных(); + + // возвращаемое значение функции + СтруктураПравилОбмена = Новый Структура; + + СтруктураПравилОбмена.Вставить("ТаблицаПравилВыгрузки", ПравилаВыгрузкиДанных); + + Возврат СтруктураПравилОбмена; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ЗАГРУЗКИ ПРАВИЛ КОНВЕРТАЦИИ ОБЪЕКТОВ + +// Выполняет чтение XML-файла с правилами конвертации. Заполняет значения коллекций по данным файла; +// +// Параметры: +// ИмяФайла - Строка - полное имя файла в локальной файловой системе, в котором содержатся правила +// +Процедура ЗагрузитьПравила(Знач ИмяФайла) + + ФлагОшибки = Ложь; + + Если ПустаяСтрока(ИмяФайла) Тогда + СообщитьОбОшибкеОбработки(4); + Возврат; + КонецЕсли; + + // выполняем инициализацию коллекций для правил + ИнициализацияДереваПВД(); + + // ЗАГРУЗКА ПРАВИЛ КОНВЕРТАЦИИ + Попытка + ЗагрузитьКонвертациюИзФайла(ИмяФайла); + Исключение + + // фиксируем ошибку + СообщитьОбОшибкеОбработки(2, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + КонецПопытки; + +КонецПроцедуры + +Процедура ЗагрузитьКонвертациюИзФайла(ИмяФайла) + + // открываем файл для чтения + Попытка + Правила = Новый ЧтениеXML(); + Правила.ОткрытьФайл(ИмяФайла); + Правила.Прочитать(); + Исключение + Правила = Неопределено; + СообщитьОбОшибкеОбработки(1, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат; + КонецПопытки; + + Попытка + ЗагрузитьКонвертацию(Правила); + Исключение + СообщитьОбОшибкеОбработки(2, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Правила.Закрыть(); + Правила = Неопределено; + +КонецПроцедуры + +// Осуществляет загрузку правил конвертации в соответствии с форматом +// +// Параметры: +// +Процедура ЗагрузитьКонвертацию(Правила) + + Если Не ((Правила.ЛокальноеИмя = "ПравилаОбмена") + И (Правила.ТипУзла = ТипУзлаXML.НачалоЭлемента)) Тогда + + // Ошибка формата правил + СообщитьОбОшибкеОбработки(3); + + Возврат; + + КонецЕсли; + + Пока Правила.Прочитать() Цикл + + ИмяУзла = Правила.ЛокальноеИмя; + ТипУзла = Правила.ТипУзла; + + // Правила выгрузки данных + Если ИмяУзла = "ПравилаВыгрузкиДанных" Тогда + + ЗагрузитьПравилаВыгрузкиДанных(Правила); + + ИначеЕсли (ИмяУзла = "ПравилаОбмена") И (ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; // выход + + Иначе + + одПропустить(Правила); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Осуществляет загрузку правил выгрузки данных в соответствии с форматом +// +// Параметры: +// Правила - Объект типа XMLЧтение +// +Процедура ЗагрузитьПравилаВыгрузкиДанных(Правила) + + Пока Правила.Прочитать() Цикл + + ИмяУзла = Правила.ЛокальноеИмя; + + Если ИмяУзла = "Правило" Тогда + + ЗагрузитьПравилоВыгрузкиДанных(Правила, ДеревоПравилВыгрузкиДанных); + + ИначеЕсли ИмяУзла = "Группа" Тогда + + ЗагрузитьГруппуПравилВыгрузкиДанных(Правила, ДеревоПравилВыгрузкиДанных); + + ИначеЕсли (ИмяУзла = "ПравилаВыгрузкиДанных") И (Правила.ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; + + Иначе + + одПропустить(Правила); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // ЗагрузитьПравилаВыгрузкиДанных() + +// Осуществляет загрузку правила выгрузки данных +// +// Параметры: +// Правила - Объект типа XMLЧтение +// +Процедура ЗагрузитьПравилоВыгрузкиДанных(Правила, ДеревоЗначений) + + НоваяСтрока = ДеревоЗначений.Строки.Добавить(); + + НоваяСтрока.ЭтоГруппа = Ложь; + НоваяСтрока.Включить = Не одАтрибут(Правила, ТипБулево, "Отключить"); + + Пока Правила.Прочитать() Цикл + + ИмяУзла = Правила.ЛокальноеИмя; + + Если ИмяУзла = "Код" Тогда + + НоваяСтрока.Имя = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "Наименование" Тогда + + НоваяСтрока.Наименование = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "Порядок" Тогда + + НоваяСтрока.Порядок = одЗначениеЭлемента(Правила, ТипЧисло); + + ИначеЕсли ИмяУзла = "СпособОтбораДанных" Тогда + + НоваяСтрока.СпособОтбораДанных = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "ИмяТипаПриемника" Тогда + + НоваяСтрока.ИмяТипаПриемника = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "КодПравилаКонвертации" Тогда + + НоваяСтрока.ПравилоКонвертации = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "ОбъектВыборки" Тогда + + НоваяСтрока.ОбъектВыборкиСтрокой = одЗначениеЭлемента(Правила, ТипСтрока); + + // Обработчики событий + + ИначеЕсли ИмяУзла = "ПередОбработкойПравила" Тогда + НоваяСтрока.ПередОбработкой = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "ПослеОбработкиПравила" Тогда + НоваяСтрока.ПослеОбработки = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "ПередВыгрузкойОбъекта" Тогда + НоваяСтрока.ПередВыгрузкой = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "ПослеВыгрузкиОбъекта" Тогда + НоваяСтрока.ПослеВыгрузки = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли (ИмяУзла = "Правило") И (Правила.ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; + + Иначе + + одПропустить(Правила); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // ЗагрузитьПравилоВыгрузкиДанных() + +// Осуществляет загрузку группы правил выгрузки данных +// +// Параметры: +// Правила - Объект типа XMLЧтение +// +Процедура ЗагрузитьГруппуПравилВыгрузкиДанных(Правила, ДеревоЗначений) + + НоваяСтрока = ДеревоЗначений.Строки.Добавить(); + + НоваяСтрока.ЭтоГруппа = Истина; + НоваяСтрока.Включить = Не одАтрибут(Правила, ТипБулево, "Отключить"); + + Пока Правила.Прочитать() Цикл + + ИмяУзла = Правила.ЛокальноеИмя; + + Если ИмяУзла = "Правило" Тогда + + ЗагрузитьПравилоВыгрузкиДанных(Правила, НоваяСтрока); + + ИначеЕсли ИмяУзла = "Группа" И Правила.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + + ЗагрузитьГруппуПравилВыгрузкиДанных(Правила, НоваяСтрока); + + ИначеЕсли ИмяУзла = "Код" Тогда + + НоваяСтрока.Имя = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "Наименование" Тогда + + НоваяСтрока.Наименование = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "Порядок" Тогда + + НоваяСтрока.Порядок = одЗначениеЭлемента(Правила, ТипЧисло); + + ИначеЕсли (ИмяУзла = "Группа") И (Правила.ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; // выход + + Иначе + + одПропустить(Правила); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // ЗагрузитьГруппуПравилВыгрузкиДанных() + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +Процедура СообщитьОбОшибкеОбработки(Код = -1, ОписаниеОшибки = "") + + // взводим глобальный флаг ошибки + ФлагОшибки = Истина; + + Если СообщенияОбОшибках = Неопределено Тогда + СообщенияОбОшибках = ИнициализацияСообщений(); + КонецЕсли; + + СтрокаСообщения = СообщенияОбОшибках[Код]; + + СтрокаСообщения = ?(СтрокаСообщения = Неопределено, "", СтрокаСообщения); + + Если Не ПустаяСтрока(ОписаниеОшибки) Тогда + + СтрокаСообщения = СтрокаСообщения + Символы.ПС + ОписаниеОшибки; + + КонецЕсли; + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщения); + +КонецПроцедуры + +Процедура ПрочитатьГруппуДереваЗначенийПВД(ПравилаВыгрузкиДанных, ДеревоЗначений, Порядок) + + Для Каждого СтрокаДерева ИЗ ДеревоЗначений.Строки Цикл + + Если СтрокаДерева.ЭтоГруппа Тогда + + ПрочитатьГруппуДереваЗначенийПВД(ПравилаВыгрузкиДанных, СтрокаДерева, Порядок); + + Иначе + + СтрокаТаблицы = ПравилаВыгрузкиДанных.Добавить(); + + ЗаполнитьЗначенияСвойств(СтрокаТаблицы, СтрокаДерева); + + // переопределяем значение поля "Порядок" + СтрокаТаблицы.Порядок = Порядок; + + Порядок = Порядок + 1; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьТаблицуПравилВыгрузкиДанных() + + ПравилаВыгрузкиДанных = Новый ТаблицаЗначений; + + // инициализируем колонки таблицы + ИнициализацияКолонокПВД(ПравилаВыгрузкиДанных.Колонки); + + // заполняем значениями поля таблицы ПравилаВыгрузкиДанных + // поле "Порядок" переопределяется; Порядок назначается сквозь всю иерархию, глобально для всей таблицы + ПрочитатьГруппуДереваЗначенийПВД(ПравилаВыгрузкиДанных, ДеревоПравилВыгрузкиДанных, 0); + + Возврат ПравилаВыгрузкиДанных; +КонецФункции + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ОБЪЕКТОМ XMLЧтение + +// Читает значение атрибута по имени из указанного объекта, приводит значение +// к указанному примитивному типу +// +// Параметры: +// Объект - объект типа XMLЧтение, спозиционированный на начале элемента, +// атрибут которого требуется получить +// Тип - Значение типа Тип. Тип атрибута +// Имя - Строка. Имя атрибута +// +// Возвращаемое значение: +// Значение атрибута полученное по имени и приведенное к указанному типу +// +Функция одАтрибут(Объект, Тип, Имя) + + СтрЗначение = СокрП(Объект.ПолучитьАтрибут(Имя)); + + Если Не ПустаяСтрока(СтрЗначение) Тогда + + Возврат XMLЗначение(Тип, СтрЗначение); + + Иначе + Если Тип = ТипСтрока Тогда + Возврат ""; + + ИначеЕсли Тип = ТипБулево Тогда + Возврат Ложь; + + ИначеЕсли Тип = ТипЧисло Тогда + Возврат 0; + + ИначеЕсли Тип = ТипДата Тогда + Возврат ЗначениеПустойДаты; + + КонецЕсли; + КонецЕсли; + +КонецФункции // одАтрибут() + +// Возвращает объект ОписаниеТипов, содержащий указанный тип +// +// Параметры: +// ЗначениеТипа - Строка с именем типа или значение типа Тип +// +// Возвращаемое значение: +// ОписаниеТипов +// +Функция одОписаниеТипа(ЗначениеТипа) + + МассивТипов = Новый Массив; + Если ТипЗнч(ЗначениеТипа) = ТипСтрока Тогда + МассивТипов.Добавить(Тип(ЗначениеТипа)); + Иначе + МассивТипов.Добавить(ЗначениеТипа); + КонецЕсли; + ОписаниеТипов = Новый ОписаниеТипов(МассивТипов); + + Возврат ОписаниеТипов; + +КонецФункции // одОписаниеТипа() + +// Читает текст элемента и приводит значение к указанному типу +// +// Параметры: +// Объект - объект типа XMLЧтение, из которого осуществляется чтение +// Тип - тип получаемого значения +// ИскатьПоСвойству - для ссылочных типов может быть указано свойство, по которому +// следует искать объект: "Код", "Наименование", <ИмяРеквизита>, "Имя" (предопределенного значения) +// +// Возвращаемое значение: +// Значение xml-элемента, приведенное к соответствующему типу +// +Функция одЗначениеЭлемента(Объект, Тип, ИскатьПоСвойству="") + + Значение = ""; + Имя = Объект.ЛокальноеИмя; + + Пока Объект.Прочитать() Цикл + + ИмяУзла = Объект.ЛокальноеИмя; + ТипУзла = Объект.ТипУзла; + + Если ТипУзла = ТипУзлаXML.Текст Тогда + + Значение = СокрП(Объект.Значение); + + ИначеЕсли (ИмяУзла = Имя) И (ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; + + Иначе + + Возврат Неопределено; + + КонецЕсли; + КонецЦикла; + + Возврат XMLЗначение(Тип, Значение) + +КонецФункции // одЗначениеЭлемента() + +// Пропускает узлы xml до конца указанного элемента (по умолчанию текущего) +// +// Параметры: +// Объект - объект типа XMLЧтение +// Имя - имя узла, до конца которого пропускаем элементы +// +Процедура одПропустить(Объект, Имя = "") + + КолвоВложений = 0; // количество одноименных вложений + + Если ПустаяСтрока(Имя) Тогда + + Имя = Объект.ЛокальноеИмя; + + КонецЕсли; + + Пока Объект.Прочитать() Цикл + + ИмяУзла = Объект.ЛокальноеИмя; + ТипУзла = Объект.ТипУзла; + + Если ИмяУзла = Имя Тогда + + Если ТипУзла = ТипУзлаXML.КонецЭлемента Тогда + + Если КолвоВложений = 0 Тогда + Прервать; + Иначе + КолвоВложений = КолвоВложений - 1; + КонецЕсли; + + ИначеЕсли ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + + КолвоВложений = КолвоВложений + 1; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // одПропустить() + +//////////////////////////////////////////////////////////////////////////////// +// ИНИЦИАЛИЗАЦИЯ РЕКВИЗИТОВ И МОДУЛЬНЫХ ПЕРЕМЕННЫХ + +// Инициализирует реквизиты обработки и модульные переменные +// +// Параметры: +// Нет. +// +Процедура ИнициализацияРеквизитовИМодульныхПеременных() + + ФлагОшибки = Ложь; + + // Типы + ТипСтрока = Тип("Строка"); + ТипБулево = Тип("Булево"); + ТипЧисло = Тип("Число"); + ТипДата = Тип("Дата"); + + ЗначениеПустойДаты = Дата('00010101'); + +КонецПроцедуры // ИнициализацияРеквизитовИМодульныхПеременных() + +// Инициализирует переменную, содержащую соответствия кодов сообщений их описаниям +// +// Параметры: +// Нет. +// +Функция ИнициализацияСообщений() + + Сообщения = Новый Соответствие; + + Сообщения.Вставить(0, НСтр("ru = 'Внутренняя ошибка'")); + Сообщения.Вставить(1, НСтр("ru = 'Ошибка открытия файла правил'")); + Сообщения.Вставить(2, НСтр("ru = 'Ошибка при загрузке правил'")); + Сообщения.Вставить(3, НСтр("ru = 'Ошибка формата правил'")); + Сообщения.Вставить(4, НСтр("ru = 'Ошибка при получении файла правил для чтения'")); + + Возврат Сообщения; + +КонецФункции // ИнициализацияСообщений() + +// Инициализирует колонки дерева правил выгрузки данных +// +// Параметры: +// Нет. +// +Процедура ИнициализацияДереваПВД() + + ДеревоПравилВыгрузкиДанных = Новый ДеревоЗначений; + + ИнициализацияКолонокПВД(ДеревоПравилВыгрузкиДанных.Колонки); + +КонецПроцедуры + +Процедура ИнициализацияКолонокПВД(Колонки) + + Колонки.Очистить(); + + Колонки.Добавить("ЭтоГруппа", одОписаниеТипа("Булево")); + Колонки.Добавить("Включить", одОписаниеТипа("Булево")); + + Колонки.Добавить("Имя", одОписаниеТипа("Строка")); + Колонки.Добавить("Наименование", одОписаниеТипа("Строка")); + Колонки.Добавить("Порядок", одОписаниеТипа("Число")); + + Колонки.Добавить("СпособОтбораДанных", одОписаниеТипа("Строка")); + Колонки.Добавить("ПравилоКонвертации", одОписаниеТипа("Строка")); + Колонки.Добавить("ИмяТипаПриемника", одОписаниеТипа("Строка")); + + Колонки.Добавить("ПередОбработкой", одОписаниеТипа("Строка")); + Колонки.Добавить("ПослеОбработки", одОписаниеТипа("Строка")); + Колонки.Добавить("ПередВыгрузкой", одОписаниеТипа("Строка")); + Колонки.Добавить("ПослеВыгрузки", одОписаниеТипа("Строка")); + + Колонки.Добавить("ОбъектВыборкиСтрокой", одОписаниеТипа("Строка")); // строковое представление объекта метаданных + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ + +ИнициализацияРеквизитовИМодульныхПеременных(); diff --git a/SSL/src/DataProcessors/ЗагрузкаПравилКонвертацииОбъектов/ЗагрузкаПравилКонвертацииОбъектов.mdo b/SSL/src/DataProcessors/ЗагрузкаПравилКонвертацииОбъектов/ЗагрузкаПравилКонвертацииОбъектов.mdo new file mode 100644 index 000000000..83107bdea --- /dev/null +++ b/SSL/src/DataProcessors/ЗагрузкаПравилКонвертацииОбъектов/ЗагрузкаПравилКонвертацииОбъектов.mdo @@ -0,0 +1,12 @@ + + + + + + + ЗагрузкаПравилКонвертацииОбъектов + + ru + Загрузка правил конвертации объектов + + diff --git a/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ManagerModule.bsl b/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ManagerModule.bsl new file mode 100644 index 000000000..c58444ef5 --- /dev/null +++ b/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ManagerModule.bsl @@ -0,0 +1,89 @@ + +// Инициализирует колонки таблицы правил регистрации объектов +// +// Параметры: +// Нет. +// +Функция ИнициализацияТаблицыПРО() Экспорт + + ПравилаРегистрацииОбъектов = Новый ТаблицаЗначений; + + Колонки = ПравилаРегистрацииОбъектов.Колонки; + + Колонки.Добавить("ОбъектНастройки"); + Колонки.Добавить("ОбъектМетаданныхИмя"); + + Колонки.Добавить("ТекстЗапроса", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("СвойстваОбъекта", Новый ОписаниеТипов("Структура")); + + // признаки того, что правила пустые + Колонки.Добавить("ПравилоПоСвойствамОбъектаПустое", Новый ОписаниеТипов("Булево")); + + Колонки.Добавить("ОтборПоСвойствамПланаОбмена", Новый ОписаниеТипов("ДеревоЗначений")); + Колонки.Добавить("ОтборПоСвойствамОбъекта", Новый ОписаниеТипов("ДеревоЗначений")); + + Колонки.Добавить("ИмяПланаОбмена", Новый ОписаниеТипов("Строка")); + + // обработчики событий + Колонки.Добавить("ПередОбработкой", Новый ОписаниеТипов("Строка")); + + Колонки.Добавить("ЕстьОбработчикПередОбработкой", Новый ОписаниеТипов("Булево")); + + Возврат ПравилаРегистрацииОбъектов; + +КонецФункции + +// Инициализирует колонки таблицы правил регистрации по свойствам +// +// Параметры: +// Нет. +// +Функция ИнициализацияТаблицыОтборПоСвойствамПланаОбмена() Экспорт + + ШаблонДерева = Новый ДеревоЗначений; + + Колонки = ШаблонДерева.Колонки; + + Колонки.Добавить("ЭтоГруппа", Новый ОписаниеТипов("Булево")); + Колонки.Добавить("БулевоЗначениеГруппы", Новый ОписаниеТипов("Строка")); + + Колонки.Добавить("СвойствоОбъекта", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("ВидСравнения", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("ЭтоСтрокаКонстанты", Новый ОписаниеТипов("Булево")); + Колонки.Добавить("ТипСвойстваОбъекта", Новый ОписаниеТипов("Строка")); + + Колонки.Добавить("ПараметрУзла", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("ТабличнаяЧастьПараметраУзла", Новый ОписаниеТипов("Строка")); + + Колонки.Добавить("ЗначениеКонстанты"); // произвольный тип + + Возврат ШаблонДерева; + +КонецФункции + +// Инициализирует колонки таблицы правил регистрации по свойствам +// +// Параметры: +// Нет. +// +Функция ИнициализацияТаблицыОтборПоСвойствамОбъекта() Экспорт + + ШаблонДерева = Новый ДеревоЗначений; + + Колонки = ШаблонДерева.Колонки; + + Колонки.Добавить("ЭтоГруппа", Новый ОписаниеТипов("Булево")); + Колонки.Добавить("ЭтоОператорИ", Новый ОписаниеТипов("Булево")); + + Колонки.Добавить("СвойствоОбъекта", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("КлючСвойстваОбъекта", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("ВидСравнения", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("ТипСвойстваОбъекта", Новый ОписаниеТипов("Строка")); + Колонки.Добавить("ВидЭлементаОтбора", Новый ОписаниеТипов("Строка")); + + Колонки.Добавить("ЗначениеКонстанты"); // произвольный тип + Колонки.Добавить("ЗначениеСвойства"); // произвольный тип + + Возврат ШаблонДерева; + +КонецФункции diff --git a/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ObjectModule.bsl b/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ObjectModule.bsl new file mode 100644 index 000000000..18bd26522 --- /dev/null +++ b/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ObjectModule.bsl @@ -0,0 +1,1198 @@ +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПЕРЕМЕННЫЕ + +Перем Регистрация Экспорт; // структура, содержащая параметры регистрации +Перем ПравилаРегистрацииОбъектов Экспорт; // таблица значений с правилами регистрации объектов +Перем ФлагОшибки Экспорт; // глобальный флаг ошибки + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПЕРЕМЕННЫЕ МОДУЛЯ + +Перем ТипСтрока; +Перем ТипБулево; +Перем ТипЧисло; +Перем ТипДата; + +Перем ЗначениеПустойДаты; +Перем ШаблонДереваОтборПоСвойствамПланаОбмена; // шаблон дерева значений для правил регистрации по свойствам Плана обмена +Перем ШаблонДереваОтборПоСвойствамОбъекта; // шаблон дерева значений для правил регистрации по свойствам Объекта +Перем БулевоЗначениеКорневойГруппыСвойств; // булево значение для корневой группы свойств +Перем СообщенияОбОшибках; // Соответствие. Ключ - код ошибки, Значение - описание ошибки + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Выполняет синтаксический анализ XML-файла с правилами регистрации. Заполняет значения коллекций по данным файла; +// Подготавливает зачитанные правила для проигрывателя ПРО ("компиляция" правил) +// +// Параметры: +// ИмяФайла - Строка - полное имя файла в локальной файловой системе, в котором содержатся правила +// ТолькоИнформация - Булево - признак того, что необходимо зачитать только заголовок файла и информацией о правилах; +// (значение по умолчанию - Ложь) +// +Процедура ЗагрузитьПравила(Знач ИмяФайла, ТолькоИнформация = Ложь) Экспорт + + ФлагОшибки = Ложь; + + Если ПустаяСтрока(ИмяФайла) Тогда + СообщитьОбОшибкеОбработки(4); + Возврат; + КонецЕсли; + + // выполняем инициализацию коллекций для правил + Регистрация = ИнициализацияРегистрации(); + ПравилаРегистрацииОбъектов = Обработки.ЗагрузкаПравилРегистрацииОбъектов.ИнициализацияТаблицыПРО(); + ШаблонДереваОтборПоСвойствамПланаОбмена = Обработки.ЗагрузкаПравилРегистрацииОбъектов.ИнициализацияТаблицыОтборПоСвойствамПланаОбмена(); + ШаблонДереваОтборПоСвойствамОбъекта = Обработки.ЗагрузкаПравилРегистрацииОбъектов.ИнициализацияТаблицыОтборПоСвойствамОбъекта(); + + // ЗАГРУЗКА ПРАВИЛ РЕГИСТРАЦИИ + Попытка + ЗагрузитьРегистрациюИзФайла(ИмяФайла, ТолькоИнформация); + Исключение + + // фиксируем ошибку + СообщитьОбОшибкеОбработки(2, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + КонецПопытки; + + // выходим, если чтение правил из файла завершено с ошибками + Если ФлагОшибки Тогда + Возврат; + КонецЕсли; + + Если ТолькоИнформация Тогда + Возврат; + КонецЕсли; + + // ПОДГОТОВКА ПРАВИЛ ДЛЯ ПРОИГРЫВАТЕЛЯ ПРО + + Для Каждого ПРО ИЗ ПравилаРегистрацииОбъектов Цикл + + ПодготовитьПравилоРегистрацииПоСвойствамПланаОбмена(ПРО); + + ПодготовитьПравилоРегистрацииПоСвойствамОбъекта(ПРО); + + КонецЦикла; + + ПравилаРегистрацииОбъектов.ЗаполнитьЗначения(Регистрация.ИмяПланаОбмена, "ИмяПланаОбмена"); + +КонецПроцедуры + +// Подготавливает строку с информацией о правилах на основании зачитанных данных из XML-файла +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// СтрокаИнформации - Строка - строка с информацией о правилах +// +Функция ПолучитьИнформациюОПравилах() Экспорт + + // возвращаемое значение функции + СтрокаИнформации = ""; + + Если ФлагОшибки Тогда + Возврат СтрокаИнформации; + КонецЕсли; + + СтрокаИнформации = НСтр("ru = 'Правила регистрации объектов + |Дата создания: [ДатаВремяСоздания] + |План обмена: [ИмяПланаОбмена] + |Конфигурация: [ПредставлениеКонфигурации]'"); + // + СтрокаИнформации = СтрЗаменить(СтрокаИнформации, "[ДатаВремяСоздания]", Регистрация.ДатаВремяСоздания); + СтрокаИнформации = СтрЗаменить(СтрокаИнформации, "[ИмяПланаОбмена]", Регистрация.ИмяПланаОбмена); + СтрокаИнформации = СтрЗаменить(СтрокаИнформации, "[ПредставлениеКонфигурации]", ПолучитьПредставлениеКонфигурацииИзПравилРегистрации()); + + Возврат СтрокаИнформации; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ВНУТРЕННИЕ СВОЙСТВА + +Функция КлючСообщенияЖурналаРегистрации() + + Возврат "Обмен данными"; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ЗАГРУЗКИ ПРАВИЛ РЕГИСТРАЦИИ ОБЪЕКТОВ (ПРО) + +Процедура ЗагрузитьРегистрациюИзФайла(ИмяФайла, ТолькоИнформация) + + // открываем файл для чтения + Попытка + Правила = Новый ЧтениеXML(); + Правила.ОткрытьФайл(ИмяФайла); + Правила.Прочитать(); + Исключение + Правила = Неопределено; + СообщитьОбОшибкеОбработки(1, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат; + КонецПопытки; + + Попытка + ЗагрузитьРегистрацию(Правила, ТолькоИнформация); + Исключение + СообщитьОбОшибкеОбработки(2, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Правила.Закрыть(); + Правила = Неопределено; + +КонецПроцедуры + +// Осуществляет загрузку правил регистрации в соответствии с форматом +// +// Параметры: +// +Процедура ЗагрузитьРегистрацию(Правила, ТолькоИнформация) + + Если Не ((Правила.ЛокальноеИмя = "ПравилаРегистрации") + И (Правила.ТипУзла = ТипУзлаXML.НачалоЭлемента)) Тогда + + // Ошибка формата правил + СообщитьОбОшибкеОбработки(3); + + Возврат; + + КонецЕсли; + + Пока Правила.Прочитать() Цикл + + ИмяУзла = Правила.ЛокальноеИмя; + ТипУзла = Правила.ТипУзла; + + // Реквизиты регистрации + Если ИмяУзла = "ВерсияФормата" Тогда + + Регистрация.ВерсияФормата = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "Ид" Тогда + + Регистрация.Ид = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "Наименование" Тогда + + Регистрация.Наименование = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "ДатаВремяСоздания" Тогда + + Регистрация.ДатаВремяСоздания = одЗначениеЭлемента(Правила, ТипДата); + + ИначеЕсли ИмяУзла = "ПланОбмена" Тогда + + // атрибуты для плана обмена + Регистрация.ИмяПланаОбмена = одАтрибут(Правила, ТипСтрока, "Имя"); + + Регистрация.ПланОбмена = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "Комментарий" Тогда + + Регистрация.Комментарий = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "Конфигурация" Тогда + + // атрибуты конфигурации + Регистрация.ВерсияПлатформы = одАтрибут(Правила, ТипСтрока, "ВерсияПлатформы"); + Регистрация.ВерсияКонфигурации = одАтрибут(Правила, ТипСтрока, "ВерсияКонфигурации"); + Регистрация.СинонимКонфигурации = одАтрибут(Правила, ТипСтрока, "СинонимКонфигурации"); + + // наименование конфигурации + Регистрация.Конфигурация = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "ПравилаРегистрацииОбъектов" Тогда + + Если ТолькоИнформация Тогда + + Прервать; // выход; если необходимо выполнить загрузку только информации о регистрации + + Иначе + + // проверка загрузки ПРО для требуемого плана обмена + ВыполнитьПроверкуНаличияПланаОбмена(); + + Если ФлагОшибки Тогда + Прервать; // выход; загрузку не выполняем, если в правилах указан не тот план обмена + КонецЕсли; + + ЗагрузитьПравилаРегистрации(Правила); + + КонецЕсли; + + ИначеЕсли (ИмяУзла = "ПравилаРегистрации") И (ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; // выход + + Иначе + + одПропустить(Правила); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Осуществляет загрузку правил регистрации в соответствии с форматом правил обмена +// +// Параметры: +// Правила - Объект типа XMLЧтение +// +Процедура ЗагрузитьПравилаРегистрации(Правила) + + Пока Правила.Прочитать() Цикл + + ИмяУзла = Правила.ЛокальноеИмя; + + Если ИмяУзла = "Правило" Тогда + + ЗагрузитьПравилоРегистрации(Правила); + + ИначеЕсли ИмяУзла = "Группа" Тогда + + ЗагрузитьГруппуПравилРегистрации(Правила); + + ИначеЕсли (ИмяУзла = "ПравилаРегистрацииОбъектов") И (Правила.ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; + + Иначе + + одПропустить(Правила); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // ЗагрузитьПравилаРегистрации() + +// Осуществляет загрузку правила регистрации объектов +// +// Параметры: +// Правила - Объект типа XMLЧтение +// +Процедура ЗагрузитьПравилоРегистрации(Правила) + + // правила с установленным признаком "Отключить" не грузим + Отключить = одАтрибут(Правила, ТипБулево, "Отключить"); + Если Отключить Тогда + одПропустить(Правила); + Возврат; + КонецЕсли; + + // правила с ошибками не грузим + Валидное = одАтрибут(Правила, ТипБулево, "Валидное"); + Если Не Валидное Тогда + одПропустить(Правила); + Возврат; + КонецЕсли; + + НоваяСтрока = ПравилаРегистрацииОбъектов.Добавить(); + + Пока Правила.Прочитать() Цикл + + ИмяУзла = Правила.ЛокальноеИмя; + + Если ИмяУзла = "ОбъектНастройки" Тогда + + НоваяСтрока.ОбъектНастройки = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "ОбъектМетаданныхИмя" Тогда + + НоваяСтрока.ОбъектМетаданныхИмя = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "ОтборПоСвойствамПланаОбмена" Тогда + + // инициализируем коллекцию свойств для текущего ПРО + НоваяСтрока.ОтборПоСвойствамПланаОбмена = ШаблонДереваОтборПоСвойствамПланаОбмена.Скопировать(); + + ЗагрузитьДеревоОтбораПоСвойствамПланаОбмена(Правила, НоваяСтрока.ОтборПоСвойствамПланаОбмена); + + ИначеЕсли ИмяУзла = "ОтборПоСвойствамОбъекта" Тогда + + // инициализируем коллекцию свойств для текущего ПРО + НоваяСтрока.ОтборПоСвойствамОбъекта = ШаблонДереваОтборПоСвойствамОбъекта.Скопировать(); + + ЗагрузитьДеревоОтбораПоСвойствамОбъекта(Правила, НоваяСтрока.ОтборПоСвойствамОбъекта); + + ИначеЕсли ИмяУзла = "ПередОбработкой" Тогда + + НоваяСтрока.ПередОбработкой = одЗначениеЭлемента(Правила, ТипСтрока); + + НоваяСтрока.ЕстьОбработчикПередОбработкой = Не ПустаяСтрока(НоваяСтрока.ПередОбработкой); + + ИначеЕсли (ИмяУзла = "Правило") И (Правила.ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; + + Иначе + + одПропустить(Правила); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // ЗагрузитьПравилоРегистрации() + +Процедура ЗагрузитьДеревоОтбораПоСвойствамПланаОбмена(Правила, ДеревоЗначений) + + СтрокиДЗ = ДеревоЗначений.Строки; + + Пока Правила.Прочитать() Цикл + + ИмяУзла = Правила.ЛокальноеИмя; + ТипУзла = Правила.ТипУзла; + + Если ИмяУзла = "ЭлементОтбора" Тогда + + ЗагрузитьЭлементОтбораПланаОбмена(Правила, СтрокиДЗ.Добавить()); + + ИначеЕсли ИмяУзла = "Группа" Тогда + + ЗагрузитьГруппуЭлементовОтбораПланаОбмена(Правила, СтрокиДЗ.Добавить()); + + ИначеЕсли (ИмяУзла = "ОтборПоСвойствамПланаОбмена") И (ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; // выход + + Иначе + + одПропустить(Правила); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗагрузитьДеревоОтбораПоСвойствамОбъекта(Правила, ДеревоЗначений) + + СтрокиДЗ = ДеревоЗначений.Строки; + + Пока Правила.Прочитать() Цикл + + ИмяУзла = Правила.ЛокальноеИмя; + ТипУзла = Правила.ТипУзла; + + Если ИмяУзла = "ЭлементОтбора" Тогда + + ЗагрузитьЭлементОтбораОбъекта(Правила, СтрокиДЗ.Добавить()); + + ИначеЕсли ИмяУзла = "Группа" Тогда + + ЗагрузитьГруппуЭлементовОтбораОбъекта(Правила, СтрокиДЗ.Добавить()); + + ИначеЕсли (ИмяУзла = "ОтборПоСвойствамОбъекта") И (ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; // выход + + Иначе + + одПропустить(Правила); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Осуществляет загрузку правила регистрации объекта по свойству +// +// Параметры: +// +Процедура ЗагрузитьЭлементОтбораПланаОбмена(Правила, НоваяСтрока) + + НоваяСтрока.ЭтоГруппа = Ложь; + + Пока Правила.Прочитать() Цикл + + ИмяУзла = Правила.ЛокальноеИмя; + ТипУзла = Правила.ТипУзла; + + Если ИмяУзла = "СвойствоОбъекта" Тогда + + Если НоваяСтрока.ЭтоСтрокаКонстанты Тогда + + НоваяСтрока.ЗначениеКонстанты = одЗначениеЭлемента(Правила, Тип(НоваяСтрока.ТипСвойстваОбъекта)); + + Иначе + + НоваяСтрока.СвойствоОбъекта = одЗначениеЭлемента(Правила, ТипСтрока); + + КонецЕсли; + + ИначеЕсли ИмяУзла = "СвойствоПланаОбмена" Тогда + + // свойство может быть свойством шапки или свойством ТЧ + // если это свойство ТЧ, то переменная ПолноеНаименованиеСвойства + // содержит наименование ТЧ и наименование свойства. + // Название ТЧ записано в кватратных скобках "[...]" + // Например, "[Организации].Организация" + ПолноеНаименованиеСвойства = одЗначениеЭлемента(Правила, ТипСтрока); + + ИмяТабличнойЧастиПланаОбмена = ""; + + ПозСкобки1 = Найти(ПолноеНаименованиеСвойства, "["); + + Если ПозСкобки1 <> 0 Тогда + + ПозСкобки2 = Найти(ПолноеНаименованиеСвойства, "]"); + + ИмяТабличнойЧастиПланаОбмена = Сред(ПолноеНаименованиеСвойства, ПозСкобки1 + 1, ПозСкобки2 - ПозСкобки1 - 1); + + ПолноеНаименованиеСвойства = Сред(ПолноеНаименованиеСвойства, ПозСкобки2 + 2); + + КонецЕсли; + + НоваяСтрока.ПараметрУзла = ПолноеНаименованиеСвойства; + НоваяСтрока.ТабличнаяЧастьПараметраУзла = ИмяТабличнойЧастиПланаОбмена; + + ИначеЕсли ИмяУзла = "ВидСравнения" Тогда + + НоваяСтрока.ВидСравнения = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "ЭтоСтрокаКонстанты" Тогда + + НоваяСтрока.ЭтоСтрокаКонстанты = одЗначениеЭлемента(Правила, ТипБулево); + + ИначеЕсли ИмяУзла = "ТипСвойстваОбъекта" Тогда + + НоваяСтрока.ТипСвойстваОбъекта = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли (ИмяУзла = "ЭлементОтбора") И (ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; // выход + + Иначе + + одПропустить(Правила); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Осуществляет загрузку правила регистрации объекта по свойству +// +// Параметры: +// +Процедура ЗагрузитьЭлементОтбораОбъекта(Правила, НоваяСтрока) + + НоваяСтрока.ЭтоГруппа = Ложь; + + Пока Правила.Прочитать() Цикл + + ИмяУзла = Правила.ЛокальноеИмя; + ТипУзла = Правила.ТипУзла; + + Если ИмяУзла = "СвойствоОбъекта" Тогда + + НоваяСтрока.СвойствоОбъекта = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "ЗначениеКонстанты" Тогда + + Если ПустаяСтрока(НоваяСтрока.ВидЭлементаОтбора) Тогда + + НоваяСтрока.ВидЭлементаОтбора = ОбменДаннымиСервер.ЭлементОтбораСвойствоЗначениеКонстанты(); + + КонецЕсли; + + Если НоваяСтрока.ВидЭлементаОтбора = ОбменДаннымиСервер.ЭлементОтбораСвойствоЗначениеКонстанты() Тогда + + НоваяСтрока.ЗначениеКонстанты = одЗначениеЭлемента(Правила, Тип(НоваяСтрока.ТипСвойстваОбъекта)); // только примитивные типы + + ИначеЕсли НоваяСтрока.ВидЭлементаОтбора = ОбменДаннымиСервер.ЭлементОтбораСвойствоАлгоритмЗначения() Тогда + + НоваяСтрока.ЗначениеКонстанты = одЗначениеЭлемента(Правила, ТипСтрока); // строка + + Иначе + + НоваяСтрока.ЗначениеКонстанты = одЗначениеЭлемента(Правила, ТипСтрока); // строка + + КонецЕсли; + + ИначеЕсли ИмяУзла = "ВидСравнения" Тогда + + НоваяСтрока.ВидСравнения = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "ТипСвойстваОбъекта" Тогда + + НоваяСтрока.ТипСвойстваОбъекта = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли ИмяУзла = "Вид" Тогда + + НоваяСтрока.ВидЭлементаОтбора = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли (ИмяУзла = "ЭлементОтбора") И (ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; // выход + + Иначе + + одПропустить(Правила); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Осуществляет загрузку группы правил регистрации объекта по свойству +// +// Параметры: +// Правила - Объект типа XMLЧтение +// +Процедура ЗагрузитьГруппуЭлементовОтбораПланаОбмена(Правила, НоваяСтрока) + + НоваяСтрока.ЭтоГруппа = Истина; + + Пока Правила.Прочитать() Цикл + + ИмяУзла = Правила.ЛокальноеИмя; + ТипУзла = Правила.ТипУзла; + + Если ИмяУзла = "ЭлементОтбора" Тогда + + ЗагрузитьЭлементОтбораПланаОбмена(Правила, НоваяСтрока.Строки.Добавить()); + + ИначеЕсли (ИмяУзла = "Группа") И (ТипУзла = ТипУзлаXML.НачалоЭлемента) Тогда + + ЗагрузитьГруппуЭлементовОтбораПланаОбмена(Правила, НоваяСтрока.Строки.Добавить()); + + ИначеЕсли ИмяУзла = "БулевоЗначениеГруппы" Тогда + + НоваяСтрока.БулевоЗначениеГруппы = одЗначениеЭлемента(Правила, ТипСтрока); + + ИначеЕсли (ИмяУзла = "Группа") И (ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; // выход + + Иначе + + одПропустить(Правила); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Осуществляет загрузку группы правил регистрации объекта по свойству +// +// Параметры: +// Правила - Объект типа XMLЧтение +// +Процедура ЗагрузитьГруппуЭлементовОтбораОбъекта(Правила, НоваяСтрока) + + НоваяСтрока.ЭтоГруппа = Истина; + + Пока Правила.Прочитать() Цикл + + ИмяУзла = Правила.ЛокальноеИмя; + ТипУзла = Правила.ТипУзла; + + Если ИмяУзла = "ЭлементОтбора" Тогда + + ЗагрузитьЭлементОтбораОбъекта(Правила, НоваяСтрока.Строки.Добавить()); + + ИначеЕсли (ИмяУзла = "Группа") И (ТипУзла = ТипУзлаXML.НачалоЭлемента) Тогда + + ЗагрузитьГруппуЭлементовОтбораОбъекта(Правила, НоваяСтрока.Строки.Добавить()); + + ИначеЕсли ИмяУзла = "БулевоЗначениеГруппы" Тогда + + БулевоЗначениеГруппы = одЗначениеЭлемента(Правила, ТипСтрока); + + НоваяСтрока.ЭтоОператорИ = (БулевоЗначениеГруппы = "И"); + + ИначеЕсли (ИмяУзла = "Группа") И (ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; // выход + + Иначе + + одПропустить(Правила); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗагрузитьГруппуПравилРегистрации(Правила) + + Пока Правила.Прочитать() Цикл + + ИмяУзла = Правила.ЛокальноеИмя; + + Если ИмяУзла = "Правило" Тогда + + ЗагрузитьПравилоРегистрации(Правила); + + ИначеЕсли ИмяУзла = "Группа" И Правила.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + + ЗагрузитьГруппуПравилРегистрации(Правила); + + ИначеЕсли ИмяУзла = "Группа" И Правила.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда + + Прервать; + + Иначе + + одПропустить(Правила); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // ЗагрузитьГруппуПравилРегистрации() + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ КОМПИЛЯЦИИ ПРАВИЛ РЕГИСТРАЦИИ ОБЪЕКТОВ (ПРО) + +// Для ПРО по свойствам Плана обмена + +Процедура ПодготовитьПравилоРегистрацииПоСвойствамПланаОбмена(ПРО) + + ПравилоПустое = (ПРО.ОтборПоСвойствамПланаОбмена.Строки.Количество() = 0); + + СвойстваОбъекта = Новый Структура; + + ТекстВыборкиПолей = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПланОбменаОсновнаяТаблица.Ссылка КАК Ссылка"; + + // таблица с именами источников данных - табличных частей плана обмена + ТаблицаДанных = ПолучитьТаблицуДанныхДляПРО(ПРО.ОтборПоСвойствамПланаОбмена.Строки); + + ТекстТаблицДанных = ПолучитьТекстТаблицДанныхДляПРО(ТаблицаДанных); + + Если ПравилоПустое Тогда + + ТекстУсловия = "Истина"; + + Иначе + + ТекстУсловия = ПолучитьТекстУсловияДляГруппыСвойств(ПРО.ОтборПоСвойствамПланаОбмена.Строки, БулевоЗначениеКорневойГруппыСвойств, 0, СвойстваОбъекта); + + КонецЕсли; + + + ТекстЗапроса = ТекстВыборкиПолей + Символы.ПС + + "ИЗ" + Символы.ПС + ТекстТаблицДанных + Символы.ПС + + "ГДЕ" + Символы.ПС + ТекстУсловия + + Символы.ПС + "И НЕ ПланОбменаОсновнаяТаблица.Ссылка = &" + Регистрация.ИмяПланаОбмена + "ЭтотУзел"; + // + + // присваиваем полученные значения переменных + ПРО.ТекстЗапроса = ТекстЗапроса; + ПРО.СвойстваОбъекта = СвойстваОбъекта; + +КонецПроцедуры + +Функция ПолучитьТекстУсловияДляГруппыСвойств(СвойстваГруппы, БулевоЗначениеГруппы, Знач Смещение, СвойстваОбъекта) + + СтрокаСмещения = ""; + + // получаем строку смещения для группы свойств + Для А = 0 По Смещение Цикл + СтрокаСмещения = СтрокаСмещения + " "; + КонецЦикла; + + ТекстУсловия = ""; + + Для Каждого ПРПС ИЗ СвойстваГруппы Цикл + + Если ПРПС.ЭтоГруппа Тогда + + ПрефиксУсловия = ?(ПустаяСтрока(ТекстУсловия), "", Символы.ПС + СтрокаСмещения + БулевоЗначениеГруппы + " "); + + ТекстУсловия = ТекстУсловия + ПрефиксУсловия + ПолучитьТекстУсловияДляГруппыСвойств(ПРПС.Строки, ПРПС.БулевоЗначениеГруппы, Смещение + 10, СвойстваОбъекта); + + Иначе + + ПрефиксУсловия = ?(ПустаяСтрока(ТекстУсловия), "", Символы.ПС + СтрокаСмещения + БулевоЗначениеГруппы + " "); + + ТекстУсловия = ТекстУсловия + ПрефиксУсловия + ПолучитьТекстУсловияДляСвойства(ПРПС, СвойстваОбъекта); + + КонецЕсли; + + КонецЦикла; + + ТекстУсловия = "(" + ТекстУсловия + Символы.ПС + + СтрокаСмещения + ")"; + + Возврат ТекстУсловия; + +КонецФункции + +Функция ПолучитьТекстТаблицДанныхДляПРО(ТаблицаДанных) + + ТекстТаблицДанных = "ПланОбмена." + Регистрация.ИмяПланаОбмена + " КАК ПланОбменаОсновнаяТаблица"; + + Для Каждого СтрокаТаблицы ИЗ ТаблицаДанных Цикл + + СинонимТаблицы = Регистрация.ИмяПланаОбмена + СтрокаТаблицы.Имя; + + ТекстТаблицДанных = ТекстТаблицДанных + Символы.ПС + Символы.ПС + "ЛЕВОЕ СОЕДИНЕНИЕ" + Символы.ПС + + "ПланОбмена." + Регистрация.ИмяПланаОбмена + "." + СтрокаТаблицы.Имя + " КАК " + СинонимТаблицы + "" + Символы.ПС + + "ПО ПланОбменаОсновнаяТаблица.Ссылка = " + СинонимТаблицы + ".Ссылка"; + + КонецЦикла; + + Возврат ТекстТаблицДанных; + +КонецФункции + +Функция ПолучитьТаблицуДанныхДляПРО(СвойстваГруппы) + + ТаблицаДанных = Новый ТаблицаЗначений; + ТаблицаДанных.Колонки.Добавить("Имя"); + + Для Каждого ПРПС ИЗ СвойстваГруппы Цикл + + Если ПРПС.ЭтоГруппа Тогда + + // получаем таблицу данных для нижнего уровня иерархии + ТаблицаДанныхГруппы = ПолучитьТаблицуДанныхДляПРО(ПРПС.Строки); + + // добавляем полученные строки в таблицу данных верхнего уровня иерархии + Для Каждого СтрокаТаблицыГруппы ИЗ ТаблицаДанныхГруппы Цикл + + ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), СтрокаТаблицыГруппы); + + КонецЦикла; + + Иначе + + ИмяТаблицы = ПРПС.ТабличнаяЧастьПараметраУзла; + + // если имя таблицы пустое, то это свойство шапки узла; игнорируем + Если Не ПустаяСтрока(ИмяТаблицы) Тогда + + СтрокаТаблицы = ТаблицаДанных.Добавить(); + СтрокаТаблицы.Имя = ИмяТаблицы; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + // сворачиваем таблицу + ТаблицаДанных.Свернуть("Имя"); + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ПолучитьТекстУсловияДляСвойства(Правило, СвойстваОбъекта) + + Перем ВидСравнения; + + ВидСравнения = Правило.ВидСравнения; + + // необходимо инвертировать вид сравнения, + // потому что таблицы Плана обмена и регистрируемого Объекта расположены по разному + // в конфигурации КД 2.0 при настройке ПРО и в запросе к Планам обмена в данном модуле. + ИнвертироватьВидСравнения(ВидСравнения); + + ТекстОператора = ПолучитьТекстОператораСравнения(ВидСравнения); + + СинонимТаблицы = ?(ПустаяСтрока(Правило.ТабличнаяЧастьПараметраУзла), + "ПланОбменаОсновнаяТаблица", + Регистрация.ИмяПланаОбмена + Правило.ТабличнаяЧастьПараметраУзла); + // + + // В качестве литерала параметра запроса может быть как сам параметр запроса, так и значение константы. + // + // Пример: + // СвойствоПланаОбмена <вид сравнения> &СвойствоОбъекта_МоеСвойство + // СвойствоПланаОбмена <вид сравнения> ДАТАВРЕМЯ(1987,10,19,0,0,0) + + Если Правило.ЭтоСтрокаКонстанты Тогда + + ТипЗначенияКонстанты = ТипЗнч(Правило.ЗначениеКонстанты); + + Если ТипЗначенияКонстанты = ТипБулево Тогда // Булево + + ЛитералПараметраЗапроса = Формат(Правило.ЗначениеКонстанты, "БЛ=Ложь; БИ=Истина"); + + ИначеЕсли ТипЗначенияКонстанты = ТипЧисло Тогда // Число + + ЛитералПараметраЗапроса = Формат(Правило.ЗначениеКонстанты, "ЧРД=.; ЧН=0; ЧГ=0; ЧО=1"); + + ИначеЕсли ТипЗначенияКонстанты = ТипДата Тогда // Дата + + СтрокаГод = Формат(Год(Правило.ЗначениеКонстанты), "ЧН=0; ЧГ=0"); + СтрокаМесяц = Формат(Месяц(Правило.ЗначениеКонстанты), "ЧН=0; ЧГ=0"); + СтрокаДень = Формат(День(Правило.ЗначениеКонстанты), "ЧН=0; ЧГ=0"); + СтрокаЧас = Формат(Час(Правило.ЗначениеКонстанты), "ЧН=0; ЧГ=0"); + СтрокаМинута = Формат(Минута(Правило.ЗначениеКонстанты), "ЧН=0; ЧГ=0"); + СтрокаСекунда = Формат(Секунда(Правило.ЗначениеКонстанты), "ЧН=0; ЧГ=0"); + + ЛитералПараметраЗапроса = "ДАТАВРЕМЯ(" + + СтрокаГод + "," + + СтрокаМесяц + "," + + СтрокаДень + "," + + СтрокаЧас + "," + + СтрокаМинута + "," + + СтрокаСекунда + + ")"; + + Иначе // Строка + + // строку заключаем в кавычки + ЛитералПараметраЗапроса = """" + Правило.ЗначениеКонстанты + """"; + + КонецЕсли; + + Иначе + + КлючСвойстваОбъекта = СтрЗаменить(Правило.СвойствоОбъекта, ".", "_"); + + ЛитералПараметраЗапроса = "&СвойствоОбъекта_" + КлючСвойстваОбъекта + ""; + + СвойстваОбъекта.Вставить(КлючСвойстваОбъекта, Правило.СвойствоОбъекта); + + КонецЕсли; + + ТекстУсловия = СинонимТаблицы + "." + Правило.ПараметрУзла + " " + ТекстОператора + " " + ЛитералПараметраЗапроса; + + Возврат ТекстУсловия; + +КонецФункции + +// Для ПРО по свойствам Объекта + +Процедура ПодготовитьПравилоРегистрацииПоСвойствамОбъекта(ПРО) + + ПРО.ПравилоПоСвойствамОбъектаПустое = (ПРО.ОтборПоСвойствамОбъекта.Строки.Количество() = 0); + + // пустое правило не обрабатываем + Если ПРО.ПравилоПоСвойствамОбъектаПустое Тогда + Возврат; + КонецЕсли; + + СвойстваОбъекта = Новый Структура; + + ЗаполнитьСтруктуруСвойствОбъекта(ПРО.ОтборПоСвойствамОбъекта, СвойстваОбъекта); + +КонецПроцедуры + +Процедура ЗаполнитьСтруктуруСвойствОбъекта(ДеревоЗначений, СвойстваОбъекта) + + Для Каждого СтрокаДерева ИЗ ДеревоЗначений.Строки Цикл + + Если СтрокаДерева.ЭтоГруппа Тогда + + ЗаполнитьСтруктуруСвойствОбъекта(СтрокаДерева, СвойстваОбъекта); + + Иначе + + СтрокаДерева.КлючСвойстваОбъекта = СтрЗаменить(СтрокаДерева.СвойствоОбъекта, ".", "_"); + + СвойстваОбъекта.Вставить(СтрокаДерева.КлючСвойстваОбъекта, СтрокаДерева.СвойствоОбъекта); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +Процедура СообщитьОбОшибкеОбработки(Код = -1, ОписаниеОшибки = "") + + // взводим глобальный флаг ошибки + ФлагОшибки = Истина; + + Если СообщенияОбОшибках = Неопределено Тогда + СообщенияОбОшибках = ИнициализацияСообщений(); + КонецЕсли; + + СтрокаСообщения = СообщенияОбОшибках[Код]; + + СтрокаСообщения = ?(СтрокаСообщения = Неопределено, "", СтрокаСообщения); + + Если Не ПустаяСтрока(ОписаниеОшибки) Тогда + + СтрокаСообщения = СтрокаСообщения + Символы.ПС + ОписаниеОшибки; + + КонецЕсли; + + ЗаписьЖурналаРегистрации(КлючСообщенияЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщения); + +КонецПроцедуры + +Процедура ИнвертироватьВидСравнения(ВидСравнения) + + Если ВидСравнения = "Больше" Тогда ВидСравнения = "Меньше"; + ИначеЕсли ВидСравнения = "БольшеИлиРавно" Тогда ВидСравнения = "МеньшеИлиРавно"; + ИначеЕсли ВидСравнения = "Меньше" Тогда ВидСравнения = "Больше"; + ИначеЕсли ВидСравнения = "МеньшеИлиРавно" Тогда ВидСравнения = "БольшеИлиРавно"; + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьПроверкуНаличияПланаОбмена() + + Если ТипЗнч(Регистрация) <> Тип("Структура") Тогда + + СообщитьОбОшибкеОбработки(0); + Возврат; + + КонецЕсли; + + Если Регистрация.ИмяПланаОбмена <> ИмяПланаОбменаДляЗагрузки Тогда + + ОписаниеОшибки = НСтр("ru = 'В правилах регистрации указан план обмена [ИмяПланаОбмена], а загрузка выполняется для плана обмена [ИмяПланаОбменаДляЗагрузки]'"); + ОписаниеОшибки = СтрЗаменить(ОписаниеОшибки, "[ИмяПланаОбмена]", Регистрация.ИмяПланаОбмена); + ОписаниеОшибки = СтрЗаменить(ОписаниеОшибки, "[ИмяПланаОбменаДляЗагрузки]", ИмяПланаОбменаДляЗагрузки); + СообщитьОбОшибкеОбработки(5, ОписаниеОшибки); + + КонецЕсли; + +КонецПроцедуры + +Функция ПолучитьТекстОператораСравнения(Знач ВидСравнения = "Равно") + + // возвращаемое значение функции по умолчанию + ТекстОператора = "="; + + Если ВидСравнения = "Равно" Тогда ТекстОператора = "="; + ИначеЕсли ВидСравнения = "НеРавно" Тогда ТекстОператора = "<>"; + ИначеЕсли ВидСравнения = "Больше" Тогда ТекстОператора = ">"; + ИначеЕсли ВидСравнения = "БольшеИлиРавно" Тогда ТекстОператора = ">="; + ИначеЕсли ВидСравнения = "Меньше" Тогда ТекстОператора = "<"; + ИначеЕсли ВидСравнения = "МеньшеИлиРавно" Тогда ТекстОператора = "<="; + КонецЕсли; + + Возврат ТекстОператора; +КонецФункции + +Функция ПолучитьПредставлениеКонфигурацииИзПравилРегистрации() + + ИмяКонфигурации = ""; + Регистрация.Свойство("СинонимКонфигурации", ИмяКонфигурации); + + Если Не ЗначениеЗаполнено(ИмяКонфигурации) Тогда + Возврат ""; + КонецЕсли; + + ТочнаяВерсия = ""; + Регистрация.Свойство("ВерсияКонфигурации", ТочнаяВерсия); + + Если ЗначениеЗаполнено(ТочнаяВерсия) Тогда + + ТочнаяВерсия = СтроковыеФункцииКлиентСервер.ВерсияКонфигурацииБезНомераСборки(ТочнаяВерсия); + + ИмяКонфигурации = ИмяКонфигурации + " (" + ТочнаяВерсия + ")"; + + КонецЕсли; + + Возврат ИмяКонфигурации; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ОБЪЕКТОМ XMLЧтение + +// Читает значение атрибута по имени из указанного объекта, приводит значение +// к указанному примитивному типу +// +// Параметры: +// Объект - объект типа XMLЧтение, спозиционированный на начале элемента, +// атрибут которого требуется получить +// Тип - Значение типа Тип. Тип атрибута +// Имя - Строка. Имя атрибута +// +// Возвращаемое значение: +// Значение атрибута полученное по имени и приведенное к указанному типу +// +Функция одАтрибут(Объект, Тип, Имя) + + СтрЗначение = СокрП(Объект.ПолучитьАтрибут(Имя)); + + Если Не ПустаяСтрока(СтрЗначение) Тогда + + Возврат XMLЗначение(Тип, СтрЗначение); + + Иначе + Если Тип = ТипСтрока Тогда + Возврат ""; + + ИначеЕсли Тип = ТипБулево Тогда + Возврат Ложь; + + ИначеЕсли Тип = ТипЧисло Тогда + Возврат 0; + + ИначеЕсли Тип = ТипДата Тогда + Возврат ЗначениеПустойДаты; + + КонецЕсли; + КонецЕсли; + +КонецФункции // одАтрибут() + +// Читает текст элемента и приводит значение к указанному типу +// +// Параметры: +// Объект - объект типа XMLЧтение, из которого осуществляется чтение +// Тип - тип получаемого значения +// ИскатьПоСвойству - для ссылочных типов может быть указано свойство, по которому +// следует искать объект: "Код", "Наименование", <ИмяРеквизита>, "Имя" (предопределенного значения) +// +// Возвращаемое значение: +// Значение xml-элемента, приведенное к соответствующему типу +// +Функция одЗначениеЭлемента(Объект, Тип, ИскатьПоСвойству="") + + Значение = ""; + Имя = Объект.ЛокальноеИмя; + + Пока Объект.Прочитать() Цикл + + ИмяУзла = Объект.ЛокальноеИмя; + ТипУзла = Объект.ТипУзла; + + Если ТипУзла = ТипУзлаXML.Текст Тогда + + Значение = СокрП(Объект.Значение); + + ИначеЕсли (ИмяУзла = Имя) И (ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; + + Иначе + + Возврат Неопределено; + + КонецЕсли; + КонецЦикла; + + Возврат XMLЗначение(Тип, Значение) + +КонецФункции // одЗначениеЭлемента() + +// Пропускает узлы xml до конца указанного элемента (по умолчанию текущего) +// +// Параметры: +// Объект - объект типа XMLЧтение +// Имя - имя узла, до конца которого пропускаем элементы +// +Процедура одПропустить(Объект, Имя = "") + + КолвоВложений = 0; // количество одноименных вложений + + Если ПустаяСтрока(Имя) Тогда + + Имя = Объект.ЛокальноеИмя; + + КонецЕсли; + + Пока Объект.Прочитать() Цикл + + ИмяУзла = Объект.ЛокальноеИмя; + ТипУзла = Объект.ТипУзла; + + Если ИмяУзла = Имя Тогда + + Если ТипУзла = ТипУзлаXML.КонецЭлемента Тогда + + Если КолвоВложений = 0 Тогда + Прервать; + Иначе + КолвоВложений = КолвоВложений - 1; + КонецЕсли; + + ИначеЕсли ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + + КолвоВложений = КолвоВложений + 1; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // одПропустить() + +//////////////////////////////////////////////////////////////////////////////// +// ИНИЦИАЛИЗАЦИЯ РЕКВИЗИТОВ И МОДУЛЬНЫХ ПЕРЕМЕННЫХ + +// Инициализирует реквизиты обработки и модульные переменные +// +// Параметры: +// Нет. +// +Процедура ИнициализацияРеквизитовИМодульныхПеременных() + + ФлагОшибки = Ложь; + + // Типы + ТипСтрока = Тип("Строка"); + ТипБулево = Тип("Булево"); + ТипЧисло = Тип("Число"); + ТипДата = Тип("Дата"); + + ЗначениеПустойДаты = Дата('00010101'); + + БулевоЗначениеКорневойГруппыСвойств = "И"; // булево значение для корневой группы свойств + +КонецПроцедуры // ИнициализацияРеквизитовИМодульныхПеременных() + +// Инициализирует структуру регистрации +// +// Параметры: +// Нет. +// +Функция ИнициализацияРегистрации() + + Регистрация = Новый Структура; + Регистрация.Вставить("ВерсияФормата", ""); + Регистрация.Вставить("Ид", ""); + Регистрация.Вставить("Наименование", ""); + Регистрация.Вставить("ДатаВремяСоздания", ЗначениеПустойДаты); + Регистрация.Вставить("ПланОбмена", ""); + Регистрация.Вставить("ИмяПланаОбмена", ""); + Регистрация.Вставить("Комментарий", ""); + + // параметры конфигурации + Регистрация.Вставить("ВерсияПлатформы", ""); + Регистрация.Вставить("ВерсияКонфигурации", ""); + Регистрация.Вставить("СинонимКонфигурации", ""); + Регистрация.Вставить("Конфигурация", ""); + + Возврат Регистрация; + +КонецФункции + +// Инициализирует переменную, содержащую соответствия кодов сообщений их описаниям +// +// Параметры: +// Нет. +// +Функция ИнициализацияСообщений() + + Сообщения = Новый Соответствие; + + Сообщения.Вставить(0, НСтр("ru = 'Внутренняя ошибка'")); + Сообщения.Вставить(1, НСтр("ru = 'Ошибка открытия файла правил'")); + Сообщения.Вставить(2, НСтр("ru = 'Ошибка при загрузке правил'")); + Сообщения.Вставить(3, НСтр("ru = 'Ошибка формата правил'")); + Сообщения.Вставить(4, НСтр("ru = 'Ошибка при получении файла правил для чтения'")); + Сообщения.Вставить(5, НСтр("ru = 'Загружаемые правила регистрации не предназначены для текущего плана обмена!'")); + + Возврат Сообщения; + +КонецФункции // ИнициализацияСообщений() + +//////////////////////////////////////////////////////////////////////////////// +// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ + +ИнициализацияРеквизитовИМодульныхПеременных(); diff --git a/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ЗагрузкаПравилРегистрацииОбъектов.mdo b/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ЗагрузкаПравилРегистрацииОбъектов.mdo new file mode 100644 index 000000000..ab60c59b1 --- /dev/null +++ b/SSL/src/DataProcessors/ЗагрузкаПравилРегистрацииОбъектов/ЗагрузкаПравилРегистрацииОбъектов.mdo @@ -0,0 +1,27 @@ + + + + + + + ЗагрузкаПравилРегистрацииОбъектов + + ru + Загрузка правил регистрации объектов + + + ИмяПланаОбменаДляЗагрузки + + ru + Имя плана обмена для загрузки + + + String + + 150 + + + + + + diff --git a/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form b/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form new file mode 100644 index 000000000..911fb93bb --- /dev/null +++ b/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form @@ -0,0 +1,315 @@ + + + + <key>ru</key> + <value>Карта маршрута бизнес-процесса</value> + + + БизнесПроцесс + 1 + true + true + + true + + + БизнесПроцесс + + + OnChange + БизнесПроцессПриИзменении + + + БизнесПроцессРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + БизнесПроцессКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + КартаМаршрута + 3 + true + true + + true + + + КартаМаршрута + + None + + КартаМаршрутаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + КартаМаршрутаКонтекстноеМеню + 4 + + Задачи + 6 + true + true + + true + + false + + ЗадачиРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.Command.Задачи + Normal + Auto + true + true + UserCmds + Auto + + true + + GraphicalSchemaField + Enter + true + Left + true + + + Selection + КартаМаршрутаВыбор + + 80 + true + 30 + true + true + true + + + + ФормаКоманднаяПанель + -1 + + Обновить + 5 + true + true + + true + + false + + ОбновитьРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + Form.Command.Обновить + Normal + Auto + true + true + UserCmds + Auto + + + ЗадачиВТочкеМаршрута + 7 + true + true + + true + + false + + ЗадачиВТочкеМаршрутаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + Form.Command.Задачи + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.КартаМаршрутаБизнесПроцесса + + + true + + + true + +
    true
    +
    + + БизнесПроцесс + + <key>ru</key> + <value>Бизнес-процесс</value> + + 2 + + BusinessProcessRef + + + true + + + true + + ShowError + + + КартаМаршрута + + <key>ru</key> + <value>Карта маршрута</value> + + 3 + + GraphicalSchema + + + true + + + true + + + + + Обновить + + <key>ru</key> + <value>Обновить</value> + + 1 + + ru + Обновить карту маршрута + + + true + + + StdPicture.Refresh + + + + ОбновитьВыполнить + + + TextPicture + Auto + Auto + + + Задачи + + <key>ru</key> + <value>Задачи в точке маршрута</value> + + 2 + + ru + Открыть список задач, сформированных в выбранной точке маршрута + + + true + + + StdPicture.Task + + + + ЗадачиВыполнить + + + TextPicture + Auto + Auto + + + БизнесПроцесс + + BusinessProcessRef + + true + + + + + + +
    diff --git a/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Module.bsl new file mode 100644 index 000000000..3422a4066 --- /dev/null +++ b/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Module.bsl @@ -0,0 +1,87 @@ +&НаСервере +Процедура ОбновитьКартуМаршрута() + + Если ЗначениеЗаполнено(БизнесПроцесс) Тогда + КартаМаршрута = БизнесПроцесс.ПолучитьОбъект().ПолучитьКартуМаршрута(); + ИначеЕсли БизнесПроцесс <> Неопределено Тогда + КартаМаршрута = БизнесПроцессы[БизнесПроцесс.Метаданные().Имя].ПолучитьКартуМаршрута(); + Иначе + КартаМаршрута = Новый ГрафическаяСхема; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСписокЗадачТочкиМаршрута() + +#Если ВебКлиент Тогда + Предупреждение("В Веб-клиенте данная операция недоступна."); + Возврат; +#КонецЕсли + ОчиститьСообщения(); + ТекЭлемент = Элементы.КартаМаршрута.ТекущийЭлемент; + + Если Не ЗначениеЗаполнено(БизнесПроцесс) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Необходимо указать бизнес-процесс.'"),, + "БизнесПроцесс"); + Возврат; + КонецЕсли; + + Если ТекЭлемент = Неопределено ИЛИ + НЕ (ТипЗнч(ТекЭлемент) = Тип("ЭлементГрафическойСхемыДействие") + ИЛИ ТипЗнч(ТекЭлемент) = Тип("ЭлементГрафическойСхемыВложенныйБизнесПроцесс")) Тогда + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Необходимо выбрать точку действия или вложенный бизнес-процесс карты маршрута.'"),, + "КартаМаршрута"); + Возврат; + КонецЕсли; + + ЗаголовокФормы = НСтр("ru = 'Задачи по точке маршрута бизнес-процесса'"); + + ОткрытьФорму("Задача.ЗадачаИсполнителя.ФормаСписка", + Новый Структура("Отбор,ЗаголовокФормы,ПоказыватьЗадачи,ВидимостьОтборов,БлокировкаОкнаВладельца,Задача,БизнесПроцесс", + Новый Структура("БизнесПроцесс,ТочкаМаршрута", БизнесПроцесс, ТекЭлемент.Значение), + ЗаголовокФормы,0,Ложь,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца,Строка(ТекЭлемент.Значение),Строка(БизнесПроцесс)), + ЭтаФорма, БизнесПроцесс); + + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если ЗначениеЗаполнено(Параметры.БизнесПроцесс) Тогда + БизнесПроцесс = Параметры.БизнесПроцесс; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + ОбновитьКартуМаршрута(); +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьВыполнить() + ОбновитьКартуМаршрута(); +КонецПроцедуры + +&НаКлиенте +Процедура БизнесПроцессПриИзменении(Элемент) + ОбновитьКартуМаршрута(); +КонецПроцедуры + +&НаКлиенте +Процедура ЗадачиВыполнить() + ОткрытьСписокЗадачТочкиМаршрута(); +КонецПроцедуры + +&НаКлиенте +Процедура КартаМаршрутаВыбор(Элемент) + ОткрытьСписокЗадачТочкиМаршрута(); +КонецПроцедуры + + diff --git a/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/КартаМаршрутаБизнесПроцесса.mdo b/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/КартаМаршрутаБизнесПроцесса.mdo new file mode 100644 index 000000000..c63ac4b14 --- /dev/null +++ b/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/КартаМаршрутаБизнесПроцесса.mdo @@ -0,0 +1,23 @@ + + + + + + + КартаМаршрутаБизнесПроцесса + + ru + Карта маршрута бизнес процесса + + true + DataProcessor.КартаМаршрутаБизнесПроцесса.Form.Форма + + Форма + + ru + Карта маршрута + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ManagerModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl new file mode 100644 index 000000000..9fdd57784 --- /dev/null +++ b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl @@ -0,0 +1,13101 @@ +//////////////////////////////////////////////////////////////////////////////// +// ИСПОЛЬЗУЕМЫЕ СОКРАЩЕНИЯ ИМЕН ПЕРЕМЕННЫХ (АББРЕВИАТУРЫ) +// +// ПКО - правило конвертации объектов +// ПКС - правило конвертации свойств объектов +// ПКГС - правило конвертации группы свойств объектов +// ПКЗ - правило конвертации значений объектов +// ПВД - правило выгрузки данных +// ПОД - правило очистки данных + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПЕРЕМЕННЫЕ + +Перем КлючСообщенияЖурналаРегистрации Экспорт; // строка сообщения для фиксации ошибок в журнале регистрации + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПЕРЕМЕННЫЕ МОДУЛЯ ДЛЯ НАПИСАНИЯ АЛГОРИТМОВ (ОБЩИЕ ДЛЯ ВЫГРУЗКИ И ЗАГРУЗКИ) + +Перем Конвертация; // Структура свойств конвертации (Имя, Ид, обработчики событий обмена) + +Перем Алгоритмы; // Структура, содержащая используемые алгоритмы +Перем Запросы; // Структура, содержащая используемые запросы +Перем ДопОбработки; // Структура, содержащая используемые внешние обработки + +Перем Правила; // Структура, содержащая ссылки на ПКО + +Перем Менеджеры; // Соответствие, содержащее поля Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, ПКО +Перем МенеджерыДляПлановОбмена; +Перем ФайлОбмена; // Последовательно записываемый/читаемый файл обмена + +Перем ПараметрыДопОбработок; // Структура, содержащая параметры, используемых внешних обработок + +Перем ПараметрыИнициализированы; // Если Истина, то необходимые параметры конвертации проинициализированы + +Перем ФайлПротоколаДанных; // файл для ведения протокола обмена данными +Перем ФлагКомментироватьОбработкуОбъектов; + +//////////////////////////////////////////////////////////////////////////////// +// ФЛАГИ НАЛИЧИЯ ГЛОБАЛЬНЫХ ОБРАБОТЧИКОВ СОБЫТИЙ + +Перем ЕстьГлобальныйОбработчикПередВыгрузкойОбъекта; +Перем ЕстьГлобальныйОбработчикПослеВыгрузкиОбъекта; + +Перем ЕстьГлобальныйОбработчикПередКонвертациейОбъекта; + +Перем ЕстьГлобальныйОбработчикПередЗагрузкойОбъекта; +Перем ЕстьГлобальныйОбработчикПослеЗагрузкиОбъекта; + +Перем ВерсияПлатформыПриемника; + +//////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ ОБРАБОТОК ОБМЕНА (ОБЩИЕ ДЛЯ ВЫГРУЗКИ И ЗАГРУЗКИ) + +Перем ТипСтрока; // Тип("Строка") +Перем ТипБулево; // Тип("Булево") +Перем ТипЧисло; // Тип("Число") +Перем ТипДата; // Тип("Дата") +Перем ТипХранилищеЗначения; // Тип("ХранилищеЗначения") +Перем ТипДвоичныеДанные; // Тип("ДвоичныеДанные") +Перем ТипВидДвиженияНакопления; // Тип("ВидДвиженияНакопления") +Перем ТипУдалениеОбъекта; // Тип("УдалениеОбъекта") +Перем ТипВидСчета; // Тип("ВидСчета") +Перем ТипТип; // Тип("Тип") +Перем ТипСоответствие; // Тип("Соответствие") +Перем ТипСтрока36; +Перем ТипСтрока255; + +Перем ТипРегистрСоответствия; + +Перем ТипУзлаXMLКонецЭлемента; +Перем ТипУзлаXMLНачалоЭлемента; +Перем ТипУзлаXMLТекст; + +Перем ЗначениеПустаяДата; + +Перем СообщенияОбОшибках; // Соответствие. Ключ - код ошибки, Значение - описание ошибки + +//////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ МОДУЛЯ ОБРАБОТКИ ВЫГРУЗКИ + +Перем СчетчикНПП; // Число - счетчик НПП +Перем НППЗаписанногоВФайл; +Перем ТаблицаПравилКонвертацииСвойств; // ТаблицаЗначений - шаблон для воссоздания структуры таблицы путем копирования +Перем XMLПравила; // xml-Строка, содержащая описание правил обмена +Перем СтрокаТиповДляПриемника; +Перем ДокументыДляОтложенногоПроведения; // Таблица значений для проведения документов после загрузки данных + +//////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ МОДУЛЯ ОБРАБОТКИ ЗАГРУЗКИ + +Перем КоличествоВыполненныхОтложенныхДвиженийДокументов; +Перем АтрибутыФайлаОбмена; // Структура. После открытия файла + // содержит атрибуты файла обмена согласно формату +Перем НомерПоследнегоПоискаПоСсылке; +Перем ЧислоХранимыхВыгруженныхОбъектовПоТипам; +Перем СоответствиеДопПараметровПоиска; +Перем СоответствиеАлгоритмовПоискаЭлементов; +Перем СоответствиеТиповИНазваниеОбъектов; +Перем ОбработкаДляЗагрузкиДанных; +Перем СоответствиеПустыхЗначенийТипов; +Перем СоответствиеОписаниеТипов; +Перем ПолеНомерВходящегоСообщения; +Перем РазрешитьПроведениеДокумента; +Перем СтекВызововВыгрузкиДанных; +Перем ГлобальныйСтекНеЗаписанныхОбъектов; +Перем СоответствиеДанныхДляОбновленияВыгруженныхЭлементов; +Перем ДатаНачалаВыполненияОтложенныхОперацийСДокументами; +Перем ДатаОкончанияВыполненияОтложенныхОперацийСДокументами; +Перем СобытияПослеЗагрузкиПараметров; +Перем МенеджерРегистраСоответствийОбъектов; +Перем ТекущийУровеньВложенностиВыгрузитьПоПравилу; +Перем РежимВизуальнойНастройкиОбмена; +Перем РежимЗагрузкиИнформацииОПравилахОбмена; +Перем ТаблицаРезультатовЗагрузкиИнформацииОПоляхПоиска; +Перем ИнформацияОПользовательскихПоляхПоискаПриВыгрузкеДанных; +Перем ИнформацияОПользовательскихПоляхПоискаПриЗагрузкеДанных; +Перем ЗапросСоответствиеОбъектовИнформационныхБаз; + +//////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ ДЛЯ ЗНАЧЕНИЙ СВОЙСТВ + +Перем ПолеФлагОшибки; +Перем ПолеРезультатВыполненияОбмена; +Перем ПолеСостояниеОбменаДанными; + +Перем ПолеТаблицыДанныхСообщенияОбмена; // соответствие с таблицами значений данных из сообщения обмена; + // Ключ - ИмяТипа (Строка); Значение - таблица с данными объектов (ТаблицаЗначений) +// +Перем ПолеТаблицаДанныхЗаголовкаПакета; // таблица значений с данными из файла заголовка пакета сообщений обмена +Перем ПолеСтрокаСообщенияОбОшибке; // Строка - переменная содержит строку с сообщением об ошибке +Перем ПолеТаблицаТиповСопоставленияОбъектовИнформационныхБаз; // (кэш) ТаблицаЗначений - таблица с типами объектов, + // которые имеют сопоставление в РС для заданного узла плана обмена +// +Перем ПолеКэшЕстьИнформацияСопоставленияВРегистре; // (кэш) ТаблицаЗначений - таблица с признаком наличия сопоставления в РС для заданных ключей кэша +Перем ПолеСоответствиеТиповДанныхДляЗагрузки; + +Перем ПолеСчетчикЗагруженныхОбъектов; // счетчик загруженных объектов +Перем ПолеСчетчикВыгруженныхОбъектов; // счетчик выгруженных объектов + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ СВОЙСТВА + +// Функция-свойство: флаг ошибки выполнения обмена данными +// +// Тип: Булево +// +Функция ФлагОшибки() Экспорт + + Если ТипЗнч(ПолеФлагОшибки) <> Тип("Булево") Тогда + + ПолеФлагОшибки = Ложь; + + КонецЕсли; + + Возврат ПолеФлагОшибки; + +КонецФункции + +// Функция-свойство: результат выполнения обмена данными +// +// Тип: ПеречислениеСсылка.РезультатыВыполненияОбмена +// +Функция РезультатВыполненияОбмена() Экспорт + + Если ТипЗнч(ПолеРезультатВыполненияОбмена) <> Тип("ПеречислениеСсылка.РезультатыВыполненияОбмена") Тогда + + ПолеРезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Выполнено; + + КонецЕсли; + + Возврат ПолеРезультатВыполненияОбмена; + +КонецФункции + +// Функция-свойство: номер входящего сообщения обмена данными +// +// Тип: Число +// +Функция НомерВходящегоСообщения() Экспорт + + Если ТипЗнч(ПолеНомерВходящегоСообщения) <> Тип("Число") Тогда + + ПолеНомерВходящегоСообщения = 0; + + КонецЕсли; + + Возврат ПолеНомерВходящегоСообщения; + +КонецФункции + +// Функция-свойство: соответствие с таблицами данных входящего сообщения обмена +// +// Тип: Соответствие +// +Функция ТаблицыДанныхСообщенияОбмена() Экспорт + + Если ТипЗнч(ПолеТаблицыДанныхСообщенияОбмена) <> Тип("Соответствие") Тогда + + ПолеТаблицыДанныхСообщенияОбмена = Новый Соответствие; + + КонецЕсли; + + Возврат ПолеТаблицыДанныхСообщенияОбмена; + +КонецФункции + +// Функция-свойство: таблица значений со статистической и дополнительной информацией о входящем сообщении обмена +// +// Тип: ТаблицаЗначений +// +Функция ТаблицаДанныхЗаголовкаПакета() Экспорт + + Если ТипЗнч(ПолеТаблицаДанныхЗаголовкаПакета) <> Тип("ТаблицаЗначений") Тогда + + ПолеТаблицаДанныхЗаголовкаПакета = Новый ТаблицаЗначений; + + Колонки = ПолеТаблицаДанныхЗаголовкаПакета.Колонки; + + Колонки.Добавить("ТипОбъектаСтрокой", одОписаниеТипа("Строка")); + Колонки.Добавить("ИмяПравила", одОписаниеТипа("Строка")); + Колонки.Добавить("КоличествоОбъектовВИсточнике", одОписаниеТипа("Число")); + Колонки.Добавить("ПоляПоиска", одОписаниеТипа("Строка")); + Колонки.Добавить("ПоляТаблицы", одОписаниеТипа("Строка")); + + Колонки.Добавить("ТипИсточникаСтрокой", одОписаниеТипа("Строка")); + Колонки.Добавить("ТипПриемникаСтрокой", одОписаниеТипа("Строка")); + + Колонки.Добавить("СинхронизироватьПоИдентификатору", одОписаниеТипа("Булево")); + + КонецЕсли; + + Возврат ПолеТаблицаДанныхЗаголовкаПакета; + +КонецФункции + +// Функция-свойство: строка, которая содержит сообщение об ошибке при обмене данными +// +// Тип: Строка +// +Функция СтрокаСообщенияОбОшибке() Экспорт + + Если ТипЗнч(ПолеСтрокаСообщенияОбОшибке) <> Тип("Строка") Тогда + + ПолеСтрокаСообщенияОбОшибке = ""; + + КонецЕсли; + + Возврат ПолеСтрокаСообщенияОбОшибке; + +КонецФункции + +// Функция-свойство: количество объектов, которые были загружены +// +// Тип: Число +// +Функция СчетчикЗагруженныхОбъектов() Экспорт + + Если ТипЗнч(ПолеСчетчикЗагруженныхОбъектов) <> Тип("Число") Тогда + + ПолеСчетчикЗагруженныхОбъектов = 0; + + КонецЕсли; + + Возврат ПолеСчетчикЗагруженныхОбъектов; + +КонецФункции + +// Функция-свойство: количество объектов, которые были выгружены +// +// Тип: Число +// +Функция СчетчикВыгруженныхОбъектов() Экспорт + + Если ТипЗнч(ПолеСчетчикВыгруженныхОбъектов) <> Тип("Число") Тогда + + ПолеСчетчикВыгруженныхОбъектов = 0; + + КонецЕсли; + + Возврат ПолеСчетчикВыгруженныхОбъектов; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ВНУТРЕННИЕ СВОЙСТВА + +Функция СостояниеОбменаДанными() + + Если ТипЗнч(ПолеСостояниеОбменаДанными) <> Тип("Структура") Тогда + + ПолеСостояниеОбменаДанными = Новый Структура; + ПолеСостояниеОбменаДанными.Вставить("УзелИнформационнойБазы"); + ПолеСостояниеОбменаДанными.Вставить("ДействиеПриОбмене"); + ПолеСостояниеОбменаДанными.Вставить("РезультатВыполненияОбмена"); + ПолеСостояниеОбменаДанными.Вставить("ДатаНачала"); + ПолеСостояниеОбменаДанными.Вставить("ДатаОкончания"); + + КонецЕсли; + + Возврат ПолеСостояниеОбменаДанными; + +КонецФункции + +Функция РезультатВыполненияОбменаПредупреждение() + + Возврат Найти(ВРег(ОбщегоНазначения.ИмяЗначенияПеречисления(РезультатВыполненияОбмена())), "ПРЕДУПРЕЖДЕНИЕ") <> 0; + +КонецФункции + +Функция СоответствиеТиповДанныхДляЗагрузки() + + Если ТипЗнч(ПолеСоответствиеТиповДанныхДляЗагрузки) <> Тип("Соответствие") Тогда + + ПолеСоответствиеТиповДанныхДляЗагрузки = Новый Соответствие; + + КонецЕсли; + + Возврат ПолеСоответствиеТиповДанныхДляЗагрузки; + +КонецФункции + +Функция РежимЗагрузкиДанныхВИнформационнуюБазу() + + Возврат ПустаяСтрока(РежимЗагрузкиДанных) ИЛИ ВРег(РежимЗагрузкиДанных) = ВРег("ЗагрузкаВИнформационнуюБазу"); + +КонецФункции + +Функция РежимЗагрузкиДанныхВТаблицуЗначений() + + Возврат Не РежимЗагрузкиДанныхВИнформационнуюБазу(); + +КонецФункции + +Функция ИмяКолонкиУникальныйИдентификатор() + + Возврат "УникальныйИдентификатор"; + +КонецФункции + +Функция ИмяКолонкиТипСтрокой() + + Возврат "ТипСтрокой"; + +КонецФункции + +Функция КлючСообщенияЖурналаРегистрации() + + Если ТипЗнч(КлючСообщенияЖурналаРегистрации) <> Тип("Строка") + ИЛИ ПустаяСтрока(КлючСообщенияЖурналаРегистрации) Тогда + + КлючСообщенияЖурналаРегистрации = "Обмен данными"; + + КонецЕсли; + + Возврат КлючСообщенияЖурналаРегистрации; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ФУНКЦИИ КЕШИРОВАНИЯ + +Функция ТаблицаТиповСопоставленияОбъектовИнформационныхБаз() + + Если ТипЗнч(ПолеТаблицаТиповСопоставленияОбъектовИнформационныхБаз) <> Тип("ТаблицаЗначений") Тогда + + ТекстЗапроса = " + |ВЫБРАТЬ РАЗЛИЧНЫЕ + |СоответствиеОбъектовИнформационныхБаз.ТипИсточника, + |СоответствиеОбъектовИнформационныхБаз.ТипПриемника + |ИЗ + | РегистрСведений.СоответствиеОбъектовИнформационныхБаз КАК СоответствиеОбъектовИнформационныхБаз + |ГДЕ + | СоответствиеОбъектовИнформационныхБаз.УзелИнформационнойБазы = &УзелИнформационнойБазы + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("УзелИнформационнойБазы", УзелОбменаЗагрузкаДанных); + + ПолеТаблицаТиповСопоставленияОбъектовИнформационныхБаз = Запрос.Выполнить().Выгрузить(); + + КонецЕсли; + + Возврат ПолеТаблицаТиповСопоставленияОбъектовИнформационныхБаз; + +КонецФункции + +Функция КэшЕстьИнформацияСопоставленияВРегистре() + + Если ТипЗнч(ПолеКэшЕстьИнформацияСопоставленияВРегистре) <> Тип("ТаблицаЗначений") Тогда + + ПолеКэшЕстьИнформацияСопоставленияВРегистре = Новый ТаблицаЗначений; + ПолеКэшЕстьИнформацияСопоставленияВРегистре.Колонки.Добавить("ТипИсточника", одОписаниеТипа("Строка")); + ПолеКэшЕстьИнформацияСопоставленияВРегистре.Колонки.Добавить("ТипПриемника", одОписаниеТипа("Строка")); + ПолеКэшЕстьИнформацияСопоставленияВРегистре.Колонки.Добавить("Результат", одОписаниеТипа("Булево")); + + КонецЕсли; + + Возврат ПолеКэшЕстьИнформацияСопоставленияВРегистре; + +КонецФункции + +Функция ЕстьИнформацияСопоставленияВРегистре(Знач ТипИсточникаСтрокой, Знач ТипПриемникаСтрокой) + + // возвращаемое значение функции + Результат = Ложь; + + ПараметрыОтбора = Новый Структура; + ПараметрыОтбора.Вставить("ТипИсточника", ТипИсточникаСтрокой); + ПараметрыОтбора.Вставить("ТипПриемника", ТипПриемникаСтрокой); + + МассивНайденныхСтрок = КэшЕстьИнформацияСопоставленияВРегистре().НайтиСтроки(ПараметрыОтбора); + + Если МассивНайденныхСтрок.Количество() > 0 Тогда // берем значение из кэша + + Результат = МассивНайденныхСтрок[0]["Результат"]; + + Иначе // получаем значение и добавляем его в кэш + + СтрокаТаблицы = КэшЕстьИнформацияСопоставленияВРегистре().Добавить(); + + ЗаполнитьЗначенияСвойств(СтрокаТаблицы, ПараметрыОтбора); + + Результат = (ТаблицаТиповСопоставленияОбъектовИнформационныхБаз().НайтиСтроки(ПараметрыОтбора).Количество() > 0); + + СтрокаТаблицы["Результат"] = Результат; + + КонецЕсли; + + Возврат Результат; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// ВЫГРУЗКА ДАННЫХ + +// Выполняет выгрузку данных +// -- Все объекты выгружаются в один файл +// -- В заголовок файла выгружаются: +// - правила обмена +// - информация о типах данных +// - данные по обмену (имя плана обмена, коды узлов, номера сообщений (квитирование)) +// +// Параметры: +// +Процедура ВыполнитьВыгрузкуДанных() Экспорт + + УстановитьФлагОшибки(Ложь); + + ПолеСтрокаСообщенияОбОшибке = ""; + ПолеСостояниеОбменаДанными = Неопределено; + ПолеРезультатВыполненияОбмена = Неопределено; + + // обновляем повторно используемые значения МРО + ОбменДаннымиСобытия.ОбновитьПовторноИспользуемыеЗначенияМРОПриНеобходимости(); + + ИнициализироватьВедениеПротоколаОбмена(); + + // Открываем файл обмена + ОткрытьФайлВыгрузки(); + + Если ФлагОшибки() Тогда + ФайлОбмена = Неопределено; + ЗавершитьВедениеПротоколаОбмена(); + Возврат; + КонецЕсли; + + // Включаем правила обмена в файл + ФайлОбмена.ЗаписатьСтроку(XMLПравила); + + // ВЫГРУЗКА ДАННЫХ + ВыполнитьВыгрузку(); + + // Закрываем файл обмена + ЗакрытьФайл(); + + ЗавершитьВедениеПротоколаОбмена(); + +КонецПроцедуры + +// ЗАГРУЗКА ДАННЫХ + +// Выполняет загрузку данных из файла сообщения обмена +// Данные загружаются в информационную базу +// +// Параметры: +// +Процедура ВыполнитьЗагрузкуДанных() Экспорт + + // сбрасываем кэш наличия информации сопоставления + СброситьКэшНаличияИнформацииСопоставления(); + + РежимЗагрузкиДанных = "ЗагрузкаВИнформационнуюБазу"; + + ПолеСтрокаСообщенияОбОшибке = ""; + ПолеСостояниеОбменаДанными = Неопределено; + ПолеРезультатВыполненияОбмена = Неопределено; + ПолеСоответствиеТиповДанныхДляЗагрузки = Неопределено; + ПолеСчетчикЗагруженныхОбъектов = Неопределено; + + ГлобальныйСтекНеЗаписанныхОбъектов = Новый Соответствие; + НомерПоследнегоПоискаПоСсылке = 0; + + ИнициализироватьМенеджерыИСообщения(); + + УстановитьФлагОшибки(Ложь); + + ИнициализироватьКомментарииПриВыгрузкеИЗагрузкеДанных(); + + ИнициализироватьВедениеПротоколаОбмена(); + + ИнформацияОПользовательскихПоляхПоискаПриЗагрузкеДанных = Новый Соответствие; + + СоответствиеДопПараметровПоиска = Новый Соответствие; + СоответствиеАлгоритмовПоискаЭлементов = Новый Соответствие; + + // очищаем очередь документов к проведению + ДокументыДляОтложенногоПроведения.Очистить(); + + РезультатВыполненияОтложенныхДвижений = Неопределено; + + ПолученоОбъектовФоновогоОбмена = 0; + КоличествоВыполненныхОтложенныхДвиженийДокументов = 0; + + Если ПустаяСтрока(ИмяФайлаОбмена) Тогда + ЗаписатьВПротоколВыполнения(15); + ЗавершитьВедениеПротоколаОбмена(); + Возврат; + КонецЕсли; + + Если ФлагРежимОтладки Тогда + ИспользоватьТранзакции = Ложь; + КонецЕсли; + + Если КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 0 Тогда + КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 100; + КонецЕсли; + + // выполняем очистку правил обмена + Правила.Очистить(); + ТаблицаПравилКонвертации.Очистить(); + + // открываем файл сообщения обмена + // зачитываем правила обмена + ОткрытьФайлОбмена(); + + Если ФлагОшибки() Тогда + ЗавершитьВедениеПротоколаОбмена(); + Возврат; + КонецЕсли; + + // {Обработчик: ПередЗагрузкойДанных} Начало + Отказ = Ложь; + + Если Не ПустаяСтрока(Конвертация.ПередЗагрузкойДанных) Тогда + + Попытка + Выполнить(Конвертация.ПередЗагрузкойДанных); + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(22, ОписаниеОшибки(), НСтр("ru = 'ПередЗагрузкойДанных (конвертация)'")); + Отказ = Истина; + КонецПопытки; + + КонецЕсли; + + Если Отказ Тогда // Отказ от загрузки данных + ЗавершитьВедениеПротоколаОбмена(); + ФайлОбмена.Закрыть(); + Возврат; + КонецЕсли; + // {Обработчик: ПередЗагрузкойДанных} Окончание + + // отрабатываем правила очистки данных + ОбработатьПравилаОчистки(ТаблицаПравилОчистки.Строки); + + Если ИспользоватьТранзакции Тогда + НачатьТранзакцию(); + КонецЕсли; + + Попытка + ПроизвестиЧтениеДанных(); + Исключение + + СтрокаСообщения = НСтр("ru = 'Ошибка при загрузке данных: [ОписаниеОшибки]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОписаниеОшибки]", ОписаниеОшибки()); + ЗаписатьВПротоколВыполнения(СтрокаСообщения,,,,,Истина); + КонецПопытки; + + // отложенная запись того, что не записали + ПровестиЗаписьНеЗаписанныхОбъектов(); + + Если ИспользоватьТранзакции Тогда + + Если ФлагОшибки() Тогда + ОтменитьТранзакцию(); + Иначе + ЗафиксироватьТранзакцию(); + Конецесли; + + КонецЕсли; + + ФайлОбмена.Закрыть(); + + // Обработчик ПослеЗагрузкиДанных + Если Не ФлагОшибки() Тогда + + Если Не ПустаяСтрока(Конвертация.ПослеЗагрузкиДанных) Тогда + + Попытка + Выполнить(Конвертация.ПослеЗагрузкиДанных); + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(23, ОписаниеОшибки(), НСтр("ru = 'ПослеЗагрузкиДанных (конвертация)'")); + КонецПопытки; + + КонецЕсли; + + КонецЕсли; + + Если Не ФлагОшибки() Тогда + + // выполняем проведение документов в очереди + ВыполнитьОтложенноеПроведениеДокументов(); + + // запишем информацию о номере входящего сообщения + ОбъектУзла = УзелОбменаЗагрузкаДанных.ПолучитьОбъект(); + ОбъектУзла.НомерПринятого = НомерВходящегоСообщения(); + ОбъектУзла.Записать(); + + КонецЕсли; + + ЗавершитьВедениеПротоколаОбмена(); + +КонецПроцедуры + +// ЗАГРУЗКА ДАННЫХ ПАКЕТНАЯ + +// Выполняет загрузку данных из файла сообщения обмена в Информационную Базу только заданных типов объектов +// +// Параметры: +// ТаблицыДляЗагрузки - Массив - массив типов, которые необходимо загрузить из сообщения обмена; элемент массива - Строка +// Например, для загрузки из сообщения обмена только элементов справочника Контрагенты: +// ТаблицыДляЗагрузки = Новый Массив; +// ТаблицыДляЗагрузки.Добавить("СправочникСсылка.Контрагенты"); +// +// Список всех типов, которые содержаться в текущем сообщении обмена +// можно получить вызовом процедуры ВыполнитьАнализСообщенияОбмена() +// +Процедура ВыполнитьЗагрузкуДанныхВИнформационнуюБазу(ТаблицыДляЗагрузки) Экспорт + + // сбрасываем кэш наличия информации сопоставления + СброситьКэшНаличияИнформацииСопоставления(); + + РежимЗагрузкиДанных = "ЗагрузкаВИнформационнуюБазу"; + ПолеСостояниеОбменаДанными = Неопределено; + ПолеРезультатВыполненияОбмена = Неопределено; + + // дата начала загрузки + СостояниеОбменаДанными().ДатаНачала = ТекущаяДата(); + + // запись в журнале регистрации + СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными для узла: [УзелИнформационнойБазыНаименование]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[УзелИнформационнойБазыНаименование]", Строка(УзелОбменаЗагрузкаДанных)); + ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщения, УровеньЖурналаРегистрации.Информация); + + ВыполнитьЗагрузкуФайлаПакета(ТаблицыДляЗагрузки); + + // дата окончания загрузки + СостояниеОбменаДанными().ДатаОкончания = ТекущаяДата(); + + // фиксируем завершение загрузки данных в РС + ЗафиксироватьЗавершениеЗагрузкиДанных(); + + // запись в журнале регистрации + СтрокаСообщения = НСтр("ru = '[РезультатВыполненияОбмена], [ДействиеПриОбмене]; Обработано [КоличествоОбъектовОбработано] объектов'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[РезультатВыполненияОбмена]", РезультатВыполненияОбмена()); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ДействиеПриОбмене]", Перечисления.ДействияПриОбмене.ЗагрузкаДанных); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[КоличествоОбъектовОбработано]", Формат(СчетчикЗагруженныхОбъектов(), "ЧГ=0")); + ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщения, УровеньЖурналаРегистрации.Информация); + +КонецПроцедуры + +// Выполняет загрузку данных из файла сообщения обмена в Таблицу значений только заданных типов объектов +// +// Параметры: +// ТаблицыДляЗагрузки - Массив - массив типов, которые необходимо загрузить из сообщения обмена; элемент массива - Строка +// Например, для загрузки из сообщения обмена только элементов справочника Контрагенты: +// ТаблицыДляЗагрузки = Новый Массив; +// ТаблицыДляЗагрузки.Добавить("СправочникСсылка.Контрагенты"); +// +// Список всех типов, которые содержаться в текущем сообщении обмена +// можно получить вызовом процедуры ВыполнитьАнализСообщенияОбмена() +// +Процедура ВыполнитьЗагрузкуДанныхВТаблицуЗначений(ТаблицыДляЗагрузки) Экспорт + + // сбрасываем кэш наличия информации сопоставления + СброситьКэшНаличияИнформацииСопоставления(); + + РежимЗагрузкиДанных = "ЗагрузкаВТаблицуЗначений"; + ПолеСостояниеОбменаДанными = Неопределено; + ПолеРезультатВыполненияОбмена = Неопределено; + + ИспользоватьТранзакции = Ложь; + + // инициализируем таблицы данных сообщения обмена + Для Каждого ТипОбъектаСтрокой ИЗ ТаблицыДляЗагрузки Цикл + + ТаблицыДанныхСообщенияОбмена().Вставить(ТипОбъектаСтрокой, ИнициализацияТаблицыДанныхСообщенияОбмена(Тип(ТипОбъектаСтрокой))); + + КонецЦикла; + + ВыполнитьЗагрузкуФайлаПакета(ТаблицыДляЗагрузки); + +КонецПроцедуры + +// Выполняет последовательное чтение файла сообщения обмена при этом: +// - удаляется регистрация изменений по номеру входящей квитанции +// - загружаются правила обмена +// - загружается информация о типах данных +// - зачитывается информация сопоставления данных и записывается и ИБ +// - собирается информация о типах объектов и их количестве +// +// Параметры: +// Нет. +// +Процедура ВыполнитьАнализСообщенияОбмена() Экспорт + + УстановитьФлагОшибки(Ложь); + + ИспользоватьТранзакции = Ложь; + + ПолеСтрокаСообщенияОбОшибке = ""; + ПолеСостояниеОбменаДанными = Неопределено; + ПолеРезультатВыполненияОбмена = Неопределено; + + ИнициализироватьВедениеПротоколаОбмена(); + + Если ПустаяСтрока(ИмяФайлаОбмена) Тогда + ЗаписатьВПротоколВыполнения(15); + ЗавершитьВедениеПротоколаОбмена(); + Возврат; + КонецЕсли; + + ИнициализироватьМенеджерыИСообщения(); + + // дата начала анализа + СостояниеОбменаДанными().ДатаНачала = ТекущаяДата(); + + // открываем файл сообщения обмена + // зачитываем правила обмена (при необходимости) + ОткрытьФайлОбмена(); + + Если ФлагОшибки() Тогда + ЗавершитьВедениеПротоколаОбмена(); + Возврат; + КонецЕсли; + + // обнуляем значение модальной переменной + ПолеТаблицаДанныхЗаголовкаПакета = Неопределено; + + Попытка + + // зачитываем данные из сообщения обмена + ПроизвестиЧтениеДанныхВРежимеАнализа(); + + // сворачиваем таблицу заголовка + ТаблицаДанныхЗаголовкаПакета().Свернуть("ТипОбъектаСтрокой, ИмяПравила, ПоляПоиска, ПоляТаблицы, ТипИсточникаСтрокой, ТипПриемникаСтрокой, СинхронизироватьПоИдентификатору", + "КоличествоОбъектовВИсточнике"); + + // дополняем таблицу заголовка данными ПКО + Для Каждого СтрокаТаблицы ИЗ ТаблицаДанныхЗаголовкаПакета() Цикл + + ПКО = Правила[СтрокаТаблицы.ИмяПравила]; + + СтрокаТаблицы.ТипПриемникаСтрокой = ПКО.ТипПриемника; + СтрокаТаблицы.ТипИсточникаСтрокой = ПКО.ТипИсточника; + + СтрокаТаблицы.ПоляПоиска = ПКО.ПоляПоиска; + СтрокаТаблицы.ПоляТаблицы = ПКО.ПоляТаблицы; + + СтрокаТаблицы.СинхронизироватьПоИдентификатору = ПКО.СинхронизироватьПоИдентификатору; + + КонецЦикла; + + Исключение + СтрокаСообщения = НСтр("ru = 'Ошибка при анализе данных: [ОписаниеОшибки]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОписаниеОшибки]", ОписаниеОшибки()); + ЗаписатьВПротоколВыполнения(СтрокаСообщения,,,,,Истина); + КонецПопытки; + + ФайлОбмена.Закрыть(); + + ЗавершитьВедениеПротоколаОбмена(); + + // дата окончания анализа + СостояниеОбменаДанными().ДатаОкончания = ТекущаяДата(); + + // фиксируем завершение анализа данных в РС + ЗафиксироватьЗавершениеЗагрузкиДанных(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ ДЛЯ НАПИСАНИЯ АЛГОРИТМОВ + +//////////////////////////////////////////////////////////////////////////////// +// РАБОТА СО СТРОКАМИ + +// Разбирает строку на две части: до подстроки разделителя и после. +// +// Параметры: +// Стр - разбираемая строка; +// Разделитель - подстрока-разделитель: +// Режим - 0 - разделитель в возвращаемые подстроки не включается; +// 1 - разделитель включается в левую подстроку; +// 2 - разделитель включается в правую подстроку. +// +// Возвращаемое значение: +// Правая часть строки - до символа-разделителя. +// +Функция ОтделитьРазделителем(Стр, Знач Разделитель, Режим=0) + + ПраваяЧасть = ""; + ПозРазделителя = Найти(Стр, Разделитель); + ДлинаРазделителя = СтрДлина(Разделитель); + Если ПозРазделителя > 0 Тогда + ПраваяЧасть = Сред(Стр, ПозРазделителя + ?(Режим=2, 0, ДлинаРазделителя)); + Стр = СокрЛП(Лев(Стр, ПозРазделителя - ?(Режим=1, -ДлинаРазделителя + 1, 1))); + КонецЕсли; + + Возврат(ПраваяЧасть); + +КонецФункции // ОтделитьРазделителем() + +// Преобразует значения из строки в массив, используя указанный разделитель +// +// Параметры: +// Стр - Разбираемая строка +// Разделитель - подстрока разделитель +// +// Возвращаемое значение: +// Массив значений +// +Функция МассивИзСтроки(Знач Стр, Разделитель=",") + + Массив = Новый Массив; + ПраваяЧасть = ОтделитьРазделителем(Стр, Разделитель); + + Пока Не ПустаяСтрока(Стр) Цикл + Массив.Добавить(СокрЛП(Стр)); + Стр = ПраваяЧасть; + ПраваяЧасть = ОтделитьРазделителем(Стр, Разделитель); + КонецЦикла; + + Возврат(Массив); + +КонецФункции // МассивИзСтроки() + +Функция ПолучитьСтроковыйНомерБезПрефиксов(Номер) + + НомерБезПрефиксов = ""; + Сч = СтрДлина(Номер); + + Пока Сч > 0 Цикл + + Символ = Сред(Номер, Сч, 1); + + Если (Символ >= "0" И Символ <= "9") Тогда + + НомерБезПрефиксов = Символ + НомерБезПрефиксов; + + Иначе + + Возврат НомерБезПрефиксов; + + КонецЕсли; + + Сч = Сч - 1; + + КонецЦикла; + + Возврат НомерБезПрефиксов; + +КонецФункции + +// Разбирает строку, выделяя из нее префикс и числовую часть. +// +// Параметры: +// Стр - Строка. Разбираемая строка; +// ЧисловаяЧасть - Число. Переменная, в которую возвратится числовая часть строки; +// Режим - Строка. Если "Число", то возвратит числовую часть, иначе - префикс. +// +// Возвращаемое значение: +// Префикс строки +// +Функция ПолучитьПрефиксЧислоНомера(Знач Стр, ЧисловаяЧасть = "", Режим = "") + + ЧисловаяЧасть = 0; + Префикс = ""; + Стр = СокрЛП(Стр); + Длина = СтрДлина(Стр); + + СтроковыйНомерБезПрефикса = ПолучитьСтроковыйНомерБезПрефиксов(Стр); + ДлинаСтроковойЧасти = СтрДлина(СтроковыйНомерБезПрефикса); + Если ДлинаСтроковойЧасти > 0 Тогда + ЧисловаяЧасть = Число(СтроковыйНомерБезПрефикса); + Префикс = Сред(Стр, 1, Длина - ДлинаСтроковойЧасти); + Иначе + Префикс = Стр; + КонецЕсли; + + Если Режим = "Число" Тогда + Возврат(ЧисловаяЧасть); + Иначе + Возврат(Префикс); + КонецЕсли; + +КонецФункции // ПолучитьПрефиксЧислоНомера() + +// Приводит номер (код) к требуемой длине. При этом выделяется префикс +// и числовая часть номера, остальное пространство между префиксом и +// номером заполняется нулями. +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// Стр - преобразовываемая строка; +// Длина - требуемая длина строки. +// +// Возвращаемое значение: +// Строка - код или номер, приведенная к требуемой длине. +// +Функция ПривестиНомерКДлине(Знач Стр, Длина, ДобавлятьНулиЕслиДлинаНеМеньшеТекущейДлиныНомера = Истина, Префикс = "") Экспорт + + Стр = СокрЛП(Стр); + ВходящаяДлинаНомера = СтрДлина(Стр); + + ЧисловаяЧасть = ""; + Результат = ПолучитьПрефиксЧислоНомера(Стр, ЧисловаяЧасть); + + Результат = ?(ПустаяСтрока(Префикс), Результат, Префикс); + + СтрокаЧисловойЧасти = Формат(ЧисловаяЧасть, "ЧГ=0"); + ДлинаЧисловойЧасти = СтрДлина(СтрокаЧисловойЧасти); + + Если (Длина >= ВходящаяДлинаНомера И ДобавлятьНулиЕслиДлинаНеМеньшеТекущейДлиныНомера) + ИЛИ (Длина < ВходящаяДлинаНомера) Тогда + + Для ВременнаяПеременная = 1 По Длина - СтрДлина(Результат) - ДлинаЧисловойЧасти Цикл + + Результат = Результат + "0"; + + КонецЦикла; + + КонецЕсли; + + Результат = Результат + СтрокаЧисловойЧасти; + + Возврат(Результат); + +КонецФункции // ПривестиНомерКДлине() + +// Добавляет к префиксу номера или кода подстроку +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// Стр - Строка. Номер или код; +// Добавок - добавляемая к префиксу подстрока; +// Длина - требуемая результирующая длина строки; +// Режим - "Слева" - подстрока добавляется слева к префиксу, иначе - справа. +// +// Возвращаемое значение: +// Строка - номер или код, к префиксу которого добавлена указанная подстрока. +// +Функция ДобавитьКПрефиксу(Знач Стр, Добавок = "", Длина = "", Режим = "Слева", + НеДобавлятьПрефиксЕслиСНегоНачинаетсяНомер = Ложь, + ОбрезатьЧисловуюЧастьСлеваВСлучаеПревышенияНомера = Ложь) Экспорт + + Стр = СокрЛП(Формат(Стр,"ЧГ=0")); + + Если ПустаяСтрока(Длина) Тогда + Длина = СтрДлина(Стр); + КонецЕсли; + + ЧисловаяЧасть = ""; + Префикс = ПолучитьПрефиксЧислоНомера(Стр, ЧисловаяЧасть); + ДополнениеКПрефиксу = СокрЛП(Добавок); + + Если НеДобавлятьПрефиксЕслиСНегоНачинаетсяНомер Тогда + + Если Найти(Префикс, ДополнениеКПрефиксу) = 1 Тогда + Возврат Стр; + КонецЕсли; + + КонецЕсли; + + Если Режим = "Слева" Тогда + Результат = ДополнениеКПрефиксу + Префикс; + Иначе + Результат = Префикс + ДополнениеКПрефиксу; + КонецЕсли; + + СтрокаЧисловойЧасти = Формат(ЧисловаяЧасть, "ЧГ=0"); + ДлинаЧисловойЧасти = СтрДлина(СтрокаЧисловойЧасти); + ДлинаПрефикса = СтрДлина(Результат); + + Для НомерДобавления = 1 По Длина - ДлинаПрефикса - ДлинаЧисловойЧасти Цикл + Результат = Результат + "0"; + КонецЦикла; + + Если ОбрезатьЧисловуюЧастьСлеваВСлучаеПревышенияНомера + И ДлинаПрефикса + ДлинаЧисловойЧасти > Длина Тогда + + КоличествоСимволовУрезанияЧисловойЧасти = ДлинаЧисловойЧасти - Длина + ДлинаПрефикса; + Если КоличествоСимволовУрезанияЧисловойЧасти > 0 Тогда + СтрокаЧисловойЧасти = Сред(СтрокаЧисловойЧасти, КоличествоСимволовУрезанияЧисловойЧасти + 1); + КонецЕсли; + + КонецЕсли; + + Результат = Результат + СтрокаЧисловойЧасти; + + Возврат Результат; + +КонецФункции // ДобавитьКПрефиксу() + +// Дополняет строку указанным символом до указанной длины. +// +// Параметры: +// Стр - дополняемая строка; +// Длина - требуемая длина результирующей строки; +// Чем - символ, которым дополняется строка. +// +// Возвращаемое значение: +// Строка, дополненная указанным символом до указанной длины. +// +Функция одДополнитьСтроку(Стр, Длина, Чем = " ") Экспорт + + Результат = СокрЛП(Стр); + Пока Длина - СтрДлина(Результат) > 0 Цикл + Результат = Результат + Чем; + КонецЦикла; + + Возврат(Результат); + +КонецФункции // одДополнитьСтроку() + +//////////////////////////////////////////////////////////////////////////////// +// РАБОТА С ДАННЫМИ + +// Возвращает строку - имя переданного значения перечисления. +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// Значение - значение перечисления +// +// Возвращаемое значение: +// Строка - имя переданного значения перечисления. +// +Функция одИмяЗначенияПеречисления(Значение) Экспорт + + ОбъектМД = Значение.Метаданные(); + ИндексЗначения = Перечисления[ОбъектМД.Имя].Индекс(Значение); + + Возврат ОбъектМД.ЗначенияПеречисления[ИндексЗначения].Имя; + +КонецФункции // одИмяЗначенияПеречисления() + +// Определяет заполнено ли переданное значение +// +// Параметры: +// Значение - значение, заполнение которого надо проверить +// +// Возвращаемое значение: +// Истина - значение не заполнено, ложь - иначе. +// +Функция одПустое(Значение, ЭтоNULL=Ложь) + + // Сначала примитивные типы + Если Значение = Неопределено Тогда + Возврат Истина; + ИначеЕсли Значение = NULL Тогда + ЭтоNULL = Истина; + Возврат Истина; + КонецЕсли; + + ТипЗначения = ТипЗнч(Значение); + + Если ТипЗначения = ТипХранилищеЗначения Тогда + + Результат = одПустое(Значение.Получить()); + Возврат Результат; + + ИначеЕсли ТипЗначения = ТипДвоичныеДанные Тогда + + Возврат Ложь; + + Иначе + + // Для остальных будем считать значение пустым, если оно равно + // значению по умолчанию своего типа. + Попытка + Результат = Не ЗначениеЗаполнено(Значение); + Возврат Результат; + Исключение + Возврат Ложь; + КонецПопытки; + + КонецЕсли; + +КонецФункции // одПустое() + +// Возвращает объект ОписаниеТипов, содержащий указанный тип. +// +// Параметры: +// ЗначениеТипа - строка с именем типа или значение типа Тип. +// +// Возвращаемое значение: +// ОписаниеТипов +// +Функция одОписаниеТипа(ЗначениеТипа) + + ОписаниеТипов = СоответствиеОписаниеТипов[ЗначениеТипа]; + + Если ОписаниеТипов = Неопределено Тогда + + МассивТипов = Новый Массив; + Если ТипЗнч(ЗначениеТипа) = ТипСтрока Тогда + МассивТипов.Добавить(Тип(ЗначениеТипа)); + Иначе + МассивТипов.Добавить(ЗначениеТипа); + КонецЕсли; + ОписаниеТипов = Новый ОписаниеТипов(МассивТипов); + + СоответствиеОписаниеТипов.Вставить(ЗначениеТипа, ОписаниеТипов); + + КонецЕсли; + + Возврат ОписаниеТипов; + +КонецФункции // одОписаниеТипа() + +// Возвращает пустое (дефолтное) значение указанного типа +// +// Параметры: +// Тип - строка с именем типа или значение типа Тип. +// +// Возвращаемое значение: +// Пустое значение указанного типа. +// +Функция одПолучитьПустоеЗначение(Тип) + + ПустоеЗначениеТипа = СоответствиеПустыхЗначенийТипов[Тип]; + + Если ПустоеЗначениеТипа = Неопределено Тогда + + ПустоеЗначениеТипа = одОписаниеТипа(Тип).ПривестиЗначение(Неопределено); + + СоответствиеПустыхЗначенийТипов.Вставить(Тип, ПустоеЗначениеТипа); + + КонецЕсли; + + Возврат ПустоеЗначениеТипа; + +КонецФункции // ПолучитьПустоеЗначение() + +Функция ПроверитьСуществованиеСсылки(Ссылка, Менеджер, НайденныйОбъектПоУникальномуИдентификатору, + РежимПоискаОсновногоОбъекта, СтрокаЗапросаПоискаПоУникальномуИдентификатору) + + Попытка + + Если РежимПоискаОсновногоОбъекта + ИЛИ ПустаяСтрока(СтрокаЗапросаПоискаПоУникальномуИдентификатору) Тогда + + НайденныйОбъектПоУникальномуИдентификатору = Ссылка.ПолучитьОбъект(); + + Если НайденныйОбъектПоУникальномуИдентификатору = Неопределено Тогда + + Возврат Менеджер.ПустаяСсылка(); + + КонецЕсли; + + Иначе + // это режим поиска по ссылке - достаточно сделать запрос к информационной базе + // шаблон для запроса СтруктураСвойств.СтрокаПоиска + + Запрос = Новый Запрос(); + Запрос.Текст = СтрокаЗапросаПоискаПоУникальномуИдентификатору + " Ссылка = &Ссылка "; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + + РезультатЗапроса = Запрос.Выполнить(); + + Если РезультатЗапроса.Пустой() Тогда + + Возврат Менеджер.ПустаяСсылка(); + + КонецЕсли; + + КонецЕсли; + + Возврат Ссылка; + + Исключение + + Возврат Менеджер.ПустаяСсылка(); + + КонецПопытки; + +КонецФункции + +// Осуществляет простой поиск объекта информационной базы по указанному свойству. +// +// Параметры: +// Менеджер - менеджер искомого объекта; +// Свойство - свойство, по которому осуществляем поиск: Имя, Код, +// Наименование или Имя индексируемого реквизита; +// Значение - значение свойства, по которому ищем объект. +// +// Возвращаемое значение: +// Найденный объект информационной базы. +// +Функция одНайтиОбъектПоСвойству(Менеджер, Свойство, Значение, + НайденныйОбъектПоУникальномуИдентификатору = Неопределено, + ОбщаяСтруктураСвойств = Неопределено, ОбщиеСвойстваПоиска = Неопределено, + РежимПоискаОсновногоОбъекта = Истина, СтрокаЗапросаПоискаПоУникальномуИдентификатору = "") + + Если Свойство = "Имя" Тогда + + Возврат Менеджер[Значение]; + + ИначеЕсли Свойство = "{УникальныйИдентификатор}" Тогда + + СсылкаПоИдентификатору = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(Значение)); + + Ссылка = ПроверитьСуществованиеСсылки(СсылкаПоИдентификатору, Менеджер, НайденныйОбъектПоУникальномуИдентификатору, + РежимПоискаОсновногоОбъекта, СтрокаЗапросаПоискаПоУникальномуИдентификатору); + + Возврат Ссылка; + + ИначеЕсли Свойство = "{ИмяПредопределенногоЭлемента}" Тогда + + Попытка + + Ссылка = Менеджер[Значение]; + + Исключение + + Ссылка = Менеджер.НайтиПоКоду(Значение); + + КонецПопытки; + + Возврат Ссылка; + + Иначе + + СсылкаНаОбъект = НайтиЭлементЗапросом(ОбщаяСтруктураСвойств, ОбщиеСвойстваПоиска, , Менеджер); + + Возврат СсылкаНаОбъект; + + КонецЕсли; + +КонецФункции + +// Осуществляет простой поиск объекта информационной базы по указанному свойству. +// +// Параметры: +// Стр - Строка - значение свойства, по которому осуществляется +// поиск объект; +// Тип - тип искомого объекта; +// Свойство - Строка - имя свойства, по-которому ищем объект. +// +// Возвращаемое значение: +// Найденный объект информационной базы +// +Функция одПолучитьЗначениеПоСтроке(Стр, Тип, Свойство = "") + + Если ПустаяСтрока(Стр) Тогда + Возврат Новый(Тип); + КонецЕсли; + + Свойства = Менеджеры[Тип]; + + Если Свойства = Неопределено Тогда + + ОписаниеТипов = одОписаниеТипа(Тип); + Возврат ОписаниеТипов.ПривестиЗначение(Стр); + + КонецЕсли; + + Если ПустаяСтрока(Свойство) Тогда + + Если Свойства.ИмяТипа = "Перечисление" Тогда + Свойство = "Имя"; + Иначе + Свойство = "{ИмяПредопределенногоЭлемента}"; + КонецЕсли; + + КонецЕсли; + + Возврат одНайтиОбъектПоСвойству(Свойства.Менеджер, Свойство, Стр); + +КонецФункции // одПолучитьЗначениеПоСтроке() + +// Возвращает строковое представление типа значения +// +// Параметры: +// ЗначениеИлиТип - произвольное значение или значение типа тип +// +// Возвращаемое значение: +// Строка - строковое представление типа значения +// +Функция одТипЗначенияСтрокой(ЗначениеИлиТип) + + ТипЗначения = ТипЗнч(ЗначениеИлиТип); + + Если ТипЗначения = ТипТип Тогда + ТипЗначения = ЗначениеИлиТип; + КонецЕсли; + + Если (ТипЗначения = Неопределено) Или (ЗначениеИлиТип = Неопределено) Тогда + Результат = ""; + ИначеЕсли ТипЗначения = ТипСтрока Тогда + Результат = "Строка"; + ИначеЕсли ТипЗначения = ТипЧисло Тогда + Результат = "Число"; + ИначеЕсли ТипЗначения = ТипДата Тогда + Результат = "Дата"; + ИначеЕсли ТипЗначения = ТипБулево Тогда + Результат = "Булево"; + ИначеЕсли ТипЗначения = ТипХранилищеЗначения Тогда + Результат = "ХранилищеЗначения"; + ИначеЕсли ТипЗначения = ТипВидДвиженияНакопления Тогда + Результат = "ВидДвиженияНакопления"; + Иначе + Менеджер = Менеджеры[ТипЗначения]; + Если Менеджер = Неопределено Тогда + Иначе + Результат = Менеджер.ТипСсылкиСтрокой; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции // одТипЗначенияСтрокой() + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ОБЪЕКТОМ XMLЗапись + +Процедура ВыполнитьПроверкуНеДопустимыхСимволовВСтроке(Стр) + + Если ПустаяСтрока(Стр) Тогда + Возврат; + КонецЕсли; + + ПозицияНедопустимогоСимвола = НайтиНедопустимыеСимволыXML(Стр); + + Если ПозицияНедопустимогоСимвола > 0 Тогда + + НоваяСтрока = ""; + Пока ПозицияНедопустимогоСимвола > 0 Цикл + НоваяСтрока = НоваяСтрока + Лев(Стр, ПозицияНедопустимогоСимвола - 1); + Стр = Сред(Стр, ПозицияНедопустимогоСимвола + 1); + ПозицияНедопустимогоСимвола = НайтиНедопустимыеСимволыXML(Стр); + КонецЦикла; + Стр = НоваяСтрока + Стр; + + КонецЕсли; + +КонецПроцедуры + +// Создает новый xml-узел +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// +// Параметры: +// Имя - Имя узла +// +// Возвращаемое значение: +// Объект нового xml-узла +// +Функция СоздатьУзел(Имя) Экспорт + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + ЗаписьXML.ЗаписатьНачалоЭлемента(Имя); + + Возврат ЗаписьXML; + +КонецФункции // СоздатьУзел() + +// Добавляет новый xml-узел к указанному узлу-родителю +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// УзелРодитель - xml-узел-родитель +// Имя - имя добавляемого узла +// +// Возвращаемое значение: +// Новый xml-узел, добавленный к указанному узлу-родителю +// +Функция ДобавитьУзел(УзелРодитель, Имя) Экспорт + + УзелРодитель.ЗаписатьНачалоЭлемента(Имя); + + Возврат УзелРодитель; + +КонецФункции // ДобавитьУзел() + +// Копирует указанный xml-узел +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// Узел - копируемый узел +// +// Возвращаемое значение: +// Новый xml - копия указанного узла +// +Функция КопироватьУзел(Узел) Экспорт + + Стр = Узел.Закрыть(); + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + + Если ВестиДополнительныйКонтрольЗаписиВXML Тогда + + ВыполнитьПроверкуНеДопустимыхСимволовВСтроке(Стр); + + КонецЕсли; + + ЗаписьXML.ЗаписатьБезОбработки(Стр); + + Возврат ЗаписьXML; + +КонецФункции + +// Осуществляет запись элемента и его значения в указанный объект +// +// Параметры: +// Объект - объект типа XMLЗапись +// Имя - Строка. Имя элемента +// Значение - Значение элемента +// +Процедура одЗаписатьЭлемент(Объект, Имя, Значение="") Экспорт + + Объект.ЗаписатьНачалоЭлемента(Имя); + Стр = XMLСтрока(Значение); + + Если ВестиДополнительныйКонтрольЗаписиВXML Тогда + + ВыполнитьПроверкуНеДопустимыхСимволовВСтроке(Стр); + + КонецЕсли; + + Объект.ЗаписатьТекст(Стр); + Объект.ЗаписатьКонецЭлемента(); + +КонецПроцедуры // одЗаписатьЭлемент() + +// Подчиняет xml-узел указанному узлу-родителю +// +// Параметры: +// УзелРодитель - xml-узел-родитель +// Узел - подчиняемый узел +// +Процедура ДобавитьПодчиненный(УзелРодитель, Узел) Экспорт + + Если ТипЗнч(Узел) <> ТипСтрока Тогда + Узел.ЗаписатьКонецЭлемента(); + ИнформацияДляЗаписиВФайл = Узел.Закрыть(); + Иначе + ИнформацияДляЗаписиВФайл = Узел; + КонецЕсли; + + УзелРодитель.ЗаписатьБезОбработки(ИнформацияДляЗаписиВФайл); + +КонецПроцедуры // ДобавитьПодчиненный() + +// Устанавливает атрибут указанного xml-узла +// +// Параметры: +// Узел - xml-узел +// Имя - имя атрибута +// Значение - устанавливаемое значение +// +Процедура УстановитьАтрибут(Узел, Имя, Значение) Экспорт + + СтрокаЗаписи = XMLСтрока(Значение); + + Если ВестиДополнительныйКонтрольЗаписиВXML Тогда + + ВыполнитьПроверкуНеДопустимыхСимволовВСтроке(СтрокаЗаписи); + + КонецЕсли; + + Узел.ЗаписатьАтрибут(Имя, СтрокаЗаписи); + +КонецПроцедуры // УстановитьАтрибут() + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ОБЪЕКТОМ XMLЧтение + +// Читает значение атрибута по имени из указанного объекта, приводит значение +// к указанному примитивному типу +// +// Параметры: +// Объект - объект типа XMLЧтение, спозиционированный на начале элемента, +// атрибут которого требуется получить +// Тип - Значение типа Тип. Тип атрибута +// Имя - Строка. Имя атрибута +// +// Возвращаемое значение: +// Значение атрибута полученное по имени и приведенное к указанному типу +// +Функция одАтрибут(Объект, Тип, Имя) + + СтрЗначение = СокрП(Объект.ПолучитьАтрибут(Имя)); + Если Не ПустаяСтрока(СтрЗначение) Тогда + Возврат XMLЗначение(Тип, СтрЗначение); + ИначеЕсли Тип = ТипСтрока Тогда + Возврат ""; + ИначеЕсли Тип = ТипБулево Тогда + Возврат Ложь; + ИначеЕсли Тип = ТипЧисло Тогда + Возврат 0; + ИначеЕсли Тип = ТипДата Тогда + Возврат ЗначениеПустаяДата; + КонецЕсли; + +КонецФункции // одАтрибут() + +// Пропускает узлы xml до конца указанного элемента (по умолчанию текущего) +// +// Параметры: +// Объект - объект типа XMLЧтение +// Имя - имя узла, до конца которого пропускаем элементы +// +Процедура одПропустить(Объект, Имя="") + + КолвоВложений = 0; // количество одноименных вложений + + Если Имя = "" Тогда + + Имя = Объект.ЛокальноеИмя; + + КонецЕсли; + + Пока Объект.Прочитать() Цикл + + Если Объект.ЛокальноеИмя <> Имя Тогда + Продолжить; + КонецЕсли; + + ТипУзла = Объект.ТипУзла; + + Если ТипУзла = ТипУзлаXMLКонецЭлемента Тогда + + Если КолвоВложений = 0 Тогда + + Прервать; + + Иначе + + КолвоВложений = КолвоВложений - 1; + + КонецЕсли; + + ИначеЕсли ТипУзла = ТипУзлаXMLНачалоЭлемента Тогда + + КолвоВложений = КолвоВложений + 1; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // одПропустить() + +// Читает текст элемента и приводит значение к указанному типу +// +// Параметры: +// Объект - объект типа XMLЧтение, из которого осуществляется чтение +// Тип - тип получаемого значения +// ИскатьПоСвойству - для ссылочных типов может быть указано свойство, по которому +// следует искать объект: "Код", "Наименование", <ИмяРеквизита>, "Имя" (предопределенного значения) +// +// Возвращаемое значение: +// Значение xml-элемента, приведенное к соответствующему типу +// +Функция одЗначениеЭлемента(Объект, Тип, ИскатьПоСвойству = "", ОбрезатьСтрокуСправа = Истина) + + Значение = ""; + Имя = Объект.ЛокальноеИмя; + + Пока Объект.Прочитать() Цикл + + ТипУзла = Объект.ТипУзла; + + Если ТипУзла = ТипУзлаXMLТекст Тогда + + Значение = Объект.Значение; + + Если ОбрезатьСтрокуСправа Тогда + + Значение = СокрП(Значение); + + КонецЕсли; + + ИначеЕсли (Объект.ЛокальноеИмя = Имя) И (ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; + + Иначе + + Возврат Неопределено; + + КонецЕсли; + + КонецЦикла; + + + Если (Тип = ТипСтрока) ИЛИ (Тип = ТипБулево) ИЛИ (Тип = ТипЧисло) ИЛИ (Тип = ТипДата) + ИЛИ (Тип = ТипХранилищеЗначения) ИЛИ (Тип = ТипВидДвиженияНакопления) + ИЛИ (Тип = ТипВидСчета) Тогда + + Возврат XMLЗначение(Тип, Значение); + + Иначе + + Возврат одПолучитьЗначениеПоСтроке(Значение, Тип, ИскатьПоСвойству); + + КонецЕсли; + +КонецФункции // одЗначениеЭлемента() + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ С ФАЙЛОМ ОБМЕНА + +// Сохраняет в файл указанный xml-узел +// +// Параметры: +// Узел - xml-узел, сохраняемый в файл +// +Процедура ЗаписатьВФайл(Узел) + + Если ТипЗнч(Узел) <> ТипСтрока Тогда + ИнформацияДляЗаписиВФайл = Узел.Закрыть(); + Иначе + ИнформацияДляЗаписиВФайл = Узел; + КонецЕсли; + + ФайлОбмена.ЗаписатьСтроку(ИнформацияДляЗаписиВФайл); + +КонецПроцедуры // ЗаписатьВФайл() + +// Открывает файл обмена, записывает заголовок файла в соответствие с форматом обмена +// +// Параметры: +// Нет. +// +Функция ОткрытьФайлВыгрузки(СтрокаСообщенияОбОшибке = "") + + ФайлОбмена = Новый ЗаписьТекста; + Попытка + ФайлОбмена.Открыть(ИмяФайлаОбмена, КодировкаТекста.UTF8); + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(8); + Возврат ""; + + КонецПопытки; + + СтрокаИнформацииОXML = ""; + + ФайлОбмена.ЗаписатьСтроку(СтрокаИнформацииОXML); + + ВременныйЗаписьXML = Новый ЗаписьXML(); + + ВременныйЗаписьXML.УстановитьСтроку(); + + ВременныйЗаписьXML.ЗаписатьНачалоЭлемента("ФайлОбмена"); + + УстановитьАтрибут(ВременныйЗаписьXML, "ВерсияФормата", "3.0"); + УстановитьАтрибут(ВременныйЗаписьXML, "ДатаВыгрузки", ТекущаяДата()); + УстановитьАтрибут(ВременныйЗаписьXML, "ИмяКонфигурацииИсточника", Конвертация.Источник); + УстановитьАтрибут(ВременныйЗаписьXML, "ИмяКонфигурацииПриемника", Конвертация.Приемник); + УстановитьАтрибут(ВременныйЗаписьXML, "ИдПравилКонвертации", Конвертация.Ид); + УстановитьАтрибут(ВременныйЗаписьXML, "Комментарий", Комментарий); + + ВременныйЗаписьXML.ЗаписатьКонецЭлемента(); + + Стр = ВременныйЗаписьXML.Закрыть(); + + Стр = СтрЗаменить(Стр, "/>", ">"); + + ФайлОбмена.ЗаписатьСтроку(Стр); + + Возврат СтрокаИнформацииОXML + Символы.ПС + Стр; + +КонецФункции + +// Закрывает файл обмена +// +// Параметры: +// Нет. +// +Процедура ЗакрытьФайл() + + ФайлОбмена.ЗаписатьСтроку(""); + ФайлОбмена.Закрыть(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ С ПРОТОКОЛОМ ОБМЕНА + +// Возвращает объект типа структура, содержащий все возможные поля +// записи протокола выполнения (сообщения об ошибках и т.п.) +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Объект типа структура +// +Функция ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках = "", Знач СтрокаОшибки = "") + + СтруктураОшибки = Новый Структура("ИмяПКО,ИмяПОД,Нпп,ГНпп,Источник,ТипОбъекта,Свойство,Значение,ТипЗначения,ПКО,ПКС,ПКГС,ПВД,ПОД,Объект,СвойствоПриемника,КонвертируемоеЗначение,Обработчик,ОписаниеОшибки,ПозицияМодуля,Текст,КСообщенияОбОшибках,УзелПланаОбмена"); + + СтрокаМодуля = ОтделитьРазделителем(СтрокаОшибки, "{"); + ОписаниеОшибки = ОтделитьРазделителем(СтрокаМодуля, "}: "); + + Если ОписаниеОшибки <> "" Тогда + + СтруктураОшибки.ОписаниеОшибки = ОписаниеОшибки; + СтруктураОшибки.ПозицияМодуля = СтрокаМодуля; + + КонецЕсли; + + Если СтруктураОшибки.КСообщенияОбОшибках <> "" Тогда + + СтруктураОшибки.КСообщенияОбОшибках = КСообщенияОбОшибках; + + КонецЕсли; + + Возврат СтруктураОшибки; + +КонецФункции + +Процедура ИнициализироватьВедениеПротоколаОбмена() + + Если ПустаяСтрока(ИмяФайлаПротоколаОбмена) Тогда + + ФайлПротоколаДанных = Неопределено; + ФлагКомментироватьОбработкуОбъектов = ВыводВОкноСообщенийИнформационныхСообщений; + Возврат; + + Иначе + + ФлагКомментироватьОбработкуОбъектов = ВыводВПротоколИнформационныхСообщений ИЛИ ВыводВОкноСообщенийИнформационныхСообщений; + + КонецЕсли; + + ФайлПротоколаДанных = Новый ЗаписьТекста(ИмяФайлаПротоколаОбмена, КодировкаТекста.ANSI, , ДописыватьДанныеВПротоколОбмена) ; + +КонецПроцедуры + +Процедура ЗавершитьВедениеПротоколаОбмена() + + Если ФайлПротоколаДанных <> Неопределено Тогда + + ФайлПротоколаДанных.Закрыть(); + + КонецЕсли; + + ФайлПротоколаДанных = Неопределено; + +КонецПроцедуры + +// Сохраняет в протокол выполнения (или выводит на экран) сообщения указанной структуры +// +// Параметры: +// Код - Число. Код сообщения +// СтруктураЗаписи - Структура. Структура записи протокола +// ВзвестиФлагОшибок - Если истина, то - это сообщение об ошибке. Взводится ФлагОшибки +// +Функция ЗаписатьВПротоколВыполнения(Код = "", + СтруктураЗаписи=Неопределено, + ВзвестиФлагОшибок=Истина, + Уровень=0, + Выравнивание=22, + БезусловнаяЗаписьВПротоколОбмена = Ложь, + РезультатВыполненияОбмена = Неопределено) + // + УровеньЖР = Неопределено; + Отступ = ""; + Для Сч = 0 По Уровень-1 Цикл + Отступ = Отступ + Символы.Таб; + КонецЦикла; + + Если ТипЗнч(Код) = ТипЧисло Тогда + + Если СообщенияОбОшибках = Неопределено Тогда + ИнициализацияСообщений(); + КонецЕсли; + + Стр = СообщенияОбОшибках[Код]; + + Иначе + + Стр = Строка(Код); + + КонецЕсли; + + Стр = Отступ + Стр; + + Если СтруктураЗаписи <> Неопределено Тогда + + Для каждого Поле Из СтруктураЗаписи Цикл + + Значение = Поле.Значение; + Если Значение = Неопределено Тогда + Продолжить; + КонецЕсли; + Ключ = Поле.Ключ; + Стр = Стр + Символы.ПС + Отступ + Символы.Таб + одДополнитьСтроку(Поле.Ключ, Выравнивание) + " = " + Строка(Значение); + + КонецЦикла; + + КонецЕсли; + + ЛитералПеревода = ?(ПустаяСтрока(СтрокаСообщенияОбОшибке()), "", Символы.ПС); + + ПолеСтрокаСообщенияОбОшибке = СтрокаСообщенияОбОшибке() + ЛитералПеревода + Стр; + + Если ВзвестиФлагОшибок Тогда + + УстановитьФлагОшибки(); + + ПолеРезультатВыполненияОбмена = ?(РезультатВыполненияОбмена = Неопределено, + Перечисления.РезультатыВыполненияОбмена.Ошибка, + РезультатВыполненияОбмена); + // + Если РезультатВыполненияОбменаПредупреждение() Тогда + УровеньЖР = УровеньЖурналаРегистрации.Предупреждение; + Иначе + УровеньЖР = УровеньЖурналаРегистрации.Ошибка; + КонецЕсли; + + КонецЕсли; + + Если ФайлПротоколаДанных <> Неопределено Тогда + + Если ВзвестиФлагОшибок Тогда + + ФайлПротоколаДанных.ЗаписатьСтроку(Символы.ПС + "Ошибка!!!"); + + КонецЕсли; + + Если ВзвестиФлагОшибок ИЛИ БезусловнаяЗаписьВПротоколОбмена ИЛИ ВыводВПротоколИнформационныхСообщений Тогда + + ФайлПротоколаДанных.ЗаписатьСтроку(Символы.ПС + СтрокаСообщенияОбОшибке()); + + КонецЕсли; + + КонецЕсли; + + // фиксируем событие в журнале регистрации + ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщенияОбОшибке(), УровеньЖР); + + Возврат СтрокаСообщенияОбОшибке(); + +КонецФункции + +Функция ЗаписатьИнформациюОбОшибкеВПротокол(КСообщенияОбОшибках, СтрокаОшибки, Объект, ТипОбъекта = Неопределено) + + ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки); + ЗП.Объект = Объект; + + Если ТипОбъекта <> Неопределено Тогда + ЗП.ТипОбъекта = ТипОбъекта; + КонецЕсли; + + СтрокаОшибки = ЗаписатьВПротоколВыполнения(КСообщенияОбОшибках, ЗП); + + Возврат СтрокаОшибки; + +КонецФункции + +Процедура ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(КСообщенияОбОшибках, СтрокаОшибки, ИмяПравилаОчисткиДанных, Объект = "", ИмяОбработчика = "") + + ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки); + ЗП.ПОД = ИмяПравилаОчисткиДанных; + + Если Объект <> "" Тогда + ЗП.Объект = Строка(Объект) + " (" + ТипЗнч(Объект) + ")"; + КонецЕсли; + + Если ИмяОбработчика <> "" Тогда + ЗП.Обработчик = ИмяОбработчика; + КонецЕсли; + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КСообщенияОбОшибках, ЗП); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(КСообщенияОбОшибках, СтрокаОшибки, ИмяПравила, Источник = "", + ТипОбъекта, Объект = Неопределено, ИмяОбработчика) + + ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки); + ЗП.ИмяПКО = ИмяПравила; + ЗП.ТипОбъекта = ТипОбъекта; + ЗП.Обработчик = ИмяОбработчика; + + Если Не ПустаяСтрока(Источник) Тогда + + ЗП.Источник = Источник; + + КонецЕсли; + + Если Объект <> Неопределено Тогда + + ЗП.Объект = Строка(Объект); + + КонецЕсли; + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КСообщенияОбОшибках, ЗП); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(КСообщенияОбОшибках, СтрокаОшибки, ПКО, Источник = "", ИмяОбработчика) + + ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки); + ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; + + Попытка + ЗП.Объект = Строка(Источник) + " (" + ТипЗнч(Источник) + ")"; + Исключение + ЗП.Объект = "(" + ТипЗнч(Источник) + ")"; + КонецПопытки; + + ЗП.Обработчик = ИмяОбработчика; + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КСообщенияОбОшибках, ЗП); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаписатьИнформациюОбОшибкеОбработчикиПКС(КСообщенияОбОшибках, СтрокаОшибки, ПКО, ПКС, Источник = "", + ИмяОбработчика = "", Значение = Неопределено) + + ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки); + ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; + ЗП.ПКС = ПКС.Имя + " (" + ПКС.Наименование + ")"; + + Попытка + ЗП.Объект = Строка(Источник) + " (" + ТипЗнч(Источник) + ")"; + Исключение + ЗП.Объект = "(" + ТипЗнч(Источник) + ")"; + КонецПопытки; + + ЗП.СвойствоПриемника = ПКС.Приемник + " (" + ПКС.ТипПриемника + ")"; + + Если ИмяОбработчика <> "" Тогда + ЗП.Обработчик = ИмяОбработчика; + КонецЕсли; + + Если Значение <> Неопределено Тогда + ЗП.КонвертируемоеЗначение = Строка(Значение) + " (" + ТипЗнч(Значение) + ")"; + КонецЕсли; + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КСообщенияОбОшибках, ЗП); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаписатьИнформациюОбОшибкеОбработчикиПВД(КСообщенияОбОшибках, СтрокаОшибки, ИмяПравила, Объект = Неопределено, ИмяОбработчика) + + ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки); + ЗП.ПВД = ИмяПравила; + + Если Объект <> Неопределено Тогда + ЗП.Объект = Строка(Объект) + " (" + ТипЗнч(Объект) + ")"; + КонецЕсли; + + ЗП.Обработчик = ИмяОбработчика; + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КСообщенияОбОшибках, ЗП); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + +КонецПроцедуры + +Функция ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(КСообщенияОбОшибках, СтрокаОшибки, ИмяОбработчика) + + ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки); + ЗП.Обработчик = ИмяОбработчика; + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КСообщенияОбОшибках, ЗП); + Возврат СтрокаСообщенияОбОшибке; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ЗАГРУЗКИ ПРАВИЛ ОБМЕНА + +// Осуществляет загрузку правила конвертации группы свойств +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ТаблицаСвойств - таблица значений, содержащая ПКС +// +Процедура ЗагрузитьПКГС(ПравилаОбмена, ТаблицаСвойств, СвойстваОтключенные, СинхронизироватьПоИдентификатору) + + ЭтоПолеОтключено = одАтрибут(ПравилаОбмена, ТипБулево, "Отключить"); + + Если ЭтоПолеОтключено Тогда + + НоваяСтрока = СвойстваОтключенные.Добавить(); + + Иначе + + НоваяСтрока = ТаблицаСвойств.Добавить(); + + КонецЕсли; + + НоваяСтрока.ЭтоГруппа = Истина; + + НоваяСтрока.ПравилаГруппы = ТаблицаПравилКонвертацииСвойств.Скопировать(); + НоваяСтрока.ПравилаГруппыОтключенные = ТаблицаПравилКонвертацииСвойств.Скопировать(); + + // Значения по умолчанию + НоваяСтрока.НеЗамещать = Ложь; + НоваяСтрока.ПолучитьИзВходящихДанных = Ложь; + НоваяСтрока.УпрощеннаяВыгрузкаСвойства = Ложь; + + СтрокаПолейПоиска = ""; + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Источник" Тогда + НоваяСтрока.Источник = одАтрибут(ПравилаОбмена, ТипСтрока, "Имя"); + НоваяСтрока.ВидИсточника = одАтрибут(ПравилаОбмена, ТипСтрока, "Вид"); + НоваяСтрока.ТипИсточника = одАтрибут(ПравилаОбмена, ТипСтрока, "Тип"); + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "Приемник" Тогда + НоваяСтрока.Приемник = одАтрибут(ПравилаОбмена, ТипСтрока, "Имя"); + НоваяСтрока.ВидПриемника = одАтрибут(ПравилаОбмена, ТипСтрока, "Вид"); + НоваяСтрока.ТипПриемника = одАтрибут(ПравилаОбмена, ТипСтрока, "Тип"); + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "Свойство" Тогда + + ЗагрузитьПКС(ПравилаОбмена, НоваяСтрока.ПравилаГруппы,, НоваяСтрока.ПравилаГруппыОтключенные, СтрокаПолейПоиска, СинхронизироватьПоИдентификатору); + + ИначеЕсли ИмяУзла = "ПередОбработкойВыгрузки" Тогда + НоваяСтрока.ПередОбработкойВыгрузки = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + НоваяСтрока.ЕстьОбработчикПередОбработкойВыгрузки = Не ПустаяСтрока(НоваяСтрока.ПередОбработкойВыгрузки); + + ИначеЕсли ИмяУзла = "ПослеОбработкиВыгрузки" Тогда + НоваяСтрока.ПослеОбработкиВыгрузки = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + НоваяСтрока.ЕстьОбработчикПослеОбработкиВыгрузки = Не ПустаяСтрока(НоваяСтрока.ПослеОбработкиВыгрузки); + + ИначеЕсли ИмяУзла = "Код" Тогда + НоваяСтрока.Имя = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "Наименование" Тогда + НоваяСтрока.Наименование = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "Порядок" Тогда + НоваяСтрока.Порядок = одЗначениеЭлемента(ПравилаОбмена, ТипЧисло); + + ИначеЕсли ИмяУзла = "НеЗамещать" Тогда + НоваяСтрока.НеЗамещать = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + + ИначеЕсли ИмяУзла = "КодПравилаКонвертации" Тогда + НоваяСтрока.ПравилоКонвертации = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "ПередВыгрузкой" Тогда + НоваяСтрока.ПередВыгрузкой = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + НоваяСтрока.ЕстьОбработчикПередВыгрузкой = Не ПустаяСтрока(НоваяСтрока.ПередВыгрузкой); + + ИначеЕсли ИмяУзла = "ПриВыгрузке" Тогда + НоваяСтрока.ПриВыгрузке = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + НоваяСтрока.ЕстьОбработчикПриВыгрузке = Не ПустаяСтрока(НоваяСтрока.ПриВыгрузке); + + ИначеЕсли ИмяУзла = "ПослеВыгрузки" Тогда + НоваяСтрока.ПослеВыгрузки = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + НоваяСтрока.ЕстьОбработчикПослеВыгрузки = Не ПустаяСтрока(НоваяСтрока.ПослеВыгрузки); + + ИначеЕсли ИмяУзла = "ПолучитьИзВходящихДанных" Тогда + НоваяСтрока.ПолучитьИзВходящихДанных = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + + ИначеЕсли (ИмяУзла = "Группа") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + НоваяСтрока.СтрокаПолейПоиска = СтрокаПолейПоиска; + + НоваяСтрока.НуженУзелXMLПриВыгрузке = НоваяСтрока.ЕстьОбработчикПриВыгрузке ИЛИ НоваяСтрока.ЕстьОбработчикПослеВыгрузки; + + НоваяСтрока.НуженУзелXMLПриВыгрузкеГруппы = НоваяСтрока.ЕстьОбработчикПослеОбработкиВыгрузки; + +КонецПроцедуры + +Процедура ДобавитьПолеКСтрокеПоиска(СтрокаПолейПоиска, ИмяПоля) + + Если ПустаяСтрока(ИмяПоля) ТОгда + Возврат; + КонецЕсли; + + Если НЕ ПустаяСтрока(СтрокаПолейПоиска) Тогда + СтрокаПолейПоиска = СтрокаПолейПоиска + ","; + КонецЕсли; + + СтрокаПолейПоиска = СтрокаПолейПоиска + ИмяПоля; + +КонецПроцедуры + +// Осуществляет загрузку правила конвертации свойств +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ТаблицаСвойств - таблица значений, содержащая ПКС +// ТаблицаПоиска - таблица значений, содержащая ПКС (синхронизирующих) +// +Процедура ЗагрузитьПКС( ПравилаОбмена, + ТаблицаСвойств, + ТаблицаПоиска = Неопределено, + СвойстваОтключенные, + СтрокаПолейПоиска = "", + СинхронизироватьПоИдентификатору = Ложь) + // + + ЭтоПолеОтключено = одАтрибут(ПравилаОбмена, ТипБулево, "Отключить"); + ЭтоПолеПоиска = одАтрибут(ПравилаОбмена, ТипБулево, "Поиск"); + ЭтоОбязательноеСвойство = одАтрибут(ПравилаОбмена, ТипБулево, "Обязательное"); + + Если ЭтоПолеОтключено Тогда + + НоваяСтрока = СвойстваОтключенные.Добавить(); + + ИначеЕсли ЭтоОбязательноеСвойство И ТаблицаПоиска <> Неопределено Тогда + + НоваяСтрока = ТаблицаПоиска.Добавить(); + + ИначеЕсли СинхронизироватьПоИдентификатору Тогда + + НоваяСтрока = ТаблицаСвойств.Добавить(); + + ИначеЕсли ЭтоПолеПоиска И ТаблицаПоиска <> Неопределено Тогда + + НоваяСтрока = ТаблицаПоиска.Добавить(); + + Иначе + + НоваяСтрока = ТаблицаСвойств.Добавить(); + + КонецЕсли; + + // Значения по умолчанию + НоваяСтрока.НеЗамещать = Ложь; + НоваяСтрока.ПолучитьИзВходящихДанных = Ложь; + НоваяСтрока.ЭтоОбязательноеСвойство = ЭтоОбязательноеСвойство; + НоваяСтрока.ЭтоПолеПоиска = ЭтоПолеПоиска; + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Источник" Тогда + НоваяСтрока.Источник = одАтрибут(ПравилаОбмена, ТипСтрока, "Имя"); + НоваяСтрока.ВидИсточника = одАтрибут(ПравилаОбмена, ТипСтрока, "Вид"); + НоваяСтрока.ТипИсточника = одАтрибут(ПравилаОбмена, ТипСтрока, "Тип"); + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "Приемник" Тогда + НоваяСтрока.Приемник = одАтрибут(ПравилаОбмена, ТипСтрока, "Имя"); + НоваяСтрока.ВидПриемника = одАтрибут(ПравилаОбмена, ТипСтрока, "Вид"); + НоваяСтрока.ТипПриемника = одАтрибут(ПравилаОбмена, ТипСтрока, "Тип"); + + // заполняем переменную "СтрокаПолейПоиска" для поиска по всем реквизитам в ТЧ для которых есть ПКС + ДобавитьПолеКСтрокеПоиска(СтрокаПолейПоиска, НоваяСтрока.Приемник); + + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "Код" Тогда + НоваяСтрока.Имя = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "Наименование" Тогда + НоваяСтрока.Наименование = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "Порядок" Тогда + НоваяСтрока.Порядок = одЗначениеЭлемента(ПравилаОбмена, ТипЧисло); + + ИначеЕсли ИмяУзла = "НеЗамещать" Тогда + НоваяСтрока.НеЗамещать = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + + ИначеЕсли ИмяУзла = "КодПравилаКонвертации" Тогда + НоваяСтрока.ПравилоКонвертации = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "ПередВыгрузкой" Тогда + НоваяСтрока.ПередВыгрузкой = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + НоваяСтрока.ЕстьОбработчикПередВыгрузкой = Не ПустаяСтрока(НоваяСтрока.ПередВыгрузкой); + + ИначеЕсли ИмяУзла = "ПриВыгрузке" Тогда + НоваяСтрока.ПриВыгрузке = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + НоваяСтрока.ЕстьОбработчикПриВыгрузке = Не ПустаяСтрока(НоваяСтрока.ПриВыгрузке); + + ИначеЕсли ИмяУзла = "ПослеВыгрузки" Тогда + НоваяСтрока.ПослеВыгрузки = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + НоваяСтрока.ЕстьОбработчикПослеВыгрузки = Не ПустаяСтрока(НоваяСтрока.ПослеВыгрузки); + + ИначеЕсли ИмяУзла = "ПолучитьИзВходящихДанных" Тогда + НоваяСтрока.ПолучитьИзВходящихДанных = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + + ИначеЕсли ИмяУзла = "ПриводитьКДлине" Тогда + НоваяСтрока.ПриводитьКДлине = одЗначениеЭлемента(ПравилаОбмена, ТипЧисло); + + ИначеЕсли ИмяУзла = "ИмяПараметраДляПередачи" Тогда + НоваяСтрока.ИмяПараметраДляПередачи = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "ПоискПоДатеНаРавенство" Тогда + НоваяСтрока.ПоискПоДатеНаРавенство = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + + ИначеЕсли (ИмяУзла = "Свойство") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + НоваяСтрока.УпрощеннаяВыгрузкаСвойства = НЕ НоваяСтрока.ПолучитьИзВходящихДанных + И НЕ НоваяСтрока.ЕстьОбработчикПередВыгрузкой + И НЕ НоваяСтрока.ЕстьОбработчикПриВыгрузке + И НЕ НоваяСтрока.ЕстьОбработчикПослеВыгрузки + И ПустаяСтрока(НоваяСтрока.ПравилоКонвертации) + И НоваяСтрока.ТипИсточника = НоваяСтрока.ТипПриемника + И (НоваяСтрока.ТипИсточника = "Строка" ИЛИ НоваяСтрока.ТипИсточника = "Число" ИЛИ НоваяСтрока.ТипИсточника = "Булево" ИЛИ НоваяСтрока.ТипИсточника = "Дата"); + + НоваяСтрока.НуженУзелXMLПриВыгрузке = НоваяСтрока.ЕстьОбработчикПриВыгрузке ИЛИ НоваяСтрока.ЕстьОбработчикПослеВыгрузки; + +КонецПроцедуры + +// Осуществляет загрузку правил конвертации свойств +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ТаблицаСвойств - таблица значений, содержащая ПКС +// ТаблицаПоиска - таблица значений, содержащая ПКС (синхронизирующих) +// +Процедура ЗагрузитьСвойства(ПравилаОбмена, + ТаблицаСвойств, + ТаблицаПоиска, + СвойстваОтключенные, + Знач СинхронизироватьПоИдентификатору = Ложь) + // + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Свойство" Тогда + + ЗагрузитьПКС(ПравилаОбмена, ТаблицаСвойств, ТаблицаПоиска, СвойстваОтключенные,, СинхронизироватьПоИдентификатору); + + ИначеЕсли ИмяУзла = "Группа" Тогда + + ЗагрузитьПКГС(ПравилаОбмена, ТаблицаСвойств, СвойстваОтключенные, СинхронизироватьПоИдентификатору); + + ИначеЕсли (ИмяУзла = "Свойства") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; + + КонецЕсли; + + КонецЦикла; + + ТаблицаСвойств.Сортировать("Порядок"); + ТаблицаПоиска.Сортировать("Порядок"); + СвойстваОтключенные.Сортировать("Порядок"); + +КонецПроцедуры + +// Осуществляет загрузку правила конвертации значений +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// Значения - соответствие значений объекта источника - строковым +// представлениям объекта приемника +// ТипИсточника - значение типа Тип - тип объекта источника +// +Процедура ЗагрузитьПКЗ(ПравилаОбмена, Значения, ТипИсточника) + + Источник = ""; + Приемник = ""; + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Источник" Тогда + Источник = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + ИначеЕсли ИмяУзла = "Приемник" Тогда + Приемник = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + ИначеЕсли (ИмяУзла = "Значение") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Значения[одПолучитьЗначениеПоСтроке(Источник, ТипИсточника)] = Приемник; + +КонецПроцедуры // ЗагрузитьПКЗ() + +// Осуществляет загрузку правил конвертации значений +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// Значения - соответствие значений объекта источника - строковым +// представлениям объекта приемника +// ТипИсточника - значение типа Тип - тип объекта источника +// +Процедура ЗагрузитьЗначения(ПравилаОбмена, Значения, ТипИсточника); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Значение" Тогда + ЗагрузитьПКЗ(ПравилаОбмена, Значения, ТипИсточника); + ИначеЕсли (ИмяУзла = "Значения") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Осуществляет загрузку правила конвертации объектов +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьПравилоКонвертации(ПравилаОбмена, ЗаписьXML) + + ЗаписьXML.ЗаписатьНачалоЭлемента("Правило"); + + НоваяСтрока = ТаблицаПравилКонвертации.Добавить(); + + // Значения по умолчанию + + НоваяСтрока.ЗапоминатьВыгруженные = Истина; + НоваяСтрока.НеЗамещать = Ложь; + НоваяСтрока.ПриоритетОбъектовОбмена = Перечисления.ПриоритетыОбъектовОбмена.ПриоритетПоступившегоПриОбменеОбъектаВыше; + + ПоискПоТабличнымЧастям = Новый ТаблицаЗначений; + ПоискПоТабличнымЧастям.Колонки.Добавить("ИмяЭлемента"); + ПоискПоТабличнымЧастям.Колонки.Добавить("МассивКлючевыхПолейПоиска"); + ПоискПоТабличнымЧастям.Колонки.Добавить("КлючевыеПоляПоиска"); + ПоискПоТабличнымЧастям.Колонки.Добавить("Валидное", одОписаниеТипа("Булево")); + + НоваяСтрока.ПоискПоТабличнымЧастям = ПоискПоТабличнымЧастям; + + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Код" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + НоваяСтрока.Имя = Значение; + + ИначеЕсли ИмяУзла = "Наименование" Тогда + + НоваяСтрока.Наименование = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "СинхронизироватьПоИдентификатору" Тогда + + НоваяСтрока.СинхронизироватьПоИдентификатору = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, НоваяСтрока.СинхронизироватьПоИдентификатору); + + ИначеЕсли ИмяУзла = "НеСоздаватьЕслиНеНайден" Тогда + + НоваяСтрока.НеСоздаватьЕслиНеНайден = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + + ИначеЕсли ИмяУзла = "РегистрироватьОбъектНаУзлеОтправителе" Тогда // не поддерживается + + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "НеВыгружатьОбъектыСвойствПоСсылкам" Тогда + + НоваяСтрока.НеВыгружатьОбъектыСвойствПоСсылкам = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + + ИначеЕсли ИмяУзла = "ПродолжитьПоискПоПолямПоискаЕслиПоИдентификаторуНеНашли" Тогда + + НоваяСтрока.ПродолжитьПоискПоПолямПоискаЕслиПоИдентификаторуНеНашли = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, НоваяСтрока.ПродолжитьПоискПоПолямПоискаЕслиПоИдентификаторуНеНашли); + + ИначеЕсли ИмяУзла = "ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD" Тогда + + НоваяСтрока.ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, НоваяСтрока.ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD); + + ИначеЕсли ИмяУзла = "НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике" Тогда + + НоваяСтрока.НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, НоваяСтрока.НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике); + + ИначеЕсли ИмяУзла = "ИспользоватьБыстрыйПоискПриЗагрузке" Тогда + + НоваяСтрока.ИспользоватьБыстрыйПоискПриЗагрузке = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + + ИначеЕсли ИмяУзла = "ВыгружатьОбъектТолькоПриНаличииНаНегоСсылки" Тогда + + НоваяСтрока.ВыгружатьОбъектТолькоПриНаличииНаНегоСсылки = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + + ИначеЕсли ИмяУзла = "ГенерироватьНовыйНомерИлиКодЕслиНеУказан" Тогда + + НоваяСтрока.ГенерироватьНовыйНомерИлиКодЕслиНеУказан = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, НоваяСтрока.ГенерироватьНовыйНомерИлиКодЕслиНеУказан); + + ИначеЕсли ИмяУзла = "НеЗапоминатьВыгруженные" Тогда + + НоваяСтрока.ЗапоминатьВыгруженные = Не одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + + ИначеЕсли ИмяУзла = "НеЗамещать" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + НоваяСтрока.НеЗамещать = Значение; + + ИначеЕсли ИмяУзла = "Приемник" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + + НоваяСтрока.Приемник = Значение; + НоваяСтрока.ТипПриемника = Значение; + + ИначеЕсли ИмяУзла = "Источник" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + + НоваяСтрока.ТипИсточника = Значение; + + Если РежимОбмена = "Загрузка" Тогда + + НоваяСтрока.Источник = Значение; + + Иначе + + Если Не ПустаяСтрока(Значение) Тогда + + Если Не РежимЗагрузкиИнформацииОПравилахОбмена Тогда + + Попытка + + НоваяСтрока.Источник = Тип(Значение); + + Менеджеры[НоваяСтрока.Источник].ПКО = НоваяСтрока; + + Исключение + + ЗаписатьИнформациюОбОшибкеВПротокол(11, ОписаниеОшибки(), Строка(НоваяСтрока.Источник)); + + КонецПопытки; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + // Свойства + + ИначеЕсли ИмяУзла = "Свойства" Тогда + + НоваяСтрока.Свойства = ТаблицаПравилКонвертацииСвойств.Скопировать(); + НоваяСтрока.СвойстваПоиска = ТаблицаПравилКонвертацииСвойств.Скопировать(); + НоваяСтрока.СвойстваОтключенные = ТаблицаПравилКонвертацииСвойств.Скопировать(); + + Если НоваяСтрока.СинхронизироватьПоИдентификатору = Истина Тогда + + СвойствоПоискаУИ = НоваяСтрока.СвойстваПоиска.Добавить(); + СвойствоПоискаУИ.Имя = "{УникальныйИдентификатор}"; + СвойствоПоискаУИ.Источник = "{УникальныйИдентификатор}"; + СвойствоПоискаУИ.Приемник = "{УникальныйИдентификатор}"; + СвойствоПоискаУИ.ЭтоОбязательноеСвойство = Истина; + + КонецЕсли; + + ЗагрузитьСвойства(ПравилаОбмена, НоваяСтрока.Свойства, НоваяСтрока.СвойстваПоиска, НоваяСтрока.СвойстваОтключенные, НоваяСтрока.СинхронизироватьПоИдентификатору); + + // Значения + ИначеЕсли ИмяУзла = "Значения" Тогда + + ЗагрузитьЗначения(ПравилаОбмена, НоваяСтрока.Значения, НоваяСтрока.Источник); + + + // Обработчики событий + + ИначеЕсли ИмяУзла = "ПередВыгрузкой" Тогда + + НоваяСтрока.ПередВыгрузкой = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + НоваяСтрока.ЕстьОбработчикПередВыгрузкой = Не ПустаяСтрока(НоваяСтрока.ПередВыгрузкой); + + ИначеЕсли ИмяУзла = "ПриВыгрузке" Тогда + + НоваяСтрока.ПриВыгрузке = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + НоваяСтрока.ЕстьОбработчикПриВыгрузке = Не ПустаяСтрока(НоваяСтрока.ПриВыгрузке); + + ИначеЕсли ИмяУзла = "ПослеВыгрузки" Тогда + + НоваяСтрока.ПослеВыгрузки = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + НоваяСтрока.ЕстьОбработчикПослеВыгрузки = Не ПустаяСтрока(НоваяСтрока.ПослеВыгрузки); + + ИначеЕсли ИмяУзла = "ПослеВыгрузкиВФайл" Тогда + + НоваяСтрока.ПослеВыгрузкиВФайл = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + НоваяСтрока.ЕстьОбработчикПослеВыгрузкиВФайл = Не ПустаяСтрока(НоваяСтрока.ПослеВыгрузкиВФайл); + + // Для загрузки + + ИначеЕсли ИмяУзла = "ПередЗагрузкой" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + Если РежимОбмена = "Загрузка" Тогда + + НоваяСтрока.ПередЗагрузкой = Значение; + НоваяСтрока.ЕстьОбработчикПередЗагрузкой = Не ПустаяСтрока(Значение); + + Иначе + + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + + КонецЕсли; + + ИначеЕсли ИмяУзла = "ПриЗагрузке" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + Если РежимОбмена = "Загрузка" Тогда + + НоваяСтрока.ПриЗагрузке = Значение; + НоваяСтрока.ЕстьОбработчикПриЗагрузке = Не ПустаяСтрока(Значение); + + Иначе + + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + + КонецЕсли; + + ИначеЕсли ИмяУзла = "ПослеЗагрузки" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + Если РежимОбмена = "Загрузка" Тогда + + НоваяСтрока.ПослеЗагрузки = Значение; + НоваяСтрока.ЕстьОбработчикПослеЗагрузки = Не ПустаяСтрока(Значение); + + Иначе + + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + + КонецЕсли; + + ИначеЕсли ИмяУзла = "ПоследовательностьПолейПоиска" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + Если РежимОбмена = "Загрузка" Тогда + + НоваяСтрока.ПоследовательностьПолейПоиска = Значение; + НоваяСтрока.ЕстьОбработчикПоследовательностьПолейПоиска = Не ПустаяСтрока(Значение); + + Иначе + + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + + КонецЕсли; + + ИначеЕсли ИмяУзла = "ПриоритетОбъектовОбмена" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + Если Значение = "Ниже" Тогда + НоваяСтрока.ПриоритетОбъектовОбмена = Перечисления.ПриоритетыОбъектовОбмена.ПриоритетПоступившегоПриОбменеОбъектаНиже; + ИначеЕсли Значение = "Совпадает" Тогда + НоваяСтрока.ПриоритетОбъектовОбмена = Перечисления.ПриоритетыОбъектовОбмена.ПриоритетПоступившегоПриОбменеОбъектаСовпадает; + КонецЕсли; + + //настройки вариантов поиска + ИначеЕсли ИмяУзла = "НастройкаВариантовПоискаОбъектов" Тогда + + ЗагрузитьНастройкиВариантовПоиска(ПравилаОбмена, НоваяСтрока); + + ИначеЕсли ИмяУзла = "ПоискПоТабличнымЧастям" Тогда + + // загружаем информацию по ключевым полям поиска в табличных частях + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + Для Номер = 1 По СтрЧислоСтрок(Значение) Цикл + + ТекущаяСтрока = СтрПолучитьСтроку(Значение, Номер); + + СтрокаПоиска = ОтделитьРазделителем(ТекущаяСтрока, ":"); + + СтрокаТаблицы = НоваяСтрока.ПоискПоТабличнымЧастям.Добавить(); + + СтрокаТаблицы.ИмяЭлемента = ТекущаяСтрока; + СтрокаТаблицы.КлючевыеПоляПоиска = СтрокаПоиска; + СтрокаТаблицы.МассивКлючевыхПолейПоиска = ПолучитьМассивИзСтроки(СтрокаПоиска); + СтрокаТаблицы.Валидное = СтрокаТаблицы.МассивКлючевыхПолейПоиска.Количество() <> 0; + + КонецЦикла; + + ИначеЕсли ИмяУзла = "ПоляПоиска" Тогда + + НоваяСтрока.ПоляПоиска = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "ПоляТаблицы" Тогда + + НоваяСтрока.ПоляТаблицы = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли (ИмяУзла = "Правило") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; + + КонецЕсли; + + КонецЦикла; + + Если РежимОбмена <> "Загрузка" Тогда + + // ПОЛУЧАЕМ СВОЙСТВА ПОИСКА ПОЛЕЙ ТЧ ДЛЯ ПРАВИЛ ЗАГРУЗКИ ДАННЫХ (ЗаписьXML) + + ИтоговаяСтрокаПоискаПоТЧ = ""; + + // в приемник нужно передать информацию о полях поиска для табличных частей + Для Каждого СтрокаСвойств Из НоваяСтрока.Свойства Цикл + + Если Не СтрокаСвойств.ЭтоГруппа + ИЛИ ПустаяСтрока(СтрокаСвойств.ВидПриемника) + ИЛИ ПустаяСтрока(СтрокаСвойств.Приемник) Тогда + + Продолжить; + + КонецЕсли; + + Если ПустаяСтрока(СтрокаСвойств.СтрокаПолейПоиска) Тогда + Продолжить; + КонецЕсли; + + ИтоговаяСтрокаПоискаПоТЧ = ИтоговаяСтрокаПоискаПоТЧ + Символы.ПС + СтрокаСвойств.ВидПриемника + "." + СтрокаСвойств.Приемник + ":" + СтрокаСвойств.СтрокаПолейПоиска; + + КонецЦикла; + + ИтоговаяСтрокаПоискаПоТЧ = СокрЛП(ИтоговаяСтрокаПоискаПоТЧ); + + Если Не ПустаяСтрока(ИтоговаяСтрокаПоискаПоТЧ) Тогда + + одЗаписатьЭлемент(ЗаписьXML, "ПоискПоТабличнымЧастям", ИтоговаяСтрокаПоискаПоТЧ); + + КонецЕсли; + + // ПОЛУЧАЕМ ПОЛЯ ТАБЛИЦЫ И ПОЛЯ ПОИСКА ДЛЯ ПРАВИЛ ЗАГРУЗКИ ДАННЫХ (ЗаписьXML) + + СвойстваМассив = НоваяСтрока.Свойства.Скопировать(Новый Структура("ЭтоГруппа", Ложь), "Приемник").ВыгрузитьКолонку("Приемник"); + СвойстваПоискаМассив = НоваяСтрока.СвойстваПоиска.ВыгрузитьКолонку("Приемник"); + + СвойстваПоискаМассивДополнительный = НоваяСтрока.Свойства.Скопировать(Новый Структура("ЭтоПолеПоиска", Истина), "Приемник").ВыгрузитьКолонку("Приемник"); + + Для каждого Значение Из СвойстваПоискаМассивДополнительный Цикл + + СвойстваПоискаМассив.Добавить(Значение); + + КонецЦикла; + + // удаляем из массива полей поиска значение {УникальныйИдентификатор} и ЭтоГруппа + ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(СвойстваПоискаМассив, "{УникальныйИдентификатор}"); + ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(СвойстваПоискаМассив, "ЭтоГруппа"); + + // получаем значение переменной СвойстваМассив + ТаблицаПоляТаблицы = Новый ТаблицаЗначений; + ТаблицаПоляТаблицы.Колонки.Добавить("Приемник"); + + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицуИзМассива(ТаблицаПоляТаблицы, СвойстваМассив, "Приемник"); + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицуИзМассива(ТаблицаПоляТаблицы, СвойстваПоискаМассив, "Приемник"); + + ТаблицаПоляТаблицы.Свернуть("Приемник"); + СвойстваМассив = ТаблицаПоляТаблицы.ВыгрузитьКолонку("Приемник"); + + ПоляТаблицы = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(СвойстваМассив); + ПоляПоиска = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(СвойстваПоискаМассив); + + Если Не ПустаяСтрока(ПоляТаблицы) Тогда + одЗаписатьЭлемент(ЗаписьXML, "ПоляТаблицы", ПоляТаблицы); + КонецЕсли; + + Если Не ПустаяСтрока(ПоляПоиска) Тогда + одЗаписатьЭлемент(ЗаписьXML, "ПоляПоиска", ПоляПоиска); + КонецЕсли; + + КонецЕсли; + + // закрываем узел + ЗаписьXML.ЗаписатьКонецЭлемента(); // Правило + + // Быстрый доступ к ПКО по имени + Правила.Вставить(НоваяСтрока.Имя, НоваяСтрока); + +КонецПроцедуры // ЗагрузитьПравилоКонвертации() + +Процедура ЗагрузитьНастройкуВариантовПоиска(ПравилаОбмена, НоваяСтрока) + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + ТипУзла = ПравилаОбмена.ТипУзла; + + Если ИмяУзла = "ИмяНастройкиДляАлгоритма" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + Если РежимЗагрузкиИнформацииОПравилахОбмена Тогда + НоваяСтрока.ИмяНастройкиДляАлгоритма = Значение; + КонецЕсли; + + ИначеЕсли ИмяУзла = "ИмяНастройкиДляПользователя" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + Если РежимЗагрузкиИнформацииОПравилахОбмена Тогда + НоваяСтрока.ИмяНастройкиДляПользователя = Значение; + КонецЕсли; + + ИначеЕсли ИмяУзла = "ОписаниеНастройкиДляПользователя" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + Если РежимЗагрузкиИнформацииОПравилахОбмена Тогда + НоваяСтрока.ОписаниеНастройкиДляПользователя = Значение; + КонецЕсли; + + ИначеЕсли (ИмяУзла = "ВариантПоиска") И (ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + Иначе + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗагрузитьНастройкиВариантовПоиска(ПравилаОбмена, СтрокаБазовогоПКО) + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + ТипУзла = ПравилаОбмена.ТипУзла; + + Если ИмяУзла = "ВариантПоиска" Тогда + + Если РежимЗагрузкиИнформацииОПравилахОбмена Тогда + СтрокаНастройки = ТаблицаРезультатовЗагрузкиИнформацииОПоляхПоиска.Добавить(); + СтрокаНастройки.КодПравилаОбмена = СтрокаБазовогоПКО.Имя; + СтрокаНастройки.НаименованиеПравилаОбмена = СтрокаБазовогоПКО.Наименование; + Иначе + СтрокаНастройки = Неопределено; + КонецЕсли; + + ЗагрузитьНастройкуВариантовПоиска(ПравилаОбмена, СтрокаНастройки); + + ИначеЕсли (ИмяУзла = "НастройкаВариантовПоискаОбъектов") И (ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + Иначе + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Осуществляет загрузку правил конвертации объектов +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьПравилаКонвертации(ПравилаОбмена, ЗаписьXML) + + ТаблицаПравилКонвертации.Очистить(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("ПравилаКонвертацииОбъектов"); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Правило" Тогда + + ЗагрузитьПравилоКонвертации(ПравилаОбмена, ЗаписьXML); + + ИначеЕсли (ИмяУзла = "ПравилаКонвертацииОбъектов") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; + + КонецЕсли; + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры // ЗагрузитьПравилаКонвертации() + +// Осуществляет загрузку группы правил очистки данных в соответствии с форматом правил обмена +// +// Параметры: +// НоваяСтрока - строка дерева значений, описывающая группу правил очистки данных +// +Процедура ЗагрузитьГруппуПОД(ПравилаОбмена, НоваяСтрока) + + НоваяСтрока.ЭтоГруппа = Истина; + НоваяСтрока.Включить = Число(Не одАтрибут(ПравилаОбмена, ТипБулево, "Отключить")); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + ТипУзла = ПравилаОбмена.ТипУзла; + + Если ИмяУзла = "Код" Тогда + НоваяСтрока.Имя = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "Наименование" Тогда + НоваяСтрока.Наименование = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "Порядок" Тогда + НоваяСтрока.Порядок = одЗначениеЭлемента(ПравилаОбмена, ТипЧисло); + + ИначеЕсли ИмяУзла = "Правило" Тогда + СтрокаДЗ = НоваяСтрока.Строки.Добавить(); + ЗагрузитьПОД(ПравилаОбмена, СтрокаДЗ); + + ИначеЕсли (ИмяУзла = "Группа") И (ТипУзла = ТипУзлаXMLНачалоЭлемента) Тогда + СтрокаДЗ = НоваяСтрока.Строки.Добавить(); + ЗагрузитьГруппуПОД(ПравилаОбмена, СтрокаДЗ); + + ИначеЕсли (ИмяУзла = "Группа") И (ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + + Если ПустаяСтрока(НоваяСтрока.Наименование) Тогда + НоваяСтрока.Наименование = НоваяСтрока.Имя; + КонецЕсли; + +КонецПроцедуры // ЗагрузитьГруппуПОД() + +// Осуществляет загрузку правила очистки данных в соответствии с форматом правил обмена +// +// Параметры: +// НоваяСтрока - строка дерева значений, описывающая правило очистки данных +// +Процедура ЗагрузитьПОД(ПравилаОбмена, НоваяСтрока) + + НоваяСтрока.Включить = Число(Не одАтрибут(ПравилаОбмена, ТипБулево, "Отключить")); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Код" Тогда + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + НоваяСтрока.Имя = Значение; + + ИначеЕсли ИмяУзла = "Наименование" Тогда + НоваяСтрока.Наименование = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "Порядок" Тогда + НоваяСтрока.Порядок = одЗначениеЭлемента(ПравилаОбмена, ТипЧисло); + + ИначеЕсли ИмяУзла = "СпособОтбораДанных" Тогда + НоваяСтрока.СпособОтбораДанных = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "ОбъектВыборки" Тогда + + Если Не РежимЗагрузкиИнформацииОПравилахОбмена Тогда + + ОбъектВыборки = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + Если Не ПустаяСтрока(ОбъектВыборки) Тогда + НоваяСтрока.ОбъектВыборки = Тип(ОбъектВыборки); + КонецЕсли; + + КонецЕсли; + + ИначеЕсли ИмяУзла = "УдалятьЗаПериод" Тогда + НоваяСтрока.УдалятьЗаПериод = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "Непосредственно" Тогда + НоваяСтрока.Непосредственно = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + + + // Обработчики событий + + ИначеЕсли ИмяУзла = "ПередОбработкойПравила" Тогда + НоваяСтрока.ПередОбработкой = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "ПослеОбработкиПравила" Тогда + НоваяСтрока.ПослеОбработки = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "ПередУдалениемОбъекта" Тогда + НоваяСтрока.ПередУдалением = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + // Выход + ИначеЕсли (ИмяУзла = "Правило") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + + КонецЕсли; + + КонецЦикла; + + + Если ПустаяСтрока(НоваяСтрока.Наименование) Тогда + НоваяСтрока.Наименование = НоваяСтрока.Имя; + КонецЕсли; + +КонецПроцедуры // ЗагрузитьПОД() + +// Осуществляет загрузку правил очистки данных +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьПравилаОчистки(ПравилаОбмена, ЗаписьXML) + + ТаблицаПравилОчистки.Строки.Очистить(); + СтрокиДЗ = ТаблицаПравилОчистки.Строки; + + ЗаписьXML.ЗаписатьНачалоЭлемента("ПравилаОчисткиДанных"); + + Пока ПравилаОбмена.Прочитать() Цикл + + ТипУзла = ПравилаОбмена.ТипУзла; + + Если ТипУзла = ТипУзлаXMLНачалоЭлемента Тогда + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + Если РежимОбмена <> "Загрузка" Тогда + ЗаписьXML.ЗаписатьНачалоЭлемента(ПравилаОбмена.Имя); + Пока ПравилаОбмена.ПрочитатьАтрибут() Цикл + ЗаписьXML.ЗаписатьАтрибут(ПравилаОбмена.Имя, ПравилаОбмена.Значение); + КонецЦикла; + Иначе + Если ИмяУзла = "Правило" Тогда + СтрокаДЗ = СтрокиДЗ.Добавить(); + ЗагрузитьПОД(ПравилаОбмена, СтрокаДЗ); + ИначеЕсли ИмяУзла = "Группа" Тогда + СтрокаДЗ = СтрокиДЗ.Добавить(); + ЗагрузитьГруппуПОД(ПравилаОбмена, СтрокаДЗ); + КонецЕсли; + КонецЕсли; + ИначеЕсли ТипУзла = ТипУзлаXMLКонецЭлемента Тогда + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + Если ИмяУзла = "ПравилаОчисткиДанных" Тогда + Прервать; + Иначе + Если РежимОбмена <> "Загрузка" Тогда + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + КонецЕсли; + ИначеЕсли ТипУзла = ТипУзлаXMLТекст Тогда + Если РежимОбмена <> "Загрузка" Тогда + ЗаписьXML.ЗаписатьТекст(ПравилаОбмена.Значение); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + СтрокиДЗ.Сортировать("Порядок", Истина); + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры // ЗагрузитьПравилаОчистки() + +// Осуществляет загрузку алгоритма в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьАлгоритм(ПравилаОбмена, ЗаписьXML) + + ИспользуетсяПриЗагрузке = одАтрибут(ПравилаОбмена, ТипБулево, "ИспользуетсяПриЗагрузке"); + Имя = одАтрибут(ПравилаОбмена, ТипСтрока, "Имя"); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Текст" Тогда + Текст = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + ИначеЕсли (ИмяУзла = "Алгоритм") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + Иначе + одПропустить(ПравилаОбмена); + КонецЕсли; + + КонецЦикла; + + + Если ИспользуетсяПриЗагрузке Тогда + Если РежимОбмена = "Загрузка" Тогда + Алгоритмы.Вставить(Имя, Текст); + Иначе + ЗаписьXML.ЗаписатьНачалоЭлемента("Алгоритм"); + УстановитьАтрибут(ЗаписьXML, "ИспользуетсяПриЗагрузке", Истина); + УстановитьАтрибут(ЗаписьXML, "Имя", Имя); + одЗаписатьЭлемент(ЗаписьXML, "Текст", Текст); + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + Иначе + Если РежимОбмена <> "Загрузка" Тогда + Алгоритмы.Вставить(Имя, Текст); + КонецЕсли; + КонецЕсли; + + +КонецПроцедуры // ЗагрузитьАлгоритм() + +// Осуществляет загрузку алгоритмов в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьАлгоритмы(ПравилаОбмена, ЗаписьXML) + + Алгоритмы.Очистить(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("Алгоритмы"); + + Пока ПравилаОбмена.Прочитать() Цикл + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + Если ИмяУзла = "Алгоритм" Тогда + ЗагрузитьАлгоритм(ПравилаОбмена, ЗаписьXML); + ИначеЕсли (ИмяУзла = "Алгоритмы") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры // ЗагрузитьАлгоритмы() + +// Осуществляет загрузку запроса в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьЗапрос(ПравилаОбмена, ЗаписьXML) + + ИспользуетсяПриЗагрузке = одАтрибут(ПравилаОбмена, ТипБулево, "ИспользуетсяПриЗагрузке"); + Имя = одАтрибут(ПравилаОбмена, ТипСтрока, "Имя"); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Текст" Тогда + Текст = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + ИначеЕсли (ИмяУзла = "Запрос") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + Иначе + одПропустить(ПравилаОбмена); + КонецЕсли; + + КонецЦикла; + + Если ИспользуетсяПриЗагрузке Тогда + Если РежимОбмена = "Загрузка" Тогда + Запрос = Новый Запрос(Текст); + Запросы.Вставить(Имя, Запрос); + Иначе + ЗаписьXML.ЗаписатьНачалоЭлемента("Запрос"); + УстановитьАтрибут(ЗаписьXML, "ИспользуетсяПриЗагрузке", Истина); + УстановитьАтрибут(ЗаписьXML, "Имя", Имя); + одЗаписатьЭлемент(ЗаписьXML, "Текст", Текст); + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + Иначе + Если РежимОбмена <> "Загрузка" Тогда + Запрос = Новый Запрос(Текст); + Запросы.Вставить(Имя, Запрос); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры // ЗагрузитьЗапрос() + +// Осуществляет загрузку запросов в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьЗапросы(ПравилаОбмена, ЗаписьXML) + + Запросы.Очистить(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("Запросы"); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Запрос" Тогда + ЗагрузитьЗапрос(ПравилаОбмена, ЗаписьXML); + ИначеЕсли (ИмяУзла = "Запросы") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры // ЗагрузитьЗапросы() + +// Осуществляет загрузку параметров в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// +Процедура ЗагрузитьПараметры(ПравилаОбмена, ЗаписьXML) + + Параметры.Очистить(); + СобытияПослеЗагрузкиПараметров.Очистить(); + ТаблицаНастройкиПараметров.Очистить(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("Параметры"); + + Пока ПравилаОбмена.Прочитать() Цикл + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + ТипУзла = ПравилаОбмена.ТипУзла; + + Если ИмяУзла = "Параметр" И ТипУзла = ТипУзлаXMLНачалоЭлемента Тогда + + //Загрузка по версии правил 2.01 + Имя = одАтрибут(ПравилаОбмена, ТипСтрока, "Имя"); + Наименование = одАтрибут(ПравилаОбмена, ТипСтрока, "Наименование"); + УстанавливатьВДиалоге = одАтрибут(ПравилаОбмена, ТипБулево, "УстанавливатьВДиалоге"); + СтрокаТипаЗначения = одАтрибут(ПравилаОбмена, ТипСтрока, "ТипЗначения"); + ИспользуетсяПриЗагрузке = одАтрибут(ПравилаОбмена, ТипБулево, "ИспользуетсяПриЗагрузке"); + ПередаватьПараметрПриВыгрузке = одАтрибут(ПравилаОбмена, ТипБулево, "ПередаватьПараметрПриВыгрузке"); + ПравилоКонвертации = одАтрибут(ПравилаОбмена, ТипСтрока, "ПравилоКонвертации"); + АлгоритмПослеЗагрузкиПараметра = одАтрибут(ПравилаОбмена, ТипСтрока, "ПослеЗагрузкиПараметра"); + + Если Не Пустаястрока(АлгоритмПослеЗагрузкиПараметра) тогда + + СобытияПослеЗагрузкиПараметров.Вставить(Имя, АлгоритмПослеЗагрузкиПараметра); + + Конецесли; + + // Определяем типы значений и устанавливаем начальные значения + Если Не ПустаяСтрока(СтрокаТипаЗначения) Тогда + + Попытка + ТипЗначенияДанных = Тип(СтрокаТипаЗначения); + ТипОпределен = ИСТИНА; + Исключение + ТипОпределен = ЛОЖЬ; + КонецПопытки; + + Иначе + + ТипОпределен = ЛОЖЬ; + + КонецЕсли; + + Если ТипОпределен Тогда + ЗначениеПараметра = одПолучитьПустоеЗначение(ТипЗначенияДанных); + Параметры.Вставить(Имя, ЗначениеПараметра); + Иначе + ЗначениеПараметра = ""; + Параметры.Вставить(Имя); + КонецЕсли; + + Если УстанавливатьВДиалоге = ИСТИНА Тогда + + СтрокаТаблицы = ТаблицаНастройкиПараметров.Добавить(); + СтрокаТаблицы.Наименование = Наименование; + СтрокаТаблицы.Имя = Имя; + СтрокаТаблицы.Значение = ЗначениеПараметра; + СтрокаТаблицы.ПередаватьПараметрПриВыгрузке = ПередаватьПараметрПриВыгрузке; + СтрокаТаблицы.ПравилоКонвертации = ПравилоКонвертации; + + КонецЕсли; + + Если ИспользуетсяПриЗагрузке + И РежимОбмена = "Выгрузка" Тогда + + ЗаписьXML.ЗаписатьНачалоЭлемента("Параметр"); + УстановитьАтрибут(ЗаписьXML, "Имя", Имя); + УстановитьАтрибут(ЗаписьXML, "Наименование", Наименование); + + Если НЕ ПустаяСтрока(АлгоритмПослеЗагрузкиПараметра) Тогда + УстановитьАтрибут(ЗаписьXML, "ПослеЗагрузкиПараметра", XMLСтрока(АлгоритмПослеЗагрузкиПараметра)); + КонецЕсли; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + + КонецЕсли; + + ИначеЕсли (ТипУзла = ТипУзлаXMLТекст) Тогда + + // Для совместимости с версией правил 2.0 используем загрузку из строки + СтрокаПараметров = ПравилаОбмена.Значение; + Для каждого Пар Из МассивИзСтроки(СтрокаПараметров) Цикл + Параметры.Вставить(Пар); + КонецЦикла; + + ИначеЕсли (ИмяУзла = "Параметры") И (ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры // ЗагрузитьОбработки() + +// Осуществляет загрузку обработки в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьОбработку(ПравилаОбмена, ЗаписьXML) + + Имя = одАтрибут(ПравилаОбмена, ТипСтрока, "Имя"); + Наименование = одАтрибут(ПравилаОбмена, ТипСтрока, "Наименование"); + ЭтоОбработкаНастройки = одАтрибут(ПравилаОбмена, ТипБулево, "ЭтоОбработкаНастройки"); + + ИспользуетсяПриВыгрузке = одАтрибут(ПравилаОбмена, ТипБулево, "ИспользуетсяПриВыгрузке"); + ИспользуетсяПриЗагрузке = одАтрибут(ПравилаОбмена, ТипБулево, "ИспользуетсяПриЗагрузке"); + + СтрокаПараметров = одАтрибут(ПравилаОбмена, ТипСтрока, "Параметры"); + + ХранилищеОбработки = одЗначениеЭлемента(ПравилаОбмена, ТипХранилищеЗначения); + + ПараметрыДопОбработок.Вставить(Имя, МассивИзСтроки(СтрокаПараметров)); + + + Если ИспользуетсяПриЗагрузке Тогда + Если РежимОбмена <> "Загрузка" Тогда + ЗаписьXML.ЗаписатьНачалоЭлемента("Обработка"); + УстановитьАтрибут(ЗаписьXML, "ИспользуетсяПриЗагрузке", Истина); + УстановитьАтрибут(ЗаписьXML, "Имя", Имя); + УстановитьАтрибут(ЗаписьXML, "Наименование", Наименование); + УстановитьАтрибут(ЗаписьXML, "ЭтоОбработкаНастройки", ЭтоОбработкаНастройки); + ЗаписьXML.ЗаписатьТекст(XMLСтрока(ХранилищеОбработки)); + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + КонецЕсли; + + Если ЭтоОбработкаНастройки Тогда + Если (РежимОбмена = "Загрузка") И ИспользуетсяПриЗагрузке Тогда + ОбработкиНастройкиЗагрузки.Добавить(Имя, Наименование, , ); + + ИначеЕсли (РежимОбмена = "Выгрузка") И ИспользуетсяПриВыгрузке Тогда + ОбработкиНастройкиВыгрузки.Добавить(Имя, Наименование, , ); + + КонецЕсли; + КонецЕсли; + +КонецПроцедуры // ЗагрузитьОбработку() + +// Осуществляет загрузку внешних обработок в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьОбработки(ПравилаОбмена, ЗаписьXML) + + ДопОбработки.Очистить(); + ПараметрыДопОбработок.Очистить(); + + ОбработкиНастройкиВыгрузки.Очистить(); + ОбработкиНастройкиЗагрузки.Очистить(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("Обработки"); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Обработка" Тогда + ЗагрузитьОбработку(ПравилаОбмена, ЗаписьXML); + ИначеЕсли (ИмяУзла = "Обработки") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры // ЗагрузитьОбработки() + +// Осуществляет загрузку правила выгрузки данных в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// НоваяСтрока - строка дерева значений, описывающая правило выгрузки данных +// +Процедура ЗагрузитьПВД(ПравилаОбмена) + + НоваяСтрока = ТаблицаПравилВыгрузки.Добавить(); + + НоваяСтрока.Включить = Не одАтрибут(ПравилаОбмена, ТипБулево, "Отключить"); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + Если ИмяУзла = "Код" Тогда + + НоваяСтрока.Имя = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "Наименование" Тогда + + НоваяСтрока.Наименование = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "Порядок" Тогда + + НоваяСтрока.Порядок = одЗначениеЭлемента(ПравилаОбмена, ТипЧисло); + + ИначеЕсли ИмяУзла = "СпособОтбораДанных" Тогда + + НоваяСтрока.СпособОтбораДанных = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "ВыбиратьДанныеДляВыгрузкиОднимЗапросом" Тогда + + // параметр игнорируется при on-line обмене данными + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "НеВыгружатьОбъектыСозданныеВБазеПриемнике" Тогда + + НоваяСтрока.НеВыгружатьОбъектыСозданныеВБазеПриемнике = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + + ИначеЕсли ИмяУзла = "ИмяТипаПриемника" Тогда + + НоваяСтрока.ИмяТипаПриемника = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "ОбъектВыборки" Тогда + + ОбъектВыборки = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + Если Не РежимЗагрузкиИнформацииОПравилахОбмена Тогда + + НоваяСтрока.СинхронизироватьПоИдентификатору = СинхронизироватьПоИдентификаторуПВД(НоваяСтрока.ПравилоКонвертации); + + Если Не ПустаяСтрока(ОбъектВыборки) Тогда + + НоваяСтрока.ОбъектВыборки = Тип(ОбъектВыборки); + + КонецЕсли; + + // Для поддержки отбора с помощью построителя + Если Найти(ОбъектВыборки, "Ссылка.") Тогда + НоваяСтрока.ИмяОбъектаДляЗапроса = СтрЗаменить(ОбъектВыборки, "Ссылка.", "."); + Иначе + НоваяСтрока.ИмяОбъектаДляЗапросаРегистра = СтрЗаменить(ОбъектВыборки, "Запись.", "."); + КонецЕсли; + + КонецЕсли; + + ИначеЕсли ИмяУзла = "КодПравилаКонвертации" Тогда + + НоваяСтрока.ПравилоКонвертации = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + // Обработчики событий + + ИначеЕсли ИмяУзла = "ПередОбработкойПравила" Тогда + НоваяСтрока.ПередОбработкой = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "ПослеОбработкиПравила" Тогда + НоваяСтрока.ПослеОбработки = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "ПередВыгрузкойОбъекта" Тогда + НоваяСтрока.ПередВыгрузкой = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "ПослеВыгрузкиОбъекта" Тогда + НоваяСтрока.ПослеВыгрузки = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + + ИначеЕсли (ИмяУзла = "Правило") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Если ПустаяСтрока(НоваяСтрока.Наименование) Тогда + НоваяСтрока.Наименование = НоваяСтрока.Имя; + КонецЕсли; + +КонецПроцедуры // ЗагрузитьПВД() + +// Осуществляет загрузку правил выгрузки данных в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// +Процедура ЗагрузитьПравилаВыгрузки(ПравилаОбмена) + + ТаблицаПравилВыгрузки.Очистить(); + + СтрокаНастройки = Неопределено; + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Правило" Тогда + + ЗагрузитьПВД(ПравилаОбмена); + + ИначеЕсли (ИмяУзла = "ПравилаВыгрузкиДанных") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // ЗагрузитьПравилаВыгрузки() + +Функция СинхронизироватьПоИдентификаторуПВД(Знач ИмяПКО) + + ПКО = НайтиПравило(Неопределено, ИмяПКО); + + Если ПКО <> Неопределено Тогда + + Возврат (ПКО.СинхронизироватьПоИдентификатору = Истина); + + КонецЕсли; + + Возврат Ложь; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ РАБОТЫ С ПРАВИЛАМИ ОБМЕНА + +// Осуществляет поиск правила конвертации по имени или в соответствии с типом +// переданного объекта +// +// Параметры: +// Объект - Объект-источник, для которого ищем правило конвертации +// ИмяПравила - имя правила конвертации +// +// Возвращаемое значение: +// Ссылка на правило конвертации (строка в таблице правил) +// +Функция НайтиПравило(Объект, ИмяПравила="") + + Если Не ПустаяСтрока(ИмяПравила) Тогда + + Правило = Правила[ИмяПравила]; + + Иначе + + Правило = Менеджеры[ТипЗнч(Объект)]; + Если Правило <> Неопределено Тогда + Правило = Правило.ПКО; + + Если Правило <> Неопределено Тогда + ИмяПравила = Правило.Имя; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Возврат Правило; + +КонецФункции + +// Восстанавливает правила из внутреннего формата +// +// Параметры: +// +Процедура ВосстановитьПравилаИзВнутреннегоФормата() Экспорт + + Если СохраненныеНастройки = Неопределено Тогда + Возврат; + КонецЕсли; + + СтруктураПравил = СохраненныеНастройки.Получить(); + + Конвертация = СтруктураПравил.Конвертация; + + ТаблицаПравилВыгрузки = СтруктураПравил.ТаблицаПравилВыгрузки; + ТаблицаПравилКонвертации = СтруктураПравил.ТаблицаПравилКонвертации; + ТаблицаНастройкиПараметров = СтруктураПравил.ТаблицаНастройкиПараметров; + + Алгоритмы = СтруктураПравил.Алгоритмы; + ЗапросыДляВосстановления = СтруктураПравил.Запросы; + Параметры = СтруктураПравил.Параметры; + + XMLПравила = СтруктураПравил.XMLПравила; + СтрокаТиповДляПриемника = СтруктураПравил.СтрокаТиповДляПриемника; + + СтруктураПравил.Свойство("ВерсияПлатформыПриемника", ВерсияПлатформыПриемника); + + ЕстьГлобальныйОбработчикПередВыгрузкойОбъекта = Не ПустаяСтрока(Конвертация.ПередВыгрузкойОбъекта); + ЕстьГлобальныйОбработчикПослеВыгрузкиОбъекта = Не ПустаяСтрока(Конвертация.ПослеВыгрузкиОбъекта); + ЕстьГлобальныйОбработчикПередЗагрузкойОбъекта = Не ПустаяСтрока(Конвертация.ПередЗагрузкойОбъекта); + ЕстьГлобальныйОбработчикПослеЗагрузкиОбъекта = Не ПустаяСтрока(Конвертация.ПослеЗагрузкиОбъекта); + ЕстьГлобальныйОбработчикПередКонвертациейОбъекта = Не ПустаяСтрока(Конвертация.ПередКонвертациейОбъекта); + + // Восстанавливаем запросы + Запросы.Очистить(); + Для Каждого ЭлементСтруктуры Из ЗапросыДляВосстановления Цикл + Запрос = Новый Запрос(ЭлементСтруктуры.Значение); + Запросы.Вставить(ЭлементСтруктуры.Ключ, Запрос); + КонецЦикла; + + ИнициализироватьМенеджерыИСообщения(); + + Правила.Очистить(); + + Если РежимОбмена = "Выгрузка" Тогда + + Для Каждого СтрокаТаблицы Из ТаблицаПравилКонвертации Цикл + Правила.Вставить(СтрокаТаблицы.Имя, СтрокаТаблицы); + + Если СтрокаТаблицы.Источник <> Неопределено Тогда + + Попытка + Если ТипЗнч(СтрокаТаблицы.Источник) = ТипСтрока Тогда + Менеджеры[Тип(СтрокаТаблицы.Источник)].ПКО = СтрокаТаблицы; + Иначе + Менеджеры[СтрокаТаблицы.Источник].ПКО = СтрокаТаблицы; + КонецЕсли; + Исключение + ЗаписатьИнформациюОбОшибкеВПротокол(11, ОписаниеОшибки(), Строка(СтрокаТаблицы.Источник)); + КонецПопытки; + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры // ВосстановитьПравилаИзВнутреннегоФормата() + +// Устанавливает значения параметров в структуре Параметры +// по таблице ТаблицаНастройкиПараметров +// +Процедура УстановитьПараметрыИзДиалога() Экспорт + + Для Каждого СтрокаТаблицы Из ТаблицаНастройкиПараметров Цикл + Параметры.Вставить(СтрокаТаблицы.Имя, СтрокаТаблицы.Значение); + КонецЦикла; + +КонецПроцедуры + +Процедура УстановитьЗначениеПараметраВТаблице(ИмяПараметра, ЗначениеПараметра) + + СтрокаТаблицы = ТаблицаНастройкиПараметров.Найти(ИмяПараметра, "Имя"); + + Если СтрокаТаблицы <> Неопределено Тогда + + СтрокаТаблицы.Значение = ЗначениеПараметра; + + КонецЕсли; + +КонецПроцедуры + +Процедура ИнициализироватьПервоначальныеЗначенияПараметров() + + Для Каждого ТекПараметр Из Параметры Цикл + + УстановитьЗначениеПараметраВТаблице(ТекПараметр.Ключ, ТекПараметр.Значение); + + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТКА ПРАВИЛ ОЧИСТКИ + +Процедура УдалитьОбъект(Объект, УдалитьНепосредственно, ИмяТипа = "") + + Попытка + + Предопределенный = Объект.Предопределенный; + + Исключение + + Предопределенный = Ложь; + + КонецПопытки; + + Если Предопределенный Тогда + + Возврат; + + КонецЕсли; + + Если УдалитьНепосредственно Тогда + + Объект.Удалить(); + + // удалить регистрацию для узла откуда получены данные + Попытка + ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбменаЗагрузкаДанных, Объект.Ссылка); + Исключение + + КонецПопытки; + + Иначе + + УстановитьПометкуУдаленияУОбъекта(Объект, Истина, ИмяТипа); + + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьУдалениеОбъекта(Объект, Свойства, УдалитьНепосредственно) + + Если Свойства.ИмяТипа = "РегистрСведений" Тогда + + Объект.Удалить(); + + Иначе + + УдалитьОбъект(Объект, УдалитьНепосредственно, Свойства.ИмяТипа); + + КонецЕсли; + +КонецПроцедуры + +// Производит удаление (или помечает на удаление) объект выборки в соответствии с указанным правилом +// +// Параметры: +// Объект - удаляемый (помечаемый на удаление) объект выборки +// Правило - ссылка на правило очистки данных +// Свойства - свойства объекта метаданного удаляемого объекта +// ВходящиеДанные - произвольные вспомогательные данные +// +Процедура УдалениеОбъектаВыборки(Объект, Правило, Свойства=Неопределено, ВходящиеДанные=Неопределено) + + Отказ = Ложь; + УдалитьНепосредственно = Правило.Непосредственно; + + + // Обработчик ПередУдалениемОбъектаВыборки + + Если Не ПустаяСтрока(Правило.ПередУдалением) Тогда + + Попытка + + Выполнить(Правило.ПередУдалением); + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(29, ОписаниеОшибки(), Правило.Имя, Объект, "ПередУдалениемОбъектаВыборки"); + + КонецПопытки; + + Если Отказ Тогда + + Возврат; + + КонецЕсли; + + КонецЕсли; + + Попытка + + ВыполнитьУдалениеОбъекта(Объект, Свойства, УдалитьНепосредственно); + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(24, ОписаниеОшибки(), Правило.Имя, Объект, ""); + + КонецПопытки; + +КонецПроцедуры // УдалениеОбъектаВыборки() + +// Очищает данные по указанному правилу +// +// Параметры: +// Правило - ссылка на правило очистки данных +// +Процедура ОчиститьДанныеПоПравилу(Правило) + + // Обработчик ПередОбработкой + + Отказ = Ложь; + ВыборкаДанных = Неопределено; + + ИсходящиеДанные = Неопределено; + + + // Обработчик ПередОбработкойПравилаОчистки + Если Не ПустаяСтрока(Правило.ПередОбработкой) Тогда + + Попытка + + Выполнить(Правило.ПередОбработкой); + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(27, ОписаниеОшибки(), Правило.Имя, "", "ПередОбработкойПравилаОчистки"); + + КонецПопытки; + + Если Отказ Тогда + + Возврат; + + КонецЕсли; + + КонецЕсли; + + + // Стандартная выборка + + Попытка + Свойства = Менеджеры[Правило.ОбъектВыборки]; + Исключение + Свойства = Неопределено; + КонецПопытки; + + Если Правило.СпособОтбораДанных = "СтандартнаяВыборка" Тогда + + ИмяТипа = Свойства.ИмяТипа; + + Если ИмяТипа = "РегистрБухгалтерии" + ИЛИ ИмяТипа = "Константы" Тогда + + Возврат; + + КонецЕсли; + + НужныВсеПоля = Не ПустаяСтрока(Правило.ПередУдалением); + + Выборка = ПолучитьВыборкуДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, Истина, Правило.Непосредственно, НужныВсеПоля); + + Пока Выборка.Следующий() Цикл + + Если ИмяТипа = "РегистрСведений" Тогда + + МенеджерЗаписи = Свойства.Менеджер.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка); + + УдалениеОбъектаВыборки(МенеджерЗаписи, Правило, Свойства, ИсходящиеДанные); + + Иначе + + УдалениеОбъектаВыборки(Выборка.Ссылка.ПолучитьОбъект(), Правило, Свойства, ИсходящиеДанные); + + КонецЕсли; + + КонецЦикла; + + ИначеЕсли Правило.СпособОтбораДанных = "ПроизвольныйАлгоритм" Тогда + + Если ВыборкаДанных <> Неопределено Тогда + + Выборка = ПолучитьВыборкуДляВыгрузкиПоПроизвольномуАлгоритму(ВыборкаДанных); + + Если Выборка <> Неопределено Тогда + + Пока Выборка.Следующий() Цикл + + Если ИмяТипа = "РегистрСведений" Тогда + + МенеджерЗаписи = Свойства.Менеджер.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка); + + УдалениеОбъектаВыборки(МенеджерЗаписи, Правило, Свойства, ИсходящиеДанные); + + Иначе + + УдалениеОбъектаВыборки(Выборка.Ссылка.ПолучитьОбъект(), Правило, Свойства, ИсходящиеДанные); + + КонецЕсли; + + КонецЦикла; + + Иначе + + Для каждого Объект Из ВыборкаДанных Цикл + + УдалениеОбъектаВыборки(Объект.ПолучитьОбъект(), Правило, Свойства, ИсходящиеДанные); + + КонецЦикла; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + + // Обработчик ПослеОбработкиПравилаОчистки + + Если Не ПустаяСтрока(Правило.ПослеОбработки) Тогда + + Попытка + + Выполнить(Правило.ПослеОбработки); + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(28, ОписаниеОшибки(), Правило.Имя, "", "ПослеОбработкиПравилаОчистки"); + + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры // ОчиститьДанныеПоПравилу() + +// Обходит дерево правил очистки данных и выполняет очистку +// +// Параметры: +// Строки - Коллекция строк дерева значений +// +Процедура ОбработатьПравилаОчистки(Строки) + + Для каждого ПравилоОчистки Из Строки Цикл + + Если ПравилоОчистки.Включить = 0 Тогда + + Продолжить; + + КонецЕсли; + + Если ПравилоОчистки.ЭтоГруппа Тогда + + ОбработатьПравилаОчистки(ПравилоОчистки.Строки); + Продолжить; + + КонецЕсли; + + ОчиститьДанныеПоПравилу(ПравилоОчистки); + + КонецЦикла; + +КонецПроцедуры // ОбработатьПравилаОчистки() + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ЗАГРУЗКИ ДАННЫХ + +// Устанавливает значение параметра "Загрузка" для свойства объекта "ОбменДанными". +// +// Параметры: +// Объект - объект, для которого устанавливается свойство +// Значение - значение устанавливаемого свойства "Загрузка" +// +Процедура УстановитьОбменДаннымиЗагрузка(Объект, Значение = Истина) + + Попытка + Объект.ОбменДанными.Загрузка = Значение; + Исключение + КонецПопытки; + + Если УзелОбменаЗагрузкаДанных <> Неопределено + И НЕ УзелОбменаЗагрузкаДанных.Пустая() Тогда + + Попытка + Объект.ОбменДанными.Отправитель = УзелОбменаЗагрузкаДанных; + Исключение + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры // УстановитьОбменДаннымиЗагрузка() + +Функция УстановитьСсылкуНового(Объект, Менеджер, СвойстваПоиска) + + УИ = СвойстваПоиска["{УникальныйИдентификатор}"]; + + Если УИ <> Неопределено Тогда + + НоваяСсылка = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(УИ)); + + Объект.УстановитьСсылкуНового(НоваяСсылка); + + СвойстваПоиска.Удалить("{УникальныйИдентификатор}"); + + Иначе + + НоваяСсылка = Неопределено; + + КонецЕсли; + + Возврат НоваяСсылка; + +КонецФункции + + +// Ищет объект по номеру в списке уже загруженных объектов. +// +// Параметры: +// Нпп - номер искомого объекта в файле обмена +// +// Возвращаемое значение: +// Ссылка на найденный объект. Если объект не найден, возвращается Неопределено. +// +Функция НайтиОбъектПоНомеру(Нпп, ТипОбъекта, РежимПоискаОсновногоОбъекта = Ложь) + + Возврат Неопределено; + +КонецФункции + +Функция НайтиОбъектПоГлобальномуНомеру(Нпп, РежимПоискаОсновногоОбъекта = Ложь) + + Возврат Неопределено; + +КонецФункции + +Процедура ЗаписатьОбъектВИБ(Объект, Тип) + + Попытка + + УстановитьОбменДаннымиЗагрузка(Объект); + Объект.Записать(); + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеВПротокол(26, ОписаниеОшибки(), Объект, Тип); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + +КонецПроцедуры + +Функция ОпределитьНаличиеДвиженийПоДокументу(ДокументСсылка) + ТекстЗапроса = ""; + // для исключения падения для документов, проводящимся более чем по 256 таблицам + счетчик_таблиц = 0; + + МетаданныеДокумента = ДокументСсылка.Метаданные(); + + Если МетаданныеДокумента.Движения.Количество() = 0 Тогда + Возврат Новый ТаблицаЗначений; + КонецЕсли; + + Для Каждого Движение ИЗ МетаданныеДокумента.Движения Цикл + // в запросе получаем имена регистров, по которым есть хотя бы одно движение + // например, + // ВЫБРАТЬ Первые 1 «РегистрНакопления.ТоварыНаСкладах» + // ИЗ РегистрНакопления.ТоварыНаСкладах + // ГДЕ Регистратор = &Регистратор + + // имя регистра приводим к Строка(200), см. ниже + ТекстЗапроса = ТекстЗапроса + " + |" + ?(ТекстЗапроса = "", "", "ОБЪЕДИНИТЬ ВСЕ ") + " + |ВЫБРАТЬ ПЕРВЫЕ 1 ВЫРАЗИТЬ(""" + Движение.ПолноеИмя() + + """ КАК Строка(200)) КАК Имя ИЗ " + Движение.ПолноеИмя() + + " ГДЕ Регистратор = &Регистратор"; + + // если в запрос попадает более 256 таблиц – разбиваем его на две части + // (вариант документа с проведением по 512 регистрам считаем нежизненным) + счетчик_таблиц = счетчик_таблиц + 1; + Если счетчик_таблиц = 256 Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Запрос = Новый Запрос(ТекстЗапроса); + ЗАпрос.УстановитьПараметр("Регистратор", ДокументСсылка); + // при выгрузке для колонки «Имя» тип устанавливается по самой длинной строке из запроса + // при втором проходе по таблице новое имя может не «влезть», по этому сразу в запросе + // приводится к строка(200) + ТаблицаЗапроса = Запрос.Выполнить().Выгрузить(); + + // если количество таблиц не превысило 256 – возвращаем таблицу + Если счетчик_таблиц = МетаданныеДокумента.Движения.Количество() Тогда + Возврат ТаблицаЗапроса; + КонецЕсли; + + // таблиц больше чем 256, делаем доп. запрос и дополняем строки таблицы. + + ТекстЗапроса = ""; + Для Каждого Движение ИЗ МетаданныеДокумента.Движения Цикл + + Если счетчик_таблиц > 0 Тогда + счетчик_таблиц = счетчик_таблиц - 1; + Продолжить; + КонецЕсли; + + ТекстЗапроса = ТекстЗапроса + " + |" + ?(ТекстЗапроса = "", "", "ОБЪЕДИНИТЬ ВСЕ ") + " + |ВЫБРАТЬ ПЕРВЫЕ 1 """ + Движение.ПолноеИмя() + """ КАК Имя ИЗ " + + Движение.ПолноеИмя() + " ГДЕ Регистратор = &Регистратор"; + + + КонецЦикла; + Запрос.Текст = ТекстЗапроса; + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + СтрокаТаблицы = ТаблицаЗапроса.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Выборка); + КонецЦикла; + + Возврат ТаблицаЗапроса; + +КонецФункции + + +// Процедура удаления существующих движений документа при перепроведении (отмене проведения) +Процедура УдалитьДвиженияУДокумента(ДокументОбъект, Отказ) + + МассивОбрабатываемыхСтрокТаблицыДвижений = Новый Массив(); + + // получение списка регистров, по которым существуют движения + ТаблицаДвижений = ОпределитьНаличиеДвиженийПоДокументу(ДокументОбъект.Ссылка); + ТаблицаДвижений.Колонки.Добавить("НаборЗаписей"); + ТаблицаДвижений.Колонки.Добавить("БезусловноеУдаление", Новый ОписаниеТипов("Булево")); + + Для Каждого СтрокаДвижения ИЗ ТаблицаДвижений Цикл + // имя регистра передается как значение, полученное с помощью + // функции ПолноеИмя() метаданных регистра + ПозицияТочки = Найти(СтрокаДвижения.Имя, "."); + ТипРегистра = Лев(СтрокаДвижения.Имя, ПозицияТочки - 1); + ИмяРегистра = СокрП(Сред(СтрокаДвижения.Имя, ПозицияТочки + 1)); + + МассивОбрабатываемыхСтрокТаблицыДвижений.Добавить(СтрокаДвижения); + + Если ТипРегистра = "РегистрНакопления" Тогда + МетаданныеНабора = Метаданные.РегистрыНакопления[ИмяРегистра]; + Набор = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей(); + + ИначеЕсли ТипРегистра = "РегистрБухгалтерии" Тогда + МетаданныеНабора = Метаданные.РегистрыБухгалтерии[ИмяРегистра]; + Набор = РегистрыБухгалтерии[ИмяРегистра].СоздатьНаборЗаписей(); + + ИначеЕсли ТипРегистра = "РегистрСведений" Тогда + МетаданныеНабора = Метаданные.РегистрыСведений[ИмяРегистра]; + Набор = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей(); + + ИначеЕсли ТипРегистра = "РегистрРасчета" Тогда + МетаданныеНабора = Метаданные.РегистрыРасчета[ИмяРегистра]; + Набор = РегистрыРасчета[ИмяРегистра].СоздатьНаборЗаписей(); + + КонецЕсли; + + Если НЕ ПравоДоступа("Изменение", Набор.Метаданные()) Тогда + // отсутствуют права на всю таблицу регистра + ВызватьИсключение "Нарушение прав доступа: " + СтрокаДвижения.Имя; + Возврат; + КонецЕсли; + + Набор.Отбор.Регистратор.Установить(ДокументОбъект.Ссылка); + + // набор не записывается сразу, чтобы не откатывать транзакцию, если впоследствии + // выяснится, что на один из регистров не хватает прав. + СтрокаДвижения.НаборЗаписей = Набор; + + КонецЦикла; + + Для Каждого СтрокаДвижения ИЗ МассивОбрабатываемыхСтрокТаблицыДвижений Цикл + Попытка + СтрокаДвижения.НаборЗаписей.Записать(); + Исключение + // возможно «сработал» RLS или подсистема даты запрета изменения + ВызватьИсключение "Операция не выполнена: " + СтрокаДвижения.Имя + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + КонецЦикла; + + ОчисткаКоллекцииДвиженийДокумента(ДокументОбъект); + + // Удаление записей регистрации из всех последовательностей + УдалитьРегистрациюДокументаВПоследовательностях(ДокументОбъект, Истина); + +КонецПроцедуры + +Процедура УдалитьРегистрациюДокументаВПоследовательностях(ДокументОбъект, ПроверятьДвижения = Ложь) + // получение списка последовательностей в которых зарегистрирован документ + Если ПроверятьДвижения Тогда + ТаблицаРегистраций = ОпределитьНаличиеРегистрацииДокументаВПоследовательности(ДокументОбъект); + КонецЕсли; + КоллекцияПоследовательностей = ДокументОбъект.ПринадлежностьПоследовательностям; + Для Каждого НаборЗаписейРегистрацииВПоследовательности ИЗ КоллекцияПоследовательностей Цикл + Если (НаборЗаписейРегистрацииВПоследовательности.Количество() > 0) + ИЛИ (ПроверятьДвижения И (НЕ ТаблицаРегистраций.Найти(НаборЗаписейРегистрацииВПоследовательности.Метаданные().Имя,"Имя") = Неопределено)) Тогда + НаборЗаписейРегистрацииВПоследовательности.Очистить(); + КонецЕсли; + КонецЦикла; +КонецПроцедуры//УдалитьРегистрациюДокументаВПоследовательностях + +Функция ОпределитьНаличиеРегистрацииДокументаВПоследовательности(ДокументОбъект) + ТекстЗапроса = ""; + + Для Каждого Последовательность ИЗ ДокументОбъект.ПринадлежностьПоследовательностям Цикл + // в запросе получаем имена последовательностей, в которых документ зарегистрирован + ТекстЗапроса = ТекстЗапроса + " + |" + ?(ТекстЗапроса = "", "", "ОБЪЕДИНИТЬ ВСЕ ") + " + |ВЫБРАТЬ """ + Последовательность.Метаданные().Имя + + """ КАК Имя ИЗ " + Последовательность.Метаданные().ПолноеИмя() + + " ГДЕ Регистратор = &Регистратор"; + + КонецЦикла; + + Если ТекстЗапроса = "" Тогда + Возврат Новый ТаблицаЗначений(); + Иначе + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Регистратор", ДокументОбъект.Ссылка); + ТаблицаЗапроса = Запрос.Выполнить().Выгрузить(); + Возврат ТаблицаЗапроса; + КонецЕсли; + +КонецФункции + +// Процедура очищает коллекцию движений документа +// +Процедура ОчисткаКоллекцииДвиженийДокумента(ДокументОбъект) + + Для Каждого Движение ИЗ ДокументОбъект.Движения Цикл + Если Движение.Количество() > 0 Тогда + Движение.Очистить(); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + + +Процедура ОтменитьПроведениеОбъектаВИБ(Объект, Тип) + + Попытка + + // отменяем проведение документа + Объект.Проведен = Ложь; + УстановитьОбменДаннымиЗагрузка(Объект); + Объект.Записать(); + + Отказ = Ложь; + УдалитьДвиженияУДокумента(Объект, Отказ); + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеВПротокол(26, ОписаниеОшибки(), Объект, Тип); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + +КонецПроцедуры + +Процедура УстановитьТекущуюДатуРеквизиту(РеквизитОбъекта) + + РеквизитОбъекта = ТекущаяДата(); + +КонецПроцедуры + +// Создает новый объект указанного типа, устанавливает реквизиты, указанные +// в структуре СвойстваПоиска. +// +// Параметры: +// Тип - тип создаваемого объекта +// СвойстваПоиска - Структура, содержащая устанавливаемые реквизиты нового объекта +// +// Возвращаемое значение: +// Новый объект информационной базы +// +Функция СоздатьНовыйОбъект(Тип, СвойстваПоиска, Объект = Неопределено, + ЗаписыватьОбъектСразуПослеСоздания = Истина, НоваяСсылка = Неопределено, + Нпп = 0, ГНпп = 0, Правило = Неопределено, + ПараметрыОбъекта = Неопределено, УстанавливатьУОбъектаВсеСвойстваПоиска = Истина) + + СвойстваМД = Менеджеры[Тип]; + ИмяТипа = СвойстваМД.ИмяТипа; + Менеджер = СвойстваМД.Менеджер; + ПометкаУдаления = Неопределено; + + Если ИмяТипа = "Справочник" + ИЛИ ИмяТипа = "ПланВидовХарактеристик" Тогда + + ЭтоГруппа = СвойстваПоиска["ЭтоГруппа"]; + + Если ЭтоГруппа = Истина Тогда + + Объект = Менеджер.СоздатьГруппу(); + + Иначе + + Объект = Менеджер.СоздатьЭлемент(); + + КонецЕсли; + + ИначеЕсли ИмяТипа = "Документ" Тогда + + Объект = Менеджер.СоздатьДокумент(); + + ИначеЕсли ИмяТипа = "ПланСчетов" Тогда + + Объект = Менеджер.СоздатьСчет(); + + ИначеЕсли ИмяТипа = "ПланВидовРасчета" Тогда + + Объект = Менеджер.СоздатьВидРасчета(); + + ИначеЕсли ИмяТипа = "РегистрСведений" Тогда + + Объект = Менеджер.СоздатьМенеджерЗаписи(); + Возврат Объект; + + ИначеЕсли ИмяТипа = "ПланОбмена" Тогда + + Объект = Менеджер.СоздатьУзел(); + + ИначеЕсли ИмяТипа = "Задача" Тогда + + Объект = Менеджер.СоздатьЗадачу(); + + ИначеЕсли ИмяТипа = "БизнесПроцесс" Тогда + + Объект = Менеджер.СоздатьБизнесПроцесс(); + + ИначеЕсли ИмяТипа = "Перечисление" Тогда + + Объект = СвойстваМД.ПустаяСсылка; + Возврат Объект; + + ИначеЕсли ИмяТипа = "ТочкаМаршрутаБизнесПроцесса" Тогда + + Возврат Неопределено; + + КонецЕсли; + + НоваяСсылка = УстановитьСсылкуНового(Объект, Менеджер, СвойстваПоиска); + + Если УстанавливатьУОбъектаВсеСвойстваПоиска Тогда + УстановитьРеквизитыПоискаУОбъекта(Объект, СвойстваПоиска, , Ложь, Ложь); + КонецЕсли; + + // Проверки + Если ИмяТипа = "Документ" + ИЛИ ИмяТипа = "Задача" + ИЛИ ИмяТипа = "БизнесПроцесс" Тогда + + Если НЕ ЗначениеЗаполнено(Объект.Дата) Тогда + + УстановитьТекущуюДатуРеквизиту(Объект.Дата); + + КонецЕсли; + + КонецЕсли; + + // !!! Если Владелец не установлен, то нужно поле добавить + // в возможные поля поиска, а в событии ПОЛЯПОИСКА указать поля без Владельца, если по нему поиск реально не нужен + + Если ЗаписыватьОбъектСразуПослеСоздания Тогда + + // не загружаем объекты выгруженные по ссылке с пометкой удаления + //Объект.ПометкаУдаления = Истина; + + Если ГНпп <> 0 + ИЛИ Не ОптимизированнаяЗаписьОбъектов Тогда + + ЗаписатьОбъектВИБ(Объект, Тип); + + Иначе + + // записывать объект сразу не будем, а только запомним что нужно записать + // сохраним эту информацию в специальном стеке объектов для записи + // вернем и новую ссылку и сам объект, хотя он еще не записан + Если НоваяСсылка = Неопределено Тогда + + // самостоятельно генерируем новую ссылку + НовыйУникальныйИдентификатор = Новый УникальныйИдентификатор; + НоваяСсылка = Менеджер.ПолучитьСсылку(НовыйУникальныйИдентификатор); + Объект.УстановитьСсылкуНового(НоваяСсылка); + + КонецЕсли; + + Если Правило <> Неопределено Тогда + АвтоматическиГенерироватьКод = Правило.ГенерироватьНовыйНомерИлиКодЕслиНеУказан; + Иначе + АвтоматическиГенерироватьКод = Ложь; + КонецЕсли; + + ДополнитьСтекНеЗаписанныхОбъектов(Нпп, ГНпп, Объект, НоваяСсылка, Тип, ИмяТипа, АвтоматическиГенерироватьКод, ПараметрыОбъекта); + + Возврат НоваяСсылка; + + КонецЕсли; + + Иначе + + Возврат Неопределено; + + КонецЕсли; + + Возврат Объект.Ссылка; + +КонецФункции + +// Читает из файла узел свойства объекта, устанавливает значение свойства +// +// Параметры: +// Тип - тип значения свойства +// ОбъектНайден - если после выполнения функции - Ложь, то значит +// объект свойства не найден в информационной базе и создан новый +// +// Возвращаемое значение: +// Значение свойства +// +Функция ПрочитатьСвойство(Тип, НеСоздаватьОбъектЕслиНеНайден = Ложь, СвойствоНеНайденоПоСсылке = Ложь) + + Значение = Неопределено; + НаличиеСвойств = Ложь; + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Значение" Тогда + + ИскатьПоСвойству = одАтрибут(ФайлОбмена, ТипСтрока, "Свойство"); + Значение = одЗначениеЭлемента(ФайлОбмена, Тип, ИскатьПоСвойству, Ложь); + НаличиеСвойств = Истина; + + ИначеЕсли ИмяУзла = "Ссылка" Тогда + + ОбъектНайден = Истина; + Значение = НайтиОбъектПоСсылке(Тип, , , ОбъектНайден, , НеСоздаватьОбъектЕслиНеНайден); + + Если НеСоздаватьОбъектЕслиНеНайден + И НЕ ОбъектНайден Тогда + + СвойствоНеНайденоПоСсылке = Ложь; + + КонецЕсли; + + НаличиеСвойств = Истина; + + ИначеЕсли ИмяУзла = "Нпп" Тогда + + ФайлОбмена.Прочитать(); + Нпп = Число(ФайлОбмена.Значение); + Если Нпп <> 0 Тогда + Значение = НайтиОбъектПоНомеру(Нпп, Тип); + НаличиеСвойств = Истина; + КонецЕсли; + ФайлОбмена.Прочитать(); + + ИначеЕсли ИмяУзла = "ГНпп" Тогда + + ФайлОбмена.Прочитать(); + ГНпп = Число(ФайлОбмена.Значение); + Если ГНпп <> 0 Тогда + Значение = НайтиОбъектПоГлобальномуНомеру(ГНпп); + НаличиеСвойств = Истина; + КонецЕсли; + + ФайлОбмена.Прочитать(); + + ИначеЕсли (ИмяУзла = "Свойство" ИЛИ ИмяУзла = "ЗначениеПараметра") И (ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Если Не НаличиеСвойств + И ЗначениеЗаполнено(Тип) Тогда + + // если вообще ничего нет - значит пустое значение + Значение = одПолучитьПустоеЗначение(Тип); + + КонецЕсли; + + Прервать; + + ИначеЕсли ИмяУзла = "Выражение" Тогда + + Значение = Вычислить(одЗначениеЭлемента(ФайлОбмена, ТипСтрока, , Ложь)); + НаличиеСвойств = Истина; + + ИначеЕсли ИмяУзла = "Пусто" Тогда + + Значение = одПолучитьПустоеЗначение(Тип); + НаличиеСвойств = Истина; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + + Возврат Значение; + +КонецФункции // ПрочитатьСвойство() + +Функция УстановитьРеквизитыПоискаУОбъекта(НайденныйОбъект, СвойстваПоиска, СвойстваПоискаНеЗамещать, + НужноСравниватьСТекущимиРеквизитами = Истина, НЕЗаменятьСвойстваНеПодлежащиеИзменению = Истина) + + ИзмененыРеквизитыОбъекта = Ложь; + + Для каждого Свойство Из СвойстваПоиска Цикл + + Имя = Свойство.Ключ; + Значение = Свойство.Значение; + + Если НЕЗаменятьСвойстваНеПодлежащиеИзменению + И СвойстваПоискаНеЗамещать[Имя] <> Неопределено Тогда + + Продолжить; + + КонецЕсли; + + Если Имя = "ЭтоГруппа" + ИЛИ Имя = "{УникальныйИдентификатор}" + ИЛИ Имя = "{ИмяПредопределенногоЭлемента}" + ИЛИ Имя = "{КлючПоискаВИБИсточнике}" + ИЛИ Имя = "{КлючПоискаВИБПриемнике}" + ИЛИ Имя = "{ИмяТипаВИБИсточнике}" + ИЛИ Имя = "{ИмяТипаВИБПриемнике}" Тогда + + Продолжить; + + ИначеЕсли Имя = "ПометкаУдаления" Тогда + + Если НЕ НужноСравниватьСТекущимиРеквизитами + ИЛИ НайденныйОбъект.ПометкаУдаления <> Значение Тогда + + НайденныйОбъект.ПометкаУдаления = Значение; + ИзмененыРеквизитыОбъекта = Истина; + + КонецЕсли; + + Иначе + + // отличные реквизиты устанавливаем + + Если НайденныйОбъект[Имя] <> NULL Тогда + + Если НЕ НужноСравниватьСТекущимиРеквизитами + ИЛИ НайденныйОбъект[Имя] <> Значение Тогда + + НайденныйОбъект[Имя] = Значение; + ИзмененыРеквизитыОбъекта = Истина; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Возврат ИзмененыРеквизитыОбъекта; + +КонецФункции + +Функция НайтиИлиСоздатьОбъектПоСвойству(СтруктураСвойств, + ТипОбъекта, + СвойстваПоиска, + СвойстваПоискаНеЗамещать, + ИмяТипаОбъекта, + СвойствоПоиска, + ЗначениеСвойстваПоиска, + ОбъектНайден, + СоздаватьНовыйЭлементЕслиНеНайден = Истина, + НайденныйИлиСозданныйОбъект = Неопределено, + РежимПоискаОсновногоОбъекта = Ложь, + СвойстваОбъектаМодифицированы = Ложь, + НоваяСсылкаУникальногоИдентификатора = Неопределено, + Нпп = 0, + ГНпп = 0, + ПараметрыОбъекта = Неопределено, + НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике = Ложь, + ОбъектБылСозданВТекущейИнформационнойБазе = Неопределено) + + Объект = одНайтиОбъектПоСвойству(СтруктураСвойств.Менеджер, СвойствоПоиска, ЗначениеСвойстваПоиска, + НайденныйИлиСозданныйОбъект, , , РежимПоискаОсновногоОбъекта, СтруктураСвойств.СтрокаПоиска); + + ОбъектНайденИлиСоздан = НЕ (Объект = Неопределено + ИЛИ Объект.Пустая()); + + ОбъектНайден = НЕ Объект.Пустая(); + + + Если Не ОбъектНайденИлиСоздан + И СоздаватьНовыйЭлементЕслиНеНайден Тогда + + Объект = СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, НайденныйИлиСозданныйОбъект, + НЕ РежимПоискаОсновногоОбъекта, НоваяСсылкаУникальногоИдентификатора, Нпп, ГНпп, НайтиПервоеПравилоПоСтруктуреСвойств(СтруктураСвойств), + ПараметрыОбъекта); + + СвойстваОбъектаМодифицированы = Истина; + Возврат Объект; + + КонецЕсли; + + + Если РежимПоискаОсновногоОбъекта Тогда + + // + Попытка + + Если Не ЗначениеЗаполнено(Объект) Тогда + Возврат Объект; + КонецЕсли; + + Если НайденныйИлиСозданныйОбъект = Неопределено Тогда + НайденныйИлиСозданныйОбъект = Объект.ПолучитьОбъект(); + КонецЕсли; + + Исключение + Возврат Объект; + КонецПопытки; + + СвойстваОбъектаМодифицированы = УстановитьРеквизитыПоискаУОбъекта(НайденныйИлиСозданныйОбъект, СвойстваПоиска, СвойстваПоискаНеЗамещать); + + КонецЕсли; + + Возврат Объект; + +КонецФункции + +Функция ПолучитьТипСвойства() + + СтроковыйТипСвойства = одАтрибут(ФайлОбмена, ТипСтрока, "Тип"); + Если ПустаяСтрока(СтроковыйТипСвойства) Тогда + + // нужно определять свойство по соответствию + Возврат Неопределено; + + КонецЕсли; + + Возврат Тип(СтроковыйТипСвойства); + +КонецФункции + +Функция ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, ИмяСвойства) + + ТипСвойства = ПолучитьТипСвойства(); + + Если ТипСвойства = Неопределено + И ИнформацияОТипах <> Неопределено Тогда + + ТипСвойства = ИнформацияОТипах[ИмяСвойства]; + + КонецЕсли; + + Возврат ТипСвойства; + +КонецФункции + +Процедура ПрочитатьСвойстваПоискаИзФайла(СвойстваПоиска, СвойстваПоискаНеЗамещать, ИнформацияОТипах, + ПоискПоДатеНаРавенство = Ложь, ПараметрыОбъекта = Неопределено) + + ПоискПоДатеНаРавенство = Ложь; + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Свойство" + ИЛИ ИмяУзла = "ЗначениеПараметра" Тогда + + ЭтоПараметр = (ИмяУзла = "ЗначениеПараметра"); + + Имя = одАтрибут(ФайлОбмена, ТипСтрока, "Имя"); + + ТипИсточникаСтрокой = одАтрибут(ФайлОбмена, ТипСтрока, "ТипПриемника"); + ТипПриемникаСтрокой = одАтрибут(ФайлОбмена, ТипСтрока, "ТипИсточника"); + + СвойствоУникальныйИдентификатор = (Имя = "{УникальныйИдентификатор}"); + + Если СвойствоУникальныйИдентификатор Тогда + + ТипСвойства = ТипСтрока; + + ИначеЕсли Имя = "{ИмяПредопределенногоЭлемента}" + ИЛИ Имя = "{КлючПоискаВИБИсточнике}" + ИЛИ Имя = "{КлючПоискаВИБПриемнике}" + ИЛИ Имя = "{ИмяТипаВИБИсточнике}" + ИЛИ Имя = "{ИмяТипаВИБПриемнике}" Тогда + + ТипСвойства = ТипСтрока; + + Иначе + + ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + + КонецЕсли; + + НеЗамещатьСвойство = одАтрибут(ФайлОбмена, ТипБулево, "НеЗамещать"); + + ПоискПоДатеНаРавенство = ПоискПоДатеНаРавенство + ИЛИ одАтрибут(ФайлОбмена, ТипБулево, "ПоискПоДатеНаРавенство"); + // + ЗначениеСвойства = ПрочитатьСвойство(ТипСвойства); + + Если СвойствоУникальныйИдентификатор Тогда + + ВыполнитьЗаменуУникальногоИдентификатораПриНеобходимости(ЗначениеСвойства, ТипИсточникаСтрокой, ТипПриемникаСтрокой); + + КонецЕсли; + + Если (Имя = "ЭтоГруппа") И (ЗначениеСвойства <> Истина) Тогда + + ЗначениеСвойства = Ложь; + + КонецЕсли; + + Если ЭтоПараметр Тогда + + + ДобавитьПараметрПриНеобходимости(ПараметрыОбъекта, Имя, ЗначениеСвойства); + + Иначе + + СвойстваПоиска[Имя] = ЗначениеСвойства; + + Если НеЗамещатьСвойство Тогда + + СвойстваПоискаНеЗамещать[Имя] = Истина; + + КонецЕсли; + + КонецЕсли; + + ИначеЕсли (ИмяУзла = "Ссылка") И (ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ВыполнитьЗаменуУникальногоИдентификатораПриНеобходимости(УникальныйИдентификатор, Знач ТипИсточникаСтрокой, Знач ТипПриемникаСтрокой) + + // в режиме сопоставления замену не выполняем + Если РежимЗагрузкиДанныхВТаблицуЗначений() Тогда + Возврат; + КонецЕсли; + + Если Не ЕстьИнформацияСопоставленияВРегистре(ТипИсточникаСтрокой, ТипПриемникаСтрокой) Тогда + Возврат; + КонецЕсли; + + ЗапросСоответствиеОбъектовИнформационныхБаз.УстановитьПараметр("УзелИнформационнойБазы", УзелОбменаЗагрузкаДанных); + ЗапросСоответствиеОбъектовИнформационныхБаз.УстановитьПараметр("УникальныйИдентификаторПриемника", УникальныйИдентификатор); + ЗапросСоответствиеОбъектовИнформационныхБаз.УстановитьПараметр("ТипПриемника", ТипПриемникаСтрокой); + ЗапросСоответствиеОбъектовИнформационныхБаз.УстановитьПараметр("ТипИсточника", ТипИсточникаСтрокой); + + РезультатЗапроса = ЗапросСоответствиеОбъектовИнформационныхБаз.Выполнить(); + + Если Не РезультатЗапроса.Пустой() Тогда + + Выборка = РезультатЗапроса.Выбрать(); + Выборка.Следующий(); + + УникальныйИдентификатор = Выборка.УникальныйИдентификаторИсточникаСтрокой; + + КонецЕсли; + +КонецПроцедуры + +Функция ОпределитьУПоляНеограниченнаяДлина(МенеджерТипа, ИмяПараметра) + + ДлинныеСтроки = Неопределено; + Если НЕ МенеджерТипа.Свойство("ДлинныеСтроки", ДлинныеСтроки) Тогда + + ДлинныеСтроки = Новый Соответствие; + Для Каждого Реквизит Из МенеджерТипа.ОбъектМД.Реквизиты Цикл + + Если Реквизит.Тип.СодержитТип(ТипСтрока) + И (Реквизит.Тип.КвалификаторыСтроки.Длина = 0) Тогда + + ДлинныеСтроки.Вставить(Реквизит.Имя, Реквизит.Имя); + + КонецЕсли; + + КонецЦикла; + + МенеджерТипа.Вставить("ДлинныеСтроки", ДлинныеСтроки); + + КонецЕсли; + + Возврат (ДлинныеСтроки[ИмяПараметра] <> Неопределено); + +КонецФункции + +Функция ОпределитьЭтотПараметрНеограниченнойДлинны(МенеджерТипа, ЗначениеПараметра, ИмяПараметра) + + Попытка + + Если ТипЗнч(ЗначениеПараметра) = ТипСтрока Тогда + СтрокаНеограниченнойДлины = ОпределитьУПоляНеограниченнаяДлина(МенеджерТипа, ИмяПараметра); + Иначе + СтрокаНеограниченнойДлины = Ложь; + КонецЕсли; + + Исключение + + СтрокаНеограниченнойДлины = Ложь; + + КонецПопытки; + + Возврат СтрокаНеограниченнойДлины; + +КонецФункции + +Функция НайтиЭлементЗапросом(СтруктураСвойств, СвойстваПоиска, ТипОбъекта = Неопределено, + МенеджерТипа = Неопределено, КоличествоРеальныхСвойствДляПоиска = Неопределено) + + КоличествоСвойствДляПоиска = ?(КоличествоРеальныхСвойствДляПоиска = Неопределено, СвойстваПоиска.Количество(), КоличествоРеальныхСвойствДляПоиска); + + Если КоличествоСвойствДляПоиска = 0 + И СтруктураСвойств.ИмяТипа = "Перечисление" Тогда + + Возврат СтруктураСвойств.ПустаяСсылка; + + КонецЕсли; + + ТекстЗапроса = СтруктураСвойств.СтрокаПоиска; + + Если ПустаяСтрока(ТекстЗапроса) Тогда + Возврат СтруктураСвойств.ПустаяСсылка; + КонецЕсли; + + ЗапросПоиска = Новый Запрос(); + + КоличествоСвойствПоКоторымУстановленПоиск = 0; + + Для каждого Свойство Из СвойстваПоиска Цикл + + ИмяПараметра = Свойство.Ключ; + + // не по всем параметрам можно искать + Если ИмяПараметра = "{УникальныйИдентификатор}" + ИЛИ ИмяПараметра = "{ИмяПредопределенногоЭлемента}" Тогда + + Продолжить; + + КонецЕсли; + + ЗначениеПараметра = Свойство.Значение; + ЗапросПоиска.УстановитьПараметр(ИмяПараметра, ЗначениеПараметра); + + Попытка + + СтрокаНеограниченнойДлины = ОпределитьЭтотПараметрНеограниченнойДлинны(СтруктураСвойств, ЗначениеПараметра, ИмяПараметра); + + Исключение + + СтрокаНеограниченнойДлины = Ложь; + + КонецПопытки; + + КоличествоСвойствПоКоторымУстановленПоиск = КоличествоСвойствПоКоторымУстановленПоиск + 1; + + Если СтрокаНеограниченнойДлины Тогда + + ТекстЗапроса = ТекстЗапроса + ?(КоличествоСвойствПоКоторымУстановленПоиск > 1, " И ", "") + ИмяПараметра + " ПОДОБНО &" + ИмяПараметра; + + Иначе + + ТекстЗапроса = ТекстЗапроса + ?(КоличествоСвойствПоКоторымУстановленПоиск > 1, " И ", "") + ИмяПараметра + " = &" + ИмяПараметра; + + КонецЕсли; + + КонецЦикла; + + Если КоличествоСвойствПоКоторымУстановленПоиск = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + ЗапросПоиска.Текст = ТекстЗапроса; + Результат = ЗапросПоиска.Выполнить(); + + Если Результат.Пустой() Тогда + + Возврат Неопределено; + + Иначе + + // возвращаем первый найденный объект + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + СсылкаНаОбъект = Выборка.Ссылка; + + КонецЕсли; + + Возврат СсылкаНаОбъект; + +КонецФункции + +Функция ОпределитьПоТипуОбъектаАлгоритмПоследовательностиПолейПоиска(ТипСсылкиСтрокой, НастройкаПоиска) + + ЗначениеСоответстствия = СоответствиеАлгоритмовПоискаЭлементов.Получить(ТипСсылкиСтрокой); + + Если ЗначениеСоответстствия <> Неопределено Тогда + + НастройкаПоиска = ЗначениеСоответстствия.НастройкаПоиска; + Возврат ЗначениеСоответстствия.АлгоритмПоиска; + + КонецЕсли; + + Попытка + + Для Каждого Элемент Из Правила Цикл + + Если Элемент.Значение.Приемник = ТипСсылкиСтрокой Тогда + + Если Элемент.Значение.ЕстьОбработчикПоследовательностьПолейПоиска = Истина Тогда + + АлгоритмПоиска = Элемент.Значение.ПоследовательностьПолейПоиска; + НастройкаПоиска = ИнформацияОПользовательскихПоляхПоискаПриЗагрузкеДанных[Элемент.Значение.Имя]; + Если НастройкаПоиска = Неопределено Тогда + НастройкаПоиска = ""; + КонецЕсли; + + СоответствиеАлгоритмовПоискаЭлементов.Вставить(ТипСсылкиСтрокой, Новый Структура("АлгоритмПоиска,НастройкаПоиска", АлгоритмПоиска, НастройкаПоиска)); + + Возврат АлгоритмПоиска; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + СоответствиеАлгоритмовПоискаЭлементов.Вставить(ТипСсылкиСтрокой, Новый Структура("АлгоритмПоиска,НастройкаПоиска", "", "")); + Возврат ""; + + Исключение + + СоответствиеАлгоритмовПоискаЭлементов.Вставить(ТипСсылкиСтрокой, Новый Структура("АлгоритмПоиска,НастройкаПоиска", "", "")); + Возврат ""; + + КонецПопытки; + +КонецФункции + +Функция НайтиСсылкуНаДокумент(СвойстваПоиска, СтруктураСвойств, КоличествоРеальныхСвойствДляПоиска, ИскатьЗапросом, ПоискПоДатеНаРавенство) + + // попробуем документ по дате и номеру найти + ИскатьЗапросом = ПоискПоДатеНаРавенство ИЛИ (КоличествоРеальныхСвойствДляПоиска <> 2); + + Если ИскатьЗапросом Тогда + Возврат Неопределено; + КонецЕсли; + + НомерДокумента = СвойстваПоиска["Номер"]; + ДатаДокумента = СвойстваПоиска["Дата"]; + + Если (НомерДокумента <> Неопределено) И (ДатаДокумента <> Неопределено) Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.НайтиПоНомеру(НомерДокумента, ДатаДокумента); + + Иначе + + // по дате и номеру найти не удалось - надо искать запросом + ИскатьЗапросом = Истина; + СсылкаНаОбъект = Неопределено; + + КонецЕсли; + + Возврат СсылкаНаОбъект; + +КонецФункции + +Функция НайтиЭлементПоСвойствамПоиска(ТипОбъекта, ИмяТипаОбъекта, СвойстваПоиска, + СтруктураСвойств, СтрокаИменСвойствПоиска, ПоискПоДатеНаРавенство) + + // не нужно искать по имени предопределенного элемента и по уникальной ссылке на объект + // нужно искать только по тем свойствам, которые имеются в строке имен свойств. Если там пусто, то по + // всем имеющимся свойствам поиска + + Если ПустаяСтрока(СтрокаИменСвойствПоиска) Тогда + + ВременныеСвойстваПоиска = СвойстваПоиска; + + Иначе + + ГотоваяСтрокаДляРазбора = СтрЗаменить(СтрокаИменСвойствПоиска, " ", ""); + ДлинаСтроки = СтрДлина(ГотоваяСтрокаДляРазбора); + Если Сред(ГотоваяСтрокаДляРазбора, ДлинаСтроки, 1) <> "," Тогда + + ГотоваяСтрокаДляРазбора = ГотоваяСтрокаДляРазбора + ","; + + КонецЕсли; + + ВременныеСвойстваПоиска = Новый Соответствие; + Для Каждого ЭлементСвойств Из СвойстваПоиска Цикл + + ИмяПараметра = ЭлементСвойств.Ключ; + Если Найти(ГотоваяСтрокаДляРазбора, ИмяПараметра + ",") > 0 Тогда + + ВременныеСвойстваПоиска.Вставить(ИмяПараметра, ЭлементСвойств.Значение); + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + СвойствоУникальныйИдентификатор = ВременныеСвойстваПоиска["{УникальныйИдентификатор}"]; + СвойствоИмяПредопределенного = ВременныеСвойстваПоиска["{ИмяПредопределенногоЭлемента}"]; + + КоличествоРеальныхСвойствДляПоиска = ВременныеСвойстваПоиска.Количество(); + КоличествоРеальныхСвойствДляПоиска = КоличествоРеальныхСвойствДляПоиска - ?(СвойствоУникальныйИдентификатор <> Неопределено, 1, 0); + КоличествоРеальныхСвойствДляПоиска = КоличествоРеальныхСвойствДляПоиска - ?(СвойствоИмяПредопределенного <> Неопределено, 1, 0); + + ИскатьЗапросом = Ложь; + + Если ИмяТипаОбъекта = "Документ" Тогда + + СсылкаНаОбъект = НайтиСсылкуНаДокумент(ВременныеСвойстваПоиска, СтруктураСвойств, КоличествоРеальныхСвойствДляПоиска, ИскатьЗапросом, ПоискПоДатеНаРавенство); + + Иначе + + ИскатьЗапросом = Истина; + + КонецЕсли; + + Если ИскатьЗапросом Тогда + + СсылкаНаОбъект = НайтиЭлементЗапросом(СтруктураСвойств, ВременныеСвойстваПоиска, ТипОбъекта, , КоличествоРеальныхСвойствДляПоиска); + + КонецЕсли; + + Возврат СсылкаНаОбъект; +КонецФункции + +Процедура ОбработатьУстановкуСвойствПоискаУОбъекта(УстанавливатьУОбъектаВсеСвойстваПоиска, ТипОбъекта, СвойстваПоиска, + СвойстваПоискаНеЗамещать, СсылкаНаОбъект, СозданныйОбъект, ЗаписыватьНовыйОбъектВИнформационнуюБазу = Истина, ИзмененыРеквизитыОбъекта = Ложь, + НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике = Ложь, ОбъектБылСозданВТекущейИнформационнойБазе = Неопределено) + + Если УстанавливатьУОбъектаВсеСвойстваПоиска <> Истина Тогда + Возврат; + КонецЕсли; + + Попытка + + Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда + Возврат; + КонецЕсли; + + Если СозданныйОбъект = Неопределено Тогда + СозданныйОбъект = СсылкаНаОбъект.ПолучитьОбъект(); + КонецЕсли; + + Исключение + Возврат; + КонецПопытки; + + ИзмененыРеквизитыОбъекта = УстановитьРеквизитыПоискаУОбъекта(СозданныйОбъект, СвойстваПоиска, СвойстваПоискаНеЗамещать); + + // если было то что изменено, тогда перезаписываем объект + Если ИзмененыРеквизитыОбъекта + И ЗаписыватьНовыйОбъектВИнформационнуюБазу Тогда + + ЗаписатьОбъектВИБ(СозданныйОбъект, ТипОбъекта); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПрочитатьИнформациюОСвойствахПоиска(ТипОбъекта, СвойстваПоиска, СвойстваПоискаНеЗамещать, + ПоискПоДатеНаРавенство = Ложь, ПараметрыОбъекта = Неопределено) + + Если СвойстваПоиска = "" Тогда + СвойстваПоиска = Новый Соответствие; + КонецЕсли; + + Если СвойстваПоискаНеЗамещать = "" Тогда + СвойстваПоискаНеЗамещать = Новый Соответствие; + КонецЕсли; + + ИнформацияОТипах = СоответствиеТиповДанныхДляЗагрузки()[ТипОбъекта]; + ПрочитатьСвойстваПоискаИзФайла(СвойстваПоиска, СвойстваПоискаНеЗамещать, ИнформацияОТипах, ПоискПоДатеНаРавенство, ПараметрыОбъекта); + +КонецПроцедуры + +Процедура ОпределитьДополнительныеПараметрыПоискаОбъекта(СвойстваПоиска, ТипОбъекта, СтруктураСвойств, ИмяТипаОбъекта, ЭтоОбъектДокумент) + + Если ТипОбъекта = Неопределено Тогда + + // попробуем определить тип по свойствам поиска + ИмяТипаПриемника = СвойстваПоиска["{ИмяТипаВИБПриемнике}"]; + Если ИмяТипаПриемника = Неопределено Тогда + ИмяТипаПриемника = СвойстваПоиска["{ИмяТипаВИБИсточнике}"]; + КонецЕсли; + + Если ИмяТипаПриемника <> Неопределено Тогда + + ТипОбъекта = Тип(ИмяТипаПриемника); + + КонецЕсли; + + КонецЕсли; + + СтруктураСвойств = Менеджеры[ТипОбъекта]; + ИмяТипаОбъекта = СтруктураСвойств.ИмяТипа; + +КонецПроцедуры + +Функция НайтиПервоеПравилоПоСтруктуреСвойств(СтруктураСвойств) + + Попытка + + СтрокаПриемника = СтруктураСвойств.ТипСсылкиСтрокой; + + Если ПустаяСтрока(СтрокаПриемника) Тогда + Возврат Неопределено; + КонецЕсли; + + Для Каждого СтрокаПравила Из Правила Цикл + + Если СтрокаПравила.Значение.Приемник = СтрокаПриемника Тогда + Возврат СтрокаПравила.Значение; + КонецЕсли; + + КонецЦикла; + + Исключение + + КонецПопытки; + + Возврат Неопределено; + +КонецФункции + +// Производит поиск объекта в информационной базе, если не найден создает новый +// +// Параметры: +// ТипОбъекта - тип искомого объекта +// СвойстваПоиска - структура, содержащая свойства по которым производится поиск объекта +// ОбъектНайден - если Ложь, то объект не найден, а создан новый +// +// Возвращаемое значение: +// Новый или найденный объект информационной базы +// +Функция НайтиОбъектПоСсылке(ТипОбъекта, + СвойстваПоиска = "", + СвойстваПоискаНеЗамещать = "", + ОбъектНайден = Истина, + СозданныйОбъект = Неопределено, + НеСоздаватьОбъектЕслиНеНайден = Ложь, + РежимПоискаОсновногоОбъекта = Ложь, + СвойстваОбъектаМодифицированы = Ложь, + НППГлобальнойСсылки = 0, + НппСсылки = 0, + ОбъектНайденПоПолямПоиска = Ложь, + ИзвестнаяСсылкаУникальногоИдентификатора = Неопределено, + ЭтоПоискОбъектаЗагрузки = Ложь, + ПараметрыОбъекта = Неопределено, + НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике = Ложь, + ОбъектБылСозданВТекущейИнформационнойБазе = Неопределено, + РегистрироватьОбъектНаУзлеОтправителе = Ложь, + УникальныйИдентификаторСтрокой = "") + + // создаем свойства поиска объектов + ПоискПоДатеНаРавенство = Ложь; + СсылкаНаОбъект = Неопределено; + СтруктураСвойств = Неопределено; + ИмяТипаОбъекта = Неопределено; + ЭтоОбъектДокумент = Ложь; + ЧтениеСвойствСсылкиВыполнено = Ложь; + + НППГлобальнойСсылки = одАтрибут(ФайлОбмена, ТипЧисло, "ГНпп"); + НппСсылки = одАтрибут(ФайлОбмена, ТипЧисло, "Нпп"); + + // признак того, что объект необходимо зарегистрировать к выгрузке для узла-отправителя (отправка объекта назад) + РегистрироватьОбъектНаУзлеОтправителе = одАтрибут(ФайлОбмена, ТипБулево, "РегистрироватьОбъектНаУзлеОтправителе"); + + ФлагНеСоздаватьОбъектЕслиНеНайден = одАтрибут(ФайлОбмена, ТипБулево, "НеСоздаватьЕслиНеНайден"); + Если НЕ ЗначениеЗаполнено(ФлагНеСоздаватьОбъектЕслиНеНайден) Тогда + ФлагНеСоздаватьОбъектЕслиНеНайден = Ложь; + КонецЕсли; + + Если НеСоздаватьОбъектЕслиНеНайден = Неопределено Тогда + НеСоздаватьОбъектЕслиНеНайден = Ложь; + КонецЕсли; + + ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD = НЕ РежимПоискаОсновногоОбъекта; + + НеСоздаватьОбъектЕслиНеНайден = НеСоздаватьОбъектЕслиНеНайден ИЛИ ФлагНеСоздаватьОбъектЕслиНеНайден; + + ФлагНеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике = одАтрибут(ФайлОбмена, ТипБулево, "НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике"); + Если НЕ ЗначениеЗаполнено(ФлагНеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике) Тогда + НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике = Ложь; + Иначе + НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике = ФлагНеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике; + КонецЕсли; + + ПрочитатьИнформациюОСвойствахПоиска(ТипОбъекта, СвойстваПоиска, СвойстваПоискаНеЗамещать, ПоискПоДатеНаРавенство, ПараметрыОбъекта); + ОпределитьДополнительныеПараметрыПоискаОбъекта(СвойстваПоиска, ТипОбъекта, СтруктураСвойств, ИмяТипаОбъекта, ЭтоОбъектДокумент); + + СвойствоУникальныйИдентификатор = СвойстваПоиска["{УникальныйИдентификатор}"]; + СвойствоИмяПредопределенного = СвойстваПоиска["{ИмяПредопределенногоЭлемента}"]; + + УникальныйИдентификаторСтрокой = СвойствоУникальныйИдентификатор; + + ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD = ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD + И СвойствоУникальныйИдентификатор <> Неопределено; + // + + // ПОИСК ССЫЛКИ ПО GUID ИЛИ ПО ИМЕНИ ПРЕДОПРЕДЕЛЕННОГО ЭЛЕМЕНТА + + // если это предопределенный элемент ищем по имени + Если СвойствоИмяПредопределенного <> Неопределено Тогда + + АвтоматическиСоздаватьНовыйОбъект = НЕ НеСоздаватьОбъектЕслиНеНайден + И НЕ ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD; + + СсылкаНаОбъект = НайтиИлиСоздатьОбъектПоСвойству(СтруктураСвойств, + ТипОбъекта, + СвойстваПоиска, + СвойстваПоискаНеЗамещать, + ИмяТипаОбъекта, + "{ИмяПредопределенногоЭлемента}", + СвойствоИмяПредопределенного, + ОбъектНайден, + АвтоматическиСоздаватьНовыйОбъект, + СозданныйОбъект, + РежимПоискаОсновногоОбъекта, + СвойстваОбъектаМодифицированы, + , + НппСсылки, НППГлобальнойСсылки, + ПараметрыОбъекта, + НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике, + ОбъектБылСозданВТекущейИнформационнойБазе); + + ИначеЕсли СвойствоУникальныйИдентификатор <> Неопределено Тогда + + Если РежимПоискаОсновногоОбъекта Тогда + + АвтоматическиСоздаватьНовыйОбъект = НЕ НеСоздаватьОбъектЕслиНеНайден И НЕ ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD; + + СсылкаНаОбъект = НайтиИлиСоздатьОбъектПоСвойству(СтруктураСвойств, + ТипОбъекта, + СвойстваПоиска, + СвойстваПоискаНеЗамещать, + ИмяТипаОбъекта, + "{УникальныйИдентификатор}", + СвойствоУникальныйИдентификатор, + ОбъектНайден, + АвтоматическиСоздаватьНовыйОбъект, + СозданныйОбъект, + РежимПоискаОсновногоОбъекта, + СвойстваОбъектаМодифицированы, + ИзвестнаяСсылкаУникальногоИдентификатора, + НппСсылки, + НППГлобальнойСсылки, + ПараметрыОбъекта, + НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике, + ОбъектБылСозданВТекущейИнформационнойБазе); + + Если Не ЗначениеЗаполнено(СсылкаНаОбъект) + И ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СвойствоУникальныйИдентификатор)); + ОбъектНайден = Ложь; + СсылкаНаОбъектФиктивная = Истина; + + КонецЕсли; + + Если СсылкаНаОбъект <> Неопределено + И СсылкаНаОбъект.Пустая() Тогда + + СсылкаНаОбъект = Неопределено; + + КонецЕсли; + + // в обычном режиме обмена ищем ссылку только по GUID; поля поиска не используем + Возврат СсылкаНаОбъект; + + Иначе + + // для неосновных объектов (выгруженных по ссылке) просто получаем ссылку с заданным GUID + СсылкаНаОбъект = СтруктураСвойств.Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СвойствоУникальныйИдентификатор)); + + Возврат СсылкаНаОбъект; + + КонецЕсли; + + КонецЕсли; + + Если СсылкаНаОбъект <> Неопределено + И СсылкаНаОбъект.Пустая() Тогда + + СсылкаНаОбъект = Неопределено; + + КонецЕсли; + + Если СсылкаНаОбъект <> Неопределено + ИЛИ СозданныйОбъект <> Неопределено Тогда + + // объект был найден по GUID или по имени предопределенного элемента; выходим + Возврат СсылкаНаОбъект; + + КонецЕсли; + + // ПОИСК ССЫЛКИ ПО ПОЛЯМ ПОИСКА + + НомерВариантаПоиска = 1; + СтрокаИменСвойствПоиска = ""; + ПредыдущаяСтрокаПоиска = Неопределено; + ПрекратитьПоиск = Ложь; + УстанавливатьУОбъектаВсеСвойстваПоиска = Истина; + + НастройкаПоиска = ""; + АлгоритмПоиска = ОпределитьПоТипуОбъектаАлгоритмПоследовательностиПолейПоиска(СтруктураСвойств.ТипСсылкиСтрокой, НастройкаПоиска); + + ЕстьАлгоритмПоиска = Не ПустаяСтрока(АлгоритмПоиска); + + Пока НомерВариантаПоиска <= 10 + И ЕстьАлгоритмПоиска Цикл + + Попытка + + Выполнить(АлгоритмПоиска); + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(73, ОписаниеОшибки(), "", "", + ТипОбъекта, Неопределено, "Последовательность полей поиска"); + + КонецПопытки; + + НеНужноВыполнятьПоиск = ПрекратитьПоиск = Истина + ИЛИ СтрокаИменСвойствПоиска = ПредыдущаяСтрокаПоиска + ИЛИ ЗначениеЗаполнено(СсылкаНаОбъект); + + Если НЕ НеНужноВыполнятьПоиск Тогда + + // сам поиск непосредственно + СсылкаНаОбъект = НайтиЭлементПоСвойствамПоиска(ТипОбъекта, ИмяТипаОбъекта, СвойстваПоиска, СтруктураСвойств, + СтрокаИменСвойствПоиска, ПоискПоДатеНаРавенство); + + НеНужноВыполнятьПоиск = ЗначениеЗаполнено(СсылкаНаОбъект); + + КонецЕсли; + + Если НеНужноВыполнятьПоиск Тогда + + Если РежимПоискаОсновногоОбъекта Тогда + + ОбработатьУстановкуСвойствПоискаУОбъекта(УстанавливатьУОбъектаВсеСвойстваПоиска, ТипОбъекта, СвойстваПоиска, + СвойстваПоискаНеЗамещать, СсылкаНаОбъект, СозданныйОбъект, НЕ РежимПоискаОсновногоОбъекта, СвойстваОбъектаМодифицированы, + НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике, ОбъектБылСозданВТекущейИнформационнойБазе); + + КонецЕсли; + + Прервать; + + КонецЕсли; + + НомерВариантаПоиска = НомерВариантаПоиска + 1; + ПредыдущаяСтрокаПоиска = СтрокаИменСвойствПоиска; + + КонецЦикла; + + Если Не ЕстьАлгоритмПоиска Тогда + + // сам поиск непосредственно и без алгоритма поиска + СсылкаНаОбъект = НайтиЭлементПоСвойствамПоиска(ТипОбъекта, ИмяТипаОбъекта, СвойстваПоиска, СтруктураСвойств, + СтрокаИменСвойствПоиска, ПоискПоДатеНаРавенство); + + КонецЕсли; + + Если РежимПоискаОсновногоОбъекта + И ЗначениеЗаполнено(СсылкаНаОбъект) + И (ИмяТипаОбъекта = "Документ" + ИЛИ ИмяТипаОбъекта = "Задача" + ИЛИ ИмяТипаОбъекта = "БизнесПроцесс") Тогда + + // если у документа дата есть в свойствах поиска - то устанавливаем ее + ДатаПустая = Не ЗначениеЗаполнено(СвойстваПоиска["Дата"]); + МожноЗамещать = (Не ДатаПустая) + И (СвойстваПоискаНеЗамещать["Дата"] = Неопределено); + + Если МожноЗамещать Тогда + + Если СозданныйОбъект = Неопределено Тогда + СозданныйОбъект = СсылкаНаОбъект.ПолучитьОбъект(); + КонецЕсли; + + СозданныйОбъект.Дата = СвойстваПоиска["Дата"]; + + КонецЕсли; + + КонецЕсли; + + // создавать новый объект нужно не всегда + Если (СсылкаНаОбъект = Неопределено + ИЛИ СсылкаНаОбъект.Пустая()) + И СозданныйОбъект = Неопределено Тогда // объект не найден по полям поиска + + Если ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СвойствоУникальныйИдентификатор)); + СсылкаНаОбъектФиктивная = Истина; + + ИначеЕсли НЕ НеСоздаватьОбъектЕслиНеНайден Тогда + + СсылкаНаОбъект = СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, СозданныйОбъект, + НЕ РежимПоискаОсновногоОбъекта, ИзвестнаяСсылкаУникальногоИдентификатора, НппСсылки, НППГлобальнойСсылки, + НайтиПервоеПравилоПоСтруктуреСвойств(СтруктураСвойств), ПараметрыОбъекта, УстанавливатьУОбъектаВсеСвойстваПоиска); + + СвойстваОбъектаМодифицированы = Истина; + + КонецЕсли; + + ОбъектНайден = Ложь; + + Иначе + + // объект найден по полям поиска + ОбъектНайден = Истина; + + КонецЕсли; + + Если СсылкаНаОбъект <> Неопределено + И СсылкаНаОбъект.Пустая() Тогда + + СсылкаНаОбъект = Неопределено; + + КонецЕсли; + + ОбъектНайденПоПолямПоиска = ОбъектНайден; + + Возврат СсылкаНаОбъект; + +КонецФункции + +Процедура УстановитьСвойстваКоллекцииФайлаОбмена(КоллекцияФайлаОбмена, ИнформацияОТипах, ИмяВетки, ПараметрыОбъекта, НомерЗаписи) + + СтрокаКоллекции = КоллекцияФайлаОбмена.Добавить(); + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Свойство" ИЛИ + ИмяУзла = "ЗначениеПараметра" Тогда + + ЭтоПараметр = (ИмяУзла = "ЗначениеПараметра"); + + Имя = одАтрибут(ФайлОбмена, ТипСтрока, "Имя"); + + ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + + ЗначениеСвойства = ПрочитатьСвойство(ТипСвойства); + + Если ЭтоПараметр Тогда + + ДобавитьСложныйПараметрПриНеобходимости(ПараметрыОбъекта, ИмяВетки, НомерЗаписи, Имя, ЗначениеСвойства); + + Иначе + + СтрокаКоллекции[Имя] = ЗначениеСвойства; + + КонецЕсли; + + ИначеЕсли ИмяУзла = "СубконтоДт" ИЛИ ИмяУзла = "СубконтоКт" Тогда + + одПропустить(ФайлОбмена); + + ИначеЕсли (ИмяУзла = "Запись") И (ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + + Прервать; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Загружает табличную часть объекта +// +Процедура ЗагрузитьТабличнуюЧасть(Объект, ИмяТабличнойЧасти, ОбщаяИнформацияОТипеДокумента, НужноЗаписатьОбъект, ПараметрыОбъекта, ПКО) + + Перем КлючевыеПоляПоиска; + Перем МассивКлючевыхПолейПоиска; + + Результат = ПолучитьКлючевыеПоляПоискаПоТабличнойЧасти(ПКО, ИмяТабличнойЧасти, МассивКлючевыхПолейПоиска, КлючевыеПоляПоиска); + + Если Не Результат Тогда + одПропустить(ФайлОбмена); + Возврат; + КонецЕсли; + + ТабличнаяЧастьОбъекта = Объект[ИмяТабличнойЧасти]; + + ИмяКолонкиИтератора = "КлючевоеПолеИтератораЗначений"; + + КоллекцияОбъекта = ТабличнаяЧастьОбъекта.Выгрузить(); + КоллекцияФайлаОбмена = КоллекцияОбъекта.СкопироватьКолонки(); + + ЗаполнитьКоллекциюФайлаОбмена(КоллекцияФайлаОбмена, ИмяТабличнойЧасти, ОбщаяИнформацияОТипеДокумента, ПараметрыОбъекта, МассивКлючевыхПолейПоиска); + + ДобавитьИтераторТаблице(КоллекцияФайлаОбмена, +1, ИмяКолонкиИтератора); + ДобавитьИтераторТаблице(КоллекцияОбъекта, -1, ИмяКолонкиИтератора); + + КоллекцияГруппировки = ИнициализацияТаблицыПоКлючевымПолям(МассивКлючевыхПолейПоиска); + КоллекцияГруппировки.Колонки.Добавить(ИмяКолонкиИтератора); + + ЗаполнитьЗначенияСвойствТаблицы(КоллекцияФайлаОбмена, КоллекцияГруппировки); + ЗаполнитьЗначенияСвойствТаблицы(КоллекцияОбъекта, КоллекцияГруппировки); + + КоллекцияГруппировки.Свернуть(КлючевыеПоляПоиска, ИмяКолонкиИтератора); + + // очищаем табличную часть объекта + ТабличнаяЧастьОбъекта.Очистить(); + + Для Каждого СтрокаКоллекции ИЗ КоллекцияГруппировки Цикл + + // получаем структуру отбора + Отбор = Новый Структура(); + + Для Каждого ИмяПоля ИЗ МассивКлючевыхПолейПоиска Цикл + + Отбор.Вставить(ИмяПоля, СтрокаКоллекции[ИмяПоля]); + + КонецЦикла; + + Если СтрокаКоллекции[ИмяКолонкиИтератора] = 0 Тогда + + //заполняем строки табличной части из старой версии объекта + СтрокиКоллекцииОбъекта = КоллекцияОбъекта.НайтиСтроки(Отбор); + + Иначе + + // заполняем строки табличной части из коллекции файла обмена + СтрокиКоллекцииОбъекта = КоллекцияФайлаОбмена.НайтиСтроки(Отбор); + + КонецЕсли; + + // добавляем строки табличной части объекта + Для Каждого СтрокаКоллекции ИЗ СтрокиКоллекцииОбъекта Цикл + + ЗаполнитьЗначенияСвойств(ТабличнаяЧастьОбъекта.Добавить(), СтрокаКоллекции); + + КонецЦикла; + + НужноЗаписатьОбъект = Истина; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаполнитьЗначенияСвойствТаблицы(КоллекцияИсточник, КоллекцияПриемник) + + Для Каждого ЭлементКоллекции ИЗ КоллекцияИсточник Цикл + + ЗаполнитьЗначенияСвойств(КоллекцияПриемник.Добавить(), ЭлементКоллекции); + + КонецЦикла; + +КонецПроцедуры + +Функция ИнициализацияТаблицыПоКлючевымПолям(МассивКлючевыхПолейПоиска) + + Коллекция = Новый ТаблицаЗначений; + + Для Каждого ИмяПоля ИЗ МассивКлючевыхПолейПоиска Цикл + + Коллекция.Колонки.Добавить(ИмяПоля); + + КонецЦикла; + + Возврат Коллекция; + +КонецФункции + +Процедура ДобавитьИтераторТаблице(Коллекция, Значение, ИмяКолонкиИтератора) + + Коллекция.Колонки.Добавить(ИмяКолонкиИтератора); + Коллекция.ЗаполнитьЗначения(Значение, ИмяКолонкиИтератора); + +КонецПроцедуры + +Функция ПолучитьМассивИзСтроки(Знач СтрокаЭлементов) + + Результат = Новый Массив; + + СтрокаЭлементов = СтрокаЭлементов + ","; + + Пока Истина Цикл + + Поз = Найти(СтрокаЭлементов, ","); + + Если Поз = 0 Тогда + Прервать; // выход + КонецЕсли; + + Элемент = Лев(СтрокаЭлементов, Поз - 1); + + Результат.Добавить(СокрЛП(Элемент)); + + СтрокаЭлементов = Сред(СтрокаЭлементов, Поз + 1); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Процедура ЗаполнитьКоллекциюФайлаОбмена(КоллекцияФайлаОбмена, ИмяТабличнойЧасти, ОбщаяИнформацияОТипеДокумента, ПараметрыОбъекта, МассивКлючевыхПолейПоиска) + + ИмяВетки = ИмяТабличнойЧасти + "ТабличнаяЧасть"; + + Если ОбщаяИнформацияОТипеДокумента <> Неопределено Тогда + ИнформацияОТипах = ОбщаяИнформацияОТипеДокумента[ИмяВетки]; + Иначе + ИнформацияОТипах = Неопределено; + КонецЕсли; + + НомерЗаписи = 0; + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Запись" Тогда + + УстановитьСвойстваКоллекцииФайлаОбмена(КоллекцияФайлаОбмена, ИнформацияОТипах, ИмяВетки, ПараметрыОбъекта, НомерЗаписи); + + НомерЗаписи = НомерЗаписи + 1; + + ИначеЕсли (ИмяУзла = "ТабличнаяЧасть") И (ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьКлючевыеПоляПоискаПоТабличнойЧасти(ПКО, ИмяТабличнойЧасти, МассивКлючевыхПолейПоиска, КлючевыеПоляПоиска) + + Если ПКО = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + ДанныеПоискаПоТЧ = ПКО.ПоискПоТабличнымЧастям.Найти("ТабличнаяЧасть." + ИмяТабличнойЧасти, "ИмяЭлемента"); + + Если ДанныеПоискаПоТЧ = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Если Не ДанныеПоискаПоТЧ.Валидное Тогда + Возврат Ложь; + КонецЕсли; + + МассивКлючевыхПолейПоиска = ДанныеПоискаПоТЧ.МассивКлючевыхПолейПоиска; + КлючевыеПоляПоиска = ДанныеПоискаПоТЧ.КлючевыеПоляПоиска; + + Возврат Истина; + +КонецФункции + +// Загружает движения объекта +// +// Параметры: +// Объект - объект, движения которого загружаем +// Имя - имя регистра +// Очистить - если Истина, то движения предварительно очищается +// +Процедура ЗагрузитьДвижения(Объект, Имя, Очистить, ОбщаяИнформацияОТипеДокумента, НужноЗаписатьОбъект, + ПараметрыОбъекта, Правило) + + ИмяДвижений = Имя + "НаборЗаписей"; + Если ОбщаяИнформацияОТипеДокумента <> Неопределено Тогда + ИнформацияОТипах = ОбщаяИнформацияОТипеДокумента[ИмяДвижений]; + Иначе + ИнформацияОТипах = Неопределено; + КонецЕсли; + + ДанныеПоискаПоТЧ = Неопределено; + + КопияТЧДляПоиска = Неопределено; + + Движения = Объект.Движения[Имя]; + + Движения.Прочитать(); + + Если Очистить + И Движения.Количество() <> 0 Тогда + + НужноЗаписатьОбъект = Истина; + + Если ДанныеПоискаПоТЧ <> Неопределено Тогда + КопияТЧДляПоиска = Движения.Выгрузить(); + КонецЕсли; + + Движения.Очистить(); + + ИначеЕсли ДанныеПоискаПоТЧ <> Неопределено Тогда + + КопияТЧДляПоиска = Движения.Выгрузить(); + + КонецЕсли; + + НомерЗаписи = 0; + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Запись" Тогда + + Запись = Движения.Добавить(); + НужноЗаписатьОбъект = Истина; + УстановитьСвойстваЗаписи(Запись, ИнформацияОТипах, ПараметрыОбъекта, ИмяДвижений, НомерЗаписи, ДанныеПоискаПоТЧ, КопияТЧДляПоиска); + + НомерЗаписи = НомерЗаписи + 1; + + ИначеЕсли (ИмяУзла = "НаборЗаписей") И (ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Устанавливает свойства объекта (записи) +// +// Параметры: +// Запись - объект, свойства которого устанавливаем +// Например, строка табличной части или запись регистра +// +Процедура УстановитьСвойстваЗаписи(Запись, ИнформацияОТипах, + ПараметрыОбъекта, ИмяВетки, НомерЗаписи, + ДанныеПоискаПоТЧ = Неопределено, КопияТЧДляПоиска = Неопределено) + + НужноОрганизоватьПоискПоТЧ = (ДанныеПоискаПоТЧ <> Неопределено) + И (КопияТЧДляПоиска <> Неопределено) + И КопияТЧДляПоиска.Количество() <> 0; + + Если НужноОрганизоватьПоискПоТЧ Тогда + + СтруктураЧтенияСвойств = Новый Структура(); + СтруктураЧтенияСубконто = Новый Структура(); + + КонецЕсли; + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Свойство" + ИЛИ ИмяУзла = "ЗначениеПараметра" Тогда + + + ЭтоПараметр = (ИмяУзла = "ЗначениеПараметра"); + + Имя = одАтрибут(ФайлОбмена, ТипСтрока, "Имя"); + + Если Имя = "ВидДвижения" И Найти(Метаданные.НайтиПоТипу(ТипЗнч(Запись)).ПолноеИмя(), "РегистрНакопления") Тогда + + ТипСвойства = ТипВидДвиженияНакопления; + + Иначе + + ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + + КонецЕсли; + + ЗначениеСвойства = ПрочитатьСвойство(ТипСвойства); + + Если ЭтоПараметр Тогда + ДобавитьСложныйПараметрПриНеобходимости(ПараметрыОбъекта, ИмяВетки, НомерЗаписи, Имя, ЗначениеСвойства); + ИначеЕсли НужноОрганизоватьПоискПоТЧ Тогда + СтруктураЧтенияСвойств.Вставить(Имя, ЗначениеСвойства); + Иначе + Запись[Имя] = ЗначениеСвойства; + КонецЕсли; + + ИначеЕсли ИмяУзла = "СубконтоДт" ИЛИ ИмяУзла = "СубконтоКт" Тогда + + // поиск по субконто не реализован + + Ключ = Неопределено; + Значение = Неопределено; + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Свойство" Тогда + + Имя = одАтрибут(ФайлОбмена, ТипСтрока, "Имя"); + ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + + Если Имя = "Ключ" Тогда + + Ключ = ПрочитатьСвойство(ТипСвойства); + + ИначеЕсли Имя = "Значение" Тогда + + Значение = ПрочитатьСвойство(ТипСвойства); + + КонецЕсли; + + ИначеЕсли (ИмяУзла = "СубконтоДт" ИЛИ ИмяУзла = "СубконтоКт") И (ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + + Если Ключ <> Неопределено + И Значение <> Неопределено Тогда + + Если НЕ НужноОрганизоватьПоискПоТЧ Тогда + + Запись[ИмяУзла][Ключ] = Значение; + + Иначе + + СоответствиеЗаписи = Неопределено; + Если НЕ СтруктураЧтенияСубконто.Свойство(ИмяУзла, СоответствиеЗаписи) Тогда + СоответствиеЗаписи = Новый Соответствие; + СтруктураЧтенияСубконто.Вставить(ИмяУзла, СоответствиеЗаписи); + КонецЕсли; + + СоответствиеЗаписи.Вставить(Ключ, Значение); + + КонецЕсли; + + КонецЕсли; + + ИначеЕсли (ИмяУзла = "Запись") И (ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + + Если НужноОрганизоватьПоискПоТЧ Тогда + + СтруктураПоиска = Новый Структура(); + + Для Каждого ЭлементПоиска Из ДанныеПоискаПоТЧ.ПоляПоискаТЧ Цикл + + ЗначениеЭлемента = Неопределено; + СтруктураЧтенияСвойств.Свойство(ЭлементПоиска, ЗначениеЭлемента); + + СтруктураПоиска.Вставить(ЭлементПоиска, ЗначениеЭлемента); + + КонецЦикла; + + МассивРезультатовПоиска = КопияТЧДляПоиска.НайтиСтроки(СтруктураПоиска); + + НайденаЗапись = МассивРезультатовПоиска.Количество() > 0; + Если НайденаЗапись Тогда + ЗаполнитьЗначенияСвойств(Запись, МассивРезультатовПоиска[0]); + КонецЕсли; + + // поверх заполнение свойствами и значением субконто + Для Каждого Эл Из СтруктураЧтенияСвойств Цикл + + Запись[Эл.Ключ] = Эл.Значение; + + КонецЦикла; + + Для Каждого ЭлИмя Из СтруктураЧтенияСубконто Цикл + + Для Каждого ЭлКлюч Из ЭлИмя.Значение Цикл + + Запись[ЭлИмя.Ключ][ЭлКлюч.Ключ] = ЭлКлюч.Значение; + + КонецЦикла; + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры // УстановитьСвойстваЗаписи() + +// Загружает объект типа ОписаниеТипов из указанного xml-источника +// +// Параметры: +// Источник - xml-источник +// +Функция ЗагрузитьТипыОбъекта(Источник) + + // КвалификаторыДаты + + СоставДаты = одАтрибут(Источник, ТипСтрока, "СоставДаты"); + + + // КвалификаторыСтроки + + Длина = одАтрибут(Источник, ТипЧисло, "Длина"); + ДлинаДопустимая = одАтрибут(Источник, ТипСтрока, "ДопустимаяДлина"); + + + // КвалификаторыЧисла + + Разрядность = одАтрибут(Источник, ТипЧисло, "Разрядность"); + РазрядностьДробнойЧасти = одАтрибут(Источник, ТипЧисло, "РазрядностьДробнойЧасти"); + ЗнакДопустимый = одАтрибут(Источник, ТипСтрока, "ДопустимыйЗнак"); + + + // Читаем массив типов + + МассивТипов = Новый Массив; + + Пока Источник.Прочитать() Цикл + ИмяУзла = Источник.ЛокальноеИмя; + + Если ИмяУзла = "Тип" Тогда + МассивТипов.Добавить(Тип(одЗначениеЭлемента(Источник, ТипСтрока))); + ИначеЕсли (ИмяУзла = "Типы") И ( Источник.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Прервать; + Иначе + ЗаписатьВПротоколВыполнения(9); + Прервать; + КонецЕсли; + + КонецЦикла; + + + + Если МассивТипов.Количество() > 0 Тогда + + // КвалификаторыДаты + + Если СоставДаты = "Дата" Тогда + КвалификаторыДаты = Новый КвалификаторыДаты(ЧастиДаты.Дата); + ИначеЕсли СоставДаты = "ДатаВремя" Тогда + КвалификаторыДаты = Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя); + ИначеЕсли СоставДаты = "Время" Тогда + КвалификаторыДаты = Новый КвалификаторыДаты(ЧастиДаты.Время); + Иначе + КвалификаторыДаты = Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя); + КонецЕсли; + + + // КвалификаторыЧисла + + Если Разрядность > 0 Тогда + Если ЗнакДопустимый = "Неотрицательный" Тогда + Знак = ДопустимыйЗнак.Неотрицательный; + Иначе + Знак = ДопустимыйЗнак.Любой; + КонецЕсли; + КвалификаторыЧисла = Новый КвалификаторыЧисла(Разрядность, РазрядностьДробнойЧасти, Знак); + Иначе + КвалификаторыЧисла = Новый КвалификаторыЧисла(); + КонецЕсли; + + + // КвалификаторыСтроки + + Если Длина > 0 Тогда + Если ДлинаДопустимая = "Фиксированная" Тогда + ДлинаДопустимая = ДопустимаяДлина.Фиксированная; + Иначе + ДлинаДопустимая = ДопустимаяДлина.Переменная; + КонецЕсли; + КвалификаторыСтроки = Новый КвалификаторыСтроки(Длина, ДлинаДопустимая); + Иначе + КвалификаторыСтроки = Новый КвалификаторыСтроки(); + КонецЕсли; + + Возврат Новый ОписаниеТипов(МассивТипов, КвалификаторыЧисла, КвалификаторыСтроки, КвалификаторыДаты); + КонецЕсли; + + Возврат Неопределено; + +КонецФункции // ЗагрузитьТипыОбъекта() + +Процедура УстановитьПометкуУдаленияУОбъекта(Объект, ПометкаУдаления, ИмяТипаОбъекта) + + Если (ПометкаУдаления = Неопределено) + И (Объект.ПометкаУдаления <> Истина) Тогда + + Возврат; + + КонецЕсли; + + ПометкаДляУстановки = ?(ПометкаУдаления <> Неопределено, ПометкаУдаления, Ложь); + + УстановитьОбменДаннымиЗагрузка(Объект); + + // дли иерархических объектов пометку удаления только у конкретного объекта ставим + Если ИмяТипаОбъекта = "Справочник" + ИЛИ ИмяТипаОбъекта = "ПланВидовХарактеристик" + ИЛИ ИмяТипаОбъекта = "ПланСчетов" Тогда + + Объект.УстановитьПометкуУдаления(ПометкаДляУстановки, Ложь); + + Иначе + + Объект.УстановитьПометкуУдаления(ПометкаДляУстановки); + + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаписатьДокументВБезопасномРежиме(Документ, ТипОбъекта) + + Если Документ.Проведен Тогда + + Документ.Проведен = Ложь; + + КонецЕсли; + + ЗаписатьОбъектВИБ(Документ, ТипОбъекта); + +КонецПроцедуры + +Функция ПолучитьОбъектПоСсылкеИДопИнформации(СозданныйОбъект, Ссылка) + + // если объект создали, то работаем с ним, если нашли - получаем объект + Если СозданныйОбъект <> Неопределено Тогда + Объект = СозданныйОбъект; + Иначе + Если Ссылка.Пустая() Тогда + Объект = Неопределено; + Иначе + Объект = Ссылка.ПолучитьОбъект(); + КонецЕсли; + КонецЕсли; + + Возврат Объект; + +КонецФункции + +Процедура КомментарииКЗагрузкеОбъекта(Нпп, ИмяПравила, Источник, ТипОбъекта, ГНпп = 0) + + Если ФлагКомментироватьОбработкуОбъектов Тогда + + Если Нпп <> 0 Тогда + СтрокаСообщения = "Загрузка объекта № " + Нпп; + Иначе + СтрокаСообщения = "Загрузка объекта № " + ГНпп; + КонецЕсли; + + ЗП = ПолучитьСтруктуруЗаписиПротокола(); + + Если Не ПустаяСтрока(ИмяПравила) Тогда + + ЗП.ИмяПКО = ИмяПравила; + + КонецЕсли; + + Если Не ПустаяСтрока(Источник) Тогда + + ЗП.Источник = Источник; + + КонецЕсли; + + ЗП.ТипОбъекта = ТипОбъекта; + ЗаписатьВПротоколВыполнения(СтрокаСообщения, ЗП, Ложь); + + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьПараметрПриНеобходимости(ПараметрыДанных, ИмяПараметра, ЗначениеПараметра) + + Если ПараметрыДанных = Неопределено Тогда + ПараметрыДанных = Новый Соответствие; + КонецЕсли; + + ПараметрыДанных.Вставить(ИмяПараметра, ЗначениеПараметра); + +КонецПроцедуры + +Процедура ДобавитьСложныйПараметрПриНеобходимости(ПараметрыДанных, ИмяВеткиПараметров, НомерСтроки, ИмяПараметра, ЗначениеПараметра) + + Если ПараметрыДанных = Неопределено Тогда + ПараметрыДанных = Новый Соответствие; + КонецЕсли; + + ТекущиеДанныеПараметра = ПараметрыДанных[ИмяВеткиПараметров]; + + Если ТекущиеДанныеПараметра = Неопределено Тогда + + ТекущиеДанныеПараметра = Новый ТаблицаЗначений; + ТекущиеДанныеПараметра.Колонки.Добавить("НомерСтроки"); + ТекущиеДанныеПараметра.Колонки.Добавить("ИмяПараметра"); + ТекущиеДанныеПараметра.Индексы.Добавить("НомерСтроки"); + + ПараметрыДанных.Вставить(ИмяВеткиПараметров, ТекущиеДанныеПараметра); + + КонецЕсли; + + Если ТекущиеДанныеПараметра.Колонки.Найти(ИмяПараметра) = Неопределено Тогда + ТекущиеДанныеПараметра.Колонки.Добавить(ИмяПараметра); + КонецЕсли; + + ДанныеСтроки = ТекущиеДанныеПараметра.Найти(НомерСтроки, "НомерСтроки"); + Если ДанныеСтроки = Неопределено Тогда + ДанныеСтроки = ТекущиеДанныеПараметра.Добавить(); + ДанныеСтроки.НомерСтроки = НомерСтроки; + КонецЕсли; + + ДанныеСтроки[ИмяПараметра] = ЗначениеПараметра; + +КонецПроцедуры + +Функция ПрочитатьИнформациюОРегистрацииОбъекта() + + // присваиваем ПЕРЕКРЕСТНЫЕ значения переменным; РС симметричен + УникальныйИдентификаторПриемника = одАтрибут(ФайлОбмена, ТипСтрока, "УникальныйИдентификаторИсточника"); + УникальныйИдентификаторИсточника = одАтрибут(ФайлОбмена, ТипСтрока, "УникальныйИдентификаторПриемника"); + ТипПриемника = одАтрибут(ФайлОбмена, ТипСтрока, "ТипИсточника"); + ТипИсточника = одАтрибут(ФайлОбмена, ТипСтрока, "ТипПриемника"); + ПустойНабор = одАтрибут(ФайлОбмена, ТипБулево, "ПустойНабор"); + + Попытка + УникальныйИдентификаторИсточника = Новый УникальныйИдентификатор(УникальныйИдентификаторИсточника); + Исключение + + одПропустить(ФайлОбмена, "ИнформацияОРегистрацииОбъекта"); + Возврат Неопределено; + + КонецПопытки; + + // получаем структуру свойств источника по типу источника + СтруктураСвойств = Менеджеры[Тип(ТипИсточника)]; + + // получаем ссылку источника по GUID + УникальныйИдентификаторИсточника = СтруктураСвойств.Менеджер.ПолучитьСсылку(УникальныйИдентификаторИсточника); + + НаборЗаписей = МенеджерРегистраСоответствийОбъектов.СоздатьНаборЗаписей(); + + // отбор для набора записей + НаборЗаписей.Отбор.УзелИнформационнойБазы.Установить(УзелОбменаЗагрузкаДанных); + НаборЗаписей.Отбор.УникальныйИдентификаторИсточника.Установить(УникальныйИдентификаторИсточника); + НаборЗаписей.Отбор.УникальныйИдентификаторПриемника.Установить(УникальныйИдентификаторПриемника); + НаборЗаписей.Отбор.ТипИсточника.Установить(ТипИсточника); + НаборЗаписей.Отбор.ТипПриемника.Установить(ТипПриемника); + + Если Не ПустойНабор Тогда + + // добавляем одну запись в набор + СтрокаНабора = НаборЗаписей.Добавить(); + + СтрокаНабора.УзелИнформационнойБазы = УзелОбменаЗагрузкаДанных; + СтрокаНабора.УникальныйИдентификаторИсточника = УникальныйИдентификаторИсточника; + СтрокаНабора.УникальныйИдентификаторПриемника = УникальныйИдентификаторПриемника; + СтрокаНабора.ТипИсточника = ТипИсточника; + СтрокаНабора.ТипПриемника = ТипПриемника; + + КонецЕсли; + + // записываем набор записей + ЗаписатьОбъектВИБ(НаборЗаписей, "РегистрСведенийНаборЗаписей.СоответствиеОбъектовИнформационныхБаз"); + + одПропустить(ФайлОбмена, "ИнформацияОРегистрацииОбъекта"); + + Возврат НаборЗаписей; + +КонецФункции + +Функция ПрочитатьНаборЗаписейРегистра() + + Нпп = одАтрибут(ФайлОбмена, ТипЧисло, "Нпп"); + ИмяПравила = одАтрибут(ФайлОбмена, ТипСтрока, "ИмяПравила"); + ТипОбъектаСтрокой = одАтрибут(ФайлОбмена, ТипСтрока, "Тип"); + ПриоритетОбъектаОбмена = ПолучитьПриоритетОбъектаОбмена(ФайлОбмена); + + ЭтоПустойНабор = одАтрибут(ФайлОбмена, ТипБулево, "ПустойНабор"); + Если Не ЗначениеЗаполнено(ЭтоПустойНабор) Тогда + ЭтоПустойНабор = Ложь; + КонецЕсли; + + ТипОбъекта = Тип(ТипОбъектаСтрокой); + Источник = Неопределено; + СвойстваПоиска = Неопределено; + + КомментарииКЗагрузкеОбъекта(Нпп, ИмяПравила, Неопределено, ТипОбъекта); + + ИмяТипаСтрокиРегистра = СтрЗаменить(ТипОбъектаСтрокой, "РегистрСведенийНаборЗаписей.", "РегистрСведенийЗапись."); + ИмяРегистра = СтрЗаменить(ТипОбъектаСтрокой, "РегистрСведенийНаборЗаписей.", ""); + + ТипСтрокиНабораРегистра = Тип(ИмяТипаСтрокиРегистра); + + СтруктураСвойств = Менеджеры[ТипСтрокиНабораРегистра]; + ИмяТипаОбъекта = СтруктураСвойств.ИмяТипа; + + ИнформацияОТипах = СоответствиеТиповДанныхДляЗагрузки()[ТипСтрокиНабораРегистра]; + + Объект = Неопределено; + + Если Не ПустаяСтрока(ИмяПравила) Тогда + + Правило = Правила[ИмяПравила]; + ЕстьОбработчикПередЗагрузкой = Правило.ЕстьОбработчикПередЗагрузкой; + ЕстьОбработчикПриЗагрузке = Правило.ЕстьОбработчикПриЗагрузке; + ЕстьОбработчикПослеЗагрузки = Правило.ЕстьОбработчикПослеЗагрузки; + + Иначе + + ЕстьОбработчикПередЗагрузкой = Ложь; + ЕстьОбработчикПриЗагрузке = Ложь; + ЕстьОбработчикПослеЗагрузки = Ложь; + + КонецЕсли; + + + // Глобальный обработчик события ПередЗагрузкойОбъекта + + Если ЕстьГлобальныйОбработчикПередЗагрузкойОбъекта Тогда + + Отказ = Ложь; + + Попытка + + Выполнить(Конвертация.ПередЗагрузкойОбъекта); + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(53, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Неопределено, НСтр("ru = 'ПередЗагрузкойОбъекта (глобальный)'")); + + КонецПопытки; + + Если Отказ Тогда // Отказ от загрузки объекта + + одПропустить(ФайлОбмена, "Объект"); + Возврат Неопределено; + + КонецЕсли; + + КонецЕсли; + + + // Обработчик события ПередЗагрузкойОбъекта + Если ЕстьОбработчикПередЗагрузкой Тогда + + Отказ = Ложь; + + Попытка + + Выполнить(Правило.ПередЗагрузкой); + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(19, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Неопределено, "ПередЗагрузкойОбъекта"); + + КонецПопытки; + + + Если Отказ Тогда // Отказ от загрузки объекта + + одПропустить(ФайлОбмена, "Объект"); + Возврат Неопределено; + + КонецЕсли; + + КонецЕсли; + + РежимЧтенияОтбора = Ложь; + РежимЧтенияЗаписей = Ложь; + + ОтборРегистра = Неопределено; + ТекущаяСтрокаНабораЗаписей = Неопределено; + ПараметрыОбъекта = Неопределено; + ПараметрыНабораЗаписей = Неопределено; + НомерЗаписи = -1; + + НужноЗаписатьНаборЗаписей = Истина; + + + // читаем что там в регистре записано + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Отбор" Тогда + + Если ФайлОбмена.ТипУзла <> ТипУзлаXMLКонецЭлемента тогда + + Объект = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей(); + ОтборРегистра = Объект.Отбор; + + РежимЧтенияОтбора = Истина; + + КонецЕсли; + + ИначеЕсли ИмяУзла = "Свойство" + ИЛИ ИмяУзла = "ЗначениеПараметра" Тогда + + ЭтоПараметрДляОбъекта = (ИмяУзла = "ЗначениеПараметра"); + + Имя = одАтрибут(ФайлОбмена, ТипСтрока, "Имя"); + НеЗамещатьСвойство = одАтрибут(ФайлОбмена, ТипБулево, "НеЗамещать"); + + // читаем и устанавливаем значение свойства + ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + СвойствоНеНайденоПоСсылке = Ложь; + //Создавать нужно всегда + Значение = ПрочитатьСвойство(ТипСвойства, ЭтоПустойНабор, СвойствоНеНайденоПоСсылке); + //Значение = ПрочитатьСвойство(ТипСвойства, Ложь, СвойствоНеНайденоПоСсылке); + + Если ЭтоПустойНабор + И СвойствоНеНайденоПоСсылке Тогда + + НужноЗаписатьНаборЗаписей = Ложь; + + КонецЕсли; + + Если ЭтоПараметрДляОбъекта Тогда + + Если РежимЧтенияОтбора Тогда + ДобавитьПараметрПриНеобходимости(ПараметрыНабораЗаписей, Имя, Значение); + Иначе + // дополняем коллекцию параметров объекта + ДобавитьПараметрПриНеобходимости(ПараметрыОбъекта, Имя, Значение); + ДобавитьСложныйПараметрПриНеобходимости(ПараметрыНабораЗаписей, "Строки", НомерЗаписи, Имя, Значение); + КонецЕсли; + + Иначе + + Попытка + + Если РежимЧтенияОтбора Тогда + ОтборРегистра[Имя].Установить(Значение); + ИначеЕсли РежимЧтенияЗаписей Тогда + ТекущаяСтрокаНабораЗаписей[Имя] = Значение; + КонецЕсли; + + Исключение + + ЗП = ПолучитьСтруктуруЗаписиПротокола(26, ОписаниеОшибки()); + ЗП.ИмяПКО = ИмяПравила; + ЗП.Источник = Источник; + ЗП.Объект = Объект; + ЗП.ТипОбъекта = ТипОбъекта; + ЗП.Свойство = Имя; + ЗП.Значение = Значение; + ЗП.ТипЗначения = ТипЗнч(Значение); + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(26, ЗП, Истина); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + + КонецЕсли; + + ИначеЕсли ИмяУзла = "СтрокиНабораЗаписей" Тогда + + Если ФайлОбмена.ТипУзла <> ТипУзлаXMLКонецЭлемента Тогда + + // Обработчик события ПриЗагрузкеОбъекта + // срабатывает перед чтением первой записи в наборе + Если РежимЧтенияОтбора = Истина + И ЕстьОбработчикПриЗагрузке Тогда + + + НужноБылоЗаписатьОбъект = НужноЗаписатьНаборЗаписей; + ОбъектМодифицирован = Истина; + + Попытка + + Выполнить(Правило.ПриЗагрузке); + НужноЗаписатьНаборЗаписей = ОбъектМодифицирован ИЛИ НужноБылоЗаписатьОбъект; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Объект, "ПриЗагрузкеОбъекта"); + + КонецПопытки; + + КонецЕсли; + + РежимЧтенияОтбора = Ложь; + РежимЧтенияЗаписей = Истина; + + КонецЕсли; + + ИначеЕсли ИмяУзла = "Объект" Тогда + + Если ФайлОбмена.ТипУзла <> ТипУзлаXMLКонецЭлемента Тогда + + ТекущаяСтрокаНабораЗаписей = Объект.Добавить(); + НомерЗаписи = НомерЗаписи + 1; + + КонецЕсли; + + ИначеЕсли ИмяУзла = "НаборЗаписейРегистра" И ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента Тогда + + Прервать; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + + // после загрузки + Если ЕстьОбработчикПослеЗагрузки Тогда + + НужноБылоЗаписатьОбъект = НужноЗаписатьНаборЗаписей; + ОбъектМодифицирован = Истина; + + Попытка + + Выполнить(Правило.ПослеЗагрузки); + НужноЗаписатьНаборЗаписей = ОбъектМодифицирован ИЛИ НужноБылоЗаписатьОбъект; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(21, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Объект, "ПослеЗагрузкиОбъекта"); + + КонецПопытки; + + КонецЕсли; + + + Если НужноЗаписатьНаборЗаписей + И Объект <> Неопределено тогда + + ЕстьКоллизия = ПроверитьНаличиеКоллизийДляОбъекта(Объект, "РегистрСведений", ИмяРегистра, ПриоритетОбъектаОбмена); + + // в случае наличия коллизии новая версия объекта записывается только при условии, что + // приоритет ее записи ВЫШЕ, во всех остальных случаях версия не записывается + Если ЕстьКоллизия Тогда + + Если ПриоритетОбъектаОбмена = Перечисления.ПриоритетыОбъектовОбмена.ПриоритетПоступившегоПриОбменеОбъектаВыше Тогда + ЗаписатьОбъектВИБ(Объект, ТипОбъекта); + КонецЕсли; + + Иначе + + ЗаписатьОбъектВИБ(Объект, ТипОбъекта); + + КонецЕсли; + + КонецЕсли; + + Возврат Объект; + +КонецФункции + +Функция ПолучитьДанныеОбъектаСтрокой(Объект) + + СтроковоеПредставлениеОбъекта = ""; + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + + ЗаписатьXML(ЗаписьXML, Объект, НазначениеТипаXML.Явное); + + СтроковоеПредставлениеОбъекта = ЗаписьXML.Закрыть(); + + Возврат СтроковоеПредставлениеОбъекта; + +КонецФункции + +//функция проверяет наличие коллизий при загрузке +// и выдает информацию есть ли коллизия при обмене +Функция ПроверитьНаличиеКоллизийДляОбъекта(Объект, ИмяТипаОбъекта, ДополнительнаяИнформация = "", ПриоритетОбъектаОбмена) + + Попытка + ЕстьКоллизия = ПланыОбмена.ИзменениеЗарегистрировано(УзелОбменаЗагрузкаДанных, Объект); + Исключение + ЕстьКоллизия = Ложь; + КонецПопытки; + + // выполняем дополнительную проверку на изменение объекта + // если объект до коллизии и после коллизии не изменен, + // то считаем, что коллизии нет + Если ЕстьКоллизия Тогда + + СтрокаОбъектаДоИзменения = ПолучитьДанныеОбъектаСтрокойДоИзменения(Объект, ДополнительнаяИнформация, ИмяТипаОбъекта); + СтрокаОбъектаПослеИзменения = ПолучитьДанныеОбъектаСтрокойПослеИзменения(Объект, ИмяТипаОбъекта); + + // если значения совпадают, то коллизии нет + Если СтрокаОбъектаДоИзменения = СтрокаОбъектаПослеИзменения Тогда + + ЕстьКоллизия = Ложь; + + КонецЕсли; + + КонецЕсли; + + // при наличии коллизии делаем запись в ЖР + Если ЕстьКоллизия Тогда + + Если ПриоритетОбъектаОбмена = Перечисления.ПриоритетыОбъектовОбмена.ПриоритетПоступившегоПриОбменеОбъектаВыше Тогда + Комментарий = НСтр("ru = 'Возникла коллизия изменений. Объект заменен версией из файла сообщения: [Объект]'"); + Иначе + Комментарий = НСтр("ru = 'Возникла коллизия изменений. Объект не был изменен: [Объект]'"); + КонецЕсли; + + Комментарий = СтрЗаменить(Комментарий, "[Объект]", Строка(Объект)); + + ЗаписьЖурналаРегистрацииОбменДанными(Комментарий, УровеньЖурналаРегистрации.Предупреждение); + + КонецЕсли; + + Возврат ЕстьКоллизия + +КонецФункции + +Функция ПолучитьДанныеОбъектаСтрокойДоИзменения(Объект, ДополнительнаяИнформация, ИмяТипаОбъекта) + + // возвращаемое значение функции + СтрокаОбъекта = ""; + + Если ИмяТипаОбъекта = "Константы" Тогда + + // получаем значение константы из ИБ + СтрокаОбъекта = XMLСтрока(Константы[ДополнительнаяИнформация].Получить()); + + ИначеЕсли ИмяТипаОбъекта = "РегистрСведений" Тогда + + СтарыйНаборЗаписей = РегистрыСведений[ДополнительнаяИнформация].СоздатьНаборЗаписей(); + + Для Каждого ЗначениеОтбора Из Объект.Отбор Цикл + + Если ЗначениеОтбора.Использование = Ложь Тогда + Продолжить; + КонецЕсли; + + СтрокаОтбора = СтарыйНаборЗаписей.Отбор.Найти(ЗначениеОтбора.Имя); + СтрокаОтбора.Значение = ЗначениеОтбора.Значение; + СтрокаОтбора.Использование = Истина; + + КонецЦикла; + + СтарыйНаборЗаписей.Прочитать(); + + // получаем набор записей регистра из ИБ с отбором как у Объекта + СтрокаОбъекта = ПолучитьДанныеОбъектаСтрокой(СтарыйНаборЗаписей); + + Иначе + + Если ОбщегоНазначения.СсылкаСуществует(Объект.Ссылка) Тогда + + // получаем представление объекта из ИБ по ссылке + СтрокаОбъекта = ПолучитьДанныеОбъектаСтрокой(Объект.Ссылка.ПолучитьОбъект()); + + Иначе + + СтрокаОбъекта = "Объект удален"; + + КонецЕсли; + + КонецЕсли; + + Возврат СтрокаОбъекта; +КонецФункции + +Функция ПолучитьДанныеОбъектаСтрокойПослеИзменения(Объект, ИмяТипаОбъекта) + + // возвращаемое значение функции + СтрокаОбъекта = ""; + + Если ИмяТипаОбъекта = "Константы" Тогда + + СтрокаОбъекта = XMLСтрока(Объект.Значение); + + Иначе + + СтрокаОбъекта = ПолучитьДанныеОбъектаСтрокой(Объект); + + КонецЕсли; + + Возврат СтрокаОбъекта + +КонецФункции + +Процедура ДополнитьСтекНеЗаписанныхОбъектов(Нпп, ГНпп, Объект, ИзвестнаяСсылка, ТипОбъекта, ИмяТипа, АвтоматическиГенерироватьКод = Ложь, ПараметрыОбъекта = Неопределено) + + НомерДляСтека = ?(Нпп = 0, ГНпп, Нпп); + + СтрокаСтека = ГлобальныйСтекНеЗаписанныхОбъектов[НомерДляСтека]; + Если СтрокаСтека <> Неопределено Тогда + Возврат; + КонецЕсли; + + ГлобальныйСтекНеЗаписанныхОбъектов.Вставить(НомерДляСтека, Новый Структура("Объект, ИзвестнаяСсылка, ТипОбъекта, ИмяТипа, АвтоматическиГенерироватьКод, ПараметрыОбъекта", + Объект, ИзвестнаяСсылка, ТипОбъекта, ИмяТипа, АвтоматическиГенерироватьКод, ПараметрыОбъекта)); + +КонецПроцедуры + +Процедура УдалитьИзСтекаНеЗаписанныхОбъектов(Нпп, ГНпп) + + НомерДляСтека = ?(Нпп = 0, ГНпп, Нпп); + ГлобальныйСтекНеЗаписанныхОбъектов.Удалить(НомерДляСтека); + +КонецПроцедуры + +Процедура ПровестиЗаписьНеЗаписанныхОбъектов() + + Для Каждого СтрокаДанных Из ГлобальныйСтекНеЗаписанныхОбъектов Цикл + + // отложенная запись объектов + Объект = СтрокаДанных.Значение.Объект; + НппСсылки = СтрокаДанных.Ключ; + + Если СтрокаДанных.Значение.АвтоматическиГенерироватьКод = Истина Тогда + + НужноЗаписатьОбъект = Истина; + ПровестиГенерациюКодаНомераПриНеобходимости(Истина, Объект, + СтрокаДанных.Значение.ИмяТипа, НужноЗаписатьОбъект, Истина); + + КонецЕсли; + + ЗаписатьОбъектВИБ(Объект, СтрокаДанных.Значение.ТипОбъекта); + + КонецЦикла; + + ГлобальныйСтекНеЗаписанныхОбъектов.Очистить(); + +КонецПроцедуры + +Процедура ПровестиГенерациюКодаНомераПриНеобходимости(ГенерироватьНовыйНомерИлиКодЕслиНеУказан, Объект, ИмяТипаОбъекта, НужноЗаписатьОбъект, + РежимОбменДанными) + + Если Не ГенерироватьНовыйНомерИлиКодЕслиНеУказан + ИЛИ НЕ РежимОбменДанными Тогда + + // если номер не нужно генерировать, или не в режиме обмена данными то ничего не нужно делать... платформа сама все сгенерирует + Возврат; + КонецЕсли; + + // по типу документа смотрим заполнен кол или номер + Если ИмяТипаОбъекта = "Документ" + ИЛИ ИмяТипаОбъекта = "БизнесПроцесс" + ИЛИ ИмяТипаОбъекта = "Задача" Тогда + + Если НЕ ЗначениеЗаполнено(Объект.Номер) Тогда + + Объект.УстановитьНовыйНомер(); + НужноЗаписатьОбъект = Истина; + + КонецЕсли; + + ИначеЕсли ИмяТипаОбъекта = "Справочник" + ИЛИ ИмяТипаОбъекта = "ПланВидовХарактеристик" + ИЛИ ИмяТипаОбъекта = "ПланОбмена" Тогда + + Если НЕ ЗначениеЗаполнено(Объект.Код) Тогда + + Объект.УстановитьНовыйКод(); + НужноЗаписатьОбъект = Истина; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Функция ПолучитьПриоритетОбъектаОбмена(ФайлОбмена) + + СтрокаПриоритета = одАтрибут(ФайлОбмена, ТипСтрока, "ПриоритетОбъектаОбмена"); + Если ПустаяСтрока(СтрокаПриоритета) Тогда + ЗначениеПриоритета = Перечисления.ПриоритетыОбъектовОбмена.ПриоритетПоступившегоПриОбменеОбъектаВыше; + ИначеЕсли СтрокаПриоритета = "Выше" Тогда + ЗначениеПриоритета = Перечисления.ПриоритетыОбъектовОбмена.ПриоритетПоступившегоПриОбменеОбъектаВыше; + ИначеЕсли СтрокаПриоритета = "Ниже" Тогда + ЗначениеПриоритета = Перечисления.ПриоритетыОбъектовОбмена.ПриоритетПоступившегоПриОбменеОбъектаНиже; + ИначеЕсли СтрокаПриоритета = "Совпадает" Тогда + ЗначениеПриоритета = Перечисления.ПриоритетыОбъектовОбмена.ПриоритетПоступившегоПриОбменеОбъектаСовпадает; + КонецЕсли; + + Возврат ЗначениеПриоритета; + +КонецФункции + +// Читает очередной объект из файла обмена, производит загрузку +// +// Параметры: +// Нет. +// +Функция ПрочитатьОбъект(УникальныйИдентификаторСтрокой = "") + + Нпп = одАтрибут(ФайлОбмена, ТипЧисло, "Нпп"); + ГНпп = одАтрибут(ФайлОбмена, ТипЧисло, "ГНпп"); + Источник = одАтрибут(ФайлОбмена, ТипСтрока, "Источник"); + ИмяПравила = одАтрибут(ФайлОбмена, ТипСтрока, "ИмяПравила"); + НеЗамещатьОбъект = одАтрибут(ФайлОбмена, ТипБулево, "НеЗамещать"); + ПрефиксАвтонумерации = одАтрибут(ФайлОбмена, ТипСтрока, "ПрефиксАвтонумерации"); + ПриоритетОбъектаОбмена = ПолучитьПриоритетОбъектаОбмена(ФайлОбмена); + + ТипОбъектаСтрокой = одАтрибут(ФайлОбмена, ТипСтрока, "Тип"); + ТипОбъекта = Тип(ТипОбъектаСтрокой); + ИнформацияОТипах = СоответствиеТиповДанныхДляЗагрузки()[ТипОбъекта]; + + + КомментарииКЗагрузкеОбъекта(Нпп, ИмяПравила, Источник, ТипОбъекта, ГНпп); + + СтруктураСвойств = Менеджеры[ТипОбъекта]; + ИмяТипаОбъекта = СтруктураСвойств.ИмяТипа; + + + Если ИмяТипаОбъекта = "Документ" Тогда + + РежимЗаписи = одАтрибут(ФайлОбмена, ТипСтрока, "РежимЗаписи"); + РежимПроведения = одАтрибут(ФайлОбмена, ТипСтрока, "РежимПроведения"); + + КонецЕсли; + + + Объект = Неопределено; + ОбъектНайден = Истина; + ОбъектБылСозданВТекущейИнформационнойБазе = Неопределено; + + СвойстваПоиска = Новый Соответствие; + СвойстваПоискаНеЗамещать = Новый Соответствие; + + НужноЗаписатьОбъект = НЕ ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты; + + Если Не ПустаяСтрока(ИмяПравила) Тогда + + Правило = Правила[ИмяПравила]; + ЕстьОбработчикПередЗагрузкой = Правило.ЕстьОбработчикПередЗагрузкой; + ЕстьОбработчикПриЗагрузке = Правило.ЕстьОбработчикПриЗагрузке; + ЕстьОбработчикПослеЗагрузки = Правило.ЕстьОбработчикПослеЗагрузки; + ГенерироватьНовыйНомерИлиКодЕслиНеУказан = Правило.ГенерироватьНовыйНомерИлиКодЕслиНеУказан; + НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике = Правило.НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике; + + Иначе + + ЕстьОбработчикПередЗагрузкой = Ложь; + ЕстьОбработчикПриЗагрузке = Ложь; + ЕстьОбработчикПослеЗагрузки = Ложь; + ГенерироватьНовыйНомерИлиКодЕслиНеУказан = Ложь; + НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике = Ложь; + + КонецЕсли; + + + // Глобальный обработчик события ПередЗагрузкойОбъекта + + Если ЕстьГлобальныйОбработчикПередЗагрузкойОбъекта Тогда + + Отказ = Ложь; + + Попытка + + Выполнить(Конвертация.ПередЗагрузкойОбъекта); + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(53, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Неопределено, НСтр("ru = 'ПередЗагрузкойОбъекта (глобальный)'")); + + КонецПопытки; + + Если Отказ Тогда // Отказ от загрузки объекта + + одПропустить(ФайлОбмена, "Объект"); + Возврат Неопределено; + + КонецЕсли; + + КонецЕсли; + + + // Обработчик события ПередЗагрузкойОбъекта + Если ЕстьОбработчикПередЗагрузкой Тогда + + Отказ = Ложь; + + Попытка + + Выполнить(Правило.ПередЗагрузкой); + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(19, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Неопределено, "ПередЗагрузкойОбъекта"); + + КонецПопытки; + + Если Отказ Тогда // Отказ от загрузки объекта + + одПропустить(ФайлОбмена, "Объект"); + Возврат Неопределено; + + КонецЕсли; + + КонецЕсли; + + РежимРаботыСКонстантами = Ложь; + ИмяКонстанты = ""; + + СвойстваОбъектаМодифицированы = Ложь; + НППГлобальнойСсылки = 0; + НппСсылки = 0; + ПараметрыОбъекта = Неопределено; + + // флаг определяет был ли объект найден по полям поиска в режиме сопоставления объектов или нет; + // если флаг установлен, то в регистр сопоставления добавляется информация о сопоставлении GUID ссылки источника и приемника + ОбъектНайденПоПолямПоиска = Ложь; + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Свойство" + ИЛИ ИмяУзла = "ЗначениеПараметра" Тогда + + ЭтоПараметрДляОбъекта = (ИмяУзла = "ЗначениеПараметра"); + + Если Объект = Неопределено Тогда + + // объект не нашли и не создали - попробуем сейчас это сделать + ОбъектНайден = Ложь; + + // Обработчик события ПриЗагрузкеОбъекта + Если ЕстьОбработчикПриЗагрузке Тогда + + НужноБылоЗаписатьОбъект = НужноЗаписатьОбъект; + ОбъектМодифицирован = Истина; + + // если есть обработчик при загрузке, то объект нужно перезаписывать, так как могут быть изменения + Попытка + + Выполнить(Правило.ПриЗагрузке); + НужноЗаписатьОбъект = ОбъектМодифицирован ИЛИ НужноБылоЗаписатьОбъект; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Объект, "ПриЗагрузкеОбъекта"); + + КонецПопытки; + + КонецЕсли; + + // так м не смогли создать объект в событии - создаем его отдельно + Если Объект = Неопределено Тогда + + НужноЗаписатьОбъект = Истина; + + Если ИмяТипаОбъекта = "Константы" Тогда + + Объект = Неопределено; + РежимРаботыСКонстантами = Истина; + + Иначе + + СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, Объект, Ложь, , НппСсылки, НППГлобальнойСсылки, Правило, ПараметрыОбъекта); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + + Имя = одАтрибут(ФайлОбмена, ТипСтрока, "Имя"); + НеЗамещатьСвойство = одАтрибут(ФайлОбмена, ТипБулево, "НеЗамещать"); + + + Если РежимРаботыСКонстантами Тогда + + Объект = Константы[Имя].СоздатьМенеджерЗначения(); + ИмяКонстанты = Имя; + Имя = "Значение"; + НужноЗаписатьОбъект = Истина; + + ИначеЕсли НЕ ЭтоПараметрДляОбъекта + И ((ОбъектНайден И НеЗамещатьСвойство) + ИЛИ (Имя = "ЭтоГруппа") + ИЛИ (Объект[Имя] = NULL)) Тогда + + // неизвестное свойство + одПропустить(ФайлОбмена, ИмяУзла); + Продолжить; + + КонецЕсли; + + + // читаем и устанавливаем значение свойства + ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + Значение = ПрочитатьСвойство(ТипСвойства); + + Если ЭтоПараметрДляОбъекта Тогда + + // дополняем коллекцию параметров объекта + ДобавитьПараметрПриНеобходимости(ПараметрыОбъекта, Имя, Значение); + + Иначе + + Попытка + + Если Не НужноЗаписатьОбъект Тогда + + НужноЗаписатьОбъект = (Объект[Имя] <> Значение); + + Конецесли; + + Объект[Имя] = Значение; + + Исключение + + ЗП = ПолучитьСтруктуруЗаписиПротокола(26, ОписаниеОшибки()); + ЗП.ИмяПКО = ИмяПравила; + ЗП.Нпп = Нпп; + ЗП.ГНпп = ГНпп; + ЗП.Источник = Источник; + ЗП.Объект = Объект; + ЗП.ТипОбъекта = ТипОбъекта; + ЗП.Свойство = Имя; + ЗП.Значение = Значение; + ЗП.ТипЗначения = ТипЗнч(Значение); + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(26, ЗП, Истина); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + + КонецЕсли; + + ИначеЕсли ИмяУзла = "Ссылка" Тогда + + // ссылка на элемент - сначала получаем по ссылке объект, а потом устанавливаем свойства + СозданныйОбъект = Неопределено; + НеСоздаватьОбъектЕслиНеНайден = Неопределено; + ИзвестнаяСсылкаУникальногоИдентификатора = Неопределено; + НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике = Ложь; + РегистрироватьОбъектНаУзлеОтправителе = Ложь; + + Ссылка = НайтиОбъектПоСсылке(ТипОбъекта, + СвойстваПоиска, + СвойстваПоискаНеЗамещать, + ОбъектНайден, + СозданныйОбъект, + НеСоздаватьОбъектЕслиНеНайден, + Истина, + СвойстваОбъектаМодифицированы, + НППГлобальнойСсылки, + НппСсылки, + ОбъектНайденПоПолямПоиска, + ИзвестнаяСсылкаУникальногоИдентификатора, + Истина, + ПараметрыОбъекта, + НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике, + ОбъектБылСозданВТекущейИнформационнойБазе, + РегистрироватьОбъектНаУзлеОтправителе, + УникальныйИдентификаторСтрокой); + + НужноЗаписатьОбъект = НужноЗаписатьОбъект ИЛИ СвойстваОбъектаМодифицированы; + + Если ИмяТипаОбъекта = "Перечисление" Тогда + + Объект = Ссылка; + + Иначе + + Объект = ПолучитьОбъектПоСсылкеИДопИнформации(СозданныйОбъект, Ссылка); + + Если Объект = Неопределено Тогда + + одПропустить(ФайлОбмена, "Объект"); + Прервать; + + КонецЕсли; + + Если Ссылка = Неопределено Тогда + + ДополнитьСтекНеЗаписанныхОбъектов(Нпп, ГНпп, СозданныйОбъект, ИзвестнаяСсылкаУникальногоИдентификатора, ТипОбъекта, + ИмяТипаОбъекта, Правило.ГенерироватьНовыйНомерИлиКодЕслиНеУказан, ПараметрыОбъекта); + + КонецЕсли; + + КонецЕсли; + + // Обработчик события ПриЗагрузкеОбъекта + Если ЕстьОбработчикПриЗагрузке Тогда + + НужноБылоЗаписатьОбъект = НужноЗаписатьОбъект; + ОбъектМодифицирован = Истина; + + Попытка + + Выполнить(Правило.ПриЗагрузке); + НужноЗаписатьОбъект = ОбъектМодифицирован ИЛИ НужноБылоЗаписатьОбъект; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Объект, "ПриЗагрузкеОбъекта"); + + КонецПопытки; + + КонецЕсли; + + // устанавливаем признак для выборочной регистрации объекта на узле-отправителе + Объект.ДополнительныеСвойства.Вставить("РегистрироватьОбъектНаУзлеОтправителе", РегистрироватьОбъектНаУзлеОтправителе); + + ИначеЕсли ИмяУзла = "ТабличнаяЧасть" + ИЛИ ИмяУзла = "НаборЗаписей" Тогда + // + + Если РежимЗагрузкиДанныхВТаблицуЗначений() Тогда + одПропустить(ФайлОбмена, ИмяУзла); + Продолжить; + КонецЕсли; + + Если Объект = Неопределено Тогда + + ОбъектНайден = Ложь; + + // Обработчик события ПриЗагрузкеОбъекта + + Если ЕстьОбработчикПриЗагрузке Тогда + + НужноБылоЗаписатьОбъект = НужноЗаписатьОбъект; + ОбъектМодифицирован = Истина; + + Попытка + + Выполнить(Правило.ПриЗагрузке); + НужноЗаписатьОбъект = ОбъектМодифицирован ИЛИ НужноБылоЗаписатьОбъект; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Объект, "ПриЗагрузкеОбъекта"); + + КонецПопытки; + + КонецЕсли; + + КонецЕсли; + + + Имя = одАтрибут(ФайлОбмена, ТипСтрока, "Имя"); + НеЗамещатьСвойство = одАтрибут(ФайлОбмена, ТипБулево, "НеЗамещать"); + НеОчищать = одАтрибут(ФайлОбмена, ТипБулево, "НеОчищать"); + + Если ОбъектНайден И НеЗамещатьСвойство Тогда + + одПропустить(ФайлОбмена, ИмяУзла); + Продолжить; + + КонецЕсли; + + Если Объект = Неопределено Тогда + + СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, Объект, Ложь, , НппСсылки, НППГлобальнойСсылки, Правило, ПараметрыОбъекта); + НужноЗаписатьОбъект = Истина; + + КонецЕсли; + + Если ИмяУзла = "ТабличнаяЧасть" Тогда + + // загрузка элементов из табличной части + ЗагрузитьТабличнуюЧасть(Объект, Имя, ИнформацияОТипах, НужноЗаписатьОбъект, ПараметрыОбъекта, Правило); + + ИначеЕсли ИмяУзла = "НаборЗаписей" Тогда + + // загрузка движений + ЗагрузитьДвижения(Объект, Имя, Не НеОчищать, ИнформацияОТипах, НужноЗаписатьОбъект, ПараметрыОбъекта, Правило); + + КонецЕсли; + + ИначеЕсли (ИмяУзла = "Объект") И (ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Отказ = Ложь; + + // Глобальный обработчик события ПослеЗагрузкиОбъекта + Если ЕстьГлобальныйОбработчикПослеЗагрузкиОбъекта Тогда + + НужноБылоЗаписатьОбъект = НужноЗаписатьОбъект; + ОбъектМодифицирован = Истина; + + Попытка + + Выполнить(Конвертация.ПослеЗагрузкиОбъекта); + НужноЗаписатьОбъект = ОбъектМодифицирован ИЛИ НужноБылоЗаписатьОбъект; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(54, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Объект, НСтр("ru = 'ПослеЗагрузкиОбъекта (глобальный)'")); + + КонецПопытки; + + КонецЕсли; + + + // Обработчик события ПослеЗагрузкиОбъекта + Если ЕстьОбработчикПослеЗагрузки Тогда + + НужноБылоЗаписатьОбъект = НужноЗаписатьОбъект; + ОбъектМодифицирован = Истина; + + Попытка + + Выполнить(Правило.ПослеЗагрузки); + НужноЗаписатьОбъект = ОбъектМодифицирован ИЛИ НужноБылоЗаписатьОбъект; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(21, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Объект, "ПослеЗагрузкиОбъекта"); + + КонецПопытки; + + КонецЕсли; + + Если Отказ Тогда + УдалитьИзСтекаНеЗаписанныхОбъектов(Нпп, ГНпп); + Возврат Неопределено; + КонецЕсли; + + Если ИмяТипаОбъекта = "Документ" Тогда + + Если РежимЗаписи = "Проведение" Тогда + + РежимЗаписи = РежимЗаписиДокумента.Проведение; + + ИначеЕсли РежимЗаписи = "ОтменаПроведения" Тогда + + РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения; + + Иначе + + // определим как записывать документ + Если Объект.Проведен Тогда + + РежимЗаписи = РежимЗаписиДокумента.Проведение; + + Иначе + + // а документ вообще может проводиться или нет + ДокументМожетПроводиться = (Объект.Метаданные().Проведение = РазрешитьПроведениеДокумента); + + Если ДокументМожетПроводиться Тогда + РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения; + Иначе + РежимЗаписи = РежимЗаписиДокумента.Запись; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + РежимПроведения = ?(РежимПроведения = "Оперативный", РежимПроведенияДокумента.Оперативный, РежимПроведенияДокумента.Неоперативный); + + // если хотим провести документ, помеченный на удаление, то пометку удаления снимаем ... + Если Объект.ПометкаУдаления + И (РежимЗаписи = РежимЗаписиДокумента.Проведение) Тогда + + Объект.ПометкаУдаления = Ложь; + НужноЗаписатьОбъект = Истина; + + КонецЕсли; + + ПровестиГенерациюКодаНомераПриНеобходимости(ГенерироватьНовыйНомерИлиКодЕслиНеУказан, Объект, + ИмяТипаОбъекта, НужноЗаписатьОбъект, Истина); + + Если РежимЗагрузкиДанныхВИнформационнуюБазу() Тогда + + Попытка + + // просто записываем документ. информацию о необходимости его провести или отменить проведение отдельно фиксируем + Если НужноЗаписатьОбъект Тогда + + // записываем документ - проверяем наличие коллизий + ЕстьКоллизия = ПроверитьНаличиеКоллизийДляОбъекта(Объект, ТипОбъекта, ИмяКонстанты, ПриоритетОбъектаОбмена); + + Если ЕстьКоллизия + И ПриоритетОбъектаОбмена <> Перечисления.ПриоритетыОбъектовОбмена.ПриоритетПоступившегоПриОбменеОбъектаВыше Тогда + + НужноЗаписатьОбъект = Ложь; + + КонецЕсли; + + Если НужноЗаписатьОбъект Тогда + + // документы которые просто нужно записать - так и записываем + Если РежимЗаписи = РежимЗаписиДокумента.Запись Тогда + + ЗаписатьОбъектВИБ(Объект, ТипОбъекта); + + ИначеЕсли РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения + ИЛИ РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда + + // проведение убираем всегда... + ОтменитьПроведениеОбъектаВИБ(Объект, ТипОбъекта); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Если НужноЗаписатьОбъект Тогда + + // документы, требующие проведения, записываем в очередь + Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда + + // если документ был успешно записан и создана ссылка, то помещаем в очередь для проведения + Если Объект <> Неопределено + И Объект.Ссылка <> Неопределено Тогда + + СтрокаТаблицы = ДокументыДляОтложенногоПроведения.Добавить(); + СтрокаТаблицы.ДокументОбъект = Объект; + СтрокаТаблицы.ДокументСсылка = Объект.Ссылка; + СтрокаТаблицы.ДатаДокумента = Объект.Дата; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Исключение + + СтрокаОписанияОшибки = ОписаниеОшибки(); + + Если НужноЗаписатьОбъект Тогда + // не смогли выполнить необходимые действия для документа + ЗаписатьДокументВБезопасномРежиме(Объект, ТипОбъекта); + КонецЕсли; + + ЗП = ПолучитьСтруктуруЗаписиПротокола(25, СтрокаОписанияОшибки); + ЗП.ИмяПКО = ИмяПравила; + + Если Не ПустаяСтрока(Источник) Тогда + + ЗП.Источник = Источник; + + КонецЕсли; + + ЗП.ТипОбъекта = ТипОбъекта; + ЗП.Объект = Строка(Объект); + ЗаписатьВПротоколВыполнения(25, ЗП); + + СтрокаСообщения = НСтр("ru = 'Ошибка при записи документа: [Объект]. Описание ошибки: [СтрокаОписанияОшибки]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[Объект]", Строка(Объект)); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[СтрокаОписанияОшибки]", СтрокаОписанияОшибки); + + // объект не смогли в нормальном режиме записать - надо об этом сообщить + ВызватьИсключение СтрокаСообщения; + + КонецПопытки; + + УдалитьИзСтекаНеЗаписанныхОбъектов(Нпп, ГНпп); + + КонецЕсли; + + ИначеЕсли ИмяТипаОбъекта <> "Перечисление" Тогда + + Если ИмяТипаОбъекта = "РегистрСведений" Тогда + + Периодический = СтруктураСвойств.Периодический; + + Если Периодический Тогда + + Если Не ЗначениеЗаполнено(Объект.Период) Тогда + УстановитьТекущуюДатуРеквизиту(Объект.Период); + НужноЗаписатьОбъект = Истина; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + ПровестиГенерациюКодаНомераПриНеобходимости(ГенерироватьНовыйНомерИлиКодЕслиНеУказан, Объект, + ИмяТипаОбъекта, НужноЗаписатьОбъект, Истина); + + Если РежимЗагрузкиДанныхВИнформационнуюБазу() Тогда + + Если НужноЗаписатьОбъект Тогда + + // если объект подлежит записи - проверим наличие коллизий + ЕстьКоллизия = ПроверитьНаличиеКоллизийДляОбъекта(Объект, ИмяТипаОбъекта, ИмяКонстанты, ПриоритетОбъектаОбмена); + + Если ЕстьКоллизия + И ПриоритетОбъектаОбмена <> Перечисления.ПриоритетыОбъектовОбмена.ПриоритетПоступившегоПриОбменеОбъектаВыше Тогда + + НужноЗаписатьОбъект = Ложь; + + КонецЕсли; + + Если НужноЗаписатьОбъект Тогда + ЗаписатьОбъектВИБ(Объект, ТипОбъекта); + КонецЕсли; + + КонецЕсли; + + Если НЕ (ИмяТипаОбъекта = "РегистрСведений" + ИЛИ ИмяТипаОбъекта = "Константы") Тогда + + УдалитьИзСтекаНеЗаписанныхОбъектов(Нпп, ГНпп); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + ЭтоСсылочныйТипОбъекта = НЕ(ИмяТипаОбъекта = "РегистрСведений" + ИЛИ ИмяТипаОбъекта = "Константы"); + + Прервать; + + ИначеЕсли ИмяУзла = "НаборЗаписейПоследовательности" Тогда + + одПропустить(ФайлОбмена); + + ИначеЕсли ИмяУзла = "Типы" Тогда + + Если Объект = Неопределено Тогда + + ОбъектНайден = Ложь; + Ссылка = СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, Объект, , , НппСсылки, НППГлобальнойСсылки, Правило, ПараметрыОбъекта); + + КонецЕсли; + + ОписаниеТиповОбъекта = ЗагрузитьТипыОбъекта(ФайлОбмена); + + Если ОписаниеТиповОбъекта <> Неопределено Тогда + + Объект.ТипЗначения = ОписаниеТиповОбъекта; + + КонецЕсли; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + + Возврат Объект; + +КонецФункции // ПрочитатьОбъект() + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ВЫГРУЗКИ ДАННЫХ ПО ПРАВИЛАМ ОБМЕНА + +Функция ПолучитьНаборДвиженийДокумента(СсылкаНаДокумент, ВидИсточника, ИмяРегистра) + + Если ВидИсточника = "НаборДвиженийРегистраНакопления" Тогда + + НаборДвиженийДокумента = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей(); + + ИначеЕсли ВидИсточника = "НаборДвиженийРегистраСведений" Тогда + + НаборДвиженийДокумента = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей(); + + ИначеЕсли ВидИсточника = "НаборДвиженийРегистраБухгалтерии" Тогда + + НаборДвиженийДокумента = РегистрыБухгалтерии[ИмяРегистра].СоздатьНаборЗаписей(); + + ИначеЕсли ВидИсточника = "НаборДвиженийРегистраРасчета" Тогда + + НаборДвиженийДокумента = РегистрыРасчета[ИмяРегистра].СоздатьНаборЗаписей(); + + Иначе + + Возврат Неопределено; + + КонецЕсли; + + НаборДвиженийДокумента.Отбор.Регистратор.Установить(СсылкаНаДокумент.Ссылка); + НаборДвиженийДокумента.Прочитать(); + + Возврат НаборДвиженийДокумента; + +КонецФункции + +// Формирует узлы свойств объекта приемника в соответствии с указанной коллекцией правил конвертации свойств +// +// Параметры: +// Источник - произвольный источник данных +// Приемник - xml-узел объекта приемника +// ВходящиеДанные - произвольные вспомогательные данные, передаваемые правилу +// для выполнения конвертации +// ИсходящиеДанные - произвольные вспомогательные данные, передаваемые правилам +// конвертации объектов свойств +// ПКО - ссылка на правило конвертации объектов (родитель коллекции правил конвертации свойств) +// ПКГС - ссылка на правило конвертации группы свойств +// УзелКоллекцииСвойств - xml-узел коллекции свойств +// +Процедура ВыгрузитьГруппуСвойств(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКГС, УзелКоллекцииСвойств, ВыгрузитьТолькоСсылку) + + + КоллекцияОбъектов = Неопределено; + НеЗамещать = ПКГС.НеЗамещать; + НеОчищать = Ложь; + + + // Обработчик ПередОбработкойВыгрузки + + Если ПКГС.ЕстьОбработчикПередОбработкойВыгрузки Тогда + + Отказ = Ложь; + Попытка + + Выполнить(ПКГС.ПередОбработкойВыгрузки); + + Исключение + + ЗП = ПолучитьСтруктуруЗаписиПротокола(48, ОписаниеОшибки()); + ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; + ЗП.ПКГС = ПКГС.Имя + " (" + ПКГС.Наименование + ")"; + + Попытка + ЗП.Объект = Строка(Источник) + " (" + ТипЗнч(Источник) + ")"; + Исключение + ЗП.Объект = "(" + ТипЗнч(Источник) + ")"; + КонецПопытки; + + ЗП.Обработчик = "ПередОбработкойВыгрузкиГруппыСвойств"; + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(48, ЗП); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + + Если Отказ Тогда // Отказ от обработки группы свойств + + Возврат; + + КонецЕсли; + + КонецЕсли; + + + ВидПриемника = ПКГС.ВидПриемника; + ВидИсточника = ПКГС.ВидИсточника; + + + // Создание узла коллекции подчиненных объектов + СтруктураУзлаСвойств = Неопределено; + УзелКоллекцииОбъектов = Неопределено; + + Если ВидПриемника = "ТабличнаяЧасть" Тогда + + СоздатьОбъектыДляЗаписиДанныхВXML(СтруктураУзлаСвойств, УзелКоллекцииОбъектов, ИСТИНА, ПКГС.Приемник, "ТабличнаяЧасть"); + + Если НеЗамещать Тогда + + ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелКоллекцииОбъектов, "НеЗамещать", "true"); + + КонецЕсли; + + Если НеОчищать Тогда + + ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелКоллекцииОбъектов, "НеОчищать", "true"); + + КонецЕсли; + + ИначеЕсли ВидПриемника = "ПодчиненныйСправочник" Тогда + + + ИначеЕсли ВидПриемника = "НаборЗаписейПоследовательности" Тогда + + СоздатьОбъектыДляЗаписиДанныхВXML(СтруктураУзлаСвойств, УзелКоллекцииОбъектов, ИСТИНА, ПКГС.Приемник, "НаборЗаписей"); + + ИначеЕсли Найти(ВидПриемника, "НаборДвижений") > 0 Тогда + + СоздатьОбъектыДляЗаписиДанныхВXML(СтруктураУзлаСвойств, УзелКоллекцииОбъектов, ИСТИНА, ПКГС.Приемник, "НаборЗаписей"); + + Если НеЗамещать Тогда + + ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелКоллекцииОбъектов, "НеЗамещать", "true"); + + КонецЕсли; + + Если НеОчищать Тогда + + ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелКоллекцииОбъектов, "НеОчищать", "true"); + + КонецЕсли; + + Иначе // это простая группировка + + ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКГС.ПравилаГруппы, + УзелКоллекцииСвойств, , , ПКО.НеВыгружатьОбъектыСвойствПоСсылкам ИЛИ ВыгрузитьТолькоСсылку, Ложь); + + Если ПКГС.ЕстьОбработчикПослеОбработкиВыгрузки Тогда + + Попытка + + Выполнить(ПКГС.ПослеОбработкиВыгрузки); + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(49); + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + + КонецЕсли; + + Возврат; + + КонецЕсли; + + + // Получение коллекции подчиненных объектов + + Если КоллекцияОбъектов <> Неопределено Тогда + + // Инициализировали коллекцию в обработчике ПередОбработкой + + ИначеЕсли ПКГС.ПолучитьИзВходящихДанных Тогда + + Попытка + + КоллекцияОбъектов = ВходящиеДанные[ПКГС.Приемник]; + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(66); + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + Возврат; + + КонецПопытки; + + ИначеЕсли ВидИсточника = "ТабличнаяЧасть" Тогда + + КоллекцияОбъектов = Источник[ПКГС.Источник]; + + ИначеЕсли ВидИсточника = "ПодчиненныйСправочник" Тогда + + ИначеЕсли Найти(ВидИсточника, "НаборДвижений") > 0 Тогда + + КоллекцияОбъектов = ПолучитьНаборДвиженийДокумента(Источник, ВидИсточника, ПКГС.Источник); + + ИначеЕсли ПустаяСтрока(ПКГС.Источник) Тогда + + КоллекцияОбъектов = Источник[ПКГС.Приемник]; + + КонецЕсли; + + + Для каждого ОбъектКоллекции Из КоллекцияОбъектов Цикл + + + // Обработчик ПередВыгрузкой + Если ПКГС.ЕстьОбработчикПередВыгрузкой Тогда + + Отказ = Ложь; + + Попытка + + Выполнить(ПКГС.ПередВыгрузкой); + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(50); + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + Прервать; + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки подчиненного объекта + + Продолжить; + + КонецЕсли; + + КонецЕсли; + + + // Обработчик ПриВыгрузке + + Если ПКГС.НуженУзелXMLПриВыгрузке Тогда + УзелОбъектаКоллекции = СоздатьУзел("Запись"); + Иначе + УзелКоллекцииОбъектов.ЗаписатьНачалоЭлемента("Запись"); + УзелОбъектаКоллекции = УзелКоллекцииОбъектов; + КонецЕсли; + + СтандартнаяОбработка = Истина; + + Если ПКГС.ЕстьОбработчикПриВыгрузке Тогда + + Попытка + + Выполнить(ПКГС.ПриВыгрузке); + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(51); + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + Прервать; + + КонецПопытки; + + КонецЕсли; + + + // Выгрузка свойств объекта коллекции + Если СтандартнаяОбработка Тогда + + Если ПКГС.ПравилаГруппы.Количество() > 0 Тогда + + ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКГС.ПравилаГруппы, + УзелОбъектаКоллекции, ОбъектКоллекции, , ПКО.НеВыгружатьОбъектыСвойствПоСсылкам ИЛИ ВыгрузитьТолькоСсылку, Ложь); + + КонецЕсли; + + КонецЕсли; + + + // Обработчик ПослеВыгрузки + Если ПКГС.ЕстьОбработчикПослеВыгрузки Тогда + + Отказ = Ложь; + + Попытка + + Выполнить(ПКГС.ПослеВыгрузки); + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(52); + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + Прервать; + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки подчиненного объекта + + Продолжить; + + КонецЕсли; + + КонецЕсли; + + Если ПКГС.НуженУзелXMLПриВыгрузке Тогда + ДобавитьПодчиненный(УзелКоллекцииОбъектов, УзелОбъектаКоллекции); + Иначе + УзелКоллекцииОбъектов.ЗаписатьКонецЭлемента(); + КонецЕсли; + + КонецЦикла; + + // Обработчик ПослеОбработкиВыгрузки + Если ПКГС.ЕстьОбработчикПослеОбработкиВыгрузки Тогда + + Отказ = Ложь; + + Попытка + + Выполнить(ПКГС.ПослеОбработкиВыгрузки); + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(49); + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + + Если Отказ Тогда // Отказ от записи коллекции подчиненных объектов + + Возврат; + + КонецЕсли; + + КонецЕсли; + + ПроизвестиЗаписьДанныхВГоловнойУзел(УзелКоллекцииСвойств, СтруктураУзлаСвойств, УзелКоллекцииОбъектов); + +КонецПроцедуры + +Процедура ПолучитьЗначениеСвойства(Значение, ОбъектКоллекции, ПКО, ПКС, ВходящиеДанные, Источник, ВыборкаДанных = Неопределено) + + Если Значение <> Неопределено Тогда + Возврат; + КонецЕсли; + + Если ПКС.ПолучитьИзВходящихДанных Тогда + + ОбъектДляПолученияДанных = ВходящиеДанные; + + Если Не ПустаяСтрока(ПКС.Приемник) Тогда + + ИмяСвойства = ПКС.Приемник; + + Иначе + + ИмяСвойства = ПКС.ИмяПараметраДляПередачи; + + КонецЕсли; + + КодОшибки = ?(ОбъектКоллекции <> Неопределено, 67, 68); + + ИначеЕсли ОбъектКоллекции <> Неопределено Тогда + + ОбъектДляПолученияДанных = ОбъектКоллекции; + + Если Не ПустаяСтрока(ПКС.Источник) Тогда + + ИмяСвойства = ПКС.Источник; + КодОшибки = 16; + + Иначе + + ИмяСвойства = ПКС.Приемник; + КодОшибки = 17; + + КонецЕсли; + + ИначеЕсли ВыборкаДанных <> Неопределено Тогда + + ОбъектДляПолученияДанных = ВыборкаДанных; + + Если Не ПустаяСтрока(ПКС.Источник) Тогда + + ИмяСвойства = ПКС.Источник; + КодОшибки = 13; + + Иначе + + Возврат; + + КонецЕсли; + + Иначе + + ОбъектДляПолученияДанных = Источник; + + Если Не ПустаяСтрока(ПКС.Источник) Тогда + + ИмяСвойства = ПКС.Источник; + КодОшибки = 13; + + Иначе + + ИмяСвойства = ПКС.Приемник; + КодОшибки = 14; + + КонецЕсли; + + КонецЕсли; + + + Попытка + + Значение = ОбъектДляПолученияДанных[ИмяСвойства]; + + Исключение + + Если КодОшибки <> 14 Тогда + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(КодОшибки, ОписаниеОшибки(), ПКО, ПКС, Источник, ""); + КонецЕсли; + + КонецПопытки; + +КонецПроцедуры + +Процедура ВыгрузитьТипСвойстваЭлемента(УзелСвойства, ТипСвойства) + + УстановитьАтрибут(УзелСвойства, "Тип", ТипСвойства); + +КонецПроцедуры + +Процедура _ВыгрузитьСубконто(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКС, + УзелКоллекцииСвойств = Неопределено, ОбъектКоллекции = Неопределено, Знач ВыгрузитьТолькоСсылку = Ложь) + + // Инициализация значения + Значение = Неопределено; + ИмяПКО = ""; + ИмяПКОВидСубконто = ""; + + // Обработчик ПередВыгрузкой + Если ПКС.ЕстьОбработчикПередВыгрузкой Тогда + + Отказ = Ложь; + + Попытка + + Выполнить(ПКС.ПередВыгрузкой); + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(55, ОписаниеОшибки(), ПКО, ПКС, Источник, + "ПередВыгрузкойСвойства", Значение); + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки + + Возврат; + + КонецЕсли; + + КонецЕсли; + + ПолучитьЗначениеСвойства(Значение, ОбъектКоллекции, ПКО, ПКС, ВходящиеДанные, Источник); + + Если ПКС.ПриводитьКДлине <> 0 Тогда + + ВыполнитьПриведениеЗначенияКДлине(Значение, ПКС); + + КонецЕсли; + + Для каждого КлючИЗначение из Значение Цикл + + ВидСубконто = КлючИЗначение.Ключ; + Субконто = КлючИЗначение.Значение; + + // Обработчик ПриВыгрузке + Если ПКС.ЕстьОбработчикПриВыгрузке Тогда + + Отказ = Ложь; + + Попытка + + Выполнить(ПКС.ПриВыгрузке); + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(56, ОписаниеОшибки(), ПКО, ПКС, Источник, + "ПриВыгрузкеСвойства", Значение); + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки субконто + + Продолжить; + + КонецЕсли; + + КонецЕсли; + + Если Субконто = Неопределено + ИЛИ НайтиПравило(Субконто) = Неопределено Тогда + + Продолжить; + + КонецЕсли; + + УзелСубконто = СоздатьУзел(ПКС.Приемник); + + // Ключ + УзелСвойства = СоздатьУзел("Свойство"); + + Если ИмяПКОВидСубконто = "" Тогда + + ПКОКлюч = НайтиПравило(ВидСубконто); + + Иначе + + ПКОКлюч = НайтиПравило(, ИмяПКОВидСубконто); + + КонецЕсли; + + УстановитьАтрибут(УзелСвойства, "Имя", "Ключ"); + ВыгрузитьТипСвойстваЭлемента(УзелСвойства, ПКОКлюч.Приемник); + + УзелСсылки = ВыгрузитьПоПравилу(ВидСубконто,, ИсходящиеДанные,, ИмяПКОВидСубконто,, ИСТИНА, ПКОКлюч, , , , , Ложь); + + Если УзелСсылки <> Неопределено Тогда + + ДобавитьПодчиненный(УзелСвойства, УзелСсылки); + + КонецЕсли; + + ДобавитьПодчиненный(УзелСубконто, УзелСвойства); + + + + // Значение + УзелСвойства = СоздатьУзел("Свойство"); + + ПКОЗначение = НайтиПравило(Субконто); + + ТипПриемника = ПКОЗначение.Приемник; + + ЭтоNULL = Ложь; + Пусто = одПустое(Субконто, ЭтоNULL); + + Если Пусто Тогда + + Если ЭтоNULL + Или Значение = Неопределено Тогда + + Продолжить; + + КонецЕсли; + + Если ПустаяСтрока(ТипПриемника) Тогда + + ТипПриемника = ОпределитьТипДанныхДляПриемника(Субконто); + + КонецЕсли; + + УстановитьАтрибут(УзелСвойства, "Имя", "Значение"); + + Если Не ПустаяСтрока(ТипПриемника) Тогда + УстановитьАтрибут(УзелСвойства, "Тип", ТипПриемника); + КонецЕсли; + + // если тип множественный, то возможно это пустая ссылка и выгрузить ее нужно именно с указанием типа + одЗаписатьЭлемент(УзелСвойства, "Пусто"); + ДобавитьПодчиненный(УзелСубконто, УзелСвойства); + + Иначе + + ЭтоПравилоСГлобальнойВыгрузкой = Ложь; + УзелСсылки = ВыгрузитьПоПравилу(Субконто,, ИсходящиеДанные, , ИмяПКО, , ИСТИНА, ПКОЗначение, , , , , Ложь, ЭтоПравилоСГлобальнойВыгрузкой); + + УстановитьАтрибут(УзелСвойства, "Имя", "Значение"); + ВыгрузитьТипСвойстваЭлемента(УзелСвойства, ТипПриемника); + + + ТипУзлаСсылки = ТипЗнч(УзелСсылки); + + Если УзелСсылки = Неопределено Тогда + + Продолжить; + + КонецЕсли; + + ДобавитьСвойстваДляВыгрузки(УзелСсылки, ТипУзлаСсылки, УзелСвойства, ЭтоПравилоСГлобальнойВыгрузкой); + + ДобавитьПодчиненный(УзелСубконто, УзелСвойства); + + КонецЕсли; + + + + // Обработчик ПослеВыгрузки + Если ПКС.ЕстьОбработчикПослеВыгрузки Тогда + + Отказ = Ложь; + + Попытка + + Выполнить(ПКС.ПослеВыгрузки); + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(57, ОписаниеОшибки(), ПКО, ПКС, Источник, + "ПослеВыгрузкиСвойства", Значение); + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки + + Продолжить; + + КонецЕсли; + + КонецЕсли; + + ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелСубконто); + + КонецЦикла; + +КонецПроцедуры // _ВыгрузитьСубконто() + +Процедура ДобавитьСвойстваДляВыгрузки(УзелСсылки, ТипУзлаСсылки, УзелСвойства, ЭтоПравилоСГлобальнойВыгрузкой) + + Если ТипУзлаСсылки = ТипСтрока Тогда + + Если Найти(УзелСсылки, "<Ссылка") > 0 Тогда + + УзелСвойства.ЗаписатьБезОбработки(УзелСсылки); + + Иначе + + одЗаписатьЭлемент(УзелСвойства, "Значение", УзелСсылки); + + КонецЕсли; + + ИначеЕсли ТипУзлаСсылки = ТипЧисло Тогда + + Если ЭтоПравилоСГлобальнойВыгрузкой Тогда + + одЗаписатьЭлемент(УзелСвойства, "ГНпп", УзелСсылки); + + Иначе + + одЗаписатьЭлемент(УзелСвойства, "Нпп", УзелСсылки); + + КонецЕсли; + + Иначе + + ДобавитьПодчиненный(УзелСвойства, УзелСсылки); + + КонецЕсли; + +КонецПроцедуры + +Процедура ОпределитьВозможностьУстановкиЗначения(Значение, ТипЗначения, ТипПриемника, СвойствоУстановлено, НужноУказатьТип) + + СвойствоУстановлено = Истина; + + Если ТипЗначения = ТипСтрока Тогда + + Если ТипПриемника = "Строка" Тогда + ИначеЕсли ТипПриемника = "Число" Тогда + + Значение = Число(Значение); + + ИначеЕсли ТипПриемника = "Булево" Тогда + + Значение = Булево(Значение); + + ИначеЕсли ТипПриемника = "Дата" Тогда + + Значение = Дата(Значение); + + ИначеЕсли ТипПриемника = "ХранилищеЗначения" Тогда + + Значение = Новый ХранилищеЗначения(Значение); + + ИначеЕсли ПустаяСтрока(ТипПриемника) Тогда + + ТипПриемника = "Строка"; + НужноУказатьТип = Истина; + + КонецЕсли; + + ИначеЕсли ТипЗначения = ТипЧисло Тогда + + Если ТипПриемника = "Число" + ИЛИ ТипПриемника = "Строка" Тогда + ИначеЕсли ТипПриемника = "Булево" Тогда + + Значение = Булево(Значение); + + ИначеЕсли ПустаяСтрока(ТипПриемника) Тогда + + ТипПриемника = "Число"; + НужноУказатьТип = Истина; + + Иначе + + СвойствоУстановлено = Ложь; + + КонецЕсли; + + ИначеЕсли ТипЗначения = ТипДата Тогда + + Если ТипПриемника = "Дата" Тогда + ИначеЕсли ТипПриемника = "Строка" Тогда + + Значение = Лев(Строка(Значение), 10); + + ИначеЕсли ПустаяСтрока(ТипПриемника) Тогда + + ТипПриемника = "Дата"; + НужноУказатьТип = Истина; + + Иначе + + СвойствоУстановлено = Ложь; + + КонецЕсли; + + ИначеЕсли ТипЗначения = ТипБулево Тогда + + Если ТипПриемника = "Булево" Тогда + ИначеЕсли ТипПриемника = "Число" Тогда + + Значение = Число(Значение); + + ИначеЕсли ПустаяСтрока(ТипПриемника) Тогда + + ТипПриемника = "Булево"; + НужноУказатьТип = Истина; + + Иначе + + СвойствоУстановлено = Ложь; + + КонецЕсли; + + ИначеЕсли ТипЗначения = ТипХранилищеЗначения Тогда + + Если ПустаяСтрока(ТипПриемника) Тогда + + ТипПриемника = "ХранилищеЗначения"; + НужноУказатьТип = Истина; + + ИначеЕсли ТипПриемника <> "ХранилищеЗначения" Тогда + + СвойствоУстановлено = Ложь; + + КонецЕсли; + + ИначеЕсли ТипЗначения = ТипВидДвиженияНакопления Тогда + + Значение = Строка(Значение); + + Иначе + + СвойствоУстановлено = Ложь; + + КонецЕсли; + +КонецПроцедуры + +Функция ОпределитьТипДанныхДляПриемника(Значение) + + ТипПриемника = одТипЗначенияСтрокой(Значение); + + // есть ли хоть какое пко с типом приемника ТипПриемника + // если правила нат - то "", если есть , то то что нашли оставляем + СтрокаТаблицы = ТаблицаПравилКонвертации.Найти(ТипПриемника, "Приемник"); + + Если СтрокаТаблицы = Неопределено Тогда + ТипПриемника = ""; + КонецЕсли; + + Возврат ТипПриемника; + +КонецФункции + +Процедура ВыполнитьПриведениеЗначенияКДлине(Значение, ПКС) + + Значение = ПривестиНомерКДлине(Строка(Значение), ПКС.ПриводитьКДлине); + +КонецПроцедуры + +Процедура ВыполнитьЗаписьСтруктурыВXML(СтруктураДанных, УзелКоллекцииСвойств, ЭтоОбычноеСвойство = Истина) + + УзелКоллекцииСвойств.ЗаписатьНачалоЭлемента(?(ЭтоОбычноеСвойство, "Свойство", "ЗначениеПараметра")); + + Для Каждого ЭлементКоллекции Из СтруктураДанных Цикл + + Если ЭлементКоллекции.Ключ = "Выражение" + ИЛИ ЭлементКоллекции.Ключ = "Значение" + ИЛИ ЭлементКоллекции.Ключ = "Нпп" + ИЛИ ЭлементКоллекции.Ключ = "ГНпп" Тогда + + одЗаписатьЭлемент(УзелКоллекцииСвойств, ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение); + + ИначеЕсли ЭлементКоллекции.Ключ = "Ссылка" Тогда + + УзелКоллекцииСвойств.ЗаписатьБезОбработки(ЭлементКоллекции.Значение); + + Иначе + + УстановитьАтрибут(УзелКоллекцииСвойств, ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение); + + КонецЕсли; + + КонецЦикла; + + УзелКоллекцииСвойств.ЗаписатьКонецЭлемента(); + +КонецПроцедуры + +Процедура СоздатьСложнуюИнформациюДляЗаписиВXML(СтруктураДанных, УзелСвойства, НуженУзелXML, ИмяПриемника, ИмяПараметра) + + Если ПустаяСтрока(ИмяПараметра) Тогда + + СоздатьОбъектыДляЗаписиДанныхВXML(СтруктураДанных, УзелСвойства, НуженУзелXML, ИмяПриемника, "Свойство"); + + Иначе + + СоздатьОбъектыДляЗаписиДанныхВXML(СтруктураДанных, УзелСвойства, НуженУзелXML, ИмяПараметра, "ЗначениеПараметра"); + + КонецЕсли; + +КонецПроцедуры + +Процедура СоздатьОбъектыДляЗаписиДанныхВXML(СтруктураДанных, УзелСвойства, НуженУзелXML, ИмяУзла, НаименованиеУзлаXML = "Свойство") + + Если НуженУзелXML Тогда + + УзелСвойства = СоздатьУзел(НаименованиеУзлаXML); + УстановитьАтрибут(УзелСвойства, "Имя", ИмяУзла); + + Иначе + + СтруктураДанных = Новый Структура("Имя", ИмяУзла); + + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, ИмяАтрибута, ЗначениеАтрибута) + + Если СтруктураУзлаСвойств <> Неопределено Тогда + СтруктураУзлаСвойств.Вставить(ИмяАтрибута, ЗначениеАтрибута); + Иначе + УстановитьАтрибут(УзелСвойства, ИмяАтрибута, ЗначениеАтрибута); + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьЗначениеДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, ИмяАтрибута, ЗначениеАтрибута) + + Если СтруктураУзлаСвойств <> Неопределено Тогда + СтруктураУзлаСвойств.Вставить(ИмяАтрибута, ЗначениеАтрибута); + Иначе + одЗаписатьЭлемент(УзелСвойства, ИмяАтрибута, ЗначениеАтрибута); + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьПроизвольныеДанныеДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, ИмяАтрибута, ЗначениеАтрибута) + + Если СтруктураУзлаСвойств <> Неопределено Тогда + СтруктураУзлаСвойств.Вставить(ИмяАтрибута, ЗначениеАтрибута); + Иначе + УзелСвойства.ЗаписатьБезОбработки(ЗначениеАтрибута); + КонецЕсли; + +КонецПроцедуры + +Процедура ПроизвестиЗаписьДанныхВГоловнойУзел(УзелКоллекцииСвойств, СтруктураУзлаСвойств, УзелСвойства, ЭтоОбычноеСвойство = Истина) + + Если СтруктураУзлаСвойств <> Неопределено Тогда + ВыполнитьЗаписьСтруктурыВXML(СтруктураУзлаСвойств, УзелКоллекцииСвойств, ЭтоОбычноеСвойство); + Иначе + ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелСвойства); + КонецЕсли; + +КонецПроцедуры + + +// Формирует узлы свойств объекта приемника в соответствии с указанной коллекцией правил конвертации свойств +// +// Параметры: +// Источник - произвольный источник данных +// Приемник - xml-узел объекта приемника +// ВходящиеДанные - произвольные вспомогательные данные, передаваемые правилу +// для выполнения конвертации +// ИсходящиеДанные - произвольные вспомогательные данные, передаваемые правилам +// конвертации объектов свойств +// ПКО - ссылка на правило конвертации объектов (родитель коллекции правил конвертации свойств) +// КоллекцияПКС - коллекция правил конвертации свойств +// УзелКоллекцииСвойств - xml-узел коллекции свойств +// ОбъектКоллекции - если указан, то выполняется выгрузка свойств объекта коллекции, иначе Источника +// ИмяПредопределенногоЭлемента - если указан, то в свойствах пишется имя предопределенного элемента +// +Процедура ВыгрузитьСвойства(Источник, + Приемник, + ВходящиеДанные, + ИсходящиеДанные, + ПКО, + КоллекцияПКС, + УзелКоллекцииСвойств = Неопределено, + ОбъектКоллекции = Неопределено, + ИмяПредопределенногоЭлемента = Неопределено, + Знач ВыгрузитьТолькоСсылку = Ложь, + Знач ЭтоВыгрузкаСсылки = Ложь, + Знач ВыгружаетсяОбъект = Ложь, + КлючПоискаСсылки = "", + НеИспользоватьПравилаСГлобальнойВыгрузкойИНеЗапоминатьВыгруженные = Ложь, + ЗначениеСсылкиВДругойИБ = "") + + Если УзелКоллекцииСвойств = Неопределено Тогда + + УзелКоллекцииСвойств = Приемник; + + КонецЕсли; + + ВыборкаСвойств = Неопределено; + + Если ЭтоВыгрузкаСсылки Тогда + + // Выгружаем имя предопределенного если оно указано + Если ИмяПредопределенногоЭлемента <> Неопределено Тогда + + УзелКоллекцииСвойств.ЗаписатьНачалоЭлемента("Свойство"); + УстановитьАтрибут(УзелКоллекцииСвойств, "Имя", "{ИмяПредопределенногоЭлемента}"); + одЗаписатьЭлемент(УзелКоллекцииСвойств, "Значение", ИмяПредопределенногоЭлемента); + УзелКоллекцииСвойств.ЗаписатьКонецЭлемента(); + + КонецЕсли; + + КонецЕсли; + + Для каждого ПКС Из КоллекцияПКС Цикл + + Если ПКС.УпрощеннаяВыгрузкаСвойства Тогда + + + // Создаем узел свойства + УзелКоллекцииСвойств.ЗаписатьНачалоЭлемента("Свойство"); + УстановитьАтрибут(УзелКоллекцииСвойств, "Имя", ПКС.Приемник); + + Если Не ПустаяСтрока(ПКС.ТипПриемника) Тогда + + УстановитьАтрибут(УзелКоллекцииСвойств, "Тип", ПКС.ТипПриемника); + + КонецЕсли; + + Если ПКС.НеЗамещать Тогда + + УстановитьАтрибут(УзелКоллекцииСвойств, "НеЗамещать", "true"); + + КонецЕсли; + + Если ПКС.ПоискПоДатеНаРавенство Тогда + + УстановитьАтрибут(УзелКоллекцииСвойств, "ПоискПоДатеНаРавенство", "true"); + + КонецЕсли; + + Значение = Неопределено; + ПолучитьЗначениеСвойства(Значение, ОбъектКоллекции, ПКО, ПКС, ВходящиеДанные, Источник, ВыборкаСвойств); + + Если ПКС.ПриводитьКДлине <> 0 Тогда + + ВыполнитьПриведениеЗначенияКДлине(Значение, ПКС); + + КонецЕсли; + + ЭтоNULL = Ложь; + Пусто = одПустое(Значение, ЭтоNULL); + + Если Пусто Тогда + + УзелКоллекцииСвойств.ЗаписатьКонецЭлемента(); + Продолжить; + + КонецЕсли; + + одЗаписатьЭлемент(УзелКоллекцииСвойств, "Значение", Значение); + + УзелКоллекцииСвойств.ЗаписатьКонецЭлемента(); + Продолжить; + + ИначеЕсли ПКС.ВидПриемника = "ВидыСубконтоСчета" Тогда + + _ВыгрузитьСубконто(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, + ПКС, УзелКоллекцииСвойств, ОбъектКоллекции, ВыгрузитьТолькоСсылку); + + Продолжить; + + ИначеЕсли ПКС.Имя = "{УникальныйИдентификатор}" Тогда + + СсылкаНаИсточник = ОпределитьСсылкуПоОбъектуИлиСсылке(Источник, ВыгружаетсяОбъект); + + УникальныйИдентификатор = СсылкаНаИсточник.УникальныйИдентификатор(); + + УзелКоллекцииСвойств.ЗаписатьНачалоЭлемента("Свойство"); + УстановитьАтрибут(УзелКоллекцииСвойств, "Имя", "{УникальныйИдентификатор}"); + УстановитьАтрибут(УзелКоллекцииСвойств, "Тип", "Строка"); + УстановитьАтрибут(УзелКоллекцииСвойств, "ТипИсточника", ПКО.ТипИсточника); + УстановитьАтрибут(УзелКоллекцииСвойств, "ТипПриемника", ПКО.ТипПриемника); + одЗаписатьЭлемент(УзелКоллекцииСвойств, "Значение", УникальныйИдентификатор); + УзелКоллекцииСвойств.ЗаписатьКонецЭлемента(); + + Продолжить; + + ИначеЕсли ПКС.ЭтоГруппа Тогда + + ВыгрузитьГруппуСвойств(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКС, УзелКоллекцииСвойств, ВыгрузитьТолькоСсылку); + + Продолжить; + + КонецЕсли; + + // Инициализируем значение, которое будем конвертировать + Значение = Неопределено; + ИмяПКО = ПКС.ПравилоКонвертации; + НеЗамещать = ПКС.НеЗамещать; + + Пусто = Ложь; + Выражение = Неопределено; + ТипПриемника = ПКС.ТипПриемника; + + ЭтоNULL = Ложь; + + + // Обработчик ПередВыгрузкой + Если ПКС.ЕстьОбработчикПередВыгрузкой Тогда + + Отказ = Ложь; + + Попытка + + Выполнить(ПКС.ПередВыгрузкой); + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(55, ОписаниеОшибки(), ПКО, ПКС, Источник, + "ПередВыгрузкойСвойства", Значение); + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки свойства + + Продолжить; + + КонецЕсли; + + КонецЕсли; + + + // Создаем узел свойства + СтруктураУзлаСвойств = Неопределено; + УзелСвойства = Неопределено; + + СоздатьСложнуюИнформациюДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, ПКС.НуженУзелXMLПриВыгрузке, ПКС.Приемник, ПКС.ИмяПараметраДляПередачи); + + Если НеЗамещать Тогда + + ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, "НеЗамещать", "true"); + + КонецЕсли; + + Если ПКС.ПоискПоДатеНаРавенство Тогда + + УстановитьАтрибут(УзелКоллекцииСвойств, "ПоискПоДатеНаРавенство", "true"); + + КонецЕсли; + + // Возможно правило конвертации уже определено + Если Не ПустаяСтрока(ИмяПКО) Тогда + + ПКОСвойств = Правила[ИмяПКО]; + + Иначе + + ПКОСвойств = Неопределено; + + КонецЕсли; + + Если Не ПустаяСтрока(ТипПриемника) Тогда + + ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, "Тип", ТипПриемника); + + ИначеЕсли ПКОСвойств <> Неопределено Тогда + + //Попытка определить тип свойства приемника + ТипПриемника = ПКОСвойств.Приемник; + + ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, "Тип", ТипПриемника); + + КонецЕсли; + + ЭтоОбычноеСвойство = ПустаяСтрока(ПКС.ИмяПараметраДляПередачи); + + // Определяем конвертируемое значение + Если Выражение <> Неопределено Тогда + + ДобавитьЗначениеДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, "Выражение", Выражение); + + ПроизвестиЗаписьДанныхВГоловнойУзел(УзелКоллекцииСвойств, СтруктураУзлаСвойств, УзелСвойства, ЭтоОбычноеСвойство); + Продолжить; + + ИначеЕсли Пусто Тогда + + ПроизвестиЗаписьДанныхВГоловнойУзел(УзелКоллекцииСвойств, СтруктураУзлаСвойств, УзелСвойства, ЭтоОбычноеСвойство); + Продолжить; + + Иначе + + ПолучитьЗначениеСвойства(Значение, ОбъектКоллекции, ПКО, ПКС, ВходящиеДанные, Источник, ВыборкаСвойств); + + Если ПКС.ПриводитьКДлине <> 0 Тогда + + ВыполнитьПриведениеЗначенияКДлине(Значение, ПКС); + + КонецЕсли; + + КонецЕсли; + + СтароеЗначениеДоОбработчикаПриВыгрузке = Значение; + Пусто = одПустое(Значение, ЭтоNULL); + + // Обработчик ПриВыгрузке + Если ПКС.ЕстьОбработчикПриВыгрузке Тогда + + Отказ = Ложь; + + Попытка + + Выполнить(ПКС.ПриВыгрузке); + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(56, ОписаниеОшибки(), ПКО, ПКС, Источник, + "ПриВыгрузкеСвойства", Значение); + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки свойства + + Продолжить; + + КонецЕсли; + + КонецЕсли; + + + // Инициализируем еще раз переменную Пусто, может быть Значение было изменено + // в обработчике "При выгрузке" + Если СтароеЗначениеДоОбработчикаПриВыгрузке <> Значение Тогда + + Пусто = одПустое(Значение, ЭтоNULL); + + КонецЕсли; + + Если Пусто Тогда + + Если ЭтоNULL Тогда + + Значение = Неопределено; + + КонецЕсли; + + Если Значение <> Неопределено + И ПустаяСтрока(ТипПриемника) Тогда + + ТипПриемника = ОпределитьТипДанныхДляПриемника(Значение); + + Если Не ПустаяСтрока(ТипПриемника) Тогда + + ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, "Тип", ТипПриемника); + + КонецЕсли; + + КонецЕсли; + + ПроизвестиЗаписьДанныхВГоловнойУзел(УзелКоллекцииСвойств, СтруктураУзлаСвойств, УзелСвойства, ЭтоОбычноеСвойство); + Продолжить; + + КонецЕсли; + + УзелСсылки = Неопределено; + + Если ПКОСвойств = Неопределено + И ПустаяСтрока(ИмяПКО) Тогда + + СвойствоУстановлено = Ложь; + ТипЗначения = ТипЗнч(Значение); + НужноУказатьТип = Ложь; + ОпределитьВозможностьУстановкиЗначения(Значение, ТипЗначения, ТипПриемника, СвойствоУстановлено, НужноУказатьТип); + + Если СвойствоУстановлено Тогда + + // если нужно тип указываем + Если НужноУказатьТип Тогда + + ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, "Тип", ТипПриемника); + + КонецЕсли; + + ДобавитьЗначениеДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, "Значение", Значение); + + Иначе + + МенеджерЗначения = Менеджеры[ТипЗначения]; + + Если МенеджерЗначения = Неопределено Тогда + Продолжить; + КонецЕсли; + + ПКОСвойств = МенеджерЗначения.ПКО; + + Если ПКОСвойств = Неопределено Тогда + Продолжить; + КонецЕсли; + + ИмяПКО = ПКОСвойств.Имя; + + КонецЕсли; + + КонецЕсли; + + Если (ПКОСвойств <> Неопределено) + Или (Не ПустаяСтрока(ИмяПКО)) Тогда + + ПравилоСГлобальнойВыгрузкой = Ложь; + УзелСсылки = ВыгрузитьПоПравилу(Значение, , ИсходящиеДанные, , ИмяПКО, , ИСТИНА, ПКОСвойств, , , , , Ложь, + ПравилоСГлобальнойВыгрузкой, НеИспользоватьПравилаСГлобальнойВыгрузкойИНеЗапоминатьВыгруженные); + + Если УзелСсылки = Неопределено Тогда + + Продолжить; + + КонецЕсли; + + Если ПустаяСтрока(ТипПриемника) Тогда + + ТипПриемника = ПКОСвойств.Приемник; + ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, "Тип", ТипПриемника); + + КонецЕсли; + + ТипУзлаСсылки = ТипЗнч(УзелСсылки); + + Если ТипУзлаСсылки = ТипСтрока Тогда + + Если Найти(УзелСсылки, "<Ссылка") > 0 Тогда + + ДобавитьПроизвольныеДанныеДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, "Ссылка", УзелСсылки); + + Иначе + + ДобавитьЗначениеДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, "Значение", УзелСсылки); + + КонецЕсли; + + ИначеЕсли ТипУзлаСсылки = ТипЧисло Тогда + + Если ПравилоСГлобальнойВыгрузкой Тогда + ДобавитьЗначениеДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, "ГНпп", УзелСсылки); + Иначе + ДобавитьЗначениеДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, "Нпп", УзелСсылки); + КонецЕсли; + + Иначе + + УзелСсылки.ЗаписатьКонецЭлемента(); + ИнформацияДляЗаписиВФайл = УзелСсылки.Закрыть(); + + ДобавитьПроизвольныеДанныеДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, "Ссылка", ИнформацияДляЗаписиВФайл); + + КонецЕсли; + + КонецЕсли; + + + + // Обработчик ПослеВыгрузки + + Если ПКС.ЕстьОбработчикПослеВыгрузки Тогда + + Отказ = Ложь; + + Попытка + + Выполнить(ПКС.ПослеВыгрузки); + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(57, ОписаниеОшибки(), ПКО, ПКС, Источник, + "ПослеВыгрузкиСвойства", Значение); + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки свойства + + Продолжить; + + КонецЕсли; + + КонецЕсли; + + ПроизвестиЗаписьДанныхВГоловнойУзел(УзелКоллекцииСвойств, СтруктураУзлаСвойств, УзелСвойства, ЭтоОбычноеСвойство); + + КонецЦикла; // по ПКС + +КонецПроцедуры + +Процедура ОпределитьПКОПоПараметрам(ПКО, Источник, ИмяПКО) + + // Поиск ПКО + Если ПКО = Неопределено Тогда + + ПКО = НайтиПравило(Источник, ИмяПКО); + + ИначеЕсли (Не ПустаяСтрока(ИмяПКО)) + И ПКО.Имя <> ИмяПКО Тогда + + ПКО = НайтиПравило(Источник, ИмяПКО); + + КонецЕсли; + +КонецПроцедуры + +Функция НайтиСтруктуруСвойствПоПараметрам(ПКО, Источник) + + СтруктураСвойств = Менеджеры[ПКО.Источник]; + Если СтруктураСвойств = Неопределено Тогда + СтруктураСвойств = Менеджеры[ТипЗнч(Источник)]; + КонецЕсли; + + Возврат СтруктураСвойств; + +КонецФункции + +Функция ОпределитьСсылкуПоОбъектуИлиСсылке(Источник, ВыгружаетсяОбъект) + + Если ВыгружаетсяОбъект Тогда + Возврат Источник.Ссылка; + Иначе + Возврат Источник; + КонецЕсли; + +КонецФункции + +Функция ОпределитьВнутреннеПредставлениеДляПоиска(Источник, СтруктураСвойств) + + Если СтруктураСвойств.ИмяТипа = "Перечисление" Тогда + Возврат Источник; + Иначе + Возврат ЗначениеВСтрокуВнутр(Источник); + КонецЕсли + +КонецФункции + +Процедура ПровестиОбновлениеДанныхВВыгружаемыхДанных() + + Если СоответствиеДанныхДляОбновленияВыгруженныхЭлементов.Количество() > 0 Тогда + + СоответствиеДанныхДляОбновленияВыгруженныхЭлементов.Очистить(); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПровестиУстановкуПризнаковВыгруженныхОбъектовВФайл() + + НППЗаписанногоВФайл = СчетчикНПП; + +КонецПроцедуры + +Процедура ЗаписатьПриоритетОбъектовОбмена(ПриоритетОбъектовОбмена, Узел) + + Если ЗначениеЗаполнено(ПриоритетОбъектовОбмена) + И ПриоритетОбъектовОбмена <> Перечисления.ПриоритетыОбъектовОбмена.ПриоритетПоступившегоПриОбменеОбъектаВыше Тогда + + Если ПриоритетОбъектовОбмена = Перечисления.ПриоритетыОбъектовОбмена.ПриоритетПоступившегоПриОбменеОбъектаНиже Тогда + УстановитьАтрибут(Узел, "ПриоритетОбъектаОбмена", "Ниже"); + ИначеЕсли ПриоритетОбъектовОбмена = Перечисления.ПриоритетыОбъектовОбмена.ПриоритетПоступившегоПриОбменеОбъектаСовпадает Тогда + УстановитьАтрибут(Узел, "ПриоритетОбъектаОбмена", "Совпадает"); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Производит выгрузку объекта в соответствии с указанным правилом конвертации +// +// Параметры: +// Источник - произвольный источник данных +// Приемник - xml-узел объекта приемника +// ВходящиеДанные - произвольные вспомогательные данные, передаваемые правилу +// для выполнения конвертации +// ИсходящиеДанные - произвольные вспомогательные данные, передаваемые правилам +// конвертации свойств +// ИмяПКО - имя правила конвертации, согласно которому осуществляется выгрузка +// УзелСсылки - xml-узел ссылки объекта приемника +// ТолькоПолучитьУзелСсылки - если Истина, то выгрузка объекта не производится, только формируется +// xml-узел ссылки +// ПКО - ссылка на правило конвертации +// +// Возвращаемое значение: +// xml-узел ссылки или значение приемника +// +Функция ВыгрузитьПоПравилу(Источник = Неопределено, + Приемник = Неопределено, + ВходящиеДанные = Неопределено, + ИсходящиеДанные = Неопределено, + ИмяПКО = "", + УзелСсылки = Неопределено, + ТолькоПолучитьУзелСсылки = Ложь, + ПКО = Неопределено, + ВыгружатьСсылкиУПодчиненныхОбъектов = Истина, + ВыгрузкаСтрокиНабораЗаписейРегистра = Ложь, + УзелПредка = Неопределено, + ИмяКонстантыДляВыгрузки = "", + ЭтоВыгружаетсяОбъект = Неопределено, + ЭтоПравилоСГлобальнойВыгрузкойОбъектов = Ложь, + НеИспользоватьПравилоСГлобальнойВыгрузкойИНеЗапоминатьВыгруженные = Ложь) + // + + ОпределитьПКОПоПараметрам(ПКО, Источник, ИмяПКО); + + Если ПКО = Неопределено Тогда + + ЗП = ПолучитьСтруктуруЗаписиПротокола(45); + + ЗП.Объект = Источник; + Попытка + ЗП.ТипОбъекта = ТипЗнч(Источник); + Исключение + КонецПопытки; + + ЗаписатьВПротоколВыполнения(45, ЗП, Истина); // не найдено ПКО + Возврат Неопределено; + + КонецЕсли; + + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу + 1; + + Если ФлагКомментироватьОбработкуОбъектов Тогда + + Попытка + ИсточникВСтроку = Строка(Источник); + Исключение + ИсточникВСтроку = " "; + КонецПопытки; + + ПрОбъекта = ИсточникВСтроку + " (" + ТипЗнч(Источник) + ")"; + + СтрокаНазванияПКО = " ПКО: " + СокрЛП(ИмяПКО) + " (" + СокрЛП(ПКО.Наименование) + ")"; + + Если ТолькоПолучитьУзелСсылки Тогда + СтрокаПользователю = "Конвертация ссылки на объект: "; + Иначе + СтрокаПользователю = "Конвертация объекта: "; + КонецЕсли; + + ЗаписатьВПротоколВыполнения(СтрокаПользователю + ПрОбъекта + СтрокаНазванияПКО, , Ложь, ТекущийУровеньВложенностиВыгрузитьПоПравилу + 1, 7); + + КонецЕсли; + + ЭтоПравилоСГлобальнойВыгрузкойОбъектов = Ложь; + + ЗапоминатьВыгруженные = Ложь; + ВыгруженныеОбъекты = ПКО.Выгруженные; + ВсеОбъектыВыгружены = ПКО.ВсеОбъектыВыгружены; + НеЗамещатьОбъектПриЗагрузке = ПКО.НеЗамещать; + НеСоздаватьЕслиНеНайден = ПКО.НеСоздаватьЕслиНеНайден; + ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD = ПКО.ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD; + НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике = ПКО.НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике; + ПриоритетОбъектовОбмена = ПКО.ПриоритетОбъектовОбмена; + + РегистрироватьОбъектНаУзлеОтправителе = Ложь; + + ПрефиксАвтонумерации = ""; + РежимЗаписи = ""; + РежимПроведения = ""; + + ИмяТипа = ""; + ВыгружатьСвойстваОбъекта = Истина; + + СтруктураСвойств = НайтиСтруктуруСвойствПоПараметрам(ПКО, Источник); + + Если СтруктураСвойств <> Неопределено Тогда + ИмяТипа = СтруктураСвойств.ИмяТипа; + КонецЕсли; + + КлючВыгружаемыхДанных = ИмяПКО; + + ЭтоНеСсылочныйТип = ИмяТипа = "РегистрСведений" + ИЛИ ИмяТипа = "Константы"; + // КлючВыгружаемыхДанных + Если ЭтоНеСсылочныйТип + ИЛИ ПустаяСтрока(ИмяТипа) Тогда + + ЗапоминатьВыгруженные = Ложь; + + КонецЕсли; + + СсылкаНаИсточник = Неопределено; + ВыгружаетсяОбъект = ЭтоВыгружаетсяОбъект; + + Если (Источник <> Неопределено) + И НЕ ЭтоНеСсылочныйТип Тогда + + Если ВыгружаетсяОбъект = Неопределено Тогда + // если не указано что выгружается, то считаем что выгружается объект + ВыгружаетсяОбъект = Истина; + КонецЕсли; + + СсылкаНаИсточник = ОпределитьСсылкуПоОбъектуИлиСсылке(Источник, ВыгружаетсяОбъект); + Если ЗапоминатьВыгруженные Тогда + КлючВыгружаемыхДанных = ОпределитьВнутреннеПредставлениеДляПоиска(СсылкаНаИсточник, СтруктураСвойств); + КонецЕсли; + + Иначе + + ВыгружаетсяОбъект = Ложь; + + КонецЕсли; + + // Переменная для хранения имени предопределенного элемента + ИмяПредопределенногоЭлемента = Неопределено; + + // Глобальный обработчик ПередКонвертациейОбъекта + Отказ = Ложь; + Если ЕстьГлобальныйОбработчикПередКонвертациейОбъекта Тогда + + Попытка + Выполнить(Конвертация.ПередКонвертациейОбъекта); + Исключение + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(64, ОписаниеОшибки(), ПКО, Источник, НСтр("ru = 'ПередКонвертациейОбъекта (глобальный)'")); + КонецПопытки; + + Если Отказ Тогда // Отказ от дальнейшей обработки правила + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат Приемник; + КонецЕсли; + + КонецЕсли; + + + // Обработчик ПередВыгрузкой + Если ПКО.ЕстьОбработчикПередВыгрузкой Тогда + + Попытка + Выполнить(ПКО.ПередВыгрузкой); + Исключение + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(41, ОписаниеОшибки(), ПКО, Источник, "ПередВыгрузкойОбъекта"); + КонецПопытки; + + Если Отказ Тогда // Отказ от дальнейшей обработки правила + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат Приемник; + КонецЕсли; + + КонецЕсли; + + СтрокаВСтекеВыгрузки = Неопределено; + + НужноОбновитьЛокальныйКЭШВыгруженныхОбъектов = Ложь; + ЗначениеСсылкиВДругойИБ = ""; + + // Возможно такие данные уже выгружались + Если Не ВсеОбъектыВыгружены Тогда + + Нпп = 0; + + Если ЗапоминатьВыгруженные Тогда + + СтрокаВыгруженныхОбъектов = ВыгруженныеОбъекты.Найти(КлючВыгружаемыхДанных, "Ключ"); + + Если СтрокаВыгруженныхОбъектов <> Неопределено Тогда + + СтрокаВыгруженныхОбъектов.КоличествоОбращений = СтрокаВыгруженныхОбъектов.КоличествоОбращений + 1; + СтрокаВыгруженныхОбъектов.НомерПоследнегоОбращения = СчетчикНПП; + + Если ТолькоПолучитьУзелСсылки Тогда + + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Если Найти(СтрокаВыгруженныхОбъектов.УзелСсылки, "<Ссылка") > 0 + И НППЗаписанногоВФайл >= СтрокаВыгруженныхОбъектов.НППСсылки Тогда + Возврат СтрокаВыгруженныхОбъектов.НППСсылки; + Иначе + Возврат СтрокаВыгруженныхОбъектов.УзелСсылки; + КонецЕсли; + + КонецЕсли; + + НомерВыгруженнойСсылки = СтрокаВыгруженныхОбъектов.НППСсылки; + + Если НЕ СтрокаВыгруженныхОбъектов.ВыгруженаТолькоСсылка Тогда + + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Если Найти(СтрокаВыгруженныхОбъектов.УзелСсылки, "<Ссылка") > 0 + И НППЗаписанногоВФайл >= СтрокаВыгруженныхОбъектов.НППСсылки Тогда + Возврат СтрокаВыгруженныхОбъектов.НППСсылки; + Иначе + Возврат СтрокаВыгруженныхОбъектов.УзелСсылки; + КонецЕсли; + + Иначе + + СтрокаВСтекеВыгрузки = СтекВызововВыгрузкиДанных.Найти(КлючВыгружаемыхДанных, "Ссылка"); + + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат Неопределено; + КонецЕсли; + + СтрокаВСтекеВыгрузки = СтекВызововВыгрузкиДанных.Добавить(); + СтрокаВСтекеВыгрузки.Ссылка = КлючВыгружаемыхДанных; + + Нпп = НомерВыгруженнойСсылки; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Если Нпп = 0 Тогда + + СчетчикНПП = СчетчикНПП + 1; + Нпп = СчетчикНПП; + + + // Это позволит избежать циклических ссылок + Если ЗапоминатьВыгруженные Тогда + + Если СтрокаВыгруженныхОбъектов = Неопределено Тогда + + Если НЕ ЭтоПравилоСГлобальнойВыгрузкойОбъектов + И НЕ НужноОбновитьЛокальныйКЭШВыгруженныхОбъектов + И ВыгруженныеОбъекты.Количество() > ЧислоХранимыхВыгруженныхОбъектовПоТипам Тогда + + НужноОбновитьЛокальныйКЭШВыгруженныхОбъектов = Истина; + СоответствиеДанныхДляОбновленияВыгруженныхЭлементов.Вставить(ПКО.Приемник, ПКО); + + КонецЕсли; + + СтрокаВыгруженныхОбъектов = ВыгруженныеОбъекты.Добавить(); + + КонецЕсли; + + СтрокаВыгруженныхОбъектов.Ключ = КлючВыгружаемыхДанных; + СтрокаВыгруженныхОбъектов.УзелСсылки = НПП; + СтрокаВыгруженныхОбъектов.НППСсылки = НПП; + СтрокаВыгруженныхОбъектов.НомерПоследнегоОбращения = НПП; + + Если ТолькоПолучитьУзелСсылки Тогда + + СтрокаВыгруженныхОбъектов.ВыгруженаТолькоСсылка = Истина; + + Иначе + + СтрокаВСтекеВыгрузки = СтекВызововВыгрузкиДанных.Добавить(); + СтрокаВСтекеВыгрузки.Ссылка = КлючВыгружаемыхДанных; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + СоответствиеЗначений = ПКО.Значения; + КоличествоЭлементовСоответствияЗначений = СоответствиеЗначений.Количество(); + + // Обработка соответствий предопределенных элементов + Если ВерсияПлатформыПриемника = "8.0" ИЛИ ВерсияПлатформыПриемника = "УП" Тогда + + Если ИмяПредопределенногоЭлемента = Неопределено Тогда + + Если СтруктураСвойств <> Неопределено + И КоличествоЭлементовСоответствияЗначений > 0 + И СтруктураСвойств.ВозможенПоискПоПредопределенным Тогда + + Попытка + ИмяПредопределенногоИсточник = СтруктураСвойств.Менеджер.ПолучитьИмяПредопределенного(СсылкаНаИсточник) + Исключение + ИмяПредопределенногоИсточник = ""; + КонецПопытки; + + Иначе + + ИмяПредопределенногоИсточник = ""; + + Конецесли; + + Если НЕ ПустаяСтрока(ИмяПредопределенногоИсточник) + И КоличествоЭлементовСоответствияЗначений > 0 Тогда + + ИмяПредопределенногоЭлемента = СоответствиеЗначений[СсылкаНаИсточник]; + + Иначе + ИмяПредопределенногоЭлемента = Неопределено; + КонецЕсли; + + КонецЕсли; + + Если ИмяПредопределенногоЭлемента <> Неопределено Тогда + КоличествоЭлементовСоответствияЗначений = 0; + КонецЕсли; + + Иначе + ИмяПредопределенногоЭлемента = Неопределено; + КонецЕсли; + + НеНужноВыгружатьПоСоответствиюЗначений = (КоличествоЭлементовСоответствияЗначений = 0); + + Если Не НеНужноВыгружатьПоСоответствиюЗначений Тогда + + // если нет объекта в соответствии значений - выгружаем его штатным образом + УзелСсылки = СоответствиеЗначений[СсылкаНаИсточник]; + Если УзелСсылки = Неопределено Тогда + + // возможно это конвертация из перечисления в перечисление и мы просто не нашли по + //ПКЗ нужное свойство - тогда просто выгружаем пустую ссылку и все + Если СтруктураСвойств.ИмяТипа = "Перечисление" + И Найти(ПКО.Приемник, "ПеречислениеСсылка.") > 0 Тогда + + // записываем ошибку в протокол выполнения + ЗП = ПолучитьСтруктуруЗаписиПротокола(); + ЗП.ИмяПКО = ИмяПКО; + ЗП.Значение = Источник; + ЗП.ТипЗначения = СтруктураСвойств.ТипСсылкиСтрокой; + ЗП.КСообщенияОбОшибках = 71; + ЗП.Текст = НСтр("ru = 'В правиле конвертации значений (ПКЗ) необходимо сопоставить значение Источника значению Приемника. + |Если подходящего значения приемника нет, то указать пустое значение.'"); + // + ЗаписатьВПротоколВыполнения(71, ЗП); + + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + СтекВызововВыгрузкиДанных.Удалить(СтрокаВСтекеВыгрузки); + КонецЕсли; + + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + + Возврат Неопределено; + + Иначе + + НеНужноВыгружатьПоСоответствиюЗначений = Истина; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + НЕВыгружатьПодчиненныеОбъекты = ТолькоПолучитьУзелСсылки ИЛИ НЕ ВыгружатьСсылкиУПодчиненныхОбъектов; + + НужноЗапоминатьОбъект = ЗапоминатьВыгруженные И (Не ВсеОбъектыВыгружены); + + Если НеНужноВыгружатьПоСоответствиюЗначений Тогда + + Если ПКО.СвойстваПоиска.Количество() > 0 + ИЛИ ИмяПредопределенногоЭлемента <> Неопределено Тогда + + // Формируем узел ссылки + УзелСсылки = СоздатьУзел("Ссылка"); + + Если НужноЗапоминатьОбъект Тогда + + Если ЭтоПравилоСГлобальнойВыгрузкойОбъектов Тогда + УстановитьАтрибут(УзелСсылки, "ГНпп", Нпп); + Иначе + УстановитьАтрибут(УзелСсылки, "Нпп", Нпп); + КонецЕсли; + + КонецЕсли; + + Если НеСоздаватьЕслиНеНайден Тогда + УстановитьАтрибут(УзелСсылки, "НеСоздаватьЕслиНеНайден", НеСоздаватьЕслиНеНайден); + КонецЕсли; + + Если РегистрироватьОбъектНаУзлеОтправителе Тогда + УстановитьАтрибут(УзелСсылки, "РегистрироватьОбъектНаУзлеОтправителе", РегистрироватьОбъектНаУзлеОтправителе); + КонецЕсли; + + ЗаписатьПриоритетОбъектовОбмена(ПриоритетОбъектовОбмена, УзелСсылки); + + Если НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике Тогда + УстановитьАтрибут(УзелСсылки, "НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике", НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике); + КонецЕсли; + + ВыгрузитьТолькоСсылку = ПКО.НеВыгружатьОбъектыСвойствПоСсылкам ИЛИ НЕВыгружатьПодчиненныеОбъекты; + + Если ВыгружатьСвойстваОбъекта = Истина Тогда + + ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКО.СвойстваПоиска, + УзелСсылки, , ИмяПредопределенногоЭлемента, ВыгрузитьТолькоСсылку, + Истина, ВыгружаетсяОбъект, КлючВыгружаемыхДанных, , ЗначениеСсылкиВДругойИБ); + + КонецЕсли; + + УзелСсылки.ЗаписатьКонецЭлемента(); + УзелСсылки = УзелСсылки.Закрыть(); + + Если НужноЗапоминатьОбъект Тогда + + СтрокаВыгруженныхОбъектов.УзелСсылки = УзелСсылки; + + КонецЕсли; + + Иначе + УзелСсылки = Нпп; + КонецЕсли; + + Иначе + + // Поиск в соответствии значений по ПКЗ + Если УзелСсылки = Неопределено Тогда + + // записываем ошибку в протокол выполнения + ЗП = ПолучитьСтруктуруЗаписиПротокола(); + ЗП.ИмяПКО = ИмяПКО; + ЗП.Значение = Источник; + ЗП.ТипЗначения = ТипЗнч(Источник); + ЗП.КСообщенияОбОшибках = 71; + + ЗаписатьВПротоколВыполнения(71, ЗП); + + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + СтекВызововВыгрузкиДанных.Удалить(СтрокаВСтекеВыгрузки); + КонецЕсли; + + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат Неопределено; + КонецЕсли; + + Если ЗапоминатьВыгруженные Тогда + СтрокаВыгруженныхОбъектов.УзелСсылки = УзелСсылки; + КонецЕсли; + + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + СтекВызововВыгрузкиДанных.Удалить(СтрокаВСтекеВыгрузки); + КонецЕсли; + + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат УзелСсылки; + + КонецЕсли; + + + Если ТолькоПолучитьУзелСсылки + Или ВсеОбъектыВыгружены Тогда + + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + СтекВызововВыгрузкиДанных.Удалить(СтрокаВСтекеВыгрузки); + КонецЕсли; + + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат УзелСсылки; + + КонецЕсли; + + Если Приемник = Неопределено Тогда + + Приемник = СоздатьУзел("Объект"); + + Если НЕ ВыгрузкаСтрокиНабораЗаписейРегистра Тогда + + Если ЭтоПравилоСГлобальнойВыгрузкойОбъектов Тогда + УстановитьАтрибут(Приемник, "ГНпп", Нпп); + Иначе + УстановитьАтрибут(Приемник, "Нпп", Нпп); + КонецЕсли; + + УстановитьАтрибут(Приемник, "Тип", ПКО.Приемник); + УстановитьАтрибут(Приемник, "ИмяПравила", ПКО.Имя); + + ЗаписатьПриоритетОбъектовОбмена(ПриоритетОбъектовОбмена, Приемник); + + Если НеЗамещатьОбъектПриЗагрузке Тогда + УстановитьАтрибут(Приемник, "НеЗамещать", "true"); + КонецЕсли; + + Если Не ПустаяСтрока(ПрефиксАвтонумерации) Тогда + УстановитьАтрибут(Приемник, "ПрефиксАвтонумерации", ПрефиксАвтонумерации); + КонецЕсли; + + Если Не ПустаяСтрока(РежимЗаписи) Тогда + + УстановитьАтрибут(Приемник, "РежимЗаписи", РежимЗаписи); + Если Не ПустаяСтрока(РежимПроведения) Тогда + УстановитьАтрибут(Приемник, "РежимПроведения", РежимПроведения); + КонецЕсли; + + КонецЕсли; + + Если ТипЗнч(УзелСсылки) <> ТипЧисло Тогда + ДобавитьПодчиненный(Приемник, УзелСсылки); + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + // Обработчик ПриВыгрузке + СтандартнаяОбработка = Истина; + Отказ = Ложь; + + Если ПКО.ЕстьОбработчикПриВыгрузке Тогда + + Попытка + Выполнить(ПКО.ПриВыгрузке); + Исключение + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(42, ОписаниеОшибки(), ПКО, Источник, "ПриВыгрузкеОбъекта"); + КонецПопытки; + + Если Отказ Тогда // отказ от записи объекта в файл + + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + СтекВызововВыгрузкиДанных.Удалить(СтрокаВСтекеВыгрузки); + КонецЕсли; + + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат УзелСсылки; + КонецЕсли; + + КонецЕсли; + + // Выгрузка свойств + Если СтандартнаяОбработка Тогда + + Если НЕ ПустаяСтрока(ИмяКонстантыДляВыгрузки) Тогда + + МассивСвойствДляВыгрузки = Новый Массив(); + + СтрокаТаблицы = ПКО.Свойства.Найти(ИмяКонстантыДляВыгрузки, "Источник"); + + Если СтрокаТаблицы <> Неопределено Тогда + МассивСвойствДляВыгрузки.Добавить(СтрокаТаблицы); + КонецЕсли; + + Иначе + + МассивСвойствДляВыгрузки = ПКО.Свойства; + + КонецЕсли; + + Если ВыгружатьСвойстваОбъекта Тогда + + ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, МассивСвойствДляВыгрузки, , , , + ПКО.НеВыгружатьОбъектыСвойствПоСсылкам ИЛИ НЕВыгружатьПодчиненныеОбъекты, Ложь, ВыгружаетсяОбъект, КлючВыгружаемыхДанных, , ЗначениеСсылкиВДругойИБ); + + КонецЕсли; + + КонецЕсли; + + // Обработчик ПослеВыгрузки + + Если ПКО.ЕстьОбработчикПослеВыгрузки Тогда + + Попытка + Выполнить(ПКО.ПослеВыгрузки); + Исключение + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(43, ОписаниеОшибки(), ПКО, Источник, "ПослеВыгрузкиОбъекта"); + КонецПопытки; + + Если Отказ Тогда // отказ от записи объекта в файл + + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + СтекВызововВыгрузкиДанных.Удалить(СтрокаВСтекеВыгрузки); + КонецЕсли; + + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат УзелСсылки; + КонецЕсли; + КонецЕсли; + + + // Запись объекта в файл + Приемник.ЗаписатьКонецЭлемента(); + + Инкремент(ПолеСчетчикВыгруженныхОбъектов); + + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + + Если УзелПредка <> Неопределено Тогда + + УзелПредка.ЗаписатьБезОбработки(Приемник.Закрыть()); + + Иначе + + ЗаписатьВФайл(Приемник); + + Если НужноЗапоминатьОбъект + И ЭтоПравилоСГлобальнойВыгрузкойОбъектов Тогда + + СтрокаВыгруженныхОбъектов.УзелСсылки = НПП; + + КонецЕсли; + + Если ТекущийУровеньВложенностиВыгрузитьПоПравилу = 0 Тогда + + ПровестиУстановкуПризнаковВыгруженныхОбъектовВФайл(); + + КонецЕсли; + + ПровестиОбновлениеДанныхВВыгружаемыхДанных(); + + КонецЕсли; + + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + СтекВызововВыгрузкиДанных.Удалить(СтрокаВСтекеВыгрузки); + КонецЕсли; + + // Обработчик ПослеВыгрузкиВФайл + Если ПКО.ЕстьОбработчикПослеВыгрузкиВФайл Тогда + + Попытка + Выполнить(ПКО.ПослеВыгрузкиВФайл); + Исключение + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(79, ОписаниеОшибки(), ПКО, Источник, "ЕстьОбработчикПослеВыгрузкиВФайл"); + КонецПопытки; + + КонецЕсли; + + Возврат УзелСсылки; + +КонецФункции + +Процедура ВыгрузитьИнформациюОЗарегистрированномОбъекте(НаборЗаписейДляВыгрузки) + + Если НаборЗаписейДляВыгрузки.Количество() = 0 Тогда // выгружаем пустой набор РС + + Отбор = Новый Структура; + Отбор.Вставить("УникальныйИдентификаторИсточника", НаборЗаписейДляВыгрузки.Отбор.УникальныйИдентификаторИсточника.Значение); + Отбор.Вставить("УникальныйИдентификаторПриемника", НаборЗаписейДляВыгрузки.Отбор.УникальныйИдентификаторПриемника.Значение); + Отбор.Вставить("ТипИсточника", НаборЗаписейДляВыгрузки.Отбор.ТипИсточника.Значение); + Отбор.Вставить("ТипПриемника", НаборЗаписейДляВыгрузки.Отбор.ТипПриемника.Значение); + + ВыгрузитьЗаписьСоответствияОбъектовИнформационныхБаз(Отбор, Истина); + + Иначе + + Для Каждого СтрокаНабора Из НаборЗаписейДляВыгрузки Цикл + + ВыгрузитьЗаписьСоответствияОбъектовИнформационныхБаз(СтрокаНабора, Ложь); + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +Процедура ВыгрузитьЗаписьСоответствияОбъектовИнформационныхБаз(СтрокаНабора, ПустойНабор) + + Приемник = СоздатьУзел("ИнформацияОРегистрацииОбъекта"); + + УстановитьАтрибут(Приемник, "УникальныйИдентификаторИсточника", Строка(СтрокаНабора.УникальныйИдентификаторИсточника.УникальныйИдентификатор())); + УстановитьАтрибут(Приемник, "УникальныйИдентификаторПриемника", СтрокаНабора.УникальныйИдентификаторПриемника); + УстановитьАтрибут(Приемник, "ТипИсточника", СтрокаНабора.ТипИсточника); + УстановитьАтрибут(Приемник, "ТипПриемника", СтрокаНабора.ТипПриемника); + + УстановитьАтрибут(Приемник, "ПустойНабор", ПустойНабор); + + Приемник.ЗаписатьКонецЭлемента(); // ИнформацияОРегистрацииОбъекта + + ЗаписатьВФайл(Приемник); + + Инкремент(ПолеСчетчикВыгруженныхОбъектов); + +КонецПроцедуры + +Процедура ВыгрузитьРегистр(НаборЗаписейДляВыгрузки, + Правило = Неопределено, + ВходящиеДанные = Неопределено, + НеВыгружатьОбъектыПоСсылкам = Ложь, + ИмяПКО = "", + ПравилоВыгрузкиДанных = Неопределено) Экспорт + + ИсходящиеДанные = Неопределено; + + + ОпределитьПКОПоПараметрам(Правило, НаборЗаписейДляВыгрузки, ИмяПКО); + + Отказ = Ложь; + Свойства = Неопределено; + ВходящиеДанные = Неопределено; + ПриоритетОбъектовОбмена = Правило.ПриоритетОбъектовОбмена; + + Если ТипЗнч(НаборЗаписейДляВыгрузки) = Тип("Структура") Тогда + + ОтборНабораЗаписей = НаборЗаписейДляВыгрузки.Отбор; + СтрокиНабораЗаписей = НаборЗаписейДляВыгрузки.Строки; + + Иначе // НаборЗаписей + + ОтборНабораЗаписей = НаборЗаписейДляВыгрузки.Отбор; + СтрокиНабораЗаписей = НаборЗаписейДляВыгрузки; + + КонецЕсли; + + // записываем сначала отбор потом набор записей + // отбор + + Приемник = СоздатьУзел("НаборЗаписейРегистра"); + + КоличествоЗаписейВРегистре = СтрокиНабораЗаписей.Количество(); + + СчетчикНПП = СчетчикНПП + 1; + Нпп = СчетчикНПП; + + УстановитьАтрибут(Приемник, "Нпп", Нпп); + УстановитьАтрибут(Приемник, "Тип", СтрЗаменить(Правило.Приемник, "РегистрСведенийЗапись.", "РегистрСведенийНаборЗаписей.")); + УстановитьАтрибут(Приемник, "ИмяПравила", Правило.Имя); + + ЗаписатьПриоритетОбъектовОбмена(ПриоритетОбъектовОбмена, Приемник); + + ВыгружаемПустойНабор = КоличествоЗаписейВРегистре = 0; + Если ВыгружаемПустойНабор Тогда + УстановитьАтрибут(Приемник, "ПустойНабор", Истина); + КонецЕсли; + + Приемник.ЗаписатьНачалоЭлемента("Отбор"); + + СтруктураИсточник = Новый Структура; + МассивПКСДляВыгрузки = Новый Массив(); + + Для Каждого СтрокаОтбора Из ОтборНабораЗаписей Цикл + + Если СтрокаОтбора.Использование = Ложь Тогда + Продолжить; + КонецЕсли; + + // дописываем отбор + // нужно найти в ПКо соответствующие ПКС и по нему выгрузить значение отбора + СтруктураИсточник.Вставить(СтрокаОтбора.Имя, СтрокаОтбора.Значение); + + СтрокаПКС = Правило.Свойства.Найти(СтрокаОтбора.Имя, "Источник"); + + Если СтрокаПКС = Неопределено Тогда + + СтрокаПКС = Правило.Свойства.Найти(СтрокаОтбора.Имя, "Приемник"); + + КонецЕсли; + + Если СтрокаПКС <> Неопределено + И (СтрокаПКС.ВидПриемника = "Свойство" + ИЛИ СтрокаПКС.ВидПриемника = "Измерение") Тогда + + МассивПКСДляВыгрузки.Добавить(СтрокаПКС); + + КонецЕсли; + + КонецЦикла; + + // добавляем параметры для отбора + Для Каждого СтрокаСвойстваПоиска Из Правило.СвойстваПоиска Цикл + + Если ПустаяСтрока(СтрокаСвойстваПоиска.Приемник) + И НЕ ПустаяСтрока(СтрокаСвойстваПоиска.ИмяПараметраДляПередачи) Тогда + + МассивПКСДляВыгрузки.Добавить(СтрокаСвойстваПоиска); + + КонецЕсли; + + КонецЦикла; + + ВыгрузитьСвойства(СтруктураИсточник, , ВходящиеДанные, ИсходящиеДанные, Правило, МассивПКСДляВыгрузки, Приемник, + , , НеВыгружатьОбъектыПоСсылкам, , , , ВыгружаемПустойНабор); + + Приемник.ЗаписатьКонецЭлемента(); + + Приемник.ЗаписатьНачалоЭлемента("СтрокиНабораЗаписей"); + + // набор записей ВходящиеДанные = Неопределено; + Для Каждого СтрокаРегистра Из СтрокиНабораЗаписей Цикл + + ВыгрузкаОбъектаВыборки(СтрокаРегистра, ПравилоВыгрузкиДанных, , ВходящиеДанные, НеВыгружатьОбъектыПоСсылкам, Истина, + Приемник, , ИмяПКО, ЛОЖЬ); + + КонецЦикла; + + Приемник.ЗаписатьКонецЭлемента(); + + Приемник.ЗаписатьКонецЭлемента(); + + ЗаписатьВФайл(Приемник); + + ПровестиОбновлениеДанныхВВыгружаемыхДанных(); + + ПровестиУстановкуПризнаковВыгруженныхОбъектовВФайл(); + + Инкремент(ПолеСчетчикВыгруженныхОбъектов, 1 - СтрокиНабораЗаписей.Количество()); + +КонецПроцедуры + + +Процедура ВызватьСобытияПередВыгрузкойОбъекта(Объект, Правило, Свойства=Неопределено, ВходящиеДанные=Неопределено, + НеВыгружатьОбъектыСвойствПоСсылкам = Ложь, ИмяПКО, Отказ, ИсходящиеДанные) + + + Если ФлагКомментироватьОбработкуОбъектов Тогда + + Попытка + ПрОбъекта = Строка(Объект) + " (" + ТипЗнч(Объект) + ")"; + Исключение + ПрОбъекта = ТипЗнч(Объект); + КонецПопытки; + + ЗаписатьВПротоколВыполнения("ВЫГРУЗКА ОБЪЕКТА: " + ПрОбъекта, , Ложь, 1, 7); + + КонецЕсли; + + + ИмяПКО = Правило.ПравилоКонвертации; + Отказ = Ложь; + ИсходящиеДанные = Неопределено; + + + // Глобальный обработчик ПередВыгрузкойОбъекта + Если ЕстьГлобальныйОбработчикПередВыгрузкойОбъекта Тогда + + Попытка + Выполнить(Конвертация.ПередВыгрузкойОбъекта); + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(65, ОписаниеОшибки(), Правило.Имя, Объект, НСтр("ru = 'ПередВыгрузкойОбъектаВыборки (глобальный)'")); + КонецПопытки; + + Если Отказ Тогда + Возврат; + КонецЕсли; + + КонецЕсли; + + // Обработчик ПередВыгрузкой + Если Не ПустаяСтрока(Правило.ПередВыгрузкой) Тогда + + Попытка + Выполнить(Правило.ПередВыгрузкой); + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(33, ОписаниеОшибки(), Правило.Имя, Объект, "ПередВыгрузкойОбъектаВыборки"); + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры + +Процедура ВызватьСобытияПослеВыгрузкиОбъекта(Объект, Правило, Свойства=Неопределено, ВходящиеДанные=Неопределено, + НеВыгружатьОбъектыСвойствПоСсылкам = Ложь, ИмяПКО, Отказ, ИсходящиеДанные) + + // Глобальный обработчик ПослеВыгрузкиОбъекта + Если ЕстьГлобальныйОбработчикПослеВыгрузкиОбъекта Тогда + Попытка + Выполнить(Конвертация.ПослеВыгрузкиОбъекта); + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(69, ОписаниеОшибки(), Правило.Имя, Объект, НСтр("ru = 'ПослеВыгрузкиОбъектаВыборки (глобальный)'")); + КонецПопытки; + КонецЕсли; + + + // Обработчик ПослеВыгрузки + Если Не ПустаяСтрока(Правило.ПослеВыгрузки) Тогда + + Попытка + Выполнить(Правило.ПослеВыгрузки); + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(34, ОписаниеОшибки(), Правило.Имя, Объект, "ПослеВыгрузкиОбъектаВыборки"); + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры + +// Производит выгрузку объекта выборки в соответствии с указанным правилом +// +// Параметры: +// Объект - выгружаемый объект выборки +// Правило - ссылка на правило выгрузки данных +// Свойства - свойства объекта метаданного выгружаемого объекта +// ВходящиеДанные - произвольные вспомогательные данные +// +Функция ВыгрузкаОбъектаВыборки(Объект, + ПравилоВыгрузки, + Свойства=Неопределено, + ВходящиеДанные = Неопределено, + НеВыгружатьОбъектыСвойствПоСсылкам = Ложь, + ВыгрузкаСтрокиНабораЗаписей = Ложь, + УзелПредка = Неопределено, + ИмяКонстантыДляВыгрузки = "", + ИмяПКО = "", + ВызыватьСобытия = Истина) + + Отказ = Ложь; + ИсходящиеДанные = Неопределено; + + Если ВызыватьСобытия + И ПравилоВыгрузки <> Неопределено Тогда + + ИмяПКО = ""; + + ВызватьСобытияПередВыгрузкойОбъекта(Объект, ПравилоВыгрузки, Свойства, ВходящиеДанные, + НеВыгружатьОбъектыСвойствПоСсылкам, ИмяПКО, Отказ, ИсходящиеДанные); + + Если Отказ Тогда + Возврат Ложь; + КонецЕсли; + + КонецЕсли; + + УзелСсылки = Неопределено; + ВыгрузитьПоПравилу(Объект, , ВходящиеДанные, ИсходящиеДанные, ИмяПКО, УзелСсылки, , , НЕ НеВыгружатьОбъектыСвойствПоСсылкам, + ВыгрузкаСтрокиНабораЗаписей, УзелПредка, ИмяКонстантыДляВыгрузки, Истина); + + + Если ВызыватьСобытия + И ПравилоВыгрузки <> Неопределено Тогда + + ВызватьСобытияПослеВыгрузкиОбъекта(Объект, ПравилоВыгрузки, Свойства, ВходящиеДанные, + НеВыгружатьОбъектыСвойствПоСсылкам, ИмяПКО, Отказ, ИсходящиеДанные); + + КонецЕсли; + + Возврат Не Отказ; + +КонецФункции + +Функция ВыгрузкаРегистра( НаборЗаписейДляВыгрузки, + Правило = Неопределено, + ВходящиеДанные = Неопределено, + НеВыгружатьОбъектыСвойствПоСсылкам = Ложь, + ИмяПКО = "") Экспорт + + ИмяПКО = ""; + Отказ = Ложь; + ИсходящиеДанные = Неопределено; + + ВызватьСобытияПередВыгрузкойОбъекта(НаборЗаписейДляВыгрузки, Правило, Неопределено, ВходящиеДанные, + НеВыгружатьОбъектыСвойствПоСсылкам, ИмяПКО, Отказ, ИсходящиеДанные); + + Если Отказ Тогда + Возврат Ложь; + КонецЕсли; + + + ВыгрузитьРегистр(НаборЗаписейДляВыгрузки, + Неопределено, + ИсходящиеДанные, + НеВыгружатьОбъектыСвойствПоСсылкам, + ИмяПКО, + Правило); + + ВызватьСобытияПослеВыгрузкиОбъекта(НаборЗаписейДляВыгрузки, Правило, Неопределено, ВходящиеДанные, + НеВыгружатьОбъектыСвойствПоСсылкам, ИмяПКО, Отказ, ИсходящиеДанные); + + Возврат Не Отказ; + +КонецФункции + + +Функция ПолучитьРезультатЗапросаДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, + ВыборкаДляОчисткиДанных = Ложь, УдалятьОбъектыНепосредственно = Ложь, ВыбиратьВсеПоля = Истина) Экспорт + + СтрокаРазрешения = ?(ВыгружатьТолькоРазрешенные, " РАЗРЕШЕННЫЕ ", ""); + + СтрокаВыбораПолей = ?(ВыбиратьВсеПоля, " * ", " ОбъектДляВыгрузки.Ссылка КАК Ссылка "); + + Если ИмяТипа = "Справочник" + ИЛИ ИмяТипа = "ПланВидовХарактеристик" + ИЛИ ИмяТипа = "ПланСчетов" + ИЛИ ИмяТипа = "ПланВидовРасчета" + ИЛИ ИмяТипа = "РегистрБухгалтерии" + ИЛИ ИмяТипа = "ПланОбмена" + ИЛИ ИмяТипа = "Задача" + ИЛИ ИмяТипа = "БизнесПроцесс" Тогда + + Запрос = Новый Запрос(); + + Если ИмяТипа = "РегистрБухгалтерии" Тогда + + СтрокаВыбораПолей = "*"; + + КонецЕсли; + + Запрос.Текст = "ВЫБРАТЬ " + СтрокаРазрешения + " + | " + СтрокаВыбораПолей + " + |ИЗ + | " + ИмяТипа + "." + Свойства.Имя + " КАК ОбъектДляВыгрузки + | + |"; + + Если ВыборкаДляОчисткиДанных + И УдалятьОбъектыНепосредственно Тогда + + Если (ИмяТипа = "Справочник" + ИЛИ ИмяТипа = "ПланВидовХарактеристик") Тогда + + Попытка + Если ИмяТипа = "Справочник" Тогда + НужнаИерархия = Метаданные.Справочники[Свойства.Имя].Иерархический; + Иначе + НужнаИерархия = Метаданные.ПланыВидовХарактеристик[Свойства.Имя].Иерархический; + КонецЕсли + Исключение + НужнаИерархия = Ложь + КонецПопытки; + + Если НужнаИерархия Тогда + + Запрос.Текст = Запрос.Текст + " + | ГДЕ ОбъектДляВыгрузки.Родитель = &Родитель + |"; + + Запрос.УстановитьПараметр("Родитель", Свойства.Менеджер.ПустаяСсылка()); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + ИначеЕсли ИмяТипа = "Документ" Тогда + + Запрос = Новый Запрос(); + + ИтоговоеОграничениеПоДате = ""; + + Запрос.Текст = "ВЫБРАТЬ " + СтрокаРазрешения + " + | " + СтрокаВыбораПолей + " + |ИЗ + | " + ИмяТипа + "." + Свойства.Имя + " КАК ОбъектДляВыгрузки + | + |" + ИтоговоеОграничениеПоДате; + + + ИначеЕсли ИмяТипа = "РегистрСведений" Тогда + + Непериодический = НЕ Свойства.Периодический; + ПодчиненныйРегистратору = Свойства.ПодчиненныйРегистратору; + + + НеНужноОграничениеПоДатам = ВыборкаДляОчисткиДанных ИЛИ Непериодический; + + Запрос = Новый Запрос(); + + ИтоговоеОграничениеПоДате = ""; + + СтрокаДополненияПолейВыборкиПодчиненРегистратору = ?(НЕ ПодчиненныйРегистратору, ", NULL КАК Активность, + | NULL КАК Регистратор, + | NULL КАК НомерСтроки", ""); + + СтрокаДополненияПолейВыборкиПериодичность = ?(Непериодический, ", NULL КАК Период", ""); + + Запрос.Текст = "ВЫБРАТЬ " + СтрокаРазрешения + " + | * + | + | " + СтрокаДополненияПолейВыборкиПодчиненРегистратору + " + | " + СтрокаДополненияПолейВыборкиПериодичность + " + | + |ИЗ + | " + ИмяТипа + "." + Свойства.Имя + " КАК ОбъектДляВыгрузки + | + |" + ИтоговоеОграничениеПоДате; + + Иначе + + Возврат Неопределено; + + КонецЕсли; + + + Возврат Запрос.Выполнить(); + +КонецФункции + +Функция ПолучитьВыборкуДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, + ВыборкаДляОчисткиДанных = Ложь, УдалятьОбъектыНепосредственно = Ложь, ВыбиратьВсеПоля = Истина) Экспорт + + РезультатЗапроса = ПолучитьРезультатЗапросаДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, + ВыборкаДляОчисткиДанных, УдалятьОбъектыНепосредственно, ВыбиратьВсеПоля); + + Если РезультатЗапроса = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Выборка = РезультатЗапроса.Выбрать(); + + + Возврат Выборка; + +КонецФункции + +Функция ПолучитьВыборкуДляВыгрузкиСОграничениями(Правило) + + ИмяМетаданных = Правило.ИмяОбъектаДляЗапроса; + + СтрокаРазрешения = ?(ВыгружатьТолькоРазрешенные, " РАЗРЕШЕННЫЕ ", ""); + + ПостроительОтчета.Текст = "ВЫБРАТЬ " + СтрокаРазрешения + " Объект.Ссылка КАК Ссылка ИЗ " + ИмяМетаданных + " КАК Объект "+ "{ГДЕ Объект.Ссылка.* КАК " + СтрЗаменить(ИмяМетаданных, ".", "_") + "}"; + ПостроительОтчета.Отбор.Сбросить(); + Если НЕ Правило.НастройкиПостроителя = Неопределено Тогда + ПостроительОтчета.УстановитьНастройки(Правило.НастройкиПостроителя); + КонецЕсли; + + ПостроительОтчета.Выполнить(); + Выборка = ПостроительОтчета.Результат.Выбрать(); + + Возврат Выборка; + +КонецФункции + +Функция ПолучитьВыборкуДляВыгрузкиПоПроизвольномуАлгоритму(ВыборкаДанных) + + Выборка = Неопределено; + + ТипВыборки = ТипЗнч(ВыборкаДанных); + + Если ТипВыборки = Тип("ВыборкаИзРезультатаЗапроса") Тогда + + Выборка = ВыборкаДанных; + + ИначеЕсли ТипВыборки = Тип("РезультатЗапроса") Тогда + + Выборка = ВыборкаДанных.Выбрать(); + + ИначеЕсли ТипВыборки = Тип("Запрос") Тогда + + РезультатЗапроса = ВыборкаДанных.Выполнить(); + Выборка = РезультатЗапроса.Выбрать(); + + КонецЕсли; + + Возврат Выборка; + +КонецФункции + +Функция ПолучитьСтрокуНабораКонстантДляВыгрузки(ТаблицаДанныхКонстантДляВыгрузки) + + СтрокаНабораКонстант = ""; + + Для Каждого СтрокаТаблицы Из ТаблицаДанныхКонстантДляВыгрузки Цикл + + Если Не ПустаяСтрока(СтрокаТаблицы.Источник) Тогда + + СтрокаНабораКонстант = СтрокаНабораКонстант + ", " + СтрокаТаблицы.Источник; + + КонецЕсли; + + КонецЦикла; + + Если Не ПустаяСтрока(СтрокаНабораКонстант) Тогда + + СтрокаНабораКонстант = Сред(СтрокаНабораКонстант, 3); + + КонецЕсли; + + Возврат СтрокаНабораКонстант; + +КонецФункции + +Функция ВыгрузитьНаборКонстант(Правило, Свойства, ИсходящиеДанные, СтрокаИменНабораКонстант = "") + + Если СтрокаИменНабораКонстант = "" Тогда + СтрокаИменНабораКонстант = ПолучитьСтрокуНабораКонстантДляВыгрузки(Свойства.ПКО.Свойства); + КонецЕсли; + + НаборКонстант = Константы.СоздатьНабор(СтрокаИменНабораКонстант); + НаборКонстант.Прочитать(); + РезультатВыгрузки = ВыгрузкаОбъектаВыборки(НаборКонстант, Правило, Свойства, ИсходящиеДанные, , , , СтрокаИменНабораКонстант); + Возврат РезультатВыгрузки; + +КонецФункции + +Функция ОпределитьНужноВыбиратьВсеПоля(Правило) + + НужныВсеПоляДляВыборки = НЕ ПустаяСтрока(Конвертация.ПередВыгрузкойОбъекта) + ИЛИ НЕ ПустаяСтрока(Правило.ПередВыгрузкой) + ИЛИ НЕ ПустаяСтрока(Конвертация.ПослеВыгрузкиОбъекта) + ИЛИ НЕ ПустаяСтрока(Правило.ПослеВыгрузки); + + Возврат НужныВсеПоляДляВыборки; + +КонецФункции + +// Выгружает данные по указанному правилу +// +// Параметры: +// Правило - ссылка на правило выгрузки данных +// +Процедура ВыгрузитьДанныеПоПравилу(Правило) Экспорт + + ИмяПКО = Правило.ПравилоКонвертации; + + Если Не ПустаяСтрока(ИмяПКО) Тогда + + ПКО = Правила[ИмяПКО]; + + КонецЕсли; + + + Если ФлагКомментироватьОбработкуОбъектов Тогда + + СтрокаСообщения = НСтр("ru = 'ПРАВИЛО ВЫГРУЗКИ ДАННЫХ: [Имя] ([Наименование])'"); + + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[Имя]", СокрЛП(Правило.Имя)); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[Наименование]", СокрЛП(Правило.Наименование)); + ЗаписатьВПротоколВыполнения(СтрокаСообщения, , Ложь, , 4); + + КонецЕсли; + + + // Обработчик ПередОбработкой + Отказ = Ложь; + ИсходящиеДанные = Неопределено; + ВыборкаДанных = Неопределено; + + + Если Не ПустаяСтрока(Правило.ПередОбработкой) Тогда + + Попытка + + Выполнить(Правило.ПередОбработкой); + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(31, ОписаниеОшибки(), Правило.Имя, , "ПередОбработкойВыгрузкиДанных"); + + КонецПопытки; + + Если Отказ Тогда + + Возврат; + + КонецЕсли; + + КонецЕсли; + + + // Стандартная выборка с отбором + Если Правило.СпособОтбораДанных = "СтандартнаяВыборка" И Правило.ИспользоватьОтбор Тогда + + Выборка = ПолучитьВыборкуДляВыгрузкиСОграничениями(Правило); + + Пока Выборка.Следующий() Цикл + ВыгрузкаОбъектаВыборки(Выборка.Ссылка, Правило, , ИсходящиеДанные); + КонецЦикла; + + // Стандартная выборка без отбора + ИначеЕсли (Правило.СпособОтбораДанных = "СтандартнаяВыборка") Тогда + + Свойства = Менеджеры[Правило.ОбъектВыборки]; + ИмяТипа = Свойства.ИмяТипа; + + Если ИмяТипа = "Константы" Тогда + + ВыгрузитьНаборКонстант(Правило, Свойства, ИсходящиеДанные); + + Иначе + + ЭтоНеСсылочныйТип = ИмяТипа = "РегистрСведений" + ИЛИ ИмяТипа = "РегистрБухгалтерии"; + + + Если ЭтоНеСсылочныйТип Тогда + + ВыбиратьВсеПоля = ОпределитьНужноВыбиратьВсеПоля(Правило); + + Иначе + + // получаем только ссылку + ВыбиратьВсеПоля = Ложь; + + КонецЕсли; + + + Выборка = ПолучитьВыборкуДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, , , ВыбиратьВсеПоля); + + Если Выборка = Неопределено Тогда + Возврат; + КонецЕсли; + + Пока Выборка.Следующий() Цикл + + Если ЭтоНеСсылочныйТип Тогда + + ВыгрузкаОбъектаВыборки(Выборка, Правило, Свойства, ИсходящиеДанные); + + Иначе + + ВыгрузкаОбъектаВыборки(Выборка.Ссылка, Правило, Свойства, ИсходящиеДанные); + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + ИначеЕсли Правило.СпособОтбораДанных = "ПроизвольныйАлгоритм" Тогда + + Если ВыборкаДанных <> Неопределено Тогда + + Выборка = ПолучитьВыборкуДляВыгрузкиПоПроизвольномуАлгоритму(ВыборкаДанных); + + Если Выборка <> Неопределено Тогда + + Пока Выборка.Следующий() Цикл + + ВыгрузкаОбъектаВыборки(Выборка, Правило, , ИсходящиеДанные); + + КонецЦикла; + + Иначе + + Для каждого Объект Из ВыборкаДанных Цикл + + ВыгрузкаОбъектаВыборки(Объект, Правило, , ИсходящиеДанные); + + КонецЦикла; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + + // Обработчик ПослеОбработки + + //ВсеОбъектыВыгружены = ПКО.ВсеОбъектыВыгружены; + + Если Не ПустаяСтрока(Правило.ПослеОбработки) Тогда + + Попытка + + Выполнить(Правило.ПослеОбработки); + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ОписаниеОшибки(), Правило.Имя, , "ПослеОбработкиВыгрузкиДанных"); + + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры // ВыгрузитьДанныеПоПравилу() + +Процедура ОтработатьУдалениеОбъекта(ДанныеОбУдаленииОбъекта, СтрокаСообщенияОбОшибке = "") + + Ссылка = ДанныеОбУдаленииОбъекта.Ссылка; + + ТекстСобытия = ""; + Если Конвертация.Свойство("ПередОтправкойИнформацииОбУдалении", ТекстСобытия) Тогда + + Отказ = Ложь; + + Попытка + Выполнить(ТекстСобытия); + Исключение + СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(76, ОписаниеОшибки(), "ПередОтправкойИнформацииОбУдалении (конвертация)"); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + Отказ = Истина; + КонецПопытки; + + Если Отказ Тогда + Возврат; + КонецЕсли; + + КонецЕсли; + + Менеджер = Менеджеры[ТипЗнч(Ссылка)]; + + // проверка на существование менеджера и ПКО + Если Менеджер = Неопределено + ИЛИ Менеджер.ПКО = Неопределено Тогда + + ЗП = ПолучитьСтруктуруЗаписиПротокола(45); + + ЗП.Объект = Ссылка; + Попытка + ЗП.ТипОбъекта = ТипЗнч(Ссылка); + Исключение + КонецПопытки; + + ЗаписатьВПротоколВыполнения(45, ЗП, Истина); + Возврат; + + КонецЕсли; + + УникальныйИдентификатор = Ссылка.УникальныйИдентификатор(); + + Приемник = СоздатьУзел("УдалениеОбъекта"); + + УстановитьАтрибут(Приемник, "ТипПриемника", Менеджер.ПКО.ТипПриемника); + УстановитьАтрибут(Приемник, "ТипИсточника", Менеджер.ПКО.ТипИсточника); + + УстановитьАтрибут(Приемник, "УникальныйИдентификатор", УникальныйИдентификатор); + + Приемник.ЗаписатьКонецЭлемента(); // УдалениеОбъекта + + ЗаписатьВФайл(Приемник); + + Инкремент(ПолеСчетчикВыгруженныхОбъектов); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ КОМПИЛЯЦИИ ПРАВИЛ ОБМЕНА В СТРУКТУРУ + +// возвращает структуру правил обмена +Функция ПолучитьСтруктуруПравилОбмена(Источник) Экспорт + + ЗагрузитьПравилаОбмена(Источник, "XMLФайл"); + + Если ФлагОшибки() Тогда + Возврат Неопределено; + КонецЕсли; + + // получаем таблицу реквизитов регистрации для механизма выборочной регистрации объектов + ТаблицаРеквизитовРегистрацииОбъектов = ПолучитьТаблицуРеквизитовРегистрацииОбъектов(); + + // сохраняем запросы + ЗапросыДляСохранения = Новый Структура; + + Для Каждого ЭлементСтруктуры Из Запросы Цикл + + ЗапросыДляСохранения.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение.Текст); + + КонецЦикла; + + // сохраняем параметры + ПараметрыДляСохранения = Новый Структура; + + Для Каждого ЭлементСтруктуры Из Параметры Цикл + + ПараметрыДляСохранения.Вставить(ЭлементСтруктуры.Ключ, Неопределено); + + КонецЦикла; + + СтруктураПравилОбмена = Новый Структура; + + СтруктураПравилОбмена.Вставить("Конвертация", Конвертация); + + СтруктураПравилОбмена.Вставить("ТаблицаНастройкиПараметров", ТаблицаНастройкиПараметров); + СтруктураПравилОбмена.Вставить("ТаблицаПравилВыгрузки", ТаблицаПравилВыгрузки); + СтруктураПравилОбмена.Вставить("ТаблицаПравилКонвертации", ТаблицаПравилКонвертации); + + СтруктураПравилОбмена.Вставить("Алгоритмы", Алгоритмы); + СтруктураПравилОбмена.Вставить("Параметры", ПараметрыДляСохранения); + СтруктураПравилОбмена.Вставить("Запросы", ЗапросыДляСохранения); + + СтруктураПравилОбмена.Вставить("XMLПравила", XMLПравила); + СтруктураПравилОбмена.Вставить("СтрокаТиповДляПриемника", СтрокаТиповДляПриемника); + + СтруктураПравилОбмена.Вставить("ПравилаВыборочнойРегистрацииОбъектов", ТаблицаРеквизитовРегистрацииОбъектов); + + СтруктураПравилОбмена.Вставить("ВерсияПлатформыПриемника", ВерсияПлатформыПриемника); + + Возврат СтруктураПравилОбмена; + +КонецФункции + +Функция ПолучитьТаблицуРеквизитовРегистрацииОбъектов() + + ТаблицаРеквизитовРегистрации = ИнициализацияТаблицыРеквизитовРегистрации(); + ТаблицаРезультат = ИнициализацияТаблицыРеквизитовРегистрации(); + + // получаем предварительную таблицу из правил конвертации + Для Каждого ПКО ИЗ ТаблицаПравилКонвертации Цикл + + ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоПравилу(ПКО, ТаблицаРезультат); + + КонецЦикла; + + ТаблицаРезультатГруппировка = ТаблицаРезультат.Скопировать(); + + ТаблицаРезультатГруппировка.Свернуть("ИмяОбъекта, ИмяТабличнойЧасти"); + + // получаем итоговую таблицу с учетом сгруппированных строк предварительной таблицы + Для Каждого СтрокаТаблицы ИЗ ТаблицаРезультатГруппировка Цикл + + Отбор = Новый Структура("ИмяОбъекта, ИмяТабличнойЧасти", СтрокаТаблицы.ИмяОбъекта, СтрокаТаблицы.ИмяТабличнойЧасти); + + МассивСтрокТаблицыРезультат = ТаблицаРезультат.НайтиСтроки(Отбор); + + ДополнитьТаблицуРеквизитовРегистрации(МассивСтрокТаблицыРезультат, ТаблицаРеквизитовРегистрации); + + КонецЦикла; + + // строки с ошибками удаляем + УдалитьСтрокиСОшибкамиТаблицыРеквизитовРегистрации(ТаблицаРеквизитовРегистрации); + + // выполняем проверку на наличие требуемых реквизитов шапки и реквизитов табличных частей объектов метаданных + ВыполнитьПроверкуРеквизитовРегистрацииОбъектов(ТаблицаРеквизитовРегистрации); + + // заполняем таблицу значением имени Плана обмена + ТаблицаРеквизитовРегистрации.ЗаполнитьЗначения(ИмяПланаОбменаВРО, "ИмяПланаОбмена"); + + Возврат ТаблицаРеквизитовРегистрации; + +КонецФункции + +Функция ИнициализацияТаблицыРеквизитовРегистрации() + + ТаблицаРезультат = Новый ТаблицаЗначений; + + ТаблицаРезультат.Колонки.Добавить("Порядок", одОписаниеТипа("Число")); + ТаблицаРезультат.Колонки.Добавить("ИмяОбъекта", одОписаниеТипа("Строка")); + ТаблицаРезультат.Колонки.Добавить("ТипОбъектаСтрокой", одОписаниеТипа("Строка")); + ТаблицаРезультат.Колонки.Добавить("ИмяПланаОбмена", одОписаниеТипа("Строка")); + ТаблицаРезультат.Колонки.Добавить("ИмяТабличнойЧасти", одОписаниеТипа("Строка")); + ТаблицаРезультат.Колонки.Добавить("РеквизитыРегистрации", одОписаниеТипа("Строка")); + ТаблицаРезультат.Колонки.Добавить("СтруктураРеквизитовРегистрации", одОписаниеТипа("Структура")); + + Возврат ТаблицаРезультат; + +КонецФункции + +Функция ПолучитьСтруктуруРеквизитовРегистрации(ТаблицаПКС) + + СтруктураРеквизитовРегистрации = Новый Структура; + + МассивСтрокПКС = ТаблицаПКС.НайтиСтроки(Новый Структура("ЭтоГруппа", Ложь)); + + Для Каждого ПКС ИЗ МассивСтрокПКС Цикл + + Попытка + СтруктураРеквизитовРегистрации.Вставить(ПКС.Источник); + Исключение + КонецПопытки; + + КонецЦикла; + + Возврат СтруктураРеквизитовРегистрации; + +КонецФункции + +Функция ПолучитьСтруктуруРеквизитовРегистрацииПоМассивуСтрок(МассивСтрок) + + СтруктураРезультат = Новый Структура; + + Для Каждого СтрокаТаблицыРезультат ИЗ МассивСтрок Цикл + + СтруктураРеквизитовРегистрации = СтрокаТаблицыРезультат.СтруктураРеквизитовРегистрации; + + Для Каждого РеквизитРегистрации ИЗ СтруктураРеквизитовРегистрации Цикл + + СтруктураРезультат.Вставить(РеквизитРегистрации.Ключ); + + КонецЦикла; + + КонецЦикла; + + Возврат СтруктураРезультат; + +КонецФункции + +Функция ПолучитьРеквизитыРегистрации(СтруктураРеквизитовРегистрации) + + РеквизитыРегистрации = ""; + + Для Каждого РеквизитРегистрации ИЗ СтруктураРеквизитовРегистрации Цикл + + РеквизитыРегистрации = РеквизитыРегистрации + РеквизитРегистрации.Ключ + ", "; + + КонецЦикла; + + СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(РеквизитыРегистрации, 2); + + Возврат РеквизитыРегистрации; + +КонецФункции + +Процедура ВыполнитьПроверкуРеквизитовРегистрацииОбъектов(ТаблицаРеквизитовРегистрации) + + Для Каждого СтрокаТаблицы ИЗ ТаблицаРеквизитовРегистрации Цикл + + Попытка + ТипОбъекта = Тип(СтрокаТаблицы.ТипОбъектаСтрокой); + Исключение + + СтрокаСообщения = НСтр("ru = 'Тип объекта не определен: [ТипОбъектаСтрокой]'"); + + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ТипОбъектаСтрокой]", СтрокаТаблицы.ТипОбъектаСтрокой); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщения); + ЗаписатьВПротоколВыполнения(СтрокаСообщения); + Продолжить; + + КонецПопытки; + + ОбъектМД = Метаданные.НайтиПоТипу(ТипОбъекта); + + // проверку выполняем только для ссылочных типов: Справочник, Документ, Задача, БизнесПроцесс + Если НЕ (ЭтоСправочник(ОбъектМД) + ИЛИ ЭтоДокумент(ОбъектМД) + ИЛИ ЭтоЗадача(ОбъектМД) + ИЛИ ЭтоБизнесПроцесс(ОбъектМД)) Тогда + + Продолжить; + КонецЕсли; + + Если ПустаяСтрока(СтрокаТаблицы.ИмяТабличнойЧасти) Тогда // реквизиты шапки + + Для Каждого Реквизит ИЗ СтрокаТаблицы.СтруктураРеквизитовРегистрации Цикл + + Если ЭтоЗадача(ОбъектМД) Тогда + + Если НЕ (ОбъектМД.Реквизиты.Найти(Реквизит.Ключ) <> Неопределено + ИЛИ ОбъектМД.РеквизитыАдресации.Найти(Реквизит.Ключ) <> Неопределено + ИЛИ ОбменДаннымиСервер.ЭтоСтандартныйРеквизит(ОбъектМД.СтандартныеРеквизиты, Реквизит.Ключ)) Тогда + + СтрокаСообщения = НСтр("ru = 'Неправильно указаны реквизиты шапки объекта ""[ОбъектМД]"". Реквизит ""[Реквизит]"" не существует'"); + + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОбъектМД]", Строка(ОбъектМД)); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[Реквизит]", Реквизит.Ключ); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщения); + ЗаписатьВПротоколВыполнения(СтрокаСообщения); + + КонецЕсли; + + Иначе + + Если НЕ (ОбъектМД.Реквизиты.Найти(Реквизит.Ключ) <> Неопределено + ИЛИ ОбменДаннымиСервер.ЭтоСтандартныйРеквизит(ОбъектМД.СтандартныеРеквизиты, Реквизит.Ключ)) Тогда + + + СтрокаСообщения = НСтр("ru = 'Неправильно указаны реквизиты шапки объекта ""[ОбъектМД]"". Реквизит ""[Реквизит]"" не существует'"); + + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОбъектМД]", Строка(ОбъектМД)); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[Реквизит]", Реквизит.Ключ); + + // выводим сообщение об ошибке пользователю + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщения); + + ЗаписатьВПротоколВыполнения(СтрокаСообщения); + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Иначе // реквизиты табличной части + + Для Каждого Реквизит ИЗ СтрокаТаблицы.СтруктураРеквизитовРегистрации Цикл + + Если НЕ (ОбъектМД.ТабличныеЧасти[СтрокаТаблицы.ИмяТабличнойЧасти].Реквизиты.Найти(Реквизит.Ключ) <> Неопределено + ИЛИ ОбменДаннымиСервер.ЭтоСтандартныйРеквизит(ОбъектМД.ТабличныеЧасти[СтрокаТаблицы.ИмяТабличнойЧасти].СтандартныеРеквизиты, Реквизит.Ключ)) Тогда + + СтрокаСообщения = НСтр("ru = 'Неправильно указаны реквизиты табличной части ""[ИмяТабличнойЧасти]"" объекта ""[ОбъектМД]"". Реквизит ""[Реквизит]"" не существует.'"); + + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ИмяТабличнойЧасти]", СтрокаТаблицы.ИмяТабличнойЧасти); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОбъектМД]", Строка(ОбъектМД)); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[Реквизит]", Реквизит.Ключ); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщения); + + ЗаписатьВПротоколВыполнения(СтрокаСообщения); + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоПравилу(ПКО, ТаблицаРезультат) + + ИмяОбъекта = СтрЗаменить(ПКО.ТипИсточника, "Ссылка", ""); + ТипОбъектаСтрокой = ПКО.ТипИсточника; + + // заполняем таблицу реквизитами шапки (свойства) + ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, "", -50, ПКО.Свойства, ТаблицаРезультат); + + // заполняем таблицу реквизитами шапки (свойства поиска) + ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, "", -50, ПКО.СвойстваПоиска, ТаблицаРезультат); + + // заполняем таблицу реквизитами шапки (свойства отключенные) + ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, "", -50, ПКО.СвойстваОтключенные, ТаблицаРезультат); + + // табличные части правила + МассивПКГС = ПКО.Свойства.НайтиСтроки(Новый Структура("ЭтоГруппа", Истина)); + + Для Каждого ПКГС ИЗ МассивПКГС Цикл + + // заполняем таблицу реквизитами табличной части + ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, ПКГС.Источник, ПКГС.Порядок, ПКГС.ПравилаГруппы, ТаблицаРезультат); + + // заполняем таблицу реквизитами табличной части (отключенные) + ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, ПКГС.Источник, ПКГС.Порядок, ПКГС.ПравилаГруппыОтключенные, ТаблицаРезультат); + + КонецЦикла; + + // табличные части правила (отключенные) + МассивПКГС = ПКО.СвойстваОтключенные.НайтиСтроки(Новый Структура("ЭтоГруппа", Истина)); + + Для Каждого ПКГС ИЗ МассивПКГС Цикл + + // заполняем таблицу реквизитами табличной части + ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, ПКГС.Источник, ПКГС.Порядок, ПКГС.ПравилаГруппы, ТаблицаРезультат); + + // заполняем таблицу реквизитами табличной части (отключенные) + ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, ПКГС.Источник, ПКГС.Порядок, ПКГС.ПравилаГруппыОтключенные, ТаблицаРезультат); + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаполнитьТаблицуРеквизитовРегистрацииОбъектовПоТаблице(ТипОбъектаСтрокой, ИмяОбъекта, ИмяТабличнойЧасти, Порядок, ТаблицаСвойств, ТаблицаРезультат) + + СтрокаТаблицыРезультат = ТаблицаРезультат.Добавить(); + + СтрокаТаблицыРезультат.Порядок = Порядок; + СтрокаТаблицыРезультат.ИмяОбъекта = ИмяОбъекта; + СтрокаТаблицыРезультат.ТипОбъектаСтрокой = ТипОбъектаСтрокой; + СтрокаТаблицыРезультат.ИмяТабличнойЧасти = ИмяТабличнойЧасти; + СтрокаТаблицыРезультат.СтруктураРеквизитовРегистрации = ПолучитьСтруктуруРеквизитовРегистрации(ТаблицаСвойств); + +КонецПроцедуры + +Процедура ДополнитьТаблицуРеквизитовРегистрации(МассивСтрок, ТаблицаРеквизитовРегистрации) + + СтрокаТаблицы = ТаблицаРеквизитовРегистрации.Добавить(); + + СтрокаТаблицы.Порядок = МассивСтрок[0].Порядок; + СтрокаТаблицы.ИмяОбъекта = МассивСтрок[0].ИмяОбъекта; + СтрокаТаблицы.ТипОбъектаСтрокой = МассивСтрок[0].ТипОбъектаСтрокой; + СтрокаТаблицы.ИмяТабличнойЧасти = МассивСтрок[0].ИмяТабличнойЧасти; + СтрокаТаблицы.СтруктураРеквизитовРегистрации = ПолучитьСтруктуруРеквизитовРегистрацииПоМассивуСтрок(МассивСтрок); + СтрокаТаблицы.РеквизитыРегистрации = ПолучитьРеквизитыРегистрации(СтрокаТаблицы.СтруктураРеквизитовРегистрации); + +КонецПроцедуры + +Процедура УдалитьСтрокиСОшибкамиТаблицыРеквизитовРегистрации(ТаблицаРеквизитовРегистрации) + + КолвоЭлементовКоллекции = ТаблицаРеквизитовРегистрации.Количество(); + + Для ОбратныйИндекс = 1 По КолвоЭлементовКоллекции Цикл + + СтрокаТаблицы = ТаблицаРеквизитовРегистрации[КолвоЭлементовКоллекции - ОбратныйИндекс]; + + // если нет реквизитов регистрации, то удаляем строку + Если ПустаяСтрока(СтрокаТаблицы.РеквизитыРегистрации) Тогда + + ТаблицаРеквизитовРегистрации.Удалить(СтрокаТаблицы); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТИРУЕМЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Подготавливает строку с информацией о правилах на основании зачитанных данных из XML-файла +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// СтрокаИнформации - Строка - строка с информацией о правилах +// +Функция ПолучитьИнформациюОПравилах() Экспорт + + // возвращаемое значение функции + СтрокаИнформации = ""; + + Если ФлагОшибки() Тогда + Возврат СтрокаИнформации; + КонецЕсли; + + СтрокаИнформации = НСтр("ru = 'Правила обмена + |Дата создания: [ДатаВремяСоздания] + |Конфигурация источник: [ПредставлениеКонфигурацииИсточника] + |Конфигурация приемник: [ПредставлениеКонфигурацииПриемника]'"); + + ПредставлениеКонфигурацииИсточника = ПолучитьПредставлениеКонфигурацииИзПравилОбмена("Источника"); + ПредставлениеКонфигурацииПриемника = ПолучитьПредставлениеКонфигурацииИзПравилОбмена("Приемника"); + + СтрокаИнформации = СтрЗаменить(СтрокаИнформации, "[ДатаВремяСоздания]", Конвертация.ДатаВремяСоздания); + СтрокаИнформации = СтрЗаменить(СтрокаИнформации, "[ПредставлениеКонфигурацииИсточника]", ПредставлениеКонфигурацииИсточника); + СтрокаИнформации = СтрЗаменить(СтрокаИнформации, "[ПредставлениеКонфигурацииПриемника]", ПредставлениеКонфигурацииПриемника); + + Возврат СтрокаИнформации; +КонецФункции + +Функция ПолучитьПредставлениеКонфигурацииИзПравилОбмена(ИмяОпределения) + + ИмяКонфигурации = ""; + Конвертация.Свойство("СинонимКонфигурации" + ИмяОпределения, ИмяКонфигурации); + + Если Не ЗначениеЗаполнено(ИмяКонфигурации) Тогда + Возврат ""; + КонецЕсли; + + ТочнаяВерсия = ""; + Конвертация.Свойство("ВерсияКонфигурации" + ИмяОпределения, ТочнаяВерсия); + + Если ЗначениеЗаполнено(ТочнаяВерсия) Тогда + + ТочнаяВерсия = СтроковыеФункцииКлиентСервер.ВерсияКонфигурацииБезНомераСборки(ТочнаяВерсия); + + ИмяКонфигурации = ИмяКонфигурации + " (" + ТочнаяВерсия + ")"; + + КонецЕсли; + + Возврат ИмяКонфигурации; + +КонецФункции + +// Устанавливает состояние пометки у подчиненных строк строки дерева значений +// в зависимости от пометки текущей строки +// +// Параметры: +// ТекСтрока - Строка дерева значений +// +Процедура УстановитьПометкиПодчиненных(ТекСтрока, Реквизит) Экспорт + + Подчиненные = ТекСтрока.Строки; + + Если Подчиненные.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для Каждого Строка из Подчиненные Цикл + + Если Строка.НастройкиПостроителя = Неопределено + И Реквизит = "ИспользоватьОтбор" Тогда + + Строка[Реквизит] = 0; + + Иначе + + Строка[Реквизит] = ТекСтрока[Реквизит]; + + КонецЕсли; + + УстановитьПометкиПодчиненных(Строка, Реквизит); + + КонецЦикла; + +КонецПроцедуры // УстановитьПометкиПодчиненных() + +Процедура ЗаполнитьСвойстваДляПоиска(СтруктураДанных, ПКС) + + Для Каждого СтрокаПолей Из ПКС Цикл + + Если СтрокаПолей.ЭтоГруппа ТОгда + + Если СтрокаПолей.ВидПриемника = "ТабличнаяЧасть" + ИЛИ Найти(СтрокаПолей.ВидПриемника, "НаборДвижений") > 0 Тогда + + ИмяСтруктурыПриемника = СтрокаПолей.Приемник + ?(СтрокаПолей.ВидПриемника = "ТабличнаяЧасть", "ТабличнаяЧасть", "НаборЗаписей"); + + ВнутренняяСтруктура = СтруктураДанных[ИмяСтруктурыПриемника]; + + Если ВнутренняяСтруктура = Неопределено Тогда + ВнутренняяСтруктура = Новый Соответствие(); + КонецЕсли; + + СтруктураДанных[ИмяСтруктурыПриемника] = ВнутренняяСтруктура; + + Иначе + + ВнутренняяСтруктура = СтруктураДанных; + + КонецЕсли; + + ЗаполнитьСвойстваДляПоиска(ВнутренняяСтруктура, СтрокаПолей.ПравилаГруппы); + + Иначе + + Если ПустаяСтрока(СтрокаПолей.ТипПриемника) Тогда + + Продолжить; + + КонецЕсли; + + СтруктураДанных[СтрокаПолей.Приемник] = СтрокаПолей.ТипПриемника; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура УдалитьЛишниеЭлементыИзСоответствия(СтруктураДанных) + + Для Каждого Элемент Из СтруктураДанных Цикл + + Если ТипЗнч(Элемент.Значение) = ТипСоответствие Тогда + + УдалитьЛишниеЭлементыИзСоответствия(Элемент.Значение); + + Если Элемент.Значение.Количество() = 0 Тогда + СтруктураДанных.Удалить(Элемент.Ключ); + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаполнитьИнформациюПоТипамДанныхПриемника(СтруктураДанных, Правила) + + Для Каждого Строка Из Правила Цикл + + Если ПустаяСтрока(Строка.Приемник) Тогда + Продолжить; + КонецЕсли; + + ДанныеСтруктуры = СтруктураДанных[Строка.Приемник]; + Если ДанныеСтруктуры = Неопределено Тогда + + ДанныеСтруктуры = Новый Соответствие(); + СтруктураДанных[Строка.Приемник] = ДанныеСтруктуры; + + КонецЕсли; + + // бежим по полям поиск и прочим ПКС и запоминаем типы данных + ЗаполнитьСвойстваДляПоиска(ДанныеСтруктуры, Строка.СвойстваПоиска); + + // Свойства + ЗаполнитьСвойстваДляПоиска(ДанныеСтруктуры, Строка.Свойства); + + КонецЦикла; + + УдалитьЛишниеЭлементыИзСоответствия(СтруктураДанных); + +КонецПроцедуры + +Процедура СоздатьСтрокуСТипамиСвойств(ЗаписьXML, ТипыСвойств) + + Если ТипЗнч(ТипыСвойств.Значение) = ТипСоответствие Тогда + + Если ТипыСвойств.Значение.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ЗаписьXML.ЗаписатьНачалоЭлемента(ТипыСвойств.Ключ); + + Для Каждого Эл Из ТипыСвойств.Значение Цикл + СоздатьСтрокуСТипамиСвойств(ЗаписьXML, Эл); + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + + Иначе + + одЗаписатьЭлемент(ЗаписьXML, ТипыСвойств.Ключ, ТипыСвойств.Значение); + + КонецЕсли; + +КонецПроцедуры + +Функция СоздатьСтрокуСТипамиДляПриемника(СтруктураДанных) + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + ЗаписьXML.ЗаписатьНачалоЭлемента("ИнформацияОТипахДанных"); + + Для Каждого Строка Из СтруктураДанных Цикл + + ЗаписьXML.ЗаписатьНачалоЭлемента("ТипДанных"); + УстановитьАтрибут(ЗаписьXML, "Имя", Строка.Ключ); + + Для Каждого СтрокаПодчинения Из Строка.Значение Цикл + + СоздатьСтрокуСТипамиСвойств(ЗаписьXML, СтрокаПодчинения); + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + + СтрокаРезультата = ЗаписьXML.Закрыть(); + Возврат СтрокаРезультата; + +КонецФункции + +Процедура ЗагрузитьОдинТипДанных(ПравилаОбмена, СоответствиеТипа, ИмяЛокЭлемента) + + ИмяУзла = ИмяЛокЭлемента; + + ПравилаОбмена.Прочитать(); + + Если (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + ПравилаОбмена.Прочитать(); + Возврат; + + ИначеЕсли ПравилаОбмена.ТипУзла = ТипУзлаXMLНачалоЭлемента Тогда + + // это новый элемент + НовоеСоответствие = Новый Соответствие; + СоответствиеТипа.Вставить(ИмяУзла, НовоеСоответствие); + + ЗагрузитьОдинТипДанных(ПравилаОбмена, НовоеСоответствие, ПравилаОбмена.ЛокальноеИмя); + ПравилаОбмена.Прочитать(); + + Иначе + СоответствиеТипа.Вставить(ИмяУзла, Тип(ПравилаОбмена.Значение)); + ПравилаОбмена.Прочитать(); + КонецЕсли; + + ЗагрузитьСоответствиеТиповДляОдногоТипа(ПравилаОбмена, СоответствиеТипа); + +КонецПроцедуры + +Процедура ЗагрузитьСоответствиеТиповДляОдногоТипа(ПравилаОбмена, СоответствиеТипа) + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; + + КонецЕсли; + + // прочитали начало элемента + ПравилаОбмена.Прочитать(); + + Если ПравилаОбмена.ТипУзла = ТипУзлаXMLНачалоЭлемента Тогда + + // это новый элемент + НовоеСоответствие = Новый Соответствие; + СоответствиеТипа.Вставить(ИмяУзла, НовоеСоответствие); + + ЗагрузитьОдинТипДанных(ПравилаОбмена, НовоеСоответствие, ПравилаОбмена.ЛокальноеИмя); + + Иначе + СоответствиеТипа.Вставить(ИмяУзла, Тип(ПравилаОбмена.Значение)); + ПравилаОбмена.Прочитать(); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗагрузитьИнформациюОТипахДанных() + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "ТипДанных" Тогда + + ИмяТипа = одАтрибут(ФайлОбмена, ТипСтрока, "Имя"); + + СоответствиеТипа = Новый Соответствие; + СоответствиеТиповДанныхДляЗагрузки().Вставить(Тип(ИмяТипа), СоответствиеТипа); + + ЗагрузитьСоответствиеТиповДляОдногоТипа(ФайлОбмена, СоответствиеТипа); + + ИначеЕсли (ИмяУзла = "ИнформацияОТипахДанных") И (ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗагрузитьЗначенияПараметровОбменаДанными() + + Имя = одАтрибут(ФайлОбмена, ТипСтрока, "Имя"); + + ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(Неопределено, Имя); + + Значение = ПрочитатьСвойство(ТипСвойства); + + Параметры.Вставить(Имя, Значение); + + АлгоритмПослеЗагрузкиПараметра = ""; + Если СобытияПослеЗагрузкиПараметров.Свойство(Имя, АлгоритмПослеЗагрузкиПараметра) + И Не ПустаяСтрока(АлгоритмПослеЗагрузкиПараметра) Тогда + + Выполнить(АлгоритмПослеЗагрузкиПараметра); + + КонецЕсли; + +КонецПроцедуры + +Процедура ЗагрузитьИнформациюОПользовательскихПоляхПоиска() + + ИмяПравила = ""; + НастройкаПоиска = ""; + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "ИмяПравила" Тогда + + ИмяПравила = одЗначениеЭлемента(ФайлОбмена, ТипСтрока); + + ИначеЕсли ИмяУзла = "НастройкаПоиска" Тогда + + НастройкаПоиска = одЗначениеЭлемента(ФайлОбмена, ТипСтрока); + ИнформацияОПользовательскихПоляхПоискаПриЗагрузкеДанных.Вставить(ИмяПравила, НастройкаПоиска); + + ИначеЕсли (ИмяУзла = "НастройкаПользовательскогоПоиска") И (ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Осуществляет загрузку правил обмена в соответствии с форматом +// +// Параметры: +// Источник - Объект, из которого осуществляется загрузка правил обмена; +// ТипИсточника - Строка, указывающая тип источника: "XMLФайл", "ЧтениеXML", "Строка" +// +Процедура ЗагрузитьПравилаОбмена( Источник="", + ТипИсточника="XMLФайл", + СтрокаСообщенияОбОшибке = "", + ЗагружатьТолькоЗаголовокПравил = Ложь) Экспорт + // + ИнициализироватьМенеджерыИСообщения(); + + ЕстьГлобальныйОбработчикПередВыгрузкойОбъекта = Ложь; + ЕстьГлобальныйОбработчикПослеВыгрузкиОбъекта = Ложь; + + ЕстьГлобальныйОбработчикПередКонвертациейОбъекта = Ложь; + + ЕстьГлобальныйОбработчикПередЗагрузкойОбъекта = Ложь; + ЕстьГлобальныйОбработчикПослеЗагрузкиОбъекта = Ложь; + + СоздатьСтруктуруКонвертации(); + + ТаблицаПравилКонвертацииСвойств = Новый ТаблицаЗначений; + ИнициализацияТаблицыПравилКонвертацииСвойств(ТаблицаПравилКонвертацииСвойств); + + // Возможно выбраны встроенные правила обмена (один из макетов) + + ИмяВременногоФайлаПравилОбмена = ""; + Если ПустаяСтрока(Источник) Тогда + + Источник = ИмяФайлаПравилОбмена; + + КонецЕсли; + + Если ТипИсточника="XMLФайл" Тогда + + Если ПустаяСтрока(Источник) Тогда + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(12); + Возврат; + КонецЕсли; + + Файл = Новый Файл(Источник); + Если Не Файл.Существует() Тогда + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(3); + Возврат; + КонецЕсли; + + ПравилаОбмена = Новый ЧтениеXML(); + ПравилаОбмена.ОткрытьФайл(Источник); + ПравилаОбмена.Прочитать(); + + ИначеЕсли ТипИсточника="Строка" Тогда + + ПравилаОбмена = Новый ЧтениеXML(); + ПравилаОбмена.УстановитьСтроку(Источник); + ПравилаОбмена.Прочитать(); + + ИначеЕсли ТипИсточника="ЧтениеXML" Тогда + + ПравилаОбмена = Источник; + + КонецЕсли; + + + Если Не ((ПравилаОбмена.ЛокальноеИмя = "ПравилаОбмена") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLНачалоЭлемента)) Тогда + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(7); + Возврат; + КонецЕсли; + + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + ЗаписьXML.ЗаписатьНачалоЭлемента("ПравилаОбмена"); + + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + // Реквизиты конвертации + Если ИмяУзла = "ВерсияФормата" Тогда + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + Конвертация.Вставить("ВерсияФормата", Значение); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + ИначеЕсли ИмяУзла = "Ид" Тогда + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + Конвертация.Вставить("Ид", Значение); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + ИначеЕсли ИмяУзла = "Наименование" Тогда + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + Конвертация.Вставить("Наименование", Значение); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + ИначеЕсли ИмяУзла = "ДатаВремяСоздания" Тогда + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипДата); + Конвертация.Вставить("ДатаВремяСоздания", Значение); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + ВерсияПравилОбмена = Конвертация.ДатаВремяСоздания; + ИначеЕсли ИмяУзла = "Источник" Тогда + + ВерсияПлатформыИсточника = ПравилаОбмена.ПолучитьАтрибут ("ВерсияПлатформы"); + СинонимКонфигурацииИсточника = ПравилаОбмена.ПолучитьАтрибут ("СинонимКонфигурации"); + ВерсияКонфигурацииИсточника = ПравилаОбмена.ПолучитьАтрибут ("ВерсияКонфигурации"); + + Конвертация.Вставить("ВерсияПлатформыИсточника", ВерсияПлатформыИсточника); + Конвертация.Вставить("СинонимКонфигурацииИсточника", СинонимКонфигурацииИсточника); + Конвертация.Вставить("ВерсияКонфигурацииИсточника", ВерсияКонфигурацииИсточника); + + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + Конвертация.Вставить("Источник", Значение); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + + ИначеЕсли ИмяУзла = "Приемник" Тогда + + ВерсияПлатформыПриемника = ПравилаОбмена.ПолучитьАтрибут ("ВерсияПлатформы"); + СинонимКонфигурацииПриемника = ПравилаОбмена.ПолучитьАтрибут ("СинонимКонфигурации"); + ВерсияКонфигурацииПриемника = ПравилаОбмена.ПолучитьАтрибут ("ВерсияКонфигурации"); + + Конвертация.Вставить("ВерсияПлатформыПриемника", ВерсияПлатформыПриемника); + Конвертация.Вставить("СинонимКонфигурацииПриемника", СинонимКонфигурацииПриемника); + Конвертация.Вставить("ВерсияКонфигурацииПриемника", ВерсияКонфигурацииПриемника); + + Значение = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + Конвертация.Вставить("Приемник", Значение); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + + Если ЗагружатьТолькоЗаголовокПравил Тогда + Возврат; + КонецЕсли; + + ИначеЕсли ИмяУзла = "Комментарий" Тогда + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "ОсновнойПланОбмена" Тогда + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "Параметры" Тогда + ЗагрузитьПараметры(ПравилаОбмена, ЗаписьXML) + + // События конвертации + + ИначеЕсли ИмяУзла = "" Тогда + + ИначеЕсли ИмяУзла = "ПослеЗагрузкиПравилОбмена" Тогда + Конвертация.Вставить("ПослеЗагрузкиПравилОбмена", одЗначениеЭлемента(ПравилаОбмена, ТипСтрока)); + + ИначеЕсли ИмяУзла = "ПередВыгрузкойДанных" Тогда + Конвертация.Вставить("ПередВыгрузкойДанных", одЗначениеЭлемента(ПравилаОбмена, ТипСтрока)); + + ИначеЕсли ИмяУзла = "ПередПолучениемИзмененныхОбъектов" Тогда + Конвертация.Вставить("ПередПолучениемИзмененныхОбъектов", одЗначениеЭлемента(ПравилаОбмена, ТипСтрока)); + + ИначеЕсли ИмяУзла = "ПослеПолученияИнформацииОбУзлахОбмена" Тогда + + Конвертация.Вставить("ПослеПолученияИнформацииОбУзлахОбмена", одЗначениеЭлемента(ПравилаОбмена, ТипСтрока)); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Конвертация.ПослеПолученияИнформацииОбУзлахОбмена); + + ИначеЕсли ИмяУзла = "ПослеВыгрузкиДанных" Тогда + Конвертация.Вставить("ПослеВыгрузкиДанных", одЗначениеЭлемента(ПравилаОбмена, ТипСтрока)); + + ИначеЕсли ИмяУзла = "ПередОтправкойИнформацииОбУдалении" Тогда + Конвертация.Вставить("ПередОтправкойИнформацииОбУдалении", одЗначениеЭлемента(ПравилаОбмена, ТипСтрока)); + + ИначеЕсли ИмяУзла = "ПередВыгрузкойОбъекта" Тогда + Конвертация.Вставить("ПередВыгрузкойОбъекта", одЗначениеЭлемента(ПравилаОбмена, ТипСтрока)); + ЕстьГлобальныйОбработчикПередВыгрузкойОбъекта = Не ПустаяСтрока(Конвертация.ПередВыгрузкойОбъекта); + + ИначеЕсли ИмяУзла = "ПослеВыгрузкиОбъекта" Тогда + Конвертация.Вставить("ПослеВыгрузкиОбъекта", одЗначениеЭлемента(ПравилаОбмена, ТипСтрока)); + ЕстьГлобальныйОбработчикПослеВыгрузкиОбъекта = Не ПустаяСтрока(Конвертация.ПослеВыгрузкиОбъекта); + + ИначеЕсли ИмяУзла = "ПередЗагрузкойОбъекта" Тогда + Конвертация.Вставить("ПередЗагрузкойОбъекта", одЗначениеЭлемента(ПравилаОбмена, ТипСтрока)); + ЕстьГлобальныйОбработчикПередЗагрузкойОбъекта = Не ПустаяСтрока(Конвертация.ПередЗагрузкойОбъекта); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Конвертация.ПередЗагрузкойОбъекта); + + ИначеЕсли ИмяУзла = "ПослеЗагрузкиОбъекта" Тогда + Конвертация.Вставить("ПослеЗагрузкиОбъекта", одЗначениеЭлемента(ПравилаОбмена, ТипСтрока)); + ЕстьГлобальныйОбработчикПослеЗагрузкиОбъекта = Не ПустаяСтрока(Конвертация.ПослеЗагрузкиОбъекта); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Конвертация.ПослеЗагрузкиОбъекта); + + ИначеЕсли ИмяУзла = "ПередКонвертациейОбъекта" Тогда + Конвертация.Вставить("ПередКонвертациейОбъекта", одЗначениеЭлемента(ПравилаОбмена, ТипСтрока)); + ЕстьГлобальныйОбработчикПередКонвертациейОбъекта = Не ПустаяСтрока(Конвертация.ПередКонвертациейОбъекта); + + ИначеЕсли ИмяУзла = "ПередЗагрузкойДанных" Тогда + Конвертация.ПередЗагрузкойДанных = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Конвертация.ПередЗагрузкойДанных); + + ИначеЕсли ИмяУзла = "ПослеЗагрузкиДанных" Тогда + Конвертация.ПослеЗагрузкиДанных = одЗначениеЭлемента(ПравилаОбмена, ТипСтрока); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Конвертация.ПослеЗагрузкиДанных); + + ИначеЕсли ИмяУзла = "ПослеЗагрузкиПараметров" Тогда + Конвертация.Вставить("ПослеЗагрузкиПараметров", одЗначениеЭлемента(ПравилаОбмена, ТипСтрока)); + + ИначеЕсли ИмяУзла = "ПриПолученииИнформацииОбУдалении" Тогда + Конвертация.Вставить("ПриПолученииИнформацииОбУдалении", одЗначениеЭлемента(ПравилаОбмена, ТипСтрока)); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Конвертация.ПриПолученииИнформацииОбУдалении); + + ИначеЕсли ИмяУзла = "УдалятьСопоставленныеОбъектыВПриемникеПриИхУдаленииВИсточнике" Тогда + Конвертация.УдалятьСопоставленныеОбъектыВПриемникеПриИхУдаленииВИсточнике = одЗначениеЭлемента(ПравилаОбмена, ТипБулево); + + // Правила + + ИначеЕсли ИмяУзла = "ПравилаВыгрузкиДанных" Тогда + Если РежимОбмена = "Загрузка" Тогда + одПропустить(ПравилаОбмена); + Иначе + ЗагрузитьПравилаВыгрузки(ПравилаОбмена); + КонецЕсли; + + ИначеЕсли ИмяУзла = "ПравилаКонвертацииОбъектов" Тогда + ЗагрузитьПравилаКонвертации(ПравилаОбмена, ЗаписьXML); + + ИначеЕсли ИмяУзла = "ПравилаОчисткиДанных" Тогда + ЗагрузитьПравилаОчистки(ПравилаОбмена, ЗаписьXML) + + ИначеЕсли ИмяУзла = "ПравилаРегистрацииОбъектов" Тогда + одПропустить(ПравилаОбмена); + + // Алгоритмы / Запросы / Обработки + + ИначеЕсли ИмяУзла = "Алгоритмы" Тогда + ЗагрузитьАлгоритмы(ПравилаОбмена, ЗаписьXML); + + ИначеЕсли ИмяУзла = "Запросы" Тогда + ЗагрузитьЗапросы(ПравилаОбмена, ЗаписьXML); + + ИначеЕсли ИмяУзла = "Обработки" Тогда + ЗагрузитьОбработки(ПравилаОбмена, ЗаписьXML); + + // Выход + ИначеЕсли (ИмяУзла = "ПравилаОбмена") И (ПравилаОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + Если РежимОбмена <> "Загрузка" Тогда + ПравилаОбмена.Закрыть(); + КонецЕсли; + Прервать; + + + // Ошибка формата + Иначе + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(7); + Возврат; + КонецЕсли; + КонецЦикла; + + + ЗаписьXML.ЗаписатьКонецЭлемента(); + XMLПравила = ЗаписьXML.Закрыть(); + + // Удаляем временный файл правил + Если Не ПустаяСтрока(ИмяВременногоФайлаПравилОбмена) Тогда + Попытка + УдалитьФайлы(ИмяВременногоФайлаПравилОбмена); + Исключение + КонецПопытки; + КонецЕсли; + + // дополнительно нужна информация по типам данных приемника для быстрой загрузки данных + СтруктураДанных = Новый Соответствие(); + ЗаполнитьИнформациюПоТипамДанныхПриемника(СтруктураДанных, ТаблицаПравилКонвертации); + + СтрокаТиповДляПриемника = СоздатьСтрокуСТипамиДляПриемника(СтруктураДанных); + + // нужно вызвать событие после загрузки правил обмена + ТекстСобытияПослеЗагрузкиПравилОбмена = ""; + Если Конвертация.Свойство("ПослеЗагрузкиПравилОбмена", ТекстСобытияПослеЗагрузкиПравилОбмена) + И Не ПустаяСтрока(ТекстСобытияПослеЗагрузкиПравилОбмена) Тогда + + Попытка + Выполнить(ТекстСобытияПослеЗагрузкиПравилОбмена); + Исключение + СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(75, ОписаниеОшибки(), НСтр("ru = 'ПослеЗагрузкиПравилОбмена (конвертация)'")); + Отказ = Истина; + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + + КонецЕсли; + + ИнициализироватьПервоначальныеЗначенияПараметров(); + +КонецПроцедуры // ЗагрузитьПравилаОбмена() + +Процедура ОбработатьОкончаниеЧтенияНовогоЭлемента(ПоследнийОбъектЗагрузки) + + Инкремент(ПолеСчетчикЗагруженныхОбъектов); + + Если СчетчикЗагруженныхОбъектов() % 100 = 0 + И ГлобальныйСтекНеЗаписанныхОбъектов.Количество() > 100 Тогда + + ПровестиЗаписьНеЗаписанныхОбъектов(); + + КонецЕсли; + + Если ИспользоватьТранзакции + И КоличествоОбъектовНаТранзакцию > 0 + И СчетчикЗагруженныхОбъектов() % КоличествоОбъектовНаТранзакцию = 0 Тогда + + ЗафиксироватьТранзакцию(); + НачатьТранзакцию(); + + КонецЕсли; + +КонецПроцедуры + +Процедура УдалитьОбъектПоСсылке(Ссылка, СтрокаСообщенияОбОшибке) + + Объект = Ссылка.ПолучитьОбъект(); + + Если Объект = Неопределено Тогда + Возврат; + КонецЕсли; + + ТекстСобытия = ""; + Если Конвертация.Свойство("ПриПолученииИнформацииОбУдалении", ТекстСобытия) Тогда + + Отказ = Ложь; + + Попытка + Выполнить(ТекстСобытия); + Исключение + СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(77, ОписаниеОшибки(), НСтр("ru = 'ПриПолученииИнформацииОбУдалении (конвертация)'")); + Отказ = Истина; + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + + Если Отказ Тогда + Возврат; + КонецЕсли; + + КонецЕсли; + + УдалитьОбъект(Объект, Истина); + +КонецПроцедуры + +Процедура ПрочитатьУдалениеОбъекта(СтрокаСообщенияОбОшибке) + + ТипИсточникаСтрокой = одАтрибут(ФайлОбмена, ТипСтрока, "ТипПриемника"); + ТипПриемникаСтрокой = одАтрибут(ФайлОбмена, ТипСтрока, "ТипИсточника"); + + УникальныйИдентификаторСтрокой = одАтрибут(ФайлОбмена, ТипСтрока, "УникальныйИдентификатор"); + + ВыполнитьЗаменуУникальногоИдентификатораПриНеобходимости(УникальныйИдентификаторСтрокой, ТипИсточникаСтрокой, ТипПриемникаСтрокой); + + СтруктураСвойств = Менеджеры[Тип(ТипИсточникаСтрокой)]; + + Ссылка = СтруктураСвойств.Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(УникальныйИдентификаторСтрокой)); + + УдалитьОбъектПоСсылке(Ссылка, СтрокаСообщенияОбОшибке); + +КонецПроцедуры + +// Открывает файл сообщения обмена +// Проверяет файл сообщения на соответствие формату +// Зачитывает правила обмена (при необходимости) +// +// Параметры: +// Нет. +// +Процедура ОткрытьФайлОбмена() + + ФайлОбмена = Новый ЧтениеXML; + + Попытка + ФайлОбмена.ОткрытьФайл(ИмяФайлаОбмена); + ФайлОбмена.Прочитать(); + Исключение + СтрокаСообщенияОбОшибке = НСтр("ru = 'Ошибка при загрузке данных: [ОписаниеОшибки]'"); + СтрокаСообщенияОбОшибке = СтрЗаменить(СтрокаСообщенияОбОшибке, "[ОписаниеОшибки]", ОписаниеОшибки()); + ЗаписатьВПротоколВыполнения(СтрокаСообщенияОбОшибке); + Возврат; + КонецПопытки; + + Если ФайлОбмена.ЛокальноеИмя <> "ФайлОбмена" Тогда + + ЗаписатьВПротоколВыполнения(9); + Возврат; + + КонецЕсли; + + ФайлОбмена.Прочитать(); + + Если ФайлОбмена.ЛокальноеИмя <> "ПравилаОбмена" Тогда + + ЗаписатьВПротоколВыполнения(9); + Возврат; + + КонецЕсли; + + Если ТаблицаПравилКонвертации.Количество() = 0 Тогда + ЗагрузитьПравилаОбмена(ФайлОбмена, "ЧтениеXML"); + Иначе + одПропустить(ФайлОбмена); + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьЗагрузкуФайлаПакета(ТаблицыДляЗагрузки) + + Если ТаблицыДляЗагрузки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + УстановитьФлагОшибки(Ложь); + + ИнициализироватьКомментарииПриВыгрузкеИЗагрузкеДанных(); + + ИнформацияОПользовательскихПоляхПоискаПриЗагрузкеДанных = Новый Соответствие; + СоответствиеДопПараметровПоиска = Новый Соответствие; + СоответствиеАлгоритмовПоискаЭлементов = Новый Соответствие; + + // инициализируем ведение протокола обмена + ИнициализироватьВедениеПротоколаОбмена(); + + Если ПустаяСтрока(ИмяФайлаОбмена) Тогда + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(15); + ЗавершитьВедениеПротоколаОбмена(); + Возврат; + КонецЕсли; + + Если КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 0 Тогда + КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 100; + КонецЕсли; + + ГлобальныйСтекНеЗаписанныхОбъектов = Новый Соответствие; + + ПолеСчетчикЗагруженныхОбъектов = Неопределено; + НомерПоследнегоПоискаПоСсылке = 0; + + ИнициализироватьМенеджерыИСообщения(); + + // открываем файл сообщения обмена + // загружаем правила обмена данными (при необходимости) + ОткрытьФайлОбмена(); + + Если ФлагОшибки() Тогда + ЗавершитьВедениеПротоколаОбмена(); + Возврат; + КонецЕсли; + + // {Обработчик: ПередЗагрузкойДанных} Начало + Отказ = Ложь; + + Если Не ПустаяСтрока(Конвертация.ПередЗагрузкойДанных) Тогда + + Попытка + Выполнить(Конвертация.ПередЗагрузкойДанных); + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(22, ОписаниеОшибки(), НСтр("ru = 'ПередЗагрузкойДанных (конвертация)'")); + Отказ = Истина; + КонецПопытки; + + КонецЕсли; + + Если Отказ Тогда // Отказ от загрузки данных + ЗавершитьВедениеПротоколаОбмена(); + ФайлОбмена.Закрыть(); + Возврат; + КонецЕсли; + // {Обработчик: ПередЗагрузкойДанных} Окончание + + Попытка + + ПроизвестиЧтениеДанныхДляТаблиц(ТаблицыДляЗагрузки); + + Исключение + СтрокаСообщенияОбОшибке = НСтр("ru = 'Ошибка при загрузке данных: [ОписаниеОшибки]'"); + СтрокаСообщенияОбОшибке = СтрЗаменить(СтрокаСообщенияОбОшибке, "[ОписаниеОшибки]", ОписаниеОшибки()); + ЗаписатьВПротоколВыполнения(СтрокаСообщенияОбОшибке,,,,,Истина); + КонецПопытки; + + ФайлОбмена.Закрыть(); + + // {Обработчик: ПослеЗагрузкиДанных} Начало + Если Не ФлагОшибки() Тогда + + Если Не ПустаяСтрока(Конвертация.ПослеЗагрузкиДанных) Тогда + + Попытка + Выполнить(Конвертация.ПослеЗагрузкиДанных); + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(23, ОписаниеОшибки(), НСтр("ru = 'ПослеЗагрузкиДанных (конвертация)'")); + КонецПопытки; + + КонецЕсли; + + КонецЕсли; + // {Обработчик: ПослеЗагрузкиДанных} Окончание + + Если Не ФлагОшибки() Тогда + + // выполняем проведение документов в очереди + ВыполнитьОтложенноеПроведениеДокументов(); + + КонецЕсли; + + ЗавершитьВедениеПротоколаОбмена(); + +КонецПроцедуры + +Процедура ПроизвестиЧтениеДанных(СтрокаСообщенияОбОшибке = "") + + ЭтоИмяУзлаИнформацияОРегистрацииОбъекта = Ложь; + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + // после прочтения всей информации сопоставления + // необходимо зафиксировать транзакцию при необходимости + // сбросить кэш наличия информации сопоставления + Если ЭтоИмяУзлаИнформацияОРегистрацииОбъекта + И ИмяУзла <> "ИнформацияОРегистрацииОбъекта" Тогда + + ЭтоИмяУзлаИнформацияОРегистрацииОбъекта = Ложь; + + // сбрасываем кэш наличия информации сопоставления + СброситьКэшНаличияИнформацииСопоставления(); + + Если ИспользоватьТранзакции Тогда + + ЗафиксироватьТранзакцию(); + НачатьТранзакцию(); + + КонецЕсли; + + КонецЕсли; + + Если ИмяУзла = "Объект" Тогда + + ПоследнийОбъектЗагрузки = ПрочитатьОбъект(); + + ОбработатьОкончаниеЧтенияНовогоЭлемента(ПоследнийОбъектЗагрузки); + + ИначеЕсли ИмяУзла = "НаборЗаписейРегистра" Тогда + + // набор записей регистра + ПоследнийОбъектЗагрузки = ПрочитатьНаборЗаписейРегистра(); + + ОбработатьОкончаниеЧтенияНовогоЭлемента(ПоследнийОбъектЗагрузки); + + ИначеЕсли ИмяУзла = "УдалениеОбъекта" Тогда + + // обработка удаления объекта из информационной базы + ПрочитатьУдалениеОбъекта(СтрокаСообщенияОбОшибке); + + одПропустить(ФайлОбмена, "УдалениеОбъекта"); + + ОбработатьОкончаниеЧтенияНовогоЭлемента("Удаление объекта"); + + ИначеЕсли ИмяУзла = "ИнформацияОРегистрацииОбъекта" Тогда + + ЭтоИмяУзлаИнформацияОРегистрацииОбъекта = Истина; + + ПоследнийОбъектЗагрузки = ПрочитатьИнформациюОРегистрацииОбъекта(); + + ОбработатьОкончаниеЧтенияНовогоЭлемента(ПоследнийОбъектЗагрузки); + + ИначеЕсли ИмяУзла = "Алгоритм" Тогда + + ТекстАлгоритма = одЗначениеЭлемента(ФайлОбмена, ТипСтрока); + + Если Не ПустаяСтрока(ТекстАлгоритма) Тогда + + Попытка + Выполнить(ТекстАлгоритма); + Исключение + + ЗП = ПолучитьСтруктуруЗаписиПротокола(39, ОписаниеОшибки()); + ЗП.Обработчик = "АлгоритмФайлаОбмена"; + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(39, ЗП, Истина); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + + КонецЕсли; + + ИначеЕсли ИмяУзла = "ПравилаОбмена" Тогда + + Если ТаблицаПравилКонвертации.Количество() = 0 Тогда + ЗагрузитьПравилаОбмена(ФайлОбмена, "ЧтениеXML"); + Иначе + одПропустить(ФайлОбмена, ИмяУзла); + КонецЕсли; + + ИначеЕсли ИмяУзла = "НастройкаПользовательскогоПоиска" Тогда + + ЗагрузитьИнформациюОПользовательскихПоляхПоиска(); + + ИначеЕсли ИмяУзла = "ИнформацияОТипахДанных" Тогда + + Если СоответствиеТиповДанныхДляЗагрузки().Количество() > 0 Тогда + + одПропустить(ФайлОбмена, ИмяУзла); + + Иначе + ЗагрузитьИнформациюОТипахДанных(); + КонецЕсли; + + ИначеЕсли ИмяУзла = "ЗначениеПараметра" Тогда + + ЗагрузитьЗначенияПараметровОбменаДанными(); + + ИначеЕсли ИмяУзла = "АлгоритмПослеЗагрузкиПараметров" Тогда + + Отказ = Ложь; + ПричинаОтказа = ""; + + ТекстАлгоритма = одЗначениеЭлемента(ФайлОбмена, ТипСтрока); + + Если Не ПустаяСтрока(ТекстАлгоритма) Тогда + + Попытка + + Выполнить(ТекстАлгоритма); + + Если Отказ = Истина Тогда + + Если Не ПустаяСтрока(ПричинаОтказа) Тогда + + СтрокаСообщения = НСтр("ru = 'Загрузка данных отменена по причине: [ПричинаОтказа]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ПричинаОтказа]", ПричинаОтказа); + ВызватьИсключение СтрокаСообщения; + Иначе + ВызватьИсключение НСтр("ru = 'Загрузка данных отменена'"); + КонецЕсли; + + КонецЕсли; + + Исключение + + ЗП = ПолучитьСтруктуруЗаписиПротокола(78, ОписаниеОшибки()); + ЗП.Обработчик = "ПослеЗагрузкиПараметров"; + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(78, ЗП, Истина); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + + КонецЕсли; + + ИначеЕсли ИмяУзла = "ДанныеПоОбмену" Тогда + + ПрочитатьДанныеПоОбмену(); + + одПропустить(ФайлОбмена, ИмяУзла); + + Если ФлагОшибки() Тогда + Прервать; + КонецЕсли; + + ИначеЕсли (ИмяУзла = "ФайлОбмена") И (ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; // выходим + + Иначе + + одПропустить(ФайлОбмена, ИмяУзла); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ПроизвестиЧтениеДанныхДляТаблиц(ТаблицыДляЗагрузки) + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Объект" Тогда + + ТипОбъектаСтрокой = одАтрибут(ФайлОбмена, ТипСтрока, "Тип"); + + Если ТаблицыДляЗагрузки.Найти(ТипОбъектаСтрокой) <> Неопределено Тогда + + Если РежимЗагрузкиДанныхВИнформационнуюБазу() Тогда // загрузка в информационную базу + + ОбработатьОкончаниеЧтенияНовогоЭлемента(ПрочитатьОбъект()); + + Иначе // загрузка в таблицу значений + + УникальныйИдентификаторСтрокой = ""; + + ПоследнийОбъектЗагрузки = ПрочитатьОбъект(УникальныйИдентификаторСтрокой); + + Если ПоследнийОбъектЗагрузки <> Неопределено Тогда + + ТаблицаДанныхСообщенияОбмена = ТаблицыДанныхСообщенияОбмена().Получить(ТипОбъектаСтрокой); + + Инкремент(ПолеСчетчикЗагруженныхОбъектов); + + СтрокаТаблицы = ТаблицаДанныхСообщенияОбмена.Добавить(); + + // заполняем значения свойств объекта + ЗаполнитьЗначенияСвойств(СтрокаТаблицы, ПоследнийОбъектЗагрузки); + + СтрокаТаблицы[ИмяКолонкиТипСтрокой()] = ТипОбъектаСтрокой; + СтрокаТаблицы["Ссылка"] = ПоследнийОбъектЗагрузки.Ссылка; + СтрокаТаблицы[ИмяКолонкиУникальныйИдентификатор()] = УникальныйИдентификаторСтрокой; + + КонецЕсли; + + КонецЕсли; + + Иначе + + одПропустить(ФайлОбмена, ИмяУзла); + + КонецЕсли; + + ТипОбъектаСтрокойПредыдущий = ТипОбъектаСтрокой; + + ИначеЕсли ИмяУзла = "ПравилаОбмена" Тогда + + Если ТаблицаПравилКонвертации.Количество() = 0 Тогда + ЗагрузитьПравилаОбмена(ФайлОбмена, "ЧтениеXML"); + Иначе + одПропустить(ФайлОбмена); + КонецЕсли; + + ИначеЕсли ИмяУзла = "ИнформацияОТипахДанных" Тогда + + Если СоответствиеТиповДанныхДляЗагрузки().Количество() > 0 Тогда + + одПропустить(ФайлОбмена, ИмяУзла); + + Иначе + ЗагрузитьИнформациюОТипахДанных(); + КонецЕсли; + + ИначеЕсли (ИмяУзла = "ФайлОбмена") И (ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда + + Прервать; // выходим + + Иначе + + одПропустить(ФайлОбмена, ИмяУзла); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ПроизвестиЧтениеДанныхВРежимеАнализа() + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Объект" Тогда + + СтрокаТаблицы = ТаблицаДанныхЗаголовкаПакета().Добавить(); + + СтрокаТаблицы.ТипОбъектаСтрокой = одАтрибут(ФайлОбмена, ТипСтрока, "Тип"); + СтрокаТаблицы.ИмяПравила = одАтрибут(ФайлОбмена, ТипСтрока, "ИмяПравила"); + СтрокаТаблицы.КоличествоОбъектовВИсточнике = 1; + + одПропустить(ФайлОбмена, ИмяУзла); + + ИначеЕсли ИмяУзла = "ИнформацияОРегистрацииОбъекта" Тогда + + ПрочитатьИнформациюОРегистрацииОбъекта(); + + ИначеЕсли ИмяУзла = "ДанныеПоОбмену" Тогда + + ПрочитатьДанныеПоОбмену(); + + одПропустить(ФайлОбмена, ИмяУзла); + + Если ФлагОшибки() Тогда + Прервать; + КонецЕсли; + + ИначеЕсли ИмяУзла = "ПравилаОбмена" Тогда + + Если ТаблицаПравилКонвертации.Количество() = 0 Тогда + + // загружаем правила обмена + ЗагрузитьПравилаОбмена(ФайлОбмена, "ЧтениеXML"); + + Иначе + + одПропустить(ФайлОбмена, ИмяУзла); + + КонецЕсли; + + ИначеЕсли (ИмяУзла = "ФайлОбмена") И (ФайлОбмена.ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда + + Прервать; // выход + + Иначе + + одПропустить(ФайлОбмена, ИмяУзла); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ПрочитатьДанныеПоОбмену() + + ИмяПланаОбмена = одАтрибут(ФайлОбмена, ТипСтрока, "ПланОбмена"); + + КодОтКого = одАтрибут(ФайлОбмена, ТипСтрока, "ОтКого"); + + УзелОбменаПолучатель = ПланыОбмена[ИмяПланаОбмена].НайтиПоКоду(КодОтКого); + + // проверка на наличие узла получателя + // проверка на правильность указания узла получателя в сообщении обмена + Если Не ЗначениеЗаполнено(УзелОбменаПолучатель) + ИЛИ УзелОбменаПолучатель <> УзелОбменаЗагрузкаДанных Тогда + + СтрокаСообщения = НСтр("ru = 'Не найден узел обмена для загрузки данных. План обмена: [ИмяПланаОбмена], Код: [КодОтКого]'"); + + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ИмяПланаОбмена]", ИмяПланаОбмена); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[КодОтКого]", КодОтКого); + ВызватьИсключение СтрокаСообщения; + + КонецЕсли; + + ПолеНомерВходящегоСообщения = одАтрибут(ФайлОбмена, ТипЧисло, "НомерИсходящегоСообщения"); + + Если УзелОбменаЗагрузкаДанных.НомерПринятого >= НомерВходящегоСообщения() Тогда + + // Номер сообщения меньше либо равен ранее принятому + ЗаписатьВПротоколВыполнения(174,,,,,Истина, Перечисления.РезультатыВыполненияОбмена.Предупреждение_СообщениеОбменаБылоРанееПринято); + Возврат; + КонецЕсли; + + УдалитьРегистрациюИзменений = одАтрибут(ФайлОбмена, ТипБулево, "УдалитьРегистрациюИзменений"); + + // удаляем регистрацию изменений при необходимости + Если УдалитьРегистрациюИзменений Тогда + + НомерПринятогоСообщения = одАтрибут(ФайлОбмена, ТипЧисло, "НомерВходящегоСообщения"); + + ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбменаЗагрузкаДанных, НомерПринятогоСообщения); + + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьОтложенноеПроведениеДокументов() + + Если ДокументыДляОтложенногоПроведения.Количество() = 0 Тогда + Возврат // нет документов в очереди + КонецЕсли; + + // сворачиваем таблицу по уникальным полям + ДокументыДляОтложенногоПроведения.Свернуть("ДокументОбъект, ДокументСсылка, ДатаДокумента, ДокументПроведенУспешно"); + + // сортируем документы по возрастанию даты документов + ДокументыДляОтложенногоПроведения.Сортировать("ДатаДокумента"); + + // инициализируем колонку результата проведения документа + ДокументыДляОтложенногоПроведения.ЗаполнитьЗначения(Ложь, "ДокументПроведенУспешно"); + + Для Каждого СтрокаТаблицы ИЗ ДокументыДляОтложенногоПроведения Цикл + + Объект = СтрокаТаблицы.ДокументОбъект; + + // устанавливаем узел-отправитель для предотвращения регистрации объекта на узле, для которого производим загрузку + // проведение выполняем не в режиме загрузки + УстановитьОбменДаннымиЗагрузка(Объект, Ложь); + + ОписаниеОшибки = ""; + + Попытка + + Если Объект.ПроверитьЗаполнение() Тогда + + // при проведении документа отказываемся от механизмов ВРО и ПРО, + // т.к. они были ранее выполнены при записи объекта + Объект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина); + + // выполняем попытку проведения документа + Объект.Записать(РежимЗаписиДокумента.Проведение); + + СтрокаТаблицы.ДокументПроведенУспешно = Объект.Проведен; + + Иначе + + СтрокаТаблицы.ДокументПроведенУспешно = Ложь; + + ОписаниеОшибки = НСтр("ru = 'Ошибка заполнения реквизитов документа'"); + + КонецЕсли; + + Исключение + + СтрокаТаблицы.ДокументПроведенУспешно = Ложь; + + ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + + КонецПопытки; + + // если документ провести не удалось фиксируем ошибку в ЖР + Если Не СтрокаТаблицы.ДокументПроведенУспешно Тогда + + СтрокаСообщения = НСтр("ru = 'Ошибка при отложенном проведении документа: [Объект]. Описание ошибки: [ОписаниеОшибки]'"); + + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[Объект]", Строка(Объект)); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОписаниеОшибки]", ОписаниеОшибки); + ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщения, УровеньЖурналаРегистрации.Предупреждение); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаписатьИнформациюОбОбменеДаннымиЧерезПланыОбмена(Знач ВыгрузитьИнформациюСопоставления) + + ИтераторНомераИсходящегоСообщения = ?(ВыгрузитьИнформациюСопоставления, 2, 1); + + Приемник = СоздатьУзел("ДанныеПоОбмену"); + + ИмяПланаОбмена = УзелДляОбмена.Метаданные().Имя; + + УстановитьАтрибут(Приемник, "ПланОбмена", ИмяПланаОбмена); + УстановитьАтрибут(Приемник, "Кому", УзелДляОбмена.Код); + УстановитьАтрибут(Приемник, "ОтКого", ПланыОбмена[ИмяПланаОбмена].ЭтотУзел().Код); + + // атрибуты механизма квитирования сообщений обмена + УстановитьАтрибут(Приемник, "НомерИсходящегоСообщения", УзелДляОбмена.НомерОтправленного + ИтераторНомераИсходящегоСообщения); + УстановитьАтрибут(Приемник, "НомерВходящегоСообщения", УзелДляОбмена.НомерПринятого); + УстановитьАтрибут(Приемник, "УдалитьРегистрациюИзменений", РежимЗагрузкиДанныхВИнформационнуюБазу()); + + // Запись объекта в файл + Приемник.ЗаписатьКонецЭлемента(); + + ЗаписатьВФайл(Приемник); + +КонецПроцедуры + + +Функция ВыгрузитьДанныеСсылочногоОбъекта(Значение, ИсходящиеДанные, ИмяПКО, ПКОСвойств, ТипПриемника, УзелСвойства, Знач ВыгрузитьТолькоСсылку) + + ЭтоПравилоСГлобальнойВыгрузкой = Ложь; + УзелСсылки = ВыгрузитьПоПравилу(Значение, , ИсходящиеДанные, , ИмяПКО, , ВыгрузитьТолькоСсылку, ПКОСвойств, ЭтоПравилоСГлобальнойВыгрузкой, , , , Ложь); + ТипУзлаСсылки = ТипЗнч(УзелСсылки); + + Если ПустаяСтрока(ТипПриемника) Тогда + + ТипПриемника = ПКОСвойств.Приемник; + УстановитьАтрибут(УзелСвойства, "Тип", ТипПриемника); + + КонецЕсли; + + Если УзелСсылки = Неопределено Тогда + + Возврат Неопределено; + + КонецЕсли; + + ДобавитьСвойстваДляВыгрузки(УзелСсылки, ТипУзлаСсылки, УзелСвойства, ЭтоПравилоСГлобальнойВыгрузкой); + + Возврат УзелСсылки; + +КонецФункции + +Процедура ПередатьОдинПараметрВПриемник(Имя, ИсходноеЗначениеПараметра, ПравилоКонвертации = "") + + Если ПустаяСтрока(ПравилоКонвертации) Тогда + + УзелПараметра = СоздатьУзел("ЗначениеПараметра"); + + УстановитьАтрибут(УзелПараметра, "Имя", Имя); + УстановитьАтрибут(УзелПараметра, "Тип", Строка(ТипЗнч(ИсходноеЗначениеПараметра))); + + ЭтоNULL = Ложь; + Пусто = одПустое(ИсходноеЗначениеПараметра, ЭтоNULL); + + Если Пусто Тогда + + // надо записать что это пустое значение + одЗаписатьЭлемент(УзелПараметра, "Пусто"); + + УзелПараметра.ЗаписатьКонецЭлемента(); + + ЗаписатьВФайл(УзелПараметра); + + Возврат; + + КонецЕсли; + + одЗаписатьЭлемент(УзелПараметра, "Значение", ИсходноеЗначениеПараметра); + + УзелПараметра.ЗаписатьКонецЭлемента(); + + ЗаписатьВФайл(УзелПараметра); + + Иначе + + УзелПараметра = СоздатьУзел("ЗначениеПараметра"); + + УстановитьАтрибут(УзелПараметра, "Имя", Имя); + + ЭтоNULL = Ложь; + Пусто = одПустое(ИсходноеЗначениеПараметра, ЭтоNULL); + + Если Пусто Тогда + + ПКОСвойств = НайтиПравило(ИсходноеЗначениеПараметра, ПравилоКонвертации); + ТипПриемника = ПКОСвойств.Приемник; + УстановитьАтрибут(УзелПараметра, "Тип", ТипПриемника); + + // надо записать что это пустое значение + одЗаписатьЭлемент(УзелПараметра, "Пусто"); + + УзелПараметра.ЗаписатьКонецЭлемента(); + + ЗаписатьВФайл(УзелПараметра); + + Возврат; + + КонецЕсли; + + ВыгрузитьДанныеСсылочногоОбъекта(ИсходноеЗначениеПараметра, , ПравилоКонвертации, , , УзелПараметра, Истина); + + УзелПараметра.ЗаписатьКонецЭлемента(); + + ЗаписатьВФайл(УзелПараметра); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПередатьДополнительныеПараметрыВПриемник() + + Для Каждого Параметр Из ТаблицаНастройкиПараметров Цикл + + Если Параметр.ПередаватьПараметрПриВыгрузке = Истина Тогда + + ПередатьОдинПараметрВПриемник(Параметр.Имя, Параметр.Значение, Параметр.ПравилоКонвертации); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ПередатьИнформациюОТипахВПриемник() + + Если Не ПустаяСтрока(СтрокаТиповДляПриемника) Тогда + ЗаписатьВФайл(СтрокаТиповДляПриемника); + КонецЕсли; + +КонецПроцедуры + +Процедура ПередатьИнформациюОПользовательскихПоляхПоискаВПриемник() + + Для Каждого КлючИЗначенияСопоставления Из ИнформацияОПользовательскихПоляхПоискаПриВыгрузкеДанных Цикл + + УзелПараметра = СоздатьУзел("НастройкаПользовательскогоПоиска"); + + одЗаписатьЭлемент(УзелПараметра, "ИмяПравила", КлючИЗначенияСопоставления.Ключ); + одЗаписатьЭлемент(УзелПараметра, "НастройкаПоиска", КлючИЗначенияСопоставления.Значение); + + УзелПараметра.ЗаписатьКонецЭлемента(); + ЗаписатьВФайл(УзелПараметра); + + КонецЦикла; + +КонецПроцедуры + +Процедура ИнициализироватьКомментарииПриВыгрузкеИЗагрузкеДанных() + + КомментарийПриВыгрузкеДанных = ""; + КомментарийПриЗагрузкеДанных = ""; + +КонецПроцедуры + +// + +Процедура ВыполнитьВыгрузку(СтрокаСообщенияОбОшибке = "") + + ВыгрузитьИнформациюСопоставления = ВыгрузитьИнформациюСопоставленияОбъектов(УзелДляОбмена); + + ИнициализироватьКомментарииПриВыгрузкеИЗагрузкеДанных(); + + ТекущийУровеньВложенностиВыгрузитьПоПравилу = 0; + + СтекВызововВыгрузкиДанных = Новый ТаблицаЗначений; + СтекВызововВыгрузкиДанных.Колонки.Добавить("Ссылка"); + СтекВызововВыгрузкиДанных.Индексы.Добавить("Ссылка"); + + ИнициализироватьМенеджерыИСообщения(); + + ПолеСчетчикВыгруженныхОбъектов = Неопределено; + СчетчикНПП = 0; + НППЗаписанногоВФайл = 0; + + Для Каждого Правило Из ТаблицаПравилКонвертации Цикл + + Правило.Выгруженные = СоздатьТаблицуВыгруженныхОбъектов(); + + КонецЦикла; + + // получаем типы объектов метаданных, которые будут участвовать в выгрузке + ТаблицаПравилВыгрузкиИспользуемые = ТаблицаПравилВыгрузки.Скопировать(Новый Структура("Включить", Истина)); + + Для Каждого СтрокаТаблицы ИЗ ТаблицаПравилВыгрузкиИспользуемые Цикл + + СтрокаТаблицы.ОбъектВыборкиМетаданные = Метаданные.НайтиПоТипу(СтрокаТаблицы.ОбъектВыборки); + + КонецЦикла; + + СоответствиеДанныхДляОбновленияВыгруженныхЭлементов = Новый Соответствие; + + // {ОБРАБОТЧИК ПередВыгрузкойДанных} + Отказ = Ложь; + + Если Не ПустаяСтрока(Конвертация.ПередВыгрузкойДанных) Тогда + + Попытка + Выполнить(Конвертация.ПередВыгрузкойДанных); + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(62, ОписаниеОшибки(), НСтр("ru = 'ПередВыгрузкойДанных (конвертация)'")); + Отказ = Истина; + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки данных + ЗавершитьВедениеПротоколаОбмена(); + Возврат; + КонецЕсли; + + КонецЕсли; + // {ОБРАБОТЧИК ПередВыгрузкойДанных} + + ПередатьИнформациюОПользовательскихПоляхПоискаВПриемник(); + + ПередатьИнформациюОТипахВПриемник(); + + // передаем доп. параметры в приемник + ПередатьДополнительныеПараметрыВПриемник(); + + ТекстСобытияПослеЗагрузкиПараметров = ""; + Если Конвертация.Свойство("ПослеЗагрузкиПараметров", ТекстСобытияПослеЗагрузкиПараметров) + И Не ПустаяСтрока(ТекстСобытияПослеЗагрузкиПараметров) Тогда + + ЗаписьСобытия = Новый ЗаписьXML; + ЗаписьСобытия.УстановитьСтроку(); + одЗаписатьЭлемент(ЗаписьСобытия, "АлгоритмПослеЗагрузкиПараметров", ТекстСобытияПослеЗагрузкиПараметров); + + ЗаписатьВФайл(ЗаписьСобытия); + + КонецЕсли; + + ЗаписатьИнформациюОбОбменеДаннымиЧерезПланыОбмена(ВыгрузитьИнформациюСопоставления); + + Отказ = Ложь; + + // ВЫПОЛНЯЕМ ВЫГРУЗКУ РЕГИСТРА СОПОСТАВЛЕНИЯ + Если ВыгрузитьИнформациюСопоставления Тогда + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); + ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелДляОбмена); + + Попытка + ВыполнитьВыгрузкуРегистраСопоставленияОбъектов(ЗаписьСообщения, СтрокаСообщенияОбОшибке); + Исключение + Отказ = Истина; + КонецПопытки; + + Если Отказ Тогда + ЗаписьСообщения.ПрерватьЗапись(); + Иначе + ЗаписьСообщения.ЗакончитьЗапись(); + КонецЕсли; + + ЗаписьXML.Закрыть(); + ЗаписьXML = Неопределено; + + Если Отказ Тогда + Возврат; + КонецЕсли; + + КонецЕсли; + + // ВЫПОЛНЯЕМ ВЫГРУЗКУ ЗАРЕГИСТРИРОВАННЫХ ДАННЫХ + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); + ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелДляОбмена); + + Попытка + ВыполнитьВыгрузкуЗарегистрированныхДанных(ЗаписьСообщения, СтрокаСообщенияОбОшибке, ТаблицаПравилВыгрузкиИспользуемые); + Исключение + Отказ = Истина; + КонецПопытки; + + Если Отказ Тогда + ЗаписьСообщения.ПрерватьЗапись(); + Иначе + ЗаписьСообщения.ЗакончитьЗапись(); + КонецЕсли; + + ЗаписьXML.Закрыть(); + ЗаписьXML = Неопределено; + + // {ОБРАБОТЧИК ПослеВыгрузкиДанных} + Если Не ПустаяСтрока(Конвертация.ПослеВыгрузкиДанных) Тогда + + Попытка + Выполнить(Конвертация.ПослеВыгрузкиДанных); + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(63, ОписаниеОшибки(), НСтр("ru = 'ПослеВыгрузкиДанных (конвертация)'")); + КонецПопытки; + + КонецЕсли; + // {ОБРАБОТЧИК ПослеВыгрузкиДанных} + +КонецПроцедуры + +Процедура ВыполнитьВыгрузкуРегистраСопоставленияОбъектов(ЗаписьСообщения, СтрокаСообщенияОбОшибке) + + // выбираем изменения только для регистра сопоставления + ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, Метаданные.РегистрыСведений.СоответствиеОбъектовИнформационныхБаз); + + Пока ВыборкаИзменений.Следующий() Цикл + + Данные = ВыборкаИзменений.Получить(); + + // выгружаем зарегистрированную информацию РС СоответствиеОбъектовИнформационныхБаз; + // правила конвертации РС прописаны в коде этой обработки; + ВыгрузитьИнформациюОЗарегистрированномОбъекте(Данные); + + КонецЦикла; + +КонецПроцедуры + +Процедура ВыполнитьВыгрузкуЗарегистрированныхДанных(ЗаписьСообщения, СтрокаСообщенияОбОшибке, ТаблицаПравилВыгрузкиИспользуемые) + + // {ОБРАБОТЧИК ПередПолучениемИзмененныхОбъектов} + Если Не ПустаяСтрока(Конвертация.ПередПолучениемИзмененныхОбъектов) Тогда + + Попытка + Выполнить(Конвертация.ПередПолучениемИзмененныхОбъектов); + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(175, ОписаниеОшибки(), "ПередПолучениемИзмененныхОбъектов (конвертация)"); + Возврат; + КонецПопытки; + + КонецЕсли; + // {ОБРАБОТЧИК ПередПолучениемИзмененныхОбъектов} + + МассивВыгружаемыхМетаданных = ТаблицаПравилВыгрузкиИспользуемые.ВыгрузитьКолонку("ОбъектВыборкиМетаданные"); + + // ВЫБОРКА ИЗМЕНЕНИЙ + ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, МассивВыгружаемыхМетаданных); + + ОбъектМетаданныхПредыдущий = Неопределено; + ПравилоВыгрузкиДанныхПредыдущее = Неопределено; + ПравилоВыгрузкиДанных = Неопределено; + НомерФайлаВыгрузки = 0; + СтрокаФайла = Неопределено; + ВыгружаетсяРегистр = Ложь; + ВыгружаютсяКонстанты = Ложь; + + ИмяПланаОбмена = УзелДляОбмена.Метаданные().Имя; + + Пока ВыборкаИзменений.Следующий() Цикл + + Данные = ВыборкаИзменений.Получить(); + + ТипДанныхДляВыгрузки = ТипЗнч(Данные); + + // отрабатываем удаление объекта + Если ТипДанныхДляВыгрузки = ТипУдалениеОбъекта Тогда + + ОтработатьУдалениеОбъекта(Данные); + Продолжить; + + КонецЕсли; + + ОбъектМетаданныхТекущий = Данные.Метаданные(); + + // выгружается новый тип объекта метаданных + Если ОбъектМетаданныхПредыдущий <> ОбъектМетаданныхТекущий Тогда + + Если ОбъектМетаданныхПредыдущий <> Неопределено Тогда + + // {ОБРАБОТЧИК ПослеОбработки ПВД} + Если ПравилоВыгрузкиДанныхПредыдущее <> Неопределено + И Не ПустаяСтрока(ПравилоВыгрузкиДанныхПредыдущее.ПослеОбработки) Тогда + + Попытка + Выполнить(ПравилоВыгрузкиДанныхПредыдущее.ПослеОбработки); + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ОписаниеОшибки(), ПравилоВыгрузкиДанныхПредыдущее.Имя, , "ПослеОбработкиВыгрузкиДанных"); + КонецПопытки; + + КонецЕсли; + // {ОБРАБОТЧИК ПослеОбработки ПВД} + + КонецЕсли; + + ОбъектМетаданныхПредыдущий = ОбъектМетаданныхТекущий; + + ПравилоВыгрузкиДанных = ТаблицаПравилВыгрузкиИспользуемые.Найти(ОбъектМетаданныхТекущий, "ОбъектВыборкиМетаданные"); + + ПравилоВыгрузкиДанныхПредыдущее = ПравилоВыгрузкиДанных; + + // {ОБРАБОТЧИК ПередОбработкой ПВД} + ИсходящиеДанные = Неопределено; + + Если ПравилоВыгрузкиДанных <> Неопределено + И Не ПустаяСтрока(ПравилоВыгрузкиДанных.ПередОбработкой) Тогда + + Попытка + Выполнить(ПравилоВыгрузкиДанных.ПередОбработкой); + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(31, ОписаниеОшибки(), ПравилоВыгрузкиДанных.Имя, , "ПередОбработкойВыгрузкиДанных"); + КонецПопытки; + + КонецЕсли; + // {ОБРАБОТЧИК ПередОбработкой ПВД} + + ВыгружаетсяРегистр = Ложь; + ВыгружаютсяКонстанты = Ложь; + + СтруктураДанных = МенеджерыДляПлановОбмена[ОбъектМетаданныхТекущий]; + + Если СтруктураДанных = Неопределено тогда + + ВыгружаютсяКонстанты = Метаданные.Константы.Содержит(ОбъектМетаданныхТекущий); + + ИначеЕсли СтруктураДанных.ЭтоРегистр = Истина Тогда + + ВыгружаетсяРегистр = Истина; + + КонецЕсли; + + КонецЕсли; + + // определяем вид отправки объекта + ОтправкаЭлемента = ОтправкаЭлементаДанных.Авто; + + Если ТипДанныхДляВыгрузки <> ТипРегистрСоответствия Тогда + + // получаем значение переменной ОтправкаЭлемента + // очищаем набор записей регистров от срок, которые не прошли фильтр правил регистрации объектов (ПРО) + ОбменДаннымиСобытия.ПриОтправкеДанных(Данные, ОтправкаЭлемента, УзелДляОбмена, ИмяПланаОбмена); + + КонецЕсли; + + // возможно это удаление объекта + Если Не ВыгружаетсяРегистр + И Не ВыгружаютсяКонстанты + И ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить Тогда + + // посылаем информацию об удалении + ОтработатьУдалениеОбъекта(Данные); + Продолжить; + + КонецЕсли; + + // ВЫГРУЗКА ОБЪЕКТА + Если ВыгружаетсяРегистр Тогда + + // выгрузка регистра + ВыгрузкаРегистра(Данные, ПравилоВыгрузкиДанных, ИсходящиеДанные, НеВыгружатьОбъектыПоСсылкам); + + ИначеЕсли ВыгружаютсяКонстанты Тогда + + // выгрузка набора констант + Свойства = Менеджеры[ПравилоВыгрузкиДанных.ОбъектВыборки]; + + ВыгрузитьНаборКонстант(ПравилоВыгрузкиДанных, Свойства, ИсходящиеДанные, ОбъектМетаданныхТекущий.Имя); + + Иначе + + // выгрузка ссылочных типов + ВыгрузкаОбъектаВыборки(Данные, ПравилоВыгрузкиДанных, , ИсходящиеДанные, НеВыгружатьОбъектыПоСсылкам); + + КонецЕсли; + + КонецЦикла; + + Если ОбъектМетаданныхПредыдущий <> Неопределено Тогда + + // {ОБРАБОТЧИК ПослеОбработки ПВД} + Если ПравилоВыгрузкиДанных <> Неопределено + И Не ПустаяСтрока(ПравилоВыгрузкиДанных.ПослеОбработки) Тогда + + Попытка + Выполнить(ПравилоВыгрузкиДанных.ПослеОбработки); + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ОписаниеОшибки(), ПравилоВыгрузкиДанных.Имя, , "ПослеОбработкиВыгрузкиДанных"); + КонецПопытки; + + КонецЕсли; + // {ОБРАБОТЧИК ПослеОбработки ПВД} + + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаписьЖурналаРегистрацииОбменДанными(Комментарий, Уровень = Неопределено) + + Если Уровень = Неопределено Тогда + Уровень = УровеньЖурналаРегистрации.Ошибка; + КонецЕсли; + + ОбъектМетаданных = Неопределено; + + Если УзелОбменаЗагрузкаДанных <> Неопределено + И Не УзелОбменаЗагрузкаДанных.Пустая() Тогда + + ОбъектМетаданных = УзелОбменаЗагрузкаДанных.Метаданные(); + + КонецЕсли; + + ЗаписьЖурналаРегистрации(КлючСообщенияЖурналаРегистрации(), Уровень, ОбъектМетаданных,, Комментарий); + +КонецПроцедуры + +Функция ВыгрузитьИнформациюСопоставленияОбъектов(УзелИнформационнойБазы) + + ТекстЗапроса = " + |ВЫБРАТЬ ПЕРВЫЕ 1 1 + |ИЗ + | РегистрСведений.СоответствиеОбъектовИнформационныхБаз.Изменения КАК СоответствиеОбъектовИнформационныхБазИзменения + |ГДЕ + | СоответствиеОбъектовИнформационныхБазИзменения.Узел = &УзелИнформационнойБазы + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("УзелИнформационнойБазы", УзелИнформационнойБазы); + + Возврат Не Запрос.Выполнить().Пустой(); + +КонецФункции + +// + +Функция ЭтоДокумент(ОбъектМетаданных) + + Возврат ОбменДаннымиСервер.ЭтоДокумент(ОбъектМетаданных); + +КонецФункции + +Функция ЭтоСправочник(ОбъектМетаданных) + + Возврат ОбменДаннымиСервер.ЭтоСправочник(ОбъектМетаданных); + +КонецФункции + +Функция ЭтоБизнесПроцесс(ОбъектМетаданных) + + Возврат ОбменДаннымиСервер.ЭтоБизнесПроцесс(ОбъектМетаданных); + +КонецФункции + +Функция ЭтоЗадача(ОбъектМетаданных) + + Возврат ОбменДаннымиСервер.ЭтоЗадача(ОбъектМетаданных); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ИНИЦИАЛИЗАЦИЯ ТАБЛИЦ ПРАВИЛ ОБМЕНА + +// Инициализирует колонки таблицы правил конвертации свойств объектов +// +// Параметры: +// Таб - ТаблицаЗначений. инициализируемая таблица правил конвертации свойств +// +Процедура ИнициализацияТаблицыПравилКонвертацииСвойств(Таб) + + Колонки = Таб.Колонки; + + Колонки.Добавить("Имя"); + Колонки.Добавить("Наименование"); + Колонки.Добавить("Порядок"); + + Колонки.Добавить("ЭтоГруппа", одОписаниеТипа("Булево")); + Колонки.Добавить("ЭтоПолеПоиска", одОписаниеТипа("Булево")); + Колонки.Добавить("ПравилаГруппы"); + Колонки.Добавить("ПравилаГруппыОтключенные"); + + Колонки.Добавить("ВидИсточника"); + Колонки.Добавить("ВидПриемника"); + + Колонки.Добавить("УпрощеннаяВыгрузкаСвойства", одОписаниеТипа("Булево")); + Колонки.Добавить("НуженУзелXMLПриВыгрузке", одОписаниеТипа("Булево")); + Колонки.Добавить("НуженУзелXMLПриВыгрузкеГруппы", одОписаниеТипа("Булево")); + + Колонки.Добавить("ТипИсточника", одОписаниеТипа("Строка")); + Колонки.Добавить("ТипПриемника", одОписаниеТипа("Строка")); + + Колонки.Добавить("Источник"); + Колонки.Добавить("Приемник"); + + Колонки.Добавить("ПравилоКонвертации"); + + Колонки.Добавить("ПолучитьИзВходящихДанных", одОписаниеТипа("Булево")); + + Колонки.Добавить("НеЗамещать", одОписаниеТипа("Булево")); + Колонки.Добавить("ЭтоОбязательноеСвойство", одОписаниеТипа("Булево")); + + Колонки.Добавить("ПередВыгрузкой"); + Колонки.Добавить("ПриВыгрузке"); + Колонки.Добавить("ПослеВыгрузки"); + + Колонки.Добавить("ПередОбработкойВыгрузки"); + Колонки.Добавить("ПослеОбработкиВыгрузки"); + + Колонки.Добавить("ЕстьОбработчикПередВыгрузкой", одОписаниеТипа("Булево")); + Колонки.Добавить("ЕстьОбработчикПриВыгрузке", одОписаниеТипа("Булево")); + Колонки.Добавить("ЕстьОбработчикПослеВыгрузки", одОписаниеТипа("Булево")); + + Колонки.Добавить("ЕстьОбработчикПередОбработкойВыгрузки", одОписаниеТипа("Булево")); + Колонки.Добавить("ЕстьОбработчикПослеОбработкиВыгрузки", одОписаниеТипа("Булево")); + + Колонки.Добавить("ПриводитьКДлине", одОписаниеТипа("Число")); + Колонки.Добавить("ИмяПараметраДляПередачи"); + Колонки.Добавить("ПоискПоДатеНаРавенство", одОписаниеТипа("Булево")); + + Колонки.Добавить("СтрокаПолейПоиска"); + +КонецПроцедуры // ИнициализацияТаблицыПравилКонвертацииСвойств() + +Функция СоздатьТаблицуВыгруженныхОбъектов() + + Таблица = Новый ТаблицаЗначений(); + Таблица.Колонки.Добавить("Ключ"); + Таблица.Колонки.Добавить("УзелСсылки"); + Таблица.Колонки.Добавить("ВыгруженаТолькоСсылка", Новый ОписаниеТипов("Булево")); + Таблица.Колонки.Добавить("НППСсылки", Новый ОписаниеТипов("Число")); + Таблица.Колонки.Добавить("КоличествоОбращений", Новый ОписаниеТипов("Число")); + Таблица.Колонки.Добавить("НомерПоследнегоОбращения", Новый ОписаниеТипов("Число")); + + Таблица.Индексы.Добавить("Ключ"); + + Возврат Таблица; + +КонецФункции + +// Инициализирует колонки таблицы правил конвертации объектов +// +// Параметры: +// Нет. +// +Процедура ИнициализацияТаблицыПравилКонвертации() + + Колонки = ТаблицаПравилКонвертации.Колонки; + + Колонки.Добавить("Имя"); + Колонки.Добавить("Наименование"); + Колонки.Добавить("Порядок"); + + Колонки.Добавить("СинхронизироватьПоИдентификатору", одОписаниеТипа("Булево")); + Колонки.Добавить("НеСоздаватьЕслиНеНайден", одОписаниеТипа("Булево")); + Колонки.Добавить("НеВыгружатьОбъектыСвойствПоСсылкам", одОписаниеТипа("Булево")); + Колонки.Добавить("ПродолжитьПоискПоПолямПоискаЕслиПоИдентификаторуНеНашли", одОписаниеТипа("Булево")); + Колонки.Добавить("ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD", одОписаниеТипа("Булево")); + Колонки.Добавить("НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике", одОписаниеТипа("Булево")); + Колонки.Добавить("ИспользоватьБыстрыйПоискПриЗагрузке", одОписаниеТипа("Булево")); + Колонки.Добавить("ГенерироватьНовыйНомерИлиКодЕслиНеУказан", одОписаниеТипа("Булево")); + Колонки.Добавить("ВыгружатьОбъектТолькоПриНаличииНаНегоСсылки", одОписаниеТипа("Булево")); + Колонки.Добавить("МаленькоеКоличествоОбъектов", одОписаниеТипа("Булево")); + Колонки.Добавить("КоличествоОбращенийДляВыгрузкиСсылки", одОписаниеТипа("Число")); + Колонки.Добавить("КоличествоЭлементовВИБ", одОписаниеТипа("Число")); + + Колонки.Добавить("СпособВыгрузки"); + + Колонки.Добавить("Источник"); + Колонки.Добавить("Приемник"); + + Колонки.Добавить("ТипИсточника", одОписаниеТипа("Строка")); + Колонки.Добавить("ТипПриемника", одОписаниеТипа("Строка")); + + Колонки.Добавить("ПередВыгрузкой"); + Колонки.Добавить("ПриВыгрузке"); + Колонки.Добавить("ПослеВыгрузки"); + Колонки.Добавить("ПослеВыгрузкиВФайл"); + + Колонки.Добавить("ЕстьОбработчикПередВыгрузкой", одОписаниеТипа("Булево")); + Колонки.Добавить("ЕстьОбработчикПриВыгрузке", одОписаниеТипа("Булево")); + Колонки.Добавить("ЕстьОбработчикПослеВыгрузки", одОписаниеТипа("Булево")); + Колонки.Добавить("ЕстьОбработчикПослеВыгрузкиВФайл",одОписаниеТипа("Булево")); + + Колонки.Добавить("ПередЗагрузкой"); + Колонки.Добавить("ПриЗагрузке"); + Колонки.Добавить("ПослеЗагрузки"); + + Колонки.Добавить("ПоследовательностьПолейПоиска"); + Колонки.Добавить("ПоискПоТабличнымЧастям"); + + Колонки.Добавить("ПриоритетОбъектовОбмена"); + + Колонки.Добавить("ЕстьОбработчикПередЗагрузкой", одОписаниеТипа("Булево")); + Колонки.Добавить("ЕстьОбработчикПриЗагрузке", одОписаниеТипа("Булево")); + Колонки.Добавить("ЕстьОбработчикПослеЗагрузки", одОписаниеТипа("Булево")); + + Колонки.Добавить("ЕстьОбработчикПоследовательностьПолейПоиска", одОписаниеТипа("Булево")); + + Колонки.Добавить("Свойства", одОписаниеТипа("ТаблицаЗначений")); + Колонки.Добавить("СвойстваПоиска", одОписаниеТипа("ТаблицаЗначений")); + Колонки.Добавить("СвойстваОтключенные", одОписаниеТипа("ТаблицаЗначений")); + + Колонки.Добавить("Значения", одОписаниеТипа("Соответствие")); + + Колонки.Добавить("Выгруженные", одОписаниеТипа("ТаблицаЗначений")); + Колонки.Добавить("ВыгружатьПредставлениеИсточника", одОписаниеТипа("Булево")); + + Колонки.Добавить("НеЗамещать", одОписаниеТипа("Булево")); + + Колонки.Добавить("ЗапоминатьВыгруженные", одОписаниеТипа("Булево")); + Колонки.Добавить("ВсеОбъектыВыгружены", одОписаниеТипа("Булево")); + + Колонки.Добавить("ПоляПоиска", одОписаниеТипа("Строка")); + Колонки.Добавить("ПоляТаблицы", одОписаниеТипа("Строка")); + +КонецПроцедуры // ИнициализацияТаблицыПравилКонвертации() + +// Инициализирует колонки таблицы правил выгрузки данных +// +// Параметры: +// Нет +// +Процедура ИнициализацияТаблицыПравилВыгрузки() + + Колонки = ТаблицаПравилВыгрузки.Колонки; + + Колонки.Добавить("Включить", одОписаниеТипа("Булево")); + + Колонки.Добавить("Имя"); + Колонки.Добавить("Наименование"); + Колонки.Добавить("Порядок"); + + Колонки.Добавить("СпособОтбораДанных"); + Колонки.Добавить("ОбъектВыборки"); + Колонки.Добавить("ОбъектВыборкиМетаданные"); + + Колонки.Добавить("ПравилоКонвертации"); + + Колонки.Добавить("ПередОбработкой"); + Колонки.Добавить("ПослеОбработки"); + + Колонки.Добавить("ПередВыгрузкой"); + Колонки.Добавить("ПослеВыгрузки"); + + // Колонки для поддержки отбора с помощью построителя + Колонки.Добавить("ИспользоватьОтбор", одОписаниеТипа("Булево")); + Колонки.Добавить("НастройкиПостроителя"); + Колонки.Добавить("ИмяОбъектаДляЗапроса"); + Колонки.Добавить("ИмяОбъектаДляЗапросаРегистра"); + Колонки.Добавить("ИмяТипаПриемника"); + + Колонки.Добавить("НеВыгружатьОбъектыСозданныеВБазеПриемнике", одОписаниеТипа("Булево")); + + Колонки.Добавить("СсылкаНаУзелОбмена"); + + Колонки.Добавить("СинхронизироватьПоИдентификатору", одОписаниеТипа("Булево")); + +КонецПроцедуры // ИнициализацияТаблицыПравилВыгрузки() + +// Инициализирует колонки таблицы правил очистки данных +// +// Параметры: +// Нет. +// +Процедура ИнициализацияТаблицыПравилОчистки() + + Колонки = ТаблицаПравилОчистки.Колонки; + + Колонки.Добавить("Включить", одОписаниеТипа("Булево")); + Колонки.Добавить("ЭтоГруппа", одОписаниеТипа("Булево")); + + Колонки.Добавить("Имя"); + Колонки.Добавить("Наименование"); + Колонки.Добавить("Порядок", одОписаниеТипа("Число")); + + Колонки.Добавить("СпособОтбораДанных"); + Колонки.Добавить("ОбъектВыборки"); + + Колонки.Добавить("УдалятьЗаПериод"); + Колонки.Добавить("Непосредственно", одОписаниеТипа("Булево")); + + Колонки.Добавить("ПередОбработкой"); + Колонки.Добавить("ПослеОбработки"); + Колонки.Добавить("ПередУдалением"); + +КонецПроцедуры // ИнициализацияТаблицыПравилОчистки() + +// Инициализирует колонки таблицы настройки параметров +// +// Параметры: +// Нет. +// +Процедура ИнициализацияТаблицыНастройкиПараметров() + + Колонки = ТаблицаНастройкиПараметров.Колонки; + + Колонки.Добавить("Имя"); + Колонки.Добавить("Наименование"); + Колонки.Добавить("Значение"); + Колонки.Добавить("ПередаватьПараметрПриВыгрузке"); + Колонки.Добавить("ПравилоКонвертации"); + +КонецПроцедуры // ИнициализацияТаблицыПравилОчистки() + +Процедура СброситьКэшНаличияИнформацииСопоставления() + + ПолеКэшЕстьИнформацияСопоставленияВРегистре = Неопределено; + ПолеТаблицаТиповСопоставленияОбъектовИнформационныхБаз = Неопределено; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ИНИЦИАЛИЗАЦИЯ РЕКВИЗИТОВ И МОДУЛЬНЫХ ПЕРЕМЕННЫХ + +Функция ИнициализацияТаблицыДанныхСообщенияОбмена(ТипОбъекта) + + ТаблицаДанныхСообщенияОбмена = Новый ТаблицаЗначений; + + Колонки = ТаблицаДанныхСообщенияОбмена.Колонки; + + // обязательные поля + Колонки.Добавить(ИмяКолонкиУникальныйИдентификатор(), ТипСтрока36); + Колонки.Добавить(ИмяКолонкиТипСтрокой(), ТипСтрока255); + + ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипОбъекта); + + // получаем описание всех полей объекта метаданного из конфигурации + ТаблицаОписанияСвойствОбъекта = ОбщегоНазначения.ПолучитьТаблицуОписанияСвойствОбъекта(ОбъектМетаданных, "Имя, Тип"); + + Для Каждого ОписаниеСвойства ИЗ ТаблицаОписанияСвойствОбъекта Цикл + + Колонки.Добавить(ОписаниеСвойства.Имя, ОписаниеСвойства.Тип); + + КонецЦикла; + + Возврат ТаблицаДанныхСообщенияОбмена; + +КонецФункции + +// Инициализирует переменную СообщенияОбОшибках, содержащую соответствия кодов сообщений их описаниям +// +// Параметры: +// Нет. +// +Процедура ИнициализацияСообщений() + + СообщенияОбОшибках = Новый Соответствие; + + СообщенияОбОшибках.Вставить(2, НСтр("ru = 'Ошибка распаковки файла обмена. Файл заблокирован.'")); + СообщенияОбОшибках.Вставить(3, НСтр("ru = 'Указанный файл правил обмена не существует!'")); + СообщенияОбОшибках.Вставить(4, НСтр("ru = 'Ошибка при создании COM-объекта Msxml2.DOMDocument'")); + СообщенияОбОшибках.Вставить(5, НСтр("ru = 'Ошибка открытия файла обмена'")); + СообщенияОбОшибках.Вставить(6, НСтр("ru = 'Ошибка при загрузке правил обмена'")); + СообщенияОбОшибках.Вставить(7, НСтр("ru = 'Ошибка формата правил обмена'")); + СообщенияОбОшибках.Вставить(8, НСтр("ru = 'Не корректно указано имя файла для выгрузки данных'")); + СообщенияОбОшибках.Вставить(9, НСтр("ru = 'Ошибка формата файла обмена'")); + СообщенияОбОшибках.Вставить(10, НСтр("ru = 'Не указано имя файла для выгрузки данных (Имя файла данных)'")); + СообщенияОбОшибках.Вставить(11, НСтр("ru = 'Ссылка на несуществующий объект метаданных в правилах обмена'")); + СообщенияОбОшибках.Вставить(12, НСтр("ru = 'Не указано имя файла с правилами обмена (Имя файла правил)'")); + + СообщенияОбОшибках.Вставить(13, НСтр("ru = 'Ошибка получения значения свойства объекта (по имени свойства источника)'")); + СообщенияОбОшибках.Вставить(14, НСтр("ru = 'Ошибка получения значения свойства объекта (по имени свойства приемника)'")); + + СообщенияОбОшибках.Вставить(15, НСтр("ru = 'Не указано имя файла для загрузки данных (Имя файла для загрузки)'")); + + СообщенияОбОшибках.Вставить(16, НСтр("ru = 'Ошибка получения значения свойства подчиненного объекта (по имени свойства источника)'")); + СообщенияОбОшибках.Вставить(17, НСтр("ru = 'Ошибка получения значения свойства подчиненного объекта (по имени свойства приемника)'")); + + СообщенияОбОшибках.Вставить(19, НСтр("ru = 'Ошибка в обработчике события ПередЗагрузкойОбъекта'")); + СообщенияОбОшибках.Вставить(20, НСтр("ru = 'Ошибка в обработчике события ПриЗагрузкеОбъекта'")); + СообщенияОбОшибках.Вставить(21, НСтр("ru = 'Ошибка в обработчике события ПослеЗагрузкиОбъекта'")); + СообщенияОбОшибках.Вставить(22, НСтр("ru = 'Ошибка в обработчике события ПередЗагрузкойДанных (конвертация)'")); + СообщенияОбОшибках.Вставить(23, НСтр("ru = 'Ошибка в обработчике события ПослеЗагрузкиДанных (конвертация)'")); + СообщенияОбОшибках.Вставить(24, НСтр("ru = 'Ошибка при удалении объекта'")); + СообщенияОбОшибках.Вставить(25, НСтр("ru = 'Ошибка при записи документа'")); + СообщенияОбОшибках.Вставить(26, НСтр("ru = 'Ошибка записи объекта'")); + СообщенияОбОшибках.Вставить(27, НСтр("ru = 'Ошибка в обработчике события ПередОбработкойПравилаОчистки'")); + СообщенияОбОшибках.Вставить(28, НСтр("ru = 'Ошибка в обработчике события ПослеОбработкиПравилаОчистки'")); + СообщенияОбОшибках.Вставить(29, НСтр("ru = 'Ошибка в обработчике события ПередУдалениемОбъекта'")); + + СообщенияОбОшибках.Вставить(31, НСтр("ru = 'Ошибка в обработчике события ПередОбработкойПравилаВыгрузки'")); + СообщенияОбОшибках.Вставить(32, НСтр("ru = 'Ошибка в обработчике события ПослеОбработкиПравилаВыгрузки'")); + СообщенияОбОшибках.Вставить(33, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкойОбъекта'")); + СообщенияОбОшибках.Вставить(34, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиОбъекта'")); + + СообщенияОбОшибках.Вставить(39, НСтр("ru = 'Ошибка при выполнении алгоритма, содержащегося в файле обмена'")); + + СообщенияОбОшибках.Вставить(41, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкойОбъекта'")); + СообщенияОбОшибках.Вставить(42, НСтр("ru = 'Ошибка в обработчике события ПриВыгрузкеОбъекта'")); + СообщенияОбОшибках.Вставить(43, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиОбъекта'")); + + СообщенияОбОшибках.Вставить(45, НСтр("ru = 'Не найдено правило конвертации объектов'")); + + СообщенияОбОшибках.Вставить(48, НСтр("ru = 'Ошибка в обработчике события ПередОбработкойВыгрузки группы свойств'")); + СообщенияОбОшибках.Вставить(49, НСтр("ru = 'Ошибка в обработчике события ПослеОбработкиВыгрузки группы свойств'")); + СообщенияОбОшибках.Вставить(50, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкой (объекта коллекции)'")); + СообщенияОбОшибках.Вставить(51, НСтр("ru = 'Ошибка в обработчике события ПриВыгрузке (объекта коллекции)'")); + СообщенияОбОшибках.Вставить(52, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузки (объекта коллекции)'")); + СообщенияОбОшибках.Вставить(53, НСтр("ru = 'Ошибка в глобальном обработчике события ПередЗагрузкойОбъекта (конвертация)'")); + СообщенияОбОшибках.Вставить(54, НСтр("ru = 'Ошибка в глобальном обработчике события ПослеЗагрузкиОбъекта (конвертация)'")); + СообщенияОбОшибках.Вставить(55, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкой (свойства)'")); + СообщенияОбОшибках.Вставить(56, НСтр("ru = 'Ошибка в обработчике события ПриВыгрузке (свойства)'")); + СообщенияОбОшибках.Вставить(57, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузки (свойства)'")); + + СообщенияОбОшибках.Вставить(62, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкойДанных (конвертация)'")); + СообщенияОбОшибках.Вставить(63, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиДанных (конвертация)'")); + СообщенияОбОшибках.Вставить(64, НСтр("ru = 'Ошибка в глобальном обработчике события ПередКонвертациейОбъекта (конвертация)'")); + СообщенияОбОшибках.Вставить(65, НСтр("ru = 'Ошибка в глобальном обработчике события ПередВыгрузкойОбъекта (конвертация)'")); + СообщенияОбОшибках.Вставить(66, НСтр("ru = 'Ошибка получения коллекции подчиненных объектов из входящих данных'")); + СообщенияОбОшибках.Вставить(67, НСтр("ru = 'Ошибка получения свойства подчиненного объекта из входящих данных'")); + СообщенияОбОшибках.Вставить(68, НСтр("ru = 'Ошибка получения свойства объекта из входящих данных'")); + + СообщенияОбОшибках.Вставить(69, НСтр("ru = 'Ошибка в глобальном обработчике события ПослеВыгрузкиОбъекта (конвертация)'")); + + СообщенияОбОшибках.Вставить(71, НСтр("ru = 'Не найдено соответствие для значения Источника'")); + + СообщенияОбОшибках.Вставить(72, НСтр("ru = 'Ошибка при выгрузке данных для узла плана обмена'")); + + СообщенияОбОшибках.Вставить(73, НСтр("ru = 'Ошибка в обработчике события ПоследовательностьПолейПоиска'")); + СообщенияОбОшибках.Вставить(74, НСтр("ru = 'Необходимо перезагрузить правила обмена для выгрузки данных.'")); + + СообщенияОбОшибках.Вставить(75, НСтр("ru = 'Ошибка в обработчике события ПослеЗагрузкиПравилОбмена (конвертация)'")); + СообщенияОбОшибках.Вставить(76, НСтр("ru = 'Ошибка в обработчике события ПередОтправкойИнформацииОбУдалении (конвертация)'")); + СообщенияОбОшибках.Вставить(77, НСтр("ru = 'Ошибка в обработчике события ПриПолученииИнформацииОбУдалении (конвертация)'")); + + СообщенияОбОшибках.Вставить(78, НСтр("ru = 'Ошибка при выполнении алгоритма после загрузки значений параметров'")); + + СообщенияОбОшибках.Вставить(79, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиОбъектаВФайл'")); + + СообщенияОбОшибках.Вставить(174, НСтр("ru = 'Сообщение обмена было принято ранее'")); + СообщенияОбОшибках.Вставить(175, НСтр("ru = 'Ошибка в обработчике события ПередПолучениемИзмененныхОбъектов (конвертация)'")); + СообщенияОбОшибках.Вставить(176, НСтр("ru = 'Ошибка в обработчике события ПослеПолученияИнформацииОбУзлахОбмена (конвертация)'")); + +КонецПроцедуры // ИнициализацияСообщений() + +Процедура ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, ИмяТипа, Менеджер, ПрефиксИмениТипа, ВозможенПоискПоПредопределенным = Ложь) + + Имя = ОбъектМД.Имя; + ТипСсылкиСтрокой = ПрефиксИмениТипа + "." + Имя; + СтрокаПоиска = "ВЫБРАТЬ Ссылка ИЗ " + ИмяТипа + "." + Имя + " ГДЕ "; + СтрокаПоискаВыгрузкиСсылки = "ВЫБРАТЬ #ПоляПоиска# ИЗ " + ИмяТипа + "." + Имя; + ТипСсылки = Тип(ТипСсылкиСтрокой); + Структура = Новый Структура("Имя,ИмяТипа,ТипСсылкиСтрокой,Менеджер,ОбъектМД,СтрокаПоиска,СтрокаПоискаВыгрузкиСсылки,ВозможенПоискПоПредопределенным,ПКО", Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, СтрокаПоиска, СтрокаПоискаВыгрузкиСсылки, ВозможенПоискПоПредопределенным); + Менеджеры.Вставить(ТипСсылки, Структура); + + + СтруктураДляПланаОбмена = Новый Структура("Имя,ТипСсылки,ЭтоСсылочныйТип,ЭтоРегистр", Имя, ТипСсылки, Истина, Ложь); + МенеджерыДляПлановОбмена.Вставить(ОбъектМД, СтруктураДляПланаОбмена); + +КонецПроцедуры + +Процедура ДополнитьМассивМенеджеровТипомРегистра(Менеджеры, ОбъектМД, ИмяТипа, Менеджер, ПрефиксИмениТипаЗапись, ПрефиксИмениТипаВыборка) + + Периодический = Неопределено; + + Имя = ОбъектМД.Имя; + ТипСсылкиСтрокой = ПрефиксИмениТипаЗапись + "." + Имя; + ТипСсылки = Тип(ТипСсылкиСтрокой); + Структура = Новый Структура("Имя,ИмяТипа,ТипСсылкиСтрокой,Менеджер,ОбъектМД,ВозможенПоискПоПредопределенным,ПКО", Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, Ложь); + + Если ИмяТипа = "РегистрСведений" Тогда + + Периодический = (ОбъектМД.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический); + ПодчиненныйРегистратору = (ОбъектМД.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору); + + Структура.Вставить("Периодический", Периодический); + Структура.Вставить("ПодчиненныйРегистратору", ПодчиненныйРегистратору); + + КонецЕсли; + + Менеджеры.Вставить(ТипСсылки, Структура); + + + СтруктураДляПланаОбмена = Новый Структура("Имя,ТипСсылки,ЭтоСсылочныйТип,ЭтоРегистр", Имя, ТипСсылки, Ложь, Истина); + МенеджерыДляПлановОбмена.Вставить(ОбъектМД, СтруктураДляПланаОбмена); + + + ТипСсылкиСтрокой = ПрефиксИмениТипаВыборка + "." + Имя; + ТипСсылки = Тип(ТипСсылкиСтрокой); + Структура = Новый Структура("Имя,ИмяТипа,ТипСсылкиСтрокой,Менеджер,ОбъектМД,ВозможенПоискПоПредопределенным,ПКО", Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, Ложь); + + Если Периодический <> Неопределено Тогда + + Структура.Вставить("Периодический", Периодический); + Структура.Вставить("ПодчиненныйРегистратору", ПодчиненныйРегистратору); + + КонецЕсли; + + Менеджеры.Вставить(ТипСсылки, Структура); + +КонецПроцедуры + +// Инициализирует переменную Менеджеры, содержащую соответствия типов объектов их свойствам +// +// Параметры: +// Нет. +// +Процедура ИнициализацияМенеджеров() + + Менеджеры = Новый Соответствие; + + МенеджерыДляПлановОбмена = Новый Соответствие; + + // ССЫЛКИ + + Для каждого ОбъектМД Из Метаданные.Справочники Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "Справочник", Справочники[ОбъектМД.Имя], "СправочникСсылка", Истина); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.Документы Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "Документ", Документы[ОбъектМД.Имя], "ДокументСсылка"); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.ПланыВидовХарактеристик Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "ПланВидовХарактеристик", ПланыВидовХарактеристик[ОбъектМД.Имя], "ПланВидовХарактеристикСсылка", Истина); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.ПланыСчетов Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "ПланСчетов", ПланыСчетов[ОбъектМД.Имя], "ПланСчетовСсылка", Истина); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.ПланыВидовРасчета Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "ПланВидовРасчета", ПланыВидовРасчета[ОбъектМД.Имя], "ПланВидовРасчетаСсылка", Истина); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.ПланыОбмена Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "ПланОбмена", ПланыОбмена[ОбъектМД.Имя], "ПланОбменаСсылка"); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.Задачи Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "Задача", Задачи[ОбъектМД.Имя], "ЗадачаСсылка"); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.БизнесПроцессы Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "БизнесПроцесс", БизнесПроцессы[ОбъектМД.Имя], "БизнесПроцессСсылка"); + + ИмяТипа = "ТочкаМаршрутаБизнесПроцесса"; + // ссылка на точки маршрута + Имя = ОбъектМД.Имя; + Менеджер = БизнесПроцессы[Имя].ТочкиМаршрута; + СтрокаПоиска = ""; + ТипСсылкиСтрокой = "ТочкаМаршрутаБизнесПроцессаСсылка." + Имя; + ТипСсылки = Тип(ТипСсылкиСтрокой); + Структура = Новый Структура("Имя,ИмяТипа,ТипСсылкиСтрокой,Менеджер,ОбъектМД,ПКО,ПустаяСсылка,ВозможенПоискПоПредопределенным,СтрокаПоиска", Имя, + ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, , Неопределено, Ложь, СтрокаПоиска); + Менеджеры.Вставить(ТипСсылки, Структура); + + КонецЦикла; + + // РЕГИСТРЫ + + Для каждого ОбъектМД Из Метаданные.РегистрыСведений Цикл + + ДополнитьМассивМенеджеровТипомРегистра(Менеджеры, ОбъектМД, "РегистрСведений", РегистрыСведений[ОбъектМД.Имя], "РегистрСведенийЗапись", "РегистрСведенийВыборка"); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.РегистрыБухгалтерии Цикл + + ДополнитьМассивМенеджеровТипомРегистра(Менеджеры, ОбъектМД, "РегистрБухгалтерии", РегистрыБухгалтерии[ОбъектМД.Имя], "РегистрБухгалтерииЗапись", "РегистрБухгалтерииВыборка"); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.РегистрыНакопления Цикл + + ДополнитьМассивМенеджеровТипомРегистра(Менеджеры, ОбъектМД, "РегистрНакопления", РегистрыНакопления[ОбъектМД.Имя], "РегистрНакопленияЗапись", "РегистрНакопленияВыборка"); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.РегистрыРасчета Цикл + + ДополнитьМассивМенеджеровТипомРегистра(Менеджеры, ОбъектМД, "РегистрРасчета", РегистрыРасчета[ОбъектМД.Имя], "РегистрРасчетаЗапись", "РегистрРасчетаВыборка"); + + КонецЦикла; + + ИмяТипа = "Перечисление"; + + Для каждого ОбъектМД Из Метаданные.Перечисления Цикл + + Имя = ОбъектМД.Имя; + Менеджер = Перечисления[Имя]; + ТипСсылкиСтрокой = "ПеречислениеСсылка." + Имя; + ТипСсылки = Тип(ТипСсылкиСтрокой); + Структура = Новый Структура("Имя,ИмяТипа,ТипСсылкиСтрокой,Менеджер,ОбъектМД,ПКО,ПустаяСсылка,ВозможенПоискПоПредопределенным", Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, , Перечисления[Имя].ПустаяСсылка(), Ложь); + Менеджеры.Вставить(ТипСсылки, Структура); + + КонецЦикла; + + // Константы + ИмяТипа = "Константы"; + ОбъектМД = Метаданные.Константы; + Имя = "Константы"; + Менеджер = Константы; + ТипСсылкиСтрокой = "КонстантыНабор"; + ТипСсылки = Тип(ТипСсылкиСтрокой); + Структура = Новый Структура("Имя,ИмяТипа,ТипСсылкиСтрокой,Менеджер,ОбъектМД,ВозможенПоискПоПредопределенным,ПКО", Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, Ложь); + Менеджеры.Вставить(ТипСсылки, Структура); + +КонецПроцедуры // ИнициализацияМенеджеров() + +Процедура ИнициализироватьМенеджерыИСообщения() + + Если Менеджеры = Неопределено Тогда + ИнициализацияМенеджеров(); + КонецЕсли; + + Если СообщенияОбОшибках = Неопределено Тогда + ИнициализацияСообщений(); + КонецЕсли; + +КонецПроцедуры + +Процедура СоздатьСтруктуруКонвертации() + + Конвертация = Новый Структура("ПередВыгрузкойДанных, ПослеВыгрузкиДанных, ПередПолучениемИзмененныхОбъектов, ПослеПолученияИнформацииОбУзлахОбмена, ПередВыгрузкойОбъекта, ПослеВыгрузкиОбъекта, ПередКонвертациейОбъекта, ПередЗагрузкойОбъекта, ПослеЗагрузкиОбъекта, ПередЗагрузкойДанных, ПослеЗагрузкиДанных, ПриПолученииИнформацииОбУдалении, ПередОтправкойИнформацииОбУдалении"); + Конвертация.Вставить("УдалятьСопоставленныеОбъектыВПриемникеПриИхУдаленииВИсточнике", Ложь); + Конвертация.Вставить("ВерсияФормата"); + Конвертация.Вставить("ДатаВремяСоздания"); + +КонецПроцедуры + +// Инициализирует реквизиты обработки и модульные переменные +// +// Параметры: +// Нет. +// +Процедура ИнициализацияРеквизитовИМодульныхПеременных() + + РежимВизуальнойНастройкиОбмена = Ложь; + КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 100; + + ЧислоХранимыхВыгруженныхОбъектовПоТипам = 2000; + + ПараметрыИнициализированы = Ложь; + + ВестиДополнительныйКонтрольЗаписиВXML = Ложь; + НепосредственноеЧтениеВИБПриемнике = Ложь; + + Менеджеры = Неопределено; + СообщенияОбОшибках = Неопределено; + + УстановитьФлагОшибки(Ложь); + + СоздатьСтруктуруКонвертации(); + + Правила = Новый Структура; + Алгоритмы = Новый Структура; + ДопОбработки = Новый Структура; + Запросы = Новый Структура; + + Параметры = Новый Структура; + СобытияПослеЗагрузкиПараметров = Новый Структура; + + ПараметрыДопОбработок = Новый Структура; + + XMLПравила = Неопределено; + + // Типы + + ТипСтрока = Тип("Строка"); + ТипБулево = Тип("Булево"); + ТипЧисло = Тип("Число"); + ТипДата = Тип("Дата"); + ТипХранилищеЗначения = Тип("ХранилищеЗначения"); + ТипДвоичныеДанные = Тип("ДвоичныеДанные"); + ТипВидДвиженияНакопления = Тип("ВидДвиженияНакопления"); + ТипУдалениеОбъекта = Тип("УдалениеОбъекта"); + ТипВидСчета = Тип("ВидСчета"); + ТипТип = Тип("Тип"); + ТипСоответствие = Тип("Соответствие"); + + ТипСтрока36 = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(36)); + ТипСтрока255 = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(255)); + + ТипРегистрСоответствия = Тип("РегистрСведенийНаборЗаписей.СоответствиеОбъектовИнформационныхБаз"); + + ЗначениеПустаяДата = Дата('00010101'); + + // Типы узлов xml + + ТипУзлаXMLКонецЭлемента = ТипУзлаXML.КонецЭлемента; + ТипУзлаXMLНачалоЭлемента = ТипУзлаXML.НачалоЭлемента; + ТипУзлаXMLТекст = ТипУзлаXML.Текст; + + ФайлПротоколаДанных = Неопределено; + + СоответствиеТиповИНазваниеОбъектов = Новый Соответствие(); + + ТипИнформационнойБазыДляПодключения = Истина; + АутентификацияWindowsИнформационнойБазыДляПодключения = Ложь; + ВерсияПлатформыИнформационнойБазыДляПодключения = "V81"; + ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты = Истина; + ОптимизированнаяЗаписьОбъектов = Истина; + + СоответствиеПустыхЗначенийТипов = Новый Соответствие; + СоответствиеОписаниеТипов = Новый Соответствие; + + // инициализируем таблицу для отложенного проведения документов + ДокументыДляОтложенногоПроведения = Новый ТаблицаЗначений; + ДокументыДляОтложенногоПроведения.Колонки.Добавить("ДокументОбъект"); + ДокументыДляОтложенногоПроведения.Колонки.Добавить("ДокументСсылка"); + ДокументыДляОтложенногоПроведения.Колонки.Добавить("ДатаДокумента", одОписаниеТипа("Дата")); + ДокументыДляОтложенногоПроведения.Колонки.Добавить("ДокументПроведенУспешно", одОписаниеТипа("Булево")); + + РазрешитьПроведениеДокумента = Метаданные.СвойстваОбъектов.Проведение.Разрешить; + + РежимЗагрузкиИнформацииОПравилахОбмена = Ложь; + + ПолеРезультатВыполненияОбмена = Неопределено; + + ИнформацияОПользовательскихПоляхПоискаПриВыгрузкеДанных = Новый Соответствие(); + ИнформацияОПользовательскихПоляхПоискаПриЗагрузкеДанных = Новый Соответствие(); + + МенеджерРегистраСоответствийОбъектов = РегистрыСведений.СоответствиеОбъектовИнформационныхБаз; + + // запрос для определения информации о сопоставлении объектов для подмены ссылки источника, на ссылку приемника + ЗапросСоответствиеОбъектовИнформационныхБаз = Новый Запрос; + ЗапросСоответствиеОбъектовИнформационныхБаз.Текст = " + |ВЫБРАТЬ ПЕРВЫЕ 1 + | СоответствиеОбъектовИнформационныхБаз.УникальныйИдентификаторИсточникаСтрокой КАК УникальныйИдентификаторИсточникаСтрокой + |ИЗ + | РегистрСведений.СоответствиеОбъектовИнформационныхБаз КАК СоответствиеОбъектовИнформационныхБаз + |ГДЕ + | СоответствиеОбъектовИнформационныхБаз.УзелИнформационнойБазы = &УзелИнформационнойБазы + | И СоответствиеОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника = &УникальныйИдентификаторПриемника + | И СоответствиеОбъектовИнформационныхБаз.ТипПриемника = &ТипПриемника + | И СоответствиеОбъектовИнформационныхБаз.ТипИсточника = &ТипИсточника + |"; + // + +КонецПроцедуры + +Процедура УстановитьФлагОшибки(Значение = Истина) + + ПолеФлагОшибки = Значение; + +КонецПроцедуры + +Процедура Инкремент(Значение, Знач Итератор = 1) + + Если ТипЗнч(Значение) <> Тип("Число") Тогда + + Значение = 0; + + КонецЕсли; + + Значение = Значение + Итератор; + +КонецПроцедуры + +Процедура ЗафиксироватьЗавершениеЗагрузкиДанных() + + СостояниеОбменаДанными().РезультатВыполненияОбмена = РезультатВыполненияОбмена(); + СостояниеОбменаДанными().ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; + СостояниеОбменаДанными().УзелИнформационнойБазы = УзелОбменаЗагрузкаДанных; + + // добавляем запись в РС + РегистрыСведений.СостояниеОбменовДанными.ДобавитьЗапись(СостояниеОбменаДанными()); + + // фиксируем успешное выполнение обмена в РС + Если РезультатВыполненияОбмена() = Перечисления.РезультатыВыполненияОбмена.Выполнено Тогда + + // создаем и заполняем структуру для новой записи в РС + СтруктураЗаписи = Новый Структура("УзелИнформационнойБазы, ДействиеПриОбмене, ДатаОкончания"); + ЗаполнитьЗначенияСвойств(СтруктураЗаписи, СостояниеОбменаДанными()); + + // добавляем запись в РС + РегистрыСведений.СостояниеУспешныхОбменовДанными.ДобавитьЗапись(СтруктураЗаписи); + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ + +ИнициализацияРеквизитовИМодульныхПеременных(); + +ИнициализацияТаблицыПравилКонвертации(); +ИнициализацияТаблицыПравилВыгрузки(); +ИнициализацияТаблицыПравилОчистки(); +ИнициализацияТаблицыНастройкиПараметров(); \ No newline at end of file diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/КонвертацияОбъектовИнформационныхБаз.mdo b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/КонвертацияОбъектовИнформационныхБаз.mdo new file mode 100644 index 000000000..448b82783 --- /dev/null +++ b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/КонвертацияОбъектовИнформационныхБаз.mdo @@ -0,0 +1,784 @@ + + + + + + + КонвертацияОбъектовИнформационныхБаз + + ru + Конвертация объектов информационных баз + + + АрхивироватьФайл + + ru + Архивировать файл + + + Boolean + + + + + + АутентификацияWindowsИнформационнойБазыДляПодключения + + ru + Аутентификация windows информационной базы для подключения + + + Boolean + + + + + + ВерсияПлатформыИнформационнойБазыДляПодключения + + ru + Версия платформы информационной базы для подключения + + + String + + 5 + + + + + + + ВерсияПравилОбмена + + ru + Версия правил обмена + + + Date + + + + + + + ВестиДополнительныйКонтрольЗаписиВXML + + ru + Вести дополнительный контроль записи в XML + + + Boolean + + + + + + ВыводВОкноСообщенийИнформационныхСообщений + + ru + Вывод в окно сообщений информационных сообщений + + + Boolean + + + + + + ВыводВПротоколИнформационныхСообщений + + ru + Вывод в протокол информационных сообщений + + + Boolean + + + + + + ВыводВПротоколСообщенийОбОшибках + + ru + Вывод в протокол сообщений об ошибках + + + Boolean + + + + + + ВыгружатьТолькоРазрешенные + + ru + Выгружать только разрешенные + + + Boolean + + + + + + Данные + + ru + Данные + + + + + + + ДатаВыгрузкиДанных + + ru + Дата выгрузки данных + + + Date + + + + + + + ДобавлениеОбъектовИзФоновогоОбмена + + ru + Добавление объектов из фонового обмена + + + Number + + 10 + + + + + + + ДобавлениеОбъектовИзФоновогоОбменаЗагрузка + + ru + Добавление объектов из фонового обмена загрузка + + + Number + + 10 + + + + + + + ДописыватьДанныеВПротоколОбмена + + ru + Дописывать данные в протокол обмена + + + Boolean + + + + + + ЗадаватьВопросПриЗагрузкеДанныхПриОткрытииОбработки + + ru + Задавать вопрос при начале автоматической загрузки данных при открытии обработки + + + Boolean + + + + + + ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты + + ru + Записывать в информационную базу только измененные объекты + + + Boolean + + + + + + ИмяИнформационнойБазыНаСервереДляПодключения + + ru + Имя информационной базы на сервере для подключения + + + String + + + + + + + ИмяКаталогаСообщенияОбмена + + ru + Имя каталога сообщения обмена + + + String + + + + + + + ИмяПланаОбменаВРО + + ru + Имя плана обмена ВРО + + + String + + 150 + + + + + + + ИмяСервераИнформационнойБазыДляПодключения + + ru + Имя сервера информационной базы для подключения + + + String + + + + + + + ИмяФайлаОбмена + + ru + Имя файла обмена + + + String + + + + + + + ИмяФайлаПравилОбмена + + ru + Имя файла правил обмена + + + String + + + + + + + ИмяФайлаПротоколаОбмена + + ru + Имя файла протокола обмена + + + String + + 255 + + + + + + + ИспользоватьТранзакции + + ru + Использовать транзакции + + + Boolean + + + + + + ИспользоватьТранзакцииПриВыгрузкеДляПлановОбмена + + ru + Использовать транзакции при выгрузке для планов обмена + + + Boolean + + + + + + КаталогИнформационнойБазыДляПодключения + + ru + Каталог информационной базы для подключения + + + String + + + + + + + КоличествоОбработанныхОбъектовДляОбновленияСтатуса + + ru + Количество обработанных объектов для обновления статуса + + + Number + + 10 + true + + + + + + + КоличествоОбъектовДляФоновогоОбмена + + ru + Количество объектов для фонового обмена + + + Number + + 10 + true + + + + + + + КоличествоОбъектовДляФоновогоОбменаЗагрузка + + ru + Количество объектов для фонового обмена загрузка + + + Number + + 10 + true + + + + + + + КоличествоОбъектовНаТранзакцию + + ru + Количество объектов на транзакцию + + + Number + + 10 + true + + + + + + + КоличествоЭлементовВТранзакцииПриВыгрузкеДляПлановОбмена + + ru + Количество элементов в транзакции при выгрузке для планов обмена + + + Number + + 10 + true + + + + + + + Комментарий + + ru + Комментарий + + + String + + + + + + + КомментарийПриВыгрузкеДанных + + ru + Комментарий при выгрузке данных + + + String + + + + + + + КомментарийПриЗагрузкеДанных + + ru + Комментарий при загрузке данных + + + String + + + + + + + НеВыгружатьОбъектыПоСсылкам + + ru + Не выгружать объекты по ссылкам + + + Boolean + + + + + + НепосредственноеЧтениеВИБПриемнике + + ru + Непосредственное чтение в ИБ приемнике + + + Boolean + + + + + + ОбработкиНастройкиВыгрузки + + ru + Обработки настройки выгрузки + + + ValueList + + + + + + ОбработкиНастройкиЗагрузки + + ru + Обработки настройки загрузки + + + ValueList + + + + + + ОптимизированнаяЗаписьОбъектов + + ru + Оптимизированная запись объектов + + + Boolean + + + + + + Параметры + + ru + Параметры + + + + + + + ПарольИнформационнойБазыДляПодключения + + ru + Пароль информационной базы для подключения + + + String + + + + + + + ПереданоОбъектовФоновогоОбмена + + ru + Передано объектов фонового обмена + + + Number + + 10 + true + + + + + + + ПолученоОбъектовФоновогоОбмена + + ru + Получено объектов фонового обмена + + + Number + + 10 + true + + + + + + + ПользовательИнформационнойБазыДляПодключения + + ru + Пользователь информационной базы для подключения + + + String + + + + + + + ПостроительОтчета + + ru + Построитель отчета + + + ReportBuilder + + + + + + РежимЗагрузкиДанных + + ru + Режим загрузки данных + + + String + + + + + + + РежимОбмена + + ru + Режим обмена + + + String + + 10 + + + + + + + РезультатВыполненияОтложенныхДвижений + + ru + Результат выполнения отложенных движений + + + + + + + СохраненныеНастройки + + ru + Сохраненные настройки + + + + + + + ТаблицаНастройкиПараметров + + ru + Таблица настройки параметров + + + ValueTable + + + + + + ТаблицаПравилВыгрузки + + ru + Таблица правил выгрузки + + + ValueTable + + + + + + ТаблицаПравилКонвертации + + ru + Таблица правил конвертации + + + ValueTable + + + + + + ТаблицаПравилОчистки + + ru + Таблица правил очистки + + + ValueTree + + + + + + ТипИнформационнойБазыДляПодключения + + ru + Тип информационной базы для подключения + + + Boolean + + + + + + УзелДляОбмена + + ru + Узел для обмена + + + ExchangePlanRef + + + + + + УзелДляФоновогоОбмена + + ru + Узел для фонового обмена + + + ExchangePlanRef + + + + + + УзелОбменаЗагрузкаДанных + + ru + Узел обмена загрузка данных + + + ExchangePlanRef + + + + + + УзелОбменаЗагрузкаФоновыхДанных + + ru + Узел обмена загрузка фоновых данных + + + ExchangePlanRef + + + + + + ФлагРежимОтладки + + ru + Режим отладки + + + Boolean + + + + + + ЭтоИнтерактивныйРежим + + ru + Это интерактивный режим + + + Boolean + + + + + diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl new file mode 100644 index 000000000..ab3198d6c --- /dev/null +++ b/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl @@ -0,0 +1,218 @@ +/////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ МОДУЛЯ + +Перем ПолеИмяФайлаСообщенияОбмена; + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Выполняет загрузку данных из файла сообщения обмена +// +// Параметры: +// Отказ – Булево – флаг отказа; поднимается в случае возникновения ошибок при обработке сообщения обмена +// +Процедура ВыполнитьЗагрузкуДанных(Отказ) Экспорт + + Если Не ЭтоУзелРаспределеннойИнформационнойБазы() Тогда + + // обмен не по правилам конвертации не поддерживается + ЗафиксироватьЗавершениеОбмена(Отказ,, ОшибкаВидаОбменаДанными()); + Возврат; + КонецЕсли; + + ЧтениеXML = Новый ЧтениеXML; + + Попытка + ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщенияОбмена()); + Исключение + + // ошибка открытия файла сообщения обмена + ЗафиксироватьЗавершениеОбмена(Отказ, ОписаниеОшибки(), ОшибкаОткрытияФайлаСообщенияОбмена()); + Возврат; + КонецПопытки; + + ПрочитатьФайлСообщенияОбмена(Отказ, ЧтениеXML); + + ЧтениеXML.Закрыть(); + ЧтениеXML = Неопределено; + +КонецПроцедуры + +// Выполняет выгрузку данных в файл сообщения обмена +// +// Параметры: +// Отказ – Булево – флаг отказа; поднимается в случае возникновения ошибок при обработке сообщения обмена +// +Процедура ВыполнитьВыгрузкуДанных(Отказ) Экспорт + + Если Не ЭтоУзелРаспределеннойИнформационнойБазы() Тогда + + // обмен не по правилам конвертации не поддерживается + ЗафиксироватьЗавершениеОбмена(Отказ,, ОшибкаВидаОбменаДанными()); + Возврат; + КонецЕсли; + + ЗаписьXML = Новый ЗаписьXML; + + Попытка + ЗаписьXML.ОткрытьФайл(ИмяФайлаСообщенияОбмена()); + Исключение + + // ошибка открытия файла сообщения обмена + ЗафиксироватьЗавершениеОбмена(Отказ, ОписаниеОшибки(), ОшибкаОткрытияФайлаСообщенияОбмена()); + Возврат; + КонецПопытки; + + ЗаписатьИзмененияВФайлСообщенияОбмена(Отказ, ЗаписьXML); + + ЗаписьXML.Закрыть(); + ЗаписьXML = Неопределено; + +КонецПроцедуры + +// Устанавливает локальной переменной ПолеИмяФайлаСообщенияОбмена +// строку с полным именем файла сообщения обмена для загрузки или выгрузки данных. +// Как правило, файл сообщения обмена располагается +// во временном каталоге пользователя операционной системы. +// +// Параметры: +// ИмяФайла – Строка – полное имя файла сообщения обмена для выгрузки или загрузки данных +// +Процедура УстановитьИмяФайлаСообщенияОбмена(Знач ИмяФайла) Экспорт + + ПолеИмяФайлаСообщенияОбмена = ИмяФайла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СВОЙСТВА + +Функция ИмяФайлаСообщенияОбмена() + + Если ТипЗнч(ПолеИмяФайлаСообщенияОбмена) <> Тип("Строка") Тогда + + ПолеИмяФайлаСообщенияОбмена = ""; + + КонецЕсли; + + Возврат ПолеИмяФайлаСообщенияОбмена; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +Процедура ПрочитатьФайлСообщенияОбмена(Отказ, ЧтениеXML) + + ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); + + Попытка + ЧтениеСообщения.НачатьЧтение(ЧтениеXML, ДопустимыйНомерСообщения.Больший); + Исключение + + // задан неизвестный план обмена; + // указан узел, не входящий в план обмена; + // номер сообщения не соответствует ожидаемому + ЗафиксироватьЗавершениеОбмена(Отказ, ОписаниеОшибки(), ОшибкаНачалаЧтенияФайлаСообщенияОбмена()); + Возврат; + КонецПопытки; + + ПрочитатьИзмененияИзФайлаСообщенияОбмена(Отказ, ЧтениеСообщения); + + Если Отказ Тогда + ЧтениеСообщения.ПрерватьЧтение(); + Иначе + ЧтениеСообщения.ЗакончитьЧтение(); + КонецЕсли; + +КонецПроцедуры + +Процедура ПрочитатьИзмененияИзФайлаСообщенияОбмена(Отказ, ЧтениеСообщения) + + Попытка + ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения, КоличествоЭлементовВТранзакции); + Исключение + + // возможно, исключение вызвано изменениями метаданных, полученных от главного узла + ЗафиксироватьЗавершениеОбмена(Отказ, ОписаниеОшибки(), ОшибкаЧтенияФайлаСообщенияОбмена()); + + КонецПопытки; + +КонецПроцедуры + +Процедура ЗаписатьИзмененияВФайлСообщенияОбмена(Отказ, ЗаписьXML) + + ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); + + ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелИнформационнойБазы); + + Попытка + ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, КоличествоЭлементовВТранзакции); + Исключение + + // ошибка при записи изменений в файл сообщения обмена данными + ЗафиксироватьЗавершениеОбмена(Отказ, ОписаниеОшибки(), ОшибкаЗаписиФайлаСообщенияОбмена()); + КонецПопытки; + + Если Отказ Тогда + ЗаписьСообщения.ПрерватьЗапись(); + Иначе + ЗаписьСообщения.ЗакончитьЗапись(); + КонецЕсли; + +КонецПроцедуры + +// + +Процедура ЗафиксироватьЗавершениеОбмена(Отказ, ОписаниеОшибки = "", ОписаниеОшибкиКонтекста = "") + + Отказ = Истина; + + Комментарий = "[ОписаниеОшибкиКонтекста]: [ОписаниеОшибки]"; + + Комментарий = СтрЗаменить(Комментарий, "[ОписаниеОшибкиКонтекста]", ОписаниеОшибкиКонтекста); + Комментарий = СтрЗаменить(Комментарий, "[ОписаниеОшибки]", ОписаниеОшибки); + + ЗаписьЖурналаРегистрации(КлючСообщенияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, + УзелИнформационнойБазы.Метаданные(), УзелИнформационнойБазы, Комментарий); + +КонецПроцедуры + +Функция ЭтоУзелРаспределеннойИнформационнойБазы() + + Возврат УзелИнформационнойБазы.Метаданные().РаспределеннаяИнформационнаяБаза; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ОШИБКИ КОНТЕКСТА ВЫПОЛНЕНИЯ + +Функция ОшибкаОткрытияФайлаСообщенияОбмена() + + Возврат НСтр("ru = 'Ошибка открытия файла сообщения обмена'"); + +КонецФункции + +Функция ОшибкаНачалаЧтенияФайлаСообщенияОбмена() + + Возврат НСтр("ru = 'Ошибка при начале чтения файла сообщения обмена'"); + +КонецФункции + +Функция ОшибкаЧтенияФайлаСообщенияОбмена() + + Возврат НСтр("ru = 'Ошибка чтения файла сообщения обмена'"); + +КонецФункции + +Функция ОшибкаЗаписиФайлаСообщенияОбмена() + + Возврат НСтр("ru = 'Ошибка записи данных в файл сообщения обмена'"); + +КонецФункции + +Функция ОшибкаВидаОбменаДанными() + + Возврат НСтр("ru = 'Обмен не по правилам конвертации не поддерживается'"); + +КонецФункции diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/КонвертацияОбъектовРаспределенныхИнформационныхБаз.mdo b/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/КонвертацияОбъектовРаспределенныхИнформационныхБаз.mdo new file mode 100644 index 000000000..cfc67a0d3 --- /dev/null +++ b/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/КонвертацияОбъектовРаспределенныхИнформационныхБаз.mdo @@ -0,0 +1,54 @@ + + + + + + + КонвертацияОбъектовРаспределенныхИнформационныхБаз + + ru + Конвертация объектов распределенных информационных баз + + true + + УзелИнформационнойБазы + + ru + Узел информационной базы + + + ExchangePlanRef + + + + + + КоличествоЭлементовВТранзакции + + ru + Количество элементов в транзакции + + + Number + + 10 + true + + + + + + + КлючСообщенияЖурналаРегистрации + + ru + Ключ сообщения журнала регистрации + + + String + + + + + + diff --git a/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/КонтрольЖурналаРегистрации/Form.form b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/КонтрольЖурналаРегистрации/Form.form new file mode 100644 index 000000000..1760f026c --- /dev/null +++ b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/КонтрольЖурналаРегистрации/Form.form @@ -0,0 +1,642 @@ + + + + ГруппаПериодВыборки + 25 + + НачалоПериодаВыборки + 21 + true + true + + true + + + НачалоПериодаВыборки + + + НачалоПериодаВыборкиРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + НачалоПериодаВыборкиКонтекстноеМеню + 22 + true + + InputField + true + Enter + true + Left + true + + 11 + true + true + true + true + true + true + Normal + + + + ОкончаниеПериодаВыборки + 23 + true + true + + true + + + ОкончаниеПериодаВыборки + + + ОкончаниеПериодаВыборкиРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ОкончаниеПериодаВыборкиКонтекстноеМеню + 24 + true + + InputField + true + Enter + true + Left + true + + 11 + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Период выборки</value> + + + ru + Границы периода выборки данных из журнала регистрации + + + ГруппаПериодВыборкиРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Отчет + 26 + true + true + + true + + + Отчет + + None + + ОтчетРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + ОтчетКонтекстноеМеню + 27 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + 50 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Auto + true + true + true + + + + ФормаКоманднаяПанель + -1 + + Сформировать + 20 + + <key>ru</key> + <value>Сформировать</value> + + true + true + + true + + false + + СформироватьРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Form.Command.ОбновитьОтчетНаФорме + PictureAndText + true + true + true + UserCmds + + StdPicture.GenerateReport + + Auto + + + ГруппаНастройки + 18 + + НастроитьРасписание + 28 + true + true + + true + + false + + НастроитьРасписаниеРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.Command.НастроитьРасписаниеРегламентногоЗадания + Normal + Auto + true + true + UserCmds + Auto + + + НастроитьАдресатовОтчета + 17 + true + true + + true + + false + + НастроитьАдресатовОтчетаРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.Command.УказатьПолучателейОтчета + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Настройка</value> + + + ru + Настройка почтового адреса отправки отчета и расписания регламентного задания + + + ГруппаНастройкиРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + Справка + 29 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.КонтрольЖурналаРегистрации + + + true + + + true + +
    true
    +
    + + ВыгрузкаИнформацииПоОшибкам + + <key>ru</key> + <value>Выгрузка информации по ошибкам</value> + + 2 + + ValueTable + + + true + + + true + + + Дата + + <key>ru</key> + <value>Момент возникновения ошибки</value> + + 1 + + Date + + + + 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 + + String + + + + true + + + true + + + + + НачалоПериодаВыборки + + <key>ru</key> + <value>Начало периода выборки</value> + + 3 + + Date + + + + true + + + true + + + + ОкончаниеПериодаВыборки + + <key>ru</key> + <value>Окончание периода выборки</value> + + 4 + + Date + + + + true + + + true + + + + Отчет + + <key>ru</key> + <value>Отчет</value> + + 5 + + SpreadsheetDocument + + + 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> + + 1 + + ru + Настроить расписание регламентного задания + + + true + + + + НастроитьРасписаниеРегламентногоЗаданияВыполнить + + + Auto + Auto + + + УказатьПолучателейОтчета + + <key>ru</key> + <value>Получатели отчета</value> + + 3 + + ru + Указать получателей отчета + + + true + + + + УказатьПолучателейОтчетаВыполнить + + + Auto + Auto + + + ОбновитьОтчетНаФорме + + <key>ru</key> + <value>Обновить отчет на форме</value> + + 4 + + ru + Обновить отчет по ошибкам и предупреждениям на форме + + + true + + + StdPicture.Refresh + + + + ОбновитьОтчетНаФормеВыполнить + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/КонтрольЖурналаРегистрации/Help/ru.html b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/КонтрольЖурналаРегистрации/Help/ru.html new file mode 100644 index 000000000..5e407713a --- /dev/null +++ b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/КонтрольЖурналаРегистрации/Help/ru.html @@ -0,0 +1,7 @@ + +

    Настройка отправки отчета по критичным записям в журнале регистрации:

    +
    • +
      настроить расписание регламентного задания (меню Настройка -> Расписание регламентного задания)
      +
    • +
      указать e-mail адреса получателей отчета (меню Настройка -> Получатели отчета)*

    Если настройка выполнена успешно – отчет по критичным записям журнала регистрации будет отправляться каждый раз при выполнении регламентного задания, и рассылаться по всем e-mail адресам, указанным на втором шаге. При этом данные будут выбираться за период времени прошедший с предыдущей выборки по текущее время.
    Например, пусть задано, что регламентное задание будет выполняться два раза в день: в 9:00 утра и 18:00 вечера. В этом случае, два раза в сутки, в 9:00 и в 18:00 будет отправляться отчет, с выборкой данных с 18:00 предыдущего дня по 9:00 текущего дня и с 9:00 текущего дня по 18:00 текущего дня соответственно.

    +

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

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/КонтрольЖурналаРегистрации/Module.bsl b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/КонтрольЖурналаРегистрации/Module.bsl new file mode 100644 index 000000000..3e7892a56 --- /dev/null +++ b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/КонтрольЖурналаРегистрации/Module.bsl @@ -0,0 +1,78 @@ +// Обработчик события формы "при создании на сервере". +// Выполняет инициализацию реквизитов периода. +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ОкончаниеПериодаВыборки = ТекущаяДата(); + НачалоПериодаВыборки = ОкончаниеПериодаВыборки - 86400; + ОбновитьОтчетНаФорме(); + ИдентификаторРегламентногоЗадания = + РегламентныеЗадания.НайтиПредопределенное( + Метаданные.РегламентныеЗадания.КонтрольЖурналаРегистрации).УникальныйИдентификатор; + +КонецПроцедуры + +// Обработчик нажатия на кнопку "Обновить" +// +&НаКлиенте +Процедура ОбновитьОтчетНаФормеВыполнить() + + ОчиститьСообщения(); + ФормироватьОтчет = Истина; + Если Не ЗначениеЗаполнено(НачалоПериодаВыборки) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Не заполнена дата/время начала периода выборки.'"), , + "НачалоПериодаВыборки"); + ФормироватьОтчет = Ложь; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ОкончаниеПериодаВыборки) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Не заполнена дата/время окончания периода выборки.'"), , + "ОкончаниеПериодаВыборки"); + ФормироватьОтчет = Ложь; + КонецЕсли; + Если ФормироватьОтчет Тогда + ОбновитьОтчетНаФорме(); + КонецЕсли; + +КонецПроцедуры + +// Получает данные по ошибкам из журнала регистрации и формирует +// по нима отчет. Отчет выводится на форму. +// +&НаСервере +Процедура ОбновитьОтчетНаФорме() + + // по полученным данным формируем отчет и записываем его на диск + РезультатФормированияОтчета = + Обработки.КонтрольЖурналаРегистрации.СформироватьОтчет( + НачалоПериодаВыборки, + ОкончаниеПериодаВыборки); + + Отчет = РезультатФормированияОтчета.Отчет; + +КонецПроцедуры + +// Обработчик события нажатия на кнопку "Получатели отчета". +// +&НаКлиенте +Процедура УказатьПолучателейОтчетаВыполнить() + + ОткрытьФорму("Обработка.КонтрольЖурналаРегистрации.Форма.УстановкаПочтовыхАдресовДляОтправкиОтчета"); + +КонецПроцедуры + +// Обработчик команды "Расписание регламентного задания". +// +&НаКлиенте +Процедура НастроитьРасписаниеРегламентногоЗаданияВыполнить() + + Диалог = Новый ДиалогРасписанияРегламентногоЗадания(РегламентныеЗаданияСервер.ПолучитьРасписаниеРегламентногоЗадания(ИдентификаторРегламентногоЗадания)); + Если Диалог.ОткрытьМодально() Тогда + РегламентныеЗаданияСервер.УстановитьРасписаниеРегламентногоЗадания(ИдентификаторРегламентногоЗадания, Диалог.Расписание); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/УстановкаПочтовыхАдресовДляОтправкиОтчета/Form.form b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/УстановкаПочтовыхАдресовДляОтправкиОтчета/Form.form new file mode 100644 index 000000000..a20400190 --- /dev/null +++ b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/УстановкаПочтовыхАдресовДляОтправкиОтчета/Form.form @@ -0,0 +1,180 @@ + + + + <key>ru</key> + <value>Настройка получателей отчета</value> + + + EMailАдресаПолучателейОтчета + 1 + + <key>ru</key> + <value>Почтовые адреса</value> + + true + true + + true + + + EMailАдресаПолучателейОтчета + + Top + + ru + Адресаты отделяются друг от друга точкой с запятой ";" или запятой "," + + + EMailАдресаПолучателейОтчетаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + EMailАдресаПолучателейОтчетаКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + 40 + true + true + true + true + true + Normal + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + КнопкаСохранитьАдрес + 3 + + <key>ru</key> + <value>ОК</value> + + true + true + + true + + false + + КнопкаСохранитьАдресРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + Form.Command.СохранитьАдрес + Auto + true + true + true + UserCmds + Auto + + + КнопкаОтмена + 4 + true + true + + true + + false + + КнопкаОтменаРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + EMailАдресаПолучателейОтчета + + <key>ru</key> + <value>Адреса получателей отчета</value> + + 2 + + String + + + + true + + + true + + + + СохранитьАдрес + + <key>ru</key> + <value>Сохранить адрес</value> + + 1 + + ru + Сохранить адрес + + + true + + + + СохранитьАдресВыполнить + + + Auto + Auto + + + + + + diff --git a/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/УстановкаПочтовыхАдресовДляОтправкиОтчета/Help/ru.html b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/УстановкаПочтовыхАдресовДляОтправкиОтчета/Help/ru.html new file mode 100644 index 000000000..730bc51ff --- /dev/null +++ b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/УстановкаПочтовыхАдресовДляОтправкиОтчета/Help/ru.html @@ -0,0 +1,6 @@ + +

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

    +

    Для задания нескольких адресов следует использовать символ ";" (точка с запятой).

    +

    Пример задания адреса:

    +
    +

    Иванов ivanov@mailserver; Петров petrov@mailserver

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/УстановкаПочтовыхАдресовДляОтправкиОтчета/Module.bsl b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/УстановкаПочтовыхАдресовДляОтправкиОтчета/Module.bsl new file mode 100644 index 000000000..121a13c16 --- /dev/null +++ b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Forms/УстановкаПочтовыхАдресовДляОтправкиОтчета/Module.bsl @@ -0,0 +1,62 @@ +// Обработчик события формы "при создании на сервере" +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + EMailАдресаПолучателейОтчета = КонтрольЖурналаРегистрации.ПолучитьАдресатовПолученияОтчетаПоЖурналуРегистрации(); + +КонецПроцедуры + +// Обработчик нажатия на кнопку "Ок" +// Пытается сохранить введенную строку почтовых адресов и закрывает форму +// если сохранение прошло удачно +// +&НаКлиенте +Процедура СохранитьАдресВыполнить() + + Перем СообщениеОбОшибке; + + Результат = СохранитьEMailАдресаПолучателейОтчета(EMailАдресаПолучателейОтчета, СообщениеОбОшибке); + + Если Не Результат Тогда + Если Не ПустаяСтрока(СообщениеОбОшибке) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + СообщениеОбОшибке, , "EMailАдресаПолучателейОтчета"); + КонецЕсли; + Иначе + Закрыть(); + КонецЕсли; + +КонецПроцедуры + +// Служебная функция - выполняет попытку сохранения строки почтовых адресов. +// Строка не сохраняется если формат почтовых адресов задан не верно. +// +&НаСервереБезКонтекста +Функция СохранитьEMailАдресаПолучателейОтчета(EMailАдресаПолучателейОтчета, СообщениеОбОшибке = "") + + Если ЗначениеЗаполнено(EMailАдресаПолучателейОтчета) Тогда + Попытка + ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(EMailАдресаПолучателейОтчета); + Исключение + СообщениеОбОшибке = НСтр("ru = 'Не верно задан формат почтового адреса'"); + Возврат Ложь; + КонецПопытки; + КонецЕсли; + + Попытка + КонтрольЖурналаРегистрации.УстановитьАдресатовПолученияОтчетаПоЖурналуРегистрации(EMailАдресаПолучателейОтчета); + Исключение + ОшибкаИнфо = ИнформацияОбОшибке(); + Если ОшибкаИнфо.Причина = Неопределено Тогда + СообщениеОбОшибке =ОшибкаИнфо.Описание; + Иначе + СообщениеОбОшибке = ОшибкаИнфо.Причина.Описание; + КонецЕсли; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщениеОбОшибке); + Возврат Ложь; + КонецПопытки; + + Возврат Истина; + +КонецФункции diff --git a/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/ManagerModule.bsl b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/ManagerModule.bsl new file mode 100644 index 000000000..5c3daa001 --- /dev/null +++ b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/ManagerModule.bsl @@ -0,0 +1,315 @@ + +// Процедура для получения отчета по ошибкам и предупреждениям журнала регистрации +// Параметры +// НачалоПериодаВыборки - Дата/ДатаВремя - нижняя граница периода выборки +// ОкончаниеПериодаВыборки - Дата/ДатаВремя - верхняя граница периода выборки +// СохранятьВремяПоследнейВыборки - Булево - если истина, то при успешной выборке +// в хранилище системных настроек будет записано время окончания +// периода текущей выборки +// +// Прим +// Если период выборки не указан, то выборка производится за последние сутки, если +// ранее было сохранено время выборки, то это время устанавливается в качестве +// начала периода. +// +// +Процедура СформироватьОтчетПоОшибкамИПослатьОтчет(Знач НачалоПериодаВыборки = Неопределено, + Знач ОкончаниеПериодаВыборки = Неопределено, + Знач СохранятьВремяПоследнейВыборки = Истина) Экспорт + + Если ЗначениеЗаполнено(НачалоПериодаВыборки) + И ЗначениеЗаполнено(ОкончаниеПериодаВыборки) Тогда + ПериодВыборки = Новый Структура; + ПериодВыборки.Вставить("НачалоПериода", НачалоПериодаВыборки); + ПериодВыборки.Вставить("ОкончаниеПериода", ОкончаниеПериодаВыборки); + Иначе + ПериодВыборки = ПолучитьПериодВыборкиДанных(); + КонецЕсли; + + // по полученным данным формируем отчет и записываем его на диск + РезультатФормированияОтчета = СформироватьОтчет(ПериодВыборки.НачалоПериода, + ПериодВыборки.ОкончаниеПериода); + + Отчет = РезультатФормированияОтчета.Отчет; + + ИмяФайлаОтчета = ПолучитьИмяВременногоФайла(); + + Отчет.Записать(ИмяФайлаОтчета); + + // формируем и отправляем письмо + Вложения = Новый Соответствие; + + Вложения.Вставить("report.mxl", Новый ДвоичныеДанные(ИмяФайлаОтчета)); + + УдалитьФайлы(ИмяФайлаОтчета); + + ПараметрыПисьма = Новый Структура; + + ПолучателиОтчета = КонтрольЖурналаРегистрации.ПолучитьАдресатовПолученияОтчетаПоЖурналуРегистрации(); + + Если ПустаяСтрока(ПолучателиОтчета) Тогда + ВызватьИсключение НСтр("ru = 'Не указан ни один получатель отчета по ошибкам и предупреждениям журнала регистрации.'"); + + КонецЕсли; + + ПараметрыПисьма.Вставить("Кому", ПолучателиОтчета); + + ПредставлениеИБ = ОбщегоНазначения.ПолучитьПредставлениеИнформационнойБазы(); + + ПараметрыПисьма.Вставить("Тема", + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Контроль журнала регистрации: %1.'"), ПредставлениеИБ )); + + ТекстТелаПисьма = НСтр("ru = 'Информация по ошибкам и предупреждениям журнала регистрации. + |Информационная база: %1. + |Период выборки данных: c %2 по %3. + |Всего ошибок: %4. + |Всего предупреждений: %5. + |Во вложении находится подробный отчет по ошибкам и предупреждениям. + |За более детальной информацией необходимо обращаться к журналу регистрации.'"); + + ТекстТелаПисьма = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстТелаПисьма, + ПредставлениеИБ, + ПериодВыборки.НачалоПериода, + ПериодВыборки.ОкончаниеПериода, + РезультатФормированияОтчета.ИтогПоОшибкам, + РезультатФормированияОтчета.ИтогПоПредупреждениям ); + + ПараметрыПисьма.Вставить("Тело", ТекстТелаПисьма); + + ПараметрыПисьма.Вставить("Вложения", Вложения); + + РаботаСПочтовымиСообщениями + .ОтправитьСообщение(РаботаСПочтовымиСообщениями.ПолучитьСистемнуюУчетнуюЗапись(), + ПараметрыПисьма); + + Если СохранятьВремяПоследнейВыборки Тогда + СохранитьВремяПоследнейВыборкиИнформации(ПериодВыборки.ОкончаниеПериода); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЕРВИСНЫЕ ФУНКЦИИ + +// Функция получает информацию по ошибкам в журнале регистрации по переданному периоду +// Параметры +// НачалоПериода - дата - начала периода, по которому будет собираться информация +// ОкончаниеПериода - дата - окончание периода, по которому будет собираться информация +// +// Возвращаемое значение +// таблица значений - записи из журнала регистрации в соответствии с фильтром: +// УровеньЖурналаРегистрации - УровеньЖурналаРегистрации.Ошибка +// Начало и Окончание периода - из параметров +// +Функция ПолучитьИнформациюПоОшибкамЖурналаРегистрации(Знач НачалоПериода, Знач ОкончаниеПериода) + + ДанныеЖурналаРегистрации = Новый ТаблицаЗначений; + + УровниРегистрацииОшибок = Новый Массив; + УровниРегистрацииОшибок.Добавить(УровеньЖурналаРегистрации.Ошибка); + УровниРегистрацииОшибок.Добавить(УровеньЖурналаРегистрации.Предупреждение); + + ВыгрузитьЖурналРегистрации(ДанныеЖурналаРегистрации, + Новый Структура("Уровень, ДатаНачала, ДатаОкончания", + УровниРегистрацииОшибок, + НачалоПериода, + ОкончаниеПериода)); + + Возврат ДанныеЖурналаРегистрации; + +КонецФункции + +// Служебная процедура, определяющая период времени, за который требуется получить +// данные из журнала регистрации. Кроме того по переданному ключу записывает +// окончание периода в хранилище системнеых настроек - для использования +// при следующем вызове +// +Функция ПолучитьПериодВыборкиДанных() + + Результат = Новый Структура; + + ВремяПоследнейВыборкиИнформации = ПолучитьВремяПоследнейВыборкиИнформации(); + + ОкончаниеПериода = ТекущаяДата(); + + Если ВремяПоследнейВыборкиИнформации = Неопределено Тогда // если регламентное задание еще не выполнялось - выбираем данные за сутки + НачалоПериода = ОкончаниеПериода - 86400; + Иначе + НачалоПериода = ВремяПоследнейВыборкиИнформации; + КонецЕсли; + + Результат.Вставить("НачалоПериода", НачалоПериода); + Результат.Вставить("ОкончаниеПериода", ОкончаниеПериода); + + Возврат Результат; + +КонецФункции + +// Получает время предыдущего процесса сбора иинформации из журнала регистрации +// +Функция ПолучитьВремяПоследнейВыборкиИнформации() + + ВремяПоследнейВыборкиИнформации = Неопределено; + + ПараметрыОтчета = ХранилищеОбщихНастроек.Загрузить("ПараметрыОтчетаПоЖурналуРегистрации"); + + Если ПараметрыОтчета <> Неопределено Тогда + ПараметрыОтчета.Свойство("ВремяПоследнейВыборкиИнформации", ВремяПоследнейВыборкиИнформации); + КонецЕсли; + + Возврат ВремяПоследнейВыборкиИнформации; + +КонецФункции + +// Сохраняет время предыдущего процесса сбора иинформации из журнала регистрации +// +Процедура СохранитьВремяПоследнейВыборкиИнформации(ВремяПоследнейВыборкиИнформации) + + ПараметрыОтчета = ХранилищеОбщихНастроек.Загрузить("ПараметрыОтчетаПоЖурналуРегистрации"); + + Если ПараметрыОтчета = Неопределено Или ТипЗнч(ПараметрыОтчета) <> Тип("Структура") Тогда + ПараметрыОтчета = Новый Структура; + КонецЕсли; + + ПараметрыОтчета.Вставить("ВремяПоследнейВыборкиИнформации", ВремяПоследнейВыборкиИнформации); + + ХранилищеОбщихНастроек.Сохранить("ПараметрыОтчетаПоЖурналуРегистрации", , + ПараметрыОтчета); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Блок функций для формирования отчета + +// Функция, формирующая отчет по зарегистрированным в журнале регистрации ошибкам +// Параметры +// ДанныеЖурналаРегистрации - таблица значений - выгруженная таблица из журнала регистраций +// должны присутствовать следующие колонки: Дата, ИмяПользователя, ПредставлениеПриложения, +// ПредставлениеСобытия, Комментарий, Уровень +// +Функция СформироватьОтчет( Знач НачалоПериода, + Знач ОкончаниеПериода) Экспорт + + Результат = Новый Структура; + + Отчет = Новый ТабличныйДокумент; + + Макет = Обработки.КонтрольЖурналаРегистрации.ПолучитьМакет("МакетОтчетаПоОшибкамВЖурналеРегистрации"); + + ДанныеЖурналаРегистрации = ПолучитьИнформациюПоОшибкамЖурналаРегистрации(НачалоПериода, ОкончаниеПериода); + + /////////////////////////////////////////////////////////////////////////////// + // Блок предварительной подготовки данных + // + + СверткаПоКомментариям = ДанныеЖурналаРегистрации.Скопировать(); + СверткаПоКомментариям.Колонки.Добавить("ИтогПоКомментарию"); + СверткаПоКомментариям.ЗаполнитьЗначения(1, "ИтогПоКомментарию"); + СверткаПоКомментариям.Свернуть("Уровень, Комментарий, Событие, ПредставлениеСобытия", "ИтогПоКомментарию"); + + МассивСтрок_УровеньОшибка = СверткаПоКомментариям.НайтиСтроки( + Новый Структура("Уровень", УровеньЖурналаРегистрации.Ошибка)); + + МассивСтрок_УровеньПредупреждение = СверткаПоКомментариям.НайтиСтроки( + Новый Структура("Уровень", УровеньЖурналаРегистрации.Предупреждение)); + + Свертка_Ошибки = СверткаПоКомментариям.Скопировать(МассивСтрок_УровеньОшибка); + Свертка_Ошибки.Сортировать("ИтогПоКомментарию Убыв"); + Свертка_Предупреждения = СверткаПоКомментариям.Скопировать(МассивСтрок_УровеньПредупреждение); + Свертка_Предупреждения.Сортировать("ИтогПоКомментарию Убыв"); + + /////////////////////////////////////////////////////////////////////////////// + // Блок формирования самого отчета + // + + Область = Макет.ПолучитьОбласть("ШапкаОтчета"); + Область.Параметры.ПериодВыборкиНачало = НачалоПериода; + Область.Параметры.ПериодВыборкиОкончание = ОкончаниеПериода; + Область.Параметры.ПредставлениеИнформационнойБазы = ОбщегоНазначения.ПолучитьПредставлениеИнформационнойБазы(); + Отчет.Вывести(Область); + + РезультатКомпоновкиТЧ = СформироватьТабличнуюЧасть(Макет, ДанныеЖурналаРегистрации, Свертка_Ошибки); + + Отчет.Вывести(Макет.ПолучитьОбласть("ПустаяСтрока")); + Область = Макет.ПолучитьОбласть("ЗаголовокБлокаОшибки"); + Область.Параметры.ЧислоОшибок = Строка(РезультатКомпоновкиТЧ.Итог); + Отчет.Вывести(Область); + + Если РезультатКомпоновкиТЧ.Итог > 0 Тогда + Отчет.Вывести(РезультатКомпоновкиТЧ.ТабличнаяЧасть); + КонецЕсли; + + Результат.Вставить("ИтогПоОшибкам", РезультатКомпоновкиТЧ.Итог); + + РезультатКомпоновкиТЧ = СформироватьТабличнуюЧасть(Макет, ДанныеЖурналаРегистрации, Свертка_Предупреждения); + + Отчет.Вывести(Макет.ПолучитьОбласть("ПустаяСтрока")); + Область = Макет.ПолучитьОбласть("ЗаголовокБлокаПредупреждения"); + Область.Параметры.ЧислоПредупреждений = РезультатКомпоновкиТЧ.Итог; + Отчет.Вывести(Область); + + Если РезультатКомпоновкиТЧ.Итог > 0 Тогда + Отчет.Вывести(РезультатКомпоновкиТЧ.ТабличнаяЧасть); + КонецЕсли; + + Результат.Вставить("ИтогПоПредупреждениям", РезультатКомпоновкиТЧ.Итог); + + Отчет.ОтображатьСетку = Ложь; + + Результат.Вставить("Отчет", Отчет); + + Возврат Результат; + +КонецФункции + +// Добавляет в отчет табличную часть по ошибкам. Ошибки выводятся сгруппированными +// по комментарию. +// Параметры: +// Отчет - ТабличныйДокумент - непосредственно отчет, в который будет выводится +// информация +// Макет - ТабличныйДокумент - источник форматированных областей, которые будут +// использоваться при формировании отчета +// ДанныеЖурналаРегистрации - ТаблицаЗначений - данные по ошибкам и предупреждениям +// из журнала регистрации "как есть" +// СвернутыеДанные - ТаблицаЗначений - свернутая по комметариям информация по их количеству +// +Функция СформироватьТабличнуюЧасть(Макет, ДанныеЖурналаРегистрации, СвернутыеДанные) + + Отчет = Новый ТабличныйДокумент; + + Итог = 0; + + Если СвернутыеДанные.Количество() > 0 Тогда + Отчет.Вывести(Макет.ПолучитьОбласть("ПустаяСтрока")); + + Для Каждого Запись Из СвернутыеДанные Цикл + Итог = Итог + Запись.ИтогПоКомментарию; + МассивСтрок = ДанныеЖурналаРегистрации.НайтиСтроки( + Новый Структура("Уровень, Комментарий", + УровеньЖурналаРегистрации.Ошибка, + Запись.Комментарий)); + + Область = Макет.ПолучитьОбласть("ТелоТабличнойЧастиШапка"); + Область.Параметры.Заполнить(Запись); + Отчет.Вывести(Область); + + Отчет.НачатьГруппуСтрок(, Ложь); + Для Каждого Строка Из МассивСтрок Цикл + Область = Макет.ПолучитьОбласть("ТелоТабличнойЧастиДетализация"); + Область.Параметры.Заполнить(Строка); + Отчет.Вывести(Область); + КонецЦикла; + Отчет.ЗакончитьГруппуСтрок(); + Отчет.Вывести(Макет.ПолучитьОбласть("ПустаяСтрока")); + КонецЦикла; + КонецЕсли; + + Результат = Новый Структура("ТабличнаяЧасть, Итог", Отчет, Итог); + + Возврат Результат; + +КонецФункции + 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.mxlx b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Templates/МакетОтчетаПоОшибкамВЖурналеРегистрации/Template.mxlx new file mode 100644 index 000000000..3913859b9 --- /dev/null +++ b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/Templates/МакетОтчетаПоОшибкамВЖурналеРегистрации/Template.mxlx @@ -0,0 +1,435 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 1 + + 0 + + 1 + + + + + 5c3926f2-4223-4ca7-a6a7-7160301c991d + 4 + + 0 + + 2 + + + + 1 + + 3 + + + + 2 + + 4 + + + + 3 + + 5 + + + + 4 + + 6 + + + + + c00ea4cf-0123-4de2-9c91-0ec224c7b2e9 + 6 + + 0 + + 2 + + + + 1 + + 7 + + + + 2 + + 8 + + + + 3 + + 9 + + + + 4 + + 8 + + + + 5 + + 8 + + + + + 0 + + 10 + + + 11 + + + ru + Отчет по ошибкам и предупреждениям в журнале регистрации + + + + + + + + 1 + + 10 + true + + + + 2 + + 10 + + + 12 + + + ru + Информационная база: [ПредставлениеИнформационнойБазы] + + + + + + + + 3 + + 10 + + + 12 + + + ru + Данные выбраны с [ПериодВыборкиНачало] по [ПериодВыборкиОкончание] + + + + + + + + 7 + + + + 13 + + + ru + Ошибки ([ЧислоОшибок]) + + + + + + + + 9 + + + + 13 + + + ru + Предупреждения ([ЧислоПредупреждений]) + + + + + + + + 11 + + 5c3926f2-4223-4ca7-a6a7-7160301c991d + + 1 + + 14 + Комментарий + + + + + 15 + ПредставлениеСобытия + + + + + 16 + ИтогПоКомментарию + + + + + + 12 + + c00ea4cf-0123-4de2-9c91-0ec224c7b2e9 + + 1 + + 17 + Дата + + + + + 17 + ИмяПользователя + + + + + 18 + Компьютер + + + + + 19 + РабочийСервер + + + + + 20 + ПредставлениеПриложения + + + + + + 14 + + true + + + true + 6 + 13 + 13 + + ЗаголовокБлокаОшибки + + Rows + 7 + 7 + -1 + -1 + + + + ЗаголовокБлокаПредупреждения + + Rows + 9 + 9 + -1 + -1 + + + + ПустаяСтрока + + Rows + 5 + 5 + -1 + -1 + + + + ТелоТабличнойЧастиДетализация + + Rows + 12 + 12 + -1 + -1 + + + + ТелоТабличнойЧастиШапка + + Rows + 11 + 11 + -1 + -1 + + + + ШапкаОтчета + + Rows + 0 + 3 + -1 + -1 + + + + Landscape + 100 + true + 1 + 1 + 1000 + 1000 + 1000 + 1000 + 1000 + 1000 + false + false + HP LaserJet 5100 PCL 6 + 9 + 7 + 0 + 0 + + + Solid + + + None + + + + + + 855 + + + 26 + + + 518 + Auto + 0 + + + 226 + + + 85 + + + 72 + + + 167 + + + 165 + + + 168 + + + Auto + + + 0 + Auto + + + Auto + Template + + + 1 + 0 + Template + + + 2 + 1 + 1 + 1 + 0 + Left + Wrap + Parameter + 0 + + + 0 + Top + Parameter + + + 1 + 1 + 1 + 0 + 62 + Center + Top + Parameter + + + 1 + Auto + Parameter + + + 1 + Parameter + + + Parameter + + + 1 + 177 + Auto + Parameter + + \ No newline at end of file diff --git a/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo new file mode 100644 index 000000000..03556529c --- /dev/null +++ b/SSL/src/DataProcessors/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo @@ -0,0 +1,49 @@ + + + + + + + КонтрольЖурналаРегистрации + + ru + Контроль журнала регистрации + + true + DataProcessor.КонтрольЖурналаРегистрации.Form.КонтрольЖурналаРегистрации + + КонтрольЖурналаРегистрации + + ru + Контроль журнала регистрации + + + + ru + + + PersonalComputer + MobileDevice + + + УстановкаПочтовыхАдресовДляОтправкиОтчета + + ru + Установка почтовых адресов для отправки отчета + + + + ru + + + PersonalComputer + MobileDevice + + + МакетОтчетаПоОшибкамВЖурналеРегистрации + + ru + Макет отчета по ошибкам в журнале регистрации + + + diff --git a/SSL/src/DataProcessors/КурсыВалютРБК/Forms/Форма/Form.form b/SSL/src/DataProcessors/КурсыВалютРБК/Forms/Форма/Form.form new file mode 100644 index 000000000..db552df33 --- /dev/null +++ b/SSL/src/DataProcessors/КурсыВалютРБК/Forms/Форма/Form.form @@ -0,0 +1,765 @@ + + + + КоманднаяПанельСписокВалют + 6 + + КнопкаПодборВалют + 17 + true + true + + true + + false + + КнопкаПодборВалютРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.Command.КомандаПодборВалют + Normal + PictureAndText + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + КнопкаЗаполнить + 8 + true + true + + true + + false + + КнопкаЗаполнитьРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Form.Command.КомандаЗаполнить + Normal + PictureAndText + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + КнопкаОчистить + 14 + true + true + + true + + false + + КнопкаОчиститьРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Form.Command.КомандаОчистить + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + КнопкаЗагрузить + 15 + true + true + + true + + false + + КнопкаЗагрузитьРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Form.Command.КомандаЗагрузить + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + КоманднаяПанельСписокВалютРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + CommandBar + + Left + Item.СписокВалют + + + + СписокВалют + 7 + true + true + + true + + + Объект.СписокВалют + + false + None + Change + Copy + CopyToClipboard + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + Валюта + 10 + true + true + + true + + + Объект.СписокВалют.Валюта + + + ВалютаРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + ВалютаКонтекстноеМеню + 21 + true + + LabelField + Enter + true + Left + true + Left + + true + true + + + + КодВалюты + 9 + true + true + + true + + + Объект.СписокВалют.КодВалюты + + + КодВалютыРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + КодВалютыКонтекстноеМеню + 22 + true + + LabelField + Enter + true + Left + true + Left + + true + true + + + + ДатаКурса + 11 + true + true + + true + + + Объект.СписокВалют.ДатаКурса + + + ДатаКурсаРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ДатаКурсаКонтекстноеМеню + 23 + true + + LabelField + Enter + true + Left + true + Left + + true + true + + + + Курс + 12 + true + true + + true + + + Объект.СписокВалют.Курс + + + КурсРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + КурсКонтекстноеМеню + 24 + true + + LabelField + Enter + true + Left + true + Left + + true + true + + + + Кратность + 13 + true + true + + true + + + Объект.СписокВалют.Кратность + + + КратностьРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + КратностьКонтекстноеМеню + 25 + true + + LabelField + Enter + true + Left + true + Left + + true + true + + + None + + СписокВалютКоманднаяПанель + 26 + Left + true + + + Selection + СписокВалютВыбор + + + BeforeAddRow + СписокВалютПередНачаломДобавления + + + СписокВалютСтрокаПоиска + 33 + + СписокВалютСтрокаПоискаРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + СписокВалютСтрокаПоискаКонтекстноеМеню + 34 + true + + СписокВалют + + true + + + + СписокВалютСостояниеПросмотра + 36 + + СписокВалютСостояниеПросмотраРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + СписокВалютСостояниеПросмотраКонтекстноеМеню + 37 + true + + ViewStatusAddition + СписокВалют + + true + + + + СписокВалютУправлениеПоиском + 39 + + СписокВалютУправлениеПоискомРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + СписокВалютУправлениеПоискомКонтекстноеМеню + 40 + true + + SearchControlAddition + СписокВалют + + true + + + + СписокВалютРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + СписокВалютКонтекстноеМеню + 20 + true + + HierarchicalList + true + true + 40 + true + true + 10 + true + Row +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + + Style.BorderColor + + None + None + None + true + +
    + + ГруппаВыбораПериода + 16 + + НачДата + 2 + + <key>ru</key> + <value>Начало периода</value> + + true + true + + true + + + Объект.НачалоПериодаЗагрузки + + + НачДатаРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + НачДатаКонтекстноеМеню + 18 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + КонДата + 3 + + <key>ru</key> + <value>Окончание периода</value> + + true + true + + true + + + Объект.ОкончаниеПериодаЗагрузки + + + КонДатаРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + + КонДатаКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + ГруппаВыбораПериодаРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + ChoiceProcessing + ОбработкаВыбора + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.КурсыВалютРБК + + + true + + + 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 + + + + + + +
    diff --git a/SSL/src/DataProcessors/КурсыВалютРБК/Forms/Форма/Help/ru.html b/SSL/src/DataProcessors/КурсыВалютРБК/Forms/Форма/Help/ru.html new file mode 100644 index 000000000..f502a5962 --- /dev/null +++ b/SSL/src/DataProcessors/КурсыВалютРБК/Forms/Форма/Help/ru.html @@ -0,0 +1,7 @@ + +

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

    +

    Кнопка Заполнить - автоматическое заполнение валют

    +

    Клавиша Ins в таблице, кнопка Добавить на командной панели - открывается форма выбора валюты

    +

    Кнопка Подбор - открывается форма выбора валюты в режиме подбора

    +

    Кнопка Очистить - очистка таблицы валют

    +

    Кнопка Загрузить - загрузка курсов валют в таблице

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/КурсыВалютРБК/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/КурсыВалютРБК/Forms/Форма/Module.bsl new file mode 100644 index 000000000..453822b61 --- /dev/null +++ b/SSL/src/DataProcessors/КурсыВалютРБК/Forms/Форма/Module.bsl @@ -0,0 +1,243 @@ +//////////////////////////////////////////////////////////////////////////////// +// Блок обработчиков событий формы и элементов формы +// + +// Обработчик события "при создании на сервере" +// Устанавливает даты начала и конца для загрузки курсов по умолчанию +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Объект.НачалоПериодаЗагрузки = НачалоМесяца(ТекущаяДата()); + Объект.ОкончаниеПериодаЗагрузки = ТекущаяДата(); + +КонецПроцедуры + +// Обработчик события "обработка выбора" формы +// Обрабатывает выбор валюты в форме выбора +// +&НаКлиенте +Процедура ОбработкаВыбора(РезультатВыбора, ИсточникВыбора) + + Если ТипЗнч(РезультатВыбора) = Тип("СправочникСсылка.Валюты") Тогда + + Если Объект.СписокВалют.НайтиСтроки(Новый Структура("Валюта", РезультатВыбора)).Количество() = 0 Тогда + ДобавитьВалютуВСписок(РезультатВыбора); + Иначе + Предупреждение(НСтр("ru = 'Валюта уже присутствует в списке'")); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Обработчик события "перед началом добавления" элемента формы СписокВалют +// Вызывает форму выбора валют в режиме выбора +// +&НаКлиенте +Процедура СписокВалютПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + ПараметрыФорма = Новый Структура("ЗагружаемыеВалюты", Истина); + ОткрытьФорму("Справочник.Валюты.ФормаВыбора", ПараметрыФорма, ЭтаФорма); + Отказ = Истина; + +КонецПроцедуры + +// Обработчик события "выбор" табличной части "СписокВалют" формы +// Открывает форму валюты +// +&НаКлиенте +Процедура СписокВалютВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ОткрытьЗначение(Элементы.СписокВалют.ТекущиеДанные.Валюта); + +КонецПроцедуры + +// Обработчик события нажания на кнопку "Очистить" +// Очищает список валют +// +&НаКлиенте +Процедура КомандаОчиститьВыполнить() + + Объект.СписокВалют.Очистить(); + +КонецПроцедуры + +// Обработчик нажатия на кнопку "Заполнить" +// Вызывает функциональность заполнения списка валют +// +&НаКлиенте +Процедура КомандаЗаполнитьСписокВалютВыполнить() + + ЗаполнитьВалюты(); + +КонецПроцедуры + +// Обработчик нажатия на кнопку "Подбор" +// Вызывает форму выбора валют в режиме подбора +// +&НаКлиенте +Процедура КомандаПодборВалютВыполнить() + + ПараметрыФормы = Новый Структура("ЗакрыватьПриВыборе, Отбор", Ложь, Новый Структура("ВалютаЗагружается", Истина)); + ОткрытьФорму("Справочник.Валюты.ФормаВыбора", ПараметрыФормы, ЭтаФорма); + +КонецПроцедуры + +// Обработчик нажаитя на кнопку "Загрузить" +// Вызывает функциональность загрузки курсов +// +&НаКлиенте +Процедура КомандаЗагрузитьВыполнить() + + Если Не ЗначениеЗаполнено(Объект.НачалоПериодаЗагрузки) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Не задана дата начала периода загрузки.'"), , + "Объект.НачалоПериодаЗагрузки"); + Возврат; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Объект.ОкончаниеПериодаЗагрузки) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Не задана дата окончания периода загрузки.'"), , + "Объект.ОкончаниеПериодаЗагрузки"); + Возврат; + КонецЕсли; + + Если Объект.СписокВалют.Количество() = 0 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Для загрузки курсов с веб-сервера РБК необходимо добавить в список хотя бы одну валюту.'"), , + "Объект.СписокВалют"); + Возврат; + КонецЕсли; + + ОчиститьСообщения(); + + Состояние(НСтр("ru = 'Загружаются курсы валют...'")); + ПоясняющееСообщение = ""; + СтатусОперации = ЗагрузитьКурсыСРБК(ПоясняющееСообщение); + + Если СтатусОперации Тогда + Оповестить("ИзменениеКурсовВалют"); + ТекстСообщенияОЗавершенииЗагрузки = НСтр("ru = 'Загрузка курсов валют завершена.'"); + Если ЗначениеЗаполнено(ПоясняющееСообщение) Тогда + ТекстСообщенияОЗавершенииЗагрузки = ТекстСообщенияОЗавершенииЗагрузки + Символы.ПС + + ПоясняющееСообщение; + КонецЕсли; + Состояние(ТекстСообщенияОЗавершенииЗагрузки); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Секция служебных процедур +// + +&НаКлиенте +Функция ЗагрузитьКурсыСРБК(ПоясняющееСообщение) + + ПоясняющееСообщение = ""; + +#Если ВебКлиент Тогда + СтатусОперации = ЗагрузитьКурсыСРБК_Сервер( + Объект.СписокВалют, + Объект.НачалоПериодаЗагрузки, + Объект.ОкончаниеПериодаЗагрузки, + ПоясняющееСообщение); +#Иначе + СтатусОперации = РаботаСКурсамиВалютКлиентСервер.ЗагрузитьКурсыВалютПоПараметрам( + Объект.СписокВалют, + Объект.НачалоПериодаЗагрузки, + Объект.ОкончаниеПериодаЗагрузки, + ПоясняющееСообщение); +#КонецЕсли + + Если Не СтатусОперации Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ПоясняющееСообщение); + Иначе + ОбновитьСведенияВСпискеВалют(); + КонецЕсли; + + Возврат СтатусОперации; + +КонецФункции + +&НаСервереБезКонтекста +Функция ЗагрузитьКурсыСРБК_Сервер(знач СписокВалют, знач НачалоПериодаЗагрузки, знач ОкончаниеПериодаЗагрузки, ПоясняющееСообщение) + + Возврат РаботаСКурсамиВалютКлиентСервер.ЗагрузитьКурсыВалютПоПараметрам( + СписокВалют, НачалоПериодаЗагрузки, ОкончаниеПериодаЗагрузки, ПоясняющееСообщение); + +КонецФункции + +// Процедура заполняет табличную часть списком валют. В список попадают только +// валюты, курс которых не зависит от курса других валют. +// +&НаСервере +Процедура ЗаполнитьВалюты() + + ОкончаниеПериодаЗагрузки = Объект.ОкончаниеПериодаЗагрузки; + СписокВалют = Объект.СписокВалют; + СписокВалют.Очистить(); + + ЗагружаемыеВалюты = РаботаСКурсамиВалют.ПолучитьМассивЗагружаемыхВалют(); + + Для Каждого ЭлементВалюта Из ЗагружаемыеВалюты Цикл + ДобавитьВалютуВСписок(ЭлементВалюта); + КонецЦикла; + +КонецПроцедуры + +// Процедура добавляет в список валют новую строку и заполняет ее информацией +// о курсе на основе ссылки на валюту +// +// Параметры: +// Валюта - Справочник.Валюты / Ссылка - ссылка на валюту, которая добавляется +// в список +// +&НаСервере +Процедура ДобавитьВалютуВСписок(Валюта) + + НоваяСтрока = Объект.СписокВалют.Добавить(); + ЗаполнитьДанныеСтрокиТаблицыНаОсновеВалюты(НоваяСтрока, Валюта); + +КонецПроцедуры + +// Процедура обновляет записи о курсах валют в списке. +// +&НаСервере +Процедура ОбновитьСведенияВСпискеВалют() + + Для Каждого СтрокаДанных Из Объект.СписокВалют Цикл + СсылкаНаВалюту = СтрокаДанных.Валюта; + ЗаполнитьДанныеСтрокиТаблицыНаОсновеВалюты(СтрокаДанных, СсылкаНаВалюту); + КонецЦикла; + +КонецПроцедуры + +// Процедура заполняет строку табличной части информацией о курсе на основе +// ссылки на валюту. +// +// Параметры: +// ТекСтрока - ДанныеФормыЭлементКоллекции - ссылка на строку табличной +// части, которую необходимо заполнить информацией о курсе +// валюты +// ВыбраннаяВалюта - Справочник.Валюты / Ссылка - ссылка на валюту, информацию +// о которой необходимо получить. +// +&НаСервере +Процедура ЗаполнитьДанныеСтрокиТаблицыНаОсновеВалюты(ТекСтрока, СсылкаНаВалюту); + + ТекСтрока.Валюта = СсылкаНаВалюту; + ТекСтрока.КодВалюты = СсылкаНаВалюту.Код; + + ДанныеКурса = РаботаСКурсамиВалют.ЗаполнитьДанныеКурсаДляВалюты(СсылкаНаВалюту); + + Если ТипЗнч(ДанныеКурса) = Тип ("Структура") Тогда + ТекСтрока.ДатаКурса = ДанныеКурса.ДатаКурса; + ТекСтрока.Курс = ДанныеКурса.Курс; + ТекСтрока.Кратность = ДанныеКурса.Кратность; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/DataProcessors/КурсыВалютРБК/Help/ru.html b/SSL/src/DataProcessors/КурсыВалютРБК/Help/ru.html new file mode 100644 index 000000000..e1fdb09f3 --- /dev/null +++ b/SSL/src/DataProcessors/КурсыВалютРБК/Help/ru.html @@ -0,0 +1 @@ +Загрузка курсов валют с сайта РБК \ No newline at end of file diff --git a/SSL/src/DataProcessors/КурсыВалютРБК/ManagerModule.bsl b/SSL/src/DataProcessors/КурсыВалютРБК/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/DataProcessors/КурсыВалютРБК/ObjectModule.bsl b/SSL/src/DataProcessors/КурсыВалютРБК/ObjectModule.bsl new file mode 100644 index 000000000..c63161772 --- /dev/null +++ b/SSL/src/DataProcessors/КурсыВалютРБК/ObjectModule.bsl @@ -0,0 +1,30 @@ + +// Процедура заполняет табличную часть списком валют. В список попадают только +// валюты, курс которых не зависит от курса других валют. +// +Процедура ЗаполнитьСписокВалют() Экспорт + + СписокВалют.Очистить(); + + ЗагружаемыеВалюты = РаботаСКурсамиВалют.ПолучитьМассивЗагружаемыхВалют(); + + Для Каждого ЭлементВалюта Из ЗагружаемыеВалюты Цикл + НоваяСтрока = СписокВалют.Добавить(); + НоваяСтрока.КодВалюты = ЭлементВалюта.Код; + НоваяСтрока.Валюта = ЭлементВалюта; + КонецЦикла; + +КонецПроцедуры + +// Процедура для каждой загружаемой валюты запрашивает файл с курсами +// После загрузки, курсы, удовлетворяющие периоду записываются в регистр сведений +// +Функция ЗагрузитьКурсыВалют(знач СообщениеОбОшибке) Экспорт + + Возврат РаботаСКурсамиВалютКлиентСервер.ЗагрузитьКурсыВалютПоПараметрам( + СписокВалют, + НачалоПериодаЗагрузки, + ОкончаниеПериодаЗагрузки, + СообщениеОбОшибке); + +КонецФункции diff --git a/SSL/src/DataProcessors/КурсыВалютРБК/КурсыВалютРБК.mdo b/SSL/src/DataProcessors/КурсыВалютРБК/КурсыВалютРБК.mdo new file mode 100644 index 000000000..69d34a4e0 --- /dev/null +++ b/SSL/src/DataProcessors/КурсыВалютРБК/КурсыВалютРБК.mdo @@ -0,0 +1,197 @@ + + + + + + + КурсыВалютРБК + + ru + Загрузка курсов валют с веб-сайта РБК + + true + DataProcessor.КурсыВалютРБК.Form.Форма + + + ru + + + + НачалоПериодаЗагрузки + + ru + Начало периода загрузки + + + Date + + Date + + + + ru + Дата начала периода загрузки курсов валют + + + + ShowError + + + ОкончаниеПериодаЗагрузки + + ru + Окончание периода загрузки + + + Date + + Date + + + + ru + Дата окончания периода загрузки курсов валют + + + + ShowError + + + + + + + СписокВалют + + ru + Список валют + + + Use + LineNumber + + Use + + + + + КодВалюты + + ru + Код валюты + + + String + + 10 + + + + + + + + Валюта + + ru + Валюта + + + CatalogRef.Валюты + + + ru + Ссылка на валюту + + + + DontUse + Use + + Catalog.Валюты.EmptyRef + + + + ДатаКурса + + ru + Дата курса + + + Date + + Date + + + + ru + Дата последней загрузки курса + + + + + 0001-01-01T00:00:00 + + + + Курс + + ru + Курс + + + Number + + 10 + 4 + + + + ru + Последний загруженный курс + + + + + 0 + + + + Кратность + + ru + Кратность + + + Number + + 10 + 4 + + + + ru + Кратность валюты + + + + + 0 + + + + + Форма + + ru + Форма + + + + ru + + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form new file mode 100644 index 000000000..b51927545 --- /dev/null +++ b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form @@ -0,0 +1,296 @@ + + + + ТекстПредупреждения + 1 + true + true + + true + + + ТекстПредупреждения + + None + + ТекстПредупрежденияРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ТекстПредупрежденияКонтекстноеМеню + 2 + true + + HTMLDocumentField + Enter + true + Left + true + + 75 + true + 10 + true + true + true + + + + ПодтверждениеВыбора + 3 + true + true + + true + + + ПодтверждениеВыбора + + true + None + + ПодтверждениеВыбораРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ПодтверждениеВыбораКонтекстноеМеню + 4 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Я подтверждаю легальность получения обновления в соответствии с вышеизложенными условиями + + + 1 + + + + + ru + Я НЕ подтверждаю легальность получения обновления в соответствии с вышеизложенными условиями + + + 2 + + + Vertical + + + + Примечание + 6 + + <key>ru</key> + <value> (работа программы будет завершена)</value> + + true + true + + true + + + ПримечаниеРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ПримечаниеКонтекстноеМеню + 7 + true + + Label + true + true + + Left + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаПродолжить + 5 + true + true + + true + + + ФормаПродолжитьРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + Form.Command.Продолжить + Auto + true + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + 75 + DontBlock + true + true + true + Vertical + true + 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 + + Number + + 2 + true + + + + true + + + true + + + + ПринудительныйЗапуск + + <key>ru</key> + <value>Принудительный запуск</value> + + 4 + + Boolean + + + true + + + true + + + + Продолжить + + <key>ru</key> + <value>Продолжить</value> + + 1 + + ru + Продолжить + + + true + + + + ОсновныеДействияФормыПродолжить + + + Auto + Auto + + + ПоказыватьПредупреждениеОПерезапуске + + Boolean + + + + ПринудительныйЗапуск + + Boolean + + + + + + + +
    diff --git a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Module.bsl b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Module.bsl new file mode 100644 index 000000000..96696516d --- /dev/null +++ b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Module.bsl @@ -0,0 +1,28 @@ +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + МакетДокумента = Обработки.ЛегальностьПолученияОбновлений.ПолучитьМакет("УсловияРаспространенияОбновлений"); + ТекстПредупреждения = МакетДокумента.ПолучитьТекст(); + ПодтверждениеВыбора = 2; + ПринудительныйЗапуск = Параметры.ПринудительныйЗапуск; + Элементы.Примечание.Видимость = Параметры.ПоказыватьПредупреждениеОПерезапуске; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если Не ПринудительныйЗапуск Тогда + Предупреждение(НСтр("ru='Обработка не предназначена для непосредственного использования.'")); + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОсновныеДействияФормыПродолжить(Команда) + + Закрыть(ПодтверждениеВыбора = 1); + +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Templates/УсловияРаспространенияОбновлений/Template.htmldoc b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Templates/УсловияРаспространенияОбновлений/Template.htmldoc new file mode 100644 index 000000000..1621f1d23 --- /dev/null +++ b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Templates/УсловияРаспространенияОбновлений/Template.htmldoc @@ -0,0 +1,4 @@ + + + + diff --git a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Templates/УсловияРаспространенияОбновлений/ru.html b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Templates/УсловияРаспространенияОбновлений/ru.html new file mode 100644 index 000000000..71891a3c6 --- /dev/null +++ b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Templates/УсловияРаспространенияОбновлений/ru.html @@ -0,0 +1,11 @@ + +

    УСЛОВИЯ РАСПРОСТРАНЕНИЯ ОБНОВЛЕНИЙ ПРОГРАММ "1С:ПРЕДПРИЯТИЕ"

    +

    +

    Обновления к программам производства фирмы "1С", также как и сами программы, являются объектами исключительного права фирмы "1С" и распространяются по правилам, установленным фирмой "1С" как правообладателем в соответствии со ст. 1225 Гражданского кодекса.

    +

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

    +

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

    +

    Фирма "1С" разрешает оформлять подписки (договоры) на ИТС только своим официальным партнерам, имеющим соответствующий лицензионный/сублицензионный договор. Проверить наличие подписки пользователь может на сайте фирмы "1С" (www.1c.ru/its).

    +

    Несанкционированное распространение и использование обновлений и информационных ресурсов рассматриваются как нарушение авторского права и преследуются по ст. 1301 Гражданского кодекса РФ, ст. 7.12 Кодекса Российской Федерации об административных правонарушениях, ст. 146 Уголовного кодекса РФ.

    +

    Подробнее об условиях поддержки программных продуктов фирмы "1С" см. на сайте http://www.1c.ru/rus/support/support.htm.

    +

    Подробнее об ИТС и правилах оформления подписки см. на сайте http://www.1c.ru/its.

    +

    Список партнеров фирмы "1С" см. на сайте http://www.1c.ru/rus/firm1c/partypes.htm.

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/ЛегальностьПолученияОбновлений.mdo b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/ЛегальностьПолученияОбновлений.mdo new file mode 100644 index 000000000..a4ed6d020 --- /dev/null +++ b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/ЛегальностьПолученияОбновлений.mdo @@ -0,0 +1,31 @@ + + + + + + + ЛегальностьПолученияОбновлений + + ru + Легальность получения обновлений + + true + DataProcessor.ЛегальностьПолученияОбновлений.Form.ПроверкаЛегальностиПолученияОбновления + + ПроверкаЛегальностиПолученияОбновления + + ru + Проверка легальности получения обновления + + PersonalComputer + MobileDevice + + + УсловияРаспространенияОбновлений + + ru + Условия распространения обновлений + + HTMLDocument + + diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Form.form b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Form.form new file mode 100644 index 000000000..fbf322075 --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Form.form @@ -0,0 +1,385 @@ + + + + <key>ru</key> + <value>Автоматическая проверка обновления в Интернете</value> + + + ПроверятьНаличиеОбновленияПриЗапуске + 2 + + <key>ru</key> + <value>Проверять наличие обновления в Интернете автоматически</value> + + true + true + + true + + + Объект.ПроверятьНаличиеОбновленияПриЗапуске + + None + + OnChange + ПроверятьНаличиеОбновленияПриЗапускеПриИзменении + + + ПроверятьНаличиеОбновленияПриЗапускеРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + ПроверятьНаличиеОбновленияПриЗапускеКонтекстноеМеню + 3 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Отключена + + + 0 + + + + + ru + При каждом запуске программы + + + 2 + + + + + ru + По расписанию + + + 1 + + + Vertical + + + + НадписьОткрытьРасписание + 7 + + <key>ru</key> + <value>Открыть расписание</value> + + true + true + + true + + + НадписьОткрытьРасписаниеРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + НадписьОткрытьРасписаниеКонтекстноеМеню + 8 + true + + Label + true + true + true + false + + + Click + НадписьОткрытьРасписаниеНажатие + + true + Left + Center + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ОК + 1 + + <key>ru</key> + <value>ОК</value> + + true + true + + true + + false + + ОКРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + Form.Command.КомандаОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 9 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСправка + 10 + true + true + + true + + + ФормаСправкаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + CustomizeForm + Ignore + No + RestoreValues + Retry + SaveValues + Yes + 60 + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.ОбновлениеКонфигурации + + + true + + + true + + + Объект.АдресЭлектроннойПочты + + + Объект.ВосстанавливатьИнформационнуюБазу + + + Объект.ВыслатьОтчетНаПочту + + + Объект.ДатаВремяОбновления + + + Объект.ДоступныеОбновления + + + Объект.ЗапомнитьПарольСервераОбновлений + + + Объект.ИмяАдминистратораИБ + + + Объект.ИмяАдминистратораКластера + + + Объект.ИмяКаталогаРезервнойКопииИБ + + + Объект.ИмяФайлаОбновления + + + Объект.ИспользоватьРасписаниеДляПроверкиОбновления + + + Объект.ИсточникДискаИТС + + + Объект.ИсточникОбновления + + + Объект.КластерТребуетАутентификации + + + Объект.КодЗадачиПланировщика + + + Объект.КодПользователяСервераОбновлений + + + Объект.НестандартныеПортыСервера + + + Объект.НуженФайлОбновления + + + Объект.ПарольАдминистратораИБ + + + Объект.ПарольАдминистратораИБПроверка + + + Объект.ПарольАдминистратораКластера + + + Объект.ПарольСервераОбновлений + + + Объект.ПовторныйЗапуск + + + Объект.ПортАгентаСервера + + + Объект.ПортКластераСерверов + + + Объект.ПропускатьПриветствие + + + Объект.РежимОбновления + + + Объект.РезультатОбновления + + + Объект.СоздаватьРезервнуюКопию + + + Объект.ТехническаяИнформацияОбОшибке + +
    true
    +
    + + КомандаОК + + <key>ru</key> + <value>Команда ОК</value> + + 1 + + ru + Команда ОК + + + true + + + + КомандаОК + + + Auto + Auto + + + ПроверятьНаличиеОбновленияПриЗапуске + + Number + + 10 + + + true + + + РасписаниеПроверкиНаличияОбновления + + true + + + + + + +
    diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Module.bsl b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Module.bsl new file mode 100644 index 000000000..98264e5d6 --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Module.bsl @@ -0,0 +1,116 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ЗаполнитьЗначенияСвойств(Объект, Параметры); +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + УстановитьВидимостьРасписания(); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура КомандаОК(Команда) + Если (Параметры.ПроверятьНаличиеОбновленияПриЗапуске <> Объект.ПроверятьНаличиеОбновленияПриЗапуске + И (Параметры.ПроверятьНаличиеОбновленияПриЗапуске = 1 ИЛИ Объект.ПроверятьНаличиеОбновленияПриЗапуске = 1)) + ИЛИ Строка(Параметры.РасписаниеПроверкиНаличияОбновления) <> Строка(Объект.РасписаниеПроверкиНаличияОбновления) Тогда + + // проинициализируем, если первый запуск + Если НастройкиОбновленияКонфигурации = Неопределено Тогда + + НастройкиОбновленияКонфигурации = Новый Структура(); + НастройкиОбновленияКонфигурации.Вставить("ПропускатьПриветствие" , Объект.ПропускатьПриветствие); + НастройкиОбновленияКонфигурации.Вставить("КодПользователяСервераОбновлений" , Объект.КодПользователяСервераОбновлений); + НастройкиОбновленияКонфигурации.Вставить("ПарольСервераОбновлений" , ?(Объект.ЗапомнитьПарольСервераОбновлений, Объект.ПарольСервераОбновлений, "")); + НастройкиОбновленияКонфигурации.Вставить("ЗапомнитьПарольСервераОбновлений" , Объект.ЗапомнитьПарольСервераОбновлений); + НастройкиОбновленияКонфигурации.Вставить("ПроверятьНаличиеОбновленияПриЗапуске" , Объект.ПроверятьНаличиеОбновленияПриЗапуске); + НастройкиОбновленияКонфигурации.Вставить("РасписаниеПроверкиНаличияОбновления" , Объект.РасписаниеПроверкиНаличияОбновления); + НастройкиОбновленияКонфигурации.Вставить("ИсточникОбновления" , Объект.ИсточникОбновления); + НастройкиОбновленияКонфигурации.Вставить("РежимОбновления" , Объект.РежимОбновления); + НастройкиОбновленияКонфигурации.Вставить("ДатаВремяОбновления" , Объект.ДатаВремяОбновления); + НастройкиОбновленияКонфигурации.Вставить("ВыслатьОтчетНаПочту" , Объект.ВыслатьОтчетНаПочту); + НастройкиОбновленияКонфигурации.Вставить("АдресЭлектроннойПочты" , Объект.АдресЭлектроннойПочты); + НастройкиОбновленияКонфигурации.Вставить("КодЗадачиПланировщика" , Объект.КодЗадачиПланировщика); + НастройкиОбновленияКонфигурации.Вставить("ПовторныйЗапуск" , Объект.ПовторныйЗапуск); + НастройкиОбновленияКонфигурации.Вставить("ИмяФайлаОбновления" , Объект.ИмяФайлаОбновления); + НастройкиОбновленияКонфигурации.Вставить("НуженФайлОбновления" , Объект.НуженФайлОбновления); + НастройкиОбновленияКонфигурации.Вставить("СоздаватьРезервнуюКопию" , Объект.СоздаватьРезервнуюКопию); + НастройкиОбновленияКонфигурации.Вставить("ВосстанавливатьИнформационнуюБазу" , Объект.ВосстанавливатьИнформационнуюБазу); + НастройкиОбновленияКонфигурации.Вставить("ИмяКаталогаРезервнойКопииИБ" , Объект.ИмяКаталогаРезервнойКопииИБ); + НастройкиОбновленияКонфигурации.Вставить("АдресСервераДляПроверкиНаличияОбновления" , ""); + НастройкиОбновленияКонфигурации.Вставить("ИспользоватьЗначениеНастройкиАдресСервераДляПроверкиНаличияОбновления" , Ложь); + НастройкиОбновленияКонфигурации.Вставить("ИспользоватьЗначениеНастройкиАдресРесурсаДляПроверкиНаличияОбновления" , Ложь); + НастройкиОбновленияКонфигурации.Вставить("ИспользоватьЗначениеНастройкиКороткоеИмяКонфигурации" , Ложь); + НастройкиОбновленияКонфигурации.Вставить("ИспользоватьЗначениеНастройкиКаталогОбновлений" , Ложь); + НастройкиОбновленияКонфигурации.Вставить("ИмяФайлаАдресаОбновленияИТС" , Ложь); + НастройкиОбновленияКонфигурации.Вставить("КаталогОбновлений" , ""); + НастройкиОбновленияКонфигурации.Вставить("КороткоеИмяКонфигурации" , ""); + НастройкиОбновленияКонфигурации.Вставить("АдресРесурсаДляПроверкиНаличияОбновления" , ""); + НастройкиОбновленияКонфигурации.Вставить("ДискИТС" , ""); + НастройкиОбновленияКонфигурации.Вставить("ИсточникДискаИТС" , Объект.ИсточникДискаИТС); + НастройкиОбновленияКонфигурации.Вставить("ИмяАдминистратораИБ" , Объект.ИмяАдминистратораИБ); + НастройкиОбновленияКонфигурации.Вставить("ПарольАдминистратораИБ" , Объект.ПарольАдминистратораИБ); + НастройкиОбновленияКонфигурации.Вставить("КластерТребуетАутентификации" , Объект.КластерТребуетАутентификации); + НастройкиОбновленияКонфигурации.Вставить("ИмяАдминистратораКластера" , Объект.ИмяАдминистратораКластера); + НастройкиОбновленияКонфигурации.Вставить("ПарольАдминистратораКластера" , Объект.ПарольАдминистратораКластера); + НастройкиОбновленияКонфигурации.Вставить("НестандартныеПортыСервера" , Объект.НестандартныеПортыСервера); + НастройкиОбновленияКонфигурации.Вставить("ПортАгентаСервера" , Объект.ПортАгентаСервера); + НастройкиОбновленияКонфигурации.Вставить("ПортКластераСерверов" , Объект.ПортКластераСерверов); + + ОбновлениеКонфигурации.ЗаписатьСтруктуруНастроекПомощника(НастройкиОбновленияКонфигурации); + + КонецЕсли; + + НастройкиОбновленияКонфигурации.ПроверятьНаличиеОбновленияПриЗапуске = Объект.ПроверятьНаличиеОбновленияПриЗапуске; + НастройкиОбновленияКонфигурации.РасписаниеПроверкиНаличияОбновления = Объект.РасписаниеПроверкиНаличияОбновления; + ОбновлениеКонфигурации.ЗаписатьСтруктуруНастроекПомощника(НастройкиОбновленияКонфигурации); + ОбновитьПовторноИспользуемыеЗначения(); + ОбновлениеКонфигурацииКлиент.ПодключитьОтключитьПроверкуПоРасписанию(Объект.ПроверятьНаличиеОбновленияПриЗапуске = 1 И + Объект.РасписаниеПроверкиНаличияОбновления <> Неопределено); + КонецЕсли; + Закрыть(Новый Структура("ПроверятьНаличиеОбновленияПриЗапуске, РасписаниеПроверкиНаличияОбновления", + Объект.ПроверятьНаличиеОбновленияПриЗапуске, Объект.РасписаниеПроверкиНаличияОбновления)); +КонецПроцедуры + +&НаКлиенте +Процедура ПроверятьНаличиеОбновленияПриЗапускеПриИзменении(Элемент) + УстановитьВидимостьРасписания(); +КонецПроцедуры + +&НаКлиенте +Процедура НадписьОткрытьРасписаниеНажатие(Элемент) + Если Объект.РасписаниеПроверкиНаличияОбновления = Неопределено Тогда + Объект.РасписаниеПроверкиНаличияОбновления = Новый РасписаниеРегламентногоЗадания; + КонецЕсли; + Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Объект.РасписаниеПроверкиНаличияОбновления); + Если Диалог.ОткрытьМодально() Тогда + Объект.РасписаниеПроверкиНаличияОбновления = Диалог.Расписание; + КонецЕсли; + Элементы.НадписьОткрытьРасписание.Заголовок = ТекстНадписиОткрытьРасписание(); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура УстановитьВидимостьРасписания() + Если Объект.ПроверятьНаличиеОбновленияПриЗапуске = 1 Тогда + Элементы.НадписьОткрытьРасписание.Доступность = Истина; + Элементы.НадписьОткрытьРасписание.Заголовок = ТекстНадписиОткрытьРасписание(); + Иначе + Элементы.НадписьОткрытьРасписание.Доступность = Ложь; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Функция ТекстНадписиОткрытьРасписание() + СтроковоеПредставлениеРасписания = Строка(Объект.РасписаниеПроверкиНаличияОбновления); + Возврат ?(НЕ ПустаяСтрока(СтроковоеПредставлениеРасписания), СтроковоеПредставлениеРасписания, + НСтр("ru = 'Открыть расписание'")); +КонецФункции + diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Form.form b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Form.form new file mode 100644 index 000000000..c3a520e7d --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Form.form @@ -0,0 +1,909 @@ + + + + <key>ru</key> + <value>Резервная копия информационной базы</value> + + + СоздаватьРезервнуюКопию + 1 + true + true + + true + + + Объект.СоздаватьРезервнуюКопию + + None + + OnChange + СоздаватьРезервнуюКопиюПриИзменении + + + СоздаватьРезервнуюКопиюРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + СоздаватьРезервнуюКопиюКонтекстноеМеню + 2 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + &Не создавать резервную копию ИБ + + + 2 + + + + + ru + &Создавать временную резервную копию ИБ + + + 0 + + + + + ru + Со&здавать резервную копию ИБ и сохранять в указанном каталоге + + + 1 + + + Vertical + + + + Отступ + 5 + + ПолеКаталогРезервнойКопии + 3 + + <key>ru</key> + <value>Каталог</value> + + true + true + + true + + + Объект.ИмяКаталогаРезервнойКопииИБ + + + ПолеКаталогРезервнойКопииРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ПолеКаталогРезервнойКопииКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПолеКаталогРезервнойКопииНачалоВыбора + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Отступ</value> + + + ru + Отступ + + + ОтступРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ПанельИнформация + 6 + + АвтоматическийОткат + 7 + + ДекорацияКартинка3 + 34 + + <key>ru</key> + <value>Декорация картинка</value> + + true + true + + true + + + ДекорацияКартинка3РасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ДекорацияКартинка3КонтекстноеМеню + 35 + true + + 5 + true + 2 + true + true + false + + + CommonPicture.Информация32 + + + + + НадписьВосстанавливать1 + 36 + + <key>ru</key> + <value>Система автоматически выполнит откат при возникновении нештатной ситуации в процессе обновления конфигурации.</value> + + true + true + + true + + + НадписьВосстанавливать1РасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + НадписьВосстанавливать1КонтекстноеМеню + 37 + true + + Label + true + true + true + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Автоматический откат</value> + + + ru + Автоматический откат + + true + + АвтоматическийОткатРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Page + + auto + + + + РучнойОткат + 32 + + ВертикальнаяГруппа1 + 24 + + ВосстанавливатьИнформационнуюБазу + 22 + true + true + + true + + + Объект.ВосстанавливатьИнформационнуюБазу + + Right + + OnChange + ВосстанавливатьИнформационнуюБазуПриИзменении + + + ВосстанавливатьИнформационнуюБазуРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + ВосстанавливатьИнформационнуюБазуКонтекстноеМеню + 23 + true + + CheckBoxField + Enter + true + Left + true + + + + СтраницыНадписиРучногоОтката + 25 + + Восстанавливать + 26 + + ДекорацияКартинка + 9 + + <key>ru</key> + <value>Декорация картинка</value> + + true + true + + true + + + ДекорацияКартинкаРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + ДекорацияКартинкаКонтекстноеМеню + 10 + true + + 5 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + НадписьВосстанавливать + 11 + + <key>ru</key> + <value>Система автоматически выполнит откат при возникновении нештатной ситуации в процессе обновления конфигурации.</value> + + true + true + + true + + + НадписьВосстанавливатьРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + НадписьВосстанавливатьКонтекстноеМеню + 12 + true + + Label + true + true + true + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Восстанавливать</value> + + + ВосстанавливатьРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + Page + + auto + + + + НеВосстанавливать + 27 + + ДекорацияКартинка2 + 30 + + <key>ru</key> + <value>Декорация картинка</value> + + true + true + + true + + + ДекорацияКартинка2РасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + ДекорацияКартинка2КонтекстноеМеню + 31 + true + + 5 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + + + + НадписьНеВосстанавливать + 28 + + <key>ru</key> + <value>В указанном каталоге будет создана резервная копия, но при возникновении нештатной ситуации откат из нее производиться не будет.</value> + + true + true + + true + + + НадписьНеВосстанавливатьРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + НадписьНеВосстанавливатьКонтекстноеМеню + 29 + true + + Label + true + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Не восстанавливать</value> + + + НеВосстанавливатьРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + Page + + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы надписи ручного отката</value> + + + ru + Страницы надписи ручного отката + + true + true + + СтраницыНадписиРучногоОткатаРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + true + + ВертикальнаяГруппа1РасширеннаяПодсказка + 50 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Ручной откат</value> + + + РучнойОткатРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + БезОтката + 13 + + Группа2 + 14 + + ДекорацияКартинка1 + 15 + + <key>ru</key> + <value>Декорация картинка1</value> + + true + true + + true + + + ДекорацияКартинка1РасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + ДекорацияКартинка1КонтекстноеМеню + 16 + true + + 4 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + + + + Надпись1 + 17 + + <key>ru</key> + <value>Система не будет выполнять откат при возникновении нештатной ситуации в процессе обновления конфигурации. Рекомендуется выбирать этот вариант, только если выполняется резервное копирование ИБ другими средствами.</value> + + true + true + + true + + + Надпись1РасширеннаяПодсказка + 63 + Label + true + true + + Left + + + + Надпись1КонтекстноеМеню + 18 + true + + Label + true + true + true + false + + Left + Center + 2 + + + true + true + + true + + false + + Группа2РасширеннаяПодсказка + 61 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Без отката</value> + + + ru + Без отката + + + БезОткатаРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Панель информация</value> + + + ru + Панель информация + + true + + ПанельИнформацияРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + Pages + + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + КнопкаОК + 20 + + <key>ru</key> + <value>ОК</value> + + true + true + + true + + false + + КнопкаОКРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + Form.Command.КомандаОК + Auto + true + true + true + UserCmds + Auto + + + КнопкаЗакрыть + 21 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + false + + КнопкаЗакрытьРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + Auto + + Right + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + CustomizeForm + Help + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + DontBlock + Use + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.ОбновлениеКонфигурации + + + true + + + true + +
    true
    +
    + + КомандаОК + + <key>ru</key> + <value>Команда ОК</value> + + 1 + + ru + Команда ОК + + + true + + + + КомандаОК + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Module.bsl b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Module.bsl new file mode 100644 index 000000000..4139884fd --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Module.bsl @@ -0,0 +1,88 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ЗаполнитьЗначенияСвойств(Объект, Параметры); +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + ОбновитьСостояниеЭлементовУправления(); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ПолеКаталогРезервнойКопииНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); + Диалог.Каталог = ОбновлениеКонфигурацииКлиент.ПолучитьКаталогФайла(Объект.ИмяКаталогаРезервнойКопииИБ); + Диалог.ПроверятьСуществованиеФайла = Истина; + Диалог.Заголовок = "Выбор каталога резервной копии ИБ"; + + Если Диалог.Выбрать() Тогда + Объект.ИмяКаталогаРезервнойКопииИБ = Диалог.Каталог; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура СоздаватьРезервнуюКопиюПриИзменении(Элемент) + ОбновитьСостояниеЭлементовУправления(); +КонецПроцедуры + +&НаКлиенте +Процедура КомандаОК(Команда) + Отказ = Ложь; + Если Объект.СоздаватьРезервнуюКопию = 1 Тогда + Файл = Новый Файл(Объект.ИмяКаталогаРезервнойКопииИБ); + Отказ = НЕ Файл.Существует() ИЛИ НЕ Файл.ЭтоКаталог(); + Если Отказ Тогда + Предупреждение("Укажите существующий каталог для сохранения резервной копии ИБ."); + ТекущийЭлемент = Элементы.ПолеКаталогРезервнойКопии; + КонецЕсли; + КонецЕсли; + Если Не Отказ Тогда + Закрыть(Новый Структура( "СоздаватьРезервнуюКопию, ИмяКаталогаРезервнойКопииИБ, ВосстанавливатьИнформационнуюБазу", + Объект.СоздаватьРезервнуюКопию, + Объект.ИмяКаталогаРезервнойКопииИБ, + Объект.ВосстанавливатьИнформационнуюБазу)); + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ОбновитьСостояниеЭлементовУправления() + + Элементы.ПолеКаталогРезервнойКопии.АвтоОтметкаНезаполненного = (Объект.СоздаватьРезервнуюКопию = 1); + Элементы.ПолеКаталогРезервнойКопии.Доступность = (Объект.СоздаватьРезервнуюКопию = 1); + ИнфоСтраницы = Элементы.ПанельИнформация.ПодчиненныеЭлементы; + Если Объект.СоздаватьРезервнуюКопию = 0 Тогда + Объект.ВосстанавливатьИнформационнуюБазу = Ложь; + Элементы.ПанельИнформация.ТекущаяСтраница = ИнфоСтраницы.БезОтката; + ИначеЕсли Объект.СоздаватьРезервнуюКопию = 1 Тогда + Элементы.ПанельИнформация.ТекущаяСтраница = ИнфоСтраницы.РучнойОткат; + ОбновитьНадписьРучногоОтката(); + ИначеЕсли Объект.СоздаватьРезервнуюКопию = 2 Тогда + Объект.ВосстанавливатьИнформационнуюБазу = Истина; + Элементы.ПанельИнформация.ТекущаяСтраница = ИнфоСтраницы.АвтоматическийОткат; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ВосстанавливатьИнформационнуюБазуПриИзменении(Элемент) + ОбновитьНадписьРучногоОтката(); +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьНадписьРучногоОтката() + СтраницыНадписи = Элементы.СтраницыНадписиРучногоОтката.ПодчиненныеЭлементы; + Элементы.СтраницыНадписиРучногоОтката.ТекущаяСтраница = ?(Объект.ВосстанавливатьИнформационнуюБазу, + СтраницыНадписи.Восстанавливать, + СтраницыНадписи.НеВосстанавливать); +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Обозреватель/Form.form b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Обозреватель/Form.form new file mode 100644 index 000000000..d2b50f611 --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Обозреватель/Form.form @@ -0,0 +1,404 @@ + + + + <key>ru</key> + <value>Информация</value> + + + АдреснаяСтрока + 11 + + КнопкаНазад + 10 + true + true + + true + + false + + КнопкаНазадРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + UsualButton + Form.Command.Назад + Normal + Picture + true + true + UserCmds + Auto + + + КнопкаВперед + 9 + true + true + + true + + false + + КнопкаВпередРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + UsualButton + Form.Command.Вперед + Normal + Picture + true + true + UserCmds + Auto + + + АдресСтраницы + 2 + true + true + + true + + + АдресСтраницы + + None + + АдресСтраницыРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + АдресСтраницыКонтекстноеМеню + 3 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДополнительныеДействия + 12 + + Сформировать + 7 + true + true + + true + + false + + СформироватьРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + UsualButton + Form.Command.Перейти + Auto + true + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Дополнительные действия</value> + + + ДополнительныеДействияРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Адресная строка</value> + + + АдреснаяСтрокаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + HTMLТекст + 4 + true + true + + true + + + HTMLТекст + + None + + HTMLТекстРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + HTMLТекстКонтекстноеМеню + 5 + true + + HTMLDocumentField + Enter + true + Left + true + + 50 + true + 15 + true + true + true + + + None + false + + ФормаКоманднаяПанель + -1 + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + CustomizeForm + Help + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + АдресСтраницы + + <key>ru</key> + <value>Адрес страницы</value> + + 1 + + String + + 500 + + + + true + + + true + + + + HTMLТекст + + <key>ru</key> + <value>HTMLТекст</value> + + 2 + + String + + + + true + + + true + + + + Перейти + + <key>ru</key> + <value>Перейти</value> + + 1 + + ru + Перейти + + + true + + + + ПерейтиКСтранице + + + Auto + Auto + + + Вперед + + <key>ru</key> + <value>Вперед</value> + + 2 + + ru + Вперед + + + true + + + StdPicture.Forward + + + + Вперед + + + Auto + Auto + + + Назад + + <key>ru</key> + <value>Назад</value> + + 3 + + ru + Назад + + + true + + + StdPicture.Back + + + + Назад + + + Auto + Auto + + + АдресСтраницы + + String + + + true + + + ПоказыватьАдреснуюСтроку + + Boolean + + + + Заголовок + + String + + + + + + + + diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Обозреватель/Module.bsl b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Обозреватель/Module.bsl new file mode 100644 index 000000000..8de681017 --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Обозреватель/Module.bsl @@ -0,0 +1,39 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если НЕ ПустаяСтрока(Параметры.Заголовок) Тогда + Заголовок = Параметры.Заголовок; + КонецЕсли; + АдресСтраницы = Параметры.АдресСтраницы; + HTMLТекст = АдресСтраницы; + Элементы.АдреснаяСтрока.Видимость = Параметры.ПоказыватьАдреснуюСтроку; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ПерейтиКСтранице(Команда) + ОткрытьСтраницуПоАдресу(); +КонецПроцедуры + +&НаКлиенте +Процедура Вперед(Команда) + Элементы.HTMLТекст.Вперед(); +КонецПроцедуры + +&НаКлиенте +Процедура Назад(Команда) + Элементы.HTMLТекст.Назад(); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ОткрытьСтраницуПоАдресу() + HTMLТекст = АдресСтраницы; +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/ПредупреждениеWMI/Form.form b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/ПредупреждениеWMI/Form.form new file mode 100644 index 000000000..bd454ab7c --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/ПредупреждениеWMI/Form.form @@ -0,0 +1,283 @@ + + + + Декорация1 + 3 + + <key>ru</key> + <value>Невозможно продолжить обновление конфигурации, так как на Вашем компьютере +не установлен компонент Windows Management Instrumentation (WMI).</value> + + true + true + + true + + + Декорация1РасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 4 + true + + Label + true + true + false + + Left + + + + Группа1 + 5 + + Картинка + 6 + + <key>ru</key> + <value>Картинка</value> + + true + true + + true + + + КартинкаРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + КартинкаКонтекстноеМеню + 7 + true + + 5 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + Группа2 + 8 + + Декорация3 + 9 + + <key>ru</key> + <value>Компонент можно установить, перейдя по ссылке на веб-сайт поставщика:</value> + + true + true + + true + + + Декорация3РасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + Декорация3КонтекстноеМеню + 10 + true + + Label + true + true + false + + Left + + + + НадписьWebСтраница + 11 + + <key>ru</key> + <value>Открыть веб-сайт компонента WMI</value> + + true + true + + true + + + НадписьWebСтраницаРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + НадписьWebСтраницаКонтекстноеМеню + 12 + true + + Label + true + true + false + + + Click + НадписьWebСтраницаНажатие + + true + Left + + + true + true + + true + + + Группа2РасширеннаяПодсказка + 17 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + Группа1РасширеннаяПодсказка + 15 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Закрыть + 2 + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + Form.StandardCommand.Close + PictureAndText + true + true + true + UserCmds + Auto + + Right + true + + Abort + Cancel + CustomizeForm + Help + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.ОбновлениеКонфигурации + + + true + + + true + +
    true
    +
    + + + + + +
    diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/ПредупреждениеWMI/Module.bsl b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/ПредупреждениеWMI/Module.bsl new file mode 100644 index 000000000..105557f4b --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/ПредупреждениеWMI/Module.bsl @@ -0,0 +1,5 @@ + +&НаКлиенте +Процедура НадписьWebСтраницаНажатие(Элемент) + ОбновлениеКонфигурацииКлиент.ОткрытьВебСтраницу("http://www.microsoft.com/downloads/details.aspx?FamilyID=AFE41F46-E213-4CBF-9C5B-FBF236E0E875"); +КонецПроцедуры diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Form.form b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Form.form new file mode 100644 index 000000000..ae55b5fcf --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Form.form @@ -0,0 +1,12327 @@ + + + + <key>ru</key> + <value>Обновление конфигурации</value> + + + СтраницыПомощника + 1 + + ДоброПожаловать + 2 + + НадписьШапкаДоброПожаловать + 3 + + <key>ru</key> + <value>Вас приветствует помощник обновления конфигурации!</value> + + true + true + + true + + + НадписьШапкаДоброПожаловатьРасширеннаяПодсказка + 617 + Label + true + true + + Left + + + + НадписьШапкаДоброПожаловатьКонтекстноеМеню + 4 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 12.0 + true + false + false + false + + + Left + + + + Декорация3 + 7 + + <key>ru</key> + <value>Выберите, каким образом система будет получать обновления:</value> + + true + true + + true + + + Декорация3РасширеннаяПодсказка + 618 + Label + true + true + + Left + + + + Декорация3КонтекстноеМеню + 8 + true + + Label + true + true + false + + Left + + + + ГруппаИнтеренет + 414 + + СтраницыКартинкиИнтернет + 438 + + ЕстьКартинка + 439 + + ДекорацияЧерезИнтернет + 416 + + <key>ru</key> + <value>Декорация через интернет</value> + + true + true + + true + + + ДекорацияЧерезИнтернетРасширеннаяПодсказка + 622 + Label + true + true + + Left + + + + ДекорацияЧерезИнтернетКонтекстноеМеню + 417 + true + + 4 + true + 2 + true + false + + + Click + ДекорацияЧерезИнтернетНажатие + + + CommonPicture.Переключатель + + true + + + 1 + + + + true + true + + true + + + ЕстьКартинкаРасширеннаяПодсказка + 621 + Label + true + true + + Left + + + Page + + Vertical + + + + НетКартинки + 440 + + ДекорацияПустаяКартинка + 445 + true + true + + true + + + ДекорацияПустаяКартинкаРасширеннаяПодсказка + 624 + Label + true + true + + Left + + + + ДекорацияПустаяКартинкаКонтекстноеМеню + 446 + true + + 4 + true + 2 + true + false + + + Click + ДекорацияЧерезИнтернетНажатие + + true + + + 1 + + + + true + true + + true + + + НетКартинкиРасширеннаяПодсказка + 623 + Label + true + true + + Left + + + Page + + Vertical + + + true + true + + true + + + СтраницыКартинкиИнтернетРасширеннаяПодсказка + 620 + Label + true + true + + Left + + + Pages + + Auto + + + + Группа8 + 415 + + НадписьПользовательскийСайт + 418 + + <key>ru</key> + <value>Пользовательский сайт в Интернете (рекомендуется)</value> + + true + true + + true + + + НадписьПользовательскийСайтРасширеннаяПодсказка + 626 + Label + true + true + + Left + + + + НадписьПользовательскийСайтКонтекстноеМеню + 419 + true + + Label + true + true + false + + Left + Center + + + + ПропускатьПриветствие + 12 + + <key>ru</key> + <value>&Всегда подключаться к Интернету и пропускать этот шаг помощника</value> + + true + true + + true + + + Объект.ПропускатьПриветствие + + Right + + ПропускатьПриветствиеРасширеннаяПодсказка + 627 + Label + true + true + + Left + + + + ПропускатьПриветствиеКонтекстноеМеню + 13 + true + + CheckBoxField + Top + Enter + true + Left + true + + + true + true + + true + + 3 + false + + Группа8РасширеннаяПодсказка + 625 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + ГруппаИнтеренетРасширеннаяПодсказка + 619 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаИТС + 420 + + СтраницыКартинкиИТС + 443 + + ЕстьКартинка1 + 444 + + ДекорацияЧерезИТС + 421 + true + true + + true + + + ДекорацияЧерезИТСРасширеннаяПодсказка + 632 + Label + true + true + + Left + + + + ДекорацияЧерезИТСКонтекстноеМеню + 422 + true + + 4 + true + 2 + true + false + + + Click + ДекорацияЧерезИТСНажатие + + + CommonPicture.Переключатель + + true + + + 1 + + + + true + true + + true + + + ЕстьКартинка1РасширеннаяПодсказка + 631 + Label + true + true + + Left + + + Page + + Vertical + + + + НетКартинки1 + 447 + + ДекорацияПустаяКартинка1 + 448 + true + true + + true + + + ДекорацияПустаяКартинка1РасширеннаяПодсказка + 634 + Label + true + true + + Left + + + + ДекорацияПустаяКартинка1КонтекстноеМеню + 449 + true + + 4 + true + 2 + true + false + + + Click + ДекорацияЧерезИТСНажатие + + true + + + 1 + + + + true + true + + true + + + НетКартинки1РасширеннаяПодсказка + 633 + Label + true + true + + Left + + + Page + + Vertical + + + true + true + + true + + + СтраницыКартинкиИТСРасширеннаяПодсказка + 630 + Label + true + true + + Left + + + Pages + + Auto + + + + Группа19 + 423 + + НадписьИТС + 424 + + <key>ru</key> + <value>Диск ИТС</value> + + true + true + + true + + + НадписьИТСРасширеннаяПодсказка + 636 + Label + true + true + + Left + + + + НадписьИТСКонтекстноеМеню + 425 + true + + Label + true + true + false + + Left + Center + + + + Декорация2 + 426 + + <key>ru</key> + <value>Выберите этот вариант, чтобы выполнить обновление с диска Информационно-Технологического Сопровождения (ИТС)</value> + + true + true + + true + + + Декорация2РасширеннаяПодсказка + 637 + Label + true + true + + Left + + + + Декорация2КонтекстноеМеню + 427 + true + + Label + true + true + false + false + + Left + Center + + + true + true + + true + + 3 + false + + Группа19РасширеннаяПодсказка + 635 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + ГруппаИТСРасширеннаяПодсказка + 629 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + + ГруппаФайл + 428 + + СтраницыКартинкиФайл + 450 + + ЕстьКартинка2 + 451 + + ДекорацияИзФайла + 429 + true + true + + true + + + ДекорацияИзФайлаРасширеннаяПодсказка + 641 + Label + true + true + + Left + + + + ДекорацияИзФайлаКонтекстноеМеню + 430 + true + + 4 + true + 2 + true + false + + + Click + ДекорацияИзФайлаНажатие + + + CommonPicture.Переключатель + + true + + + 1 + + + + true + true + + true + + + ЕстьКартинка2РасширеннаяПодсказка + 640 + Label + true + true + + Left + + + Page + + Vertical + + + + НетКартинки2 + 452 + + ДекорацияПустаяКартинка2 + 453 + true + true + + true + + + ДекорацияПустаяКартинка2РасширеннаяПодсказка + 643 + Label + true + true + + Left + + + + ДекорацияПустаяКартинка2КонтекстноеМеню + 454 + true + + 4 + true + 2 + true + false + + + Click + ДекорацияИзФайлаНажатие + + true + + + 1 + + + + true + true + + true + + + НетКартинки2РасширеннаяПодсказка + 642 + Label + true + true + + Left + + + Page + + Vertical + + + true + true + + true + + + СтраницыКартинкиФайлРасширеннаяПодсказка + 639 + Label + true + true + + Left + + + Pages + + Auto + + + + Группа22 + 431 + + НадписьЛокальныйКаталог + 432 + + <key>ru</key> + <value>Локальный или сетевой каталог</value> + + true + true + + true + + + НадписьЛокальныйКаталогРасширеннаяПодсказка + 645 + Label + true + true + + Left + + + + НадписьЛокальныйКаталогКонтекстноеМеню + 433 + true + + Label + true + true + false + + Left + Center + + + + Декорация18 + 434 + + <key>ru</key> + <value>Выберите этот вариант, чтобы указать файл поставки обновления в локальном или сетевом каталоге.</value> + + true + true + + true + + + Декорация18РасширеннаяПодсказка + 646 + Label + true + true + + Left + + + + Декорация18КонтекстноеМеню + 435 + true + + Label + true + true + false + false + + Left + Center + + + true + true + + true + + 3 + false + + Группа22РасширеннаяПодсказка + 644 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + ГруппаФайлРасширеннаяПодсказка + 638 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + + Отступ3 + 361 + true + true + + true + + + Отступ3РасширеннаяПодсказка + 647 + Label + true + true + + Left + + + + Отступ3КонтекстноеМеню + 362 + true + + Label + true + true + true + false + + Left + + + + ГруппаПроверкиНаличияОбновления + 487 + + НадписьПроверкиНаличияОбновления + 488 + + <key>ru</key> + <value>Автоматическая проверка обновления в Интернете:</value> + + true + true + + true + + + НадписьПроверкиНаличияОбновленияРасширеннаяПодсказка + 649 + Label + true + true + + Left + + + + НадписьПроверкиНаличияОбновленияКонтекстноеМеню + 489 + true + + Label + true + true + false + + Left + + + + ГиперссылкаПроверятьНаличиеОбновленияПриЗапуске + 475 + + <key>ru</key> + <value>Не проверять</value> + + true + true + + true + + + ГиперссылкаПроверятьНаличиеОбновленияПриЗапускеРасширеннаяПодсказка + 650 + Label + true + true + + Left + + + + ГиперссылкаПроверятьНаличиеОбновленияПриЗапускеКонтекстноеМеню + 476 + true + + Label + true + true + true + false + + + Click + ГиперссылкаПроверятьНаличиеОбновленияПриЗапускеНажатие + + true + Left + + + true + true + + true + + + ru + Группа проверки наличия обновления + + + ГруппаПроверкиНаличияОбновленияРасширеннаяПодсказка + 648 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + auto + Auto + Auto + + + + НадписьСообщениеДалее + 16 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для поиска обновления конфигурации.</value> + + true + true + + true + + + НадписьСообщениеДалееРасширеннаяПодсказка + 651 + Label + true + true + + Left + + + + НадписьСообщениеДалееКонтекстноеМеню + 17 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Добро пожаловать</value> + + + ru + Добро пожаловать + + + ДоброПожаловатьРасширеннаяПодсказка + 616 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ПодключениеКИнтернет + 22 + + НадписьШапкаПодключениеКИнтернет + 23 + + <key>ru</key> + <value>Не удалось подключиться к сети Интернет</value> + + true + true + + true + + + НадписьШапкаПодключениеКИнтернетРасширеннаяПодсказка + 653 + Label + true + true + + Left + + + + НадписьШапкаПодключениеКИнтернетКонтекстноеМеню + 24 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 12.0 + true + false + false + false + + + Left + + + + Группа3 + 29 + + ДекорацияКартинка + 25 + true + true + + true + + + ДекорацияКартинкаРасширеннаяПодсказка + 655 + Label + true + true + + Left + + + + ДекорацияКартинкаКонтекстноеМеню + 26 + true + + 6 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + + + + Декорация6 + 27 + + <key>ru</key> + <value>Системе не удалось подключиться к сети Интернет, чтобы получить информацию об обновлении. Возможные причины: +• Нет подключения к Интернету; +• На веб-узле возникли неполадки; +• Брандмауэр блокирует попытки программы подключиться к Интернету.</value> + + true + true + + true + + + Декорация6РасширеннаяПодсказка + 656 + Label + true + true + + Left + + + + Декорация6КонтекстноеМеню + 28 + true + + Label + true + 3 + true + false + + Left + + + true + true + + true + + + Группа3РасширеннаяПодсказка + 654 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Группа1 + 611 + + НадписьНастройкаПараметровПрокси + 436 + + <key>ru</key> + <value>Настройка параметров прокси</value> + + true + true + + true + + + НадписьНастройкаПараметровПроксиРасширеннаяПодсказка + 658 + Label + true + true + + Left + + + + НадписьНастройкаПараметровПроксиКонтекстноеМеню + 437 + true + + Label + true + true + false + + + Click + НадписьНастройкаПараметровПроксиНажатие + + true + Left + + + true + true + + true + + + Группа1РасширеннаяПодсказка + 657 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ПанельЖурналРегистрации3 + 569 + + Картинка10 + 570 + + <key>ru</key> + <value>Картинка4</value> + + true + true + + true + + + Картинка10РасширеннаяПодсказка + 660 + Label + true + true + + Left + + + + Картинка10КонтекстноеМеню + 571 + true + + 6 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + ВертикальнаяГруппаНадписиЖР2 + 572 + + Декорация7 + 30 + + <key>ru</key> + <value>Подробности см. в Журнале регистрации. Рекомендуется обратиться к системному администратору.</value> + + true + true + + true + + + Декорация7РасширеннаяПодсказка + 662 + Label + true + true + + Left + + + + Декорация7КонтекстноеМеню + 31 + true + + Label + true + 1 + true + false + + Left + + + + НадписьПерейтиВЖурналРегистрации + 503 + + <key>ru</key> + <value>Перейти в журнал регистрации</value> + + true + true + + true + + + НадписьПерейтиВЖурналРегистрацииРасширеннаяПодсказка + 663 + Label + true + true + + Left + + + + НадписьПерейтиВЖурналРегистрацииКонтекстноеМеню + 504 + true + + Label + true + true + true + false + + + Click + НадписьПерейтиВЖурналРегистрацииНажатие + + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Вертикальная группа надписи ЖР</value> + + false + + ВертикальнаяГруппаНадписиЖР2РасширеннаяПодсказка + 661 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Горизонтальная группа2</value> + + + ru + Горизонтальная группа2 + + false + + ПанельЖурналРегистрации3РасширеннаяПодсказка + 659 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + Отступ9 + 383 + true + true + + true + + + Отступ9РасширеннаяПодсказка + 664 + Label + true + true + + Left + + + + Отступ9КонтекстноеМеню + 384 + true + + Label + true + true + true + false + + Left + + + + НадписьДалее + 39 + + <key>ru</key> + <value>Нажмите кнопку "Далее", чтобы повторить поиск обновления конфигурации на пользовательском сайте.</value> + + true + true + + true + + + НадписьДалееРасширеннаяПодсказка + 665 + Label + true + true + + Left + + + + НадписьДалееКонтекстноеМеню + 40 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Подключение к интернет</value> + + + ru + Подключение к интернет + + + ПодключениеКИнтернетРасширеннаяПодсказка + 652 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ПодключениеКСайту + 41 + + Декорация9 + 42 + + <key>ru</key> + <value>Подключение к пользовательскому сайту</value> + + true + true + + true + + + Декорация9РасширеннаяПодсказка + 667 + Label + true + true + + Left + + + + Декорация9КонтекстноеМеню + 43 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 12.0 + true + false + false + false + + + Left + + + + Декорация10 + 44 + + <key>ru</key> + <value>Вы можете получить обновление конфигурации с пользовательского сайта. +Пожалуйста, укажите код пользователя и пароль.</value> + + true + true + + true + + + Декорация10РасширеннаяПодсказка + 668 + Label + true + true + + Left + + + + Декорация10КонтекстноеМеню + 45 + true + + Label + true + true + false + + Left + + + + ГруппаДоступНаПользовательскийСайт + 46 + + Группа2 + 373 + + КодПользователяСервераОбновлений + 47 + + <key>ru</key> + <value>Код пользователя</value> + + true + true + + true + + + Объект.КодПользователяСервераОбновлений + + + КодПользователяСервераОбновленийРасширеннаяПодсказка + 671 + Label + true + true + + Left + + + + КодПользователяСервераОбновленийКонтекстноеМеню + 48 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + Normal + + + + ПарольСервераОбновлений + 49 + + <key>ru</key> + <value>Пароль</value> + + true + true + + true + + + Объект.ПарольСервераОбновлений + + + ПарольСервераОбновленийРасширеннаяПодсказка + 673 + Label + true + true + + Left + + + + ПарольСервераОбновленийКонтекстноеМеню + 50 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + true + Normal + + + true + true + + true + + + Группа2РасширеннаяПодсказка + 670 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Группа5 + 374 + + НадписьИнформацияОПолученииДоступа + 375 + + <key>ru</key> + <value>Как получить код пользователя и пароль?</value> + + true + true + + true + + + НадписьИнформацияОПолученииДоступаРасширеннаяПодсказка + 676 + Label + true + true + + Left + + + + НадписьИнформацияОПолученииДоступаКонтекстноеМеню + 376 + true + + Label + true + true + true + false + + + Click + НадписьИнформацияОПолученииДоступаНажатие + + true + Left + + + + ЗапомнитьПарольСервераОбновлений + 377 + + <key>ru</key> + <value>&Запомнить пароль</value> + + true + true + + true + + + Объект.ЗапомнитьПарольСервераОбновлений + + Right + + ЗапомнитьПарольСервераОбновленийРасширеннаяПодсказка + 677 + Label + true + true + + Left + + + + ЗапомнитьПарольСервераОбновленийКонтекстноеМеню + 378 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + Группа5РасширеннаяПодсказка + 675 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Доступ на пользовательский сайт</value> + + + ru + Группа доступ на пользовательский сайт + + + ГруппаДоступНаПользовательскийСайтРасширеннаяПодсказка + 669 + Label + true + true + + Left + + + UsualGroup + + Auto + StrongSeparation + true + true + auto + Auto + Auto + + + + НадписьТехническаяИнформацияОбОшибке + 63 + true + true + + true + + + НадписьТехническаяИнформацияОбОшибкеРасширеннаяПодсказка + 679 + Label + true + true + + Left + + + + НадписьТехническаяИнформацияОбОшибкеКонтекстноеМеню + 64 + true + + Label + true + true + false + + Left + + + + ПанельОшибкаПодключения + 67 + + ДекорацияКартинка1 + 52 + true + true + + true + + + ДекорацияКартинка1РасширеннаяПодсказка + 681 + Label + true + true + + Left + + + + ДекорацияКартинка1КонтекстноеМеню + 53 + true + + 6 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + + + + ГруппаДоступаНаСайт + 68 + + ПРОФ + 69 + + Декорация11 + 54 + + <key>ru</key> + <value>Системе не удалось подключиться к пользовательскому сайту с указанными кодом и паролем. +Пожалуйста, убедитесь, что:</value> + + true + true + + true + + + Декорация11РасширеннаяПодсказка + 684 + Label + true + true + + Left + + + + Декорация11КонтекстноеМеню + 55 + true + + Label + true + true + false + + Left + + + + Декорация12 + 56 + + <key>ru</key> + <value>• продлена подписка на Информационно-технологическое сопровождение (ИТС)</value> + + true + true + + true + + + Декорация12РасширеннаяПодсказка + 685 + Label + true + true + + Left + + + + Декорация12КонтекстноеМеню + 57 + true + + Label + true + true + false + + Left + + + + НадписьКакОформитьПодпискуИТС + 59 + + <key>ru</key> + <value>Как оформить подписку на ИТС?</value> + + true + true + + true + + + НадписьКакОформитьПодпискуИТСРасширеннаяПодсказка + 686 + Label + true + true + + Left + + + + НадписьКакОформитьПодпискуИТСКонтекстноеМеню + 60 + true + + Label + true + true + false + + + Click + НадписьКакОформитьПодпискуИТСНажатие + + true + Left + + + + Декорация14 + 61 + + <key>ru</key> + <value>• код пользователя и пароль указаны верно</value> + + true + true + + true + + + Декорация14РасширеннаяПодсказка + 687 + Label + true + true + + Left + + + + Декорация14КонтекстноеМеню + 62 + true + + Label + true + true + false + + Left + + + + ТехническаяИнформацияОбОшибке + 379 + true + true + + true + + + Объект.ТехническаяИнформацияОбОшибке + + None + + ТехническаяИнформацияОбОшибкеРасширеннаяПодсказка + 688 + Label + true + true + + Left + + + + ТехническаяИнформацияОбОшибкеКонтекстноеМеню + 380 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>ПРОФ</value> + + + ru + ПРОФ + + + ПРОФРасширеннаяПодсказка + 683 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + Базовая + 70 + + Декорация15 + 71 + + <key>ru</key> + <value>Системе не удалось подключиться к пользовательскому сайту с указанными кодом и паролем. +Пожалуйста, убедитесь, что код пользователя и пароль указаны верно.</value> + + true + true + + true + + + Декорация15РасширеннаяПодсказка + 691 + Label + true + true + + Left + + + + Декорация15КонтекстноеМеню + 72 + true + + Label + true + true + false + + Left + + + + Декорация16 + 73 + + <key>ru</key> + <value>Обновление конфигурации также можно получить в рамках Информационно-технологического сопровождения (ИТС), +включающего доступ к технологическим, методическим и консультационным материалам +(на DVD или в Интернет), а также сервисные и консалтинговые услуги.</value> + + true + true + + true + + + Декорация16РасширеннаяПодсказка + 692 + Label + true + true + + Left + + + + Декорация16КонтекстноеМеню + 74 + true + + Label + true + 3 + true + false + + Left + + + + НадписьПодробнееОбИТС + 75 + + <key>ru</key> + <value>Подробнее об ИТС</value> + + true + true + + true + + + НадписьПодробнееОбИТСРасширеннаяПодсказка + 693 + Label + true + true + + Left + + + + НадписьПодробнееОбИТСКонтекстноеМеню + 76 + true + + Label + 14 + true + 1 + true + false + + + Click + НадписьПодробнееОбИТСНажатие + + true + Left + + + + ТехническаяИнформацияОбОшибке1 + 381 + true + true + + true + + + Объект.ТехническаяИнформацияОбОшибке + + None + + ТехническаяИнформацияОбОшибке1РасширеннаяПодсказка + 694 + Label + true + true + + Left + + + + ТехническаяИнформацияОбОшибке1КонтекстноеМеню + 382 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Базовая</value> + + + ru + Базовая + + + БазоваяРасширеннаяПодсказка + 690 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Группа доступа на сайт</value> + + + ru + Группа доступа на сайт + + + ГруппаДоступаНаСайтРасширеннаяПодсказка + 682 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Панель ошибка подключения</value> + + + ru + Панель ошибка подключения + + + ПанельОшибкаПодключенияРасширеннаяПодсказка + 680 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ПанельЖурналРегистрации + 544 + + Картинка8 + 545 + + <key>ru</key> + <value>Картинка4</value> + + true + true + + true + + + Картинка8РасширеннаяПодсказка + 697 + Label + true + true + + Left + + + + Картинка8КонтекстноеМеню + 546 + true + + 6 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + ВертикальнаяГруппаНадписиЖР + 549 + + НадписьИнфоЖР + 550 + + <key>ru</key> + <value>Подробности см. в Журнале регистрации. Рекомендуется обратиться к системному администратору.</value> + + true + true + + true + + + НадписьИнфоЖРРасширеннаяПодсказка + 699 + Label + true + true + + Left + + + + НадписьИнфоЖРКонтекстноеМеню + 551 + true + + Label + true + true + false + false + + Left + + + + НадписьОткрытьЖурналРегистрации1 + 547 + + <key>ru</key> + <value>Перейти в журнал регистрации</value> + + true + true + + true + + + НадписьОткрытьЖурналРегистрации1РасширеннаяПодсказка + 700 + Label + true + true + + Left + + + + НадписьОткрытьЖурналРегистрации1КонтекстноеМеню + 548 + true + + Label + true + true + true + true + false + + + Click + НадписьОткрытьЖурналРегистрацииНажатие + + true + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Вертикальная группа надписи ЖР</value> + + false + + ВертикальнаяГруппаНадписиЖРРасширеннаяПодсказка + 698 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Горизонтальная группа2</value> + + + ru + Горизонтальная группа2 + + false + + ПанельЖурналРегистрацииРасширеннаяПодсказка + 696 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Декорация66 + 385 + true + true + + true + + + Декорация66РасширеннаяПодсказка + 701 + Label + true + true + + Left + + + + Декорация66КонтекстноеМеню + 386 + true + + Label + true + true + true + false + + Left + + + + НадписьДалее2 + 79 + + <key>ru</key> + <value>Нажмите кнопку "Далее", чтобы продолжить обновление конфигурации с пользовательского сайта, +или выберите "Назад", чтобы повторить поиск обновления в других источниках.</value> + + true + true + + true + + + НадписьДалее2РасширеннаяПодсказка + 702 + Label + true + true + + Left + + + + НадписьДалее2КонтекстноеМеню + 80 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Подключение к сайту</value> + + + ru + Подключение к сайту + + + ПодключениеКСайтуРасширеннаяПодсказка + 666 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + МестоположениеДискаИТС + 463 + + НадписьШапкаМестоположениеДискаИТС + 469 + + <key>ru</key> + <value>Местоположение диска ИТС</value> + + true + true + + true + + + НадписьШапкаМестоположениеДискаИТСРасширеннаяПодсказка + 704 + Label + true + true + + Left + + + + НадписьШапкаМестоположениеДискаИТСКонтекстноеМеню + 470 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 12.0 + true + false + false + false + + + Left + + + + ИсточникДискаИТС + 464 + + <key>ru</key> + <value>Укажите, где находится диск ИТС</value> + + true + true + + true + + + Объект.ИсточникДискаИТС + + + OnChange + ИсточникДискаИТСПриИзменении + + + ИсточникДискаИТСРасширеннаяПодсказка + 705 + Label + true + true + + Left + + + + ИсточникДискаИТСКонтекстноеМеню + 465 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Определить автоматически (рекомендуется) + + + 0 + + + + + ru + Локальный или сетевой каталог + + + 1 + + + Vertical + + + + Отступ5 + 468 + + СтраницыНаличияДискаИТС + 484 + + УказаниеКаталога + 485 + + ДискИТС + 466 + + <key>ru</key> + <value>Путь к диску ИТС</value> + + true + true + + true + + + ДискИТС + + + ДискИТСРасширеннаяПодсказка + 710 + Label + true + true + + Left + + + + ДискИТСКонтекстноеМеню + 467 + true + + InputField + Enter + true + Left + true + + + StartChoice + ДискИТСНачалоВыбора + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Указание каталога</value> + + + ru + Указание каталога + + + УказаниеКаталогаРасширеннаяПодсказка + 709 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ИнфНадписьИТС + 486 + + Декорация21 + 482 + + <key>ru</key> + <value>Если имеется издание ИТС на съемном носителе, вставьте его сейчас в привод.</value> + + true + true + + true + + + Декорация21РасширеннаяПодсказка + 713 + Label + true + true + + Left + + + + Декорация21КонтекстноеМеню + 483 + true + + Label + true + true + false + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Инф надпись ИТС</value> + + + ru + Инф надпись ИТС + + + ИнфНадписьИТСРасширеннаяПодсказка + 712 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы наличия диска ИТС</value> + + + ru + Страницы наличия диска ИТС + + + СтраницыНаличияДискаИТСРасширеннаяПодсказка + 708 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Отступ5</value> + + + Отступ5РасширеннаяПодсказка + 707 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + Отступ6 + 473 + true + true + + true + + + Отступ6РасширеннаяПодсказка + 714 + Label + true + true + + Left + + + + Отступ6КонтекстноеМеню + 474 + true + + Label + true + true + true + false + + Left + + + + НадписьСообщениеДалее4 + 471 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для поиска обновления конфигурации.</value> + + true + true + + true + + + НадписьСообщениеДалее4РасширеннаяПодсказка + 715 + Label + true + true + + Left + + + + НадписьСообщениеДалее4КонтекстноеМеню + 472 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Местоположение диска ИТС</value> + + + ru + Местоположение диска ИТС + + + МестоположениеДискаИТСРасширеннаяПодсказка + 703 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ФайлОбновления + 283 + + НадписьШапкаФайлОбновления + 284 + + <key>ru</key> + <value>Выбор файла поставки обновления конфигурации</value> + + true + true + + true + + + НадписьШапкаФайлОбновленияРасширеннаяПодсказка + 717 + Label + true + true + + Left + + + + НадписьШапкаФайлОбновленияКонтекстноеМеню + 285 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 12.0 + true + false + false + false + + + Left + + + + ПереключательНуженФайлОбновления + 286 + true + true + + true + + + Объект.НуженФайлОбновления + + None + + OnChange + ПереключательНуженФайлОбновленияПриИзменении + + + ПереключательНуженФайлОбновленияРасширеннаяПодсказка + 718 + Label + true + true + + Left + + + + ПереключательНуженФайлОбновленияКонтекстноеМеню + 287 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + &Файл обновления не требуется, так как он уже загружен в основную конфигурацию + + + 0 + + + + + ru + У&кажите файл обновления: + + + 1 + + + Vertical + + + + Отступ + 393 + + ПолеФайлОбновления + 296 + true + true + + true + + + Объект.ИмяФайлаОбновления + + None + + ПолеФайлОбновленияРасширеннаяПодсказка + 721 + Label + true + true + + Left + + + + ПолеФайлОбновленияКонтекстноеМеню + 297 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПолеФайлОбновленияНачалоВыбора + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Отступ</value> + + + ru + Отступ + + + ОтступРасширеннаяПодсказка + 720 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ПанельОбновлениеИзОсновнойКонфигурации + 288 + + Картинка5 + 289 + + <key>ru</key> + <value>Картинка5</value> + + true + true + + true + + + Картинка5РасширеннаяПодсказка + 724 + Label + true + true + + Left + + + + Картинка5КонтекстноеМеню + 290 + true + + 5 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + СтраницыНадписиИзмененнойКонфигурации + 477 + + ЕстьИзменения + 478 + + НадписьКонфигурацияИзменена + 291 + + <key>ru</key> + <value>Основная конфигурация отличается от конфигурации информационной базы данных! +Рекомендуется провести обновление из основной конфигурации.</value> + + true + true + + true + + + НадписьКонфигурацияИзмененаРасширеннаяПодсказка + 727 + Label + true + true + + Left + + + + НадписьКонфигурацияИзмененаКонтекстноеМеню + 292 + true + + Label + true + true + true + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Есть изменения</value> + + + ru + Есть изменения + + + ЕстьИзмененияРасширеннаяПодсказка + 726 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + НетИзменений + 479 + + НадписьНетИзменений + 480 + + <key>ru</key> + <value>Обновление не требуется, т.к. конфигурация базы данные не отличается от основной конфигурации</value> + + true + true + + true + + + НадписьНетИзмененийРасширеннаяПодсказка + 729 + Label + true + true + + Left + + + + НадписьНетИзмененийКонтекстноеМеню + 481 + true + + Label + true + true + true + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Нет изменений</value> + + + ru + Нет изменений + + + НетИзмененийРасширеннаяПодсказка + 728 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы надписи измененной конфигурации</value> + + + СтраницыНадписиИзмененнойКонфигурацииРасширеннаяПодсказка + 725 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Панель обновление из основной конфигурации</value> + + + ru + Панель обновление из основной конфигурации + + false + + ПанельОбновлениеИзОсновнойКонфигурацииРасширеннаяПодсказка + 723 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + НадписьОтступ + 394 + true + true + + true + + + НадписьОтступРасширеннаяПодсказка + 730 + Label + true + true + + Left + + + + НадписьОтступКонтекстноеМеню + 395 + true + + Label + true + true + true + false + + Left + + + + Декорация51 + 293 + + <key>ru</key> + <value>Нажмите кнопку "Далее", чтобы продолжить обновление конфигурации.</value> + + true + true + + true + + + Декорация51РасширеннаяПодсказка + 731 + Label + true + true + + Left + + + + Декорация51КонтекстноеМеню + 294 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Файл обновления</value> + + + ru + Файл обновления + + + ФайлОбновленияРасширеннаяПодсказка + 716 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ДоступноеОбновление + 81 + + НадписьШапкаДоступноеОбновление + 116 + + <key>ru</key> + <value>Обнаружено обновление конфигурации!</value> + + true + true + + true + + + НадписьШапкаДоступноеОбновлениеРасширеннаяПодсказка + 733 + Label + true + true + + Left + + + + НадписьШапкаДоступноеОбновлениеКонтекстноеМеню + 117 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 12.0 + true + false + false + false + + + Left + + + + ИнформацияОДоступномОбновлении + 82 + + ГруппаНомерВерсии + 83 + + ДекорацияКартинка2 + 84 + + <key>ru</key> + <value>Декорация картинка2</value> + + true + true + + true + + + ДекорацияКартинка2РасширеннаяПодсказка + 736 + Label + true + true + + Left + + + + ДекорацияКартинка2КонтекстноеМеню + 85 + true + + 6 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + Группа10 + 88 + + НадписьДоступноеОбновление + 86 + + <key>ru</key> + <value>Версия <номер версии></value> + + true + true + + true + + + НадписьДоступноеОбновлениеРасширеннаяПодсказка + 738 + Label + true + true + + Left + + + + НадписьДоступноеОбновлениеКонтекстноеМеню + 87 + true + + Label + true + true + true + false + + Left + Center + + + + НадписьИнформацияОбОбновлении + 89 + + <key>ru</key> + <value>Новое в этой версии</value> + + true + true + + true + + + НадписьИнформацияОбОбновленииРасширеннаяПодсказка + 739 + Label + true + true + + Left + + + + НадписьИнформацияОбОбновленииКонтекстноеМеню + 90 + true + + Label + true + true + false + + + Click + НадписьИнформацияОбОбновленииНажатие + + true + Left + Center + + + true + true + + true + + false + + Группа10РасширеннаяПодсказка + 737 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа номер версии</value> + + + ru + Группа номер версии + + + ГруппаНомерВерсииРасширеннаяПодсказка + 735 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Группа11 + 95 + + Декорация19 + 91 + + <key>ru</key> + <value>Размер обновления:</value> + + true + true + + true + + + Декорация19РасширеннаяПодсказка + 741 + Label + true + true + + Left + + + + Декорация19КонтекстноеМеню + 92 + true + + Label + true + true + false + + Left + + + + НадписьРазмерОбновления + 93 + + <key>ru</key> + <value><Мбайт></value> + + true + true + + true + + + НадписьРазмерОбновленияРасширеннаяПодсказка + 742 + Label + true + true + + Left + + + + НадписьРазмерОбновленияКонтекстноеМеню + 94 + true + + Label + true + true + false + + Left + + + true + true + + true + + + Группа11РасширеннаяПодсказка + 740 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Группа12 + 98 + + Декорация20 + 96 + + <key>ru</key> + <value>Текущая версия конфигурации:</value> + + true + true + + true + + + Декорация20РасширеннаяПодсказка + 744 + Label + true + true + + Left + + + + Декорация20КонтекстноеМеню + 97 + true + + Label + true + true + false + + Left + + + + НадписьТекущаяКонфигурация + 99 + + <key>ru</key> + <value><Версия текущей конфигурации></value> + + true + true + + true + + + НадписьТекущаяКонфигурацияРасширеннаяПодсказка + 745 + Label + true + true + + Left + + + + НадписьТекущаяКонфигурацияКонтекстноеМеню + 100 + true + + Label + true + true + false + + Left + + + true + true + + true + + + Группа12РасширеннаяПодсказка + 743 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + НадписьОписаниеКонфигурации + 101 + + <key>ru</key> + <value><Описание конфигурации></value> + + true + true + + true + + + НадписьОписаниеКонфигурацииРасширеннаяПодсказка + 746 + Label + true + true + + Left + + + + НадписьОписаниеКонфигурацииКонтекстноеМеню + 102 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Информация о доступном обновлении</value> + + + ru + Информация о доступном обновлении + + 80 + false + + ИнформацияОДоступномОбновленииРасширеннаяПодсказка + 734 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + StrongSeparation + true + true + auto + Auto + Auto + + + + ПанельПорядокОбновления + 103 + + ДекорацияКартинка21 + 104 + + <key>ru</key> + <value>Декорация картинка21</value> + + true + true + + true + + + ДекорацияКартинка21РасширеннаяПодсказка + 748 + Label + true + true + + Left + + + + ДекорацияКартинка21КонтекстноеМеню + 105 + true + + 6 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + + + + Группа14 + 106 + + Декорация22 + 107 + + <key>ru</key> + <value>Для продолжения необходимо ознакомиться с информацией о порядке обновления.</value> + + true + true + + true + + + Декорация22РасширеннаяПодсказка + 750 + Label + true + true + + Left + + + + Декорация22КонтекстноеМеню + 108 + true + + Label + true + true + false + + Left + + + + НадписьПорядокОбновления + 109 + + <key>ru</key> + <value>Порядок обновления</value> + + true + true + + true + + + НадписьПорядокОбновленияРасширеннаяПодсказка + 751 + Label + true + true + + Left + + + + НадписьПорядокОбновленияКонтекстноеМеню + 110 + true + + Label + true + true + false + + + Click + НадписьПорядокОбновленияНажатие + + true + Left + + + true + true + + true + + + Группа14РасширеннаяПодсказка + 749 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Панель порядок обновления</value> + + + ru + Панель порядок обновления + + + ПанельПорядокОбновленияРасширеннаяПодсказка + 747 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + Отступ10 + 371 + true + true + + true + + + Отступ10РасширеннаяПодсказка + 752 + Label + true + true + + Left + + + + Отступ10КонтекстноеМеню + 372 + true + + Label + true + true + true + false + + Left + + + + ГруппаПроверкиНаличияОбновления1 + 529 + + НадписьПроверкиНаличияОбновления1 + 530 + + <key>ru</key> + <value>Автоматическая проверка обновления в Интернете:</value> + + true + true + + true + + + НадписьПроверкиНаличияОбновления1РасширеннаяПодсказка + 754 + Label + true + true + + Left + + + + НадписьПроверкиНаличияОбновления1КонтекстноеМеню + 531 + true + + Label + true + true + false + + Left + + + + ГиперссылкаПроверятьНаличиеОбновленияПриЗапуске1 + 532 + + <key>ru</key> + <value>Не проверять</value> + + true + true + + true + + + ГиперссылкаПроверятьНаличиеОбновленияПриЗапуске1РасширеннаяПодсказка + 755 + Label + true + true + + Left + + + + ГиперссылкаПроверятьНаличиеОбновленияПриЗапуске1КонтекстноеМеню + 533 + true + + Label + true + true + true + false + + + Click + ГиперссылкаПроверятьНаличиеОбновленияПриЗапускеНажатие + + true + Left + + + true + true + + true + + + ru + Группа проверки наличия обновления + + + ГруппаПроверкиНаличияОбновления1РасширеннаяПодсказка + 753 + 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РасширеннаяПодсказка + 758 + Label + true + true + + Left + + + + Декорация23КонтекстноеМеню + 114 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Интернет1</value> + + + ru + Интернет1 + + + Интернет1РасширеннаяПодсказка + 757 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ИТС1 + 368 + + Декорация63 + 369 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для выбора режима обновления конфигурации.</value> + + true + true + + true + + + Декорация63РасширеннаяПодсказка + 760 + Label + true + true + + Left + + + + Декорация63КонтекстноеМеню + 370 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>ИТС1</value> + + + ru + ИТС1 + + + ИТС1РасширеннаяПодсказка + 759 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Панель перехода на следующий шаг</value> + + + ПанельПереходаНаСледующийШагРасширеннаяПодсказка + 756 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Доступное обновление</value> + + + ru + Доступное обновление + + + ДоступноеОбновлениеРасширеннаяПодсказка + 732 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ОбновленияНеОбнаружено + 115 + + ЗаголовокОбновления + 118 + + <key>ru</key> + <value>Обновление не требуется</value> + + true + true + + true + + + ЗаголовокОбновленияРасширеннаяПодсказка + 762 + Label + true + true + + Left + + + + ЗаголовокОбновленияКонтекстноеМеню + 119 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 12.0 + true + false + false + false + + + Left + + + + ГруппаРезультатПоискаОбновления + 120 + + ПанельИнформацияОбОбновлении + 124 + + ОбновлениеНеТребуется + 125 + + ГоризонтальнаяГруппа12 + 586 + + Картинка26 + 121 + + <key>ru</key> + <value>Картинка26</value> + + true + true + + true + + + Картинка26РасширеннаяПодсказка + 767 + Label + true + true + + Left + + + + Картинка26КонтекстноеМеню + 122 + true + + 6 + true + 2 + true + false + false + + + CommonPicture.Информация32 + + + + + НадписьУВасПоследняяВерсия + 126 + + <key>ru</key> + <value>У Вас установлена последняя версия конфигурации!</value> + + true + true + + true + + + НадписьУВасПоследняяВерсияРасширеннаяПодсказка + 768 + Label + true + true + + Left + + + + НадписьУВасПоследняяВерсияКонтекстноеМеню + 127 + true + + Label + true + true + true + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Горизонтальная группа12</value> + + false + + ГоризонтальнаяГруппа12РасширеннаяПодсказка + 766 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Обновление не требуется</value> + + + ru + Обновление не требуется + + false + + ОбновлениеНеТребуетсяРасширеннаяПодсказка + 765 + Label + true + true + + Left + + + Page + + auto + + + + ОбновлениеНеОбнаружено + 128 + + ГоризонтальнаяГруппа16 + 587 + + Картинка24 + 588 + + <key>ru</key> + <value>Картинка24</value> + + true + true + + true + + + Картинка24РасширеннаяПодсказка + 771 + Label + true + true + + Left + + + + Картинка24КонтекстноеМеню + 589 + true + + 6 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + ГруппаПодходящихОбновленийИТС + 498 + + НадписьОбновлениеНеОбнаружено + 129 + + <key>ru</key> + <value>Для этой версии конфигурации обновление не обнаружено. </value> + + true + true + + true + + + НадписьОбновлениеНеОбнаруженоРасширеннаяПодсказка + 773 + Label + true + true + + Left + + + + НадписьОбновлениеНеОбнаруженоКонтекстноеМеню + 130 + true + + Label + true + 2 + true + false + + Left + Top + + + + НадписьНеобходимыеДискиИТС + 492 + + <key>ru</key> + <value>Подходящие обновления содержатся на следующих дисках ИТС</value> + + true + true + + true + + + НадписьНеобходимыеДискиИТС + + + НадписьНеобходимыеДискиИТСРасширеннаяПодсказка + 774 + Label + true + true + + Left + + + + НадписьНеобходимыеДискиИТСКонтекстноеМеню + 493 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + + Style.FormBackColor + + Normal + + + + НадписьПереченьРелизовНаДискахИТС + 501 + + <key>ru</key> + <value>Перейти к переченю релизов, опубликованных на дисках ИТС</value> + + true + true + + true + + + НадписьПереченьРелизовНаДискахИТСРасширеннаяПодсказка + 776 + Label + true + true + + Left + + + + НадписьПереченьРелизовНаДискахИТСКонтекстноеМеню + 502 + true + + Label + true + true + false + false + + + Click + НадписьПереченьРелизовНаДискахИТСНажатие + + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа подходящих обновлений ИТС</value> + + false + + ГруппаПодходящихОбновленийИТСРасширеннаяПодсказка + 772 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Горизонтальная группа16</value> + + false + + ГоризонтальнаяГруппа16РасширеннаяПодсказка + 770 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Обновление не обнаружено</value> + + false + + ОбновлениеНеОбнаруженоРасширеннаяПодсказка + 769 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ВключенаВозможностьИзменений + 131 + + ГоризонтальнаяГруппа3 + 594 + + Картинка14 + 595 + + <key>ru</key> + <value>Картинка14</value> + + true + true + + true + + + Картинка14РасширеннаяПодсказка + 779 + Label + true + true + + Left + + + + Картинка14КонтекстноеМеню + 596 + true + + 6 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + + + + НадписьВключенаВозможностьИзменений + 132 + + <key>ru</key> + <value>Конфигурация с включенной возможностью изменений метаданных не может быть обновлена автоматически. +Используйте штатные средства Конфигуратора (меню "Конфигурация" - "Поддержка" - "Обновить конфигурацию").</value> + + true + true + + true + + + НадписьВключенаВозможностьИзмененийРасширеннаяПодсказка + 780 + Label + true + true + + Left + + + + НадписьВключенаВозможностьИзмененийКонтекстноеМеню + 133 + true + + Label + true + 1 + true + true + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Горизонтальная группа3</value> + + false + + ГоризонтальнаяГруппа3РасширеннаяПодсказка + 778 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Включена возможность изменений</value> + + + ru + Включена возможность изменений + + false + + ВключенаВозможностьИзмененийРасширеннаяПодсказка + 777 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Панель информация об обновлении</value> + + false + + ПанельИнформацияОбОбновленииРасширеннаяПодсказка + 764 + Label + true + true + + Left + + + Pages + + Auto + + + + ГруппаТекушаяВерсия + 136 + + Декорация30 + 134 + + <key>ru</key> + <value>Текущая версия конфигурации:</value> + + true + true + + true + + + Декорация30РасширеннаяПодсказка + 782 + Label + true + true + + Left + + + + Декорация30КонтекстноеМеню + 135 + true + + Label + true + true + false + + Left + + + + НадписьВерсияТекущейКонфигурации + 137 + + <key>ru</key> + <value><Версия текущей конфигурации></value> + + true + true + + true + + + НадписьВерсияТекущейКонфигурацииРасширеннаяПодсказка + 783 + Label + true + true + + Left + + + + НадписьВерсияТекущейКонфигурацииКонтекстноеМеню + 138 + true + + Label + true + true + false + + Left + + + + НадписьВерсияДляОбновления + 507 + + <key>ru</key> + <value><Доступная версия для обновления></value> + + true + true + + true + + + НадписьВерсияДляОбновленияРасширеннаяПодсказка + 784 + Label + true + true + + Left + + + + НадписьВерсияДляОбновленияКонтекстноеМеню + 508 + true + + Label + true + true + false + + Style.ToolTipTextColor + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа текушая версия</value> + + + ru + Группа текушая версия + + false + + ГруппаТекушаяВерсияРасширеннаяПодсказка + 781 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + НадписьОписаниеТекущейКонфигурации + 139 + + <key>ru</key> + <value><Описание текущей конфигурации></value> + + true + true + + true + + + НадписьОписаниеТекущейКонфигурацииРасширеннаяПодсказка + 785 + Label + true + true + + Left + + + + НадписьОписаниеТекущейКонфигурацииКонтекстноеМеню + 140 + true + + Label + true + true + false + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Результат поиска обновления</value> + + + ru + Панель информация об обновлении + + false + + ГруппаРезультатПоискаОбновленияРасширеннаяПодсказка + 763 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + StrongSeparation + true + true + Auto + Auto + + + + ГруппаПроверкиДискаИТС + 526 + + Декорация4 + 527 + + <key>ru</key> + <value>Если у Вас имеется другое издание ИТС на съемном носителе, +вставьте его сейчас в привод.</value> + + true + true + + true + + + Декорация4РасширеннаяПодсказка + 787 + Label + true + true + + Left + + + + Декорация4КонтекстноеМеню + 528 + true + + Label + true + true + false + + Left + + + + КнопкаПроверитьДискИТС + 524 + + <key>ru</key> + <value>Проверить другой диск ИТС</value> + + true + true + + true + + false + + КнопкаПроверитьДискИТСРасширеннаяПодсказка + 788 + Label + true + true + + Left + + + UsualButton + Form.Command.ПроверитьДискИТС + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ГруппаПроверкиДискаИТСРасширеннаяПодсказка + 786 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + auto + Auto + Auto + + + + Отступ7 + 387 + true + true + + true + + + Отступ7РасширеннаяПодсказка + 789 + Label + true + true + + Left + + + + Отступ7КонтекстноеМеню + 388 + true + + Label + true + true + true + false + + Left + + + + НадписьСообщениеДалее1 + 141 + + <key>ru</key> + <value>Нажмите кнопку "Закрыть" для выхода из помощника обновления конфигурации, +или выберите "Назад", чтобы повторить поиск обновления по другим источникам.</value> + + true + true + + true + + + НадписьСообщениеДалее1РасширеннаяПодсказка + 790 + Label + true + true + + Left + + + + НадписьСообщениеДалее1КонтекстноеМеню + 142 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Обновления не обнаружено</value> + + + ru + Обновления не обнаружено + + + ОбновленияНеОбнаруженоРасширеннаяПодсказка + 761 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ДлительнаяОперация + 143 + + НадписьШапкаДлительнаяОперация + 144 + + <key>ru</key> + <value>Пожалуйста, подождите...</value> + + true + true + + true + + + НадписьШапкаДлительнаяОперацияРасширеннаяПодсказка + 792 + Label + true + true + + Left + + + + НадписьШапкаДлительнаяОперацияКонтекстноеМеню + 145 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 12.0 + true + false + false + false + + + Left + + + + ПанельОжиданиеДлительнойОперации + 151 + + Интернет + 152 + + Группа18 + 146 + + ДекорацияКартинка33 + 147 + + <key>ru</key> + <value>Декорация картинка33</value> + + true + true + + true + + + ДекорацияКартинка33РасширеннаяПодсказка + 796 + Label + true + true + + Left + + + + ДекорацияКартинка33КонтекстноеМеню + 148 + true + + 4 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + Декорация34 + 149 + + <key>ru</key> + <value>Процесс получения обновления конфигурации может занять от нескольких минут до нескольких часов в зависимости от размера обновления, скорости подключения к Интернету и производительности компьютера.</value> + + true + true + + true + + + Декорация34РасширеннаяПодсказка + 797 + Label + true + true + + Left + + + + Декорация34КонтекстноеМеню + 150 + true + + Label + true + true + true + false + + Left + Center + 2 + + + true + true + + true + + false + + Группа18РасширеннаяПодсказка + 795 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Интернет</value> + + + ru + Интернет + + + ИнтернетРасширеннаяПодсказка + 794 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ИТС + 153 + + ДекорацияКартинка35 + 154 + + <key>ru</key> + <value>Декорация картинка35</value> + + true + true + + true + + + ДекорацияКартинка35РасширеннаяПодсказка + 799 + Label + true + true + + Left + + + + ДекорацияКартинка35КонтекстноеМеню + 155 + true + + 4 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + Декорация36 + 156 + + <key>ru</key> + <value>Копирование файлов обновления конфигурации может занять несколько минут.</value> + + true + true + + true + + + Декорация36РасширеннаяПодсказка + 800 + Label + true + true + + Left + + + + Декорация36КонтекстноеМеню + 157 + true + + Label + true + true + true + true + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>ИТС</value> + + + ru + ИТС + + false + + ИТСРасширеннаяПодсказка + 798 + Label + true + true + + Left + + + Page + + auto + + + true + true + + true + + + <key>ru</key> + <value>Панель ожидание длительной операции</value> + + 80 + false + + ПанельОжиданиеДлительнойОперацииРасширеннаяПодсказка + 793 + Label + true + true + + Left + + + Pages + + Auto + + + + ГруппаПрогресс + 610 + + НадписьПрогресс + 158 + + <key>ru</key> + <value>Выполняется получение файлов обновления: 1 из 1...</value> + + true + true + + true + + + НадписьПрогрессРасширеннаяПодсказка + 802 + Label + true + true + + Left + + + + НадписьПрогрессКонтекстноеМеню + 159 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа прогресс</value> + + + ru + Группа прогресс + + + ГруппаПрогрессРасширеннаяПодсказка + 801 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Длительная операция</value> + + + ru + Длительная операция + + + ДлительнаяОперацияРасширеннаяПодсказка + 791 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ВыборРежимаОбновленияФайл + 160 + + НадписьШапкаВыборРежимаОбнФайл + 161 + + <key>ru</key> + <value>Все готово к обновлению конфигурации!</value> + + true + true + + true + + + НадписьШапкаВыборРежимаОбнФайлРасширеннаяПодсказка + 804 + Label + true + true + + Left + + + + НадписьШапкаВыборРежимаОбнФайлКонтекстноеМеню + 162 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 12.0 + true + false + false + false + + + Left + + + + ПанельВсеГотовоФайл + 163 + + ВсеГотово + 164 + + Декорация38 + 165 + + <key>ru</key> + <value>Для продолжения необходимо перезапустить "1С:Предприятие". </value> + + true + true + + true + + + Декорация38РасширеннаяПодсказка + 807 + Label + true + true + + Left + + + + Декорация38КонтекстноеМеню + 166 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Все готово</value> + + + ВсеГотовоРасширеннаяПодсказка + 806 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ВсеГотовоПорядокОбновления + 167 + + Декорация8 + 534 + true + true + + true + + + Декорация8РасширеннаяПодсказка + 809 + Label + true + true + + Left + + + + Декорация8КонтекстноеМеню + 535 + true + + 4 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + + + + ВертикальнаяГруппа1 + 536 + + Декорация39 + 169 + + <key>ru</key> + <value>Для продолжения необходимо ознакомиться с порядком обновления и перезапустить "1С:Предприятие". </value> + + true + true + + true + + + Декорация39РасширеннаяПодсказка + 811 + Label + true + true + + Left + + + + Декорация39КонтекстноеМеню + 170 + true + + Label + true + true + false + + Left + + + + НадписьПорядокОбновления1 + 171 + + <key>ru</key> + <value>Порядок обновления</value> + + true + true + + true + + + НадписьПорядокОбновления1РасширеннаяПодсказка + 812 + Label + true + true + + Left + + + + НадписьПорядокОбновления1КонтекстноеМеню + 172 + true + + Label + true + true + false + + + Click + НадписьПорядокОбновленияНажатие + + true + Left + + + true + true + + true + + + ВертикальнаяГруппа1РасширеннаяПодсказка + 810 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Все готово порядок обновления</value> + + + ru + Все готово порядок обновления + + + ВсеГотовоПорядокОбновленияРасширеннаяПодсказка + 808 + Label + true + true + + Left + + + Page + + auto + + + true + true + + true + + + <key>ru</key> + <value>Панель все готово файл</value> + + + ПанельВсеГотовоФайлРасширеннаяПодсказка + 805 + Label + true + true + + Left + + + Pages + + Auto + + + + ГруппаСоединений + 179 + + Картинка1 + 180 + + <key>ru</key> + <value>Картинка1</value> + + true + true + + true + + + Картинка1РасширеннаяПодсказка + 814 + Label + true + true + + Left + + + + Картинка1КонтекстноеМеню + 181 + true + + 5 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + + + + ПанельАктивныеПользователи + 187 + + АктивныеПользователи + 188 + + Надпись43 + 183 + + <key>ru</key> + <value>С информационной базой сейчас работают другие пользователи. Для продолжения необходимо завершить их работу.</value> + + true + true + + true + + + Надпись43РасширеннаяПодсказка + 817 + Label + true + true + + Left + + + + Надпись43КонтекстноеМеню + 184 + true + + Label + true + true + false + + Left + + + + НадписьСписокДействий + 185 + + <key>ru</key> + <value>Посмотреть список активных пользователей</value> + + true + true + + true + + + НадписьСписокДействийРасширеннаяПодсказка + 818 + Label + true + true + + Left + + + + НадписьСписокДействийКонтекстноеМеню + 186 + true + + Label + true + true + true + false + + + Click + НадписьСписокДействийНажатие + + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Активные пользователи</value> + + + ru + Активные пользователи + + + АктивныеПользователиРасширеннаяПодсказка + 816 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + АктивныеСоединения + 189 + + Надпись42 + 190 + + <key>ru</key> + <value>С информационной базой сейчас работают внешние приложения. Для продолжения необходимо завершить их работу.</value> + + true + true + + true + + + Надпись42РасширеннаяПодсказка + 820 + Label + true + true + + Left + + + + Надпись42КонтекстноеМеню + 191 + true + + Label + true + true + false + + Left + + + + НадписьСписокДействий1 + 192 + + <key>ru</key> + <value>Посмотреть список активных подключений</value> + + true + true + + true + + + НадписьСписокДействий1РасширеннаяПодсказка + 821 + Label + true + true + + Left + + + + НадписьСписокДействий1КонтекстноеМеню + 193 + true + + Label + true + true + true + false + + + Click + НадписьСписокДействий1Нажатие + + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Активные соединения</value> + + + ru + Активные соединения + + + АктивныеСоединенияРасширеннаяПодсказка + 819 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СоединениеКонфигуратора + 194 + + Надпись45 + 195 + + <key>ru</key> + <value>С информационной базой сейчас установлено соединение из Конфигуратора. Для продолжения необходимо завершить работу Конфигуратора.</value> + + true + true + + true + + + Надпись45РасширеннаяПодсказка + 823 + Label + true + true + + Left + + + + Надпись45КонтекстноеМеню + 196 + true + + Label + true + 2 + true + false + + Left + Top + + + + НадписьСписокДействий3 + 197 + + <key>ru</key> + <value>Посмотреть список активных пользователей</value> + + true + true + + true + + + НадписьСписокДействий3РасширеннаяПодсказка + 824 + Label + true + true + + Left + + + + НадписьСписокДействий3КонтекстноеМеню + 198 + true + + Label + true + true + true + false + + + Click + НадписьСписокДействий3Нажатие + + true + Left + Top + + + true + true + + true + + + <key>ru</key> + <value>Соединение конфигуратора</value> + + + ru + Соединение конфигуратора + + + СоединениеКонфигуратораРасширеннаяПодсказка + 822 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Панель активные пользователи</value> + + 80 + false + + ПанельАктивныеПользователиРасширеннаяПодсказка + 815 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа соединений</value> + + + ru + Группа соединений + + + ГруппаСоединенийРасширеннаяПодсказка + 813 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + Надпись41 + 177 + + <key>ru</key> + <value>Процесс обновления может занять от нескольких минут до часа. Не выключайте питание компьютера до завершения процесса. Если в "1С:Предприятии" сейчас есть несохраненные данные, сохраните их (закройте все формы редактирования). </value> + + true + true + + true + + + Надпись41РасширеннаяПодсказка + 825 + Label + true + true + + Left + + + + Надпись41КонтекстноеМеню + 178 + true + + Label + true + true + false + + Left + 2 + + + + ГруппаРезервнаяКопия + 204 + + Надпись46 + 202 + + <key>ru</key> + <value>Резервная копия:</value> + + true + true + + true + + + Надпись46РасширеннаяПодсказка + 827 + Label + true + true + + Left + + + + Надпись46КонтекстноеМеню + 203 + true + + Label + true + true + false + + Left + + + + НадписьРезервнаяКопияФайл + 205 + + <key>ru</key> + <value>Создавать временную резервную копию ИБ и выполнять откат при нештатной ситуации</value> + + true + true + + true + + + НадписьРезервнаяКопияФайлРасширеннаяПодсказка + 828 + Label + true + true + + Left + + + + НадписьРезервнаяКопияФайлКонтекстноеМеню + 206 + true + + Label + true + true + false + + + Click + НадписьРезервнаяКопияНажатие + + true + Left + Bottom + + + true + true + + true + + + ГруппаРезервнаяКопияРасширеннаяПодсказка + 826 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + НадписьОтступ3 + 400 + true + true + + true + + + НадписьОтступ3РасширеннаяПодсказка + 829 + Label + true + true + + Left + + + + НадписьОтступ3КонтекстноеМеню + 401 + true + + Label + true + true + true + false + + Left + + + + ПанельПереходаНаСледующийШагРежимаОбновленияФайл + 333 + + Далее + 334 + + Декорация41 + 207 + + <key>ru</key> + <value>Нажмите кнопку "Далее", чтобы перезапустить "1С:Предприятие".</value> + + true + true + + true + + + Декорация41РасширеннаяПодсказка + 832 + Label + true + true + + Left + + + + Декорация41КонтекстноеМеню + 208 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Далее</value> + + + ru + Далее + + + ДалееРасширеннаяПодсказка + 831 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + Готово + 335 + + Декорация56 + 336 + + <key>ru</key> + <value>Нажмите кнопку "Готово", чтобы выйти из помощника обновления конфигурации.</value> + + true + true + + true + + + Декорация56РасширеннаяПодсказка + 834 + Label + true + true + + Left + + + + Декорация56КонтекстноеМеню + 337 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Готово</value> + + + ru + Готово + + + ГотовоРасширеннаяПодсказка + 833 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + АктивныеСоединения2 + 338 + + Декорация57 + 339 + + <key>ru</key> + <value>Продолжение невозможно, так как с базой работают другие пользователи или внешние приложения.</value> + + true + true + + true + + + Декорация57РасширеннаяПодсказка + 836 + Label + true + true + + Left + + + + Декорация57КонтекстноеМеню + 340 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Активные соединения2</value> + + + ru + Активные соединения2 + + + АктивныеСоединения2РасширеннаяПодсказка + 835 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СоединениеКонфигуратора2 + 341 + + Декорация58 + 342 + + <key>ru</key> + <value>Продолжение невозможно, так как установлено соединение Конфигуратором.</value> + + true + true + + true + + + Декорация58РасширеннаяПодсказка + 838 + Label + true + true + + Left + + + + Декорация58КонтекстноеМеню + 343 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Соединение конфигуратора2</value> + + + ru + Соединение конфигуратора2 + + + СоединениеКонфигуратора2РасширеннаяПодсказка + 837 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Панель перехода на следующий шаг режима обновления файл</value> + + + ПанельПереходаНаСледующийШагРежимаОбновленияФайлРасширеннаяПодсказка + 830 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Выбор режима обновления файл</value> + + + ru + Выбор режима обновления файл + + + ВыборРежимаОбновленияФайлРасширеннаяПодсказка + 803 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ВыборРежимаОбновленияСервер + 209 + + НадписьШапкаВыборРежимаОбнСервер + 210 + + <key>ru</key> + <value>Все готово к обновлению конфигурации!</value> + + true + true + + true + + + НадписьШапкаВыборРежимаОбнСерверРасширеннаяПодсказка + 840 + Label + true + true + + Left + + + + НадписьШапкаВыборРежимаОбнСерверКонтекстноеМеню + 211 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 12.0 + true + false + false + false + + + Left + + + + ПанельВсеГотовоСервер + 344 + + ВсеГотово1 + 345 + + Декорация43 + 212 + + <key>ru</key> + <value>Выберите режим обновления конфигурации "1С:Предприятие":</value> + + true + true + + true + + + Декорация43РасширеннаяПодсказка + 843 + Label + true + true + + Left + + + + Декорация43КонтекстноеМеню + 213 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Все готово1</value> + + + ru + Все готово1 + + + ВсеГотово1РасширеннаяПодсказка + 842 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ВсеГотовоПорядокОбновления1 + 346 + + Декорация1 + 505 + true + true + + true + + + Декорация1РасширеннаяПодсказка + 845 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 506 + true + + 4 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + + + + ВертикальнаяГруппа7 + 347 + + Декорация59 + 348 + + <key>ru</key> + <value>Для продолжения необходимо ознакомиться с порядком обновления, затем выберите режим обновления.</value> + + true + true + + true + + + Декорация59РасширеннаяПодсказка + 847 + Label + true + true + + Left + + + + Декорация59КонтекстноеМеню + 349 + true + + Label + true + true + false + + Left + + + + НадписьПорядокОбновления3 + 350 + + <key>ru</key> + <value>Порядок обновления</value> + + true + true + + true + + + НадписьПорядокОбновления3РасширеннаяПодсказка + 848 + Label + true + true + + Left + + + + НадписьПорядокОбновления3КонтекстноеМеню + 351 + true + + Label + true + true + false + + + Click + НадписьПорядокОбновленияНажатие + + true + Left + + + true + true + + true + + + ВертикальнаяГруппа7РасширеннаяПодсказка + 846 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Все готово порядок обновления1</value> + + + ru + Все готово порядок обновления1 + + + ВсеГотовоПорядокОбновления1РасширеннаяПодсказка + 844 + Label + true + true + + Left + + + Page + + auto + + + true + true + + true + + + <key>ru</key> + <value>Панель все готово сервер</value> + + + ПанельВсеГотовоСерверРасширеннаяПодсказка + 841 + Label + true + true + + Left + + + Pages + + Auto + + + + Отступ4 + 458 + + ПереключательОбновления + 214 + true + true + + true + + + Объект.РежимОбновления + + None + + OnChange + ПереключательОбновленияПриИзменении + + + ПереключательОбновленияРасширеннаяПодсказка + 850 + Label + true + true + + Left + + + + ПереключательОбновленияКонтекстноеМеню + 215 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + О&бновить конфигурацию прямо сейчас + + + 0 + + + + + ru + &Запланировать обновление конфигурации + + + 2 + + + Vertical + + + true + true + + true + + + Отступ4РасширеннаяПодсказка + 849 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + СтраницыИнформацииПерезагрузки1 + 216 + + СтраницаЗапланированнойПерезагрузки + 239 + + ПолеДатаВремяОбновления + 242 + + <key>ru</key> + <value>Дата и время</value> + + true + true + + true + + + Объект.ДатаВремяОбновления + + + ПолеДатаВремяОбновленияРасширеннаяПодсказка + 854 + Label + true + true + + Left + + + + ПолеДатаВремяОбновленияКонтекстноеМеню + 243 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Надпись51 + 240 + + <key>ru</key> + <value>Обновление будет выполнено с этого компьютера в фоновом режиме. +Питание компьютера должно быть включено в указанные дату и время.</value> + + true + true + + true + + + Надпись51РасширеннаяПодсказка + 856 + Label + true + true + + Left + + + + Надпись51КонтекстноеМеню + 241 + true + + Label + true + true + false + false + + Left + Top + 2 + + + + ПанельПочта + 248 + + ВыслатьОтчетНаПочту + 244 + + <key>ru</key> + <value>Выслать отчет на почту:</value> + + true + true + + true + + + Объект.ВыслатьОтчетНаПочту + + Right + + OnChange + ВыслатьОтчетНаПочтуПриИзменении + + + ВыслатьОтчетНаПочтуРасширеннаяПодсказка + 858 + Label + true + true + + Left + + + + ВыслатьОтчетНаПочтуКонтекстноеМеню + 245 + true + + CheckBoxField + Enter + true + Left + true + + + + АдресЭлектроннойПочты + 246 + true + true + + true + + + Объект.АдресЭлектроннойПочты + + None + + АдресЭлектроннойПочтыРасширеннаяПодсказка + 860 + Label + true + true + + Left + + + + АдресЭлектроннойПочтыКонтекстноеМеню + 247 + true + + InputField + Enter + true + Left + true + + 30 + true + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Панель почта</value> + + + ru + Панель почта + + false + + ПанельПочтаРасширеннаяПодсказка + 857 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница запланированной перезагрузки</value> + + + СтраницаЗапланированнойПерезагрузкиРасширеннаяПодсказка + 853 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаПерезагрузкиСейчас1 + 217 + + Надпись47 + 218 + + <key>ru</key> + <value>Будет произведен перезапуск и обновление "1С:Предприятия". Процесс обновления может занять от нескольких минут до часа. Не выключайте питание компьютера до завершения процесса.</value> + + true + true + + true + + + Надпись47РасширеннаяПодсказка + 863 + Label + true + true + + Left + + + + Надпись47КонтекстноеМеню + 219 + true + + Label + true + true + false + false + + Left + Top + 2 + + + + ГруппаСоединений1 + 220 + + Картинка2 + 221 + + <key>ru</key> + <value>Картинка1</value> + + true + true + + true + + + Картинка2РасширеннаяПодсказка + 865 + Label + true + true + + Left + + + + Картинка2КонтекстноеМеню + 222 + true + + 5 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + + + + ПанельАктивныеПользователи1 + 223 + + АктивныеПользователи1 + 224 + + Надпись48 + 225 + + <key>ru</key> + <value>С информационной базой сейчас работают другие пользователи. Их работа будет завершена автоматически!</value> + + true + true + + true + + + Надпись48РасширеннаяПодсказка + 868 + Label + true + true + + Left + + + + Надпись48КонтекстноеМеню + 226 + true + + Label + true + true + false + + Left + Top + + + + НадписьСписокДействий2 + 227 + + <key>ru</key> + <value>Посмотреть список активных пользователей</value> + + true + true + + true + + + НадписьСписокДействий2РасширеннаяПодсказка + 869 + Label + true + true + + Left + + + + НадписьСписокДействий2КонтекстноеМеню + 228 + true + + Label + 30 + true + true + false + + + Click + НадписьСписокДействийНажатие + + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Активные пользователи</value> + + + ru + Активные пользователи + + + АктивныеПользователи1РасширеннаяПодсказка + 867 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + АктивныеСоединения1 + 229 + + Надпись49 + 230 + + <key>ru</key> + <value>С информационной базой сейчас работают другие пользователи, а также внешние приложения. +Их работа будет завершена автоматически!</value> + + true + true + + true + + + Надпись49РасширеннаяПодсказка + 871 + Label + true + true + + Left + + + + Надпись49КонтекстноеМеню + 231 + true + + Label + true + true + false + false + + Left + + + + НадписьСписокДействий4 + 232 + + <key>ru</key> + <value>Посмотреть список активных подключений</value> + + true + true + + true + + + НадписьСписокДействий4РасширеннаяПодсказка + 872 + Label + true + true + + Left + + + + НадписьСписокДействий4КонтекстноеМеню + 233 + true + + Label + true + true + false + false + false + + + Click + НадписьСписокДействий1Нажатие + + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Активные соединения</value> + + + ru + Активные соединения + + + АктивныеСоединения1РасширеннаяПодсказка + 870 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Панель активные пользователи1</value> + + + ПанельАктивныеПользователи1РасширеннаяПодсказка + 866 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа соединений1</value> + + + ru + Группа соединений1 + + false + + ГруппаСоединений1РасширеннаяПодсказка + 864 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница перезагрузки сейчас</value> + + + ru + Страница перезагрузки сейчас + + + СтраницаПерезагрузкиСейчас1РасширеннаяПодсказка + 862 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы информации перезагрузки</value> + + 80 + + СтраницыИнформацииПерезагрузки1РасширеннаяПодсказка + 852 + Label + true + true + + Left + + + Pages + + Auto + + + + ГруппаРезервнаяКопияСервер + 539 + + Декорация13 + 540 + true + true + + true + + + Декорация13РасширеннаяПодсказка + 874 + Label + true + true + + Left + + + + Декорация13КонтекстноеМеню + 541 + true + + 4 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + НадписьРезервнаяКопияСервер + 537 + + <key>ru</key> + <value>Перед обновлением рекомендуется выполнить резервное копирование информационной базы средствами СУБД (SQL-сервера).</value> + + true + true + + true + + + НадписьРезервнаяКопияСерверРасширеннаяПодсказка + 875 + Label + true + true + + Left + + + + НадписьРезервнаяКопияСерверКонтекстноеМеню + 538 + true + + Label + true + true + false + + Left + Center + 2 + + + true + true + + true + + + <key>ru</key> + <value>Группа резервная копия сервер</value> + + + ГруппаРезервнаяКопияСерверРасширеннаяПодсказка + 873 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + НадписьОтступ2 + 398 + true + true + + true + + + НадписьОтступ2РасширеннаяПодсказка + 876 + Label + true + true + + Left + + + + НадписьОтступ2КонтекстноеМеню + 399 + true + + Label + true + true + true + false + + Left + + + + ПанельПереходаНаСледующийШагРежимаОбновленияСервер + 352 + + Сейчас + 353 + + Декорация44 + 254 + + <key>ru</key> + <value>Нажмите кнопку "Далее", чтобы перезапустить "1С:Предприятие".</value> + + true + true + + true + + + Декорация44РасширеннаяПодсказка + 879 + Label + true + true + + Left + + + + Декорация44КонтекстноеМеню + 255 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Сейчас</value> + + + ru + Сейчас + + + СейчасРасширеннаяПодсказка + 878 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + Отложить + 354 + + Декорация60 + 355 + + <key>ru</key> + <value>Нажмите кнопку "Готово", чтобы запланировать автоматическое обновление конфигурации.</value> + + true + true + + true + + + Декорация60РасширеннаяПодсказка + 881 + Label + true + true + + Left + + + + Декорация60КонтекстноеМеню + 356 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Отложить</value> + + + ru + Отложить + + + ОтложитьРасширеннаяПодсказка + 880 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + Отмена + 357 + + Декорация61 + 358 + + <key>ru</key> + <value>Нажмите кнопку "Готово", чтобы выйти из помощника обновления конфигурации.</value> + + true + true + + true + + + Декорация61РасширеннаяПодсказка + 883 + Label + true + true + + Left + + + + Декорация61КонтекстноеМеню + 359 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Отмена</value> + + + ru + Отмена + + + ОтменаРасширеннаяПодсказка + 882 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Панель перехода на следующий шаг режима обновления сервер</value> + + + ПанельПереходаНаСледующийШагРежимаОбновленияСерверРасширеннаяПодсказка + 877 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Выбор режима обновления сервер</value> + + + ru + Выбор режима обновления сервер + + + ВыборРежимаОбновленияСерверРасширеннаяПодсказка + 839 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + УспешноеОбновление + 256 + + НадписьШапкаУспешноеОбновление + 257 + + <key>ru</key> + <value>Обновление успешно завершено!</value> + + true + true + + true + + + НадписьШапкаУспешноеОбновлениеРасширеннаяПодсказка + 885 + Label + true + true + + Left + + + + НадписьШапкаУспешноеОбновлениеКонтекстноеМеню + 258 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 12.0 + true + false + false + false + + + Left + + + + Декорация46 + 259 + + <key>ru</key> + <value>Благодарим Вас за обновление "1С:Предприятие". </value> + + true + true + + true + + + Декорация46РасширеннаяПодсказка + 886 + Label + true + true + + Left + + + + Декорация46КонтекстноеМеню + 260 + true + + Label + true + true + false + + Left + + + + НадписьИнформацияОбОбновленииПриЗавершении + 522 + + <key>ru</key> + <value>Новое в этой версии</value> + + true + true + + true + + + НадписьИнформацияОбОбновленииПриЗавершенииРасширеннаяПодсказка + 887 + Label + true + true + + Left + + + + НадписьИнформацияОбОбновленииПриЗавершенииКонтекстноеМеню + 523 + true + + Label + true + true + false + + + Click + НадписьИнформацияОбОбновленииПриЗавершенииНажатие + + true + Left + Center + + + + ПанельПорядокОбновленияПриЗавершении + 261 + + Картинка3 + 262 + + <key>ru</key> + <value>Картинка3</value> + + true + true + + true + + + Картинка3РасширеннаяПодсказка + 889 + Label + true + true + + Left + + + + Картинка3КонтекстноеМеню + 263 + true + + 6 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + + + + Группа30 + 264 + + Декорация47 + 265 + + <key>ru</key> + <value>Для завершения обновления может потребоваться выполнение дополнительных действий.</value> + + true + true + + true + + + Декорация47РасширеннаяПодсказка + 891 + Label + true + true + + Left + + + + Декорация47КонтекстноеМеню + 266 + true + + Label + true + true + false + + Left + + + + НадписьПорядокОбновления2 + 267 + + <key>ru</key> + <value>Порядок обновления</value> + + true + true + + true + + + НадписьПорядокОбновления2РасширеннаяПодсказка + 892 + Label + true + true + + Left + + + + НадписьПорядокОбновления2КонтекстноеМеню + 268 + true + + Label + true + true + false + + + Click + НадписьПорядокОбновленияНажатие + + true + Left + + + true + true + + true + + + Группа30РасширеннаяПодсказка + 890 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Панель порядок обновления при завершении</value> + + + ru + Панель порядок обновления при завершении + + + ПанельПорядокОбновленияПриЗавершенииРасширеннаяПодсказка + 888 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + Отступ45 + 389 + true + true + + true + + + Отступ45РасширеннаяПодсказка + 893 + Label + true + true + + Left + + + + Отступ45КонтекстноеМеню + 390 + true + + Label + true + true + true + false + + Left + + + + НадписьСообщениеДалее2 + 269 + + <key>ru</key> + <value>Нажмите кнопку "Готово", чтобы закрыть помощник обновления конфигурации.</value> + + true + true + + true + + + НадписьСообщениеДалее2РасширеннаяПодсказка + 894 + Label + true + true + + Left + + + + НадписьСообщениеДалее2КонтекстноеМеню + 270 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Успешное обновление</value> + + + ru + Успешное обновление + + + УспешноеОбновлениеРасширеннаяПодсказка + 884 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + НеуспешноеОбновление + 271 + + НадписьШапкаНеудачноеОбновление + 272 + + <key>ru</key> + <value>Не удалось провести обновление!</value> + + true + true + + true + + + НадписьШапкаНеудачноеОбновлениеРасширеннаяПодсказка + 896 + Label + true + true + + Left + + + + НадписьШапкаНеудачноеОбновлениеКонтекстноеМеню + 273 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 12.0 + true + false + false + false + + + Left + + + + Надпись54 + 274 + + <key>ru</key> + <value>Во время обновления конфигурации 1С:Предприятие произошли ошибки. Информация об ошибках сохранена в журнал регистрации. Рекомендуется обратиться к системному администратору.</value> + + true + true + + true + + + Надпись54РасширеннаяПодсказка + 897 + Label + true + true + + Left + + + + Надпись54КонтекстноеМеню + 275 + true + + Label + true + true + false + + Left + Top + 2 + + + + НадписьОткрытьЖурналРегистрации + 279 + + <key>ru</key> + <value>Перейти в журнал регистрации</value> + + true + true + + true + + + НадписьОткрытьЖурналРегистрацииРасширеннаяПодсказка + 898 + Label + true + true + + Left + + + + НадписьОткрытьЖурналРегистрацииКонтекстноеМеню + 280 + true + + Label + true + true + false + + + Click + НадписьОткрытьЖурналРегистрацииНажатие + + true + Left + Top + + + + ОтступНеуспешноеОбновление + 391 + true + true + + true + + + ОтступНеуспешноеОбновлениеРасширеннаяПодсказка + 899 + Label + true + true + + Left + + + + ОтступНеуспешноеОбновлениеКонтекстноеМеню + 392 + true + + Label + true + true + true + false + + Left + + + + Надпись56 + 281 + + <key>ru</key> + <value>Нажмите кнопку "Готово" для выхода из помощника обновления конфигурации, или +вернитесь назад, чтобы попытаться провести обновление еще раз.</value> + + true + true + + true + + + Надпись56РасширеннаяПодсказка + 900 + Label + true + true + + Left + + + + Надпись56КонтекстноеМеню + 282 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Неуспешное обновление</value> + + + ru + Неуспешное обновление + + + НеуспешноеОбновлениеРасширеннаяПодсказка + 895 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ПараметрыАвторизации + 298 + + НадписьШапкаПараметрыАвторизации + 299 + + <key>ru</key> + <value>Параметры авторизации</value> + + true + true + + true + + + НадписьШапкаПараметрыАвторизацииРасширеннаяПодсказка + 902 + Label + true + true + + Left + + + + НадписьШапкаПараметрыАвторизацииКонтекстноеМеню + 300 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 12.0 + true + false + false + false + + + Left + + + + СтраницыНадписиПроверкиПодключения + 511 + + ПочтиВсеГотово + 512 + + Картинка6 + 302 + + <key>ru</key> + <value>Картинка6</value> + + true + true + + true + + + Картинка6РасширеннаяПодсказка + 905 + Label + true + true + + Left + + + + Картинка6КонтекстноеМеню + 303 + true + + 6 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + Декорация53 + 304 + + <key>ru</key> + <value>Почти все готово к обновлению конфигурации! +Для продолжения необходимо указать параметры авторизации и подключения к серверу. </value> + + true + true + + true + + + Декорация53РасширеннаяПодсказка + 906 + Label + true + true + + Left + + + + Декорация53КонтекстноеМеню + 305 + true + + Label + true + true + false + + Left + Center + 2 + + + true + true + + true + + + <key>ru</key> + <value>Почти все готово</value> + + + ru + Почти все готово + + + ПочтиВсеГотовоРасширеннаяПодсказка + 904 + Label + true + true + + Left + + + Page + + auto + + + + ОбнаруженаОшибкаПодключения + 513 + + ГоризонтальнаяГруппа10 + 568 + + Картинка7 + 542 + true + true + + true + + + Картинка7РасширеннаяПодсказка + 909 + Label + true + true + + Left + + + + Картинка7КонтекстноеМеню + 543 + true + + 6 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + + + + ОбнаруженнаяОшибкаПодключения + 514 + + <key>ru</key> + <value>Ошибка проверки подключения</value> + + true + true + + true + + + ОбнаруженнаяОшибкаПодключения + + + ОбнаруженнаяОшибкаПодключенияРасширеннаяПодсказка + 910 + Label + true + true + + Left + + + + ОбнаруженнаяОшибкаПодключенияКонтекстноеМеню + 515 + true + + InputField + true + Center + Enter + true + Left + true + + true + 3 + true + true + true + true + true + true + + Style.FormBackColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Горизонтальная группа10</value> + + false + + ГоризонтальнаяГруппа10РасширеннаяПодсказка + 908 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ПанельЖурналРегистрации2 + 560 + + Картинка9 + 561 + + <key>ru</key> + <value>Картинка4</value> + + true + true + + true + + + Картинка9РасширеннаяПодсказка + 913 + Label + true + true + + Left + + + + Картинка9КонтекстноеМеню + 562 + true + + 6 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + ВертикальнаяГруппаНадписиЖР1 + 563 + + НадписьИнфоЖР2 + 564 + + <key>ru</key> + <value>Подробности см. в Журнале регистрации. Рекомендуется обратиться к системному администратору.</value> + + true + true + + true + + + НадписьИнфоЖР2РасширеннаяПодсказка + 915 + Label + true + true + + Left + + + + НадписьИнфоЖР2КонтекстноеМеню + 565 + true + + Label + true + true + false + false + + Left + + + + НадписьОткрытьЖурналРегистрации3 + 566 + + <key>ru</key> + <value>Перейти в журнал регистрации</value> + + true + true + + true + + + НадписьОткрытьЖурналРегистрации3РасширеннаяПодсказка + 916 + Label + true + true + + Left + + + + НадписьОткрытьЖурналРегистрации3КонтекстноеМеню + 567 + true + + Label + true + true + true + true + false + + + Click + НадписьОткрытьЖурналРегистрацииНажатие + + true + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Вертикальная группа надписи ЖР</value> + + false + + ВертикальнаяГруппаНадписиЖР1РасширеннаяПодсказка + 914 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Горизонтальная группа2</value> + + + ru + Горизонтальная группа2 + + false + + ПанельЖурналРегистрации2РасширеннаяПодсказка + 912 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Обнаружена ошибка подключения</value> + + true + + ОбнаруженаОшибкаПодключенияРасширеннаяПодсказка + 907 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы надписи проверки подключения</value> + + false + + СтраницыНадписиПроверкиПодключенияРасширеннаяПодсказка + 903 + Label + true + true + + Left + + + Pages + + Auto + + + + ГруппаComcntr + 406 + + НадписьОбновитьВерсиюКомпоненты + 403 + + <key>ru</key> + <value>При ошибке версии компоненты "comcntr", рекомендуется выполнить ее перерегистрацию (потребуется перезапуск сеанса).</value> + + true + true + + true + + + НадписьОбновитьВерсиюКомпонентыРасширеннаяПодсказка + 918 + Label + true + true + + Left + + + + НадписьОбновитьВерсиюКомпонентыКонтекстноеМеню + 404 + true + + Label + true + true + false + + Left + 2 + + + + КнопкаОбновитьВерсиюКомпоненты + 405 + + <key>ru</key> + <value>Исправить</value> + + true + true + + true + + false + + КнопкаОбновитьВерсиюКомпонентыРасширеннаяПодсказка + 919 + Label + true + true + + Left + + + UsualButton + Form.Command.ОбновитьВерсиюКомпоненты + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ГруппаComcntrРасширеннаяПодсказка + 917 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ПанельАвторизацияИБ + 306 + + ИмяАдминистратораИБ + 307 + + <key>ru</key> + <value>Имя</value> + + true + false + + true + + + Объект.ИмяАдминистратораИБ + + + ИмяАдминистратораИБРасширеннаяПодсказка + 921 + Label + true + true + + Left + + + + ИмяАдминистратораИБКонтекстноеМеню + 308 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + Normal + + + + Группа35 + 313 + + Группа36 + 314 + + ПолеПарольАдминистратораИБ + 309 + + <key>ru</key> + <value>Пароль</value> + + true + true + + true + + + Объект.ПарольАдминистратораИБ + + + ПолеПарольАдминистратораИБРасширеннаяПодсказка + 925 + Label + true + true + + Left + + + + ПолеПарольАдминистратораИБКонтекстноеМеню + 310 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + true + Normal + + + + ПолеПарольАдминистратораИБПроверка + 311 + + <key>ru</key> + <value>Пароль (проверка)</value> + + true + true + + true + + + Объект.ПарольАдминистратораИБПроверка + + + ПолеПарольАдминистратораИБПроверкаРасширеннаяПодсказка + 927 + Label + true + true + + Left + + + + ПолеПарольАдминистратораИБПроверкаКонтекстноеМеню + 312 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + true + Normal + + + true + true + + true + + + Группа36РасширеннаяПодсказка + 924 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ПанельПредупреждениеОWindowsАвторизации + 360 + + Декорация54 + 315 + + <key>ru</key> + <value>Для этого пользователя дополнительно к аутентификации Windows будет явно включена аутентификация по имени и паролю.</value> + + true + true + + true + + + Декорация54РасширеннаяПодсказка + 930 + Label + true + true + + Left + + + + Декорация54КонтекстноеМеню + 316 + true + + Label + true + 2 + true + false + + Left + 2 + + + true + true + + true + + + <key>ru</key> + <value>Панель предупреждение о windows авторизации</value> + + + ru + Панель предупреждение о windows авторизации + + true + + ПанельПредупреждениеОWindowsАвторизацииРасширеннаяПодсказка + 929 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + Группа35РасширеннаяПодсказка + 923 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Авторизация администратора информационной базы</value> + + + ru + Панель авторизация ИБ + + + ПанельАвторизацияИБРасширеннаяПодсказка + 920 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + StrongSeparation + true + true + auto + Auto + Auto + + + + ПанельАвторизацияКластераСерверов + 365 + + ПанельАдминистраторКластераСерверов + 609 + + КластерТребуетАутентификации + 317 + + <key>ru</key> + <value>&Требуется авторизация для подключения к кластеру серверов</value> + + true + true + + true + + + Объект.КластерТребуетАутентификации + + Right + + OnChange + КластерТребуетАутентификацииПриИзменении + + + КластерТребуетАутентификацииРасширеннаяПодсказка + 933 + Label + true + true + + Left + + + + КластерТребуетАутентификацииКонтекстноеМеню + 318 + true + + CheckBoxField + Enter + true + Left + true + + + + ПанельДоступККластеру + 319 + + ИмяАдминистратораКластера + 320 + + <key>ru</key> + <value>Пользователь</value> + + true + true + + true + + + Объект.ИмяАдминистратораКластера + + + ИмяАдминистратораКластераРасширеннаяПодсказка + 936 + Label + true + true + + Left + + + + ИмяАдминистратораКластераКонтекстноеМеню + 321 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + Normal + + + + ПарольАдминистратораКластера + 322 + + <key>ru</key> + <value>Пароль</value> + + true + true + + true + + + Объект.ПарольАдминистратораКластера + + + ПарольАдминистратораКластераРасширеннаяПодсказка + 938 + Label + true + true + + Left + + + + ПарольАдминистратораКластераКонтекстноеМеню + 323 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Имя и пароль администратора кластера серверов</value> + + + ru + Панель доступ к кластеру + + + ПанельДоступККластеруРасширеннаяПодсказка + 935 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + StrongSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Панель администратор кластера серверов</value> + + + ru + Панель администратор кластера серверов + + + ПанельАдминистраторКластераСерверовРасширеннаяПодсказка + 932 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ПанельПортыСервера + 455 + + НестандартныеПортыСервера + 324 + true + true + + true + + + Объект.НестандартныеПортыСервера + + Right + + OnChange + НестандартныеПортыСервераПриИзменении + + + НестандартныеПортыСервераРасширеннаяПодсказка + 941 + Label + true + true + + Left + + + + НестандартныеПортыСервераКонтекстноеМеню + 325 + true + + CheckBoxField + Enter + true + Left + true + + + + ПанельНестандартныеПортыСервера + 326 + + ПортКластераСерверов + 327 + + <key>ru</key> + <value>&Кластер серверов</value> + + true + true + + true + + + Объект.ПортКластераСерверов + + + ПортКластераСерверовРасширеннаяПодсказка + 944 + Label + true + true + + Left + + + + ПортКластераСерверовКонтекстноеМеню + 328 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПортАгентаСервера + 329 + + <key>ru</key> + <value>&Агент сервера</value> + + true + true + + true + + + Объект.ПортАгентаСервера + + + ПортАгентаСервераРасширеннаяПодсказка + 946 + Label + true + true + + Left + + + + ПортАгентаСервераКонтекстноеМеню + 330 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Номера портов</value> + + + ПанельНестандартныеПортыСервераРасширеннаяПодсказка + 943 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + StrongSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Панель порты сервера</value> + + Ctrl+S + false + + ПанельПортыСервераРасширеннаяПодсказка + 940 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Панель авторизация кластера серверов</value> + + + ru + Панель авторизация кластера серверов + + + ПанельАвторизацияКластераСерверовРасширеннаяПодсказка + 931 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + НадписьОтступ1 + 396 + true + true + + true + + + НадписьОтступ1РасширеннаяПодсказка + 948 + Label + true + true + + Left + + + + НадписьОтступ1КонтекстноеМеню + 397 + true + + Label + true + true + true + false + + Left + + + + НадписьСообщениеДалее3 + 331 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для выбора режима обновления конфигурации.</value> + + true + true + + true + + + НадписьСообщениеДалее3РасширеннаяПодсказка + 949 + Label + true + true + + Left + + + + НадписьСообщениеДалее3КонтекстноеМеню + 332 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Параметры авторизации</value> + + + ru + Параметры авторизации + + + ПараметрыАвторизацииРасширеннаяПодсказка + 901 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ДополнительныеНастройки + 407 + + НадписьШапкаДополнительныеНастройки + 408 + + <key>ru</key> + <value>Не удалось проверить подключение к базе</value> + + true + true + + true + + + НадписьШапкаДополнительныеНастройкиРасширеннаяПодсказка + 951 + Label + true + true + + Left + + + + НадписьШапкаДополнительныеНастройкиКонтекстноеМеню + 409 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 12.0 + true + false + false + false + + + Left + + + + ГоризонтальнаяГруппаОшибкаПодключения + 581 + + Картинка12 + 582 + true + true + + true + + + Картинка12РасширеннаяПодсказка + 953 + Label + true + true + + Left + + + + Картинка12КонтекстноеМеню + 583 + true + + 6 + true + 2 + true + false + + + CommonPicture.Предупреждение32 + + + + + ОбнаруженнаяОшибкаПодключения1 + 584 + + <key>ru</key> + <value>Ошибка проверки подключения</value> + + true + true + + true + + + ОбнаруженнаяОшибкаПодключения + + None + + ОбнаруженнаяОшибкаПодключения1РасширеннаяПодсказка + 954 + Label + true + true + + Left + + + + ОбнаруженнаяОшибкаПодключения1КонтекстноеМеню + 585 + true + + InputField + true + Center + Enter + true + Left + true + + true + 3 + true + true + true + true + true + true + + Style.FormBackColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Горизонтальная группа10</value> + + false + + ГоризонтальнаяГруппаОшибкаПодключенияРасширеннаяПодсказка + 952 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаComcntrФайловыйРежим + 410 + + НадписьОбновитьВерсиюКомпоненты1 + 411 + + <key>ru</key> + <value>При ошибке версии компоненты "comcntr", рекомендуется выполнить ее перерегистрацию (потребуется перезапуск сеанса).</value> + + true + true + + true + + + ru + Возможно необходимо обновить версию компоненты "comcntr". При этом потребуется перезапустить сеанс 1С. Для этого нажмите здесь + + + НадписьОбновитьВерсиюКомпоненты1РасширеннаяПодсказка + 957 + Label + true + true + + Left + + + + НадписьОбновитьВерсиюКомпоненты1КонтекстноеМеню + 412 + true + + Label + true + true + false + + Left + 2 + + + + КнопкаОбновитьВерсиюКомпоненты1 + 413 + + <key>ru</key> + <value>Исправить</value> + + true + true + + true + + false + + КнопкаОбновитьВерсиюКомпоненты1РасширеннаяПодсказка + 958 + Label + true + true + + Left + + + UsualButton + Form.Command.ОбновитьВерсиюКомпоненты + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ГруппаComcntrФайловыйРежимРасширеннаяПодсказка + 956 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + ПанельАвторизацияИБ1 + 597 + + ИмяАдминистратораИБ1 + 598 + + <key>ru</key> + <value>Имя</value> + + true + false + + true + + + Объект.ИмяАдминистратораИБ + + + ИмяАдминистратораИБ1РасширеннаяПодсказка + 960 + Label + true + true + + Left + + + + ИмяАдминистратораИБ1КонтекстноеМеню + 599 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + Normal + + + + Группа37 + 600 + + Группа38 + 601 + + ПолеПарольАдминистратораИБ1 + 602 + + <key>ru</key> + <value>Пароль</value> + + true + true + + true + + + Объект.ПарольАдминистратораИБ + + + ПолеПарольАдминистратораИБ1РасширеннаяПодсказка + 964 + Label + true + true + + Left + + + + ПолеПарольАдминистратораИБ1КонтекстноеМеню + 603 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + true + Normal + + + + ПолеПарольАдминистратораИБПроверка1 + 604 + + <key>ru</key> + <value>Пароль (проверка)</value> + + true + true + + true + + + Объект.ПарольАдминистратораИБПроверка + + + ПолеПарольАдминистратораИБПроверка1РасширеннаяПодсказка + 966 + Label + true + true + + Left + + + + ПолеПарольАдминистратораИБПроверка1КонтекстноеМеню + 605 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + true + Normal + + + true + true + + true + + + Группа38РасширеннаяПодсказка + 963 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ПанельПредупреждениеОWindowsАвторизации1 + 606 + + Декорация55 + 607 + + <key>ru</key> + <value>Для этого пользователя дополнительно к аутентификации Windows будет явно включена аутентификация по имени и паролю.</value> + + true + true + + true + + + Декорация55РасширеннаяПодсказка + 969 + Label + true + true + + Left + + + + Декорация55КонтекстноеМеню + 608 + true + + Label + true + 2 + true + false + + Left + 2 + + + true + true + + true + + + <key>ru</key> + <value>Панель предупреждение о windows авторизации</value> + + + ru + Панель предупреждение о windows авторизации + + true + + ПанельПредупреждениеОWindowsАвторизации1РасширеннаяПодсказка + 968 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + Группа37РасширеннаяПодсказка + 962 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Авторизация администратора информационной базы</value> + + + ru + Панель авторизация ИБ + + + ПанельАвторизацияИБ1РасширеннаяПодсказка + 959 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + StrongSeparation + true + true + auto + Auto + Auto + + + + ПанельЖурналРегистрации4 + 573 + + Картинка11 + 574 + + <key>ru</key> + <value>Картинка4</value> + + true + true + + true + + + Картинка11РасширеннаяПодсказка + 971 + Label + true + true + + Left + + + + Картинка11КонтекстноеМеню + 575 + true + + 6 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + ВертикальнаяГруппаНадписиЖР3 + 576 + + Декорация17 + 577 + + <key>ru</key> + <value>Подробности см. в Журнале регистрации. Рекомендуется обратиться к системному администратору.</value> + + true + true + + true + + + Декорация17РасширеннаяПодсказка + 973 + Label + true + true + + Left + + + + Декорация17КонтекстноеМеню + 578 + true + + Label + true + 1 + true + false + + Left + + + + НадписьПерейтиВЖурналРегистрации1 + 579 + + <key>ru</key> + <value>Перейти в журнал регистрации</value> + + true + true + + true + + + НадписьПерейтиВЖурналРегистрации1РасширеннаяПодсказка + 974 + Label + true + true + + Left + + + + НадписьПерейтиВЖурналРегистрации1КонтекстноеМеню + 580 + true + + Label + true + true + true + false + + + Click + НадписьПерейтиВЖурналРегистрацииНажатие + + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Вертикальная группа надписи ЖР</value> + + false + + ВертикальнаяГруппаНадписиЖР3РасширеннаяПодсказка + 972 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Горизонтальная группа2</value> + + + ru + Горизонтальная группа2 + + false + + ПанельЖурналРегистрации4РасширеннаяПодсказка + 970 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Дополнительные настройки</value> + + + ru + Дополнительные настройки + + + ДополнительныеНастройкиРасширеннаяПодсказка + 950 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы помощника</value> + + + ru + Страницы помощника + + + СтраницыПомощникаРасширеннаяПодсказка + 615 + Label + true + true + + Left + + + Pages + + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + КнопкаНазад + 19 + true + true + + true + + false + + КнопкаНазадРасширеннаяПодсказка + 612 + Label + true + true + + Left + + + Form.Command.Назад + Normal + Auto + true + true + UserCmds + Auto + + + КнопкаДалее + 20 + true + true + + true + + false + + КнопкаДалееРасширеннаяПодсказка + 613 + Label + true + true + + Left + + + Form.Command.Далее + Auto + true + true + true + UserCmds + Auto + + + КнопкаЗакрыть + 364 + true + true + + true + + false + + КнопкаЗакрытьРасширеннаяПодсказка + 614 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + Auto + + Right + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + + OnClose + ПриЗакрытии + + Abort + Cancel + CustomizeForm + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + 100 + DontBlock + true + true + Vertical + true + 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 + + Boolean + + + true + + + true + + + + ВыполнитьОбновление + + <key>ru</key> + <value>Выполнить обновление</value> + + 9 + + Boolean + + + true + + + true + + + + ДискИТС + + <key>ru</key> + <value>Диск ИТС</value> + + 15 + + String + + + + true + + + true + + ShowError + + + СписокФайловДляПолучения + + <key>ru</key> + <value>Список файлов для получения</value> + + 20 + + ValueList + + + true + + + true + + + + + + + ВосстановлениеРезультатовПредЗапуска + + <key>ru</key> + <value>Восстановление результатов пред запуска</value> + + 22 + + Boolean + + + true + + + true + + + + РезультатПолученияФайлов + + <key>ru</key> + <value>Результат получения файлов</value> + + 24 + + + true + + + true + + + + ДоступноеОбновление + + <key>ru</key> + <value>Доступное обновление</value> + + 12 + + + true + + + true + + + + ИмяФайлаИнформацияОбОбновлении + + <key>ru</key> + <value>Имя файла информация об обновлении</value> + + 13 + + String + + + + true + + + true + + + + НадписьНеобходимыеДискиИТС + + <key>ru</key> + <value>Надпись необходимые диски ИТС</value> + + 4 + + String + + + + true + + + true + + + + ПереченьРелизовНаДискахИТС + + <key>ru</key> + <value>Общий перечень релизов на дисках ИТС</value> + + 6 + + String + + + + true + + + true + + + + ПоследняяВерсияКонфигурации + + <key>ru</key> + <value>Последняя версия конфигурации</value> + + 7 + + String + + + + true + + + true + + + + ПутьКФайламОбновленияНаДискеИТС + + <key>ru</key> + <value>Путь к файлам обновления на диске ИТС</value> + + 10 + + String + + + + true + + + true + + + + ОбнаруженнаяОшибкаПодключения + + <key>ru</key> + <value>Обнаруженная ошибка подключения</value> + + 14 + + String + + + + true + + + true + + + + ОчищатьДоступныеОбновления + + <key>ru</key> + <value>Очищать доступные обновления</value> + + 16 + + 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 + + + + + + +
    diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Module.bsl new file mode 100644 index 000000000..8354ea1a1 --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Module.bsl @@ -0,0 +1,2893 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Пользователи.ПрерватьВыполнениеЕслиАвторизованВнешнийПользователь(); + + // Установка признака выполнения обновления по завершении помощника. + ВыполнитьОбновление = Ложь; + + // Если это первый запуск после обновления конфигурации, то запоминаем и сбрасываем статус. + Объект.РезультатОбновления = ОбновлениеКонфигурации.ОбновлениеКонфигурацииУспешно(); + Если Объект.РезультатОбновления <> Неопределено Тогда + ОбновлениеКонфигурации.СброситьСтатусОбновленияКонфигурации(); + КонецЕсли; + + ОбновлениеКонфигурации.ПриЗапускеПомощникаОбновленияКонфигурации(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + #Если ВебКлиент Тогда + Отказ = Истина; + Предупреждение(НСтр("ru = 'Обновление конфигурации информационной базы недоступно в веб-клиенте.'")); + Возврат; + #КонецЕсли + + ВосстановитьНастройкиОбновленияКонфигурации(); + + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + ИмяСтраницы = Страницы.ДоброПожаловать.Имя; + + Если ДоступноеОбновлениеКонфигурации <> Неопределено Тогда + ФлагАвтоПереходаНаСтраницуСОбновлением = Неопределено; + ДоступноеОбновлениеКонфигурации.Свойство("ФлагАвтоПереходаНаСтраницуСОбновлением", ФлагАвтоПереходаНаСтраницуСОбновлением); + Если ФлагАвтоПереходаНаСтраницуСОбновлением = Истина Тогда + Если Объект.ИсточникОбновления = 2 И Объект.НуженФайлОбновления = 0 Тогда + ИмяСтраницы = Страницы.ФайлОбновления.Имя; + ИначеЕсли Объект.ИсточникОбновления = 0 Тогда + ВремяПолученияОбновления = Неопределено; + ДоступноеОбновлениеКонфигурации.Свойство("ВремяПолученияОбновления", ВремяПолученияОбновления); + Если ВремяПолученияОбновления <> Неопределено И ТекущаяДата() - ВремяПолученияОбновления < 30 Тогда + ИмяСтраницы = ПолучитьФайлыОбновленияЧерезИнтернет(Истина); + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если Объект.КодЗадачиПланировщика <> 0 Тогда + Если ПолучитьЗадачуПланировщика(Объект.КодЗадачиПланировщика) = Неопределено Тогда + Объект.КодЗадачиПланировщика = 0; + КонецЕсли; + КонецЕсли; + + // Если форма открывается при запуске программы после обновления + Если Объект.РезультатОбновления <> Неопределено Тогда + + ИмяФайлаПорядокОбновления = ПолучитьИмяЛокальногоФайлаПорядкаОбновления(); + Если НЕ ФайлСуществуетНаКлиенте(ИмяФайлаПорядокОбновления) Тогда + ИмяФайлаПорядокОбновления = ""; + КонецЕсли; + + ИмяФайлаИнформацияОбОбновлении = ПолучитьИмяЛокальногоФайлаОписанияОбновления(); + Если НЕ ФайлСуществуетНаКлиенте(ИмяФайлаИнформацияОбОбновлении) Тогда + ИмяФайлаПорядокОбновления = ""; + КонецЕсли; + + ИмяСтраницы = ? (Объект.РезультатОбновления, Страницы.УспешноеОбновление.Имя, Страницы.НеуспешноеОбновление.Имя); + Объект.РезультатОбновления = Неопределено; + + Иначе + Если НЕ ОбновлениеКонфигурацииКлиентПереопределяемый.ГотовностьКОбновлениюКонфигурации(Истина) Тогда + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Конфигурация не может быть обновлена. Завершение проверки обновления.'"), "Информация"); + Отказ = Истина; + Возврат; + КонецЕсли; + + Если Объект.КодЗадачиПланировщика <> 0 Тогда + ПараметрОтказа = Ложь; // не используется в этом случае + ИмяСтраницы = ВосстановитьРезультатыПредыдущегоЗапуска(ПараметрОтказа); + ИначеЕсли СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.КонфигурацияИзменена И + Объект.ИсточникОбновления = 2 Тогда + Объект.НуженФайлОбновления = 0; + ИмяСтраницы = Страницы.ФайлОбновления.Имя; + ИначеЕсли Объект.ПропускатьПриветствие = Истина И Объект.ИсточникОбновления = 0 Тогда + ИмяСтраницы = ОбработатьСтраницуДоброПожаловать(Истина); + КонецЕсли + КонецЕсли; + + ПередОткрытиемСтраницы(Страницы[ИмяСтраницы]); + Элементы.СтраницыПомощника.ТекущаяСтраница = Страницы[ИмяСтраницы]; +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии() + + ФлагАвтоПереходаНаСтраницуСОбновлением = Неопределено; + Если ДоступноеОбновлениеКонфигурации <> Неопределено Тогда + ДоступноеОбновлениеКонфигурации.Свойство("ФлагАвтоПереходаНаСтраницуСОбновлением", ФлагАвтоПереходаНаСтраницуСОбновлением); + Если ФлагАвтоПереходаНаСтраницуСОбновлением = Истина Тогда + ДоступноеОбновлениеКонфигурации.ФлагАвтоПереходаНаСтраницуСОбновлением = Ложь; + КонецЕсли; + КонецЕсли; + + // Сохранение настроек обновления. + СохранитьНастройкиОбновленияКонфигурации(); + + // Выполнение обновления конфигурации. + Если ВыполнитьОбновление Тогда + ВыполнитьОбновлениеКонфигурации(); + КонецЕсли; + + // запись событий ЖР + Если СообщенияДляЖурналаРегистрации <> Неопределено И СообщенияДляЖурналаРегистрации.Количество() > 0 Тогда + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура КнопкаНазадНажатие(Команда) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + ТекущаяСтраница = Элементы.СтраницыПомощника.ТекущаяСтраница; + НоваяТекущаяСтраница = ТекущаяСтраница; + + Если ТекущаяСтраница = Страницы.ДоброПожаловать Тогда + НоваяТекущаяСтраница = Страницы.ДоброПожаловать; + ИначеЕсли ТекущаяСтраница = Страницы.ПодключениеКИнтернет Тогда + НоваяТекущаяСтраница = Страницы.ДоброПожаловать; + ИначеЕсли ТекущаяСтраница = Страницы.ПодключениеКСайту Тогда + НоваяТекущаяСтраница = Страницы.ДоступноеОбновление; + ИначеЕсли ТекущаяСтраница = Страницы.ДоступноеОбновление Тогда + НоваяТекущаяСтраница = Страницы.ДоброПожаловать; + Если Объект.ИсточникОбновления = 1 Тогда // диск ИТС + НоваяТекущаяСтраница = Страницы.МестоположениеДискаИТС; + КонецЕсли; + ИначеЕсли ТекущаяСтраница = Страницы.ОбновленияНеОбнаружено Тогда + НоваяТекущаяСтраница = Страницы.ДоброПожаловать; + Если Объект.ИсточникОбновления = 1 Тогда // диск ИТС + НоваяТекущаяСтраница = Страницы.МестоположениеДискаИТС; + КонецЕсли; + ИначеЕсли ТекущаяСтраница = Страницы.ДлительнаяОперация Тогда + НоваяТекущаяСтраница = Страницы.ДоброПожаловать; + ИначеЕсли ТекущаяСтраница = Страницы.ВыборРежимаОбновленияФайл ИЛИ + ТекущаяСтраница = Страницы.ВыборРежимаОбновленияСервер ИЛИ + ТекущаяСтраница = Страницы.ПараметрыАвторизации ИЛИ + ТекущаяСтраница = Страницы.ДополнительныеНастройки Тогда + Если Объект.ИсточникОбновления = 0 Тогда // интернет + НоваяТекущаяСтраница = Страницы.ДоступноеОбновление; + ИначеЕсли Объект.ИсточникОбновления = 1 Тогда // диск ИТС + НоваяТекущаяСтраница = Страницы.ДоброПожаловать; + Иначе // файл + НоваяТекущаяСтраница = Страницы.ФайлОбновления; + КонецЕсли; + ИначеЕсли ТекущаяСтраница = Страницы.УспешноеОбновление Тогда + НоваяТекущаяСтраница = Страницы.ДоброПожаловать; + Если Объект.ИсточникОбновления = 1 Тогда // диск ИТС + НоваяТекущаяСтраница = Страницы.МестоположениеДискаИТС; + КонецЕсли; + ИначеЕсли ТекущаяСтраница = Страницы.НеуспешноеОбновление Тогда + НоваяТекущаяСтраница = Страницы.ДоброПожаловать; + Если Объект.ИсточникОбновления = 1 Тогда // диск ИТС + НоваяТекущаяСтраница = Страницы.МестоположениеДискаИТС; + КонецЕсли; + ИначеЕсли ТекущаяСтраница = Страницы.ФайлОбновления Тогда + НоваяТекущаяСтраница = Страницы.ДоброПожаловать; + ИначеЕсли ТекущаяСтраница = Страницы.ДоступноеОбновление Тогда + НоваяТекущаяСтраница = Страницы.ДоброПожаловать; + ИначеЕсли ТекущаяСтраница = Страницы.МестоположениеДискаИТС Тогда + НоваяТекущаяСтраница = Страницы.ДоброПожаловать; + КонецЕсли; + + ПередОткрытиемСтраницы(НоваяТекущаяСтраница); + + Элементы.СтраницыПомощника.ТекущаяСтраница = НоваяТекущаяСтраница; + +КонецПроцедуры + +&НаКлиенте +Процедура КнопкаДалееНажатие(Команда) + ФлагЗавершенияРаботы = Ложь; + ОбработатьНажатиеКнопкиДалее(ФлагЗавершенияРаботы); + Если ФлагЗавершенияРаботы Тогда + ОбновлениеКонфигурацииКлиентПереопределяемый.ПередЗавершениемРаботыСистемы(); + ЗавершитьРаботуСистемы(); + Конецесли; +КонецПроцедуры + +&НаКлиенте +Процедура НадписьКакОформитьПодпискуИТСНажатие(Элемент) + ОбновлениеКонфигурацииКлиент.ОткрытьВебСтраницу("http://its.1c.ru/about.php?section=how"); +КонецПроцедуры + +&НаКлиенте +Процедура НадписьПодробнееОбИТСНажатие(Элемент) + ОбновлениеКонфигурацииКлиент.ОткрытьВебСтраницу("http://its.1c.ru/about.php"); +КонецПроцедуры + +&НаКлиенте +Процедура НадписьИнформацияОбОбновленииНажатие(Элемент) + Если НЕ ПустаяСтрока(ИмяФайлаИнформацияОбОбновлении) Тогда + ОбновлениеКонфигурацииКлиент.ОткрытьВебСтраницу(ИмяФайлаИнформацияОбОбновлении); + Иначе + Предупреждение(НСтр("ru = 'Информация об обновлении отсутствует.'")); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура НадписьПорядокОбновленияНажатие(Элемент) + Если НЕ ПустаяСтрока(ИмяФайлаПорядокОбновления) Тогда + ОбновлениеКонфигурацииКлиент.ОткрытьВебСтраницу(ИмяФайлаПорядокОбновления); + Иначе + Предупреждение(НСтр("ru = 'Описание порядка обновления отсутствует.'")); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура НадписьСписокДействийНажатие(Элемент) + ОткрытьФормуМодально("Обработка.АктивныеПользователи.Форма.ФормаСпискаАктивныхПользователей"); + ПередОткрытиемСтраницы(); +КонецПроцедуры + +&НаКлиенте +Процедура НадписьСписокДействий1Нажатие(Элемент) + ОткрытьФормуМодально("Обработка.АктивныеПользователи.Форма.ФормаСпискаАктивныхПользователей"); + ПередОткрытиемСтраницы(); +КонецПроцедуры + +&НаКлиенте +Процедура НадписьСписокДействий3Нажатие(Элемент) + ОткрытьФормуМодально("Обработка.АктивныеПользователи.Форма.ФормаСпискаАктивныхПользователей"); + ПередОткрытиемСтраницы(); +КонецПроцедуры + +&НаКлиенте +Процедура ПереключательНуженФайлОбновленияПриИзменении(Элемент) + ПередОткрытиемСтраницы(); +КонецПроцедуры + +&НаКлиенте +Процедура ПолеФайлОбновленияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + Диалог.Каталог = ОбновлениеКонфигурацииКлиент.ПолучитьКаталогФайла(Объект.ИмяФайлаОбновления); + Диалог.ПроверятьСуществованиеФайла = Истина; + Диалог.Фильтр = НСтр("ru = 'Все файлы поставки (*.cf*;*.cfu)|*.cf*;*.cfu|Файлы поставки конфигурации (*.cf)|*.cf|Файлы поставки обновления конфигурации(*.cfu)|*.cfu'"); + Диалог.Заголовок = НСтр("ru = 'Выбор поставки обновления конфигурации'"); + + Если Диалог.Выбрать() Тогда + Объект.ИмяФайлаОбновления = Диалог.ПолноеИмяФайла; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура НадписьИнформацияОПолученииДоступаНажатие(Элемент) + ОбновлениеКонфигурацииКлиент.ОткрытьВебСтраницу(ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().АдресСтраницыИнформацииОПолученииДоступаКПользовательскомуСайту); +КонецПроцедуры + +&НаКлиенте +Процедура НадписьРезервнаяКопияНажатие(Элемент) + ПараметрыФормы = Новый Структура("СоздаватьРезервнуюКопию, ИмяКаталогаРезервнойКопииИБ, ВосстанавливатьИнформационнуюБазу", + Объект.СоздаватьРезервнуюКопию, + Объект.ИмяКаталогаРезервнойКопииИБ, + Объект.ВосстанавливатьИнформационнуюБазу); + Результат = ОткрытьФормуМодально("Обработка.ОбновлениеКонфигурации.Форма.НастройкаРезервнойКопии", ПараметрыФормы, ЭтаФорма); + + Если ТипЗнч(Результат) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(Объект, Результат); + КонецЕсли; + + ПередОткрытиемСтраницы(); +КонецПроцедуры + +&НаКлиенте +Процедура ПереключательОбновленияПриИзменении(Элемент) + ПередОткрытиемСтраницы(); +КонецПроцедуры + +&НаКлиенте +Процедура ВыслатьОтчетНаПочтуПриИзменении(Элемент) + ПередОткрытиемСтраницы(); +КонецПроцедуры + +&НаКлиенте +Процедура КластерТребуетАутентификацииПриИзменении(Элемент) + ПередОткрытиемСтраницы(); +КонецПроцедуры + +&НаКлиенте +Процедура НестандартныеПортыСервераПриИзменении(Элемент) + Элементы.ПанельНестандартныеПортыСервера.Доступность = Объект.НестандартныеПортыСервера; +КонецПроцедуры + +&НаКлиенте +Процедура КнопкаОбновитьВерсиюКомпонентыНажатие(Команда) +#Если НЕ ВебКлиент Тогда + ТекстКоманды = ""; + Попытка + ИмяБатФайла = ПолучитьИмяВременногоФайла("bat"); + ИмяФайлаЛога = ПолучитьИмяВременногоФайла("log"); + БатФайл = Новый ЗаписьТекста(ИмяБатФайла); + ТекстКоманды = "echo off"; + ТекстКоманды = ТекстКоманды + Символы.ПС + """regsvr32.exe"" /s """ + КаталогПрограммы() + "comcntr.dll"""; + ТекстКоманды = ТекстКоманды + Символы.ПС + "echo %errorlevel% >>""" + ИмяФайлаЛога + """"; + БатФайл.ЗаписатьСтроку(ТекстКоманды); + БатФайл.Закрыть(); + Shell = Новый COMОбъект("WScript.Shell"); + Shell.Run(ИмяБатФайла, 0, Истина); // запуск бат-файла со спрятанным окном (0) и с ожиданием завершения (Истина) + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ТекстСообщения = НСтр("ru = 'Ошибка при регистрации компоненты comcntr.'") + Символы.ПС; + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + + ТекстСообщения + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке), "Ошибка"); + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + Предупреждение(ТекстСообщения + НСтр("ru = 'Подробности см. в Журнале регистрации.'")); + Возврат; + КонецПопытки; + + Стр = ""; + Попытка + УдалитьФайлы(ИмяБатФайла); + ФайлЛога = Новый ЧтениеТекста(ИмяФайлаЛога); + Стр = ФайлЛога.ПрочитатьСтроку(); + ФайлЛога.Закрыть(); + УдалитьФайлы(ИмяФайлаЛога); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ТекстСообщения = НСтр("ru = 'Ошибка при регистрации компоненты comcntr.'") + Символы.ПС; + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + + ТекстСообщения + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке), "Ошибка"); + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + Предупреждение(ТекстСообщения + НСтр("ru = 'Подробности см. в Журнале регистрации.'")); + Возврат; + КонецПопытки; + + Если СокрЛП(Стр) <> "0" Тогда + ТекстСообщения = НСтр("ru = 'Ошибка при регистрации компоненты comcntr.'") + Символы.ПС; + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + ТекстСообщения + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Код ошибки regsvr32: %1. + | (Код ошибки 5 означает, что недостаточно прав доступа. Выполните командну от имени пользователя с правами администратора на локальной машине.) + | + |Текст команды: + |%2'"), Стр, ТекстКоманды), + "Ошибка"); + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + Предупреждение(ТекстСообщения + НСтр("ru = ' + |Подробности см. в Журнале регистрации.'")); + Возврат; + КонецЕсли; + + Если Вопрос(НСтр("ru = 'Для завершения перерегистрации компоненты comcntr необходимо перезапустить сеанс 1С:Предприятия. + |Перезапустить сейчас?'"), РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда + ЗавершитьРаботуСистемы(Ложь, Истина); + КонецЕсли; +#КонецЕсли +КонецПроцедуры + +&НаКлиенте +Процедура НадписьНастройкаПараметровПроксиНажатие(Элемент) + ОткрытьФормуМодально("ОбщаяФорма.ПараметрыПроксиСервера"); +КонецПроцедуры + +&НаКлиенте +Процедура ДекорацияЧерезИнтернетНажатие(Элемент) + Объект.ИсточникОбновления = 0; + ПередОткрытиемСтраницы(); +КонецПроцедуры + +&НаКлиенте +Процедура ДекорацияЧерезИТСНажатие(Элемент) + Объект.ИсточникОбновления = 1; + ПередОткрытиемСтраницы(); +КонецПроцедуры + +&НаКлиенте +Процедура ДекорацияИзФайлаНажатие(Элемент) + Объект.ИсточникОбновления = 2; + ПередОткрытиемСтраницы(); +КонецПроцедуры + +&НаКлиенте +Процедура ИсточникДискаИТСПриИзменении(Элемент) + ПередОткрытиемСтраницы(); +КонецПроцедуры + +&НаКлиенте +Процедура ДискИТСНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); + Диалог.Каталог = ДискИТС; + Диалог.ПроверятьСуществованиеФайла = Истина; + Диалог.Заголовок = "Выбор каталога для диска ИТС"; + + Если Диалог.Выбрать() Тогда + ДискИТС = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Диалог.Каталог); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ГиперссылкаПроверятьНаличиеОбновленияПриЗапускеНажатие(Элемент) + ПараметрыФормы = Новый Структура("ПроверятьНаличиеОбновленияПриЗапуске, РасписаниеПроверкиНаличияОбновления", + Объект.ПроверятьНаличиеОбновленияПриЗапуске, + Объект.РасписаниеПроверкиНаличияОбновления); + Результат = ОткрытьФормуМодально("Обработка.ОбновлениеКонфигурации.Форма.НастройкаРасписания", ПараметрыФормы, ЭтаФорма); + + Если ТипЗнч(Результат) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(Объект, Результат); + КонецЕсли; + + ПередОткрытиемСтраницы(); +КонецПроцедуры + +&НаКлиенте +Процедура НадписьПереченьРелизовНаДискахИТСНажатие(Элемент) + Если ПустаяСтрока(ПереченьРелизовНаДискахИТС) Тогда + Предупреждение(НСтр("ru = 'Информация о перечне релизов не обнаружена.'")); + КонецЕсли; + + ЗапуститьПриложение(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ДискИТС) + + "Autorun.exe -browse """ + ПереченьРелизовНаДискахИТС + """") +КонецПроцедуры + +&НаКлиенте +Процедура НадписьОткрытьЖурналРегистрацииНажатие(Элемент) + ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", Новый Структура("Пользователь", ИмяПользователя())); +КонецПроцедуры + +&НаКлиенте +Процедура НадписьПерейтиВЖурналРегистрацииНажатие(Элемент) + ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", Новый Структура("Пользователь", ИмяПользователя())); +КонецПроцедуры + +&НаКлиенте +Процедура КомандаПроверитьДискИТС(Команда) + Объект.ИсточникОбновления = 1; // диск ИТС + Объект.ИсточникДискаИТС = 0; // искать диск ИТС в приводе + Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СтраницыПомощника.ПодчиненныеЭлементы.МестоположениеДискаИТС; + ОбработатьНажатиеКнопкиДалее(); +КонецПроцедуры + +&НаКлиенте +Процедура НадписьИнформацияОбОбновленииПриЗавершенииНажатие(Элемент) + ОткрытьФорму("ОбщаяФорма.ОписаниеИзмененийСистемы"); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ (СЕРВЕР) + +&НаСервереБезКонтекста +Функция ЭтоСоединениеКонфигуратором(СоединениеИнформационнойБазы) + Возврат ВРег(СоединениеИнформационнойБазы.ИмяПриложения) = ВРег("Designer"); +КонецФункции + +&НаСервереБезКонтекста +Функция ЭтоCOMСоединение(СоединениеИнформационнойБазы) + Возврат ВРег(СоединениеИнформационнойБазы.ИмяПриложения) = ВРег("COMConnection"); +КонецФункции + +// Проверка наличия соединения конфигуратором. +// +// Возвращаемое значение: +// Булево - Истина, если соединение есть, +// Ложь, если соединения нет. +&НаСервереБезКонтекста +Функция НаличиеСоединенияКонфигуратором() + МассивСоединений = ПолучитьСоединенияИнформационнойБазы(); + Для Каждого Соединение Из МассивСоединений Цикл + Если ЭтоСоединениеКонфигуратором(Соединение) Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + Возврат Ложь; +КонецФункции + +&НаСервереБезКонтекста +Функция НаличиеCOMСоединений() + МассивСоединений = ПолучитьСоединенияИнформационнойБазы(); + Для Каждого Соединение Из МассивСоединений Цикл + Если ЭтоCOMСоединение(Соединение) Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + Возврат Ложь; +КонецФункции + +// Проверка наличия активных соединений с информационной базой. +// +// Возвращаемое значение: +// Булево - Истина, если соединения есть, +// Ложь, если соединений нет. +&НаСервереБезКонтекста +Функция НаличиеАктивныхСоединений(СообщенияДляЖурналаРегистрации = Неопределено) + // запись накопленных событий ЖР + Если СообщенияДляЖурналаРегистрации <> Неопределено И СообщенияДляЖурналаРегистрации.Количество() > 0 Тогда + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + КонецЕсли; + + Возврат ПолучитьСоединенияИнформационнойБазы().Количество() > 1; +КонецФункции + +&НаСервере +Функция ПолучитьТекстыМакетов(ИменаМакетов, СтруктураПараметров, СообщенияДляЖурналаРегистрации) + // запись накопленных событий ЖР + Если СообщенияДляЖурналаРегистрации.Количество() > 0 Тогда + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + КонецЕсли; + + Результат = Новый Массив(); + Результат.Добавить(ПолучитьТекстСкрипта(СтруктураПараметров)); + + ИменаМакетовМассив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИменаМакетов); + Для каждого ИмяМакета ИЗ ИменаМакетовМассив Цикл + Результат.Добавить(Обработки.ОбновлениеКонфигурации.ПолучитьМакет(ИмяМакета).ПолучитьТекст()); + КонецЦикла; + Возврат Результат; +КонецФункции + +&НаСервере +Функция ПолучитьТекстСкрипта(СтруктураПараметров) + + // Файл обновления конфигурации: main.js + ШаблонСкрипта = Обработки.ОбновлениеКонфигурации.ПолучитьМакет("МакетФайлаОбновленияКонфигурации"); + + Скрипт = ШаблонСкрипта.ПолучитьОбласть("ОбластьПараметров"); + Скрипт.УдалитьСтроку(1); + Скрипт.УдалитьСтроку(Скрипт.КоличествоСтрок()); + + Текст = ШаблонСкрипта.ПолучитьОбласть("ОбластьОбновленияКонфигурации"); + Текст.УдалитьСтроку(1); + Текст.УдалитьСтроку(Текст.КоличествоСтрок()); + + Возврат ВставитьПараметрыСкрипта(Скрипт.ПолучитьТекст(), СтруктураПараметров) + Текст.ПолучитьТекст(); + +КонецФункции + +&НаСервере +Функция ВставитьПараметрыСкрипта(Знач Текст, Знач СтруктураПараметров) + + Результат = Текст; + + Если Объект.СоздаватьРезервнуюКопию = 2 Тогда + Объект.ВосстанавливатьИнформационнуюБазу = Истина; + ИначеЕсли Объект.СоздаватьРезервнуюКопию = 0 Тогда + Объект.ВосстанавливатьИнформационнуюБазу = Ложь; + КонецЕсли; + + ИменаФайловОбновления = ""; + Для Каждого Обновление Из Объект.ДоступныеОбновления Цикл + ИменаФайловОбновления = ИменаФайловОбновления + Подг(Обновление.ПутьКЛокальномуФайлуОбновления) + ","; + КонецЦикла; + Если СтрДлина(ИменаФайловОбновления) > 0 Тогда + ИменаФайловОбновления = Лев(ИменаФайловОбновления, СтрДлина(ИменаФайловОбновления) - 1); + КонецЕсли; + ИменаФайловОбновления = "[" + ИменаФайловОбновления + "]"; + + СтрокаСоединенияИнформационнойБазы = СтруктураПараметров.ПараметрыСкрипта.СтрокаСоединенияИнформационнойБазы + + СтруктураПараметров.ПараметрыСкрипта.СтрокаПодключения; + + ИмяИсполняемогоФайлаПрограммы = СтруктураПараметров.КаталогПрограммы + СтруктураПараметров.ИмяФайлаПрограммы; + + + + // Определение пути к информационной базе. + ПризнакФайловогоРежима = Неопределено; + ПутьКИнформационнойБазе = СоединенияИБ.ПутьКИнформационнойБазе(ПризнакФайловогоРежима, + ?(Объект.НестандартныеПортыСервера, Объект.ПортКластераСерверов, 0)); + + ПараметрПутиКИнформационнойБазе = ?(ПризнакФайловогоРежима, "/F", "/S") + ПутьКИнформационнойБазе; + СтрокаПутиКИнформационнойБазе = ?(ПризнакФайловогоРежима, ПутьКИнформационнойБазе, ""); + + Результат = СтрЗаменить(Результат, "[ИменаФайловОбновления]" , ИменаФайловОбновления); + Результат = СтрЗаменить(Результат, "[ИмяФайлаРекламы]" , СтруктураПараметров.ИмяФайлаРекламы); + Результат = СтрЗаменить(Результат, "[ИмяИсполняемогоФайлаПрограммы]" , Подг(ИмяИсполняемогоФайлаПрограммы)); + Результат = СтрЗаменить(Результат, "[ПараметрПутиКИнформационнойБазе]" , Подг(ПараметрПутиКИнформационнойБазе)); + Результат = СтрЗаменить(Результат, "[СтрокаПутиКФайлуИнформационнойБазы]" , Подг(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(СтрЗаменить(СтрокаПутиКИнформационнойБазе, """", "")) + + "1Cv8.1CD")); + Результат = СтрЗаменить(Результат, "[СтрокаСоединенияИнформационнойБазы]" , Подг(СтрокаСоединенияИнформационнойБазы)); + Результат = СтрЗаменить(Результат, "[ПараметрыАутентификацииПользователя]" , Подг(СтруктураПараметров.ПараметрыСкрипта.ПараметрыАутентификации)); + Результат = СтрЗаменить(Результат, "[ИмяАдминистратораИБ]" , Подг(СтруктураПараметров.ПараметрыСкрипта.ИмяПользователя)); + Результат = СтрЗаменить(Результат, "[ПарольАдминистратораИБ]" , Подг(СтруктураПараметров.ПараметрыСкрипта.ПарольПользователя)); + Результат = СтрЗаменить(Результат, "[СобытиеЖурналаРегистрации]" , Подг(СтруктураПараметров.СобытиеЖурналаРегистрации)); + Результат = СтрЗаменить(Результат, "[АдресЭлектроннойПочты]", + Подг(?(Объект.РежимОбновления = 2 И Объект.ВыслатьОтчетНаПочту, Объект.АдресЭлектроннойПочты, ""))); + Результат = СтрЗаменить(Результат, "[ИмяАдминистратораОбновления]" , Подг(ИмяПользователя())); + Результат = СтрЗаменить(Результат, "[СоздаватьРезервнуюКопию]" , ?(ПризнакФайловогоРежима И + Объект.СоздаватьРезервнуюКопию <> 0, "true", "false")); + Результат = СтрЗаменить(Результат, "[КаталогРезервнойКопии]" , + Подг(?(Объект.СоздаватьРезервнуюКопию = 1, ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Объект.ИмяКаталогаРезервнойКопииИБ), ""))); + Результат = СтрЗаменить(Результат, "[ВосстанавливатьИнформационнуюБазу]" , ?(Объект.ВосстанавливатьИнформационнуюБазу, "true", "false")); + БлокироватьСоединенияИБ = НЕ СтруктураПараметров.ИнформационнаяБазаФайловая ИЛИ РежимИмитацииКлиентСервернойИБ(); + Результат = СтрЗаменить(Результат, "[БлокироватьСоединенияИБ]" , ?(БлокироватьСоединенияИБ, "true", "false")); + Результат = СтрЗаменить(Результат, "[ИмяCOMСоединителя]" , Подг(СтруктураПараметров.ИмяCOMСоединителя)); + Результат = СтрЗаменить(Результат, "[ИспользоватьCOMСоединитель]" , ?(СтруктураПараметров.ЭтоБазоваяВерсияКонфигурации, "false", "true")); + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция Подг(Знач Текст) + Возврат "'" + СтрЗаменить(Текст, "\", "\\") + "'"; +КонецФункции + +&НаСервереБезКонтекста +Функция ЕстьАктивныеПользователи(СообщенияДляЖурналаРегистрации = Неопределено) + // запись накопленных событий ЖР + Если СообщенияДляЖурналаРегистрации <> Неопределено И СообщенияДляЖурналаРегистрации.Количество() > 0 Тогда + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + Возврат ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() > 0; +Конецфункции + +&НаСервереБезКонтекста +Процедура НоваяСтрокаТаблицыОбновленийКонфигурации(ТаблицаОбновленийКонфигурации, Обновление) + + НоваяСтрока = ТаблицаОбновленийКонфигурации.Добавить(); + + ЗаполнитьЗначенияСвойств(НоваяСтрока, Обновление); + НомерВерсии = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Обновление.Версия, "."); + НоваяСтрока.Версия1Разряд = Число(НомерВерсии[0]); + НоваяСтрока.Версия2Разряд = Число(НомерВерсии[1]); + НоваяСтрока.Версия3Разряд = Число(НомерВерсии[2]); + НоваяСтрока.Версия4Разряд = Число(НомерВерсии[3]); + + ПутьФайла = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрЗаменить(Обновление.ПутьКФайлуОбновления, "\", "/"), "/"); + Если ПутьФайла.Количество() > 0 Тогда + НоваяСтрока.ФайлОбновления = ПутьФайла[ПутьФайла.Количество() - 1]; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция ПроверитьИУстановитьПарольАдминистратора(СообщенияДляЖурналаРегистрации) + + // запись накопленных событий ЖР + Если СообщенияДляЖурналаРегистрации.Количество() > 0 Тогда + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + КонецЕсли; + + ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь(); + Если ТекущийПользователь.АутентификацияОС И НЕ ТекущийПользователь.АутентификацияСтандартная Тогда + + ТекущийПользователь.АутентификацияСтандартная = Истина; + ТекущийПользователь.Пароль = Объект.ПарольАдминистратораИБ; + Попытка + ТекущийПользователь.Записать(); + Исключение + ИнфоОбОшибке = ИнформацияОбОшибке(); + ТекстСообщения = НСтр("ru = 'Не удалось установить пароль администратора: '"); + ЗаписьЖурналаРегистрации(ОбновлениеКонфигурации.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, + ТекстСообщения + ПодробноеПредставлениеОшибки(ИнфоОбОшибке)); + + Возврат ТекстСообщения + КраткоеПредставлениеОшибки(ИнфоОбОшибке); + КонецПопытки; + + КонецЕсли; + + Возврат ""; +КонецФункции + +// Служебная функция, предназначенная для получения описания типов строки, заданной длины. +// +// Параметры: +// ДлинаСтроки - число, длина строки. +// +// Возвращаемое значение: +// Объект "ОписаниеТипов" для строки указанной длины. +// +&НаСервереБезКонтекста +Функция ПолучитьОписаниеТиповСтроки(ДлинаСтроки) + Массив = Новый Массив; + Массив.Добавить(Тип("Строка")); + КвалификаторСтроки = Новый КвалификаторыСтроки(ДлинаСтроки, ДопустимаяДлина.Переменная); + Возврат Новый ОписаниеТипов(Массив, , КвалификаторСтроки); +КонецФункции + +// Служебная функция, предназначенная для получения описания типов числа, заданной разрядности. +// +// Параметры: +// Разрядность - число, разряд числа. +// РазрядностьДробнойЧасти - число, разряд дробной части. +// +// Возвращаемое значение: +// Объект "ОписаниеТипов" для числа указанной разрядности. +// +&НаСервереБезКонтекста +Функция ПолучитьОписаниеТиповЧисла(Разрядность,РазрядностьДробнойЧасти=0) + Массив = Новый Массив; + Массив.Добавить(Тип("Число")); + КвалификаторЧисла = Новый КвалификаторыЧисла(Разрядность,РазрядностьДробнойЧасти); + Возврат Новый ОписаниеТипов(Массив, КвалификаторЧисла); +КонецФункции + +// Получить список всех инкрементальных обновлений по списку шаблонов, +// последовательная установка которых обновит версию ВерсияОт до версии ВерсияДо. +// +// Параметры +// ВерсияОт – строка – исходная версия +// ВерсияДо – строка – конечная версия, до которой конфигурация +// обновляется с исходной +// +// Возвращаемое значение: +// Массив – массив строк ТаблицаЗначений +&НаСервере +Процедура ПолучитьДоступныеОбновленияВИнтервале(Знач ВерсияОт, Знач ВерсияДо, АдресФайлаВоВремХранилище, + СообщенияДляЖурналаРегистрации) + + // запись накопленных событий ЖР + Если СообщенияДляЖурналаРегистрации.Количество() > 0 Тогда + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + КонецЕсли; + + ТаблицаОбновлений = Неопределено; + ВыполнитьЗагрузкуСпискаОбновлений(АдресФайлаВоВремХранилище, ТаблицаОбновлений); + + Если ТаблицаОбновлений = Неопределено Тогда // ошибки при чтении файла + Возврат; + КонецЕсли; + + ТаблицаОбновленийКонфигурации = Объект.ДоступныеОбновления.Выгрузить(); + ТаблицаОбновленийКонфигурации.Очистить(); + + ТаблицаДоступныхОбновленийКонфигурации = ТаблицаОбновленийКонфигурации.Скопировать(); + + Для Каждого Обновление Из ТаблицаОбновлений Цикл + НоваяСтрокаТаблицыОбновленийКонфигурации(ТаблицаОбновленийКонфигурации, Обновление); + КонецЦикла; + + ТаблицаОбновленийКонфигурации.Сортировать("Версия1Разряд Убыв, + |Версия2Разряд Убыв, + |Версия3Разряд Убыв, + |Версия4Разряд Убыв"); + + ТекущаяВерсияОт = ВерсияОт; + Пока ТекущаяВерсияОт <> ВерсияДо Цикл + + Отбор = Новый Структура("ВерсияДляОбновления", ТекущаяВерсияОт); + МассивДоступныхОбновлений = ТаблицаОбновленийКонфигурации.НайтиСтроки(Отбор); + + Для Каждого Обновление Из МассивДоступныхОбновлений Цикл + НоваяСтрокаТаблицыОбновленийКонфигурации(ТаблицаДоступныхОбновленийКонфигурации, Обновление); + КонецЦикла; + + ТаблицаДоступныхОбновленийКонфигурации.Сортировать("Версия1Разряд Убыв, + |Версия2Разряд Убыв, + |Версия3Разряд Убыв, + |Версия4Разряд Убыв"); + + Если ТаблицаДоступныхОбновленийКонфигурации.Количество() = 0 Тогда + Прервать; + КонецЕсли; + + Отбор = Новый Структура("Версия", ТаблицаДоступныхОбновленийКонфигурации[0].Версия); + МассивУжеНайденныхОбновлений = Объект.ДоступныеОбновления.НайтиСтроки(Отбор); + Если Объект.ДоступныеОбновления.НайтиСтроки(Отбор).Количество() = 0 Тогда + // добавляем новое обновление + НовоеДоступноеОбновление = Объект.ДоступныеОбновления.Добавить(); + ЗаполнитьЗначенияСвойств(НовоеДоступноеОбновление, ТаблицаДоступныхОбновленийКонфигурации[0]); + ИначеЕсли ПустаяСтрока(МассивУжеНайденныхОбновлений[0].ПутьКЛокальномуФайлуОбновления) Тогда + // обновляем информацию в уже найденном обновлении + ЗаполнитьЗначенияСвойств(МассивУжеНайденныхОбновлений[0], ТаблицаДоступныхОбновленийКонфигурации[0]); + КонецЕсли; + НоваяТекущаяВерсияОт = ТаблицаДоступныхОбновленийКонфигурации[0].Версия; + Если ТекущаяВерсияОт = НоваяТекущаяВерсияОт И НоваяТекущаяВерсияОт <> ВерсияДо Тогда + ТаблицаДоступныхОбновленийКонфигурации.Очистить(); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Обновление на версию %1 с версии %2 не доступно.'"), ВерсияОт, ВерсияДо); + КонецЕсли; + ТекущаяВерсияОт = НоваяТекущаяВерсияОт; + + КонецЦикла; + +КонецПроцедуры + +// Загрузка списка обновлений из файла XML +&НаСервереБезКонтекста +Процедура ВыполнитьЗагрузкуСпискаОбновлений(Знач АдресФайлаЗагрузки, ТаблицаОбновлений = Неопределено) + + ПолныйПутьФайлаЗагрузки = АдресФайлаЗагрузки; + Если ЭтоАдресВременногоХранилища(АдресФайлаЗагрузки) Тогда + ПолныйПутьФайлаЗагрузки = СтрЗаменить(ПолучениеФайловИзИнтернета.ПолучитьИмяВременногоФайлаНаСервере(), ".tmp", ".xml"); + ПолучениеФайловИзИнтернета.СохранитьФайлИзВременногоХранилищаНаСервере(АдресФайлаЗагрузки, ПолныйПутьФайлаЗагрузки); + КонецЕсли; + + СообщениеОбОшибке = НСтр("ru = 'Ошибка при чтении файла списка обновлений '") + ПолныйПутьФайлаЗагрузки; + Если НЕ ФайлСуществуетНаСервере(ПолныйПутьФайлаЗагрузки) Тогда + ВызватьИсключение СообщениеОбОшибке; + КонецЕсли; + + ТаблицаОбновлений = Новый ТаблицаЗначений(); + ТаблицаОбновлений.Колонки.Добавить("Конфигурация" , ПолучитьОписаниеТиповСтроки(0)); + ТаблицаОбновлений.Колонки.Добавить("Поставщик" , ПолучитьОписаниеТиповСтроки(0)); + ТаблицаОбновлений.Колонки.Добавить("Версия" , ПолучитьОписаниеТиповСтроки(0)); + ТаблицаОбновлений.Колонки.Добавить("ВерсияДляОбновления" , ПолучитьОписаниеТиповСтроки(0)); + ТаблицаОбновлений.Колонки.Добавить("ПутьКФайлуОбновления" , ПолучитьОписаниеТиповСтроки(0)); + ТаблицаОбновлений.Колонки.Добавить("НомерДискаИТС" , ПолучитьОписаниеТиповСтроки(0)); + ТаблицаОбновлений.Колонки.Добавить("РазмерФайлаОбновления" , ПолучитьОписаниеТиповЧисла(15, 0)); + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.ОткрытьФайл(ПолныйПутьФайлаЗагрузки); + ЧтениеXML.Прочитать(); + + // Дата формирования файла. + ЧтениеXML.Прочитать(); + ЧтениеXML.Прочитать(); + ДатаФормирования = ЧтениеXML.Значение; + ЧтениеXML.Прочитать(); + + // Читаем начало элемента Update или конец элемента UpdateList. + Пока ЧтениеXML.Прочитать() Цикл + Если ЧтениеXML.Имя = "v8u:updateList" Тогда + Прервать; + КонецЕсли; + Поставщик = ""; + Версия = ""; + ПутьКФайлуОбновления = ""; + НомерДискаИТС = ""; + РазмерФайлаОбновления = 0; + Конфигурация = СтроковыеФункцииКлиентСервер.СократитьДвойныеКавычки(СокрЛП(ЧтениеXML.ПолучитьАтрибут("configuration"))); + Пока ЧтениеXML.Прочитать() Цикл + Если ЧтениеXML.Имя = "v8u:update" Тогда + Прервать; + КонецЕсли; + Если ЧтениеXML.Имя = "v8u:vendor" Тогда + ЧтениеXML.Прочитать(); + Поставщик = СтроковыеФункцииКлиентСервер.СократитьДвойныеКавычки(СокрЛП(ЧтениеXML.Значение)); + ИначеЕсли ЧтениеXML.Имя = "v8u:version" Тогда + ЧтениеXML.Прочитать(); + Версия = ЧтениеXML.Значение; + ИначеЕсли ЧтениеXML.Имя = "v8u:file" Тогда + ЧтениеXML.Прочитать(); + ПутьКФайлуОбновления = СтроковыеФункцииКлиентСервер.СократитьДвойныеКавычки(СокрЛП(ЧтениеXML.Значение)); + ИначеЕсли ЧтениеXML.Имя = "v8u:size" Тогда + ЧтениеXML.Прочитать(); + РазмерФайлаОбновления = СтроковыеФункцииКлиентСервер.СократитьДвойныеКавычки(СокрЛП(ЧтениеXML.Значение)); + ИначеЕсли ЧтениеXML.Имя = "v8u:its" Тогда + ЧтениеXML.Прочитать(); + НомерДискаИТС = СтроковыеФункцииКлиентСервер.СократитьДвойныеКавычки(СокрЛП(ЧтениеXML.Значение)); + ИначеЕсли ЧтениеXML.Имя = "v8u:target" Тогда + ЧтениеXML.Прочитать(); + НоваяСтрока = ТаблицаОбновлений.Добавить(); + НоваяСтрока.Конфигурация = Конфигурация; + НоваяСтрока.Поставщик = Поставщик; + НоваяСтрока.Версия = Версия; + НоваяСтрока.ВерсияДляОбновления = ЧтениеXML.Значение; + НоваяСтрока.ПутьКФайлуОбновления = ПутьКФайлуОбновления; + НоваяСтрока.НомерДискаИТС = НомерДискаИТС; + НоваяСтрока.РазмерФайлаОбновления = РазмерФайлаОбновления; + КонецЕсли; + + ЧтениеXML.Прочитать(); + КонецЦикла; + КонецЦикла; + ЧтениеXML.Закрыть(); + + Если ТаблицаОбновлений = Неопределено Тогда // ошибки при чтении файла + ВызватьИсключение НСтр("ru = 'Ошибка при чтении файла '") + ПолныйПутьФайлаЗагрузки; + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ФайлСуществуетНаСервере(Знач ПутьКФайлу) + Файл = Новый Файл(ПутьКФайлу); + Возврат Файл.Существует(); +КонецФункции + +&НаСервереБезКонтекста +Функция ПолучитьИнформациюОНаличииСоединений(СообщенияДляЖурналаРегистрации = Неопределено) + + // запись накопленных событий ЖР + Если СообщенияДляЖурналаРегистрации <> Неопределено И СообщенияДляЖурналаРегистрации.Количество() > 0 Тогда + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + Результат = Новый Структура( + "НаличиеАктивныхСоединений, НаличиеCOMСоединений, НаличиеСоединенияКонфигуратором, ЕстьАктивныеПользователи", + НаличиеАктивныхСоединений(), НаличиеCOMСоединений(), + НаличиеСоединенияКонфигуратором(), ЕстьАктивныеПользователи()); + Возврат Результат; +КонецФункции + +&НаСервере +Функция ПолучитьСтрокуСоединенияИИнформациюОСоединениях(СообщенияДляЖурналаРегистрации) + // запись накопленных событий ЖР + Если СообщенияДляЖурналаРегистрации.Количество() > 0 Тогда + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + КонецЕсли; + + Результат = ПолучитьИнформациюОНаличииСоединений(); + Результат.Вставить("СтрокаСоединенияИнформационнойБазы", + СоединенияИБ.ПолучитьСтрокуСоединенияИнформационнойБазы( + ?(Объект.НестандартныеПортыСервера, Объект.ПортКластераСерверов, 0))); + Возврат Результат; +КонецФункции + +&НаСервереБезКонтекста +Функция РежимОтладкиСкрипта() + Результат = Ложь; + СтруктураНастройки = ХранилищеОбщихНастроек.Загрузить("ОбновлениеКонфигурации", "НастройкиОбновленияКонфигурации"); + Если СтруктураНастройки <> Неопределено Тогда + СтруктураНастройки.Свойство("РежимОтладкиСкрипта", Результат); + КонецЕсли; + Возврат Результат = Истина; +КонецФункции + +&НаСервереБезКонтекста +Функция РежимИмитацииКлиентСервернойИБ() + Результат = Ложь; + СтруктураНастройки = ХранилищеОбщихНастроек.Загрузить("ОбновлениеКонфигурации", "НастройкиОбновленияКонфигурации"); + Если СтруктураНастройки <> Неопределено Тогда + СтруктураНастройки.Свойство("РежимИмитацииКлиентСервернойИБ", Результат); + КонецЕсли; + Возврат Результат = Истина; +КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ (КЛИЕНТ) + +&НаКлиенте +Процедура СохранитьНастройкиОбновленияКонфигурации() + ИспользоватьЗначениеНастройкиАдресСервераДляПроверкиНаличияОбновления = Ложь; + ИспользоватьЗначениеНастройкиАдресРесурсаДляПроверкиНаличияОбновления = Ложь; + ИспользоватьЗначениеНастройкиКороткоеИмяКонфигурации = Ложь; + ИспользоватьЗначениеНастройкиКаталогОбновлений = Ложь; + ИспользоватьЗначениеНастройкиИмяФайлаАдресаОбновленияИТС = Ложь; + Если НастройкиОбновленияКонфигурации = Неопределено Тогда + НастройкиОбновленияКонфигурации = Новый Структура(); + Иначе + НастройкиОбновленияКонфигурации.Свойство("ИспользоватьЗначениеНастройкиАдресСервераДляПроверкиНаличияОбновления" , ИспользоватьЗначениеНастройкиАдресСервераДляПроверкиНаличияОбновления); + НастройкиОбновленияКонфигурации.Свойство("ИспользоватьЗначениеНастройкиАдресРесурсаДляПроверкиНаличияОбновления", ИспользоватьЗначениеНастройкиАдресРесурсаДляПроверкиНаличияОбновления); + НастройкиОбновленияКонфигурации.Свойство("ИспользоватьЗначениеНастройкиКороткоеИмяКонфигурации" , ИспользоватьЗначениеНастройкиКороткоеИмяКонфигурации); + НастройкиОбновленияКонфигурации.Свойство("ИспользоватьЗначениеНастройкиКаталогОбновлений" , ИспользоватьЗначениеНастройкиКаталогОбновлений); + НастройкиОбновленияКонфигурации.Свойство("ИспользоватьЗначениеНастройкиИмяФайлаАдресаОбновленияИТС" , ИспользоватьЗначениеНастройкиИмяФайлаАдресаОбновленияИТС); + КонецЕсли; + НастройкиОбновленияКонфигурации.Вставить("ПропускатьПриветствие" , Объект.ПропускатьПриветствие); + НастройкиОбновленияКонфигурации.Вставить("КодПользователяСервераОбновлений" , Объект.КодПользователяСервераОбновлений); + НастройкиОбновленияКонфигурации.Вставить("ПарольСервераОбновлений" , ?(Объект.ЗапомнитьПарольСервераОбновлений, Объект.ПарольСервераОбновлений, "")); + НастройкиОбновленияКонфигурации.Вставить("ЗапомнитьПарольСервераОбновлений" , Объект.ЗапомнитьПарольСервераОбновлений); + НастройкиОбновленияКонфигурации.Вставить("ПроверятьНаличиеОбновленияПриЗапуске" , Объект.ПроверятьНаличиеОбновленияПриЗапуске); + НастройкиОбновленияКонфигурации.Вставить("РасписаниеПроверкиНаличияОбновления" , Объект.РасписаниеПроверкиНаличияОбновления); + НастройкиОбновленияКонфигурации.Вставить("ИсточникОбновления" , Объект.ИсточникОбновления); + НастройкиОбновленияКонфигурации.Вставить("РежимОбновления" , Объект.РежимОбновления); + НастройкиОбновленияКонфигурации.Вставить("ДатаВремяОбновления" , Объект.ДатаВремяОбновления); + НастройкиОбновленияКонфигурации.Вставить("ВыслатьОтчетНаПочту" , Объект.ВыслатьОтчетНаПочту); + НастройкиОбновленияКонфигурации.Вставить("АдресЭлектроннойПочты" , Объект.АдресЭлектроннойПочты); + НастройкиОбновленияКонфигурации.Вставить("КодЗадачиПланировщика" , Объект.КодЗадачиПланировщика); + НастройкиОбновленияКонфигурации.Вставить("ПовторныйЗапуск" , Объект.ПовторныйЗапуск); + НастройкиОбновленияКонфигурации.Вставить("ИмяФайлаОбновления" , Объект.ИмяФайлаОбновления); + НастройкиОбновленияКонфигурации.Вставить("НуженФайлОбновления" , Объект.НуженФайлОбновления); + НастройкиОбновленияКонфигурации.Вставить("СоздаватьРезервнуюКопию" , Объект.СоздаватьРезервнуюКопию); + НастройкиОбновленияКонфигурации.Вставить("ВосстанавливатьИнформационнуюБазу" , Объект.ВосстанавливатьИнформационнуюБазу); + НастройкиОбновленияКонфигурации.Вставить("ИмяКаталогаРезервнойКопииИБ" , Объект.ИмяКаталогаРезервнойКопииИБ); + НастройкиОбновленияКонфигурации.Вставить("АдресСервераДляПроверкиНаличияОбновления" , СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.АдресСервераДляПроверкиНаличияОбновления); + НастройкиОбновленияКонфигурации.Вставить("ИспользоватьЗначениеНастройкиАдресСервераДляПроверкиНаличияОбновления" , ИспользоватьЗначениеНастройкиАдресСервераДляПроверкиНаличияОбновления); + НастройкиОбновленияКонфигурации.Вставить("ИспользоватьЗначениеНастройкиАдресРесурсаДляПроверкиНаличияОбновления", ИспользоватьЗначениеНастройкиАдресРесурсаДляПроверкиНаличияОбновления); + НастройкиОбновленияКонфигурации.Вставить("ИспользоватьЗначениеНастройкиКороткоеИмяКонфигурации" , ИспользоватьЗначениеНастройкиКороткоеИмяКонфигурации); + НастройкиОбновленияКонфигурации.Вставить("ИспользоватьЗначениеНастройкиКаталогОбновлений" , ИспользоватьЗначениеНастройкиКаталогОбновлений); + НастройкиОбновленияКонфигурации.Вставить("ИмяФайлаАдресаОбновленияИТС" , ИспользоватьЗначениеНастройкиИмяФайлаАдресаОбновленияИТС); + НастройкиОбновленияКонфигурации.Вставить("КаталогОбновлений" , СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.КаталогОбновлений); + НастройкиОбновленияКонфигурации.Вставить("КороткоеИмяКонфигурации" , СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.КороткоеИмяКонфигурации); + НастройкиОбновленияКонфигурации.Вставить("АдресРесурсаДляПроверкиНаличияОбновления" , СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.АдресРесурсаДляПроверкиНаличияОбновления); + НастройкиОбновленияКонфигурации.Вставить("ДискИТС" , ДискИТС); + НастройкиОбновленияКонфигурации.Вставить("ИсточникДискаИТС" , Объект.ИсточникДискаИТС); + НастройкиОбновленияКонфигурации.Вставить("ИмяАдминистратораИБ" , Объект.ИмяАдминистратораИБ); + НастройкиОбновленияКонфигурации.Вставить("ПарольАдминистратораИБ" , Объект.ПарольАдминистратораИБ); + НастройкиОбновленияКонфигурации.Вставить("КластерТребуетАутентификации" , Объект.КластерТребуетАутентификации); + НастройкиОбновленияКонфигурации.Вставить("ИмяАдминистратораКластера" , Объект.ИмяАдминистратораКластера); + НастройкиОбновленияКонфигурации.Вставить("ПарольАдминистратораКластера" , Объект.ПарольАдминистратораКластера); + НастройкиОбновленияКонфигурации.Вставить("НестандартныеПортыСервера" , Объект.НестандартныеПортыСервера); + НастройкиОбновленияКонфигурации.Вставить("ПортАгентаСервера" , Объект.ПортАгентаСервера); + НастройкиОбновленияКонфигурации.Вставить("ПортКластераСерверов" , Объект.ПортКластераСерверов); + + ОбновлениеКонфигурации.ЗаписатьСтруктуруНастроекПомощника(НастройкиОбновленияКонфигурации); + + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ЕстьДоступДляОбновления Тогда + Настройка = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ПараметрыАдминистрированияИБ; + Настройка.ИмяАдминистратораКластера = ?(Объект.КластерТребуетАутентификации, Объект.ИмяАдминистратораКластера, ""); + Настройка.ПарольАдминистратораКластера = ?(Объект.КластерТребуетАутентификации, Объект.ПарольАдминистратораКластера, ""); + Настройка.Вставить("ПортКластераСерверов", ?(Объект.НестандартныеПортыСервера, Объект.ПортКластераСерверов, 0)); + Настройка.Вставить("ПортАгентаСервера", ?(Объект.НестандартныеПортыСервера, Объект.ПортАгентаСервера, 0)); + СоединенияИБ.ЗаписатьПараметрыАдминистрированияИБ(Настройка); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВосстановитьНастройкиОбновленияКонфигурации() + + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + + // Значения по умолчанию. + Объект.КодЗадачиПланировщика = 0; + Объект.ЗапомнитьПарольСервераОбновлений = Истина; + Объект.ДатаВремяОбновления = ОбновлениеКонфигурацииКлиент.ДобавитьДни(НачалоДня(ТекущаяДата()), 1); + Объект.ПовторныйЗапуск = Ложь; + Объект.НуженФайлОбновления = 1; + Объект.РежимОбновления = ?(ПараметрыРаботыКлиента.ИнформационнаяБазаФайловая, 0, 2); + Объект.ПроверятьНаличиеОбновленияПриЗапуске = 0; + + // Восстановление настроек + Если НастройкиОбновленияКонфигурации = Неопределено Тогда + НастройкиОбновленияКонфигурации = ОбновлениеКонфигурации.ПолучитьСтруктуруНастроекПомощника(); + КонецЕсли; + Если НастройкиОбновленияКонфигурации <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(Объект, НастройкиОбновленияКонфигурации); + Если ПараметрыРаботыКлиента.ИнформационнаяБазаФайловая И Объект.РежимОбновления > 1 Тогда + Объект.РежимОбновления = 0; + КонецЕсли; + КонецЕсли; + + Попытка + Настройка = ПараметрыРаботыКлиента.НастройкиОбновления.ПараметрыАдминистрированияИБ; + Объект.ИмяАдминистратораКластера = Настройка.ИмяАдминистратораКластера; + Объект.ПарольАдминистратораКластера = Настройка.ПарольАдминистратораКластера; + Объект.КластерТребуетАутентификации = НЕ ПустаяСтрока(Объект.ИмяАдминистратораКластера); + Объект.НестандартныеПортыСервера = Настройка.ПортКластераСерверов <> 0 ИЛИ Настройка.ПортАгентаСервера <> 0; + Если Объект.НестандартныеПортыСервера ИЛИ ПараметрыРаботыКлиента.ИнформационнаяБазаФайловая Тогда + Объект.ПортКластераСерверов = Настройка.ПортКластераСерверов; + Объект.ПортАгентаСервера = Настройка.ПортАгентаСервера; + Иначе + Попытка + ComConnector = Новый COMОбъект(ПараметрыРаботыКлиента.НастройкиОбновления.ИмяCOMСоединителя); + Объект.ПортКластераСерверов = ComConnector.RMngrPortDefault; + Объект.ПортАгентаСервера = ComConnector.RAgentPortDefault; + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " ", + НСтр("ru = 'Ошибка при восстановлении настроек обновления:'") + " " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + КонецЕсли; + Исключение + Объект.ИмяАдминистратораКластера = ""; + Объект.ПарольАдминистратораКластера = ""; + Объект.КластерТребуетАутентификации = Ложь; + Объект.НестандартныеПортыСервера = Ложь; + Если НЕ ПараметрыРаботыКлиента.ИнформационнаяБазаФайловая Тогда + Попытка + ComConnector = Новый COMОбъект(ПараметрыРаботыКлиента.НастройкиОбновления.ИмяCOMСоединителя); + Объект.ПортКластераСерверов = ComConnector.RMngrPortDefault; + Объект.ПортАгентаСервера = ComConnector.RAgentPortDefault; + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " ", + НСтр("ru = 'Ошибка при восстановлении настроек обновления: '") + " " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + КонецЕсли; + КонецПопытки; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередОткрытиемСтраницы(НоваяТекущаяСтраница = Неопределено) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + Если НоваяТекущаяСтраница = Неопределено Тогда + НоваяТекущаяСтраница = Элементы.СтраницыПомощника.ТекущаяСтраница; + КонецЕсли; + + ДоступностьКнопкиНазад = Истина; + ДоступностьКнопкиДалее = Истина; + ДоступностьКнопкиЗакрыть = Истина; + ФункцияКнопкиДалее = Истина; // Истина = "Далее", Ложь = "Готово" + + Если НоваяТекущаяСтраница = Страницы.ДоброПожаловать Тогда + ДоступностьКнопкиНазад = Ложь; + + Если Объект.ИсточникОбновления = 0 Тогда + Элементы.СтраницыКартинкиИнтернет.ТекущаяСтраница = Элементы.СтраницыКартинкиИнтернет.ПодчиненныеЭлементы.ЕстьКартинка; + Элементы.СтраницыКартинкиИТС.ТекущаяСтраница = Элементы.СтраницыКартинкиИТС.ПодчиненныеЭлементы.НетКартинки1; + Элементы.СтраницыКартинкиФайл.ТекущаяСтраница = Элементы.СтраницыКартинкиФайл.ПодчиненныеЭлементы.НетКартинки2; + ИначеЕсли Объект.ИсточникОбновления = 1 Тогда + Элементы.СтраницыКартинкиИнтернет.ТекущаяСтраница = Элементы.СтраницыКартинкиИнтернет.ПодчиненныеЭлементы.НетКартинки; + Элементы.СтраницыКартинкиИТС.ТекущаяСтраница = Элементы.СтраницыКартинкиИТС.ПодчиненныеЭлементы.ЕстьКартинка1; + Элементы.СтраницыКартинкиФайл.ТекущаяСтраница = Элементы.СтраницыКартинкиФайл.ПодчиненныеЭлементы.НетКартинки2; + ИначеЕсли Объект.ИсточникОбновления = 2 Тогда + Элементы.СтраницыКартинкиИнтернет.ТекущаяСтраница = Элементы.СтраницыКартинкиИнтернет.ПодчиненныеЭлементы.НетКартинки; + Элементы.СтраницыКартинкиИТС.ТекущаяСтраница = Элементы.СтраницыКартинкиИТС.ПодчиненныеЭлементы.НетКартинки1; + Элементы.СтраницыКартинкиФайл.ТекущаяСтраница = Элементы.СтраницыКартинкиФайл.ПодчиненныеЭлементы.ЕстьКартинка2; + КонецЕсли; + + Элементы.ГруппаИТС.Видимость = ОбновлениеКонфигурацииКлиентПереопределяемый.ИспользоватьОбновлениеСДискаИТС(); + + Элементы.ГиперссылкаПроверятьНаличиеОбновленияПриЗапуске.Заголовок = ТекстНадписиПроверкиОбновления(); + Элементы.ПропускатьПриветствие.Доступность = (Объект.ИсточникОбновления = 0); + + ИначеЕсли НоваяТекущаяСтраница = Страницы.ПодключениеКИнтернет Тогда + + ИначеЕсли НоваяТекущаяСтраница = Страницы.ПодключениеКСайту Тогда + + ВидимостьПанелиОшибкиПодключения = ? (ЗначениеЗаполнено(Объект.КодПользователяСервераОбновлений) + ИЛИ ЗначениеЗаполнено(Объект.ПарольСервераОбновлений), Истина, Ложь); + + Элементы.ПанельОшибкаПодключения.Видимость = ВидимостьПанелиОшибкиПодключения; + Элементы.ПанельЖурналРегистрации.Видимость = ВидимостьПанелиОшибкиПодключения; + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + Элементы.ПанельОшибкаПодключения.ТекущаяСтраница = Элементы.ПанельОшибкаПодключения.ПодчиненныеЭлементы.Базовая; + КонецЕсли; + + Если ПустаяСтрока(Объект.ТехническаяИнформацияОбОшибке) Тогда + Объект.ТехническаяИнформацияОбОшибке = ""; + Иначе + Объект.ТехническаяИнформацияОбОшибке = НСтр("ru = 'Техническая информация об ошибке: '") + Символы.ПС + Объект.ТехническаяИнформацияОбОшибке; + КонецЕсли; + + ИначеЕсли НоваяТекущаяСтраница = Страницы.ДоступноеОбновление Тогда + + СтруктураДоступногоОбновления = ПолучитьСтруктуруДостуступногоОбновления(Истина); + Если СтруктураДоступногоОбновления <> Неопределено Тогда + Элементы.НадписьИнформацияОбОбновлении.Видимость = НЕ ПустаяСтрока(ИмяФайлаИнформацияОбОбновлении); + Элементы.НадписьОписаниеКонфигурации.Заголовок = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.СинонимКонфигурации; + Элементы.НадписьТекущаяКонфигурация.Заголовок = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ВерсияКонфигурации; + Элементы.НадписьДоступноеОбновление.Заголовок = НСтр("ru = 'Версия '") + СтруктураДоступногоОбновления.Версия; + Элементы.НадписьРазмерОбновления.Заголовок = СтруктураДоступногоОбновления.РазмерОбновления; + Элементы.ПанельПорядокОбновления.Видимость = НЕ ПустаяСтрока(ИмяФайлаПорядокОбновления); + КонецЕсли; + Элементы.ГиперссылкаПроверятьНаличиеОбновленияПриЗапуске1.Заголовок = ТекстНадписиПроверкиОбновления(); + СтраницыПереходаНаСледующийШаг = Элементы.ПанельПереходаНаСледующийШаг.ПодчиненныеЭлементы; + Элементы.ПанельПереходаНаСледующийШаг.ТекущаяСтраница = ?(Объект.ИсточникОбновления = 0, + СтраницыПереходаНаСледующийШаг.Интернет1, СтраницыПереходаНаСледующийШаг.ИТС1); + + ИначеЕсли НоваяТекущаяСтраница = Страницы.ОбновленияНеОбнаружено Тогда + + СтруктураДоступногоОбновления = ПолучитьСтруктуруДостуступногоОбновления(); + ФункцияКнопкиДалее = Ложь; + ДоступностьКнопкиДалее = Ложь; + Элементы.НадписьОписаниеТекущейКонфигурации.Заголовок = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.СинонимКонфигурации; + Элементы.НадписьВерсияТекущейКонфигурации.Заголовок = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ВерсияКонфигурации; + Элементы.НадписьВерсияДляОбновления.Заголовок = ?(ТипЗнч(СтруктураДоступногоОбновления) = Тип("Структура"), НСтр("ru = 'Доступная версия для обновления - '") + СтруктураДоступногоОбновления.Версия, ""); + Элементы.НадписьВерсияДляОбновления.Видимость = НЕ ПустаяСтрока(Элементы.НадписьВерсияДляОбновления.Заголовок); + + Если СтроковыеФункцииКлиентСервер.СравнитьВерсии(СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ВерсияКонфигурации, + ПоследняяВерсияКонфигурации) >= 0 + И (Объект.ИсточникОбновления = 1 И НЕ ПустаяСтрока(ПутьКФайламОбновленияНаДискеИТС) + ИЛИ СтруктураДоступногоОбновления <> Неопределено) + ИЛИ (Объект.ИсточникОбновления = 0 И Объект.ДоступныеОбновления.Количество() = 0) Тогда // это последняя версия. + + Элементы.ПанельИнформацияОбОбновлении.ТекущаяСтраница = Элементы.ПанельИнформацияОбОбновлении.ПодчиненныеЭлементы.ОбновлениеНеТребуется; + Элементы.ЗаголовокОбновления.Заголовок = НСтр("ru = 'Обновление не требуется'"); + Иначе + Элементы.ПанельИнформацияОбОбновлении.ТекущаяСтраница = Элементы.ПанельИнформацияОбОбновлении.ПодчиненныеЭлементы.ОбновлениеНеОбнаружено; + Элементы.ЗаголовокОбновления.Заголовок = НСтр("ru = 'Обновления конфигурации не обнаружено'"); + КонецЕсли; + + НадписьНеобходимыеДискиИТС = ТекстНадписиНеобходимыеДискиИТС(); + Элементы.НадписьНеобходимыеДискиИТС.Видимость = НЕ ПустаяСтрока(НадписьНеобходимыеДискиИТС); + Элементы.НадписьПереченьРелизовНаДискахИТС.Видимость = НЕ ПустаяСтрока(ПереченьРелизовНаДискахИТС); + Элементы.ГруппаПроверкиДискаИТС.Видимость = Объект.ИсточникОбновления = 1 И Объект.ИсточникДискаИТС <> 1; + + ИначеЕсли НоваяТекущаяСтраница = Страницы.ДлительнаяОперация Тогда + + ДоступностьКнопкиДалее = Ложь; + ДоступностьКнопкиНазад = Ложь; + ДоступностьКнопкиЗакрыть = Ложь; + + СтраницыОжидания = Элементы.ПанельОжиданиеДлительнойОперации.ПодчиненныеЭлементы; + Элементы.ПанельОжиданиеДлительнойОперации.ТекущаяСтраница = ?(Объект.ИсточникОбновления = 0, + СтраницыОжидания.Интернет, СтраницыОжидания.ИТС); + + ИначеЕсли НоваяТекущаяСтраница = Страницы.ВыборРежимаОбновленияФайл Тогда + + ФункцияКнопкиДалее = (Объект.РежимОбновления = 0); // Если НЕ обновляем сейчас, то "готово". + + СтраницыПанельВсеГотово = Элементы.ПанельВсеГотовоФайл.ПодчиненныеЭлементы; + Элементы.ПанельВсеГотовоФайл.ТекущаяСтраница = ?(ПустаяСтрока(ИмяФайлаПорядокОбновления), + СтраницыПанельВсеГотово.ВсеГотово, СтраницыПанельВсеГотово.ВсеГотовоПорядокОбновления); + + СтраницыПереходаНаСледующийШаг = Элементы.ПанельПереходаНаСледующийШагРежимаОбновленияФайл.ПодчиненныеЭлементы; + Элементы.ПанельПереходаНаСледующийШагРежимаОбновленияФайл.ТекущаяСтраница = ?(ФункцияКнопкиДалее, + СтраницыПереходаНаСледующийШаг.Далее, СтраницыПереходаНаСледующийШаг.Готово); + + СоединенияИнфо = ПолучитьИнформациюОНаличииСоединений(СообщенияДляЖурналаРегистрации); + Элементы.ГруппаСоединений.Видимость = ?(СоединенияИнфо.НаличиеАктивныхСоединений, Истина, Ложь); + + Если СоединенияИнфо.НаличиеАктивныхСоединений Тогда + ВсеСтраницы = Элементы.ПанельАктивныеПользователи.ПодчиненныеЭлементы; + ДоступностьКнопкиДалее = Истина; + Если СоединенияИнфо.НаличиеCOMСоединений Тогда + Элементы.ПанельАктивныеПользователи.ТекущаяСтраница = ВсеСтраницы.АктивныеСоединения; + Элементы.ПанельПереходаНаСледующийШагРежимаОбновленияФайл.ТекущаяСтраница = СтраницыПереходаНаСледующийШаг.АктивныеСоединения2; + ИначеЕсли СоединенияИнфо.НаличиеСоединенияКонфигуратором Тогда + Элементы.ПанельАктивныеПользователи.ТекущаяСтраница = ВсеСтраницы.СоединениеКонфигуратора; + Элементы.ПанельПереходаНаСледующийШагРежимаОбновленияФайл.ТекущаяСтраница = СтраницыПереходаНаСледующийШаг.СоединениеКонфигуратора2; + Иначе + Элементы.ПанельАктивныеПользователи.ТекущаяСтраница = ВсеСтраницы.АктивныеПользователи; + КонецЕсли; + КонецЕсли; + + Элементы.НадписьРезервнаяКопияФайл.Заголовок = ТекстНадписиРезервнойКопииИБ(); + + ИначеЕсли НоваяТекущаяСтраница = Страницы.ВыборРежимаОбновленияСервер Тогда + + Если Объект.КодЗадачиПланировщика = 0 И НЕ ДатаВремяОбновленияУстановлена Тогда + Объект.ДатаВремяОбновления = ВернутьДату(ОбновлениеКонфигурацииКлиент.ДобавитьДни(НачалоДня(ТекущаяДата()), 1), Объект.ДатаВремяОбновления); + ДатаВремяОбновленияУстановлена = Истина; + КонецЕсли; + + ФункцияКнопкиДалее = (Объект.РежимОбновления = 0); // Если НЕ обновляем сейчас, то "готово". + + СтраницыПанельВсеГотово = Элементы.ПанельВсеГотовоСервер.ПодчиненныеЭлементы; + Элементы.ПанельВсеГотовоСервер.ТекущаяСтраница = ?(ПустаяСтрока(ИмяФайлаПорядокОбновления), + СтраницыПанельВсеГотово.ВсеГотово1, СтраницыПанельВсеГотово.ВсеГотовоПорядокОбновления1); + + СтраницыПанелиИнформацииПерезагрузки1 = Элементы.СтраницыИнформацииПерезагрузки1.ПодчиненныеЭлементы; + Элементы.СтраницыИнформацииПерезагрузки1.ТекущаяСтраница = ?(Объект.РежимОбновления = 0, + СтраницыПанелиИнформацииПерезагрузки1.СтраницаПерезагрузкиСейчас1, + СтраницыПанелиИнформацииПерезагрузки1.СтраницаЗапланированнойПерезагрузки); + + СоединенияИнфо = ПолучитьИнформациюОНаличииСоединений(СообщенияДляЖурналаРегистрации); + НаличиеСоединений = СоединенияИнфо.НаличиеАктивныхСоединений И ФункцияКнопкиДалее; + Элементы.ГруппаСоединений1.Видимость = НаличиеСоединений; + Если НаличиеСоединений Тогда + ВсеСтраницы = Элементы.ПанельАктивныеПользователи1.ПодчиненныеЭлементы; + Элементы.ПанельАктивныеПользователи1.ТекущаяСтраница = ? (СоединенияИнфо.НаличиеCOMСоединений, + ВсеСтраницы.АктивныеСоединения1, ВсеСтраницы.АктивныеПользователи1); + КонецЕсли; + + Элементы.ПолеДатаВремяОбновления.Доступность = (Объект.РежимОбновления = 2); + Элементы.АдресЭлектроннойПочты.Доступность = Объект.ВыслатьОтчетНаПочту; + + СтраницыПереходаНаСледующийШаг = Элементы.ПанельПереходаНаСледующийШагРежимаОбновленияСервер.ПодчиненныеЭлементы; + СледСтраница = СтраницыПереходаНаСледующийШаг.Сейчас; + Если Объект.РежимОбновления = 1 Тогда + СледСтраница = СтраницыПереходаНаСледующийШаг.Отмена; + ИначеЕсли Объект.РежимОбновления = 2 Тогда + СледСтраница = СтраницыПереходаНаСледующийШаг.Отложить; + КонецЕсли; + Элементы.ПанельПереходаНаСледующийШагРежимаОбновленияСервер.ТекущаяСтраница = СледСтраница; + + ИначеЕсли НоваяТекущаяСтраница = Страницы.УспешноеОбновление Тогда + + Элементы.ПанельПорядокОбновленияПриЗавершении.Видимость = НЕ ПустаяСтрока(ИмяФайлаПорядокОбновления); + ФункцияКнопкиДалее = Ложь; + + ИначеЕсли НоваяТекущаяСтраница = Страницы.НеуспешноеОбновление Тогда + + ФункцияКнопкиДалее = Ложь; + + ИначеЕсли НоваяТекущаяСтраница = Страницы.ФайлОбновления Тогда + + Если Объект.НуженФайлОбновления = 0 Тогда + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.КонфигурацияИзменена Тогда + Элементы.СтраницыНадписиИзмененнойКонфигурации.ТекущаяСтраница = Элементы.СтраницыНадписиИзмененнойКонфигурации.ПодчиненныеЭлементы.ЕстьИзменения; + Иначе + Элементы.СтраницыНадписиИзмененнойКонфигурации.ТекущаяСтраница = Элементы.СтраницыНадписиИзмененнойКонфигурации.ПодчиненныеЭлементы.НетИзменений; + ДоступностьКнопкиДалее = Ложь; + КонецЕсли; + КонецЕсли; + Элементы.ПанельОбновлениеИзОсновнойКонфигурации.Видимость = Объект.НуженФайлОбновления = 0; + Элементы.ПолеФайлОбновления.Доступность = Объект.НуженФайлОбновления = 1; + Элементы.ПолеФайлОбновления.АвтоОтметкаНезаполненного = Объект.НуженФайлОбновления = 1; + + ИначеЕсли НоваяТекущаяСтраница = Страницы.ПараметрыАвторизации Тогда + + ЗапрашиватьАвторизациюИБ = ЗапрашиватьПарольАдминистратора(); + Элементы.ПанельАвторизацияИБ.Видимость = ЗапрашиватьАвторизациюИБ; + Если ЗапрашиватьАвторизациюИБ Тогда + УстановкаПароля = ВводитьПарольАдминистратора(); + Элементы.ПанельПредупреждениеОWindowsАвторизации.Видимость = УстановкаПароля; + ПоследнийЭлементГруппы = ?(УстановкаПароля, + Элементы.ПолеПарольАдминистратораИБПроверка, + Элементы.ПолеПарольАдминистратораИБ); + Элементы.ПолеПарольАдминистратораИБПроверка.Видимость = УстановкаПароля; + Объект.ИмяАдминистратораИБ = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ИнформацияОПользователе.Имя; + КонецЕсли; + + Элементы.ПанельАвторизацияКластераСерверов.Видимость = НЕ СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая; + Элементы.ПанельДоступККластеру.Доступность = Объект.КластерТребуетАутентификации; + Элементы.ПанельНестандартныеПортыСервера.Доступность = Объект.НестандартныеПортыСервера; + + ИначеЕсли НоваяТекущаяСтраница = Страницы.МестоположениеДискаИТС Тогда + + Элементы.ДискИТС.Доступность = (Объект.ИсточникДискаИТС = 1); + Если Объект.ИсточникДискаИТС = 1 Тогда + Элементы.СтраницыНаличияДискаИТС.ТекущаяСтраница = Элементы.СтраницыНаличияДискаИТС.ПодчиненныеЭлементы.УказаниеКаталога; + Иначе + Элементы.СтраницыНаличияДискаИТС.ТекущаяСтраница = Элементы.СтраницыНаличияДискаИТС.ПодчиненныеЭлементы.ИнфНадписьИТС; + КонецЕсли; + + ИначеЕсли НоваяТекущаяСтраница = Страницы.ДополнительныеНастройки Тогда + + ЗапрашиватьАвторизациюИБ = ЗапрашиватьПарольАдминистратора(); + Элементы.ПанельАвторизацияИБ.Видимость = ЗапрашиватьАвторизациюИБ; + Если ЗапрашиватьАвторизациюИБ Тогда + УстановкаПароля = ВводитьПарольАдминистратора(); + Элементы.ПанельПредупреждениеОWindowsАвторизации1.Видимость = УстановкаПароля; + ПоследнийЭлементГруппы = ?(УстановкаПароля, + Элементы.ПолеПарольАдминистратораИБПроверка1, + Элементы.ПолеПарольАдминистратораИБ1); + Элементы.ПолеПарольАдминистратораИБПроверка1.Видимость = УстановкаПароля; + Объект.ИмяАдминистратораИБ = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ИнформацияОПользователе.Имя; + КонецЕсли; + Элементы.ГруппаComcntrФайловыйРежим.Видимость = НЕ СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации; + + КонецЕсли; + + // на страницах с ошибками нужно зафиксировать журнал регистрации + Если СообщенияДляЖурналаРегистрации <> Неопределено И СообщенияДляЖурналаРегистрации.Количество() > 0 Тогда + ОбновлениеКонфигурации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + КонецЕсли; + + КнопкаДалее = КоманднаяПанель.ПодчиненныеЭлементы.КнопкаДалее; + КнопкаНазад = КоманднаяПанель.ПодчиненныеЭлементы.КнопкаНазад; + КнопкаЗакрыть = КоманднаяПанель.ПодчиненныеЭлементы.КнопкаЗакрыть; + КнопкаНазад.Доступность = ДоступностьКнопкиНазад; + КнопкаДалее.Доступность = ДоступностьКнопкиДалее; + КнопкаЗакрыть.Доступность = ДоступностьКнопкиЗакрыть; + Если ДоступностьКнопкиДалее Тогда + Если НЕ КнопкаДалее.КнопкаПоУмолчанию Тогда + КнопкаДалее.КнопкаПоУмолчанию = Истина; + КонецЕсли; + ИначеЕсли ДоступностьКнопкиЗакрыть Тогда + Если НЕ КнопкаЗакрыть.КнопкаПоУмолчанию Тогда + КнопкаЗакрыть.КнопкаПоУмолчанию = Истина; + КонецЕсли; + КонецЕсли; + + КнопкаДалее.Заголовок = ? (ФункцияКнопкиДалее, НСтр("ru = '&Далее >'"), НСтр("ru = '&Готово'")); + + Если НоваяТекущаяСтраница = Страницы.ДлительнаяОперация Тогда + ПодключитьОбработчикОжидания("ВыполнитьПолучениеОбновления", 1, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ТекстНадписиНеобходимыеДискиИТС() + Результат = ""; + Для каждого ТекДоступноеОбновление Из Объект.ДоступныеОбновления Цикл + Если НЕ ПустаяСтрока(ТекДоступноеОбновление.НомерДискаИТС) И НЕ ПустаяСтрока(ТекДоступноеОбновление.Версия) И + ПустаяСтрока(ТекДоступноеОбновление.ПутьКЛокальномуФайлуОбновления) Тогда + Результат = Результат + ?(ПустаяСтрока(Результат), "", Символы.ПС) + ТекДоступноеОбновление.НомерДискаИТС + НСтр("ru = ' - Версия '") + ТекДоступноеОбновление.Версия; + КонецЕсли; + КонецЦикла; + + Возврат Результат; +КонецФункции + +&НаКлиенте +Функция ВосстановитьРезультатыПредыдущегоЗапуска(Отказ = Ложь) + + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + ВосстановлениеРезультатовПредЗапуска = Истина; + ИмяСтраницы = ОбработатьСтраницуДоброПожаловать(Ложь); + Обработано = ИмяСтраницы = Страницы.ДоступноеОбновление.Имя ИЛИ + ИмяСтраницы = Страницы.ВыборРежимаОбновленияСервер.Имя ИЛИ + ИмяСтраницы = Страницы.ВыборРежимаОбновленияФайл.Имя ИЛИ + ИмяСтраницы = Страницы.ПараметрыАвторизации.Имя ИЛИ + ИмяСтраницы = Страницы.ДополнительныеНастройки.Имя; + + ВосстановлениеРезультатовПредЗапуска = Ложь; + Если НЕ Обработано Тогда + Отказ = Истина; + Возврат ИмяСтраницы; + КонецЕсли; + + Если ИмяСтраницы = Страницы.ДоступноеОбновление.Имя Тогда + СписокФайловДляПолучения = СоздатьСписокФайловДляПолучения(); + Если ПроверитьФайлыОбновленияПолучены() Тогда + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Обнаружено, что файлы обновления конфигурации уже были получены и сохранены локально.'"), "Информация"); + ИмяСтраницы = ПерейтиКВыборуРежимаОбновления(Ложь); + КонецЕсли; + КонецЕсли; + + Возврат ИмяСтраницы; + +КонецФункции + +&НаКлиенте +Функция ОбработатьСтраницуДоброПожаловать(ВыдаватьСообщения = Истина) + ОчищатьДоступныеОбновления = Истина; + Если Объект.ИсточникОбновления = 0 Тогда + Возврат ПроверитьОбновлениеИнтернет(ВыдаватьСообщения); + ИначеЕсли Объект.ИсточникОбновления = 1 Тогда + Возврат ПерейтиНаСтраницуМестоположениеДискаИТС(); + ИначеЕсли Объект.ИсточникОбновления = 2 Тогда + Возврат ПроверитьОбновлениеФайл(ВыдаватьСообщения); + КонецЕсли; + Возврат Неопределено; +КонецФункции + +&НаКлиенте +Функция ПерейтиНаСтраницуМестоположениеДискаИТС() + Возврат Элементы.СтраницыПомощника.ПодчиненныеЭлементы.МестоположениеДискаИТС.Имя; +КонецФункции + +&НаКлиенте +Функция ОбработатьСтраницуМестоположениеДискаИТС(ВыдаватьСообщения = Истина) + Возврат ПроверитьОбновлениеИТС(ВыдаватьСообщения); +КонецФункции + +&НаКлиенте +Функция ОбработатьСтраницуПодключениеКИнтернет(ВыдаватьСообщения = Истина) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + Объект.ТехническаяИнформацияОбОшибке = ""; + Если СписокФайловДляПолучения.Количество() > 0 Тогда + Возврат Страницы.ДлительнаяОперация.Имя; + ИначеЕсли Объект.ДоступныеОбновления.Количество() > 0 Тогда + Возврат Страницы.ДоступноеОбновление.Имя; + КонецЕсли; + + Возврат ?(Объект.ДоступныеОбновления.Количество() = 0, ПроверитьОбновлениеИнтернет(ВыдаватьСообщения), Страницы.ПодключениеКСайту.Имя); +КонецФункции + +&НаКлиенте +Функция ОбработатьСтраницуПодключениеКСайту(ВыдаватьСообщения = Истина) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + Объект.ТехническаяИнформацияОбОшибке = ""; + Если НЕ ЗначениеЗаполнено(Объект.КодПользователяСервераОбновлений) Тогда + Если ВыдаватьСообщения Тогда + Предупреждение(НСтр("ru = 'Укажите код пользователя сервера обновлений.'")); + КонецЕсли; + ТекущийЭлемент = Элементы.КодПользователяСервераОбновлений; + Возврат Страницы.ПодключениеКСайту.Имя; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(Объект.ПарольСервераОбновлений) Тогда + Если ВыдаватьСообщения Тогда + Предупреждение(НСтр("ru = 'Укажите пароль пользователя сервера обновлений.'")); + КонецЕсли; + ТекущийЭлемент = Элементы.ПарольСервераОбновлений; + Возврат Страницы.ПодключениеКСайту.Имя; + КонецЕсли; + + Если СписокФайловДляПолучения.Количество() > 0 Тогда + Возврат Страницы.ДлительнаяОперация.Имя; + ИначеЕсли Объект.ДоступныеОбновления.Количество() > 0 Тогда + Возврат Страницы.ДоступноеОбновление.Имя; + КонецЕсли; + + Возврат ПроверитьОбновлениеИнтернет(ВыдаватьСообщения); +КонецФункции + +&НаКлиенте +Функция ОбработатьСтраницуДлительнаяОперация(ВыдаватьСообщения = Истина) + Возврат РезультатПолученияФайлов; +КонецФункции + +&НаКлиенте +Функция ОбработатьСтраницуВыборРежимаОбновления(ВыдаватьСообщения = Истина, ФлагЗавершенияРаботы = Ложь) + ТекущаяСтраница = Элементы.СтраницыПомощника.ТекущаяСтраница; + + ВыполнитьОбновление = Ложь; + Если Объект.РежимОбновления = 0 Тогда // Обновить сейчас + ИнформационнаяБазаФайловая = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая; + Если ИнформационнаяБазаФайловая И НЕ РежимИмитацииКлиентСервернойИБ() Тогда + НаличиеСоединений = НаличиеАктивныхСоединений(СообщенияДляЖурналаРегистрации); + Если НаличиеСоединений Тогда + Предупреждение(НСтр("ru = 'Невозможно продолжить обновление конфигурации, так как не завершены все соединения с информационной базой.'")); + Возврат ТекущаяСтраница.Имя; + КонецЕсли; + КонецЕсли; + ВыполнитьОбновление = Истина; + ФлагЗавершенияРаботы = Истина; + Возврат ТекущаяСтраница.Имя; + ИначеЕсли Объект.РежимОбновления = 1 Тогда // Не обновлять сейчас + УдалитьЗадачуПланировщика(Объект.КодЗадачиПланировщика); + ИначеЕсли Объект.РежимОбновления = 2 Тогда // Запланировать обновление + Если НЕ ПроверитьДопустимуюДатуОбновления(Объект.ДатаВремяОбновления, ВыдаватьСообщения) Тогда + ТекущийЭлемент = Элементы.ПолеДатаВремяОбновления; + Возврат ТекущаяСтраница.Имя; + КонецЕсли; + Если Объект.ВыслатьОтчетНаПочту Тогда + ИмяНовойСтраницы = ПроверитьНастройкиЭлектроннойПочты(ТекущаяСтраница.Имя, ВыдаватьСообщения); + Если НЕ ПустаяСтрока(ИмяНовойСтраницы) Тогда + Возврат ИмяНовойСтраницы; + КонецЕсли; + КонецЕсли; + + Если НЕ УстановленWMI(ВыдаватьСообщения) Тогда + Возврат ТекущаяСтраница.Имя; + КонецЕсли; + + Если НЕ ЗапланироватьОбновлениеКонфигурации() Тогда + Предупреждение(НСтр("ru = 'Невозможно запланировать обновление конфигурации. Сведения об ошибке сохранены в журнал регистрации.'")); + Возврат ТекущаяСтраница.Имя; + КонецЕсли; + + Иначе + Возврат ТекущаяСтраница.Имя; + КонецЕсли; + + Сообщение = Строка(ТекущаяДата()) + " " + НСтр("ru = 'Выбран режим обновления: '"); + Если Объект.РежимОбновления = 0 Тогда // Обновить сейчас + Сообщение = Сообщение + НСтр("ru = 'сейчас.'"); + ИначеЕсли Объект.РежимОбновления = 1 Тогда // Не обновлять сейчас + Сообщение = Сообщение + НСтр("ru = 'отмена.'"); + ИначеЕсли Объект.РежимОбновления = 2 Тогда // Запланировать обновление + Сообщение = Сообщение + НСтр("ru = 'запланировать.'"); + КонецЕсли; + СообщенияДляЖурналаРегистрации.Добавить(Сообщение, "Информация"); + + Закрыть(); + Возврат ТекущаяСтраница.Имя; + +КонецФункции + +&НаКлиенте +Процедура ОбработатьНажатиеКнопкиДалее(ФлагЗавершенияРаботы = Ложь) + ОчиститьСообщения(); + ТекущаяСтраница = Элементы.СтраницыПомощника.ТекущаяСтраница; + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + НоваяТекущаяСтраница = ТекущаяСтраница; + КнопкаДалее = КоманднаяПанель.ПодчиненныеЭлементы.КнопкаДалее; + КнопкаНазад = КоманднаяПанель.ПодчиненныеЭлементы.КнопкаНазад; + КнопкаЗакрыть = КоманднаяПанель.ПодчиненныеЭлементы.КнопкаЗакрыть; + + ТекущаяСтраница.Доступность = Ложь; + КнопкаДалее.Доступность = Ложь; + КнопкаНазад.Доступность = Ложь; + КнопкаЗакрыть.Доступность = Ложь; + + Если ТекущаяСтраница = Страницы.ДоброПожаловать Тогда + НоваяТекущаяСтраница = Страницы[ОбработатьСтраницуДоброПожаловать()]; + ИначеЕсли ТекущаяСтраница = Страницы.МестоположениеДискаИТС Тогда + НоваяТекущаяСтраница = Страницы[ОбработатьСтраницуМестоположениеДискаИТС()]; + ИначеЕсли ТекущаяСтраница = Страницы.ПодключениеКИнтернет Тогда + НоваяТекущаяСтраница = Страницы[ОбработатьСтраницуПодключениеКИнтернет()]; + ИначеЕсли ТекущаяСтраница = Страницы.ПодключениеКСайту Тогда + НоваяТекущаяСтраница = Страницы[ОбработатьСтраницуПодключениеКСайту()]; + ИначеЕсли ТекущаяСтраница = Страницы.ДоступноеОбновление Тогда + НоваяТекущаяСтраница = Страницы[ОбработатьСтраницуДоступноеОбновление()]; + ИначеЕсли ТекущаяСтраница = Страницы.ОбновленияНеОбнаружено Тогда + НоваяТекущаяСтраница = Страницы[ОбработатьСтраницуОбновленияНеОбнаружено()]; + ИначеЕсли ТекущаяСтраница = Страницы.ДлительнаяОперация Тогда + НоваяТекущаяСтраница = Страницы[ОбработатьСтраницуДлительнаяОперация()]; + ИначеЕсли ТекущаяСтраница = Страницы.ВыборРежимаОбновленияФайл ИЛИ + ТекущаяСтраница = Страницы.ВыборРежимаОбновленияСервер Тогда + НоваяТекущаяСтраница = Страницы[ОбработатьСтраницуВыборРежимаОбновления(, ФлагЗавершенияРаботы)]; + ИначеЕсли ТекущаяСтраница = Страницы.УспешноеОбновление Тогда + НоваяТекущаяСтраница = Страницы[ОбработатьСтраницуУспешноеОбновление()]; + ИначеЕсли ТекущаяСтраница = Страницы.НеуспешноеОбновление Тогда + НоваяТекущаяСтраница = Страницы[ОбработатьСтраницуНеуспешноеОбновление()]; + ИначеЕсли ТекущаяСтраница = Страницы.ФайлОбновления Тогда + НоваяТекущаяСтраница = Страницы[ОбработатьСтраницуФайлОбновления()]; + ИначеЕсли ТекущаяСтраница = Страницы.ПараметрыАвторизации Тогда + НоваяТекущаяСтраница = Страницы[ОбработатьСтраницуПараметрыАвторизации()]; + ИначеЕсли ТекущаяСтраница = Страницы.ДополнительныеНастройки Тогда + НоваяТекущаяСтраница = Страницы[ОбработатьСтраницуДополнительныеНастройки()]; + КонецЕсли; + + Отказ = Ложь; + ОбновлениеКонфигурацииКлиентПереопределяемый.ПриПереходеНаСтраницуПомощника(ТекущаяСтраница.Имя, + НоваяТекущаяСтраница.Имя, Отказ); + + ТекущаяСтраница.Доступность = Истина; + + // проверим, что есть доступ к возможности обновления конфигурации + Если НЕ СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ЕстьДоступДляОбновления + И (НоваяТекущаяСтраница = Страницы.ПодключениеКСайту ИЛИ + НоваяТекущаяСтраница = Страницы.ДлительнаяОперация ИЛИ + НоваяТекущаяСтраница = Страницы.ВыборРежимаОбновленияФайл ИЛИ + НоваяТекущаяСтраница = Страницы.ВыборРежимаОбновленияСервер ИЛИ + НоваяТекущаяСтраница = Страницы.ФайлОбновления) Тогда + Отказ = Истина; + КнопкаНазад.Доступность = Истина; + КнопкаДалее.Доступность = Истина; + КнопкаЗакрыть.Доступность = Истина; + Предупреждение(НСтр("ru = 'Недостаточно прав для выполнения обновления конфигурации.'")); + КонецЕсли; + + Если НЕ Отказ Тогда + ПередОткрытиемСтраницы(НоваяТекущаяСтраница); + Элементы.СтраницыПомощника.ТекущаяСтраница = НоваяТекущаяСтраница; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Функция ОбработатьСтраницуДоступноеОбновление(ВыдаватьСообщения = Истина) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + Объект.ТехническаяИнформацияОбОшибке = ""; + + Если НЕ СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ЕстьДоступДляОбновления Тогда + Предупреждение(НСтр("ru = 'Недостаточно прав для выполнения обновления конфигурации.'")); + Возврат Страницы.ДоступноеОбновление.Имя; + КонецЕсли; + + СписокФайловДляПолучения.ЗагрузитьЗначения(СоздатьСписокФайловДляПолучения()); + Если ПроверитьФайлыОбновленияПолучены() Тогда + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Обнаружено, что файлы обновления конфигурации уже были получены и сохранены локально.'"), "Информация"); + Возврат ПерейтиКВыборуРежимаОбновления(Ложь); + КонецЕсли; + + Возврат Страницы.ДлительнаяОперация.Имя; +КонецФункции + +&НаКлиенте +Функция ОбработатьСтраницуОбновленияНеОбнаружено(ВыдаватьСообщения = Истина) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + Закрыть(); + Возврат Страницы.ОбновленияНеОбнаружено.Имя; +КонецФункции + +&НаКлиенте +Функция ОбработатьСтраницуУспешноеОбновление(ВыдаватьСообщения = Истина) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + Закрыть(); + Возврат Страницы.УспешноеОбновление.Имя; +КонецФункции + +&НаКлиенте +Функция ОбработатьСтраницуНеуспешноеОбновление(ВыдаватьСообщения = Истина) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + Закрыть(); + Возврат Страницы.НеуспешноеОбновление.Имя; +КонецФункции + +&НаКлиенте +Функция ОбработатьСтраницуФайлОбновления(ВыдаватьСообщения = Истина) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + Если Объект.НуженФайлОбновления = 1 Тогда + + Если НЕ ЗначениеЗаполнено(Объект.ИмяФайлаОбновления) Тогда + Если ВыдаватьСообщения Тогда + Предупреждение(НСтр("ru = 'Укажите файл поставки обновления конфигурации.'")); + КонецЕсли; + ТекущийЭлемент = Элементы.ПолеФайлОбновления; + Возврат Страницы.ФайлОбновления.Имя; + КонецЕсли; + + Файл = Новый Файл(Объект.ИмяФайлаОбновления); + Если НЕ Файл.Существует() ИЛИ НЕ Файл.ЭтоФайл() Тогда + Если ВыдаватьСообщения Тогда + Предупреждение(НСтр("ru = 'Файл поставки обновления конфигурации не найден.'")); + КонецЕсли; + ТекущийЭлемент = Элементы.ПолеФайлОбновления; + Возврат Страницы.ФайлОбновления.Имя; + КонецЕсли; + + КонецЕсли; + + Если НЕ ПустаяСтрока(ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().КаталогФайловОбновления) Тогда + Попытка + УдалитьФайлы(ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().КаталогФайловОбновления, "*"); + Исключение + КонецПопытки; + КонецЕсли; + ПолучитьДоступноеОбновлениеИзФайла(?(Объект.НуженФайлОбновления = 1, Объект.ИмяФайлаОбновления, Неопределено),Истина); + Возврат ПерейтиКВыборуРежимаОбновления(Истина); + +КонецФункции + +&НаКлиенте +Функция ОбработатьСтраницуПараметрыАвторизации(ВыдаватьСообщения = Истина) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + ЗапрашиватьАвторизациюИБ = ЗапрашиватьПарольАдминистратора(); + УстановкаПароля = ВводитьПарольАдминистратора(); + Если ЗапрашиватьАвторизациюИБ И УстановкаПароля Тогда + Если Объект.ПарольАдминистратораИБ <> Объект.ПарольАдминистратораИБПроверка Тогда + Если ВыдаватьСообщения Тогда + Предупреждение(НСтр("ru = 'Пароль и подтверждение пароля не совпадают.'")); + КонецЕсли; + ТекущийЭлемент = Элементы.ПолеПарольАдминистратораИБ; + Возврат Страницы.ПараметрыАвторизации.Имя; + КонецЕсли; + КонецЕсли; + + Если Объект.КластерТребуетАутентификации Тогда + + Если НЕ ЗначениеЗаполнено(Объект.ИмяАдминистратораКластера) Тогда + Если ВыдаватьСообщения Тогда + Предупреждение(НСтр("ru = 'Укажите имя администратора кластера серверов.'")); + КонецЕсли; + ТекущийЭлемент = Элементы.ПолеИмяАдминистратораКластера; + Возврат Страницы.ПараметрыАвторизации.Имя; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(Объект.ПарольАдминистратораКластера) Тогда + Если ВыдаватьСообщения Тогда + Предупреждение(НСтр("ru = 'Укажите пароль администратора кластера серверов.'")); + КонецЕсли; + ТекущийЭлемент = Элементы.ПолеПарольАдминистратораКластера; + Возврат Страницы.ПараметрыАвторизации.Имя; + КонецЕсли; + + КонецЕсли; + + ТекстОшибки = ПроверитьИУстановитьПарольАдминистратора(СообщенияДляЖурналаРегистрации); + Если НЕ ПустаяСтрока(ТекстОшибки) И ВыдаватьСообщения Тогда + Если ВыдаватьСообщения Тогда + Предупреждение(НСтр("ru = 'Не удалось установить пароль администратора: '") + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецЕсли; + Возврат Страницы.ПараметрыАвторизации.Имя; + КонецЕсли; + + Возврат ПерейтиКВыборуРежимаОбновления(ВыдаватьСообщения); +КонецФункции + +&НаКлиенте +Функция ОбработатьСтраницуДополнительныеНастройки(ВыдаватьСообщения = Истина) + Возврат ПерейтиКВыборуРежимаОбновления(ВыдаватьСообщения); +КонецФункции + +&НаКлиенте +Функция ПроверитьФайлыОбновленияПолучены() + + ФайлыПолученыУспешно = Истина; + Для Каждого Файл Из СписокФайловДляПолучения Цикл + Если Файл.Значение.Обязательный И НЕ Файл.Значение.Получен Тогда + ФайлыПолученыУспешно = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ФайлыПолученыУспешно Тогда + ФайлыПолученыУспешно = РаспаковатьДистрибутивОбновления(); + КонецЕсли; + Если ФайлыПолученыУспешно Тогда + РаспаковатьРекламу(); + КонецЕсли; + Возврат ФайлыПолученыУспешно; + +КонецФункции + +&НаКлиенте +Функция ПолучитьСтруктуруДостуступногоОбновления(ПолучатьРазмерОбновления = Ложь) + + Если Объект.ДоступныеОбновления.Количество() = 0 Тогда + Возврат Неопределено; + ИначеЕсли ПолучатьРазмерОбновления = Истина Тогда + Возврат Новый Структура( "Версия, РазмерОбновления", + Объект.ДоступныеОбновления[Объект.ДоступныеОбновления.Количество()-1].Версия, + СтрокаРазмераФайла(РазмерОбновлений()) ); + Иначе + Возврат Новый Структура( "Версия", Объект.ДоступныеОбновления[Объект.ДоступныеОбновления.Количество()-1].Версия); + КонецЕсли; +КонецФункции + +// Рассчитать суммарный размер файлов обновлений. +// +// Параметры +// Объект.ДоступныеОбновления – массив – список обновлений +// +// Возвращаемое значение: +// число – размер обновлений в байтах +&НаКлиенте +Функция РазмерОбновлений() + РазмерОбновлений = 0; + Для Каждого Обновление Из Объект.ДоступныеОбновления Цикл + РазмерОбновлений = РазмерОбновлений + Обновление.РазмерФайлаОбновления; + КонецЦикла; + Возврат РазмерОбновлений; +КонецФункции + +// Получить строковое представление размера файла. +// +// Параметры +// Размер – Число – размер в байтах +// +// Возвращаемое значение: +// Строка – строковое представление размера файла, например, "10,5 Мб". +&НаКлиенте +Функция СтрокаРазмераФайла(Знач Размер) + + Если Размер < 1024 Тогда + Возврат Формат(Размер, "ЧДЦ=1") + " " + "байт"; + ИначеЕсли Размер < 1024 * 1024 Тогда + Возврат Формат(Размер / 1024, "ЧДЦ=1") + " " + "Кб"; + ИначеЕсли Размер < 1024 * 1024 * 1024 Тогда + Возврат Формат(Размер / (1024 * 1024), "ЧДЦ=1") + " " + "Мб"; + Иначе + Возврат Формат(Размер / (1024 * 1024 * 1024), "ЧДЦ=1") + " " + "Тб"; + КонецЕсли; + +КонецФункции + +// Определение каталога шаблонов конфигураций и обновлений на данном компьютере. +&НаКлиенте +Функция КаталогШаблонов() + + ИмяФайла = КаталогAppData() + "1C\1CEStart\1CEStart.cfg"; + Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF16); + Стр = ""; + Пока Стр <> Неопределено Цикл + Стр = Текст.ПрочитатьСтроку(); + Если Стр = Неопределено Тогда + Прервать; + КонецЕсли; + Если Найти(ВРег(Стр), ВРег("ConfigurationTemplatesLocation")) = 0 Тогда + Продолжить; + КонецЕсли; + ПозицияРазделителя = Найти(Стр, "="); + Если ПозицияРазделителя = 0 Тогда + Продолжить; + КонецЕсли; + Возврат ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(СокрЛП(Сред(Стр, ПозицияРазделителя + 1))); + КонецЦикла; + + Возврат КаталогAppData() + "1C\1Cv82\tmplts\"; + +КонецФункции + +// Определение каталога "Мои документы" текущего пользователя Windows +// +&НаКлиенте +Функция КаталогAppData() + + App = Новый COMОбъект("Shell.Application"); + Folder = App.Namespace(26); + Результат = Folder.Self.Path; + Возврат ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Результат); + +КонецФункции + +&НаКлиенте +Функция НайтиДискИТС(ПутиДискаИТС = "") + + Попытка + ИмяФайлаАдресовРелизовИТС = ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаАдресовРелизовИТС; + ФайловыйОбъект = Новый COMObject("Scripting.FileSystemObject"); + Приводы = ФайловыйОбъект.Drives; + Для Каждого Привод Из Приводы Цикл + Если Привод.DriveType <> 4 Тогда + Продолжить; + КонецЕсли; + Если Привод.IsReady Тогда // 4 = CD-ROM drive, http://www.microsoft.com/technet/scriptcenter/guide/sas_scr_czxq.mspx?mfr=true + Диск = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Привод.Path); + Файл = Новый Файл(Диск + ИмяФайлаАдресовРелизовИТС); + Если Файл.Существует() Тогда + Возврат Диск; + КонецЕсли; + КонецЕсли; + Если НЕ ПустаяСтрока(ПутиДискаИТС) Тогда + ПутиДискаИТС = ПутиДискаИТС + "; "; + КонецЕсли; + ПутиДискаИТС = ПутиДискаИТС + ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Привод.Path); + КонецЦикла; + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при поиске диска ИТС: '") + ОписаниеОшибки(), "Ошибка"); + Возврат ""; + КонецПопытки; + + Возврат ""; + +КонецФункции + +// Проверка, что файл является дистибутивом обновления. +// +// Параметр: +// ПутьКФайлу - Строка - путь к файлу. +// +// Возвращаемое значение: +// Булево - Истина, если файл является дистибутивом обновления. +// +&НаКлиенте +Функция ЭтоДистрибутивОбновления(Знач ПутьКФайлу) + Файл = Новый Файл(ПутьКФайлу); + Возврат Файл.Существует() И НРег(Файл.Расширение) = ".zip"; +КонецФункции + +&НаКлиенте +Функция ПерейтиКВыборуРежимаОбновления(ВыдаватьСообщения = Истина) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + ЭтоФайловаяБаза = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая; + Если ПроверитьДоступКИБ() Тогда + Возврат ?(ЭтоФайловаяБаза И НЕ РежимИмитацииКлиентСервернойИБ(), Страницы.ВыборРежимаОбновленияФайл.Имя, + Страницы.ВыборРежимаОбновленияСервер.Имя); + Иначе + Возврат ?(ЭтоФайловаяБаза, Страницы.ДополнительныеНастройки.Имя, Страницы.ПараметрыАвторизации.Имя); + КонецЕсли; +КонецФункции + +// Получение параметров аутентификации пользователя для обновления. +// Создает виртуального пользователя, если в этом есть необходимость. +// +// Возвращаемое значение +// Структура - параметры виртуального пользователя +// +&НаКлиенте +Функция ПолучитьПараметрыАутентификацииАдминистратораОбновления() + + Результат = Новый Структура("ИмяПользователя, + |ПарольПользователя, + |СтрокаПодключения, + |ПараметрыАутентификации, + |СтрокаСоединенияИнформационнойБазы", + Неопределено, "", "", "", "", ""); + + ТекущиеСоединения = ПолучитьСтрокуСоединенияИИнформациюОСоединениях(СообщенияДляЖурналаРегистрации); + Результат.СтрокаСоединенияИнформационнойБазы = ТекущиеСоединения.СтрокаСоединенияИнформационнойБазы; + // Диагностика случая, когда ролевой безопасности в системе не предусмотрено. + // Т.е. ситуация, когда любой пользователь «может» в системе все. + Если НЕ ТекущиеСоединения.ЕстьАктивныеПользователи Тогда + Возврат Результат; + КонецЕсли; + + Пользователь = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ИнформацияОПользователе.Имя; + + Результат.ИмяПользователя = Пользователь; + Результат.ПарольПользователя = Объект.ПарольАдминистратораИБ; + Результат.СтрокаПодключения = "Usr=""" + Пользователь + """;Pwd=""" + Объект.ПарольАдминистратораИБ + """;"; + Результат.ПараметрыАутентификации = "/N""" + Пользователь + """ /P""" + Объект.ПарольАдминистратораИБ + """ /WA-"; + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция ПроверитьДоступКИБ() + + Результат = Истина; + ОбнаруженнаяОшибкаПодключения = ""; + // В базовых версиях проверку подключения не осуществляем; + // при некорректном вводе имени и пароля обновление завершится неуспешно. + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + Если ПараметрыРаботыКлиента.ЭтоБазоваяВерсияКонфигурации Тогда + Возврат Результат; + КонецЕсли; + ПараметрыПодключения = ПолучитьПараметрыАутентификацииАдминистратораОбновления(); + ИмяCOMСоединителя = ПараметрыРаботыКлиента.НастройкиОбновления.ИмяCOMСоединителя; + ТекстСообщения = " " + НСтр("ru = 'Выполняется подключение к базе с помощью '") + ИмяCOMСоединителя; + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + ТекстСообщения, "Информация"); + Попытка + ComConnector = Новый COMОбъект(ИмяCOMСоединителя); + СтрокаСоединенияИнформационнойБазы = ПараметрыПодключения.СтрокаСоединенияИнформационнойБазы + ПараметрыПодключения.СтрокаПодключения; + Соединение = ComConnector.Connect(СтрокаСоединенияИнформационнойБазы); + Исключение + Результат = Ложь; + ТекстСообщения = НСтр("ru = 'Не удалось выполнить подключение к информационной базе'") + Символы.ПС; + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + ТекстСообщения + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), "Ошибка"); + ОбнаруженнаяОшибкаПодключения = ТекстСообщения + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + + Если Результат И НЕ ПараметрыРаботыКлиента.ИнформационнаяБазаФайловая Тогда + ОбнаруженнаяОшибкаПодключения = ПроверитьДоступККластеру(ПараметрыПодключения); + Результат = ПустаяСтрока(ОбнаруженнаяОшибкаПодключения); + КонецЕсли; + + Если ПустаяСтрока(ОбнаруженнаяОшибкаПодключения) Тогда + Элементы.СтраницыНадписиПроверкиПодключения.ТекущаяСтраница = Элементы.СтраницыНадписиПроверкиПодключения.ПодчиненныеЭлементы.ПочтиВсеГотово; + Иначе + Элементы.СтраницыНадписиПроверкиПодключения.ТекущаяСтраница = Элементы.СтраницыНадписиПроверкиПодключения.ПодчиненныеЭлементы.ОбнаруженаОшибкаПодключения; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция ПроверитьДоступККластеру(ПараметрыПодключения) + + Результат = ""; + Попытка + СоединенияИБ.ПроверитьПараметрыАдминистрированияИБ( + СоединенияИБ.НовыеПараметрыАдминистрированияИБ( ПараметрыПодключения.ИмяПользователя, + ПараметрыПодключения.ПарольПользователя, + ?(Объект.КластерТребуетАутентификации, Объект.ИмяАдминистратораКластера, ""), + ?(Объект.КластерТребуетАутентификации, Объект.ПарольАдминистратораКластера, ""), + ?(Объект.НестандартныеПортыСервера, Объект.ПортКластераСерверов, 0), + ?(Объект.НестандартныеПортыСервера, Объект.ПортАгентаСервера, 0)), + Истина); + Исключение + Результат = НСтр("ru = 'Ошибка при проверке соединения с кластером серверов. '") + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при проверке соединения с кластером серверов.'") + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), "Ошибка"); + КонецПопытки; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция ПроверитьНастройкиЭлектроннойПочты(ИмяТекущейСтраницы, ВыдаватьСообщения = Истина) + Если Найти(Объект.АдресЭлектроннойПочты, "@") = 0 ИЛИ Найти(Объект.АдресЭлектроннойПочты, ".") = 0 Тогда + Если ВыдаватьСообщения Тогда + Предупреждение(НСтр("ru = 'Укажите допустимый адрес электронной почты.'")); + КонецЕсли; + ТекущийЭлемент = Элементы.ПолеАдресЭлектроннойПочты; + Возврат ИмяТекущейСтраницы; + КонецЕсли; + Возврат ""; +КонецФункции + +&НаКлиенте +Функция ОпределитьИмяСкрипта() + App = Новый COMОбъект("Shell.Application"); + Попытка + Folder = App.Namespace(41); + Возврат Folder.Self.Path + "\wscript.exe"; + Исключение + Возврат "wscript.exe"; + КонецПопытки; +КонецФункции + + +// Запланировать обновление конфигурации +&НаКлиенте +Функция ЗапланироватьОбновлениеКонфигурации() + Если НЕ УдалитьЗадачуПланировщика(Объект.КодЗадачиПланировщика) Тогда + Возврат Ложь; + КонецЕсли; + ИмяГлавногоФайлаСкрипта = СформироватьФайлыСкриптаОбновления(Ложь); + + ИмяЗапускаемогоСкрипта = ОпределитьИмяСкрипта(); + ПутьЗапускаемогоСкрипта = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 %2 //nologo ""%3""", + ИмяЗапускаемогоСкрипта, ?(РежимОтладкиСкрипта(), "//X //D", ""), ИмяГлавногоФайлаСкрипта); + + Объект.КодЗадачиПланировщика = СоздатьЗадачуПланировщика(ПутьЗапускаемогоСкрипта, Объект.ДатаВремяОбновления); + ОбновлениеКонфигурации.ЗаписатьСтатусОбновления(ИмяПользователя(), Объект.КодЗадачиПланировщика <> 0, Ложь, Ложь); + Возврат Объект.КодЗадачиПланировщика <> 0; +КонецФункции + +// Создать задачу планировщика ОС Windows. +// +// Параметры +// ИмяФайлаПрограммы – Строка – путь к запускаемому приложению или файлу. +// ДатаВремя – Дата – Дата и время запуска. Значение даты может быть +// в интервале [ТекущаяДата(), ТекущаяДата() + 30 дней). +// +// Возвращаемое значение: +// Число – код созданной задачи планировщика или "Неопределено" при ошибке. +&НаКлиенте +Функция СоздатьЗадачуПланировщика(Знач ИмяФайлаПрограммы, Знач ДатаВремя) + + Попытка + Планировщик = ОбъектWMI().Get("Win32_ScheduledJob"); + КодЗадачи = 0; + КодОшибки = Планировщик.Create( ИмяФайлаПрограммы, // Command + ПреобразоватьВремяВФорматCIM( ДатаВремя), // StartTime + Ложь, // RunRepeatedly + , // DaysOfWeek + Pow(2, День(ДатаВремя) - 1), // DaysOfMonth + Ложь, // InteractWithDesktop + КодЗадачи); // out JobId + Если КодОшибки <> 0 Тогда // Коды ошибок: http://msdn2.microsoft.com/en-us/library/aa389389(VS.85).aspx + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при создании задачи планировщика: '") + КодОшибки, "Ошибка"); + КодЗадачи = 0; + Иначе + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Задача планировщика успешно запланирована ('") + + НСтр("ru = 'команда: '") + ИмяФайлаПрограммы + "; " + + НСтр("ru = 'дата: '") + ДатаВремя + "; " + + НСтр("ru = 'код задачи: '") + КодЗадачи + ").", + "Информация"); + КонецЕсли; + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при создании задачи планировщика: '") + ОписаниеОшибки(), "Ошибка"); + Возврат 0; + КонецПопытки; + Возврат КодЗадачи; + +КонецФункции + +&НаКлиенте +Функция ПреобразоватьВремяВФорматCIM(ДатаВремя) + Локатор = Новый COMObject("WbemScripting.SWbemLocator"); + Сервис = Локатор.ConnectServer(".", "\root\cimv2"); + ComputerSystems = Сервис.ExecQuery("Select * from Win32_ComputerSystem"); + Для Каждого ComputerSystem Из ComputerSystems Цикл + Разница = ComputerSystem.CurrentTimeZone; + Час = Формат(ДатаВремя,"ДФ=ЧЧ"); + Минута = Формат(ДатаВремя,"ДФ=мм"); + Разница = ?(Разница > 0, "+" + Формат(Разница, "ЧГ=0"), Формат(Разница, "ЧГ=0")); + Возврат "********" + Час + Минута + "00.000000" + Разница; + КонецЦикла; + + Возврат Неопределено; +КонецФункции + +&НаКлиенте +Функция СформироватьФайлыСкриптаОбновления(Знач ИнтерактивныйРежим) + ПараметрыОбновления = ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления(); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + СоздатьКаталог(ПараметрыОбновления.КаталогВременныхФайловОбновления); + + // Структура параметров необходима для их определения на клиенте и передачи на сервер + СтруктураПараметров = Новый Структура; + СтруктураПараметров.Вставить("ИмяФайлаРекламы", + Подг(?(Объект.ИсточникОбновления <> 2, ПараметрыОбновления.ИмяКаталогаРекламы + ПараметрыОбновления.ФайлРекламы, ""))); + СтруктураПараметров.Вставить("ИмяФайлаПрограммы" , ПараметрыОбновления.ИмяФайлаПрограммы); + СтруктураПараметров.Вставить("СобытиеЖурналаРегистрации" , ПараметрыОбновления.СобытиеЖурналаРегистрации); + СтруктураПараметров.Вставить("ИмяCOMСоединителя" , ПараметрыРаботыКлиента.НастройкиОбновления.ИмяCOMСоединителя); + СтруктураПараметров.Вставить("ЭтоБазоваяВерсияКонфигурации" , ПараметрыРаботыКлиента.ЭтоБазоваяВерсияКонфигурации); + СтруктураПараметров.Вставить("ИнформационнаяБазаФайловая" , ПараметрыРаботыКлиента.ИнформационнаяБазаФайловая); + СтруктураПараметров.Вставить("ПараметрыСкрипта" , ПолучитьПараметрыАутентификацииАдминистратораОбновления()); + //Добавим в структуру и имя запускаемой программы + + #Если Не ВебКлиент Тогда + СтруктураПараметров.Вставить("КаталогПрограммы" , КаталогПрограммы()); + #Иначе + СтруктураПараметров.Вставить("КаталогПрограммы" , ""); + #КонецЕсли + + ИменаМакетов = "ДопФайлОбновленияКонфигурации"; + Если ИнтерактивныйРежим Тогда + ИменаМакетов = ИменаМакетов + ",ЗаставкаОбновленияКонфигурации"; + Иначе + ИменаМакетов = ИменаМакетов + ",НеинтерактивноеОбновлениеКонфигурации"; + КонецЕсли; + ТекстыМакетов = ПолучитьТекстыМакетов(ИменаМакетов, СтруктураПараметров, СообщенияДляЖурналаРегистрации); + + ФайлСкрипта = Новый ТекстовыйДокумент; + ФайлСкрипта.Вывод = ИспользованиеВывода.Разрешить; + ФайлСкрипта.УстановитьТекст(ТекстыМакетов[0]); + + ИмяФайлаСкрипта = ПараметрыОбновления.КаталогВременныхФайловОбновления + "main.js"; + ФайлСкрипта.Записать(ИмяФайлаСкрипта, КодировкаТекста.UTF16); + + // Вспомогательный файл: helpers.js + ФайлСкрипта = Новый ТекстовыйДокумент; + ФайлСкрипта.Вывод = ИспользованиеВывода.Разрешить; + ФайлСкрипта.УстановитьТекст(ТекстыМакетов[1]); + ФайлСкрипта.Записать(ПараметрыОбновления.КаталогВременныхФайловОбновления + "helpers.js", КодировкаТекста.UTF16); + + ИмяГлавногоФайлаСкрипта = Неопределено; + Если ИнтерактивныйРежим Тогда + // Вспомогательный файл: splash.bmp + БиблиотекаКартинок.ЗаставкаОбновленияКонфигурации.Записать(ПараметрыОбновления.КаталогВременныхФайловОбновления + "splash.bmp"); + // Вспомогательный файл: splash.ico + БиблиотекаКартинок.ЗначокЗаставкиОбновленияКонфигурации.Записать(ПараметрыОбновления.КаталогВременныхФайловОбновления + "splash.ico"); + // Вспомогательный файл: progress.gif + БиблиотекаКартинок.ДлительнаяОперация48.Записать(ПараметрыОбновления.КаталогВременныхФайловОбновления + "progress.gif"); + // Главный файл заставки: splash.hta + ИмяГлавногоФайлаСкрипта = ПараметрыОбновления.КаталогВременныхФайловОбновления + "splash.hta"; + ФайлСкрипта = Новый ТекстовыйДокумент; + ФайлСкрипта.Вывод = ИспользованиеВывода.Разрешить; + ФайлСкрипта.УстановитьТекст(ТекстыМакетов[2]); + ФайлСкрипта.Записать(ИмяГлавногоФайлаСкрипта, КодировкаТекста.UTF16); + Иначе + ИмяГлавногоФайлаСкрипта = ПараметрыОбновления.КаталогВременныхФайловОбновления + "updater.js"; + ФайлСкрипта = Новый ТекстовыйДокумент; + ФайлСкрипта.Вывод = ИспользованиеВывода.Разрешить; + ФайлСкрипта.УстановитьТекст(ТекстыМакетов[2]); + ФайлСкрипта.Записать(ИмяГлавногоФайлаСкрипта, КодировкаТекста.UTF16); + КонецЕсли; + + Возврат ИмяГлавногоФайлаСкрипта; +КонецФункции + +&НаКлиенте +Функция УстановленWMI(Знач ВыдаватьСообщения = Истина) + Попытка + Возврат ОбъектWMI() <> Неопределено; + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Невозможно продолжить, так как на Вашем компьютере не установлен компонент Windows Management Instrumentation. '") + Символы.ПС + ОписаниеОшибки(), "Ошибка"); + Если ВыдаватьСообщения Тогда + ОткрытьФормуМодально("Обработка.ОбновлениеКонфигурации.Форма.ПредупреждениеWMI"); + КонецЕсли; + Возврат Ложь; + КонецПопытки; +КонецФункции + +&НаКлиенте +Функция ПроверитьДопустимуюДатуОбновления(ДатаВремя, ВыдаватьСообщения = Истина) + Сейчас = ТекущаяДата(); + Если ДатаВремя < Сейчас Тогда + Если ВыдаватьСообщения Тогда + Предупреждение(НСтр("ru = 'Обновление конфигурации может быть запланировано только на будущую дату и время.'")); + КонецЕсли; + Возврат Ложь; + КонецЕсли; + Если ДатаВремя > ДобавитьМесяц(Сейчас, 1) Тогда + Если ВыдаватьСообщения Тогда + Предупреждение(НСтр("ru = 'Обновление конфигурации может быть запланировано не позднее, чем через месяц относительно текущей даты.'")); + КонецЕсли; + Возврат Ложь; + КонецЕсли; + + Возврат Истина; +КонецФункции + +&НаКлиенте +Функция УдалитьЗадачуПланировщика(КодЗадачи) + + Если КодЗадачи = 0 Тогда + Возврат Истина; + КонецЕсли; + + Попытка + Сервис = ОбъектWMI(); + + Задача = ПолучитьЗадачуПланировщика(КодЗадачи); + Если Задача = Неопределено Тогда + КодЗадачи = 0; + Возврат Истина; + КонецЕсли; + + КодОшибки = Задача.Delete(); + Результат = КодОшибки = 0; + Если НЕ Результат Тогда // Коды ошибок: http://msdn2.microsoft.com/en-us/library/aa389957(VS.85).aspx + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при удалении задачи планировщика: '") + КодОшибки, "Ошибка"); + Иначе + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Задача планировщика успешно удалена (код задачи: '") + КодЗадачи + ").", "Информация"); + КодЗадачи = 0; + КонецЕсли; + + Возврат Результат; + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при удалении задачи планировщика: '") + ОписаниеОшибки(), "Ошибка"); + Возврат Ложь; + КонецПопытки; + +КонецФункции + +&НаКлиенте +Функция ВводитьПарольАдминистратора() + ДанныеПоПользователю = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ИнформацияОПользователе; + Возврат ЕстьАктивныеПользователи(СообщенияДляЖурналаРегистрации) И + (ДанныеПоПользователю.АутентификацияОС И НЕ ДанныеПоПользователю.АутентификацияСтандартная); +КонецФункции + +&НаКлиенте +Функция ЗапрашиватьПарольАдминистратора() + ДанныеПоПользователю = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ИнформацияОПользователе; + Возврат ЕстьАктивныеПользователи(СообщенияДляЖурналаРегистрации) И + ((ДанныеПоПользователю.ПарольУстановлен И ДанныеПоПользователю.АутентификацияСтандартная) ИЛИ + (ДанныеПоПользователю.АутентификацияОС И НЕ ДанныеПоПользователю.АутентификацияСтандартная)); +КонецФункции + +&НаКлиенте +Функция СоздатьСписокФайловДляПолучения() + + СписокФайлов = Новый Массив; + + КаталогОбновленияВИсточнике = ?(Объект.ИсточникОбновления = 0, ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().АдресКаталогаШаблоновНаСервереОбновлений, + ПутьКФайламОбновленияНаДискеИТС); + + Для Каждого Обновление Из Объект.ДоступныеОбновления Цикл + Если НЕ ПустаяСтрока(Обновление.ПутьКФайлуОбновления) И ПустаяСтрока(Обновление.ПутьКЛокальномуФайлуОбновления) Тогда + СтруктураИнформацииПоФайлу = Новый Структура("Адрес, ЛокальныйПуть, Обязательный, Получен"); + + КаталогФайлаОбновления = ПолучитьКаталогФайлаОбновления(Обновление); + Обновление.ЛокальныйОтносительныйКаталог = КаталогФайлаОбновления; + Обновление.ПутьКЛокальномуФайлу = ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().КаталогФайловОбновления + + КаталогФайлаОбновления + + Обновление.ФайлОбновления; + // Описание файла обновления. + СтруктураИнформацииПоФайлу.Очистить(); + СтруктураИнформацииПоФайлу.Вставить("Адрес" , КаталогОбновленияВИсточнике + Обновление.ПутьКФайлуОбновления); + СтруктураИнформацииПоФайлу.Вставить("ЛокальныйПуть" , Обновление.ПутьКЛокальномуФайлу); + СтруктураИнформацииПоФайлу.Вставить("Обязательный" , Истина); + СтруктураИнформацииПоФайлу.Вставить("Получен" , ОпределитьФайлПолучен(СтруктураИнформацииПоФайлу, + Обновление.РазмерФайлаОбновления)); + СписокФайлов.Добавить(СтруктураИнформацииПоФайлу); + КонецЕсли; + КонецЦикла; + + Если (Объект.ИсточникОбновления = 0) ИЛИ + (Объект.ИсточникОбновления = 1 И + Объект.ДоступныеОбновления.Количество() > 0 И + ПоследняяВерсияКонфигурации = Объект.ДоступныеОбновления[Объект.ДоступныеОбновления.Количество()-1].Версия) Тогда + // Архив рекламы ФайлАрхиваРекламы лежит "рядом" с обновлением конфигурации. + Поз = Найти(Обновление.ПутьКФайлуОбновления, СтрЗаменить(Обновление.Версия, ".", "_")); + + СтруктураИнформацииПоФайлу = Новый Структура("Адрес, ЛокальныйПуть, Обязательный, Получен"); + + // Описание файла рекламы + СтруктураИнформацииПоФайлу.Очистить(); + СтруктураИнформацииПоФайлу.Вставить("Адрес" , ?(Объект.ИсточникОбновления = 0, ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().АдресКаталогаШаблоновНаСервереОбновлений + + Лев(Обновление.ПутьКФайлуОбновления, Поз-1) + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ФайлАрхиваРекламы, + + ПутьКФайламОбновленияНаДискеИТС + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ФайлАрхиваРекламы)); + СтруктураИнформацииПоФайлу.Вставить("ЛокальныйПуть" , ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяКаталогаРекламы + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ФайлАрхиваРекламы); + СтруктураИнформацииПоФайлу.Вставить("Обязательный" , Ложь); + СтруктураИнформацииПоФайлу.Вставить("Получен" , ОпределитьФайлПолучен(СтруктураИнформацииПоФайлу, + Обновление.РазмерФайлаОбновления)); + СписокФайлов.Добавить(СтруктураИнформацииПоФайлу); + КонецЕсли; + + Возврат СписокФайлов; + +КонецФункции + +&НаКлиенте +Функция ОпределитьФайлПолучен(ОписаниеФайла, Размер) + Файл = Новый Файл(ОписаниеФайла.ЛокальныйПуть); + Возврат Файл.Существует() И Файл.Размер() = Размер; +КонецФункции + +// Получение файла описания обновления с сервера +&НаКлиенте +Функция ПолучитьФайлОписанияОбновления() + + ИмяФайла = ПолучитьИмяЛокальногоФайлаОписанияОбновления(); + Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте( СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.АдресСервераДляПроверкиНаличияОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().АдресРесурсовДляПроверкиНаличияОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаОписанияОбновления, + Новый Структура("ПутьДляСохранения", + ? (ПустаяСтрока(ИмяФайла), Неопределено, ИмяФайла))); + Если Результат.Статус Тогда + Возврат ИмяФайла; + Иначе + Попытка + УдалитьФайлы(ИмяФайла); + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при удалении временного файла '") + ИмяФайла + Символы.ПС + + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + "Ошибка"); + КонецПопытки; + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +&НаКлиенте +Функция ПолучитьФайлСпискаШаблоновИТС(Знач ВыдаватьСообщения = Истина) + + Возврат ОбновлениеКонфигурацииКлиент.СкопироватьФайл( ПутьКФайламОбновленияНаДискеИТС + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаСпискаШаблонов, + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().КаталогФайловОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаСпискаШаблонов); + +КонецФункции + +&НаКлиенте +Функция ПолучитьИмяЛокальногоФайлаПорядкаОбновления() + Возврат ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().КаталогФайловОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаПорядкаОбновления; +КонецФункции + +&НаКлиенте +Функция ПолучитьИмяЛокальногоФайлаОписанияОбновления() + Возврат ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().КаталогФайловОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаОписанияОбновления; +КонецФункции + +// Получение файла порядка обновления с сервера. +&НаКлиенте +Функция ПолучитьФайлПорядкаОбновления() + + ИмяФайла = ПолучитьИмяЛокальногоФайлаПорядкаОбновления(); + Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте( СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.АдресСервераДляПроверкиНаличияОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().АдресРесурсовДляПроверкиНаличияОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаПорядкаОбновления, + Новый Структура("ПутьДляСохранения", + ? (ПустаяСтрока(ИмяФайла), Неопределено, ИмяФайла))); + Если Результат.Статус Тогда + Возврат ИмяФайла; + Иначе + Попытка + УдалитьФайлы(ИмяФайла); + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при удалении временного файла '") + ИмяФайла + Символы.ПС + + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + "Ошибка"); + КонецПопытки; + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +&НаКлиенте +Функция ПолучитьФайлПорядкаОбновленияИТС() + + ИмяФайла = ПолучитьИмяЛокальногоФайлаПорядкаОбновления(); + Если НЕ ОбновлениеКонфигурацииКлиент.СкопироватьФайл( ПутьКФайламОбновленияНаДискеИТС + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаПорядкаОбновления, + + ИмяФайла) Тогда + Попытка + УдалитьФайлы(ИмяФайла); + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при удалении временного файла '") + ИмяФайла + Символы.ПС + + ОписаниеОшибки(), + "Ошибка"); + КонецПопытки; + Возврат Неопределено; + КонецЕсли; + Возврат ИмяФайла; + +КонецФункции + +&НаКлиенте +Процедура ПолучитьДоступноеОбновлениеИзФайла(Знач ИмяФайла, ФайловыйВариант = Ложь) + Если ЗначениеЗаполнено(ИмяФайла) Тогда + Если ФайловыйВариант Тогда + Объект.ДоступныеОбновления.Очистить(); + КонецЕсли; + НовоеДоступноеОбновление = Объект.ДоступныеОбновления.Добавить(); + НовоеДоступноеОбновление.ПутьКЛокальномуФайлу = ИмяФайла; + НовоеДоступноеОбновление.ПутьКЛокальномуФайлуОбновления = ИмяФайла; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьФайлОписанияОбновленияИТС() + + ИмяФайла = ПолучитьИмяЛокальногоФайлаОписанияОбновления(); + Если НЕ ОбновлениеКонфигурацииКлиент.СкопироватьФайл( ПутьКФайламОбновленияНаДискеИТС + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаОписанияОбновления, + + ИмяФайла) Тогда + Возврат Неопределено; + КонецЕсли; + Возврат ИмяФайла; + +КонецФункции + +// Получение каталога файла обновления. +// +// Параметр: +// ДоступноеОбновление - Строка таблицы значений, содержащая информацию о +// доступном обновлении. +// +// Возвращаемое значение: +// Строка - каталог файла обновления. +// +&НаКлиенте +Функция ПолучитьКаталогФайлаОбновления(ДоступноеОбновление) + + Если ДоступноеОбновление = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + КороткоеИмяКонфигурации = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.КороткоеИмяКонфигурации; + КороткоеИмяКонфигурации = СтрЗаменить(КороткоеИмяКонфигурации, "/", "\"); + КороткоеИмяКонфигурации = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КороткоеИмяКонфигурации); + Результат = СтрЗаменить(ДоступноеОбновление.ПутьКФайлуОбновления, "/", "\"); + Результат = ОбновлениеКонфигурацииКлиент.ПолучитьКаталогФайла(Результат); + Результат = СтрЗаменить(Результат, "_", "."); + Если Объект.ИсточникОбновления = 1 Тогда + Результат = "ITS\" + КороткоеИмяКонфигурации + Результат; + КонецЕсли; + Результат = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Результат); + Возврат Результат; + +КонецФункции + +// Распаковка файла рекламы +&НаКлиенте +Процедура РаспаковатьРекламу() + #Если НЕ ВебКлиент Тогда + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Выполняется распаковка файлов рекламы...'"), "Информация"); + Если ФайлСуществуетНаКлиенте(ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ПутьКФайлуАрхиваРекламы) Тогда + Попытка + ЧтениеZip = Новый ЧтениеZipФайла(ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ПутьКФайлуАрхиваРекламы); + ЧтениеZip.ИзвлечьВсе(ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяКаталогаРекламы, РежимВосстановленияПутейФайловZIP.Восстанавливать); + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Файлы рекламы успешно обработаны!'"), "Информация"); + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при распаковке файлов рекламы: '") + ОписаниеОшибки(), "Ошибка"); + КонецПопытки; + УдалитьФайлы(ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяКаталогаРекламы, "*.zip"); + КонецЕсли; + #КонецЕсли +КонецПроцедуры + +// Распаковка дистрибутива обновления. +&НаКлиенте +Функция РаспаковатьДистрибутивОбновления() + #Если НЕ ВебКлиент Тогда + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Выполняется распаковка дистрибутива обновления...'"), "Информация"); + Для Каждого Обновление Из Объект.ДоступныеОбновления Цикл + Если ЭтоДистрибутивОбновления(Обновление.ПутьКЛокальномуФайлу) Тогда + Попытка + ЧтениеZip = Новый ЧтениеZipФайла(Обновление.ПутьКЛокальномуФайлу); + КаталогНазначения = КаталогШаблонов() + Обновление.ЛокальныйОтносительныйКаталог; + ЧтениеZip.ИзвлечьВсе(КаталогНазначения, РежимВосстановленияПутейФайловZIP.Восстанавливать); + ИмяФайлаОбновления = КаталогНазначения + "1cv8.cfu"; + Если НЕ ФайлСуществуетНаКлиенте(ИмяФайлаОбновления) Тогда + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Дистрибутив обновления не содержит 1cv8.cfu: '") + Обновление.ПутьКЛокальномуФайлу, "Ошибка"); + Возврат Ложь; + КонецЕсли; + Обновление.ПутьКЛокальномуФайлуОбновления = ИмяФайлаОбновления; + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Файлы дистрибутива обновления успешно распакованы: '") + ИмяФайлаОбновления, "Информация"); + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при распаковке дистрибутива обновления: '") + ОписаниеОшибки(), "Ошибка"); + Возврат Ложь; + КонецПопытки; + Попытка + ЧтениеZip = Новый ЧтениеZipФайла(Обновление.ПутьКЛокальномуФайлу); + КаталогНазначения = ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().КаталогФайловОбновления + Обновление.ЛокальныйОтносительныйКаталог; + ЧтениеZip.ИзвлечьВсе(КаталогНазначения, РежимВосстановленияПутейФайловZIP.Восстанавливать); + ИмяФайлаОбновления = КаталогНазначения + "1cv8.cfu"; + Если НЕ ФайлСуществуетНаКлиенте(ИмяФайлаОбновления) Тогда + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Дистрибутив обновления не содержит 1cv8.cfu: '") + Обновление.ПутьКЛокальномуФайлу, "Ошибка"); + Возврат Ложь; + КонецЕсли; + Обновление.ПутьКЛокальномуФайлуОбновления = ИмяФайлаОбновления; + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Файлы дистрибутива обновления успешно распакованы: '") + ИмяФайлаОбновления, "Информация"); + ЧтениеZip.Закрыть(); + Если НЕ ПустаяСтрока(Обновление.ПутьКЛокальномуФайлу) Тогда + УдалитьФайлы(Обновление.ПутьКЛокальномуФайлу); + КонецЕсли; + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при распаковке дистрибутива обновления: '") + ОписаниеОшибки(), "Ошибка"); + Возврат Ложь; + КонецПопытки; + Иначе + Обновление.ПутьКЛокальномуФайлуОбновления = ?(ПустаяСтрока(Обновление.ПутьКЛокальномуФайлуОбновления), Обновление.ПутьКЛокальномуФайлу, Обновление.ПутьКЛокальномуФайлуОбновления); + КонецЕсли; + КонецЦикла; + Возврат Истина; + #КонецЕсли +КонецФункции + +&НаКлиенте +Процедура ПолучитьДоступныеОбновления(ПараметрыОбновления, ВерсияКонфигурации, ВыдаватьСообщения) + + ПутьКФайлуСпискаОбновлений = ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().КаталогФайловОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяФайлаСпискаШаблонов; + АдресФайлаВоВремХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ПутьКФайлуСпискаОбновлений)); + Попытка + ПолучитьДоступныеОбновленияВИнтервале(СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ВерсияКонфигурации, + ВерсияКонфигурации, АдресФайлаВоВремХранилище, СообщенияДляЖурналаРегистрации); + Исключение + Если ВыдаватьСообщения Тогда + Предупреждение(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецЕсли; + КонецПопытки; + +КонецПроцедуры + +// Получение файла списка шаблонов с сервера +&НаКлиенте +Функция ПолучитьФайлСпискаШаблонов(Знач ВыдаватьСообщения = Истина) + #Если НЕ ВебКлиент Тогда + ПутьКФайлуСпискаШаблонов = ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().КаталогФайловОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяZipФайлаСпискаШаблонов; + + Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте( СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.АдресСервераДляПроверкиНаличияОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().АдресРесурсовДляПроверкиНаличияОбновления + + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяZipФайлаСпискаШаблонов, + Новый Структура("ПутьДляСохранения", + ? (ПустаяСтрока(ПутьКФайлуСпискаШаблонов), Неопределено, ПутьКФайлуСпискаШаблонов))); + Если Результат.Статус <> Истина Тогда + ТекстОшибки = НСтр("ru = 'Ошибка при получении файла списка шаблонов: '")+ОписаниеОшибки(); + Попытка + УдалитьФайлы(ПутьКФайлуСпискаШаблонов); + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при удалении временного файла '") + ПутьКФайлуСпискаШаблонов + Символы.ПС + + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + "Ошибка"); + КонецПопытки; + Если НЕ ПустаяСтрока(ТекстОшибки) Тогда + Если ВыдаватьСообщения Тогда + Предупреждение(ТекстОшибки); + КонецЕсли; + Возврат ТекстОшибки; + КонецЕсли; + КонецЕсли; + + Если НЕ ФайлСуществуетНаКлиенте(ПутьКФайлуСпискаШаблонов) Тогда + Возврат НСтр("ru = 'Файл не существует: '") + ПутьКФайлуСпискаШаблонов; + КонецЕсли; + Попытка + ЧтениеZip = Новый ЧтениеZipФайла(ПутьКФайлуСпискаШаблонов); + ЧтениеZip.ИзвлечьВсе( ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().КаталогФайловОбновления, + РежимВосстановленияПутейФайловZIP.НеВосстанавливать); + Исключение + ТекстОшибки = Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при распаковке файла со списком доступных обновлений: '"); + ИнфоОшибки = ИнформацияОбОшибке(); + СообщенияДляЖурналаРегистрации.Добавить(ТекстОшибки + ПодробноеПредставлениеОшибки(ИнфоОшибки), "Ошибка"); + ТекстОшибки = ТекстОшибки + КраткоеПредставлениеОшибки(ИнфоОшибки); + КонецПопытки; + УдалитьФайлы( ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().КаталогФайловОбновления, + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().ИмяZipФайлаСпискаШаблонов); + Возврат ""; + #КонецЕсли +КонецФункции + +// Проверка существования файла или каталога. +// +// Параметр: +// ПутьКФайлу - Строка - путь к файлу или каталогу, существование которого +// нужно проверить. +// +// Возвращаемое значение: +// Булево - признак существования файла или каталога. +&НаКлиенте +Функция ФайлСуществуетНаКлиенте(Знач ПутьКФайлу) + Файл = Новый Файл(ПутьКФайлу); + Возврат Файл.Существует(); +КонецФункции + +&НаКлиенте +Функция ПолучитьОбновление(ВыдаватьСообщения = Истина) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + Сообщение = Строка(ТекущаяДата()) + " "; + Если Объект.ИсточникОбновления = 0 Тогда + Сообщение = Сообщение + НСтр("ru = 'Получение файлов из Интернета...'"); + ИначеЕсли Объект.ИсточникОбновления = 1 Тогда + Сообщение = Сообщение + НСтр("ru = 'Получение файлов с диска ИТС...'"); + Иначе + Сообщение = Сообщение + НСтр("ru = 'Получение файла обновления из указанного источника...'"); + КонецЕсли; + СообщенияДляЖурналаРегистрации.Добавить(Сообщение, "Информация"); + + Объект.ТехническаяИнформацияОбОшибке = ""; + НомерФайла = 1; + Для Каждого Файл Из СписокФайловДляПолучения Цикл + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется получение файлов обновления: %1 из %2...'"), + Строка(НомерФайла), Строка(СписокФайловДляПолучения.Количество())); + Элементы.НадписьПрогресс.Заголовок = Сообщение; + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + Сообщение, "Информация"); + + Если Файл.Значение <> Неопределено И Файл.Значение.Получен <> Истина Тогда // может быть также Неопределено + Если Объект.ИсточникОбновления = 0 Тогда + СоздатьКаталог(ОбновлениеКонфигурацииКлиент.ПолучитьКаталогФайла(Файл.Значение.ЛокальныйПуть)); + Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте( + ОбновлениеКонфигурацииКлиентПовтИсп.ПолучитьПараметрыОбновления().АдресСервераОбновлений + Файл.Значение.Адрес, + Новый Структура("ПутьДляСохранения, Пользователь, Пароль", + ? (ПустаяСтрока(Файл.Значение.ЛокальныйПуть), Неопределено, Файл.Значение.ЛокальныйПуть), + Объект.КодПользователяСервераОбновлений, + Объект.ПарольСервераОбновлений)); + ТекстОшибки = ""; + Если Результат.Статус <> Истина Тогда + ТекстОшибки = Результат.СообщениеОбОшибке; + Попытка + УдалитьФайлы(Файл.Значение.ЛокальныйПуть); + Исключение + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Ошибка при удалении временного файла '") + + Файл.Значение.ЛокальныйПуть + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + "Ошибка"); + КонецПопытки; + Если НЕ ПустаяСтрока(ТекстОшибки) Тогда + Если Файл.Значение.Обязательный И ВыдаватьСообщения Тогда + //Предупреждение(ТекстОшибки); + Возврат Страницы.ПодключениеКСайту.Имя; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Файл.Значение.Получен = ПустаяСтрока(ТекстОшибки); + + Если НЕ Файл.Значение.Получен И Файл.Значение.Обязательный Тогда + Возврат Страницы.ПодключениеКСайту.Имя; + КонецЕсли; + Иначе + Файл.Значение.Получен = ОбновлениеКонфигурацииКлиент.СкопироватьФайл( Файл.Значение.Адрес, Файл.Значение.ЛокальныйПуть, + Файл.Значение.Обязательный И ВыдаватьСообщения); + КонецЕсли; + КонецЕсли; + НомерФайла = НомерФайла + 1; + КонецЦикла; + + ИмяСтраницы = ""; + ФайлыПолученыУспешно = ПроверитьФайлыОбновленияПолучены(); + Если ФайлыПолученыУспешно Тогда + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Файлы обновления успешно получены.'"), "Информация"); + Если Объект.ИсточникОбновления = 1 Тогда + ИмяСтраницы = Страницы.ДоступноеОбновление.Имя; + Иначе + ИмяСтраницы = ПерейтиКВыборуРежимаОбновления(Ложь); + КонецЕсли; + Иначе + Сообщение = Строка(ТекущаяДата()) + " " + НСтр("ru = 'Не удалось получить обновление конфигурации.'"); + СообщенияДляЖурналаРегистрации.Добавить(Сообщение, "Ошибка"); + //Если ВыдаватьСообщения Тогда + // ТекущаяСтраница = Элементы.СтраницыПомощника.ТекущаяСтраница; + // Предупреждение(Сообщение); + // Элементы.СтраницыПомощника.ТекущаяСтраница = ТекущаяСтраница; + //КонецЕсли; + ИмяСтраницы = Страницы.ДлительнаяОперация.Имя; + КонецЕсли; + Возврат ИмяСтраницы; + +КонецФункции + +&НаКлиенте +Функция ПолучитьФайлыОбновленияЧерезИнтернет(ВыдаватьСообщения) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + Если ДоступноеОбновлениеКонфигурации.ИмяСтраницы = Страницы.ДоступноеОбновление.Имя Тогда + ТекстОшибки = ПолучитьФайлСпискаШаблонов(ВыдаватьСообщения); + Если НЕ ПустаяСтрока(ТекстОшибки) Тогда + Возврат Страницы.ПодключениеКИнтернет.Имя; + КонецЕсли; + + ИмяФайлаИнформацияОбОбновлении = ПолучитьФайлОписанияОбновления(); + ИмяФайлаПорядокОбновления = ПолучитьФайлПорядкаОбновления(); + + ПолучитьДоступныеОбновления(ДоступноеОбновлениеКонфигурации.ПараметрыФайлаПроверкиОбновления, + ДоступноеОбновлениеКонфигурации.ПоследняяВерсияКонфигурации, ВыдаватьСообщения); + ПоследняяВерсияКонфигурации = ДоступноеОбновлениеКонфигурации.ПоследняяВерсияКонфигурации; + Если Объект.ДоступныеОбновления.Количество() = 0 Тогда + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Невозможно продолжить обновление: нет доступных обновлений.'"), "Информация"); + Возврат Страницы.ОбновленияНеОбнаружено.Имя; + КонецЕсли; + КонецЕсли; + + Возврат ДоступноеОбновлениеКонфигурации.ИмяСтраницы; +КонецФункции + +&НаКлиенте +Функция ПроверитьОбновлениеИнтернет(ВыдаватьСообщения = Истина) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Проверка обновления в Интернете...'"), "Информация"); + ДоступноеОбновление = Неопределено; + Объект.ДоступныеОбновления.Очистить(); + + ОбновлениеКонфигурацииКлиент.ПроверитьНаличиеОбновленияЧерезИнтернет(ВыдаватьСообщения); + + Возврат ПолучитьФайлыОбновленияЧерезИнтернет(ВыдаватьСообщения); +КонецФункции + +&НаКлиенте +Функция ПроверитьОбновлениеИТС(ВыдаватьСообщения = Истина) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Проверка обновления на диске ИТС...'"), "Информация"); + ДоступноеОбновление = Неопределено; + + // очистка доступных обновлений не должна происходить, когда мы получаем цепочку обновлений + Если ОчищатьДоступныеОбновления Тогда + Объект.ДоступныеОбновления.Очистить(); + ОчищатьДоступныеОбновления = Ложь; + КонецЕсли; + + ПутиДискаИТС = ""; + Если Объект.ИсточникДискаИТС <> 1 Тогда + ТекущийДискИТС = НайтиДискИТС(ПутиДискаИТС); + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Обнаружен диск ИТС: '") + ДискИТС, "Информация"); + Иначе + Если ПустаяСтрока(ДискИТС) Тогда + Предупреждение(НСтр("ru = 'Укажите местоположение диска ИТС.'")); + Возврат Страницы.МестоположениеДискаИТС.Имя; + КонецЕсли; + ПроверкаСуществования = Новый Файл(ДискИТС); + Если НЕ ПроверкаСуществования.Существует() ИЛИ НЕ ПроверкаСуществования.ЭтоКаталог() Тогда + Предупреждение(НСтр("ru = 'Указанный каталог не существует.'")); + Возврат Страницы.МестоположениеДискаИТС.Имя; + КонецЕсли; + ТекущийДискИТС = ДискИТС; + КонецЕсли; + + ПутьКФайламОбновленияНаДискеИТС = ""; + ПереченьРелизовНаДискахИТС = ""; + ПараметрыРелизовНаДискеИТС = ОбновлениеКонфигурацииКлиент.ПолучитьПараметрыРелизовНаДискеИТС(ТекущийДискИТС); + Если ПустаяСтрока(ТекущийДискИТС) Тогда + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Диск ИТС не найден по указанным путям: + |%1'"), ПутиДискаИТС); + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + СтрокаСообщения, "Предупреждение"); + Элементы.НадписьОбновлениеНеОбнаружено.Заголовок = СтрокаСообщения; + Возврат Страницы.ОбновленияНеОбнаружено.Имя; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(ПараметрыРелизовНаДискеИТС) Тогда + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'На диске ИТС не найден каталог обновления. + |%1'"), ТекущийДискИТС); + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + СтрокаСообщения, "Предупреждение"); + Элементы.НадписьОбновлениеНеОбнаружено.Заголовок = СтрокаСообщения; + Возврат Страницы.ОбновленияНеОбнаружено.Имя; + КонецЕсли; + ПутьКФайламОбновленияНаДискеИТС = ПараметрыРелизовНаДискеИТС.ПутьКФайламОбновленияНаДискеИТС; + ПереченьРелизовНаДискахИТС = ПараметрыРелизовНаДискеИТС.ПутьКСтатьеПеречнюРелизов; + + ПараметрыОбновления = ОбновлениеКонфигурацииКлиент.ПолучитьПараметрыОбновленияИТС(ПутьКФайламОбновленияНаДискеИТС, ВыдаватьСообщения); + Если НЕ ЗначениеЗаполнено(ПараметрыОбновления) Тогда + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'На диске ИТС не найдена информация о последнем обновлении. + |%1'"), ТекущийДискИТС); + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + СтрокаСообщения, "Предупреждение"); + Элементы.НадписьОбновлениеНеОбнаружено.Заголовок = СтрокаСообщения; + Возврат Страницы.ОбновленияНеОбнаружено.Имя; + КонецЕсли; + + ПоследняяВерсияКонфигурации = ПараметрыОбновления.Version; + ТекущаяВерсияКонфигурации = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ВерсияКонфигурации; + Если СтроковыеФункцииКлиентСервер.СравнитьВерсии(ТекущаяВерсияКонфигурации, ПоследняяВерсияКонфигурации) >= 0 Тогда + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Нет доступных обновлений. + |%1'"), ТекущийДискИТС); + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + СтрокаСообщения, "Предупреждение"); + Элементы.НадписьОбновлениеНеОбнаружено.Заголовок = СтрокаСообщения; + Возврат Страницы.ОбновленияНеОбнаружено.Имя; + КонецЕсли; + + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Обнаружена более новая версия конфигурации на диске ИТС: '") + + ПоследняяВерсияКонфигурации + ".", "Информация"); + + Если НЕ ПолучитьФайлСпискаШаблоновИТС(ВыдаватьСообщения) Тогда + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'На диске ИТС не найден список доступных обновлений. + |%1'"), ТекущийДискИТС); + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + СтрокаСообщения, "Предупреждение"); + Элементы.НадписьОбновлениеНеОбнаружено.Заголовок = СтрокаСообщения; + Возврат Страницы.ОбновленияНеОбнаружено.Имя; + КонецЕсли; + + ПолучитьДоступныеОбновления(ПараметрыОбновления, ПоследняяВерсияКонфигурации, ВыдаватьСообщения); + Если Объект.ДоступныеОбновления.Количество() = 0 Тогда + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Нет доступных обновлений. + |%1'"), ТекущийДискИТС); + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + СтрокаСообщения, "Информация"); + Элементы.НадписьОбновлениеНеОбнаружено.Заголовок = СтрокаСообщения; + Возврат Страницы.ОбновленияНеОбнаружено.Имя; + КонецЕсли; + + // Получение файла описания обновлений выполняется только ести вставлен последний в цепочке диск ИТС + Если Объект.ДоступныеОбновления.Количество() > 0 И + ПоследняяВерсияКонфигурации = Объект.ДоступныеОбновления[Объект.ДоступныеОбновления.Количество()-1].Версия Тогда + ИмяФайлаИнформацияОбОбновлении = ПолучитьФайлОписанияОбновленияИТС(); + ИмяФайлаПорядокОбновления = ПолучитьФайлПорядкаОбновленияИТС(); + КонецЕсли; + + // сразу нужно получить файлы обновления с диска ИТС + СписокФайловДляПолучения.ЗагрузитьЗначения(СоздатьСписокФайловДляПолучения()); + РезультатПолученияФайлов = ПолучитьОбновление(); + + Возврат Страницы.ДоступноеОбновление.Имя; +КонецФункции + +&НаКлиенте +Процедура ВыполнитьПолучениеОбновления() + ТекущаяСтраница = Элементы.СтраницыПомощника.ТекущаяСтраница; + РезультатПолученияФайлов = ПолучитьОбновление(); + Элементы.СтраницыПомощника.ТекущаяСтраница = ТекущаяСтраница; + ОбработатьНажатиеКнопкиДалее(); +КонецПроцедуры + +&НаКлиенте +Функция ВернутьДату(Дата, Время) + Возврат Дата(Год(Дата), Месяц(Дата), День(Дата), Час(Время), Минута(Время), Секунда(Время)); +КонецФункции + +&НаКлиенте +Функция ПроверитьОбновлениеФайл(ВыдаватьСообщения = Истина) + Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Проверка обновления в Интернете...'"), "Информация"); + Объект.ДоступныеОбновления.Очистить(); + + Если ВосстановлениеРезультатовПредЗапуска <> Истина Тогда + Возврат Страницы.ФайлОбновления.Имя; + КонецЕсли; + + Если Объект.НуженФайлОбновления = 1 Тогда + Файл = Новый Файл(Объект.ИмяФайлаОбновления); + Если НЕ Файл.Существует() ИЛИ НЕ Файл.ЭтоФайл() Тогда + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Невозможно продолжить обновление: файл поставки обновления конфигурации не найден.'"), + "Информация"); + Возврат Страницы.ФайлОбновления.Имя; + КонецЕсли; + КонецЕсли; + + ПолучитьДоступноеОбновлениеИзФайла(?(Объект.НуженФайлОбновления = 1, Объект.ИмяФайлаОбновления, Неопределено)); + Возврат ПерейтиКВыборуРежимаОбновления(Ложь); + +КонецФункции + +&НаКлиенте +Функция ТекстНадписиРезервнойКопииИБ() + Результат = НСтр("ru = 'Не создавать резервную копию ИБ и не выполнять откат при нештатной ситуации'"); + Если Объект.СоздаватьРезервнуюКопию = 0 Тогда + Результат = НСтр("ru = 'Создавать временную резервную копию ИБ и выполнять откат при нештатной ситуации'"); + ИначеЕсли Объект.СоздаватьРезервнуюКопию = 1 Тогда + Если Объект.ВосстанавливатьИнформационнуюБазу Тогда + Результат = НСтр("ru = 'Создавать резервную копию ИБ и выполнять откат при нештатной ситуации'"); + Иначе + Результат = НСтр("ru = 'Создавать резервную копию ИБ и не выполнять откат при нештатной ситуации'"); + КонецЕсли; + КонецЕсли; + Возврат Результат; +КонецФункции + +&НаКлиенте +Функция ТекстНадписиПроверкиОбновления() + Результат = НСтр("ru = 'Отключена'"); + Если Объект.ПроверятьНаличиеОбновленияПриЗапуске = 2 Тогда + Результат = НСтр("ru = 'При каждом запуске программы'"); + ИначеЕсли Объект.ПроверятьНаличиеОбновленияПриЗапуске = 1 Тогда + Результат = НСтр("ru = 'По расписанию: '") + Строка(Объект.РасписаниеПроверкиНаличияОбновления); + КонецЕсли; + Возврат Результат; +КонецФункции + +&НаКлиенте +Процедура ВыполнитьОбновлениеКонфигурации() + + УдалитьЗадачуПланировщика(Объект.КодЗадачиПланировщика); + ИмяГлавногоФайлаСкрипта = СформироватьФайлыСкриптаОбновления(Истина); + СообщенияДляЖурналаРегистрации.Добавить(Строка(ТекущаяДата()) + " " + НСтр("ru = 'Выполняется процедура обновления конфигурации: '") + ИмяГлавногоФайлаСкрипта, "Информация"); + ОбновлениеКонфигурации.ЗаписатьСтатусОбновления(ИмяПользователя(), Истина, Ложь, Ложь, СообщенияДляЖурналаРегистрации); + ЗапуститьПриложение("""" + ИмяГлавногоФайлаСкрипта + """", ОбновлениеКонфигурацииКлиент.ПолучитьКаталогФайла(ИмяГлавногоФайлаСкрипта)); + +КонецПроцедуры + +&НаКлиенте +Функция ОбъектWMI() + // WMI: http://www.microsoft.com/technet/scriptcenter/resources/wmifaq.mspx + Локатор = Новый COMObject("WbemScripting.SWbemLocator"); + Возврат Локатор.ConnectServer(".", "\root\cimv2"); +КонецФункции + +&НаКлиенте +Функция ПолучитьЗадачуПланировщика(Знач КодЗадачи) + Если КодЗадачи = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + Попытка + Возврат ОбъектWMI().Get("Win32_ScheduledJob.JobID=" + КодЗадачи); + Исключение + Возврат Неопределено; + КонецПопытки; +КонецФункции diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Help/ru.html b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Help/ru.html new file mode 100644 index 000000000..8d77a696a --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Help/ru.html @@ -0,0 +1,29 @@ + +

    Обновление конфигурации

    +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +

    В первом случае необходимо вставить диск ИТС в привод и нажать кнопку «Далее». Помощник автоматически проверит наличие обновления на указанном диске ИТС, если имеется доступное обновление, то система сообщает номер версии, краткое описание, размер обновления и предлагает его установить.

    +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +

    Диагностика нештатных ситуаций

    +
    • Записи о произведенных операциях и возникших ошибках в ходе обновления заносятся в Журнал регистрации информационной базы (тип события «Обновление информационной базы»). +
    • В процессе установки обновления во временной папке текущего пользователя Windows создается лог-файл с записями о ходе обновления. (Содержимое лог-файла впоследствии автоматически добавляется в Журнал регистрации.) Последний из каталогов вида %temp%\1CUpdate.<набор цифр>, отсортированных по алфавиту, соответствует последней сессии обновления. +
    • Результат обновления информационной базы записывается в Журнал событий Windows (Event Log).

    Если в результате нештатной ситуации при обновлении база оказалась заблокированной, то ее можно разбловировать с помощью консоли "Администрирование серверов 1С:Предприятия", либо из командной строки, запустив 1С:Предприятие от имени администратора с ключом РазрешитьРаботуПользователей и указав код разблокировки ПакетноеОбновлениеКонфигурацииИБ. Например:

    +

    "C:\Program Files\1cv82\bin\1cv8.exe"  ENTERPRISE /S"server\base" /N"Администратор" /P"" /WA- /CРазрешитьРаботуПользователей /UCПакетноеОбновлениеКонфигурацииИБ

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/ManagerModule.bsl b/SSL/src/DataProcessors/ОбновлениеКонфигурации/ManagerModule.bsl new file mode 100644 index 000000000..f16d0c654 --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/ManagerModule.bsl @@ -0,0 +1,7 @@ + + + + + + + diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/ObjectModule.bsl b/SSL/src/DataProcessors/ОбновлениеКонфигурации/ObjectModule.bsl new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/ObjectModule.bsl @@ -0,0 +1 @@ + diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/ДопФайлОбновленияКонфигурации/Template.txt b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/ДопФайлОбновленияКонфигурации/Template.txt new file mode 100644 index 000000000..f73c993ce --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/ДопФайлОбновленияКонфигурации/Template.txt @@ -0,0 +1,58 @@ +// helpers.js +// Вспомогательные функции. + +var SW_HIDE = 0 +var SW_SHOWNORMAL = 1 +var SW_SHOWMINIMIZED = 2 +var SW_SHOWMAXIMIZED = 3 +var SW_MAXIMIZE = 3 +var SW_SHOWNOACTIVATE = 4 +var SW_SHOW = 5 +var SW_MINIMIZE = 6 +var SW_SHOWMINNOACTIVE = 7 +var SW_SHOWNA = 8 +var SW_RESTORE = 9 +var SW_SHOWDEFAULT = 10 + +var ForReading = 1; // Open a file for reading only. You can't write to this file. +var ForWriting = 2; // Open a file for writing. +var ForAppending = 8; // Open a file and write to the end of the file. +var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0; + +var EVENT_SUCCESS = 0; +var EVENT_CRITICAL = 1; +var EVENT_WARNING = 2; +var EVENT_INFO = 4; + + +function format(str) +{ + for(var i = 1; i < arguments.length; i++) + { + str = str.replace("{" + (i - 1) + "}", arguments[i]); + } + return str; +} + +function SWtoString(SW_flag) +{ + switch (SW_flag) + { + case SW_HIDE: return "SW_HIDE"; + case SW_SHOWNORMAL: return "SW_SHOWNORMAL"; + case SW_SHOWMINIMIZED: return "SW_SHOWMINIMIZED"; + case SW_SHOWMAXIMIZED: return "SW_SHOWMAXIMIZED"; + case SW_MAXIMIZE: return "SW_MAXIMIZE"; + case SW_SHOWNOACTIVATE: return "SW_SHOWNOACTIVATE"; + case SW_SHOW: return "SW_SHOW"; + case SW_MINIMIZE: return "SW_MINIMIZE"; + case SW_SHOWMINNOACTIVE: return "SW_SHOWMINNOACTIVE"; + case SW_SHOWNA: return "SW_SHOWNA"; + case SW_RESTORE: return "SW_RESTORE"; + case SW_SHOWDEFAULT: return "SW_SHOWDEFAULT"; + default: + return format("N/A: {0}", SW_flag); + } +} + + diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/ЗаставкаОбновленияКонфигурации/Template.txt b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/ЗаставкаОбновленияКонфигурации/Template.txt new file mode 100644 index 000000000..5f9308173 --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/ЗаставкаОбновленияКонфигурации/Template.txt @@ -0,0 +1,215 @@ + + + + + +Обновление конфигурации "1C:Предприятие"... + + + + + + + + + + +
    + +
    + +
    + Пожалуйста, подождите. Выполняется обновление конфигурации. +
    + +
    +   +
    + + + + \ No newline at end of file diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/МакетФайлаОбновленияКонфигурации/Template.txt b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/МакетФайлаОбновленияКонфигурации/Template.txt new file mode 100644 index 000000000..7e0c47df0 --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/МакетФайлаОбновленияКонфигурации/Template.txt @@ -0,0 +1,669 @@ +#Область ОбластьПараметров +// Параметры процедуры обновления +var now = new Date(); +var outFileName = "log" + now.valueOf() + ".txt"; // Путь к log-файлу +var advFileName = [ИмяФайлаРекламы]; // Путь к файлу рекламы. +var cfgFileNames = [ИменаФайловОбновления]; // Пути к .cf/.cfu-файлам с обновлениями +var v8exe = [ИмяИсполняемогоФайлаПрограммы] // Путь к исполняемому файлу 1С:Предприятия 8 +var infoBasePath = [ПараметрПутиКИнформационнойБазе]; +var BaseFileName = [СтрокаПутиКФайлуИнформационнойБазы]; +var connectionString = [СтрокаСоединенияИнформационнойБазы] + 'UC=ПакетноеОбновлениеКонфигурацииИБ'; +var infoBaseAuthorization = [ПараметрыАутентификацииПользователя]; +var backupFileName = [КаталогРезервнойКопии] + '1Cv8' + now.valueOf() + '.1CD'; // Файл резервной копии +var UseRestore = [ВосстанавливатьИнформационнуюБазу]; // Использовать восстановление ИБ в случае падения +var createBackup = [СоздаватьРезервнуюКопию]; // создавать резервную копию +var eventLogID = [СобытиеЖурналаРегистрации]; +var emailAddress = [АдресЭлектроннойПочты]; // адрес электронной почты для отправки уведомления +var IBAdminName = [ИмяАдминистратораИБ]; // имя администратора, от имени которого выполняется обновления +var IBAdminPassword = [ПарольАдминистратораИБ]; // пароль администратора, от имени которого выполняется обновления +var adminName = [ИмяАдминистратораОбновления]; // имя администратора, инициировавшего обновление +var doBlockUsers = [БлокироватьСоединенияИБ]; // устанавливать блокировку соединений перед обновлением +var comConnectorName = [ИмяCOMСоединителя]; // имя COM-класса для работы с 1С:Предприятием 8 через COM-соединение +var useComConnector = [ИспользоватьCOMСоединитель]; // флаг использования COM-соединения для работы с 1С:Предприятием 8 +var tempLogFileName = "templog.txt"; +#КонецОбласти + +#Область ОбластьОбновленияКонфигурации +// Инициализация +var oFileSystemObject = new ActiveXObject("Scripting.FileSystemObject"); + +var thisFileName; +var thisFileDir; + +if (oHTA != null) +{ + thisFileName = eval("oHTA.commandLine"); + thisFileDir = thisFileName.substr(1, thisFileName.lastIndexOf("\\") - 1); +} +else +{ + thisFileName = eval("WScript.ScriptFullName"); + thisFileDir = thisFileName.substr(0, thisFileName.lastIndexOf("\\") + 1); +} +var oShell = new ActiveXObject("WScript.Shell"); +oShell.CurrentDirectory = thisFileDir; + +var errorMarker = "{ERR}"; +var successMarker = "{OK }"; + +// Переменные состояния +var backupCreated = false; +var connectionsDenied = false; +var logging1C = false; + +// Глобальная переменная com-соединения + +var ComConnection = null; + +// Переменные состояния функции doDisconnectAndBlockUsersHTA() +var disconnectionStep = 0; +var connection = null; +var disconnectionInterval; +var disconnectionStartDateTime; + +// Открыть файл sFilePath. +function runApp(sFilePath, sFileArgs, show, bWaitOnReturn) +{ + if (bWaitOnReturn == undefined) + bWaitOnReturn = false; + if (show == undefined) + show = SW_SHOW; + if (sFileArgs == undefined) + sFileArgs = ""; + var ret = 1; + log(format("Запускается: {0}; параметры: {1}; окно: {2}; ожидание: {3}", + sFilePath, sFileArgs, SWtoString(show), bWaitOnReturn)); + if (oFileSystemObject.FileExists(sFilePath)) + { + try + { + ret = oShell.Run(format('"{0}" {1}', sFilePath, sFileArgs), show, bWaitOnReturn); + } + catch(e) + { + log(format("Исключение в runApp: {0}, {1}.", e.name, e.message), true); + return 1; + } + log(format("Код возврата: {0}", ret), ret != 0); + return ret; + } + else + log(format("Запускаемый файл не существует: {0}", sFilePath), true); + return ret; +} + +function clearLogFile() +{ + var outFile = oFileSystemObject.OpenTextFile(outFileName, ForWriting, true, TristateTrue); + outFile.Close(); +} + +// Записать текст в лог +function log(text, failed) +{ + if (failed == undefined) + failed = false; + text = text.replace(new RegExp('"' + IBAdminPassword + '"', "gi" ), '"*****"'); + logFile(text, failed); +} + +// Записать текст в лог-файл +function logFile(text, failed) +{ + var now = new Date(); + var f; + try + { + f = oFileSystemObject.OpenTextFile(outFileName, ForAppending, true, TristateTrue); + } + catch(e) { return; } + try + { + var status = (failed == false ? successMarker : errorMarker); + f.WriteLine(format("{0} {1} {2}", now, status, text)); + } + finally + { + try + { + f.Close(); + } + catch(e) { return; } + } +} + +// Записать текст из временного лог-файла +function appendLog() +{ + var f; + var outf; + var text; + try + { + f = oFileSystemObject.OpenTextFile(tempLogFileName, ForReading, false, TristateFalse); + outf = oFileSystemObject.OpenTextFile(outFileName, ForAppending, true, TristateTrue); + } + catch(e) { return; } + try + { + if (!f.AtEndOfStream) + { + text = f.ReadAll(); + outf.WriteLine(text); + } + } + finally + { + try + { + f.Close(); + outf.Close(); + } + catch(e) { return; } + } +} + +// Записать текст в журнал регистрации +function log1C(text, failed) +{ + if (logging1C) + return; + var connection = createConnection(); + if (connection == null) + return; + try + { + log1CInternal(connection, text, failed); + } + finally + { + connection = null; + } +} + +// Записать текст в журнал регистрации +function log1CInternal(connection, text, failed) +{ + if (logging1C) + return; + logging1C = true; + try + { + try + { + var eventLogLevel = failed ? connection.EventLogLevel.Error : connection.EventLogLevel.Information; + connection.WriteLogEvent(eventLogID, eventLogLevel, null, null, text, + connection.EventLogEntryTransactionMode.Independent); + } + catch(e) + { + log(format("Исключение в log1CInternal: {0}, {1}.", e.name, e.message), true); + return; + } + } + finally + { + logging1C = false; + } +} + +// Инициализация +function initialize() +{ + clearLogFile(); + log(format("Файл скрипта: {0}", thisFileName)); + log(format("Количество файлов обновления: {0}", cfgFileNames.length)); + for(var i = 0; i < cfgFileNames.length; i++) + log(format("{0}. {1}", i + 1, cfgFileNames[i])); + + // Отображение рекламы. + if (advFileName.length > 0) + runApp(advFileName); + + return 0; +} + +// Финализация +function finalize(success) +{ + if (success == undefined) + success = false; + + // Запись результата обновления в Event Log + writeEventLog(success); + + if (!success) + { + if (UseRestore) + { + restoreDB(); // Восстановление ИБ из временного архива + } + allowConnections(false); // Разрешение подключений + } + + write1CEventLog(); // Запись всей информации из log-файла в журнал регистрации + setResult(success); + + // очистка глобального COM-соединения + ComConnection = null; + +} + +function createConnection() +{ + if (!useComConnector) + return null; + + if (ComConnection != null) + return ComConnection; + + + try + { + var ComConnector = new ActiveXObject(comConnectorName); + ComConnection = ComConnector.Connect(connectionString); + return ComConnection; + } + catch(e) + { + log(format("Исключение в createConnection: {0}, {1}", e.name, e.message), true); + return null; + } +} + +// Записать весь log-файл в журнал регистрации +function write1CEventLog() +{ + if (!oFileSystemObject.FileExists(outFileName)) + return; + + var connection = createConnection(); + if (connection == null) + return; + try + { + var f = oFileSystemObject.OpenTextFile(outFileName, ForReading, false, TristateTrue); + + var text; + while (!f.AtEndOfStream) + { + text = f.ReadLine(); + while ((text.indexOf(successMarker) < 0) && (text.indexOf(errorMarker) < 0) && !f.AtEndOfStream) + text += "\n" + f.ReadLine(); + + var failed = text.indexOf(errorMarker) > 0; + log1CInternal(connection, text, failed); + } + } + catch(e) + { + log(format("Исключение в write1CEventLog: {0}, {1}.", e.name, e.message), true); + return; + } + finally + { + connection = null; + } +} + +function doSetResult(success) +{ + var connection = createConnection(); + if (connection == null) + return (useComConnector ? 1 : 0); + var res = 0; + try + { + connection.ОбновлениеКонфигурации.ЗавершитьОбновление(success, emailAddress, adminName); + } + catch(e) + { + log(format("Исключение при вызове ОбновлениеКонфигурации.ЗавершитьОбновление: {0}, {1}.", e.name, e.message), true); + res = 2; + } + return res; +} + + +// Передать в приложение результат выполнения +function setResult(success) +{ + var result = doSetResult(success); + CollectGarbage(); // освобождает соединения с COM-объектом + return result; +} + +// Записать результат выполнения процедуры обновления в Event Log +function writeEventLog(success) +{ + try + { + var eventKind = success ? EVENT_SUCCESS : EVENT_CRITICAL; + var message; + if (success) + message = "Обновление информационной базы завершилась успешно."; + else + message = "Ошибка при обновлении информационной базы."; + message += format(" Параметры информационной базы: {0}.", infoBasePath); + if (!success) + message += " Протокол обновления сохранен в журнал регистрации."; + oShell.LogEvent(eventKind, message); + } + catch(e) + { + log(format("Исключение в writeEventLog: {0}, {1}.", e.name, e.message), true); + } +} + +// Cоздание резервной копии информационной базы +function backupDB() +{ + if (!createBackup) + return 0; + try + { + var newpath = oFileSystemObject.CopyFile(BaseFileName, backupFileName, true); + ret = 0; + log(format("Резервной копия базы создана", ret), ret != 0); + } + catch(e) + { + CollectGarbage(); // предотвращает исключение out of memory + log(format("Исключение при создании резервной копии базы", e.name, e.message), true); + ret = -1; + } + if (ret == 0) + backupCreated = true; + return ret; +} + +// Восстановление информационной базы из резервной копии +function restoreDB() +{ + if (!backupCreated) + return 0; + try + { + oFileSystemObject.CopyFile(backupFileName, BaseFileName, true); + ret = 0; + log(format("База данных восстановлена из резервной копии", ret), ret != 0); + } + catch(e) + { + CollectGarbage(); // предотвращает исключение out of memory + log(format("Исключение при восстановлении базы из резервной копии", e.name, e.message), true); + ret = -1; + } + return ret; +} + +function doAllowConnections(updateAndFillDB) +{ + if (updateAndFillDB == undefined) + updateAndFillDB = true; + + var connection = createConnection(); + if (connection == null) + return (useComConnector ? 1 : 0); + + if (updateAndFillDB) + try + { + connection.ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы(); + } + catch(e) + { + CollectGarbage(); // предотвращает исключение out of memory + log(format("Исключение при вызове ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы: {0}, {1}.", e.name, e.message), true); + return 2; + } + if (connectionsDenied) + try + { + connection.СоединенияИБ.РазрешитьРаботуПользователей(); + connectionsDenied = false; + } + catch(e) + { + CollectGarbage(); // предотвращает исключение out of memory + log(format("Исключение при вызове СоединенияИБ.РазрешитьРаботуПользователей: {0}, {1}.", e.name, e.message), true); + return 3; + } + return 0; +} + +// Первоначальное заполнение информационной базы, разрешение подключений новых соединений, +// и оповещение о результате обновления +function allowConnections(updateAndFillDB) +{ + var result = doAllowConnections(updateAndFillDB); + CollectGarbage(); // освобождает соединения с COM-объектом + return result; +} + +function doDisconnectAndBlockUsersHTA(connection) +{ + if (connection == null) + return 1; + var result = 0; + try + { + while (true) + { + switch(disconnectionStep) + { + case 0: + { + connection.СоединенияИБ.УстановитьБлокировкуСоединений("в связи с необходимостью обновления конфигурации.", + "ПакетноеОбновлениеКонфигурацииИБ"); + disconnectionInterval = connection.СоединенияИБ.ПараметрыБлокировкиСеансов().ИнтервалОжиданияЗавершенияРаботыПользователей * 1000; + disconnectionStartDateTime = connection.СоединенияИБ.ПараметрыБлокировкиСеансов().Начало; + if (connection.ЗначениеЗаполнено(disconnectionStartDateTime)) + disconnectionStep++; + else + disconnectionStep += 2; + break; + } + case 1: + { + if (!connection.СоединенияИБ.УстановленаБлокировкаСоединений() || + connection.ПолучитьСоединенияИнформационнойБазы().Количество() <= 1) + { + disconnectionStep++; + break; + } + + var now = new Date(); + if (now - disconnectionInterval <= disconnectionStartDateTime) + return -1; + disconnectionStep++; + break; + } + case 2: + { + if (!connection.СоединенияИБ.УстановленаБлокировкаСоединений()) + { + log("Попытка завершения работы пользователей завершилась безуспешно: отменена блокировка ИБ.", true); + return 3; + } + + if (connection.ПолучитьСоединенияИнформационнойБазы().Количество() <= 1) + return 0; + + // после начала блокировки сеансы всех пользователей должны быть отключены + // если этого не произошло пробуем принудительно прервать соединение. + doDisconnectConnections(connection); + if (connection.ПолучитьСоединенияИнформационнойБазы().Количество() > 1) + { + connection.СоединенияИБ.РазрешитьРаботуПользователей(); + var message = connection.СоединенияИБ.ПолучитьНазванияСоединенийИБ("Не удалось отключить соединения:"); + log(message, true); + return 3; + } + return 0; + } + } + } + } + catch(e) + { + CollectGarbage(); // предотвращает исключение out of memory + log(format("Исключение при вызове doDisconnectAndBlockUsersHTA: {0}, {1}.", e.name, e.message), true); + result = 2; + } + return result; +} + +// Завершение работы пользователей и запрет на подключение новых соединений +// Возвращает: +// -1 - выполнение отложено, необходимо повторить вызов функции через 18 секунд +// 0 - функция выполнена успешно +// другое число - код ошибки +// +function disconnectAndBlockUsersHTA() +{ + if (!doBlockUsers) + { + connectionsDenied = true; + return 0; + } + if (disconnectionStep == 0) + { + connection = createConnection(); + if (connection == null && useComConnector) + return 1; + } + var result = -1; + if (useComConnector) + try + { + result = doDisconnectAndBlockUsersHTA(connection); + } + finally + { + if (result != -1) + { + connection = null; + CollectGarbage(); // освобождает соединения с COM-объектом + } + } + else + result = 0; + if (result == 0) + connectionsDenied = true; + return result; +} + +function doDisconnectAndBlockUsers() +{ + var connection = createConnection(); + if (connection == null) + return (useComConnector ? 1 : 0); + var result = 0; + try + { + connection.СоединенияИБ.УстановитьБлокировкуСоединений("в связи с необходимостью обновления конфигурации.", + "ПакетноеОбновлениеКонфигурацииИБ"); + + var interval = connection.СоединенияИБ.ПараметрыБлокировкиСеансов().ИнтервалОжиданияЗавершенияРаботыПользователей * 1000; + var startDateTime = connection.ПолучитьБлокировкуУстановкиСоединений().Начало; + var now = new Date(); + + if (connection.ЗначениеЗаполнено(startDateTime)) + while (now - interval <= startDateTime) + { + if (!connection.ПолучитьБлокировкуУстановкиСоединений().Установлена) + break; + if (connection.ПолучитьСоединенияИнформационнойБазы().Количество() <= 1) + break; + WScript.Sleep(18 * 1000); + now = new Date(); + } + + if (!connection.ПолучитьБлокировкуУстановкиСоединений().Установлена) + { + log("Попытка завершения работы пользователей завершилась безуспешно: отменена блокировка ИБ.", true); + return 3; + } + + // после начала блокировки сеансы всех пользователей должны быть отключены + // если этого не произошло пробуем принудительно прервать соединения. + doDisconnectConnections(connection); + if (connection.ПолучитьСоединенияИнформационнойБазы().Количество() > 1) + { + connection.СоединенияИБ.РазрешитьРаботуПользователей(); + var message = connection.СоединенияИБ.ПолучитьНазванияСоединенийИБ("Не удалось отключить соединения:"); + log(message, true); + return 3; + } + + if (result != 0) + log("Попытка завершения работы пользователей завершилась безуспешно.", true); + } + catch(e) + { + CollectGarbage(); // предотвращает исключение out of memory + log(format("Исключение при вызове doDisconnectAndBlockUsers: {0}, {1}.", e.name, e.message), true); + result = 2; + } + return result; +} + +function doDisconnectConnections(connection) +{ + var adminParams = connection.СоединенияИБ.ПолучитьПараметрыАдминистрированияИБ(); + adminParams.ИмяАдминистратораИБ = IBAdminName; + adminParams.ПарольАдминистратораИБ = IBAdminPassword; + + connection.СоединенияИБ.ОтключитьСоединенияИБ(adminParams); +} + +// Завершение работы пользователей и запрет на подключение новых соединений +function disconnectAndBlockUsers() +{ + var result = 0; + if (doBlockUsers) + result = doDisconnectAndBlockUsers(); + CollectGarbage(); // освобождает соединения с COM-объектом + if (result == 0 && doBlockUsers) + connectionsDenied = true; + return result; +} + +// Загрузка файла обновления в основную базу +function loadCfg(fileName) +{ + // /LoadCfg<имя cf файла> (для базовых версий не используется) загрузка конфигурации из файла + var ret = runApp(v8exe, format('CONFIG {0} {1} /LoadCfg "{2}" /Out "{3}" /UCПакетноеОбновлениеКонфигурацииИБ /DisableStartupMessages', + infoBasePath, infoBaseAuthorization, fileName, tempLogFileName), SW_SHOW, true); + appendLog(); + return ret; +} + +// Загрузка файла обновления в основную базу +function updateCfg(fileName) +{ + // /UpdateCfg<имя cf | cfu файла> обновление конфигурации, находящейся на поддержке + var ret = runApp(v8exe, format('CONFIG {0} {1} /UpdateCfg "{2}" /Out "{3}" /UCПакетноеОбновлениеКонфигурацииИБ /DisableStartupMessages', + infoBasePath, infoBaseAuthorization, fileName, tempLogFileName), SW_SHOW, true); + appendLog(); + return ret; +} + +// Обновление конфигурации информационной базы +function updateDbCfg() +{ + // /UpdateDBCfg - обновление конфигурации базы данных + var ret = runApp(v8exe, format('CONFIG {0} {1} /UpdateDBCfg /Out "{2}" /UCПакетноеОбновлениеКонфигурацииИБ /DisableStartupMessages', + infoBasePath, infoBaseAuthorization, tempLogFileName), SW_SHOW, true); + appendLog(); + return ret; +} + +// Интерактивный запуск "1С:Предприятие" +function runEnterprise() +{ + return runApp(v8exe, format('ENTERPRISE {0} {1}', infoBasePath, infoBaseAuthorization), SW_SHOW, false); +} +#КонецОбласти + diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/НеинтерактивноеОбновлениеКонфигурации/Template.txt b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/НеинтерактивноеОбновлениеКонфигурации/Template.txt new file mode 100644 index 000000000..ef605c396 --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/НеинтерактивноеОбновлениеКонфигурации/Template.txt @@ -0,0 +1,93 @@ +// updater.js + +function include(fileName) +{ + var stream = new ActiveXObject("Adodb.Stream"); + stream.CharSet = "UNICODE"; + stream.Type = 2; // adTypeText + stream.Open(); + stream.LoadFromFile(fileName); + var code = stream.readText(); + stream.Close(); + return code; +} + +var oHTA; +var scriptFileName = WScript.ScriptFullName; +var scriptDir = scriptFileName.substr(0, scriptFileName.lastIndexOf("\\") + 1); + +eval(include(scriptDir + "helpers.js")); +eval(include(scriptDir + "main.js")); + +// Вывести сообщение о ходе обновления +function setProgress(statusText) +{ + statusText += "..."; + log(statusText); +} + +function checkResult(ret) +{ + if (ret == 0) + return; + log(format("Завершение с ошибкой. Код ошибки: {0}. Подробности см. в предыдущей записи.", ret), true); + setProgress("Восстановление информационной базы"); + + finalize(); + ClearTempFiles(); + + WScript.Quit(ret); +} + +function ClearTempFiles() +{ + // Удаляем временные файлы + try + { + oFileSystemObject.DeleteFile(thisFileDir + '\\main.js'); + oFileSystemObject.DeleteFile(thisFileDir + '\\helpers.js'); + } + catch(e) {} +} + + +setProgress("Инициализация"); +var ret = initialize(); +checkResult(ret); + +setProgress("Завершение работы пользователей"); +ret = disconnectAndBlockUsers(); +checkResult(ret); + +setProgress("Cоздание резервной копии информационной базы"); +ret = backupDB(); +checkResult(ret); + +if (cfgFileNames.length == 0) +{ + setProgress("Обновление конфигурации информационной базы"); + ret = updateDbCfg(); + checkResult(ret); +} +else +{ + for(var cfgFileIndex = 0; cfgFileIndex < cfgFileNames.length; cfgFileIndex++) + { + setProgress(format("Загрузка файла обновления в основную базу ({0}/{1})", cfgFileIndex + 1, cfgFileNames.length)); + ret = updateCfg(cfgFileNames[cfgFileIndex]); + if (ret != 0) // Если не удалось загрузить файл, возможно конфигурация не находится на поддержке. + ret = loadCfg(cfgFileNames[cfgFileIndex]); + checkResult(ret); + setProgress(format("Обновление конфигурации информационной базы ({0}/{1})", cfgFileIndex + 1, cfgFileNames.length)); + ret = updateDbCfg(); + checkResult(ret); + } +} + +setProgress("Разрешение подключений новых соединений"); +ret = allowConnections(); +checkResult(ret); + +setProgress("Завершение"); +finalize(true); +ClearTempFiles(); \ No newline at end of file diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/ОбновлениеКонфигурации.mdo b/SSL/src/DataProcessors/ОбновлениеКонфигурации/ОбновлениеКонфигурации.mdo new file mode 100644 index 000000000..77688ecc0 --- /dev/null +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/ОбновлениеКонфигурации.mdo @@ -0,0 +1,758 @@ + + + + + + + ОбновлениеКонфигурации + + ru + Обновление конфигурации + + true + DataProcessor.ОбновлениеКонфигурации.Form.Форма + + + ru + + + + АдресЭлектроннойПочты + + ru + Адрес электронной почты + + + String + + + + + + + ВыслатьОтчетНаПочту + + ru + Выслать отчет на почту + + + Boolean + + + + + + ДатаВремяОбновления + + ru + Дата время обновления + + + Date + + + + + + + ЗапомнитьПарольСервераОбновлений + + ru + Запомнить пароль сервера обновлений + + + Boolean + + + + + + ИмяАдминистратораИБ + + ru + Имя администратора ИБ + + + String + + + + + + + ИмяАдминистратораКластера + + ru + Имя администратора кластера + + + String + + + + + + + ИмяКаталогаРезервнойКопииИБ + + ru + Имя каталога резервной копии ИБ + + + String + + + + + + + ИмяФайлаОбновления + + ru + Имя файла обновления + + + String + + + + + + + ИспользоватьРасписаниеДляПроверкиОбновления + + ru + Использовать расписание для проверки обновления + + + Boolean + + + + + + ИсточникОбновления + + ru + Источник обновления + + + Number + + 1 + true + + + + + + + КластерТребуетАутентификации + + ru + Кластер требует аутентификации + + + Boolean + + + + + + КодЗадачиПланировщика + + ru + Код задачи планировщика + + + Number + + 10 + + + + + + + КодПользователяСервераОбновлений + + ru + Код пользователя сервера обновлений + + + String + + + + + + + НестандартныеПортыСервера + + ru + Нестандартные порты сервера + + + Boolean + + + + + + НуженФайлОбновления + + ru + Нужен файл обновления + + + Number + + 1 + true + + + + + + + ПарольАдминистратораИБ + + ru + Пароль администратора ИБ + + + String + + + + + + + ПарольАдминистратораИБПроверка + + ru + Пароль администратора ИБ (проверка) + + + String + + + + + + + ПарольАдминистратораКластера + + ru + Пароль администратора кластера + + + String + + + + + + + ПарольСервераОбновлений + + ru + Пароль сервера обновлений + + + String + + + + + + + ПовторныйЗапуск + + ru + Повторный запуск + + + Boolean + + + + + + ПортАгентаСервера + + ru + Порт агента сервера + + + Number + + 10 + true + + + + + + + ПортКластераСерверов + + ru + Порт кластера серверов + + + Number + + 10 + true + + + + + + + ПроверятьНаличиеОбновленияПриЗапуске + + ru + Проверять наличие обновления при запуске + + + Number + + 1 + true + + + + + + + ПропускатьПриветствие + + ru + Пропускать приветствие + + + Boolean + + + + + + РасписаниеПроверкиНаличияОбновления + + ru + Расписание проверки наличия обновления + + + + + + + РежимОбновления + + ru + Режим обновления + + + Number + + 1 + true + + + + + + + РезультатОбновления + + ru + Результат обновления + + + + + + + СоздаватьРезервнуюКопию + + ru + Создавать резервную копию + + 0 - не создавать; 1 - временную; 2 - в указанный каталог + + Number + + 1 + true + + + + + + + ТехническаяИнформацияОбОшибке + + ru + Техническая информация об ошибке + + + String + + + + + + + ИсточникДискаИТС + + ru + Источник диска ИТС + + + Number + + 1 + true + + + + + + + ВосстанавливатьИнформационнуюБазу + + ru + Восстанавливать информационную базу + + + Boolean + + + + + + + + + + ДоступныеОбновления + + ru + Доступные обновления + + + Use + LineNumber + + Use + + + + + Конфигурация + + ru + Конфигурация + + + String + + + + + + + + Поставщик + + ru + Поставщик + + + String + + + + + + + + Версия + + ru + Версия + + + String + + + + + + + + Версия1Разряд + + ru + Версия 1-й разряд + + + Number + + 3 + true + + + + + + + + Версия2Разряд + + ru + Версия 2-й разряд + + + Number + + 3 + true + + + + + + + + Версия3Разряд + + ru + Версия 3-й разряд + + + Number + + 3 + true + + + + + + + + Версия4Разряд + + ru + Версия 4-й разряд + + + Number + + 3 + true + + + + + + + + ВерсияДляОбновления + + ru + Версия для обновления + + + String + + + + + + + + ПутьКФайлуОбновления + + ru + Путь к файлу обновления + + + String + + + + + + + + ФайлОбновления + + ru + Файл обновления + + + String + + + + + + + + РазмерФайлаОбновления + + ru + Размер файла обновления + + + Number + + 15 + true + + + + + + + + ПутьКЛокальномуФайлу + + ru + Путь к локальному файлу + + + String + + + + + + + + ПутьКЛокальномуФайлуОбновления + + ru + Путь к локальному файлу обновления + + + String + + + + + + + + ЛокальныйОтносительныйКаталог + + ru + Локальный относительный каталог + + + String + + + + + + + + НомерДискаИТС + + ru + Номер диска ИТС + + + String + + 255 + + + + + + + + + Форма + + ru + Форма + + PersonalComputer + MobileDevice + + + ПредупреждениеWMI + + ru + Предупреждение WMI + + PersonalComputer + MobileDevice + + + НастройкаРезервнойКопии + + ru + Настройка резервной копии + + PersonalComputer + MobileDevice + + + НастройкаРасписания + + ru + Настройка расписания + + PersonalComputer + MobileDevice + + + Обозреватель + + ru + Обозреватель + + PersonalComputer + MobileDevice + + + МакетФайлаОбновленияКонфигурации + + ru + Макет файла обновления конфигурации + + TextDocument + + + ДопФайлОбновленияКонфигурации + + ru + Доп файл обновления конфигурации + + TextDocument + + + ЗаставкаОбновленияКонфигурации + + ru + Заставка обновления конфигурации + + TextDocument + + + НеинтерактивноеОбновлениеКонфигурации + + ru + Неинтерактивное обновление конфигурации + + TextDocument + + diff --git a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Commands/ПолнотекстовыйПоиск/CommandModule.bsl b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Commands/ПолнотекстовыйПоиск/CommandModule.bsl new file mode 100644 index 000000000..3d1332033 --- /dev/null +++ b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Commands/ПолнотекстовыйПоиск/CommandModule.bsl @@ -0,0 +1,11 @@ +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОткрытьФорму( + "Обработка.ПолнотекстовыйПоискВДанных.Форма.ФормаПоиска", + , + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УпрощеннаяФорма/Form.form b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УпрощеннаяФорма/Form.form new file mode 100644 index 000000000..a55984fa6 --- /dev/null +++ b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УпрощеннаяФорма/Form.form @@ -0,0 +1,217 @@ + + + + <key>ru</key> + <value>Поиск</value> + + + ГруппаПоиска + 42 + + ПолеВводаПоиска + 3 + true + true + + true + + + СтрокаПоиска + + None + + ПолеВводаПоискаРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ПолеВводаПоискаКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + Left + + + TextEditEnd + ПолеВводаПоискаОкончаниеВводаТекста + + + ChoiceProcessing + ПолеВводаПоискаОбработкаВыбора + + true + true + true + true + true + true + + String + + + + Style.BorderColor + + Normal + + + + Найти + 4 + true + true + + true + + false + + НайтиРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + UsualButton + Form.Command.Найти + Normal + Picture + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + ГруппаПоискаРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + + <key>ru</key> + <value>Объект</value> + + 1 + + DataProcessorObject.ПолнотекстовыйПоискВДанных + + + true + + + true + +
    true
    +
    + + СтрокаПоиска + + <key>ru</key> + <value>Строка поиска</value> + + 2 + + String + + + + true + + + true + + + + Найти + + <key>ru</key> + <value>Найти</value> + + 2 + + ru + Найти + + + true + + + StdPicture.Find + + + + ИскатьВыполнить + + + Picture + Auto + Auto + + + + + + +
    diff --git a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УпрощеннаяФорма/Module.bsl b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УпрощеннаяФорма/Module.bsl new file mode 100644 index 000000000..4ffd4160f --- /dev/null +++ b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УпрощеннаяФорма/Module.bsl @@ -0,0 +1,35 @@ +// Обработка команды Найти +// +&НаКлиенте +Процедура ИскатьВыполнить() + ПараметрыФормы = Новый Структура("", ); + ПараметрыФормы.Вставить("ПереданнаяСтрокаПоиска", Элементы.ПолеВводаПоиска.ТекстРедактирования); + ОткрытьФорму("Обработка.ПолнотекстовыйПоискВДанных.Форма.ФормаПоиска", ПараметрыФормы); + + ЗагрузитьСтрокиПоиска(); +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ЗагрузитьСтрокиПоиска(); +КонецПроцедуры + +&НаСервере +Процедура ЗагрузитьСтрокиПоиска() + Массив = ХранилищеОбщихНастроек.Загрузить("ПолнотекстовыйПоискСтрокиПолнотекстовогоПоиска"); + + Если Массив <> Неопределено Тогда + Элементы.ПолеВводаПоиска.СписокВыбора.ЗагрузитьЗначения(Массив); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПолеВводаПоискаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + ИскатьВыполнить(); +КонецПроцедуры + +&НаКлиенте +Процедура ПолеВводаПоискаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + ИскатьВыполнить(); +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/ФормаПоиска/Form.form b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/ФормаПоиска/Form.form new file mode 100644 index 000000000..9d5ace958 --- /dev/null +++ b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/ФормаПоиска/Form.form @@ -0,0 +1,784 @@ + + + + <key>ru</key> + <value>Полнотекстовый поиск</value> + + + Группа1 + 51 + + Найти + 4 + true + true + + true + + false + + НайтиРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + Form.Command.Найти + Normal + PictureAndText + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + Группа1РасширеннаяПодсказка + 52 + Label + true + true + + Left + + + CommandBar + + Left + + + + ГруппаПоиска + 42 + + СтрокаПоиска + 3 + true + true + + true + + + СтрокаПоиска + + None + + OnChange + СтрокаПоискаПриИзменении + + + СтрокаПоискаРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + СтрокаПоискаКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + Left + + + ChoiceProcessing + СтрокаПоискаОбработкаВыбора + + true + true + true + true + true + true + + String + + + + Style.BorderColor + + Normal + + + + Справка + 44 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + Hyperlink + Form.StandardCommand.Help + Normal + Picture + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + ru + Группа поиска + + + ГруппаПоискаРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаИнформацияОНайденном + 31 + + ПоказаныРезультаты_С_По + 16 + true + true + + true + + + ПоказаныРезультатыСПо + + None + + ПоказаныРезультаты_С_ПоРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + ПоказаныРезультаты_С_ПоКонтекстноеМеню + 17 + true + + LabelField + Enter + true + Left + true + Left + + true + true + + + + Назад + 8 + true + true + + true + + false + + НазадРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + Hyperlink + Form.Command.Назад + Normal + Auto + true + 1 + true + UserCmds + + 28 + 85 + 174 + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Далее + 9 + true + true + + true + + false + + ДалееРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + Hyperlink + Form.Command.Далее + Normal + Picture + true + 1 + true + UserCmds + + 28 + 85 + 174 + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + ГруппаИнформацияОНайденномРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + HTMLТекст + 39 + true + true + + true + + + HTMLТекст + + None + + HTMLТекстРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + + HTMLТекстКонтекстноеМеню + 40 + true + + HTMLDocumentField + Enter + true + Left + true + + + OnClick + HTMLТекстПриНажатии + + 50 + true + 10 + true + true + true + + + + ГруппаОбновлениеИндекса + 45 + + ОбновитьИндекс + 48 + true + true + + true + + false + + ОбновитьИндексРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + UsualButton + Form.Command.ОбновитьИндекс + Normal + Auto + true + true + UserCmds + Auto + + + СостояниеИндекса + 49 + true + true + + true + + + СостояниеИндекса + + None + + СостояниеИндексаРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + + СостояниеИндексаКонтекстноеМеню + 50 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Группа обновление индекса</value> + + + ru + Группа обновление индекса + + + ГруппаОбновлениеИндексаРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + + <key>ru</key> + <value>Объект</value> + + 1 + + DataProcessorObject.ПолнотекстовыйПоискВДанных + + + true + + + true + +
    true
    +
    + + СтрокаПоиска + + <key>ru</key> + <value>Строка поиска</value> + + 2 + + String + + + + true + + + true + + + + ПоказаныРезультатыСПо + + <key>ru</key> + <value>Показаны результаты с по</value> + + 7 + + String + + + + true + + + true + + + + ТекущаяПозиция + + <key>ru</key> + <value>Текущая позиция</value> + + 13 + + Number + + 10 + + + + true + + + true + + + + HTMLТекст + + <key>ru</key> + <value>HTMLТекст</value> + + 14 + + String + + + + true + + + true + + + + РезультатыПоиска + + <key>ru</key> + <value>Результаты поиска</value> + + 6 + + ValueList + + + true + + + true + + + + + + + ДатаАктуальностиИндекса + + <key>ru</key> + <value>Дата актуальности индекса</value> + + 3 + + Date + + + + true + + + true + + + + ЭтоФайловаяБаза + + <key>ru</key> + <value>Это файловая база</value> + + 4 + + Boolean + + + true + + + true + + + + СостояниеИндекса + + <key>ru</key> + <value>Состояние индекса</value> + + 5 + + String + + + + true + + + true + + + + Найти + + <key>ru</key> + <value>Найти</value> + + 2 + + ru + Найти + + + true + + + StdPicture.Find + + + + ИскатьВыполнить + + + Picture + Auto + Auto + + + Далее + + <key>ru</key> + <value>Далее</value> + + 3 + + ru + Далее + + + true + + + CommonPicture.ПолнотекстовыйПоискДалее + + + + ДалееВыполнить + + + Picture + Auto + Auto + + + Назад + + <key>ru</key> + <value>Назад</value> + + 4 + + ru + Назад + + + true + + + CommonPicture.ПолнотекстовыйПоискНазад + + + + НазадВыполнить + + + Picture + Auto + Auto + + + ОбновитьИндекс + + <key>ru</key> + <value>Обновить индекс</value> + + 1 + + ru + Обновить индекс + + + true + + + StdPicture.Refresh + + + + ОбновитьИндекс + + + Text + 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..1a3403472 --- /dev/null +++ b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/ФормаПоиска/Module.bsl @@ -0,0 +1,435 @@ +&НаКлиенте +Функция ЭтоНавигационнаяСсылка(Ссылка) + + Если Найти(Ссылка, "e1cib/data/") <> 0 Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +&НаКлиенте +Процедура ОткрытьЗначениеПоиска(Значение) + СтандартнаяОбработка = Истина; + ПолнотекстовыйПоискКлиентПереопределяемый.ПриОткрытииОбъекта(Значение, СтандартнаяОбработка); + + Если СтандартнаяОбработка = Истина Тогда + ОткрытьЗначение(Значение); + КонецЕсли; +КонецПроцедуры + +// Возвращает массив объектов (возможно из одного элемента) для показа пользователю +&НаСервереБезКонтекста +Функция ПолучитьЗначенияДляОткрытия(Объект) + Результат = Новый Массив; + + // Объект ссылочного типа + Если ОбщегоНазначения.ЗначениеСсылочногоТипа(Объект) Тогда + Результат.Добавить(Объект); + Возврат Результат; + КонецЕсли; + + МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект)); + ИмяМетаданного = МетаданныеОбъекта.Имя; + + ПолноеИмяОбъекта = ВРЕГ(Метаданные.НайтиПоТипу(ТипЗнч(Объект)).ПолноеИмя()); + ЭтоРегистрСведений = (Найти(ПолноеИмяОбъекта, "РЕГИСТРСВЕДЕНИЙ.") > 0); + + Если Не ЭтоРегистрСведений Тогда // Регистр бухгалтерии или накопления или расчета + Регистратор = Объект["Регистратор"]; + Результат.Добавить(Регистратор); + Возврат Результат; + КонецЕсли; + + // Ниже - это уже регистр сведений + Если МетаданныеОбъекта.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору Тогда + Регистратор = Объект["Регистратор"]; + Результат.Добавить(Регистратор); + Возврат Результат; + КонецЕсли; + + // Независимый регистр сведений + // сперва - основные типы + Для Каждого Измерение Из МетаданныеОбъекта.Измерения Цикл + Если Измерение.Ведущее Тогда + ЗначениеИзмерения = Объект[Измерение.Имя]; + + Если ОбщегоНазначения.ЗначениеСсылочногоТипа(ЗначениеИзмерения) Тогда + Результат.Добавить(ЗначениеИзмерения); + КонецЕсли; + + КонецЕсли; + КонецЦикла; + + Если Результат.Количество() = 0 Тогда + // теперь - любые типы + Для Каждого Измерение Из МетаданныеОбъекта.Измерения Цикл + Если Измерение.Ведущее Тогда + ЗначениеИзмерения = Объект[Измерение.Имя]; + Результат.Добавить(ЗначениеИзмерения); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + // Нет ни одного ведущего измерения - вернем сам ключ регистра сведений + Если Результат.Количество() = 0 Тогда + Результат.Добавить(Объект); + КонецЕсли; + + Возврат Результат; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Служебные Функции +// + +&НаСервереБезКонтекста +Процедура СохранитьСтрокуПоиска(СписокВыбора, СтрокаПоиска) + + СохраненнаяСтрока = СписокВыбора.НайтиПоЗначению(СтрокаПоиска); + + Если СохраненнаяСтрока <> Неопределено Тогда + СписокВыбора.Удалить(СохраненнаяСтрока); + КонецЕсли; + + СписокВыбора.Вставить(0, СтрокаПоиска); + + КоличествоСтрок = СписокВыбора.Количество(); + + Если КоличествоСтрок > 20 Тогда + СписокВыбора.Удалить(КоличествоСтрок - 1); + КонецЕсли; + + Строки = СписокВыбора.ВыгрузитьЗначения(); + + ХранилищеОбщихНастроек.Сохранить("ПолнотекстовыйПоискСтрокиПолнотекстовогоПоиска", , Строки); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьИндексСервер() + УстановитьПривилегированныйРежим(Истина); + ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь, Ложь); + + ДатаАктуальностиИндекса = ПолнотекстовыйПоиск.ДатаАктуальности(); + ИндексАктуален = ПолнотекстовыйПоиск.ИндексАктуален(); + Элементы.ГруппаОбновлениеИндекса.Видимость = Не ИндексАктуален; + Элементы.ОбновитьИндекс.Доступность = Не ИндексАктуален; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Функции на которые замэплены обработчики +// + +// Процедура поиска, получение и отображение результата +// +&НаКлиенте +Процедура Искать(Направление) + + Попытка + Если ПустаяСтрока(СтрокаПоиска) Тогда + Предупреждение(НСтр("ru = 'Введите, что нужно найти!'")); + Возврат; + КонецЕсли; + + Если ЭтоНавигационнаяСсылка(СтрокаПоиска) Тогда + ПерейтиПоНавигационнойСсылке(СтрокаПоиска); + СтрокаПоиска = ""; + Возврат; + КонецЕсли; + + НСтрока = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Выполняется поиск ""%1""...'"), СтрокаПоиска); + Состояние(НСтрока); + + СписокВыбора = Элементы.СтрокаПоиска.СписокВыбора.Скопировать(); + Результат = ВыполнитьПоиск(Направление, ТекущаяПозиция, СтрокаПоиска, СписокВыбора); + Элементы.СтрокаПоиска.СписокВыбора.Очистить(); + Для Каждого ЭлементСпискаВыбора Из СписокВыбора Цикл + Элементы.СтрокаПоиска.СписокВыбора.Добавить(ЭлементСпискаВыбора.Значение, ЭлементСпискаВыбора.Представление); + КонецЦикла; + + Если ЭтоФайловаяБаза Тогда + ОбновитьАктуальностьИндекса(); + КонецЕсли; + + Состояние(); + + РезультатыПоиска = Результат.РезультатПоиска; + HTMLТекст = Результат.HTMLТекст; + ТекущаяПозиция = Результат.ТекущаяПозиция; + ПолноеКоличество = Результат.ПолноеКоличество; + + Если РезультатыПоиска.Количество() <> 0 Тогда + + ПоказаныРезультатыСПо = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Показаны %1 - %2 из %3'"), + Строка(ТекущаяПозиция + 1), + Строка(ТекущаяПозиция + РезультатыПоиска.Количество()), + Строка(ПолноеКоличество) ); + + Элементы.Далее.Доступность = (ПолноеКоличество - ТекущаяПозиция) > РезультатыПоиска.Количество(); + Элементы.Назад.Доступность = (ТекущаяПозиция > 0); + Иначе + ПоказаныРезультатыСПо = НСтр("ru = 'Не найдено'"); + Элементы.Далее.Доступность = Ложь; + Элементы.Назад.Доступность = Ложь; + КонецЕсли; + + Если Направление = 0 И Результат.ТекущаяПозиция = 0 И Результат.СлишкомМногоРезультатов Тогда + Предупреждение(НСтр("ru = 'Слишком много результатов, уточните запрос.'")); + КонецЕсли; + + Исключение + Предупреждение(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьАктуальностьИндекса() + + Если ЭтоФайловаяБаза Тогда + Элементы.ГруппаОбновлениеИндекса.Видимость = Истина; + + Попытка + ДатаАктуальностиИндекса = ПолнотекстовыйПоиск.ДатаАктуальности(); + Если ДатаАктуальностиИндекса <> '00010101000000' Тогда + Элементы.СостояниеИндекса.Подсказка = НСтр("ru = 'Последнее обновление индекса: '") + Строка(ДатаАктуальностиИндекса); + КонецЕсли; + + ИндексАктуален = ПолнотекстовыйПоиск.ИндексАктуален(); + Элементы.ГруппаОбновлениеИндекса.Видимость = Не ИндексАктуален; + Элементы.ОбновитьИндекс.Доступность = Не ИндексАктуален; + Если Не ИндексАктуален Тогда + СостояниеИндекса = НСтр("ru = 'Требуется обновление индекса'"); + КонецЕсли; + Исключение + КонецПопытки; + + Иначе + Элементы.ГруппаОбновлениеИндекса.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +// Процедура выполняет полнотекстовый поиск +// +&НаСервереБезКонтекста +Функция ВыполнитьПоиск(Направление, ТекущаяПозиция, СтрокаПоиска, СписокВыбора) Экспорт + + СохранитьСтрокуПоиска(СписокВыбора, СтрокаПоиска); + + Возврат ИскатьВыполнитьСервер(Направление, ТекущаяПозиция, СтрокаПоиска); + +КонецФункции + +// Процедура выполняет полнотекстовый поиск +// +&НаСервереБезКонтекста +Функция ИскатьВыполнитьСервер(Направление, ТекущаяПозиция, СтрокаПоиска) Экспорт + + РазмерПорции = 20; + + СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(СтрокаПоиска, РазмерПорции); + + Если Направление = 0 Тогда + СписокПоиска.ПерваяЧасть(); + ИначеЕсли Направление = -1 Тогда + СписокПоиска.ПредыдущаяЧасть(ТекущаяПозиция); + ИначеЕсли Направление = 1 Тогда + СписокПоиска.СледующаяЧасть(ТекущаяПозиция); + КонецЕсли; + + РезультатыПоиска = Новый СписокЗначений; + РезультатыПоиска.Очистить(); + Для Каждого Результат Из СписокПоиска Цикл + СтруктураРезультата = Новый Структура; + СтруктураРезультата.Вставить("Значение", Результат.Значение); + СтруктураРезультата.Вставить("ЗначенияДляОткрытия", ПолучитьЗначенияДляОткрытия(Результат.Значение)); + РезультатыПоиска.Добавить(СтруктураРезультата); + КонецЦикла; + + HTMLТекст = СписокПоиска.ПолучитьОтображение(ВидОтображенияПолнотекстовогоПоиска.HTMLТекст); + + HTMLТекст = СтрЗаменить(HTMLТекст, "", ""); + HTMLТекст = СтрЗаменить(HTMLТекст, "", ""); + HTMLТекст = СтрЗаменить(HTMLТекст, "", ""); + HTMLТекст = СтрЗаменить(HTMLТекст, "", ""); + HTMLТекст = СтрЗаменить(HTMLТекст, "", ""); + HTMLТекст = СтрЗаменить(HTMLТекст, "", ""); + + ТекущаяПозиция = СписокПоиска.НачальнаяПозиция(); + ПолноеКоличество = СписокПоиска.ПолноеКоличество(); + СлишкомМногоРезультатов = СписокПоиска.СлишкомМногоРезультатов(); + + Результат = Новый Структура; + Результат.Вставить("РезультатПоиска", РезультатыПоиска); + Результат.Вставить("ТекущаяПозиция", ТекущаяПозиция); + Результат.Вставить("ПолноеКоличество", ПолноеКоличество); + Результат.Вставить("HTMLТекст", HTMLТекст); + Результат.Вставить("СлишкомМногоРезультатов", СлишкомМногоРезультатов); + + Возврат Результат; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы и элементов формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы(); + ЭтоФайловаяБаза = ОбщегоНазначения.ИнформационнаяБазаФайловая(СтрокаСоединенияСБД); + ОбновитьАктуальностьИндекса(); + + Попытка + ПоказаныРезультатыСПо = НСтр("ru = 'Введите, что нужно найти.'"); + ТекущаяПозиция = 0; + + Элементы.Далее.Доступность = Ложь; + Элементы.Назад.Доступность = Ложь; + + Массив = ХранилищеОбщихНастроек.Загрузить("ПолнотекстовыйПоискСтрокиПолнотекстовогоПоиска"); + + Если Массив <> Неопределено Тогда + Элементы.СтрокаПоиска.СписокВыбора.ЗагрузитьЗначения(Массив); + КонецЕсли; + + Если Не ПустаяСтрока(Параметры.ПереданнаяСтрокаПоиска) Тогда + СтрокаПоиска = Параметры.ПереданнаяСтрокаПоиска; + + СохранитьСтрокуПоиска(Элементы, СтрокаПоиска); + Результат = ИскатьВыполнитьСервер(0, ТекущаяПозиция, СтрокаПоиска); + + РезультатыПоиска = Результат.РезультатПоиска; + HTMLТекст = Результат.HTMLТекст; + ТекущаяПозиция = Результат.ТекущаяПозиция; + ПолноеКоличество = Результат.ПолноеКоличество; + + Если РезультатыПоиска.Количество() <> 0 Тогда + + ПоказаныРезультатыСПо = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Показаны %1 - %2 из %3'"), + Строка(ТекущаяПозиция + 1), + Строка(ТекущаяПозиция + РезультатыПоиска.Количество()), + Строка(ПолноеКоличество) ); + + Элементы.Далее.Доступность = (ПолноеКоличество - ТекущаяПозиция) > РезультатыПоиска.Количество(); + Элементы.Назад.Доступность = (ТекущаяПозиция > 0); + Иначе + ПоказаныРезультатыСПо = НСтр("ru = 'Не найдено'"); + Элементы.Далее.Доступность = Ложь; + Элементы.Назад.Доступность = Ложь; + КонецЕсли; + Иначе + HTMLТекст = " + | + | + | + | + | + |
    + | + |"; + КонецЕсли; + Исключение + КонецПопытки; +КонецПроцедуры + +&НаКлиенте +Процедура СтрокаПоискаПриИзменении(Элемент) + + Искать(0); + +КонецПроцедуры + +&НаКлиенте +Процедура СтрокаПоискаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + СтрокаПоиска = ВыбранноеЗначение; + Искать(0); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики команд формы +// + +// Обработка команды Найти +// +&НаКлиенте +Процедура ИскатьВыполнить() + + Искать(0); + +КонецПроцедуры + +// Обработчик команды Далее +// +&НаКлиенте +Процедура ДалееВыполнить() + + Искать(1); + +КонецПроцедуры + +// Обработчик команды Назад +// +&НаКлиенте +Процедура НазадВыполнить() + Искать(-1); +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИндекс(Команда) + + Состояние(НСтр("ru = 'Идет обновление полнотекстового индекса... + |Пожалуйста, подождите.'")); + + ОбновитьИндексСервер(); + + Состояние(НСтр("ru = 'Обновление полнотекстового индекса завершено.'")); + +КонецПроцедуры + +&НаКлиенте +Процедура HTMLТекстПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка) + ЭлементHTML = ДанныеСобытия.Anchor; + + Если ЭлементHTML = Неопределено Тогда + Возврат; + КонецЕсли; + + Если (ЭлементHTML.id = "FullTextSearchListItem") Тогда + ЧастьURL = ЭлементHTML.pathName; + Позиция = СтроковыеФункцииКлиентСервер.НайтиСимволСКонца(ЧастьURL, "/"); + Если Позиция <> 0 Тогда + ЧастьURL = Сред(ЧастьURL, Позиция + 1); + КонецЕсли; + + НомерВСписке = Число(ЧастьURL); + СтруктураРезультата = РезультатыПоиска[НомерВСписке].Значение; + ВыбраннаяСтрока = СтруктураРезультата.Значение; + МассивОбъектов = СтруктураРезультата.ЗначенияДляОткрытия; + + Если МассивОбъектов.Количество() = 1 Тогда + ОткрытьЗначениеПоиска(МассивОбъектов[0]); + ИначеЕсли МассивОбъектов.Количество() <> 0 Тогда + Список = Новый СписокЗначений; + Для Каждого ЭлементМассива Из МассивОбъектов Цикл + Список.Добавить(ЭлементМассива); + КонецЦикла; + ВыбранныйОбъект = ВыбратьИзСписка(Список, Элементы.HTMLТекст); + Если ВыбранныйОбъект <> Неопределено Тогда + ОткрытьЗначениеПоиска(ВыбранныйОбъект.Значение); + КонецЕсли; + КонецЕсли; + + СтандартнаяОбработка = Ложь; + КонецЕсли; +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Help/ru.html b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Help/ru.html new file mode 100644 index 000000000..42c62a57b --- /dev/null +++ b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Help/ru.html @@ -0,0 +1,26 @@ + +

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

    +

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

    +

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

    +

    + + + + + + + +
    Пример поискаРезультат
    «Реализация 00016422»Найдет документ «реализация товаров и услуг» с номером «00016422»
    «Платежное 120000»Найдет платежные поручения на суммы 120000 и 120000,50
    «Иванов Акация»Найдет все документы, выписанные Ивановым для контрагента ООО «Акация»
    «Реализация Акация»Найдет все документы «реализация товаров и услуг» по контрагенту ООО «Акация»
    «Акация 05.07»Найдет все документы по контрагенту ООО «Акация», оформленные 5-го июля
    «Кроссовки»Найдет все упоминания товаров типа «кроссовки» по порядку:
    • Кроссовки белые (Товар)
    • Кроссовки черные (Товар)
    • Поступление товаров и услуг № 00086822
    • Реализация товаров и услуг № 00016422

     

    +

    Советы:

    +
    +
    • Если нашлось много данных, то уточните поисковый запрос, добавив к нему какое-либо уточнение (дату, сумму, название контрагента)  +
    • Если нашлось мало данных, то упростите запрос, исключив из него какое-либо слово +
    • Для точного поиска используйте:
    +
    • Кавычки - для поиска точной фразы, например: «"мини пылесос"» +
    • ИЛИ - для поиска одного из двух слов, например «Акация ИЛИ Стройпромвсе» - найдет все упоминания контрагентов ООО "Акация" и ЗАО "Стройпромвсе". +
    • Скобки - для группировки выражений, например поиск «Иванов (Акация ИЛИ Стройпромвсе)» найдет все документы, выписанные Ивановым по контрагентам ООО "Акация" и ЗАО "Стройпромвсе".
    +
    • Для поиска с учетом синонимов используйте "!", например, поиск "!номер" найдет все документы в которых встречается слово "номер" или "число" +
    • Для "нечеткого" поиска используйте "#" например "Стройпромвсе#2" найдет все документы, содержащие такие слова, которые отличаются от слова "Стройпромвсе" на одну или две буквы. +
    • Для поиска по началу слова используйте "*", например, поиск "Строй*" найдет все документы, которые содержат слова, начинающиеся на "Строй" - "Стройка", "Стройпромвсе"  и т.д.
    +

    См. также: Полное описание формата поисковых выражений.

    +

     

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/ПолнотекстовыйПоискВДанных.mdo b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/ПолнотекстовыйПоискВДанных.mdo new file mode 100644 index 000000000..dea5e3b96 --- /dev/null +++ b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/ПолнотекстовыйПоискВДанных.mdo @@ -0,0 +1,47 @@ + + + + + + + ПолнотекстовыйПоискВДанных + + ru + Полнотекстовый поиск + + DataProcessor.ПолнотекстовыйПоискВДанных.Form.ФормаПоиска + true + + + ru + + + + ФормаПоиска + + ru + Форма поиска + + PersonalComputer + MobileDevice + + + УпрощеннаяФорма + + ru + Упрощенная форма + + PersonalComputer + MobileDevice + + + ПолнотекстовыйПоиск + + ru + Полнотекстовый поиск + + ActionsPanelTools + Auto + Ctrl+Shift+F + + diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Form.form b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Form.form new file mode 100644 index 000000000..b441435b7 --- /dev/null +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Form.form @@ -0,0 +1,6200 @@ + + + + <key>ru</key> + <value>Помощник создания обмена данными</value> + + + СтраницыМастера + 2 + + СтраницаМастераНачало + 3 + + ЗаголовокСтраницыМастера1 + 140 + + <key>ru</key> + <value>Вас приветствует помощник создания обмена данными!</value> + + true + true + + true + + + ЗаголовокСтраницыМастера1РасширеннаяПодсказка + 759 + Label + true + true + + Left + + + + ЗаголовокСтраницыМастера1КонтекстноеМеню + 141 + true + + Label + true + 2 + true + true + false + false + + System.DefaultGUIFont + 10.0 + true + false + false + false + + + Left + Top + + + + Декорация6 + 145 + + <key>ru</key> + <value>Помощник позволит Вам создать новый обмен данными с другой информационной базой.</value> + + true + true + + true + + + Декорация6РасширеннаяПодсказка + 760 + Label + true + true + + Left + + + + Декорация6КонтекстноеМеню + 146 + true + + Label + true + true + true + false + false + + Left + Top + + + + ГиперссылкаМетодикаВыбораИнформационнойБазы + 732 + + <key>ru</key> + <value>Ознакомиться с методикой выбора информационной базы для начала создания обмена данными</value> + + true + true + + true + + + ГиперссылкаМетодикаВыбораИнформационнойБазыРасширеннаяПодсказка + 761 + Label + true + true + + Left + + + Hyperlink + Form.Command.КомандаСправка + Normal + Auto + true + true + UserCmds + + CommonPicture.Информация + + Auto + + + ГруппаПереключателяВыбораРежимаРаботыПомощника + 144 + + ВариантРаботыМастера + 45 + true + true + + true + + + ВариантРаботыМастера + + None + + OnChange + ВариантРаботыМастераПриИзменении + + + ВариантРаботыМастераРасширеннаяПодсказка + 763 + Label + true + true + + Left + + + + ВариантРаботыМастераКонтекстноеМеню + 46 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Шаг 1. Создать новый обмен данными + + + НастроитьНовыйОбменДанными + + + + + ru + Шаг 2. Продолжить создание обмена данными + + + ПродолжитьНастройкуОбменаДанными + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Группа переключателя выбора режима работы помощника</value> + + + ru + Группа переключателя выбора режима работы помощника + + 70 + false + false + + ГруппаПереключателяВыбораРежимаРаботыПомощникаРасширеннаяПодсказка + 762 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + СтраницыВыбораФайлаСНастройкамиОбмена + 667 + + СтраницаВыбораФайлаСНастройкамиОбмена + 668 + + Декорация11 + 358 + + <key>ru</key> + <value>Укажите имя файла с сохраненными настройками обмена данными, +который был выгружен при настройке в первой информационной базе:</value> + + true + true + + true + + + Декорация11РасширеннаяПодсказка + 767 + Label + true + true + + Left + + + + Декорация11КонтекстноеМеню + 359 + true + + Label + true + true + false + + Style.ПоясняющийТекст + + + Left + 2 + + + + Группа20 + 417 + + ИмяФайлаНастроекОбменаДаннымиДляЗагрузки + 415 + + <key>ru</key> + <value>Укажите имя файла с сохраненными настройками обмена данными, +который был выгружен при настройке в первой информационной базе</value> + + true + true + + true + + + Объект.ИмяФайлаНастроекОбменаДаннымиДляЗагрузки + + None + + ИмяФайлаНастроекОбменаДаннымиДляЗагрузкиРасширеннаяПодсказка + 769 + Label + true + true + + Left + + + + ИмяФайлаНастроекОбменаДаннымиДляЗагрузкиКонтекстноеМеню + 416 + true + + InputField + true + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ВыбратьФайлНастроекОбменаДанными + 360 + true + true + + true + + false + + ВыбратьФайлНастроекОбменаДаннымиРасширеннаяПодсказка + 771 + Label + true + true + + Left + + + UsualButton + Form.Command.ВыбратьФайлНастроекОбменаДанными + Normal + Auto + true + true + UserCmds + + System.DefaultGUIFont + + Auto + + true + true + + true + + + Группа20РасширеннаяПодсказка + 768 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница выбора файла с настройками обмена</value> + + + ru + Страница выбора файла с настройками обмена + + + СтраницаВыбораФайлаСНастройкамиОбменаРасширеннаяПодсказка + 766 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаВыбораФайлаСНастройкамиОбменаПустая + 669 + + ПустаяКартинка + 670 + true + true + + true + + + ПустаяКартинкаРасширеннаяПодсказка + 773 + Label + true + true + + Left + + + + ПустаяКартинкаКонтекстноеМеню + 671 + true + + true + true + + + + + true + true + + true + + + <key>ru</key> + <value>Страница выбора файла с настройками обмена пустая</value> + + + ru + Страница выбора файла с настройками обмена пустая + + + СтраницаВыбораФайлаСНастройкамиОбменаПустаяРасширеннаяПодсказка + 772 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы выбора файла с настройками обмена</value> + + + ru + Страницы выбора файла с настройками обмена + + + СтраницыВыбораФайлаСНастройкамиОбменаРасширеннаяПодсказка + 765 + Label + true + true + + Left + + + Pages + + Auto + + + + КомпозицияКартинокПервойСтраницыПомощника + 733 + + СтраницыПервойИнформационнойБазы + 734 + + СтраницаПервойИнформационнойБазыАктивная + 736 + + КартинкаПервойИнформационнойБазы + 745 + + <key>ru</key> + <value>Картинка первой информационной базы</value> + + true + true + + true + + + КартинкаПервойИнформационнойБазыРасширеннаяПодсказка + 777 + Label + true + true + + Left + + + + КартинкаПервойИнформационнойБазыКонтекстноеМеню + 746 + true + + 24 + true + 12 + true + + + + + true + true + + true + + + <key>ru</key> + <value>Страница первой информационной базы активная</value> + + + ru + Страница первой информационной базы активная + + + СтраницаПервойИнформационнойБазыАктивнаяРасширеннаяПодсказка + 776 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаПервойИнформационнойБазыНеактивная + 737 + + КартинкаПервойИнформационнойБазы1 + 747 + + <key>ru</key> + <value>Картинка первой информационной базы</value> + + true + true + + true + + + КартинкаПервойИнформационнойБазы1РасширеннаяПодсказка + 779 + Label + true + true + + Left + + + + КартинкаПервойИнформационнойБазы1КонтекстноеМеню + 748 + true + + 24 + true + 12 + true + + + Click + КартинкаПервойИнформационнойБазы1Нажатие + + + true + + + true + true + + true + + + <key>ru</key> + <value>Страница первой информационной базы неактивная</value> + + + ru + Страница первой информационной базы активная + + + СтраницаПервойИнформационнойБазыНеактивнаяРасширеннаяПодсказка + 778 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы первой информационной базы</value> + + + ru + Страницы первой информационной базы + + + СтраницыПервойИнформационнойБазыРасширеннаяПодсказка + 775 + Label + true + true + + Left + + + Pages + + Auto + + + + КартинкиФайловНастроекИСообщенияОбмена + 740 + + Декорация2 + 753 + true + true + + true + + + Декорация2РасширеннаяПодсказка + 781 + Label + true + true + + Left + + + + Декорация2КонтекстноеМеню + 754 + true + + Label + true + 3 + true + + Left + + + + КартинкаФайлаНастроек + 741 + + <key>ru</key> + <value>Картинка файла настроек</value> + + true + true + + true + + + ru + Файл с настройками для второй информационной базы + + + КартинкаФайлаНастроекРасширеннаяПодсказка + 782 + Label + true + true + + Left + + + + КартинкаФайлаНастроекКонтекстноеМеню + 742 + true + + 23 + true + 4 + true + + + + + + КартинкаФайлаСообщенияОбмена + 743 + + <key>ru</key> + <value>Картинка файла сообщения обмена</value> + + true + true + + true + + + ru + Файл сообщения обмена для второй информационной базы + + + КартинкаФайлаСообщенияОбменаРасширеннаяПодсказка + 783 + Label + true + true + + Left + + + + КартинкаФайлаСообщенияОбменаКонтекстноеМеню + 744 + true + + 23 + true + 4 + true + + + + + true + true + + true + + + <key>ru</key> + <value>Картинки файлов настроек и сообщения обмена</value> + + + ru + Картинки файлов настроек и сообщения обмена + + + КартинкиФайловНастроекИСообщенияОбменаРасширеннаяПодсказка + 780 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + СтраницыВторойИнформационнойБазы + 735 + + СтраницаВторойИнформационнойБазыАктивная + 738 + + КартинкаВторойИнформационнойБазы + 749 + + <key>ru</key> + <value>Картинка второй информационной базы</value> + + true + true + + true + + + КартинкаВторойИнформационнойБазыРасширеннаяПодсказка + 786 + Label + true + true + + Left + + + + КартинкаВторойИнформационнойБазыКонтекстноеМеню + 750 + true + + 24 + true + 12 + true + + + + + true + true + + true + + + <key>ru</key> + <value>Страница второй информационной базы активная</value> + + + ru + Страница первой информационной базы активная + + + СтраницаВторойИнформационнойБазыАктивнаяРасширеннаяПодсказка + 785 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаВторойИнформационнойБазыНеактивная + 739 + + КартинкаВторойИнформационнойБазы1 + 751 + + <key>ru</key> + <value>Картинка второй информационной базы</value> + + true + true + + true + + + КартинкаВторойИнформационнойБазы1РасширеннаяПодсказка + 788 + Label + true + true + + Left + + + + КартинкаВторойИнформационнойБазы1КонтекстноеМеню + 752 + true + + 24 + true + 12 + true + + + Click + КартинкаВторойИнформационнойБазы1Нажатие + + + true + + + true + true + + true + + + <key>ru</key> + <value>Страница второй информационной базы неактивная</value> + + + ru + Страница первой информационной базы активная + + + СтраницаВторойИнформационнойБазыНеактивнаяРасширеннаяПодсказка + 787 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы второй информационной базы</value> + + + ru + Страницы второй информационной базы + + + СтраницыВторойИнформационнойБазыРасширеннаяПодсказка + 784 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Композиция картинок первой страницы помощника</value> + + + ru + Композиция картинок первой страницы помощника + + + КомпозицияКартинокПервойСтраницыПомощникаРасширеннаяПодсказка + 774 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Декорация1 + 662 + true + true + + true + + + Декорация1РасширеннаяПодсказка + 789 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 663 + true + + Label + true + true + true + + Left + + + + НадписьДалееВариантРаботыМастера + 123 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для задания настроек обмена через локальный или сетевой каталог.</value> + + true + true + + true + + + НадписьДалееВариантРаботыМастераРасширеннаяПодсказка + 790 + Label + true + true + + Left + + + + НадписьДалееВариантРаботыМастераКонтекстноеМеню + 124 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера начало</value> + + + ru + Страница мастера начало + + + СтраницаМастераНачалоРасширеннаяПодсказка + 758 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаМастераЗаданиеПараметровТранспортаFILE + 694 + + ЗаголовокСтраницыМастера7 + 695 + + <key>ru</key> + <value>Укажите настройки для обмена через локальный или сетевой каталог</value> + + true + true + + true + + + ЗаголовокСтраницыМастера7РасширеннаяПодсказка + 792 + Label + true + true + + Left + + + + ЗаголовокСтраницыМастера7КонтекстноеМеню + 696 + true + + Label + true + 2 + true + true + false + false + + System.DefaultGUIFont + 10.0 + true + false + false + false + + + Left + Top + + + + ИспользоватьПараметрыТранспортаFILE + 717 + true + true + + true + + + Объект.ИспользоватьПараметрыТранспортаFILE + + Right + + OnChange + ИспользоватьПараметрыТранспортаFILEПриИзменении + + + ИспользоватьПараметрыТранспортаFILEРасширеннаяПодсказка + 793 + Label + true + true + + Left + + + + ИспользоватьПараметрыТранспортаFILEКонтекстноеМеню + 718 + true + + CheckBoxField + Enter + true + Left + true + + + + НастройкиТранспортаFILE + 620 + + ПояснениеВыбораКаталогаОбменаИнформациейНаСервере + 755 + + <key>ru</key> + <value>Укажите каталог на сервере 1С:Предприятия или сетевой каталог, доступный с сервера.</value> + + true + true + + true + + + ПояснениеВыбораКаталогаОбменаИнформациейНаСервереРасширеннаяПодсказка + 796 + Label + true + true + + Left + + + + ПояснениеВыбораКаталогаОбменаИнформациейНаСервереКонтекстноеМеню + 756 + true + + Label + true + true + + Style.ПоясняющийТекст + + + Left + + + + FILEКаталогОбменаИнформацией + 621 + true + true + + true + + + Объект.FILEКаталогОбменаИнформацией + + + FILEКаталогОбменаИнформациейРасширеннаяПодсказка + 797 + Label + true + true + + Left + + + + FILEКаталогОбменаИнформациейКонтекстноеМеню + 622 + true + + InputField + true + Enter + true + Left + true + + + StartChoice + FILEКаталогОбменаИнформациейНачалоВыбора + + + Opening + FILEКаталогОбменаИнформациейОткрытие + + true + true + true + true + true + true + true + true + true + Normal + + + + FILEСжиматьФайлИсходящегоСообщения + 623 + true + true + + true + + + Объект.FILEСжиматьФайлИсходящегоСообщения + + Right + + FILEСжиматьФайлИсходящегоСообщенияРасширеннаяПодсказка + 799 + Label + true + true + + Left + + + + FILEСжиматьФайлИсходящегоСообщенияКонтекстноеМеню + 624 + true + + CheckBoxField + Enter + true + Left + true + + + + ПарольАрхиваСообщенияОбмена + 639 + true + true + + true + + + Объект.ПарольАрхиваСообщенияОбмена + + + ПарольАрхиваСообщенияОбменаРасширеннаяПодсказка + 801 + Label + true + true + + Left + + + + ПарольАрхиваСообщенияОбменаКонтекстноеМеню + 640 + true + + InputField + Enter + true + Left + true + + 20 + true + true + false + true + true + true + true + true + Normal + + + + ОтступКнопкиПроверкиПодключенияFILE + 664 + + ПроверитьПодключениеFILE + 654 + true + true + + true + + false + + ПроверитьПодключениеFILEРасширеннаяПодсказка + 804 + Label + true + true + + Left + + + UsualButton + Form.Command.ПроверитьПодключениеFILE + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ОтступКнопкиПроверкиПодключенияFILEРасширеннаяПодсказка + 803 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройки транспорта FILE</value> + + + ru + Настройки транспорта FILE + + + НастройкиТранспортаFILEРасширеннаяПодсказка + 795 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + Декорация4 + 697 + true + true + + true + + + Декорация4РасширеннаяПодсказка + 805 + Label + true + true + + Left + + + + Декорация4КонтекстноеМеню + 698 + true + + Label + true + true + true + false + + Left + + + + НадписьДалее + 699 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для задания настроек обмена через FTP-ресурс.</value> + + true + true + + true + + + НадписьДалееРасширеннаяПодсказка + 806 + Label + true + true + + Left + + + + НадписьДалееКонтекстноеМеню + 700 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера задание параметров транспорта FILE</value> + + + ru + Страница мастера задание параметров транспорта FILE + + + СтраницаМастераЗаданиеПараметровТранспортаFILEРасширеннаяПодсказка + 791 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаМастераЗаданиеПараметровТранспортаFTP + 708 + + ЗаголовокСтраницыМастера9 + 709 + + <key>ru</key> + <value>Укажите настройки для обмена через FTP-ресурс</value> + + true + true + + true + + + ЗаголовокСтраницыМастера9РасширеннаяПодсказка + 808 + Label + true + true + + Left + + + + ЗаголовокСтраницыМастера9КонтекстноеМеню + 710 + true + + Label + true + 2 + true + true + false + false + + System.DefaultGUIFont + 10.0 + true + false + false + false + + + Left + Top + + + + ИспользоватьПараметрыТранспортаFTP + 719 + true + true + + true + + + Объект.ИспользоватьПараметрыТранспортаFTP + + Right + + OnChange + ИспользоватьПараметрыТранспортаFTPПриИзменении + + + ИспользоватьПараметрыТранспортаFTPРасширеннаяПодсказка + 809 + Label + true + true + + Left + + + + ИспользоватьПараметрыТранспортаFTPКонтекстноеМеню + 720 + true + + CheckBoxField + Enter + true + Left + true + + + + НастройкиТранспортаFTP + 617 + + ГруппаСерверПорт + 650 + + FTPСоединениеПуть + 637 + true + true + + true + + + Объект.FTPСоединениеПуть + + + FTPСоединениеПутьРасширеннаяПодсказка + 813 + Label + true + true + + Left + + + + FTPСоединениеПутьКонтекстноеМеню + 638 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + FTPСоединениеПорт + 635 + true + true + + true + + + Объект.FTPСоединениеПорт + + + FTPСоединениеПортРасширеннаяПодсказка + 815 + Label + true + true + + Left + + + + FTPСоединениеПортКонтекстноеМеню + 636 + true + + InputField + true + Enter + true + Left + true + + true + true + true + + ru + ЧГ=0 + + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа сервер порт</value> + + + ru + Группа сервер порт + + + ГруппаСерверПортРасширеннаяПодсказка + 812 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаПользовательПароль + 651 + + FTPСоединениеПользователь + 633 + true + true + + true + + + Объект.FTPСоединениеПользователь + + + FTPСоединениеПользовательРасширеннаяПодсказка + 818 + Label + true + true + + Left + + + + FTPСоединениеПользовательКонтекстноеМеню + 634 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + FTPСоединениеПароль + 629 + true + true + + true + + + Объект.FTPСоединениеПароль + + + FTPСоединениеПарольРасширеннаяПодсказка + 820 + Label + true + true + + Left + + + + FTPСоединениеПарольКонтекстноеМеню + 630 + true + + InputField + Enter + true + Left + true + + 20 + true + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа пользователь пароль</value> + + + ru + Группа пользователь пароль + + + ГруппаПользовательПарольРасширеннаяПодсказка + 817 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + FTPСоединениеМаксимальныйДопустимыйРазмерСообщения + 627 + true + true + + true + + + Объект.FTPСоединениеМаксимальныйДопустимыйРазмерСообщения + + + FTPСоединениеМаксимальныйДопустимыйРазмерСообщенияРасширеннаяПодсказка + 822 + Label + true + true + + Left + + + + FTPСоединениеМаксимальныйДопустимыйРазмерСообщенияКонтекстноеМеню + 628 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + FTPСоединениеПассивноеСоединение + 631 + true + true + + true + + + Объект.FTPСоединениеПассивноеСоединение + + Right + + FTPСоединениеПассивноеСоединениеРасширеннаяПодсказка + 824 + Label + true + true + + Left + + + + FTPСоединениеПассивноеСоединениеКонтекстноеМеню + 632 + true + + CheckBoxField + Enter + true + Left + true + + + + FTPСжиматьФайлИсходящегоСообщения + 625 + true + true + + true + + + Объект.FTPСжиматьФайлИсходящегоСообщения + + Right + + FTPСжиматьФайлИсходящегоСообщенияРасширеннаяПодсказка + 826 + Label + true + true + + Left + + + + FTPСжиматьФайлИсходящегоСообщенияКонтекстноеМеню + 626 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаЗаданияПароляСообщенияОбменаFTP + 661 + + ПарольАрхиваСообщенияОбмена1 + 657 + true + true + + true + + + Объект.ПарольАрхиваСообщенияОбмена + + + ПарольАрхиваСообщенияОбмена1РасширеннаяПодсказка + 829 + Label + true + true + + Left + + + + ПарольАрхиваСообщенияОбмена1КонтекстноеМеню + 658 + true + + InputField + Enter + true + Left + true + + 20 + true + true + false + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа задания пароля сообщения обмена FTP</value> + + + ru + Группа задания пароля сообщения обмена FTP + + + ГруппаЗаданияПароляСообщенияОбменаFTPРасширеннаяПодсказка + 828 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ОтступКнопкиПроверкиПодключенияFTP + 665 + + ПроверитьПодключениеFTP + 655 + true + true + + true + + false + + ПроверитьПодключениеFTPРасширеннаяПодсказка + 832 + Label + true + true + + Left + + + UsualButton + Form.Command.ПроверитьПодключениеFTP + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ru + Отступ кнопки проверки подключения FTP + + + ОтступКнопкиПроверкиПодключенияFTPРасширеннаяПодсказка + 831 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройки транспорта FTP</value> + + + ru + Настройки транспорта FTP + + + НастройкиТранспортаFTPРасширеннаяПодсказка + 811 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + Декорация8 + 711 + true + true + + true + + + Декорация8РасширеннаяПодсказка + 833 + Label + true + true + + Left + + + + Декорация8КонтекстноеМеню + 712 + true + + Label + true + true + true + false + + Left + + + + НадписьДалее2 + 713 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для задания настроек обмена по почте.</value> + + true + true + + true + + + НадписьДалее2РасширеннаяПодсказка + 834 + Label + true + true + + Left + + + + НадписьДалее2КонтекстноеМеню + 714 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера задание параметров транспорта FTP</value> + + + ru + Страница мастера задание параметров транспорта FTP + + + СтраницаМастераЗаданиеПараметровТранспортаFTPРасширеннаяПодсказка + 807 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаМастераЗаданиеПараметровТранспортаEMAIL + 701 + + ЗаголовокСтраницыМастера8 + 702 + + <key>ru</key> + <value>Укажите настройки для обмена по почте</value> + + true + true + + true + + + ЗаголовокСтраницыМастера8РасширеннаяПодсказка + 836 + Label + true + true + + Left + + + + ЗаголовокСтраницыМастера8КонтекстноеМеню + 703 + true + + Label + true + 2 + true + true + false + false + + System.DefaultGUIFont + 10.0 + true + false + false + false + + + Left + Top + + + + ИспользоватьПараметрыТранспортаEMAIL + 721 + true + true + + true + + + Объект.ИспользоватьПараметрыТранспортаEMAIL + + Right + + OnChange + ИспользоватьПараметрыТранспортаEMAILПриИзменении + + + ИспользоватьПараметрыТранспортаEMAILРасширеннаяПодсказка + 837 + Label + true + true + + Left + + + + ИспользоватьПараметрыТранспортаEMAILКонтекстноеМеню + 722 + true + + CheckBoxField + Enter + true + Left + true + + + + НастройкиТранспортаEMAIL + 619 + + EMAILУчетнаяЗапись + 652 + true + true + + true + + + Объект.EMAILУчетнаяЗапись + + + EMAILУчетнаяЗаписьРасширеннаяПодсказка + 840 + Label + true + true + + Left + + + + EMAILУчетнаяЗаписьКонтекстноеМеню + 653 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + EMAILМаксимальныйДопустимыйРазмерСообщения + 643 + true + true + + true + + + Объект.EMAILМаксимальныйДопустимыйРазмерСообщения + + + EMAILМаксимальныйДопустимыйРазмерСообщенияРасширеннаяПодсказка + 842 + Label + true + true + + Left + + + + EMAILМаксимальныйДопустимыйРазмерСообщенияКонтекстноеМеню + 644 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + EMAILСжиматьФайлИсходящегоСообщения + 645 + true + true + + true + + + Объект.EMAILСжиматьФайлИсходящегоСообщения + + Right + + EMAILСжиматьФайлИсходящегоСообщенияРасширеннаяПодсказка + 844 + Label + true + true + + Left + + + + EMAILСжиматьФайлИсходящегоСообщенияКонтекстноеМеню + 646 + true + + CheckBoxField + Enter + true + Left + true + + + + ПарольАрхиваСообщенияОбмена2 + 659 + true + true + + true + + + Объект.ПарольАрхиваСообщенияОбмена + + + ПарольАрхиваСообщенияОбмена2РасширеннаяПодсказка + 846 + Label + true + true + + Left + + + + ПарольАрхиваСообщенияОбмена2КонтекстноеМеню + 660 + true + + InputField + Enter + true + Left + true + + 20 + true + true + false + true + true + true + true + true + Normal + + + + ОтступКнопкиПроверкиПодключенияEMAIL + 666 + + ПроверитьПодключениеEMAIL + 656 + true + true + + true + + false + + ПроверитьПодключениеEMAILРасширеннаяПодсказка + 849 + Label + true + true + + Left + + + UsualButton + Form.Command.ПроверитьПодключениеEMAIL + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ОтступКнопкиПроверкиПодключенияEMAILРасширеннаяПодсказка + 848 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройки транспорта EMAIL</value> + + + ru + Настройки транспорта EMAIL + + + НастройкиТранспортаEMAILРасширеннаяПодсказка + 839 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + Декорация7 + 704 + true + true + + true + + + Декорация7РасширеннаяПодсказка + 850 + Label + true + true + + Left + + + + Декорация7КонтекстноеМеню + 705 + true + + Label + true + true + true + false + + Left + + + + НадписьДалее1 + 706 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для настройки дополнительных параметров обмена данными.</value> + + true + true + + true + + + НадписьДалее1РасширеннаяПодсказка + 851 + Label + true + true + + Left + + + + НадписьДалее1КонтекстноеМеню + 707 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера задание параметров транспорта EMAIL</value> + + + ru + Страница мастера задание параметров транспорта EMAIL + + + СтраницаМастераЗаданиеПараметровТранспортаEMAILРасширеннаяПодсказка + 835 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаМастераНастройкаПараметров + 6 + + ЗаголовокСтраницыМастера5 + 174 + + <key>ru</key> + <value>Настройка параметров обмена данными</value> + + true + true + + true + + + ЗаголовокСтраницыМастера5РасширеннаяПодсказка + 853 + Label + true + true + + Left + + + + ЗаголовокСтраницыМастера5КонтекстноеМеню + 175 + true + + Label + true + 2 + true + true + false + false + + System.DefaultGUIFont + 10.0 + true + false + false + false + + + Left + Top + + + + НаименованиеНастройкиВыполненияОбмена + 67 + true + true + + true + + + Объект.НаименованиеНастройкиВыполненияОбмена + + Top + + НаименованиеНастройкиВыполненияОбменаРасширеннаяПодсказка + 854 + Label + true + true + + Left + + + + НаименованиеНастройкиВыполненияОбменаКонтекстноеМеню + 68 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ВидТранспортаСообщенийОбмена + 715 + true + true + + true + + + Объект.ВидТранспортаСообщенийОбмена + + + ВидТранспортаСообщенийОбменаРасширеннаяПодсказка + 856 + Label + true + true + + Left + + + + ВидТранспортаСообщенийОбменаКонтекстноеМеню + 716 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + false + true + true + true + true + true + + + ru + Обмен через локальный или сетевой каталог + + + Enum.ВидыТранспортаСообщенийОбмена.EnumValue.FILE + + + + + ru + Обмен через FTP-ресурс + + + Enum.ВидыТранспортаСообщенийОбмена.EnumValue.FTP + + + + + ru + Обмен по почте + + + Enum.ВидыТранспортаСообщенийОбмена.EnumValue.EMAIL + + + Normal + + + + РамкаГруппыПрефиксаИнформационнойБазы + 116 + + ПрефиксИнформационнойБазыИсточника + 117 + true + true + + true + + + Объект.ПрефиксИнформационнойБазыИсточника + + + ПрефиксИнформационнойБазыИсточникаРасширеннаяПодсказка + 859 + Label + true + true + + Left + + + + ПрефиксИнформационнойБазыИсточникаКонтекстноеМеню + 118 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + ru + Рамка группы префикса информационной базы + + true + + РамкаГруппыПрефиксаИнформационнойБазыРасширеннаяПодсказка + 858 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + НастройкиУзла + 539 + + РамкаГруппыОграничений + 111 + + ОписаниеОграниченийПередачиДанных + 387 + true + true + + true + + + ОписаниеОграниченийПередачиДанных + + None + + ОписаниеОграниченийПередачиДанныхРасширеннаяПодсказка + 863 + Label + true + true + + Left + + + + ОписаниеОграниченийПередачиДанныхКонтекстноеМеню + 388 + true + + InputField + true + Enter + true + Left + true + + true + 5 + true + true + true + true + true + true + true + Normal + + + + Группа10 + 389 + + НастройкаОграниченийРегистрацииДанных + 110 + true + true + + true + + false + + НастройкаОграниченийРегистрацииДанныхРасширеннаяПодсказка + 866 + Label + true + true + + Left + + + UsualButton + Form.Command.НастройкаОграниченийРегистрацииДанных + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + Группа10РасширеннаяПодсказка + 865 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Ограничения передачи данных:</value> + + + ru + Рамка группы ограничений + + true + false + + РамкаГруппыОграниченийРасширеннаяПодсказка + 862 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + РамкаГруппыЗначенийПоУмолчанию + 532 + + ОписаниеЗначенийПоУмолчанию + 533 + true + true + + true + + + ОписаниеЗначенийПоУмолчанию + + None + + ОписаниеЗначенийПоУмолчаниюРасширеннаяПодсказка + 868 + Label + true + true + + Left + + + + ОписаниеЗначенийПоУмолчаниюКонтекстноеМеню + 534 + true + + InputField + true + Enter + true + Left + true + + true + 5 + true + true + true + true + true + true + true + Normal + + + + Группа102 + 535 + + НастройкаЗначенийПоУмолчанию + 538 + true + true + + true + + false + + НастройкаЗначенийПоУмолчаниюРасширеннаяПодсказка + 871 + Label + true + true + + Left + + + UsualButton + Form.Command.НастройкаЗначенийПоУмолчанию + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + Группа102РасширеннаяПодсказка + 870 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Значения по умолчанию:</value> + + true + false + + РамкаГруппыЗначенийПоУмолчаниюРасширеннаяПодсказка + 867 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Настройки узла</value> + + + ru + Настройки узла + + + НастройкиУзлаРасширеннаяПодсказка + 861 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + Декорация5 + 194 + true + true + + true + + + Декорация5РасширеннаяПодсказка + 872 + Label + true + true + + Left + + + + Декорация5КонтекстноеМеню + 195 + true + + Label + true + true + true + false + + Left + + + + НадписьДалееПодтверждениеНастроек + 131 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для проверки параметров и создания обмена данными.</value> + + true + true + + true + + + НадписьДалееПодтверждениеНастроекРасширеннаяПодсказка + 873 + Label + true + true + + Left + + + + НадписьДалееПодтверждениеНастроекКонтекстноеМеню + 132 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера настройка параметров</value> + + + ru + Страница мастера настройка параметров + + + СтраницаМастераНастройкаПараметровРасширеннаяПодсказка + 852 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаМастераИтогНастройкиОбмена + 7 + + ЗаголовокСтраницыМастераГотово + 176 + + <key>ru</key> + <value>Все готово для создания обмена данными!</value> + + true + true + + true + + + ЗаголовокСтраницыМастераГотовоРасширеннаяПодсказка + 875 + Label + true + true + + Left + + + + ЗаголовокСтраницыМастераГотовоКонтекстноеМеню + 177 + true + + Label + true + 2 + true + true + false + false + + System.DefaultGUIFont + 10.0 + true + false + false + false + + + Left + Top + + + + ПредставлениеРезультатаНастройкиОбмена + 119 + + <key>ru</key> + <value>Будет создан обмен данными со следующими параметрами</value> + + true + true + + true + + + ПредставлениеРезультатаНастройкиОбмена + + true + Top + + ПредставлениеРезультатаНастройкиОбменаРасширеннаяПодсказка + 876 + Label + true + true + + Left + + + + ПредставлениеРезультатаНастройкиОбменаКонтекстноеМеню + 120 + true + + InputField + true + Left + Enter + true + Left + true + + true + 14 + true + false + true + true + true + true + true + Normal + + + + СтраницыНадписиИнформацииОбОткрытииПомощникаСопоставления + 728 + + СтраницаНадписиИнформацииОбОткрытииПомощникаСопоставления + 725 + + ДекорацияИнформация + 726 + + <key>ru</key> + <value>Декорация информация</value> + + true + true + + true + + + ДекорацияИнформацияРасширеннаяПодсказка + 880 + Label + true + true + + Left + + + + ДекорацияИнформацияКонтекстноеМеню + 727 + true + + 2 + true + 1 + true + + + CommonPicture.Информация + + + + + НадписьИнформацияОбОткрытииПомощникаСопоставления + 723 + + <key>ru</key> + <value>После завершения создания настройки обмена данными будет открыт помощник интерактивного обмена данными.</value> + + true + true + + true + + + НадписьИнформацияОбОткрытииПомощникаСопоставленияРасширеннаяПодсказка + 881 + Label + true + true + + Left + + + + НадписьИнформацияОбОткрытииПомощникаСопоставленияКонтекстноеМеню + 724 + true + + Label + true + true + + Style.ПоясняющийТекст + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница надписи информации об открытии помощника сопоставления</value> + + + ru + Страница надписи информации об открытии помощника сопоставления + + + СтраницаНадписиИнформацииОбОткрытииПомощникаСопоставленияРасширеннаяПодсказка + 879 + Label + true + true + + Left + + + Page + + auto + + + + СтраницаНадписиИнформацииОбОткрытииПомощникаСопоставленияПустая + 729 + + ПустаяКартинка1 + 730 + true + true + + true + + + ПустаяКартинка1РасширеннаяПодсказка + 883 + Label + true + true + + Left + + + + ПустаяКартинка1КонтекстноеМеню + 731 + true + + 2 + true + 1 + true + + + + + true + true + + true + + + <key>ru</key> + <value>Страница надписи информации об открытии помощника сопоставления пустая</value> + + + ru + Страница надписи информации об открытии помощника сопоставления пустая + + + СтраницаНадписиИнформацииОбОткрытииПомощникаСопоставленияПустаяРасширеннаяПодсказка + 882 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы надписи информации об открытии помощника сопоставления</value> + + + ru + Страницы надписи информации об открытии помощника сопоставления + + + СтраницыНадписиИнформацииОбОткрытииПомощникаСопоставленияРасширеннаяПодсказка + 878 + Label + true + true + + Left + + + Pages + + Auto + + + + Декорация10 + 196 + true + true + + true + + + Декорация10РасширеннаяПодсказка + 884 + Label + true + true + + Left + + + + Декорация10КонтекстноеМеню + 197 + true + + Label + true + true + true + false + + Left + + + + НадписьДалееДляСозданиеНастройки + 133 + + <key>ru</key> + <value>Будет создан новый обмен данными.</value> + + true + true + + true + + + НадписьДалееДляСозданиеНастройкиРасширеннаяПодсказка + 885 + Label + true + true + + Left + + + + НадписьДалееДляСозданиеНастройкиКонтекстноеМеню + 134 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера итог настройки обмена</value> + + + ru + Страница мастера итог настройки обмена + + + СтраницаМастераИтогНастройкиОбменаРасширеннаяПодсказка + 874 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаМастераОкончаниеСВыгрузкойНастройки + 330 + + ЗаголовокСтраницыМастераЗакрыть + 331 + + <key>ru</key> + <value>Первый этап настройки успешно завершен!</value> + + true + true + + true + + + ЗаголовокСтраницыМастераЗакрытьРасширеннаяПодсказка + 887 + Label + true + true + + Left + + + + ЗаголовокСтраницыМастераЗакрытьКонтекстноеМеню + 332 + true + + Label + true + 2 + true + true + false + false + + System.DefaultGUIFont + 10.0 + true + false + false + false + + + Left + Top + + + + ГруппаФайлаНастроекОбмена1 + 338 + + Группа91 + 339 + + Декорация111 + 340 + true + true + + true + + + Декорация111РасширеннаяПодсказка + 890 + Label + true + true + + Left + + + + Декорация111КонтекстноеМеню + 341 + true + + 5 + true + 3 + true + false + + + CommonPicture.Предупреждение32 + + + + true + true + + true + + + Группа91РасширеннаяПодсказка + 889 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Группа101 + 342 + + Декорация141 + 412 + + <key>ru</key> + <value>Для завершения настройки обмена данными необходимо выгрузить настройки для второй информационной базы. В помощнике во второй базе укажите этот файл:</value> + + true + true + + true + + + Декорация141РасширеннаяПодсказка + 892 + Label + true + true + + Left + + + + Декорация141КонтекстноеМеню + 413 + true + + Label + true + true + false + + Left + Bottom + 2 + + + + Группа11 + 414 + + ИмяФайлаНастроекОбменаДанными + 378 + true + true + + true + + + Объект.ИмяФайлаНастроекОбменаДанными + + None + + ИмяФайлаНастроекОбменаДаннымиРасширеннаяПодсказка + 894 + Label + true + true + + Left + + + + ИмяФайлаНастроекОбменаДаннымиКонтекстноеМеню + 379 + true + + InputField + true + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + СохранитьФайлНастроекОбменаДанными + 363 + true + true + + true + + false + + СохранитьФайлНастроекОбменаДаннымиРасширеннаяПодсказка + 896 + Label + true + true + + Left + + + UsualButton + Form.Command.СохранитьФайлНастроекОбменаДанными + Normal + Auto + true + true + UserCmds + + System.DefaultGUIFont + + Auto + + true + true + + true + + + Группа11РасширеннаяПодсказка + 893 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + Группа101РасширеннаяПодсказка + 891 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа файла настроек обмена</value> + + + ru + Группа файла настроек обмена + + + ГруппаФайлаНастроекОбмена1РасширеннаяПодсказка + 888 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаДляСтраницФинальногоДействия + 592 + + СтраницыОтображенияФинальногоДействия + 587 + + СтраницаВыполнитьВыгрузкуДанныхДляСопоставления + 588 + + Декорация181 + 444 + true + true + + true + + + Декорация181РасширеннаяПодсказка + 900 + Label + true + true + + Left + + + + Декорация181КонтекстноеМеню + 445 + true + + 6 + true + 3 + true + false + + + CommonPicture.ПодсистемаОбменДанными + + + + + Группа261 + 446 + + ВыполнитьОбменДаннымиСейчас21 + 449 + + System.DefaultGUIFont + + true + true + + true + + + ВыполнитьОбменДаннымиСейчас + + Right + + ВыполнитьОбменДаннымиСейчас21РасширеннаяПодсказка + 902 + Label + true + true + + Left + + + + ВыполнитьОбменДаннымиСейчас21КонтекстноеМеню + 450 + true + + CheckBoxField + Center + Enter + true + Left + true + + + + ПоясняющаяНадписьКФлагуСопоставления + 596 + + <key>ru</key> + <value>Сразу после завершения настройки обмена возможно будет выполнить загрузку данных во второй информационной базе +и указать, какие объекты являются одинаковыми в двух обменивающихся информационных базах. + +Также выгрузку данных можно выполнить позднее из списка обменов данными.</value> + + true + true + + true + + + ПоясняющаяНадписьКФлагуСопоставленияРасширеннаяПодсказка + 904 + Label + true + true + + Left + + + + ПоясняющаяНадписьКФлагуСопоставленияКонтекстноеМеню + 597 + true + + Label + true + true + false + + Style.ПоясняющийТекст + + + Left + 2 + + + true + true + + true + + + Группа261РасширеннаяПодсказка + 901 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница выполнить выгрузку данных для сопоставления</value> + + + ru + Страница выполнить выгрузку данных для сопоставления + + true + + СтраницаВыполнитьВыгрузкуДанныхДляСопоставленияРасширеннаяПодсказка + 899 + Label + true + true + + Left + + + Page + + auto + + + + СтраницаВыполнитьСозданиеНачальногоОбразаПодчиненногоУзла + 589 + + Декорация182 + 590 + true + true + + true + + + Декорация182РасширеннаяПодсказка + 906 + Label + true + true + + Left + + + + Декорация182КонтекстноеМеню + 591 + true + + 6 + true + 3 + true + false + + + CommonPicture.ПодсистемаОбменДанными + + + + + Группа1 + 595 + + ВыполнитьСозданиеНачальногоОбразаСейчас + 593 + true + true + + true + + + ВыполнитьСозданиеНачальногоОбразаСейчас + + Right + + ВыполнитьСозданиеНачальногоОбразаСейчасРасширеннаяПодсказка + 908 + Label + true + true + + Left + + + + ВыполнитьСозданиеНачальногоОбразаСейчасКонтекстноеМеню + 594 + true + + CheckBoxField + Enter + true + Left + true + + + + ПоясняющаяНадписьКФлагуСозданияНачальногоОбраза + 598 + + <key>ru</key> + <value>Будет создан начальный образ подчиненного узла распределенной информационной базы. Начальный образ выгружается в информационную базу, которая создается в процессе создания начального образа.</value> + + true + true + + true + + + ПоясняющаяНадписьКФлагуСозданияНачальногоОбразаРасширеннаяПодсказка + 910 + Label + true + true + + Left + + + + ПоясняющаяНадписьКФлагуСозданияНачальногоОбразаКонтекстноеМеню + 599 + true + + Label + true + true + false + + Style.ПоясняющийТекст + + + Left + 2 + + + true + true + + true + + + Группа1РасширеннаяПодсказка + 907 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница выполнить создание начального образа подчиненного узла</value> + + + ru + Страница выполнить создание начального образа подчиненного узла + + + СтраницаВыполнитьСозданиеНачальногоОбразаПодчиненногоУзлаРасширеннаяПодсказка + 905 + Label + true + true + + Left + + + Page + + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы отображения финального действия</value> + + + ru + Страницы отображения финального действия + + + СтраницыОтображенияФинальногоДействияРасширеннаяПодсказка + 898 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + ru + Группа для страниц финального действия + + + ГруппаДляСтраницФинальногоДействияРасширеннаяПодсказка + 897 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + Декорация103 + 347 + true + true + + true + + + Декорация103РасширеннаяПодсказка + 911 + Label + true + true + + Left + + + + Декорация103КонтекстноеМеню + 348 + true + + Label + true + true + true + false + + Left + + + + НадписьГотово + 349 + + <key>ru</key> + <value>Нажмите кнопку "Готово" для выхода из помощника.</value> + + true + true + + true + + + НадписьГотовоРасширеннаяПодсказка + 912 + Label + true + true + + Left + + + + НадписьГотовоКонтекстноеМеню + 350 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница мастера окончание с выгрузкой настройки</value> + + + ru + Страница 14 + + + СтраницаМастераОкончаниеСВыгрузкойНастройкиРасширеннаяПодсказка + 886 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы мастера</value> + + + ru + Страницы мастера + + + СтраницыМастераРасширеннаяПодсказка + 757 + Label + true + true + + Left + + + Pages + + Auto + + + + ГруппировкаКнопок + 451 + + КнопкиМастера + 9 + + КнопкиНачала + 12 + + КомандаСправка + 233 + true + true + + true + + false + + КомандаСправкаРасширеннаяПодсказка + 916 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаСправка + Normal + Auto + true + true + UserCmds + Auto + + + Декорация3 + 38 + true + true + + true + + + Декорация3РасширеннаяПодсказка + 917 + Label + true + true + + Left + + + + Декорация3КонтекстноеМеню + 39 + true + + Label + true + true + true + false + + Left + + + + КомандаНазад2 + 232 + true + false + + true + + false + + КомандаНазад2РасширеннаяПодсказка + 918 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаНазад + Normal + PictureAndText + true + true + UserCmds + + Auto + + + КомандаДалее + 13 + true + true + + true + + false + + КомандаДалееРасширеннаяПодсказка + 919 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаДалее + Normal + PictureAndText + true + true + UserCmds + + Auto + + + КомандаОтмена + 14 + true + true + + true + + false + + КомандаОтменаРасширеннаяПодсказка + 920 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаОтмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопки начала</value> + + + ru + Кнопки начала + + + КнопкиНачалаРасширеннаяПодсказка + 915 + Label + true + true + + Left + + + Page + + auto + + + + КнопкиПродолжения + 10 + + КомандаСправка1 + 234 + true + true + + true + + false + + КомандаСправка1РасширеннаяПодсказка + 922 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаСправка + Normal + Auto + true + true + UserCmds + Auto + + + Декорация31 + 40 + true + true + + true + + + Декорация31РасширеннаяПодсказка + 923 + Label + true + true + + Left + + + + Декорация31КонтекстноеМеню + 41 + true + + Label + true + true + true + false + + Left + + + + КомандаНазад + 18 + true + true + + true + + false + + КомандаНазадРасширеннаяПодсказка + 924 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаНазад + Normal + PictureAndText + true + true + UserCmds + + Auto + + + КомандаДалее1 + 17 + true + true + + true + + false + + КомандаДалее1РасширеннаяПодсказка + 925 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаДалее + Normal + PictureAndText + true + true + UserCmds + + Auto + + + КомандаОтмена1 + 15 + true + true + + true + + false + + КомандаОтмена1РасширеннаяПодсказка + 926 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаОтмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопки продолжения</value> + + + ru + Кнопки продолжения + + + КнопкиПродолженияРасширеннаяПодсказка + 921 + Label + true + true + + Left + + + Page + + auto + + + + КнопкиВозврата + 525 + + КомандаСправка11 + 526 + true + true + + true + + false + + КомандаСправка11РасширеннаяПодсказка + 928 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаСправка + Normal + Auto + true + true + UserCmds + Auto + + + Декорация312 + 527 + true + true + + true + + + Декорация312РасширеннаяПодсказка + 929 + Label + true + true + + Left + + + + Декорация312КонтекстноеМеню + 528 + true + + Label + true + true + true + false + + Left + + + + КомандаНазад1 + 529 + true + true + + true + + false + + КомандаНазад1РасширеннаяПодсказка + 930 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаНазад + Normal + PictureAndText + true + true + UserCmds + + Auto + + + КомандаДалее11 + 530 + true + false + + true + + false + + КомандаДалее11РасширеннаяПодсказка + 931 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаДалее + Normal + PictureAndText + true + true + UserCmds + + Auto + + + КомандаОтмена11 + 531 + true + true + + true + + false + + КомандаОтмена11РасширеннаяПодсказка + 932 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаОтмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопки возврата</value> + + + ru + Кнопки продолжения + + + КнопкиВозвратаРасширеннаяПодсказка + 927 + Label + true + true + + Left + + + Page + + auto + + + + КнопкиОкончания + 11 + + КомандаСправка2 + 235 + true + true + + true + + false + + КомандаСправка2РасширеннаяПодсказка + 934 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаСправка + Normal + Auto + true + true + UserCmds + Auto + + + Декорация311 + 42 + true + true + + true + + + Декорация311РасширеннаяПодсказка + 935 + Label + true + true + + Left + + + + Декорация311КонтекстноеМеню + 43 + true + + Label + true + true + true + false + + Left + + + + КомандаГотово + 20 + true + true + + true + + false + + КомандаГотовоРасширеннаяПодсказка + 936 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаГотово + Normal + Auto + true + true + UserCmds + Auto + + + КомандаОтмена2 + 16 + true + false + + true + + false + + КомандаОтмена2РасширеннаяПодсказка + 937 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаОтмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопки окончания</value> + + + ru + Кнопки окончания + + + КнопкиОкончанияРасширеннаяПодсказка + 933 + Label + true + true + + Left + + + Page + + auto + + + + КнопкиОкончанияВоВторойБазе + 682 + + КомандаСправка3 + 683 + true + true + + true + + false + + КомандаСправка3РасширеннаяПодсказка + 939 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаСправка + Normal + Auto + true + true + UserCmds + Auto + + + Декорация313 + 684 + true + true + + true + + + Декорация313РасширеннаяПодсказка + 940 + Label + true + true + + Left + + + + Декорация313КонтекстноеМеню + 685 + true + + Label + true + true + true + false + + Left + + + + КомандаНазад3 + 688 + true + true + + true + + false + + КомандаНазад3РасширеннаяПодсказка + 941 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаНазад + Normal + PictureAndText + true + true + UserCmds + + Auto + + + КомандаГотово1 + 686 + true + true + + true + + false + + КомандаГотово1РасширеннаяПодсказка + 942 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаГотово + Normal + Auto + true + true + UserCmds + Auto + + + КомандаОтмена3 + 687 + true + true + + true + + false + + КомандаОтмена3РасширеннаяПодсказка + 943 + Label + true + true + + Left + + + UsualButton + Form.Command.КомандаОтмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопки окончания во второй базе</value> + + + ru + Кнопки окончания + + + КнопкиОкончанияВоВторойБазеРасширеннаяПодсказка + 938 + Label + true + true + + Left + + + Page + + auto + + + true + true + + true + + + <key>ru</key> + <value>Кнопки мастера</value> + + + ru + Кнопки мастера + + + КнопкиМастераРасширеннаяПодсказка + 914 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группировка кнопок</value> + + + ru + Группировка кнопок + + + ГруппировкаКнопокРасширеннаяПодсказка + 913 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + + OnClose + ПриЗакрытии + + Abort + Cancel + Close + Help + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.ПомощникСозданияОбменаДанными + + + true + + + true + +
    true
    +
    + + ВариантРаботыМастера + + <key>ru</key> + <value>Вариант работы мастера</value> + + 2 + + String + + 50 + + + + true + + + true + + + + РасположениеИнформационнойБазы + + <key>ru</key> + <value>Расположение информационной базы</value> + + 3 + + String + + 50 + + + + true + + + true + + + + ТипИнформационнойБазы + + <key>ru</key> + <value>Тип информационной базы</value> + + 4 + + String + + 50 + + + + true + + + true + + + + НастройкаОтборовНаУзле + + <key>ru</key> + <value>Настройка отборов на узле</value> + + 5 + + + true + + + true + + + + ПредставлениеРезультатаНастройкиОбмена + + <key>ru</key> + <value>Представление результата настройки обмена</value> + + 7 + + String + + + + true + + + true + + + + ВыполнитьОбменДаннымиСейчас + + <key>ru</key> + <value>Выполнить выгрузку данных сейчас (рекомендуется)</value> + + 8 + + Boolean + + + true + + + true + + + + ВариантНастройкиРасписания + + <key>ru</key> + <value>Вариант настройки расписания</value> + + 9 + + String + + 100 + + + + true + + + true + + + + ИмяФайлаНастроекДляПриемника + + <key>ru</key> + <value>Имя файла настроек для приемника</value> + + 10 + + String + + + + true + + + true + + + + ОписаниеОграниченийПередачиДанных + + <key>ru</key> + <value>Описание ограничений передачи данных</value> + + 11 + + String + + + + true + + + true + + + + ЗначенияПоУмолчаниюНаУзле + + <key>ru</key> + <value>Значения по умолчанию на узле</value> + + 13 + + + true + + + true + + + + ОписаниеЗначенийПоУмолчанию + + <key>ru</key> + <value>Описание значений по умолчанию</value> + + 14 + + String + + + + true + + + true + + + + ВыполнитьСозданиеНачальногоОбразаСейчас + + <key>ru</key> + <value>Выполнить создание начального образа информационной базы-приемника</value> + + 20 + + Boolean + + + true + + + true + + + + ФормаСозданияНачальногоОбразаСуществует + + <key>ru</key> + <value>Форма создания начального образа существует</value> + + 21 + + Boolean + + + true + + + true + + + + ИмяФормыСозданияНачальногоОбраза + + <key>ru</key> + <value>Имя формы создания начального образа</value> + + 16 + + String + + + + true + + + true + + + + ФайлСообщенияОбменаСуществует + + <key>ru</key> + <value>Файл сообщения обмена существует</value> + + 12 + + Boolean + + + true + + + true + + + + ПродолжитьНастройкуБезОткрытияПомощникаСопоставленияОбъектов + + <key>ru</key> + <value>Продолжить настройку обмена данными без возможности сопоставления объектов (не рекомендуется)</value> + + 15 + + Boolean + + + true + + + true + + + + ИспользоватьТранспортСообщенийОбменаFILE + + <key>ru</key> + <value>Использовать транспорт сообщений обмена FILE</value> + + 6 + + Boolean + + + true + + + true + + + + ИспользоватьТранспортСообщенийОбменаFTP + + <key>ru</key> + <value>Использовать транспорт сообщений обмена FTP</value> + + 17 + + Boolean + + + true + + + true + + + + ИспользоватьТранспортСообщенийОбменаEMAIL + + <key>ru</key> + <value>Использовать транспорт сообщений обмена EMAIL</value> + + 18 + + Boolean + + + true + + + true + + + + КомандаДалее + + <key>ru</key> + <value>Далее</value> + + 1 + + true + + + + КомандаДалее + + + Auto + Auto + + + КомандаНазад + + <key>ru</key> + <value>Назад</value> + + 2 + + true + + + + КомандаНазад + + + Auto + Auto + + + КомандаОтмена + + <key>ru</key> + <value>Отмена</value> + + 3 + + true + + + + КомандаОтмена + + + Auto + Auto + + + КомандаГотово + + <key>ru</key> + <value>Готово</value> + + 4 + + true + + + + КомандаГотово + + + Auto + Auto + + + НастройкаОграниченийРегистрацииДанных + + <key>ru</key> + <value>Настроить ограничения</value> + + 8 + + ru + Настройка ограничений регистрации данных + + + true + + + StdPicture.FilterCriterion + + + + НастройкаОграниченийРегистрацииДанных + + + TextPicture + Auto + Auto + + + КомандаСправка + + <key>ru</key> + <value>Справка</value> + + 10 + + true + + + StdPicture.FormHelp + + + + КомандаСправка + + + TextPicture + Auto + Auto + + + ВыбратьФайлНастроекОбменаДанными + + <key>ru</key> + <value>Открыть</value> + + 12 + + ru + Выбрать файл настроек обмена данными + + + true + + + StdPicture.OpenFile + + + + ВыбратьФайлНастроекОбменаДанными + + + TextPicture + Auto + Auto + + + СохранитьФайлНастроекОбменаДанными + + <key>ru</key> + <value>Сохранить</value> + + 13 + + ru + Сохранить файл настроек обмена данными + + + true + + + StdPicture.SaveFile + + + + СохранитьФайлНастроекОбменаДанными + + + TextPicture + Auto + Auto + + + НастройкаЗначенийПоУмолчанию + + <key>ru</key> + <value>Настроить значения</value> + + 16 + + ru + Настройка значений по умолчанию + + + true + + + StdPicture.Properties + + + + НастройкаЗначенийПоУмолчанию + + + TextPicture + Auto + Auto + + + ПроверитьПодключениеFILE + + <key>ru</key> + <value>Проверить подключение</value> + + 7 + + ru + Проверить подключение по сетевому каталогу + + + true + + + + ПроверитьПодключениеFILE + + + Auto + Auto + + + ПроверитьПодключениеFTP + + <key>ru</key> + <value>Проверить подключение</value> + + 9 + + ru + Проверить подключение через FTP ресурс + + + true + + + + ПроверитьПодключениеFTP + + + Auto + Auto + + + ПроверитьПодключениеEMAIL + + <key>ru</key> + <value>Проверить подключение</value> + + 5 + + ru + Проверить подключение по электронной почте + + + true + + + + ПроверитьПодключениеEMAIL + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КартинкаВторойИнформационнойБазы/Picture.png b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КартинкаВторойИнформационнойБазы/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d29d254ac26d77779cc225fdb9a5a137c840b8 GIT binary patch literal 38037 zcmV)=K!m@EP)Ic^~yBJm!1DH_^uqc^9;xNE4Ob(q> zRabuR-TyiFo>z72b@fb7!0Be*ozI;L{p!W@J?Wlc2qC~9{_scjVfwegAO7$G;tzlL z0P%-Ee1Q1FA3i|*;SV1m{_uwn5P$f?2Z%rX;RD1U{_p|f4}bW>2Z%rX;RD1U{_p|f z4}bUo@rOT-(g+@ngPuDtF%|C3aX25uY2XZL_sYgOfb$-lAI915lhNcJcW)b=S^$|s z%%hp#_u?GJNy#&{IA`O0GtLH_uftjNZ3?zd;hfIb;_xy2;RED|j92s2$BQ_B#qa-# zUprWG5QwhExq-i5g7f`Mn6JY5CzdLIUoX4L};nyGFyq@3BV1VQ`_0b9 z4V33?p>}M4_y9R#<7QTibldGAoF}qmxVnl>rvs#kUwb|K-J|`Eq|UJRyOg$Fj)^+J zp9v(tW1yx%xt#mipm&M?YYeD2@cDZk5dQFu^p|WnY@E|*n85Zg^6Ns+JzvAG83s>4 zBi@DDc8&Zy0?HuH|Ht4U$wDsYOW8r76F+VD6U_#qHJi6r0k1!N33Axu0_N}r+XpAH zfep;P4>bPF5@7+(f5-VvP;TD$^WT5N0GX~4I5_~GVjzBkzk84ge+hry%c|27&501y zq|B`>y}pd|OWN;zfcOA8BGT0*q_=C_S07|#f7|mLcg-T8eNUdQcjNpz6aK$ye<%Cp zgBsx)ETL*}KEv-#R=@s@0rX8iE=h%pan5H|3)nUyJBd73w9rZ3v`_KhYWX$hYY#p^ z4tEge{{A=|m!!dy>>+YI-+zk}ME9qx9$$iN!h^gWSZ=Gp8qD zZ18W%;g7?K#q!1MBx6`Oqx{}q$n#Y!e|ScbRX4IfM*Z921H>PdgKUITS&~@(?eGEO zkFmoC#v~fP4dM@f_yF;TKYW1bg8~3)q3q-SBld?6kgD8IgPX-Fz;TO!gH2b}`QDKt&4V`Fn~q9^}8%@6H4j zJ>Z5}(D5nEgJQ{kc(ed=v_eg6CV=yqC@9#Da;hVI^Vc(BxbaM9@PnlBdr$#-lu`E% z{_d+xxb7ejEM!nMG1!2?NFa1e^$=lw8OnLw?x5W6PiWf^u(mT;XK35q!r&|L`K{;g zZ)BpOF`bFomDU7Aimjr+!_QQ?J#@TpG2w3o70yls`%R6xP`LZE%qS>LcPAf*i1_<_ zjs)liW;kx>{3-_9OwTd@#GoPI9uMW5dm`-3{QgP)+b8+F&x3LnBpt7ZuW=8b%i9^i z%lO_jdXD)3?}I@4F}~;32IbG6ayaxh6+=x%__e4Jq)Vjk)d=nVi1yoIe$8s&c@IA* zDs(`VM%;=aGZ{Q5F%ivya`A(;%ppTebi`3Vz?|#jELA|`taJHct>WVl$9xl%(_;0f za5aM zs@&IOM#Tc{;)y%Fjvr+0INQCB2^yd>k%-1s{7RhhR(?-K3*N?(;y;)$Kg%5LV&;Nx zU?L_7_67dkMi%v#vvm3?l=CxE{2;qoML3hUp>4mX0b-N^NfEWr^Ko3lGx(mgH%J;!d z7xqeu4>7|TVHK?z$`Q~B4;>CLBLnTYa4Z9ah~e|BCx3?tS065se4@&4h3CQjpZ2$B z`E{#is6WrIZu;vYe*L>=zfUmHPxl;W2ULczyIF!>g1C!+PwHcafwY0ovt8q~%UE@~ zkoA6{{q0Z(5!^>uxBng!r#oEr?{Q7ifTm8>u$1i90P^_>9Fu&ZmJnzWaUHb9{IFf~C}J*jP2#Ablsl&od$3!;XsYuyNhV67F!a{cdC<{^~0G zaSh^n&-XFyeFiF%wmzY8@{d)K-mcpC2~C20j#XTTKmVF-4a(uC9G4f^5z(aWk&r)khV;pttr2|%Z zf56&8!gH;2nW515606-mI+i7fo{su&o^uIQIlqKQ=heY|I~$nG*!T>xRC1-k&sqI) zJzn48*ISum9mn37U$Q~HlppdJJcKV8$p6W}JBx|*X3u%&nNY6ebNvf@z+zA?|LICY z$`Su(CdN-|Aa#!y&?Lk8np@gc5wGQI*6-QBj&nbs<9qcw2INh=k2mq(Kgs7F)P7&f z1g%R<({o=!yj>Q`C0O0x=lEVWv6T1|-*b0gu4CrE86?}Z`w*`}566rINwH|Y1!Uu2J4#{Jg#I)^SRm{2S8erU>1K)dZeCv zE`qncozCitNfCvr>RbTFst z(H=|-bJ?UO&Vk*7&8)Uu&+8C>1y$PfcqXbB#yO?={M!_i3&eq@8r;ktu9Ylt>Y3XO zXxp{1l<4Mjbw9h;I77Q;TazGk-Mjc2Tlw<{+YHk^c9c74Uk|d%@)q7M%!F9*+|N9W z&5xhPHcycWcGP35xekhb+Vg2=i8#dfKFZhV@NwO1a?hn-BkopyK516vqP)KXOB&Z$ z-=m#JJ==XQJsk3witP{fjN_uzuf&G(>bXApp?Xh_9Z+7Ck85gy(Cn1)##T-3Igna7 z9>{tR@Of{Q-*~~;$I~5M;~dNOs3=_%xS#syt^yj}>9MQI_dQi?k80ahI~VVDcOojHBq5!lzC*uye1iLNgLY#-~ihCkg z@-mp1OPN-%DH4EI;N7rt@0iJ|8ZE-5s{Eaz3n;dUR@(RZkHI(6C+nb43CdTeFciwp zqtFkEzoNj%t3BINARfg?(Zb$F-i|`L^{85Ue;;o{;W88p_Hih$;8Ql%0v~1Zotzp6!{} zvUI21ipv=!6f#c{y%Y%fH3kYrE#Cxw$0%RLnuH_7gh`R8l~cn1cH*<=;@Sq8lXXCRp9B**9-s;1NK`BStZ1ZgB(3f1#*l@|Y#YQO71e z92>6&`K94wO&`Zz10DBz51$YyviB*LB9!a>toAobe};1Lfu$@NPUcAxh@x8; zdW?ChVnX5hZ{+<@r4l!2lWd*Wv(zF9)ClGF&O?WEJM5waMaQ3)0uHgQvnb{u)IJZQb5=ui<}$F71CV~| zPhh3`BqK3{5eQFT0L7kdU=4RG2}6gX`zAo$KfF5OI1*$=FvQ#VD%NBnc_k4HWB+Qn za3p68)V4tF+E?L63sR5#5}e#97@_c?K2+k^qbvzXRdN>u6Pn@t5Oe*jpqwB?#`g*h zAl~sXgM{o1%Jrbo_8&4h2H7z{06die0*3++VdWt*V+quq_67*V>%b}IA>3XMp>y5_ zP9ci~Ps}6;W}*q~(E-S9e*)~(0D>S0;b{vYxAQ3|biXJiOt8KQf{h)J-}^k+nc*_y z!TU~NG6EqVAph`z9E(%{Gg<>8pHZp;K2TRZC=&vz48btOm!669EF^|{394YjbjUn+ zFXVS`1SgAhj@<7cCCUIB=S2LJrAMj56!A;N8E93V@V`8U@ z9)0WqBk;NT8jGP^4aMCDxq(0Cs>uiIY!SsQL}wq5;J5~Pi;1dLhUwXs%!cl%+N}VA zU@@b$P_z78W=3is;f}>1kij@8h0JII0P_liaJ=yA6s1d)eUR2iZO!5^G)w zq1HJieOq2Q0SN(R4R=BI#SI9QXOKhoA1ueCb&cDgTvA7uE|jlv4|}K{W;-FzfUsH8 zxINcN`uvr*8Px2G0t1ltL#|y~Bgyjj7TX{M4stU;IU&A+1RutG(Qx+Lz>LJo_x0dO zM}h$1gt&3!Gg9|7z|TnCV>(`L+hb7Z-HsAFiQpN=`#dOp74km+15~oZu|Xy&K=7O# zLHrBJ03`r&w8V;6-~)|IA~s^R5N?|X!KMzB5JlF7@j(?bDE7A^(eINFinv;&b14|% zn3N<{ZvX?u$&8@d@Fe7RJcS_J#SeT!50DBLyctv;JEhp($8KFcTaeOp-^+$QRdM-m zmKuxLz56hGv##a+klOYbd#Uc%jC_(#t9Tz@XJArQMygoy#Qq!;k~!f03^mV!x>H_< z5_HDqkR6p`k5@m_&b!}$#D=78xsb``&tYU_w zN)(&B7GD=hVmx%oaad?!z=Wifu}23XzwddJ;E#YcxR+HpQ`v<_aB1gd0}z*^C01Po zu>~h8eHejK=78{z;drcKStC7=-?dR1sPtZeC^Th&LH8~)Yb8YIu0d6Eu9C9W1R2IZ z;#QO7N3b}#G~VZ@QHm$=eF`$D@*0M5#MG}T4G>BAY9JL4N zs$coE)T47do6Z4S7WLg#)U58H%1buh7Y8^@6nlZ@ub43rp)&yW(>11^HP%K#x~OsV_njDse~r0(TKoYX$@w+x8H=`wUE8r!h*~xrVR2C*(jdO||ae zx=?9b`i#dk<8=_5w-%-ENf4-SW55()N)0K&!^n^xh4iMss`Zx=qdBzkf4i-z1(0)Q zN8|&I%{u{VPks&RoKf~v6(^1OKajym24;5a-=VN)ll1+Uqy&N~m}r9dk~1JObD8ws zEAeTBX`Y`yn98#Xgk00sLM{UwdkIlQu#Td2M;RzvP%P4&62U+dJ-hW3{|;ACwY=2%89>07l+8#RyopB&i{_ zNlUIR&@(A*=Q=J(a^$np3q(dN0ZoO56eTf9TMZeEn1c86K&qFN9*04uKl$8^hy2^4 z;+knZ?*=f!(Me@69<*gZ(hjE?Z-8i`rQ}?bi)#oBS50&Y)`-TzP&(FFd%!MxdB~+* zbvxQ75I~ctw)8gwq>{cu0`z4!NUJ!?>h{s`T@p8(Y<9+>4qDNl2-kKd;%rdsKjZ&d zNNH5z1Q6hlmy%SE4rlP6sy}>y_`@Gle)tJfM{WdohWNgk{MqzQG{S>qHn817R{Vi{ znB=Q<)JnA62kLcTky8zafO5-Z$1_PEvv|7S`NIdu5g#tm)1){E%GE$37vz3YKoGPI zzL#V#30|0{>8=u*hM`srNxO`OL*ZaB5E8Tl!-#r)n0m(^`J?h0fP*7PpJ~^*d@*l3 zwnaugEr-y7ZQ7{-`M)FRV<{)V778%5i3AIQ3nzgu#~{)H$rEWZ;1 z3E2q{!5Px;NZTP5XQL4cwPqC>BTPTmp!!VLP3a zOXs*5e$L{#+KAL_EF8$!$HIBXwzG)H6dLmb=}dMg5)9-6hLMei16f3J*0Su;LZO&J za1oF!JQo{}O=z-k_v9`>DP@p1#f=~?K=sydK0scE>Ja%y>yR3v!f{XP`#Qf)YBhJpbj7!3vj(NF*a zG7MZsgR8#J_y*|?LIHz)6atApAZ3IE1Aix-REqs8eTiNrScG(L$@pdgjj3E7ibY!< zfPSCJ=cPj{TPz}|5LgJd0{xv9G;JHQg(75Qap=hw@b9)Aw#)*8qJXEvbg6Rq(?{j5kV+FX;U>#V7*TM!P1nquK#eIy*N3kL%+ zBJvn2Q8A<{0szr^2wxE#fas9KkHA8jH9@IBrc{IIl}w7aLO!=AY>HmfE^g1~^8H)8dABw7Iq> z)*6q5!ig}UhKL`zJrW^FgCG-nFknJ37({RcI8jJT7&5rPfh1O=MDQdVh_gE-0En`O zn?FOvXEsu_&%!K!HdM4Y?Nx%r(DoA$GOkh{Kg9c$0Cb=PBGRJ>FeNF)pNp0P585-N zXF*LcJ z6S2m|XaJ(f0+Ayk2uzd$q!uXvghC++2#PE<1E%8mhLD7(RH8D$xt!Zoja>Dq3=pq` zsQg?_f(TuLjM*QQ2p_8L$5qkB{Jp$il5R5Kkv|jug5fa#)=^SQ0>@Dj3BR)t91=h% zWe_;gIqj`8QH`64+nz`gCz~(i?P8%TIhxv@O^rN}%cQrYlEcrUq@ijp!+1YO5HN+Q zSiWm&0|X6e0tBiZb+%!)nUVO+SbfvdmX_Azr?oaOo;|I3Sz|n8G(}CQ3nOPmb%<1@ zFoHlz0|G=)0fNa#>HOdlKU8qrYJ@vAZ=2_OT##!LE`T;tAfTLUMl@OiHvy+eDj7V?tgM8#{+Fv%4**P*Y{Ori^(8j^R{>MgBsmD_DK{<`l|F zpNaq>DvqPHXs`m|xkj{pQA2C{=^fKrSI(c_vSdbMJld8BK~2zr2m&G;4k94JW$D0r zN(lf?SqhXnyg23;`}H7J{XI#bNF)r=sLJ|NwhpRgg#u2LCb_(PjmBcLj*L8qKzXF6yXzMSoV)SIMHhfRK#t54BWh0AV9YEAx5Lr za`^&eGFixE$q6Qc^^J`ynwncy%$Ym?Edv96_wL-j?aO_Ay}u)n7?Ze~_OGFqKT z!3Z5+h&5l*($RUz%DK~5tmRo9$9f8jf$@!I7Z9{c-SqE7KenHS>&WMWc77-sWOy#3!&vDWJ@ zT;9>}%EislmWZHk8-*I=Op#E?r^G4d5QxX4lBtcR(=a%cgfvQ)IWwlM7on5>{P4q% zoSy(|tC(b-uA>5wLUH_1A6k8OLa}B2iO%n5!?o+)xOy7AX2moKjJiakLWT0j)EW*i zdZO_z9Vb>c3DawXu()H++|6BsKS*wS?t)klGU8YV$cp)$Ra{f5P{Ckcoc?IG_Gcq@ zaQfx*>fw#+W}$daNY|`CrZ70zYZwih&{PwGX>~PF8*YMKUA^%1-eCyV)U6*j<5$)| z`WAZC}kW4I&^2012G+C?)7UJwJ+Pqh*d{)`Gw9=!bhYcfkW&x}i6j zlYfhagAhVIWNj)uA$Lbb(~`$DK&q9Lr1DV1nWETfWuSMo2)ms)oVTC_PC~GRBLX4@ z#ZLKzd2}R0swD>UcTkYWh#d1O)_Bi?Vxs6qQHaRa{xsww5g2NyhdFrxvr$yH;=^bR z8xZxy$&tJ1C3``sNP6)V`8p_Aibo(O^HVvJ#IG65GVH!oDX6R-1t`abUXj>I3djiOfQn^{ zg;anih5Hkc2UU$blmr6$Q#lw&=U_|s2t3y{2;2Kc5gOdWHUZNb*;dsK?9nSku_2vw&?Eq}I z8M1V6&q1 z0wRfOQ~@$Fdr?J8({$|)?XHi#iAFi+-UrAL1WS+r!*?}@RMVYzps!%S4*V`=Ix^!g zid?Raq)R}lV+5KwaY^9c1Mi~>OH&-ys3dYv-iGAH4wTbkb+A&j?_E`ah_Zm7Njrwh5_f^XMHYh0iCyY7xO7#J!9$--_ZXhz z1(|z>m{A5@aEbEy=;vv8br4bhYe{9}^D7{M=h%AATdF8Srf5MHRiAXhLhf%%?w`f? z#Nks}BK$0>L8H*0%tAVsr(AToJxK`KmQK#mlcU%Mk*UQ2WrF|%kn-%IDi~d48~`Cx zL62{5>921r1@ zFIOue4sEc-Y-=Tdh|A|u-LZu&Q(h^di#R(GKjm2v=OFML+^F$m*tzCvPDtE#w52WysHlfCJbGhj<6aqkr%B@^ksisREmz4~~g! zJ#h(TfbK!^{>>->OO^x@syd1x)O!My>8PrS7VvinRRWY@D!Ye>UK#F2NrkHh^6@WW z0#{$!J6#6$dbf$5{X3NHPR5f%gYE?WPOCdPur8w5GlIH@9+4#q1X4&N>l<9(d^G1BHS3yz~MPDEKX z5*q1?N}EII>eDy`Uy;yMQ8iwSi;{yHk5n^11EOa6qqnC+_COY1~y);)MCcIEMuH^G=kV!=Q zlSJpLSk)L$6=KODJj_|>+PfR*=hnW}B#ZFc=;NK*!7iH|L3MJf2odvT4~&=aX&mw@ zwO0My%jkuu^jeKou{`o*3;@bfNlZx1IY9i#L~ialnw1#OWYXD%zmk6Js8k2Xg~b>Z zsYKXgjBluLa|yj%Nkz2?FTsf;$MnS!x#;~2!w1OA1vSQ@?9#be_T!le0t|4@2_egl9hZs*(PWiP$KNjl{;dSs)_=;>CJlwKVZsr_K0sbxs@48cHFkkOR9Mwcb&?a6zgPcr z-5^~Yc~!Rk83X%Ux7eR+c%mWn9<+FT5a3uvUxFNop{k6)q*-y@U(m*c6c$lwbXRz( zbg!?jDpk0ES;A=22J{ZSB`I^TZYptjyk-m_#8^DKxm;Aq&M?6$1f!xRtf@EaUwt_Y%DLTN)Wg*$y12y$^U{V*` zLv*-I8rwsZ0}U(fk8)sQwE)~P&Zvr_y<$uYX7H?|9IUhuLtq#3Roi0t0I6bgI937Deccd=Mj#T8f#XzZIAp+4NentDM0!`ZwY3US zuAp63ksM8h(pSh!pPh=Xu_b#1JfNBAeW^f$0S694-=F76j1LO!f2tcv^}QmfVu6*H z#qwxdO9I4~AQM0cKp{B{PSFA*Ad7)Qq?#c&CH(6y(R)H{D>$l7&>qj0BPv(cp%PF! zh{^y0RUYy{H|t=+)I9->;(+@Q`?pQ-C7Bw9+JFO*P_P6NU&We$YDJ>f%4Mjs8d%v3 z)EaiF+WLWkA&xY8A7<*cC-p`S1%lVv4sgQ z>>MC)QH&2R*}o8D)%Q%O6OL=2)F8ZyRxE3|cul6@j7C5aG~9xB}kcgoRm!YQ{@~kwZ4hJ=9UrEy@!rQdXxtDYBaCQB|ht*p_OgK;PpzH`m3Wp{WUi(I|w_?wpKP z$fN>@?btA_r4ibr1zF)d5K=}uJ+zU*AtIct^!Ji-20_x&Y5w zM`=2hQo`Z=aW^Yh%9LAE>3{*f0pb4fFptt* zIEt1HZ4C)HZf+;kH8w#8!82LI-X{$}B=^GCw)!~K)zqP}UVz4E5Q?s3p;h%_0ebg# z$;HE_#(LyF4G;{e9_og1sGPq1j1PYyPzyS&P^Vx_7)WKLy6*lJ6~HP1%weQJS!z_M zUf@i?_Lzv&t%{T?zyaA$PW9F?<+;(yI03`X=cMF-QWq?PC6thD9%i;R!m6e7AyHQ= z)hfEQbl#ej0q>Jag3!$jQxi@Uxv_?NaPp(_3`Z>P(_yIAUle}Q*V7BBp<$@4OF$jo z=$e{1f+ZkZ2N(w#W_{$8HQ@ zU2ydcylR(GB6z}tEt~a_`fEw&iY09d({THc7^Ul_z9$h>kC)A#35({B(=3Q zP!o$nG!l_g#{|`Gt!nc~W8ysZz=pY}R8NK3P(4h<8-pc0>9el=;pkGuDcc;nmrOXK zO4Mz2Hc)ZR<9;Z2%XQn*3EAYQ2m*mX(tOqJiLbL20NT7Ku2R-ir$(;J+wBpLcFU7dIm<&Xt#lG zqv-(({g&F0jUZ4`!z0qK9!0>^#A9gWCm=>E^2ohR>dI=A8`_NPt~^*9-LpdOjiC}% zIDX|eW9=63NC)9j!E`C2)>97S#=9!2;ocb`rGr3Q!J$`_5Q2a~U9H?jNJBjbgZmej zJ2P-QIXtg8K7-jE%~E1CAu#9)scV+h7N`*rZntrFpX{J(PSSOdNvC3Uk7QwPYb`WW z$O%3iYB1R`vjc682I%h}fZm}|NTUJom`c=prHX8qj1MQ5$wNMugWR(3brgZL)$Kd9Rxq zYhmWJ7MMA`4QdmKGB6lN)Fd>EHpeqN`=Ea`2LXHzFiF!xCK*6LHm2OtlY$u?(-Z)> zS!O&@19K8_nBJCwq2VO-52s|uRw8Hz#`fJKH=}HG#>QbjU%;7%q~Lz*rrXdGffEVg zgAF2Jf~cxRz@RuGgPWBbrrei%E}%8-lpNLVRc;8K^eR@!OZG`cR-NX38Y4N%tL?gK zR#wTzf}qrVv(%mi9`35eGn70|y3OHTuae#=3O+=p z(@>v)_SPnt-rfX_^>y-oIS~J* zFNZUq%gP5WT-pMqHb`}jfJA-5DWX{RMCO*rru&_V$5IWWg_L^S4c9K)4D#GLIC1Pc zNEPWIw^to*X;F2+7Kf!0IIe4beWXk8zlRsqcm=7uE*H`EhydV(Dn-wC_p`{B6+cZ0cR=+G>V4! zmVE=zjamRb3);_QACt0)XAo~_cQOl`deYF+S_g5n>{+CnZ_`6U&fnb91kFv2P|W2a zgTC{>+mZX#I`yQ0)cw9)N4_-hPFkyjkN8s{or`2 zG8($^Wq>AbN`gpUw^5mFB|VElQ#n9zlKMpUM15T?#A6W|;h;>6(49C281IC5{^hNLB+4H425Hf1kxeHGndgO;`r;R7a@ zZv*PVAOTa9>PRM=gVE89j36yg_ydB^a@7Vy1CB5%i-U|=CD+`jn$cZ$hAFqQp?xx# z3XPJjP&RZ8O?nyXL_95}^`3=Zcd!`aW>!*;0VWM`yMa?r6!BOqWH z;0q{hqI(XNh&}AIW--xC{-oR#mYdG#KNjp>9hNtD>X{rxkT%fh}U86 z>$uXx{f<_nMfp2h8o6cFt0Y<2-cZs;frd;8B2uDhgTio-gAfp6Xh288VQEN*!$GKt z$EEvQIwa`3NJM%H4c95bjsR&(xGq^J+bslO*QSuJdEB0Ci@{VD`jZ(L8dWMTN!@_S z%%EZse*DBLA0USb6e9Q{63$@3fl;&pYmh6|qBu#Q*eCVNG^(rzGEqu>nmITHJd)?i z(7@$zCseC#z+**Gx=d zXfz8$C?&|?PD((iYakGoKv7|COM}nDu?|$!!3W4o29~^|q)QrEa|A6;O4B8vpvfZN z>nrHSIDQky4KsIR16@^#b#PHykPJv8h+Ms)5UV4Orl)&BAS!`S@@NTVs7pX;pCt%g zqn?d<1yEZ8(fz$}yvJa7EQ4`O@|2diWb$gZ8%*eW-bmFXl_`S~GnFa8NIHko(}G;l zDlZz!HKqWsYaAd%-t`k069@xE!4kr&c6r^`N}Y5? zrvikMIMU9+{p3-?k(xyI0xixa5eON4C22w5Il^5uRBBT|uKgIAi`W~`C@SwBNBs)d z1`%U#u9yO1)d4yDh+Q>jyULPR_@czI((%N8t$IF&tM0qN>CN{gX%PL9D+Nf}d;$jMWeFWPd! zPTCA86-YfIFp%9O)k9mYmz2WN&49coCPyI{B~{EAUpxrqQk1T5L*poh;Q@}ij#6~6 znEc>)*#e~6b2N;x>Xpp|OcE!rZR@HlWxB15i82&(ROYwiN|kasP}iOiS}Lred4rV7 zp?It5zGp{)D{YGGwIW-_venA8Egb_+$=jC67a_~5>Ujc0!A4bxz>t?}k+hF^(NV6M zYGE_v@sgkjxN4FXXQfGis&Z8W!I(uBLvw?>Wn)Vb3ZAtlDCYtB0C_2?{}6Anp*?4p z9!l<60uHN1WRTjfp>DGq*Kx}3T3fk=-33F7m(v|~)4BnP7TXo2MM0atV^0_nx5X>x z z+X{?`%1CKLu?NE=S-^nFnGt$SN)R0stQEKmVDf=ERh%k9TZ~pQBc;e$X=_xhh6_cg zP8md&TZ$>M1jG1+Ypb4p4JPf4BX)zP7%HL~yoSh>YPykcL^{v-8-Y=Ue$ z0|Ns?u(~w{mn~|AOmYN<1_$AaC2erQyk_X@9{?wvhPSSs0jt{LGOD41U0 zei-Pd*$2si0muvuLfFc|*WYn5{O;qghu?qfb@0h6Pu1G7RgtmPDlhJ*;=35HzGSuT zy4pRg(#N_=k?zUg3wja*#L)61%5`eRnB44AosV*9&(cC4RC=PIl$HS%4KcwJoT$~h zl{q6w&?6&BFp;CjLqSL;Q!>3bMper34kqz^I+cQ0IEdTWNbI8spdrYOCXv945I}BE zpGQYVB)F)$pp(y`YDEc576K;^+0juX`hK~vSr?DMThCbq`P49ElfzIKi-4d?A?Xo# z=XuA&C$Bma<}}qnPfstr@vPNw`to`3`JdbcKfm`Wc>SqM;EW}m(u;L)%BiSohm8T& zepdslh;XQqe2-M3P|ux%=YwdboD|a!KsudHUVsTj18e zJqc$moefu=z7oQeA8(p)_j7yUmV0_p#mYctWEd>U|Hfminm+?BS+fxCdUTUKEs`*w zzUDkQetsuxcy1f~??*Mt$$YCHv>F%zy&~v!G#SqFx)hel6SFxOm6>)FN zvr0}_wnLQdAT#thaFEs=2sEygDRM|XQ2>D`jS^&aXA^AM)dg?+;*VhS?rwPPNsGY9 zWguW%(9xKHzdpMYe)8}OuyOYQ1Zkm2SG^j22f2vGR>=07|Le|zc$xM1xfn9)+NeoE27Z0P@edmr5M z{65&;pOlhBrSY2b{U}PO&)s}GG}R~IpWk?ilmi1b3iS}?l zK(rgmHi+Y`YVH9KxK#}u7^eW6w?820xlbkGQw{+!N)OX<%FSzrMpCkHgbXsYY#2rr zCrw^1-mXx{!}~8k1KxVksW32mZ%ftenhQ>Y4}bNiu;G~(A%y$=;ybTE)oTV^`{mo==l5?! zJ4VPn^)wp)wj(^D<>CO9*(+O2j{%ez$Ef$TWEksC6rR6N4UkOU9)WL(p6shf7af0_Uz; zPyz_G7+bq=CT!i?3x9lMBeXZw$@PhFI4l#Dr12LBa4x(mwiXD6ARLR!jL2{}1hox~ zaMP`K!r;g#11bs^uU{h<4M)%hTDhPT0(cRxUVl7Xjx(9b!NqGA!vEfQ87%8;hUGZF z{q~Ds>C6@cmpv8;VqCYC=T(!lRohs51dv|!#gm)qH9v%2U&#l^VYqZ1ZI&%)PrX}F zE)xY}tlI10exkyQRk^+X8(N{J^wT&JZz@Nba~Zhe^i}YN^G=inB4}Lqij&~dla|SB zx}2=p6@WV*+YDxc=>*`@JoreMZ zd&~3==*igdmD}%z?tu}=6dkCmuZK_=jefkwcr+^2t25UuhA#Yj96@!-35(&3rE{RE zCMxF{OJ>Pe+ifc#4$wMnf1vTIMWRaokZLxEsMc9aXm-ft9)>syR?_P~^2IUVAvdh) z3)FvdZ)DnsylbKvT z2gA4@8LP$WUNjm;bu5Ax6r`51vVx010OrUZ!uKSxNP1X~C`Sf!0*9M2>jo&AF0VAo zY0jncK!#aSn8DqT{%Vx7)WJPWDW1{eLNlNo?_&T)8@Aw>pXhT~9YF6jr(HZhp9H7m;m2dEJ~uMD2|uC~-2`JcvjHTBp^@P?Qh{m=sEZ zNZj-Qm5JbBn22lxuq8(QOgtEeiTh50K zc{&b?g+RapGe|`dqAEC1E6!kZs;VSwM^zhMUh@fC!>p$HFSfrj;`ZI8gp!yluarTU2j05qL#ts_!ZHb`^oF5;sVxl z0|b=9`lYlrRLv||FitDnFjdlPCp|z61_mVpwFC@E7&eR!k3cS+fe2;%1*k||97IhV z3{-ohq@Y{}q3j6TEZ3V7?!z?8o+6hfOoLsYqFkcX)uY`U51~c!I@-ddQ|kPr`DjYH zAa>cAp#9CMXxv$)0gfXoRwhJ+>@!Mvu33%%)Dd0hyca(I5F2+`ClH_CwS zL#Yu?RYj`|BF9~1FP}fL8@!CGh98ZRA#m8C~=dye1KFL zWK7ng;rY+!Erp9#&Vt%V5VrIu;YSZ_f{oku$SBCvq4`7MJyLY`0F8T~3(dFcixz3u;?z zA8=m`w??k5wkuUibo0)ga)m`{@Po=9p)5e*s!u}eoUTRxiqdaYbg#bJuR`OEQqcxg ztIL)W#xzw%A=MnBf<&ccF+*{Dw+{&LJ(1;uSQ@xpt|UQ|Q$#uhgj_Ift&PI_UUeGW zcHc&L-5D$4$A5bop4&5ol0GPHp>ntnR8*{#fC*58&!W6O`qL;f!yR2cK0vA&Io8# zNU2iH=VV32DAj{9m4~UmHm+9Tsi?BBnUG9XYz==z8GKZAFpNO5geqE1k1>-ksAey+ z@_bPeG_7G+QU#={fdW#a6sJ{`V6>1`x}op{unZZ>%yCC^Txk%u%TZ)6)v4wBwHYe5 zMud%^O5*;g>S2(ozy(yLc>)X(k7F0)Zz$U^jp}DuRzF08Je!rZ!6=+Qna#;{6S8f{ zQ9vvB#Mx8Xg6x|jGZG6$$ta|+AFnwUjml?0ZSG`46@}->Yho9RCPi@&L!!=%e`bt)-RYQ ziy++n%uYCO#cU~2{_@lg1Y-~`UOgX{%xHu?11Y%mo+n_(o?$q5%|ciI~z{qUE^UxYWEb36>Ev+(2pdjeL^?|=*NICnkv0{m^`HaKgy;xVr}cP;$)ZFfUMa~)iJ@hR{F zJl{*#<9)zmfB9#3!|AJzgEw4sD*XKK+hOCg{ehV61cIy)_zQ*Jlfj4eT-PxC>WLk& zvZEfpbj69Vc4iBF^{%I&FH=N9Uj^%z%!b<^eio8QXxE*x7=rl>7&uqYY=)<|?uOst zL#xGmd;K{pVWhtYE?C|P3tJNK+lM!SDCFT)D`&#qUAv*iuwW(byCERp?!Rw>r8An~ zoTW2h&z`+-Tw4M<>m$&$uN&qy*WippcULzoYO93>Ej6%jUl&}6`&~M{4sN^Wab&wW z_`szn!RTN=w8sK);{0ha(ANjMckYHWmdu3NjWOuiw--)5ZU!tvFjF4KJ1;x|&R#JW z>e0||4B7CRYtDh*{sH*uA0L2sT(}OdUcU_bySpHtPRV=`2haVI6BfcMyw0s#w?o9r z!KEiHff%YvCogD+f4bykxb@Ea;oiqK!H2Ip501y}>H{|X=wGgZ+He5A^~<~9wP&t` zkG}3~7#JLZ{=p%5_4<`?&gzBG)7vk@@lQa|zU9J`;nYQ)@Y6f*gIAxn9RBmo7s@dF z&s}!`+<5tV`0?-Wh249*;j1@Z0p~8C1;tECE}Sl!-Y8e^zkK6s;c^6#S;#}GaH4&-1o-lVBJn-yx$>CqvI{*!J38`|(YUHRcji%D-VyLVrXZgLbs~ZZa z5}debHf-%4gs%Q!*pi6C`A86R5io-zNxAQve|IlDyJH`8HrK zAV5`wylKNjLy*Pq)A)S=)tt5Sr^9o*dSO?0KXTUqES=K8YIg;Fn3+7)sc zx%f%r?U$b=zyH9Oekg4yT09*XPQrU$b2c8MRk^3BFr96iXup}0$>%k>ns^GeaMpnw z_ns|%aNp)V@UGKP^*Ch_+;)E)=C?J#o6lK;DowKFbtK*2<_Ou77tVkjs!Of)HSqZJ z1EmI&?F|XIWZfd^1bA%oPT6hBjm=7tUXON3DxH%yNGaQpsx(s02N~6JXqsGx&@(VB zZ2{_OPJ=>TsBIk`lYpLxM<779AgZ))z5G0B=Y9WIcf$>@yFlK1!T0~9YYWpbLTeiJR|$U*7u!^dNEW>=}~AF^x}r_YQd1O}9#pOa?Hmtkbh^ zYpjC@(TM%ceNRZ|LNpqK-jR&_&5!>42wea9@4<_^yWtsB7tw@3f()xJP`GU(9)Zp?M<0Jp|W9V#ehA+JTno_S8+W)MKev?h^}j$#?b@Pk`>;Iw%y@Qv53F8%HIPi%$l1Ea8UcR#!e_0{j* za1jioRkih*9qr2dgAe_!=ba$cqmIT}cwtW;^kr@M^+V6W+b=#DzH-B>pe7oIXK)|& zO)Zc}B&1vQiZj>3br+r@y+;3o24t+JRuT}YCZBoB#mGUGJM)_#x>mX^2U7dMjG$3_ z-!pJM+6q7V*X!hdH*W8SP<*3QRY$_|JD;3F)_7Dm^{_{@vd~7`c520c29+8axk@NCpyJ)3j+2uWOLM55*F2 z-!nVlwdbsZhrjn}*oB;$B-!dE3*e*Q`IStj`uDfJ8s2-=1yF~^`1`)`E4h>zjsy`9 zLVD~1;V9Ci>NHELm(C-|JQy2y=e>n^}D}AJK|Na@wPAF^+w>KP21tC zzrG*p>Kml%nAF2>q2Ye@D^8a8mCnlysX)nn!&&&@oe#jfUvn;;x^_9_iWHHYfzSQm z_ju1#TWCi{GzT4%Isr|lwYkX@tk@f<|MzWX%SRTp*1>7Z=RiwM2)a>M-H11z)D4PY zJsAzi7!n+Tr7;qaDiUS!O>eA+nwqFwZBHYC>_*+1)C}UJ^JlceaX6{z=Vr8FM$^a* zSIvPnbK2l*cRT{Ebup>;4~*uat+fR@kh>9JNPWvt|HE8PRUg4g-C2h+dC7rE!pv=} zN9mD-$6web*XKw=kXML0D-lO-Yp6kKlb2nV+8g3h|K5!fjMjA85y%6{3?4Tl^Fdb4 zn~ru@7#=~+OrE3|N}YggDjJe%Uwd5yMp6CQL%)xPU>d4;yHIKkr_k0~JQF%m%H8qc z)6iHOlkr$vyNBc&&3d#&7Id`0!_V);>mS7XR3kw@yR}~aeJ|Q)lxP3n?|wC0xNa$& z_uenSStuo*-7^52_Vmm4Ym{O_S9lrpE(H6RQ<96xMBNy)M_C_f|`-juehUd_Z z_h37!bL3hk$-5J6K=Q85!*dwK`w&NlLQG`K)?Lul-U^GBE`lAyIj~0heizuY=^a~k z@9jR4Uaao>Zhv_I#Es^q1;1EJD>S0hHz+FyDpe~i zdt(@CA<&Hg#_vefQ>>G8A5u;^8p~(SYlJ1!YT+AqJp+4t2c@K_ud73jSO=zzi!!8I zm!s+=)Ek6*1WK_>VJ>(cv?wV1g&>d&p$bmR!r8Wxh}3p~3PHOGShOG85-MuMR-rT| zhhtC_39Y#la2pD%aYJZS2(l@+&(iu1*)@h*VC=!b2uPr9LXpP=Ub!fU=cbMs zkX@*P)Spl|(x#xb8M04oUR;e*Lr3aSho3`!jJ(7LX_xN zr?~|f{oUjccQ?#EAREjCbs)7w=w+${3frMZKS3cxzL^(y5whx8{|JIh#z*ec1fk5@iE_Ip;;46XHMgq3< zs_vlH^8_+fYEkV3RY0P_0g>)Xd;;&8ZK=P79J|zpjlfwG43)#zxv43Aj79^cs)*Es z@aOk$f(M`91wmBpn(9LGd`S|yE9qo|MPjj18#($h#hlT0B}Ru771oFgHO}&L)xx=G z5j2ld$)IX2nIr^Ix}rTL+S^(k%8QvSQNEKiSdmtpd%K`M8k9*yvM)u@D1}29ZeKhC z3UIzhz$~@>GP(PbEYNH!BeI+ap<=p*kVE!mkib!mA8wW$uU{u7f0who-sirbP zSGB3o<95hvMyCK{FIDU8)r8bRH6sj9UNRg+JkgOp@ zPfKo7jyVE1H4#b~LNY|ysfhY6huD=G6qL)1GRWj-Jtf0%8+E$nNXxNG!ri}~wWMX@ zmHPV`T9;nKjh*sVQ!Jf@heGvub1eaiLO&=xr6g$#PvoxN8w9k%)LKJNj+S;mR}`{# z_sfBacTo({X%&j2CZ0YYc_dFvJ=fr3j89R}3OCljp+#vmEP6 z+?nKuTj|8%He;qE>t@NS9s$LX1?5N>$Hg^G&N1An2+tZb50ca=OLY zd@5K_HOg@V2W3zqt5=TR|D4;hIgZvj$_-%D8sykcxh!cZr@j=i?r71)Hct*>1h+hr z%}sV3{_K=WBvqi)@PNn|+x9?Kdk2nymP|+GnHX;5v7yTg-Um0>aa%-`wku)MDb*^= zrG~)HreVR{P8i4*U|^CahfJ<;cQQWFXfrHJX5PgNH1MoEBn2A9T==<3e2@fFBZCV?m*Plhxaz7+gOz{(Xl$``jG8;Bx%$q)~rx@h4+sKXPz zC!#0!w8J&FXj^hF2zhR1iO|Uq&*HSn*e8yQ*F-L1O5RFm^72^n_mplM3aOgHc)XfO zSnhL_0w?j@$W2QXPw4lgP7$!PxLu6z8*N7}UfQ=C;!H41XL9mf$O|QdF!5g^7RGy{ zoD;N8BfU=*IVa^tM6%Tz)iNF#f?_ViRbecc(OQSEakNE-eSjR${NP;grkXHxG{oS= zZM&haeVS}v>=tlv2uPL#(`v)8s3it3^rT={UlLYypm7-s!DHKcWh-ZT$Yf+UHzZ(1 zdo8rYgRpmS6gF(xCv&wIOmBjfoz0TiY4Px>9lf%V=kc@KAr?VU;_Vq3&BFHXAy_iK z9`+5TVAb5|lDO{t`xacBw)Ob#XXxK`T6lx_l^X!upl7r8}2gq7Oa4 z8)mgN!kH^($j?r(09UMC0QWt!9a4ony!nh}(AiQCn|JrX9gjQ*10$mliK9Ur2upe+ z@7B3XXTr3)s4RC%VJm&Z8MtG^^JoZ%;f7bNhE?-AU}sk!+%~4k!*t190wJjR} zD&L~LCIsisZ-m;QkO6V8KVddpxV!_B1AVY}_ipIx>4u?^VVGMNM1aI#ThB0@Jhur} zA&|1kLAZR)3_$)1`D_M>uLC+00ob=^ADl9;5mtBBK^^WlYFN-3H{rrnv*DGiXG3au z2u_^W25&fRF%0$h!^QahlC~PyxpOzHo7DiXS~C}t!-MeZ6Xrl|2w>Z;Zurn;Cqq*R zIj<FncSVS63C{lb&ry_cPa_hks)d+EvWo=Z-Ky+fy9=392>##OFO}!}m4CVn&cyTY9ZE_`?j~xvDwsvJ zhllzhgHwUSkSbyXk>1?Y0ExyXlyX6c1WlN1bxtN%EEc&sqcLcYJJNk?a|24-D#F0N zyJxioTv6=toXy6`D|rMB&NZL$J9Yxfca5B0y~9 z*t_?1!GHboeh|o^XCdcaGP4CDsAu=}^-FF?i)=Uj;$FFccJYZzNn3qMQA{E_7|+f+}$%qXM+ z>U@{aZiQvD+u(-Je;;=A4&i?8LYShuhJ>_k(JW}IuYqEE6bh)am?5fK5|HaGu}BDh z^|#01EuZ`v{Q65Df)kf7grH-=Eq{CvZo7K}?Cb7@*(jyXTDt@i0aS^QxMeKVqL~n5 z4_9(D4OTiSL*1JjYT;EUFM;D1cFOH?bj(arzOO;zUD#TK5;zR|22(N@gn}>0&M{H# z{nWR94r`8^1)qJ#Wm4+A?`yw=6smc&2x%Bx)qjc~beICCaUpD_b0 zygotd@g&U4om2oJ9h?H*rqw0n0u$-VnNR@L3+37z9Ug`vaB#kFw>QZJEE*K3mqRtc z;R0J^_fSF-*#k8ChEeUohq+^~%6Ow>tv^2e4BYtIb79Sb4p|`Xdw1L?SKjya55vlN zGvIw!o&nGA?1JaE?SYe5sN!<3KX)DUBe&f{nR7-EPFX$=Ua@Ye48NcNK#Fv=kf@~e zuvAT8Q`oY~`_6s6QYDn@p|t3UOk;6p8@%IHr%U^a)V>TFy+oA4R@e1UuQ^`^7`Ea0 zJ@evDa0+Tck|F`V{QfsWEUH#6DEWyvJni@5Q&-ArjnmtjVNc&My!EsHBkvDgGr89L z2ZrGf_dfw^mdt~VTlc|>d;6fdxk=eaw6H3Z*7EEhaP1hiKuU~k$-+6XaKYSC79;go zAzQ|nWGIKBA za>eRC{x%YgLNKg??iSCUjt0B~OXhaS&lFen_zSz`O7godKNE(MX}JH%7oahLwg~F~ zT|=Yr;cxv0R?P2&tIj`3N)#GjxaIdyhuggWnoD4QXDht(vNPaM8#ci;pZ<;v8=*Cv zQkhjpwO=@U#T-Z=AwRn5MN~&ZTp+=L29z>ieAkt*uWtxWe(S%>qSq81Ow7jhOuY>y z&ax}s3)}bhqWT(^DozZU&!(-rVfmHsgX=%_4c2Z=={_a`zWEn_hIN;|3*Pe|--45t z%|m-?fm}tWhe2Wg6pj1tt1ggH2oiQxI0or#0cfd>$~d8cl=|&!PFt$# zN+B_}HPuU_J{(jl_TflWu7rm;D)kanN2ru15&T2XY?axFCaQbS?C3$T&4NEZv{6c# z)ib8SzrNu-cy?DWY(>uc|FidHv9@K`Rdem`^yl{X-PcsTDpy=(+$B+LC$=F92|)q> z1*9nX;{*JG1V|_!$b1-t@&OX!BN2iGP$C);fdV0oLkJ>?6XV#49mjUrF1y;-*L$}+ z{chG`&bgYs*52oq6YAOZZq+?cM`xe*o_F>dYj$IfNtff~Hced<`uht)`#& zkqx}@QS8^*u*$-lwbtRMMXABUg*haZK1_P2i&zV!81 z;JKUknHFSMI`{6QH$bhvPhGzT&!FWXMnK7}&(xZn@b7qpzfWI0dOlYC@sEG}+x|!Y z%WwYv8dIjSS=9Z3X)^lo!A1`Tqakc>ZE_kC{SC+>orl+A%#rE;R=i7p;t#(LuO1#V zp^maZFJUmAb^9>H&mfT8TVfo8d%-?_E)noP@i}ct7Nz1Ce?ZM@pF}&;XJ@|#+_%z(b z?^9u1^W41&1CEG`|KYd(2tM`f%h2ifxjpxVS10hbTMy8;KY^Fa#z*w6kF|38S< z|Brs|zrmMYxXFL#=FtS6ed!K-{`oujol>}i-|hDi*td>m@G64xQ~3Y5dA#7(Ug{P3 z?ALC<$)aGQBmp8uFnr+~H{qZD!mq%WU$_N_MG)-YY`(J+xK8>IE$6vnz zFWx=k?{W|S1_9K@83e?)UB3$7{hoKg^~bKb0G)SdJcrX&1ER(vPEO$jcbY|E24Im9hcx|e(f{x$uE2ZV*GpK(U>zZ-~03x_`!EwW1Zf=_cOo5M8Ofp zM@09gbTs+;R8Jv7AT0|@FVp9i7$1=60`bI{ct}lHX2NZbu>cV?BV5!}OL;E_^?&Ch zAAleK$3F-64^Np^L)pE5`S*VU7yShO$-n=fOvq#li@^yohDnxG6CCwt(Qh&5+6Qob zW3kfNqyg7KB+p>%(#&-HJtvb1#v&_rXX*7Fv?^o)=F5VAD@qnnx|nJn)MrwbR09Hj z4gIb}BiY&5ZcuU8`g00MKbFQFM5tHT~nu>Xsk_aRLgs&MGIUp+bNvDp8i#e6> z)!Rq#(VzKc{ElNd=#AKWq1XP@Fa9=H^7r=l80?xMBk^x&bw+XM<3ra2Jma z!FPoz$}cTBLQD{Ua}+)_fp_%(~KtCCh+sW{{rvE%Ob*sy3dOy$u!xI$&t*` zwG3XpiwZ*-i5(~^rntvefl+EgB#nTsRAok2N6bsmRBIDu-T?#MYRPifISXWt_Y-;I7_ib052xVyWB=VY5(clmcQ zqI*qX(1pf1Jdf_%(dpdq)E;fk#Yd9OON)83D&fm_P9eRr!HrS&#F9He?!-2pklmea zc3?Y7+Ev@pVNi90fUPnEO9K+Wzjtr4b^Qy=#vf|L(Pfnl56qCa6q`;8* zBB!=!xmWyG}>rfPt{RHRk>qY8@a~%Lm^C8-|$`5=$1HZOsMtilWTaq;(4xIFGaFN;jdSF${< z?dcv2`rHXfnXTz`%C&(x#st(5L?UIS8@MC9DYuqj>JRqR%sLTi*wF3|W;iE3l`v2Y z36TJ6`l}rw(a>awC#Kyb{hU=rv5s?LnPxB(tIQYf`W>{WN4D6O2!K99L{_ZNTQn7+thJw+E0_wrpjq=xF&Q z0(2`v#Br8{`$sdldG82;ajJ#AjhdwfhJ54&tRHE0cP$#NbL6Ls94?K!us`guz+7bX zcWHr<^gGWCLG!+cKw)xjsdrtPQBH0YcLpw3x~gp%v+Obm)1LurhI<;OaQLN6(~)s~ zKz~ONUxwo0rs%Q?hIOLhvJET+UII|WC!CAyOsvltPm`V6}QT=?p0nmm3FdP)CWb^lGU^UDsPIC zFGkG^&>hCSo}aX;qJjQ=o!zZ{g<}Ql>esob^ylXXnS1p}qT`>4AX${|QyS z;|v$MR(_%S1odBVtp|@uR+JMIq;VW4X2wb6#uadrfYO_dn}eh3jUqN+qwhyqyrYvD zT8t@zV!`YLwnmY)`fBZLP`I!l56hacED$SkJecNiih=o%CcGk8HhKw*I=HzYX1CLm znDktA0udGbh~Z11v0~*qt}(*Wcv2~jq3eh0Bn+P(WHCZK@y8ZcHj4lC2U=jI!eecm}*Qs_C36 z6`U!HP1>4ct2lDql;kGS|C!X*6V@q?ogg*yrMyYSK+&$Ha;_*nZj6Z`b|iJ ziCD+Pd!u3^TNY!T5~DE&Qnl$4(3n(w0g%^OUH5hy;o3$O3qI#36&%hJR)Qx+=qMu{ ztBC6Xk#SGz9ntKIrTUev&IO0>(R7qv39abd(A+yq})_s!P> zNsVhGrI*EmaKeq(&Krvw%qwGQi3&q*6G;nEjfDelVY7!(c+wg(AzkmJ^JnElb+POy ziHFGuJ|7mOF?iEH7MTT33yrc~^SpwSq~xMpKhw(ZbW4RnZfY`%%FitFLiKhw@LV08 z_=&iOopxVxOQe^zQf>@F?E=|JQri8ICJvBJoI!uKbS_!_m~x*d-GEXvn*{X81?#>k zlK@a|mWgq@q?S}s%8NtXR3NXt){TGD^E<3X0s~M|N1@~fSq0*oQGt;_p*II<(zYg! zu`XF1j(7uz!l}3_n4DV=Uwyq7{(Y&)OVfe3Mr=hN7VyrAi>21i=k`y6Rx;6nD-jBb zYBkFxq>GC6eyR6>hG9}sinvzP^_N6;fTh{rycTe8c(Dfv3k2}8O?6Q&9F*fZ?ZUVy zpt~BioR464i35CDi$nywp#zO<#3vr8WDSO3qLj6g%4Fq4)5 zW7HrSN`wlzmx1;M%hJztNDWq~mq58?XL*WvNEJ;nfW zngnm97zF&RhYI8X>d|RJxoyl0m(mn#Npxxn%Tl-6@|FDd7?_gMiG|CuM9x;#^VqE8 zAnin4p7bQl6)I4# zD+VEUL~qc8r{DK>cdo9sz*kqM~%SrJ1Vb!frDj%~^-IF~&J8nl!!L z_VCX}%%oaF>iq!SA1C~0w;FW4{`Tweo!|Ff*xcFVI!s|&3ErAntk&E-Wvb*Vm~acm z9ie&yFH}=A(C0!p5gZ2=Rck}pAXZ8}3XTh4CSz5aYPKDlRt0X3DgK!gUYXf|b`+bG zR!7S$d{?2D-mzkp#gdDS8f>)i={0tgTVaQVmKqdgVH8(XWs(58TCco9qB3qF{SW4qKTayXhE7i(axyNK3izuo7Ou1eH0`=d2*9X57-u|Aq^Eu9m zba|2HgO_#us>Xh(i$9jvw(krNv9tkfEsp|TOyLw3iwXW#p z4Ucu|gC-rVHFixrWN0D$oj6E0Q+6qKSGq&6p3tks;iSnl>0{+mywC`CeN{XK>#|6V z-%qS@Mg8c(Ow)A>TR8ixV+wClu4sPty7MI)RexPdQEOcS`ddj(9P7+ipr*-IVRGq^Q#y^Ad0@22f30|7D zu~>s(9l*Fk{^xn_r1x5-RQR7(YjzRkG0v>DP`=0;1hdZdpAzkwi1I+ARC{wWi(C0` zQ>x`@g+F|K{LO-N8*mda-t|52)5Yz#`|3o7Y_9-i^*97nLRaAi~Yk z3lwXk;RW&%YD-}Vf69Qt>FU~GzHwe1hsrK$6`s&KMO*vWx_TW(GyXzX(gzlJ7NM^8 z2Mf!u8MM;C(Dv)q8fpjsJWVU&xlXcWl$zHP0Z4D-_u?2s38`y1UJN0@ai&yI<1rwG zbwRias@Fl4S_WB$@HnsV)$>$i(_F@awUY}P_N*UEv$0E~X`tdsWlE^l3y#Y&+ekx>*CB8o~OqLLeMNMiom z9EhBo7^Dtpy&u`8a7`7x&O+(O_{Wcwi$tZF0-&trA%2uUS3`K&B?uQM1pOOcpx(@y z*`3jMDO`Z=gCqQ$Acfqp48F^xn$;TBs70vP%5bfD%%ypSXE{VG+SYrH2nvg89jMeA z3lhXs(zAG>i-oabw_MFGO^@#5>5F6>CwUadMHHuao8WD{5_lhD#@uXg@&X{fFCOws z>OkCOm4pYRx>L|v6rt)qaqCj4Mj+aXBOq)|RlXGgzg}XRryyMHL8eJU5Zm}1CH=Sz z=_-D93c~D^Pa6-cRMRaB{)bIV;mz_02$nJk)BU=-Q0r<`?F?Hp;oxWEl&XgmS%8>H zjajjr?k*=M6#}G+lSBg}NplUBB#)DHMfW4VACZm`1u5lQ8z7#y;1<2_n$+D-8YIG7 zptMUxwYzPB<8Qw%x8*{E+EUo8l(Hw&w&6D2AXuOB^{tGHHe_S5fNJzfgy3+WV;9vL z%i_Cd&Bwxq8dwXKnoy!3_e|1SI)h>+rq{g5KD4|iLTn7LMiIZyzs)3u;n!e_9uY{LJ zZ>F-;Yq)8uQ4Cb!bB!8EkS4dcGOVRYS*FEuzM0Rb7<fVeAzD%AmmytV**8zt*W%h;wtSRh7dFvf+Ah2 zL?%jBiBfo#G9r*f)PN7Ld{`hkUs){Ga5o~4t?Q>=P2abQ{7SmrmuvYO%ED-_Q@yCA z3Tq$kSb}R_@{4*l?oejrvVEMvJwGOEczv2?18}O$fR81 zb&23u%A`VYREd=Oswx?y1*dDo;+ibw2PE1@AG&%NAUQ`p>3&VaFR>dJK^h=Lx&&CO zhzQeE9Rfn zb;Wmi8Vy+X^Mt9(guE`Fmf*Qo>a~lrBK*-kthTLBGd}VQtiGG9qztSJrv|DL;jkDM zt0lQuxk^g}LgoMwSK3lghnP~#?i7wf;qos+qN_z$Qm`xDA{Hdf_SD%cvkMEmcs%#Y z0706*58huKdp2AV()MWEozPeSmv!>vowZh>5wA3>?9j|swc`>MWT(~?MH{t`kovMN zd*!=&vQE*qs^G6t2=qrlE7?vHH^3UyK2#&NYLPEhI|f036yAn;#&J-e=XIU?^2r&7CVHY-Y+< z)$6!KC=qxW{#tp3b|-lcmKPnb=`x_-$gbC7V!k!Dk<{iC|@oxE-zPjKSsBU z-6%vygg}Yv4mo|wgqFg@(;bl@8iFJ)WmFdU)+~zS{PkLqbJKDwntr=yG2E^sY!3*y z^e&rnqgZHD#L{&438Nb;g=+1BPGQ7l$LbxgcBN!MA8|r)Mv)|_lgLKub{*F%C`ig+ z!MB2LXi!QTRCwi!5;v>pVol~roB@(`S*(UaNnlVK*(zw%Ym`)tK;HXQv>;WE0Z6_q zC0Y)OEr8++t*hagG(4LEujocqWI0N_#h_lq2#z>TDI11Zqx5g`mH-Gy|Ky9neF<74 zOq^oDpJ4^(UUw&D%bQz=8kE!IoPv}%`O%+bs`+H^Ry8PR5D2zP9f z1z9Zz7>86MA8Jkwcw>EoZud>3y>iFOjJ9#2P+HY zXS<-5C=JEo&WcAGZW-8OVFLsXe6rP;6a*T|_oqUaYaNN#G1VF$8Ki(!tCi9FPG&Qc zVUf}P;3-YTjr4AYRs$WY<)Fw{6l@rwOxMVxonxVaQE7l+FwYc}!dQ(|gM;H03gWfg zH+t=~90Ge)NZQ5+IAh05!+HBo5yLGKvcveK-pszsFYQTE2l0denX(1X2 z@?$31WIfbz$Hw)?jYzkqIaK+oi`UY8o{ce_wGdT=)*>$OS}FnrTMn`sl7S(0Fwa>o zvOwZ>js<;`01~weR&_;7`{V+enNBO(;J8=5Rk2pY27#W`zw&7puE^*Y>dg27EB_PJ zEo4hu*1s>k^l(UWY{V?SMLL5F35}xSy7t?ajE+w$fY-?5oRQ*H>uMcm@vhcbLQCQI znb0jD;s%$E#~?_ubv_43hwSf0xX~d%dc3&Fm7)L~tp&SLQ9&_ADN78(W4y{L<$8#c ziIk=$BB}bNbnIe%=QjyJxQbP+mY_PRx5)^I(*z2d;TM~QBt0+~>!B@&Vy#-nQdIYa zICn(oaR-DNC!!$g;-T;;CepfCvQF*R&%t`jp;W_S*ip_Qmn&H4vh9{B6{>_N)y@Wi zY!?PqGjInVD57mC)N5x9MXQb0&rAWd+H_Ue@u>XRvHABAAX`s9f#8@zys_R?{5)WtBel#v*LLr}= z;Ey&leyRRxX*@ANIJd)R%7*>lDrj?c4vUmQ=18tlFR`=9rE2$~x2oTbU|lxcjnLI< zQ0S$fy^^8zXzs)fmn!IkSFaIwsP*nxz+6*}s{5M1rJD5~DLqjL?=$@DRG`V#MxiWn z7+t*zS-%U*!w1d^CsCxLC^9uzbeGC9Log8EDm9=m!MCl6*en+Z^9%^3lz7eR=Q#$* zlKR=I)e7dX-sLf7mWIvqyE~ayxo}l&sEK{jCA-YImUT7SPotU+0;Rlqhpe+m!LDxs z;E7cG?Y033Wc{4)UMac8Et5X|-D9}AG_bCq2d`@s+=7@yHX657gS03cec`eR9@!XR z;yvcSR(ebTkZTKgDWJsB}1v)94R2B;Y z8?4JS;tk*buNSRqfB>e1n#;djA2Bliz{jt%sp<`hK_(QC zwUDY{9`(vNEumU2;r8eM2rljX5JbI!9^sWFFxuRJ$x|Om!iI!;GQe%=Mo?-zE__4%$v8?Vi^JNwYzzl6KYO*p!ZAohY zIYddU*Gkl^Klo%p?cPx8inSZ0XpoH>@vT35&@0;UJ(->(AQQ>+IUGqFzX{! zJb}=ClXV;+)jH6u7kY3mRMTy03OB6DDYXcSeu}rz-@XnQE$WB?M%?XVys;0Reh=jA zlts5i9K-VT2;$)g23H@4lL9xoQAh24<+qQ85ghk6O|}FY0Jz{|>N1Q=!N)N%ehZ9M zb3tvnTrf;bD{h)ory=OxbvSnbdFSj8+AbFUFtf#C`%kX?H7K8W23Cg;pqfwN{)0p4 ze(_5%KR$-bPd)+JZ~$qy1G|@YVRkZs#dOXB(JcOEo1@6pVp2(=_~}%jxB=5w@58|p z*J1za0Sre&*t@g`#pV*N2?AxY;PC-8&DEY?p#%gvAf_B3%_ugV1v6D#>ww6!(!Nk1 zyJ=H0sEardd4dE%7E87(@6valYQM}YEH*n2eI~IC#U+}Vr?uUJ>j9!(0~}4#TTpwk z-+}5?2#jnzf($JN3pUOtbYj`1lKB$y)e^b~m!Ws*DoiSXe6#}xuYT%u@8$n>EaR+^ zFcK0M`vMpJB2GJWJI95Ox1B|tb?_Lkc$=7O+Uc76y;+iFGyDRJhp|@Q5PsoNv%aOiDb+9Gd6Ux|!T49pw zRcWsW$)HDRTK#($Isd*qwHG(7d^v##-L2tM&w%I;;i$sLhg)#OzYCWyU*cHf^mGCfbiZis9?jOE;W3d(YDXq3BRsdk(&RxjV*%Nye|R+! z>q^On9O>FdD)2I1wFHn{6JOMdi!vP1wk|ji-V+Ko1j_TETJBR*46en}1=SX3u&iTR z!8C^*fsvxMh%)UyDFg!;VBm&_7GusaU-!~w=_EAMM@xy_1S9 zM+gqG6lu3VNoc{-!e;>BagPAdKh3)R6Ffep;|?8n2a~Kf!27)u1jqEDRSDlHfS^fi z0YsL?Hk!%PY_xq;9ozv{?AGFz#cJ9`)i#BjgB|3V+nOL1#? z?b%;H?9Fbi8sOm5foo%y_68@Jy&?!weaoQ8x(I|`pC6~^Q*(=!Z4^S#QuDZkVgM7YmuPTcUu`|p0=_vVwe}g9CM&5bnU)|^po{UFZ zJIvQQxqAohA0I+@atdP%4Euv2U?8VwWa9~&PB0!hox!bFZb6zRFy0u!=EfLCXpIgw z#~|s-V~|T&ELS`PbCnl*rXbA&hsqoCY*V~C%?k~_mW?l@&1y+cl)!;QdW&9$zI?#^ z^%v6RPflQYd<4g6QBvH^dgy9(dL0BshOShiC%EG2IK`NR zuH;xH=o)m;Rp@pz7!3M&oWc-Yh7B4ej9(@%&^24Fcy=J=?pJvZ1r5kFJ8b2sD5_0G zk!n5dy(OGhr;lC7qErEpe98&BZ7+CsJbsV1Oq_9w z4HyKp2jJMu9o<7vL} zDU`D*tQIpUmP>9X>vVcN88t~YSSVa4z>vFD;Cm*MnHkb4I7Q5bTs?7zfkg32Qt1U2 z;X>=6+gxJgxmZ@tr2S<)~Kw#M38 zRpt-TeCtBrda^!TjAj5NCiP10e{8@YYBoc|T~joTSD-ben2k1_{*bS#)8&Doa|Fe5 zrJ%si?W9WWSN9f|j=nnEn7+73idm(B!S0l>Js#+;ttj~J^oK{a#UQJ|Zqbr`JF1jkoTQ^owbdL4c%7ljEKeNQ%X5qddL= zr@!~_j*>t5wbSuCe`q*(;(h&i^Kw>Ex@5dTd|-%ZG&05{i=!h1%7U{g#VTU=D~VHf zxro~p5g@<}@id|aJZhO1o*n&6Q)g+xR2l%boT9CTeqM8p@G(j+^BOHRH=r!RHhb|x zW^bnA43Bi9puOxE^}I9!dZ_fmCwE5i;xBc4AoWPH$kZU1oD`cr8Sdgv%%*Rq+1jfw ztJsQ7WL-0&SOWopKNiG8v=Y4mKStAgSEYi*yh2b!Oeoz*7R6ri;(Y(;+38?;FXxQ| z0~Q8`p`a5m@LVo9^JIa63*Q1EHCGK7d=1|YG5GGC;NO_yddSr`D}26LT`WG)X*TI^ zY~LoEOycveDb# z-ydB5bG>AIkWvpJEzZGc0~bGjHpLZ14ia6Zk7Rz^Edojg&AmH*F`E@Ugr)*i3^w)oJ|BsJ!d_#LBA~?T6c|V{;}aLVa+d_g8-l9cy&n0yY%Os0LxC??;^!_G z2nZJDiy=#d+Ds?;PI+&!b9!SjL{KEvLLw+cg}|@_e>GOqoX(?hqX-no9TQwLKzf{} zJ?Zo*Gc_a^>zLBDaoU-3HC%`azR9r9H$6ZsO7Mqyb+EN3nKF=N^Q7CI2{;cm%YhLpI4{Pe|DAh$0vjRC)4rc@9hjPKhy2+e@7?o3?r(W z&;pLoa~tm|;Ib4g(lY0OoPon>U_C`O&(Zy&xT7dcog{KWu!L~zK|r=#C*tY5FRnw{ zf6Uv_oA<%HubM=|*Py6d>tkFl{;uR&QTqT|P(|)l+5v%X5^W3uAE)O_{2Qg2@xCHJ z5CHLUa!)s+X>kB2tL^gMa&vxf)hkYlSmxYKP7K^aWQiTMLu%|)+%vAzFF9Ag?0QAfO?VIR@#A`5eKbK}55o>9Qu|o>jwMrZdfM1I4BklB+p-z#7AV2`so4_)l zft!>HT#95(3*twd*wAC1WDs+eE zY$>dp#0!7u;)^=Q(5_R4fS{_k0maG(g?fWQ@hAg?S4NbkC%w_;f_}st{iF_Ai{*S& zEEc0;MZh5a*2Sn?(tSL(_wmZFTP+7wzUnWIZfBEwFRnm+Viu>}s597%#+RN*2isSY z;qK$b)eT7Ku2nDQ0!2t%EcwpJWj<&a+wHJ)Zb8% z>t@_30+P*im1Uv9V*>c#d1eTkct-QPxuzhE2A0j3(Q)M(z9P14l8ZMLRHpHY7JbQA z$=_{7RuPvTgPK5~jMOT|50sDSMWyV;vf7E4#SU7Cp;(mT>NxLVfSt%(vTMj418614 z{7{e`(Qun|!SNxxzytt_D{PP*WS(q_mg0$1e9sgu%z`9)>H_|w1&T)-Al9@B$m34; zK`-mjkN%*_mjna?1Ob2mF+@NN%GGL6;B$POuLh*6gl<=#UW2y-t+TZ3<8!?-pLgzk zrF75b_&8k)0&-P@5dBEBlBMh-2>NI;hjCtQ0eY@zA%<#R zj?}bFt6U~!p@?~_d(0^3rJF58OpMxekr7c)1LD-HM;u##q_$3B(zNutw9}o$X*NTT zU}*sXuztGjqk4I?h2!*(SjK2k@Jf_}PE{2Bs#p;S1`LALilizD0R6I9^~rK*Fs$fx zc%1jDV#&Ambr`Vs_%+1}pUbn!gPY0mofl$K${_VQH2DI-qpwLvbVj>LcVj>9Y+OnO zf<;DIq~c5ZYrNP6tbT0*LbkkPs-8D_ka>4xPNCtUt`q?deoy(ZxkxFML|`dEPaPAMfY%d=CTiu0Ag4 zaeN;?PWScWcwZKUe!QgHB9(YWaHW%b&&Q{?zlQs7#jsK|q6K(M@DyEgL##bsXXM8LahSIEBKnuO1 zTfCNv+@Xj?jZ`Qu&0Uu)Z;K`^sUYfb#~t@mFqJ&BsdQq^PMH+Qx5Sd|Pm(T^1qmpp zhB-T7H;L%yNwOqB;dv=-a>5^r{bsl%=k6QVU|9)nj!92duTLXv6RE09l?a-u?9k$u z1Rh-M2ml6!)C-@$K$eJ(Nm7Q7WrfEiGsCYTxtSuvTY5az_sz9r2^u4iT;isTu6k8! z>r*XanOC&(Nn{{4Lcux@C95dXI>G!{41xTHUl^*>RT_iJ&uWQCm>z7WQH!@R-VQ73 zwBvSD?zl^Gbd3s~@X!;PlBBcLy%gGAqD&J8)(DP{rIk+^99ef7>cr#v-bN%h>Ie&DXxa|^sqFDkRd}=_PYZ5>vxfovjmDX75n8lwl z=gWXWKhH8VMu*AXR&<;yt;>{Z)$uB3pcp9{S=D06_;|v~ep03wybF5H@XZod<}i5( zqW~z}z(nnv3sXcjAmAdZG)f)P>e8Z3s(5~QYzGvt!Mku4KzEx6H$ zkLTQcL}SiU1OdK}=8}V+O*@7z@FkROCsCHhDH`4Hc&}Kv8-(CnXQ9;KBES$}n2YnbWQ$aYF@nJl4JT z!gc#uf~0Ul-l8?mtya~!0K}R_aPgyDTrMtWU80Mh;No&|xd6z;<>GPykc-R3ETF zjgW0G&$nuOxrW|Z8A$)!vrNrI=r*ON2w}`YLwbSxI5<`38j!b+()!wsQm?tr zKitKid{}OUo=QV<{w2v)Y!$|2e5r)`qh5~7xpJc(UJO_C!5|p~H0Hf|56Nn!AteYg zj`k+tIUTn@`7@Ccx{dBaHm+~z4PAb7Z8n3+)C}F`e##ME?z!x@ms?o5dKj?(?KtuI zN6wooA4Z+(GK>l9(nAbZXzwKsbq!nkhg5DXVA$;3`9sikryyyH*1D9OJgizq&*d8$ z4H+z4l|FXNs*8^kpPu17kjAR_QvL2NpH8fSF!wHGd(&RWIv(SXkb&hE$`gxfMPL#9 zkWNE|%l%y&w!kUZ9SYDV(Ek8;bHR9Dk;h(+h|p!};S=GdzVSYde{!k}6#3Y-0$T*< zKrf^5spnFHkGxLU4s)=@KGXWGDkYjYMv>q7)C<=2eFew9FB`gqs1@@RwY2?3@=^Q? zZCp71hd~;Q{q!RNiAjE|WOaW{#02o&^u=Y_AtYEzLO=sSvRXHrU7YLRc#|=$53CW;`pHxDoM)iY8l7x>eBV! z(Lzb9C*bQcGRtNgGy=vfmaR$k80S1xby2q0oNbD+8A-{Y7eYU(bS!i1TqWz4W{cv* z4m6jV>E%^^yWkxBS>!9Gm9r}(dh|oZTp*jPdN<#_0(S-9Ut|`ZV<%x$%1J7RUXy4K z$I%y6j`QorD?&+1V}IWq%J6WG@t;WjHnlodPBId*3Kq;kKJpGUli^&Ok>PbDjAh%r z?>j?fS#k_Ev6e+Lx>ZDpluU_~Ym1Coj}-2G%KgabgxCy;Ca&sF2q#Tb1v4HAAEf=- z$D4{LG%|X%<>K3CXt0kKQSY8H`JFEySs8MqFg8rv@z=^8b&8JFd-?94E)gR<&c7`a z*BKA@TSniksU9ONH(RLxZrIJ3{uUD9b*BEl7|cf@(HCNf$^W}WB_rx8q_oQS8~)!u z)#$&99)j}s$K6C~FI(7ZGl|96?(oIUy~MjjEYHF0^vfTUX=z$4KdST_p~C_>RCw-| z`5hy^U5KAe2Hshx5QiZLcNn}tP-u>^P3Kh9VXO%t!?W7=Uy*lHi#rQ;o#vwV`e!W=AQ38(6?@LP8p#|!1bVmNhm7)t&NU| zKm*NZ07*3pE>Ca=;20t_QHuf6T=Ldq_q&KPxnkuAq4tAZKFzxP?TH3_=|FuVVF#OZ?ZUzJ%ARYkpQ-q&j50@N2B&sv-+y3QYrbuz zzLoJ+?n_K8A!W{?D97#@zm`KR!ywwgO7l&czUA22oqbzzDnmlu6ydkQzrzF()W_Pd zb`CWBPHVF}4|hhF+n-X0D42ez^hcsKe%~+n^7!4*GEC;$n(0S!n$IxOwd}y~r)7!E z*tL9;!^)PS7;RGFzZ;9BC{|4kLKY<-XVY~dm$>It)$y1ZTF_3@oCZE!{$$9KqojYw7 zR?Gi9#249{b1Z{iU*`pc9**LDG&OXLgQJ;Fb=i>L1%1QA`%jsdnuNs^E`5&4?Y@l7 z6C*}N0$}Aa=4Nl!L+I~P&*J5v*rhk|nB0bix00VZtTD{Py2_Md16;h)l{sNn+6ec{ zr=O2;5S(H>&-O{>OR|#(UJQm;qB3elU)s=X`lA0uyR-+UnQ5z!_5D6$&$#UFXBHE5 zZKdV^1Ofh`nCvcC?=4EN;H9qHofcmGMw2@}H9G2C?j-6ad#EaiT` zo9kx=@Enag?z?* zGQ=IJD6I8wW51PCR7LTKKA(B^rZp1|u`e3ZdwYrCrG2x+F)xmGr*Gb4LZ|U@zfc-} z!G{+eu(l^>_;Dm5zXU2KkJ}8=j#=i|r0Ln0(-)pVGR$xoXs0VzVm;2m+ z(F)(|qe*5mk*iNvrI77*bGeBiD%UvXGGF`HqKZDJWWGa6Ba5!W$>6HKFXN?4^yeQA z`TW4~#%=5;8|_n9@JLh|fy0=$Yum@FPhLiR4}vVsLc@H$V#U3fBo1)5eNy=Z7!mk0~D*ltNNtvx807g zq1ozh$DfWqQP{&dm%W@3oOq5#q~&ggmFn{Iq*}HA?Yacdvwg}=Ai6aV)-|36a3)K` zm3qETefQ!xHRToA<`oGXCqL#hei1dgW^uS-Kc0(SrXc+o$7me> zX+K!5v*v~Gj(|(~;g@wyULLmex0f8gZVteV=QmwDmn-{j@caq>_(_BvEE@ zI*lhw3AEeUui4@8K8Uh=C-#Bo_~A6^&>kFAo(xwIP`XOTs*-qmH$R55?p@Vto?>s` zI8{IWQ=lHuV@#m-%zxJeKW6XLOTMf&ys#AOwN>aUFZ`e4#k1-lu~jvN-QXP8FhRL(80on%DKipG9I^{QN|3 z^Ue4m)FzHadoYIlGY5A?8sSI1%;Nga)WxSZb_L&-S)AJsJrga`Qkv1!dNG5m8+bUqSN(I4qEBV7oypO))1A=Jos-gZreJ()TgO72nO_Ix== zt@PuUK%x_!>um(MW_v}J7`-ZCgZYaj zy_PS0+s=DwW|H<78B$VGvGISR7^N^(tRH;^A1Cg8Ww<5PCe&Gl{>?Al)WqY1A=hHc!F4gzb zrs&|PBX{K;1BmG?*E_r&RDdX?HL@{{J!(18!|oOHZYzRn`l_Vg!}$yc6T!qEzkWSk zGxC;1`&gVRbH~v-{#nj6!Sa*EJUM&m)lXG>c6@0Rzpm7=2>ZHP?5FMZyF!&m_^~>=pf;32YHcOOo6C_0T*#F@uX5DOjTc~U(X zA>?^Crtxw_#G}SY7w1cuv4WQo{4QI?Igbo*vpGA~?q14d~yQe0_+ z@f;-Qqi<>P1>BW;t>+z{w!X3g!%h=ZFWvzZoY0y87TAvB+VZFAehS8jW<3ow?}Oi1<3svm1`)if z{B_qg3r`wGZX0{;FWlys?L#=tj)n9VCq*8fL;V*(4(Re6biU8=AYG>v+8b~)o zJm|B?cH0U+ydU+da|ec@+0m)R7v#_>PGiJQqO!GNb@#Xzp!J~`UZecFB2gxyw0^rAz?CRgYNkEYjSxxceP#}GjE2V5&$RdpV<-8Zk^?xu%*zVK=!aqYAnRZJ?2JMVF6c!7(diV)ELcrm%{c12! z=Hi1&cnjj4WFhy1UJB7O->EslbGmV{(=cXw}!mSFL14;>qTUTJ%Kdq>5gg`3yEM7zW@ zDFksCNQueF$i8)WJ=pUhgc}A;gr1WB14_2f|1zL7KzfUvM)V`)vo~OF%VB3%Sm26b z`(9(RRgjhv~j~!;=wpe3I4d!a(+|`pg(CJG3M(pIMSs6F51fUKW#2Kd?zOn2cEWPmI2Ednc5&PZh@cDwC$Hh0(pL(C-E?T#e ztvB(y?oX!&wEb?7K|LlIj=3=1hvM2e0DH%cMEWd`qf+{+@3ng~fRMt?_1y({xI>W3 zE-VlMyQ2%l07BkWJr>#&@XWnZxP9<{W>k||MhY2`B_L;yJs z6)hParu9(OneB!3?YqKiLRnE8D`IxHd= z<4-)AN^~NON>M}Dwg$FuXFX%CVx$2{xmvn~dafGhTIl6hl`5@P7nX98i9h{HY=HRv z_qdl_5>y!NXE6}EYI062dKv*Z>b59oA zJ)zVBt0_xGHqZf8T%EEVMWu%UFH_+rXenquME!6h{78N=z|^ zjny+0pt0dZWTyuNR>#gq)xYvd1^jKK8(U1Toe+Ksc%M|b+WYD5GxTKf+PrFhn)oOI z*?%?@AMnR?dmvhSoPR%)2S`XZy$6KpG6>kP^eNO=5U4x7FSo%GGT0QwQ>Dcf6=!A` z+a&TY&3Zk^k6rV8dx822vsYH@!GkAYY0y?4**6H_@hnFRQ}kLgooT{cz$h^*SM&HE z+J9wpe3Hi7L%WT{3uuE$e3v=Ut=y1`=G|m%VWJk{^+*uWk)Z)IYF85@+QoyWp8Ib6 zC|jps@&gddp01g5c}^rAo?)V!ic3R^>U+Ry6UW$XhHcAX5oU0+PY1lTa(lq!oNpDz zhMWAP&AhJbs&jw+ydH^vwdHIXKO6GD23$;h!AN#K0L;J7FE{@*PZz4Ud0JggAMKS= z20g)#6R7pdFx-e}Q3veiB!Sqj;#j>*l^u^qTk2IFvvo4F4X-wi5Cb;O8~|)aoTJF^ zQ_Of%WA?KNj2w}s16m}#;=0X;Z?!-EGH5qgyRRC@3N<|MW!SN@wq5iz;kVknRA`kV z@e%{3#a*ba9_-pK2dGLkQD$s0R<-@$@=w0*U%2RaUG|&Vtu#6Cf5ljPy=xpiqO>^{ z5&ftx^|b;RY(!u8Zg?$Crwz+gWCnGxRy7qnL{l8bwlnC!XjkD4+8U0j-rI9)*NTzsq z#S#92Lg5gam%Rr9YVcBfpUzsV-0n9+jh)5saDhlS zyPvZ$)Cigns!ccAcW~0LkOS2K1SwRYA%7Y%lWX_oJw4(AF?IDsHI-s(M1OHP*&qcF z#63TiJorrQn<9MO;RMfP>Fw_cH38;8g;FmW?~z$lB_!cX5pT!%ey3t?7Qqym4ni7H z*1wXa&m%e-KLX7>ZFYqxJ(q zxCz}G`R6j{@O)amn_S9Hxx=P)NA3E9%Ei9L-swdxnx*W`!s_$#$Bqvz?E-aKLHa96 zujd2-7Hv(u!=WXzCmCOMoeSX3)m_v-s~u{s(dxrT_$+*Htje?18U>LNup%H*PatlX z+k{Fq&j1bw4`n(zjeb+#m6_Hw`|x)q(JB;4Z1cCTQ}naVU1?{4cQ5xHL+xY?=P{HP zP^1wFu@!LJ6rwopC~tilo3-N{8c}be7S)~6?(Dx?1p5>E)7%Y^RZe9aOV;>v({4B_rlD9 z|3TEz?=oQ@)4>5LrgV0LHeb>ZJu80M&7T8v%)dZ5>X3jP2-xZ z9wSgQjG`y>8Wt%`FXviMrORyHgN{ma3raaAWXCv#Z=}r~E}wnvv2|B<*m7D1ZN>{N zP2YhULqYP#4`mAh$&Hrtdb%We4LD+P_Yb60^S{c@I{<^tv;>(dD^ zQ-&$X7`8aVU{(D)g7%g&##5JO<(539g#Q#pt%1|| zekElKO;~)sor2c^2+|5>`a?ng%B0_+0Ge5b4bR{Mv&Sa_7bR4PM$|-U)@0rN>ZQy6 zcv4`l^L0Z-y!{AL$JraFcvHsCkRDkqKB!_R)oJU{MIOwC^%(Bcfe-RVDJeQq`IP|6IGc;%hM&qdBQRQ`Np45(DiNN);z7pET1Hqxk&?{zi1#e-D*F<(*C@#0Dn zI3vH-+W@D<8C7s+^DBQVCal^j!flerK0Wm7*^n04Br&SuDyk)UPs#TuHpi3KI(#mE z`8{U-URnqh_-7>{JRe`Woabb^o~6iBdgQ@qB<3Hkr=PNR=xkq7@b^m``Ks+_UCqQZ zx1#hhUfP22;^^DkF&3UC5BK$(Y;R5kbOWV%@RQ6<+3Hj@hY-mYn`%|M7wziI~!e z5LGZaIuIf3gW*4oJJ-X0_Y?kAc=lYa>Ry&}AQG(SJHEJ;$KK)mWR2@w8h$jRR)2Jt zw(s#7R=-a>xDgmOUYdCHczbN@%e!YmD=lw434qNE?(Pfh4`D?k5A>oE)N(59op=9z z#Cyh2PAW2wlTSk3nW5DWgHWk+DnccCxx645+fIL}c6WqOAw(-iIOcpj*AKilFi;{g z0KmE_wg0H~9}Q0i$#*HwH zPZ6^79+_Y*PR-eE^%zitk;pl_Zf55!uaT3BfbA_E@-~s%7M|Sd`Oog1)y2GbQ+H_D zaTdp+=p?)!2y}lcXPSY*Hb?(p3S`!umc1xx3AqJH4{enI@XK(y>_bZr__6a|2zVKi zT^YY&OCz0sCakR`K7FcYnbvKsdkb5?pk`>?z#?L8BDg1G}v5E`3#U@;^DwL zfAgDyKKyTTDk<1CZN?(XsK!hKBTxpQPGRFk1Z_I0v0;7?F`N#?UcPFEB?Q2j^8qp& z!sak4ed6mYw31$Ri*eK)?&yw%)8TM4+;XS0s#InNDahfnC(G}g<@`t7dS?EkU~XNx zg6un`eF{KQ_By>=gIiM3I!V9wW+EN7r8qiLdzvsk+uoX&e$}p_^1O+X&`hA+x?e>^MB|JI{OVgeo|jj(CtUGm`f*B~h-L@fnn`6r5z!F~)g_oKbkZ#Z=v zc>$4w(>ceFp~}$t$%h-^!@aChl$oC_QZ1Av^Dm|!t~2U;E7ph`uP+p0Ge^>8 zxZgwTR^e5XM~5=r z+h;HOk*3oyA3%Icdj?F{uHg@mR>wG8FZIz)`hF~;=-PY>m(!u>+J4)*^hjnUr1b1O z{gha$p&m~OAJ`C$Z~R4|s|i9_Ql=t>w|+5Cz@CbW=HS=8a{q90yK3vnE3biCgf*C+ z`O|<_edEW?6b+ED0A)SY3Yqn#CKRXk{UCjAAUtJ#MCg`1<{$mT1uE`eI(XB!EGg zD4<5l_^%Eh;Hv;gqW%eBmN*p7w#UE>R5ulA`^^A?k)@(xKFWa-hG~)yN2ySN zA>o65A3p5~kPE`dm$mFfnJBuM@`|5%Ez!FcsL-jmstj-WGD#dDD=Q$LhXIiMdOYvi zo|Z*wyCAUDfbJI}krT-+`E>RL5(R9BqMt=SS^f-`-Ld4c97}67=-o z^Vy7lc>n)cTqT8@Y63+m! z!$XS*kJWGL^+l0o@0}NcYL~F*$i1?DE1sA^nV%SL6`WO@JQ{Z0RkjyA2ih#@X8%#t z5YeEwS(Y5T6>S#E;(b)n&XX$~5wbe&KT<|cko}!-nUh_mHME1w`L{{FP*!FmyY`7j zh)vz(V4oC*$`%ZuP~XSH8-}IS&4^1tF~zAS!K?EIt$A)i z*D5keG$l^gi(~vgF!MLsTc+;Uq#h$R4Sy*ua>(7{4bW*CRwHkMNo^E5fR8HMelPp)u?}iXG5=O<7r|SH5zpbD| z#<)txbc)B3)fhk?41ICOO!S|hHA;pxfl$Yfpp+r5*cvLhe3;mKa z3WybsiF2CW!%+V-k7HaJDaOL^bZXtJc4pkErgipjt9-pLdqtjmIifRR@D?yd9uh>p>-aqEa&(3V`e+FaJH0N%zI?m< z+;xCiV_hTHpoX*IafrRqzL@>Ni@X|NUdH;ixt&_+lZY)B5dQqsx<3w&Yt{a35SdioFaA1l zZ0?(!7}b2~^d6pJazvl!*O^1u6p`yOu1FHwCQ6)7pr`e>m-VfDiWl=lIQ@qteg3RZ z&QGU}1QZWLQdH)3=zw|tx997~C3jQEHVji_pxsuE8Fjuww$Xxb>()fRVwQbQ`Lyh)EjhXAABslnZ(Ly#8+k71@M?o z&xI6V{8iXY#LazCAAy97Zi0^o`TcgUdv^HCjdrm|DH@Bvgn?0tK355sT>XZ1sbTd? z&{bFc#1AGQC$<9Iqt!v-yXvi~x5ujOyh5g`wwn7Mf)1rNX#07z==0wDL~iH*L2QAX z6A6bGy4$W6hM`rM9l~y9#6(+Hld@VVFOc$GpfG{k&T8H{qR4&smaP7x%B89PovAX} zm1w@u{YGH_f4TF?TDzyflw$YiuxGZnE4J-)e9;~#1XQ91z#RUv?du2l=5tBlTitZg zgBscSkkJ`_7neLeUY|b84V#xYDyb@J9}X*w(6+;PFlMVZ=fzsBG*R*#xTz|_SC!;NDjnRECq==q zQm0I8i;pRS(V_>u-Ar*eGmCsbpOn@HL!QMom`~vEd3~ruGzsB66Hbt6MTr(5%;(id z>p_Y_c-u$K21t7D18t3TZQCY`8)7g34mBb8Z3;oVPDi2oml2wM`}bpJ!npcuttT~G z10;5WjEdHkFu}FqEzta5!t4~7sAi+mQNMC4b;#(h9g`BfMGMU{8_@4)-KL?F zEtL`UNCjRYA4X|E9;Fl0>n@)Ua*%wo%Tg;DQ8G`TTPyoExX|VSajal;9`)5jh*+W7 zvjm49ix)(26cBa1u3^=e&7>4&>@Y?Tg=tcBa@JUb?JV;jtk*d0)~yMIc*2933)G<5 z2w^H6>day~T6h9&=8BP=JC>T@zgLlw)BRGWr1C*b)UCe{GW3MHpKM@8qW;w|23jDi z3Duq{*Uz=bSZQ)ZE=s#sC_>MU{tJFax#>##cvK0f>R_)DB1Rm|fxm*A#qdZY5&Ujc z%-U4i4J-9!OIy{}QL2Ue`y)5p;EGaJyE0DO@;0S1-h7$Iju9}*$cm-ho2MtTj(9r) zhFWT4`>D;8&B)Urg|FZqq0r5w_`llJ}thOX++>RUHwnjb>gpOFFW$p2>JB z7pSRT7@Ar{)z%IP=lQwDm3|Vs>H{^LrOm6^(^q+=K}qt7IL(dCiRxWm8y3_E*LeDu zcpN@~k=o>qH8>?5i3yJz8@WDqs1USI;)Rbzc8^5|l{89{5`-y?eh)A2PV&&wJA#%y zbtxbktk%-3vCVKHNueL2?-EdT6~kC;kmXlw6WNcRWXsAUJFg^UfE}&r?`3FRIQCBw z9!DZ*i6r~{W8>(c%ul^L^s1=fvi$3`>`3U9EyK5=g^$0c2^#UMN3nnDuorOW$QJGj zLa%uV&zr~JYh`&>X?$Y@o%j8OT|sdS@PnTJcHAbtEZqNOQ;$6W0GFme_G{5`vV^8i zJKvrt=UcS|WAnK{^kqkoB%&Wc z1=*jid7iVp-r2qJB1j(&ayi;@qMUWUy%NGw;pGJE^hGxjAZJDqO!Vl4TzU!v_Nwhq ztLq-es!7+O-s_F*REPF5O^9N=2+-D!<5sH8=cmp$&rEA1nQk_^=(nVuL6a}$Ij=Xx z)Pq#Iq~YQL6u9H=VUMP4p5G}k;O{q#q?zc@dVatFF@wg0X|Y5Q`BkxK=V6d^2&kl9 zwp-*lt8ql#y5R}>HpnayCL)FU>jC6Y|0a+Npy+H;EX02jq=qCa@$d`NyQJxzok!R`HP}VIG~HFb9#u(pJ&$%i%eK+wV5j)|10(_C z-h6{jox3b{;S&#=n7&Q-SMQN)E7a#8bj!>yc3pao-S|dTc3v4401>=Asli~%If{e=9(@n>Z&iq?>0Sa+K$$Qlmu48lG31qo&rVg1Ks}mJ~jGA8hpu$w?wEOUAug$1g-MLrZb<@ zYzOtJffi0mfiZKD>f1g+p7~UN&VbG+Mo)e8!q|wo!+>J-1Y22SD?>G^87zqoHC#R- zod}=Ic?H!74_Q0tKuO*rXQgtmigD(C5DDjI39F3IuWotM{QE3}xG;MgK8~`Ou(Sbp zd=a2YLCy)~`P$d4pbJBCDv2%`415(J0u>@`R8Wz?fW419u(0PsMkKmj4 z1v*{6ZYZ#=;c)M*>ZzqF@@Vd94cbwn;T}t&@&TEdB;1o-Q@YRhKGZj?OtVVk^C1!5 zD2y>IGs@#(&g-GHw7s($u{@s+S{`k9>~I32?Y^ftM1lFx<>pkyJtxDwPM$ouuuumAk@vbFQ675l@I zop|oF7FJlm1cZuvrdM8AAs?b#QP7=RBn4gnP8- zJxBwIbGL;%p`M)tw9x?&ixCW{xFa3rB--4(Bj5#E(LvqeDc%iEiT{ zgq*P<_E5ZTQVh6Du;7Xt+s1i~C9$C|TZs*1FYP9G8~b4&u0OS}e|{n2g|VVwPrtP1 zn6&3dATG_jhc82gi;2UCn?gKC5fGB3mw=h-!rpZ8qG%^o7&r0RfTc*)10wn7x>{*- z%xO;|+FwM-CY*~+>JTW#7y$%PMIkLxzG@V&QX{!*2e0;aVdNIzB>@E5d001}T4nc2 zx7|eu=!yo&M|1k0y-Pu^T9tDQ@JqgkT)>K85vV#SUd4Oixv!0m(%6wVtWUh2OblG# zNY!tI8;4yJSsm?Gs2~8M5W~Yw#AF=VDj)vy5dRLj;s`@S zihAljWTI}=YK%aB<-KsaF=vtAetg+9aPv!C@9X2b#}Wuc_X#tdwu|sINj=4^`TXAQhx0Cj%pi4)7C|>A*5{ zdv?Ssqiy~p7)Lt*DOh9sa2a%COp$+#hX~R`_nu@9-n&9RZTApvL;(bKVy!OF_$UZr z`Gh-j_P4*sA$Y|E?Gmy7QT_`2unn7Fn0Yv{aQVzf?}pH(7KI3!CcMx-fDQbTbv=QU zzwqA5a?j+$)4RzB}IdY2E9(2M|`{UZ2DcfW+!8`!Z;BQ=FyJS9K zhV_vSVp~}nZTZ1?s)IIOC4ydh`hXwa61#T2UvolU1c_icY9GZ8ZvtlWgW{CktPrK+ zse9hj<2{6?bVg!T(fiqDm7TU$tN~H->aYt7^RFql?(rjm9BZ;l?xq@6HJXb5`|Bhm zYS=0MTk=+SJ#6&Ctc--BfEXKPKWjet#dm$j*Aaqz|MC`u zvuIP;3JYY|UL4(Ju1t3Cc;&7qylQ?d(&c3PQF@&q&9H;dbb_HZU*?-vDi}Rg8GjR^ zt4Nbj)B{Q#%fIUc`hUrhCpg{Vv^z%O+Mn~hk5YA5Af(2*9k z>diI_mkZlz8O=hIetx9Bsp;##anJCRI?7YgDu5|+H)0WuFG_`r??oK$vyte_-rhrz z^}HRiBg(=lrdQD~?Xz1wnJuo{@?7oMKU|7lnHz65c~^ENhYG6lyj$S#MoW^z#EbG| zm_%@Xi!(L%sg7KmG!w0-%IbN&8m`^YNUE9vn=TFQR+2JH;J1*HPX|0=S}{knter!{ zRkcblOog=v*`#Zevz|obEg|dUq6ihD6Z}mjYM)+giE19@^-L3_@007r9TI0?c@N;Ftyi(kd&y49H(mZ-3f*L!_ zo8+c>_VQogZfGy)V6%s}NxhMn^B%FGexQ3{Tg{awEDU9v=hrfyo;N{MR{1k2Bbo_B z4#-P{XTm-WpOit2)io(r-2Tzce(MhV=JamIvqt5p9o4Jo5h74fXHEz96R#e_*&tV3 zTo)l^`U?v3gKgV>HVwnpQLsI-prhjK368zH@Bqm?8`M}XEOaBDKCI-bj6s@P{~4k1 z{D9PW?A*Y*CsUB1#H1p+WTWr6yuG_(c%D!{>OYbZ=J| zA{^Cwq1&w&L~4XC$B7$WmGcBdF@l%FuZDdT6^v-uHl(~xIuPs%IG{8?>*YrZP6hTM zV>>8rA$#RC!SYL8HN~a(T#Ns{*(ZjZbhFJ)Q6t8|pmDulZSf?KM5O~}T8PiY?Qws6(cqpp$TR?bD51^(Z2cz=?~o)S<@-E)gOK{J ztO23bk8u} z8$6wUECFzg4hb99bZ`mp1ZuG&s)18XU`+uQ&%APG5Gid~h*^>)jTua5uop_8b>w>xOY3oenD#th3Ip6a1OP-X<+%8H=#Nd$9?>H1x$ z>1bI{PrHW0i1Y2>b5NEb*c&erFshttc2DW|!5`dH*oTJ=K}>ZKRD$>EDA3q*iK)Uj zmP*9@LY}4|Fj((s)q&iPdRA$qu&V){7R>Mah!_>1U6x7Z0J*eMR2^9pGLE__t z|K+4dOv{1-8kvL-;ue)Y@f-fS3hdfZ2kKel@twa5q8!OD;zIGY{%9IrFD0A>ez{a} zCSfK3nh5VY2=2~{T`Vn_HCOy0Y)(zNr(mC^afPVmC8Lf0z$jWPipuwD0 zIyn8Scv5^LEQI~QhvB!NB)1x>BZQsx0ge5mGhBcHClEP4&`GXfhKx>Q8WrPXy<`mV z9A11jKwJFcx8fA1CJme)z)u=s&3E6`$4u?Cu0u-U!w{ej##bZ4?g-xL#cnPjx?QEl1wZSzzTDRbCQI#D=o zK%`G>bDAcfl8Df}07)l$c$*mT#b2rb2lsE;=dcek117&*>`N@Esurkl9u9^HA51PB z6{k5M0wsc2uzKtTsCVIv<*;99S+6`FFgoF9BlltX+Cr}r?h$`opqcbt@lViG^}0#I zQ$Hn*=@#Il=7M-rk?sJUfyXcJP*h!Q-^~Z33w2Y51!f_Nh?K;lkKg?cA{<2-AL6i; zc7OIC=#>-Rit6s*%x6 z?t>dF3W@Oz4t_bm=UriZs&Q%%jO5Gq)JmdR^oVN$* z6Rbb@nulqHKQ8s=r%^;G5I5VmK2E>kH6;v!-+hIw16{w<4*RdF8D+fnkZOb8u;GVX z+V$NkIqU3f-{e;_;eJ(>U`JR`&}uYRfHF}TV;4?HP=tKToq8xf^?mjA(_ z6Cmrswf>drf{Z3S4B-&q=0-PH#5ASsrzScnHEfDj-lzQiMz>PMhhin`t5i#+T8eAO zb=D8jOc(k31xwnoXM5VdBQNh4IK*=<8&f4fReTw z0^To;A||3gTD_Igj*01PJXG-hGreWpcsVLt;iJBaDucy&ADKk;esk~k6;Br&(pk8O zRgRS_W+oCx(wHhh%HqHH)Pl|dU28_RX{|MxRrnz1N}fnFcF5LHHc~1a9eg;Ie(Up% zM4CvP!;A zqn2+zys8C_NTa^7fToHrFoemngEB>oDg`kkikpE+1;i z`+LRdu1;6%^5D7C40IDd_F$DBeM3aj z$4^?o=~80QSTELx%1|5?hbAoybOp+S=@F28Znb6X(|@{GCbI2_(GFAH$}zBVx~cYR z8eAWO9Qi%%zT0|BwFvj)#*cdntsdX&;oQdy`AnsZGYpj`#jia;STST9g<^+ttMjlUf;x5;l$ z91pQ1jx17?CSFeLs8cBlsyIDsSecgNzPOH(;yW|py$IoTPPzPaj2NQaYWH&{!WqN` z4fa+ZGWqRj)PI-F&E-s9J@Jv3kBo$|TDQHC5v)bZY_M}sY z_gUKX@y?x*oNjANEFn+@xYx_HeMCmiKkq)PLpDKX+wW)K7-7c3=*PXd&H9%x$?yz{ zf&IJg%dxUM zach*!MF4E6;vGB#i}0xDlq`fZPr>_<3hq=k4gu4<^rfbLQT;L?6FWUY+SKZ=YE1fT z@{QhFLb5GG%79kl097eyIJb^;QG}o#59kRPCHwb^o$WGrjvWeN6#ZwnbSkU@5}Zd;JgL+m^~l z_3^vx=3L56xo*=PYpW{2bUR-uC^?WA!!iKTq;PN z>XVCV`#lg-n?xMm2j6mAya~|$eATo07))98ylhXxoRmn@P}0wv0H%zY)HPLXWNiv* zNE)}+i&dh6l^UlIPNx_uU;mhhjRqasQ4cALI2~EM4+leOVj0>i!6DC##5RDzcV3nq9trOY$&WqJ_kMZ1Rb(Y>N)BrK2TMHv|D?n%7c~rE-DmD87N6a7V(KxsTPEaRpo-MBGNSF zBo}e5Q=jT2R}*!rsnn=@wk9@M)mYXQn?4p-d=vL>?m1PE0&tLHH=p3>OBJgLcGtzVC>m*#A-I50NI2Y8Z0l=Y^rSskT z(u-9_Xt{~6GRUh8(W)fBDr2(_Ty^SOQ;>9Hqg2@*Wz3`OT(_R8rYaV%!^6WvLA6>D zq{fs0hKD>P2zJ2lJ;NajyI40dOA<&#C!1QIHu+C@aQI-LqEVj{&v!rQIu}&%msR2Ni9XN0x693T9Py__v;JtrMz%se$0aB+{RH-ky zsBslg(%41S>cBde?`)p2={4)(3S}x*6UkEL@|{iQZru`RTbbAy9UWbA=+Geue<}cA zA^>7qdI&JQ+A(S8CXN?Sh8BYK$Pq~z_^S#G<|eqwl3Cxcsh!fq)78W#Y3llI;=*m> z*6rrLb*f<*hzuZ0gA|DX0TiK4nyS?aM*ARu2xHy}=i`TbC!FgDC|suXVl^;yo2G|U zrAu@Z6m06=Z6XP)0+Mx-r|!OGdl$~u<~SC~kx{WaBO@cj;fSh}0VIMW0ASGm?-(cm z%7Bh=oq=#}AoSs(#}_3)ni|e!-mEh2=+EUON11D~ZY5wfUtC&t&aRq>&Vg-Oq0T4hyGcX7!9s1c3fuUDjEA*S1D@iic@1RJ%Q%#7i zX=J!*nn@GxT@_#H_MS~WWmVFx>^C<_JZzGK)vbZx7RI;%V;t4VONt^Xy6&>1r-GdVIAUA004b9OWgziHUj~-ke&uCqRF&<} z6j)8;Bi-0jO$o8g-J1hUH^6No&8nm?0Kf(bMtXGdI#6^>g&Iho5m4BBq|P9c1H(SN zVzV5xXRGg2tU4Q{EN#7;bs#w%xhWV@m8xlMr0m*t9=j%9vL^A1*+k2ms#i_GAr&h~ z03--R9zlURl}L;!2aX5|lN-gjfcYCXx3hv5=-f zsZzhHB*bjp#Z7_H)XnQ9h}jv1lNwY0*#UzNHeUh^0T=^jr$n2D?+zUKp;HSQAn5?- zs)PG;zM6^O>!U83K3g@Z3P4rYYNC!*8R$)o@hWwy%DYu%yq6WxXd1-Sd6kcq4HCc+ zC5V8LQLCmbfX_@dSZDwlXlk7L5}joemQ$&G6~MX@HBF>Mw}yL@&+0(e z)PvMCu-G&J*knay6E}2P0D>K;{CCF2#s)`6N2ijil9Ch=9E3*rKLd(sTgAJ57mA8C zP^J2m)jKL9JTFDc>RshHXjOIeZV9w3mk{Bqa%-|lB;ceiU1_9vk z>eyTWV_JIk5js*GZQq#&;7Nr5l%NlOSOou)6Uc zmX%j+D%EH(JGN|t5mF4>MZgOS@I`|i&y;z#q5Fr%wZDGKS-Uap>!eB33Moy;tnPbtAOsxjSj9%4 z>^h~2kG8emRL1Q)ZD$xrjsk~Nb9b+SoU>s;ND%p~pLpVlxEYJz!hizBfF{R5n-X%a zI9sj)d+z_)7~oA)RH}g5G=Hm3-|r^I(QQqz+!&X{Ib!iQwuff-DQpjIS7CLNC)2=T zNd$eMBI-ZoVNu6V%Ng%FCBz>;(tkUz?jm#x#6pj~- zJ$sOFjydH#^SNiwp3$7Tq}T@pFOQa9RnS3))~;*Cp#h}-RID8+9P8^WdQ_ z!RVMH-s72+nk8_cZpoz|nBizndH@P7xz+O8%=+{R|Ej}Q7xrg1ueNGV1_KbR3;OBA z*=L_Ui2bpB`}PPB0!lQzTa=-suo$Ws*P)*_^~BIaqU0jxDF|{=_%s)*Ons^{;G67v zo7-Zo8w0r;_jXS0X(Ab#s9EWA!PJoO0Dz_dAajA8!T+epRA(1B!kmuo-o1OoRstR+ zJ;L?I12g29;C(nC{&9cU`Pk3DhVReGs=|2z2rj2;VZ^1IjlLJN* zS8|!OY_d$ZTNSIU0Ct-H=J$h?D_2o*?VHYL%ond{27n030XS00K?4+_&v>}@cz7M- z20r>KUU6>I zrcF_5Fz5kH(MFL^9dVA>X7aF4kScH~iTrdgja)v~Y;&!;S;yhQQWe)}5^QXuYBe#^ zn@SE3dI5t&bWpLLeDX;KH4eH|EGB|Ix>3F8!z2J8 zCIpGYB%%Lmr&c(dfRfu+y)3fcRC+XdZ4z|L*+xy>*|~Kj-Nr)7?x`)a{l1PV0F_(C zXGnIr=9ve8fh+fkC!QDy3~?d{4kSjH%TXO7e0QV(83Ra2k-1W<<{coYN{RQ1fgK7z z^l$*k!NB>40^u*Y_10StUU0z$OE+)cJj_4?45S8NVFP=l1`>wJfivM>$7bRB00<8X z`YwP$ywit?;?TzTn)oyuxNO_ys;!rEo~zvdO`Ql$ws&sA{by4d(dVsk_>E3;YO3}` zl;=vDYBJ8u2Szq3RhYMNQguBzOv+Co2?8ia!ZBvjV?=6G=Ah3A@3BRS<5WCuUI3D2 z<`OBzbr%NaaNs&iNmS!p;QYh4-FDkZuq`IfKmYtCL6sU{@F8%(fb>9>0z6Cz6QK!| zJ%TEx{j-rU0Eb|e-~ASym{(M?bbrDeQJ1-3tF~s&eO9J=)#Vd)YrNMP<~~-W^43vIDQpOBm$ZMs2)=k<>20)C3IT{ahG->mB6fp2gh4~s2I816B1q48#bG*_g zd~ej;xC^s3Z@L*hEWO<*JcbEPk^C3ImQqs<*p4N#sLNkpK`!357k(h?~xoZJV1Cgi86xs zDm?cI-4kJ60FrVj6VW3<{W(O|rT{{~2ag8szQFyL1=VUvFw{H2$QwnfoOj-N0A(lu zg*51CgHQy7!~iHtpEr>oCs)R1N+e#r$|W#*qW1md-qen)Qb9b?`Yon&Qbb!nS8XTl zcfKtv(c^*b_hWBT)Z3@z=sHMc7=t`jJf|20eF)lx=NS)R8ABbm`^EL)UM<4_M`Czj zr0NquFt5~z&WE`gLn1BOE!Zp>aWoM4L7SWyJq^S>CJ`IJgDtW&9LvJw42Rdw%{SjX zdi(9Sj|L;Y6ON%^h)1x9(6KwzWJJn1=RGQcH$;^!>?KONA9$I8?$2|rG@&vzmeZYV zMU?)t)HYDkX4%>m57s80EB`!3=+g{D|BGQDX%icTvOE)E9HRM=f;?*PAr; zIocNi97m~6dhfsz4R7Y2=(yCV`2a^x*&t?z914bXOfRrt5Qd$^?2<6JO9KE71xd0L z+XRUcB*f6RZQIEHje6{+O`AF!H*OpZ2K^wf;kyIkyfnO8%EbaC0t*~bs+#=u+WxC* zrD2YP=hj}A^~-VhRPAX}7_M$5V`^sz3_7ppQI@T2FxhOD?-Wab0*o;BlTJEK8{QdE zj3P10Yzr?b1PZi=`2s{w1BAH^19ceHN@)Y~dj}u@h7kh__Q#Sy)RfAPK(T5VLk~av z@KgW`5@;-d1h910uU`*XIs_lXWDI!!eY%IaH_Y*t@hUDV+s1DVma0)@o~+a+$w{CT zd{s7xmlXclQ-b$gKXuXayz<<6AlWry{u7ddq(9;pNC~aSFhC4w%{caA62lnr>XQSA z2g_Iv6uknDUIa)SpDiW?7G4c8^aOn7hglmHCxBUqk#>Z!q9 zyLK`1fDM&vfWRYa*xI#gI~z7^AP6}SK-W?5QUou1#S?yNpGf)$RFXjIBb!9;Q}xV$ zo~lRcpK}p=yTaQe>2pdNFmTV+cjA*t&GYUOljG-MUV=&p?n)1E-yK8o=oo0mbTm@`9D6rTZweC-~H;P7QS5$AigV zM?my_JO~6#9jSxC_Sz6(Pq|&2CaoIbl&&Rv&7=~B_LLF@&B$gx#^hN_Bimj&Sl-l_ zc7v+Q3h33=4~65HNIV$~{vf3(0f8h3uLg`E`;24I|F2j20u(;yHT+M%!6%=5a$v`f z9n+OEAWloZ0~`dvIxAPM90&)J1{H0<)Q|`s4s#3)&ol|D5BvC&Cq8|a`b!}`D z4r~#k?Eq#_0D;&I4DnT;S#^x*bIBnJ)Xt@!A7vwPXqBC*Qh-1}n0BQn8L~b(FoFYVpmUaP zKB0w6b-7>t+J^e|!2ydcl2IM4ShN_>00s!%K;c0`AKrHa8mpW!Xy5DDcRB{XSWUx~ zpBc0gG&%rbrt`nOJ(M~TWOsvhM^Y(taM87__|6}PI0Yn7|{EkS8dv?HY1fwhizbT9>!#SyS*aC*V zpYWSrx?|h}#6WV?XAT5YWg8Raf{Y8f4K1`El&B$7w%6Ts2C>|fj)+xj=|wbjJ%Q#1DSb~jN;{^;$c#jN=7kE6fcgf)oOIp|fEMduBKMV%j*f`=SCppPh&eG(b z>D*QKf6lq5s;hgtXGXGQ&scT8?@sqr?z-o9Pq-%-N+}3h(1O;unZYXvTF?T31TAO* zK!O&u03bmNS^$us1uXzb(1I2KBxpek01~vI1po<7p!X=&_7O>s;vc!vQ8 zIb53~pEmZ(uy6G3qyImPy&&8qXaPVD+eQF*vJN08H97Vr*x!kLG4>JcH(~#tfQ;H( zv7d?kf3U}~zXiL6{mRLb^+Q&*ssL?O6*;} z<7oRT0gV4R;$k~woaV}X-h=&o?Dt~-3HB>|01C@J>Dc#U@5X+!fCJ=Obo~YL|K0!~ zlefT%_1qf~c?|ov1RS3f;y+bp{I`n2Pc1K>9oYX)2>B}6{$}i}>yG<@5cfRno!Fm| zdz~ga(tPX>3%HWlzvSa&)Q*<(bD~cXFcxCJRrVKy;R^tAs2dU43L!@NewzTKpNuMU z%xmk;`6KpU2!MVn+<@Av>yDcz;uCSFOR=|OAHx0s_6+tju%9Cwh5&c6oadSeU6T%R zsUzk5wm@qxF%3d@qQSo)sdsMIj!mJEyDe{~r0=Q@5Q&p>GSZ z_hSD5_K#s-FXGmJ3fCfi;|AL*Bx|0dk^) z^os~Z?bk9}|5M#Lq=X-X{c+(MuFh~{-EmLK%>y<0vNRL##< z3phxxd8u%f(*uA606AFtSqN%Z(OsDyL|h@UY5@D^L9dOFRp<|*5T7iTqW-$`NumC$ z%nE+rBK|pq2>6KLE&c zZ6p>wg}vevq1-lz{b|ta4(=KU0fbDg|4S5V`u=;F@psjoPn=~t=rs&eK=lErTCcXs zy$L8+`OaG>-05q=u|6am;(gdRV}BR+%LSZA%efn+f5~^9X9bkIgJGURetsbm$ITL7 zEJG#`B_L3B+{Kb@mAdnyA~um8vZHPvnQdvU<39vQ^W^wV4LFopcTWSV3yJ>LDLTzY zc@{%}W%#pf36?M*+C0h&;kxJ6B=2w$Tw?W@G1g;1Z`s5EInv}h!wP;1poRxDWjS5=O4oiU03O2<-&;lR1gbxNo9kf8isy26xq5v2GKXhF{J{Yw5tN6NYGHC=Do<#OKR(0CE8S2zuU zX$xo<61N%h9Q3^80zz&8D+PQ{_>K$9@1o$nzeThL@51vK@@y$9qT{@>JH_f9~L zC&x%~Zy%k;ahbZ`L~SYPRd{-y^>q_TM1Hf9>s6YJ8~K!V$vfTcqbc`2?5TU-w*5%9-6DfZ?H97`O}^vaB-?)B+eW}3 z=Rb1d+W=LsRvL(}f_4q3eYeX1fDe>k69Rb<`$Gbv4??Z8;_v02*MRo0eNc}3r4Sjl zWuQH4>A2rPt%KvMWjpoH$~JQK`2XbI_scbD|97F*S8o`;V6 zsP9|?_aEgw-7otoj{O|pF~`aFwZ8WiYA|lEk^isvO}2C7yeH*4E>Lff-+G_yUnkG+ zzNho#dA7GdIP9f7|yiTjjXZ ze8d4l2<~r*`+!bBB&Wmg2-s*pIUJtlBg*=B;yw=nA=cnHmlJ$bxPbq-l)Rrygn<85 zi1kzf%?ZADnv~z;_$HhB@$ipD#V6jn@4=-n@<@J}0EArgZ<4Y3mT+!5?%zO%96u<> ze^!9&zWc*U#B%+BiUN|aHrVI?9`U`TNZmdnrqe}?c#Uuint47cv(wc={FKb#Iyt6C z2KU`Euz!R74&Pw@AM76%AdL9#b-i4N8pUouPkDieG z{0X!hdRPc`2~?9Ts0Q!E|G(4VxV${mg$?fczlF09p`INc#$j)(*g*GFffDpYBJ?B)Y^{Bnh z_x(nZi=)CVN@A1273(A+_*+EwZq`Vg*(rUr2^Y-zwke+#%T-RxP>r{U%8Um-Lh*yv z@hQpm1n8fY3qFy=CG1B9NUKC-c(vTSKE2Lsg(!X^fV~!~-n|DJgHRN%Lyhy*R7wDPEdZZlSMrI zp@@QqH9-DBX1sU6#JFvL`?81tC(3t!+vihCT|!+bpRK-GZ;8(`vlFTztH+6D#cjvR zb!^c$piX&pTOU+o$+y&jg45o=O)~J~O>2>dN4JyQ4C;(Je)5By2t*4N8DZjpQbBj{Ltkl(V}XI=a(RP%%-eAc(a%8Kp$o_?@pQJ z{}%fzWX2+0;O9+dug{67^Bx)KulmH6J@Q;n`v`xNfHNcDqWzD^{!hrUSIND;D8J#Y za=ay?#x+ge;kmMQ5fQ7@HFBNr_>TF3m`d;UZTqZ%{7SK|Z4!|94HetudS#yu=lI6$ zexIS?8sU~s-J}^ezUTOpOg1lAh`@_ACjA_- zWRWtu0IC@V52S^KsNLMTKZ2RjJ|)CSGXG5wG;RkwCjG_gixu&)=;%SXUZU>0Gofu2 zJ*hu{#fwkGI@E1Ih-Vz8PGB%qBNj_*D2qh&m?`bQqz5ek$bL7iN>f}kCS zEr=)#TF?T31TAO*KxSe~z(jYIpanX}VcBTG?jrdlJ2oxOk!uCz;eCJbdIEqP&W#oh zztP}*(jwfo!RrYCayYlepaZPPBY<2e$b#lN{E=sCDR@NzKn~~jIspTjmB~fqG}-=O z18|UYpzA+H>nr4>N$&3cIP_jQh9V@%CHxi<(_9Z;^64Vi4RVnQ3kWIv_>o{J0)WiK zc7hN(`5BP|plkS`MN0B}a_e%?LL>P*Ev!5L0|Kgz0vuYDBv*QhQ=y`wd(V<9Ik|?AcPe=n9|hIGqPg<*PlakMNLMfn z0S7rK%{jQKFuXBg9LDOy0mZirzqBxl7zfYH(e0^`}^Fav%SD0aHmh z5$PoR~^!(_X(I z==$`Rg`1FTI$66YEcU%3BHcF0b?+8{P|(pQxRXwb!6lcZ z;r{#caQEFg$mJY}L<}Z?18lDK=;fk|Y?b%=LD{}m6n0k^p&~l}F5mm=X8(Dj^xr2O zi28#fy1h)e2Q>HK4Q8f_3W(Fgoh+yG^A`NF*%SySKvcITSKHu0-EWGXTi*-e_Qm zxJd*cvA{wpJshq@3vH+U%a%pp;)_#oa&8x{mvNOMrBXkK4F$>ZH)SNfYQ8iZ(pa zr=0g5$U7u%aORl_ciQXkcluNo-iXI?e+`pmKjQfr*ZzS&wGJwQCEoV@H|q;qIGeBf|e$oh9iZ z5reLm|4E_#g-`EzNW>_zdfh2pf|PX%IenGyI<&U(1+j?D7eKC&eY-`(B3G7O0+^BM zJTQqzMA(ZLN8swKJ8^O`_FF`v35h^O?}^65ag_ItM@AeV+Un^E!86a4;O3jhVe8g1 z-cuut-Z6pfU<2l0M-Lr&etLvz|NgzxcA;1i(kXTHg4C~o2|{Y zM9rHQhBMAcu+BmH22DQChjLAzq4!5)N8f4e2rLghgq#~Eq|BIeP=NBH1_*(IX8PsJ zqwvy~rcmiKVE+8@1kvdE7))2O92~S6C?tN7TABqEX7J9&Ezz@y^uC| z8YBYf=%@`(JW*uviuK?{mQ5YI_ zSm`J6_`2&d!nuvZ7a&Ar#O6;sEx|Ji=?e=NhF|d6ZF2ETv9fvZy?KxKXbZz8118T>0T}6$fhUc;b!Jf9qR ze*rSEy8x{n5lG?$>HbF20e|p=5!PGi_e^&pdQkx6yu~S=$y!=Wc-!0B*_=p3;Bt%^ zZT9mK>9%cUxa+PQa~9$-nn+2cF__Rve>(5HB>#W+-C2~mE3BZ>HE3d>MzbWfxpTwV zLrfS$L$*gewB|t9S+gbqyLOe?h(M-TY6RGL+=NWV=3|pdlg+VbpRG9t0cNJJg8Kmy z#oyvSEB)?$`)s)N)^T|F;R1`^(-CX$*q)vJ0D0;1G@N*149-0_$(AMp%WP~eP)JW9 zv8zyUU<{SbM8f3XMYA`pN>d}TVf*$n|5iGuw>QMZuxF26FCgW)wbkT>x81wT9_OL8 z1p)|NlfXrbcLM_&5Tv7#Sh{ath5x6;JGw44;uy1`H3NuiU8ISICKeLCro%;E|MBg! zA0WT~)?!q?L(iK9<@wN4XdsEuiCfS+bzLvqg*8_xt%_LmyNwzVi;i_gF~8x$@6zE~ zf?VRF{qFy>(cNP*fcSwjT@mY~%Qqa<=X*g`(rI?38TG}|h=8j)lWIx`B<|F0ouF&E zdc^eZRjbduSlbH;dh>Am!9fe!j0Z^2f))TIXhC}sv>>AJAQ(D8NBhycBtI$2hZT|k z!}4j#cT4t@jF})EeY(qFs``=TPsNiPC3T?XeMdfNKlyLD1%jv-echI0?O@mffE+C1 z4}*3`PYZFoAZXQ}%EF__1B~ogA$g~UbW^&4N_t30-10OqN109|F0Lj#g)$7IhNun0 zBXVV${GHCi;}8JUmG}Jgoor?m7dZGV{2f0DY~(FmkWPT3mA0G!O$7i6n%j~>_ymL= zq>XkB3>6WMfZcEj-crgWphWQ#J4BQNVdbcpU4gXYsC1>GTJ4HTI<`&!hwO?IaU9!F zwi9-gV)Htk<2ZON!@yGwy)w=uj})#vr%N&(E5kBM#5c4Vl=qeJGWbM>jZa0y?3kvJ zu`Ht)i5eLMN+A?7#-sQh0aU?WHZ7x!pQVrm^jQptp-5I~I+uY3eEl+RAv+pgpF4RA zQ!LA<04Ey&FgR5H#T~rK}z#NF;bj zA<-ml$7n+WPa$Q8kl;h$IEE&0y}n_P4_Da4nO@hgG)%XSrJ=ub(2B{lt^^6*`AQ$E zw>uJR;mG<5cH80qsZ}bD-iH6%6}@k46t^iICg8Z&)rZ@Th+cT>v2fTJ#Yf3mA;^bA z_aY`(?b<7+!DO2b>H%w+dbXKxP0S+K@yRA%V3a zrL-|P3^Rtr8#l~QB4ovTOe?t%jBqy!EG;Mvbt}hc$K#PZC{4wB6%b4!YNVJ@I0m6e z3@rQ%7D~xt(e5jk94I5m zN(BXlEK>adqJS1~9i!wpW*<5Ll4}gkx<8f))e=evh{x7!pYM)Kl2w3<&(A3EovZ7*Be|oaG^h$Xu4wiP&oZ zAcW7;yB{q6{Yrzv-Ot>`_U*TMzv0PWHiD-t$0C3jNW@BTJN^$2`Gb`ZFxbmE?0MW& zgiPuTy~(87f?Q@e zo=`i(VKt1Pp^|WW@KJVR-v!mwMgc%xU@kES2?RwZXC6{$k7b3sL*e8CBs-Xv`gUC z?W`ATg5~q7gx`om>>ofHoI@aS0itXH5kV%zT00N3>42&5_n643EL40VuH2=(dypF9 zC=D=W7ZE(zOGOmbicrjEki(2Zv5+&0xomqrmuoK-N=wE^oYUyO$c@L5X%5C>#^zYu z*cyweEhw^WHchn!cW=VJV>T-Nvm77_XMTm8KplYtv>+4;_eG-Vm62Hcu{hKB7*?_s zNaR5^!bHN4#CsuPLgWseNF-_I4va5D&&(vcfIBmj+)vg~rCcMCCl1vTzPsP? zj(dUMOSQYt>VZmsy4?dKb0tSl0IVt@7Y$oHQA7*}k}X}lkKT`i+=sYKsgQ$QW*GA0 z2%hn=R3V>D6|-t7158?MbAKN0Ui-6uHi$hM^wBYj2%RIksjaK*$1wTtY23 z4deK5IJPnpZ8;_s>sT6!cJ!H{lxarV5CA<8igrV+WifM!NSqQApzdvIj^LoE0m>Ce zd;su$KYXp6E>~gefKL>(^)}>6;bY-e=m_MqI<^V`@|?%RvD-~U{Y^BQ zcvU<-|I}E^5sR#74@ytH42l?vOb8ZKs9V7d#kClL9D=*I!0ZHseMm8**re%Eyo)JsSYzz&HkK2ln5@5-smY zcOG+ov~^Vyb#Jhu9SDf|C_XJhfOLUrM%j8p)*9uMYLx1ry>Nh0vQ`sI#c{l%(AtrP z%-{%&4rQQR$XX)EQMtIktjl?ghP~N)jDXiimRYhkZg^k z_|*e@wmL96SRhY;IhmpI_ha)zuMnH|;SG=_E7Fb4Q>FpCw`U@e=#pQw%scbUP;43N z7%e@g;%B$KWjo*$v%HaF9*%^evoD5v2|yVIfO0`yqHN54NlnxGd$PF?3_Tvngv{f z9TUhO%^|<9EQ(QM_&JV3KuIsoVvnc#pl8wL(6R7R9PblgtK^*Gz6U||9*eAZ44l%vV3gXy3e87u(ueOpC2>iLeW3!d%nS~}xL{Wl1VAMZ zc6pqEVVASo3)!iNv!ns>^djh3Z~=5Ly#ivXB{3w?zIYO^iul3@5DNqBd}o?%%u!6M1;ASY*V?|!K2o&n%l!(9~mvsvN*1<|3V6lAw3cxcdH}Ga};tUmWE1{T@9QHhpM?pA5 zo<%4J|93r@$uEmIh653t5yz)$}utw3_PYV`WWna>KCx(;p@P} z>qlDDxEZl#)Zok*fEZ>3a+zoQcR%(|W6AC{>GYfnIDW~pI&ipXAO>(ycHyKnf`c&3 zaSrU34H?|N8#w%w**v*)M>S_bam=(hHj1xr8c76FOgIksz*F_a)v+5@S8{Rlo!v9P ze!=q1A1?3aZ*YC9bc~2&=dl<0(?-$9aSECfpps2ao`$&M^O6O}mmsHbEQ&Ql@o6a} z+Kz#i?&BfVxeE1+IpQFy8(FVLci#iU+iybQ;0ef%4)fTVAsVBKIn!K%W(+{cU1WUV zq3zDl?IW43zfLE<;*B8kqrcg%${f7U5VHa0csVvCF9pGg!z>NQ0<7yGiEF zY9~5!UH8$qVIXHQDB>@Un+ZT+-o~8AObF*OIR-=rK}oe2`o9KDAchv{Y?aRr6UTX8(5gf3pf=!_h%n?sM=lLi9XUm&GrwES}3{CU#PoH8&_}MVdf? z|Fd}HRD2VJ>k4n{Ny)bHSQ8cSC~}BiFynpD+O{0xZ7U(wz7mpc3n3h-wLF%KBaj__ z1~Pjdgt7jIAUFC9zODkaw6(C6(lBx}c6ymXN;<`DM=UGcYTA_|7|E9+

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

    +

    Методика выбора информационной базы для начала создания обмена

    +

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

    +
    • Если настраивается обмен данными только между двумя информационными базами (топология обмена «один к одному»), то в качестве первой информационной базы следует выбирать базу с наименьшим наполнением данных относительно двух баз (эта рекомендация не является обязательной и служит для оптимизации выполнения первого обмена данными); +
    • Если настраивается обмен данными между несколькими информационными базами одна из которых является главной, а другие подчиненными (топология обмена «один ко многим»), то в качестве первой информационной базы следует выбирать главную базу в не зависимости от степени наполнения этой базы (эта рекомендация является обязательной).


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

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

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


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

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

    +

    Особенности настройки обмена в клиент-серверном варианте

    +

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

    \ 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..8fb7101b3 --- /dev/null +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ObjectModule.bsl @@ -0,0 +1,654 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРИКЛАДНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ МАСТЕРА +//////////////////////////////////////////////////////////////////////////////// + +// Соответствие ошибок исключений и представлений этих ошибок в прикладном выражении. +// Для чтения этого поля предназначена функция ОшибкиИсключений() +Перем СоответствиеОшибок; + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ + +// Выполняет выгрузку параметров помощника во временное хранилище для продолжения настройки обмена во второй базе +// +// Параметры: +// Отказ – Булево – флаг отказа; поднимается в случае возникновения ошибок при работе процедуры +// АдресВременногоХранилища – Строка – при успешной выгрузке xml-файла с настройками +// в эту переменную записывается адрес временного хранилища, +// по которому будут доступны данные файла на сервере и на клиенте +// +Процедура ВыполнитьВыгрузкуПараметровМастера(Отказ, АдресВременногоХранилища) Экспорт + + // получаем имя временного файла в локальной ФС на сервере + ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml"); + + Попытка + + ЗаписьXML = Новый ЗаписьXML(); + ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла, "UTF-8"); + + Исключение + ОбменДаннымиСервер.СообщитьОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), Отказ); + ЗаписьXML = Неопределено; + Возврат; + КонецПопытки; + + Попытка + + ЗаписьXML.ЗаписатьОбъявлениеXML(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("ПараметрыНастройки"); + + ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsd", "http://www.w3.org/2001/XMLSchema"); + ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance"); + ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/data"); + + // выгрузка параметров мастера + ЗаписьXML.ЗаписатьНачалоЭлемента("ОсновныеПараметрыОбмена"); + ВыгрузитьПараметрыМастера(ЗаписьXML); + ЗаписьXML.ЗаписатьКонецЭлемента(); // ОсновныеПараметрыОбмена + + Если ИспользоватьПараметрыТранспортаEMAIL Тогда + + ЗаписьXML.ЗаписатьНачалоЭлемента("УчетнаяЗаписьЭлектроннойПочты"); + ЗаписатьXML(ЗаписьXML, ?(ЗначениеЗаполнено(EMAILУчетнаяЗапись), EMAILУчетнаяЗапись.ПолучитьОбъект(), Неопределено)); + ЗаписьXML.ЗаписатьКонецЭлемента(); // УчетнаяЗаписьЭлектроннойПочты + + КонецЕсли; + + ЗаписьXML.ЗаписатьКонецЭлемента(); // ПараметрыНастройки + + Исключение + ОбменДаннымиСервер.СообщитьОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), Отказ); + КонецПопытки; + + ЗаписьXML.Закрыть(); + ЗаписьXML = Неопределено; + + АдресВременногоХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла)); + + УдалитьВременныйФайл(ИмяВременногоФайла); + +КонецПроцедуры + +// Выполняет загрузку параметров помощника из временного хранилища для продолжения настройки обмена во второй базе +// +// Параметры: +// Отказ – Булево – флаг отказа; поднимается в случае возникновения ошибок при работе процедуры +// АдресВременногоХранилища – Строка – адрес временного хранилища с данными xml-файла для загрузки +// +Процедура ВыполнитьЗагрузкуПараметровМастера(Отказ, АдресВременногоХранилища) Экспорт + Перем СтруктураНастроек; + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища); + + // получаем имя временного файла в локальной ФС на сервере + ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml"); + + // получаем файл для считывания + ДвоичныеДанные.Записать(ИмяВременногоФайла); + + ПрочитатьПараметрыВСтруктуру(Отказ, ИмяВременногоФайла, СтруктураНастроек); + + // удаляем временный файл + УдалитьВременныйФайл(ИмяВременногоФайла); + + Если СтруктураНастроек = Неопределено Тогда + Возврат; + КонецЕсли; + + // выполняем проверку зачитанных параметров из файла + Если СтруктураНастроек.Свойство("ИмяПланаОбмена") + И СтруктураНастроек.ИмяПланаОбмена <> ИмяПланаОбмена Тогда + + ОбменДаннымиСервер.СообщитьОбОшибке(НСтр("ru = 'Файл содержит настройки обмена для другой информационной базы!'"), Отказ); + + КонецЕсли; + + Если Не Отказ Тогда + + // заполняем свойства обработки значениями из файла + ЗаполнитьЗначенияСвойств(ЭтотОбъект, СтруктураНастроек); + + УчетнаяЗаписьЭлектроннойПочты = Неопределено; + + Если СтруктураНастроек.Свойство("УчетнаяЗаписьЭлектроннойПочты", УчетнаяЗаписьЭлектроннойПочты) + И УчетнаяЗаписьЭлектроннойПочты <> Неопределено Тогда + + УчетнаяЗаписьЭлектроннойПочты.Записать(); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Выполняет действия при создании нового обмена данными: +// - создает или обновляет узлы текущего плана обмена +// - загружает правила конвертации данными из макета текущего плана обмена (если НЕ РИБ) +// - загружает правила регистрации данными из макета текущего плана обмена +// - загружает настройки транспорта сообщений обмена +// - устанавливает значение константы префикса информационной базы (если не задано) +// - выполняет регистрацию всех данных на текущем узле плана обмена с учетом правил регистрации объектов +// +// Параметры: +// Отказ – Булево – флаг отказа; поднимается в случае возникновения ошибок при работе процедуры +// +Процедура ВыполнитьДействияПоНастройкеНовогоОбменаДанными(Отказ, НастройкаОтборовНаУзле, ЗначенияПоУмолчаниюНаУзле) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + НачатьТранзакцию(); + Попытка + + // создаем новый узел + СоздатьОбновитьУзлыПланаОбмена(НастройкаОтборовНаУзле, ЗначенияПоУмолчаниюНаУзле); + + // загружаем правила конвертации + Если Не ЭтоНастройкаРаспределеннойИнформационнойБазы + И ОбменДаннымиПовтИсп.ЕстьМакетПланаОбмена(ИмяПланаОбмена, "ПравилаОбмена") Тогда + + ОбменДаннымиСервер.ЗагрузитьПравилаДляОбменаДанными(Отказ, ИмяПланаОбмена, "ПравилаКонвертацииОбъектов", "ПравилаОбмена"); + + КонецЕсли; + + // загружаем правила регистрации + Если ОбменДаннымиПовтИсп.ЕстьМакетПланаОбмена(ИмяПланаОбмена, "ПравилаРегистрации") Тогда + + ОбменДаннымиСервер.ЗагрузитьПравилаДляОбменаДанными(Отказ, ИмяПланаОбмена, "ПравилаРегистрацииОбъектов", "ПравилаРегистрации"); + + КонецЕсли; + + // загружаем настройки транспорта сообщений + ОбновитьНастройкиТранспортаСообщенийОбмена(); + + // обновляем значение константы префикса ИБ + Если Не ПрефиксИнформационнойБазыИсточникаУстановлен Тогда + + ОбновитьЗначениеКонстантыПрефиксаИнформационнойБазы(); + + КонецЕсли; + + Исключение + + СообщитьИнформациюОбОшибке(ИнформацияОбОшибке(), Отказ); + + КонецПопытки; + + Если Отказ Тогда + + ОтменитьТранзакцию(); + + Возврат; + + Иначе + ЗафиксироватьТранзакцию(); + КонецЕсли; + + Если Не ЭтоНастройкаРаспределеннойИнформационнойБазы Тогда + + // обновляем повторно используемые значения МРО + ОбменДаннымиСобытия.ОбновитьПовторноИспользуемыеЗначенияМРОПриНеобходимости(); + + // выполняем регистрацию изменений на узле плана обмена + ЗарегистрироватьИзмененияДляОбмена(); + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +Процедура СоздатьОбновитьУзлыПланаОбмена(НастройкаОтборовНаУзле, ЗначенияПоУмолчаниюНаУзле) + + МенеджерПланаОбмена = ПланыОбмена[ИмяПланаОбмена]; + + // ПРЕДОПРЕДЕЛЕННЫЙ УЗЕЛ + + // получение ссылки на предопределенный узел плана обмена + ЭтотУзел = МенеджерПланаОбмена.ЭтотУзел(); + + Если ВариантРаботыМастера = "ПродолжитьНастройкуОбменаДанными" Тогда + + Если ЭтотУзел.Код <> КодПредопределенногоУзла Тогда + + ЭтотУзелОбъект = ЭтотУзел.ПолучитьОбъект(); + + ЭтотУзелОбъект.Код = КодПредопределенногоУзла; + ЭтотУзелОбъект.Наименование = ?(ПустаяСтрока(ЭтотУзелОбъект.Наименование),"Эта информационная база", ЭтотУзелОбъект.Наименование); + + ЭтотУзелОбъект.Записать(); + + КонецЕсли; + + Иначе + + // проверка заполнения обязательных полей предопределенного узла + Если ПустаяСтрока(ЭтотУзел.Код) Тогда + + ЭтотУзелОбъект = ЭтотУзел.ПолучитьОбъект(); + + ЭтотУзелОбъект.Код = "000"; + ЭтотУзелОбъект.Наименование = ?(ПустаяСтрока(ЭтотУзелОбъект.Наименование),"Эта информационная база", ЭтотУзелОбъект.Наименование); + + ЭтотУзелОбъект.Записать(); + + КонецЕсли; + + + КонецЕсли; + + // УЗЕЛ ДЛЯ ОБМЕНА + + Если ВариантРаботыМастера = "ПродолжитьНастройкуОбменаДанными" Тогда + + НовыйУзелСсылка = МенеджерПланаОбмена.НайтиПоКоду(КодНовогоУзла); + + Если НовыйУзелСсылка.Пустая() Тогда + НовыйУзел = МенеджерПланаОбмена.СоздатьУзел(); + Иначе + НовыйУзел = НовыйУзелСсылка.ПолучитьОбъект(); + КонецЕсли; + + НовыйУзел.Код = КодНовогоУзла; + + Иначе + + // создание нового узла плана обмена + НовыйУзел = МенеджерПланаОбмена.СоздатьУзел(); + НовыйУзел.УстановитьНовыйКод(); + + КонецЕсли; + + // установка значений отборов на новом узле + УстановитьЗначенияОтборовНаУзле(НовыйУзел, НастройкаОтборовНаУзле); + + // установка значений по умолчанию на новом узле + УстановитьЗначенияПоУмолчаниюНаУзле(НовыйУзел, ЗначенияПоУмолчаниюНаУзле); + + Если Не (ВариантРаботыМастера = "ПродолжитьНастройкуОбменаДанными" + И ЭтоНастройкаРаспределеннойИнформационнойБазы) Тогда + + НовыйУзел.Наименование = НаименованиеНастройкиВыполненияОбмена; + + КонецЕсли; + + // сбрасываем счетчики сообщений + НовыйУзел.НомерОтправленного = 0; + НовыйУзел.НомерПринятого = 0; + + НовыйУзел.Записать(); + + УзелИнформационнойБазы = НовыйУзел.Ссылка; + +КонецПроцедуры + +Процедура ОбновитьНастройкиТранспортаСообщенийОбмена() + + СтруктураЗаписи = Новый Структура; + СтруктураЗаписи.Вставить("Узел", УзелИнформационнойБазы); + СтруктураЗаписи.Вставить("ВидТранспортаСообщенийОбменаПоУмолчанию", ВидТранспортаСообщенийОбмена); + + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "EMAILМаксимальныйДопустимыйРазмерСообщения"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "EMAILСжиматьФайлИсходящегоСообщения"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "EMAILУчетнаяЗапись"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FILEКаталогОбменаИнформацией"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FILEСжиматьФайлИсходящегоСообщения"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FTPСжиматьФайлИсходящегоСообщения"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FTPСоединениеМаксимальныйДопустимыйРазмерСообщения"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FTPСоединениеПароль"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FTPСоединениеПассивноеСоединение"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FTPСоединениеПользователь"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FTPСоединениеПорт"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "FTPСоединениеПуть"); + ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, "ПарольАрхиваСообщенияОбмена"); + + // добавляем запись в РС + РегистрыСведений.НастройкиТранспортаОбмена.ДобавитьЗапись(СтруктураЗаписи); + +КонецПроцедуры + +Процедура ДополнитьСтруктуруЗначениемРеквизита(СтруктураЗаписи, ИмяРеквизита) + + СтруктураЗаписи.Вставить(ИмяРеквизита, ЭтотОбъект[ИмяРеквизита]); + +КонецПроцедуры + +Процедура ОбновитьЗначениеКонстантыПрефиксаИнформационнойБазы() + + ЗначениеДоОбновления = ПолучитьФункциональнуюОпцию("ПрефиксИнформационнойБазы"); + + Если ЗначениеДоОбновления <> ПрефиксИнформационнойБазыИсточника Тогда + + Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Установить(СокрЛП(ПрефиксИнформационнойБазыИсточника)); + + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаполнитьТаблицуУзлаПланаОбмена(Узел, СтруктураТабличнойЧасти, ИмяТаблицы) + + ТаблицаУзла = Узел[ИмяТаблицы]; + + ТаблицаУзла.Очистить(); + + Для Каждого Элемент ИЗ СтруктураТабличнойЧасти Цикл + + ОбменДаннымиСервер.УстановитьКоличествоСтрокТаблицы(ТаблицаУзла, Элемент.Значение.Количество()); + + ТаблицаУзла.ЗагрузитьКолонку(Элемент.Значение, Элемент.Ключ); + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗарегистрироватьИзмененияДляОбмена() + + // получаем таблицу метаданных состава плана обмена + МетаданныеДляРегистрации = Новый ТаблицаЗначений; + МетаданныеДляРегистрации.Колонки.Добавить("ОбъектМетаданных"); + МетаданныеДляРегистрации.Колонки.Добавить("АвтоРегистрация", Новый ОписаниеТипов("АвтоРегистрацияИзменений")); + + Для Каждого ЭлементСостава ИЗ Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав Цикл + + СтрокаТаблицы = МетаданныеДляРегистрации.Добавить(); + + СтрокаТаблицы.ОбъектМетаданных = ЭлементСостава.Метаданные; + СтрокаТаблицы.АвтоРегистрация = ЭлементСостава.АвтоРегистрация; + + КонецЦикла; + + // удаляем всю регистрацию изменений + ПланыОбмена.УдалитьРегистрациюИзменений(УзелИнформационнойБазы); + + // выполняем регистрацию изменений для отобранных объектов метаданных + Для Каждого СтрокаТаблицы ИЗ МетаданныеДляРегистрации Цикл + + Если Не АвтоРегистрацияРазрешена(СтрокаТаблицы) + И (ЭтоДокумент(СтрокаТаблицы.ОбъектМетаданных) + ИЛИ ЭтоСправочник(СтрокаТаблицы.ОбъектМетаданных)) Тогда + + // для Справочников и Документов регистрацию выполняем с учетом ПРО + ЗарегистрироватьИзмененияПоПравиламРегистрации(СтрокаТаблицы.ОбъектМетаданных); + + Иначе + + // регистрацию выполняем для всех объектов ИБ одного типа + ПланыОбмена.ЗарегистрироватьИзменения(УзелИнформационнойБазы, СтрокаТаблицы.ОбъектМетаданных); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗарегистрироватьИзмененияПоПравиламРегистрации(ОбъектМетаданных) + + ТекстЗапроса = " + |ВЫБРАТЬ + | Ссылка + |ИЗ + | " + ОбъектМетаданных.ПолноеИмя() + " + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + ОбъектДанных = Выборка.Ссылка.ПолучитьОбъект(); + + // определяем массив узлов для регистрации объекта + МассивУзловДляРегистрацииОбъекта = ОбменДаннымиСобытия.ОпределитьПолучателейПриРегистрацииДанных(ОбъектДанных, ОбъектМетаданных, ИмяПланаОбмена); + + НомерВМассиве = МассивУзловДляРегистрацииОбъекта.Найти(УзелИнформационнойБазы); + + Если НомерВМассиве <> Неопределено Тогда + + // объект прошел фильтр ПРО; выполняем регистрацию на узле + ПланыОбмена.ЗарегистрироватьИзменения(УзелИнформационнойБазы, ОбъектДанных); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура УстановитьЗначенияОтборовНаУзле(УзелПланаОбмена, НастройкаОтборовНаУзле) + + Для Каждого НастройкаОтбора ИЗ НастройкаОтборовНаУзле Цикл + + Если ТипЗнч(НастройкаОтбора.Значение) = Тип("Структура") Тогда + + ЗаполнитьТаблицуУзлаПланаОбмена(УзелПланаОбмена, НастройкаОтбора.Значение, НастройкаОтбора.Ключ); + + Иначе // примитивные типы + + УзелПланаОбмена[НастройкаОтбора.Ключ] = НастройкаОтбора.Значение; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура УстановитьЗначенияПоУмолчаниюНаУзле(УзелПланаОбмена, ЗначенияПоУмолчаниюНаУзле) + + Для Каждого Настройка ИЗ ЗначенияПоУмолчаниюНаУзле Цикл + + УзелПланаОбмена[Настройка.Ключ] = Настройка.Значение; + + КонецЦикла; + +КонецПроцедуры + +// + +Процедура ПрочитатьПараметрыВСтруктуру(Отказ, ИмяФайла, СтруктураНастроек) + + Попытка + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.ОткрытьФайл(ИмяФайла); + Исключение + Отказ = Истина; + ЧтениеXML = Неопределено; + Возврат; + КонецПопытки; + + Попытка + + ЧтениеXML.Прочитать(); // ПараметрыНастройки + ЧтениеXML.Прочитать(); // ОсновныеПараметрыОбмена + + // зачитываем узел ОсновныеПараметрыОбмена + СтруктураНастроек = СчитатьДанныеВСтуктуру(ЧтениеXML); + + Если СтруктураНастроек.Свойство("ИспользоватьПараметрыТранспортаEMAIL", ИспользоватьПараметрыТранспортаEMAIL) + И ИспользоватьПараметрыТранспортаEMAIL Тогда + + // зачитываем узел УчетнаяЗаписьЭлектроннойПочты + ЧтениеXML.Прочитать(); // УчетнаяЗаписьЭлектроннойПочты {НачалоЭлемента} + + СтруктураНастроек.Вставить("УчетнаяЗаписьЭлектроннойПочты", ПрочитатьXML(ЧтениеXML)); + + ЧтениеXML.Прочитать(); // УчетнаяЗаписьЭлектроннойПочты {КонецЭлемента} + + КонецЕсли; + + Исключение + Отказ = Истина; + КонецПопытки; + + ЧтениеXML.Закрыть(); + ЧтениеXML = Неопределено; + +КонецПроцедуры + +Функция СчитатьДанныеВСтуктуру(ЧтениеXML) + + // возвращаемое значение функции + Структура = Новый Структура; + + Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда + + ВызватьИсключение НСтр("ru = 'Ошибка чтения XML'"); + + КонецЕсли; + + ЧтениеXML.Прочитать(); + + Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента Цикл + + ИмяУзла = ЧтениеXML.Имя; + + Структура.Вставить(ИмяУзла, ПрочитатьXML(ЧтениеXML)); + + КонецЦикла; + + ЧтениеXML.Прочитать(); + + Возврат Структура; + +КонецФункции + +Процедура ВыгрузитьПараметрыМастера(ЗаписьXML) + + ДобавитьЗаписьXML(ЗаписьXML, "ИмяПланаОбмена"); + ДобавитьЗаписьXML(ЗаписьXML, "НаименованиеНастройкиВыполненияОбмена"); + + ЗаписатьXML(ЗаписьXML, ПланыОбмена[ИмяПланаОбмена].ЭтотУзел().Код, "КодНовогоУзла", НазначениеТипаXML.Явное); + ЗаписатьXML(ЗаписьXML, УзелИнформационнойБазы.Код, "КодПредопределенногоУзла", НазначениеТипаXML.Явное); + + // настройки транспорта сообщений обмена + ДобавитьЗаписьXML(ЗаписьXML, "ВидТранспортаСообщенийОбмена"); + ДобавитьЗаписьXML(ЗаписьXML, "ПарольАрхиваСообщенияОбмена"); + + Если ИспользоватьПараметрыТранспортаEMAIL Тогда + + ДобавитьЗаписьXML(ЗаписьXML, "EMAILМаксимальныйДопустимыйРазмерСообщения"); + ДобавитьЗаписьXML(ЗаписьXML, "EMAILСжиматьФайлИсходящегоСообщения"); + ДобавитьЗаписьXML(ЗаписьXML, "EMAILУчетнаяЗапись"); + + КонецЕсли; + + Если ИспользоватьПараметрыТранспортаFILE Тогда + + ДобавитьЗаписьXML(ЗаписьXML, "FILEКаталогОбменаИнформацией"); + ДобавитьЗаписьXML(ЗаписьXML, "FILEСжиматьФайлИсходящегоСообщения"); + + КонецЕсли; + + Если ИспользоватьПараметрыТранспортаFTP Тогда + + ДобавитьЗаписьXML(ЗаписьXML, "FTPСжиматьФайлИсходящегоСообщения"); + ДобавитьЗаписьXML(ЗаписьXML, "FTPСоединениеМаксимальныйДопустимыйРазмерСообщения"); + ДобавитьЗаписьXML(ЗаписьXML, "FTPСоединениеПароль"); + ДобавитьЗаписьXML(ЗаписьXML, "FTPСоединениеПассивноеСоединение"); + ДобавитьЗаписьXML(ЗаписьXML, "FTPСоединениеПользователь"); + ДобавитьЗаписьXML(ЗаписьXML, "FTPСоединениеПорт"); + ДобавитьЗаписьXML(ЗаписьXML, "FTPСоединениеПуть"); + + КонецЕсли; + + ДобавитьЗаписьXML(ЗаписьXML, "ИспользоватьПараметрыТранспортаEMAIL"); + ДобавитьЗаписьXML(ЗаписьXML, "ИспользоватьПараметрыТранспортаFILE"); + ДобавитьЗаписьXML(ЗаписьXML, "ИспользоватьПараметрыТранспортаFTP"); + +КонецПроцедуры + +Процедура ДобавитьЗаписьXML(ЗаписьXML, ИмяРеквизита) + + ЗаписатьXML(ЗаписьXML, ЭтотОбъект[ИмяРеквизита], ИмяРеквизита, НазначениеТипаXML.Явное); + +КонецПроцедуры + +Процедура УдалитьВременныйФайл(ИмяВременногоФайла) + + Попытка + + Если Не ПустаяСтрока(ИмяВременногоФайла) Тогда + + УдалитьФайлы(ИмяВременногоФайла); + + КонецЕсли; + + Исключение + КонецПопытки; + +КонецПроцедуры + +// + +Функция ЭтоДокумент(ОбъектМетаданных) + + Возврат ОбменДаннымиСервер.ЭтоДокумент(ОбъектМетаданных); + +КонецФункции + +Функция ЭтоСправочник(ОбъектМетаданных) + + Возврат ОбменДаннымиСервер.ЭтоСправочник(ОбъектМетаданных); + +КонецФункции + +Функция АвтоРегистрацияРазрешена(Элемент) + + Возврат Элемент.АвтоРегистрация = АвтоРегистрацияИзменений.Разрешить; + +КонецФункции + +// + +Процедура СообщитьИнформациюОбОшибке(ИнформацияОбОшибке, Отказ) + + ПолучитьПервуюИнформациюОбОшибке(ИнформацияОбОшибке); + + ОписаниеОшибки = ОшибкиИсключений().Получить(ИнформацияОбОшибке.Описание); + + Если ОписаниеОшибки = Неопределено Тогда + + ОписаниеОшибки = ИнформацияОбОшибке.Описание; + + КонецЕсли; + + ОбменДаннымиСервер.СообщитьОбОшибке(ОписаниеОшибки, Отказ); + +КонецПроцедуры + +Процедура ПолучитьПервуюИнформациюОбОшибке(ИнформацияОбОшибке) + + Если ИнформацияОбОшибке.Причина <> Неопределено Тогда + + ИнформацияОбОшибке = ИнформацияОбОшибке.Причина; + + ПолучитьПервуюИнформациюОбОшибке(ИнформацияОбОшибке); + + КонецЕсли; + +КонецПроцедуры + +Функция ОшибкиИсключений() + + Если СоответствиеОшибок = Неопределено Тогда + + ИнициализацияОшибокИсключений(); + + КонецЕсли; + + Возврат СоответствиеОшибок; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ИНИЦИАЛИЗАЦИИ + +Процедура ИнициализацияОшибокИсключений() + + СоответствиеОшибок = Новый Соответствие; + СоответствиеОшибок.Вставить("Значение поля ""Код"" не уникально", НСтр("ru = 'В этой информационной базе уже настроен обмен. Удалите предыдущую настройку обмена.'")); + +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo new file mode 100644 index 000000000..2a9743acd --- /dev/null +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo @@ -0,0 +1,411 @@ + + + + + + + ПомощникСозданияОбменаДанными + + ru + Помощник создания обмена данными + + DataProcessor.ПомощникСозданияОбменаДанными.Form.Форма + + + ru + + + + ВариантРаботыМастера + + ru + Вариант работы мастера + + + String + + 50 + + + + + + + ВидТранспортаСообщенийОбмена + + ru + Основной способ обмена данными + + + EnumRef.ВидыТранспортаСообщенийОбмена + + + + + + ИмяПланаОбмена + + ru + План обмена + + + String + + 150 + + + + + + + ИмяФайлаНастроекОбменаДанными + + ru + Имя файла настроек обмена данными + + + String + + + + + + + ИмяФайлаНастроекОбменаДаннымиДляЗагрузки + + ru + Имя файла настроек обмена данными для загрузки + + + String + + + + + + + КодНовогоУзла + + ru + Код нового узла + + + String + + 3 + + + + + + + КодПредопределенногоУзла + + ru + Код предопределенного узла + + + String + + 3 + + + + + + + НаименованиеНастройкиВыполненияОбмена + + ru + Наименование обмена данными + + + String + + 150 + + + + + + + ПрефиксИнформационнойБазыИсточника + + ru + Префикс Вашей информационной базы + + + String + + 2 + + + + + + + ПрефиксИнформационнойБазыИсточникаУстановлен + + ru + Префикс информационной базы источника установлен + + + Boolean + + + + + + УзелИнформационнойБазы + + ru + Узел информационной базы + + + ExchangePlanRef + + + + + + ЭтоНастройкаРаспределеннойИнформационнойБазы + + ru + Это настройка распределенной информационной базы + + + Boolean + + + + + + EMAILМаксимальныйДопустимыйРазмерСообщения + + ru + Допустимый размер вложения письма (0 – нет ограничений), КБ + + + Number + + 10 + true + + + + ru + Максимальный размер отправляемого файла сообщения обмена (Кб) + + + + + + EMAILСжиматьФайлИсходящегоСообщения + + ru + Сжимать файл исходящего сообщения + + + Boolean + + + + + + EMAILУчетнаяЗапись + + ru + Учетная запись электронной почты + + + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + + ru + Учетная запись для обмена + + + + + + FILEКаталогОбменаИнформацией + + ru + Каталог обмена информацией + + + String + + + + + + + FILEСжиматьФайлИсходящегоСообщения + + ru + Сжимать файл исходящего сообщения + + + Boolean + + + + + + FTPСжиматьФайлИсходящегоСообщения + + ru + Сжимать файл исходящего сообщения + + + Boolean + + + + + + FTPСоединениеМаксимальныйДопустимыйРазмерСообщения + + ru + Допустимый размер сообщения обмена (0 – нет ограничений), КБ + + + Number + + 10 + + + + ru + Максимальный размер отправляемого файла сообщения обмена (Кб) + + + + + + FTPСоединениеПароль + + ru + Пароль + + + String + + + true + + + + + FTPСоединениеПассивноеСоединение + + ru + Пассивное соединение + + + Boolean + + + + + + FTPСоединениеПользователь + + ru + Пользователь (логин) + + + String + + + + + + + FTPСоединениеПорт + + ru + Порт + + + Number + + 5 + + + + + + + FTPСоединениеПуть + + ru + Путь к каталогу + + + String + + + + + + + ПарольАрхиваСообщенияОбмена + + ru + Пароль архива сообщения обмена + + + String + + + + + + + ИспользоватьПараметрыТранспортаEMAIL + + ru + Настроить обмен данными по электронной почте + + + Boolean + + + + + + ИспользоватьПараметрыТранспортаFILE + + ru + Настроить обмен данными через локальный или сетевой каталог + + + Boolean + + + + + + ИспользоватьПараметрыТранспортаFTP + + ru + Настроить обмен данными через FTP-ресурс + + + Boolean + + + + + + Форма + + ru + Форма + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Form.form b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Form.form new file mode 100644 index 000000000..53668fc4e --- /dev/null +++ b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Form.form @@ -0,0 +1,3987 @@ + + + + <key>ru</key> + <value>Помощник интерактивного обмена данными</value> + + + СтраницыМастера + 168 + + СтраницаНачала + 250 + + ЗаголовокСтраницы + 284 + + <key>ru</key> + <value>Вас приветствует помощник интерактивного обмена данными!</value> + + true + true + + true + + + ЗаголовокСтраницыРасширеннаяПодсказка + 407 + Label + true + true + + Left + + + + ЗаголовокСтраницыКонтекстноеМеню + 285 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 10.0 + true + false + false + false + + + Left + + + + ГруппаНастройкиОбменаДанными + 283 + + УзелИнформационнойБазы + 358 + true + true + + true + + + Объект.УзелИнформационнойБазы + + Left + + УзелИнформационнойБазыРасширеннаяПодсказка + 409 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 359 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + ru + Группа настройки обмена данными + + 70 + false + + ГруппаНастройкиОбменаДаннымиРасширеннаяПодсказка + 408 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ВидТранспортаСообщенийОбмена + 360 + true + true + + true + + + Объект.ВидТранспортаСообщенийОбмена + + Top + + OnChange + ВидТранспортаСообщенийОбменаПриИзменении + + + ВидТранспортаСообщенийОбменаРасширеннаяПодсказка + 411 + Label + true + true + + Left + + + + ВидТранспортаСообщенийОбменаКонтекстноеМеню + 361 + true + + InputField + true + Enter + true + Left + true + + 40 + true + true + false + true + true + false + true + true + true + true + true + Normal + + + + ОткрытьКаталогОбменаИнформацией + 368 + true + true + + true + + + ОткрытьКаталогОбменаИнформациейРасширеннаяПодсказка + 413 + Label + true + true + + Left + + + Hyperlink + Form.Command.ОткрытьКаталогОбменаИнформацией + Normal + Auto + true + true + UserCmds + Auto + + + НастроитьПараметрыТранспортаСообщенийОбмена + 369 + true + true + + true + + + НастроитьПараметрыТранспортаСообщенийОбменаРасширеннаяПодсказка + 414 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастроитьПараметрыТранспортаСообщенийОбмена + Normal + Auto + true + true + UserCmds + Auto + + + Декорация2 + 251 + true + true + + true + + + Декорация2РасширеннаяПодсказка + 415 + Label + true + true + + Left + + + + Декорация2КонтекстноеМеню + 252 + true + + Label + true + true + true + false + + Left + + + + Декорация8 + 317 + + <key>ru</key> + <value>Выберите вид транспорта сообщений обмена и нажмите кнопку "Далее" для продолжения.</value> + + true + true + + true + + + Декорация8РасширеннаяПодсказка + 416 + Label + true + true + + Left + + + + Декорация8КонтекстноеМеню + 318 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница начала</value> + + + ru + Страница начала + + + СтраницаНачалаРасширеннаяПодсказка + 406 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаИнформацииСтатистики + 169 + + ЗаголовокСтраницыИнформацииСтатистики + 286 + + <key>ru</key> + <value>Сопоставление объектов</value> + + true + true + + true + + + ЗаголовокСтраницыИнформацииСтатистикиРасширеннаяПодсказка + 418 + Label + true + true + + Left + + + + ЗаголовокСтраницыИнформацииСтатистикиКонтекстноеМеню + 287 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 10.0 + true + false + false + false + + + Left + + + + ГруппаДополнительнойИнформации + 353 + + КартинкаИнформацияОНаличииНесопоставленныхОбъектов + 356 + + <key>ru</key> + <value>Картинка информация о наличии несопоставленных объектов</value> + + true + true + + true + + + КартинкаИнформацияОНаличииНесопоставленныхОбъектовРасширеннаяПодсказка + 420 + Label + true + true + + Left + + + + КартинкаИнформацияОНаличииНесопоставленныхОбъектовКонтекстноеМеню + 357 + true + + 2 + true + 1 + true + false + + + CommonPicture.Информация + + + + + ПояснениеОНаличииНесопоставленныхОбъектов + 354 + + <key>ru</key> + <value>Имеются несопоставленные объекты</value> + + true + true + + true + + + ПояснениеОНаличииНесопоставленныхОбъектовРасширеннаяПодсказка + 421 + Label + true + true + + Left + + + + ПояснениеОНаличииНесопоставленныхОбъектовКонтекстноеМеню + 355 + true + + Label + true + true + false + + Style.ПоясняющийТекст + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа дополнительной информации</value> + + + ru + Группа дополнительной информации + + + ГруппаДополнительнойИнформацииРасширеннаяПодсказка + 419 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + КоманднаяПанельТаблицыСтатистики + 272 + + ОткрытьФормуСопоставления + 278 + true + true + + true + + false + + ОткрытьФормуСопоставленияРасширеннаяПодсказка + 423 + Label + true + true + + Left + + + Form.Command.ОткрытьФормуСопоставления + Normal + Auto + true + true + UserCmds + Auto + + + ОбновитьИнформациюСопоставленияПолностью + 255 + true + true + + true + + false + + ОбновитьИнформациюСопоставленияПолностьюРасширеннаяПодсказка + 424 + Label + true + true + + Left + + + Form.Command.ОбновитьИнформациюСопоставленияПолностью + Normal + Auto + true + true + UserCmds + Auto + + + ВыполнитьАвтоматическоеСопоставлениеПоУмолчанию + 265 + true + true + + true + + false + + ВыполнитьАвтоматическоеСопоставлениеПоУмолчаниюРасширеннаяПодсказка + 425 + Label + true + true + + Left + + + Form.Command.ВыполнитьАвтоматическоеСопоставлениеПоУмолчанию + Normal + Auto + true + true + UserCmds + Auto + + + ВыполнитьЗагрузкуДанныхВсехТаблиц + 364 + true + true + + true + + false + + ВыполнитьЗагрузкуДанныхВсехТаблицРасширеннаяПодсказка + 426 + Label + true + true + + Left + + + Form.Command.ВыполнитьЗагрузкуДанныхВсехТаблиц + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель таблицы статистики</value> + + + ru + Командная панель таблицы статистики + + + КоманднаяПанельТаблицыСтатистикиРасширеннаяПодсказка + 422 + Label + true + true + + Left + + + CommandBar + + Left + + + + ИнформацияСтатистики + 180 + true + true + + true + + + Объект.ИнформацияСтатистики + + false + None + Add + CancelSearch + Change + Copy + CopyToClipboard + Delete + EndEdit + Find + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + + ИнформацияСтатистикиНомерСтроки + 198 + true + true + + true + + + Объект.ИнформацияСтатистики.LineNumber + + + ИнформацияСтатистикиНомерСтрокиРасширеннаяПодсказка + 440 + Label + true + true + + Left + + + + ИнформацияСтатистикиНомерСтрокиКонтекстноеМеню + 199 + true + + LabelField + Auto + true + Left + true + + true + true + + + + КолонкаИмяТаблицыПриемника + 366 + + ИнформацияСтатистикиИндексКартинки + 351 + true + true + + true + + + Объект.ИнформацияСтатистики.ИндексКартинки + + None + + ИнформацияСтатистикиИндексКартинкиРасширеннаяПодсказка + 443 + Label + true + true + + Left + + + + ИнформацияСтатистикиИндексКартинкиКонтекстноеМеню + 352 + true + + PictureField + true + Center + Auto + true + Left + true + + 2 + true + true + + CommonPicture.СтатусыСопоставленияОбъектов + + + + 1 + + + + + ИнформацияСтатистикиИмяТаблицыПриемника + 270 + true + true + + true + + + Объект.ИнформацияСтатистики.ИмяТаблицыПриемника + + + ИнформацияСтатистикиИмяТаблицыПриемникаРасширеннаяПодсказка + 445 + Label + true + true + + Left + + + + ИнформацияСтатистикиИмяТаблицыПриемникаКонтекстноеМеню + 271 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Колонка имя таблицы приемника</value> + + + ru + Колонка имя таблицы приемника + + + КолонкаИмяТаблицыПриемникаРасширеннаяПодсказка + 442 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + КолонкаДанныхИсточникаПриемника + 262 + + ИнформацияСтатистикиКоличествоОбъектовВИсточнике + 256 + true + true + + true + + + Объект.ИнформацияСтатистики.КоличествоОбъектовВИсточнике + + + ИнформацияСтатистикиКоличествоОбъектовВИсточникеРасширеннаяПодсказка + 448 + Label + true + true + + Left + + + + ИнформацияСтатистикиКоличествоОбъектовВИсточникеКонтекстноеМеню + 257 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИнформацияСтатистикиКоличествоОбъектовВПриемнике + 258 + true + true + + true + + + Объект.ИнформацияСтатистики.КоличествоОбъектовВПриемнике + + + ИнформацияСтатистикиКоличествоОбъектовВПриемникеРасширеннаяПодсказка + 450 + Label + true + true + + Left + + + + ИнформацияСтатистикиКоличествоОбъектовВПриемникеКонтекстноеМеню + 259 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Колонка данных источника приемника</value> + + + ru + Колонка данных источника приемника + + + КолонкаДанныхИсточникаПриемникаРасширеннаяПодсказка + 447 + Label + true + true + + Left + + + ColumnGroup + + Vertical + auto + true + + + + ИнформацияСтатистикиКоличествоОбъектовНесопоставленных + 280 + true + true + + true + + + Объект.ИнформацияСтатистики.КоличествоОбъектовНесопоставленных + + + ИнформацияСтатистикиКоличествоОбъектовНесопоставленныхРасширеннаяПодсказка + 452 + Label + true + true + + Left + + + + ИнформацияСтатистикиКоличествоОбъектовНесопоставленныхКонтекстноеМеню + 281 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИнформацияСтатистикиПроцентСопоставления + 263 + true + true + + true + + + Объект.ИнформацияСтатистики.ПроцентСопоставленияОбъектов + + + ИнформацияСтатистикиПроцентСопоставленияРасширеннаяПодсказка + 454 + Label + true + true + + Left + + + + ИнформацияСтатистикиПроцентСопоставленияКонтекстноеМеню + 264 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + ИнформацияСтатистикиКоманднаяПанель + 182 + Left + + + Selection + ИнформацияСтатистикиВыбор + + + ИнформацияСтатистикиСтрокаПоиска + 431 + + ИнформацияСтатистикиСтрокаПоискаРасширеннаяПодсказка + 433 + Label + true + true + + Left + + + + ИнформацияСтатистикиСтрокаПоискаКонтекстноеМеню + 432 + true + + ИнформацияСтатистики + + true + + + + ИнформацияСтатистикиСостояниеПросмотра + 434 + + ИнформацияСтатистикиСостояниеПросмотраРасширеннаяПодсказка + 436 + Label + true + true + + Left + + + + ИнформацияСтатистикиСостояниеПросмотраКонтекстноеМеню + 435 + true + + ViewStatusAddition + ИнформацияСтатистики + + true + + + + ИнформацияСтатистикиУправлениеПоиском + 437 + + ИнформацияСтатистикиУправлениеПоискомРасширеннаяПодсказка + 439 + Label + true + true + + Left + + + + ИнформацияСтатистикиУправлениеПоискомКонтекстноеМеню + 438 + true + + SearchControlAddition + ИнформацияСтатистики + + true + + + + ИнформацияСтатистикиРасширеннаяПодсказка + 430 + Label + true + true + + Left + + + + ИнформацияСтатистикиКонтекстноеМеню + 181 + + КонтекстноеМенюИнформацияСтатистикиОткрытьФормуСопоставления + 367 + true + true + + true + + false + + КонтекстноеМенюИнформацияСтатистикиОткрытьФормуСопоставленияРасширеннаяПодсказка + 427 + Label + true + true + + Left + + + Form.Command.ОткрытьФормуСопоставления + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюИнформацияСтатистикиОбновитьИнформациюСопоставленияДляСтроки + 274 + true + true + + true + + false + + КонтекстноеМенюИнформацияСтатистикиОбновитьИнформациюСопоставленияДляСтрокиРасширеннаяПодсказка + 428 + Label + true + true + + Left + + + Form.Command.ОбновитьИнформациюСопоставленияДляСтроки + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюИнформацияСтатистикиВыполнитьЗагрузкуДанныхДляСтроки + 365 + true + true + + true + + false + + КонтекстноеМенюИнформацияСтатистикиВыполнитьЗагрузкуДанныхДляСтрокиРасширеннаяПодсказка + 429 + Label + true + true + + Left + + + Form.Command.ВыполнитьЗагрузкуДанныхДляСтроки + Normal + Auto + true + true + UserCmds + Auto + + + true + true + true + true + true + true + MultiRow + Row +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + +
    + + Декорация7 + 315 + + <key>ru</key> + <value>Нажмите кнопку "Далее" для завершения сопоставления объектов и выгрузки данных.</value> + + true + true + + true + + + Декорация7РасширеннаяПодсказка + 464 + Label + true + true + + Left + + + + Декорация7КонтекстноеМеню + 316 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница информации статистики</value> + + + ru + Страница информации статистики + + + СтраницаИнформацииСтатистикиРасширеннаяПодсказка + 417 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + + СтраницаОжидания + 299 + + ЗаголовокСтраницы6 + 303 + + <key>ru</key> + <value>Выгрузка данных</value> + + true + true + + true + + + ЗаголовокСтраницы6РасширеннаяПодсказка + 466 + Label + true + true + + Left + + + + ЗаголовокСтраницы6КонтекстноеМеню + 304 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 10.0 + true + false + false + false + + + Left + + + + ГруппировкаСообщения + 307 + + ГруппаКартинки + 308 + + Декорация5 + 310 + true + true + + true + + + Декорация5РасширеннаяПодсказка + 469 + Label + true + true + + Left + + + + Декорация5КонтекстноеМеню + 311 + true + + 5 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + true + true + + true + + + <key>ru</key> + <value>Группа картинки</value> + + + ru + Группа картинки + + + ГруппаКартинкиРасширеннаяПодсказка + 468 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаСообщения + 309 + + Декорация4 + 305 + + <key>ru</key> + <value>Выполняется выгрузка данных. +Пожалуйста, подождите...</value> + + true + true + + true + + + Декорация4РасширеннаяПодсказка + 471 + Label + true + true + + Left + + + + Декорация4КонтекстноеМеню + 306 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 10.0 + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа сообщения</value> + + + ru + Группа сообщения + + + ГруппаСообщенияРасширеннаяПодсказка + 470 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + ru + Группировка сообщения + + + ГруппировкаСообщенияРасширеннаяПодсказка + 467 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница ожидания</value> + + + ru + Страница ожидания + + + СтраницаОжиданияРасширеннаяПодсказка + 465 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаОкончанияСопоставления + 289 + + ЗаголовокСтраницы4 + 294 + + <key>ru</key> + <value>Интерактивный обмен данными завершен</value> + + true + true + + true + + + ЗаголовокСтраницы4РасширеннаяПодсказка + 473 + Label + true + true + + Left + + + + ЗаголовокСтраницы4КонтекстноеМеню + 295 + true + + Label + true + 2 + true + true + false + + System.DefaultGUIFont + 10.0 + true + false + false + false + + + Left + + + + ГруппаРезультатаВыполненияОбменаДанными + 374 + + ГруппаЗагрузкиДанных + 375 + + СтраницыСтатусаЗагрузкиДанных + 376 + + СтатусЗагрузкиНеопределено + 377 + + КартинкаНеопределено + 378 + + <key>ru</key> + <value>Картинка неопределено</value> + + true + true + + true + + + КартинкаНеопределеноРасширеннаяПодсказка + 478 + Label + true + true + + Left + + + + КартинкаНеопределеноКонтекстноеМеню + 379 + true + + 2 + true + 1 + true + false + + + true + true + + true + + + <key>ru</key> + <value>Статус загрузки неопределено</value> + + + ru + Статус загрузки неопределено + + + СтатусЗагрузкиНеопределеноРасширеннаяПодсказка + 477 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтатусЗагрузкиУспех + 380 + + КартинкаУспех + 381 + + <key>ru</key> + <value>Картинка успех</value> + + true + true + + true + + + КартинкаУспехРасширеннаяПодсказка + 480 + Label + true + true + + Left + + + + КартинкаУспехКонтекстноеМеню + 382 + true + + 2 + true + 1 + true + false + + + CommonPicture.СостояниеОбменаДаннымиУспех + + + + true + true + + true + + + <key>ru</key> + <value>Статус загрузки успех</value> + + + ru + Статус загрузки неопределено + + + СтатусЗагрузкиУспехРасширеннаяПодсказка + 479 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтатусЗагрузкиОшибка + 383 + + КартинкаОшибка + 384 + + <key>ru</key> + <value>Картинка ошибка</value> + + true + true + + true + + + КартинкаОшибкаРасширеннаяПодсказка + 482 + Label + true + true + + Left + + + + КартинкаОшибкаКонтекстноеМеню + 385 + true + + 2 + true + 1 + true + false + + + CommonPicture.СостояниеОбменаДаннымиОшибка + + + + true + true + + true + + + <key>ru</key> + <value>Статус загрузки ошибка</value> + + + ru + Статус загрузки неопределено + + + СтатусЗагрузкиОшибкаРасширеннаяПодсказка + 481 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтатусЗагрузкиПредупреждение + 386 + + КартинкаПредупреждение1 + 387 + + <key>ru</key> + <value>Картинка ошибка</value> + + true + true + + true + + + КартинкаПредупреждение1РасширеннаяПодсказка + 484 + Label + true + true + + Left + + + + КартинкаПредупреждение1КонтекстноеМеню + 388 + true + + 2 + true + 1 + true + false + + + CommonPicture.Внимание + + + + true + true + + true + + + <key>ru</key> + <value>Статус загрузки предупреждение</value> + + + ru + Статус загрузки неопределено + + + СтатусЗагрузкиПредупреждениеРасширеннаяПодсказка + 483 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы статуса загрузки данных</value> + + + ru + Страницы статуса загрузки данных + + + СтраницыСтатусаЗагрузкиДанныхРасширеннаяПодсказка + 476 + Label + true + true + + Left + + + Pages + + Auto + + + + ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + 389 + + <key>ru</key> + <value>События загрузки данных</value> + + true + true + + true + + false + + ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанныхРасширеннаяПодсказка + 485 + Label + true + true + + Left + + + Hyperlink + Form.Command.ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа загрузки данных</value> + + + ru + Группа загрузки данных + + + ГруппаЗагрузкиДанныхРасширеннаяПодсказка + 475 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаВыгрузкиДанных + 390 + + СтраницыСтатусаВыгрузкиДанных + 391 + + СтатусВыгрузкиНеопределено + 392 + + КартинкаНеопределено1 + 393 + + <key>ru</key> + <value>Картинка неопределено</value> + + true + true + + true + + + КартинкаНеопределено1РасширеннаяПодсказка + 489 + Label + true + true + + Left + + + + КартинкаНеопределено1КонтекстноеМеню + 394 + true + + 2 + true + 1 + true + false + + + true + true + + true + + + <key>ru</key> + <value>Статус выгрузки неопределено</value> + + + ru + Статус загрузки неопределено + + + СтатусВыгрузкиНеопределеноРасширеннаяПодсказка + 488 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтатусВыгрузкиУспех + 395 + + КартинкаУспех1 + 396 + + <key>ru</key> + <value>Картинка успех</value> + + true + true + + true + + + КартинкаУспех1РасширеннаяПодсказка + 491 + Label + true + true + + Left + + + + КартинкаУспех1КонтекстноеМеню + 397 + true + + 2 + true + 1 + true + false + + + CommonPicture.СостояниеОбменаДаннымиУспех + + + + true + true + + true + + + <key>ru</key> + <value>Статус выгрузки успех</value> + + + ru + Статус загрузки неопределено + + + СтатусВыгрузкиУспехРасширеннаяПодсказка + 490 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтатусВыгрузкиОшибка + 398 + + КартинкаОшибка1 + 399 + + <key>ru</key> + <value>Картинка ошибка</value> + + true + true + + true + + + КартинкаОшибка1РасширеннаяПодсказка + 493 + Label + true + true + + Left + + + + КартинкаОшибка1КонтекстноеМеню + 400 + true + + 2 + true + 1 + true + false + + + CommonPicture.СостояниеОбменаДаннымиОшибка + + + + true + true + + true + + + <key>ru</key> + <value>Статус выгрузки ошибка</value> + + + ru + Статус загрузки неопределено + + + СтатусВыгрузкиОшибкаРасширеннаяПодсказка + 492 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтатусВыгрузкиПредупреждение + 401 + + КартинкаПредупреждение + 402 + + <key>ru</key> + <value>Картинка ошибка</value> + + true + true + + true + + + КартинкаПредупреждениеРасширеннаяПодсказка + 495 + Label + true + true + + Left + + + + КартинкаПредупреждениеКонтекстноеМеню + 403 + true + + 2 + true + 1 + true + false + + + CommonPicture.Внимание + + + + true + true + + true + + + <key>ru</key> + <value>Статус выгрузки предупреждение</value> + + + ru + Статус загрузки неопределено + + + СтатусВыгрузкиПредупреждениеРасширеннаяПодсказка + 494 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы статуса выгрузки данных</value> + + + ru + Страницы статуса выгрузки данных + + + СтраницыСтатусаВыгрузкиДанныхРасширеннаяПодсказка + 487 + Label + true + true + + Left + + + Pages + + Auto + + + + ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + 404 + + <key>ru</key> + <value>События выгрузки данных</value> + + true + true + + true + + false + + ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанныхРасширеннаяПодсказка + 496 + Label + true + true + + Left + + + Hyperlink + Form.Command.ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа выгрузки данных</value> + + + ru + Группа загрузки данных + + + ГруппаВыгрузкиДанныхРасширеннаяПодсказка + 486 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа результата выполнения обмена данными</value> + + + ru + Группа результата выполнения обмена данными + + + ГруппаРезультатаВыполненияОбменаДаннымиРасширеннаяПодсказка + 474 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ИнформационнаяНадписьНастройкиРасписания + 337 + + Группировка + 370 + + Декорация14 + 339 + true + true + + true + + + Декорация14РасширеннаяПодсказка + 499 + Label + true + true + + Left + + + + Декорация14КонтекстноеМеню + 340 + true + + 5 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + Декорация15 + 342 + + <key>ru</key> + <value>При необходимости можно настроить расписание +для выполнения обмена в автоматическом режиме.</value> + + true + true + + true + + + Декорация15РасширеннаяПодсказка + 500 + Label + true + true + + Left + + + + Декорация15КонтекстноеМеню + 343 + true + + Label + true + 2 + true + false + + Style.ПоясняющийТекст + + + System.DefaultGUIFont + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группировка</value> + + + ru + Группировка + + + ГруппировкаРасширеннаяПодсказка + 498 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ОткрытьПомощникСозданияСценарияОбменаДанными + 371 + true + true + + true + + + ОткрытьПомощникСозданияСценарияОбменаДанными + + Right + + ОткрытьПомощникСозданияСценарияОбменаДаннымиРасширеннаяПодсказка + 501 + Label + true + true + + Left + + + + ОткрытьПомощникСозданияСценарияОбменаДаннымиКонтекстноеМеню + 372 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Информационная надпись настройки расписания</value> + + + ru + Группировка сообщения + + + ИнформационнаяНадписьНастройкиРасписанияРасширеннаяПодсказка + 497 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + Декорация12 + 325 + true + true + + true + + + Декорация12РасширеннаяПодсказка + 503 + Label + true + true + + Left + + + + Декорация12КонтекстноеМеню + 326 + true + + Label + true + true + true + false + + Left + + + + Декорация10 + 321 + + <key>ru</key> + <value>Нажмите кнопку "Готово" для выхода из помощника.</value> + + true + true + + true + + + Декорация10РасширеннаяПодсказка + 504 + Label + true + true + + Left + + + + Декорация10КонтекстноеМеню + 322 + true + + Label + true + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Страница окончания сопоставления</value> + + + ru + Страница окончания сопоставления + + + СтраницаОкончанияСопоставленияРасширеннаяПодсказка + 472 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы мастера</value> + + + ru + Страницы мастера + + + СтраницыМастераРасширеннаяПодсказка + 405 + Label + true + true + + Left + + + Pages + + Auto + +
    + + ГруппаКнопокМастера + 279 + + КнопкиМастера + 211 + + КнопкиНачала + 212 + + КомандаСправка + 213 + true + true + + true + + false + + КомандаСправкаРасширеннаяПодсказка + 508 + Label + true + true + + Left + + + UsualButton + Form.Command.мСправка + Normal + Auto + true + true + UserCmds + Auto + + + Декорация3 + 214 + true + true + + true + + + Декорация3РасширеннаяПодсказка + 509 + Label + true + true + + Left + + + + Декорация3КонтекстноеМеню + 215 + true + + Label + true + true + true + false + + Left + + + + КомандаНазад1 + 239 + true + false + + true + + false + + КомандаНазад1РасширеннаяПодсказка + 510 + Label + true + true + + Left + + + UsualButton + Form.Command.мНазад + Normal + PictureAndText + true + true + UserCmds + + Auto + + + КомандаДалее1 + 240 + true + true + + true + + false + + КомандаДалее1РасширеннаяПодсказка + 511 + Label + true + true + + Left + + + UsualButton + Form.Command.мДалее + Normal + PictureAndText + true + true + UserCmds + + Auto + + + КомандаОтмена + 218 + true + true + + true + + false + + КомандаОтменаРасширеннаяПодсказка + 512 + Label + true + true + + Left + + + UsualButton + Form.Command.мОтмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопки начала</value> + + + ru + Кнопки начала + + + КнопкиНачалаРасширеннаяПодсказка + 507 + Label + true + true + + Left + + + Page + + auto + + + + КнопкиПродолжения + 242 + + КомандаСправка3 + 243 + true + true + + true + + false + + КомандаСправка3РасширеннаяПодсказка + 514 + Label + true + true + + Left + + + UsualButton + Form.Command.мСправка + Normal + Auto + true + true + UserCmds + Auto + + + Декорация312 + 244 + true + true + + true + + + Декорация312РасширеннаяПодсказка + 515 + Label + true + true + + Left + + + + Декорация312КонтекстноеМеню + 245 + true + + Label + true + true + true + false + + Left + + + + КомандаНазад2 + 246 + true + true + + true + + false + + КомандаНазад2РасширеннаяПодсказка + 516 + Label + true + true + + Left + + + UsualButton + Form.Command.мНазад + Normal + PictureAndText + true + true + UserCmds + + Auto + + + КомандаДалее2 + 247 + true + true + + true + + false + + КомандаДалее2РасширеннаяПодсказка + 517 + Label + true + true + + Left + + + UsualButton + Form.Command.мДалее + Normal + PictureAndText + true + true + UserCmds + + Auto + + + КомандаОтмена3 + 249 + true + true + + true + + false + + КомандаОтмена3РасширеннаяПодсказка + 518 + Label + true + true + + Left + + + UsualButton + Form.Command.мОтмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопки продолжения</value> + + + ru + Кнопки окончания + + + КнопкиПродолженияРасширеннаяПодсказка + 513 + Label + true + true + + Left + + + Page + + auto + + + + КнопкиОжидания + 327 + + КомандаСправка4 + 328 + true + false + + true + + false + + КомандаСправка4РасширеннаяПодсказка + 520 + Label + true + true + + Left + + + UsualButton + Form.Command.мСправка + Normal + Auto + true + true + UserCmds + Auto + + + Декорация313 + 329 + true + true + + true + + + Декорация313РасширеннаяПодсказка + 521 + Label + true + true + + Left + + + + Декорация313КонтекстноеМеню + 330 + true + + Label + true + true + true + false + + Left + + + + КомандаНазад3 + 331 + true + false + + true + + false + + КомандаНазад3РасширеннаяПодсказка + 522 + Label + true + true + + Left + + + UsualButton + Form.Command.мНазад + Normal + PictureAndText + true + true + UserCmds + + Auto + + + КомандаДалее3 + 332 + true + false + + true + + false + + КомандаДалее3РасширеннаяПодсказка + 523 + Label + true + true + + Left + + + UsualButton + Form.Command.мДалее + Normal + PictureAndText + true + true + UserCmds + + Auto + + + КомандаОтмена4 + 334 + true + false + + true + + false + + КомандаОтмена4РасширеннаяПодсказка + 524 + Label + true + true + + Left + + + UsualButton + Form.Command.мОтмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопки ожидания</value> + + + ru + Кнопки окончания + + + КнопкиОжиданияРасширеннаяПодсказка + 519 + Label + true + true + + Left + + + Page + + auto + + + + КнопкиОкончания + 233 + + КомандаСправка2 + 234 + true + true + + true + + false + + КомандаСправка2РасширеннаяПодсказка + 526 + Label + true + true + + Left + + + UsualButton + Form.Command.мСправка + Normal + Auto + true + true + UserCmds + Auto + + + Декорация311 + 235 + true + true + + true + + + Декорация311РасширеннаяПодсказка + 527 + Label + true + true + + Left + + + + Декорация311КонтекстноеМеню + 236 + true + + Label + true + true + true + false + + Left + + + + КомандаНазад + 216 + true + false + + true + + false + + КомандаНазадРасширеннаяПодсказка + 528 + Label + true + true + + Left + + + UsualButton + Form.Command.мНазад + Normal + PictureAndText + true + true + UserCmds + + Auto + + + КомандаГотово + 237 + true + true + + true + + false + + КомандаГотовоРасширеннаяПодсказка + 529 + Label + true + true + + Left + + + UsualButton + Form.Command.мГотово + Normal + Auto + true + true + UserCmds + Auto + + + КомандаОтмена2 + 238 + true + false + + true + + false + + КомандаОтмена2РасширеннаяПодсказка + 530 + Label + true + true + + Left + + + UsualButton + Form.Command.мОтмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопки окончания</value> + + + ru + Кнопки окончания + + + КнопкиОкончанияРасширеннаяПодсказка + 525 + Label + true + true + + Left + + + Page + + auto + + + true + true + + true + + + <key>ru</key> + <value>Кнопки мастера</value> + + + ru + Кнопки мастера + + + КнопкиМастераРасширеннаяПодсказка + 506 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа кнопок мастера</value> + + + ru + Группа кнопок мастера + + + ГруппаКнопокМастераРасширеннаяПодсказка + 505 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + + OnClose + ПриЗакрытии + + Abort + Cancel + Close + Help + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.ПомощникСопоставленияОбъектовИнформационныхБаз + + + true + + + true + +
    true
    +
    + + ВариантРаботыМастера + + <key>ru</key> + <value>Вариант работы мастера</value> + + 3 + + String + + 50 + + + + true + + + true + + + + ВыполнитьСопоставлениеПриОткрытии + + <key>ru</key> + <value>Выполнить сопоставление при открытии</value> + + 4 + + Boolean + + + true + + + true + + + + ИдентификаторФайлаПакетаДанных + + <key>ru</key> + <value>Идентификатор файла пакета данных</value> + + 5 + + Date + + + + true + + + true + + + + ОткрытьПомощникСозданияСценарияОбменаДанными + + <key>ru</key> + <value>Открыть форму настройки расписания</value> + + 2 + + Boolean + + + true + + + true + + + + УзелИспользуетсяВСценарииОбмена + + <key>ru</key> + <value>Узел используется в сценарии обмена</value> + + 6 + + Boolean + + + 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> + + 5 + + true + + + StdPicture.FormHelp + + + + мСправка + + + TextPicture + Auto + Auto + + + мДалее + + <key>ru</key> + <value>Далее</value> + + 16 + + true + + + + мДалее + + + Auto + Auto + + + мНазад + + <key>ru</key> + <value>Назад</value> + + 17 + + true + + + + мНазад + + + Auto + Auto + + + мГотово + + <key>ru</key> + <value>Готово</value> + + 18 + + true + + + + мГотово + + + Auto + Auto + + + мОтмена + + <key>ru</key> + <value>Отмена</value> + + 19 + + true + + + + мОтмена + + + Auto + Auto + + + ОбновитьИнформациюСопоставленияДляСтроки + + <key>ru</key> + <value>Обновить информацию статистики сопоставления</value> + + 15 + + ru + Обновить информацию статистики сопоставления для выделенных строк + + + true + + + + ОбновитьИнформациюСопоставленияДляСтроки + + + TextPicture + Auto + Auto + + + ОбновитьИнформациюСопоставленияПолностью + + <key>ru</key> + <value>Обновить информацию статистики сопоставления</value> + + 20 + + ru + Обновить информацию статистики сопоставления + + + true + + + StdPicture.Refresh + + + + ОбновитьИнформациюСопоставленияПолностью + + + Auto + Auto + + + ВыполнитьАвтоматическоеСопоставлениеПоУмолчанию + + <key>ru</key> + <value>Автоматическое сопоставление (по умолчанию)</value> + + 21 + + ru + Выполнить автоматическое сопоставление по умолчанию + + + true + + + + ВыполнитьАвтоматическоеСопоставлениеПоУмолчанию + + + Auto + Auto + + + ОткрытьФормуСопоставления + + <key>ru</key> + <value>Выполнить сопоставление</value> + + 1 + + ru + Открыть форму сопоставления объектов + + + true + + + StdPicture.ChooseValue + + + + ОткрытьФормуСопоставления + + + TextPicture + Auto + Auto + + + ВыполнитьЗагрузкуДанныхВсехТаблиц + + <key>ru</key> + <value>Выполнить загрузку данных</value> + + 2 + + ru + Выполнить загрузку данных всех таблиц + + + true + + + CommonPicture.ВыполнитьЗапускОбменаДанными + + + + ВыполнитьЗагрузкуДанныхВсехТаблиц + + + TextPicture + Auto + Auto + + + ВыполнитьЗагрузкуДанныхДляСтроки + + <key>ru</key> + <value>Выполнить загрузку данных для выделенных строк</value> + + 3 + + ru + Выполнить загрузку данных + + + true + + + CommonPicture.ВыполнитьЗапускОбменаДанными + + + + ВыполнитьЗагрузкуДанныхДляСтроки + + + TextPicture + Auto + Auto + + + ОткрытьКаталогОбменаИнформацией + + <key>ru</key> + <value>Открыть каталог обмена информацией</value> + + 4 + + ru + Открыть каталог обмена информацией + + + true + + + StdPicture.OpenFile + + + + ОткрытьКаталогОбменаИнформацией + + + TextPicture + Auto + Auto + + + НастроитьПараметрыТранспортаСообщенийОбмена + + <key>ru</key> + <value>Настроить параметры транспорта сообщений обмена</value> + + 6 + + ru + Настроить параметры транспорта сообщений обмена + + + true + + + CommonPicture.ПараметрыОбменаДанными + + + + НастроитьПараметрыТранспортаСообщенийОбмена + + + TextPicture + 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/Форма/Items/КомандаДалее1/Picture.png b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаДалее1/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..24dfd2caf72d559f22414382543a1116813ce9be GIT binary patch literal 460 zcmV;-0WA!5ds1Q(n?MT=BH~u0P&$Z{TbE0)h~Q$*7tp<5pMVw@Y<@D|uup%Ps_cj2!0B}!e^9Rs_ zy}W(%5+|8?rM1ohvm)~8t_G>Z)EJn<`l$+lKXkRx5ilttiN*$&ZQI$z zi&io$r}y@OaS@rh`UEP!3wUns)px literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаДалее2/Picture.png b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаДалее2/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..24dfd2caf72d559f22414382543a1116813ce9be GIT binary patch literal 460 zcmV;-0WA!5ds1Q(n?MT=BH~u0P&$Z{TbE0)h~Q$*7tp<5pMVw@Y<@D|uup%Ps_cj2!0B}!e^9Rs_ zy}W(%5+|8?rM1ohvm)~8t_G>Z)EJn<`l$+lKXkRx5ilttiN*$&ZQI$z zi&io$r}y@OaS@rh`UEP!3wUns)px literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаДалее3/Picture.png b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаДалее3/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..24dfd2caf72d559f22414382543a1116813ce9be GIT binary patch literal 460 zcmV;-0WA!5ds1Q(n?MT=BH~u0P&$Z{TbE0)h~Q$*7tp<5pMVw@Y<@D|uup%Ps_cj2!0B}!e^9Rs_ zy}W(%5+|8?rM1ohvm)~8t_G>Z)EJn<`l$+lKXkRx5ilttiN*$&ZQI$z zi&io$r}y@OaS@rh`UEP!3wUns)px literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаНазад/Picture.png b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаНазад/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9a0e4d0170905af59af314d2a5046811c77ea9 GIT binary patch literal 386 zcmV-|0e$|7P)NRIw1ua@rLHZ^ z8Of&5EOox}clbb4e4E&q(z2;F6gdc1fqMR{=X!oA+zObcseD%@oSKPStK(QjTHq)$07*qoM6N<$f|bOp8~^|S literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаНазад1/Picture.png b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаНазад1/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9a0e4d0170905af59af314d2a5046811c77ea9 GIT binary patch literal 386 zcmV-|0e$|7P)NRIw1ua@rLHZ^ z8Of&5EOox}clbb4e4E&q(z2;F6gdc1fqMR{=X!oA+zObcseD%@oSKPStK(QjTHq)$07*qoM6N<$f|bOp8~^|S literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаНазад2/Picture.png b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаНазад2/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9a0e4d0170905af59af314d2a5046811c77ea9 GIT binary patch literal 386 zcmV-|0e$|7P)NRIw1ua@rLHZ^ z8Of&5EOox}clbb4e4E&q(z2;F6gdc1fqMR{=X!oA+zObcseD%@oSKPStK(QjTHq)$07*qoM6N<$f|bOp8~^|S literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаНазад3/Picture.png b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Items/КомандаНазад3/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9a0e4d0170905af59af314d2a5046811c77ea9 GIT binary patch literal 386 zcmV-|0e$|7P)NRIw1ua@rLHZ^ z8Of&5EOox}clbb4e4E&q(z2;F6gdc1fqMR{=X!oA+zObcseD%@oSKPStK(QjTHq)$07*qoM6N<$f|bOp8~^|S literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Module.bsl new file mode 100644 index 000000000..89e1ba89b --- /dev/null +++ b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Forms/Форма/Module.bsl @@ -0,0 +1,1271 @@ +&НаКлиенте +Перем ПолеСтраницыСтатусаЗагрузкиДанных; + +&НаКлиенте +Перем ПолеСтраницыСтатусаВыгрузкиДанных; + +&НаКлиенте +Перем ПолеЗаголовкиГиперссылокЗагрузкиДанных; + +&НаКлиенте +Перем ПолеЗаголовкиГиперссылокВыгрузкиДанных; + +//////////////////////////////////////////////////////////////////////////////// +// МОДАЛЬНЫЕ ПЕРЕМЕННЫЕ МАСТЕРА (Клиент) + +&НаКлиенте +Перем мТекущийНомерСтраницы; + +&НаКлиенте +Перем мСтраницыМастера; + +&НаКлиенте +Перем мКнопкиМастера; + +&НаКлиенте +Перем мЗакрытьФормуБезусловно; + +&НаКлиенте +Перем мНомераСтраницИВариантыМастера; + +//////////////////////////////////////////////////////////////////////////////// +// НА СЕРВЕРЕ + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("УзелИнформационнойБазы") Тогда + + Объект.ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(Параметры.УзелИнформационнойБазы); + + ИначеЕсли Не Параметры.Свойство("ИмяПланаОбмена", Объект.ИмяПланаОбмена) Тогда + + ОбменДаннымиСервер.СообщитьОбОшибке(НСтр("ru = 'Работа помощника поддерживается только при вызове из командного интерфейса! Работа помощника завершена.'"), Отказ); + Возврат; + + КонецЕсли; + + // параметризация помощника по имени плана обмена (обязательно) + Если ПустаяСтрока(Объект.ИмяПланаОбмена) Тогда + + ОбменДаннымиСервер.СообщитьОбОшибке(НСтр("ru = 'Не задано имя плана обмена! Работа помощника завершена.'"), Отказ); + Возврат; + + ИначеЕсли ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(Объект.ИмяПланаОбмена) Тогда + + ОбменДаннымиСервер.СообщитьОбОшибке(НСтр("ru = 'Интерактивное выполнение обмена данными недоступно для узлов распределенной информационной базы (РИБ)'"), Отказ); + Возврат; + + КонецЕсли; + + // определяем список настроек обмена для выполнения сопоставления данных + ОпределитьСписокНастроекОбмена(); + + Если Параметры.Свойство("УзелИнформационнойБазы") Тогда + + // проверяем настройку обмена на соответствие фильтру + Если Элементы.УзелИнформационнойБазы.СписокВыбора.НайтиПоЗначению(Параметры.УзелИнформационнойБазы) = Неопределено Тогда + + НСтрока = НСтр("ru = 'Для заданного узла информационной базы нельзя выполнить сопоставление объектов!'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,,, Отказ); + Возврат; + КонецЕсли; + + Объект.УзелИнформационнойБазы = Параметры.УзелИнформационнойБазы; + + Элементы.УзелИнформационнойБазы.Вид = ВидПоляФормы.ПолеНадписи; + + Параметры.Свойство("ВидТранспортаСообщенийОбмена", Объект.ВидТранспортаСообщенийОбмена); + + // задание вида транспорта сообщений обмена, если значение не было передано + Если Не ЗначениеЗаполнено(Объект.ВидТранспортаСообщенийОбмена) Тогда + + НастройкиТранспортаОбмена = РегистрыСведений.НастройкиТранспортаОбмена.ПолучитьНастройкиТранспортаДляУзла(Объект.УзелИнформационнойБазы); + + Объект.ВидТранспортаСообщенийОбмена = НастройкиТранспортаОбмена.ВидТранспортаСообщенийОбменаПоУмолчанию; + + Если Не ЗначениеЗаполнено(Объект.ВидТранспортаСообщенийОбмена) Тогда + + Объект.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FILE; + + КонецЕсли; + + КонецЕсли; + + УзелИспользуетсяВСценарииОбмена = УзелИнформационнойБазыИспользуетсяВСценарииОбмена(Объект.УзелИнформационнойБазы); + + Элементы.ИнформационнаяНадписьНастройкиРасписания.Видимость = Не УзелИспользуетсяВСценарииОбмена И ОбменДаннымиСервер.РольДоступнаДобавлениеИзменениеОбменовДанными(); + + ОбменДаннымиСервер.ЗаполнитьСписокВыбораДоступнымиВидамиТранспорта(Объект.УзелИнформационнойБазы, Элементы.ВидТранспортаСообщенийОбмена); + + КонецЕсли; + + Параметры.Свойство("ВыполнитьСопоставлениеПриОткрытии", ВыполнитьСопоставлениеПриОткрытии); + + ВариантРаботыМастера = "ВыполнитьСопоставление"; + ОткрытьПомощникСозданияСценарияОбменаДанными = ОбменДаннымиСервер.РольДоступнаДобавлениеИзменениеОбменовДанными(); + + Элементы.ОткрытьКаталогОбменаИнформацией.Доступность = Не (Объект.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.EMAIL); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ПолучитьЗаголовокПакетаДанныхНаСервере(Отказ, ИнформацияСтатистикиАктуальна) + + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + + ОбработкаОбъект.ПолучитьСообщениеОбменаВоВременныйКаталог(Отказ, ИдентификаторФайлаПакетаДанных); + + Если Не Отказ Тогда + + ДанныеСтатистикиСопоставления = ПолучитьДанныеСтатистикиСопоставления(); + + ИнформацияСтатистикиАктуальна = (ДанныеСтатистикиСопоставления.ИдентификаторФайлаПакетаДанных = ИдентификаторФайлаПакетаДанных); + + Если Не ИнформацияСтатистикиАктуальна Тогда + + // появился новый файл пакета данных; загружаем информацию из файла + ОбработкаОбъект.ВыполнитьАнализСообщенияОбмена(Отказ); + + Если Не Отказ Тогда + + ЗаписатьДанныеСтатистикиСопоставления(Объект.ИмяПланаОбмена, Объект.УзелИнформационнойБазы, ОбработкаОбъект.ТаблицаИнформацииСтатистики(), ИдентификаторФайлаПакетаДанных); + + КонецЕсли; + + Иначе + + // файл пакета данных не изменился; загружаем информацию из кэша + ОбработкаОбъект.ИнформацияСтатистики.Загрузить(ДанныеСтатистикиСопоставления.ИнформацияСтатистикиСопоставленияОбъектов.Скопировать()); + + КонецЕсли; + + КонецЕсли; + + Если Не Отказ Тогда + + ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); + + КонецЕсли; + + УстановитьВидимостьГруппыДополнительнойИнформации(); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьИнформациюСопоставленияПоСтрокеНаСервере(Отказ, ВыделенныеСтроки = Неопределено, ИндексыСтрок = Неопределено) + + // РАЗДЕЛ ПЕРЕГРУЗКИ ПРОЦЕДУРЫ + Если ТипЗнч(ИндексыСтрок) <> Тип("Массив") Тогда + + Если ТипЗнч(ВыделенныеСтроки) <> Тип("Массив") Тогда + Возврат; + КонецЕсли; + + ИндексыСтрок = Новый Массив; + + Для Каждого ИдентификаторСтроки ИЗ ВыделенныеСтроки Цикл + + СтрокаТаблицы = Объект.ИнформацияСтатистики.НайтиПоИдентификатору(ИдентификаторСтроки); + ИндексСтроки = Объект.ИнформацияСтатистики.Индекс(СтрокаТаблицы); + + ИндексыСтрок.Добавить(ИндексСтроки); + + КонецЦикла; + + КонецЕсли; + // РАЗДЕЛ ПЕРЕГРУЗКИ ПРОЦЕДУРЫ + + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + + // получаем статистическую информацию по сопоставлению + ОбработкаОбъект.ПолучитьСтатистикуСопоставленияОбъектовПоСтроке(Отказ, ИндексыСтрок); + + ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); + + // сохраняем данные статистики сопоставления + ЗаписатьДанныеСтатистикиСопоставления(Объект.ИмяПланаОбмена, Объект.УзелИнформационнойБазы, ОбработкаОбъект.ТаблицаИнформацииСтатистики(), ИдентификаторФайлаПакетаДанных); + + УстановитьВидимостьГруппыДополнительнойИнформации(); + +КонецПроцедуры + +&НаСервере +Процедура ВыполнитьАвтоматическоеСопоставлениеПоУмолчаниюПоСтрокеНаСервере(Отказ, ИндексыСтрок) + + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + + // выполняем автоматическое сопоставление и получаем статистическую информацию + ОбработкаОбъект.ВыполнитьАвтоматическоеСопоставлениеПоУмолчаниюИПолучитьСтатистикуСопоставления(Отказ, ИндексыСтрок); + + ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); + + // сохраняем данные статистики сопоставления + ЗаписатьДанныеСтатистикиСопоставления(Объект.ИмяПланаОбмена, Объект.УзелИнформационнойБазы, ОбработкаОбъект.ТаблицаИнформацииСтатистики(), ИдентификаторФайлаПакетаДанных); + + УстановитьВидимостьГруппыДополнительнойИнформации(); + +КонецПроцедуры + +&НаСервере +Процедура ВыполнитьЗагрузкуДанныхНаСервере(Отказ, ВыделенныеСтроки = Неопределено, ИндексыСтрок = Неопределено) + + // РАЗДЕЛ ПЕРЕГРУЗКИ ПРОЦЕДУРЫ + Если ТипЗнч(ИндексыСтрок) <> Тип("Массив") Тогда + + Если ТипЗнч(ВыделенныеСтроки) <> Тип("Массив") Тогда + Возврат; + КонецЕсли; + + ИндексыСтрок = Новый Массив; + + Для Каждого ИдентификаторСтроки ИЗ ВыделенныеСтроки Цикл + + СтрокаТаблицы = Объект.ИнформацияСтатистики.НайтиПоИдентификатору(ИдентификаторСтроки); + ИндексСтроки = Объект.ИнформацияСтатистики.Индекс(СтрокаТаблицы); + + ИндексыСтрок.Добавить(ИндексСтроки); + + КонецЦикла; + + КонецЕсли; + // РАЗДЕЛ ПЕРЕГРУЗКИ ПРОЦЕДУРЫ + + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + + // выполняем загрузку данных + ОбработкаОбъект.ВыполнитьЗагрузкуДанных(Отказ, ИндексыСтрок); + + // получаем статистическую информацию по сопоставлению + ОбработкаОбъект.ПолучитьСтатистикуСопоставленияОбъектовПоСтроке(Отказ, ИндексыСтрок); + + ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); + + // сохраняем данные статистики сопоставления + ЗаписатьДанныеСтатистикиСопоставления(Объект.ИмяПланаОбмена, Объект.УзелИнформационнойБазы, ОбработкаОбъект.ТаблицаИнформацииСтатистики(), ИдентификаторФайлаПакетаДанных); + + УстановитьВидимостьГруппыДополнительнойИнформации(); + +КонецПроцедуры + +&НаСервере +Процедура ОпределитьСписокНастроекОбмена() + + СписокНастроекОбмена = ПолучитьСписокНастроекОбмена(); + + Если СписокНастроекОбмена.Количество() = 0 Тогда // нет настроек обмена + + Иначе // найдено несколько настроек обмена + + Объект.УзелИнформационнойБазы = СписокНастроекОбмена[0].Значение; + + ОбщегоНазначенияКлиентСервер.ЗаполнитьКоллекциюСвойств(СписокНастроекОбмена, Элементы.УзелИнформационнойБазы.СписокВыбора); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьДанныеСтатистикиСопоставленияНаСервере(ПараметрыОповещения) + + СтрокиТаблицы = Объект.ИнформацияСтатистики.НайтиСтроки(Новый Структура("ИмяТаблицыПриемника", ПараметрыОповещения.КлючУникальности)); + + Если СтрокиТаблицы.Количество() > 0 Тогда + + ЗаполнитьЗначенияСвойств(СтрокиТаблицы[0], ПараметрыОповещения); + + // Вызов сервера без контекста + ЗаписатьДанныеСтатистикиСопоставления(Объект.ИмяПланаОбмена, Объект.УзелИнформационнойБазы, Объект.ИнформацияСтатистики.Выгрузить(), ИдентификаторФайлаПакетаДанных); + + УстановитьВидимостьГруппыДополнительнойИнформации(); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция ПолучитьСписокНастроекОбмена() + + // Выбираем узлы плана обмена: + // принадлежащие заданному плану обмена; + // непомеченные на удаление; + // ЭтоУзел не включаем в выборку; + + ТекстЗапроса = " + |ВЫБРАТЬ + | ПланОбмена.Ссылка КАК Ссылка, + | ПланОбмена.Наименование КАК Представление + |ИЗ + | ПланОбмена.#ИмяПланаОбмена КАК ПланОбмена + |ГДЕ + | ПланОбмена.Ссылка ССЫЛКА ПланОбмена.#ИмяПланаОбмена + | И НЕ ПланОбмена.ПометкаУдаления + | И ПланОбмена.Ссылка <> &ЭтотУзел + |"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяПланаОбмена", Объект.ИмяПланаОбмена); + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("ЭтотУзел", ОбменДаннымиПовтИсп.ПолучитьЭтотУзелПланаОбмена(Объект.ИмяПланаОбмена)); + + Выборка = Запрос.Выполнить().Выбрать(); + + // возвращаемое значение функции + СписокНастроекОбмена = Новый СписокЗначений; + + Пока Выборка.Следующий() Цикл + + СписокНастроекОбмена.Добавить(Выборка.Ссылка, Выборка.Представление); + + КонецЦикла; + + Возврат СписокНастроекОбмена; + +КонецФункции + +&НаСервере +Процедура УстановитьВидимостьГруппыДополнительнойИнформации() + + // если в таблице информации статистике есть хотя бы одна строка с сопоставлением меньшим 100%, + // то группу дополнительной информации делаем видимой + МассивСтрок = Объект.ИнформацияСтатистики.НайтиСтроки(Новый Структура("ИндексКартинки", 1)); + + Элементы.ГруппаДополнительнойИнформации.Видимость = (МассивСтрок.Количество() > 0); + +КонецПроцедуры + +&НаСервере +Функция ПолучитьДанныеСтатистикиСопоставления() + Перем ДанныеСтатистикиСопоставления; + + ИмяФайла = ИмяФайлаДанныхСтатистикиСопоставления(Объект.ИмяПланаОбмена, Объект.УзелИнформационнойБазы); + + Файл = Новый Файл(ИмяФайла); + + Если Файл.Существует() Тогда + + ДанныеСтатистикиСопоставления = ЗначениеИзФайла(ИмяФайла); + + КонецЕсли; + + Если ТипЗнч(ДанныеСтатистикиСопоставления) <> Тип("Структура") Тогда + + ДанныеСтатистикиСопоставления = Новый Структура("ИдентификаторФайлаПакетаДанных, ИнформацияСтатистикиСопоставленияОбъектов"); + + КонецЕсли; + + Возврат ДанныеСтатистикиСопоставления; + +КонецФункции + +&НаСервере +Функция ПакетДанныхЗагруженПолностью() + + ТаблицаУспешныхЗагрузок = Объект.ИнформацияСтатистики.Выгрузить(Новый Структура("ДанныеУспешноЗагружены", Истина) ,"ДанныеУспешноЗагружены"); + + Возврат ТаблицаУспешныхЗагрузок.Количество() = Объект.ИнформацияСтатистики.Количество(); + +КонецФункции + +&НаСервере +Функция ВсеТаблицыОбъектовСопоставлены() + + Возврат (Объект.ИнформацияСтатистики.Выгрузить(,"КоличествоОбъектовНесопоставленных").Итог("КоличествоОбъектовНесопоставленных") = 0); + +КонецФункции + +&НаСервере +Процедура ПолучитьСтруктуруПроверокПриЗавершенииСопоставления(СтруктураПроверок) + + СтруктураПроверок.ПакетДанныхЗагруженПолностью = ПакетДанныхЗагруженПолностью(); + СтруктураПроверок.ВсеТаблицыОбъектовСопоставлены = ВсеТаблицыОбъектовСопоставлены(); + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ПолучитьСостояниеОбменовДанными(РезультатЗагрузкиДанных, РезультатВыгрузкиДанных, Знач УзелИнформационнойБазы) + + СостояниеОбменовДанными = РегистрыСведений.СостояниеОбменовДанными.СостояниеОбменовДаннымиДляУзлаИнформационнойБазы(УзелИнформационнойБазы); + + РезультатЗагрузкиДанных = СостояниеОбменовДанными["РезультатЗагрузкиДанных"]; + РезультатВыгрузкиДанных = СостояниеОбменовДанными["РезультатВыгрузкиДанных"]; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ИмяФайлаДанныхСтатистикиСопоставления(ИмяПланаОбмена, УзелИнформационнойБазы) + + Ключ = "ДанныеСтатистикиСопоставления[ИмяПланаОбмена][КодУзла]"; + + Ключ = СтрЗаменить(Ключ, "[ИмяПланаОбмена]", ИмяПланаОбмена); + Ключ = СтрЗаменить(Ключ, "[КодУзла]", ОбщегоНазначения.ПолучитьЗначениеРеквизита(УзелИнформационнойБазы, "Код")); + + Возврат ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(КаталогВременныхФайлов(), Ключ); + +КонецФункции + +&НаСервереБезКонтекста +Процедура ЗаписатьДанныеСтатистикиСопоставления(ИмяПланаОбмена, УзелИнформационнойБазы, Знач ИнформацияСтатистики, ИдентификаторФайлаПакетаДанных) + + Если ТипЗнч(ИнформацияСтатистики) = Тип("ДанныеФормыКоллекция") Тогда + + ИнформацияСтатистики = ИнформацияСтатистики.Выгрузить(); + + КонецЕсли; + + ДанныеСтатистикиСопоставления = Новый Структура; + ДанныеСтатистикиСопоставления.Вставить("ИдентификаторФайлаПакетаДанных", ИдентификаторФайлаПакетаДанных); + ДанныеСтатистикиСопоставления.Вставить("ИнформацияСтатистикиСопоставленияОбъектов", ИнформацияСтатистики); + + ЗначениеВФайл(ИмяФайлаДанныхСтатистикиСопоставления(ИмяПланаОбмена, УзелИнформационнойБазы), ДанныеСтатистикиСопоставления); + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура УдалитьВременныйКаталогСообщенийОбмена(ИмяВременногоКаталога) + + Если Не ПустаяСтрока(ИмяВременногоКаталога) Тогда + + Попытка + УдалитьФайлы(ИмяВременногоКаталога); + ИмяВременногоКаталога = ""; + Исключение + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьИмяКаталогаНаСервере(ВидТранспортаСообщенийОбмена, УзелИнформационнойБазы) + + Возврат РегистрыСведений.НастройкиТранспортаОбмена.ИмяКаталогаОбменаИнформацией(ВидТранспортаСообщенийОбмена, УзелИнформационнойБазы); + +КонецФункции + +&НаСервереБезКонтекста +Функция УзелИнформационнойБазыИспользуетсяВСценарииОбмена(УзелИнформационнойБазы) + + ТекстЗапроса = " + |ВЫБРАТЬ ПЕРВЫЕ 1 1 + |ИЗ + | Справочник.СценарииОбменовДанными.НастройкиОбмена КАК СценарииОбменовДаннымиНастройкиОбмена + |ГДЕ + | СценарииОбменовДаннымиНастройкиОбмена.УзелИнформационнойБазы = &УзелИнформационнойБазы + | И НЕ СценарииОбменовДаннымиНастройкиОбмена.Ссылка.ПометкаУдаления + |"; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("УзелИнформационнойБазы", УзелИнформационнойБазы); + Запрос.Текст = ТекстЗапроса; + + Возврат Не Запрос.Выполнить().Пустой(); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// НА КЛИЕНТЕ + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ИнициализацияМастераНаКлиенте(); + + УстановитьВидимостьНаКлиенте(); + + мЗакрытьФормуБезусловно = Ложь; + + Если ВыполнитьСопоставлениеПриОткрытии Тогда + + // если необходимо выполнить сопоставление при открытии помощника, + // то переходим сразу к странице загрузки информации статистики при открытии + ИзменитьНомерСтраницы(+1); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Если мЗакрытьФормуБезусловно = Истина Тогда + Возврат; + КонецЕсли; + + НСтрока = НСтр("ru = 'Выйти из помощника интерактивного обмена данными?'"); + + Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет); + + Если Ответ = КодВозвратаДиалога.Нет Тогда + + Отказ = Истина; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии() + + // удаляем временный каталог + УдалитьВременныйКаталогСообщенийОбмена(Объект.ИмяВременногоКаталогаСообщенийОбмена); + + Оповестить("ЗакрытаФормаПомощникаСопоставленияОбъектов"); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ЗакрытиеФормыСопоставленияОбъектов" + ИЛИ ИмяСобытия = "ИнформацияЗагрузкиДанных" Тогда + + ОбновитьДанныеСтатистикиСопоставленияНаСервере(Параметр); + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ОбновитьИнформациюСопоставленияДляСтроки(Команда) + + Отказ = Ложь; + + ВыделенныеСтроки = Элементы.ИнформацияСтатистики.ВыделенныеСтроки; + + Если ВыделенныеСтроки.Количество() = 0 Тогда + + НСтрока = НСтр("ru = 'Выберите имя таблицы в поле статистической информации.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,"Объект.ИнформацияСтатистики",, Отказ); + Возврат; + КонецЕсли; + + Состояние(НСтр("ru = 'Выполняется сбор информации сопоставления...'")); + + ОбновитьИнформациюСопоставленияПоСтрокеНаСервере(Отказ, ВыделенныеСтроки); + + Если Отказ Тогда + Предупреждение(НСтр("ru = 'При получении информации статистики возникли ошибки.'")); + Иначе + Состояние(НСтр("ru = 'Сбор информации завершен'")); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИнформациюСопоставленияПолностью(Команда) + + Отказ = Ложь; + + ИндексыСтрок = ИндексыВсехСтрокДляСопоставленияДанных(); + + Если ИндексыСтрок.Количество() > 0 Тогда + + Состояние(НСтр("ru = 'Выполняется сбор информации сопоставления...'")); + + ОбновитьИнформациюСопоставленияПоСтрокеНаСервере(Отказ,, ИндексыСтрок); + + КонецЕсли; + + Если Отказ Тогда + Предупреждение(НСтр("ru = 'При получении информации статистики возникли ошибки.'")); + Иначе + Состояние(НСтр("ru = 'Сбор информации завершен'")); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьАвтоматическоеСопоставлениеПоУмолчанию(Команда) + + НСтрока = НСтр("ru = 'Автоматическое сопоставление может занять много времени. Продолжить?'"); + Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Да); + Если Ответ = КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + + Отказ = Ложь; + + ИндексыСтрок = ИндексыВсехСтрокДляСопоставленияДанных(); + + Если ИндексыСтрок.Количество() > 0 Тогда + + Состояние(НСтр("ru = 'Выполняется автоматическое сопоставление по умолчанию...'")); + + ВыполнитьАвтоматическоеСопоставлениеПоУмолчаниюПоСтрокеНаСервере(Отказ, ИндексыСтрок); + + КонецЕсли; + + Если Отказ Тогда + + Предупреждение(НСтр("ru = 'При выполнении автоматического сопоставления возникли ошибки'")); + + Иначе + + Состояние(НСтр("ru = 'Автоматическое сопоставление завершено'")); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьЗагрузкуДанныхВсехТаблиц(Команда) + + НСтрока = НСтр("ru = 'Выполнить загрузку всех данных в информационную базу?'"); + Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Да); + Если Ответ = КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + + Если Элементы.ГруппаДополнительнойИнформации.Видимость Тогда + + НСтрока = НСтр("ru = 'Имеются несопоставленные объекты! + |При загрузке данных будут созданы дубли несопоставленных объектов. Продолжить?'"); + // + Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет); + Если Ответ = КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + + КонецЕсли; + + Отказ = Ложь; + + // получаем массив строк для загрузки данных + ИндексыСтрок = ИндексыВсехСтрокДляЗагрузкиДанных(); + + Если ИндексыСтрок.Количество() > 0 Тогда + + Состояние(НСтр("ru = 'Выполняется загрузка данных...'")); + + ВыполнитьЗагрузкуДанныхНаСервере(Отказ,, ИндексыСтрок); + + КонецЕсли; + + Если Отказ Тогда + + НСтрока = НСтр("ru = 'При загрузке данных возникли ошибки. + |Перейти в журнал регистрации?'"); + // + Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет); + Если Ответ = КодВозвратаДиалога.Да Тогда + + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(Объект.УзелИнформационнойБазы, ЭтаФорма, "ЗагрузкаДанных"); + + КонецЕсли; + + Иначе + Состояние(НСтр("ru = 'Загрузка данных завершена.'")); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьЗагрузкуДанныхДляСтроки(Команда) + + Отказ = Ложь; + + ВыделенныеСтроки = Элементы.ИнформацияСтатистики.ВыделенныеСтроки; + + Если ВыделенныеСтроки.Количество() = 0 Тогда + + НСтрока = НСтр("ru = 'Выберите имя таблицы в поле статистической информации.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,"Объект.ИнформацияСтатистики",, Отказ); + Возврат; + КонецЕсли; + + ВыполнитьПроверкуНаличияСопоставленныхОбъектов(Отказ, ВыделенныеСтроки); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + ВыделенныеСтрокиМассив = КопироватьМассив(ВыделенныеСтроки); + + УдалитьСтрокиСУспешнойЗагрузкойДанных(ВыделенныеСтрокиМассив); + + Если ВыделенныеСтрокиМассив.Количество() > 0 Тогда + + Состояние(НСтр("ru = 'Выполняется загрузка данных...'")); + + ВыполнитьЗагрузкуДанныхНаСервере(Отказ, ВыделенныеСтрокиМассив); + + КонецЕсли; + + Если Отказ Тогда + + НСтрока = НСтр("ru = 'При загрузке данных возникли ошибки. + |Перейти в журнал регистрации?'"); + // + Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет); + Если Ответ = КодВозвратаДиалога.Да Тогда + + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(Объект.УзелИнформационнойБазы, ЭтаФорма, "ЗагрузкаДанных"); + + КонецЕсли; + + Иначе + Состояние(НСтр("ru = 'Загрузка данных завершена.'")); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФормуСопоставления(Команда) + + ТекущиеДанные = Элементы.ИнформацияСтатистики.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Не ТекущиеДанные.СинхронизироватьПоИдентификатору Тогда + Предупреждение(НСтр("ru = 'Для типа данных нельзя выполнить сопоставление объектов.'")); + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ИмяТаблицыПриемника", ТекущиеДанные.ИмяТаблицыПриемника); + ПараметрыФормы.Вставить("ИмяТипаОбъектаТаблицыИсточника", ТекущиеДанные.ТипОбъектаСтрокой); + ПараметрыФормы.Вставить("ПоляТаблицыПриемника", ТекущиеДанные.ПоляТаблицы); + ПараметрыФормы.Вставить("ПоляПоискаТаблицыПриемника", ТекущиеДанные.ПоляПоиска); + ПараметрыФормы.Вставить("ТипИсточникаСтрокой", ТекущиеДанные.ТипИсточникаСтрокой); + ПараметрыФормы.Вставить("ТипПриемникаСтрокой", ТекущиеДанные.ТипПриемникаСтрокой); + ПараметрыФормы.Вставить("ДанныеУспешноЗагружены", ТекущиеДанные.ДанныеУспешноЗагружены); + + ПараметрыФормы.Вставить("УзелИнформационнойБазы", Объект.УзелИнформационнойБазы); + ПараметрыФормы.Вставить("ИмяФайлаСообщенияОбмена", Объект.ИмяФайлаСообщенияОбмена); + + ОткрытьФорму("Обработка.СопоставлениеОбъектовИнформационныхБаз.Форма", ПараметрыФормы, ЭтаФорма, ТекущиеДанные.ИмяТаблицыПриемника); + +КонецПроцедуры + +&НаКлиенте +Процедура ИнформацияСтатистикиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ОткрытьФормуСопоставления(Неопределено); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКаталогОбменаИнформацией(Команда) + + // Вызов сервера без контекста + ИмяКаталога = ПолучитьИмяКаталогаНаСервере(Объект.ВидТранспортаСообщенийОбмена, Объект.УзелИнформационнойБазы); + + Если ПустаяСтрока(ИмяКаталога) Тогда + Предупреждение(НСтр("ru = 'Каталог обмена информацией не задан!'")); + Возврат; + КонецЕсли; + + // открываем каталог в приложении explorer + ЗапуститьПриложение(ИмяКаталога); + +КонецПроцедуры + +&НаКлиенте +Процедура ВидТранспортаСообщенийОбменаПриИзменении(Элемент) + + УстановитьДоступностьКнопкиОткрытияКаталогаОбмена(); + +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьПараметрыТранспортаСообщенийОбмена(Команда) + + Отбор = Новый Структура("Узел", Объект.УзелИнформационнойБазы); + ЗначенияЗаполнения = Новый Структура("Узел", Объект.УзелИнформационнойБазы); + + ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, ЗначенияЗаполнения, "НастройкиТранспортаОбмена", ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных(Команда) + + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(Объект.УзелИнформационнойБазы, ЭтаФорма, "ЗагрузкаДанных"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных(Команда) + + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(Объект.УзелИнформационнойБазы, ЭтаФорма, "ВыгрузкаДанных"); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МАСТЕРА + +&НаКлиенте +Процедура мДалее(Команда) + + ИзменитьНомерСтраницы(+1); + +КонецПроцедуры + +&НаКлиенте +Процедура мНазад(Команда) + + ИзменитьНомерСтраницы(-1); + +КонецПроцедуры + +&НаКлиенте +Процедура мГотово(Команда) + + Если Не УзелИспользуетсяВСценарииОбмена + И ОткрытьПомощникСозданияСценарияОбменаДанными Тогда + + ПараметрыФормы = Новый Структура("УзелИнформационнойБазы", Объект.УзелИнформационнойБазы); + + ОткрытьФормуМодально("Справочник.СценарииОбменовДанными.ФормаОбъекта", ПараметрыФормы, ЭтаФорма); + + КонецЕсли; + + мЗакрытьФормуБезусловно = Истина; + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура мОтмена(Команда) + + мЗакрытьФормуБезусловно = Ложь; + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура мСправка(Команда) + + ОткрытьСправкуФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьВидимостьНаКлиенте() + + // устанавливаем текущую страницу мастера + Элементы.СтраницыМастера.ТекущаяСтраница = мСтраницыМастера[мТекущийНомерСтраницы]; + + // устанавливаем текущую страницу кнопок мастера + Элементы.КнопкиМастера.ТекущаяСтраница = мКнопкиМастера[мТекущийНомерСтраницы]; + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьНомерСтраницы(Итератор) + + Отказ = Ложь; + + // изменяем номер текущей страницы + Инкремент(мТекущийНомерСтраницы, Итератор); + + // обработчики событий при смене страницы мастера + ВыполнитьОбработчикиСобытийМастераПриСменеСтраницы(Отказ, Итератор > 0); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + // отображаем новую страницу мастера + УстановитьВидимостьНаКлиенте(); + +КонецПроцедуры + +&НаКлиенте +Процедура ИнициализацияМастераНаКлиенте() + + мНомераСтраницИВариантыМастера = Новый Соответствие; + мНомераСтраницИВариантыМастера.Вставить("ВыполнитьСопоставление", 20); + + мТекущийНомерСтраницы = мНомераСтраницИВариантыМастера[ВариантРаботыМастера]; + + мСтраницыМастера = Новый Соответствие; + мКнопкиМастера = Новый Соответствие; + + // СТРАНИЦЫ МАСТЕРА + + // ВыполнитьСопоставление + мСтраницыМастера.Вставить(20, Элементы.СтраницаНачала); + мСтраницыМастера.Вставить(21, Элементы.СтраницаИнформацииСтатистики); + мСтраницыМастера.Вставить(22, Элементы.СтраницаОжидания); + мСтраницыМастера.Вставить(23, Элементы.СтраницаОкончанияСопоставления); + + // КНОПКИ МАСТЕРА + + // ВыполнитьСопоставление + мКнопкиМастера.Вставить(20, Элементы.КнопкиНачала); + мКнопкиМастера.Вставить(21, Элементы.КнопкиПродолжения); + мКнопкиМастера.Вставить(22, Элементы.КнопкиОжидания); + мКнопкиМастера.Вставить(23, Элементы.КнопкиОкончания); + +КонецПроцедуры + +&НаКлиенте +Процедура Инкремент(Число, Знач Итератор = 1) + + Число = Число + Итератор; + +КонецПроцедуры + +// ===== {ОБРАБОТЧИКИ СОБЫТИЙ СМЕНЫ СТРАНИЦЫ МАСТЕРА} Начало + +&НаКлиенте +Процедура ВыполнитьОбработчикиСобытийМастераПриСменеСтраницы(Отказ, ЭтоУвеличениеНомераСтраницы) + + ПриИзмененииНомераСтраницы(Отказ); + + Если ЭтоУвеличениеНомераСтраницы Тогда + + ВыполнитьПроверкиПриПереходеНаСледующуюСтраницу(Отказ); + + Если Не Отказ Тогда + + ВыполнитьДействияПриПереходеНаСледующуюСтраницу(Отказ); + + КонецЕсли; + + Иначе + + ВыполнитьПроверкиПриПереходеНаПредыдущуюСтраницу(Отказ); + + Если Не Отказ Тогда + + ВыполнитьДействияПриПереходеНаПредыдущуюСтраницу(Отказ); + + КонецЕсли; + + КонецЕсли; + + Если Отказ Тогда + + Если ЭтоУвеличениеНомераСтраницы Тогда + + Инкремент(мТекущийНомерСтраницы, -1); + + Иначе + + Инкремент(мТекущийНомерСтраницы, +1); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриИзмененииНомераСтраницы(Отказ) + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьПроверкиПриПереходеНаСледующуюСтраницу(Отказ) + + Если мТекущийНомерСтраницы = 21 Тогда + + Если Объект.УзелИнформационнойБазы.Пустая() Тогда + + НСтрока = НСтр("ru = 'Укажите узел информационной базы'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,, "Объект.УзелИнформационнойБазы",, Отказ); + + ИначеЕсли Объект.ВидТранспортаСообщенийОбмена.Пустая() Тогда + + НСтрока = НСтр("ru = 'Укажите вид транспорта сообщений обмена'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,, "Объект.ВидТранспортаСообщенийОбмена",, Отказ); + + КонецЕсли; + + ИначеЕсли мТекущийНомерСтраницы = 22 Тогда + + СтруктураПроверок = Новый Структура("ПакетДанныхЗагруженПолностью, ВсеТаблицыОбъектовСопоставлены", Ложь, Ложь); + + ПолучитьСтруктуруПроверокПриЗавершенииСопоставления(СтруктураПроверок); + + Если Не СтруктураПроверок.ПакетДанныхЗагруженПолностью Тогда + + НСтрока = НСтр("ru = 'Не все данные загружены. Все равно продолжить?'"); + Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет); + Если Ответ = КодВозвратаДиалога.Нет Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + КонецЕсли; + + Если Не СтруктураПроверок.ВсеТаблицыОбъектовСопоставлены Тогда + + НСтрока = НСтр("ru = 'Не все объекты сопоставлены. Все равно продолжить?'"); + Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет); + Если Ответ = КодВозвратаДиалога.Нет Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьДействияПриПереходеНаСледующуюСтраницу(Отказ) + + Если мТекущийНомерСтраницы = 21 Тогда + + ИнформацияСтатистикиАктуальна = Истина; + + Состояние(НСтр("ru = 'Выполняется чтение заголовка пакета данных...'")); + + ПолучитьЗаголовокПакетаДанныхНаСервере(Отказ, ИнформацияСтатистикиАктуальна); + + Если Отказ Тогда + + // Чтение входящего сообщения обмена произошло с ошибками + // Переходим к шагу выгрузки исходящего сообщения обмена + + Предупреждение(НСтр("ru = 'В процессе загрузки данных возникли ошибки.'")); + + Отказ = Ложь; + + ИзменитьНомерСтраницы(+1); + + ИначеЕсли Не ИнформацияСтатистикиАктуальна Тогда + + // если информация устарела (есть новый файл пакета данных), то обновляем ее + ОбновитьИнформациюСопоставленияПолностью(Неопределено); + + КонецЕсли; + + ИначеЕсли мТекущийНомерСтраницы = 22 Тогда + + ПодключитьОбработчикОжидания("ВыполнитьВыгрузкуНаКлиенте", 0.1, Истина); + + ИначеЕсли мТекущийНомерСтраницы = 23 Тогда + + ПолучитьСостояниеОбменовДанными(РезультатЗагрузкиДанных, РезультатВыгрузкиДанных, Объект.УзелИнформационнойБазы); + + ОбновитьОтображениеЭлементовСтатусаОбменаДанными(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьПроверкиПриПереходеНаПредыдущуюСтраницу(Отказ) + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьДействияПриПереходеНаПредыдущуюСтраницу(Отказ) + +КонецПроцедуры + +// ===== {ОБРАБОТЧИКИ СОБЫТИЙ СМЕНЫ СТРАНИЦЫ МАСТЕРА} Окончание + +&НаКлиенте +Процедура УдалитьСтрокиСУспешнойЗагрузкойДанных(ВыделенныеСтроки) + + МаксимальныйИндекс = ВыделенныеСтроки.Количество() - 1; + + Для Индекс = 0 По МаксимальныйИндекс Цикл + + ОбратныйИндекс = МаксимальныйИндекс - Индекс; + + СтрокаТаблицы = Объект.ИнформацияСтатистики.НайтиПоИдентификатору(ВыделенныеСтроки[ОбратныйИндекс]); + + Если СтрокаТаблицы.ДанныеУспешноЗагружены Тогда + + ВыделенныеСтроки.Удалить(ОбратныйИндекс); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьПроверкуНаличияСопоставленныхОбъектов(Отказ, ВыделенныеСтроки) + + Для Каждого ИдентификаторСтроки ИЗ ВыделенныеСтроки Цикл + + // оповещение состояния + СтрокаТаблицы = Объект.ИнформацияСтатистики.НайтиПоИдентификатору(ИдентификаторСтроки); + + Если СтрокаТаблицы.ДанныеУспешноЗагружены Тогда + Продолжить; + КонецЕсли; + + Если СтрокаТаблицы.КоличествоОбъектовНесопоставленных <> 0 Тогда + + НСтрока = НСтр("ru = 'Имеются несопоставленные объекты! + |При загрузке данных будут созданы дубли несопоставленных объектов. Продолжить?'"); + // + Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет); + Если Ответ = КодВозвратаДиалога.Нет Тогда + Отказ = Истина; + Прервать; + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Функция КопироватьМассив(Массив) + + Результат = Новый Массив; + + Для Каждого Элемент ИЗ Массив Цикл + + Результат.Добавить(Элемент); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция ИндексыВсехСтрокДляЗагрузкиДанных() + + // возвращаемое значение функции + ИндексыСтрок = Новый Массив; + + Для Каждого СтрокаТаблицы ИЗ Объект.ИнформацияСтатистики Цикл + + Если СтрокаТаблицы.ДанныеУспешноЗагружены Тогда + Продолжить; + КонецЕсли; + + ИндексыСтрок.Добавить(Объект.ИнформацияСтатистики.Индекс(СтрокаТаблицы)); + + КонецЦикла; + + Возврат ИндексыСтрок; + +КонецФункции + +&НаКлиенте +Функция ИндексыВсехСтрокДляСопоставленияДанных() + + // возвращаемое значение функции + ИндексыСтрок = Новый Массив; + + Для Каждого СтрокаТаблицы ИЗ Объект.ИнформацияСтатистики Цикл + + Если СтрокаТаблицы.СинхронизироватьПоИдентификатору Тогда + + ИндексыСтрок.Добавить(Объект.ИнформацияСтатистики.Индекс(СтрокаТаблицы)); + + КонецЕсли; + + КонецЦикла; + + Возврат ИндексыСтрок; + +КонецФункции + +&НаКлиенте +Процедура ВыполнитьВыгрузкуНаКлиенте() + + Отказ = Ложь; + + ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(Отказ, Объект.УзелИнформационнойБазы, Ложь, Истина, Объект.ВидТранспортаСообщенийОбмена); + + Если Отказ Тогда + + Предупреждение(НСтр("ru = 'В процессе выгрузки данных возникли ошибки.'")); + + КонецЕсли; + + // перелистываем страницу помощника на следующую + ИзменитьНомерСтраницы(+1); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьКнопкиОткрытияКаталогаОбмена() + + Элементы.ОткрытьКаталогОбменаИнформацией.Доступность = Не (Объект.ВидТранспортаСообщенийОбмена = ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.EMAIL")); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьОтображениеЭлементовСтатусаОбменаДанными() + + Элементы.СтраницыСтатусаЗагрузкиДанных.ТекущаяСтраница = Элементы[СтраницыСтатусаЗагрузкиДанных()[РезультатЗагрузкиДанных]]; + Элементы.СтраницыСтатусаВыгрузкиДанных.ТекущаяСтраница = Элементы[СтраницыСтатусаВыгрузкиДанных()[РезультатВыгрузкиДанных]]; + + Элементы.ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных.Заголовок = ЗаголовкиГиперссылокЗагрузкиДанных()[РезультатЗагрузкиДанных]; + Элементы.ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных.Заголовок = ЗаголовкиГиперссылокВыгрузкиДанных()[РезультатВыгрузкиДанных]; + +КонецПроцедуры + +// + +&НаКлиенте +Функция СтраницыСтатусаЗагрузкиДанных() + + Если ТипЗнч(ПолеСтраницыСтатусаЗагрузкиДанных) <> Тип("Структура") Тогда + + ПолеСтраницыСтатусаЗагрузкиДанных = ОбменДаннымиКлиент.СтраницыСтатусаЗагрузкиДанных(); + + КонецЕсли; + + Возврат ПолеСтраницыСтатусаЗагрузкиДанных; + +КонецФункции + +&НаКлиенте +Функция СтраницыСтатусаВыгрузкиДанных() + + Если ТипЗнч(ПолеСтраницыСтатусаВыгрузкиДанных) <> Тип("Структура") Тогда + + ПолеСтраницыСтатусаВыгрузкиДанных = ОбменДаннымиКлиент.СтраницыСтатусаВыгрузкиДанных(); + + КонецЕсли; + + Возврат ПолеСтраницыСтатусаВыгрузкиДанных; +КонецФункции + +&НаКлиенте +Функция ЗаголовкиГиперссылокЗагрузкиДанных() + + Если ТипЗнч(ПолеЗаголовкиГиперссылокЗагрузкиДанных) <> Тип("Структура") Тогда + + ПолеЗаголовкиГиперссылокЗагрузкиДанных = ОбменДаннымиКлиент.ЗаголовкиГиперссылокЗагрузкиДанных(); + + КонецЕсли; + + Возврат ПолеЗаголовкиГиперссылокЗагрузкиДанных; + +КонецФункции + +&НаКлиенте +Функция ЗаголовкиГиперссылокВыгрузкиДанных() + + Если ТипЗнч(ПолеЗаголовкиГиперссылокВыгрузкиДанных) <> Тип("Структура") Тогда + + ПолеЗаголовкиГиперссылокВыгрузкиДанных = ОбменДаннымиКлиент.ЗаголовкиГиперссылокВыгрузкиДанных(); + + КонецЕсли; + + Возврат ПолеЗаголовкиГиперссылокВыгрузкиДанных; +КонецФункции diff --git a/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Help/ru.html b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Help/ru.html new file mode 100644 index 000000000..9695321c2 --- /dev/null +++ b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/Help/ru.html @@ -0,0 +1,5 @@ + +

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

    +

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

    +

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

    +

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

    \ 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..e25416d16 --- /dev/null +++ b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/ObjectModule.bsl @@ -0,0 +1,386 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Получает статистику сопоставления объектов для строк таблицы ИнформацияСтатистики +// +// Параметры: +// Отказ – Булево – флаг отказа; поднимается в случае возникновения ошибок при работе процедуры +// ИндексыСтрок – Массив – индексы строк таблицы ИнформацияСтатистики +// для которых необходимо получить информацию статистики сопоставления +// +Процедура ПолучитьСтатистикуСопоставленияОбъектовПоСтроке(Отказ, ИндексыСтрок) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + // выполняем загрузку данных из сообщения обмена в кэш сразу для нескольких таблиц + ВыполнитьЗагрузкуДанныхИзСообщенияОбменаВКэш(Отказ, ИндексыСтрок); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + СопоставлениеОбъектовИнформационныхБаз = Обработки.СопоставлениеОбъектовИнформационныхБаз.Создать(); + + // получаем информацию дайджеста сопоставления отдельно для каждой таблицы + Для Каждого ИндексСтроки ИЗ ИндексыСтрок Цикл + + СтрокаТаблицы = ИнформацияСтатистики[ИндексСтроки]; + + Если Не СтрокаТаблицы.СинхронизироватьПоИдентификатору Тогда + Продолжить; + КонецЕсли; + + // инициализация свойств обработки + СопоставлениеОбъектовИнформационныхБаз.ИмяТаблицыПриемника = СтрокаТаблицы.ИмяТаблицыПриемника; + СопоставлениеОбъектовИнформационныхБаз.ИмяТипаОбъектаТаблицыИсточника = СтрокаТаблицы.ТипОбъектаСтрокой; + СопоставлениеОбъектовИнформационныхБаз.УзелИнформационнойБазы = УзелИнформационнойБазы; + СопоставлениеОбъектовИнформационныхБаз.ИмяФайлаСообщенияОбмена = ИмяФайлаСообщенияОбмена; + + СопоставлениеОбъектовИнформационныхБаз.ТипИсточникаСтрокой = СтрокаТаблицы.ТипИсточникаСтрокой; + СопоставлениеОбъектовИнформационныхБаз.ТипПриемникаСтрокой = СтрокаТаблицы.ТипПриемникаСтрокой; + + // конструктор + СопоставлениеОбъектовИнформационныхБаз.Конструктор(); + + // получаем информацию дайджеста сопоставления + СопоставлениеОбъектовИнформационныхБаз.ПолучитьИнформациюДайджестаСопоставленияОбъектов(Отказ); + + // информация дайджеста сопоставления + СтрокаТаблицы.КоличествоОбъектовВИсточнике = СопоставлениеОбъектовИнформационныхБаз.КоличествоОбъектовВИсточнике(); + СтрокаТаблицы.КоличествоОбъектовВПриемнике = СопоставлениеОбъектовИнформационныхБаз.КоличествоОбъектовВПриемнике(); + СтрокаТаблицы.КоличествоОбъектовСопоставленных = СопоставлениеОбъектовИнформационныхБаз.КоличествоОбъектовСопоставленных(); + СтрокаТаблицы.КоличествоОбъектовНесопоставленных = СопоставлениеОбъектовИнформационныхБаз.КоличествоОбъектовНесопоставленных(); + СтрокаТаблицы.ПроцентСопоставленияОбъектов = СопоставлениеОбъектовИнформационныхБаз.ПроцентСопоставленияОбъектов(); + СтрокаТаблицы.ИндексКартинки = ОбменДаннымиСервер.ИндексКартинкиТаблицыИнформацииСтатистики(СтрокаТаблицы.КоличествоОбъектовНесопоставленных, СтрокаТаблицы.ДанныеУспешноЗагружены); + + КонецЦикла; + +КонецПроцедуры + +// Выполняет автоматическое сопоставление объектов информационных баз +// с заданными значениями по умолчанию и получает статистику сопоставления объектов +// после автоматического сопоставления +// +// Параметры: +// Отказ – Булево – флаг отказа; поднимается в случае возникновения ошибок при работе процедуры +// ИндексыСтрок – Массив – индексы строк таблицы ИнформацияСтатистики +// для которых необходимо выполнить автоматическое сопоставление +// и получить информацию статистики +// +Процедура ВыполнитьАвтоматическоеСопоставлениеПоУмолчаниюИПолучитьСтатистикуСопоставления(Отказ, ИндексыСтрок) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + // выполняем загрузку данных из сообщения обмена в кэш сразу для нескольких таблиц + ВыполнитьЗагрузкуДанныхИзСообщенияОбменаВКэш(Отказ, ИндексыСтрок); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + СопоставлениеОбъектовИнформационныхБаз = Обработки.СопоставлениеОбъектовИнформационныхБаз.Создать(); + + // выполняем автоматическое сопоставление + // получаем информацию дайджеста сопоставления + Для Каждого ИндексСтроки ИЗ ИндексыСтрок Цикл + + СтрокаТаблицы = ИнформацияСтатистики[ИндексСтроки]; + + Если Не СтрокаТаблицы.СинхронизироватьПоИдентификатору Тогда + Продолжить; + КонецЕсли; + + // инициализация свойств обработки + СопоставлениеОбъектовИнформационныхБаз.ИмяТаблицыПриемника = СтрокаТаблицы.ИмяТаблицыПриемника; + СопоставлениеОбъектовИнформационныхБаз.ИмяТипаОбъектаТаблицыИсточника = СтрокаТаблицы.ТипОбъектаСтрокой; + СопоставлениеОбъектовИнформационныхБаз.ПоляТаблицыПриемника = СтрокаТаблицы.ПоляТаблицы; + СопоставлениеОбъектовИнформационныхБаз.ПоляПоискаТаблицыПриемника = СтрокаТаблицы.ПоляПоиска; + СопоставлениеОбъектовИнформационныхБаз.УзелИнформационнойБазы = УзелИнформационнойБазы; + СопоставлениеОбъектовИнформационныхБаз.ИмяФайлаСообщенияОбмена = ИмяФайлаСообщенияОбмена; + + СопоставлениеОбъектовИнформационныхБаз.ТипИсточникаСтрокой = СтрокаТаблицы.ТипИсточникаСтрокой; + СопоставлениеОбъектовИнформационныхБаз.ТипПриемникаСтрокой = СтрокаТаблицы.ТипПриемникаСтрокой; + + // конструктор + СопоставлениеОбъектовИнформационныхБаз.Конструктор(); + + // выполняем автоматическое сопоставление объектов по умолчанию + СопоставлениеОбъектовИнформационныхБаз.ВыполнитьАвтоматическоеСопоставлениеПоУмолчанию(Отказ); + + // получаем информацию дайджеста сопоставления + СопоставлениеОбъектовИнформационныхБаз.ПолучитьИнформациюДайджестаСопоставленияОбъектов(Отказ); + + // информация дайджеста сопоставления + СтрокаТаблицы.КоличествоОбъектовВИсточнике = СопоставлениеОбъектовИнформационныхБаз.КоличествоОбъектовВИсточнике(); + СтрокаТаблицы.КоличествоОбъектовВПриемнике = СопоставлениеОбъектовИнформационныхБаз.КоличествоОбъектовВПриемнике(); + СтрокаТаблицы.КоличествоОбъектовСопоставленных = СопоставлениеОбъектовИнформационныхБаз.КоличествоОбъектовСопоставленных(); + СтрокаТаблицы.КоличествоОбъектовНесопоставленных = СопоставлениеОбъектовИнформационныхБаз.КоличествоОбъектовНесопоставленных(); + СтрокаТаблицы.ПроцентСопоставленияОбъектов = СопоставлениеОбъектовИнформационныхБаз.ПроцентСопоставленияОбъектов(); + СтрокаТаблицы.ИндексКартинки = ОбменДаннымиСервер.ИндексКартинкиТаблицыИнформацииСтатистики(СтрокаТаблицы.КоличествоОбъектовНесопоставленных, СтрокаТаблицы.ДанныеУспешноЗагружены); + + КонецЦикла; + +КонецПроцедуры + +// Выполняет загрузку данных в информационную базу для строк таблицы ИнформацияСтатистики. +// В случае если будут загружены все данные сообщения обмена, +// то в узел обмена будет записан номер входящего сообщения. +// Это означает, что данные сообщения полностью загружены в информационную базу. +// Повторная загрузка этого сообщения будет отменена. +// +// Параметры: +// Отказ – Булево – флаг отказа; поднимается в случае возникновения ошибок при работе процедуры +// ИндексыСтрок – Массив – индексы строк таблицы ИнформацияСтатистики +// для которых необходимо выполнить загрузку данных +// +Процедура ВыполнитьЗагрузкуДанных(Отказ, ИндексыСтрок) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ТаблицыДляЗагрузки = Новый Массив; + + Для Каждого ИндексСтроки ИЗ ИндексыСтрок Цикл + + СтрокаТаблицы = ИнформацияСтатистики[ИндексСтроки]; + + Если СтрокаТаблицы.ДанныеУспешноЗагружены Тогда + Продолжить; + КонецЕсли; + + ТаблицыДляЗагрузки.Добавить(СтрокаТаблицы.ТипОбъектаСтрокой); + + КонецЦикла; + + // инициализация свойств обработки + СопоставлениеОбъектовИнформационныхБаз = Обработки.СопоставлениеОбъектовИнформационныхБаз.Создать(); + СопоставлениеОбъектовИнформационныхБаз.ИмяФайлаСообщенияОбмена = ИмяФайлаСообщенияОбмена; + СопоставлениеОбъектовИнформационныхБаз.УзелИнформационнойБазы = УзелИнформационнойБазы; + + // выполняем загрузку файла + СопоставлениеОбъектовИнформационныхБаз.ВыполнитьЗагрузкуДанныхВИнформационнуюБазу(Отказ, ТаблицыДляЗагрузки); + + ДанныеУспешноЗагружены = Не Отказ; + + Для Каждого ИндексСтроки ИЗ ИндексыСтрок Цикл + + СтрокаТаблицы = ИнформацияСтатистики[ИндексСтроки]; + + Если СтрокаТаблицы.ДанныеУспешноЗагружены Тогда + Продолжить; + КонецЕсли; + + СтрокаТаблицы.ДанныеУспешноЗагружены = ДанныеУспешноЗагружены; + СтрокаТаблицы.ИндексКартинки = ОбменДаннымиСервер.ИндексКартинкиТаблицыИнформацииСтатистики(СтрокаТаблицы.КоличествоОбъектовНесопоставленных, СтрокаТаблицы.ДанныеУспешноЗагружены); + + КонецЦикла; + + // если загрузка всех данных выполнена, то устанавливаем номер входящего сообщения в узле информационной базы + Если ПакетДанныхЗагруженПолностью() Тогда + + УстановитьНомерВходящегоСообщенияУзлаИнформационнойБазы(Отказ); + + КонецЕсли; + +КонецПроцедуры + +// Выполняет загрузку сообщения обмена из внешнего источника +// (ftp, e-mail, сетевой каталог) во временный каталог пользователя операционной системы +// +// Параметры: +// Отказ – Булево – флаг отказа; поднимается в случае возникновения ошибок при работе процедуры +// ИдентификаторФайлаПакетаДанных – ДатаВремя – дата изменения сообщения обмена; +// выступает в качестве идентификатора файла для подсистемы обмена данными +// +Процедура ПолучитьСообщениеОбменаВоВременныйКаталог(Отказ, ИдентификаторФайлаПакетаДанных = Неопределено) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + // удаляем предыдущий временный каталог сообщений обмена со всеми вложенными файлами + УдалитьВременныйКаталогСообщенийОбмена(ИмяВременногоКаталогаСообщенийОбмена); + + СтруктураДанных = ОбменДаннымиСервер.ПолучитьСообщениеОбменаВоВременныйКаталог(Отказ, УзелИнформационнойБазы, ВидТранспортаСообщенийОбмена); + + ИмяВременногоКаталогаСообщенийОбмена = СтруктураДанных.ИмяВременногоКаталогаСообщенийОбмена; + ИдентификаторФайлаПакетаДанных = СтруктураДанных.ИдентификаторФайлаПакетаДанных; + ИмяФайлаСообщенияОбмена = СтруктураДанных.ИмяФайлаСообщенияОбмена; + +КонецПроцедуры + +// Выполняет анализ входящего сообщения обмена. Заполняет данными таблицу ИнформацияСтатистики +// +// Параметры: +// Отказ – Булево – флаг отказа; поднимается в случае возникновения ошибок при работе процедуры +// +Процедура ВыполнитьАнализСообщенияОбмена(Отказ) Экспорт + + Если ПустаяСтрока(ИмяВременногоКаталогаСообщенийОбмена) Тогда + + НСтрока = НСтр("ru = 'Невозможно прочитать данные. Ошибка транспорта сообщений обмена.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,,, Отказ); + + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + ОбработкаОбменаДанными = ОбменДаннымиПовтИсп.ОбработкаОбменаДляЗагрузкиДанных(Отказ, УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + ОбработкаОбменаДанными.ВыполнитьАнализСообщенияОбмена(); + + Если ОбработкаОбменаДанными.ФлагОшибки() Тогда + + НСтрока = НСтр("ru = 'Ошибка: [СтрокаСообщенияОбОшибке]'"); + НСтрока = СтрЗаменить(НСтрока, "[СтрокаСообщенияОбОшибке]", ОбработкаОбменаДанными.СтрокаСообщенияОбОшибке()); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,,, Отказ); + + Возврат; + КонецЕсли; + + НомерВходящегоСообщения = ОбработкаОбменаДанными.НомерВходящегоСообщения(); + + ИнформацияСтатистики.Загрузить(ОбработкаОбменаДанными.ТаблицаДанныхЗаголовкаПакета()); + + // дополняем таблицу статистики служебными данными + ДополнитьТаблицуСтатистики(Отказ); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ СВОЙСТВА + +// Функция-свойство: данные табличной части ИнформацияСтатистики +// +// Тип: ТаблицаЗначений +// +Функция ТаблицаИнформацииСтатистики() Экспорт + + Возврат ИнформацияСтатистики.Выгрузить(); + +КонецФункции + +// + +Функция ПакетДанныхЗагруженПолностью() + + ТаблицаУспешныхЗагрузок = ИнформацияСтатистики.Выгрузить(Новый Структура("ДанныеУспешноЗагружены", Истина) ,"ДанныеУспешноЗагружены"); + + Возврат ТаблицаУспешныхЗагрузок.Количество() = ИнформацияСтатистики.Количество(); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ВСПОМОГАТЕЛЬНЫЕ + +// Выполняет загрузку данных (таблиц) из сообщения обмена в кэш +// Загружаются только те таблицы, которые ранее не были загружены +// Переменная ОбработкаОбменаДанными содержит (кэширует) ранее загруженные таблицы +// +// Параметры: +// Нет. +// +Процедура ВыполнитьЗагрузкуДанныхИзСообщенияОбменаВКэш(Отказ, ИндексыСтрок) + + ОбработкаОбменаДанными = ОбменДаннымиПовтИсп.ОбработкаОбменаДляЗагрузкиДанных(Отказ, УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + // получаем массив таблиц, которые необходимо пакетно загрузить в кэш платформы + ТаблицыДляЗагрузки = Новый Массив; + + Для Каждого ИндексСтроки ИЗ ИндексыСтрок Цикл + + СтрокаТаблицы = ИнформацияСтатистики[ИндексСтроки]; + + Если Не СтрокаТаблицы.СинхронизироватьПоИдентификатору Тогда + Продолжить; + КонецЕсли; + + // таблица данных может быть уже загружена и находиться в кэше обработки ОбработкаОбменаДанными + ТаблицаДанных = ОбработкаОбменаДанными.ТаблицыДанныхСообщенияОбмена().Получить(СтрокаТаблицы.ТипОбъектаСтрокой); + + Если ТаблицаДанных = Неопределено Тогда + + ТаблицыДляЗагрузки.Добавить(СтрокаТаблицы.ТипОбъектаСтрокой); + + КонецЕсли; + + КонецЦикла; + + // выполняем пакетную загрузку таблиц в кэш + Если ТаблицыДляЗагрузки.Количество() > 0 Тогда + + ОбработкаОбменаДанными.ВыполнитьЗагрузкуДанныхВТаблицуЗначений(ТаблицыДляЗагрузки); + + Если ОбработкаОбменаДанными.ФлагОшибки() Тогда + + НСтрока = НСтр("ru = 'При загрузке сообщения обмена возникли ошибки. [СтрокаСообщенияОбОшибке]'"); + НСтрока = СтрЗаменить(НСтрока, "[СтрокаСообщенияОбОшибке]", ОбработкаОбменаДанными.СтрокаСообщенияОбОшибке()); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,,, Отказ); + + Возврат; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьНомерВходящегоСообщенияУзлаИнформационнойБазы(Отказ) + + УзелИнформационнойБазыОбъект = УзелИнформационнойБазы.ПолучитьОбъект(); + УзелИнформационнойБазыОбъект.НомерПринятого = НомерВходящегоСообщения; + + Попытка + УзелИнформационнойБазыОбъект.Записать(); + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()),,,, Отказ); + КонецПопытки; + +КонецПроцедуры + +Процедура УдалитьВременныйКаталогСообщенийОбмена(ИмяВременногоКаталога) + + Если Не ПустаяСтрока(ИмяВременногоКаталога) Тогда + + Попытка + УдалитьФайлы(ИмяВременногоКаталога); + ИмяВременногоКаталога = ""; + Исключение + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры + +Процедура ДополнитьТаблицуСтатистики(Отказ) + + Для Каждого СтрокаТаблицы ИЗ ИнформацияСтатистики Цикл + + Попытка + Тип = Тип(СтрокаТаблицы.ТипОбъектаСтрокой); + Исключение + + СтрокаСообщения = НСтр("ru = 'Ошибка! Тип не определен: [ТипОбъектаСтрокой]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ТипОбъектаСтрокой]", СтрокаТаблицы.ТипОбъектаСтрокой); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщения,,,, Отказ); + Продолжить; + + КонецПопытки; + + СтрокаТаблицы.ИмяТаблицыПриемника = ПолучитьИмяТаблицыПоТипу(Тип); + + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьИмяТаблицыПоТипу(Тип) + + Возврат Метаданные.НайтиПоТипу(Тип).ПолноеИмя(); + +КонецФункции diff --git a/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/ПомощникСопоставленияОбъектовИнформационныхБаз.mdo b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/ПомощникСопоставленияОбъектовИнформационныхБаз.mdo new file mode 100644 index 000000000..f3b69a192 --- /dev/null +++ b/SSL/src/DataProcessors/ПомощникСопоставленияОбъектовИнформационныхБаз/ПомощникСопоставленияОбъектовИнформационныхБаз.mdo @@ -0,0 +1,330 @@ + + + + + + + ПомощникСопоставленияОбъектовИнформационныхБаз + + ru + Помощник интерактивного обмена данными + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.Form.Форма + + + ru + + + + ВидТранспортаСообщенийОбмена + + ru + Укажите способ обмена данными + + + EnumRef.ВидыТранспортаСообщенийОбмена + + + + + + ИмяВременногоКаталогаСообщенийОбмена + + ru + Имя временного каталога сообщений обмена + + + String + + + + + + + ИмяФайлаСообщенияОбмена + + ru + Имя файла сообщения обмена + + + String + + + + + + + ИмяПланаОбмена + + ru + Имя плана обмена + + + String + + + + + + + НомерВходящегоСообщения + + ru + Номер входящего сообщения + + + Number + + 10 + true + + + + + + + УзелИнформационнойБазы + + ru + Узел информационной базы + + + ExchangePlanRef + + + + + + + + + + ИнформацияСтатистики + + ru + Информация статистики + + + Use + LineNumber + + Use + + + + + ДанныеУспешноЗагружены + + ru + Данные успешно загружены + + + Boolean + + + + + + + ИмяТаблицыПриемника + + ru + Имя таблицы + + + String + + + + + + + + ИндексКартинки + + Number + + 1 + + + + + + + + КоличествоОбъектовВИсточнике + + ru + Объектов в базе-источнике, шт + + + Number + + 10 + + + + + + + + КоличествоОбъектовВПриемнике + + ru + Объектов в этой базе, шт + + + Number + + 10 + + + + + + + + КоличествоОбъектовНесопоставленных + + ru + Осталось сопоставить, шт + + + Number + + 10 + + + + + + + + КоличествоОбъектовСопоставленных + + ru + Объектов сопоставленных, шт + + + Number + + 10 + + + + + + + + ПоляПоиска + + ru + Поля поиска + + Поля поиска по умолчанию + + String + + + + + + + + ПоляТаблицы + + ru + Поля таблицы + + Поля таблицы, для которых определены правила конвертации свойств + + String + + + + + + + + ПроцентСопоставленияОбъектов + + ru + Сопоставление, % + + + Number + + 3 + true + + + + + + + + СинхронизироватьПоИдентификатору + + ru + Синхронизировать по идентификатору + + + Boolean + + + + + + + ТипИсточникаСтрокой + + ru + Тип источника строкой + + + String + + + + + + + + ТипОбъектаСтрокой + + ru + Тип объекта строкой + + + String + + + + + + + + ТипПриемникаСтрокой + + ru + Тип приемника строкой + + + String + + + + + + + + + Форма + + ru + Форма + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Commands/РегламентныеИФоновыеЗадания/CommandModule.bsl b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Commands/РегламентныеИФоновыеЗадания/CommandModule.bsl new file mode 100644 index 000000000..8271b27e4 --- /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..fc5de352a --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/НастройкаОбработкиРегламентныхЗаданий/Form.form @@ -0,0 +1,525 @@ + + + + <key>ru</key> + <value>Настройка обработки регламентных заданий</value> + + + БлокировкаОбработкиРегламентныхЗаданий + 7 + true + true + + true + + + БлокировкаОбработкиРегламентныхЗаданий + + Right + + БлокировкаОбработкиРегламентныхЗаданийРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + БлокировкаОбработкиРегламентныхЗаданийКонтекстноеМеню + 8 + true + + CheckBoxField + Enter + true + Left + true + + + + СеансОбработкиРегламентныхЗаданий + 6 + + АвтоматическиОткрыватьОтдельныйСеансОбработкиРегламентныхЗаданий + 15 + true + true + + true + + + АвтоматическиОткрыватьОтдельныйСеансОбработкиРегламентныхЗаданий + + Right + + АвтоматическиОткрыватьОтдельныйСеансОбработкиРегламентныхЗаданийРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + АвтоматическиОткрыватьОтдельныйСеансОбработкиРегламентныхЗаданийКонтекстноеМеню + 16 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Сеанс обработки регламентных заданий</value> + + + + ru + Сеанс обработки регламентных заданий + + 53 + + СеансОбработкиРегламентныхЗаданийРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + УведомлениеОСостоянииОбработкиРегламентныхЗаданий + 19 + + УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий + 17 + true + true + + true + + + УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий + + Right + + ru + Уведомлять пользователей о состоянии обработки регламентных заданий, если задания не обрабатываются более часа или обработка затянулась более чем на час + + + УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданийРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданийКонтекстноеМеню + 18 + true + + CheckBoxField + Enter + true + Left + true + + + + ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданий + 20 + + <key>ru</key> + <value>Период уведомления, минут</value> + + true + true + + true + + + ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданий + + + OnChange + ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданийПриИзменении + + + ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданийРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданийКонтекстноеМеню + 21 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Уведомление о состоянии обработки регламентных заданий</value> + + + Style.ButtonTextColor + + + System.DefaultGUIFont + false + false + true + false + + + ru + Уведомление о состоянии обработки регламентных заданий + + + УведомлениеОСостоянииОбработкиРегламентныхЗаданийРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ЗаписатьИЗакрыть + 14 + true + true + + true + + false + + ЗаписатьИЗакрытьРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + Auto + true + true + true + UserCmds + Auto + + + Записать + 25 + true + true + + true + + false + + ЗаписатьРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.Command.Записать + Normal + Auto + true + true + UserCmds + Auto + + + ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданий + 24 + true + true + + true + + false + + ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданийРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.Command.ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданий + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + CustomizeForm + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + БлокировкаОбработкиРегламентныхЗаданий + + <key>ru</key> + <value>Блокировка регламентных заданий</value> + + 4 + + Boolean + + + true + + + true + + true + + + АвтоматическиОткрыватьОтдельныйСеансОбработкиРегламентныхЗаданий + + <key>ru</key> + <value>Автоматически открывать отдельный сеанс обработки регламентных заданий</value> + + 1 + + Boolean + + + true + + + true + + true + + + УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий + + <key>ru</key> + <value>Уведомлять о некорректном состоянии обработки регламентных заданий</value> + + 2 + + Boolean + + + true + + + true + + true + + + ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданий + + <key>ru</key> + <value>Период уведомления о состоянии обработки регламентных заданий</value> + + 3 + + Number + + 2 + true + + + + true + + + true + + true + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 1 + + ru + Записать и закрыть + + + true + + + StdPicture.WriteAndClose + + + + ЗаписатьИЗакрытьВыполнить + + + TextPicture + Auto + Auto + + + ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданий + + <key>ru</key> + <value>Открыть отдельный сеанс</value> + + 2 + + ru + Открыть отдельный сеанс обработки регламентных заданий + + + true + + + CommonPicture.ОтдельныйСеансОбработкиРегламентныхЗаданий + + + + ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданийВыполнить + + + TextPicture + Auto + Auto + + + Записать + + <key>ru</key> + <value>Записать</value> + + 3 + + ru + Записать + + + true + + + StdPicture.Write + + + + Записать + + + Picture + Auto + Auto + + + СкрытьКомандуОткрытияОтдельногоСеанса + + Boolean + + + + + + + diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/НастройкаОбработкиРегламентныхЗаданий/Help/ru.html b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/НастройкаОбработкиРегламентныхЗаданий/Help/ru.html new file mode 100644 index 000000000..e751a40b9 --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/НастройкаОбработкиРегламентныхЗаданий/Help/ru.html @@ -0,0 +1,37 @@ + +

    Форма "Настройка обработки регламентных заданий" предназначена для файловой информационной базы.

    +

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

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

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

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

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

    Прим.: колонка "А" содержит знак "+" там, где для изменение свойства доступно только Администратору.

    +

    + + +
    КомандаОписание
    Открыть сеанс.Только для файловой ИБ. Открывает отдельный сеанс для обработки регламентных заданий.
    Производится запуск отдельного сеанса с параметрами, такими, что сеанс открывается только для обработки регламентных заданий и считает текущий сеанс родительским, кроме того отдельный сеанс автоматически завершается при завершении родительского сеанса.

     

    +

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

    +

    +

    + + + + +
    +

    Параметр

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

    +

    + + + + +
    +

    Примеры строки программы в ярылке Windows.

    +

    Назначение

    Строка
    Включить обработку заданий в открываемом сеансе."C:\Program Files\1cv82\Bin\1cv8c.exe" /CDoScheduledJobs
    +

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

    "C:\Program Files\1cv82\Bin\1cv8c.exe" ENTERPRISE /IBConnectionString"File=""C:\Инфорационная база"";" /NВасилий /PПароль /C"DoScheduledJobs SkipMessageBox AloneIBSession".
    \ No newline at end of file diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/НастройкаОбработкиРегламентныхЗаданий/Module.bsl b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/НастройкаОбработкиРегламентныхЗаданий/Module.bsl new file mode 100644 index 000000000..0e4eb1e8f --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/НастройкаОбработкиРегламентныхЗаданий/Module.bsl @@ -0,0 +1,98 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если НЕ ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Отказ = Истина; + КонецЕсли; + + Настройки = РегламентныеЗаданияСервер.ПолучитьНастройкиОбработкиРегламентныхЗаданий(); + ЗаполнитьЗначенияСвойств(ЭтаФорма, Настройки); + + Если НЕ ПравоДоступа("Администрирование", Метаданные) Тогда + Элементы.БлокировкаОбработкиРегламентныхЗаданий.Видимость = Ложь; + КонецЕсли; + + Элементы.ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданий.Видимость = НЕ Параметры.СкрытьКомандуОткрытияОтдельногоСеанса; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Если Модифицированность Тогда + КодВозврата = Вопрос(НСтр("ru = 'Записать изменения?'"), РежимДиалогаВопрос.ДаНетОтмена); + Если КодВозврата = КодВозвратаДиалога.Да Тогда + ЗаписатьИзменения(); + ИначеЕсли КодВозврата = КодВозвратаДиалога.Отмена Тогда + Отказ = Истина; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданийВыполнить() + + ПодключитьОбработчикОжидания("ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданийЧерезОбработчикОжидания", 1, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьИЗакрытьВыполнить() + + ЗаписатьИзменения(); + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура Записать(Команда) + + ЗаписатьИзменения(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданийПриИзменении(Элемент) + + Если ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданий <= 0 Тогда + ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданий = 1; + КонецЕсли; + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции формы +// + +&НаКлиенте +Процедура ЗаписатьИзменения() + + ЗаписатьИзмененияНаСервере(); + Модифицированность = Ложь; + РегламентныеЗаданияКлиент.ОтключитьГлобальныйОбработчикОжидания("УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий"); + Если УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий Тогда + РегламентныеЗаданияКлиент.ПодключитьГлобальныйОбработчикОжидания("УведомлятьОНекорректномСостоянииОбработкиРегламентныхЗаданий", + ПериодУведомленияОСостоянииОбработкиРегламентныхЗаданий * 60, + Истина); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьИзмененияНаСервере() + + Настройки = РегламентныеЗаданияСервер.ПолучитьНастройкиОбработкиРегламентныхЗаданий(); + ЗаполнитьЗначенияСвойств(Настройки, ЭтаФорма); + РегламентныеЗаданияСервер.УстановитьНастройкиОбработкиРегламентныхЗаданий(Настройки); + ЗаполнитьЗначенияСвойств(ЭтаФорма, Настройки); + +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ОбработкаРегламентныхЗаданий/Form.form b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ОбработкаРегламентныхЗаданий/Form.form new file mode 100644 index 000000000..afd22534d --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ОбработкаРегламентныхЗаданий/Form.form @@ -0,0 +1,195 @@ + + + + <key>ru</key> + <value>Автоматическая обработка регламентных заданий</value> + + + СтрокаСостояния + 2 + true + true + + true + + + СтрокаСостояния + + None + + СтрокаСостоянияРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + + СтрокаСостоянияКонтекстноеМеню + 3 + true + + LabelField + Enter + true + Left + true + + 60 + true + 1 + true + + + Top + true + + ФормаКоманднаяПанель + -1 + + ПрекратитьОбработкуИЗавершитьСеанс + 1 + true + true + + true + + true + false + + ПрекратитьОбработкуИЗавершитьСеансРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + Form.Command.ПрекратитьОбработкуИЗавершитьСеанс + Auto + true + true + true + UserCmds + + Auto + + Left + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + Close + Help + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + DontBlock + true + true + Vertical + true + UseIfNecessary + auto + true + + СтрокаСостояния + + <key>ru</key> + <value>Строка состояния</value> + + 1 + + String + + + + true + + + true + + + + ПериодОбработки + + <key>ru</key> + <value>Период обработки</value> + + 2 + + Number + + 10 + true + + + + true + + + true + + + + ОсталосьДоНачалаОбработки + + <key>ru</key> + <value>Осталось до начала обработки</value> + + 3 + + Number + + 10 + true + + + + true + + + true + + + + ПрекратитьОбработкуИЗавершитьСеанс + + <key>ru</key> + <value>Прекратить обработку и завершить сеанс</value> + + 1 + + true + + + CommonPicture.ОшибкаОбработкиРегламентныхЗаданий + + + + ПрекратитьОбработкуИЗавершитьСеансВыполнить + + + TextPicture + Auto + Auto + + + + + + diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ОбработкаРегламентныхЗаданий/Module.bsl b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ОбработкаРегламентныхЗаданий/Module.bsl new file mode 100644 index 000000000..9761f5b42 --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ОбработкаРегламентныхЗаданий/Module.bsl @@ -0,0 +1,76 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ПериодОбработки = 3; // Секунды. + ОсталосьДоНачалаОбработки = ПериодОбработки + 1; // Секунды. + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ОбработатьРегламентныеЗадания(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий команд и элементов формы +// + +&НаКлиенте +Процедура ПрекратитьОбработкуИЗавершитьСеансВыполнить() + + Закрыть(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции формы +// + +&НаКлиенте +Процедура ОбработатьРегламентныеЗадания() + + Перезапустить = Ложь; + Если НужноПрекратитьОбработку(ПараметрЗапуска, Перезапустить) Тогда + Закрыть(?(Перезапустить, "Перезапустить", Неопределено)); + Иначе + ОсталосьДоНачалаОбработки = ОсталосьДоНачалаОбработки - 1; + Если ОсталосьДоНачалаОбработки <= 0 Тогда + + ОсталосьДоНачалаОбработки = ПериодОбработки; + + СтрокаСостояния = НСтр("ru = 'Выполняется обработка, дождитесь завершения... '"); + ОбновитьОтображениеДанных(); + + РегламентныеЗаданияСервер.ОбработатьРегламентныеЗадания(); + + КонецЕсли; + КонецЕсли; + + // Если пользователь нажал CTRL+BREAK тогда прекратим обработку + ПодключитьОбработчикОжидания("ПрекратитьОбработкуИЗавершитьСеансВыполнить", 1, Истина); + ОбработкаПрерыванияПользователя(); + ОтключитьОбработчикОжидания("ПрекратитьОбработкуИЗавершитьСеансВыполнить"); + + ПодключитьОбработчикОжидания("ОбработатьРегламентныеЗадания", 1, Истина); + СтрокаСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'До начала обработки осталось секунд: %1'"), Строка(ОсталосьДоНачалаОбработки) ); + +КонецПроцедуры + +&НаСервере +Функция НужноПрекратитьОбработку(ПараметрЗапуска, Перезапустить) + + Перезапустить = КонфигурацияБазыДанныхИзмененаДинамически(); + + Возврат Перезапустить ИЛИ + РегламентныеЗаданияСервер.РодительскийСеансЗаданИЗавершен(ПараметрЗапуска) ИЛИ + НЕ РегламентныеЗаданияСервер.ТекущийСеансОбрабатываетЗадания(); + +КонецФункции diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РабочийСтолОтдельногоСеансаОбработкиРегламентныхЗаданий/Form.form b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РабочийСтолОтдельногоСеансаОбработкиРегламентныхЗаданий/Form.form new file mode 100644 index 000000000..dfd3fd67e --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РабочийСтолОтдельногоСеансаОбработкиРегламентныхЗаданий/Form.form @@ -0,0 +1,149 @@ + + + + ГоризонтальнаяГруппа + 1 + + Картинка + 2 + + <key>ru</key> + <value>Картинка</value> + + true + true + + true + + + КартинкаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + КартинкаКонтекстноеМеню + 3 + true + + 4 + true + 2 + true + false + + + CommonPicture.Информация32 + + + + + Надпись + 4 + + <key>ru</key> + <value>Открыт отдельный сеанс обработки регламентных заданий. +Сеанс закроется автоматически при закрытии основного сеанса.</value> + + true + true + + true + + + НадписьРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + НадписьКонтекстноеМеню + 5 + true + + Label + true + 2 + true + false + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Горизонтальная группа</value> + + + ru + Горизонтальная группа + + + ГоризонтальнаяГруппаРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.РегламентныеИФоновыеЗадания + + + true + + + true + +
    true
    +
    + + + + + +
    diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Form.form b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Form.form new file mode 100644 index 000000000..3f1f588d7 --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Form.form @@ -0,0 +1,1173 @@ + + + + <key>ru</key> + <value>Регламентное задание</value> + + + Основное + 30 + + Наименование + 7 + true + true + + true + + + Наименование + + + OnChange + НаименованиеПриИзменении + + + НаименованиеРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Использование + 9 + true + true + + true + + + Использование + + + ИспользованиеРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ИспользованиеКонтекстноеМеню + 10 + true + + CheckBoxField + Enter + true + Left + true + + + + КоличествоПовторовПриАварийномЗавершении + 13 + true + true + + true + + + КоличествоПовторовПриАварийномЗавершении + + + КоличествоПовторовПриАварийномЗавершенииРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + КоличествоПовторовПриАварийномЗавершенииКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ИнтервалПовтораПриАварийномЗавершении + 11 + true + true + + true + + + ИнтервалПовтораПриАварийномЗавершении + + + ИнтервалПовтораПриАварийномЗавершенииРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + ИнтервалПовтораПриАварийномЗавершенииКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>1. Основное</value> + + + System.DefaultGUIFont + true + false + false + false + + + ОсновноеРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + Дополнительно + 25 + + Идентификатор + 1 + true + true + + true + + + Идентификатор + + true + + ИдентификаторРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ИдентификаторКонтекстноеМеню + 2 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Ключ + 5 + true + true + + true + + + Ключ + + + КлючРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + КлючКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ИмяПользователя + 15 + true + true + + true + + + ИмяПользователя + + + ru + Имя пользователя информационной базы для выполнения фонового задания (имеет смысл только для серверной информационной базы) + + + ИмяПользователяРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ИмяПользователяКонтекстноеМеню + 16 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + String + + + Normal + + + true + true + + true + + + <key>ru</key> + <value>2. Дополнительно</value> + + + System.DefaultGUIFont + true + false + false + false + + + ДополнительноРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + Метаданные + 26 + + ИмяМетаданных + 19 + + <key>ru</key> + <value>Имя</value> + + true + true + + true + + + ИмяМетаданных + + true + + ИмяМетаданныхРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + ИмяМетаданныхКонтекстноеМеню + 20 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + СинонимМетаданных + 21 + + <key>ru</key> + <value>Синоним</value> + + true + true + + true + + + СинонимМетаданных + + true + + СинонимМетаданныхРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + СинонимМетаданныхКонтекстноеМеню + 22 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ИмяМетодаМетаданных + 23 + + <key>ru</key> + <value>Имя метода</value> + + true + true + + true + + + ИмяМетодаМетаданных + + + ИмяМетодаМетаданныхРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + ИмяМетодаМетаданныхКонтекстноеМеню + 24 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + true + Role.ПолныеПрава + + + + <key>ru</key> + <value>3. Метаданные</value> + + + System.DefaultGUIFont + true + false + false + false + + + МетаданныеРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + СообщенияПользователюИОписаниеИнформацииОбОшибке + 33 + + СообщенияИОписаниеИнформацииОбОшибке + 27 + + Style.BorderColor + + + System.DefaultGUIFont + true + false + false + false + + true + true + + true + + + СообщенияПользователюИОписаниеИнформацииОбОшибке + + None + + СообщенияИОписаниеИнформацииОбОшибкеРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + СообщенияИОписаниеИнформацииОбОшибкеКонтекстноеМеню + 28 + true + + InputField + true + Enter + true + Left + true + + true + 3 + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>4. Сообщения пользователю и описание информации об ошибке</value> + + + System.DefaultGUIFont + true + false + false + false + + + СообщенияПользователюИОписаниеИнформацииОбОшибкеРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ЗаписатьИЗакрыть + 17 + true + true + + true + + false + + ЗаписатьИЗакрытьРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + Auto + true + true + true + UserCmds + Auto + + + Записать + 34 + true + true + + true + + + ЗаписатьРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.Command.Записать + Normal + Auto + true + true + UserCmds + Auto + + + ОткрытьРасписание + 29 + true + true + + true + + false + + ОткрытьРасписаниеРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.Command.ОткрытьРасписание + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + CustomizeForm + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + 49 + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Идентификатор + + <key>ru</key> + <value>Идентификатор</value> + + 2 + + String + + + + true + + true + Role.ПолныеПрава + + + + true + + true + Role.ПолныеПрава + + + + + Ключ + + <key>ru</key> + <value>Ключ</value> + + 5 + + String + + + + true + + + true + + true + + + Наименование + + <key>ru</key> + <value>Наименование</value> + + 6 + + String + + + + true + + + true + + true + + + Использование + + <key>ru</key> + <value>Использование</value> + + 7 + + Boolean + + + true + + + true + + ShowError + true + + + ИнтервалПовтораПриАварийномЗавершении + + <key>ru</key> + <value>При ошибке повторять через, сек</value> + + 9 + + Number + + 10 + true + + + + true + + + true + + true + + + КоличествоПовторовПриАварийномЗавершении + + <key>ru</key> + <value>При ошибке повторять, раз</value> + + 10 + + Number + + 10 + true + + + + true + + + true + + true + + + ИмяПользователя + + <key>ru</key> + <value>Имя пользователя</value> + + 8 + + String + + + + true + + true + Role.ПолныеПрава + + + + true + + true + Role.ПолныеПрава + + + true + + + ИмяМетаданных + + <key>ru</key> + <value>Имя метаданных</value> + + 3 + + String + + + + true + + true + Role.ПолныеПрава + + + + true + + true + Role.ПолныеПрава + + + + + СинонимМетаданных + + <key>ru</key> + <value>Синоним метаданных</value> + + 4 + + String + + + + true + + true + Role.ПолныеПрава + + + + true + + true + Role.ПолныеПрава + + + + + ИмяМетодаМетаданных + + <key>ru</key> + <value>Имя метода метаданных</value> + + 11 + + String + + + + true + + true + Role.ПолныеПрава + + + + true + + true + Role.ПолныеПрава + + + + + СообщенияПользователюИОписаниеИнформацииОбОшибке + + <key>ru</key> + <value>Сообщения пользователю и описание информации об ошибке</value> + + 12 + + String + + + + true + + + true + + + + Расписание + + <key>ru</key> + <value>Расписание</value> + + 13 + + + true + + + true + + true + + + ОписанияМетаданныхРегламентныхЗаданий + + <key>ru</key> + <value>Описания метаданных регламентных заданий</value> + + 14 + + ValueList + + + true + + + true + + + + + + + Действие + + <key>ru</key> + <value>Действие</value> + + 15 + + String + + + + true + + + true + + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 2 + + ru + Записать и закрыть + + + true + + + StdPicture.WriteAndClose + + + + ЗаписатьИЗакрытьВыполнить + + + TextPicture + Auto + Auto + + + ОткрытьРасписание + + <key>ru</key> + <value>Расписание</value> + + 1 + + ru + Открыть расписание + + + true + + + StdPicture.SetTime + + + + ОткрытьРасписаниеВыполнить + + + TextPicture + Auto + Auto + + + Записать + + <key>ru</key> + <value>Записать</value> + + 3 + + ru + Записать + + + true + + + StdPicture.Write + + + + Записать + + + Picture + Auto + Auto + + + Идентификатор + + String + + + true + + + Действие + + String + + 20 + + + + + + + + diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Help/ru.html b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Help/ru.html new file mode 100644 index 000000000..b6aa2d4c5 --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Help/ru.html @@ -0,0 +1,29 @@ + +

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

    +

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

    +

    1. Группа свойств "Основное".

    +

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

    +

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

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

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

    2. Группа свойств "Дополнительно".

    + + + + +
    Наименование свойстваНазначение свойства
    Идентификатор +

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

    Ключ +

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

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

     

    +

    3. Группа свойств "Метаданные".

    + + + + +
    Наименование свойстваНазначение свойства
    ИмяИмя шаблона регламентного задания, определённого в конфигураторе.
    СинонимСиноним шаблона регламентного задания, определённого в конфигураторе.
    Имя методаИмя процедуры в конфигруции, которая будет выполнятся в фоновом задании созданным по расписанию регламентного задания.

     

    +

    4. Сообщения пользователю и описание информации об ошибке.

    +

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

    +

     

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Module.bsl b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Module.bsl new file mode 100644 index 000000000..51c9f0e3f --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Module.bsl @@ -0,0 +1,171 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Действие = Параметры.Действие; + + Если Найти(", Добавить, Скопировать, Изменить,", ", " + Действие + ",") = 0 Тогда + ВызватьИсключение(НСтр("ru = 'Неверные параметры в форме ""Регламентное задание"" !'")); + КонецЕсли; + Элементы.ИмяПользователя.Доступность = НЕ ОбщегоНазначения.ИнформационнаяБазаФайловая(); + + Если Действие = "Добавить" Тогда + Расписание = Новый РасписаниеРегламентногоЗадания; + Для каждого РегламентноеЗаданиеМетаданные ИЗ Метаданные.РегламентныеЗадания Цикл + ОписанияМетаданныхРегламентныхЗаданий.Добавить + (РегламентноеЗаданиеМетаданные.Имя + " + |" + РегламентноеЗаданиеМетаданные.Синоним + " + |" + РегламентноеЗаданиеМетаданные.ИмяМетода, + ?(ПустаяСтрока(РегламентноеЗаданиеМетаданные.Синоним), + РегламентноеЗаданиеМетаданные.Имя, + РегламентноеЗаданиеМетаданные.Синоним) ); + КонецЦикла; + Иначе + Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Параметры.Идентификатор); + ЗаполнитьЗначенияСвойств(ЭтаФорма, Задание, "Ключ, Наименование, Использование, ИмяПользователя, ИнтервалПовтораПриАварийномЗавершении, КоличествоПовторовПриАварийномЗавершении"); + Идентификатор = Строка(Задание.УникальныйИдентификатор); + ИмяМетаданных = ?(Задание.Метаданные <> Неопределено, Задание.Метаданные.Имя, НСтр("ru = '<нет метаданных>'")); + СинонимМетаданных = ?(Задание.Метаданные <> Неопределено, Задание.Метаданные.Синоним, НСтр("ru = '<нет метаданных>'")); + ИмяМетодаМетаданных = ?(Задание.Метаданные <> Неопределено, Задание.Метаданные.ИмяМетода, НСтр("ru = '<нет метаданных>'")); + Расписание = Задание.Расписание; + СообщенияПользователюИОписаниеИнформацииОбОшибке = РегламентныеЗаданияСервер.СообщенияИОписанияОшибокРегламентногоЗадания(Задание); + КонецЕсли; + + Если Действие <> "Изменить" Тогда + Идентификатор = НСтр("ru = '<будет создан при записи>'"); + Использование = Ложь; + Наименование = ?(Действие = "Добавить", "", РегламентныеЗаданияСервер.ПредставлениеРегламентногоЗадания(Задание)); + КонецЕсли; + + // Заполнение списка выбора имени пользователя + РегламентныеЗаданияСервер.ДобавитьВСписокЗначенийИменаПользователей(Элементы.ИмяПользователя.СписокВыбора); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если Действие = "Добавить" Тогда + // Выбор шаблона регламентного задания (метаданные) + ЭлементСписка = ОписанияМетаданныхРегламентныхЗаданий.ВыбратьЭлемент(НСтр("ru = 'Выберите предопределенный шаблон регламентного задания'")); + Если ЭлементСписка = Неопределено Тогда + Отказ = Истина; + Возврат; + Иначе + ИмяМетаданных = СтрПолучитьСтроку(ЭлементСписка.Значение, 1); + СинонимМетаданных = СтрПолучитьСтроку(ЭлементСписка.Значение, 2); + ИмяМетодаМетаданных = СтрПолучитьСтроку(ЭлементСписка.Значение, 3); + Наименование = ЭлементСписка.Представление; + КонецЕсли; + КонецЕсли; + + мЗаданиеЗаписано = Ложь; + ОбновитьЗаголовокФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Если Модифицированность Тогда + КодВозврата = Вопрос(НСтр("ru = 'Записать изменения?'"), РежимДиалогаВопрос.ДаНетОтмена); + Если КодВозврата = КодВозвратаДиалога.Да Тогда + ЗаписатьРегламентноеЗадание(); + ИначеЕсли КодВозврата = КодВозвратаДиалога.Отмена Тогда + Отказ = Истина; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий команд и элементов формы +// + +&НаКлиенте +Процедура ЗаписатьИЗакрытьВыполнить() + + ЗаписатьРегламентноеЗадание(); + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура Записать(Команда) + + ЗаписатьРегламентноеЗадание(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьРасписаниеВыполнить() + + Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); + Если Диалог.ОткрытьМодально() Тогда + Расписание = Диалог.Расписание; + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура НаименованиеПриИзменении(Элемент) + + ОбновитьЗаголовокФормы(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции формы +// + +&НаКлиенте +Процедура ЗаписатьРегламентноеЗадание() + + ЗаписатьРегламентноеЗаданиеНаСервере(); + ОбновитьЗаголовокФормы(); + Оповестить("РегламентноеЗаданиеИзменено"); + +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьРегламентноеЗаданиеНаСервере() + + Если Действие = "Изменить" Тогда + Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Идентификатор); + Иначе + Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание(Метаданные.РегламентныеЗадания[ИмяМетаданных]); + Идентификатор = Строка(Задание.УникальныйИдентификатор); + Действие = "Изменить"; + КонецЕсли; + + ЗаполнитьЗначенияСвойств(Задание, ЭтаФорма, "Ключ, Наименование, Использование, ИмяПользователя, ИнтервалПовтораПриАварийномЗавершении, КоличествоПовторовПриАварийномЗавершении"); + Задание.Расписание = Расписание; + Задание.Записать(); + + Модифицированность = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьЗаголовокФормы() + + Если НЕ ПустаяСтрока(Наименование) Тогда + Представление = Наименование; + ИначеЕсли НЕ ПустаяСтрока(СинонимМетаданных) Тогда + Представление = СинонимМетаданных; + Иначе + Представление = ИмяМетаданных; + КонецЕсли; + Если Действие <> "Изменить" Тогда + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Регламентное задание (создание)'"), Представление); + Иначе + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 (Регламентное задание)'"), Представление); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Form.form b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Form.form new file mode 100644 index 000000000..db532b696 --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Form.form @@ -0,0 +1,3374 @@ + + + + Задания + 10 + + РегламентныеЗадания + 27 + + ТаблицаРегламентныеЗадания + 29 + true + true + + true + + + ТаблицаРегламентныеЗадания + + false + None + Change + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + Предопределенное + 34 + + <key>ru</key> + <value>*</value> + + true + true + + true + + + ТаблицаРегламентныеЗадания.Предопределенное + + + ru + Задание, предопределенное в конфигураторе + + + ПредопределенноеРасширеннаяПодсказка + 202 + Label + true + true + + Left + + + + ПредопределенноеКонтекстноеМеню + 35 + true + + CheckBoxField + true + Enter + true + Left + true + + + + Использование + 42 + + <key>ru</key> + <value>Вкл.</value> + + true + true + + true + + + ТаблицаРегламентныеЗадания.Использование + + + ru + Выполнять задание + + + ИспользованиеРасширеннаяПодсказка + 204 + Label + true + true + + Left + + + + ИспользованиеКонтекстноеМеню + 43 + true + + CheckBoxField + true + Enter + true + Left + true + + + + Наименование + 40 + + <key>ru</key> + <value>Представление</value> + + true + true + + true + + + ТаблицаРегламентныеЗадания.Наименование + + + НаименованиеРасширеннаяПодсказка + 206 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 41 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ИмяПользователя + 141 + true + true + + true + + + ТаблицаРегламентныеЗадания.ИмяПользователя + + + ru + Имя пользователя для запуска фонового задания + + + ИмяПользователяРасширеннаяПодсказка + 208 + Label + true + true + + Left + + + + ИмяПользователяКонтекстноеМеню + 142 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + СостояниеВыполнения + 61 + + <key>ru</key> + <value>Состояние</value> + + true + true + + true + + + ТаблицаРегламентныеЗадания.СостояниеВыполнения + + + ru + Состояние фонового задания + + + СостояниеВыполненияРасширеннаяПодсказка + 210 + Label + true + true + + Left + + + + СостояниеВыполненияКонтекстноеМеню + 62 + true + + CheckBoxField + true + Enter + true + Left + true + + + + ДатаОкончания + 52 + true + true + + true + + + ТаблицаРегламентныеЗадания.ДатаОкончания + + + ru + Дата и время окончания последнего завершенного фонового задания + + + ДатаОкончанияРасширеннаяПодсказка + 212 + Label + true + true + + Left + + + + ДатаОкончанияКонтекстноеМеню + 53 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТаблицаРегламентныеЗаданияКоманднаяПанель + 31 + + ТаблицаРегламентныеЗаданияОбновитьДанные + 146 + true + true + + true + + false + + ТаблицаРегламентныеЗаданияОбновитьДанныеРасширеннаяПодсказка + 182 + Label + true + true + + Left + + + Form.Command.ОбновитьДанные + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияДобавить + 157 + true + true + + true + + + ТаблицаРегламентныеЗаданияДобавитьРасширеннаяПодсказка + 183 + Label + true + true + + Left + + + Form.Item.ТаблицаРегламентныеЗадания.StandardCommand.Add + Normal + Picture + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияИзменитьРегламентноеЗадание + 172 + true + true + + true + + + ТаблицаРегламентныеЗаданияИзменитьРегламентноеЗаданиеРасширеннаяПодсказка + 184 + Label + true + true + + Left + + + Form.Command.ИзменитьРегламентноеЗадание + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияСкопировать + 158 + true + true + + true + + + ТаблицаРегламентныеЗаданияСкопироватьРасширеннаяПодсказка + 185 + Label + true + true + + Left + + + Form.Item.ТаблицаРегламентныеЗадания.StandardCommand.Copy + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияУдалить + 160 + true + true + + true + + + ТаблицаРегламентныеЗаданияУдалитьРасширеннаяПодсказка + 186 + Label + true + true + + Left + + + Form.Item.ТаблицаРегламентныеЗадания.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияОткрытьРасписание + 135 + + <key>ru</key> + <value>Расписание</value> + + true + true + + true + + false + + ТаблицаРегламентныеЗаданияОткрытьРасписаниеРасширеннаяПодсказка + 187 + Label + true + true + + Left + + + Form.Command.ОткрытьРасписаниеРегламентногоЗадания + Normal + PictureAndText + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияВыполнитьСейчас + 152 + true + true + + true + + false + + ТаблицаРегламентныеЗаданияВыполнитьСейчасРасширеннаяПодсказка + 188 + Label + true + true + + Left + + + Form.Command.ОбработатьРегламентноеЗаданиеВручную + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияНастройкаОбработки + 136 + true + true + + true + + false + + ТаблицаРегламентныеЗаданияНастройкаОбработкиРасширеннаяПодсказка + 189 + Label + true + true + + Left + + + Form.Command.НастройкаОбработкиРегламентныхЗаданий + Normal + Picture + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияОткрытьОтдельныйСеансОбработки + 155 + true + true + + true + + false + + ТаблицаРегламентныеЗаданияОткрытьОтдельныйСеансОбработкиРасширеннаяПодсказка + 190 + Label + true + true + + Left + + + Form.Command.ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданий + Normal + Picture + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияСправка + 153 + true + true + + true + + false + + ТаблицаРегламентныеЗаданияСправкаРасширеннаяПодсказка + 191 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + Selection + ТаблицаРегламентныеЗаданияВыбор + + + BeforeAddRow + ТаблицаРегламентныеЗаданияПередНачаломДобавления + + + BeforeDeleteRow + ТаблицаРегламентныеЗаданияПередУдалением + + + ТаблицаРегламентныеЗаданияСтрокаПоиска + 193 + + ТаблицаРегламентныеЗаданияСтрокаПоискаРасширеннаяПодсказка + 195 + Label + true + true + + Left + + + + ТаблицаРегламентныеЗаданияСтрокаПоискаКонтекстноеМеню + 194 + true + + ТаблицаРегламентныеЗадания + + true + + + + ТаблицаРегламентныеЗаданияСостояниеПросмотра + 196 + + ТаблицаРегламентныеЗаданияСостояниеПросмотраРасширеннаяПодсказка + 198 + Label + true + true + + Left + + + + ТаблицаРегламентныеЗаданияСостояниеПросмотраКонтекстноеМеню + 197 + true + + ViewStatusAddition + ТаблицаРегламентныеЗадания + + true + + + + ТаблицаРегламентныеЗаданияУправлениеПоиском + 199 + + ТаблицаРегламентныеЗаданияУправлениеПоискомРасширеннаяПодсказка + 201 + Label + true + true + + Left + + + + ТаблицаРегламентныеЗаданияУправлениеПоискомКонтекстноеМеню + 200 + true + + SearchControlAddition + ТаблицаРегламентныеЗадания + + true + + + + ТаблицаРегламентныеЗаданияРасширеннаяПодсказка + 192 + Label + true + true + + Left + + + + ТаблицаРегламентныеЗаданияКонтекстноеМеню + 30 + + ТаблицаРегламентныеЗаданияКонтекстноеМенюОбновитьДанные + 165 + true + true + + true + + + ТаблицаРегламентныеЗаданияКонтекстноеМенюОбновитьДанныеРасширеннаяПодсказка + 175 + Label + true + true + + Left + + + Form.Command.ОбновитьДанные + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияКонтекстноеМенюВывестиСписок + 170 + true + true + + true + + + ТаблицаРегламентныеЗаданияКонтекстноеМенюВывестиСписокРасширеннаяПодсказка + 176 + Label + true + true + + Left + + + Form.Item.ТаблицаРегламентныеЗадания.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияКонтекстноеМенюКопироватьВБуферОбмена + 171 + true + true + + true + + + ТаблицаРегламентныеЗаданияКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка + 177 + Label + true + true + + Left + + + Form.Item.ТаблицаРегламентныеЗадания.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияКонтекстноеМенюДобавить + 166 + true + + true + + + ТаблицаРегламентныеЗаданияКонтекстноеМенюДобавитьРасширеннаяПодсказка + 178 + Label + true + true + + Left + + + Form.Item.ТаблицаРегламентныеЗадания.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияКонтекстноеМенюСкопировать + 167 + true + + true + + + ТаблицаРегламентныеЗаданияКонтекстноеМенюСкопироватьРасширеннаяПодсказка + 179 + Label + true + true + + Left + + + Form.Item.ТаблицаРегламентныеЗадания.StandardCommand.Copy + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияКонтекстноеМенюИзменить + 168 + true + + true + + + ТаблицаРегламентныеЗаданияКонтекстноеМенюИзменитьРасширеннаяПодсказка + 180 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаРегламентныеЗаданияКонтекстноеМенюУдалить + 169 + true + + true + + + ТаблицаРегламентныеЗаданияКонтекстноеМенюУдалитьРасширеннаяПодсказка + 181 + Label + true + true + + Left + + + Form.Item.ТаблицаРегламентныеЗадания.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + None + None + None + true + +
    + true + true + + true + + + <key>ru</key> + <value>Регламентные задания</value> + + + РегламентныеЗаданияРасширеннаяПодсказка + 174 + Label + true + true + + Left + + + Page + + + StdPicture.ScheduledJobs + + Vertical + auto + +
    + + ФоновыеЗадания + 28 + + ОтборНадпись + 149 + + ОтборЛиния + 93 + + ГоризонтальнаяГруппа + 151 + + ПоСостоянию + 97 + + ОтборПоСостояниюЗавершено + 100 + true + true + + true + + + ОтборПоСостояниюЗавершено + + Right + + ru + Отбирать выполненные фоновые задания + + + ОтборПоСостояниюЗавершеноРасширеннаяПодсказка + 227 + Label + true + true + + Left + + + + ОтборПоСостояниюЗавершеноКонтекстноеМеню + 101 + true + + CheckBoxField + Enter + true + Left + true + + + + ОтборПоСостояниюЗавершеноАварийно + 102 + true + true + + true + + + ОтборПоСостояниюЗавершеноАварийно + + Right + + ru + Отбирать фоновые задания выполненные с ошибкой + + + ОтборПоСостояниюЗавершеноАварийноРасширеннаяПодсказка + 229 + Label + true + true + + Left + + + + ОтборПоСостояниюЗавершеноАварийноКонтекстноеМеню + 103 + true + + CheckBoxField + Enter + true + Left + true + + + + ОтборПоСостояниюОтменено + 104 + true + true + + true + + + ОтборПоСостояниюОтменено + + Right + + ru + Отбирать отмененные фоновые задания + + + ОтборПоСостояниюОтмененоРасширеннаяПодсказка + 231 + Label + true + true + + Left + + + + ОтборПоСостояниюОтмененоКонтекстноеМеню + 105 + true + + CheckBoxField + Enter + true + Left + true + + + + ОтборПоСостояниюАктивно + 98 + true + true + + true + + + ОтборПоСостояниюАктивно + + Right + + ru + Отбирать выполняемые фоновые задания + + + ОтборПоСостояниюАктивноРасширеннаяПодсказка + 233 + Label + true + true + + Left + + + + ОтборПоСостояниюАктивноКонтекстноеМеню + 99 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>По состоянию</value> + + + System.DefaultGUIFont + true + false + false + false + + 24 + + ПоСостояниюРасширеннаяПодсказка + 226 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + + ПоПериоду + 150 + + ВидПериода + 106 + + ВидОтбораПоПериоду + 110 + + true + true + + true + + + ВидОтбораПоПериоду + + None + + OnChange + ВидОтбораПоПериодуПриИзменении + + + ВидОтбораПоПериодуРасширеннаяПодсказка + 237 + Label + true + true + + Left + + + + ВидОтбораПоПериодуКонтекстноеМеню + 111 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Произвольный + + + 4 + + + + + ru + Без отбора + + + 0 + + + + + ru + Ночь + + + 1 + + + + + ru + Вчера + + + 2 + + + + + ru + Сегодня + + + 3 + + + Vertical + + + true + true + + true + + + + ВидПериодаРасширеннаяПодсказка + 236 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Период + 112 + + ОтборПериодС + 113 + true + true + + true + + + ОтборПериодС + + + ОтборПериодСРасширеннаяПодсказка + 240 + Label + true + true + + Left + + + + ОтборПериодСКонтекстноеМеню + 114 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ОтборПериодПо + 115 + true + true + + true + + + ОтборПериодПо + + + ОтборПериодПоРасширеннаяПодсказка + 242 + Label + true + true + + Left + + + + ОтборПериодПоКонтекстноеМеню + 116 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + 35 + false + + ПериодРасширеннаяПодсказка + 239 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>По периоду</value> + + + System.DefaultGUIFont + true + false + false + false + + + ПоПериодуРасширеннаяПодсказка + 235 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Горизонтальная группа</value> + + + ru + Горизонтальная группа + + + ГоризонтальнаяГруппаРасширеннаяПодсказка + 225 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ПоРегламентномуЗаданию + 96 + + ОтбиратьПоРегламентномуЗаданию + 94 + true + true + + true + + + ОтбиратьПоРегламентномуЗаданию + + None + + ru + Включить отбор по регламентному заданию + + + OnChange + ОтбиратьПоРегламентномуЗаданиюПриИзменении + + + ОтбиратьПоРегламентномуЗаданиюРасширеннаяПодсказка + 245 + Label + true + true + + Left + + + + ОтбиратьПоРегламентномуЗаданиюКонтекстноеМеню + 95 + true + + CheckBoxField + Enter + true + Left + true + + + + РегламентноеЗаданиеДляОтбора + 56 + true + false + + true + + + РегламентноеЗаданиеДляОтбораПредставление + + None + + ru + Регламентное задание для отбора + + + РегламентноеЗаданиеДляОтбораРасширеннаяПодсказка + 247 + Label + true + true + + Left + + + + РегламентноеЗаданиеДляОтбораКонтекстноеМеню + 57 + true + + InputField + Enter + true + Left + true + + + Clearing + РегламентноеЗаданиеДляОтбораОчистка + + + ChoiceProcessing + РегламентноеЗаданиеДляОтбораОбработкаВыбора + + true + true + true + false + true + false + false + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>По регламентному заданию</value> + + + System.DefaultGUIFont + true + false + false + false + + 2 + + ПоРегламентномуЗаданиюРасширеннаяПодсказка + 244 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Отбор линия</value> + + + System.DefaultGUIFont + true + false + false + false + + + ОтборЛинияРасширеннаяПодсказка + 224 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Отбор</value> + + + System.DefaultGUIFont + true + false + false + false + + + ОтборНадписьРасширеннаяПодсказка + 223 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + ТаблицаФоновыеЗадания + 65 + true + true + + true + + + ТаблицаФоновыеЗадания + + false + None + Add + Change + Copy + Delete + EndEdit + MoveDown + MoveUp + SortListAsc + SortListDesc + + НаименованиеФоновогоЗадания + 139 + true + true + + true + + + ТаблицаФоновыеЗадания.Наименование + + + НаименованиеФоновогоЗаданияРасширеннаяПодсказка + 264 + Label + true + true + + Left + + + + НаименованиеФоновогоЗаданияКонтекстноеМеню + 140 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Состояние + 76 + true + true + + true + + + ТаблицаФоновыеЗадания.Состояние + + + СостояниеРасширеннаяПодсказка + 266 + Label + true + true + + Left + + + + СостояниеКонтекстноеМеню + 77 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Начало + 78 + true + true + + true + + + ТаблицаФоновыеЗадания.Начало + + + НачалоРасширеннаяПодсказка + 268 + Label + true + true + + Left + + + + НачалоКонтекстноеМеню + 79 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Конец + 80 + + <key>ru</key> + <value>Окончание</value> + + true + true + + true + + + ТаблицаФоновыеЗадания.Конец + + + КонецРасширеннаяПодсказка + 270 + Label + true + true + + Left + + + + КонецКонтекстноеМеню + 81 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + НаименованиеРегламентногоЗадания + 90 + + <key>ru</key> + <value>Регламентное задание</value> + + true + true + + true + + + ТаблицаФоновыеЗадания.НаименованиеРегламентногоЗадания + + + НаименованиеРегламентногоЗаданияРасширеннаяПодсказка + 272 + Label + true + true + + Left + + + + НаименованиеРегламентногоЗаданияКонтекстноеМеню + 91 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ТаблицаФоновыеЗаданияКоманднаяПанель + 67 + + ТаблицаФоновыеЗаданияОбновитьДанные + 92 + true + true + + true + + false + + ТаблицаФоновыеЗаданияОбновитьДанныеРасширеннаяПодсказка + 249 + Label + true + true + + Left + + + Form.Command.ОбновитьДанные + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаФоновыеЗаданияОткрыть + 121 + + <key>ru</key> + <value>Открыть</value> + + true + true + + true + + false + + ТаблицаФоновыеЗаданияОткрытьРасширеннаяПодсказка + 250 + Label + true + true + + Left + + + Form.Command.ОткрытьФоновоеЗадание + Normal + PictureAndText + true + true + UserCmds + Auto + + + ТаблицаФоновыеЗаданияОтменить + 122 + + <key>ru</key> + <value>Отменить</value> + + true + true + + true + + false + + ТаблицаФоновыеЗаданияОтменитьРасширеннаяПодсказка + 251 + Label + true + true + + Left + + + Form.Command.ОтменитьФоновоеЗадание + Normal + PictureAndText + true + true + UserCmds + Auto + + + ТаблицаФоновыеЗаданияОчиститьИсторию + 156 + true + true + + true + + false + + ТаблицаФоновыеЗаданияОчиститьИсториюРасширеннаяПодсказка + 252 + Label + true + true + + Left + + + Form.Command.ОчиститьИсториюФоновыхЗаданий + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ТаблицаФоновыеЗаданияСправка + 154 + true + true + + true + + false + + ТаблицаФоновыеЗаданияСправкаРасширеннаяПодсказка + 253 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + Selection + ТаблицаФоновыеЗаданияВыбор + + + ТаблицаФоновыеЗаданияСтрокаПоиска + 255 + + ТаблицаФоновыеЗаданияСтрокаПоискаРасширеннаяПодсказка + 257 + Label + true + true + + Left + + + + ТаблицаФоновыеЗаданияСтрокаПоискаКонтекстноеМеню + 256 + true + + ТаблицаФоновыеЗадания + + true + + + + ТаблицаФоновыеЗаданияСостояниеПросмотра + 258 + + ТаблицаФоновыеЗаданияСостояниеПросмотраРасширеннаяПодсказка + 260 + Label + true + true + + Left + + + + ТаблицаФоновыеЗаданияСостояниеПросмотраКонтекстноеМеню + 259 + true + + ViewStatusAddition + ТаблицаФоновыеЗадания + + true + + + + ТаблицаФоновыеЗаданияУправлениеПоиском + 261 + + ТаблицаФоновыеЗаданияУправлениеПоискомРасширеннаяПодсказка + 263 + Label + true + true + + Left + + + + ТаблицаФоновыеЗаданияУправлениеПоискомКонтекстноеМеню + 262 + true + + SearchControlAddition + ТаблицаФоновыеЗадания + + true + + + + ТаблицаФоновыеЗаданияРасширеннаяПодсказка + 254 + Label + true + true + + Left + + + + ТаблицаФоновыеЗаданияКонтекстноеМеню + 66 + true + + true + true + true + true + true + true +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + None + None + None + true + +
    + + Количество + 120 + + КоличествоФоновыхЗаданийВТаблице + 130 + + <key>ru</key> + <value>Количество отобранных заданий</value> + + true + true + + true + + + КоличествоФоновыхЗаданийВТаблице + + Top + + КоличествоФоновыхЗаданийВТаблицеРасширеннаяПодсказка + 283 + Label + true + true + + Left + + + + КоличествоФоновыхЗаданийВТаблицеКонтекстноеМеню + 131 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + КоличествоФоновыхЗаданийВсего + 132 + + <key>ru</key> + <value>Общее количество заданий</value> + + true + true + + true + + + КоличествоФоновыхЗаданийВсего + + Top + + КоличествоФоновыхЗаданийВсегоРасширеннаяПодсказка + 285 + Label + true + true + + Left + + + + КоличествоФоновыхЗаданийВсегоКонтекстноеМеню + 133 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + КоличествоРасширеннаяПодсказка + 282 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Фоновые задания</value> + + + ФоновыеЗаданияРасширеннаяПодсказка + 222 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + true + true + + true + + + ЗаданияРасширеннаяПодсказка + 173 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + +
    + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + Abort + Cancel + Ignore + No + OK + Retry + Yes + DontBlock + Use + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ТаблицаРегламентныеЗадания + + <key>ru</key> + <value>Таблица регламентные задания</value> + + 3 + + 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> + + 4 + + String + + + + true + + + true + + + + Наименование + + <key>ru</key> + <value>Наименование</value> + + 5 + + String + + + + true + + + true + + + + Использование + + <key>ru</key> + <value>Использование</value> + + 6 + + Boolean + + + true + + + true + + + + Расписание + + <key>ru</key> + <value>Расписание</value> + + 7 + + String + + + + true + + + true + + + + ИнтервалПовтораПриАварийномЗавершении + + <key>ru</key> + <value>При ошибке повторять через, сек</value> + + 8 + + Number + + 10 + true + + + + true + + + true + + + + КоличествоПовторовПриАварийномЗавершении + + <key>ru</key> + <value>При ошибке повторять, раз</value> + + 9 + + Number + + 10 + true + + + + 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 + + String + + + + true + + + true + + + + ИмяПользователя + + <key>ru</key> + <value>Имя пользователя</value> + + 3 + + String + + + + true + + + true + + + + + ТаблицаФоновыеЗадания + + <key>ru</key> + <value>Таблица фоновые задания</value> + + 4 + + 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 + + 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 + + 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> + + 9 + + String + + + + true + + + true + + + + ИдентификаторРегламентногоЗадания + + <key>ru</key> + <value>Идентификатор регламентного задания</value> + + 11 + + String + + + + true + + + true + + + + НаименованиеРегламентногоЗадания + + <key>ru</key> + <value>Наименование регламентного задания</value> + + 12 + + String + + + + true + + + true + + + + + ОтбиратьПоРегламентномуЗаданию + + <key>ru</key> + <value>Отбирать по регламентному заданию</value> + + 2 + + Boolean + + + true + + + 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 + + Number + + 10 + + + + true + + + true + + + ВидОтбораПоПериоду + + + + ОтборПериодС + + <key>ru</key> + <value>с</value> + + 12 + + Date + + + + true + + + true + + + ОтборПериодС + + + + ОтборПериодПо + + <key>ru</key> + <value>по</value> + + 13 + + Date + + + + true + + + true + + + ОтборПериодПо + + + + КоличествоФоновыхЗаданийВТаблице + + <key>ru</key> + <value>Количество фоновых заданий в таблице</value> + + 14 + + Number + + 10 + + + + true + + + true + + + + КоличествоФоновыхЗаданийВсего + + <key>ru</key> + <value>Количество фоновых заданий всего</value> + + 15 + + Number + + 10 + + + + true + + + true + + + + Объект + + <key>ru</key> + <value>Нужен для механизма сохранения настроек</value> + + 1 + + DataProcessorObject.РегламентныеИФоновыеЗадания + + + true + + + true + +
    true
    +
    + + НастройкиЗагружены + + <key>ru</key> + <value>Настройки загружены</value> + + 19 + + Boolean + + + true + + + true + + + + ИдентификаторыЗаданийПриРучнойОбработке + + <key>ru</key> + <value>Идентификаторы заданий при ручной обработке</value> + + 6 + + ValueList + + + true + + + true + + + + + + + ТекстНеопределено + + <key>ru</key> + <value>Текст неопределено</value> + + 20 + + String + + + + true + + + true + + + + РегламентноеЗаданиеДляОтбораИдентификатор + + <key>ru</key> + <value>Регламентное задание для отбора идентификатор</value> + + 22 + + String + + 50 + + + + true + + + true + + + РегламентноеЗаданиеДляОтбораИдентификатор + + + + ПустойИдентификатор + + <key>ru</key> + <value>Пустой идентификатор</value> + + 5 + + String + + 50 + + + + true + + + true + + + + РегламентноеЗаданиеДляОтбораПредставление + + <key>ru</key> + <value>Регламентное задание для отбора представление</value> + + 23 + + String + + + + true + + + true + + + + ИзменитьРегламентноеЗадание + + <key>ru</key> + <value>Изменить</value> + + 2 + + ru + Изменить (или открыть) текущий элемент + + + true + + F3 + + StdPicture.ChangeListItem + + + + ИзменитьРегламентноеЗаданиеВыполнить + + + Auto + Auto + + + ОбновитьДанные + + <key>ru</key> + <value>Обновить</value> + + 4 + + ru + Обновить список регламентных и фоновых заданий (с учетом отбора) + + + true + + F5 + + StdPicture.Refresh + + + + ОбновитьДанныеВыполнить + + + TextPicture + Auto + Auto + + + ОткрытьФоновоеЗадание + + <key>ru</key> + <value>Открыть фоновое задание</value> + + 6 + + ru + Открыть фоновое задание + + + true + + + StdPicture.InputFieldOpen + + + + ОткрытьФоновоеЗаданиеВыполнить + + + Auto + Auto + + + ОтменитьФоновоеЗадание + + <key>ru</key> + <value>Отменить фоновое задание</value> + + 7 + + ru + Отменить фоновое задание + + + true + + + + ОтменитьФоновоеЗаданиеВыполнить + + + Auto + Auto + + + ОткрытьРасписаниеРегламентногоЗадания + + <key>ru</key> + <value>Открыть расписание регламентного задания</value> + + 13 + + ru + Открыть расписание регламентного задания + + + true + + + StdPicture.SetTime + + + + ОткрытьРасписаниеРегламентногоЗаданияВыполнить + + + Auto + Auto + + + НастройкаОбработкиРегламентныхЗаданий + + <key>ru</key> + <value>Настройка обработки регламентных заданий</value> + + 14 + + true + + + CommonPicture.НастройкаОбработкиРегламентныхЗаданий + + + + НастройкаОбработкиРегламентныхЗаданийВыполнить + + + TextPicture + Auto + Auto + + + ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданий + + <key>ru</key> + <value>Открыть отдельный сеанс обработки регламентных заданий</value> + + 8 + + ru + Открыть отдельный сеанс обработки регламентных заданий + + + true + + + CommonPicture.ОтдельныйСеансОбработкиРегламентныхЗаданий + + + + ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданийВыполнить + + + TextPicture + Auto + Auto + + + ОбработатьРегламентноеЗаданиеВручную + + <key>ru</key> + <value>Выполнить сейчас</value> + + 10 + + ru + Выполнить процедуру регламентного задания либо в этом сеансе (для файловой ИБ), либо в фоновом задании на сервере (для серверной ИБ) + + + true + + + CommonPicture.ОбработатьРегламентноеЗаданиеВручную + + + + ОбработатьРегламентноеЗаданиеВручнуюВыполнить + + + TextPicture + Auto + Auto + + + ОчиститьИсториюФоновыхЗаданий + + <key>ru</key> + <value>Очистить историю фоновых заданий</value> + + 9 + + ru + Очистить историю фоновых заданий + + + true + + + + ОчиститьИсториюФоновыхЗаданий + + + Auto + Auto + + + + + 0 + FormNavigationPanelImportant + 2 + + + 0 + FormNavigationPanelImportant + 0 + + + 0 + FormNavigationPanelImportant + 1 + + + 0 + Added + FormNavigationPanelGoTo + 1 + + true + + + + 0 + Added + FormNavigationPanelImportant + 0 + + true + + + + 0 + Added + FormNavigationPanelGoTo + 0 + + true + + + + + + +
    diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Help/ru.html b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Help/ru.html new file mode 100644 index 000000000..dad56e13c --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Help/ru.html @@ -0,0 +1,44 @@ + +

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

    +
    1. Контроль выполнения регламентных заданий. +
    2. Регламентные задания. +
    3. Фоновые задания.

     

    +

    1. Контроль выполнения регламентных заданий.

    +

    Контроль может быть либо простым, либо детальным.

    +

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

    +

    Детальный контроль - это анализ списка фоновых заданий (на странице "Фоновые задания"), которые были созданы и выполнены для выполнения регламентного задания.

    +
    +

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

    +

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

    +

    2. Регламентные задания.

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

    Скопировать

    Открывает форму редактирования нового регламентного задания, предварительно заполненную значениями копируемого задания.
    +

    Удалить

    Удаляет регламентное задание, выбранное в списке (кроме предопределенных).
    РасписаниеОткрывает форму редактирования расписания регламентного задания.
    Выполнить сейчас +

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

    +

    Настройка обработки регламентных заданий

    +

    Только для файловой ИБ. Открывает форму настройки обработки регламентных заданий.

    Открыть отдельный сеанс обработки регламентных заданий +

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

     

    +

    3. Фоновые задания.

    +

    + + + + +
    ОтборОписание
    По состоянию +

    Позволяет выполнить отбор по состоянию (дополнительно к отбору по периоду и по регламентному заданию):
    1) выполнено,
    2) выполнено с ошибкой,
    3) отменено (пользователь отменил выполнение фонового задания на сервере)
    4) выполняется (фоновое задание ещё не завершилось, и его можно отменить)

    По периоду +

    Позволяет выполнить отбор по периоду (дополнительно к отбору по состоянию и по регламентному заданию):
    1) произвольный - можно установить нестандартный период,
    2) без отбора - отбор по периоду не выполняется,
    3) ночь - стандартный период 12 часов с 21:00-09:00,
    4) вчера - стандартный период 24 часа с 00:00-23:59 вчерашнего дня,
    5) сегодня - стандартный период 24 часа с 00:00-23:59 сегодняшнего дня

    По регламентному заданиюПозволяет выполнить отбор по регламентному заданию (дополнительно к отбору по состоянию и по периоду):
    1) флажок обозначает необходимость отбора,
    2) наименование регламентного задания "<не определено>" используется для отбора фоновых заданий,
    запущенных для выполнения прочих (не регламентных) задний.
    + + + + +
    КомандаОписание
    ОбновитьОбновляет список фоновых заданий с учетом заданного отбора (и список регламентных, т.к. списки связаны).
    ОткрытьОткрывает детальную форму свойств фонового задания.
    ОтменитьОтменяет выполенение фонового задание (если выполняется).
    Все действия
    > Очистить историю фоновых заданий
    Очищает историю фоновых заданий в таблице (свыше 1000 записей не хранится, новые записи вытесняет старые записи).

     

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl new file mode 100644 index 000000000..4949c1907 --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl @@ -0,0 +1,570 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если НЕ ПравоДоступа("Администрирование", Метаданные) Тогда + ВызватьИсключение(НСтр("ru = 'У пользователя нет права администрирования!'")); + КонецЕсли; + Элементы.ТаблицаРегламентныеЗаданияНастройкаОбработки.Видимость = СтандартныеПодсистемыПереопределяемый.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая; + Элементы.ТаблицаРегламентныеЗаданияОткрытьОтдельныйСеансОбработки.Видимость = СтандартныеПодсистемыПереопределяемый.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая; + ПустойИдентификатор = Строка(Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); + ТекстНеОпределено = РегламентныеЗаданияСервер.ТекстНеОпределено(); + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Элементы.ИмяПользователя.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если НЕ НастройкиЗагружены Тогда + ПриЗагрузкеДанныхИзНастроекНаСервере(Новый Соответствие); + КонецЕсли; + ОбновитьСписокВыбораРегламентногоЗадания(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "РегламентноеЗаданиеИзменено" Тогда + ОбновитьТаблицуРегламентныхЗаданий(); + ОбновитьСписокВыбораРегламентногоЗадания(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + + ОбновитьТаблицуРегламентныхЗаданий(); + + // Настроим отбор фоновых заданий + Если Настройки.Получить("ОтборПоСостояниюАктивно") = Неопределено Тогда + Настройки.Вставить("ОтборПоСостояниюАктивно", Истина); + КонецЕсли; + + Если Настройки.Получить("ОтборПоСостояниюЗавершено") = Неопределено Тогда + Настройки.Вставить("ОтборПоСостояниюЗавершено", Истина); + КонецЕсли; + + Если Настройки.Получить("ОтборПоСостояниюЗавершеноАварийно") = Неопределено Тогда + Настройки.Вставить("ОтборПоСостояниюЗавершеноАварийно", Истина); + КонецЕсли; + + Если Настройки.Получить("ОтборПоСостояниюОтменено") = Неопределено Тогда + Настройки.Вставить("ОтборПоСостояниюОтменено", Истина); + КонецЕсли; + + Если Настройки.Получить("ОтбиратьПоРегламентномуЗаданию") = Неопределено + ИЛИ Настройки.Получить("РегламентноеЗаданиеДляОтбораИдентификатор") = Неопределено Тогда + Настройки.Вставить("ОтбиратьПоРегламентномуЗаданию", Ложь); + Настройки.Вставить("РегламентноеЗаданиеДляОтбораИдентификатор", ПустойИдентификатор); + КонецЕсли; + + // Настроим отбор по периоду "Без отбора" + // (см. обработчик события ВидОтбораПоПериодуПриИзменении переключателя) + Если Настройки.Получить("ВидОтбораПоПериоду") = Неопределено + ИЛИ Настройки.Получить("ОтборПериодС") = Неопределено + ИЛИ Настройки.Получить("ОтборПериодПо") = Неопределено Тогда + Настройки.Вставить("ВидОтбораПоПериоду", 0); + Настройки.Вставить("ОтборПериодС", НачалоДня(ТекущаяДата()) - 3*360); + Настройки.Вставить("ОтборПериодПо", НачалоДня(ТекущаяДата()) + 9*360); + КонецЕсли; + + Для каждого КлючИЗначение Из Настройки Цикл + Попытка + ЭтаФорма[КлючИЗначение.Ключ] = КлючИЗначение.Значение; + Исключение + КонецПопытки; + КонецЦикла; + // Настроим видимость и доступность. + Элементы.ОтборПериодС.ТолькоПросмотр = НЕ (ВидОтбораПоПериоду = 4); + Элементы.ОтборПериодПо.ТолькоПросмотр = НЕ (ВидОтбораПоПериоду = 4); + Элементы.РегламентноеЗаданиеДляОтбора.Доступность = ОтбиратьПоРегламентномуЗаданию; + + ОбновитьТаблицуФоновыхЗаданий(); + + + НастройкиЗагружены = Истина; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий команд и элементов формы +// + +&НаКлиенте +Процедура ИзменитьРегламентноеЗаданиеВыполнить() + + ДобавитьСкопироватьИзменитьРегламентноеЗадание("Изменить"); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьДанныеВыполнить() + + ОбновитьДанные(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФоновоеЗаданиеВыполнить() + + Если Элементы.ТаблицаФоновыеЗадания.ТекущиеДанные = Неопределено Тогда + Предупреждение (НСтр("ru = 'Выберите фоновое задание!'")); + Иначе + ОткрытьФормуМодально("Обработка.РегламентныеИФоновыеЗадания.Форма.ФоновоеЗадание", + Новый Структура("Идентификатор", Элементы.ТаблицаФоновыеЗадания.ТекущиеДанные.Идентификатор)); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтменитьФоновоеЗаданиеВыполнить() + + Если Элементы.ТаблицаФоновыеЗадания.ТекущиеДанные = Неопределено Тогда + Предупреждение( НСтр("ru = 'Выберите фоновое задание!'") ); + + Иначе + ОтменитьФоновоеЗаданиеНаСервере(Элементы.ТаблицаФоновыеЗадания.ТекущиеДанные.Идентификатор); + Предупреждение( НСтр("ru = 'Задание отменено, но состояние отмены будет + |установлено сервером только через секунды, + |возможно потребуется обновить данные вручную!'") ); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьРасписаниеРегламентногоЗаданияВыполнить() + + ТекущиеДанные = Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Предупреждение( НСтр("ru = 'Выберите регламентное задание!'") ); + Иначе + Диалог = Новый ДиалогРасписанияРегламентногоЗадания(РегламентныеЗаданияСервер.ПолучитьРасписаниеРегламентногоЗадания(ТекущиеДанные.Идентификатор)); + Если Диалог.ОткрытьМодально() Тогда + РегламентныеЗаданияСервер.УстановитьРасписаниеРегламентногоЗадания(ТекущиеДанные.Идентификатор, Диалог.Расписание); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданийВыполнить() + + ПодключитьОбработчикОжидания("ОткрытьОтдельныйСеансОбработкиРегламентныхЗаданийЧерезОбработчикОжидания", 1, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура НастройкаОбработкиРегламентныхЗаданийВыполнить() + + ПараметрыФормы = Новый Структура("СкрытьКомандуОткрытияОтдельногоСеанса", Истина); + + ОткрытьФормуМодально("Обработка.РегламентныеИФоновыеЗадания.Форма.НастройкаОбработкиРегламентныхЗаданий", ПараметрыФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработатьРегламентноеЗаданиеВручнуюВыполнить() + + Если Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные = Неопределено Тогда + Предупреждение( НСтр("ru = 'Выберите регламентное задание!'") ); + Иначе + Для каждого ВыделеннаяСтрока Из Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки Цикл + ТекущиеДанные = ТаблицаРегламентныеЗадания.НайтиПоИдентификатору(ВыделеннаяСтрока); + ИдентификаторФоновогоЗадания = ""; + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая Тогда + МоментЗапуска = ТекущаяДата(); + ПоказатьОповещениеПользователя(НСтр("ru = 'Запущено регламентное задание'"), , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1. + |Процедура запущена в этом сеансе %2'"), + ТекущиеДанные.Наименование, + Строка(МоментЗапуска)), + БиблиотекаКартинок.ОбработатьРегламентноеЗаданиеВручную); + ОбработатьРегламентноеЗаданиеВручнуюНаСервере(ТекущиеДанные.Идентификатор, МоментЗапуска, ИдентификаторФоновогоЗадания); + Иначе + МоментЗапуска = Неопределено; + ОбработатьРегламентноеЗаданиеВручнуюНаСервере(ТекущиеДанные.Идентификатор, МоментЗапуска, ИдентификаторФоновогоЗадания); + ПоказатьОповещениеПользователя(НСтр("ru = 'Запущено регламентное задание'"), , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1. + |Процедура запущена в фоновом задании %2'"), + ТекущиеДанные.Наименование, + Строка(МоментЗапуска)), + БиблиотекаКартинок.ОбработатьРегламентноеЗаданиеВручную); + КонецЕсли; + ИдентификаторыЗаданийПриРучнойОбработке.Добавить(ИдентификаторФоновогоЗадания, ТекущиеДанные.Наименование); + ПодключитьОбработчикОжидания("СообщитьОбОкончанииРучнойОбработкиРегламентногоЗадания", 1, Истина); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура ВидОтбораПоПериодуПриИзменении(Элемент) + + Элементы.ОтборПериодС.ТолькоПросмотр = НЕ (ВидОтбораПоПериоду = 4); + Элементы.ОтборПериодПо.ТолькоПросмотр = НЕ (ВидОтбораПоПериоду = 4); + Если ВидОтбораПоПериоду = 0 Тогда + ОтборПериодС = '00010101'; + ОтборПериодПо = '00010101'; + ИначеЕсли ВидОтбораПоПериоду = 1 Тогда + ОтборПериодС = НачалоДня(ТекущаяДата()) - 3*3600; + ОтборПериодПо = НачалоДня(ТекущаяДата()) + 9*3600; + ИначеЕсли ВидОтбораПоПериоду = 2 Тогда + ОтборПериодС = НачалоДня(ТекущаяДата()) - 24*3600; + ОтборПериодПо = КонецДня(ОтборПериодС); + ИначеЕсли ВидОтбораПоПериоду = 3 Тогда + ОтборПериодС = НачалоДня(ТекущаяДата()); + ОтборПериодПо = КонецДня(ОтборПериодС); + ИначеЕсли ВидОтбораПоПериоду = 4 Тогда + ОтборПериодС = НачалоДня(ТекущаяДата()); + ОтборПериодПо = ОтборПериодС; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтбиратьПоРегламентномуЗаданиюПриИзменении(Элемент) + + Элементы.РегламентноеЗаданиеДляОтбора.Доступность = ОтбиратьПоРегламентномуЗаданию; + +КонецПроцедуры + +&НаКлиенте +Процедура РегламентноеЗаданиеДляОтбораОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + РегламентноеЗаданиеДляОтбораИдентификатор = ПустойИдентификатор; + РегламентноеЗаданиеДляОтбораПредставление = ТекстНеОпределено; + +КонецПроцедуры + +&НаКлиенте +Процедура РегламентноеЗаданиеДляОтбораОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + ЭлементСписка = Элементы.РегламентноеЗаданиеДляОтбора.СписокВыбора.НайтиПоЗначению(ВыбранноеЗначение); + РегламентноеЗаданиеДляОтбораИдентификатор = ЭлементСписка.Значение; + РегламентноеЗаданиеДляОтбораПредставление = ЭлементСписка.Представление; + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьИсториюФоновыхЗаданий(Команда) + + ОчиститьИсториюФоновыхЗаданийНаСервере(); + +КонецПроцедуры + +&НаСервере +Процедура ОчиститьИсториюФоновыхЗаданийНаСервере() + + РегламентныеЗаданияСервер.ОчиститьИсториюФоновыхЗаданий(); + ОбновитьДанные(); + +КонецПроцедуры + + +&НаКлиенте +Процедура ТаблицаФоновыеЗаданияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ОткрытьФоновоеЗаданиеВыполнить(); + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаРегламентныеЗаданияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ИзменитьРегламентноеЗаданиеВыполнить(); + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаРегламентныеЗаданияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Отказ = Истина; + + ДобавитьСкопироватьИзменитьРегламентноеЗадание(?(Копирование, "Скопировать", "Добавить")); + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаРегламентныеЗаданияПередУдалением(Элемент, Отказ) + + Отказ = Истина; + + Если Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки.Количество() > 1 Тогда + Предупреждение(НСтр("ru = 'Выберите одно регламентное задание!'")); + ИначеЕсли Элемент.ТекущиеДанные.Предопределенное Тогда + Предупреждение( НСтр("ru = 'Невозможно удалить предопределенное регламентное задание!'") ); + ИначеЕсли Вопрос(НСтр("ru = 'Удалить регламентное задание?'"), РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда + УдалитьРегламентноеЗаданиеВыполнитьНаСервере(Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные.Идентификатор); + КонецЕсли; + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции формы +// + +&НаСервере +Процедура ОбновитьСписокВыбораРегламентногоЗадания() + + Таблица = ТаблицаРегламентныеЗадания; + Список = Элементы.РегламентноеЗаданиеДляОтбора.СписокВыбора; + // Добавим предопределенный элемент. + Если Список.Количество() = 0 Тогда + Список.Добавить(ПустойИдентификатор, ТекстНеОпределено); + КонецЕсли; + Индекс = 1; + Для каждого Задание ИЗ Таблица Цикл + Если Индекс >= Список.Количество() ИЛИ Список[Индекс].Значение <> Задание.Идентификатор Тогда + // Вставим новое задание + Список.Вставить(Индекс, Задание.Идентификатор, Задание.Наименование); + Иначе + Список[Индекс].Представление = Задание.Наименование; + КонецЕсли; + Индекс = Индекс + 1; + КонецЦикла; + // Удалим лишние строки + Пока Индекс < Список.Количество() Цикл + Список.Удалить(Индекс); + КонецЦикла; + + ЭлементСписка = Список.НайтиПоЗначению(РегламентноеЗаданиеДляОтбораИдентификатор); + Если ЭлементСписка = Неопределено Тогда + РегламентноеЗаданиеДляОтбораИдентификатор = ПустойИдентификатор; + РегламентноеЗаданиеДляОтбораПредставление = ТекстНеОпределено; + Иначе + РегламентноеЗаданиеДляОтбораПредставление = ЭлементСписка.Представление; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОбработатьРегламентноеЗаданиеВручнуюНаСервере(Знач ИдентификаторРегламентногоЗадания, МоментЗапуска, ИдентификаторФоновогоЗадания) + + РегламентныеЗаданияСервер.ОбработатьРегламентноеЗаданиеВручную(ИдентификаторРегламентногоЗадания, МоментЗапуска, ИдентификаторФоновогоЗадания); + + ОбновитьДанные(); + +КонецПроцедуры + +&НаСервере +Процедура ОтменитьФоновоеЗаданиеНаСервере(Идентификатор) + + РегламентныеЗаданияСервер.ОтменитьФоновоеЗадание(Идентификатор); + + ОбновитьДанные(); + +КонецПроцедуры + + +&НаСервере +Процедура УдалитьРегламентноеЗаданиеВыполнитьНаСервере(Идентификатор) + + Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Идентификатор); + Строка = ТаблицаРегламентныеЗадания.НайтиСтроки(Новый Структура("Идентификатор", Идентификатор))[0]; + Задание.Удалить(); + ТаблицаРегламентныеЗадания.Удалить(ТаблицаРегламентныеЗадания.Индекс(Строка)); + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьСкопироватьИзменитьРегламентноеЗадание(Действие) + + Если Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные = Неопределено Тогда + Предупреждение ( НСтр("ru = 'Выберите регламентное задание!'") ); + + ИначеЕсли Действие = "Изменить" И Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки.Количество() > 1 Тогда + Предупреждение(НСтр("ru = 'Выберите одно регламентное задание!'")); + Иначе + ОткрытьФормуМодально("Обработка.РегламентныеИФоновыеЗадания.Форма.РегламентноеЗадание", + Новый Структура("Идентификатор, Действие", + Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные.Идентификатор, + Действие)); + КонецЕсли; + +КонецПроцедуры + + +&НаКлиенте +Процедура СообщитьОбОкончанииРучнойОбработкиРегламентногоЗадания() + + ОповещенияОбОкончанииОбработки = ОповещенияОбОкончанииОбработкиРегламентныхЗаданий(); + Для каждого Оповещение Из ОповещенияОбОкончанииОбработки Цикл + ПоказатьОповещениеПользователя(НСтр("ru = 'Выполнено регламентное задание'"), , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1. + |Процедура завершена %2'"), + Оповещение.ПредставлениеРегламентногоЗадания, + Строка(Оповещение.МоментОкончания)), + БиблиотекаКартинок.ОбработатьРегламентноеЗаданиеВручную); + КонецЦикла; + + Если ИдентификаторыЗаданийПриРучнойОбработке.Количество() > 0 Тогда + ПодключитьОбработчикОжидания("СообщитьОбОкончанииРучнойОбработкиРегламентногоЗадания", 1, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция ОповещенияОбОкончанииОбработкиРегламентныхЗаданий() + + ОповещенияОбОкончанииОбработки = Новый Массив; + Если ИдентификаторыЗаданийПриРучнойОбработке.Количество() > 0 Тогда + Индекс = ИдентификаторыЗаданийПриРучнойОбработке.Количество() - 1; + Пока Индекс >= 0 Цикл + МоментОкончания = РегламентныеЗаданияСервер.ПолучитьСвойстваФоновогоЗадания(ИдентификаторыЗаданийПриРучнойОбработке[Индекс].Значение, "Конец").Конец; + Если ЗначениеЗаполнено(МоментОкончания) Тогда + ОповещенияОбОкончанииОбработки.Добавить(Новый Структура("ПредставлениеРегламентногоЗадания, МоментОкончания", ИдентификаторыЗаданийПриРучнойОбработке[Индекс].Представление, МоментОкончания)); + ИдентификаторыЗаданийПриРучнойОбработке.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + КонецЕсли; + + ОбновитьДанные(); + + Возврат ОповещенияОбОкончанииОбработки; + +КонецФункции + + +&НаСервере +Процедура ОбновитьДанные() + + ОбновитьТаблицуРегламентныхЗаданий(); + ОбновитьТаблицуФоновыхЗаданий(); + ОбновитьСписокВыбораРегламентногоЗадания(); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьТаблицуРегламентныхЗаданий() + + // Обновить ТаблицуРегламентныеЗадания и СписокВыбора регламентного задания для отбора. + ТекущиеЗадания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(); + Таблица = ТаблицаРегламентныеЗадания; + Индекс = 0; + Для каждого Задание ИЗ ТекущиеЗадания Цикл + Идентификатор = Строка(Задание.УникальныйИдентификатор); + Если Индекс >= Таблица.Количество() ИЛИ Таблица[Индекс].Идентификатор <> Идентификатор Тогда + // Вставим новое задание + Обновляемое = Таблица.Вставить(Индекс); + // Установим уникальный идентификатор + Обновляемое.Идентификатор = Идентификатор; + Иначе + Обновляемое = Таблица[Индекс]; + КонецЕсли; + ЗаполнитьЗначенияСвойств(Обновляемое, Задание); + // Уточним Наименование + Обновляемое.Наименование = РегламентныеЗаданияСервер.ПредставлениеРегламентногоЗадания(Задание); + // Установим ДатуЗавершения и СостояниеЗавершения по последней фоновой процедуре + СвойстваПоследнегоФоновогоЗадания = РегламентныеЗаданияСервер.ПолучитьСвойстваПоследнегоФоновогоЗаданияОбработкиРегламентногоЗадания(Задание); + Если СвойстваПоследнегоФоновогоЗадания = Неопределено Тогда + Обновляемое.ДатаОкончания = ТекстНеОпределено; + Обновляемое.СостояниеВыполнения = ТекстНеОпределено; + Иначе + Обновляемое.ДатаОкончания = ?(ЗначениеЗаполнено(СвойстваПоследнегоФоновогоЗадания.Конец), + СвойстваПоследнегоФоновогоЗадания.Конец, + "<>"); + Обновляемое.СостояниеВыполнения = СвойстваПоследнегоФоновогоЗадания.Состояние; + КонецЕсли; + Индекс = Индекс + 1; + КонецЦикла; + // Удалим лишние строки + Пока Индекс < Таблица.Количество() Цикл + Таблица.Удалить(Индекс); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьТаблицуФоновыхЗаданий() + + // 1. Составим отбор + Отбор = Новый Структура; + // 1.1. Добавим отбор по состояниям + МассивСостояний = Новый Массив; + Если ОтборПоСостояниюАктивно Тогда + МассивСостояний.Добавить(СостояниеФоновогоЗадания.Активно); + КонецЕсли; + Если ОтборПоСостояниюЗавершено Тогда + МассивСостояний.Добавить(СостояниеФоновогоЗадания.Завершено); + КонецЕсли; + Если ОтборПоСостояниюЗавершеноАварийно Тогда + МассивСостояний.Добавить(СостояниеФоновогоЗадания.ЗавершеноАварийно); + КонецЕсли; + Если ОтборПоСостояниюОтменено Тогда + МассивСостояний.Добавить(СостояниеФоновогоЗадания.Отменено); + КонецЕсли; + Если МассивСостояний.Количество() <> 4 Тогда + Если МассивСостояний.Количество() = 1 Тогда + Отбор.Вставить("Состояние", МассивСостояний[0]); + Иначе + Отбор.Вставить("Состояние", МассивСостояний); + КонецЕсли; + КонецЕсли; + // 1.2. Добавим отбор по регламентному заданию + Если ОтбиратьПоРегламентномуЗаданию Тогда + Отбор.Вставить( + "ИдентификаторРегламентногоЗадания", + ?(РегламентноеЗаданиеДляОтбораИдентификатор = ПустойИдентификатор, + "", + РегламентноеЗаданиеДляОтбораИдентификатор)); + КонецЕсли; + // 1.3. Добавим отбор по периоду + Если ВидОтбораПоПериоду <> 0 Тогда + Отбор.Вставить("Начало", ОтборПериодС); + Отбор.Вставить("Конец", ОтборПериодПо); + КонецЕсли; + + // 2. Обновим список фоновых заданий + Таблица = ТаблицаФоновыеЗадания; + КоличествоФоновыхЗаданийВсего = 0; + ТекущаяТаблица = РегламентныеЗаданияСервер.ПолучитьТаблицуСвойствФоновыхЗаданий(Отбор, КоличествоФоновыхЗаданийВсего); + Индекс = 0; + Для каждого Задание ИЗ ТекущаяТаблица Цикл + Если Индекс >= Таблица.Количество() ИЛИ Таблица[Индекс].Идентификатор <> Задание.Идентификатор Тогда + // Вставим новое задание + Обновляемое = Таблица.Вставить(Индекс); + // Установим уникальный идентификатор + Обновляемое.Идентификатор = Задание.Идентификатор; + Иначе + Обновляемое = Таблица[Индекс]; + КонецЕсли; + ЗаполнитьЗначенияСвойств(Обновляемое, Задание); + // Установим наименование регламентного задания из коллекции ТаблицаРегламентныеЗадания + Строки = ТаблицаРегламентныеЗадания.НайтиСтроки(Новый Структура("Идентификатор", Задание.ИдентификаторРегламентногоЗадания)); + Если Строки.Количество() = 0 Тогда + Обновляемое.НаименованиеРегламентногоЗадания = ?(ПустаяСтрока(Задание.ИдентификаторРегламентногоЗадания), + ТекстНеОпределено, + НСтр("ru = '<не найдено>'")); + Иначе + Обновляемое.НаименованиеРегламентногоЗадания = Строки[0].Наименование; + КонецЕсли; + // Установим дату окончания выполенения фонового задания + Обновляемое.Конец = ?(ЗначениеЗаполнено(Задание.Конец), Обновляемое.Конец, "<>"); + // Увеличим индекс + Индекс = Индекс + 1; + КонецЦикла; + // Удалим лишние строки + Пока Индекс < Таблица.Количество() Цикл + Таблица.Удалить(Таблица.Количество()-1); + КонецЦикла; + КоличествоФоновыхЗаданийВТаблице = Таблица.Количество(); + +КонецПроцедуры + + diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Form.form b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Form.form new file mode 100644 index 000000000..20d47ab8b --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Form.form @@ -0,0 +1,906 @@ + + + + <key>ru</key> + <value>Фоновое задание</value> + + + Основное + 23 + + Наименование + 5 + true + true + + true + + + Наименование + + + НаименованиеРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Состояние + 19 + true + true + + true + + + Состояние + + + СостояниеРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + СостояниеКонтекстноеМеню + 20 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Начало + 7 + true + true + + true + + + Начало + + + НачалоРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + НачалоКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Конец + 9 + true + true + + true + + + Конец + + + КонецРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + КонецКонтекстноеМеню + 10 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Расположение + 11 + true + true + + true + + + Расположение + + + РасположениеРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + РасположениеКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>1. Основное</value> + + + System.DefaultGUIFont + true + false + false + false + + true + + ОсновноеРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + Дополнительно + 24 + + Идентификатор + 1 + true + true + + true + + + Идентификатор + + + ИдентификаторРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ИдентификаторКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Ключ + 3 + true + true + + true + + + Ключ + + + КлючРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + КлючКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ИмяМетода + 17 + true + true + + true + + + ИмяМетода + + + ИмяМетодаРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ИмяМетодаКонтекстноеМеню + 18 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>2. Дополнительно</value> + + + System.DefaultGUIFont + true + false + false + false + + true + + ДополнительноРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + РегламентноеЗадание + 25 + + НаименованиеРегламентногоЗадания + 15 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + НаименованиеРегламентногоЗадания + + + НаименованиеРегламентногоЗаданияРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + НаименованиеРегламентногоЗаданияКонтекстноеМеню + 16 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ИдентификаторРегламентногоЗадания + 13 + + <key>ru</key> + <value>Идентификатор</value> + + true + true + + true + + + ИдентификаторРегламентногоЗадания + + + ИдентификаторРегламентногоЗаданияРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ИдентификаторРегламентногоЗаданияКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>3. Регламентное задание</value> + + + System.DefaultGUIFont + true + false + false + false + + true + + РегламентноеЗаданиеРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + СообщенияПользователюИОписаниеИнформацииОбОшибке + 29 + + СообщенияИОписаниеИнформацииОбОшибке + 26 + true + true + + true + + + СообщенияПользователюИОписаниеИнформацииОбОшибке + + None + + СообщенияИОписаниеИнформацииОбОшибкеРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + СообщенияИОписаниеИнформацииОбОшибкеКонтекстноеМеню + 27 + true + + InputField + true + Enter + true + Left + true + + true + 4 + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>4. Сообщения пользователю и описание информации об ошибке</value> + + + System.DefaultGUIFont + true + false + false + false + + + СообщенияПользователюИОписаниеИнформацииОбОшибкеРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + Закрыть + 28 + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Form.StandardCommand.Close + PictureAndText + true + true + true + UserCmds + Auto + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + CustomizeForm + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + 49 + LockOwner + true + true + Vertical + true + 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 + + Date + + + + true + + + true + + + + Конец + + <key>ru</key> + <value>Дата окончания</value> + + 6 + + Date + + + + 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> + + 9 + + String + + + + true + + + true + + + + ИмяМетода + + <key>ru</key> + <value>Имя метода метаданных</value> + + 10 + + String + + + + true + + + true + + + + Состояние + + <key>ru</key> + <value>Состояние</value> + + 11 + + String + + + + true + + + true + + + + СообщенияПользователюИОписаниеИнформацииОбОшибке + + <key>ru</key> + <value>Сообщения пользователю и описание информации об ошибке</value> + + 12 + + String + + + + true + + + true + + + + Идентификатор + + String + + + true + + + + + + +
    diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Help/ru.html b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Help/ru.html new file mode 100644 index 000000000..275e45045 --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Help/ru.html @@ -0,0 +1,30 @@ + +

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

    +

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

    +

    1. Группа свойств "Основное".

    +

    + + + + + + +
    Наименование свойстваНазначение свойства
    НаименованиеОбычно пустое, копия свойства "наименование" регламентного задания. При применении кнопки "Выполнить сейчас" на командной панели регламентного задания, наименованию фонового задания устанавливается текст "Запуск вручную: <Представление регламентного задания>".
    Состояние +

    Возможны значения: "Выполнено", "Выполнено с ошибкой", "Отменено", "Выполняется".

    +

    Если была успешно выполнена команда "Отменить", тогда состояние "Отменено".

    Дата началаДата и время начала выполнения фонового задания.
    Дата окончанияДата и время окончания выполнения фонового задания (если задание ещё выполняется, тогда пустая дата и время: <>.
    Место выполненияИмя компьютера сети без домена, на котором выполнялось фоновое задание. Это либо имя сервера, либо имя компьютера пользователя, если регламентные задания обрабатывались в файловой информационной базе.

    2. Группа свойств "Дополнительно".

    + + + + +
    Наименование свойстваНазначение свойства
    Идентификатор +

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

    Ключ +

    Значение свойства Ключ, указанного в регламентном задании (на момент создания фонового задания) или другое, указанное явно, если фоновое задание создано программно, а не планировщиком сервера.

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

     

    +

    3. Группа свойств "Регламентное задание".

    + + + +
    Наименование свойстваНазначение свойства
    Наименование +

    Одно из значений свойств (по порядку поиска заполненного):
    1. Наименование.
    2. Синоним.
    3. Имя.

    ИдентификаторИдентификатор регламентного задания, соответствующий фоновому заданию.

     

    +

    4. Сообщения пользователю и описание информации об ошибке.

    +

    Поле содержит текс сообщений и текст сведений об ошибке, если сообщения и/или ошибки произошли при выполнении фонового задания.

    +

     

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Module.bsl b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Module.bsl new file mode 100644 index 000000000..534145f4f --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Module.bsl @@ -0,0 +1,22 @@ + + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СвойстваФоновогоЗадания = РегламентныеЗаданияСервер.ПолучитьСвойстваФоновогоЗадания(Параметры.Идентификатор); + ЗаполнитьЗначенияСвойств(ЭтаФорма, СвойстваФоновогоЗадания, "Ключ, Наименование, Начало, Конец, Расположение, Состояние, ИмяМетода"); + СообщенияПользователюИОписаниеИнформацииОбОшибке = РегламентныеЗаданияСервер.СообщенияИОписанияОшибокФоновогоЗадания(Параметры.Идентификатор); + Если ЗначениеЗаполнено(СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания) Тогда + ИдентификаторРегламентногоЗадания = СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания; + НаименованиеРегламентногоЗадания = РегламентныеЗаданияСервер.ПредставлениеРегламентногоЗадания(СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания); + Иначе + НаименованиеРегламентногоЗадания = РегламентныеЗаданияСервер.ТекстНеОпределено(); + ИдентификаторРегламентногоЗадания = РегламентныеЗаданияСервер.ТекстНеОпределено(); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/ManagerModule.bsl b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/ManagerModule.bsl new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/ManagerModule.bsl @@ -0,0 +1 @@ + diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/ObjectModule.bsl b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/ObjectModule.bsl new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/ObjectModule.bsl @@ -0,0 +1 @@ + diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/РегламентныеИФоновыеЗадания.mdo b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/РегламентныеИФоновыеЗадания.mdo new file mode 100644 index 000000000..8bd0dbdb0 --- /dev/null +++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/РегламентныеИФоновыеЗадания.mdo @@ -0,0 +1,98 @@ + + + + + + + РегламентныеИФоновыеЗадания + + ru + Регламентные и фоновые задания + + true + DataProcessor.РегламентныеИФоновыеЗадания.Form.РегламентныеИФоновыеЗадания + + РегламентныеИФоновыеЗадания + + ru + Регламентные и фоновые задания + + true + + + ru + + + PersonalComputer + MobileDevice + + + ФоновоеЗадание + + ru + Фоновое задание + + + + ru + + + PersonalComputer + MobileDevice + + + РегламентноеЗадание + + ru + Регламентное задание + + + + ru + + + PersonalComputer + MobileDevice + + + ОбработкаРегламентныхЗаданий + + ru + Обработка регламентных заданий + + PersonalComputer + MobileDevice + + + НастройкаОбработкиРегламентныхЗаданий + + ru + Настройка обработки регламентных заданий + + + + ru + + + PersonalComputer + MobileDevice + + + РабочийСтолОтдельногоСеансаОбработкиРегламентныхЗаданий + + ru + Рабочий стол отдельного сеанса обработки регламентных заданий + + PersonalComputer + MobileDevice + + + РегламентныеИФоновыеЗадания + + ru + Регламентные и фоновые задания + + NavigationPanelOrdinary + Auto + + diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаАвтоматическогоСопоставления/Form.form b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаАвтоматическогоСопоставления/Form.form new file mode 100644 index 000000000..28d94f5cd --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаАвтоматическогоСопоставления/Form.form @@ -0,0 +1,388 @@ + + + + СписокПолейСопоставления + 1 + true + true + + true + + + СписокПолейСопоставления + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + Pickup + SelectAll + SortListAsc + SortListDesc + + СписокПолейСопоставленияПометка + 6 + true + true + + true + + + СписокПолейСопоставления.Check + + + СписокПолейСопоставленияПометкаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + СписокПолейСопоставленияПометкаКонтекстноеМеню + 7 + true + + CheckBoxField + Auto + true + Left + true + + + + СписокПолейСопоставленияЗначение + 4 + true + true + + true + + + СписокПолейСопоставления.Value + + + СписокПолейСопоставленияЗначениеРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + СписокПолейСопоставленияЗначениеКонтекстноеМеню + 5 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + СписокПолейСопоставленияКоманднаяПанель + 3 + Left + true + + + СписокПолейСопоставленияСтрокаПоиска + 13 + + СписокПолейСопоставленияСтрокаПоискаРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокПолейСопоставленияСтрокаПоискаКонтекстноеМеню + 14 + true + + СписокПолейСопоставления + + true + + + + СписокПолейСопоставленияСостояниеПросмотра + 16 + + СписокПолейСопоставленияСостояниеПросмотраРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + СписокПолейСопоставленияСостояниеПросмотраКонтекстноеМеню + 17 + true + + ViewStatusAddition + СписокПолейСопоставления + + true + + + + СписокПолейСопоставленияУправлениеПоиском + 19 + + СписокПолейСопоставленияУправлениеПоискомРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + СписокПолейСопоставленияУправлениеПоискомКонтекстноеМеню + 20 + true + + SearchControlAddition + СписокПолейСопоставления + + true + + + + СписокПолейСопоставленияРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокПолейСопоставленияКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + + СписокПолейСопоставления.Picture + + None + None + None + true + + + ПанельКнопок + 11 + + ВыполнитьСопоставление + 8 + true + true + + true + + false + + ВыполнитьСопоставлениеРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.Command.ВыполнитьСопоставление + Auto + true + true + true + UserCmds + Auto + + + Отмена + 9 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + true + + ПанельКнопокРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + CommandBar + + Right + + + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + СписокПолейСопоставления + + <key>ru</key> + <value>Список полей сопоставления</value> + + 1 + + ValueList + + + true + + + true + + + + + + + ВыполнитьСопоставление + + <key>ru</key> + <value>Выполнить сопоставление</value> + + 1 + + ru + Выполнить сопоставление + + + true + + + + ВыполнитьСопоставление + + + Auto + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Отмена + + + true + + + + Отмена + + + Auto + Auto + + + + + + diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаАвтоматическогоСопоставления/Module.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаАвтоматическогоСопоставления/Module.bsl new file mode 100644 index 000000000..cf725271e --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаАвтоматическогоСопоставления/Module.bsl @@ -0,0 +1,34 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СписокПолейСопоставления = Параметры.СписокПолейСопоставления; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьСопоставление(Команда) + + МассивОтмеченныхЭлементовСписка = ОбщегоНазначенияКлиентСервер.ПолучитьМассивОтмеченныхЭлементовСписка(СписокПолейСопоставления); + + Если МассивОтмеченныхЭлементовСписка.Количество() = 0 Тогда + + НСтрока = НСтр("ru = 'Следует указать хотя бы одно поле для сопоставления'"); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,"СписокПолейСопоставления"); + + Возврат; + + КонецЕсли; + + ЭтаФорма.Закрыть(СписокПолейСопоставления.Скопировать()); + +КонецПроцедуры + +&НаКлиенте +Процедура Отмена(Команда) + + ЭтаФорма.Закрыть(Неопределено); + +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицы/Form.form b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицы/Form.form new file mode 100644 index 000000000..c10eccb7e --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицы/Form.form @@ -0,0 +1,388 @@ + + + + СписокПолей + 1 + true + true + + true + + + СписокПолей + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + Pickup + SelectAll + SortListAsc + SortListDesc + + СписокПолейПометка + 6 + true + true + + true + + + СписокПолей.Check + + + СписокПолейПометкаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + СписокПолейПометкаКонтекстноеМеню + 7 + true + + CheckBoxField + Auto + true + Left + true + + + + СписокПолейЗначение + 4 + true + true + + true + + + СписокПолей.Value + + + СписокПолейЗначениеРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + СписокПолейЗначениеКонтекстноеМеню + 5 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + СписокПолейКоманднаяПанель + 3 + Left + true + + + СписокПолейСтрокаПоиска + 13 + + СписокПолейСтрокаПоискаРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокПолейСтрокаПоискаКонтекстноеМеню + 14 + true + + СписокПолей + + true + + + + СписокПолейСостояниеПросмотра + 16 + + СписокПолейСостояниеПросмотраРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + СписокПолейСостояниеПросмотраКонтекстноеМеню + 17 + true + + ViewStatusAddition + СписокПолей + + true + + + + СписокПолейУправлениеПоиском + 19 + + СписокПолейУправлениеПоискомРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + СписокПолейУправлениеПоискомКонтекстноеМеню + 20 + true + + SearchControlAddition + СписокПолей + + true + + + + СписокПолейРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокПолейКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + + СписокПолей.Picture + + None + None + None + true + + + ПанельКнопок + 11 + + Применить + 8 + true + true + + true + + false + + ПрименитьРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.Command.Применить + Auto + true + true + true + UserCmds + Auto + + + Отмена + 10 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + true + + ПанельКнопокРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + CommandBar + + Right + + + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + СписокПолей + + <key>ru</key> + <value>Список полей</value> + + 1 + + ValueList + + + true + + + true + + + + + + + Применить + + <key>ru</key> + <value>Применить</value> + + 1 + + ru + Применить + + + true + + + + Применить + + + Auto + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Отмена + + + true + + + + Отмена + + + Auto + Auto + + + + + + diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицы/Module.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицы/Module.bsl new file mode 100644 index 000000000..3f6e84805 --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицы/Module.bsl @@ -0,0 +1,33 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СписокПолей = Параметры.СписокПолей; + +КонецПроцедуры + +&НаКлиенте +Процедура Применить(Команда) + + МассивОтмеченныхЭлементовСписка = ОбщегоНазначенияКлиентСервер.ПолучитьМассивОтмеченныхЭлементовСписка(СписокПолей); + + Если МассивОтмеченныхЭлементовСписка.Количество() = 0 Тогда + + НСтрока = НСтр("ru = 'Следует указать хотя бы одно поле'"); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,"СписокПолей"); + + Возврат; + + КонецЕсли; + + ЭтаФорма.Закрыть(СписокПолей.Скопировать()); + +КонецПроцедуры + +&НаКлиенте +Процедура Отмена(Команда) + + ЭтаФорма.Закрыть(Неопределено); + +КонецПроцедуры diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицыСопоставления/Form.form b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицыСопоставления/Form.form new file mode 100644 index 000000000..308ca9614 --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицыСопоставления/Form.form @@ -0,0 +1,493 @@ + + + + СписокПолей + 1 + true + true + + true + + + СписокПолей + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + Pickup + SelectAll + SortListAsc + SortListDesc + + СписокПолейПометка + 6 + true + true + + true + + + СписокПолей.Check + + + СписокПолейПометкаРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + СписокПолейПометкаКонтекстноеМеню + 7 + true + + CheckBoxField + Auto + true + Left + true + + + + СписокПолейЗначение + 4 + true + true + + true + + + СписокПолей.Value + + + СписокПолейЗначениеРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + СписокПолейЗначениеКонтекстноеМеню + 5 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + СписокПолейКоманднаяПанель + 3 + + СписокПолейУстановитьФлажки + 11 + true + true + + true + + false + + СписокПолейУстановитьФлажкиРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + Form.Item.СписокПолей.StandardCommand.CheckAll + Normal + Auto + true + true + UserCmds + Auto + + + СписокПолейСнятьФлажки + 12 + true + true + + true + + false + + СписокПолейСнятьФлажкиРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.Item.СписокПолей.StandardCommand.UncheckAll + Normal + Auto + true + true + UserCmds + Auto + + + СписокПолейПереместитьВверх + 13 + true + true + + true + + false + + СписокПолейПереместитьВверхРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + Form.Item.СписокПолей.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + СписокПолейПереместитьВниз + 14 + true + true + + true + + false + + СписокПолейПереместитьВнизРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.Item.СписокПолей.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + Left + + + СписокПолейСтрокаПоиска + 21 + + СписокПолейСтрокаПоискаРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + СписокПолейСтрокаПоискаКонтекстноеМеню + 22 + true + + СписокПолей + + true + + + + СписокПолейСостояниеПросмотра + 24 + + СписокПолейСостояниеПросмотраРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + СписокПолейСостояниеПросмотраКонтекстноеМеню + 25 + true + + ViewStatusAddition + СписокПолей + + true + + + + СписокПолейУправлениеПоиском + 27 + + СписокПолейУправлениеПоискомРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + СписокПолейУправлениеПоискомКонтекстноеМеню + 28 + true + + SearchControlAddition + СписокПолей + + true + + + + СписокПолейРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + СписокПолейКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + + СписокПолей.Picture + + None + None + None + true + + + ПанельКнопок + 15 + + Применить + 8 + true + true + + true + + false + + ПрименитьРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + Form.Command.Применить + Auto + true + true + true + UserCmds + Auto + + + Отмена + 10 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + true + + ПанельКнопокРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + CommandBar + + Right + + + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + СписокПолей + + <key>ru</key> + <value>Список полей</value> + + 1 + + ValueList + + + true + + + true + + + + + + + Применить + + <key>ru</key> + <value>Применить</value> + + 1 + + ru + Применить + + + true + + + + Применить + + + Auto + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Отмена + + + true + + + + Отмена + + + Auto + Auto + + + + + + diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицыСопоставления/Module.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицыСопоставления/Module.bsl new file mode 100644 index 000000000..862e82fb0 --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаПолейТаблицыСопоставления/Module.bsl @@ -0,0 +1,54 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СписокПолей = Параметры.СписокПолей; + +КонецПроцедуры + +&НаКлиенте +Процедура Применить(Команда) + + Отказ = Ложь; + + МассивОтмеченныхЭлементовСписка = ОбщегоНазначенияКлиентСервер.ПолучитьМассивОтмеченныхЭлементовСписка(СписокПолей); + + Если МассивОтмеченныхЭлементовСписка.Количество() = 0 Тогда + + НСтрока = НСтр("ru = 'Следует указать хотя бы одно поле'"); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,"СписокПолей",, Отказ); + + ИначеЕсли МассивОтмеченныхЭлементовСписка.Количество() > МаксимальноеКоличествоПользовательскихПолей() Тогда + + // значение должно быть не больше установленного + СтрокаСообщения = НСтр("ru = 'Уменьшите количество полей (можно выбирать не более [КоличествоПолей] полей)'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[КоличествоПолей]", Строка(МаксимальноеКоличествоПользовательскихПолей())); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщения,,"СписокПолей",, Отказ); + + КонецЕсли; + + Если Не Отказ Тогда + + ЭтаФорма.Закрыть(СписокПолей.Скопировать()); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Отмена(Команда) + + ЭтаФорма.Закрыть(Неопределено); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СВОЙСТВА + +&НаКлиенте +Функция МаксимальноеКоличествоПользовательскихПолей() + + Возврат ОбменДаннымиКлиент.МаксимальноеКоличествоПолейСопоставленияОбъектов(); + +КонецФункции diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаСортировки/Form.form b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаСортировки/Form.form new file mode 100644 index 000000000..39db561f0 --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаСортировки/Form.form @@ -0,0 +1,507 @@ + + + + ТаблицаСортировки + 1 + true + true + + true + + + ТаблицаСортировки + + false + None + Add + CancelSearch + Change + Copy + CopyToClipboard + Delete + EndEdit + Find + OutputList + SelectAll + SortListAsc + SortListDesc + + ТаблицаСортировкиИспользование + 6 + true + true + + true + + + ТаблицаСортировки.Использование + + + ТаблицаСортировкиИспользованиеРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ТаблицаСортировкиИспользованиеКонтекстноеМеню + 7 + true + + CheckBoxField + Auto + true + Left + true + + + + ТаблицаСортировкиИмяПоля + 4 + true + true + + true + + + ТаблицаСортировки.ИмяПоля + + + ТаблицаСортировкиИмяПоляРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ТаблицаСортировкиИмяПоляКонтекстноеМеню + 5 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСортировкиНаправлениеСортировки + 8 + true + true + + true + + + ТаблицаСортировки.НаправлениеСортировки + + + ТаблицаСортировкиНаправлениеСортировкиРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ТаблицаСортировкиНаправлениеСортировкиКонтекстноеМеню + 9 + true + + InputField + Auto + true + Left + true + + true + true + true + true + false + + ru + БЛ='По убыванию'; БИ='По возрастанию' + + + ru + БЛ='По убыванию'; БИ='По возрастанию' + + true + true + + + ru + По возрастанию + + + true + + + + + ru + По убыванию + + + + Normal + + + + ТаблицаСортировкиКоманднаяПанель + 3 + Left + true + + + ТаблицаСортировкиСтрокаПоиска + 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 + + + + ТаблицаСортировкиРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ТаблицаСортировкиКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow + Row +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + +
    + + ПанельКнопок + 15 + + Применить + 10 + true + true + + true + + false + + ПрименитьРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + Form.Command.Применить + Auto + true + true + true + UserCmds + Auto + + + Отменить + 14 + true + true + + true + + false + + ОтменитьРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + Form.Command.Отменить + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + true + + ПанельКнопокРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + 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 + + Boolean + + + true + + + true + + + + НаправлениеСортировки + + <key>ru</key> + <value>Направление сортировки</value> + + 3 + + Boolean + + + true + + + true + + + + + Применить + + <key>ru</key> + <value>Применить</value> + + 1 + + ru + Применить + + + true + + + + Применить + + + Auto + Auto + + + Отменить + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Отменить + + + true + + + + Отменить + + + Auto + Auto + + + + + +
    diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаСортировки/Module.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаСортировки/Module.bsl new file mode 100644 index 000000000..2c56626d0 --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/НастройкаСортировки/Module.bsl @@ -0,0 +1,21 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ТаблицаСортировки.Загрузить(Параметры.ТаблицаСортировки.Выгрузить()); + +КонецПроцедуры + +&НаКлиенте +Процедура Применить(Команда) + + ЭтаФорма.Закрыть(ТаблицаСортировки); + +КонецПроцедуры + +&НаКлиенте +Процедура Отменить(Команда) + + ЭтаФорма.Закрыть(Неопределено); + +КонецПроцедуры diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Form.form b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Form.form new file mode 100644 index 000000000..c24ff1f71 --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Form.form @@ -0,0 +1,963 @@ + + + + КоманднаяПанельТаблицы + 69 + + УстановитьПометки + 70 + true + true + + true + + false + + УстановитьПометкиРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Form.Command.УстановитьПометки + Normal + Auto + true + true + UserCmds + Auto + + + СнятьПометки + 68 + true + true + + true + + false + + СнятьПометкиРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + Form.Command.СнятьПометки + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель таблицы</value> + + + ru + Командная панель таблицы + + + КоманднаяПанельТаблицыРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + CommandBar + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектов + 31 + true + true + + true + + + Объект.ТаблицаАвтоматическиСопоставленныхОбъектов + + false + None + Add + CancelSearch + Change + Copy + CopyToClipboard + Delete + EndEdit + Find + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + + ТаблицаАвтоматическиСопоставленныхОбъектовПометка + 36 + true + true + + true + + + Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.Пометка + + + ТаблицаАвтоматическиСопоставленныхОбъектовПометкаРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовПометкаКонтекстноеМеню + 37 + true + + CheckBoxField + Auto + true + Left + true + + + + ПоляПриемника + 66 + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле1 + 46 + true + true + + true + + + Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.ПриемникПоле1 + + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле1РасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле1КонтекстноеМеню + 47 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле2 + 48 + true + true + + true + + + Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.ПриемникПоле2 + + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле2РасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле2КонтекстноеМеню + 49 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле3 + 50 + true + true + + true + + + Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.ПриемникПоле3 + + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле3РасширеннаяПодсказка + 92 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле3КонтекстноеМеню + 51 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле4 + 52 + true + true + + true + + + Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.ПриемникПоле4 + + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле4РасширеннаяПодсказка + 94 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле4КонтекстноеМеню + 53 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле5 + 54 + true + true + + true + + + Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.ПриемникПоле5 + + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле5РасширеннаяПодсказка + 96 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовПриемникПоле5КонтекстноеМеню + 55 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Поля приемника</value> + + + ru + Поля приемника + + true + + ПоляПриемникаРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + ColumnGroup + + Vertical + auto + true + + + + ПоляИсточника + 67 + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле1 + 56 + true + true + + true + + + Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.ИсточникПоле1 + + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле1РасширеннаяПодсказка + 99 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле1КонтекстноеМеню + 57 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле2 + 58 + true + true + + true + + + Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.ИсточникПоле2 + + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле2РасширеннаяПодсказка + 101 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле2КонтекстноеМеню + 59 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле3 + 60 + true + true + + true + + + Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.ИсточникПоле3 + + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле3РасширеннаяПодсказка + 103 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле3КонтекстноеМеню + 61 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле4 + 62 + true + true + + true + + + Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.ИсточникПоле4 + + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле4РасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле4КонтекстноеМеню + 63 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле5 + 64 + true + true + + true + + + Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.ИсточникПоле5 + + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле5РасширеннаяПодсказка + 107 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовИсточникПоле5КонтекстноеМеню + 65 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Поля источника</value> + + + ru + Поля приемника + + true + + ПоляИсточникаРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + ColumnGroup + + Vertical + auto + true + + + None + + ТаблицаАвтоматическиСопоставленныхОбъектовКоманднаяПанель + 33 + Left + + + ТаблицаАвтоматическиСопоставленныхОбъектовСтрокаПоиска + 76 + + ТаблицаАвтоматическиСопоставленныхОбъектовСтрокаПоискаРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовСтрокаПоискаКонтекстноеМеню + 77 + true + + ТаблицаАвтоматическиСопоставленныхОбъектов + + true + + + + ТаблицаАвтоматическиСопоставленныхОбъектовСостояниеПросмотра + 79 + + ТаблицаАвтоматическиСопоставленныхОбъектовСостояниеПросмотраРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовСостояниеПросмотраКонтекстноеМеню + 80 + true + + ViewStatusAddition + ТаблицаАвтоматическиСопоставленныхОбъектов + + true + + + + ТаблицаАвтоматическиСопоставленныхОбъектовУправлениеПоиском + 82 + + ТаблицаАвтоматическиСопоставленныхОбъектовУправлениеПоискомРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовУправлениеПоискомКонтекстноеМеню + 83 + true + + SearchControlAddition + ТаблицаАвтоматическиСопоставленныхОбъектов + + true + + + + ТаблицаАвтоматическиСопоставленныхОбъектовРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + + ТаблицаАвтоматическиСопоставленныхОбъектовКонтекстноеМеню + 32 + true + + HierarchicalList + true + true + true + MultiRow + Row +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + +
    + + КоманднаяПанельФормы + 71 + + Применить + 14 + true + true + + true + + false + + ПрименитьРасширеннаяПодсказка + 118 + Label + true + true + + Left + + + Form.Command.Применить + Auto + true + true + true + UserCmds + Auto + + + Отмена + 30 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + true + + КоманднаяПанельФормыРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Right + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.СопоставлениеОбъектовИнформационныхБаз + + + true + + + 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 + + + StdPicture.CheckAll + + + + УстановитьПометки + + + Picture + Auto + Auto + + + СнятьПометки + + <key>ru</key> + <value>Снять пометки</value> + + 4 + + ru + Снять пометки + + + true + + + StdPicture.UncheckAll + + + + СнятьПометки + + + Picture + Auto + Auto + + + + + + +
    diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Module.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Module.bsl new file mode 100644 index 000000000..aaaa060fe --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/РезультатАвтоматическогоСопоставления/Module.bsl @@ -0,0 +1,161 @@ +&НаКлиенте +Перем мВыдаватьПредупреждениеПриЗакрытииФормы; + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + // проверка, что форма открыта программно + Если Не Параметры.Свойство("ИмяФайлаСообщенияОбмена") Тогда + + НСтрока = НСтр("ru = 'Форма не может быть открыта интерактивно!'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,,, Отказ); + Возврат; + + КонецЕсли; + + // инициализируем обработку переданными параметрами + ЗаполнитьЗначенияСвойств(Объект, Параметры,, "СписокИспользуемыхПолей, СписокПолейТаблицы"); + + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + + // определяем свойство "СписокИспользуемыхПолей" + ОбработкаОбъект.СписокИспользуемыхПолей.Очистить(); + ОбщегоНазначенияКлиентСервер.ЗаполнитьКоллекциюСвойств(Параметры.СписокИспользуемыхПолей, ОбработкаОбъект.СписокИспользуемыхПолей); + + // определяем свойство "СписокПолейТаблицы" + ОбработкаОбъект.СписокПолейТаблицы.Очистить(); + ОбщегоНазначенияКлиентСервер.ЗаполнитьКоллекциюСвойств(Параметры.СписокПолейТаблицы, ОбработкаОбъект.СписокПолейТаблицы); + + // загружаем таблицу неутвержденных связей + ТаблицаНеутвержденныхСвязей = ПолучитьИзВременногоХранилища(Параметры.АдресВременногоХранилищаТаблицыНеутвержденныхСвязей); + УдалитьИзВременногоХранилища(Параметры.АдресВременногоХранилищаТаблицыНеутвержденныхСвязей); + ОбработкаОбъект.ТаблицаНеутвержденныхСвязей.Загрузить(ТаблицаНеутвержденныхСвязей); + + // получаем таблицу автоматического сопоставления объектов + ОбработкаОбъект.ВыполнитьАвтоматическоеСопоставлениеОбъектов(Отказ, Параметры.СписокПолейСопоставления); + + ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); + + // устанавливаем заголовки и видимость полей таблицы на форме + УстановитьВидимостьПолейТаблицы("ТаблицаАвтоматическиСопоставленныхОбъектов", Параметры.МаксимальноеКоличествоПользовательскихПолей); + + // установка заголока формы + Заголовок = Параметры.Заголовок; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Если Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.Количество() > 0 + И мВыдаватьПредупреждениеПриЗакрытииФормы = Истина Тогда + + Предупреждение(НСтр("ru = 'Форма содержит данные автоматического сопоставления. Действие отменено.'")); + + Отказ = Истина; + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура Применить(Команда) + + мВыдаватьПредупреждениеПриЗакрытииФормы = Ложь; + + // контекстный вызов сервера + Закрыть(ПоместитьТаблицуАвтоматическиСопоставленныхОбъектовВоВременноеХранилище()); + +КонецПроцедуры + +&НаКлиенте +Процедура Отмена(Команда) + + мВыдаватьПредупреждениеПриЗакрытииФормы = Ложь; + + Закрыть(Неопределено); + +КонецПроцедуры + +&НаКлиенте +Процедура СнятьПометки(Команда) + + УстановитьПометкиНаСервере(Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьПометки(Команда) + + УстановитьПометкиНаСервере(Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Функция ПоместитьТаблицуАвтоматическиСопоставленныхОбъектовВоВременноеХранилище() + + Возврат ПоместитьВоВременноеХранилище(Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.Выгрузить(Новый Структура("Пометка", Истина), "УникальныйИдентификаторПриемника, УникальныйИдентификаторИсточника, ТипИсточника, ТипПриемника")); + +КонецФункции + +&НаСервере +Процедура УстановитьВидимостьПолейТаблицы(Знач ИмяТаблицыФормы, Знач МаксимальноеКоличествоПользовательскихПолей) + + ИмяПоляИсточника = СтрЗаменить("#ИмяТаблицыФормы#ИсточникПолеNN","#ИмяТаблицыФормы#", ИмяТаблицыФормы); + ИмяПоляПриемника = СтрЗаменить("#ИмяТаблицыФормы#ПриемникПолеNN","#ИмяТаблицыФормы#", ИмяТаблицыФормы); + + // снимаем видимость всех полей таблицы сопоставления + Для НомерПоля = 1 По МаксимальноеКоличествоПользовательскихПолей Цикл + + ПолеИсточника = СтрЗаменить(ИмяПоляИсточника, "NN", Строка(НомерПоля)); + ПолеПриемника = СтрЗаменить(ИмяПоляПриемника, "NN", Строка(НомерПоля)); + + ЭтаФорма.Элементы[ПолеИсточника].Видимость = Ложь; + ЭтаФорма.Элементы[ПолеПриемника].Видимость = Ложь; + + КонецЦикла; + + // устанавливаем видимость полей таблицы сопоставления выбранных пользователем + Для Каждого Элемент ИЗ Объект.СписокИспользуемыхПолей Цикл + + НомерПоля = Объект.СписокИспользуемыхПолей.Индекс(Элемент) + 1; + + ПолеИсточника = СтрЗаменить(ИмяПоляИсточника, "NN", Строка(НомерПоля)); + ПолеПриемника = СтрЗаменить(ИмяПоляПриемника, "NN", Строка(НомерПоля)); + + // устанавливаем видимость полей + ЭтаФорма.Элементы[ПолеИсточника].Видимость = Элемент.Пометка; + ЭтаФорма.Элементы[ПолеПриемника].Видимость = Элемент.Пометка; + + // устанавливаем заголовки полей + ЭтаФорма.Элементы[ПолеИсточника].Заголовок = Элемент.Значение; + ЭтаФорма.Элементы[ПолеПриемника].Заголовок = Элемент.Значение; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьПометкиНаСервере(Пометка) + + ТаблицаЗначений = Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.Выгрузить(); + + ТаблицаЗначений.ЗаполнитьЗначения(Пометка, "Пометка"); + + Объект.ТаблицаАвтоматическиСопоставленныхОбъектов.Загрузить(ТаблицаЗначений); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ИНИЦИАЛИЗАЦИЯ + +мВыдаватьПредупреждениеПриЗакрытииФормы = Истина; diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Form.form b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Form.form new file mode 100644 index 000000000..f8d3849f6 --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Form.form @@ -0,0 +1,2143 @@ + + + + СтраницаСопоставления + 80 + + ГруппаЗаголовкаТаблицы + 210 + + ОтборПоСтатусуСопоставления + 30 + true + true + + true + + + ОтборПоСтатусуСопоставления + + + OnChange + ОтборПоСтатусуСопоставленияПриИзменении + + + ОтборПоСтатусуСопоставленияРасширеннаяПодсказка + 287 + Label + true + true + + Left + + + + ОтборПоСтатусуСопоставленияКонтекстноеМеню + 31 + true + + InputField + Enter + true + Left + true + + true + true + true + true + false + true + true + true + Normal + + + + ИнформацияДайджестаСопоставления + 272 + + ПроцентСопоставленияОбъектов + 275 + true + true + + true + + + ПроцентСопоставленияОбъектов + + + ПроцентСопоставленияОбъектовРасширеннаяПодсказка + 290 + Label + true + true + + Left + + + + ПроцентСопоставленияОбъектовКонтекстноеМеню + 276 + true + + InputField + true + Enter + true + Left + true + + 4 + true + true + true + true + true + true + Normal + + + + КоличествоОбъектовНесопоставленных + 277 + true + true + + true + + + КоличествоОбъектовНесопоставленных + + + КоличествоОбъектовНесопоставленныхРасширеннаяПодсказка + 292 + Label + true + true + + Left + + + + КоличествоОбъектовНесопоставленныхКонтекстноеМеню + 278 + true + + InputField + true + Enter + true + Left + true + + 6 + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Дайджест сопоставления</value> + + + ru + Информация дайджеста сопоставления + + + ИнформацияДайджестаСопоставленияРасширеннаяПодсказка + 289 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа заголовка таблицы</value> + + + ru + Группа заголовка таблицы + + + ГруппаЗаголовкаТаблицыРасширеннаяПодсказка + 286 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + КнопкиТаблицы + 77 + + КоманднаяПанель + 267 + + ДобавитьСопоставление + 163 + true + true + + true + + false + + ДобавитьСопоставлениеРасширеннаяПодсказка + 296 + Label + true + true + + Left + + + Form.Command.ДобавитьСопоставление + Normal + Auto + true + true + UserCmds + Auto + + + ОтменитьСопоставление + 33 + true + true + + true + + false + + ОтменитьСопоставлениеРасширеннаяПодсказка + 297 + Label + true + true + + Left + + + Form.Command.ОтменитьСопоставление + Normal + Auto + true + true + UserCmds + Auto + + + ИзменитьПоляТаблицы + 281 + true + true + + true + + false + + ИзменитьПоляТаблицыРасширеннаяПодсказка + 298 + Label + true + true + + Left + + + Form.Command.ИзменитьПоляТаблицы + Normal + Auto + true + true + UserCmds + Auto + + + Обновить + 39 + true + true + + true + + false + + ОбновитьРасширеннаяПодсказка + 299 + Label + true + true + + Left + + + Form.Command.Обновить + Normal + Auto + true + true + UserCmds + Auto + + + Сортировка + 167 + true + true + + true + + false + + СортировкаРасширеннаяПодсказка + 300 + Label + true + true + + Left + + + Form.Command.Сортировка + Normal + Auto + true + true + UserCmds + Auto + + + ВыполнитьАвтоматическоеСопоставление + 71 + true + true + + true + + false + + ВыполнитьАвтоматическоеСопоставлениеРасширеннаяПодсказка + 301 + Label + true + true + + Left + + + Form.Command.ВыполнитьАвтоматическоеСопоставление + Normal + Auto + true + true + UserCmds + Auto + + + ПодменюНастройки + 268 + + ИзменитьСписокПолейТаблицы + 266 + true + true + + true + + false + + ИзменитьСписокПолейТаблицыРасширеннаяПодсказка + 303 + Label + true + true + + Left + + + Form.Command.НастройкаСпискаПолейТаблицы + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Настройка</value> + + + ru + Подменю настройки + + + ПодменюНастройкиРасширеннаяПодсказка + 302 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + ВыполнитьЗагрузкуДанных + 282 + true + true + + true + + false + + ВыполнитьЗагрузкуДанныхРасширеннаяПодсказка + 304 + Label + true + true + + Left + + + Form.Command.ВыполнитьЗагрузкуДанных + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + КоманднаяПанельРасширеннаяПодсказка + 295 + Label + true + true + + Left + + + CommandBar + + Left + + + true + true + + true + + + <key>ru</key> + <value>Кнопки таблицы</value> + + + ru + Кнопки таблицы + + + КнопкиТаблицыРасширеннаяПодсказка + 294 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ТаблицаСопоставления + 22 + + <key>ru</key> + <value>Сопоставление объектов этой базы (слева) с объектами второй информационной базы (справа)</value> + + + Style.ПоясняющийТекст + + true + true + + true + + + ТаблицаСопоставления + + false + Top + Add + CancelSearch + Change + Copy + CopyToClipboard + Delete + EndEdit + Find + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + + ПоляПриемника + 69 + + ТаблицаСопоставленияПриемникПоле1 + 48 + true + true + + true + + + ТаблицаСопоставления.ПриемникПоле1 + + + ТаблицаСопоставленияПриемникПоле1РасширеннаяПодсказка + 318 + Label + true + true + + Left + + + + ТаблицаСопоставленияПриемникПоле1КонтекстноеМеню + 49 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСопоставленияПриемникПоле2 + 50 + true + true + + true + + + ТаблицаСопоставления.ПриемникПоле2 + + + ТаблицаСопоставленияПриемникПоле2РасширеннаяПодсказка + 320 + Label + true + true + + Left + + + + ТаблицаСопоставленияПриемникПоле2КонтекстноеМеню + 51 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСопоставленияПриемникПоле3 + 52 + true + true + + true + + + ТаблицаСопоставления.ПриемникПоле3 + + + ТаблицаСопоставленияПриемникПоле3РасширеннаяПодсказка + 322 + Label + true + true + + Left + + + + ТаблицаСопоставленияПриемникПоле3КонтекстноеМеню + 53 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСопоставленияПриемникПоле4 + 54 + true + true + + true + + + ТаблицаСопоставления.ПриемникПоле4 + + + ТаблицаСопоставленияПриемникПоле4РасширеннаяПодсказка + 324 + Label + true + true + + Left + + + + ТаблицаСопоставленияПриемникПоле4КонтекстноеМеню + 55 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСопоставленияПриемникПоле5 + 56 + true + true + + true + + + ТаблицаСопоставления.ПриемникПоле5 + + + ТаблицаСопоставленияПриемникПоле5РасширеннаяПодсказка + 326 + Label + true + true + + Left + + + + ТаблицаСопоставленияПриемникПоле5КонтекстноеМеню + 57 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Поля приемника</value> + + + ru + Поля источника + + + ПоляПриемникаРасширеннаяПодсказка + 317 + Label + true + true + + Left + + + ColumnGroup + + Vertical + auto + true + + + + ПоляИсточника + 68 + + ТаблицаСопоставленияИсточникПоле1 + 58 + true + true + + true + + + ТаблицаСопоставления.ИсточникПоле1 + + + ТаблицаСопоставленияИсточникПоле1РасширеннаяПодсказка + 329 + Label + true + true + + Left + + + + ТаблицаСопоставленияИсточникПоле1КонтекстноеМеню + 59 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСопоставленияИсточникПоле2 + 60 + true + true + + true + + + ТаблицаСопоставления.ИсточникПоле2 + + + ТаблицаСопоставленияИсточникПоле2РасширеннаяПодсказка + 331 + Label + true + true + + Left + + + + ТаблицаСопоставленияИсточникПоле2КонтекстноеМеню + 61 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСопоставленияИсточникПоле3 + 62 + true + true + + true + + + ТаблицаСопоставления.ИсточникПоле3 + + + ТаблицаСопоставленияИсточникПоле3РасширеннаяПодсказка + 333 + Label + true + true + + Left + + + + ТаблицаСопоставленияИсточникПоле3КонтекстноеМеню + 63 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСопоставленияИсточникПоле4 + 64 + true + true + + true + + + ТаблицаСопоставления.ИсточникПоле4 + + + ТаблицаСопоставленияИсточникПоле4РасширеннаяПодсказка + 335 + Label + true + true + + Left + + + + ТаблицаСопоставленияИсточникПоле4КонтекстноеМеню + 65 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСопоставленияИсточникПоле5 + 66 + true + true + + true + + + ТаблицаСопоставления.ИсточникПоле5 + + + ТаблицаСопоставленияИсточникПоле5РасширеннаяПодсказка + 337 + Label + true + true + + Left + + + + ТаблицаСопоставленияИсточникПоле5КонтекстноеМеню + 67 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Поля источника</value> + + + ru + Поля источника + + + ПоляИсточникаРасширеннаяПодсказка + 328 + Label + true + true + + Left + + + ColumnGroup + + Vertical + auto + true + + + None + + ТаблицаСопоставленияКоманднаяПанель + 24 + Left + true + + + Selection + рТаблицаСопоставленияВыбор + + + ТаблицаСопоставленияСтрокаПоиска + 308 + + ТаблицаСопоставленияСтрокаПоискаРасширеннаяПодсказка + 310 + Label + true + true + + Left + + + + ТаблицаСопоставленияСтрокаПоискаКонтекстноеМеню + 309 + true + + ТаблицаСопоставления + + true + + + + ТаблицаСопоставленияСостояниеПросмотра + 311 + + ТаблицаСопоставленияСостояниеПросмотраРасширеннаяПодсказка + 313 + Label + true + true + + Left + + + + ТаблицаСопоставленияСостояниеПросмотраКонтекстноеМеню + 312 + true + + ViewStatusAddition + ТаблицаСопоставления + + true + + + + ТаблицаСопоставленияУправлениеПоиском + 314 + + ТаблицаСопоставленияУправлениеПоискомРасширеннаяПодсказка + 316 + Label + true + true + + Left + + + + ТаблицаСопоставленияУправлениеПоискомКонтекстноеМеню + 315 + true + + SearchControlAddition + ТаблицаСопоставления + + true + + + + ТаблицаСопоставленияРасширеннаяПодсказка + 307 + Label + true + true + + Left + + + + ТаблицаСопоставленияКонтекстноеМеню + 23 + + КонтекстноеМенюТаблицаСопоставленияДобавитьСопоставление + 279 + true + true + + true + + false + + КонтекстноеМенюТаблицаСопоставленияДобавитьСопоставлениеРасширеннаяПодсказка + 305 + Label + true + true + + Left + + + Form.Command.ДобавитьСопоставление + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюТаблицаСопоставленияОтменитьСопоставление + 280 + true + true + + true + + false + + КонтекстноеМенюТаблицаСопоставленияОтменитьСопоставлениеРасширеннаяПодсказка + 306 + Label + true + true + + Left + + + Form.Command.ОтменитьСопоставление + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + true + true + true + MultiRow + Row +
    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>Страница сопоставления</value> + + + ru + Страница сопоставления + + + СтраницаСопоставленияРасширеннаяПодсказка + 285 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + +
    + + ФормаКоманднаяПанель + -1 + + ЗаписатьИЗакрыть + 271 + true + true + + true + + false + + ЗаписатьИЗакрытьРасширеннаяПодсказка + 283 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + Auto + true + true + true + UserCmds + Auto + + + ЗаписатьОбновить + 270 + true + true + + true + + false + + ЗаписатьОбновитьРасширеннаяПодсказка + 284 + Label + true + true + + Left + + + Form.Command.ЗаписатьОбновить + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + + OnClose + ПриЗакрытии + + Abort + Cancel + Close + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.СопоставлениеОбъектовИнформационныхБаз + + + true + + + true + +
    true
    +
    + + ТаблицаСопоставления + + <key>ru</key> + <value>Таблица сопоставления</value> + + 5 + + ValueTable + + + true + + + true + + + ПриемникПоле1 + + <key>ru</key> + <value>Приемник поле1</value> + + 1 + + String + + + + true + + + true + + + + ИсточникПоле1 + + <key>ru</key> + <value>Источник поле1</value> + + 2 + + String + + + + true + + + true + + + + СтатусСопоставления + + <key>ru</key> + <value>Статус сопоставления</value> + + 3 + + Number + + 1 + + + + true + + + true + + + + УникальныйИдентификаторПриемника + + <key>ru</key> + <value>Уникальный идентификатор приемника</value> + + 4 + + AnyRef + + + true + + + true + + + + ТипПриемника + + <key>ru</key> + <value>Тип приемника</value> + + 5 + + String + + + + true + + + true + + + + ТипИсточника + + <key>ru</key> + <value>Тип источника</value> + + 6 + + String + + + + true + + + true + + + + УникальныйИдентификаторИсточника + + <key>ru</key> + <value>Уникальный идентификатор источника</value> + + 7 + + String + + 36 + + + + true + + + true + + + + ПриемникПоле2 + + <key>ru</key> + <value>Приемник поле2</value> + + 8 + + String + + + + true + + + true + + + + ПриемникПоле3 + + <key>ru</key> + <value>Приемник поле3</value> + + 9 + + String + + + + true + + + true + + + + ПриемникПоле4 + + <key>ru</key> + <value>Приемник поле4</value> + + 10 + + String + + + + true + + + true + + + + ПриемникПоле5 + + <key>ru</key> + <value>Приемник поле5</value> + + 11 + + String + + + + true + + + true + + + + ИсточникПоле2 + + <key>ru</key> + <value>Источник поле2</value> + + 12 + + String + + + + true + + + true + + + + ИсточникПоле3 + + <key>ru</key> + <value>Источник поле3</value> + + 13 + + String + + + + true + + + true + + + + ИсточникПоле4 + + <key>ru</key> + <value>Источник поле4</value> + + 14 + + String + + + + true + + + true + + + + ИсточникПоле5 + + <key>ru</key> + <value>Источник поле5</value> + + 15 + + String + + + + true + + + true + + + + СтатусСопоставленияДополнительный + + <key>ru</key> + <value>Статус сопоставления дополнительный</value> + + 16 + + Number + + 1 + + + + true + + + true + + + + ПолеСортировки1 + + <key>ru</key> + <value>Поле сортировки1</value> + + 17 + + String + + + + true + + + true + + + + ПолеСортировки2 + + <key>ru</key> + <value>Поле сортировки2</value> + + 18 + + String + + + + true + + + true + + + + ПолеСортировки3 + + <key>ru</key> + <value>Поле сортировки3</value> + + 19 + + String + + + + true + + + true + + + + ПолеСортировки4 + + <key>ru</key> + <value>Поле сортировки4</value> + + 20 + + String + + + + true + + + true + + + + ПолеСортировки5 + + <key>ru</key> + <value>Поле сортировки5</value> + + 21 + + String + + + + true + + + true + + + + НомерПоПорядку + + <key>ru</key> + <value>Номер по порядку</value> + + 22 + + Number + + 14 + + + + true + + + true + + + + + ОтборПоСтатусуСопоставления + + <key>ru</key> + <value>Отбор</value> + + 6 + + String + + + + true + + + true + + + + ПроцентСопоставленияОбъектов + + <key>ru</key> + <value>Сопоставлено, %</value> + + 2 + + Number + + 3 + true + + + + true + + + true + + + + КоличествоОбъектовСопоставленных + + <key>ru</key> + <value>Кол-во сопоставленных</value> + + 3 + + Number + + 14 + + + + true + + + true + + + + КоличествоОбъектовВИсточнике + 4 + + Number + + 14 + + + + true + + + true + + + + КоличествоОбъектовВПриемнике + 7 + + Number + + 14 + + + + true + + + true + + + + КоличествоОбъектовНесопоставленных + + <key>ru</key> + <value>Осталось сопоставить, шт</value> + + 8 + + Number + + 14 + + + + true + + + true + + + + ИндексКартинки + + <key>ru</key> + <value>Индекс картинки</value> + + 9 + + Number + + 1 + + + + true + + + true + + + + ДобавитьСопоставление + + <key>ru</key> + <value>Установить связь</value> + + 1 + + ru + Добавить сопоставление + + + true + + + + ДобавитьСопоставление + + + Auto + Auto + + + ОтменитьСопоставление + + <key>ru</key> + <value>Разорвать связь</value> + + 2 + + ru + Отменить сопоставление + + + true + + + StdPicture.Delete + + + + ОтменитьСопоставление + + + TextPicture + Auto + Auto + + + Обновить + + <key>ru</key> + <value>Обновить</value> + + 4 + + ru + Обновить + + + true + + + StdPicture.Refresh + + + + Обновить + + + TextPicture + Auto + Auto + + + ВыполнитьАвтоматическоеСопоставление + + <key>ru</key> + <value>Автоматическое сопоставление...</value> + + 6 + + ru + Выполнить автоматическое сопоставление + + + true + + + + ВыполнитьАвтоматическоеСопоставление + + + Auto + Auto + + + ИзменитьПоляТаблицы + + <key>ru</key> + <value>Видимость полей...</value> + + 7 + + ru + Изменить поля таблицы + + + true + + + + ИзменитьПоляТаблицы + + + Auto + Auto + + + Сортировка + + <key>ru</key> + <value>Сортировать</value> + + 12 + + true + + + StdPicture.SortList + + + + Сортировка + + + TextPicture + Auto + Auto + + + НастройкаСпискаПолейТаблицы + + <key>ru</key> + <value>Список полей таблицы</value> + + 22 + + ru + Настройка списка полей таблицы + + + true + + + + НастройкаСпискаПолейТаблицы + + + Auto + Auto + + + ЗаписатьОбновить + + <key>ru</key> + <value>Записать</value> + + 5 + + ru + Записать изменения + + + true + + + StdPicture.Write + + + + ЗаписатьОбновить + + + Auto + Auto + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 8 + + ru + Записать и закрыть + + + true + + + + ЗаписатьИЗакрыть + + + Auto + Auto + + + ВыполнитьЗагрузкуДанных + + <key>ru</key> + <value>Загрузить данные</value> + + 3 + + ru + Выполнить загрузку данных в информационную базу + + + true + + + CommonPicture.ВыполнитьЗапускОбменаДанными + + + + ВыполнитьЗагрузкуДанных + + + TextPicture + Auto + Auto + + + + + + +
    diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl new file mode 100644 index 000000000..29a7140c7 --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl @@ -0,0 +1,938 @@ +&НаКлиенте +Перем мВыдаватьПредупреждениеПриЗакрытииФормы; + +//////////////////////////////////////////////////////////////////////////////// +// НА СЕРВЕРЕ + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + // проверка, что форма открыта программно + Если Не Параметры.Свойство("ИмяФайлаСообщенияОбмена") Тогда + + НСтрока = НСтр("ru = 'Форма обработки не может быть открыта интерактивно!'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,,, Отказ); + Возврат; + + КонецЕсли; + + // инициализируем обработку переданными параметрами + ЗаполнитьЗначенияСвойств(Объект, Параметры); + + // вызываем конструктор текущего экземпляра обработки + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + ОбработкаОбъект.Конструктор(); + ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); + + // заполняем список отборов + СписокВыбора = Элементы.ОтборПоСтатусуСопоставления.СписокВыбора; + СписокВыбора.Добавить("ВсеОбъекты", "Все объекты"); + СписокВыбора.Добавить("СопоставленныеОбъектыНеутвержденные", "Изменения"); + СписокВыбора.Добавить("НесопоставленныеОбъекты", "Несопоставленные объекты"); + СписокВыбора.Добавить("НесопоставленныеОбъектыПриемника", "Несопоставленные объекты этой базы"); + СписокВыбора.Добавить("НесопоставленныеОбъектыИсточника", "Несопоставленные объекты второй базы"); + СписокВыбора.Добавить("СопоставленныеОбъекты", "Сопоставленные объекты"); + СписокВыбора.Добавить("СопоставленныеОбъектыПоРегистру", "Сопоставленные объекты (не жестко)"); + СписокВыбора.Добавить("СопоставленныеОбъектыПоСсылке", "Сопоставленные объекты (жестко)"); + + // установка отбора по умолчанию + ОтборПоСтатусуСопоставления = "ВсеОбъекты"; + + // установка заголока формы + ЗаголовокФормы = Объект.ИмяТаблицыПриемника + "#"; + ЗаголовокФормы = СтрЗаменить(ЗаголовокФормы, ".", " #"); + + Заголовок = СтрЗаменить(ЗаголовокФормы, "#", """"); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ВыполнитьОбновлениеНаСервере(Отказ) + + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + + // выполняем сопоставление объектов + ОбработкаОбъект.ВыполнитьСопоставлениеОбъектов(Отказ); + + // {Дайджест сопоставления} + КоличествоОбъектовВИсточнике = ОбработкаОбъект.КоличествоОбъектовВИсточнике(); + КоличествоОбъектовВПриемнике = ОбработкаОбъект.КоличествоОбъектовВПриемнике(); + КоличествоОбъектовСопоставленных = ОбработкаОбъект.КоличествоОбъектовСопоставленных(); + КоличествоОбъектовНесопоставленных = ОбработкаОбъект.КоличествоОбъектовНесопоставленных(); + ПроцентСопоставленияОбъектов = ОбработкаОбъект.ПроцентСопоставленияОбъектов(); + ИндексКартинки = ОбменДаннымиСервер.ИндексКартинкиТаблицыИнформацииСтатистики(КоличествоОбъектовНесопоставленных, Объект.ДанныеУспешноЗагружены); + + Если Не Отказ Тогда + + ТаблицаСопоставления.Загрузить(ОбработкаОбъект.ТаблицаСопоставления()); + + ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПрименитьРезультатАвтоматическогоСопоставленияОбъектовИОбновить(Отказ, Знач АдресВременногоХранилища) + + Если ЭтоАдресВременногоХранилища(АдресВременногоХранилища) Тогда + + ТаблицаАвтоматическиСопоставленныхОбъектовПользователя = ПолучитьИзВременногоХранилища(АдресВременногоХранилища); + + УдалитьИзВременногоХранилища(АдресВременногоХранилища); + + Если ТаблицаАвтоматическиСопоставленныхОбъектовПользователя.Количество() = 0 Тогда + Возврат; // таблица пустая; выходим + КонецЕсли; + + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + + // дополняем таблицу неутвержденных связей + Для Каждого СтрокаТаблицы ИЗ ТаблицаАвтоматическиСопоставленныхОбъектовПользователя Цикл + + ЗаполнитьЗначенияСвойств(ОбработкаОбъект.ТаблицаНеутвержденныхСвязей.Добавить(), СтрокаТаблицы); + + КонецЦикла; + + // получаем таблицу сопоставления с учетом обновления таблицы неутвержденных связей + ОбработкаОбъект.ВыполнитьСопоставлениеОбъектов(Отказ); + + // {Дайджест сопоставления} + КоличествоОбъектовВИсточнике = ОбработкаОбъект.КоличествоОбъектовВИсточнике(); + КоличествоОбъектовВПриемнике = ОбработкаОбъект.КоличествоОбъектовВПриемнике(); + КоличествоОбъектовСопоставленных = ОбработкаОбъект.КоличествоОбъектовСопоставленных(); + КоличествоОбъектовНесопоставленных = ОбработкаОбъект.КоличествоОбъектовНесопоставленных(); + ПроцентСопоставленияОбъектов = ОбработкаОбъект.ПроцентСопоставленияОбъектов(); + ИндексКартинки = ОбменДаннымиСервер.ИндексКартинкиТаблицыИнформацииСтатистики(КоличествоОбъектовНесопоставленных, Объект.ДанныеУспешноЗагружены); + + Если Не Отказ Тогда + + ТаблицаСопоставления.Загрузить(ОбработкаОбъект.ТаблицаСопоставления()); + + ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПрименитьТаблицуНеутвержденныхЗаписейИОбновить(Отказ) + + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + + // применяем таблицу неутвержденных связей к базе данных + ОбработкаОбъект.ПрименитьТаблицуНеутвержденныхЗаписей(Отказ); + + Если Не Отказ Тогда + + // получаем таблицу сопоставления с учетом обновления таблицы неутвержденных связей + ОбработкаОбъект.ВыполнитьСопоставлениеОбъектов(Отказ); + + // {Дайджест сопоставления} + КоличествоОбъектовВИсточнике = ОбработкаОбъект.КоличествоОбъектовВИсточнике(); + КоличествоОбъектовВПриемнике = ОбработкаОбъект.КоличествоОбъектовВПриемнике(); + КоличествоОбъектовСопоставленных = ОбработкаОбъект.КоличествоОбъектовСопоставленных(); + КоличествоОбъектовНесопоставленных = ОбработкаОбъект.КоличествоОбъектовНесопоставленных(); + ПроцентСопоставленияОбъектов = ОбработкаОбъект.ПроцентСопоставленияОбъектов(); + ИндексКартинки = ОбменДаннымиСервер.ИндексКартинкиТаблицыИнформацииСтатистики(КоличествоОбъектовНесопоставленных, Объект.ДанныеУспешноЗагружены); + + КонецЕсли; + + Если Не Отказ Тогда + + ТаблицаСопоставления.Загрузить(ОбработкаОбъект.ТаблицаСопоставления()); + + ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПрименитьТаблицуНеутвержденныхЗаписей(Отказ) + + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + + // применяем таблицу неутвержденных связей к базе данных + ОбработкаОбъект.ПрименитьТаблицуНеутвержденныхЗаписей(Отказ); + + ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); + +КонецПроцедуры + +&НаСервере +Процедура ОтменитьСопоставлениеНаСервере(ВыделенныеСтроки) + + Для Каждого ИдентификаторСтроки ИЗ ВыделенныеСтроки Цикл + + ТекущиеДанные = ТаблицаСопоставления.НайтиПоИдентификатору(ИдентификаторСтроки); + + Если ТекущиеДанные.СтатусСопоставления = 0 Тогда // сопоставленные через РС (не жестко) + + ОтменитьСопоставлениеДанных(ТекущиеДанные, Ложь); + + ИначеЕсли ТекущиеДанные.СтатусСопоставления = 3 Тогда // неутвержденное сопоставление + + ОтменитьСопоставлениеДанных(ТекущиеДанные, Истина); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ОтменитьСопоставлениеДанных(ТекущиеДанные, ЭтоНеутверженнаяСвязь) + + Отбор = Новый Структура; + Отбор.Вставить("УникальныйИдентификаторИсточника", ТекущиеДанные.УникальныйИдентификаторПриемника); + Отбор.Вставить("УникальныйИдентификаторПриемника", ТекущиеДанные.УникальныйИдентификаторИсточника); + Отбор.Вставить("ТипИсточника", ТекущиеДанные.ТипПриемника); + Отбор.Вставить("ТипПриемника", ТекущиеДанные.ТипИсточника); + + Если ЭтоНеутверженнаяСвязь Тогда + + НайденныеСтроки = Объект.ТаблицаНеутвержденныхСвязей.НайтиСтроки(Отбор); + + Если НайденныеСтроки.Количество() > 0 Тогда + + // удаляем неутвержденную связь в таблице неутвержденных связей + Объект.ТаблицаНеутвержденныхСвязей.Удалить(НайденныеСтроки[0]); + + КонецЕсли; + + Иначе + + ОтменитьУтвержденноеСопоставлениеНаСервере(Отбор); + + КонецЕсли; + + + // добавляем в таблицу сопоставления две строки: источника и приемника + НоваяСтрокаИсточника = ТаблицаСопоставления.Добавить(); + НоваяСтрокаПриемника = ТаблицаСопоставления.Добавить(); + + ЗаполнитьЗначенияСвойств(НоваяСтрокаИсточника, ТекущиеДанные, "ИсточникПоле1, ИсточникПоле2, ИсточникПоле3, ИсточникПоле4, ИсточникПоле5, УникальныйИдентификаторИсточника, ТипИсточника"); + ЗаполнитьЗначенияСвойств(НоваяСтрокаПриемника, ТекущиеДанные, "ПриемникПоле1, ПриемникПоле2, ПриемникПоле3, ПриемникПоле4, ПриемникПоле5, УникальныйИдентификаторПриемника, ТипПриемника"); + + // устанавливаем значения полей для сортировки строки источника + НоваяСтрокаИсточника.ПолеСортировки1 = ТекущиеДанные.ИсточникПоле1; + НоваяСтрокаИсточника.ПолеСортировки2 = ТекущиеДанные.ИсточникПоле2; + НоваяСтрокаИсточника.ПолеСортировки3 = ТекущиеДанные.ИсточникПоле3; + НоваяСтрокаИсточника.ПолеСортировки4 = ТекущиеДанные.ИсточникПоле4; + НоваяСтрокаИсточника.ПолеСортировки5 = ТекущиеДанные.ИсточникПоле5; + + // устанавливаем значения полей для сортировки строки приемника + НоваяСтрокаПриемника.ПолеСортировки1 = ТекущиеДанные.ПриемникПоле1; + НоваяСтрокаПриемника.ПолеСортировки2 = ТекущиеДанные.ПриемникПоле2; + НоваяСтрокаПриемника.ПолеСортировки3 = ТекущиеДанные.ПриемникПоле3; + НоваяСтрокаПриемника.ПолеСортировки4 = ТекущиеДанные.ПриемникПоле4; + НоваяСтрокаПриемника.ПолеСортировки5 = ТекущиеДанные.ПриемникПоле5; + + НоваяСтрокаИсточника.СтатусСопоставления = -1; + НоваяСтрокаИсточника.СтатусСопоставленияДополнительный = 1; // несопоставленные объекты + + НоваяСтрокаПриемника.СтатусСопоставления = 1; + НоваяСтрокаПриемника.СтатусСопоставленияДополнительный = 1; // несопоставленные объекты + + // удаляем текущую строку таблицы сопоставления + ТаблицаСопоставления.Удалить(ТекущиеДанные); + +КонецПроцедуры + +&НаСервере +Процедура ОтменитьУтвержденноеСопоставлениеНаСервере(Отбор) + + Отбор.Вставить("УзелИнформационнойБазы", Объект.УзелИнформационнойБазы); + + РегистрыСведений.СоответствиеОбъектовИнформационныхБаз.УдалитьЗапись(Отбор); + +КонецПроцедуры + +&НаСервере +Процедура ВыполнитьЗагрузкуДанныхНаСервере(Отказ) + + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + + ТаблицыДляЗагрузки = Новый Массив; + ТаблицыДляЗагрузки.Добавить(Объект.ИмяТипаОбъектаТаблицыИсточника); + + // выполняем загрузку данных из файла пакета в режиме обмена данными + ОбработкаОбъект.ВыполнитьЗагрузкуДанныхВИнформационнуюБазу(Отказ, ТаблицыДляЗагрузки); + + ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); + + ИндексКартинки = ОбменДаннымиСервер.ИндексКартинкиТаблицыИнформацииСтатистики(КоличествоОбъектовНесопоставленных, Объект.ДанныеУспешноЗагружены); + +КонецПроцедуры + +&НаСервере +Функция ПоместитьТаблицуНеутвержденныхСвязейВоВременноеХранилище() + + Возврат ПоместитьВоВременноеХранилище(Объект.ТаблицаНеутвержденныхСвязей.Выгрузить()); + +КонецФункции + +&НаСервере +Функция ПолучитьАдресВременногоХранилищаТаблицыВыбораСвязи(ПараметрыОтбора) + + Колонки = "НомерПоПорядку, ПолеСортировки1, ПолеСортировки2, ПолеСортировки3, ПолеСортировки4, ПолеСортировки5"; + + Возврат ПоместитьВоВременноеХранилище(ТаблицаСопоставления.Выгрузить(ПараметрыОтбора, Колонки)); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// НА КЛИЕНТЕ + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Обновить(Неопределено); + + // устанавливает флаг модифицированности формы + ПодключитьОбработчикОжидания("УстановитьМодифицированностьФормы", 2); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Если Объект.ТаблицаНеутвержденныхСвязей.Количество() > 0 Тогда + + Если мВыдаватьПредупреждениеПриЗакрытииФормы = Истина Тогда + + НСтрока = НСтр("ru = 'Данные были изменены. Сохранить изменения?'"); + + Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНетОтмена, ,КодВозвратаДиалога.Да); + + Если Ответ = КодВозвратаДиалога.Нет Тогда + + Возврат; // закрываем форму без сохранения данных + + ИначеЕсли Ответ = КодВозвратаДиалога.Да Тогда + + // закрываем форму с сохранением данных + + ИначеЕсли Ответ = КодВозвратаДиалога.Отмена Тогда + + // форму не закрываем; данные не сохраняем + Отказ = Истина; + Возврат; + + КонецЕсли; + + КонецЕсли; + + мВыдаватьПредупреждениеПриЗакрытииФормы = Истина; + + // применяем таблицу неутвержденных связей + ПрименитьТаблицуНеутвержденныхЗаписей(Отказ); + + Если Отказ Тогда + + Предупреждение(НСтр("ru = 'Возникли ошибки!'")); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии() + + ПараметрыОповещения = Новый Структура; + ПараметрыОповещения.Вставить("КлючУникальности", КлючУникальности); + + // передаем дайджест сопоставления в форму помощника + ПараметрыОповещения.Вставить("КоличествоОбъектовВИсточнике", КоличествоОбъектовВИсточнике); + ПараметрыОповещения.Вставить("КоличествоОбъектовВПриемнике", КоличествоОбъектовВПриемнике); + ПараметрыОповещения.Вставить("КоличествоОбъектовСопоставленных", КоличествоОбъектовСопоставленных); + ПараметрыОповещения.Вставить("КоличествоОбъектовНесопоставленных", КоличествоОбъектовНесопоставленных); + ПараметрыОповещения.Вставить("ПроцентСопоставленияОбъектов", ПроцентСопоставленияОбъектов); + ПараметрыОповещения.Вставить("ИндексКартинки", ИндексКартинки); + + Оповестить("ЗакрытиеФормыСопоставленияОбъектов", ПараметрыОповещения); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура Обновить(Команда) + + Отказ = Ложь; + + // проверка на количество пользовательских полей для отображения + ВыполнитьПроверкуЗаданияПользовательскихПолей(Отказ, Объект.СписокИспользуемыхПолей.ВыгрузитьЗначения()); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + // оповещение состояния + Состояние(НСтр("ru = 'Выполняется сопоставление объектов. Пожалуйста, подождите...'")); + + ВыполнитьОбновлениеНаСервере(Отказ); + + // устанавливаем текущий отбор в табличной части сопоставления + УстановитьОтборТабличныхЧастей(); + + // устанавливаем видимость и заголовки полей таблицы сопоставления + УстановитьВидимостьПолейТаблицы("ТаблицаСопоставления"); + + Если Отказ Тогда + + Предупреждение(НСтр("ru = 'При выполнении операции сопоставления возникли ошибки.'")); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьАвтоматическоеСопоставление(Команда) + + Отказ = Ложь; + + // проверка на количество пользовательских полей для отображения + ВыполнитьПроверкуЗаданияПользовательскихПолей(Отказ, Объект.СписокИспользуемыхПолей.ВыгрузитьЗначения()); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + // получаем список полей сопоставления от пользователя + ПараметрыДляФормы = Новый Структура("СписокПолейСопоставления", Объект.СписокПолейТаблицы.Скопировать()); + + СписокПолейСопоставления = ОткрытьФормуМодально("Обработка.СопоставлениеОбъектовИнформационныхБаз.Форма.НастройкаАвтоматическогоСопоставления", ПараметрыДляФормы, ЭтаФорма); + + Если ТипЗнч(СписокПолейСопоставления) <> Тип("СписокЗначений") Тогда + Возврат; + КонецЕсли; + + // выполняем автоматическое сопоставление объектов + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ИмяТаблицыПриемника", Объект.ИмяТаблицыПриемника); + ПараметрыФормы.Вставить("ИмяФайлаСообщенияОбмена", Объект.ИмяФайлаСообщенияОбмена); + ПараметрыФормы.Вставить("ИмяТипаОбъектаТаблицыИсточника", Объект.ИмяТипаОбъектаТаблицыИсточника); + ПараметрыФормы.Вставить("ТипИсточникаСтрокой", Объект.ТипИсточникаСтрокой); + ПараметрыФормы.Вставить("ТипПриемникаСтрокой", Объект.ТипПриемникаСтрокой); + ПараметрыФормы.Вставить("ПоляТаблицыПриемника", Объект.ПоляТаблицыПриемника); + ПараметрыФормы.Вставить("ПоляПоискаТаблицыПриемника", Объект.ПоляПоискаТаблицыПриемника); + ПараметрыФормы.Вставить("УзелИнформационнойБазы", Объект.УзелИнформационнойБазы); + ПараметрыФормы.Вставить("СписокПолейТаблицы", Объект.СписокПолейТаблицы.Скопировать()); + ПараметрыФормы.Вставить("СписокИспользуемыхПолей", Объект.СписокИспользуемыхПолей.Скопировать()); + ПараметрыФормы.Вставить("СписокПолейСопоставления", СписокПолейСопоставления.Скопировать()); + ПараметрыФормы.Вставить("МаксимальноеКоличествоПользовательскихПолей", МаксимальноеКоличествоПользовательскихПолей()); + ПараметрыФормы.Вставить("Заголовок", Заголовок); + + ПараметрыФормы.Вставить("АдресВременногоХранилищаТаблицыНеутвержденныхСвязей", ПоместитьТаблицуНеутвержденныхСвязейВоВременноеХранилище()); + + Состояние(НСтр("ru = 'Выполняется автоматическое сопоставление. Пожалуйста, подождите...'")); + + // открываем форму выполнения автоматического сопоставления объектов + АдресВременногоХранилища = ОткрытьФормуМодально("Обработка.СопоставлениеОбъектовИнформационныхБаз.Форма.РезультатАвтоматическогоСопоставления", ПараметрыФормы, ЭтаФорма); + + Если ТипЗнч(АдресВременногоХранилища) = Тип("Строка") Тогда + + // Применяем результат и обновляем таблицу сопоставления с учетом полученного сопоставления объектов + ПрименитьРезультатАвтоматическогоСопоставленияОбъектовИОбновить(Отказ, АдресВременногоХранилища); + + Если Не Отказ Тогда + + // устанавливаем текущий отбор + УстановитьОтборТабличныхЧастей(); + + КонецЕсли; + + КонецЕсли; + + Если Отказ Тогда + + Предупреждение(НСтр("ru = 'Во время выполнения автоматического сопоставления возникли ошибки.'")); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьЗагрузкуДанных(Команда) + + Отказ = Ложь; + + НСтрока = НСтр("ru = 'Выполнить загрузку данных в информационную базу?'"); + Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Да); + Если Ответ = КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + + Если Объект.ДанныеУспешноЗагружены Тогда + + НСтрока = НСтр("ru = 'Данные уже были успешно загружены. Выполнить загрузку данных повторно?'"); + Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет); + Если Ответ = КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + + КонецЕсли; + + // оповещение состояния + Состояние(НСтр("ru = 'Выполняется загрузка данных. Пожалуйста, подождите...'")); + + // выполняем загрузку данных на сервере + ВыполнитьЗагрузкуДанныхНаСервере(Отказ); + + // выполняем оповещение формы помощника сопоставления об успешной загрузке данных + ПараметрыОповещения = Новый Структура; + ПараметрыОповещения.Вставить("КлючУникальности", КлючУникальности); + ПараметрыОповещения.Вставить("ДанныеУспешноЗагружены", Объект.ДанныеУспешноЗагружены); + ПараметрыОповещения.Вставить("ИндексКартинки", ИндексКартинки); + + Оповестить("ИнформацияЗагрузкиДанных", ПараметрыОповещения); + + // обновляем данные в таблице сопоставления + Обновить(Команда); + + Если Отказ Тогда + Предупреждение(НСтр("ru = 'При выполнении загрузки данных возникли ошибки.'")); + КонецЕсли; + +КонецПроцедуры + +// + +&НаКлиенте +Процедура ИзменитьПоляТаблицы(Команда) + + ПараметрыДляФормы = Новый Структура("СписокПолей", Объект.СписокИспользуемыхПолей.Скопировать()); + + СписокПолейФормыНастройки = ОткрытьФормуМодально("Обработка.СопоставлениеОбъектовИнформационныхБаз.Форма.НастройкаПолейТаблицы", ПараметрыДляФормы, ЭтаФорма); + + Если ТипЗнч(СписокПолейФормыНастройки) <> Тип("СписокЗначений") Тогда + + Возврат; + + КонецЕсли; + + Объект.СписокИспользуемыхПолей = СписокПолейФормыНастройки.Скопировать(); + + // устанавливаем видимость и заголовки полей таблицы сопоставления + УстановитьВидимостьПолейТаблицы("ТаблицаСопоставления"); + +КонецПроцедуры + +&НаКлиенте +Процедура НастройкаСпискаПолейТаблицы(Команда) + + Отказ = Ложь; + + ПараметрыДляФормы = Новый Структура("СписокПолей", Объект.СписокПолейТаблицы.Скопировать()); + + СписокПолейФормыНастройки = ОткрытьФормуМодально("Обработка.СопоставлениеОбъектовИнформационныхБаз.Форма.НастройкаПолейТаблицыСопоставления", ПараметрыДляФормы, ЭтаФорма); + + Если ТипЗнч(СписокПолейФормыНастройки) <> Тип("СписокЗначений") Тогда + Возврат; + КонецЕсли; + + Объект.СписокПолейТаблицы = СписокПолейФормыНастройки.Скопировать(); + + ЗаполнитьСписокОтмеченнымиЭлементами(Объект.СписокПолейТаблицы, Объект.СписокИспользуемыхПолей); + + // формируем Таблицу сортировки + ЗаполнитьТаблицуСортировки(Объект.СписокИспользуемыхПолей); + + // обновляем таблицу сопоставления с учетом новых полей таблицы + Обновить(Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура Сортировка(Команда) + + ПараметрыДляФормы = Новый Структура("ТаблицаСортировки", Объект.ТаблицаСортировки); + + ТаблицаСортировкиРезультат = ОткрытьФормуМодально("Обработка.СопоставлениеОбъектовИнформационныхБаз.Форма.НастройкаСортировки", ПараметрыДляФормы, ЭтаФорма); + + Если ТипЗнч(ТаблицаСортировкиРезультат) <> Тип("ДанныеФормыКоллекция") Тогда + + Возврат; + + КонецЕсли; + + Объект.ТаблицаСортировки.Очистить(); + + // заполняем коллекцию формы полученными настройками + Для Каждого СтрокаТаблицы ИЗ ТаблицаСортировкиРезультат Цикл + + ЗаполнитьЗначенияСвойств(Объект.ТаблицаСортировки.Добавить(), СтрокаТаблицы); + + КонецЦикла; + + // сортируем таблицу сопоставления + ВыполнитьСортировкуТаблицы(); + + // обновляем отбор в таблицах + УстановитьОтборТабличныхЧастей(); + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьСопоставление(Команда) + + УстановитьСвязьИнтерактивно(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтменитьСопоставление(Команда) + + ВыделенныеСтроки = Элементы.ТаблицаСопоставления.ВыделенныеСтроки; + + ОтменитьСопоставлениеНаСервере(ВыделенныеСтроки); + + // обновляем отбор в табличных частях + УстановитьОтборТабличныхЧастей(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьОбновить(Команда) + + Если Объект.ТаблицаНеутвержденныхСвязей.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Отказ = Ложь; + + // применяем таблицу неутвержденных связей + ПрименитьТаблицуНеутвержденныхЗаписейИОбновить(Отказ); + + // устанавливаем текущий отбор в табличной части сопоставления + УстановитьОтборТабличныхЧастей(); + + Если Отказ Тогда + Предупреждение(НСтр("ru = 'Возникли ошибки!'")); + Иначе + Модифицированность = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + + мВыдаватьПредупреждениеПриЗакрытииФормы = Ложь; + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтборПоСтатусуСопоставленияПриИзменении(Элемент) + + УстановитьОтборТабличныхЧастей(); + +КонецПроцедуры + +&НаКлиенте +Процедура рТаблицаСопоставленияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + УстановитьСвязьИнтерактивно(); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьМодифицированностьФормы() + + Модифицированность = (Объект.ТаблицаНеутвержденныхСвязей.Количество() > 0); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ПРИКЛАДНЫЕ + +&НаКлиенте +Процедура ЗаполнитьТаблицуСортировки(СписокЗначенийИсточник) + + Объект.ТаблицаСортировки.Очистить(); + + Для Каждого Элемент ИЗ СписокЗначенийИсточник Цикл + + ЭтоПервоеПоле = СписокЗначенийИсточник.Индекс(Элемент) = 0; + + СтрокаТаблицы = Объект.ТаблицаСортировки.Добавить(); + + СтрокаТаблицы.ИмяПоля = Элемент.Значение; + СтрокаТаблицы.Использование = ЭтоПервоеПоле; // по умолчанию сортируем по первому полю + СтрокаТаблицы.НаправлениеСортировки = Истина; // по возрастанию + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьСписокОтмеченнымиЭлементами(СписокИсточник, СписокПриемник) + + СписокПриемник.Очистить(); + + Для Каждого Элемент ИЗ СписокИсточник Цикл + + Если Элемент.Пометка Тогда + + СписокПриемник.Добавить(Элемент.Значение, Элемент.Представление, Истина); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьОтборТабличныхЧастей() + + Если ОтборПоСтатусуСопоставления = "ВсеОбъекты" Тогда ФиксированнаяСтруктура = Новый ФиксированнаяСтруктура; + ИначеЕсли ОтборПоСтатусуСопоставления = "НесопоставленныеОбъекты" Тогда ФиксированнаяСтруктура = Новый ФиксированнаяСтруктура("СтатусСопоставленияДополнительный", 1); + ИначеЕсли ОтборПоСтатусуСопоставления = "СопоставленныеОбъекты" Тогда ФиксированнаяСтруктура = Новый ФиксированнаяСтруктура("СтатусСопоставленияДополнительный", 0); + ИначеЕсли ОтборПоСтатусуСопоставления = "НесопоставленныеОбъектыИсточника" Тогда ФиксированнаяСтруктура = Новый ФиксированнаяСтруктура("СтатусСопоставления", -1); + ИначеЕсли ОтборПоСтатусуСопоставления = "НесопоставленныеОбъектыПриемника" Тогда ФиксированнаяСтруктура = Новый ФиксированнаяСтруктура("СтатусСопоставления", 1); + ИначеЕсли ОтборПоСтатусуСопоставления = "СопоставленныеОбъектыПоРегистру" Тогда ФиксированнаяСтруктура = Новый ФиксированнаяСтруктура("СтатусСопоставления", 0); + ИначеЕсли ОтборПоСтатусуСопоставления = "СопоставленныеОбъектыПоСсылке" Тогда ФиксированнаяСтруктура = Новый ФиксированнаяСтруктура("СтатусСопоставления", 2); + ИначеЕсли ОтборПоСтатусуСопоставления = "СопоставленныеОбъектыНеутвержденные" Тогда ФиксированнаяСтруктура = Новый ФиксированнаяСтруктура("СтатусСопоставления", 3); + КонецЕсли; + + Элементы.ТаблицаСопоставления.ОтборСтрок = ФиксированнаяСтруктура; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьПроверкуЗаданияПользовательскихПолей(Отказ, ПользовательскиеПоля) + + Если ПользовательскиеПоля.Количество() = 0 Тогда + + // значение должно быть не нулевое + НСтрока = НСтр("ru = 'Следует указать хотя бы одно поле для отображения'"); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,"Объект.СписокПолейТаблицы",, Отказ); + + ИначеЕсли ПользовательскиеПоля.Количество() > МаксимальноеКоличествоПользовательскихПолей() Тогда + + // значение должно быть не больше установленного + СтрокаСообщения = НСтр("ru = 'Уменьшите количество полей (можно выбирать не более [КоличествоПолей] полей)'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[КоличествоПолей]", Строка(МаксимальноеКоличествоПользовательскихПолей())); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщения,,"Объект.СписокПолейТаблицы",, Отказ); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьВидимостьПолейТаблицы(ИмяТаблицыФормы) + + ИмяПоляИсточника = СтрЗаменить("#ИмяТаблицыФормы#ИсточникПолеNN","#ИмяТаблицыФормы#", ИмяТаблицыФормы); + ИмяПоляПриемника = СтрЗаменить("#ИмяТаблицыФормы#ПриемникПолеNN","#ИмяТаблицыФормы#", ИмяТаблицыФормы); + + // снимаем видимость всех полей таблицы сопоставления + Для НомерПоля = 1 По МаксимальноеКоличествоПользовательскихПолей() Цикл + + ПолеИсточника = СтрЗаменить(ИмяПоляИсточника, "NN", Строка(НомерПоля)); + ПолеПриемника = СтрЗаменить(ИмяПоляПриемника, "NN", Строка(НомерПоля)); + + Элементы[ПолеИсточника].Видимость = Ложь; + Элементы[ПолеПриемника].Видимость = Ложь; + + КонецЦикла; + + // устанавливаем видимость полей таблицы сопоставления выбранных пользователем + Для Каждого Элемент ИЗ Объект.СписокИспользуемыхПолей Цикл + + НомерПоля = Объект.СписокИспользуемыхПолей.Индекс(Элемент) + 1; + + ПолеИсточника = СтрЗаменить(ИмяПоляИсточника, "NN", Строка(НомерПоля)); + ПолеПриемника = СтрЗаменить(ИмяПоляПриемника, "NN", Строка(НомерПоля)); + + // устанавливаем видимость полей + Элементы[ПолеИсточника].Видимость = Элемент.Пометка; + Элементы[ПолеПриемника].Видимость = Элемент.Пометка; + + // устанавливаем заголовки полей + Элементы[ПолеИсточника].Заголовок = Элемент.Значение; + Элементы[ПолеПриемника].Заголовок = Элемент.Значение; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьСвязьИнтерактивно() + + ТекущиеДанные = Элементы.ТаблицаСопоставления.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + // выбор связи возможен только для несопоставленных объектов источника или приемника + Если Не (ТекущиеДанные.СтатусСопоставления = -1 + ИЛИ ТекущиеДанные.СтатусСопоставления = +1) Тогда + // + Предупреждение(НСтр("ru = 'Объекты уже сопоставлены'"), 2); + + // переводим фокус ввода на таблицу сопоставления + ТекущийЭлемент = Элементы.ТаблицаСопоставления; + + Возврат; + КонецЕсли; + + ИдентификаторСтрокиНачала = Элементы.ТаблицаСопоставления.ТекущаяСтрока; + + ПараметрыОтбора = Новый Структура("СтатусСопоставления", ?(ТекущиеДанные.СтатусСопоставления = -1, 1, -1)); + + // вызов сервера + ПараметрыФормы = Новый Структура(); + ПараметрыФормы.Вставить("АдресВременногоХранилища", ПолучитьАдресВременногоХранилищаТаблицыВыбораСвязи(ПараметрыОтбора)); + ПараметрыФормы.Вставить("НомерПоПорядкуСтрокиНачала", ТекущиеДанные.НомерПоПорядку); + ПараметрыФормы.Вставить("СписокИспользуемыхПолей", Объект.СписокИспользуемыхПолей.Скопировать()); + ПараметрыФормы.Вставить("МаксимальноеКоличествоПользовательскихПолей", МаксимальноеКоличествоПользовательскихПолей()); + + // вызов сервера + НомерПоПорядкуСтрокиОкончания = ОткрытьФормуМодально("Обработка.СопоставлениеОбъектовИнформационныхБаз.Форма.ФормаВыбораСвязиСопоставления", ПараметрыФормы, ЭтаФорма); + + Если НомерПоПорядкуСтрокиОкончания = Неопределено Тогда + Возврат; // отказались от выбора связи для сопоставления + КонецЕсли; + + // вызов сервера + НайденныеСтроки = ТаблицаСопоставления.НайтиСтроки(Новый Структура("НомерПоПорядку", НомерПоПорядкуСтрокиОкончания)); + + ИдентификаторСтрокиОкончания = НайденныеСтроки[0].ПолучитьИдентификатор(); + + // обрабатываем полученное сопоставление + ДобавитьНеутвержденноеСопоставлениеНаКлиенте(ИдентификаторСтрокиНачала, ИдентификаторСтрокиОкончания); + + // переводим фокус ввода на таблицу сопоставления + ТекущийЭлемент = Элементы.ТаблицаСопоставления; + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьНеутвержденноеСопоставлениеНаКлиенте(ИдентификаторСтрокиНачала, ИдентификаторСтрокиОкончания) + + // получаем две сопоставленные строки таблицы по указанным идентификаторам + // добавляем строку в таблицу неутверженных связей + // добавляем строку в таблицу сопоставления + // удаляем две сопоставленные строки из таблицы сопоставления + + СтрокаНачала = ТаблицаСопоставления.НайтиПоИдентификатору(ИдентификаторСтрокиНачала); + СтрокаОкончания = ТаблицаСопоставления.НайтиПоИдентификатору(ИдентификаторСтрокиОкончания); + + Если СтрокаНачала = Неопределено + ИЛИ СтрокаОкончания = Неопределено Тогда + Возврат; + КонецЕсли; + + ЭтоСопоставлениеИсточникПриемник = (СтрокаНачала.СтатусСопоставления = -1); + + СтрокаИсточника = ?(ЭтоСопоставлениеИсточникПриемник, СтрокаНачала, СтрокаОкончания); + СтрокаПриемника = ?(ЭтоСопоставлениеИсточникПриемник, СтрокаОкончания, СтрокаНачала); + + // добавляем строку в таблицу неутвержденных связей + НоваяСтрока = Объект.ТаблицаНеутвержденныхСвязей.Добавить(); + + НоваяСтрока.УникальныйИдентификаторИсточника = СтрокаПриемника.УникальныйИдентификаторПриемника; + НоваяСтрока.ТипИсточника = СтрокаПриемника.ТипПриемника; + НоваяСтрока.УникальныйИдентификаторПриемника = СтрокаИсточника.УникальныйИдентификаторИсточника; + НоваяСтрока.ТипПриемника = СтрокаИсточника.ТипИсточника; + + // добавляем строку в таблицу сопоставления как неутвержденную + НоваяСтрокаНеутвержденные = ТаблицаСопоставления.Добавить(); + + // поля сортировки берем из строки приемника + ЗаполнитьЗначенияСвойств(НоваяСтрокаНеутвержденные, СтрокаИсточника, "ИсточникПоле1, ИсточникПоле2, ИсточникПоле3, ИсточникПоле4, ИсточникПоле5, УникальныйИдентификаторИсточника, ТипИсточника"); + ЗаполнитьЗначенияСвойств(НоваяСтрокаНеутвержденные, СтрокаПриемника, "ПриемникПоле1, ПриемникПоле2, ПриемникПоле3, ПриемникПоле4, ПриемникПоле5, УникальныйИдентификаторПриемника, ТипПриемника, ПолеСортировки1, ПолеСортировки2, ПолеСортировки3, ПолеСортировки4, ПолеСортировки5"); + + НоваяСтрокаНеутвержденные.СтатусСопоставления = 3; // неутверженная связь + НоваяСтрокаНеутвержденные.СтатусСопоставленияДополнительный = 0; + + // удаляем сопоставленные строки + ТаблицаСопоставления.Удалить(СтрокаНачала); + ТаблицаСопоставления.Удалить(СтрокаОкончания); + + // устанавливаем отбор и обновляем данные в таблице сопоставления + УстановитьОтборТабличныхЧастей(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьСортировкуТаблицы() + + ПоляСортировки = ПолучитьПоляСортировки(); + + Если Не ПустаяСтрока(ПоляСортировки) Тогда + + // вызов сервера + ТаблицаСопоставления.Сортировать(ПоляСортировки); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьПоляСортировки() + + // возвращаемое значение функции + ПоляСортировки = ""; + + ШаблонПоля = "ПолеСортировкиNN #НаправлениеСортировки"; + + Для Каждого СтрокаТаблицы ИЗ Объект.ТаблицаСортировки Цикл + + Если СтрокаТаблицы.Использование Тогда + + Разделитель = ?(ПустаяСтрока(ПоляСортировки), "", ", "); + + НаправлениеСортировкиСтр = ?(СтрокаТаблицы.НаправлениеСортировки, "Возр", "Убыв"); + + ЭлементСписка = Объект.СписокИспользуемыхПолей.НайтиПоЗначению(СтрокаТаблицы.ИмяПоля); + + ИндексПоля = Объект.СписокИспользуемыхПолей.Индекс(ЭлементСписка) + 1; + + ИмяПоля = СтрЗаменить(ШаблонПоля, "NN", Строка(ИндексПоля)); + ИмяПоля = СтрЗаменить(ИмяПоля, "#НаправлениеСортировки", НаправлениеСортировкиСтр); + + ПоляСортировки = ПоляСортировки + Разделитель + ИмяПоля; + + КонецЕсли; + + КонецЦикла; + + Возврат ПоляСортировки; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// СВОЙСТВА + +&НаКлиенте +Функция МаксимальноеКоличествоПользовательскихПолей() + + Возврат ОбменДаннымиКлиент.МаксимальноеКоличествоПолейСопоставленияОбъектов(); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ИНИЦИАЛИЗАЦИЯ + +мВыдаватьПредупреждениеПриЗакрытииФормы = Истина; diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Form.form b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Form.form new file mode 100644 index 000000000..18970b7c8 --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Form.form @@ -0,0 +1,649 @@ + + + + <key>ru</key> + <value>Выбор объекта для сопоставления</value> + + + ТаблицаВыбора + 1 + true + true + + true + + + ТаблицаВыбора + + false + None + Add + CancelSearch + Change + Copy + CopyToClipboard + Delete + EndEdit + Find + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + + ГруппировкаПолей + 14 + + ТаблицаВыбораПолеСортировки1 + 4 + true + true + + true + + + ТаблицаВыбора.ПолеСортировки1 + + + ТаблицаВыбораПолеСортировки1РасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ТаблицаВыбораПолеСортировки1КонтекстноеМеню + 5 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаВыбораПолеСортировки2 + 6 + true + true + + true + + + ТаблицаВыбора.ПолеСортировки2 + + + ТаблицаВыбораПолеСортировки2РасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ТаблицаВыбораПолеСортировки2КонтекстноеМеню + 7 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаВыбораПолеСортировки3 + 8 + true + true + + true + + + ТаблицаВыбора.ПолеСортировки3 + + + ТаблицаВыбораПолеСортировки3РасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ТаблицаВыбораПолеСортировки3КонтекстноеМеню + 9 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаВыбораПолеСортировки4 + 10 + true + true + + true + + + ТаблицаВыбора.ПолеСортировки4 + + + ТаблицаВыбораПолеСортировки4РасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ТаблицаВыбораПолеСортировки4КонтекстноеМеню + 11 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаВыбораПолеСортировки5 + 12 + true + true + + true + + + ТаблицаВыбора.ПолеСортировки5 + + + ТаблицаВыбораПолеСортировки5РасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + ТаблицаВыбораПолеСортировки5КонтекстноеМеню + 13 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группировка полей</value> + + + ru + Группировка полей + + + ГруппировкаПолейРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + ColumnGroup + + Vertical + auto + true + + + None + + ТаблицаВыбораКоманднаяПанель + 3 + Left + true + + + Selection + ТаблицаВыбораВыбор + + + ТаблицаВыбораСтрокаПоиска + 22 + + ТаблицаВыбораСтрокаПоискаРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ТаблицаВыбораСтрокаПоискаКонтекстноеМеню + 23 + true + + ТаблицаВыбора + + true + + + + ТаблицаВыбораСостояниеПросмотра + 25 + + ТаблицаВыбораСостояниеПросмотраРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + ТаблицаВыбораСостояниеПросмотраКонтекстноеМеню + 26 + true + + ViewStatusAddition + ТаблицаВыбора + + true + + + + ТаблицаВыбораУправлениеПоиском + 28 + + ТаблицаВыбораУправлениеПоискомРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ТаблицаВыбораУправлениеПоискомКонтекстноеМеню + 29 + true + + SearchControlAddition + ТаблицаВыбора + + true + + + + ТаблицаВыбораРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + ТаблицаВыбораКонтекстноеМеню + 2 + true + + true + true + true + true + true + true + MultiRow + Row +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + +
    + Top + true + + ФормаКоманднаяПанель + -1 + + Выбрать + 16 + true + true + + true + + false + + ВыбратьРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.Command.Выбрать + Auto + true + true + true + UserCmds + Auto + + + Закрыть + 18 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + Auto + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.СопоставлениеОбъектовИнформационныхБаз + + + true + + + true + +
    true
    +
    + + ТаблицаВыбора + + <key>ru</key> + <value>Таблица выбора</value> + + 2 + + ValueTable + + + true + + + true + + + ПолеСортировки1 + + <key>ru</key> + <value>Поле сортировки1</value> + + 17 + + String + + + + true + + + true + + + + ПолеСортировки2 + + <key>ru</key> + <value>Поле сортировки2</value> + + 18 + + String + + + + true + + + true + + + + ПолеСортировки3 + + <key>ru</key> + <value>Поле сортировки3</value> + + 19 + + String + + + + true + + + true + + + + ПолеСортировки4 + + <key>ru</key> + <value>Поле сортировки4</value> + + 20 + + String + + + + true + + + true + + + + ПолеСортировки5 + + <key>ru</key> + <value>Поле сортировки5</value> + + 21 + + String + + + + true + + + true + + + + НомерПоПорядку + + <key>ru</key> + <value>Номер по порядку</value> + + 1 + + Number + + 14 + + + + true + + + true + + + + + Выбрать + + <key>ru</key> + <value>Выбрать</value> + + 1 + + ru + Выбрать + + + true + + + StdPicture.ChooseValue + + + + Выбрать + + + TextPicture + Auto + Auto + + + + + + +
    diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Module.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Module.bsl new file mode 100644 index 000000000..cc995318b --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Module.bsl @@ -0,0 +1,104 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ТаблицаВыбора.Загрузить(ПолучитьИзВременногоХранилища(Параметры.АдресВременногоХранилища)); + + // удаляем переданную таблицу из временного хранилища + УдалитьИзВременногоХранилища(Параметры.АдресВременногоХранилища); + + // устанавливаем видимость и заголовки полей таблицы выбора + УстановитьВидимостьПолейТаблицы("ТаблицаВыбора", Параметры.МаксимальноеКоличествоПользовательскихПолей, Параметры.СписокИспользуемыхПолей); + + // позиционируем курсор таблицы выбора + ПозиционированиеКурсораТаблицыВыбора(Параметры.НомерПоПорядкуСтрокиНачала); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура Выбрать(Команда) + + ТекущиеДанные = Элементы.ТаблицаВыбора.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ЭтаФорма.Закрыть(ТекущиеДанные.НомерПоПорядку); + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаВыбораВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Выбрать(Неопределено); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// + +// ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ПозиционированиеКурсораТаблицыВыбора(Знач НомерПоПорядкуСтрокиНачала) + + ИндексСтроки = 0; + + Пока (ИндексСтроки <= ТаблицаВыбора.Количество() - 1) + И (ТаблицаВыбора[ИндексСтроки]["НомерПоПорядку"] < НомерПоПорядкуСтрокиНачала) Цикл + + ИндексСтроки = ИндексСтроки + 1; + + КонецЦикла; + + Если ИндексСтроки <= ТаблицаВыбора.Количество() - 1 Тогда + + Элементы.ТаблицаВыбора.ТекущаяСтрока = ТаблицаВыбора[ИндексСтроки].ПолучитьИдентификатор(); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьВидимостьПолейТаблицы(ИмяТаблицыФормы, МаксимальноеКоличествоПользовательскихПолей, СписокИспользуемыхПолей) + + ИмяПоляИсточника = СтрЗаменить("#ИмяТаблицыФормы#ПолеСортировкиNN","#ИмяТаблицыФормы#", ИмяТаблицыФормы); + ИмяПоляПриемника = СтрЗаменить("#ИмяТаблицыФормы#ПолеСортировкиNN","#ИмяТаблицыФормы#", ИмяТаблицыФормы); + + // снимаем видимость всех полей таблицы сопоставления + Для НомерПоля = 1 По МаксимальноеКоличествоПользовательскихПолей Цикл + + ПолеИсточника = СтрЗаменить(ИмяПоляИсточника, "NN", Строка(НомерПоля)); + ПолеПриемника = СтрЗаменить(ИмяПоляПриемника, "NN", Строка(НомерПоля)); + + ЭтаФорма.Элементы[ПолеИсточника].Видимость = Ложь; + ЭтаФорма.Элементы[ПолеПриемника].Видимость = Ложь; + + КонецЦикла; + + // устанавливаем видимость полей таблицы сопоставления выбранных пользователем + Для Каждого Элемент ИЗ СписокИспользуемыхПолей Цикл + + НомерПоля = СписокИспользуемыхПолей.Индекс(Элемент) + 1; + + ПолеИсточника = СтрЗаменить(ИмяПоляИсточника, "NN", Строка(НомерПоля)); + ПолеПриемника = СтрЗаменить(ИмяПоляПриемника, "NN", Строка(НомерПоля)); + + // устанавливаем видимость полей + ЭтаФорма.Элементы[ПолеИсточника].Видимость = Элемент.Пометка; + ЭтаФорма.Элементы[ПолеПриемника].Видимость = Элемент.Пометка; + + // устанавливаем заголовки полей + ЭтаФорма.Элементы[ПолеИсточника].Заголовок = Элемент.Значение; + ЭтаФорма.Элементы[ПолеПриемника].Заголовок = Элемент.Значение; + + КонецЦикла; + +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ManagerModule.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ObjectModule.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ObjectModule.bsl new file mode 100644 index 000000000..815de3d5d --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ObjectModule.bsl @@ -0,0 +1,1379 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ МОДУЛЯ + +Перем ПолеТаблицаСопоставления; +Перем ПолеИнформацияСтатистикиСопоставленияОбъектов; +Перем ПолеДайджестСопоставления; +Перем ПолеТипСтрокаНеограниченнойДлины; + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Выполняет сопоставление объектов этой информационной базы и информационной базы источника. +// Формирует таблицу сопоставления для вывода пользователю. +// Выявляет следующие типы связей объектов: +// - объекты, сопоставленные по ссылке (жесткая связь) +// - объекты, сопоставленные по информации в регистре сведений СоответствиеОбъектовИнформационныхБаз (нежесткая связь) +// - объекты, сопоставленные по неутвержденным связям – связям незаписанным в информационную базу (текущие изменения) +// - несопоставленные объекты источника +// - несопоставленные объекты приемника (этой базы) +// +// Параметры: +// Отказ – Булево – флаг отказа; поднимается в случае возникновения ошибок при работе процедуры +// +Процедура ВыполнитьСопоставлениеОбъектов(Отказ) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + // выполняем сопоставление объектов информационных баз + ВыполнитьСопоставлениеОбъектовИнформационныхБаз(Отказ); + +КонецПроцедуры + +// Выполняет автоматическое сопоставление объектов по заданным пользователем полям сопоставления (полям поиска). +// Сравнение полей сопоставления выполняется на строгое равенство. +// Формирует таблицу автоматического сопоставления для вывода пользователю. +// +// Параметры: +// Отказ – Булево – флаг отказа; поднимается в случае возникновения ошибок при работе процедуры +// СписокПолейСопоставления – СписокЗначений – список значений с полями, +// по которым необходимо выполнить сопоставление объектов +// +Процедура ВыполнитьАвтоматическоеСопоставлениеОбъектов(Отказ, СписокПолейСопоставления) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ВыполнитьАвтоматическоеСопоставлениеОбъектовИнформационныхБаз(Отказ, СписокПолейСопоставления); + +КонецПроцедуры + +// Выполняет автоматическое сопоставление по заданным по умолчанию полям поиска +// Список полей сопоставления равен списку используемых полей +// +// Параметры: +// Отказ - Булево - флаг отказа от обработки; поднимается в случае возникновения ошибки +// +Процедура ВыполнитьАвтоматическоеСопоставлениеПоУмолчанию(Отказ) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + // При автоматическом сопоставлении по умолчанию + // список полей сопоставления равен списку используемых полей + СписокПолейСопоставления = СписокИспользуемыхПолей.Скопировать(); + + ВыполнитьАвтоматическоеСопоставлениеОбъектовИнформационныхБазПоУмолчанию(Отказ, СписокПолейСопоставления); + + // применяем результат автоматического сопоставления + ПрименитьТаблицуНеутвержденныхЗаписей(Отказ); + +КонецПроцедуры + +// Выполняет запись неутвержденных связей сопоставления (текущих изменений) в информационную базу. +// Записи хранятся в РС СоответствиеОбъектовИнформационныхБаз. +// +// Параметры: +// Отказ - Булево - флаг отказа от обработки; поднимается в случае возникновения ошибки +// +Процедура ПрименитьТаблицуНеутвержденныхЗаписей(Отказ) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + НачатьТранзакцию(); + + Попытка + + Для Каждого СтрокаТаблицы ИЗ ТаблицаНеутвержденныхСвязей Цикл + + СтруктураЗаписи = Новый Структура("УникальныйИдентификаторИсточника, УникальныйИдентификаторПриемника, ТипИсточника, ТипПриемника"); + + СтруктураЗаписи.Вставить("УзелИнформационнойБазы", УзелИнформационнойБазы); + + ЗаполнитьЗначенияСвойств(СтруктураЗаписи, СтрокаТаблицы); + + РегистрыСведений.СоответствиеОбъектовИнформационныхБаз.ДобавитьЗапись(СтруктураЗаписи); + + КонецЦикла; + + Исключение + + Отказ = Истина; + ОтменитьТранзакцию(); + Возврат; + + КонецПопытки; + + ЗафиксироватьТранзакцию(); + + ТаблицаНеутвержденныхСвязей.Очистить(); + +КонецПроцедуры + +// Получает информацию статистики сопоставления объектов. +// Инициализируется свойство ДайджестСопоставления() +// +// Параметры: +// Отказ - Булево - флаг отказа от обработки; поднимается в случае возникновения ошибки +// +Процедура ПолучитьИнформациюДайджестаСопоставленияОбъектов(Отказ) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ТаблицаИсточника = ПолучитьТаблицуИнформационнойБазыИсточника(Отказ); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + // указываем пустой массив пользовательских полей, т.к. выборку полей производить нет необходимости + ПользовательскиеПоля = Новый Массив; + + МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + // получаем таблицы сопоставления объектов (сопоставленные, несопоставленные) + ПолучитьТаблицыСопоставленияОбъектов(ТаблицаИсточника, ПользовательскиеПоля, МенеджерВременныхТаблиц); + + // получаем информацию дайджеста сопоставления объектов + ПолучитьДайджестСопоставления(МенеджерВременныхТаблиц); + +КонецПроцедуры + +// Выполняет загрузку данных из файла сообщения обмена в Информационную Базу только заданных типов объектов +// +// Параметры: +// Отказ - Булево - флаг отказа от обработки; поднимается в случае возникновения ошибки +// ТаблицыДляЗагрузки - Массив - массив типов, которые необходимо загрузить из сообщения обмена; элемент массива - Строка +// +Процедура ВыполнитьЗагрузкуДанныхВИнформационнуюБазу(Отказ, ТаблицыДляЗагрузки) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ДанныеУспешноЗагружены = Ложь; + + ОбработкаОбменаДанными = ОбменДаннымиПовтИсп.ОбработкаОбменаДляЗагрузкиДанных(Отказ, УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + ОбработкаОбменаДанными.ВыполнитьЗагрузкуДанныхВИнформационнуюБазу(ТаблицыДляЗагрузки); + + Если ОбработкаОбменаДанными.ФлагОшибки() Тогда + НСтрока = НСтр("ru = 'При загрузке сообщения обмена возникли ошибки. [СтрокаСообщенияОбОшибке]'"); + НСтрока = СтрЗаменить(НСтрока, "[СтрокаСообщенияОбОшибке]", ОбработкаОбменаДанными.СтрокаСообщенияОбОшибке()); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,,, Отказ); + Возврат; + КонецЕсли; + + ДанныеУспешноЗагружены = Не ОбработкаОбменаДанными.ФлагОшибки(); + +КонецПроцедуры + +// + +// Конструктор обработки +// +// Параметры: +// Нет. +// +Процедура Конструктор() Экспорт + + // заполняем список полей таблицы; из этих полей можно выбирать поля для сопоставления и отображения (поля поиска) + СписокПолейТаблицы.ЗагрузитьЗначения(СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПоляТаблицыПриемника)); + + МассивПолейПоиска = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПоляПоискаТаблицыПриемника); + + // отмечаем в списке СписокПолейТаблицы поля поиска + Для Каждого Элемент ИЗ СписокПолейТаблицы Цикл + + Если МассивПолейПоиска.Найти(Элемент.Значение) <> Неопределено Тогда + + Элемент.Пометка = Истина; + + КонецЕсли; + + КонецЦикла; + + ЗаполнитьСписокДополнительнымиПараметрами(СписокПолейТаблицы); + + // формируем СписокИспользуемыхПолей из отмеченных элементов списка СписокПолейТаблицы + ЗаполнитьСписокОтмеченнымиЭлементами(СписокПолейТаблицы, СписокИспользуемыхПолей); + + // формируем Таблицу сортировки + ЗаполнитьТаблицуСортировки(СписокИспользуемыхПолей); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ СВОЙСТВА + +// Функция-свойство: таблица сопоставления объектов +// +// Тип: ТаблицаЗначений +// +Функция ТаблицаСопоставления() Экспорт + + Если ТипЗнч(ПолеТаблицаСопоставления) <> Тип("ТаблицаЗначений") Тогда + + ПолеТаблицаСопоставления = Новый ТаблицаЗначений; + + КонецЕсли; + + Возврат ПолеТаблицаСопоставления; + +КонецФункции + +// ДАЙДЖЕСТ СОПОСТАВЛЕНИЯ + +// Функция-свойство: количество объектов текущего типа данных в файле сообщения обмена +// +// Тип: Число +// +Функция КоличествоОбъектовВИсточнике() Экспорт + + Возврат ДайджестСопоставления().КоличествоОбъектовВИсточнике; + +КонецФункции + +// Функция-свойство: количество объектов текущего типа данных в этой информационной базе +// +// Тип: Число +// +Функция КоличествоОбъектовВПриемнике() Экспорт + + Возврат ДайджестСопоставления().КоличествоОбъектовВПриемнике; + +КонецФункции + +// Функция-свойство: количество объектов, которые сопоставлены для текущего типа данных +// +// Тип: Число +// +Функция КоличествоОбъектовСопоставленных() Экспорт + + Возврат ДайджестСопоставления().КоличествоОбъектовСопоставленных; + +КонецФункции + +// Функция-свойство: количество объектов, которые не сопоставлены для текущего типа данных +// +// Тип: Число +// +Функция КоличествоОбъектовНесопоставленных() Экспорт + + Возврат ДайджестСопоставления().КоличествоОбъектовНесопоставленных; + +КонецФункции + +// Функция-свойство: процент сопоставления объектов для текущего типа данных +// +// Тип: Число +// +Функция ПроцентСопоставленияОбъектов() Экспорт + + Возврат ДайджестСопоставления().ПроцентСопоставленияОбъектов; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ВНУТРЕННИЕ СВОЙСТВА + +Функция ДайджестСопоставления() + + Если ТипЗнч(ПолеДайджестСопоставления) <> Тип("Структура") Тогда + + // инициализация структуры дайджеста сопоставления объектов + ПолеДайджестСопоставления = Новый Структура; + ПолеДайджестСопоставления.Вставить("КоличествоОбъектовВИсточнике", 0); + ПолеДайджестСопоставления.Вставить("КоличествоОбъектовВПриемнике", 0); + ПолеДайджестСопоставления.Вставить("КоличествоОбъектовСопоставленных", 0); + ПолеДайджестСопоставления.Вставить("КоличествоОбъектовНесопоставленных", 0); + ПолеДайджестСопоставления.Вставить("ПроцентСопоставленияОбъектов", 0); + + КонецЕсли; + + Возврат ПолеДайджестСопоставления; + +КонецФункции + +Функция ИнформацияСтатистикиСопоставленияОбъектов() + + Если ТипЗнч(ПолеИнформацияСтатистикиСопоставленияОбъектов) <> Тип("Структура") Тогда + + // инициализация структуры информации статистики + ПолеИнформацияСтатистикиСопоставленияОбъектов = Новый Структура; + ПолеИнформацияСтатистикиСопоставленияОбъектов.Вставить("КоличествоОбъектовСопоставленныхПоСсылке", 0); + ПолеИнформацияСтатистикиСопоставленияОбъектов.Вставить("КоличествоОбъектовСопоставленныхПоРегистру", 0); + ПолеИнформацияСтатистикиСопоставленияОбъектов.Вставить("КоличествоОбъектовСопоставленныхПоНеутвержденнымСвязям", 0); + + КонецЕсли; + + Возврат ПолеИнформацияСтатистикиСопоставленияОбъектов; + +КонецФункции + +Функция ТипСтрокаНеограниченнойДлины() + + Если ТипЗнч(ПолеТипСтрокаНеограниченнойДлины) <> Тип("ОписаниеТипов") Тогда + + ПолеТипСтрокаНеограниченнойДлины = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(0)); + + КонецЕсли; + + Возврат ПолеТипСтрокаНеограниченнойДлины; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ПОЛУЧЕНИЯ ТАБЛИЦЫ СОПОСТАВЛЕНИЯ + +Процедура ВыполнитьСопоставлениеОбъектовИнформационныхБаз(Отказ) + + ТаблицаИсточника = ПолучитьТаблицуИнформационнойБазыИсточника(Отказ); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + // получаем массив полей, которые выбрал пользователь + ПользовательскиеПоля = СписокИспользуемыхПолей.ВыгрузитьЗначения(); + + МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + // получаем таблицы сопоставления объектов (сопоставленные, несопоставленные) + ПолучитьТаблицыСопоставленияОбъектов(ТаблицаИсточника, ПользовательскиеПоля, МенеджерВременныхТаблиц); + + // получаем информацию дайджеста сопоставления объектов + ПолучитьДайджестСопоставления(МенеджерВременныхТаблиц); + + // получаем таблицу сопоставления + ПолеТаблицаСопоставления = ПолучитьТаблицуСопоставления(ТаблицаИсточника, ПользовательскиеПоля, МенеджерВременныхТаблиц); + + // сортируем таблицу + ВыполнитьСортировкуТаблицыНаСервере(); + + // добавляем поле НомерПоПорядку и заполняем его + ДобавитьПолеНомераВТаблицуСопоставления(); + +КонецПроцедуры + +Процедура ВыполнитьАвтоматическоеСопоставлениеОбъектовИнформационныхБаз(Отказ, СписокПолейСопоставления) + + ТаблицаИсточника = ПолучитьТаблицуИнформационнойБазыИсточника(Отказ); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + // используем все поля таблицы источника + ПользовательскиеПоля = СписокПолейТаблицы.ВыгрузитьЗначения(); + + МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + // получаем таблицы сопоставления объектов (сопоставленные, несопоставленные) + ПолучитьТаблицыСопоставленияОбъектов(ТаблицаИсточника, ПользовательскиеПоля, МенеджерВременныхТаблиц); + + // получаем таблицу автоматического сопоставления + ПолучитьТаблицуАвтоматическогоСопоставления(ТаблицаИсточника, СписокПолейСопоставления, ПользовательскиеПоля, МенеджерВременныхТаблиц); + + // загружаем таблицу автоматически сопоставленных объектов в реквизит формы + ТаблицаАвтоматическиСопоставленныхОбъектов.Загрузить(ТаблицаАвтоматическиСопоставленныхОбъектовПолучить(МенеджерВременныхТаблиц, ПользовательскиеПоля)); + +КонецПроцедуры + +Процедура ВыполнитьАвтоматическоеСопоставлениеОбъектовИнформационныхБазПоУмолчанию(Отказ, СписокПолейСопоставления) + + ТаблицаИсточника = ПолучитьТаблицуИнформационнойБазыИсточника(Отказ); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + // получаем массив полей, которые выбрал пользователь + ПользовательскиеПоля = СписокИспользуемыхПолей.ВыгрузитьЗначения(); + + МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + // получаем таблицы сопоставления объектов (сопоставленные, несопоставленные) + ПолучитьТаблицыСопоставленияОбъектов(ТаблицаИсточника, ПользовательскиеПоля, МенеджерВременныхТаблиц); + + Если Истина Тогда + + // получаем таблицу автоматического сопоставления + ПолучитьТаблицуАвтоматическогоСопоставления(ТаблицаИсточника, СписокПолейСопоставления, ПользовательскиеПоля, МенеджерВременныхТаблиц); + + Иначе + + КонецЕсли; + + // загружаем обновленную таблицу неутвержденных связей в реквизит объекта + ТаблицаНеутвержденныхСвязей.Загрузить(ОбъединитьТаблицыНеутвержденныхСвязейИАвтоматическогоСопоставления(МенеджерВременныхТаблиц)); + +КонецПроцедуры + +Процедура ПолучитьТаблицыСопоставленияОбъектов(ТаблицаИсточника, ПользовательскиеПоля, МенеджерВременныхТаблиц) + + // получаем таблицы: + // + // ТаблицаИсточника + // ТаблицаНеутвержденныхСвязей + // ТаблицаРегистраСоответствияОбъектовИнформационныхБаз + // + // ТаблицаСопоставленныхОбъектовПоСсылке + // ТаблицаСопоставленныхОбъектовПоРегистру + // ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям + // + // ТаблицаСопоставленныхОбъектов + // + // ТаблицаНеСопоставленныхОбъектовИсточника + // ТаблицаНеСопоставленныхОбъектовПриемника + // + // + + ТекстЗапроса = " + |//////////////////////////////////////////////////////////////////////////////// {ТаблицаИсточника} + |ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаИсточника# + | + | ТаблицаИсточникаПараметр.Ссылка КАК Ссылка, + | ТаблицаИсточникаПараметр.УникальныйИдентификатор КАК УникальныйИдентификатор + | + |ПОМЕСТИТЬ ТаблицаИсточника + |ИЗ + | &ТаблицаИсточникаПараметр КАК ТаблицаИсточникаПараметр + |ИНДЕКСИРОВАТЬ ПО + | Ссылка, + | УникальныйИдентификатор + |; + | + |//////////////////////////////////////////////////////////////////////////////// {ТаблицаРегистраСоответствияОбъектовИнформационныхБаз} + |ВЫБРАТЬ + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипПриемника + |ПОМЕСТИТЬ ТаблицаРегистраСоответствияОбъектовИнформационныхБаз + |ИЗ + | РегистрСведений.СоответствиеОбъектовИнформационныхБаз КАК СоответствиеОбъектовИнформационныхБаз + |ГДЕ + | СоответствиеОбъектовИнформационныхБаз.УзелИнформационнойБазы = &УзелИнформационнойБазы + |ИНДЕКСИРОВАТЬ ПО + | УникальныйИдентификаторПриемника, + | ТипПриемника + |; + | + |//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеутвержденныхСвязей} + |ВЫБРАТЬ + | + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипПриемника, + | ТипИсточника + | + |ПОМЕСТИТЬ ТаблицаНеутвержденныхСвязей + |ИЗ + | &ТаблицаНеутвержденныхСвязей КАК ТаблицаНеутвержденныхСвязей + |ИНДЕКСИРОВАТЬ ПО + | УникальныйИдентификаторПриемника, + | ТипПриемника + |; + | + |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовПоСсылке} + |ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | #ПОЛЕ_СОРТИРОВКИ_Приемник# + | + | Ссылка, + | 2 КАК СтатусСопоставления, // сопоставленные по ссылке объекты (2) + | 0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0) + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовПоСсылке + |ИЗ + | (ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоСсылке_ВложенныйЗапрос# + | + | ТаблицаИсточника.Ссылка КАК Ссылка, + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | ТаблицаИсточника.Ссылка КАК УникальныйИдентификаторПриемника, + | ТаблицаИсточника.УникальныйИдентификатор КАК УникальныйИдентификаторИсточника, + | &ТипИсточника КАК ТипИсточника, + | &ТипПриемника КАК ТипПриемника + | ИЗ + | ТаблицаИсточника КАК ТаблицаИсточника + | ЛЕВОЕ СОЕДИНЕНИЕ + | #ТаблицаПриемника КАК ТаблицаПриемника + | ПО + | ТаблицаИсточника.Ссылка = ТаблицаПриемника.Ссылка + | ГДЕ + | НЕ ТаблицаПриемника.Ссылка ЕСТЬ NULL + | ) КАК ВложенныйЗапрос + |; + | + |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовПоРегистру} + |ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | #ПОЛЕ_СОРТИРОВКИ_Приемник# + | + | Ссылка, + | 0 КАК СтатусСопоставления, // сопоставленные объекты (0) + | 0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0) + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовПоРегистру + |ИЗ + | (ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоРегистру_ВложенныйЗапрос# + | + | СоответствиеОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК Ссылка, + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | СоответствиеОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника, + | ТаблицаИсточника.УникальныйИдентификатор КАК УникальныйИдентификаторИсточника, + | &ТипИсточника КАК ТипИсточника, + | &ТипПриемника КАК ТипПриемника + | ИЗ + | ТаблицаИсточника КАК ТаблицаИсточника + | ЛЕВОЕ СОЕДИНЕНИЕ + | ТаблицаРегистраСоответствияОбъектовИнформационныхБаз КАК СоответствиеОбъектовИнформационныхБаз + | ПО + | СоответствиеОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника = ТаблицаИсточника.УникальныйИдентификатор + | ГДЕ + | НЕ СоответствиеОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника ЕСТЬ NULL + | И СоответствиеОбъектовИнформационныхБаз.ТипПриемника = &ТипИсточника + | ) КАК ВложенныйЗапрос + |; + | + |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям} + |ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | #ПОЛЕ_СОРТИРОВКИ_Приемник# + | + | Ссылка, + | 3 КАК СтатусСопоставления, // неутвержденные связи (3) + | 0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0) + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям + |ИЗ + | (ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям_ВложенныйЗапрос# + | + | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК Ссылка, + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника, + | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника, + | ТаблицаНеутвержденныхСвязей.ТипПриемника КАК ТипИсточника, + | ТаблицаНеутвержденныхСвязей.ТипИсточника КАК ТипПриемника + | ИЗ + | ТаблицаИсточника КАК ТаблицаИсточника + | ЛЕВОЕ СОЕДИНЕНИЕ + | ТаблицаНеутвержденныхСвязей КАК ТаблицаНеутвержденныхСвязей + | ПО + | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторПриемника = ТаблицаИсточника.УникальныйИдентификатор + | + | ГДЕ + | НЕ ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника ЕСТЬ NULL + | И ТаблицаНеутвержденныхСвязей.ТипПриемника = &ТипИсточника + | ) КАК ВложенныйЗапрос + |; + | + |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектов} + |ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | #ПОЛЯ_СОРТИРОВКИ# + | + | Ссылка, + | СтатусСопоставления, + | СтатусСопоставленияДополнительный, + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектов + |ИЗ + | ( + | ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | #ПОЛЯ_СОРТИРОВКИ# + | + | Ссылка, + | СтатусСопоставления, + | СтатусСопоставленияДополнительный, + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + | ИЗ + | ТаблицаСопоставленныхОбъектовПоСсылке + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | #ПОЛЯ_СОРТИРОВКИ# + | + | Ссылка, + | СтатусСопоставления, + | СтатусСопоставленияДополнительный, + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + | ИЗ + | ТаблицаСопоставленныхОбъектовПоРегистру + | + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | #ПОЛЯ_СОРТИРОВКИ# + | + | Ссылка, + | СтатусСопоставления, + | СтатусСопоставленияДополнительный, + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + | ИЗ + | ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям + | + | ) КАК ВложенныйЗапрос + | + |ИНДЕКСИРОВАТЬ ПО + | Ссылка + |; + | + |//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеСопоставленныхОбъектовИсточника} + |ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | #ПОЛЕ_СОРТИРОВКИ_Источник# + | + | -1 КАК СтатусСопоставления, // несопоставленные объекты источника (-1) + | 1 КАК СтатусСопоставленияДополнительный, // несопоставленные объекты (1) + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + |ПОМЕСТИТЬ ТаблицаНеСопоставленныхОбъектовИсточника + |ИЗ + | (ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовИсточника_ВложенныйЗапрос# + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | NULL КАК УникальныйИдентификаторПриемника, + | ТаблицаИсточника.УникальныйИдентификатор КАК УникальныйИдентификаторИсточника, + | &ТипИсточника КАК ТипИсточника, + | &ТипПриемника КАК ТипПриемника + | ИЗ + | ТаблицаИсточника КАК ТаблицаИсточника + | ЛЕВОЕ СОЕДИНЕНИЕ + | ТаблицаСопоставленныхОбъектов КАК ТаблицаСопоставленныхОбъектов + | ПО + | ТаблицаИсточника.Ссылка = ТаблицаСопоставленныхОбъектов.Ссылка + | ИЛИ ТаблицаИсточника.УникальныйИдентификатор = ТаблицаСопоставленныхОбъектов.УникальныйИдентификаторИсточника + | ГДЕ + | ТаблицаСопоставленныхОбъектов.Ссылка ЕСТЬ NULL + | ) КАК ВложенныйЗапрос + |; + | + |//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеСопоставленныхОбъектовПриемника} + |ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | #ПОЛЕ_СОРТИРОВКИ_Приемник# + | + | 1 КАК СтатусСопоставления, // несопоставленные объекты приемника (1) + | 1 КАК СтатусСопоставленияДополнительный, // несопоставленные объекты (1) + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + |ПОМЕСТИТЬ ТаблицаНеСопоставленныхОбъектовПриемника + |ИЗ + | (ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовПриемника_ВложенныйЗапрос# + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | ТаблицаПриемника.Ссылка КАК УникальныйИдентификаторПриемника, + | Неопределено КАК УникальныйИдентификаторИсточника, + | Неопределено КАК ТипИсточника, + | &ТипПриемника КАК ТипПриемника + | ИЗ + | #ТаблицаПриемника КАК ТаблицаПриемника + | ЛЕВОЕ СОЕДИНЕНИЕ + | ТаблицаСопоставленныхОбъектов КАК ТаблицаСопоставленныхОбъектов + | ПО + | ТаблицаПриемника.Ссылка = ТаблицаСопоставленныхОбъектов.Ссылка + | ГДЕ + | ТаблицаСопоставленныхОбъектов.Ссылка ЕСТЬ NULL + | ) КАК ВложенныйЗапрос + |; + | + |"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаИсточника#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаИсточникаПараметр.# КАК #,")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ИсточникПолеNN, ПриемникПолеNN,")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоСсылке_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаПриемника.# КАК ПриемникПолеNN, ТаблицаИсточника.# КАК ИсточникПолеNN,")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоРегистру_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "СоответствиеОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника.# КАК ПриемникПолеNN, ТаблицаИсточника.# КАК ИсточникПолеNN,")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника.# КАК ПриемникПолеNN, ТаблицаИсточника.# КАК ИсточникПолеNN,")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовИсточника_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаИсточника.# КАК ИсточникПолеNN, NULL КАК ПриемникПолеNN,")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовПриемника_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "NULL КАК ИсточникПолеNN, ТаблицаПриемника.Ссылка.# КАК ПриемникПолеNN,")); + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЕ_СОРТИРОВКИ_Источник#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ИсточникПолеNN КАК ПолеСортировкиNN,")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЕ_СОРТИРОВКИ_Приемник#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ПриемникПолеNN КАК ПолеСортировкиNN,")); + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЯ_СОРТИРОВКИ#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ПолеСортировкиNN,")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаПриемника", ИмяТаблицыПриемника); + + Запрос = Новый Запрос; + + Запрос.Текст = ТекстЗапроса; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + + Запрос.УстановитьПараметр("ТаблицаИсточникаПараметр", ТаблицаИсточника); + Запрос.УстановитьПараметр("ТаблицаНеутвержденныхСвязей", ТаблицаНеутвержденныхСвязей.Выгрузить()); + Запрос.УстановитьПараметр("ТипИсточника", ТипИсточникаСтрокой); + Запрос.УстановитьПараметр("ТипПриемника", ТипПриемникаСтрокой); + Запрос.УстановитьПараметр("УзелИнформационнойБазы", УзелИнформационнойБазы); + + Запрос.Выполнить(); + +КонецПроцедуры + +Процедура ПолучитьТаблицуАвтоматическогоСопоставления(ТаблицаИсточника, СписокПолейСопоставления, ПользовательскиеПоля, МенеджерВременныхТаблиц) + + // получаем таблицы: + // + // ТаблицаАвтоматическиСопоставленныхОбъектовПолная + // ТаблицаНеправильноСопоставленныхОбъектовИсточника + // ТаблицаНеправильноСопоставленныхОбъектовПриемника + // + // ТаблицаАвтоматическиСопоставленныхОбъектов + + ТекстЗапроса = " + |//////////////////////////////////////////////////////////////////////////////// {ТаблицаАвтоматическиСопоставленныхОбъектовПолная} // содержит повторяющиеся записи для источника и приемника + |ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + |ПОМЕСТИТЬ ТаблицаАвтоматическиСопоставленныхОбъектовПолная + |ИЗ + | (ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаАвтоматическиСопоставленныхОбъектовПолная_ВложенныйЗапрос# + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | ТаблицаНеСопоставленныхОбъектовИсточника.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторИсточника, + | ТаблицаНеСопоставленныхОбъектовИсточника.ТипИсточника КАК ТипИсточника, + | ТаблицаНеСопоставленныхОбъектовПриемника.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторПриемника, + | ТаблицаНеСопоставленныхОбъектовПриемника.ТипПриемника КАК ТипПриемника + | ИЗ + | ТаблицаНеСопоставленныхОбъектовПриемника КАК ТаблицаНеСопоставленныхОбъектовПриемника + | ЛЕВОЕ СОЕДИНЕНИЕ + | ТаблицаНеСопоставленныхОбъектовИсточника КАК ТаблицаНеСопоставленныхОбъектовИсточника + | ПО + | + | #УСЛОВИЕ_СОПОСТАВЛЕНИЯ_ПО_ПОЛЯМ# + | + | ГДЕ + | НЕ ТаблицаНеСопоставленныхОбъектовИсточника.УникальныйИдентификаторИсточника ЕСТЬ NULL + | + | ) КАК ВложенныйЗапрос + |; + | + |//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеправильноСопоставленныхОбъектовИсточника} + |ВЫБРАТЬ + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника + | + |ПОМЕСТИТЬ ТаблицаНеправильноСопоставленныхОбъектовИсточника + |ИЗ + | (ВЫБРАТЬ + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника + | ИЗ + | ТаблицаАвтоматическиСопоставленныхОбъектовПолная + | СГРУППИРОВАТЬ ПО + | УникальныйИдентификаторИсточника + | ИМЕЮЩИЕ + | СУММА(1) > 1 + | + | ) КАК ВложенныйЗапрос + |; + | + | + |//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеправильноСопоставленныхОбъектовПриемника} + |ВЫБРАТЬ + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторПриемника + | + |ПОМЕСТИТЬ ТаблицаНеправильноСопоставленныхОбъектовПриемника + |ИЗ + | (ВЫБРАТЬ + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторПриемника + | ИЗ + | ТаблицаАвтоматическиСопоставленныхОбъектовПолная + | СГРУППИРОВАТЬ ПО + | УникальныйИдентификаторПриемника + | ИМЕЮЩИЕ + | СУММА(1) > 1 + | + | ) КАК ВложенныйЗапрос + |; + | + |//////////////////////////////////////////////////////////////////////////////// {ТаблицаАвтоматическиСопоставленныхОбъектов} + |ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + |ПОМЕСТИТЬ ТаблицаАвтоматическиСопоставленныхОбъектов + |ИЗ + | (ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | ТаблицаАвтоматическиСопоставленныхОбъектовПолная.УникальныйИдентификаторИсточника, + | ТаблицаАвтоматическиСопоставленныхОбъектовПолная.УникальныйИдентификаторПриемника, + | ТаблицаАвтоматическиСопоставленныхОбъектовПолная.ТипИсточника, + | ТаблицаАвтоматическиСопоставленныхОбъектовПолная.ТипПриемника + | ИЗ + | ТаблицаАвтоматическиСопоставленныхОбъектовПолная КАК ТаблицаАвтоматическиСопоставленныхОбъектовПолная + | + | ЛЕВОЕ СОЕДИНЕНИЕ + | ТаблицаНеправильноСопоставленныхОбъектовИсточника КАК ТаблицаНеправильноСопоставленныхОбъектовИсточника + | ПО + | ТаблицаАвтоматическиСопоставленныхОбъектовПолная.УникальныйИдентификаторИсточника = ТаблицаНеправильноСопоставленныхОбъектовИсточника.УникальныйИдентификаторИсточника + | + | ЛЕВОЕ СОЕДИНЕНИЕ + | ТаблицаНеправильноСопоставленныхОбъектовПриемника КАК ТаблицаНеправильноСопоставленныхОбъектовПриемника + | ПО + | ТаблицаАвтоматическиСопоставленныхОбъектовПолная.УникальныйИдентификаторПриемника = ТаблицаНеправильноСопоставленныхОбъектовПриемника.УникальныйИдентификаторПриемника + | + | ГДЕ + | ТаблицаНеправильноСопоставленныхОбъектовИсточника.УникальныйИдентификаторИсточника ЕСТЬ NULL + | И ТаблицаНеправильноСопоставленныхОбъектовПриемника.УникальныйИдентификаторПриемника ЕСТЬ NULL + | + | ) КАК ВложенныйЗапрос + |; + | + |"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#УСЛОВИЕ_СОПОСТАВЛЕНИЯ_ПО_ПОЛЯМ#", ПолучитьУсловиеСопоставленияПоПолям(СписокПолейСопоставления)); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ИсточникПолеNN, ПриемникПолеNN,")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаАвтоматическиСопоставленныхОбъектовПолная_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаНеСопоставленныхОбъектовИсточника.ИсточникПолеNN КАК ИсточникПолеNN, ТаблицаНеСопоставленныхОбъектовПриемника.ПриемникПолеNN КАК ПриемникПолеNN,")); + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + + Запрос.Выполнить(); + +КонецПроцедуры + +Процедура ВыполнитьСортировкуТаблицыНаСервере() + + ПоляСортировки = ПолучитьПоляСортировкиНаСервере(); + + Если Не ПустаяСтрока(ПоляСортировки) Тогда + + ТаблицаСопоставления().Сортировать(ПоляСортировки); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПолучитьДайджестСопоставления(МенеджерВременныхТаблиц) + + // получаем информацию количества сопоставленных объектов + ПолучитьКоличествоСопоставленныхОбъектов(МенеджерВременныхТаблиц); + + ДайджестСопоставления().КоличествоОбъектовВИсточнике = ОбменДаннымиСервер.КоличествоЗаписейВоВременнойТаблицеБазыДанных("ТаблицаИсточника", МенеджерВременныхТаблиц); + ДайджестСопоставления().КоличествоОбъектовВПриемнике = ОбменДаннымиСервер.КоличествоЗаписейВТаблицеБазыДанных(ИмяТаблицыПриемника); + + ДайджестСопоставления().КоличествоОбъектовСопоставленных = ИнформацияСтатистикиСопоставленияОбъектов().КоличествоОбъектовСопоставленныхПоСсылке + + ИнформацияСтатистикиСопоставленияОбъектов().КоличествоОбъектовСопоставленныхПоРегистру + + ИнформацияСтатистикиСопоставленияОбъектов().КоличествоОбъектовСопоставленныхПоНеутвержденнымСвязям; + // + + ДайджестСопоставления().КоличествоОбъектовНесопоставленных = Мин(ДайджестСопоставления().КоличествоОбъектовВИсточнике - ДайджестСопоставления().КоличествоОбъектовСопоставленных, + ДайджестСопоставления().КоличествоОбъектовВПриемнике - ДайджестСопоставления().КоличествоОбъектовСопоставленных); + // + + ДайджестСопоставления().ПроцентСопоставленияОбъектов = ОпределитьПроцентСопоставления(ДайджестСопоставления().КоличествоОбъектовВИсточнике, + ДайджестСопоставления().КоличествоОбъектовВПриемнике, + ДайджестСопоставления().КоличествоОбъектовСопоставленных); + // + +КонецПроцедуры + +Процедура ПолучитьКоличествоСопоставленныхОбъектов(МенеджерВременныхТаблиц) + + // получаем количества сопоставленных объектов + ТекстЗапроса = " + |ВЫБРАТЬ + | Количество(*) КАК Количество + |ИЗ + | ТаблицаСопоставленныхОбъектовПоСсылке + |; + |///////////////////////////////////////////////////////////////////////////// + | + |ВЫБРАТЬ + | Количество(*) КАК Количество + |ИЗ + | ТаблицаСопоставленныхОбъектовПоРегистру + |; + |///////////////////////////////////////////////////////////////////////////// + | + |ВЫБРАТЬ + | Количество(*) КАК Количество + |ИЗ + | ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям + |; + |///////////////////////////////////////////////////////////////////////////// + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + + МассивРезультатов = Запрос.ВыполнитьПакет(); + + ИнформацияСтатистикиСопоставленияОбъектов().КоличествоОбъектовСопоставленныхПоСсылке = МассивРезультатов[0].Выгрузить()[0]["Количество"]; + ИнформацияСтатистикиСопоставленияОбъектов().КоличествоОбъектовСопоставленныхПоРегистру = МассивРезультатов[1].Выгрузить()[0]["Количество"]; + ИнформацияСтатистикиСопоставленияОбъектов().КоличествоОбъектовСопоставленныхПоНеутвержденнымСвязям = МассивРезультатов[2].Выгрузить()[0]["Количество"]; + +КонецПроцедуры + +Процедура ДобавитьПолеНомераВТаблицуСопоставления() + + ТаблицаСопоставления().Колонки.Добавить("НомерПоПорядку", Новый ОписаниеТипов("Число")); + + Для Каждого СтрокаТаблицы ИЗ ТаблицаСопоставления() Цикл + + СтрокаТаблицы.НомерПоПорядку = ТаблицаСопоставления().Индекс(СтрокаТаблицы); + + КонецЦикла; + +КонецПроцедуры + +Функция ОбъединитьТаблицыНеутвержденныхСвязейИАвтоматическогоСопоставления(МенеджерВременныхТаблиц) + + ТекстЗапроса = " + |ВЫБРАТЬ + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + |ИЗ + | ( + | ВЫБРАТЬ + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + | ИЗ + | ТаблицаНеутвержденныхСвязей + | + | ОБЪЕДИНИТЬ + | + | ВЫБРАТЬ + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника, + | УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника, + | ТипПриемника КАК ТипИсточника, + | ТипИсточника КАК ТипПриемника + | ИЗ + | ТаблицаАвтоматическиСопоставленныхОбъектов + | + | ) КАК ВложенныйЗапрос + | + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +Функция ТаблицаАвтоматическиСопоставленныхОбъектовПолучить(МенеджерВременныхТаблиц, ПользовательскиеПоля) + + ТекстЗапроса = " + |ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | Истина КАК Пометка, + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника, + | УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника, + | ТипПриемника КАК ТипИсточника, + | ТипИсточника КАК ТипПриемника + |ИЗ + | ТаблицаАвтоматическиСопоставленныхОбъектов + |"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ИсточникПолеNN, ПриемникПолеNN,")); + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +Функция ПолучитьТаблицуСопоставления(ТаблицаИсточника, ПользовательскиеПоля, МенеджерВременныхТаблиц) + + ТекстЗапроса = " + |//////////////////////////////////////////////////////////////////////////////// + | + |ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | #ПОЛЯ_СОРТИРОВКИ# + | + | СтатусСопоставления, + | СтатусСопоставленияДополнительный, + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + |ИЗ + | ТаблицаНеСопоставленныхОбъектовИсточника + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | #ПОЛЯ_СОРТИРОВКИ# + | + | СтатусСопоставления, + | СтатусСопоставленияДополнительный, + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + |ИЗ + | ТаблицаНеСопоставленныхОбъектовПриемника + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | + | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления# + | + | #ПОЛЯ_СОРТИРОВКИ# + | + | СтатусСопоставления, + | СтатусСопоставленияДополнительный, + | + | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ} + | УникальныйИдентификаторИсточника, + | УникальныйИдентификаторПриемника, + | ТипИсточника, + | ТипПриемника + |ИЗ + | ТаблицаСопоставленныхОбъектов + |"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ИсточникПолеNN, ПриемникПолеNN,")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЯ_СОРТИРОВКИ#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ПолеСортировкиNN,")); + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +Функция ПолучитьТаблицуИнформационнойБазыИсточника(Отказ) + + // возвращаемое значение функции + ТаблицаДанных = Неопределено; + + ОбработкаОбменаДанными = ОбменДаннымиПовтИсп.ОбработкаОбменаДляЗагрузкиДанных(Отказ, УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена); + + Если Отказ Тогда + Возврат Неопределено; + КонецЕсли; + + // таблица данных может быть уже загружена и находиться в кэше обработки ОбработкаОбменаДанными + ТаблицаДанных = ОбработкаОбменаДанными.ТаблицыДанныхСообщенияОбмена().Получить(ИмяТипаОбъектаТаблицыИсточника); + + // если таблица данных не была загружена, то загружаем ее + Если ТаблицаДанных = Неопределено Тогда + + ТаблицыДляЗагрузки = Новый Массив; + ТаблицыДляЗагрузки.Добавить(ИмяТипаОбъектаТаблицыИсточника); + + // ВЫПОЛНЯЕМ ЗАГРУЗКУ ДАННЫХ В РЕЖИМЕ СОПОСТАВЛЕНИЯ (данные зачитываем в таблицу значений) + ОбработкаОбменаДанными.ВыполнитьЗагрузкуДанныхВТаблицуЗначений(ТаблицыДляЗагрузки); + + Если ОбработкаОбменаДанными.ФлагОшибки() Тогда + + НСтрока = НСтр("ru = 'При загрузке сообщения обмена возникли ошибки. [СтрокаСообщенияОбОшибке]'"); + НСтрока = СтрЗаменить(НСтрока, "[СтрокаСообщенияОбОшибке]", ОбработкаОбменаДанными.СтрокаСообщенияОбОшибке()); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,,, Отказ); + + Возврат Неопределено; + КонецЕсли; + + ТаблицаДанных = ОбработкаОбменаДанными.ТаблицыДанныхСообщенияОбмена().Получить(ИмяТипаОбъектаТаблицыИсточника); + + КонецЕсли; + + Если ТаблицаДанных = Неопределено Тогда + + Отказ = Истина; + + КонецЕсли; + + Возврат ТаблицаДанных; +КонецФункции + +Функция ПолучитьПользовательскиеПоля(ПользовательскиеПоля, ШаблонПоля) + + // возвращаемое значение функции + Результат = ""; + + Для Каждого Поле ИЗ ПользовательскиеПоля Цикл + + НомерПоля = ПользовательскиеПоля.Найти(Поле) + 1; + + ТекущееПоле = СтрЗаменить(ШаблонПоля, "#", Поле); + + ТекущееПоле = СтрЗаменить(ТекущееПоле, "NN", Строка(НомерПоля)); + + Результат = Результат + Символы.ПС + ТекущееПоле; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьПоляСортировкиНаСервере() + + // возвращаемое значение функции + ПоляСортировки = ""; + + ШаблонПоля = "ПолеСортировкиNN #НаправлениеСортировки"; + + Для Каждого СтрокаТаблицы ИЗ ТаблицаСортировки Цикл + + Если СтрокаТаблицы.Использование Тогда + + Разделитель = ?(ПустаяСтрока(ПоляСортировки), "", ", "); + + НаправлениеСортировкиСтр = ?(СтрокаТаблицы.НаправлениеСортировки, "Возр", "Убыв"); + + ЭлементСписка = СписокИспользуемыхПолей.НайтиПоЗначению(СтрокаТаблицы.ИмяПоля); + + ИндексПоля = СписокИспользуемыхПолей.Индекс(ЭлементСписка) + 1; + + ИмяПоля = СтрЗаменить(ШаблонПоля, "NN", Строка(ИндексПоля)); + ИмяПоля = СтрЗаменить(ИмяПоля, "#НаправлениеСортировки", НаправлениеСортировкиСтр); + + ПоляСортировки = ПоляСортировки + Разделитель + ИмяПоля; + + КонецЕсли; + + КонецЦикла; + + Возврат ПоляСортировки; + +КонецФункции + +Функция ПолучитьУсловиеСопоставленияПоПолям(СписокПолейСопоставления) + + // возвращаемое значение функции + Результат = ""; + + Для Каждого Элемент ИЗ СписокПолейСопоставления Цикл + + Если Элемент.Пометка Тогда + + Если Элемент.Представление = ОбменДаннымиСервер.СтрокаНеограниченнойДлины() Тогда + + ШаблонПоля = "ПОДСТРОКА(ТаблицаНеСопоставленныхОбъектовПриемника.ПриемникПолеNN, 0, 1024) = ПОДСТРОКА(ТаблицаНеСопоставленныхОбъектовИсточника.ИсточникПолеNN, 0, 1024)"; + + Иначе + + ШаблонПоля = "ТаблицаНеСопоставленныхОбъектовПриемника.ПриемникПолеNN = ТаблицаНеСопоставленныхОбъектовИсточника.ИсточникПолеNN"; + + КонецЕсли; + + НомерПоля = СписокПолейСопоставления.Индекс(Элемент) + 1; + + ТекущееПоле = СтрЗаменить(ШаблонПоля, "NN", Строка(НомерПоля)); + + ЛитералОперации = ?(ПустаяСтрока(Результат), "", "И"); + + Результат = Результат + Символы.ПС + ЛитералОперации + " " + ТекущееПоле; + + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ВСПОМОГАТЕЛЬНЫЕ + +Процедура ЗаполнитьСписокОтмеченнымиЭлементами(СписокИсточник, СписокПриемник) + + СписокПриемник.Очистить(); + + Для Каждого Элемент ИЗ СписокИсточник Цикл + + Если Элемент.Пометка Тогда + + СписокПриемник.Добавить(Элемент.Значение, Элемент.Представление, Истина); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаполнитьТаблицуСортировки(СписокЗначенийИсточник) + + ТаблицаСортировки.Очистить(); + + Для Каждого Элемент ИЗ СписокЗначенийИсточник Цикл + + ЭтоПервоеПоле = СписокЗначенийИсточник.Индекс(Элемент) = 0; + + СтрокаТаблицы = ТаблицаСортировки.Добавить(); + + СтрокаТаблицы.ИмяПоля = Элемент.Значение; + СтрокаТаблицы.Использование = ЭтоПервоеПоле; // по умолчанию сортируем по первому полю + СтрокаТаблицы.НаправлениеСортировки = Истина; // по возрастанию + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаполнитьСписокДополнительнымиПараметрами(СписокПолейТаблицы) + + ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип(ИмяТипаОбъектаТаблицыИсточника)); + + Для каждого Элемент Из СписокПолейТаблицы Цикл + + Реквизит = ОбъектМетаданных.Реквизиты.Найти(Элемент.Значение); + + Если Реквизит = Неопределено + И ОбменДаннымиСервер.ЭтоСтандартныйРеквизит(ОбъектМетаданных.СтандартныеРеквизиты, Элемент.Значение) Тогда + + Реквизит = ОбъектМетаданных.СтандартныеРеквизиты[Элемент.Значение]; + + КонецЕсли; + + Если Реквизит <> Неопределено И ЭтоСтрокаНеограниченнойДлины(Реквизит) Тогда + + Элемент.Представление = ОбменДаннымиСервер.СтрокаНеограниченнойДлины(); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция ЭтоСтрокаНеограниченнойДлины(Реквизит) + + Возврат Реквизит.Тип = ТипСтрокаНеограниченнойДлины(); + +КонецФункции + +Функция ОпределитьПроцентСопоставления(Знач КоличествоОбъектов1, Знач КоличествоОбъектов2, Знач КоличествоОбъектовСопоставленных) + + КоличествоОбъектовМеньшее = Мин(КоличествоОбъектов1, КоличествоОбъектов2); + + КоличествоОбъектовМеньшее = ?(КоличествоОбъектовМеньшее <= 0, 1, КоличествоОбъектовМеньшее); + + Возврат Цел(100 * КоличествоОбъектовСопоставленных / КоличествоОбъектовМеньшее); + +КонецФункции diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/СопоставлениеОбъектовИнформационныхБаз.mdo b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/СопоставлениеОбъектовИнформационныхБаз.mdo new file mode 100644 index 000000000..2c1a17fa8 --- /dev/null +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/СопоставлениеОбъектовИнформационныхБаз.mdo @@ -0,0 +1,589 @@ + + + + + + + СопоставлениеОбъектовИнформационныхБаз + + ru + Сопоставление объектов информационных баз + + true + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Form.Форма + + ДанныеУспешноЗагружены + + ru + Данные успешно загружены + + + Boolean + + + + + + ИмяТаблицыПриемника + + ru + Имя таблицы приемника + + + String + + + + + + + ИмяТипаОбъектаТаблицыИсточника + + ru + Имя типа объекта таблицы источника + + + String + + + + + + + ИмяФайлаСообщенияОбмена + + ru + Имя файла сообщения обмена + + + String + + + + + + + ПоляПоискаТаблицыПриемника + + ru + Поля поиска таблицы приемника + + + String + + + + + + + ПоляТаблицыПриемника + + ru + Поля таблицы приемника + + + String + + + + + + + СписокИспользуемыхПолей + + ru + Список используемых полей + + + ValueList + + + + + + СписокПолейТаблицы + + ru + Список полей таблицы + + + ValueList + + + + + + ТипИсточникаСтрокой + + ru + Тип источника строкой + + + String + + + + + + + ТипПриемникаСтрокой + + ru + Тип приемника строкой + + + String + + + + + + + УзелИнформационнойБазы + + ru + Узел информационной базы + + + ExchangePlanRef + + + + + + + + + + ТаблицаНеутвержденныхСвязей + + ru + Таблица неутвержденных связей + + + Use + LineNumber + + Use + + + + + УникальныйИдентификаторПриемника + + ru + Уникальный идентификатор приемника + + + String + + 36 + + + + + + + + УникальныйИдентификаторИсточника + + ru + Уникальный идентификатор источника + + + AnyRef + + + + + + + ТипИсточника + + ru + Тип источника + + + String + + 150 + + + + + + + + ТипПриемника + + ru + Тип приемника + + + String + + 150 + + + + + + + + + + + + + ТаблицаАвтоматическиСопоставленныхОбъектов + + ru + Таблица автоматически сопоставленных объектов + + + Use + LineNumber + + Use + + + + + Пометка + + ru + Применить + + Да - применить сопоставление, Нет - не применять сопоставления + + Boolean + + + + + + + УникальныйИдентификаторПриемника + + ru + Уникальный идентификатор приемника + + + String + + 36 + + + + + + + + УникальныйИдентификаторИсточника + + ru + Уникальный идентификатор источника + + + AnyRef + + + + + + + ТипИсточника + + ru + Тип источника + + + String + + 150 + + + + + + + + ТипПриемника + + ru + Тип приемника + + + String + + 150 + + + + + + + + ПриемникПоле1 + + ru + Приемник поле 1 + + + String + + + + + + + + ПриемникПоле2 + + ru + Приемник поле 2 + + + String + + + + + + + + ПриемникПоле3 + + ru + Приемник поле 3 + + + String + + + + + + + + ПриемникПоле4 + + ru + Приемник поле 4 + + + String + + + + + + + + ПриемникПоле5 + + ru + Приемник поле 5 + + + String + + + + + + + + ИсточникПоле1 + + ru + Источник поле 1 + + + String + + + + + + + + ИсточникПоле2 + + ru + Источник поле 2 + + + String + + + + + + + + ИсточникПоле3 + + ru + Источник поле 3 + + + String + + + + + + + + ИсточникПоле4 + + ru + Источник поле 4 + + + String + + + + + + + + ИсточникПоле5 + + ru + Источник поле 5 + + + String + + + + + + + + + + + + + ТаблицаСортировки + + ru + Таблица сортировки + + + Use + LineNumber + + Use + + + + + ИмяПоля + + ru + Имя поля + + + String + + + + + + + + Использование + + ru + Использование + + + Boolean + + + + + + + НаправлениеСортировки + + ru + Направление сортировки + + + Boolean + + + + + + + + Форма + + ru + Форма + + PersonalComputer + MobileDevice + + + ФормаВыбораСвязиСопоставления + + ru + Форма выбора связи сопоставления + + PersonalComputer + MobileDevice + + + НастройкаПолейТаблицы + + ru + Настройка полей таблицы + + PersonalComputer + MobileDevice + + + НастройкаПолейТаблицыСопоставления + + ru + Настройка полей таблицы сопоставления + + PersonalComputer + MobileDevice + + + НастройкаАвтоматическогоСопоставления + + ru + Настройка автоматического сопоставления + + PersonalComputer + MobileDevice + + + НастройкаСортировки + + ru + Настройка сортировки + + PersonalComputer + MobileDevice + + + РезультатАвтоматическогоСопоставления + + ru + Результат автоматического сопоставления + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Attributes/ОтвеченныеАнкеты/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Attributes/ОтвеченныеАнкеты/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..d6c1b4549 --- /dev/null +++ b/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Attributes/ОтвеченныеАнкеты/ExtInfo/ListSettings.dcss @@ -0,0 +1,27 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + + + + false + Статус + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + diff --git a/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Form.form b/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Form.form new file mode 100644 index 000000000..ef9d6e988 --- /dev/null +++ b/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Form.form @@ -0,0 +1,435 @@ + + + + <key>ru</key> + <value>Архив анкет</value> + + + ОтвеченныеАнкеты + 1 + true + true + + true + + + ОтвеченныеАнкеты + + false + None + + ОтвеченныеАнкетыКодКартинки + 10 + true + true + + true + + + ОтвеченныеАнкеты.КодКартинки + + None + + ОтвеченныеАнкетыКодКартинкиРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ОтвеченныеАнкетыКодКартинкиКонтекстноеМеню + 11 + true + + PictureField + Enter + true + Left + true + + 1 + true + true + true + + CommonPicture.АрхивАнкета + + + + 1 + + + + + НаименованиеОпроса + 8 + + <key>ru</key> + <value>Анкета</value> + + true + true + + true + + + ОтвеченныеАнкеты.НаименованиеОпроса + + + НаименованиеОпросаРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + НаименованиеОпросаКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + 10 + true + true + + + + ДатаЗаполнения + 6 + + <key>ru</key> + <value>Дата заполнения</value> + + true + true + + true + + + ОтвеченныеАнкеты.ДатаЗаполнения + + + ДатаЗаполненияРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ДатаЗаполненияКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ОтвеченныеАнкетыКоманднаяПанель + 3 + + ОтвеченныеАнкетыВыбрать + 12 + true + true + + true + + false + + ОтвеченныеАнкетыВыбратьРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + Form.Item.ОтвеченныеАнкеты.StandardCommand.Choose + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + ValueChoice + ОтвеченныеАнкетыВыборЗначения + + + ОтвеченныеАнкетыСтрокаПоиска + 15 + + ОтвеченныеАнкетыСтрокаПоискаРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + ОтвеченныеАнкетыСтрокаПоискаКонтекстноеМеню + 16 + true + + ОтвеченныеАнкеты + + true + + + + ОтвеченныеАнкетыСостояниеПросмотра + 18 + + ОтвеченныеАнкетыСостояниеПросмотраРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ОтвеченныеАнкетыСостояниеПросмотраКонтекстноеМеню + 19 + true + + ViewStatusAddition + ОтвеченныеАнкеты + + true + + + + ОтвеченныеАнкетыУправлениеПоиском + 21 + + ОтвеченныеАнкетыУправлениеПоискомРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + ОтвеченныеАнкетыУправлениеПоискомКонтекстноеМеню + 22 + true + + SearchControlAddition + ОтвеченныеАнкеты + + true + + + + ОтвеченныеАнкетыРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + ОтвеченныеАнкетыКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + false + Auto + Auto + true + true + true + + ОтвеченныеАнкеты.DefaultPicture + + + CommonPicture.АрхивАнкета + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + CustomizeForm + Help + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + LockOwner + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.СписокРеспондента + + + true + + + true + +
    true
    +
    + + ОтвеченныеАнкеты + + <key>ru</key> + <value>Доступные опросы</value> + + 2 + + DynamicList + + + true + + + true + + + ОтвеченныеАнкеты.АнкетаОпрос + + + ОтвеченныеАнкеты.ДатаАнкеты + + + ОтвеченныеАнкеты.ДатаОкончания + + + ОтвеченныеАнкеты.Представление + + + ОтвеченныеАнкеты.Статус + + + ОтвеченныеАнкеты.Анкета + + + ОтвеченныеАнкеты.ДатаЗаполнения + + + ОтвеченныеАнкеты.КодКартинки + + + ОтвеченныеАнкеты.НаименованиеОпроса + + + ВЫБРАТЬ + ВложенныйЗапрос.Анкета, + ВложенныйЗапрос.НаименованиеОпроса, + ВложенныйЗапрос.ДатаЗаполнения, + 0 КАК КодКартинки +ИЗ + (ВЫБРАТЬ + Анкета.Ссылка КАК Анкета, + ЕСТЬNULL(НазначениеОпросов.Наименование, "") КАК НаименованиеОпроса, + Анкета.ДатаРедактирования КАК ДатаЗаполнения + ИЗ + Документ.Анкета КАК Анкета + ЛЕВОЕ СОЕДИНЕНИЕ Документ.НазначениеОпросов КАК НазначениеОпросов + ПО Анкета.Опрос = НазначениеОпросов.Ссылка + ГДЕ + Анкета.Проведен + И (НЕ Анкета.ПометкаУдаления) + И Анкета.Респондент = &Респондент + И (НЕ НазначениеОпросов.НеПоказыватьВАрхивеАнкет)) КАК ВложенныйЗапрос + true + true + true + true + + + + + + + +
    diff --git a/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Module.bsl b/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Module.bsl new file mode 100644 index 000000000..0354b11c1 --- /dev/null +++ b/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Module.bsl @@ -0,0 +1,65 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ + +&НаСервере +Процедура УстановитьПараметрыДинамическогоСпискаДереваАнкет() + + Для каждого ДоступныйПараметр Из ОтвеченныеАнкеты.Параметры.ДоступныеПараметры.Элементы Цикл + + Если ДоступныйПараметр.Заголовок = "Респондент" Тогда + ОтвеченныеАнкеты.Параметры.УстановитьЗначениеПараметра(ДоступныйПараметр.Параметр,Объект.Респондент); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьРеспондентаСогласноТекущемуВнешнемуПользователю() + + ВнешниеПользователи.УстановитьЗначениеРеквизитаФормы(ЭтаФорма, "Объект.Респондент", ВнешниеПользователи.ТекущийВнешнийПользователь()); + УстановитьПараметрыДинамическогоСпискаДереваАнкет(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("Респондент") Тогда + Объект.Респондент = Параметры.Респондент; + КонецЕсли; + УстановитьПараметрыДинамическогоСпискаДереваАнкет() + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ИзменениеТекущегоВнешнегоПользователя" Тогда + + УстановитьРеспондентаСогласноТекущемуВнешнемуПользователю(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтвеченныеАнкетыВыборЗначения(Элемент, Значение, СтандартнаяОбработка) + + ТекущиеДанные = Элементы.ОтвеченныеАнкеты.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + СтруктураПараметров = Новый Структура; + СтруктураПараметров.Вставить("Ключ",ТекущиеДанные.Анкета); + СтруктураПараметров.Вставить("ТолькоФормаЗаполнения",Истина); + СтруктураПараметров.Вставить("ТолькоПросмотр",Истина); + + ОткрытьФорму("Документ.Анкета.Форма.ФормаДокумента",СтруктураПараметров,Элемент); + +КонецПроцедуры diff --git a/SSL/src/DataProcessors/СписокРеспондента/Forms/Форма/Form.form b/SSL/src/DataProcessors/СписокРеспондента/Forms/Форма/Form.form new file mode 100644 index 000000000..b3555db07 --- /dev/null +++ b/SSL/src/DataProcessors/СписокРеспондента/Forms/Форма/Form.form @@ -0,0 +1,438 @@ + + + + <key>ru</key> + <value>Доступные анкеты</value> + + + Респондент + 1 + true + true + + true + + + Объект.Респондент + + + OnChange + РеспондентПриИзменении + + + РеспондентРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + РеспондентКонтекстноеМеню + 2 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДеревоАнкет + 3 + true + true + + true + + + ДеревоАнкет + + false + None + Add + Copy + CopyToClipboard + Delete + EndEdit + HierarchicalList + List + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + Tree + + ДеревоАнкетПредставление + 10 + true + true + + true + + + ДеревоАнкет.Представление + + None + + ДеревоАнкетПредставлениеРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ДеревоАнкетПредставлениеКонтекстноеМеню + 11 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + ДеревоАнкетКоманднаяПанель + 5 + Left + + + BeforeRowChange + ДеревоАнкетПередНачаломИзменения + + + ДеревоАнкетСтрокаПоиска + 16 + + ДеревоАнкетСтрокаПоискаРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + ДеревоАнкетСтрокаПоискаКонтекстноеМеню + 17 + true + + ДеревоАнкет + + true + + + + ДеревоАнкетСостояниеПросмотра + 19 + + ДеревоАнкетСостояниеПросмотраРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + ДеревоАнкетСостояниеПросмотраКонтекстноеМеню + 20 + true + + ViewStatusAddition + ДеревоАнкет + + true + + + + ДеревоАнкетУправлениеПоиском + 22 + + ДеревоАнкетУправлениеПоискомРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ДеревоАнкетУправлениеПоискомКонтекстноеМеню + 23 + true + + SearchControlAddition + ДеревоАнкет + + true + + + + ДеревоАнкетРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + ДеревоАнкетКонтекстноеМеню + 4 + true + + Tree + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + + ДеревоАнкет.КодКартинки + + + CommonPicture.КоллекцияКартинокДоступныеАнкеты + + None + None + None + true + + + АрхивАнкет + 12 + true + true + + true + + false + + АрхивАнкетРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Hyperlink + Form.Command.АрхивАнкет + Normal + Auto + true + true + UserCmds + Auto + + + ФормаКоманднаяПанель + -1 + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.СписокРеспондента + + + true + + + true + +
    true
    +
    + + ДеревоАнкет + + <key>ru</key> + <value>Дерево анкет</value> + + 2 + + ValueTree + + + true + + + true + + + Статус + + <key>ru</key> + <value>Статус</value> + + 1 + + String + + + + true + + + true + + + + АнкетаОпрос + + <key>ru</key> + <value>Анкета опрос</value> + + 2 + + DocumentRef.Анкета + DocumentRef.НазначениеОпросов + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Представление</value> + + 3 + + String + + + + true + + + true + + + + КодКартинки + + <key>ru</key> + <value>Код картинки</value> + + 4 + + Number + + 1 + true + + + + true + + + true + + + + + АрхивАнкет + + <key>ru</key> + <value>Архив анкет</value> + + 1 + + ru + Архив анкет + + + true + + + + АрхивАнкет + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/DataProcessors/СписокРеспондента/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/СписокРеспондента/Forms/Форма/Module.bsl new file mode 100644 index 000000000..53569909a --- /dev/null +++ b/SSL/src/DataProcessors/СписокРеспондента/Forms/Форма/Module.bsl @@ -0,0 +1,316 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ + +&НаСервере +Процедура ПолучитьДеревоАнкетРеспондента() + + ДеревоАнкетСервер = РеквизитФормыВЗначение("ДеревоАнкет"); + ДеревоАнкетСервер.Строки.Очистить(); + + Если ЗначениеЗаполнено(Объект.Респондент) Тогда + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | НазначениеОпросов.Ссылка, + | НазначениеОпросов.СвободныйОпрос, + | НазначениеОпросов.ДатаОкончания, + | НазначениеОпросов.Наименование + |ПОМЕСТИТЬ ДействующиеОпросы + |ИЗ + | Документ.НазначениеОпросов КАК НазначениеОпросов + |ГДЕ + | НазначениеОпросов.Проведен + | И (НЕ НазначениеОпросов.ПометкаУдаления) + | И (НазначениеОпросов.ДатаНачала = &ПустаяДата + | ИЛИ НАЧАЛОПЕРИОДА(НазначениеОпросов.ДатаНачала, ДЕНЬ) < &ТекущаяДата) + | И НазначениеОпросов.ТипРеспондентов = &ТипРеспондентов + | И (НазначениеОпросов.ДатаОкончания = &ПустаяДата + | ИЛИ КОНЕЦПЕРИОДА(НазначениеОпросов.ДатаОкончания, ДЕНЬ) > &ТекущаяДата) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ДействующиеОпросы.Ссылка, + | ДействующиеОпросы.ДатаОкончания, + | ДействующиеОпросы.Наименование + |ПОМЕСТИТЬ ДействующиеОпросыОтборПоРеспонденту + |ИЗ + | ДействующиеОпросы КАК ДействующиеОпросы + |ГДЕ + | ДействующиеОпросы.СвободныйОпрос + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | НазначениеОпросовРеспонденты.Ссылка, + | НазначениеОпросов.ДатаОкончания, + | НазначениеОпросов.Наименование + |ИЗ + | Документ.НазначениеОпросов.Респонденты КАК НазначениеОпросовРеспонденты + | ЛЕВОЕ СОЕДИНЕНИЕ Документ.НазначениеОпросов КАК НазначениеОпросов + | ПО НазначениеОпросовРеспонденты.Ссылка = НазначениеОпросов.Ссылка + |ГДЕ + | НазначениеОпросовРеспонденты.Респондент = &Респондент + | И НазначениеОпросовРеспонденты.Ссылка В + | (ВЫБРАТЬ + | ДействующиеОпросы.Ссылка + | ИЗ + | ДействующиеОпросы КАК ДействующиеОпросы + | ГДЕ + | (НЕ ДействующиеОпросы.СвободныйОпрос)) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВЫБОР + | КОГДА АнкетыПоДействующимЗапросам.Ссылка ЕСТЬ NULL + | ТОГДА ""Опросы"" + | ИНАЧЕ ""Анкеты"" + | КОНЕЦ КАК Статус, + | ВЫБОР + | КОГДА АнкетыПоДействующимЗапросам.Ссылка ЕСТЬ NULL + | ТОГДА ДействующиеОпросыОтборПоРеспонденту.Ссылка + | ИНАЧЕ АнкетыПоДействующимЗапросам.Ссылка + | КОНЕЦ КАК АнкетаОпрос, + | ДействующиеОпросыОтборПоРеспонденту.ДатаОкончания КАК ДатаОкончания, + | ДействующиеОпросыОтборПоРеспонденту.Наименование, + | АнкетыПоДействующимЗапросам.Дата КАК ДатаАнкеты, + | ЕСТЬNULL(АнкетыПоДействующимЗапросам.Проведен, ЛОЖЬ) КАК Проведен + |ПОМЕСТИТЬ НеотвеченныеОпросыСохраненныеАнкеты + |ИЗ + | ДействующиеОпросыОтборПоРеспонденту КАК ДействующиеОпросыОтборПоРеспонденту + | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ + | Анкета.Ссылка КАК Ссылка, + | Анкета.ДатаРедактирования КАК Дата, + | Анкета.Проведен КАК Проведен, + | Анкета.Опрос КАК Опрос + | ИЗ + | Документ.Анкета КАК Анкета + | ГДЕ + | Анкета.Опрос В + | (ВЫБРАТЬ + | ДействующиеОпросыОтборПоРеспонденту.Ссылка + | ИЗ + | ДействующиеОпросыОтборПоРеспонденту КАК ДействующиеОпросыОтборПоРеспонденту) + | И Анкета.Респондент = &Респондент + | И (НЕ Анкета.ПометкаУдаления)) КАК АнкетыПоДействующимЗапросам + | ПО ДействующиеОпросыОтборПоРеспонденту.Ссылка = АнкетыПоДействующимЗапросам.Опрос + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | НеотвеченныеОпросыСохраненныеАнкеты.Статус, + | НеотвеченныеОпросыСохраненныеАнкеты.АнкетаОпрос, + | НеотвеченныеОпросыСохраненныеАнкеты.ДатаОкончания, + | НеотвеченныеОпросыСохраненныеАнкеты.Наименование, + | НеотвеченныеОпросыСохраненныеАнкеты.ДатаАнкеты + |ИЗ + | НеотвеченныеОпросыСохраненныеАнкеты КАК НеотвеченныеОпросыСохраненныеАнкеты + |ГДЕ + | (НЕ НеотвеченныеОпросыСохраненныеАнкеты.Проведен)"; + + Запрос.УстановитьПараметр("Респондент",Объект.Респондент ); + Запрос.УстановитьПараметр("ТекущаяДата",ТекущаяДата()); + Запрос.УстановитьПараметр("ПустаяДата",Дата(1,1,1)); + Запрос.УстановитьПараметр("ТипРеспондентов",Справочники[Объект.Респондент.Метаданные().Имя].ПустаяСсылка()); + + Результат = Запрос.Выполнить(); + + Если НЕ Результат.Пустой() Тогда + + ДеревоАнкетРеспондента = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); + Для каждого СтрокаДерева Из ДеревоАнкетРеспондента.Строки Цикл + ДобавитьСтрокуДереваАнкет(СтрокаДерева,ДеревоАнкетСервер); + КонецЦикла; + + КонецЕсли; + + КонецЕсли; + + ЗначениеВДанныеФормы(ДеревоАнкетСервер,ДеревоАнкет); + +КонецПроцедуры + +// Формирует представление строки для дерева анкет +// +// Параметры +// СтрокаДерева - СтрокаДереваЗначений - на основании ее формируется представление +// анкет и опросов в дереве +&НаСервере +Функция ПолучитьПредставлениеСтрокиДереваАнкеты(СтрокаДерева) + + СтрокаВозврата = ""; + + ЕстьОграниченияПоСроку = ЗначениеЗаполнено(СтрокаДерева.ДатаОкончания); + Закончился = ?(ЗначениеЗаполнено(СтрокаДерева.ДатаОкончания),?(ТекущаяДата()<=СтрокаДерева.ДатаОкончания,Ложь,Истина),Ложь); + + Если ТипЗнч(СтрокаДерева.АнкетаОпрос) = Тип("ДокументСсылка.НазначениеОпросов") Тогда + СтрокаВозврата = СтрокаВозврата + "Анкета " + "'"+ СтрокаДерева.Наименование + "'"; + ИначеЕсли ТипЗнч(СтрокаДерева.АнкетаОпрос) = Тип("ДокументСсылка.Анкета") Тогда + СтрокаВозврата = СтрокаВозврата + "Анкета " + "'" + СтрокаДерева.Наименование + "'" + ", последний раз редактировавшаяся " + Формат(СтрокаДерева.ДатаАнкеты,"ДФ=dd.MM.yyyy"); + Иначе + Возврат СтрокаВозврата; + КонецЕсли; + + Если ЕстьОграниченияПоСроку Тогда + СтрокаВозврата = СтрокаВозврата + ", к заполнению до " + Формат(НачалоДня(КонецДня(СтрокаДерева.ДатаОкончания) + 1),"ДФ=dd.MM.yyyy"); + КонецЕсли; + + СтрокаВозврата = СтрокаВозврата + "."; + + Возврат СтрокаВозврата; + +КонецФункции// + +// Устанавливает значение Респондент, согласно значению текущего внешнего пользователя +&НаСервере +Процедура УстановитьРеспондентаСогласноТекущемуВнешнемуПользователю() + + ВнешниеПользователи.УстановитьЗначениеРеквизитаФормы(ЭтаФорма, "Объект.Респондент", + ВнешниеПользователи.ПолучитьЗначениеРеквизитовВнешнегоПользователя(ВнешниеПользователи.ТекущийВнешнийПользователь(),"ОбъектАвторизации",Ложь).ОбъектАвторизации); + ПолучитьДеревоАнкетРеспондента(); + +КонецПроцедуры + +// Вызыватся рекурсивно, заполняет дерево анкет респондента +// +// Параметры +// СтрокаДерева - СтрокаДереваЗначений - строка, которая будет довавлена +// ДеревоАнкетыСервер - ДеревоЗначений - дерево, в которое будет добавлена строка +&НаСервере +Процедура ДобавитьСтрокуДереваАнкет(СтрокаДерева,Родитель) + + НоваяСтрока = Родитель.Строки.Добавить(); + Если НЕ ЗначениеЗаполнено(СтрокаДерева.АнкетаОпрос) Тогда + + НоваяСтрока.Представление = СтрокаДерева.Статус; + НоваяСтрока.Статус = СтрокаДерева.Статус; + + Иначе + + НоваяСтрока.Статус = СтрокаДерева.Статус; + НоваяСтрока.АнкетаОпрос = СтрокаДерева.АнкетаОпрос; + НоваяСтрока.Представление = ПолучитьПредставлениеСтрокиДереваАнкеты(СтрокаДерева); + + КонецЕсли; + + НоваяСтрока.КодКартинки = ?(СтрокаДерева.Статус = "Опросы",0,1); + + Если СтрокаДерева.Строки.Количество() > 0 Тогда + Для каждого ПодчиненнаяСтрокаДерева Из СтрокаДерева.Строки Цикл + ДобавитьСтрокуДереваАнкет(ПодчиненнаяСтрокаДерева,НоваяСтрока); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры // () + +// Разворачивает в дереве анкет группировки "Доступные опросы" и "Незаконченные опросы" +&НаКлиенте +Процедура РазвернутьДеревоАнкет() + + ЭлементыВерхнегоУровня = ДеревоАнкет.ПолучитьЭлементы(); + Для каждого Элемент Из ЭлементыВерхнегоУровня Цикл + Если Элемент.Представление = "Доступные опросы" + ИЛИ Элемент.Представление = "Незаконченные анкеты" Тогда + + Элементы.ДеревоАнкет.Развернуть(Элемент.ПолучитьИдентификатор()); + + КонецЕсли; + КонецЦикла; + + +КонецПроцедуры // РазвернутьДеревоАнкет() + +////////////////////////////////////////////////////////// +// КОМАНДЫ ФОРМЫ + +&НаКлиенте +Процедура АрхивАнкет(Команда) + + ОткрытьФорму("Обработка.СписокРеспондента.Форма.АрхивАнкет",Новый Структура("Респондент",Объект.Респондент),ЭтаФорма); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьРеспондентаСогласноТекущемуВнешнемуПользователю(); + Если НЕ ПравоДоступа("Редактирование",РеквизитФормыВЗначение("Объект").Метаданные().Реквизиты.Респондент) Тогда + Элементы.Респондент.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ОкончаниеРедактированияАнкеты" Тогда + ПолучитьДеревоАнкетРеспондента(); + ИначеЕсли ИмяСобытия = "ИзменениеТекущегоВнешнегоПользователя" Тогда + УстановитьРеспондентаСогласноТекущемуВнешнемуПользователю(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + РазвернутьДеревоАнкет(); + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ДеревоАнкетПередНачаломИзменения(Элемент, Отказ) + + Отказ = Истина; + + ТекущиеДанные = Элементы.ДеревоАнкет.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(ТекущиеДанные.АнкетаОпрос) = Тип("ДокументСсылка.Анкета") Тогда + + СтруктураПараметров = Новый Структура; + СтруктураПараметров.Вставить("Ключ",ТекущиеДанные.АнкетаОпрос); + СтруктураПараметров.Вставить("ТолькоФормаЗаполнения",Истина); + Если ТекущиеДанные.Статус = "Отвеченные анкеты" Тогда + СтруктураПараметров.Вставить("ТолькоПросмотр",Истина); + КонецЕсли; + + ОткрытьФорму("Документ.Анкета.Форма.ФормаДокумента",СтруктураПараметров,Элемент); + + ИначеЕсли ТипЗнч(ТекущиеДанные.АнкетаОпрос) = Тип("ДокументСсылка.НазначениеОпросов") Тогда + + СтруктураПараметров = Новый Структура; + ЗначенияЗаполнения = Новый Структура; + + ЗначенияЗаполнения.Вставить("Респондент",Объект.Респондент); + ЗначенияЗаполнения.Вставить("Опрос",ТекущиеДанные.АнкетаОпрос); + СтруктураПараметров.Вставить("ЗначенияЗаполнения",ЗначенияЗаполнения); + СтруктураПараметров.Вставить("ТолькоФормаЗаполнения",Истина); + + ОткрытьФорму("Документ.Анкета.Форма.ФормаДокумента",СтруктураПараметров,Элемент); + + КонецЕсли; + +КонецПроцедуры + + &НаКлиенте +Процедура РеспондентПриИзменении(Элемент) + + ПолучитьДеревоАнкетРеспондента(); + РазвернутьДеревоАнкет(); + +КонецПроцедуры + + + + diff --git a/SSL/src/DataProcessors/СписокРеспондента/СписокРеспондента.mdo b/SSL/src/DataProcessors/СписокРеспондента/СписокРеспондента.mdo new file mode 100644 index 000000000..48aa950cf --- /dev/null +++ b/SSL/src/DataProcessors/СписокРеспондента/СписокРеспондента.mdo @@ -0,0 +1,44 @@ + + + + + + + СписокРеспондента + + ru + Список респондента + + true + DataProcessor.СписокРеспондента.Form.Форма + + Респондент + + ru + Респондент + + + CatalogRef.ФизическиеЛица + + + + + + Форма + + ru + Форма + + PersonalComputer + MobileDevice + + + АрхивАнкет + + ru + Архив анкет + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ObjectModule.bsl b/SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ObjectModule.bsl new file mode 100644 index 000000000..e402f9c73 --- /dev/null +++ b/SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ObjectModule.bsl @@ -0,0 +1,615 @@ +/////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ ЭКСПОРТНЫЕ + +Перем СтрокаСообщенияОбОшибке Экспорт; +Перем СтрокаСообщенияОбОшибкеЖР Экспорт; + +/////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ МОДУЛЯ + +Перем мСообщенияОшибок; // соответствие с предопределенными сообщениями ошибок обработки +Перем мИмяОбъекта; // имя объекта метаданных + +Перем мВременныйФайлСообщенияОбмена; // временный файл сообщения обмена для выгрузки/загрузки данных +Перем мВременныйКаталогСообщенийОбмена; // временный каталог для сообщений обмена + +Перем мТемаСообщения; // шаблон темы сообщения +Перем мТелоСообщенияПростое; // текст тела сообщения с вложением - файлом XML +Перем мТелоСообщенияСжатое; // текст тела сообщения с вложением - сжатым файлом +Перем мТелоСообщенияПакетное; // текст тела сообщения с вложением - сжатый файл, в котором с набор файлов + +/////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Создает временный каталог в каталоге временных файлов пользователя операционной системы. +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина – удалось выполнить функцию, Ложь – произошла ошибка +// +Функция ВыполнитьДействияПередОбработкойСообщения() Экспорт + + ИнициализацияСообщений(); + + Возврат СоздатьВременныйКаталогСообщенийОбмена(); + +КонецФункции + +// Выполняет отправку сообщения обмена на заданный ресурс из временного каталога сообщения обмена +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина – удалось выполнить функцию, Ложь – произошла ошибка +// +Функция ОтправитьСообщение() Экспорт + + ИнициализацияСообщений(); + + Попытка + Результат = ОтправитьСообщениеОбмена(); + Исключение + Результат = Ложь; + КонецПопытки; + + Возврат Результат; + +КонецФункции + +// Получает сообщение обмена с заданного ресурса во временный каталог сообщения обмена +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина – удалось выполнить функцию, Ложь – произошла ошибка +// +Функция ПолучитьСообщение() Экспорт + + ИнициализацияСообщений(); + + Попытка + Результат = ПолучитьСообщениеОбмена(); + Исключение + Результат = Ложь; + КонецПопытки; + + Возврат Результат; + +КонецФункции + +// Удаляет временный каталог сообщений обмена после выполнения выгрузки или загрузки данных +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина +// +Функция ВыполнитьДействияПослеОбработкиСообщения() Экспорт + + ИнициализацияСообщений(); + + УдалитьВременныйКаталогСообщенийОбмена(); + + Возврат Истина; + +КонецФункции + +// Выполняет проверку наличия сообщения обмена на заданном ресурсе +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина - сообщение обмена присутствует на заданном ресурсе; Лож – нет +// +Функция ФайлСообщенияОбменаСуществует() Экспорт + + ИнициализацияСообщений(); + + МассивКолонок = Новый Массив; + МассивКолонок.Добавить("Тема"); + + ПараметрыЗагрузки = Новый Структура; + ПараметрыЗагрузки.Вставить("Колонки", МассивКолонок); + ПараметрыЗагрузки.Вставить("ПолучениеЗаголовков", Истина); + + Попытка + НаборСообщений = ЭлектроннаяПочта.ЗагрузитьПочтовыеСообщения(EMAILУчетнаяЗапись, ПараметрыЗагрузки); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(103); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + Для Каждого ПочтовоеСообщение Из НаборСообщений Цикл + + Если ВРег(СокрЛП(ПочтовоеСообщение.Тема)) = ВРег(СокрЛП(мТемаСообщения)) Тогда + + Возврат Истина; + + КонецЕсли; + + КонецЦикла; + + Возврат Ложь; +КонецФункции + +// Инициализация + +// Выполняет инициализацию свойств обработки начальными значениями и константами +// +// Параметры: +// Нет. +// +Процедура Инициализация() Экспорт + + ИнициализацияСообщений(); + + мТемаСообщения = "Exchange message (ШаблонИмениФайлаСообщения)"; + мТемаСообщения = СтрЗаменить(мТемаСообщения, "ШаблонИмениФайлаСообщения", ШаблонИмениФайлаСообщения); + + мТелоСообщенияПростое = НСтр("ru = 'Сообщение обмена данными'"); + мТелоСообщенияСжатое = НСтр("ru = 'Сжатое сообщение обмена данными'"); + мТелоСообщенияПакетное = НСтр("ru = 'Пакетное сообщение обмена данными'"); + +КонецПроцедуры + +// ПРОВЕРКА ПОДКЛЮЧЕНИЯ + +// Выполняет проверку возможности установки подключения к заданному ресурсу +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево – Истина – подключение может быть установлено; Ложь – нет +// +Функция ПодключениеУстановлено() Экспорт + + ИнициализацияСообщений(); + + Если НЕ ЗначениеЗаполнено(EMAILУчетнаяЗапись) Тогда + ПолучитьСообщениеОбОшибке(101); + Возврат Ложь; + КонецЕсли; + + СообщениеОбОшибке = ""; + ДополнительноеСообщение = ""; + ЭлектроннаяПочта.ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(EMAILУчетнаяЗапись, Неопределено, СообщениеОбОшибке, ДополнительноеСообщение); + + Если ЗначениеЗаполнено(СообщениеОбОшибке) Тогда + ПолучитьСообщениеОбОшибке(107); + ДополнитьСообщениеОбОшибке(СообщениеОбОшибке); + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////// +// СВОЙСТВА ОБРАБОТКИ + +// Функция-свойство: время изменения файла сообщения обмена +// +// Тип: Дата +// +Функция ДатаФайлаСообщенияОбмена() Экспорт + + Результат = Неопределено; + + Если ТипЗнч(мВременныйФайлСообщенияОбмена) = Тип("Файл") Тогда + + Если мВременныйФайлСообщенияОбмена.Существует() Тогда + + Результат = мВременныйФайлСообщенияОбмена.ПолучитьВремяИзменения(); + + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Функция-свойство: полное имя файла сообщения обмена +// +// Тип: Строка +// +Функция ИмяФайлаСообщенияОбмена() Экспорт + + Имя = ""; + + Если ТипЗнч(мВременныйФайлСообщенияОбмена) = Тип("Файл") Тогда + + Имя = мВременныйФайлСообщенияОбмена.ПолноеИмя; + + КонецЕсли; + + Возврат Имя; + +КонецФункции + +// Функция-свойство: полное имя каталога сообщения обмена +// +// Тип: Строка +// +Функция ИмяКаталогаСообщенияОбмена() Экспорт + + Имя = ""; + + Если ТипЗнч(мВременныйКаталогСообщенийОбмена) = Тип("Файл") Тогда + + Имя = мВременныйКаталогСообщенийОбмена.ПолноеИмя; + + КонецЕсли; + + Возврат Имя; + +КонецФункции + +// + +Функция СжиматьФайлИсходящегоСообщения() + + Возврат EMAILСжиматьФайлИсходящегоСообщения; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +Функция СоздатьВременныйКаталогСообщенийОбмена() + + мВременныйКаталогСообщенийОбмена = Новый Файл(ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(КаталогВременныхФайлов(), ОбменДаннымиСервер.ИмяВременногоКаталогаСообщенийОбмена())); + + // создаем временный каталог для сообщений обмена + Попытка + СоздатьКаталог(ИмяКаталогаСообщенияОбмена()); + Исключение + ПолучитьСообщениеОбОшибке(4); + ДополнитьСообщениеОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат Ложь; + КонецПопытки; + + ИмяФайлаСообщения = ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(ИмяКаталогаСообщенияОбмена(), ШаблонИмениФайлаСообщения + ".xml"); + + мВременныйФайлСообщенияОбмена = Новый Файл(ИмяФайлаСообщения); + + Возврат Истина; +КонецФункции + +Функция УдалитьВременныйКаталогСообщенийОбмена() + + Попытка + Если Не ПустаяСтрока(ИмяКаталогаСообщенияОбмена()) Тогда + УдалитьФайлы(ИмяКаталогаСообщенияОбмена()); + мВременныйКаталогСообщенийОбмена = Неопределено; + КонецЕсли; + Исключение + Возврат Ложь; + КонецПопытки; + + Возврат Истина; + +КонецФункции + +Функция ОтправитьСообщениеОбмена() + + Результат = Истина; + + Расширение = ?(СжиматьФайлИсходящегоСообщения(), ".zip", ".xml"); + + ИмяФайлаИсходящегоСообщения = ШаблонИмениФайлаСообщения + Расширение; + + Если СжиматьФайлИсходящегоСообщения() Тогда + + // получаем имя для временного файла архива + ИмяВременногоФайлаАрхива = ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(ИмяКаталогаСообщенияОбмена(), ШаблонИмениФайлаСообщения + ".zip"); + + Попытка + + Архиватор = Новый ЗаписьZipФайла(ИмяВременногоФайлаАрхива, ПарольАрхиваСообщенияОбмена, "Файл сообщения обмена"); + Архиватор.Добавить(ИмяФайлаСообщенияОбмена()); + Архиватор.Записать(); + + Исключение + + Результат = Ложь; + ПолучитьСообщениеОбОшибке(3); + ДополнитьСообщениеОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + КонецПопытки; + + Архиватор = Неопределено; + + Если Результат Тогда + + // выполняем проверку на максимально допустимый размер сообщения обмена + Если ОбменДаннымиСервер.РазмерСообщенияОбменаПревышаетДопустимый(ИмяВременногоФайлаАрхива, МаксимальныйДопустимыйРазмерСообщения()) Тогда + ПолучитьСообщениеОбОшибке(108); + Результат = Ложь; + КонецЕсли; + + КонецЕсли; + + Если Результат Тогда + + Результат = ОтправитьСообщениеПоЭлектроннойПочте( + мТелоСообщенияСжатое, + ИмяФайлаИсходящегоСообщения, + ИмяВременногоФайлаАрхива); + + КонецЕсли; + + Иначе + + Если Результат Тогда + + // выполняем проверку на максимально допустимый размер сообщения обмена + Если ОбменДаннымиСервер.РазмерСообщенияОбменаПревышаетДопустимый(ИмяФайлаСообщенияОбмена(), МаксимальныйДопустимыйРазмерСообщения()) Тогда + ПолучитьСообщениеОбОшибке(108); + Результат = Ложь; + КонецЕсли; + + КонецЕсли; + + Если Результат Тогда + + Результат = ОтправитьСообщениеПоЭлектроннойПочте( + мТелоСообщенияПростое, + ИмяФайлаИсходящегоСообщения, + ИмяФайлаСообщенияОбмена()); + + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьСообщениеОбмена() + + ТаблицаСообщенийОбмена = Новый ТаблицаЗначений; + ТаблицаСообщенийОбмена.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Массив")); + ТаблицаСообщенийОбмена.Колонки.Добавить("ДатаОтправления", Новый ОписаниеТипов("Дата")); + + МассивКолонок = Новый Массив; + + МассивКолонок.Добавить("Идентификатор"); + МассивКолонок.Добавить("ДатаОтправления"); + МассивКолонок.Добавить("Тема"); + + ПараметрыЗагрузки = Новый Структура; + ПараметрыЗагрузки.Вставить("Колонки", МассивКолонок); + ПараметрыЗагрузки.Вставить("ПолучениеЗаголовков", Истина); + + Попытка + НаборСообщений = ЭлектроннаяПочта.ЗагрузитьПочтовыеСообщения(EMAILУчетнаяЗапись, ПараметрыЗагрузки); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(103); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + Для Каждого ПочтовоеСообщение Из НаборСообщений Цикл + + Если ВРег(СокрЛП(ПочтовоеСообщение.Тема)) <> ВРег(СокрЛП(мТемаСообщения)) Тогда + Продолжить; + КонецЕсли; + + НоваяСтрока = ТаблицаСообщенийОбмена.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ПочтовоеСообщение); + + КонецЦикла; + + Если ТаблицаСообщенийОбмена.Количество() = 0 Тогда + + ПолучитьСообщениеОбОшибке(104); + + СтрокаСообщения = НСтр("ru = 'Не обнаружены письма с заголовком равным: ""[мТемаСообщения]""'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[мТемаСообщения]", мТемаСообщения); + ДополнитьСообщениеОбОшибке(СтрокаСообщения); + + Возврат Ложь; + + Иначе + + ТаблицаСообщенийОбмена.Сортировать("ДатаОтправления Убыв"); + + МассивКолонок = Новый Массив; + МассивКолонок.Добавить("Вложения"); + + ПараметрыЗагрузки = Новый Структура; + ПараметрыЗагрузки.Вставить("Колонки", МассивКолонок); + ПараметрыЗагрузки.Вставить("ЗаголовкиИдентификаторы", ТаблицаСообщенийОбмена[0].Идентификатор); + + Попытка + НаборСообщений = ЭлектроннаяПочта.ЗагрузитьПочтовыеСообщения(EMAILУчетнаяЗапись, ПараметрыЗагрузки); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(105); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + ДвоичныеДанные = НаборСообщений[0].Вложения.Получить(ШаблонИмениФайлаСообщения+".zip"); + + Если ДвоичныеДанные <> Неопределено Тогда + ФайлЗапакован = Истина; + Иначе + ДвоичныеДанные = НаборСообщений[0].Вложения.Получить(ШаблонИмениФайлаСообщения+".xml"); + ФайлЗапакован = Ложь; + КонецЕсли; + + Если ДвоичныеДанные = Неопределено Тогда + ПолучитьСообщениеОбОшибке(109); + Возврат Ложь; + КонецЕсли; + + Если ФайлЗапакован Тогда + + // получаем имя для временного файла архива + ИмяВременногоФайлаАрхива = ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(ИмяКаталогаСообщенияОбмена(), ШаблонИмениФайлаСообщения + ".zip"); + + Попытка + ДвоичныеДанные.Записать(ИмяВременногоФайлаАрхива); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(106); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + // распаковываем временный файл архива + УспешноРаспакованно = ОбменДаннымиСервер.РаспаковатьZipФайл(ИмяВременногоФайлаАрхива, ИмяКаталогаСообщенияОбмена(), ПарольАрхиваСообщенияОбмена); + + Если Не УспешноРаспакованно Тогда + ПолучитьСообщениеОбОшибке(2); + Возврат Ложь; + КонецЕсли; + + // проверка на существование файла сообщения + Файл = Новый Файл(ИмяФайлаСообщенияОбмена()); + + Если Не Файл.Существует() Тогда + + ПолучитьСообщениеОбОшибке(5); + Возврат Ложь; + + КонецЕсли; + + Иначе + + Попытка + ДвоичныеДанные.Записать(ИмяФайлаСообщенияОбмена()); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(106); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + КонецЕсли; + + КонецЕсли; + + Возврат Истина; + +КонецФункции + +Процедура ПолучитьСообщениеОбОшибке(НомерСообщения) + + УстановитьСтрокуСообщенияОбОшибке(мСообщенияОшибок[НомерСообщения]); + +КонецПроцедуры + +Процедура УстановитьСтрокуСообщенияОбОшибке(Знач Сообщение) + + Если Сообщение = Неопределено Тогда + Сообщение = "Внутренняя ошибка"; + КонецЕсли; + + СтрокаСообщенияОбОшибке = Сообщение; + СтрокаСообщенияОбОшибкеЖР = мИмяОбъекта + ": " + Сообщение; + +КонецПроцедуры + +Процедура ДополнитьСообщениеОбОшибке(Сообщение) + + СтрокаСообщенияОбОшибке = СтрокаСообщенияОбОшибке + Символы.ПС + Сообщение; + СтрокаСообщенияОбОшибкеЖР = СтрокаСообщенияОбОшибкеЖР + Символы.ПС + Сообщение; + +КонецПроцедуры + +// Переопределяемая функция, возвращает максимально допустимый размер +// сообщения, которое может быть отправлено. +// +Функция МаксимальныйДопустимыйРазмерСообщения() + + Возврат EMAILМаксимальныйДопустимыйРазмерСообщения; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ИНИЦИАЛИЗАЦИИ + +Процедура ИнициализацияСообщений() + + СтрокаСообщенияОбОшибке = ""; + СтрокаСообщенияОбОшибкеЖР = ""; + +КонецПроцедуры + +Процедура ИнициализацияСообщенийОшибок() + + мСообщенияОшибок = Новый Соответствие; + + // Общие коды ошибок + мСообщенияОшибок.Вставить(001, НСтр("ru = 'Не обнаружены сообщения обмена.'")); + мСообщенияОшибок.Вставить(002, НСтр("ru = 'Ошибка при распаковке сжатого файла сообщения.'")); + мСообщенияОшибок.Вставить(003, НСтр("ru = 'Ошибка при сжатии файла сообщения обмена.'")); + мСообщенияОшибок.Вставить(004, НСтр("ru = 'Ошибка при создании временного каталога'.")); + мСообщенияОшибок.Вставить(005, НСтр("ru = 'Архив не содержит файл сообщения обмена.'")); + мСообщенияОшибок.Вставить(006, НСтр("ru = 'Сообщение обмена не отправлено: превышен допустимый размер сообщения.'")); + + // Коды ошибок, зависящие от вида транспорта + мСообщенияОшибок.Вставить(101, НСтр("ru = 'Ошибка инициализации: не указана учетная запись электронной почты транспорта сообщений обмена.'")); + мСообщенияОшибок.Вставить(102, НСтр("ru = 'Ошибка при отправке сообщения электронной почты.'")); + мСообщенияОшибок.Вставить(103, НСтр("ru = 'Ошибка при получении заголовков сообщений с сервера электронной почты.'")); + мСообщенияОшибок.Вставить(104, НСтр("ru = 'Не обнаружены сообщения обмена на почтовом сервере.'")); + мСообщенияОшибок.Вставить(105, НСтр("ru = 'Ошибка при получении сообщения с сервера электронной почты.'")); + мСообщенияОшибок.Вставить(106, НСтр("ru = 'Ошибка при записи файла сообщения обмена на диск.'")); + мСообщенияОшибок.Вставить(107, НСтр("ru = 'Проверка параметров учетной записи завершилась с ошибками.'")); + мСообщенияОшибок.Вставить(108, НСтр("ru = 'Превышен допустимый размер сообщения обмена.'")); + мСообщенияОшибок.Вставить(109, НСтр("ru = 'Ошибка: в почтовом сообщении не найден файл с сообщением.'")); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ С E-MAIL + +Функция ОтправитьСообщениеПоЭлектроннойПочте(Тело, ИмяФайлаИсходящегоСообщения, ПутьКФайлу) + + Вложения = Новый Соответствие; + Вложения.Вставить(ИмяФайлаИсходящегоСообщения, + Новый ДвоичныеДанные(ПутьКФайлу)); + + ПараметрыСообщения = Новый Структура; + ПараметрыСообщения.Вставить("Кому", EMAILУчетнаяЗапись.АдресЭлектроннойПочты); + ПараметрыСообщения.Вставить("Тема", мТемаСообщения); + ПараметрыСообщения.Вставить("Тело", Тело); + ПараметрыСообщения.Вставить("Вложения", Вложения); + + Попытка + РаботаСПочтовымиСообщениями.ОтправитьСообщение(EMAILУчетнаяЗапись, ПараметрыСообщения); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(102); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + Возврат Истина; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////// +// ИНИЦИАЛИЗАЦИЯ + +ИнициализацияСообщений(); +ИнициализацияСообщенийОшибок(); + +мВременныйКаталогСообщенийОбмена = Неопределено; +мВременныйФайлСообщенияОбмена = Неопределено; + +мИмяОбъекта = НСтр("ru = 'Обработка: [ИмяОбработки]'"); +мИмяОбъекта = СтрЗаменить(мИмяОбъекта, "[ИмяОбработки]", Метаданные().Имя); diff --git a/SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ТранспортСообщенийОбменаEMAIL.mdo b/SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ТранспортСообщенийОбменаEMAIL.mdo new file mode 100644 index 000000000..435d1d435 --- /dev/null +++ b/SSL/src/DataProcessors/ТранспортСообщенийОбменаEMAIL/ТранспортСообщенийОбменаEMAIL.mdo @@ -0,0 +1,86 @@ + + + + + + + ТранспортСообщенийОбменаEMAIL + + ru + Транспорт сообщения обмена через E-mail + + + EMAILМаксимальныйДопустимыйРазмерСообщения + + ru + Максимальный размер сообщения обмена, КБайт + + + Number + + 10 + true + + + + ru + Максимальный размер отправляемого файла сообщения обмена (КБайт) + + + + + + EMAILСжиматьФайлИсходящегоСообщения + + ru + Сжимать файл исходящего сообщения + + + Boolean + + + + + + EMAILУчетнаяЗапись + + ru + Учетная запись электронной почты + + + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + + ru + Учетная запись для обмена + + + + + + ПарольАрхиваСообщенияОбмена + + ru + Пароль архива сообщения обмена + + + String + + + + + + + ШаблонИмениФайлаСообщения + + ru + Шаблон имени файла сообщения + + + String + + + + + + diff --git a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ObjectModule.bsl b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ObjectModule.bsl new file mode 100644 index 000000000..94aa64c1d --- /dev/null +++ b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ObjectModule.bsl @@ -0,0 +1,565 @@ +/////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ ЭКСПОРТНЫЕ + +Перем СтрокаСообщенияОбОшибке Экспорт; +Перем СтрокаСообщенияОбОшибкеЖР Экспорт; + +/////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ МОДУЛЯ + +Перем мСообщенияОшибок; // соответствие с сообщениями ошибок обработки +Перем мИмяОбъекта; // имя объекта метаданных + +Перем мВременныйФайлСообщенияОбмена; // временный файл сообщения обмена для выгрузки/загрузки данных +Перем мВременныйКаталогСообщенийОбмена; // временный каталог для сообщений обмена +Перем мКаталогОбменаИнформацией; // сетевой каталог для обмена сообщениями + +/////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Создает временный каталог в каталоге временных файлов пользователя операционной системы. +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина – удалось выполнить функцию, Ложь – произошла ошибка +// +Функция ВыполнитьДействияПередОбработкойСообщения() Экспорт + + ИнициализацияСообщений(); + + Возврат СоздатьВременныйКаталогСообщенийОбмена(); + +КонецФункции + +// Выполняет отправку сообщения обмена на заданный ресурс из временного каталога сообщения обмена +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина – удалось выполнить функцию, Ложь – произошла ошибка +// +Функция ОтправитьСообщение() Экспорт + + ИнициализацияСообщений(); + + Попытка + Результат = ОтправитьСообщениеОбмена(); + Исключение + Результат = Ложь; + КонецПопытки; + + Возврат Результат; + +КонецФункции + +// Получает сообщение обмена с заданного ресурса во временный каталог сообщения обмена +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина – удалось выполнить функцию, Ложь – произошла ошибка +// +Функция ПолучитьСообщение() Экспорт + + ИнициализацияСообщений(); + + Попытка + Результат = ПолучитьСообщениеОбмена(); + Исключение + Результат = Ложь; + КонецПопытки; + + Возврат Результат; +КонецФункции + +// Удаляет временный каталог сообщений обмена после выполнения выгрузки или загрузки данных +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина +// +Функция ВыполнитьДействияПослеОбработкиСообщения() Экспорт + + ИнициализацияСообщений(); + + УдалитьВременныйКаталогСообщенийОбмена(); + + Возврат Истина; + +КонецФункции + +// Выполняет проверку наличия сообщения обмена на заданном ресурсе +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина - сообщение обмена присутствует на заданном ресурсе; Лож – нет +// +Функция ФайлСообщенияОбменаСуществует() Экспорт + + Возврат (НайтиФайлы(ИмяКаталогаОбменаИнформацией(), ШаблонИмениФайлаСообщения + ".*", Ложь).Количество() > 0); + +КонецФункции + +// Инициализация + +// Выполняет инициализацию свойств обработки начальными значениями и константами +// +// Параметры: +// Нет. +// +Процедура Инициализация() Экспорт + + мКаталогОбменаИнформацией = Новый Файл(FILEКаталогОбменаИнформацией); + +КонецПроцедуры + +// ПРОВЕРКА ПОДКЛЮЧЕНИЯ + +// Выполняет проверку возможности установки подключения к заданному ресурсу +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево – Истина – подключение может быть установлено; Ложь – нет +// +Функция ПодключениеУстановлено() Экспорт + + ИнициализацияСообщений(); + + Если ПустаяСтрока(FILEКаталогОбменаИнформацией) Тогда + + ПолучитьСообщениеОбОшибке(1); + Возврат Ложь; + + ИначеЕсли Не мКаталогОбменаИнформацией.Существует() Тогда + + ПолучитьСообщениеОбОшибке(2); + Возврат Ложь; + + ИначеЕсли Не СоздатьФайлПроверки() Тогда + + ПолучитьСообщениеОбОшибке(8); + Возврат Ложь; + + ИначеЕсли Не УдалитьФайлПроверки() Тогда + + ПолучитьСообщениеОбОшибке(9); + Возврат Ложь; + + КонецЕсли; + + Возврат Истина; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////// +// СВОЙСТВА ОБРАБОТКИ + +// Функция-свойство: полное имя файла сообщения обмена +// +// Тип: Строка +// +Функция ИмяФайлаСообщенияОбмена() Экспорт + + Имя = ""; + + Если ТипЗнч(мВременныйФайлСообщенияОбмена) = Тип("Файл") Тогда + + Имя = мВременныйФайлСообщенияОбмена.ПолноеИмя; + + КонецЕсли; + + Возврат Имя; + +КонецФункции + +// Функция-свойство: полное имя каталога сообщения обмена +// +// Тип: Строка +// +Функция ИмяКаталогаСообщенияОбмена() Экспорт + + Имя = ""; + + Если ТипЗнч(мВременныйКаталогСообщенийОбмена) = Тип("Файл") Тогда + + Имя = мВременныйКаталогСообщенийОбмена.ПолноеИмя; + + КонецЕсли; + + Возврат Имя; + +КонецФункции + +// Функция-свойство: полное имя каталога обмена информацией (сетевой или локальный ресурс) +// +// Тип: Строка +// +Функция ИмяКаталогаОбменаИнформацией() Экспорт + + Имя = ""; + + Если ТипЗнч(мКаталогОбменаИнформацией) = Тип("Файл") Тогда + + Имя = мКаталогОбменаИнформацией.ПолноеИмя; + + КонецЕсли; + + Возврат Имя; + +КонецФункции + +// Функция-свойство: время изменения файла сообщения обмена +// +// Тип: Дата +// +Функция ДатаФайлаСообщенияОбмена() Экспорт + + Результат = Неопределено; + + Если ТипЗнч(мВременныйФайлСообщенияОбмена) = Тип("Файл") Тогда + + Если мВременныйФайлСообщенияОбмена.Существует() Тогда + + Результат = мВременныйФайлСообщенияОбмена.ПолучитьВремяИзменения(); + + КонецЕсли; + + КонецЕсли; + + Возврат Результат; +КонецФункции + +// + +Функция СжиматьФайлИсходящегоСообщения() + + Возврат FILEСжиматьФайлИсходящегоСообщения; + +КонецФункции + +Функция ИмяВременногоФайлаФлага() + + Возврат "flag.tmp"; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +Функция СоздатьВременныйКаталогСообщенийОбмена() + + ИмяВременногоКаталога = ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(КаталогВременныхФайлов(), ОбменДаннымиСервер.ИмяВременногоКаталогаСообщенийОбмена()); + + мВременныйКаталогСообщенийОбмена = Новый Файл(ИмяВременногоКаталога); + + // создаем временный каталог для сообщений обмена + Попытка + СоздатьКаталог(ИмяКаталогаСообщенияОбмена()); + Исключение + ПолучитьСообщениеОбОшибке(6); + ДополнитьСообщениеОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат Ложь; + КонецПопытки; + + ИмяФайлаСообщения = ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(ИмяКаталогаСообщенияОбмена(), ШаблонИмениФайлаСообщения + ".xml"); + + мВременныйФайлСообщенияОбмена = Новый Файл(ИмяФайлаСообщения); + + Возврат Истина; +КонецФункции + +Функция УдалитьВременныйКаталогСообщенийОбмена() + + Попытка + + Если Не ПустаяСтрока(ИмяКаталогаСообщенияОбмена()) Тогда + + УдалитьФайлы(ИмяКаталогаСообщенияОбмена()); + + мВременныйКаталогСообщенийОбмена = Неопределено; + + КонецЕсли; + + Исключение + Возврат Ложь; + КонецПопытки; + + Возврат Истина; +КонецФункции + +Функция ОтправитьСообщениеОбмена() + + Результат = Истина; + + Расширение = ?(СжиматьФайлИсходящегоСообщения(), "zip", "xml"); + + ИмяФайлаИсходящегоСообщения = ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(ИмяКаталогаОбменаИнформацией(), ШаблонИмениФайлаСообщения + "." + Расширение); + + Если СжиматьФайлИсходящегоСообщения() Тогда + + // получаем имя для временного файла архива + ИмяВременногоФайлаАрхива = ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(ИмяКаталогаСообщенияОбмена(), ШаблонИмениФайлаСообщения + ".zip"); + + Попытка + + Архиватор = Новый ЗаписьZipФайла(ИмяВременногоФайлаАрхива, ПарольАрхиваСообщенияОбмена, "Файл сообщения обмена"); + Архиватор.Добавить(ИмяФайлаСообщенияОбмена()); + Архиватор.Записать(); + + Исключение + Результат = Ложь; + ПолучитьСообщениеОбОшибке(5); + ДополнитьСообщениеОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Архиватор = Неопределено; + + Если Результат Тогда + + // копируем файл архива в каталог обмена информацией + Если Не ВыполнитьКопированиеФайла(ИмяВременногоФайлаАрхива, ИмяФайлаИсходящегоСообщения) Тогда + Результат = Ложь; + КонецЕсли; + + КонецЕсли; + + Иначе + + // копируем файл сообщения в каталог обмена информацией + Если Не ВыполнитьКопированиеФайла(ИмяФайлаСообщенияОбмена(), ИмяФайлаИсходящегоСообщения) Тогда + Результат = Ложь; + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьСообщениеОбмена() + + ТаблицаФайловСообщенийОбмена = Новый ТаблицаЗначений; + ТаблицаФайловСообщенийОбмена.Колонки.Добавить("Файл", Новый ОписаниеТипов("Файл")); + ТаблицаФайловСообщенийОбмена.Колонки.Добавить("ВремяИзменения"); + + МассивНайденныхФайлов = НайтиФайлы(ИмяКаталогаОбменаИнформацией(), ШаблонИмениФайлаСообщения + ".*", Ложь); + + Для Каждого ТекущийФайл ИЗ МассивНайденныхФайлов Цикл + + // проверяем нужное расширение + Если ((ВРег(ТекущийФайл.Расширение) <> ".ZIP") + И (ВРег(ТекущийФайл.Расширение) <> ".XML")) Тогда + + Продолжить; + + // проверяем что это файл, а не каталог + ИначеЕсли (ТекущийФайл.ЭтоФайл() = Ложь) Тогда + + Продолжить; + + // проверяем ненулевой размер файла + ИначеЕсли (ТекущийФайл.Размер() = 0) Тогда + + Продолжить; + + КонецЕсли; + + // файл является требуемым сообщением обмена; добавляем его в таблицу + СтрокаТаблицы = ТаблицаФайловСообщенийОбмена.Добавить(); + СтрокаТаблицы.Файл = ТекущийФайл; + СтрокаТаблицы.ВремяИзменения = ТекущийФайл.ПолучитьВремяИзменения(); + + КонецЦикла; + + Если ТаблицаФайловСообщенийОбмена.Количество() = 0 Тогда + + ПолучитьСообщениеОбОшибке(3); + + СтрокаСообщения = НСтр("ru = 'Каталог обмена информацией: ""[КаталогОбменаИнформацией]""'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[КаталогОбменаИнформацией]", ИмяКаталогаОбменаИнформацией()); + ДополнитьСообщениеОбОшибке(СтрокаСообщения); + + СтрокаСообщения = НСтр("ru = 'Имя файла сообщения обмена: ""[ШаблонИмениФайлаСообщения]""'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ШаблонИмениФайлаСообщения]", ШаблонИмениФайлаСообщения + ".[xml|zip]"); + ДополнитьСообщениеОбОшибке(СтрокаСообщения); + + Возврат Ложь; + + Иначе + + ТаблицаФайловСообщенийОбмена.Сортировать("ВремяИзменения Убыв"); + + // получаем из таблицы самый "свежий" файл сообщения обмена + ФайлВходящегоСообщения = ТаблицаФайловСообщенийОбмена[0].Файл; + + ФайлЗапакован = (ВРег(ФайлВходящегоСообщения.Расширение) = ".ZIP"); + + Если ФайлЗапакован Тогда + + // получаем имя для временного файла архива + ИмяВременногоФайлаАрхива = ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(ИмяКаталогаСообщенияОбмена(), ШаблонИмениФайлаСообщения + ".zip"); + + // копируем файл архива из сетевого каталога во временный + Если Не ВыполнитьКопированиеФайла(ФайлВходящегоСообщения.ПолноеИмя, ИмяВременногоФайлаАрхива) Тогда + Возврат Ложь; + КонецЕсли; + + // распаковываем временный файл архива + УспешноРаспакованно = ОбменДаннымиСервер.РаспаковатьZipФайл(ИмяВременногоФайлаАрхива, ИмяКаталогаСообщенияОбмена(), ПарольАрхиваСообщенияОбмена); + + Если Не УспешноРаспакованно Тогда + ПолучитьСообщениеОбОшибке(4); + Возврат Ложь; + КонецЕсли; + + // проверка на существование файла сообщения + Файл = Новый Файл(ИмяФайлаСообщенияОбмена()); + + Если Не Файл.Существует() Тогда + + ПолучитьСообщениеОбОшибке(7); + Возврат Ложь; + + КонецЕсли; + + Иначе + + // просто копируем файл входящего сообщения из каталога обмена в каталог временных файлов + Если Не ВыполнитьКопированиеФайла(ФайлВходящегоСообщения.ПолноеИмя, ИмяФайлаСообщенияОбмена()) Тогда + + Возврат Ложь; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Возврат Истина; +КонецФункции + +Функция СоздатьФайлПроверки() + + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.ДобавитьСтроку(НСтр("ru = 'Временный файл проверки'")); + + Попытка + + ТекстовыйДокумент.Записать(ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(ИмяКаталогаОбменаИнформацией(), ИмяВременногоФайлаФлага())); + + Исключение + Возврат Ложь; + КонецПопытки; + + Возврат Истина; +КонецФункции + +Функция УдалитьФайлПроверки() + + Попытка + + УдалитьФайлы(ИмяКаталогаОбменаИнформацией(), ИмяВременногоФайлаФлага()); + + Исключение + Возврат Ложь; + КонецПопытки; + + Возврат Истина; +КонецФункции + +// выполняет копирование файла +Функция ВыполнитьКопированиеФайла(Знач ИмяФайлаИсточника, Знач ИмяФайлаПриемника) + + Попытка + + КопироватьФайл(ИмяФайлаИсточника, ИмяФайлаПриемника); + + Исключение + + СтрокаСообщения = НСтр("ru = 'Ошибка при копировании файла из [ИмяФайлаИсточника] в [ИмяФайлаПриемника]. Описание ошибки: [ОписаниеОшибки]"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ИмяФайлаИсточника]", ИмяФайлаИсточника); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ИмяФайлаПриемника]", ИмяФайлаПриемника); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ОписаниеОшибки]", КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + УстановитьСтрокуСообщенияОбОшибке(СтрокаСообщения); + + Возврат Ложь + + КонецПопытки; + + Возврат Истина; + +КонецФункции + +Процедура ПолучитьСообщениеОбОшибке(НомерСообщения) + + УстановитьСтрокуСообщенияОбОшибке(мСообщенияОшибок[НомерСообщения]) + +КонецПроцедуры + +Процедура УстановитьСтрокуСообщенияОбОшибке(Знач Сообщение) + + Если Сообщение = Неопределено Тогда + Сообщение = "Внутренняя ошибка"; + КонецЕсли; + + СтрокаСообщенияОбОшибке = Сообщение; + СтрокаСообщенияОбОшибкеЖР = мИмяОбъекта + ": " + Сообщение; + +КонецПроцедуры + +Процедура ДополнитьСообщениеОбОшибке(Сообщение) + + СтрокаСообщенияОбОшибке = СтрокаСообщенияОбОшибке + Символы.ПС + Сообщение; + СтрокаСообщенияОбОшибкеЖР = СтрокаСообщенияОбОшибкеЖР + Символы.ПС + Сообщение; + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ИНИЦИАЛИЗАЦИИ + +Процедура ИнициализацияСообщений() + + СтрокаСообщенияОбОшибке = ""; + СтрокаСообщенияОбОшибкеЖР = ""; + +КонецПроцедуры + +Процедура ИнициализацияСообщенийОшибок() + + мСообщенияОшибок = Новый Соответствие; + мСообщенияОшибок.Вставить(1, НСтр("ru = 'Ошибка подключения: Не указан каталог обмена информацией!'")); + мСообщенияОшибок.Вставить(2, НСтр("ru = 'Ошибка подключения: Каталог обмена информацией не существует!'")); + + мСообщенияОшибок.Вставить(3, НСтр("ru = 'В каталоге обмена информацией не был обнаружен файл сообщения с данными.'")); + мСообщенияОшибок.Вставить(4, НСтр("ru = 'Ошибка при распаковке сжатого файла сообщения.'")); + мСообщенияОшибок.Вставить(5, НСтр("ru = 'Ошибка при сжатии файла сообщения обмена.'")); + мСообщенияОшибок.Вставить(6, НСтр("ru = 'Ошибка при создании временного каталога'")); + мСообщенияОшибок.Вставить(7, НСтр("ru = 'Архив не содержит файл сообщения обмена'")); + + мСообщенияОшибок.Вставить(8, НСтр("ru = 'Ошибка записи файла в каталог обмена информацией. Проверьте права пользователя на доступ к каталогу.'")); + мСообщенияОшибок.Вставить(9, НСтр("ru = 'Ошибка удаления файла из каталога обмена информацией. Проверьте права пользователя на доступ к каталогу.'")); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////// +// ИНИЦИАЛИЗАЦИЯ + +ИнициализацияСообщений(); +ИнициализацияСообщенийОшибок(); + +мВременныйКаталогСообщенийОбмена = Неопределено; +мВременныйФайлСообщенияОбмена = Неопределено; + +мИмяОбъекта = НСтр("ru = 'Обработка: [ИмяОбработки]'"); +мИмяОбъекта = СтрЗаменить(мИмяОбъекта, "[ИмяОбработки]", Метаданные().Имя); \ No newline at end of file diff --git a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ТранспортСообщенийОбменаFILE.mdo b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ТранспортСообщенийОбменаFILE.mdo new file mode 100644 index 000000000..5f0f3318f --- /dev/null +++ b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFILE/ТранспортСообщенийОбменаFILE.mdo @@ -0,0 +1,63 @@ + + + + + + + ТранспортСообщенийОбменаFILE + + ru + Обработка транспорта сообщения обмена через общий сетевой ресурс + + + FILEКаталогОбменаИнформацией + + ru + Каталог обмена информацией + + + String + + + + + + + FILEСжиматьФайлИсходящегоСообщения + + ru + Сжимать файл исходящего сообщения + + + Boolean + + + + + + ПарольАрхиваСообщенияОбмена + + ru + Пароль архива сообщения обмена + + + String + + + + + + + ШаблонИмениФайлаСообщения + + ru + Шаблон имени файла сообщения + + + String + + + + + + diff --git a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ManagerModule.bsl b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ObjectModule.bsl b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ObjectModule.bsl new file mode 100644 index 000000000..70a217bb3 --- /dev/null +++ b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ObjectModule.bsl @@ -0,0 +1,655 @@ +/////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ ЭКСПОРТНЫЕ + +Перем СтрокаСообщенияОбОшибке Экспорт; +Перем СтрокаСообщенияОбОшибкеЖР Экспорт; + +/////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ МОДУЛЯ + +Перем мСообщенияОшибок; // соответствие с предопределенными сообщениями ошибок обработки +Перем мИмяОбъекта; // имя объекта метаданных +Перем мИмяСервера; // Адрес FTP сервера - имя или ip адрес +Перем мКаталогНаСервере;// Каталог на сервере, для хранения/получения сообщений обмена + +Перем мВременныйФайлСообщенияОбмена; // временный файл сообщения обмена для выгрузки/загрузки данных +Перем мВременныйКаталогСообщенийОбмена; // временный каталог для сообщений обмена + +/////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Создает временный каталог в каталоге временных файлов пользователя операционной системы. +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина – удалось выполнить функцию, Ложь – произошла ошибка +// +Функция ВыполнитьДействияПередОбработкойСообщения() Экспорт + + ИнициализацияСообщений(); + + Возврат СоздатьВременныйКаталогСообщенийОбмена(); + +КонецФункции + +// Выполняет отправку сообщения обмена на заданный ресурс из временного каталога сообщения обмена +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина – удалось выполнить функцию, Ложь – произошла ошибка +// +Функция ОтправитьСообщение() Экспорт + + ИнициализацияСообщений(); + + Попытка + Результат = ОтправитьСообщениеОбмена(); + Исключение + Результат = Ложь; + КонецПопытки; + + Возврат Результат; + +КонецФункции + +// Получает сообщение обмена с заданного ресурса во временный каталог сообщения обмена +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина – удалось выполнить функцию, Ложь – произошла ошибка +// +Функция ПолучитьСообщение() Экспорт + + ИнициализацияСообщений(); + + Попытка + Результат = ПолучитьСообщениеОбмена(); + Исключение + Результат = Ложь; + КонецПопытки; + + Возврат Результат; + +КонецФункции + +// Удаляет временный каталог сообщений обмена после выполнения выгрузки или загрузки данных +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина +// +Функция ВыполнитьДействияПослеОбработкиСообщения() Экспорт + + ИнициализацияСообщений(); + + УдалитьВременныйКаталогСообщенийОбмена(); + + Возврат Истина; + +КонецФункции + +// Выполняет проверку наличия сообщения обмена на заданном ресурсе +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево - Истина - сообщение обмена присутствует на заданном ресурсе; Лож – нет +// +Функция ФайлСообщенияОбменаСуществует() Экспорт + + ИнициализацияСообщений(); + + Попытка + FTPСоединение = ПолучитьFTPСоединение(); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(102); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + Попытка + МассивНайденныхФайлов = FTPСоединение.НайтиФайлы(мКаталогНаСервере, ШаблонИмениФайлаСообщения + ".*", Ложь); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(104); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + Возврат МассивНайденныхФайлов.Количество() > 0; + +КонецФункции + +// Инициализация + +// Выполняет инициализацию свойств обработки начальными значениями и константами +// +// Параметры: +// Нет. +// +Процедура Инициализация() Экспорт + + ИнициализацияСообщений(); + + ИмяСервераИКаталогНаСервере = РазделитьFTPРесурсНаСерверИКаталог(СокрЛП(FTPСоединениеПуть)); + мИмяСервера = ИмяСервераИКаталогНаСервере.ИмяСервера; + мКаталогНаСервере = ИмяСервераИКаталогНаСервере.ИмяКаталога; + +КонецПроцедуры + +// ПРОВЕРКА ПОДКЛЮЧЕНИЯ + +// Выполняет проверку возможности установки подключения к заданному ресурсу +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Булево – Истина – подключение может быть установлено; Ложь – нет +// +Функция ПодключениеУстановлено() Экспорт + + ИнициализацияСообщений(); + + Если ПустаяСтрока(FTPСоединениеПуть) + ИЛИ FTPСоединениеПорт = 0 + ИЛИ ПустаяСтрока(FTPСоединениеПользователь) Тогда + + ПолучитьСообщениеОбОшибке(101); + Возврат Ложь; + + КонецЕсли; + + Попытка + ПолучитьFTPСоединение(); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(102); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + Возврат Истина; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////// +// СВОЙСТВА ОБРАБОТКИ + +// Функция-свойство: время изменения файла сообщения обмена +// +// Тип: Дата +// +Функция ДатаФайлаСообщенияОбмена() Экспорт + + Результат = Неопределено; + + Если ТипЗнч(мВременныйФайлСообщенияОбмена) = Тип("Файл") Тогда + + Если мВременныйФайлСообщенияОбмена.Существует() Тогда + + Результат = мВременныйФайлСообщенияОбмена.ПолучитьВремяИзменения(); + + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Функция-свойство: полное имя файла сообщения обмена +// +// Тип: Строка +// +Функция ИмяФайлаСообщенияОбмена() Экспорт + + Имя = ""; + + Если ТипЗнч(мВременныйФайлСообщенияОбмена) = Тип("Файл") Тогда + + Имя = мВременныйФайлСообщенияОбмена.ПолноеИмя; + + КонецЕсли; + + Возврат Имя; + +КонецФункции + +// Функция-свойство: полное имя каталога сообщения обмена +// +// Тип: Строка +// +Функция ИмяКаталогаСообщенияОбмена() Экспорт + + Имя = ""; + + Если ТипЗнч(мВременныйКаталогСообщенийОбмена) = Тип("Файл") Тогда + + Имя = мВременныйКаталогСообщенийОбмена.ПолноеИмя; + + КонецЕсли; + + Возврат Имя; + +КонецФункции + +// + +Функция СжиматьФайлИсходящегоСообщения() + + Возврат FTPСжиматьФайлИсходящегоСообщения; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +Функция СоздатьВременныйКаталогСообщенийОбмена() + + мВременныйКаталогСообщенийОбмена = Новый Файл(ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(КаталогВременныхФайлов(), ОбменДаннымиСервер.ИмяВременногоКаталогаСообщенийОбмена())); + + // создаем временный каталог для сообщений обмена + Попытка + СоздатьКаталог(ИмяКаталогаСообщенияОбмена()); + Исключение + ПолучитьСообщениеОбОшибке(4); + ДополнитьСообщениеОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат Ложь; + КонецПопытки; + + ИмяФайлаСообщения = ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(ИмяКаталогаСообщенияОбмена(), ШаблонИмениФайлаСообщения + ".xml"); + + мВременныйФайлСообщенияОбмена = Новый Файл(ИмяФайлаСообщения); + + Возврат Истина; + +КонецФункции + +Функция УдалитьВременныйКаталогСообщенийОбмена() + + Попытка + Если Не ПустаяСтрока(ИмяКаталогаСообщенияОбмена()) Тогда + УдалитьФайлы(ИмяКаталогаСообщенияОбмена()); + мВременныйКаталогСообщенийОбмена = Неопределено; + КонецЕсли; + Исключение + Возврат Ложь; + КонецПопытки; + + Возврат Истина; + +КонецФункции + +Функция ОтправитьСообщениеОбмена() + + Результат = Истина; + + Расширение = ?(СжиматьФайлИсходящегоСообщения(), ".zip", ".xml"); + + ИмяФайлаИсходящегоСообщения = ШаблонИмениФайлаСообщения + Расширение; + + Если СжиматьФайлИсходящегоСообщения() Тогда + + // получаем имя для временного файла архива + ИмяВременногоФайлаАрхива = ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(ИмяКаталогаСообщенияОбмена(), ШаблонИмениФайлаСообщения + ".zip"); + + Попытка + + Архиватор = Новый ЗаписьZipФайла(ИмяВременногоФайлаАрхива, ПарольАрхиваСообщенияОбмена, "Файл сообщения обмена"); + Архиватор.Добавить(ИмяФайлаСообщенияОбмена()); + Архиватор.Записать(); + + Исключение + + Результат = Ложь; + ПолучитьСообщениеОбОшибке(3); + ДополнитьСообщениеОбОшибке(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + КонецПопытки; + + Архиватор = Неопределено; + + Если Результат Тогда + + // выполняем проверку на максимально допустимый размер сообщения обмена + Если ОбменДаннымиСервер.РазмерСообщенияОбменаПревышаетДопустимый(ИмяВременногоФайлаАрхива, МаксимальныйДопустимыйРазмерСообщения()) Тогда + ПолучитьСообщениеОбОшибке(108); + Результат = Ложь; + КонецЕсли; + + КонецЕсли; + + Если Результат Тогда + + // копируем файл архива на FTP сервер в каталог обмена информацией + Если Не ВыполнитьКопированиеФайлаНаFTPСервер(ИмяВременногоФайлаАрхива, ИмяФайлаИсходящегоСообщения) Тогда + Результат = Ложь; + КонецЕсли; + + КонецЕсли; + + Иначе + + Если Результат Тогда + + // выполняем проверку на максимально допустимый размер сообщения обмена + Если ОбменДаннымиСервер.РазмерСообщенияОбменаПревышаетДопустимый(ИмяФайлаСообщенияОбмена(), МаксимальныйДопустимыйРазмерСообщения()) Тогда + ПолучитьСообщениеОбОшибке(108); + Результат = Ложь; + КонецЕсли; + + КонецЕсли; + + Если Результат Тогда + + // копируем файл архива на FTP сервер в каталог обмена информацией + Если Не ВыполнитьКопированиеФайлаНаFTPСервер(ИмяФайлаСообщенияОбмена(), ИмяФайлаИсходящегоСообщения) Тогда + Результат = Ложь; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьСообщениеОбмена() + + ТаблицаФайловСообщенийОбмена = Новый ТаблицаЗначений; + ТаблицаФайловСообщенийОбмена.Колонки.Добавить("Файл"); + ТаблицаФайловСообщенийОбмена.Колонки.Добавить("ВремяИзменения"); + + Попытка + FTPСоединение = ПолучитьFTPСоединение(); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(102); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + Попытка + МассивНайденныхФайлов = FTPСоединение.НайтиФайлы(мКаталогНаСервере, ШаблонИмениФайлаСообщения + ".*", Ложь); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(104); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + Для Каждого ТекущийФайл ИЗ МассивНайденныхФайлов Цикл + + // проверяем нужное расширение + Если ((ВРег(ТекущийФайл.Расширение) <> ".ZIP") + И (ВРег(ТекущийФайл.Расширение) <> ".XML")) Тогда + + Продолжить; + + // проверяем что это файл, а не каталог + ИначеЕсли (ТекущийФайл.ЭтоФайл() = Ложь) Тогда + + Продолжить; + + // проверяем ненулевой размер файла + ИначеЕсли (ТекущийФайл.Размер() = 0) Тогда + + Продолжить; + + КонецЕсли; + + // файл является требуемым сообщением обмена; добавляем его в таблицу + СтрокаТаблицы = ТаблицаФайловСообщенийОбмена.Добавить(); + СтрокаТаблицы.Файл = ТекущийФайл; + СтрокаТаблицы.ВремяИзменения = ТекущийФайл.ПолучитьВремяИзменения(); + + КонецЦикла; + + Если ТаблицаФайловСообщенийОбмена.Количество() = 0 Тогда + + ПолучитьСообщениеОбОшибке(1); + + СтрокаСообщения = НСтр("ru = 'Каталог обмена информацией на сервере: ""[КаталогОбменаИнформацией]""'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[КаталогОбменаИнформацией]", мКаталогНаСервере); + ДополнитьСообщениеОбОшибке(СтрокаСообщения); + + СтрокаСообщения = НСтр("ru = 'Имя файла сообщения обмена: ""[ШаблонИмениФайлаСообщения]""'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ШаблонИмениФайлаСообщения]", ШаблонИмениФайлаСообщения + ".[xml|zip]"); + ДополнитьСообщениеОбОшибке(СтрокаСообщения); + + Возврат Ложь; + + Иначе + + ТаблицаФайловСообщенийОбмена.Сортировать("ВремяИзменения Убыв"); + + // получаем из таблицы самый "свежий" файл сообщения обмена + ФайлВходящегоСообщения = ТаблицаФайловСообщенийОбмена[0].Файл; + + ФайлЗапакован = (ВРег(ФайлВходящегоСообщения.Расширение) = ".ZIP"); + + Если ФайлЗапакован Тогда + + // получаем имя для временного файла архива + ИмяВременногоФайлаАрхива = ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(ИмяКаталогаСообщенияОбмена(), ШаблонИмениФайлаСообщения + ".zip"); + + Попытка + FTPСоединение.Получить(ФайлВходящегоСообщения.ПолноеИмя, ИмяВременногоФайлаАрхива); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(105); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + // распаковываем временный файл архива + УспешноРаспакованно = ОбменДаннымиСервер.РаспаковатьZipФайл(ИмяВременногоФайлаАрхива, ИмяКаталогаСообщенияОбмена(), ПарольАрхиваСообщенияОбмена); + + Если Не УспешноРаспакованно Тогда + ПолучитьСообщениеОбОшибке(2); + Возврат Ложь; + КонецЕсли; + + // проверка на существование файла сообщения + Файл = Новый Файл(ИмяФайлаСообщенияОбмена()); + + Если Не Файл.Существует() Тогда + + ПолучитьСообщениеОбОшибке(5); + Возврат Ложь; + + КонецЕсли; + + Иначе + Попытка + FTPСоединение.Получить(ФайлВходящегоСообщения.ПолноеИмя, ИмяФайлаСообщенияОбмена()); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(105); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + КонецЕсли; + + КонецЕсли; + + Возврат Истина; + +КонецФункции + +Процедура ПолучитьСообщениеОбОшибке(НомерСообщения) + + УстановитьСтрокуСообщенияОбОшибке(мСообщенияОшибок[НомерСообщения]); + +КонецПроцедуры + +Процедура УстановитьСтрокуСообщенияОбОшибке(Знач Сообщение) + + Если Сообщение = Неопределено Тогда + Сообщение = "Внутренняя ошибка"; + КонецЕсли; + + СтрокаСообщенияОбОшибке = Сообщение; + СтрокаСообщенияОбОшибкеЖР = мИмяОбъекта + ": " + Сообщение; + +КонецПроцедуры + +Процедура ДополнитьСообщениеОбОшибке(Сообщение) + + СтрокаСообщенияОбОшибке = СтрокаСообщенияОбОшибке + Символы.ПС + Сообщение; + СтрокаСообщенияОбОшибкеЖР = СтрокаСообщенияОбОшибкеЖР + Символы.ПС + Сообщение; + +КонецПроцедуры + +// Переопределяемая функция, возвращает максимально допустимый размер +// сообщения, которое может быть отправлено. +// +Функция МаксимальныйДопустимыйРазмерСообщения() + + Возврат FTPСоединениеМаксимальныйДопустимыйРазмерСообщения; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ИНИЦИАЛИЗАЦИИ + +Процедура ИнициализацияСообщений() + + СтрокаСообщенияОбОшибке = ""; + СтрокаСообщенияОбОшибкеЖР = ""; + +КонецПроцедуры + +Процедура ИнициализацияСообщенийОшибок() + + мСообщенияОшибок = Новый Соответствие; + + // Общие коды ошибок + мСообщенияОшибок.Вставить(001, НСтр("ru = 'В каталоге обмена информацией не был обнаружен файл сообщения с данными.'")); + мСообщенияОшибок.Вставить(002, НСтр("ru = 'Ошибка при распаковке сжатого файла сообщения.'")); + мСообщенияОшибок.Вставить(003, НСтр("ru = 'Ошибка при сжатии файла сообщения обмена.'")); + мСообщенияОшибок.Вставить(004, НСтр("ru = 'Ошибка при создании временного каталога'.")); + мСообщенияОшибок.Вставить(005, НСтр("ru = 'Архив не содержит файл сообщения обмена.'")); + + // Коды ошибок, зависящие от вида транспорта + мСообщенияОшибок.Вставить(101, НСтр("ru = 'Ошибка инициализации: не заданы обязательные параметры FTP соединения (путь на сервере, порт, пользователь)!'")); + мСообщенияОшибок.Вставить(102, НСтр("ru = 'Ошибка инициализации подключения к FTP серверу.")); + мСообщенияОшибок.Вставить(103, НСтр("ru = 'Ошибка записи файла на FTP сервере, проверьте права доступа на запись.'")); + мСообщенияОшибок.Вставить(104, НСтр("ru = 'Ошибка при поиске файлов на FTP сервере.'")); + мСообщенияОшибок.Вставить(105, НСтр("ru = 'Ошибка при получении файла с FTP сервера.'")); + + мСообщенияОшибок.Вставить(108, НСтр("ru = 'Превышен допустимый размер сообщения обмена.'")); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ С FTP + +Функция ПолучитьFTPСоединение() + + НастройкаПроксиСервера = ПолучениеФайловИзИнтернета.ПолучитьНастройкиПроксиНаСервере1СПредприятие(); + + Если НастройкаПроксиСервера <> Неопределено Тогда + Прокси = Новый ИнтернетПрокси(); + Прокси.Установить("ftp", НастройкаПроксиСервера["Сервер"], НастройкаПроксиСервера["Порт"]); + Прокси.Пользователь = НастройкаПроксиСервера["Пользователь"]; + Прокси.Пароль = НастройкаПроксиСервера["Пароль"]; + Прокси.НеИспользоватьПроксиДляЛокальныхАдресов + = НастройкаПроксиСервера["НеИспользоватьПроксиДляЛокальныхАдресов"]; + Иначе + Прокси = Неопределено; + КонецЕсли; + + FTPСоединение = Новый FTPСоединение(мИмяСервера, + FTPСоединениеПорт, + FTPСоединениеПользователь, + FTPСоединениеПароль, + Прокси, + FTPСоединениеПассивноеСоединение); + + Возврат FTPСоединение; + +КонецФункции + +Функция ВыполнитьКопированиеФайлаНаFTPСервер(Знач ИмяФайлаИсточника, ИмяФайлаПриемника) + + Перем КаталогНаСервере; + + СерверИКаталогНаСервере = РазделитьFTPРесурсНаСерверИКаталог(СокрЛП(FTPСоединениеПуть)); + КаталогНаСервере = СерверИКаталогНаСервере.ИмяКаталога; + + Попытка + FTPСоединение = ПолучитьFTPСоединение(); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(102); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + Попытка + FTPСоединение.Записать(ИмяФайлаИсточника, КаталогНаСервере + ИмяФайлаПриемника); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ПолучитьСообщениеОбОшибке(103); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + Возврат Истина; + +КонецФункции + +Функция РазделитьFTPРесурсНаСерверИКаталог(знач ПолныйПуть) + + Результат = Новый Структура("ИмяСервера,ИмяКаталога", "", ""); + + Если ВРег(Лев(ПолныйПуть, 6)) = "FTP://" Тогда + ПолныйПуть = Прав(ПолныйПуть, СтрДлина(ПолныйПуть) - 6); + КонецЕсли; + + Позиция = Найти(ПолныйПуть, "/"); + + Если Позиция = 0 Тогда + Результат.ИмяСервера = ПолныйПуть; + Результат.ИмяКаталога = "/"; + Возврат Результат; + КонецЕсли; + + Результат.ИмяСервера = Лев(ПолныйПуть, Позиция - 1); + Результат.ИмяКаталога = Прав(ПолныйПуть, СтрДлина(ПолныйПуть) - Позиция); + + Если Прав(Результат.ИмяКаталога, 1) <> "/" Тогда + Результат.ИмяКаталога = Результат.ИмяКаталога + "/"; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////// +// ИНИЦИАЛИЗАЦИЯ + +ИнициализацияСообщений(); +ИнициализацияСообщенийОшибок(); + +мВременныйКаталогСообщенийОбмена = Неопределено; +мВременныйФайлСообщенияОбмена = Неопределено; + +мИмяСервера = Неопределено; +мКаталогНаСервере = Неопределено; + +мИмяОбъекта = НСтр("ru = 'Обработка: [ИмяОбработки]'"); +мИмяОбъекта = СтрЗаменить(мИмяОбъекта, "[ИмяОбработки]", Метаданные().Имя); \ No newline at end of file diff --git a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ТранспортСообщенийОбменаFTP.mdo b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ТранспортСообщенийОбменаFTP.mdo new file mode 100644 index 000000000..c04ac036d --- /dev/null +++ b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ТранспортСообщенийОбменаFTP.mdo @@ -0,0 +1,139 @@ + + + + + + + ТранспортСообщенийОбменаFTP + + ru + Транспорт сообщений обмена через FTP + + + FTPСжиматьФайлИсходящегоСообщения + + ru + Сжимать файл исходящего сообщения + + + Boolean + + + + + + FTPСоединениеМаксимальныйДопустимыйРазмерСообщения + + ru + Максимальный размер сообщения обмена, КБайт + + + Number + + 10 + true + + + + ru + Максимальный размер отправляемого файла сообщения обмена (КБайт) + + + + + + FTPСоединениеПароль + + ru + Пароль + + + String + + + true + + + + + FTPСоединениеПассивноеСоединение + + ru + Пассивное соединение + + + Boolean + + true + + + + + FTPСоединениеПользователь + + ru + Пользователь (логин) + + + String + + + + + + + FTPСоединениеПорт + + ru + Порт + + + Number + + 5 + true + + + + + + + FTPСоединениеПуть + + ru + Путь к каталогу + + + String + + + + + + + ПарольАрхиваСообщенияОбмена + + ru + Пароль архива сообщения обмена + + + String + + + + + + + ШаблонИмениФайлаСообщения + + ru + Шаблон имени файла сообщения + + + String + + + + + + diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form new file mode 100644 index 000000000..58a892533 --- /dev/null +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form @@ -0,0 +1,1378 @@ + + + + <key>ru</key> + <value>Удаление помеченных объектов</value> + + + СтраницыФормы + 1 + + ВыборРежимаУдаления + 6 + + РежимУдаления + 15 + + <key>ru</key> + <value>Выберите режим удаления</value> + + true + true + + true + + + РежимУдаления + + Top + + OnChange + РежимУдаленияПриИзменении + + + РежимУдаленияРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + РежимУдаленияКонтекстноеМеню + 16 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Автоматическое удаление всех отмеченных объектов + + + Полный + + + + + ru + Выборочное удаление объектов + + + Выборочный + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Выбор режима удаления</value> + + + ru + Выбор режима удаления + + + ВыборРежимаУдаленияРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ПомеченныеНаУдаление + 25 + + СписокПомеченныхНаУдаление + 26 + + <key>ru</key> + <value>Пометьте объекты для удаления</value> + + true + true + + true + + + СписокПомеченныхНаУдаление + + false + Top + + СтрокаСпискаПомеченных + 29 + + Пометка + 30 + true + true + + true + + + СписокПомеченныхНаУдаление.Пометка + + + OnChange + ПометкаПриИзменении + + + ПометкаРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + ПометкаКонтекстноеМеню + 31 + true + + CheckBoxField + Enter + Left + + + + Представление + 32 + true + true + + true + + + СписокПомеченныхНаУдаление.Представление + + + ПредставлениеРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + ПредставлениеКонтекстноеМеню + 33 + true + + InputField + true + Enter + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Строка списка помеченных</value> + + + ru + Строка списка помеченных + + + СтрокаСпискаПомеченныхРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + Top + + СписокПомеченныхНаУдалениеКоманднаяПанель + 28 + + КомандаСписокПомеченныхУстановитьВсе + 37 + true + true + + true + + false + + КомандаСписокПомеченныхУстановитьВсеРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + Form.Command.КомандаСписокПомеченныхУстановитьВсе + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + КомандаСписокПомеченныхСнятьВсе + 38 + true + true + + true + + false + + КомандаСписокПомеченныхСнятьВсеРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + Form.Command.КомандаСписокПомеченныхСнятьВсе + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + Left + + + Selection + СписокПомеченныхНаУдалениеВыбор + + + СписокПомеченныхНаУдалениеСтрокаПоиска + 61 + + СписокПомеченныхНаУдалениеСтрокаПоискаРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + + СписокПомеченныхНаУдалениеСтрокаПоискаКонтекстноеМеню + 62 + true + + СписокПомеченныхНаУдаление + + true + + + + СписокПомеченныхНаУдалениеСостояниеПросмотра + 64 + + СписокПомеченныхНаУдалениеСостояниеПросмотраРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + СписокПомеченныхНаУдалениеСостояниеПросмотраКонтекстноеМеню + 65 + true + + ViewStatusAddition + СписокПомеченныхНаУдаление + + true + + + + СписокПомеченныхНаУдалениеУправлениеПоиском + 67 + + СписокПомеченныхНаУдалениеУправлениеПоискомРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + СписокПомеченныхНаУдалениеУправлениеПоискомКонтекстноеМеню + 68 + true + + SearchControlAddition + СписокПомеченныхНаУдаление + + true + + + + СписокПомеченныхНаУдалениеРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + СписокПомеченныхНаУдалениеКонтекстноеМеню + 27 + true + + Tree + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + + Style.BorderColor + + None + None + None + true + + true + true + + true + + + <key>ru</key> + <value>Помеченные на удаление</value> + + + ru + Помеченные на удаление + + + ПомеченныеНаУдалениеРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ПричиныНеудаления + 39 + + ДеревоНеудаленныхОбъектов + 40 + + <key>ru</key> + <value>Неудаленные объекты</value> + + true + true + + true + + + ДеревоНеудаленныхОбъектов + + false + Top + Add + Change + Copy + CopyToClipboard + EndEdit + HierarchicalList + List + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + Tree + + ПредставлениеНеудаленного + 43 + true + true + + true + + + ДеревоНеудаленныхОбъектов.Представление + + + ПредставлениеНеудаленногоРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + + ПредставлениеНеудаленногоКонтекстноеМеню + 44 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + None + + ДеревоНеудаленныхОбъектовКоманднаяПанель + 42 + Left + true + + + Selection + ДеревоНеудаленныхОбъектовВыбор + + + ДеревоНеудаленныхОбъектовСтрокаПоиска + 85 + + ДеревоНеудаленныхОбъектовСтрокаПоискаРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + + ДеревоНеудаленныхОбъектовСтрокаПоискаКонтекстноеМеню + 86 + true + + ДеревоНеудаленныхОбъектов + + true + + + + ДеревоНеудаленныхОбъектовСостояниеПросмотра + 88 + + ДеревоНеудаленныхОбъектовСостояниеПросмотраРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + ДеревоНеудаленныхОбъектовСостояниеПросмотраКонтекстноеМеню + 89 + true + + ViewStatusAddition + ДеревоНеудаленныхОбъектов + + true + + + + ДеревоНеудаленныхОбъектовУправлениеПоиском + 91 + + ДеревоНеудаленныхОбъектовУправлениеПоискомРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + + ДеревоНеудаленныхОбъектовУправлениеПоискомКонтекстноеМеню + 92 + true + + SearchControlAddition + ДеревоНеудаленныхОбъектов + + true + + + + ДеревоНеудаленныхОбъектовРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + ДеревоНеудаленныхОбъектовКонтекстноеМеню + 41 + true + + Tree + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + + ДеревоНеудаленныхОбъектов.НомерКартинки + + + CommonPicture.КоллекцияДляПомеченныхНаУдалениеОбъектов + + + Style.BorderColor + + None + None + None + true + + true + true + + true + + + <key>ru</key> + <value>Причины неудаления</value> + + + ru + Причины неудаления + + true + + ПричиныНеудаленияРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы формы</value> + + + ru + Страницы формы + + true + + СтраницыФормыРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + Pages + + Auto + + + + КомандыФормы + 2 + + КомандаНазад + 52 + + <key>ru</key> + <value><< Назад</value> + + true + false + + true + + false + + КомандаНазадРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + Form.Command.КомандаНазад + Normal + Auto + true + true + UserCmds + Auto + + + КомандаДалее + 3 + + <key>ru</key> + <value>Далее >></value> + + true + false + + true + + false + + КомандаДалееРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + Form.Command.КомандаДалее + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + КомандаУдалить + 45 + true + true + + true + + false + + КомандаУдалитьРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + Form.Command.КомандаУдалить + PictureAndText + true + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Закрыть + 4 + + <key>ru</key> + <value>Закрыть</value> + + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Справка + 5 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды формы</value> + + + ru + Команды формы + + true + + КомандыФормыРасширеннаяПодсказка + 104 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + LockOwner + true + true + Vertical + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.УдалениеПомеченныхОбъектов + + + true + + + true + +
    true
    +
    + + РежимУдаления + + <key>ru</key> + <value>Режим удаления</value> + + 2 + + String + + + + true + + + true + + + + ПустаяСтрока + + <key>ru</key> + <value>Пустая строка</value> + + 5 + + String + + + + true + + + true + + + + СписокПомеченныхНаУдаление + + <key>ru</key> + <value>Список помеченных на удаление</value> + + 6 + + ValueTree + + + true + + + true + + + Пометка + + <key>ru</key> + <value>Пометка</value> + + 1 + + Boolean + + + true + + + true + + + + Значение + + <key>ru</key> + <value>Значение</value> + + 2 + + String + AnyRef + + 40 + + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Представление</value> + + 3 + + String + + + + true + + + true + + + + + ДеревоНеудаленныхОбъектов + + <key>ru</key> + <value>Дерево неудаленных объектов</value> + + 8 + + ValueTree + + + true + + + true + + + НомерКартинки + + <key>ru</key> + <value>Номер картинки</value> + + 1 + + Number + + 1 + true + + + + true + + + true + + + + Значение + + <key>ru</key> + <value>Значение</value> + + 2 + + String + AnyRef + + 40 + + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Представление</value> + + 3 + + String + + + + true + + + true + + + + + Надпись + + <key>ru</key> + <value>Надпись</value> + + 9 + + String + + + + true + + + true + + + + КоличествоНеудаленныхОбъектов + + <key>ru</key> + <value>Количество неудаленных объектов</value> + + 3 + + Number + + 10 + + + + true + + + true + + + + СтрокаРезультатов + + <key>ru</key> + <value>Строка результатов</value> + + 4 + + String + + + + true + + + true + + + + УдаленныхОбъектов + + <key>ru</key> + <value>Удаленных объектов</value> + + 7 + + Number + + 10 + + + + true + + + true + + + + КоличествоУровнейПомеченныхНаУдаление + + <key>ru</key> + <value>Количество уровней помеченных на удаление</value> + + 10 + + Number + + 10 + + + + true + + + true + + + + КомандаДалее + + <key>ru</key> + <value>Далее</value> + + 1 + + true + + + + ВыполнитьДалее + + + Auto + Auto + + + КомандаСписокПомеченныхУстановитьВсе + + <key>ru</key> + <value>Команда список помеченных установить все</value> + + 2 + + ru + Пометить все объекты на удаление + + + true + + + StdPicture.CheckAll + + + + КомандаСписокПомеченныхУстановитьВсе + + + Auto + Auto + + + КомандаСписокПомеченныхСнятьВсе + + <key>ru</key> + <value>Команда список помеченных снять все</value> + + 3 + + ru + Снять все пометки удаления + + + true + + + StdPicture.UncheckAll + + + + КомандаСписокПомеченныхСнятьВсе + + + 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 new file mode 100644 index 000000000..3383a9ce3 --- /dev/null +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Module.bsl @@ -0,0 +1,430 @@ +/////////////////////////////////////////////////////////////// +// Обработки событий + +// Обработчик события "при создании на сервере" +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + РежимУдаления = "Полный"; +КонецПроцедуры + +// Обработчик события "при изменении" элемента формы РежимУдаления +// +&НаКлиенте +Процедура РежимУдаленияПриИзменении(Элемент) + ДоступностьКнопок(); +КонецПроцедуры + +// Обработчик события "при изменнии" поля "Пометка" +// Вызывает рекурсивную функцию, устанавливающую зависимые флажки пометок +// в родительских и дочерних элементах +// +&НаКлиенте +Процедура ПометкаПриИзменении(Элемент) + + ТекущиеДанные = Элементы.СписокПомеченныхНаУдаление.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + УстановитьПометкуВСписке(ТекущиеДанные, ТекущиеДанные.Пометка, Истина); + +КонецПроцедуры + +// Обработчик нажания на кнопку "установить все" командной панели списка +// дерева СписокПомеченныхНаУдаление. +// Устанавливает пометку всем найденым объектам +// +&НаКлиенте +Процедура КомандаСписокПомеченныхУстановитьВсе() + ЭлементыСписка = СписокПомеченныхНаУдаление.ПолучитьЭлементы(); + Для Каждого Элемент Из ЭлементыСписка Цикл + УстановитьПометкуВСписке(Элемент, Истина, Истина); + Родитель = Элемент.ПолучитьРодителя(); + Если Родитель = Неопределено Тогда + ПроверитьРодителя(Элемент) + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +// Обработчик нажания на кнопку "снять все" командной панели списка +// дерева СписокПомеченныхНаУдаление. +// Снимает пометку у всех найденых объектов +// +&НаКлиенте +Процедура КомандаСписокПомеченныхСнятьВсе() + ЭлементыСписка = СписокПомеченныхНаУдаление.ПолучитьЭлементы(); + Для Каждого Элемент Из ЭлементыСписка Цикл + УстановитьПометкуВСписке(Элемент, Ложь, Истина); + Родитель = Элемент.ПолучитьРодителя(); + Если Родитель = Неопределено Тогда + ПроверитьРодителя(Элемент) + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +// Обработчик события "выбор" строки дерева ДеревоНеудаленныхОбъектов +// Пытается открыть выбранное значение +// +&НаКлиенте +Процедура ДеревоНеудаленныхОбъектовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ТекущиеДанные = Элементы.ДеревоНеудаленныхОбъектов.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено ИЛИ ТипЗнч(ТекущиеДанные.Значение) = Тип("Строка") Тогда + Возврат; + КонецЕсли; + + // это строка отображает объект, из-за которого не удалось удалить помеченный и выбранный + СтандартнаяОбработка = Ложь; + ОткрытьЗначение(ТекущиеДанные.Значение); + +КонецПроцедуры + +// Обработчик события "выбор" строки дерева СписокПомеченныхНаУдаление +// Пытается открыть выбранное значение +// +&НаКлиенте +Процедура СписокПомеченныхНаУдалениеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ТекущиеДанные = Элементы.СписокПомеченныхНаУдаление.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТекущиеДанные.ПолучитьЭлементы().Количество() = 0 Тогда + СтандартнаяОбработка = Ложь; + ОткрытьЗначение(ТекущиеДанные.Значение); + КонецЕсли; + +КонецПроцедуры + +// Обработчик нажатия на кнопку "Далее" командной панели формы +// +&НаКлиенте +Процедура ВыполнитьДалее() + + ТекущаяСтраница = Элементы.СтраницыФормы.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ВыборРежимаУдаления Тогда + Состояние(НСтр("ru = 'Выполняется поиск помеченных на удаление объектов'")); + + ЗаполнениеДереваПомеченныхНаУдаление(); + + Если КоличествоУровнейПомеченныхНаУдаление = 1 Тогда + Для Каждого Элемент Из СписокПомеченныхНаУдаление.ПолучитьЭлементы() Цикл + Идентификатор = Элемент.ПолучитьИдентификатор(); + Элементы.СписокПомеченныхНаУдаление.Развернуть(Идентификатор, Ложь); + КонецЦикла; + КонецЕсли; + + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.ПомеченныеНаУдаление; + ДоступностьКнопок(); + КонецЕсли; + +КонецПроцедуры + +// Обработчик нажатия на кнопку "Назад" командной панели формы +// +&НаКлиенте +Процедура ВыполнитьНазад() + + ТекущаяСтраница = Элементы.СтраницыФормы.ТекущаяСтраница; + Если ТекущаяСтраница = Элементы.ПомеченныеНаУдаление Тогда + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.ВыборРежимаУдаления; + ДоступностьКнопок(); + ИначеЕсли ТекущаяСтраница = Элементы.ПричиныНеудаления Тогда + Если РежимУдаления = "Полный" Тогда + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.ВыборРежимаУдаления; + Иначе + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.ПомеченныеНаУдаление; + КонецЕсли; + ДоступностьКнопок(); + КонецЕсли; + +КонецПроцедуры + +// Обработчик нажатия на кнопку "Удалить" командной панели формы +// +&НаКлиенте +Процедура ВыполнитьУдаление() + + Перем ТипыУдаленныхОбъектов; + + Если РежимУдаления = "Полный" Тогда + Состояние(НСтр("ru = 'Выполняется поиск и удаление помеченных объектов'")); + Иначе + Состояние(НСтр("ru = 'Выполняется удаление выбранных объектов'")); + КонецЕсли; + + СообщениеОбОшибке = ""; + Если УдалениеВыбранныхНаСервере(СообщениеОбОшибке, ТипыУдаленныхОбъектов) Тогда + Для Каждого ТипУдаленногоОбъекта Из ТипыУдаленныхОбъектов Цикл + ОповеститьОбИзменении(ТипУдаленногоОбъекта); + КонецЦикла; + Иначе + Предупреждение(СообщениеОбОшибке); + Возврат; + КонецЕсли; + + ОбновитьДеревоПомеченных = Истина; + Если КоличествоНеудаленныхОбъектов = 0 Тогда + Если УдаленныхОбъектов = 0 Тогда + Текст = НСтр("ru = 'Не помечено на удаление ни одного объекта. Удаление объектов не выполнялось'"); + ОбновитьДеревоПомеченных = Ложь; + Иначе + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Удаление помеченных объектов успешно завершено! + |Удалено объектов: %1.'"), + УдаленныхОбъектов); + КонецЕсли; + Предупреждение(Текст); + Иначе + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.ПричиныНеудаления; + Для Каждого Элемент Из ДеревоНеудаленныхОбъектов.ПолучитьЭлементы() Цикл + Идентификатор = Элемент.ПолучитьИдентификатор(); + Элементы.ДеревоНеудаленныхОбъектов.Развернуть(Идентификатор, Ложь); + КонецЦикла; + ДоступностьКнопок(); + Предупреждение(СтрокаРезультатов); + КонецЕсли; + + Если ОбновитьДеревоПомеченных Тогда + ЗаполнениеДереваПомеченныхНаУдаление(); + + Если КоличествоУровнейПомеченныхНаУдаление = 1 Тогда + Для Каждого Элемент Из СписокПомеченныхНаУдаление.ПолучитьЭлементы() Цикл + Идентификатор = Элемент.ПолучитьИдентификатор(); + Элементы.СписокПомеченныхНаУдаление.Развернуть(Идентификатор, Ложь); + КонецЦикла; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +///////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры + +// Изменяет доступность кнопок на форме в зависимости от +// текущей страницы и состояния реквизитов формы +// +&НаКлиенте +Процедура ДоступностьКнопок() + + ТекущаяСтраница = Элементы.СтраницыФормы.ТекущаяСтраница; + + Если ТекущаяСтраница = Элементы.ВыборРежимаУдаления Тогда + Элементы.КомандаНазад.Доступность = Ложь; + Если РежимУдаления = "Полный" Тогда + Элементы.КомандаДалее.Доступность = Ложь; + Элементы.КомандаУдалить.Доступность = Истина; + ИначеЕсли РежимУдаления = "Выборочный" Тогда + Элементы.КомандаДалее.Доступность = Истина; + Элементы.КомандаУдалить.Доступность = Ложь; + КонецЕсли; + ИначеЕсли ТекущаяСтраница = Элементы.ПомеченныеНаУдаление Тогда + Элементы.КомандаНазад.Доступность = Истина; + Элементы.КомандаДалее.Доступность = Ложь; + Элементы.КомандаУдалить.Доступность = Истина; + ИначеЕсли ТекущаяСтраница = Элементы.ПричиныНеудаления Тогда + Элементы.КомандаНазад.Доступность = Истина; + Элементы.КомандаДалее.Доступность = Ложь; + Элементы.КомандаУдалить.Доступность = Ложь; + КонецЕсли; + +КонецПроцедуры + +// Возвращает веть дерева в ветви СтрокиДерева по значениею Значние +// Если ветвь не найдена - создается новая +// +&НаСервере +Функция НайтиИлиДобавитьВетвьДерева(СтрокиДерева, Значение, Представление, Пометка) + + // Попытка найти существующую ветвь в СтрокиДерева без вложенных + Ветвь = СтрокиДерева.Найти(Значение, "Значение", Ложь); + + Если Ветвь = Неопределено Тогда + // Такой ветки нет, создадим новую + Ветвь = СтрокиДерева.Добавить(); + Ветвь.Значение = Значение; + Ветвь.Представление = Представление; + Ветвь.Пометка = Пометка; + КонецЕсли; + + Возврат Ветвь; + +КонецФункции + +&НаСервере +Функция НайтиИлиДобавитьВетвьДереваСКартинкой(СтрокиДерева, Значение, Представление, НомерКартинки) + // Попытка найти существующую ветвь в СтрокиДерева без вложенных + Ветвь = СтрокиДерева.Найти(Значение, "Значение", Ложь); + Если Ветвь = Неопределено Тогда + // Такой ветки нет, создадим новую + Ветвь = СтрокиДерева.Добавить(); + Ветвь.Значение = Значение; + Ветвь.Представление = Представление; + Ветвь.НомерКартинки = НомерКартинки; + КонецЕсли; + + Возврат Ветвь; +КонецФункции + +// Заполняет дерево объектов помеченных на удаление +// +&НаСервере +Процедура ЗаполнениеДереваПомеченныхНаУдаление() + + // Заполнение дерева помеченных на удаление + ДеревоПомеченных = РеквизитФормыВЗначение("СписокПомеченныхНаУдаление"); + + ДеревоПомеченных.Строки.Очистить(); + + // обработка помеченных + МассивПомеченных = Обработки.УдалениеПомеченныхОбъектов.ПолучитьПомеченныеНаУдаление(); + + Для Каждого МассивПомеченныхЭлемент Из МассивПомеченных Цикл + ОбъектМетаданныхЗначение = МассивПомеченныхЭлемент.Метаданные().ПолноеИмя(); + ОбъектМетаданныхПредставление = МассивПомеченныхЭлемент.Метаданные().Представление(); + СтрокаОбъектаМетаданных = НайтиИлиДобавитьВетвьДерева(ДеревоПомеченных.Строки, ОбъектМетаданныхЗначение, ОбъектМетаданныхПредставление, Истина); + НайтиИлиДобавитьВетвьДерева(СтрокаОбъектаМетаданных.Строки, МассивПомеченныхЭлемент, Строка(МассивПомеченныхЭлемент) + " - " + ОбъектМетаданныхПредставление, Истина); + КонецЦикла; + + ДеревоПомеченных.Строки.Сортировать("Значение", Истина); + + Для Каждого СтрокаОбъектаМетаданных Из ДеревоПомеченных.Строки Цикл + // создать представление для строк, отображающих ветвь объекта метаданных + СтрокаОбъектаМетаданных.Представление = СтрокаОбъектаМетаданных.Представление + " (" + СтрокаОбъектаМетаданных.Строки.Количество() + ")"; + КонецЦикла; + + КоличествоУровнейПомеченныхНаУдаление = ДеревоПомеченных.Строки.Количество(); + + ЗначениеВРеквизитФормы(ДеревоПомеченных, "СписокПомеченныхНаУдаление"); + +КонецПроцедуры + +// Рекурсивная функция, снимающая / устанавливающая пометки +// для зависимых родительских и дочерних элементов +// +&НаКлиенте +Процедура УстановитьПометкуВСписке(Данные, Пометка, ПроверятьРодителя) + + // Устанавливаем подчиненным + ЭлементыСтроки = Данные.ПолучитьЭлементы(); + + Для Каждого Элемент Из ЭлементыСтроки Цикл + Элемент.Пометка = Пометка; + УстановитьПометкуВСписке(Элемент, Пометка, Ложь); + КонецЦикла; + + // Проверяем родителя + Родитель = Данные.ПолучитьРодителя(); + + Если проверятьРодителя И Родитель <> Неопределено Тогда + ПроверитьРодителя(Родитель); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьРодителя(Родитель) + ПометкаРодителя = Истина; + ЭлементыСтроки = Родитель.ПолучитьЭлементы(); + Для Каждого Элемент Из ЭлементыСтроки Цикл + Если Не Элемент.Пометка Тогда + ПометкаРодителя = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + Родитель.Пометка = ПометкаРодителя; +КонецПроцедуры + + +// Производит попытку удаления выбранных объектов +// Объекты, которые не были удалены показываются в отдельной таблице +// +&НаСервере +Функция УдалениеВыбранныхНаСервере(СообщениеОбОшибке, ТипыУдаленныхОбъектов) + + Удаляемые = Новый Массив; + + Если РежимУдаления = "Полный" Тогда + // При полном удалении получаем весь список помеченных на удаление + Удаляемые = Обработки.УдалениеПомеченныхОбъектов.ПолучитьПомеченныеНаУдаление(); + Иначе + // Заполняем массив ссылками на выбранные элементы, помеченные на удаление + КоллекцияСтрокМетаданных = СписокПомеченныхНаУдаление.ПолучитьЭлементы(); + Для Каждого СтрокаОбъектаМетаданных Из КоллекцияСтрокМетаданных Цикл + КоллекцияСтрокСсылок = СтрокаОбъектаМетаданных.ПолучитьЭлементы(); + Для Каждого СтрокаСсылки Из КоллекцияСтрокСсылок Цикл + Если СтрокаСсылки.Пометка Тогда + Удаляемые.Добавить(СтрокаСсылки.Значение); + КонецЕсли; + КонецЦикла; + КонецЦикла; + КонецЕсли; + + КоличествоУдаляемых = Удаляемые.Количество(); + + // Выполняем удаление + Результат = Обработки.УдалениеПомеченныхОбъектов.УдалитьПомеченныеОбъекты(Удаляемые, ТипыУдаленныхОбъектов); + + Если Не Результат.Статус Тогда + СообщениеОбОшибке = Результат.Значение; + Возврат Ложь; + Иначе + Найденные = Результат.Значение; + КонецЕсли; + + // Создадим таблицу неудаленных объектов + ДеревоНеудаленныхОбъектов.ПолучитьЭлементы().Очистить(); + + Дерево = РеквизитФормыВЗначение("ДеревоНеудаленныхОбъектов"); + + Для Каждого Найденный Из Найденные Цикл + Неудаленный = Найденный[0]; + Ссылающийся = Найденный[1]; + ОбъектМетаданныхСсылающегося = Найденный[2].Представление(); + ОбъектМетаданныхНеудаленногоЗначение = Неудаленный.Метаданные().ПолноеИмя(); + ОбъектМетаданныхНеудаленногоПредставление = Неудаленный.Метаданные().Представление(); + //ветвь метаданного + СтрокаОбъектаМетаданных = НайтиИлиДобавитьВетвьДереваСКартинкой(Дерево.Строки, ОбъектМетаданныхНеудаленногоЗначение, ОбъектМетаданныхНеудаленногоПредставление, 0); + //ветвь не удаленного объекта + СтрокаСсылкиНаНеудаленныйОбъектБД = НайтиИлиДобавитьВетвьДереваСКартинкой(СтрокаОбъектаМетаданных.Строки, Неудаленный, Строка(Неудаленный), 2); + //ветвь ссылки на не удаленный объект + НайтиИлиДобавитьВетвьДереваСКартинкой(СтрокаСсылкиНаНеудаленныйОбъектБД.Строки, Ссылающийся, Строка(Ссылающийся) + " - " + ОбъектМетаданныхСсылающегося, 1); + КонецЦикла; + + Дерево.Строки.Сортировать("Значение", Истина); + ЗначениеВРеквизитФормы(Дерево, "ДеревоНеудаленныхОбъектов"); + + // Проверяем завершенность операции удаления + // Посчитаем количество неудаленных, для этого подсчитаем в дереве ветви + // второго уровня, где они и присутствуют + КоличествоНеудаленныхОбъектов = 0; + Для Каждого СтрокаОбъектаМетаданных Из Дерево.Строки Цикл + КоличествоНеудаленныхОбъектов = КоличествоНеудаленныхОбъектов + СтрокаОбъектаМетаданных.Строки.Количество(); + КонецЦикла; + + УдаленныхОбъектов = КоличествоУдаляемых - КоличествоНеудаленныхОбъектов; + Если УдаленныхОбъектов = 0 Тогда + СтрокаРезультатов = НСтр("ru = 'Не удален ни один из объектов, так как в информационной базе существуют ссылки на удаляемые объекты'"); + Иначе + СтрокаРезультатов = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Удаление помеченных объектов завершено! + |Удалено объектов: %1.'"), + Строка(УдаленныхОбъектов)); + КонецЕсли; + Если КоличествоНеудаленныхОбъектов > 0 Тогда + СтрокаРезультатов = СтрокаРезультатов + Символы.ПС + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалено объектов: %1. + |Объекты не удалены для сохранения целостности информационной базы, т.к. на них еще имеются ссылки. + |Нажмите ОК для просмотра списка неудаленных объектов.'"), + Строка(КоличествоНеудаленныхОбъектов)); + КонецЕсли; + + Возврат Истина; + +КонецФункции diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Help/ru.html b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Help/ru.html new file mode 100644 index 000000000..dc3a1b6a5 --- /dev/null +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Help/ru.html @@ -0,0 +1,6 @@ + +

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

    +

    Удаление помеченных ранее объектов можно выполнить двумя способами:

    +
    • "Автоматическое удаление всех объектов" - производится попытка автоматического удаления всех объектов, помеченных на удаление. +
    • "Выборочное удаление объектов" - этот режим позволяет предварительно выбрать объекты для удаления.

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

    +

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

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl new file mode 100644 index 000000000..6176c29c7 --- /dev/null +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl @@ -0,0 +1,130 @@ + +// Возвращает помеченные на удаление объекты. Возможен отбор по фильтру. +// +Функция ПолучитьПомеченныеНаУдаление() Экспорт + + МассивПомеченные = НайтиПомеченныеНаУдаление(); + + Результат = Новый Массив; + Для Каждого ЭлементПомеченный Из МассивПомеченные Цикл + Если ПравоДоступа("ИнтерактивноеУдалениеПомеченных", ЭлементПомеченный.Метаданные()) Тогда + Результат.Добавить(ЭлементПомеченный); + КонецЕсли + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Функция удаления объектов помеченных на удаление +// Параметры: +// Удаляемые - Массив - ссылки на объекты, которые требуется удалить +// ПроверятьСсылочнуюЦелостность - требуется проверка ссылочной целостности +// если Истина, объекты на которые есть ссыки в ИБ +// не будут удалены, а будут возвращены как результат функции +// +// Возвращаемое значение +// таблица значений, характеризующая ссылки на удаляемые объекты +// +Функция УдалитьПомеченныеОбъекты(знач Удаляемые, ТипыУдаленныхОбъектовМассив) Экспорт + + МонопольныйДоступ = Ложь; + + Попытка + Если Не МонопольныйРежим() Тогда + УстановитьМонопольныйРежим(Истина); + КонецЕсли; + МонопольныйДоступ = МонопольныйРежим(); + Исключение + Возврат ЗаполнитьСтатусОперации(НСтр("ru = 'Не удалось установить монопольный режим'"), Ложь); + КонецПопытки; + + ТипыУдаленныхОбъектов = ПолучитьТаблицуТиповУдаляемыхОбъектов(); + ОбновитьТаблицуТиповУдаляемыхОбъектов(ТипыУдаленныхОбъектов, Удаляемые); + + Найденные = Новый ТаблицаЗначений; + Неудаленные = Новый Массив; + + Попытка + УдалитьОбъекты(Удаляемые, Истина, Найденные); + // В таблицу Найденные могли попасть записи об объектах информационной базы, + // связанные с объектами информационной базы, связи с которыми должны фильтроваться + Исключение + СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + УстановитьМонопольныйРежим(Ложь); + Возврат ЗаполнитьСтатусОперации(СообщениеОбОшибке, Ложь); + КонецПопытки; + + Удаляемые = Новый Массив; + ИсключенияПоискаСсылок = ОбщегоНазначенияПереопределяемый.ПолучитьИсключенияПоискаСсылок(); + СвернутыеПоСсылке = Найденные.Скопировать(, "Ссылка"); + СвернутыеПоСсылке.Свернуть("Ссылка"); + СвернутыеПоСсылке = СвернутыеПоСсылке.ВыгрузитьКолонку("Ссылка"); + Для Каждого ЭлементыПоСсылке Из СвернутыеПоСсылке Цикл + СвязиПоСсылке = Найденные.НайтиСтроки(Новый Структура("Ссылка", ЭлементыПоСсылке.Ссылка)); + Для Каждого ЭлементСвязь Из СвязиПоСсылке Цикл + Если ИсключенияПоискаСсылок.Найти(ЭлементСвязь.Метаданные.ПолноеИмя()) <> Неопределено Тогда + Найденные.Удалить(ЭлементСвязь); + КонецЕсли; + КонецЦикла; + Если Найденные.НайтиСтроки(Новый Структура("Ссылка", ЭлементыПоСсылке.Ссылка)).Количество() = 0 Тогда + // Объект имел только фильтруемые связи - удаляем его + Удаляемые.Добавить(ЭлементыПоСсылке.Ссылка); + Иначе + Неудаленные.Добавить(ЭлементыПоСсылке.Ссылка); + КонецЕсли; + КонецЦикла; + + Попытка + // удаление без контроля ссылочной целостности (проконтролировали самостоятельно) + УдалитьОбъекты(Удаляемые, Ложь); + Исключение + СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + УстановитьМонопольныйРежим(Ложь); + Возврат ЗаполнитьСтатусОперации(СообщениеОбОшибке, Ложь); + КонецПопытки; + + Для Каждого НеудаленныйОбъект Из Неудаленные Цикл + НайденныеСтроки = ТипыУдаленныхОбъектов.НайтиСтроки(Новый Структура("Тип", ТипЗнч(НеудаленныйОбъект))); + Если НайденныеСтроки.Количество() > 0 Тогда + ТипыУдаленныхОбъектов.Удалить(НайденныеСтроки[0]); + КонецЕсли; + КонецЦикла; + + ТипыУдаленныхОбъектовМассив = ТипыУдаленныхОбъектов.ВыгрузитьКолонку("Тип"); + + Если МонопольныйДоступ Тогда + УстановитьМонопольныйРежим(Ложь); + КонецЕсли; + + Возврат ЗаполнитьСтатусОперации(Найденные); + +КонецФункции + +Функция ПолучитьТаблицуТиповУдаляемыхОбъектов() + + УдаляемыеТипыОбъектов = Новый ТаблицаЗначений; + УдаляемыеТипыОбъектов.Колонки.Добавить("Тип", Новый ОписаниеТипов("Тип")); + + Возврат УдаляемыеТипыОбъектов; + +КонецФункции + +Процедура ОбновитьТаблицуТиповУдаляемыхОбъектов(Таблица, знач УдаляемыеОбъекты) + + Для Каждого УдаляемыйОбъект Из УдаляемыеОбъекты Цикл + НовыйТип = Таблица.Добавить(); + НовыйТип.Тип = ТипЗнч(УдаляемыйОбъект); + КонецЦикла; + + Таблица.Свернуть("Тип"); + +КонецПроцедуры + +// Возвращает структуру с полями Статус и Значение по переданным параметрам +// +Функция ЗаполнитьСтатусОперации(знач Значение, знач Статус = Истина) + + Возврат Новый Структура("Статус, Значение", Статус, Значение); + +КонецФункции 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/УдалениеПомеченныхОбъектов/УдалениеПомеченныхОбъектов.mdo b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/УдалениеПомеченныхОбъектов.mdo new file mode 100644 index 000000000..a74cd3a4c --- /dev/null +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/УдалениеПомеченныхОбъектов.mdo @@ -0,0 +1,34 @@ + + + + + + + УдалениеПомеченныхОбъектов + + ru + Удаление помеченных объектов + + Поиск и удаление объектов, помеченных на удаление + true + DataProcessor.УдалениеПомеченныхОбъектов.Form.ОсновнаяФорма + + + ru + + + + ru + Поиск и удаление объектов, предварительно помеченных на удаление + + + ОсновнаяФорма + + ru + Удаление помеченных объектов + + true + PersonalComputer + MobileDevice + + diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/Форма/Form.oform b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/Форма/Form.oform new file mode 100644 index 0000000000000000000000000000000000000000..145c6de665bf6b29ab5edc9ca350eccde4862e7d GIT binary patch literal 213234 zcmeFa*>5D-c`qpVQGou00m|hU8O3PEz8KJ8lEtOC7Fpc+auF-{rMMKUcp;1|x$UuA z|Y-#HN(5t)%0$;@O`S9g)cjEFpO z)^Gp5^PT_v&;R`2fAD8NpkMy?qaUjLPjm0_r>?5^oJ9P)_oE+Hzr6n9=9kxB-Mn}G`Mv9}uYZ62<@Kl6U){U@1mAqc&%eBWb?^G)dpCb` z{q@by@b$}^pI?7^Z)1M${!f4O!=H|5t~R3olT`Q9EeMo{#p_`~0FC5oohky z4-X%Pm?xCL6}`dZ;i5D|+@S~e?~f=N{ib!xisdTGDa^0vM>jvm%Fuefy7}Admzr1@ zu3I)ySvNPM0V-PRz#w>esT*Q}bX-s;=mG!mXy_?D7oWJ6Pi;fzvNW)KX-jvxyva{( zDv$bg&-83Z_pA|X#5Tn=rHjMU7u#Nt=vt(BPM|AhVmOLxM}cBHmLL0G9O_{pCYp<5 z@S2>rR&XeSTmRrytS<#Oy$y5$G-%lJpF*FdKk0Wo1t|o$+3fPNTO*pL*{&G1xCzNMH}%V)z@QFRRYg(6-|pw#We#P!*Ny9 zjeOOP5?)*$i9KSOksG6N#kL|Wpc&gr;M>3}TaOY=H^Wd((1BR9Jv|I{#a69AF)hPF zwNXTvXM)(dj%kMiZSG(H6G+wPH-8O!^f4g+{pe{hd6fwbq*gsl-l6WBV^xK@XTl5C~Db0zVngnJNh4p#jJU&hQ++e-Zd+v2Fg< z(!OdpE*s+C_%VI*p9#7eqd)jNw#^s#GoD_gpFjH157SHj9DlrZH9mi}^=!2JKkIOd zeozHpB=U``g~P)Y`roA*dOf_Fzna=QL={^nxXr4dUUaD@eSHzlx>xh4;%X*W1$E}C zLp7z>>0KH~+5I;Uh3QZ2&`Jdt&IMiXRaArTP{j^v*g@&7v>JNl6tB_`UDNmUzg*4! z!uS%JM-@}l+ByT;;T9F8*LB=ek+d2rLqF-DsJwg+Rq!Q2+B9CLa#RIChJWU8t)eRW zpAM9+X^!L%s>pgkctNdG6;zyxQdI!r3}@1T(E`)T;3utuIz=ExMbh<8Tc&4JJ$

    -0$jOskON=jN$8Ofjlpv?>F6+9FMFium-5dYD#8gT+5o zAui6H+dK$z?i4MMMF+lJyhVFZ?>gQbTCZUf&kLsJcX-5V-Pa$HMGJk?g> z&@~hj97pjj!&JgpkBQa!p%I`1Ne~;Z3%M2y(1hp_fhAdBe5wOqF=GjjPzRB1;VoHx7sy3~vmE%EBcCg4$zXkuNs}u=K$3G*1bQ2+}r*5KO6`I?caPUxrv%!84yK7fq%4P>h?Sm*fp%`a=nS5@!i z<*U{*?d7Zf%hi>ygeHxN1Id!Y-5?ql^4dsZTZ!d45TZ3L2KMT%;;V+OSa#(4W@JUa z3r!IkA(R;cpB9-;Z_0F=B$wS*rYq3u9&XBHzK2)SqFt(JOl>yOqE(;Ws+h*ibg8CJ z6jPGqd`@4sHT@HDyr$ViZ<1}o+`?V+hZ@vuhV@GRkVA(ZWUPAs@H2)(dqRX zRdjoO@KxkwIi^ZhUHL_YL86w-0#fIaUF!N9wrzb3E&ke!vW&i#icDK)9E&UX{@D*7`$)1|)r;v5(nQI^tqcg(HmUX68 z3j%2CB-awYGa&f-=H1N1*~^GN!i*H&>~}2S!mVSeWnAk7Fjj6odVv@$K`X@6k_1zT zX%*y3C?=c+6*3R-unq`7H4w8#GE4^9we-JEv!>m0)?gNGowZu_N!goL^In-SiCJqc z$JD9rtO0c&cHDm22__n~8ZA*`!mXeogU>uRX$maF+%XoNZx zIqoHom6{?;z79gkZPFi|yc2A>&)<+Wl6oad5Eaucev%b0mcaK?i>)jGA-z)#-Fs10 zLXHI5ra-=td9r6_{3 zxJG$gNZrxR+=-a!)U#-4*`J0Zsas~nC;BL+ro>kf0KIq zG3tL}_c4V5z}?@WpTFb4fG>n3i7oWSkYrrfKS2v4BUgRF&S&(Hu?PCyU=n+R{v z!H5W=a&iTLi=LuH<~B{)h|Sa%IKtqX5&?b0bht)ktpjo%9o#Ccgcj;+XH$BhQ zZG#w~FJy)#?I-IC?&*g(C4NeEm!4*I)AL;24%JC@7oVqdBF0&+yYw`xo1W+EPUnQ4 z^PChM^*Nt?`^(IeFS%_mrpNyd2zUwowhhy)Wx-zve4nxHxf+z}*WORSN_WxcXQ zojQ!Z>!@mlk(x%%KN8KkyDV51*0()?-!J%+s2YCV7W_X6omf{RCDBd9bJ!H95hbQ# z`H}0!mg$(j1*FAPadCVyn)7`*UZr^7e>@DgI8;HijaB~F*I(YePpJ125g#BP0`-W7 zyt@A4uQH2;To23xFAT{oG&eN241W@iE5MlmtQ4K(f@Ff+s&?->5@_m(=Jf}{4k*8- zrWF2`cu)ny5+hjm?|(aD|A&Q zmV_3lI>{lJLg_s@Lz%un`jF)1nxqd&T{ztA?{N18mXx%O-_yE~xtgF7R)pKX%R`p{ z(~-gnEkSldEOy$9bkIcspSH-*B|i8fhSZrTDi&1x!tG0 z0%OsLVhmSc!5{_SWw^jJzz&Ewe8Fy7MDY$_*G+z@W$uM}j@JNx=#y3jpKpYe!hD@z zgMV(f>w)9JF{q{qSL6A|7_ru1I?UH$I%pO!n*}_)neCRq4J?Tqv5v=0OJ&ZgiCR)4 zBx=bno2E=r2RE)6%@P!9cPlF;iwgXw$UmD_#Xo}ce+v2Sy@EaL`qNB2l~`MWyo9L` z!0D&`HVgqR1Udq8GWqc(iy)w4WKkevLs7(gb(;>r)KaXqgE8=5!9u?jv>Ys!-g|ZZ z`E434SZ=OgLTyM5eJqsnj*g}=P5^64L13`Lv`BNABy#$QvH zLQS*i)FUSVOo_68ZBvFc4Abf&H(O~AmY#=#K078|OSr+O zPUcMcHEXST17j1h$^8K7Bxl{^D!5j>hQY*$&r4zhF}KiH$)6f4*!^NDMifPfVPVf$ z0HkFK$xNWAz#`@%wp9ZgUvwzI2^_MKi5Td_Kop>9`cRI;L^rHdFd+&+3xLlzf_ZRH zT2$N&)G$LZOt{$H=t&yNA4+aplz3pI159^L)hJ=Mypv5+R*R@t1k|K!FG(n59{>O* zQqchzf(w=ET{1oFqC)t%p%}3NSo6Ikjv}g&xflNt>s}(- zOkCL})vA+YpJle~GUrYK#tV?6PhABp%MF6WHFV2Ut#pD@cHUxwtzbO@l-j>V{M;Ui zbVD-(D^jqd3$gF9nkcTW)5fgWu~aqoW0fs4-2k%R?=zz$X1MLOSYVo)`>>{daQ#oL zeE)O=-e?|QI*COLlqMuv=~|{Jw2t3&PgP@ka%EW`Rd=V2v6ZLeYqsNi$Ft!=vet0M z&!#WOr&rf@SI_tNo^EU|uOGM%U#v_tlH-}_%Z1>9{yL(NLq^t=)y^{`BO!I^jRx z7`;04thq><8b@&_C{h_b5E{RZ~D=TG3dz$lr0kYse9j4O~Ugsw&*ZM@GF(iOh?00jDr zn}0-P8$$0W?2ZgQX?24^*xx~0g;%Fwg3Cml6sY(UsQ8YT{|BG~hKgT_r%Xw1fs6pU zs<*ync#5gQkHFK9U?YAHMiMyrd6nf{=N;1$i=hj2z+&)G)wlG-i(i8S}+KxIDGKWd$dv z8`~!*4~`DECQsB@U7g$W<{up_UZ9G_iNm$^2h+CxY*RaU@?_=V)zX96bK~L8!tUCr zH@`UPZ!SEXv&No{%}t%IFOHdOlaH4!N5>Y|_5w#UH&Mmx{`TGz`^oXz{;a;g_k8Bj zqh)LA@xq0>x3O}1Ft&2>LVxNUoX(xTSU4V=jHcH8!?oj;qm9LtiOq+z0S)A2+C7@y zSvXwV+I+sbwLZHOJejgrC$?us8`G=C?$p@U%GylqTs*xz@~5_zr#B{}4R>;8;pz6d zxw8^Ypo&LNPp+Pf`R0*3eg16!!St0kHF`OEVi=F~Gh4kdFIRUO#^m|K<;}U-XZps~ zhPgVwq8B(v z{SZK|+F-+u9!E@3D71hj6()XE5eNngs0g>}#qIuEVB+tAk(@`MVB#)G#nOoSD;QRP z4(dz-&1cX6{}!Kc$+L(1Yau94cSJeNwO(-@KnWR)$yi?cpjN zM8P9NE;>SyoXHu(NN2Pk$a?de>k+z!OR-9@ghlxe(7Ts#1@ZopTT-h!wcZ}0$gtJ| zJ``2-H@U740+!y)hI)jb-uzWPP!O6OcJF=+yC=ET2f^ovuU6OBFU*iZSk^u)p7tg* zQ6EB@T#PKCmNlYdS3Mb5d8S#%$n2UVL}fRU_sJ5ZMf4kd21f;qP%Nrdw9?&_T2+F% zHfvhq3U)*M2rCk8Yp4zN71qy8$*yHJf%b-}eETAJs{J1XEgV)uIk57Jk-sA)81qty zRUu_SzCuOubqCn4`bsp2cXO*wt1mm!erAPX*K;W@TP5*Nu&JjaKD-b1LE z>f!~%MT#^#(0wiP+?X??^`aPybtKc{Cv9TVYm-w%tABO#KF1+Z_#eA&3u^M+w38Pr zvK~PtE_A6$CWcwOiiTy>OLFWs9{8%BlNaR+!~$nK#}Vw6sakS>5)#&xBGn~>w?~{9 zZmUEOk$294%Oi>qS?w4J5>D!l69h?QU;9s{v66mesA}1;iztlc@Syy zPCeMVix>NVx9;7m2YFzM;GEJg02Y}+Uf>{`s}Y0>$QE)4!R3ZrSca#-lj9qPss(T@ z1M-HLqY>bZ9GijS>wteVg5}ZmC=iPTQ!wOqBBGoYhc-paD9chJQ#gAf3 z(Ly9fOH>2gpCW8}z=~S(1ma-Yj9r3VowckinvKkWoMOOprG$wOm%3*}*o|+8$Uhe$ zf2(ggu}k>=I^>iR5MNW2GRKo=rq^L1S-GW7kjGmfM7L5ZS~R7WhJj_v#&PQx>SB(F z5bDyOkFhfl+dr~yRqh9D8A*pXv0D?V0@DH7BcW>{8KAE#iJAa|LIdGOv5EX}n&sP? z8HGCYmDd4hZFnk^cDUS!O4@sCHxGkt-V`LhLzKYleZMZi3S}MYQ{W_lnixtPgpdME z$iBXdJz5FKa1thl;V0M;)(gR{pDLR5*}5tp8Bh@FSx0DLE5v<}F$xvwB1KT8q*7yy z_>jKE(wm*QI;D}Uqp^avx26)Rg{yKjZ9uU-^0XaMo44Z}eE3;>V_2U}c4XVH(8mej8&r8*>**G!{T^XvmD=#%*yVW{M3g2RbPi*zGZ zxo1mR~K|f(oYnsAoSxPbX15y~UH-xr)FmTd5rDATaP<-qj z!aMCl@sT#!);t{%{91?*LOV_r&%hxVkdZyx1!N#qdD<8%xjT!yh?4JkdJV5a=TLkN z+ow$!k!S+?jmA!`{#vGFWKV_>hEJ=FUb9p-n5f>WnBsJOK~sbehdy=JekV=YPM<_@ zfOO*b`@mkJP{4gbhDjvv5VDO`L;?*eN*E+3`7T28qg87RA^F=A3r|k>4g2Bzi={Jl zCh&GPkDfQy)*Nqr%=V343dtWcMt2rQUpzF{^po>_ee7)h>g;U%@w3rQXXC->M7TPW zOddC^bHhlCLw)9QZFc``V$V3(URYn>Ux>$0#qOCA%|Nw&WUeorou91Cht|0rMVraq zlex>Ysl~?n=Jx*Cg?YHNdOrXB@^W?~iAP`TOfNiITlW2vSyXYg`s8eLcXh*Cx?0-y zM_1MkpV^NuAFQ1`2+T)gPH?jAJg~Q)Z|}U=T0L5se}23dUg*!}Cma6R`jj_2i7M9C zmQFV}j>720jI;e{cW!g^xY19zeKS;*R&OwfSjbG9+cKHL27ls+fkI?GX`kOCV76_k z4FZ;@l@<($CoKW#!t6B}j0Ln;Gez9fq2Nqa~Ow-XD{x zK$gLdaR7wavT=W0K3%|5qMH= zy>a7s)NmdI_Gq%Wu?_aVa5*}6VC;-;Jb3V6&RVok#o6rTnLc?n{_y1ZVEcSMoL*T= zF2}akkFFk1+Vk4M)R7l1JUh|WmkyqvY#Pq_#Mx+MAHZ_5G3SK(Dyj%(E^IR%pZB*x z239@mnRTK)ID4|-Uv7?BC&}5-=wh&!jICZSKG~Q*nP|M&+fwB?EMLo-}@ zzH^RU1WOAPwI4k*=60v&pPnYWOTqH0<1B6MZyZe~?)2#1`ed~B_~FyZ^UclG`TgCQ zsrBavJCB$5m$udOvH6SV%O{V{QN`q``t}qa%?ZLC<3FC0=>G9^w`NGEf#O%4Yf+}`BeI*FB6>D5Xo>vloy3=*m7>divndL=~%-*n`wKd>UM7 z*8bJO>En%uqvsoEtEY3*vr8K*Ti*8J^RcN}zpUEX~Be6+E%tX@ro&o`{2r>ehxsz&D2gJ;u^x>L#)B!gFvLShK$1>6fU zRjL7osfP&;j!`tjgjr3e15W(JgRf0f4IK60!TU#e%7`OT2e+Ak%W4G9$9wC;Xh5EL zd!`h@TI1Cqy^#$M@tE>-H_D%eyO$!Mf}elfEpn}%zQB=d?ezuIw)D`9L&TxrSVGfB z^0mOladj~S1Dv!6E2$f%@+8*rdwl`A`CaJ?tmUw-XW|?~*s%>I2}2i$H@S%dmpUbo z@{+*Nec!YL!a5FXDs0=$X#li*B&_OW9D(G)e>B~;Yz=Wo_*ODj6e)Q2Z~4`?Y)c+te!s$hHKo~r~ zIL``uphDNdd6xzbrKH;M+f8VQR=p?V$McsD7dL|EGv|%Q$&-`#xvo9iTse7>_|K;w zsEyI{-E}aBi-+rWBYt$ySRQQ{Cx_mV{a|4;-Zmb-*gC$#Hr?a#EA_#XFu7cv*t%L? z*G`{aG^U@89y;FTs_Lw6ql(d4eQ9~=WPR;{w>i0ee7yJKaOY}g=5li1J>ED^)^@Dz z^}T&#dUNWTI`eq_AUZsod~xDBjBl}CJG&QM?2ShYTYT!}PLNzq9av*q7kiJ+cMq4QB0IP;E)vsx zwCIg)T&!+wP0p$Ij_sWuEnPLtU2S`PALo{BZ*4VROq@IdTrY2qt}XcX!GXW8ot%xW zEvx%mXI?z|eB*F;{mJ|k&RvXV7a#8L@7h<>i}Q~g>eb=n1#8rro7Tc7lh0Abi~Z@d z!-JiPEzMh9RU3~ir(=&cFQcc2mrnqF%E6ugx^h)B}5A^6B#F(u19&2hTk18TDe?eZ033EpA>;o7#($gM}BP zvq$?2d*LW@nm8vH&iTs3dc3@|6YY+z?>t(Iqt(sLv2}NC<9L1QC^1mQ$((;SHL6WL zI-fY2j3&n(K0JHqJ1g5;JMq}=lTd&D?5V0ZrYgm`rva`%Cty{}SYuiWLOIuUB#Ah}y_jae^i_PtayW{Hz z_Qm?)b9er^w)e;%UtZsBj2-N)POSzfQ%_F!RyRkdcOIW1A;IS5{KWFi_Q8W~I+S?* zc0ub!qeS}X;d+_I(L4#yE>_v&z{cB?4Haw+|A30-RZrJv9=Q455@v#Cfe*+%w}MfOds08@c2Xkl!ihxW4P6&NC z@NA%nDCZ`o*Q32p0bcp;`ZPB_(2D|#GY}hfdAy4s~K!@|fKvp{&+w*M4 z@?+nNLp=;eK$(F=Or%MJB5ylByM=gVY?{p~Y510&5&drOw|+0e)CRl}oaR$vhcyz# zx^F}M?m{s8vnn4V%8cHsJs6I+%sVrdi>%F|(w_?n?d1_}pegq<&*2cN5H8N~WR z*EHP#DSJ`67xL3NjIqmtbC@=zJEUZ3bQ%TmyU#!u;4eY!J)YsaYzI{C1d-R#YKhEI zf~2(Hg2k0Oo?}<&c_nRo&GpozV(m8nVR5^3elSzeT8reA2z<4YQ1x_Q(LHjBd7iC! zkp)=}af#TOo*;;T(4~jXkoEWGFg*0IF9YI#o!)|2(LwLEHU!k7065o_>=C6v_FAMs z_NBDY-LX^>-4;IHJGf}|sGJ8PhcS{g#VjXdJM;vjNP|!aaE27rPK+I4?Znu74{IlL ze&?|E*UQ)$)}g%ul*kU#{4v-Qkz?_FQDz7Ll-U+PEHh-zUBiwo-M|)2E3%RJ)1i&{ zv5QzC&5k2W^>r2J&0&UUrRfiT?~d`;h)0(&h=H*I%r!I}WJ}R42MJsP-BXYmU&YZ~ z$gbgfaT02=keQ_Kn~^tVAP^z3bAmQd!1p|i1VRjHO2<7GB-^2R?j&IyO#BAUc9Ue8 zN1I8Xv>w?_y%GcgEU{p|AeaeQpm0rG@@xYVF%9W+WGs`H=sGS1bec$ilL8VSYS5OV zVsB8}^9(Z3Q|lZo=}8&$jRrlMmY%Z@wK-YxLr$^z3e5kLmOQfZU`YyV5vzb1;R{+7 z!b-wyIa&OmLi`{&5#W_Agvgq8tAi!6Jb<7aLTC93*T}8}QwFIk zEhs_Xv@8J9mkOPsumlL7D6Iia63vr5lTtuJid*R?Jtey`X0j@I9u>jY71-A4Dz9wD*lN`{?0Ik!)q*XB%0Zi9x1w()@$xpCw*;{)4t9A>5Wx_uDfH~>OG>{!zs z?oN-Kjpq@6ve#&I*$u69iuq`QCb@Z=BLw1T7BL@82pIK23^K4JRe2D6jkzuVp;eIG zX|;8*Ycqp|{%t8eiBt^!y^2(A_}VwALu)wPONabI86Uw$dInp<+rIgiL12pmc*_un zdq%Ph3~x~)1yi~0wRxL^S{#&&VdS8;$i8x7MGFgq0@@9p>#-vS)VGfvkz0l&kHXcis_lHd*3?#0JdhAO&(67Ve~^$IPKOe*k6U{Dv)k#j)V< zK-l}~NDI~-g}8!)21smvMF&_h=2E)C{%XjLKVKKzjpV>avm#w6x-gbDpZN=FHJYjgY`VnFH?u%q-Uvw;`{riUr0F*?Pj=A2}YJDU$E0M zh%-hY2?>1)a3>#SZhf!20B|>gRx5Eeoyv=)cuO6YL{KFDU=?iLOl%9Ml4$|FH56sz zB}nLM+a?ZRg>xjvX^voL_>UO@Ta644=PE`@=s4ISYFnX#43P#oeO(l{bQdPj!MZC8 z`zG5MQ$9kd!Mh+~9H7H4%hFy;WGrkFGRi?kCEF#*Zh5ao>aE{ap5(Q>MO3adtjzdQ zByD%~YE4qr&gXa+T_k48@Mr2q62uO2k^0zmXF6JpEv-1?6z7m>euUfr=71BYcZZ1& zDAc9E$3*_$mNy3mg}t_zhsBC_>qF%0sGtw%yzB0=*hjG1lN-7gSff&MLsyKbyu+NR z9ua!HRU|1D?`KkJO^(p&+pWbL2)aub{;-D>0gqpqSaa+e9%V}{f>A# zc$YpMm-zDfb2>6H!zec7s z4w4m72QrsMuY75kb)m1YfYZ4rc=3%zNSh1)wF}8sr|-|Ht_LvwLK57Ayg8{(%_I?|GBKr#C+b zS?4$hI(4=g=K#%$S7qxu;7gmNUf!x*M9$T|f|)j4uS}2vpfrcn!mGl{uPP+dXWu>>Xz7$FjQd2Xj3mXqQpm#EEkB-B;5eIOwX06t`WU zE}@vUWO?(uWHbMOA_d`wfE!6D%ar95rVMskrE2uBWqHtIW(5`nNtI=Jv!jH~yZ||i z`;+CdqoEw!!-YgUq$|Z6eIViu4&uR_zP-$#76{iC=Ix==ctAVT_}2&RtVP~| zFb~MfK|2I4)@qwnKDTmgEtIq;e-uPx$|f(0mP7a}P`n+;cM}|HZ7W2^K8&P||D6v05~N&CJc{A>jUuYt_l|CO z+Fkes1Yg8au^#v_Io3-AkiC1z2*KWZoRr;$m}ZhiVKX~T4^NT!D=zQcvo3ql^mWmC z4$`wujwWEIWUq85vDd(s2Zsb5oX|^=QfRmfN;FFV?oesJ_)9{LrVbf@rROQd--5j3 zwL2QO1aRfhFAk$=VPQA_*bSd+DYg(eG0AV2B2a1PY=_-9|0f%Iav4JizuO`8P!qoB zfD8!3z>D5dV-T4h00;Q7hm0D)K0zE9vC(FZwSiM`X1@6i)K}?=fPWvrd3u3E zgLyAV7MjYcC9QN-;As6hCZf|`4b#cZ4Sve;e?9Y4uz>y*u{+qHgMPBCDb-z4{3ydF zZkqyTSEiXKHeDHLogH#WiA8*o{)pcv|=I_&{N`x{q#kAQ7*LPPdY}mQI za0q6>#(5H54V+lZ^HkgB0buDL)hG$u&_!1?l2`0-n-g7uc_f49@UG3gH#but-a-WE z=ip=Tc*vs3TaAYlrULUNP><6lv`4#F*i-a3w67Gx>PvP6QFb-#GrIniGIV~8pWg$u zYHTXan(MJ4Y-lPsgoLcDM=<#3eM3dOqP)-!ObC>zyC;><9)!UJm5{;2W^Pj9bf~iQ zgYus4z5aK|BD6w@M#bHLa6OGs+Ri@;1y)ZhMiB-wIF;#C`3NrzP;=p(Tc~UF*u&8qv z*pz^19!<(+MQm`Gm~Lc*zG4NDiL>bgWJnKiyoryq9(3O|3@f2L->G6vJ}?{@D>rWx z!z8Uj4vjMUdA_d)TDLf!eMU;Eb^qm6-`!xC4w3Wl? zcSA@ON~ZLkOlE|Vf`6gSoZLhmC_sF+79j7GagvhzwUBP)JFi@(*3yGfYGg<`utEI3 z9XP>@B1t2&mOvpZl^pxAy z&`QXNM>S#k*3v87++=w~8fnS(P;I6^Q5)Hf#0jY?*_5Q~+aSA^a&+kk`6#*W+Ka9& zYtoV>6I&F8b`I9k#id;<1lDFx9xnst9lvh};}*(N8)3F0SgvifN5+PVcmeaJOv&{P zb5%~T+(y&uY`ef_z3o7 zDwd{QG=~&dNE&X^t2BMqhs{;#Mfa-}0pc(v`i?|^v30dbH`%fNr+%kL3^ zu!#MONvH(vYr~BPK_huF3AZ@}^2$fP6~jT=tX|z#KuW3BJY(jw1aWeCN0n&lTMrMo&K<7&?oB!0-+Dakm*m+sfRXm^oJyP z%uUYu&=1KWtL>|jxO*oY{ktCh37HG$0EB{re3f_o6kR*Q6-A`6sL-Ok-7z8 z-lcb;PU6^+>z6|g1;s({29mGB^Vgf?j28yL_{r;M3>)z1m6G+i-^~q z^Z%x}gYWuZu+UA>nU2k*%(Ey}UfJu9@(bHl=d6>!6Fav+P`^{WKbLn?q#NWso}=K| zsRomK+z;ku_U7;6wj-tnx3rMA<6Q$nny$w6*Vi`Bm~?Qo=|vkzY~$Pk@@{JU%9mPgH1%Eu^k~ zMcLc`BzCn>E?mZCl>RRkw^r*nfKj6&mmnX$w+=HOvA$+!n8j!;l2Nrey| z&fteVf12BC2oFGE0656O4LWcF$3CjJ7U)TbusBNrJ2W^B7r=1 zH?coZM1gV~1F?2s(PuC<;e-;w<$0ehVHvDRY=okC?o5vTj9iIB*8g-3fMf!I4RS$t zhsI_JEOh^gsW{IWR_q%j~^ZpW~ zypzkDLrY%WZYXD)NLCX&iDDpjQ8C?ES6oDiDtc&Wz8{)iV#gy8KA3{w4}RY$uOqKO z#~cwY(@U1rDlGcC$-@K^RpU*@s&ab;nSBro5sZX4S<)TJFPORetM{3N^Cx6NDkdEw z&674^+g$SxE@Doyet*$FKaWq3@ZNpc0l-s*Js5H(j-}P4J#Xax;%R&qAD#Q>yT?bx z7rEWPxIf}Ls%|=lt0bZBE2e4KiXZtJVt^eFhgn*oi4(QRg@2z_pthM6xkc&bC(DW$ zC@%q-IT%LB)j~ssZ$R|!e$B?|Ep0^VH~&Tf?Z4pQERZ!&x?i?kGGtZYK8u#f#FRA- zgrsiVrg0z>Xeg{^Ok;m}^N(3qWNdyr=s_vzYL+w@L>JJMZZs|SlO|72lE{I2tA74Y z%unY|!6HO{1m?L_8PEn3KH7c25k1_rCScKnCG_zk~2;a!h1XfT;i+Q>+0^ikKl1w|)zh|K>Vf za=F8!f>V@89zuqM$#B5DqgK$0_jX2`RtBy73dlt$M;ml-dbmhU#35THdIkamB8!sW zkR6`NVwbYq$b(DX4D?jPUVn4c54N<0YQRHeyyl%5tT zj1j5bn>dDr>|Y#1CD7(om*IL?nhYAri(|OWi(`mbY|agzdqp`6#R7<(Zi4z_8x|Ib zC@1MIpL0T!uUO_5^pvdfa{jMBpxN&d;^ny5Yh!!9;vjt!&h0g^X~Y8;4zQs_)eKz5 zAvij-QPzGl-p{OJOsp(;P<;mSxF9IHJ8;I zkx>6*Jc95Sc+MWLoDnI&=?(bOcN6YFZEB)X|7rmcob5GAH!`H}0! z7S8kZEs$!IWbnu5+e8i99BsuZo-$3Zqy$P&6)lul8wM_1N{)}mgo`{|40Ih3y#=zV zRt;$^K%#qt>p?hp$-j%nC7Mg#J}C5&!zsFVbKYH=OP*0~o*}&8pz3~pL!CfEhW9pc zgx{ruz~Pk52Sj{ci1%+wzHE~x%U`B`Uw_)e;or2Lz=3woCV@7ca3hC30LP+TU%cH! zI$TMV6W}8Omf>xnDax7n^_Q43Z+HQ8!z}xf{p3Wg(_^=3>?DgY5z34+FAHjE=XZJN zQb6iR$_gpcgw~VxBGqL{E}&%;c?aLD+A0Vu^_PL9X#t@}-{+1TZth5$<6GJ%JAt~` zB5(1wv}ofL&$ zJvJ=1_8Iv?68CWB66g_mX`5z&)ug60(gD!A860Z4D6u(=XB~gU@7p0{=dtV~kq(D^ zk`#VP(PQtD4Gyste-CpVjzwv2+HXoA`Rv$jd@X}(fMrpDL{22_gTVa?I@!AzAx=bu zo`$$MF$EcS??&YMdq2Mf6*c8%zDMfxCRW%J#gpNMOPZ{t7zF3RuP3reNER?A5X>XzE*dM7*%G zwy`X5{0s>aZPTrRGLSaL&W!hl8WBs&O`y8t_Siuy(hz(+IW+0-tUGYwE|zsLJyIEBduLKOhBYcqEoiCaJBex3X1PV~z zO&sM68HN6SdQZFl=&#aXT;X4(P*?~u?+Xu0Dwh-gKu@RxfH}IlP1GxOAhkFF$&fmc z_HlfPh7kcvu~6J65KvC`{uPyOTL4Bb+JFELun3+agcT!0*VB#@b0yyo8#{<3qSqZ{ zhpMmWO@5azgvKDu!TATYN*ZkGu3?+bNUYhO9)`MNt5$#vzJ{f^W)vy9YnrNVxQ=Ou zqC08OWuKI&Ye>&P=v|jq@{;In=mG)+${zdlxN#5(gecZh&%YZjS3xV_P=F<%KmSY6 z21TDU9vIFo6n$b-;5U7W!7PS4sT9nvHr>d0Ty2rOYh;3q&XiOO{Z_F@hjEv#k?TyD z1IVybG6W0+QMw5RHD%}T(k?VkE(Oa$cJ#ndC1m8J0yLW-)wht5yYCs}sEd(~xp){N zM}~Y@05wvSk#pO|2=s}JRLaOLOVSOjYs$Od=AB+Gb5c*;`(E}%@Rtbtqb=DoPmtVS zCaoZ3AtBx+t?ilYn~I(|Q1JemD|ffuLi%*yQB%>7xM5SM78Ps#)Qp#D6oQj|3xrPE zj_@<60+92uuM>H{o0JzS@34i@*V%erNX_+wb}yHvp-0RfjP&|_m&A7RvJ38Z@~(+U zvRgW~NJ{J`?+P~WraE%ln3~}`x2UJgOt&b>yh9GG9s79gJHq=4m%~so6sE_=`qsm8+n~sGkF%|WTZVQ z1kEt#5z{4^W}86PHU>=E|14c{(7efOg}hA&K^44=o8|T@aF3cLR)-(#=Wf;A!SU10 zN3wRVT-uN7cQJ3Uf=OuLo&1Q+P9O7Mu0QQ24Uk4R(6C$R8wA=!m-vU3QuZ)$TkMgP zB6%tfk))C@TNQSjRh<>@CF~Yr7NSrQ0{|bH1XX}Q=Bg4RQ(F=zANEyZh-8uuk(W3H z6GmzTK)UtjHP$43PRN>FVG zTe;eJhj734G+O>UaJ8Y8f*Aq#nX8TFlxMby3NZ7-kSk7n{UtUv=N3)S*0w;OnE`7h z3@643fPedFsYqi%o~D;zT|Y;(4Y+re>zTPGyPmIK zD&>82nM>y8z1#s+IR~6vU@UWrLbT|_!mt8wQ4Fwjw)Nt@DXbQNyVCPt$DiEw@cO%K zjVYpx3@)@=4Q2TNhs@&Dh8Gf~lB6XAr0c{ce>Zzj!HJq23?i!drANKRKo@4TZ^-=( z__92+9z+P6G)WkNUT_z!3>i`>3wnNNZ0Y0Seb*YU500cd39i8tMUpd%2dNA4RgABl|@NTKK!r zAxe2W&}ybbkXYGKhsfJ#D4d$IT5%|I7Oj-uRm@-_P&y^nHFXMx^|w!_XbbI?%0hiH zjx}qdjRj>vV5wZu6ld`XYVsB-3rvm(Xo*;|ZHOT*!`N z*Ch-`AWIF?LN^qs$phcgUG#zne$VtM`?l*DU8Wb z$6Km(-8Y>GRMrf^UMkeGA^MOqL@wW)(gNtHS=>^G4jt zb-MR`zX*+bGEPczNs-)?qtQa-1B6hjMyf{|lSHeNSV&~Fn+V!nbfj8feX%+=)xDak z5^_w`O3{OxOIWQT{TH!dVHIU2Hhi4y#Lsvg>e(#6TU#VVR`86Ufqfx&_)t|ebp!{c z5q==2Un_p-9c}R%#n=qMJW0pv3?D&&|H5a%M1cC9Q_<|sXRCimzWBVPAy%fJy~8z? zHMUj0eFn>l3GL=o9)M)_=2%Re!*LzfAR#B9tQ z{*FO1KoyOd2n5WGnE;B+nCX;HIj?}#e&y!DFi4DoWh4B-@7tm0i9oS7PCbz*l}YhX znIg_HBerPb$hq6#1;>MT_S$KHM`NTjcO?KFu{&Bsx}#TBiBxVxBL%jI`y5*Y&useI zSa2+c{^b^=8#veFcR)md@!QDnUc#%%kUJnAcTZ_aVV|=ICc&_QrH^2#+$W0hQvHVFZn$#!`wY-W2*XH;cue(n2&u;`M^6qqCdA`VEp2cvg0soWw2t5 zaScrmRZr0^9Cc|1x~BxNu~W{ED000x3AI?vbHVKQTLka&!BC9<*o4DpTi~FI3cJw& zL|o8po>HD0X?>L4sA%?`ciu^Dk13Hr4RTsB1K5s)a1Q#F>+~0ae-_*3UoGvc`q)xK z{2Sk#z{N4$&_!d6{?OlTz7W^xrTF~OkA7HqFg{PE4(Zt;RXcx)KjWix-=Oct=db8{ zdVIKo`}xZ&u3~(YOHOT~$O2v;JKRE}hwHeXe~$a{QMzx;?BnwB7JX0EA8z4({>7H8 zB5QGc5mk>JqN&DVh^FSRa6dju_l-ptmy77p*x@MkBEkLq)u^n39^u~=b$0#|1HmV% zy`q84Ut%EXATSX6o@&NG=zAIn72(FFHc`a_#)*OKp~yP!F%bHm?lBO2|9FeOr+L6Y z@I4QNilkG6j?Pn&E9ymfi6U3H$3UnTi!Q2I#Jpi3)Qbf7Vjxt69?=-7!&}?<#MB-x z;S&Sd+QvZAsm4I)`*|JTuVCuMK&S{kYD{gRiUq6&26BiZ>$t~2=zF?v%pBnR$6NG0 zt=8cd?!`c;NVb3&2o<@aUW8as41~U?`^KV&Di*Q87zp(u!Mzv=6`@Cs#=|YK5*Pqr z;BX1|7|7ug29m-A20{azxA6T6U_=ariqNCRl#ePF05%xN35u-a9s{B8>Ao>@i0>b7 z(f0&a7%jf%6`>+2q|u5{kt^y&_yR?)aF2mdFBTu5ip5d-ew2EV;9d-biqIo~-aP$Y z(aMMc%+u!;;RrsddVGIH-_N@k;0o@=K&S{kYD@(vvH;-5K+aHP9rqXreNXp|nInAv zc#FO#;6L2Ly%-1;$?yR!Q4v5f1_EHgKg#8X_|cBpnD(bo#m@G_m3?czaf}xm zv-ZX5_Cx2wIcvNKk7gPR!Me6RzHdEVYPiXx=hPEPTV#`s29uoZ?p7Dws(2h6S{I%F zql(rdn-^C0>dL{9HM(bAY+lUmI{UKhf%v3n<^`&lyI2t|#nc)XJ*2NhH5-T4WBlKB z((kAmRDox*chn0MpQGEy8;_npSj1QUQnMFnQGaQF2Gc5Dlf9s450_BI{$tsT$7{Qr z7mumvA$^tgf?hir=c;8jvI;Rr)QgjcOZyo6`P|B$`5?f!#aHw!y)J%k{)8<*;Id%3 zEV!|qLW&antd|Wdsk}i}ix%G|yQKdJKPY^nxgh@D->ENJ@JvpyKt#L!hT6l>)*gTupgjQb*{y`G>(62C!)vsL<9h zFk+DnLwfvB2)}QX9gN|;W0K9BQkGf=5Z)khhPV9{b8X+eTiDp&{xH)HCICzrYc%+a z$tuJILDJ6~3h;FY1gZK;RF8KhIinTf2wHCTb=Uyt>^g)YQhsO(#22I%-O4bFo@6%? zmUwo60C=ezx>lLlcn&QO#3tasP=du16awtVgJ$yV5qczas zYu?_25IYLbqZDO-IaF^BHY&iMqvKRiLj^S_Jd>2Y3f7t>5IH^o+E2A0`<*^y)Icjm zUk*kre4gYw+9NIVU;gKwkk0NHlhMXO(0*Ua)$RvSU zKLxjWMHMl=wZ*n9N;MM^NlpXr;lJXO7J}~I20szOe3OLVA_+uS%*cyNU6VWvvNon> zX-M?-m!PtF$m<4WJ?3a=1?@M#feHaiFo7muNQu9<3=6rO2#5{)Kn6ln;(9)P5op*v z=&XL({E`;l;#4s--$ttY7URwD?%n!xOw%kVO)BgPZUoKDK$tApG@T248#X-% z6^(5!HXGh5RKe~7Lsf}XdsA%BJ2(q9!${b(rjY5zR+myFnb`oR>?CWhI!OlHi zBK#4*Z z4H!QSoHSri=&+!qfRPMk=t*`X32SOf;SHgkL!+uN2({*FLF>cLt&YAH#p#@;3ADu_ z1I_tiak^!xm?M1M)Qup{PUtA6ug8k- z#(@&}q3igXZzMYQw&6eKkrxf0bV=kGpXI!(<@;|#9@aM4)1-}TgQ0T^GntvOvnVnH zF`Gj8k8_Ka9sNu4_&e9lYDvX?dG9C4t16;AfaNd6Im=y;h|UQ&DeoRdruK+L-S<=0 zK_WWD%T$NFFNJ_k@O%InU=8<~PD+C>$K5w)RxVicdqmoSY$nrbGuiNw7N(*C(iS$8 z!Ol#9|2cV;khV1aK-G$j2G|Dsk1|=}FRp)!HIQqB@-0h5D4v2CR%kFRkhhe*bu5qv zBrO4L)i0;xN4!f zhXmf>O?oOF^A7Jl(I+zq0o&<^rD5DCYiMuN+|BJ9nxbIIWNK<=-BW31q&fdzP}DdOgY zVX`y-c+G`}X3eFn#Dtw_7v34cCy|txsReRnl0}-S0Gv03#`pAh)OR$ume`A2Bo?WS zX)JLMn8mxz`ZUjII@GoiYuHEEqLm^8#crRbCkA_LO53sX`rj+i=U?Vz+k)x=whFzl zYSD?B!iS%&IfZz2NyS}DYczP3-a3TKv&gF!zA)VCV_J_Me%ac~M@6*CFBlaw_=Mu0g{ zNM=E}kv^=OzXvbEc{ku#pn)Hw^cRqEiE-j3I+E^XC)~QL=DXO0aKf;VI}xkE%Uz#4 z8U(ccV<6=*9=hC#z7{bsciIHLg4vZkN;&aS25;Q_DD+(|ElU9bM-EvRze_)Ah7m*|OStFWzvPFUTsgz=)>9jp#1yi1i&H zLda~hxB3G}?!UhNAJ@O)&wu{&KmYT4*Z+YSp08luLDnqHHXDvoF%sX9AyppqNJ3&} zS4AuWuL)^~^iGPS&=k|R*}+0OB}J$M?^Dy$S8Ne~3HwncKQ6ReGUA|<;IsJsgu{~sOUH~Pv2$DpTDfTj$I43#r6cE*Ys!`Py9unA$=+JvVOl-}A`^42kUoq`CQ9Q%970b6h+YKDowzFKj z1QawzMs(KPvf$=2THlESg?rKxYM%9pg&PN__!?@hK9|SPdM_wblL)3eaW$($8aoovQ0(TVp}miM^ju&GZZ5>G{^A0B#t5~%*H-p z@sqAEeq9>M{s*BxgCuRsWvj5D0o;s)TY_KRrEn<7u;N$KEl;(un;hjTh`=qsLRw|~ zM!KPyffXs(C~YcctR{-9>w#igv16%f?8i70lH2YKbgc{4TloxV(N^1Qv5Y3>=012w z>ts?VVX-HIimQ|q6mf1@OgZ6Ett1hs2*2qL*Kz^6+Rj}b!TSBC!Xw1ZR)4TkJqOfFRaPMrD(i!E>jUQQg(jLjib5xpacd|Izz>S5wqrlJ`p=&l|Fit8ty;=_h&L{{WE zaGjuG5mlH;GFiVUu7EaaFpD&Lb%_$}D2Cf#=*}=%WXclhlVp3sm>gUD9T*>kDKeBJ zh!4K0yw|fU%d@>8(X|NK6#`u`6T?wlI|>xrvHaNg;!qC*usp_mrdU{pyW?7Af-`Vg zmQ3X|t&*1@gwF)k3^ZHuy$Hn9j0~`H9Vr_eGcc0Kh$HNOA|a2v2HvB2kQFQqK@*;* zn5wQLXu@(8H`dj_SFx)mN>I9&O_=`*NfcIB5-&*v=0mvYj`R6xSX|h`NwyJX?ul)Ak}aH0&T8>bfFco=}ZX$?63j()aSSQCc&3 z9z9n-$YT93E}*>r;#L*T78l&A{o=+}WI3u8Ds~tEb3G5TlIOSz);03n$cxm(?{RS@ z5fFNZGoq0fe}mL9_xM zo*{dhBJ3@C3gZCxl&WV&L5mRA0RY+4e+NVTj4cERN&qKeW}53REo;3=16-mjLZNJS zr4B`rT`7Wl`xz^iVQjCtrjSi|rU-qq?xAJqp28+2SuBa+HNm$gUQmrZM0>;$<|+zP zWK7|fv#?$&mEFjtoY%1%e0w# zG4{sWA7d|(fKG8Mc_n28Qtt3$(tGYf*`xp^xOXzg4H=CQD2=DE6L$9F468XtM8FE; zV{xfTamCpvx~q*KB)(Tv8OXkCz!9jKGvr8Kw8GeuVNWg`p3Hu%h4I{QFnnPtigA1_ zTLH5`!x5^$>Mp`XY1P>x%-%XM(EOTr@$A$~HE0xq-+NYpdElvm^G)&RaHphRhy4Vw zA^ZZzE=vi#Cf6{W-g<;7m+MTp{ESy2b&nQ9UK1GysZzE}aC| z5fEN$BVAzy(nkJQ$Sa6)8Zoei5b8c}Pm*xNQVIz$@Y4zwT_LoHGW{MCr-8zN2Uv(F zsg{qr%RW^lNYIc2qn7efD`dr@Z=3YD1OvUGMK^<^r$&LRnZ6P_7G*+()fXp?*-Dhy zP~$8!vYiN$5gUM*ln^zMUGL_RATI;b^^(*{;ye=%X)=7HJm@lrJdfHf@$MWt*^%0c z@$oPLp2G1QCeZt!`YKjH=1VI;p4q@n6kqjp9o|jDN+?%-YChl%dDuY88)r$Pr8>Dr zq2DN))iExM)&JNsjWHzq$eCPBA`F%dk0PYeGNd~l^Q$nR_nS^% zgKLT?d`D(d1;tIotSV8U@VS^_NK37**Q(iv%B?1MKT*rU;Ng7x@o; z(zN5Vj;w^DSxnlSB`5I^GR>5?mI}=@jo(cTJhXGPnE!~K3}jVIHBl^86E}Hgc&sq@ z>QRt50m2Rv7s8SbQ@`iIGmv;N+^eB(!?@4R2MT=>vx?W#*b!u}w;Pm0J?|&sN$GjOaCwKxet2zkEYsHF~7SxzqmJlNL4M2 zuOdHn^Zz0SMEB_MA^jh3T%rp4IIPtRyq@+@zJAz4FVfc29#Iuko$N*01Nux`DSYNy zPoGoI>00)p(YSn(Rzr`=b5ZU=+LK%r^ms~agNLxrh z=Xdt8$nD{!W-n;$GpHt=gY=rJt*D}^MS7LKo5{^hwjyE>RdbQHp7w^SplhlQa|r0< zY0NKbyIxQa=+*SUd_6yqd==#t$@e0EP1WS)B40(jUQ|89dl*QD=u}Mup;<)cQm#ZC zo7r~84M5>E+tb5PS8Uay06@cnM>C4(*b#)P7;u-`ptca-I&bhx|UmaCK8dwBN2DCW&Uz%rk#KP`i;T)q3G4xET+f@=s zvxLTxke#<_U=!|0M^ipk0@<}sk*lh+azNBb!Q7Ag%-}@(7isPU+_Jg9w1}A@pW&dJ zkW|lIhMWtSN$wv$>9SWjNeb<6uAGEfOt+8SyoX)5f66;a?%~V#AS+?N1Z}PtDZe<= z94DnBi~L{Xhl>2^`cu438v@f(a?jN7Ve0>k_FGUql8Ec%&Acz~6*qLqs4OB*93>}Z zCn?UAyIJZ^nqC8~+_p=_-rT$|!cItiVR1JFy@C}?Gs!N1p4z>mCELpS#3&5_dI!6w zDD?<&i40L;@lG`v5C(i9Xcr?3?YStd7VoS0s0k)HeTL~Yd~pAbV1&zMAab1sGmxVQ zTf(~{w5!FDt(%IcYe+^F+X%t55Rw|2h_nn`C-VImTP@ii*VeA^cINcQPDI*~2($!Z zgG=+?r;l&m#my&hk^em=9+_^M7UK%7C`;Q)_>lgH>+fJ@e?Sp!9Cm^Hy@rhw1Oi|B z#QQ2v+GP8;FOea+OrzCYZ2$rL3!3(dT+(@X&ncK3mhdvXWscBcr1)neF>}|qhC2%m z)5iLpn{C=s*fP;WP4&+pPyFT7QZ54nB-vG_n_yIo2W}u zx5p3S0vTs0xQXZp0PvUL=n_m>rN?2cjY7|+=>5K7+B;PaJuOO0gHNYTa0B*kb;4AE&1%2F4S-lu>_qPd&h7HpjF$2o z4kP9WQ68hj=1;3~BUE8BCtUoO%of0K0|8O)c)oeJ1*-+|$aL$PSj_~fh}GQfw-t%2 zGE`t<+Y;1);xDW_6otv`H_LGfdkbg^XB{U4&nNhn)3`PBDo{jHE-@p=eaZ}P`DD|; zSgN2U{Q}B=*@<#|2$K@!aroq3)g+)+nJ23$8)T0lA&Ag#O5a121H%FBYSU#w(+XX# zq$wq67Bt0?G{tK}Q#7wTP0`%GX^Kd-a~CuvXSqeAFpiZ1Nh%<@CwlS`GSkUL!{?V3 z={x?hh1QfPeob1#mf-JcO(mKQl-6{@_zKYJqhpnLEE3>kTuI=uC-4~AGE#vU>?RF- zbZX!+a=G*;>083+dlz_IH1tBZDFv)lEJjaw+%*2SWgp$}x1J{l2|!7%r$2A2bnx$B zgM1K|kj8Vlt_rd^MZ^eWa3?J5xw5>6NN8>>Qn&a|cnOeo&Ort-8`hOxoX!71VLPx_ zXPvvIJ)+q_+3f(km`EDi94DW3(PaLw*i-llp}P6x-}#f1?xr1{3F+RFE#{7fsJn#r*R$zEsI6y4JosZQsuM4l6&*Ze-yxoy-WrG@m1aJI0?QF%(qIzHK|Gg={+= zo4UPihXD~Iqa?|BHy`dZ&5(}ZE*%*)AS~%d-|K}lLQ~Jt_nz%HJOyvsMmr&RU@Sbc zJh>>F)W~a>r-Us;;hlHHVHOZsQV$*~?TQb8T_I&i5b1?j|0~A@eFIkWl5F7xOD;S? z`R=w5Xfhx+V|c{)?_UqP#{7)t>gK&@#qM^S-g?{DzP)X91(bZqlC)gId`8|PkWQ06 zZ$UcAs@y;6L=p{zC=5whmUy9&p|C(Yaa>s%A)$hBmQF9pK|-&%F(7hT$OG^_xopNQ zvF!SWlgol-71DhF15WX@IfJEy^zcjGtq3Jd=|to6%E^e0 zl<^iPEgIYB%S&T{#ZoK%^JuFKQU23&$pDqELrFCNC?6LgTM+ zdeQ+26yZcCIpwUI#h&D>=}p z5g}Er<0IcPvi>H48sX>;uQ&t~4W(nqQZk{}ZL$ovYp`xI{N}VF7ZxgF_AK_@vVTQI zN^?DqOwUEqkO*D3C_%K1K_r?T8NRPaM#LH7A{ zI9)Mzh53meA+4?Nd#-2MaUAFSATyOvM{t zrXhp3g&dms8n{=5t~oJ)Fu=?J5CN2$gX5dj zL-tF>j5MT{iF8+SEIUCK@xXF|LJiF&5>b8m4vILlLiHX}h3abLDo9t3M52@$+H)dD z0rsmpwk2T9c_6e}C&}^>HI6h(30=x_o|qash&(O2jdKTLGxjty%1x5ZVrHQaNvL_2 zYllcx>!Ah@Icx(=wqhfFx@S8;5;wnoc55H7Sk! zlj10BZobq9GsFoA$c1crNEvSGNSJC^lponNd|-%gYJPqcY@jIAV4;{{>zZPD7BEOd z?o<~!Sry+&T%fs!o)t#H5!8hm5|nW@M^%tC2pbzC8^Ge)8t8+cXo2Y)XdvGQ4z?}S z5O})hBo1hxsS*}rgNf%k7SiR|o`GpJ5P_Jh!D*dI{L1Mt$o?0CrHqiIQgCXs@mTmur*26l+a z*COBx*27VP7)Xu0wT=gHLq?_iOuDV}fLPZ!#(=R51}LKjlI9yuh?xuw55&Q(eE?$z zZABk+Ell*pg7r~#b8CTPAj>tl=q*xbMHoHR0L2>+rGeC12?pY0=a8MBNgONCQiUHR z#10Jwd;$PLi{YyVxFxa#n?XSNG?H8=G_|!CCMdk6f;ea)pc#!CmobSS|<*4k!UF&G!PQtd{4(#H<+}QrPR74Q7c& zz%;nPPu+2x1hmVD^OR0Q_(Qo0WVH7jGY0W>Y?5|pCS5FUL^M8(P-l{tcCA@~c<9sz!-AelD!r>`QHzU$_pLPI=4xfdo{vOUBBYoH4NEX=9vAw9F|*f@zN z@(d@*1Gk1W9OWu>Pd5zkcO~RZ-x`>|PfR6@0yDG>4X64P-~tqPldP zN&sr>MWW)Jc?+@_fsAS4u!ETaASZ3cqCfZ6fX(E zv3(F--v^wVg++zwrd)*wOj2FowjWsNg%0+EtoWege&DHz8Ebk_z!7K(2XN+YCIJk? z=p$gji37($jKl_Xj5A}6B-7DEu`NoZGjRrr5t`NxHz}FCnYr)%B=ZXM`+rrnR@FLm zuU@-1Ee|D9oI$ zZ6w!al!m}>pDkyzA?M6-uhwXa>#~?~%?1*Mjqa_Wcp`rlj^T2Gb(rC-OtE#4YK|@% zEPIe@I35pK<(%tZB8pTvfA~e?iA?;sZ(4xZVL8Oz-K;UUvn}_6q^iBb+M{Gy3h=Z46=Ee+tB(t6Q7$=hO2ov;l8(+IxvTgVl-mm_lX|g zsoO~C>f}dH-6XoJm|9`E!f_olKmtIU+6l|Ks;DIxO&lS>pnKl(04k+_9{}ijYCUBW z&ncSnuCE__xGdwanva?O9+|K=O`>&GlE09zRFmh- zwU!*;B>V@AQXlP0FZS%$VARQem~P##&Py-u{?E7m?f?Fd|K^48_Y3^`;}^d9!uo|j zf8iT1Z1m3;+z^}IdTT@2577|+_tR%Dz4-Epe`&-H`N{WSruVp>?>$iY!R}-3K;<8I zQDQ&a{bctqFTKbL!p@D)I;hZn)xGmC7M~}5sZ+<*?F#91hvMViKk?J~#Tyr|+0!Rp z*2`gCAF+skWK~+oN4t-?G?puC`S}A@@Q+w2{&|re%Tj8R z;a}5c%yaVwprY&g`z5c6p)TIwbDcjA;$O}fSZC(ytYY5PJqZ8a#_jBW!E`)8MSK#$jT zGReiOjH8WNTC7z*I)IWf9y*inIcI+N;FfJmi`L&U7~Fce;gH3?DwbzRW7>clHKOPS z_jo=Q$MXi8v{Xt8F|_I}4$0w!e}peVAhT<7YhlY37T)4KH5*&L4l{`Yo)&wL{hvko2hSp z*Z#V08Y5YK&Ug`qZ&$I3$N6=wB-1>Z=8Mr1upGIW;;2GV@j)d%GVC7k;aEh@b-OBi zaF8KtFq=JPZ_L`>e5g^miQO9gP*|T<`*@d2RsPR4P32YwO9<(AK}gj7U3_m4h^`#NDXWj z`ro)&Fun&CFTbS09D8sqkWCTgKqvUt49N$$G5=s5En8As4<4<(1mb(W6ci zMxQ&a^ViZ#1RX?RA+)=PYH}G33+gOFS1dq`V?yf>zNDWC`?pFcuJA&#b*7f+<6Y3*_wxnNLI@#6er(eU^lg-qF(ai@&S1W+kLf zSEJ{`3CSSX9djwSMKUMKJlH8%{S{p71oMIDQHP*{X)}VzGCjj(C%5CWWCkltB8TX) zp@D^5gL8grY$q1v5N2tQuT-Nr207+{^RMQ%LlOBI7&8Zpi9TTg;W#~RRg#bx4GUmE znz~oq*pfMvn@$-Zxx#OkpDo~s#p)u?*ELPW3`dL*uLv0sQG`bb1y=d}sRzRfEB5a* z(qai#N+8z*`};Q>R*qWatq$p#|MZ`~{ADFw-`)MV!yiw;fEYB>Rn$&l&+lGKo~s0; z^2rZan$mi&>~bVfw&+~H9{CGNs`E$;rF@cs4FL@&dswNw{D_6hAigi&Q0CD1{|rS< zcQXW4=@ACi-~1^8paXgK3=ppSFwaR&rp?K3IUd04j}E+x6lpY!7j3%`osv{6Lx55c zT=`xt;54wK3sZAqVf-r=s$yWiP!D0Ed~OuQhb&@ApqwJR58_D4^S~*!9m9pJpjQAj z9+IOC%kg?LYCRA39R(_4;yQdx73CwuwNdx7i?tx znElYX-uYedaK-B2cROZL5!=ppFFRwMc*S$%%fp2IotyELqy%UAg4|>smS(s-n%f;S zfSLfc{VjH`qQ5&iH>ynBMn%I8$h|7VT-1D{rUyd7pVWXmWx%&ac%65W*(%x}@;OUi z`kCcw@XH4vHH$VuM!aRBY>n8Kg2#U&tmH`lHp=Yh2GYvR6!9+J&K0Rq#gj-7>&G}= z0leUws1SQ44%D#@Q$fF-&@-~tAI<8y0kZe6-28<4+;6iDy8bmRe`+}*w(}?q3`YX0 zT5UM(cZ}KSeC_rZ6oQ>VeM(&hkM3(G>1Kdh>dT;f-57th`w@EWJ)p&kWg(eBcOGP9 z-=syX(&_c&rK~%?+HJXHU%P%&0DaH-RmRpeB)AgIT}SVuCM)S?aa=GKr7xYLwUu5{ z*D^*mE9;9)IUF+yB$Y=@XfOB-#u{p5DFXP$PGDAq>g=amU=Bc~=TI_0m6Ukr2#syv zngC~p#I=Id3UyT{ObM=<{6*=xYWRayRe(@s5U*7WQNz)(2NqmcWQ?3Kj@Sb_W_WQ1 zwrGM2x-idPWV{fr%5gqK#sXxitGI*2>fy*hx>Xg?-_Ob zs4E~PXx1D@j2Lqu>AM>@!GaKxsg(o0bbDB{5aHVCx{qktu(FI{yE3plKn7aWvK*FD zFj3tkTi1>RZ?fbYP%i(re16!u@#mq3_N>+F(d}phi;{E9!jc@$GIe}$!R1PS=`LL& z23N&Vq0Ra6)N7tuY)C%2lA_=Nd<&I(1imSe3%Dbsi}_h44w~ALh3 zqPZ}Od6M~c5gmglA@(rz8$~?0JF`eK`XuJc5N zQ2aFnL3zpev8THyw@WiVz;ZvsX3H{JZ{Q)~xb`Qw($ZvhJs$b z!-Tt9~V|NJ3&KUK#5zJr~(%TqtyeH;p;2^n!;Xh-fK zBjRqAPOvSm>+;-~KE8|O;teSOiq4<7?Fyk)3@Oeny_zX#^);*M&c@l%=&YbiDeA0m z1>U$0BPcoT`YTiz%DPP`Rl$E2rA38VKA>p(P@OG)V5T|i{LvqLxpTt;ym(WH*8kt6 zLkyIAS!xp&hBJxPZd$A+-nzqZubPRG!=pU9^9+MtLG2VeNFJj?b$wf+tuwu7a8tevRV$SN+N5T4E`qy#x34 zPH213nprt62!GnP36Q=w-fe)aP-asbjWC+v%6Y7N)NP{)k|EU`SDAA{`D9vgiV5b=ZM`IYxz?olP-H9;uC3Dd}kkqyIc^oLjc z(o+75TE{?3rO#L3K3$kh)LrTK$2fRSpnR#*FQ^p>4R|D{2NsmmBei9YXV&llp43i= z8Hvz?Lno`6aQ&gX{%uNytEF z!4t^<_EO+H)|%n{@S>G4X*xp@u_1&?fg`eVDEEI=YqD}B)dL+AAYOVA{i&|RN=Pg- zOXp)pV_J2OVmXZQ8y*WN@{8XaysE9FrHVR~3ZGV#PI8>MpQ@1pr@s91t|Glp5Cp@} zfreUkYW^*E70MI);*pdxY?4Px>YJ_JMtY|>P|)%bNWw#uam|}>lMrWbj48F!GR7>t zsu)v?Im#c5HYyk*oVoF~>yDAxl>`-codpLKcgQQ`S9BFs`IBP|7zFppxvGEo^*>pE^Dq7k$^DJM)@et*3CpVHL&=X>-X@oXW{T&3A%ft(r) zaau@do-ur&M@3a3FnI2-<_>aX)+_;1$Z+|c8ahoR;%TvYiR_Jw7d1i5$-_jKPZ9Br-p$J0qRnujY6E_NfpkiMWF{*E5yO-$9l8x)$%s}@VrPS$R)71s z5;&Q;9eK;O?{mM20dFy4>9W9wG+s`b%Z!yzg^4KSxqZy3&Cpdx29YdODD#OTDVmla)xV3pdBR>QG8@ByC3L!1gb*(B;KXxV81E|jrQIP=%L z{E#4PFpa(`R0d8uN2sq@2D-cBcqHNEq{YAUp~>3Vju z;@K#Mv$Lfdq@3$3x(#0T{(3Dqg`L;NPtu7s33ML}Wte6ur6iA6?=mZUa_x!nBCg1? zKoLAE9HqNTh=Q9Ts$l|ywk^@A?x2|L~H zS>}OY3=Q&QoNV8u#J|Lbeq*vqZSD)@aH6C}sD+SsFC-BVtMrqz_&o*1_%b?R%oP&~ zJ>a0iMdZ<3;T;6h@R!L#ZJnY40L5L%%9D`L$QvZZDj+7P?m$Ej13H%^!Y2lr+Y+0| zzZAmJn6u_F+AHPs$|Xrwaq;$z^aG}@!jV))E>DNRJfZ`!#c~ppr6SZ`oVgTaEyi2S zU)*!nYsQ;d8b?GRHg82rt)tv>_IsT^3fj8?P)e2eBju~qT-#!VYT&w^evt;b!%~pF zGBZjqKC?y3;G^F{cKR3zM=B{HIyVpYzxaNeK_q-O1XZz2%h8Kk68TtuTs9yPIXu4O zl@u)2f*|+cGv&sTQ*${g!KArHBqHS`e>TcsyAnuM_M_xspi^jl3%wdB|3a0@lfB@e z=V;w;JQAIlChGQ-l4~1yGNX|cHwduAZ|sErjdZnT+TtK?Lniz*gwu2f2`5MXkr&L* zWO<_lJKZ@mz9i8h2nM5HI`!YJ<&%O-J^xnEf$ z6b{@gWIsO)x+<5A7;5>P9y1)kf`V)|MEY6^l6)}?m}XJ-$DJapE;r{DQ7A+I3KI`m z^CM>GSX8aw9qbxRg?FJ7j=OmMca+JE&e_bk^l82he@cuSmktCMojwHd)x&|MZJJOutjF1lddc!735+UH#Dj%{IZA${FQ!LAAGwl- z!{;DdS%|TxJ@Pqf*F<+gkqA8S=P3_H4LuUCvI*2z`bI+~ykwt5it$of*JPN?oN-Ma zvBefXbr}w~ULWsLD5zFLPCRR3S%FUVxJSsKZCsGbSG93>e$#a$WQxPIQwp(by9y|5 z?YR~7Rap!wXy{4UVqG=4O=E}>&0M|PY2L!xO%s-0IF&Ex+_wz*iCbH)vF`!XGnkJg}k%;e9))Ehpl7VV%NK_i6ibO7E zNm$Cbq$388DC!RpHOyoUJ>{y3-jZAWto+qiyp<@;^;MnNrjF38CYWWDU%#P^l7+oZ zw>nZn%4M0gtZL;b#OLskV!)(jGuY6&(vc0}i$~?*s@90|s$XN8A=!h$uYe4;X?|6h zEX^CfEHG%E(g^uj37l-F9rbQ{K%J;rKVY1&*F<~ZNsg|k@BF8bN=~Bf9Mhgd!6GA- z*@R=}Zl0_&MO|IxyGl~&3<$`7Ctu z{tQQulDx4;kckEp8)afYGiMWlWC$(HXo8|-wmhxicV!72l2<N=N9aB&fWx_-jk0B}%_Vb5B7Qw|@+A0;Bm?ZSH4Y2s1=fMdph&U5BggFV z1onoB?#;|J)mGPv;uOJONU^Kgr&w20hiEyRXF0moNMDA;56bfc?B_!$PA`W4w4CLN zXV)s?C6Il}-XzMfO8=RhMMkxYf!J$}(a29@Dg!Jh;Sj`!H?FW2;o+H_)QeYtJ9p~@ z`eY1pc-igu>p%!Ye35@#HZ6R+myts5JJ&rJ5P4%h|3}JOJD{|)UpYjQew~Xq_=nxH z)!~y&Djf?*^@KD@$PnzUorLsN1f^6NZh2D}VKAtu)~QFM!(N@BBk**;iT>6-KW0yv=GW$PSWn{BOsdJk zY@E5-?{80vHD4sKYVPUf6$av8+8d4a5jH(sRxw6$J}L zeQ{;g1aG-m(B7*#fW{E-qqGkghvp_m!bjOVU(!8rc;*Bx^bgylIVa{}j+S~D^QNnS z&!S^0JMP}Xpf?k(scnEN_8@9uD;EVAnLu5(tYVONZk$Te$fXF&-)N{OFvL}47qWb) zj)2_pS}Ga8;5;dl&P&aFdC}jb4BtV1gH!xY6UUQK>)L$hPrvcaZ*9KiPI69CqorO} zM}~%Ah{ci{F7_FePC_AgybdWhL8#$1%|6xm#5G}31D{y93T54T<5Sf8(OcHvS`i*z zmaMYpPOR%Av^adXXw7fcgomQQ-l%z4cB2kdOpuv7qD?N z(p|ZD_(TZ4ujm=i#I$Fk46tp0k$hmCl;;ksP zC13ig4c7KLjtKW%73*uLRDY7N90*g>iny@OiLuA51U<`%IgOVWTIy?V#foYMwgn&t zft>@a&h1?`2L+f0g~+M`@~YSDlEXL;?gKfwjS~Fo+&pfmTz|}f_B85Wg)4(NDho`o zb0G#>4SNN^eHTq-0U({^BTXWAOzu3t*@J(?1gs=-qVhHFS61d*H6~~ye#K5#i-lM- z-;-E8F{?QcRf;;nWL2TFx^xsXz2#28cwTSWt4Wl63lc+B-A5h9Px%*|^H*R8__%MJ z*MK2vxGoyLmfs>)$m5|ymdlvo`BCZ08RZ@oD|cc0ZxefXeRYt_>y*-O2Yb}f=E|9( zSVGED6IEIx`%)$`O5Gcdi8(mjg(#Y6ko-5%lS`%&pJqo}@pCqY8s6TgG00!7m<7z< z?CJ=@mg* zuWAKJ^9eHRtu$br>1u2hyoJoK&m$pET&jBdd2BEWUY&8hE^`KQ%lRs#+n<6P$r zS0yfReLXd|j5L+VNZAEvJ1tWfmM^=+8frRCQaN~2_@fMEL8Aof>*IEESV@>%Uwb`r zm+*o>j|`@AyV4=*u2RL%&f+!8p^UY9b~x2D3EEKkX0gyI;Urbt`^V=p3$EJqVBdf@ zr9{e`drQnBPo&I#O;rYjx*`+`DiiKdF|h1>2~nT(WyX4UZ$#pGMmm`?g=x0jkQVzb zj0@fXL!3MB6`;<6i(cS~tgj{g#v?4#c{PtUG2OY!l`b%SaF^1{94RJ>)PY^zjJJT28C_bn(}kNnDS+G!AF__J1e^rT8lwDy`VOAaAR zH7mmPkY2%O_HNeLg_gZ5M7vssN0NHwK=T zR08ng?LB4vBLQs3fk#YImwYRj{hOY=&yBYoKSffhym_f3$e@otm0CT(sQn{XoT;$H z4Js9?tJL`sWN@J-wf>8@%)FS@idG+KE3xfw0U4TzPq7H)x@K6M4<>zctMfEXlhRy( z$ko(PYIwFO1&e0_5vv`bIa$}9CD!UF6@A{Af2%6|Pf@jUv(;6T?5nom{=_wZ)8kEw z{^W_j{he87kTpA3%(43^yhq;_3#Cm<8+j}l`;?{s((+U;hRzmvFgr?A zkd=zq7{h3sGwA7x9;~=mqntg>6duS8t)Ld9r-Qp4a-keq3`pF81)`vo4p;JMxn`Rp z_CK>wIJ+TTnH?P@ntS^?AAndU{{Vj}Uf^xEepzcF^Z172-I>jTnJZouBCF@`0t3%( zDtZzt<|LKr;y%-5Vnk?!>l|0DS_*OmJ`hXM_@=FLqlg&7SVIaXDCy5cQm?40GY1w# zt3vEfNw+0rBrRB^JQJmSjI+7Eh98&d8|ci+BEH1X;1Cg$sZ(FMF;eyv?{E9N0HPQ< zG=|4%caMqiRm6;qEv(RVijr}$=p#$?DTs+IQL+4E#H=d9Ravp0MRLQYX=5hxa^m<* zN9^apq?`<2p%7U6GtZV;j`|XI`&77Wh?7cuRtv}JIn>3%l^86z|70oCL-MLP*oRaN zSB??LwdiTM;mQTNf!et;)~m`MM`cq>@tJD#8JhA2W7k&dI$sgGr~~z;Bb_>kpF!wo zm`bNhi5qvigq;x8gk29nUzcEzQ$*B>*2b~h*@g3%8~WR>Tzg-QY&1dD5y~*PmdZ*; zxzCnK<>rBdc{B0!y2`m+-Y^EmRggYmjE9vjDDnXUnE$szvA)jJN6V`yHOlUZ8qzUmxS7gBqN@tUA40PcMy467ZZ zpF5yst)QHR45+F=*3$^OlB(x{S71BsswvdCL2tNfQ=NesYpNfx04ruZS&!Q7^;s_V zrc+z;f=Pn74|r4?d=kUrgdE1iwzAdquGea=ig@Nh$lpxPt8({XrpHGlxRlTCc{p=hpya<3eY zyC6O)(O$fxEK7i<^rbhVt`8^2G;Vv^_Vi*5eA5XHFWzK_U@DHI5Q+;TXg*O5EGx2GHl)eWD1-)D3b9 zF9}<62O^_{tZ>P9c#Q8qyXl!Ze&H_a#LYsrQI|C0LjJAfEgFe&HF-_EnfUrq&F%=m z+*{{9Iu+f$XsaU>(Lf)NF7R;rudM&fVVf`fP1Bj(ZnVUjsN@np^}%VYI%t~{u=KVJ zhSXE#x+4mfd7*jVP2*E-03@#S%8jkyt>zQUTsCFx#-lpJ9FJQAWnB>^lPKS)_dZhQ zdmw}Pj-);@BhlxV)&?0EkhaPk(La+fQkNDfBjkigejC+Y#3~%c^FYtaT;(bt=!$lU z!%I!QC$X51TTpccCFBxP4J!TO*#=B|)e7-c3Xru_s)9-$*G0Q^nVEtP^hwPIm@26# zp>7Y^3L6Scg#2ugxI|(UzN|BoM+wG0E^^+i)N3Kwv5zd7e{mW+9nU1rbvfgB&C>Dt zHz&v@%UgNIRPw%DX-Ljhb`rxspW6N^DHeD+6w@a5zo3rcECYOqsBtD$2B&)iq# zJe>Q8bB&vwxvB9QeZejAYmx$I{?a8F?datuYRnz4E7B`Ec-5Oi4|i1%56t3Cy&;Ol z&SMtXVFmJpQpNRl`MM8Ppxn7n4~<`anSq8Q^{nZ{S{WIV1IAul)G6ZvgJFRDG9Km= zeYX1{FL7*xv6I3$*2u#eD)u`Q`q($;w)H>bTB=Sc8($L+EO*#|aV7ySugW8Bz236L zI!%g`;D*$`im_@2)K#=^#b#Y6>H#_tT2==)-E?wo;o|;m7k)w&QK;fDuA1UcB1Or~?0`c3c9Lt1erfS_^l5s{L7fPm z=%xe%Msw8PlMr-9)+fsuIRyd2ZR@}rc5u$;*r+$|a*-Ng`J>fFFUeZ;-LKe`b_4E8LcLG-Ni;&kk^ z8>W;Zc9`2USm_NLau4ISVF{__+)YgC1JKAbY}`L_3FWA`3a)d?MBIl>lVOG9+FUHN zuZo3R&A2))EgU_Ux!5c?T{PEM=0%Kr6O{%~pV^^fGLD?eMf`s73y#@HfsyB0ajT9A zPEuI>|917B=WNA!WS?m0HjM5HiJFC$Iu5rd6QcRQZ`@auoF{^no& z8KiigBDE)dfbm6Q!)_*LqN5`kyfxS(-E}=Y<_5mk*Y?nwlu{OJ!@#1y&(NokoC)dzU@~KV^ zf1P6VGpO@7@`G;sbIeX0X8hPkK}^Vw)k~_YD9lQ3-6&*M$^K$XEf65=BP4%~1__~tyA7f=ybA{0 z$0^2K7l()v4^s)FHbQD!uu52RmuP>XlFP3zUE|QYuqs^^<^oek64IRK^@iNRro~D0T<<9ygwUA7_ z8(`H?C%&mq86=jwv_L7Q2JLqN#K{DgmPMtIvkRwm?{tEM<7H6H z`%F5Caq~)KdhYh;=E&;0)0ghZIY+JPV1N&iL-C9cI}yOksy|7CABMU+K*%sn@nC9L1^u zw4bUlH>^`JonryVwxvleCaazx?TE3P*MA28t9a&2jK70Y9(N?yc=TRMsL9iCRk5qU zsnT3FT@scCoQv;zP%Zwnd_tY}f<-!*tjdJ?()}PsS>E4`VGhVcSj8VRl3fhvQa^sDO46V4J3i$jo!Crg z(coW^VoUsneSNacLf5Ohh2lfnE_C^;?t=Yj_pvt3-GiiD3~PV>y_CU6{PRcl)KA$y z`LVym3Co_5^)p^_JBYQt=%;YR6Y-r{UQsA)35s0BI(=O_W={q-iOC@6KOnLk;i!Uf zv2!V!PE&|)?RNGILc)qX@#A!C6oQy>YC9cD=|b8>ZeT!2dAk1iQj>&%g=x#e7%m=Y zn+d2h8?m}I&HELC1j^i-nexO+T4S&-iMRky>;uBG|)>g_WZAo z{vPz_+s<_Be$m*7Hl=rUS30t8cYgg=?|U!3_`O>%z4%wx|K0Ul^Zs@^7%Y0-(Q4K2 z_WSEecQIVeyS?7Hw_I#`i|KTtXNR}O^KEal?vJ~x*=W@rZAbm?a=jjP2a{ocx*2We z{n7f?b;~FfZiIvDv-4bxlcniOpk2J(8nnS`Gh7VEz3yzX?RQ6m>9{)^%;(+VYB-q> zSBrjsyVwJo#L6XYz4J$xRS{$tCglpe=ESnrOW3aZ^YLu5>aJ&Vusa{Gy35gY*qv-= z5I7nQH{Hdw z-|xt%O7N7$E3#2g73jus<8#tLDo ztd6UKRK}Ynl>-*V8rrQFJHg?2dP}i-hwT)cJ6evn+x`fqoi1nH(ReiLE+^Z0cRblF zSIhONw;7HBUmko>gC>U5mQ;CQ>T_MrtT$RtR!CldJzb)*2Gj0xGhTLQqvdptwb+cu zfq`6rVU<`}B~KfvtdCGxkD!6-gx0kOCC*y&^Z+5-zzMMP5R=y5z|O73<4Q{tAX@uFGE&HqPV!UNlixDzx>JAJlO`{_v$CH_I)ODGR*l4d>m(WH}!#m-EGRB3(xqA=rQviu-IG z2^lG0AZpaD*&4*rcC#J#29s`og_Z+v!|q}Ooa60$Jnb!Jo5^wlh>kaE^cg@lYUpbZ zWPi0C&ij+@pg+N8tVY<3@eJcOm`~Du-sWJ4YsjJLvqZFjR znvlZjWsOj3ux$#d;2?S6X6ijpxAvjWO-@yNkgL_Sj6PGH|o* zU_KfTCWN<}fr87U!k@xkRnGZoDSgA~pg&wq@H4lVkI@E~elftzjc1!BUfgiL9M1sm zE-E>@1so&G76BPrKK0QVCb-^L2qrstBRX@5N`?1B+D9RMoV0PDuw%69!4_j2{`q#b z?hY1s`HKYxdL$*CXW4?6mPT@Nj$Ff0QU+~}(>b0?Z#JKG7t1j?9T4x%`g4Mj#d6-; zjyCn2f@t zJ5%arPN=kSKT5X7!$UER%thZg{aN1jqd-%j+kbS_YDKBRrj@(PrP_2nR?+-`o73LR5 zLUJ|ffzDySJD9GP^BFPFW+i2%>Ez}<5+=|FR^BsRaE{CHOtLMWZVg6%vKmdu-F1gU z9oI81Y8%uOT#)55qR*WILyam9QB62 zEG6z*gSy@IVBsmAXD1KOp#{jtq`7~<#!Iqy->t~`$F%-iPCZtLctkH zuPIS3d^g8=9V~nB-Ece}!VUAGWI1+597qJ&VCNYmls2?O-cAhKc)04}Lif7k%^Y<; z#E37*ASyjKT8yXj`J^Y%6#wN3C8uaUK#eH3PumIPt5fYdDy^J$5*x@pOx?xyiR1}E zBH8Rk7jlc}_^V5@blu*1Hbt72TXIf*84?@`MQ)V{yUpIe>a#GpXgy+a(J`bf#igAx zkHPfmxz`vW84W^Ob1x~{@k9xxao_yb-kc=qblu&o$=9@ZdQHN{CGR)&KAP~26Ti<7*Dq2 zsp5hIcfF*T18A`noZcF&NpG(3WR7Pt7*p)nU@<8o5G=0dtHB1ISPHD7KY9lv=sMo9 z*(p$lF=rAyfpaj8vwvwlRGfC%8fZ+wWU`&$@=w=@-g>d=&R45mcfDLJH=8-4xL#EN zeYHTXh8u!z+>Xs+1W>aTNrK*R+a01qhrKPOjj6NaQS-dVjLhUyjHr6cbPDLt;YVdX zwDUkNU9MdvP8Frm)|gzP2-b5VsMTgeyglh-v8DsE27~oryIx@uMoPovPO&6e)fYvc z=LpfK>XZj40jv`W0w?;)+dw6?nF@EeHvP$buv)?KJ#wd`@sQfp2=WbPqfu`#oJ~iQ zl`FtWvnwLdc5@Jub!k|{U`RcGpuXil}y(`d~pC?fU)DNW|4$J0|%oX7U2im=N;vi5wN&_mC4 zV2F5E!+D*Mobci1$kLL8p5bxqZU~U8lke6jqNn=X3iLcG3=>FK&>;>zCwaIzdW@HD ajifB>Kc_>oKm9;8o6*G=S-3&W{VPr*d#U;hdOY+{6pO8P0pP+o-sY_S)bkFqc%up-K%jIlO zcU?}MI`=wN{lNzx{KL6Voa3+jT)g1RPmp%xZ|M7-WTt*P7cV@Ha$m*&4^Zve)923p z5B~F7*Z$3)Uvmr?@(6uJ9zHG{^2q=Dx!?M)-}}Tl^Ox9|o%`Ck=gxga5TmLOve8hg zN4_7*MLL-IpsxRW|KYd7q<8Vcw}P0TyyykI>OS|4Zm*lamLJVuoL`>5kUz-pHdEcnmncf~Vh$q`EYVcBqLe`R2{oY`Jn=&F^0&e1_H;8#D6Cg#xOTAP->GgFPj8tDG_A0ekL2(o9 zqP}W(U<;rN)F&i@C+Ul*W4TMcZnx(J{53FZ^lPdR;L8;9rclRGem_5%eFu#)D*5oa^ z?bZsVw;eLh5~1TD=z|d)GKGfdDOGBzx=hHR^ImZF30X9qAz}X2QhW&^hg%_JF?T*b zgxm)qzYb}8ZT=#3^s(saYn}XV2j3rnupyG=-pif&w{dxgwp}N`$+Gi*lp1#`^iI34 zs^vEk*ug-PdQwB`@lsk(J{q*1RE2g3MFE;$LhJpl(7HArAwE79LOTMjziFxZj#wmn z`2G&)7(R&-;`^4+A1#@Ov9?UovS~t_zZWFRsBe(zuwXw5G94zmaxIKpr)j&K&ZAXy zo}@6a<80_9*)V~_7{U0<`mr~HVdw{aTu#TmKvbj{*4<}@&p$tX?yFrY&F<&BKrT&d zts~dx1Xe~1sAycov*J|Bn6;n&Mx)u?WNi~6g0PZJPh&p6y;)M?-AX1nYjkM8*qZTAIy5@Kd z8Mc$q5;`hNXlVv5;dh;A$=Q|23MDmC^&!lUTMVSa!oCSfb`3$Zt1!ZOyEY&K?#~}| zD8VHBdIhEmA}zPYiaAoox6*4R(W}FKW@5+-vEqevZC)VrZOjY(N5Kp58mOTSFF;Kf zMhF-oU}VQJwKw5~l^$q3nezORLIfJa zPTOV73Ak3wG_2HgFjg00BR$Hq_|ffSC84+`gf+C*6=_oOML%c+rbMJ<*Un4{Xa-k&My~iwds)Fo3@$rlur6aPm=S7R){O9H z<76886K@tqffvR8*c(k|kvAAl(sVk2Co#lAnS`OmmY|@~Qoqd_3yPjmKTcslt-_Wh z=k@&F{F;qcv5P)n%9`l?8G;k03q_R*ZmUkM% z`o?OckEyD1OpvJ>4U~+j1y~!}&1eKHlkJ#gbnIG>5PdopN8DpjQUM_AG1LdQV9uSu zlDi7O6my#Y4EH3`n!iF1)dX70I)!o8@||LNUBX=N%nwD&+*!q1{WO?P;xO{EFhC4t z8uz_)Fd2E{Xxtx<(qu9mP7#9Qgk}6F$58&*27B@7tZ|*pffr!WO_MPJ+?0#JK($E? zDrR1wU3;HgY-I25r}-vONfeBD{gbX}1o?}lcDE27H}D!~r0J1r9tGUd3k$0oTAvA) z5I>8f{v`B*Y?>hiGY!2o&H4zz_*lyhvcV8*PH0LwX)dTf^8(PI87~TjEE%q4RPBWH zB|`-vB7}k-=+$T%n@860`Y?JGbZg`66hgcu`HA7i@EFIg3_m8}aPaju+;2cpEB;N) zWZB4CghJ$}3u5ku?p6giKa5@<6}7J!58WlTf0RIJPwi9|N+p34#1d3y3@y7pqKeF` zVFr~!zI+)nswmH9S}v(YRJCI}^s zLNA*26EBTnzQxI4I2~rwaX20^i%>K&J_xLyrQLf*Vl7xF&W5Gzid#W`3ax8rO)~F~ zqtRB~pf{e5`_TxAmg4{>Z4}3Wm%)VblJO`@k}RC2NF=~is#MDu<%3`lWD{@XPhj_q zfWB-tjlF^2hY=hP`u!1B5Z5wgTsQcK(7BhPvTx%5>e$b!(ylOddg(~UobKin5gX>) z?X-3=&7~Al(xlA0F&&jefdduC!@+bs_55*P)&r;Ba5kBFqihzAqv>c6Pw7I=M$>+p zB3*ct1(@sE1j~kl$oKqYGMW1EXc$ffW5T8?ksc56Q~A)3Ku3{Su0b!$dZQ$rfm(cT zI*wB>2#{fzO~x}+9r&Z+G#rhSjHbItMSO_u4rgzaOlN5pc(WnaGoyHfK*cy6dK1uH z7RR%ZpO9XMBS1LD!gY`iV>n%mXN-nJ3^R-|nqbtQN-zVUOni(3qXPYEIMQeo1CG?k zD)-QjCo_RUyXJ$|kb?zUQ9ouWtweVmLRF3mr3!|HKiaZ&ONhZ4v|~-Qf*?4lLOD#h zy3`J-8cb$5GI0rO!YZYMA>;-ie}qzZWaS0vABe{apnf|*v9JI@3918VE5fb8Czr0( zf;4;+wzz;#x5PU5#Daq0le42_tfEu|7)41Nw~gw(CCRs>NbOxRJEh-`k-d)O^H`5f z+XwvSg-ZiJg5G73QbbZU^EHHyXd9?8HxyVMYi%l_5vmaz!6E>f1z52MxD;>?lzwo@hP}vF^;WM78|W_aPxjz+4@1Z}Xn|SH8>p5O1Zj zMbqW`w(0V1)3kcfePuS`U>LZr>#}=TP0k8n_4d$2C zFa)gpzRJbnFaQ+NgbDLYcFmmWgBT7CNYs9aZ}&U6fefBX%EEyXy-c%F)GCyWOFi?r zefotpwn(uDIkcY40M+`aCCqYa(+G{g3XV67-!ut0Js@-c8KUyHn3#f z+S$?krCw)#`5-@rthfp1ja$^nOTt)eO!g8xIc|&m&Rr=ij=GXUXP8}5Z>#MaOV*v0C8MN9agZe0bLjJFjZTgYOBiRKB@dgQa z?|`2abAD z)%-{K+qnK^C%@i7a>d&S#Qp^Luk-7T{0I4epvVvN8y(#Le*R>2+0>owYS#q=T|MrT$N0C{b*& zoufTTxTZ+G4Rhm7FqUijdX=4B4h4c8$UxnyEoQnWmQSuK_2B+p;{wooR zKNH&s!H9$1B$@1Y^0xq?*ld7{u$`Bo6Ga^0Np%bu$qg8SH;~?Pg1>k3RT$`X zcmM@9m0uAIQEMmzZSB0M-|p^zO2Z7~Fi=A|z8bS?x#tzk98#%dVz`kER;ZJ~gCPoC zR1UxpWY|=Zts^gNgFH!8t=GubdUjH6MHRZJVtuA3eaE2cQ#doEOq2{-3OUzO2kPHO z2O#|UWjg`Qt(vr`tt3Tto+P_toXSAaZ9g(@;c&qo4&@LIOE;~krlWrvMzTHXB(Q|n zas=7V!n&2|IDpK$Lg^;5;wE?+hS=WL`J$CjdE1dE%50qLz0b4?N%74)pS92V;^JU5 z=MaxIGDa}EAw4`I96l1+QiGzcvj2eugWkt9;Y=dvS*mGaMrhB<=D_(i&>^PnJlO5i zJkw+&rd_w=4@0YJOt+eWs=xP$8BC0JWXAx38q!a??cPfOenf_>jD|DtV?D2o12FV>x4<^6 zhwc^+IO^| z6`i2Bk zU_cC_)7{a*EL#JTtlHiFi5iyq8p;2lw97~w42o9~>RNFfz~L`~^41eqCO?FEqpQ3< zk*G~(D3d~tOJou%=O*L|_uhcJaEbv;kniCpzxeg)$1 zv|$8s^0-m@1vQfV2m^5hU^OZs3q6%+3+AK}sStw@_;-y3SdKEQi~>O=b5W|v=i`91OlqzM{0xYWsyOu?~g!HN)VyJ47P3@{t6srttjSi4MK>jz( z=X>+3hFz?}J~GUhm*StSvId?EF*tDvZl+rXQ@$9aH1pR0(?R}oZS0$ZCj`^nL}(UL zk(T?lqT~%>C4~IMFL(>wbys-sh!9IC#rn7U#`#sKDH?ANhAnBkT@0?Fe+0OT`x4iN zf1^X)^TQ?*qNb409;0{A9FUNZvE`F~Rm|6hIkBDb2I@e^8E4B%p`+UR^r?VrcICS2 z#uUB+Q_+aABOs8jB~~M;Fa?wX@ydXwlLpIxvYAp6&K&evjbbxWQaJ7*I~QHbQ3@!i z+N$Y22f8}+0IGv#dS`swbXQlqf?SScyY|Z&8opIPC*qu&0~cVwVA%X=HFQPWG^gN~ zi)RD8DoQ9+W1BfES)F^DTu#G86zLlgSXEj&kYR`nC~L3LQiqU~SUHMXOjzy63Ta22 zt~QpP>R^iM0+5L$fr;ya?NtbjoN_|V)}(I}AEszMPovDit2WC-G!!u@aJ~`BN;Zi7 zO`9R~qLPh!nmP+y$v`c%HzWc?>BYogWky2hR0346&%|#x zhCPz5T#o^`UlhO?n;MRiS9CR)g{%xR-4IC7dI0FNPSl{8I@R2W69zf8FVmnIMD&%w zkibUi4$deRqfk+a!LNflErmB2)d5se70pj}D7R$?K0O?6CJ>VvQQ%MiZpT*^om$`| zsnt!MrY-;m?+!<&mM89tni9)q8_!MMD9X&J!9CxetXoduQrJl|OA8ca(oA^nd>3Yl zMqcsIk-qLTpt}CaYNLlK1eU^;)6V2T2922r1W~6V*m_sBa}o#B4@?Tekys)mAjI6} zhfm1;ij^xG%=z%D&tb1Tly;buq%({l&~>IElo<$)a$f9B0~OP-bfDqeikx-dBA>*j zeL>kJBHsT~tk{4xFF`FEM5%GfQRKIldK?*=30=*SlSGQa)Fi=L>jJ` z8!nr#WFha4Hr0@VDI}@x+(@)qJP*URHt|O6t+A?085tq96UYQBkcHHc%ouc z|0Mj4B=rh2ZU?N>DUm0Rye$W73x&&O2Mfxk5p*os18f^n(X$Z{X z;T+~%xv{20{tKCHF@iB|w+o>qgrt*oIo~D-R67kj=}Cz}hY>`CRs*kF&WqMw33Hy` zzksl@;@0*2Uzy)`1EqeN|FSUx42g_*0p=O&T>7xNf{PaB ze_{Co$ll-;a)^Gg|4xxP@mS|GHR%jHnLWm4Z$iQsfk>R?ihH-g!0tU++j8=u<}WED zOeIDv(HG9)9;Jwi@P`8LY-G&Ai#@f#aHB!Z0cws+*}6yp#(Q*G*r&; zsWE=UfS^bOMck%3aa;*LQxQ%gxMouaC8F|dWG2v|_I$YV1QL9N+e?&wa;#mE^D-zP z)`<-WV6s}MquB3>D5*}hJ+oYK5B zD6Q3uTCTvoanl)E@?4!=yc6S*tNs!QWBgP3=CagUVFZNLK<6M9y2bFjaZQKx8W_@9 zqu?YNo4aVshLaZCECnFDj7DsLAD6)$8wQ+aAi!9QquMLb7`W*%3acyMv^>BDtJGNq z2T7dH>)FlhQpU9N@g9lRb*G2~Vl1l`Mi2>g)#NdGOC$l~yYGQQ^)acY8>Vm}@{WB^ zDkP}_Ba~JW(xy13oH{-@I3PM~Ktn{{Bgipy+<){>*A>1iSdDOArt0D79#S06UxXx9 zDupgE3oz8LMXozu)NnXd6EHNN91sO1t-EXM>HS3Di8IAwhyiY-XDGhf2KGSW-BrU9PHL<(f*W$j@z(PAS) zB_L$*idt&o-|G*7HS{dh52UI0+5j>EYgWgYFGa@6G6H&NRbUsry9ZQ~X=xnDDvk{q zvn;tm8&QUG=Q^Uy#~^+)6oO&rbwOj7^jL$KUqARjCwzt6FuDnA_Qg=Bbqw6KTjp4H zrHO_`Hfa*aE@+fg@a15~Y}F~Vn_(-&52)@-n`mFlU#*D=odG=V40r9(RmTXVKM_r! z*NPv(N82?^+2W#tZ815{j%{s|G zlNUxczK*cL+N_)P27H}vFm)X$k5#RGuij1o-sdYUZ2nJv0=@38kCmG{v{`43!LTC1 zO4(a5H;`ntG_Qol&zkL3z>-Z??tTlX8kLQt3X0Xwa89xCS7~AYOB9Ezr@@>(E2m=w z*(h~S$H=C$aWGXU8{vc_9&y<2IIf%4T&_E<=K)lTB+iIE*MJMv1ghLq#w13yO%(}RGOWOi7GZIwt9=DB@5jZAQ&^y?MMO$ zqbesKrxSO0Zt<%;@qUglIe5l=j_dQT4CsvJf~yy6@)!IvC9CzFK9 z!X1qRoYgdq#(p@O;axy|ys$9BtGCioJn;q-KlA%|#qz*MU7YESV;A*_m8ky7(eQ7k zarDF&{?d=1`rD_}&u72Jzw+@1yn31+_8Q*QvQB!_=kV~wKe{K z^RX|Wi4cE6(+QjSX3Ow&#ImXhg8j_nk3aQH`qWeFHi5bvh^fAI6RK-z0=={PGZ+x@ z&@>Q(aw6?>zyH*i|L8Bi5TKrI0@aC=rY2Zjs$jsZZkj>22A!4tQX1yjB znjs|XH6c*A(5%q}>$-zsGyEY7-^>@L(bO?>&uCq;dzqak^G9j@$2krZ_P zso(1$evMl8ZVDOOmrS{F%=YzM!SA#HlL!Ws6Kb>0I(+UTU`Pb3;4^FROB-vrrd$4b_M-lwO2eI6U?kWQY9=HI^wQY6K2y$E< z6jUOy=mS|@^Ot0-#Ju3F(hWelc!6hTVBM!9X*d!g=GwA$FR{N}o$jh0VD#MbuGXG0 z$u@wjrvw8h7OpzjkqO{_p6VE7t3Sqvb8r{HLjBJCpMfhm=~^v?!Z(+5k*e-4&kf*G zN`v8k@xm@ok;aRZ_&yuF|4h8Lb@pHg=x}@G26FH)@Lo2&JZm=bB7Zi+ zyNd@iuRk2elX2*e)9FZCk?a(|+J<6(J4v0Wfm6L0S(6t)08yDC7wg>A($;FIJ7TM* zVNyJCR~{j#%`{)a=(biTYXEs#I8x6)MyTGMCi5&G0|!F&{%E<~FB$lppg}f?$6<&! z?L>w6t`#X=Ud z3|3zBv*f7&WFm7c2i1+~)UFvCJy8-1u$6_Nbh)L%?VTy&i0J9B7uzb( uQ~$IEJxq^wn=w;Yi=M3%ZjT;P5#^Q>236uqed>l9+EbO)`+qQ)OaBjE6%`}^ literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/ФормаРедактораТекстовогоДокумента/Form.oform b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/ФормаРедактораТекстовогоДокумента/Form.oform new file mode 100644 index 0000000000000000000000000000000000000000..d0768825ae2a6d4751d2bca4391108d7a8cd4f38 GIT binary patch literal 8806 zcmeHMTaO$^6&~dUvC{qoq}K3aOI=GkEhoS%|UYCF`}bd4c!p2Yv@X!F=ab_e{_1&U);1q9`!4+uc=Nb?RKc zI+vO!PoDf@^wNm___Mwy`J-&WcP(X*HvSW=uYCjK{{5BF=n1A>!1F!)({nfb|F z26}jC>ER*qFo1{q*XGy$`JIzH1R-Wa_$s)r7`rmiI=j(^)x`7dYUtjaYuDc`msXJ)jYTt4D?M~qC2ku_`PWwx=-U{&Yo_p-} z-6w7mU>y3;c;F`J_@v!+4}*3G9f$4P?GDlF8Ju9;geJB-puGD{?ho9ZerzBDcbnc} zfkTi+^MQNR{w6@H;|KTqyv_l2FXhTpUSD%JiCFt9Vh`+Nd91KV4J%%nG2yPb%e|z~ z*HqARvmxi#*S?BBygh`(N5QuP_c!+lYp_m0ZWnq#!fKD(-3=J#h+cmGl^^~9rh#P8 zX*Up(TqOYqD^7-MZY)mNcsbv!FKqqz)eF_dpM7hdjg9ZV_UccIi}_~ty?iU*_))z@ z_jBV{>Ys0o!-1O5`-wos5!l~{b{4eM?gntCq{A2c@i-t1-U9S4L()6$L%{AjLGw16 zm)%`-U2}gRh5iws{D6UZ2d}OKKr&(ceHe&dF^>cz(Bm=1K|Qx;nsX03Fk^c_uk+jH-1!w?MK+=@ z#cq|Sntdcc%=^eUbsDa(y{Qtq(nF}|X}tNyI2^;+N3@$szpxRE_y`Jr;H^hyUa&q! z!%x7n6Ab)__a%6T&CoyIUSHb|ZD@36vLw}6yiE(qtSqZCO+}rnT$ntmL|&*;L?(*s zyvntSB4)7XPkIKU(C~Do3ObAJB#c4~-NuFAG7+Kmvhj=aBh1G{k(cBb&?g0R+Y%oLJQMGsjx{^h$M~kI?w7-mxb3f564ofQ`~Vp%;W9s_?oBJ<4vCc zFXOexX}FYv?hBXhmDg4e0o!Sp^a;u0FluZe(>xJH92;R&sYQk@CUPyCJTGjW>70P* zp`V1hu5}e9N|-pSgfT@WtTIaE%1EtjViHZX^P;L{ndL%R&^CA$MUjJSqmv?2s)%a# zE-K6_nd{m}QDmtVN>xT!QzQ_^N@J^BCRIZw_i})f#*{h%n@ycrFo5w{kxG$jTcuT= z*VYgNO;JbI!iQir$kkM_urXGVX$8)b0&B7ck|APxl`UwJoBg{`8O8-T&%z?Ljjpku z>oVz>&#JP)gjg1Nt&1|v2%oe`$?q^6lTg-a4j-pQ($w$@CWdxQ(}=Q3lQfsHwwhF4 zt0dDrOvVKi9zh1U4RRh(c4SkNlz!)rIh*(_;^3GTpnd&W1=?7D%`IWKmgu{Xs~Qzs@QoH-o}!-&93^YtY9J0_Av2K?uRurewIc9U#mf$b>~?dIZ_p9qg{yJ*7RYt{Wnv164z2cnj-{+wCk zm;(~1EP`*Yep(5^@VG0w=9&T~>2?}6S8~#wthbPueT@7K2{R>?bZ;*$k>e`fKBTe| zRUlILE>y(`?4q~*d$RT3tab03@(ktD%ok*K; zMc}O%+=wCzNh>80f;5!n5sz+7IUIsUm-cjxZVq$i)vA5=JRLqiLXzrFBS9ECb->fP zST>@QMf=>lgDJz6_K9CqnWqLBvN(TP44*HPT~;X4?5`NT)@FeWoI!^K4y0ctR1eygr@J61%o8-rz6(j4uPW13T> z4N@&{xlnNu>%Fn>ne8l1-Uj37?OZR4QyNQ54Etm3U3x>;VZR?erQSK8o^}@n`raw+ z`TiO0`F_fe>D%$xQ(->5I|L_vFZlC()99HejU|dkyfI9L`{xSCK`l9WJYH5>6rZSF zsZOPu^w~T&F(7Qm>50C5nOEhFjtdDDoteh6RXUSm4f=KpXLi|R4^G=o+>&(4Ggo2} z8J_NUr72CW=~SdCBVlw?i>$1b&?x*&)>KkSDxe@G{=SfI8^3`;E6;J#LkQNUtg}QV z0zn^%aE;?ztm&ko3b=bQnLXC$#29KGuOQXL%mwEsjXE}W(=f#o!!PDYu_ fDM~!lNrFBPWob~)u>=D=`jJo1QrS2>S#AFpYGXr^ literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/ФормаСообщенияОбОбычномРежиме/Form.form b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/ФормаСообщенияОбОбычномРежиме/Form.form new file mode 100644 index 000000000..f14806e4c --- /dev/null +++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/ФормаСообщенияОбОбычномРежиме/Form.form @@ -0,0 +1,137 @@ + + + + Декорация2 + 3 + true + true + + true + + + Декорация2РасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + Декорация2КонтекстноеМеню + 4 + true + + 5 + true + 3 + true + + + CommonPicture.Информация32 + + + + + Декорация1 + 1 + + <key>ru</key> + <value>Данная обработка не предназначена для использования в управляемом режиме. Пожалуйста, перезапустите 1С: Предприятие в режиме обычного приложения.</value> + + true + true + + true + + + Декорация1РасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 2 + true + + Label + true + true + + Style.ПоясняющийТекст + + + Left + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + КнопкаЗакрыть + 5 + true + true + + true + + true + + КнопкаЗакрытьРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + PictureAndText + true + true + UserCmds + Auto + + Right + true + + 48 + DontBlock + true + true + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.УниверсальныйОбменДаннымиXML + + + true + + + true + +
    true
    +
    + + + + + +
    diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Help/ru.html b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Help/ru.html new file mode 100644 index 000000000..6e6a4922b --- /dev/null +++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Help/ru.html @@ -0,0 +1,49 @@ + +

    Обработка "Универсальный обмен данными в формате XML" предназначена для загрузки и выгрузки данных в файл из любой конфигурации, реализованной на платформе 1С:Предприятие 8

    +

    Обработка имеет четыре закладки

    +

    Выгрузка данных

    +

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

    +

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

    +

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

    +

    На закладке "Параметры выгрузки" можно указать дополнительные параметры выгрузки данных.

    +

    На закладке "Комментарий" можно написать произвольный текст-комментарий, включаемый в файл обмена.

    +

     

    +

    Загрузка данных

    +

     

    +

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

    +

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

    +

     

    +

    Дополнительные настройки

    +

     

    +

    Закладка служит для тонкой настройки выгрузки и загрузки данных.

    +

    "Режим отладки" - флажок определяет режим выгрузки и загрузки данных

    +

    "Количество обработанных объектов для обновления статуса" - параметр служит для определения количества обработанных элементов перед изменением строки состояние загрузки/выгрузки

    +

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

    +

    "Протокол обмена" - позволяет настроить вывод информационных сообщений в окно сообщений, ведение и запись в отдельный файл протокола обмена.

    +

     

    +

    Удаление данных

    +

     

    +

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

    +

     

    +

    Отладка выгрузки и загрузки данных
     

    +

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

    +

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

    +

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

    +

    Настройка отладки обработчиков выполняется в четыре шага:

    +

    Шаг 1: Выбор режима отладки алгоритмов

    +


    На первом шаге необходимо определиться с режимом отладки алгоритмов:

    +
    • +
      Без отладки алгоритмов
      +
    • +
      Вызывать алгоритмы как процедуры
      +
    • +
      Подставлять код алгоритмов по месту вызова

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

    +

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

    +

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

    +

    Шаг 2: Формирование модуля отладки

    +


    На втором шаге необходимо произвести выгрузку обработчиков нажатием на кнопку "Сформировать модуль отладки выгрузки (загрузки)". Сформированные обработчики и алгоритмы будут выведены в отдельное окно для просмотра. Содержимое модуля отладки необходимо скопировать в буфер обмена нажатием на кнопку "Копировать в буфер обмена".

    +

    Шаг 3: Создание внешней обработки

    +


    На этом шаге необходимо запустить конфигуратор и создать новую внешнюю обработку. В модуль обработки необходимо вставить содержимое буфера обмена (модуль отладки) и сохранить обработку под любым именем. 

    +

    Шаг 4: Подключение внешней обработки

    +


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

    +

    Примечание: Возможность отладки глобального обработчика конвертации "После загрузки правил обмена" не поддерживается.

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl new file mode 100644 index 000000000..8a0c47160 --- /dev/null +++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl @@ -0,0 +1,13924 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ИСПОЛЬЗУЕМЫЕ СОКРАЩЕНИЯ ИМЕН ПЕРЕМЕННЫХ (АБРЕВИАТУРЫ) + +// ПКО - правило конвертации объектов +// ПКС - правило конвертации свойств объектов +// ПКГС - правило конвертации группы свойств объектов +// ПКЗ - правило конвертации значений объектов +// ПВД - правило выгрузки данных +// ПОД - правило очистки данных + + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПЕРЕМЕННЫЕ МОДУЛЯ ДЛЯ НАПИСАНИЯ АЛГОРИТМОВ (ОБЩИЕ ДЛЯ ВЫГРУЗКИ И ЗАГРУЗКИ) + +Перем Конвертация Экспорт; // Структура свойств конвертации (Имя, Ид, обработчики событий обмена) + +Перем Алгоритмы Экспорт; // Структура, содержащая используемые алгоритмы +Перем Запросы Экспорт; // Структура, содержащая используемые запросы +Перем ДопОбработки Экспорт; // Структура, содержащая используемые внешние обработки + +Перем Правила Экспорт; // Структура, содержащая ссылки на ПКО + +Перем Менеджеры Экспорт; // Соответствие, содержащее поля Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, ПКО +Перем МенеджерыДляПлановОбмена Экспорт; +Перем ФайлОбмена Экспорт; // Последовательно записываемый/читаемый файл обмена + +Перем ПараметрыДопОбработок Экспорт; // Структура, содержащая параметры, используемых внешних обработок + +Перем ПараметрыИнициализированы Экспорт; // Если Истина, то необходимые параметры конвертации проинициализированы + +Перем мФайлПротоколаДанных Экспорт; // файл для ведения протокола обмена данными +Перем ФлагКомментироватьОбработкуОбъектов Экспорт; + +Перем ВнешняяОбработкаОбработчиковСобытий Экспорт; // Объект "ВнешниеОбработкиМенеджер" для вызова экспортных процедур обработчиков при отладке загрузки/выгрузки + +Перем ОбщиеПроцедурыФункции; // Переменная хранит ссылку на данный экземпляр обработки - ЭтотОбъект. + //Необходима для вызова экспортных процедур из обработчиков событий + +Перем мМакетПараметровОбработчиков; // Табличный документ с параметрами обработчиков +Перем мМакетОбщиеПроцедурыФункции; // Текстовый документ с комментариями, глобальными переменными и обертками общих процедур и функций + +Перем мРежимыОбработкиДанных; // Структура, содержащая режимы использования этой обработки +Перем РежимОбработкиДанных; // Содержит текущее значение режима обработки данных + +Перем мРежимыОтладкиАлгоритмов; // Структура, содержащая режимы отладки алгоритмов +Перем АлгоритмыИнтегрированные; // Структура, содержащая алгоритмы с интегрированным кодом вложенных алгоритмов + +Перем ИменаОбработчиков; // Структура, содержащая имена всех обработчиков правил обмена + + +//////////////////////////////////////////////////////////////////////////////// +// ФЛАГИ НАЛИЧИЯ ГЛОБАЛЬНЫХ ОБРАБОТЧИКОВ СОБЫТИЙ + +Перем ЕстьГлобальныйОбработчикПередВыгрузкойОбъекта; +Перем ЕстьГлобальныйОбработчикПослеВыгрузкиОбъекта; + +Перем ЕстьГлобальныйОбработчикПередКонвертациейОбъекта; + +Перем ЕстьГлобальныйОбработчикПередЗагрузкойОбъекта; +Перем ЕстьГлобальныйОбработчикПослеЗагрузкиОбъекта; + +Перем ВерсияПлатформыПриемника; +Перем ПлатформаПриемника; + +//////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ ОБРАБОТОК ОБМЕНА (ОБЩИЕ ДЛЯ ВЫГРУЗКИ И ЗАГРУЗКИ) + +Перем одТипСтрока; // Тип("Строка") +Перем одТипБулево; // Тип("Булево") +Перем одТипЧисло; // Тип("Число") +Перем одТипДата; // Тип("Дата") +Перем одТипХранилищеЗначения; // Тип("ХранилищеЗначения") +Перем одТипДвоичныеДанные; // Тип("ДвоичныеДанные") +Перем одТипВидДвиженияНакопления; // Тип("ВидДвиженияНакопления") +Перем одТипУдалениеОбъекта; // Тип("УдалениеОбъекта") +Перем одТипВидСчета; // Тип("ВидСчета") +Перем одТипТип; // Тип("Тип") +Перем одТипСоответствие; // Тип("Соответствие") + +Перем одТипУзлаXML_КонецЭлемента Экспорт; +Перем одТипУзлаXML_НачалоЭлемента Экспорт; +Перем одТипУзлаXML_Текст Экспорт; + +Перем ЗначениеПустаяДата Экспорт; + +Перем одСообщения; // Соответствие. Ключ - код ошибки, Значение - описание ошибки + +Перем мСписокМакетовПравилОбмена Экспорт; + + +//////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ МОДУЛЯ ОБРАБОТКИ ВЫГРУЗКИ + +Перем мСчетчикВыгруженныхОбъектов Экспорт; // Число - счетчик выгруженных объектов +Перем мСчетчикНПП Экспорт; // Число - счетчик НПП +Перем мXMLДокумент; // Вспомогательный DOM-XML документ, используемый при создании узлов xml +Перем мТаблицаПравилКонвертацииСвойств; // ТаблицаЗначений - шаблон для воссоздания структуры таблицы путем копирования +Перем мXMLПравила; // xml-Строка, содержащая описание правил обмена +Перем мСтрокаТиповДляПриемника; + + +//////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ МОДУЛЯ ОБРАБОТКИ ЗАГРУЗКИ + +Перем мСчетчикЗагруженныхОбъектов Экспорт;// Число - счетчик загруженных объектов + +Перем мАтрибутыФайлаОбмена Экспорт; // Структура. После открытия файла + // содержит атрибуты файла обмена + // согласно формату + +Перем ЗагруженныеОбъекты Экспорт; // Соответствие. Ключ - Нпп объекта в файле, + // Значение - ссылка на загруженный объект +Перем ЗагруженныеГлобальныеОбъекты Экспорт; +Перем ЧислоХранимыхЗагруженныхОбъектов Экспорт; // число хранимых загруженных объектов, + // после которого Соответствие ЗагруженныеОбъекты + // очищается +Перем ЗапоминатьЗагруженныеОбъекты Экспорт; + +Перем мСоответствиеДопПараметровПоиска; +Перем мСоответствиеАлгоритмовПоискаЭлементов; +Перем мСоответствиеПравилКонвертации; // Соответствие для определения правила конвертации объекта по типу этого объекта + +Перем мОбработкаДляЗагрузкиДанных Экспорт; + +Перем мСоответствиеПустыхЗначенийТипов; +Перем мСоответствиеОписаниеТипов; + +Перем мБылиПрочитаныПравилаОбменаПриЗагрузке Экспорт; + +Перем мСтекВызововВыгрузкиДанных; + +Перем мСоответствиеТиповДанныхДляЗагрузки; + +Перем мГлобальныйСтекНеЗаписанныхОбъектов; + +Перем СобытияПослеЗагрузкиПараметров Экспорт; + +Перем ТекущийУровеньВложенностиВыгрузитьПоПравилу; + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ ДЛЯ НАПИСАНИЯ АЛГОРИТМОВ + +//////////////////////////////////////////////////////////////////////////////// +// РАБОТА СО СТРОКАМИ + +// Разбирает строку на две части: до подстроки разделителя и после. +// +// Параметры: +// Стр - разбираемая строка; +// Разделитель - подстрока-разделитель: +// Режим - 0 - разделитель в возвращаемые подстроки не включается; +// 1 - разделитель включается в левую подстроку; +// 2 - разделитель включается в правую подстроку. +// +// Возвращаемое значение: +// Правая часть строки - до символа-разделителя. +// +Функция ОтделитьРазделителем(Стр, Знач Разделитель, Режим=0) Экспорт + + ПраваяЧасть = ""; + ПозРазделителя = Найти(Стр, Разделитель); + ДлинаРазделителя = СтрДлина(Разделитель); + Если ПозРазделителя > 0 Тогда + ПраваяЧасть = Сред(Стр, ПозРазделителя + ?(Режим=2, 0, ДлинаРазделителя)); + Стр = СокрЛП(Лев(Стр, ПозРазделителя - ?(Режим=1, -ДлинаРазделителя + 1, 1))); + КонецЕсли; + + Возврат(ПраваяЧасть); + +КонецФункции // ОтделитьРазделителем() + +// Преобразует значения из строки в массив, используя указанный разделитель +// +// Параметры: +// Стр - Разбираемая строка +// Разделитель - подстрока разделитель +// +// Возвращаемое значение: +// Массив значений +// +Функция МассивИзСтроки(Знач Стр, Разделитель=",") Экспорт + + Массив = Новый Массив; + ПраваяЧасть = ОтделитьРазделителем(Стр, Разделитель); + + Пока Не ПустаяСтрока(Стр) Цикл + Массив.Добавить(СокрЛП(Стр)); + Стр = ПраваяЧасть; + ПраваяЧасть = ОтделитьРазделителем(Стр, Разделитель); + КонецЦикла; + + Возврат(Массив); + +КонецФункции // МассивИзСтроки() + +// Возвращает строку номера без символьных префиксов +// Например: +// ПолучитьСтроковыйНомерБезПрефиксов("УТ0000001234") = "0000001234" +// +// Параметры: +// Номер – Строка – номер, из которого необходимо вычислить результат функции +// +// Возвращаемое значение: +// строка номера без символьных префиксов +// +Функция ПолучитьСтроковыйНомерБезПрефиксов(Номер) Экспорт + + НомерБезПрефиксов = ""; + Сч = СтрДлина(Номер); + + Пока Сч > 0 Цикл + + Символ = Сред(Номер, Сч, 1); + + Если (Символ >= "0" И Символ <= "9") Тогда + + НомерБезПрефиксов = Символ + НомерБезПрефиксов; + + Иначе + + Возврат НомерБезПрефиксов; + + КонецЕсли; + + Сч = Сч - 1; + + КонецЦикла; + + Возврат НомерБезПрефиксов; + +КонецФункции + +// Разбирает строку, выделяя из нее префикс и числовую часть. +// +// Параметры: +// Стр - Строка. Разбираемая строка; +// ЧисловаяЧасть - Число. Переменная, в которую возвратится числовая часть строки; +// Режим - Строка. Если "Число", то возвратит числовую часть, иначе - префикс. +// +// Возвращаемое значение: +// Префикс строки +// +Функция ПолучитьПрефиксЧислоНомера(Знач Стр, ЧисловаяЧасть = "", Режим = "") Экспорт + + ЧисловаяЧасть = 0; + Префикс = ""; + Стр = СокрЛП(Стр); + Длина = СтрДлина(Стр); + + СтроковыйНомерБезПрефикса = ПолучитьСтроковыйНомерБезПрефиксов(Стр); + ДлинаСтроковойЧасти = СтрДлина(СтроковыйНомерБезПрефикса); + Если ДлинаСтроковойЧасти > 0 Тогда + ЧисловаяЧасть = Число(СтроковыйНомерБезПрефикса); + Префикс = Сред(Стр, 1, Длина - ДлинаСтроковойЧасти); + Иначе + Префикс = Стр; + КонецЕсли; + + Если Режим = "Число" Тогда + Возврат(ЧисловаяЧасть); + Иначе + Возврат(Префикс); + КонецЕсли; + +КонецФункции + +// Приводит номер (код) к требуемой длине. При этом выделяется префикс +// и числовая часть номера, остальное пространство между префиксом и +// номером заполняется нулями. +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// Стр - преобразовываемая строка; +// Длина - требуемая длина строки. +// +// Возвращаемое значение: +// Строка - код или номер, приведенная к требуемой длине. +// +Функция ПривестиНомерКДлине(Знач Стр, Длина, ДобавлятьНулиЕслиДлинаНеМеньшеТекущейДлиныНомера = Истина, Префикс = "") Экспорт + + Если ПустаяСтрока(Стр) + ИЛИ СтрДлина(Стр) = Длина Тогда + + Возврат Стр; + + КонецЕсли; + + Стр = СокрЛП(Стр); + ВходящаяДлинаНомера = СтрДлина(Стр); + + ЧисловаяЧасть = ""; + ПрефиксНомераСтроки = ПолучитьПрефиксЧислоНомера(Стр, ЧисловаяЧасть); + + ИтоговыйПрефикс = ?(ПустаяСтрока(Префикс), ПрефиксНомераСтроки, Префикс); + ДлинаИтоговогоПрефикса = СтрДлина(ИтоговыйПрефикс); + + СтрокаЧисловойЧасти = Формат(ЧисловаяЧасть, "ЧГ=0"); + ДлинаЧисловойЧасти = СтрДлина(СтрокаЧисловойЧасти); + + Если (Длина >= ВходящаяДлинаНомера И ДобавлятьНулиЕслиДлинаНеМеньшеТекущейДлиныНомера) + ИЛИ (Длина < ВходящаяДлинаНомера) Тогда + + Для ВременнаяПеременная = 1 По Длина - ДлинаИтоговогоПрефикса - ДлинаЧисловойЧасти Цикл + + СтрокаЧисловойЧасти = "0" + СтрокаЧисловойЧасти; + + КонецЦикла; + + КонецЕсли; + + // обрезаем лишние символы + СтрокаЧисловойЧасти = Прав(СтрокаЧисловойЧасти, Длина - ДлинаИтоговогоПрефикса); + + Результат = ИтоговыйПрефикс + СтрокаЧисловойЧасти; + + Возврат Результат; + +КонецФункции // ПривестиНомерКДлине() + +// Добавляет к префиксу номера или кода подстроку +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// Стр - Строка. Номер или код; +// Добавок - добавляемая к префиксу подстрока; +// Длина - требуемая результирующая длина строки; +// Режим - "Слева" - подстрока добавляется слева к префиксу, иначе - справа. +// +// Возвращаемое значение: +// Строка - номер или код, к префиксу которого добавлена указанная подстрока. +// +Функция ДобавитьКПрефиксу(Знач Стр, Добавок = "", Длина = "", Режим = "Слева") Экспорт + + Стр = СокрЛП(Формат(Стр,"ЧГ=0")); + + Если ПустаяСтрока(Длина) Тогда + Длина = СтрДлина(Стр); + КонецЕсли; + + ЧисловаяЧасть = ""; + Префикс = ПолучитьПрефиксЧислоНомера(Стр, ЧисловаяЧасть); + + Если Режим = "Слева" Тогда + Результат = СокрЛП(Добавок) + Префикс; + Иначе + Результат = Префикс + СокрЛП(Добавок); + КонецЕсли; + + Пока Длина - СтрДлина(Результат) - СтрДлина(Формат(ЧисловаяЧасть, "ЧГ=0")) > 0 Цикл + Результат = Результат + "0"; + КонецЦикла; + + Результат = Результат + Формат(ЧисловаяЧасть, "ЧГ=0"); + + Возврат Результат; + +КонецФункции // ДобавитьКПрефиксу() + +// Дополняет строку указанным символом до указанной длины. +// +// Параметры: +// Стр - дополняемая строка; +// Длина - требуемая длина результирующей строки; +// Чем - символ, которым дополняется строка. +// +// Возвращаемое значение: +// Строка, дополненная указанным символом до указанной длины. +// +Функция одДополнитьСтроку(Стр, Длина, Чем = " ") Экспорт + + Результат = СокрЛП(Стр); + Пока Длина - СтрДлина(Результат) > 0 Цикл + Результат = Результат + Чем; + КонецЦикла; + + Возврат(Результат); + +КонецФункции // одДополнитьСтроку() + + +//////////////////////////////////////////////////////////////////////////////// +// РАБОТА С ДАННЫМИ + +// Возвращает строку - имя переданного значения перечисления. +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// Значение - значение перечисления +// +// Возвращаемое значение: +// Строка - имя переданного значения перечисления. +// +Функция одИмяЗначенияПеречисления(Значение) Экспорт + + ОбъектМД = Значение.Метаданные(); + ИндексЗначения = Перечисления[ОбъектМД.Имя].Индекс(Значение); + + Возврат ОбъектМД.ЗначенияПеречисления[ИндексЗначения].Имя; + +КонецФункции // одИмяЗначенияПеречисления() + +// Определяет заполнено ли переданное значение +// +// Параметры: +// Значение - значение, заполнение которого надо проверить +// +// Возвращаемое значение: +// Истина - значение не заполнено, ложь - иначе. +// +Функция одПустое(Значение, ЭтоNULL=Ложь) Экспорт + + // Сначала примитивные типы + Если Значение = Неопределено Тогда + Возврат Истина; + ИначеЕсли Значение = NULL Тогда + ЭтоNULL = Истина; + Возврат Истина; + КонецЕсли; + + ТипЗначения = ТипЗнч(Значение); + + //Если ТипЗначения = одТипБулево Тогда + // + // Возврат НЕ Значение; + + //Иначе + Если ТипЗначения = одТипХранилищеЗначения Тогда + + Результат = одПустое(Значение.Получить()); + Возврат Результат; + + ИначеЕсли ТипЗначения = одТипДвоичныеДанные Тогда + + Возврат Ложь; + + Иначе + + // Для остальных будем считать значение пустым, если оно равно + // значению по умолчанию своего типа. + Попытка + Результат = Не ЗначениеЗаполнено(Значение); + Возврат Результат; + Исключение + Возврат Ложь; + КонецПопытки; + + КонецЕсли; + +КонецФункции // одПустое() + +// Возвращает объект ОписаниеТипов, содержащий указанный тип. +// +// Параметры: +// ЗначениеТипа - строка с именем типа или значение типа Тип. +// +// Возвращаемое значение: +// ОписаниеТипов +// +Функция одОписаниеТипа(ЗначениеТипа) Экспорт + + ОписаниеТипов = мСоответствиеОписаниеТипов[ЗначениеТипа]; + + Если ОписаниеТипов = Неопределено Тогда + + МассивТипов = Новый Массив; + Если ТипЗнч(ЗначениеТипа) = одТипСтрока Тогда + МассивТипов.Добавить(Тип(ЗначениеТипа)); + Иначе + МассивТипов.Добавить(ЗначениеТипа); + КонецЕсли; + ОписаниеТипов = Новый ОписаниеТипов(МассивТипов); + + мСоответствиеОписаниеТипов.Вставить(ЗначениеТипа, ОписаниеТипов); + + КонецЕсли; + + Возврат ОписаниеТипов; + +КонецФункции // одОписаниеТипа() + +// Возвращает пустое (дефолтное) значение указанного типа +// +// Параметры: +// Тип - строка с именем типа или значение типа Тип. +// +// Возвращаемое значение: +// Пустое значение указанного типа. +// +Функция одПолучитьПустоеЗначение(Тип) Экспорт + + ПустоеЗначениеТипа = мСоответствиеПустыхЗначенийТипов[Тип]; + + Если ПустоеЗначениеТипа = Неопределено Тогда + + ПустоеЗначениеТипа = одОписаниеТипа(Тип).ПривестиЗначение(Неопределено); + + мСоответствиеПустыхЗначенийТипов.Вставить(Тип, ПустоеЗначениеТипа); + + КонецЕсли; + + Возврат ПустоеЗначениеТипа; + +КонецФункции // ПолучитьПустоеЗначение() + +Функция ПроверитьСуществованиеСсылки(Ссылка, Менеджер, НайденныйОбъектПоУникальномуИдентификатору, + РежимПоискаОсновногоОбъекта, СтрокаЗапросаПоискаПоУникальномуИдентификатору) + + Попытка + + Если РежимПоискаОсновногоОбъекта + ИЛИ ПустаяСтрока(СтрокаЗапросаПоискаПоУникальномуИдентификатору) Тогда + + НайденныйОбъектПоУникальномуИдентификатору = Ссылка.ПолучитьОбъект(); + + Если НайденныйОбъектПоУникальномуИдентификатору = Неопределено Тогда + + Возврат Менеджер.ПустаяСсылка(); + + КонецЕсли; + + Иначе + // это режим поиска по ссылке - достаточно сделать запрос к информационной базе + // шаблон для запроса СтруктураСвойств.СтрокаПоиска + + Запрос = Новый Запрос(); + Запрос.Текст = СтрокаЗапросаПоискаПоУникальномуИдентификатору + " Ссылка = &Ссылка "; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + + РезультатЗапроса = Запрос.Выполнить(); + + Если РезультатЗапроса.Пустой() Тогда + + Возврат Менеджер.ПустаяСсылка(); + + КонецЕсли; + + КонецЕсли; + + Возврат Ссылка; + + Исключение + + Возврат Менеджер.ПустаяСсылка(); + + КонецПопытки; + +КонецФункции + +// Осуществляет простой поиск объекта информационной базы по указанному свойству. +// +// Параметры: +// Менеджер - менеджер искомого объекта; +// Свойство - свойство, по которому осуществляем поиск: Имя, Код, +// Наименование или Имя индексируемого реквизита; +// Значение - значение свойства, по которому ищем объект. +// +// Возвращаемое значение: +// Найденный объект информационной базы. +// +Функция одНайтиОбъектПоСвойству(Менеджер, Свойство, Значение, + НайденныйОбъектПоУникальномуИдентификатору = Неопределено, + ОбщаяСтруктураСвойств = Неопределено, ОбщиеСвойстваПоиска = Неопределено, + РежимПоискаОсновногоОбъекта = Истина, СтрокаЗапросаПоискаПоУникальномуИдентификатору = "") Экспорт + + Если Свойство = "Имя" Тогда + + Возврат Менеджер[Значение]; + + ИначеЕсли Свойство = "Код" Тогда + + Возврат Менеджер.НайтиПоКоду(Значение); + + ИначеЕсли Свойство = "Наименование" Тогда + + Возврат Менеджер.НайтиПоНаименованию(Значение, ИСТИНА); + + ИначеЕсли Свойство = "Номер" Тогда + + Возврат Менеджер.НайтиПоНомеру(Значение); + + ИначеЕсли Свойство = "{УникальныйИдентификатор}" Тогда + + СсылкаПоИдентификатору = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(Значение)); + + Ссылка = ПроверитьСуществованиеСсылки(СсылкаПоИдентификатору, Менеджер, НайденныйОбъектПоУникальномуИдентификатору, + РежимПоискаОсновногоОбъекта, СтрокаЗапросаПоискаПоУникальномуИдентификатору); + + Возврат Ссылка; + + ИначеЕсли Свойство = "{ИмяПредопределенногоЭлемента}" Тогда + + Попытка + + Ссылка = Менеджер[Значение]; + + Исключение + + Ссылка = Менеджер.НайтиПоКоду(Значение); + + КонецПопытки; + + Возврат Ссылка; + + Иначе + + // можно найти только по реквизиту, кроме строк произвольной длины и хранилища значений + Если НЕ (Свойство = "Дата" + ИЛИ Свойство = "Проведен" + ИЛИ Свойство = "ПометкаУдаления" + ИЛИ Свойство = "Владелец" + ИЛИ Свойство = "Родитель" + ИЛИ Свойство = "ЭтоГруппа") Тогда + + Попытка + + СтрокаНеограниченнойДлины = ОпределитьЭтотПараметрНеограниченнойДлинны(ОбщаяСтруктураСвойств, Значение, Свойство); + + Исключение + + СтрокаНеограниченнойДлины = Ложь; + + КонецПопытки; + + Если НЕ СтрокаНеограниченнойДлины Тогда + + Возврат Менеджер.НайтиПоРеквизиту(Свойство, Значение); + + КонецЕсли; + + КонецЕсли; + + СсылкаНаОбъект = НайтиЭлементЗапросом(ОбщаяСтруктураСвойств, ОбщиеСвойстваПоиска, , Менеджер); + Возврат СсылкаНаОбъект; + + КонецЕсли; + +КонецФункции // одНайтиОбъектПоСвойству() + +// Осуществляет простой поиск объекта информационной базы по указанному свойству. +// +// Параметры: +// Стр - Строка - значение свойства, по которому осуществляется +// поиск объект; +// Тип - тип искомого объекта; +// Свойство - Строка - имя свойства, по-которому ищем объект. +// +// Возвращаемое значение: +// Найденный объект информационной базы +// +Функция одПолучитьЗначениеПоСтроке(Стр, Тип, Свойство = "") Экспорт + + Если ПустаяСтрока(Стр) Тогда + Возврат Новый(Тип); + КонецЕсли; + + Свойства = Менеджеры[Тип]; + + Если Свойства = Неопределено Тогда + + ОписаниеТипов = одОписаниеТипа(Тип); + Возврат ОписаниеТипов.ПривестиЗначение(Стр); + + КонецЕсли; + + Если ПустаяСтрока(Свойство) Тогда + + Если Свойства.ИмяТипа = "Перечисление" Тогда + Свойство = "Имя"; + Иначе + Свойство = "{ИмяПредопределенногоЭлемента}"; + КонецЕсли; + + КонецЕсли; + + Возврат одНайтиОбъектПоСвойству(Свойства.Менеджер, Свойство, Стр); + +КонецФункции // одПолучитьЗначениеПоСтроке() + +// Возвращает строковое представление типа значения +// +// Параметры: +// ЗначениеИлиТип - произвольное значение или значение типа тип +// +// Возвращаемое значение: +// Строка - строковое представление типа значения +// +Функция одТипЗначенияСтрокой(ЗначениеИлиТип) Экспорт + + ТипЗначения = ТипЗнч(ЗначениеИлиТип); + + Если ТипЗначения = одТипТип Тогда + ТипЗначения = ЗначениеИлиТип; + КонецЕсли; + + Если (ТипЗначения = Неопределено) Или (ЗначениеИлиТип = Неопределено) Тогда + Результат = ""; + ИначеЕсли ТипЗначения = одТипСтрока Тогда + Результат = "Строка"; + ИначеЕсли ТипЗначения = одТипЧисло Тогда + Результат = "Число"; + ИначеЕсли ТипЗначения = одТипДата Тогда + Результат = "Дата"; + ИначеЕсли ТипЗначения = одТипБулево Тогда + Результат = "Булево"; + ИначеЕсли ТипЗначения = одТипХранилищеЗначения Тогда + Результат = "ХранилищеЗначения"; + ИначеЕсли ТипЗначения = одТипВидДвиженияНакопления Тогда + Результат = "ВидДвиженияНакопления"; + Иначе + Менеджер = Менеджеры[ТипЗначения]; + Если Менеджер = Неопределено Тогда + #Если Клиент Тогда + Текст= НСтр("'ru = 'Неизвестный тип:'") + Строка(ТипЗнч(ТипЗначения)); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст); + #КонецЕсли + Иначе + Результат = Менеджер.ТипСсылкиСтрокой; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции // одТипЗначенияСтрокой() + +// Возвращает XML представление объекта ОписаниеТипов +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// ОписаниеТипов - объект ОписаниеТипов, XML представление которого требуется получить +// +// Возвращаемое значение: +// Строка - XML представление переданного объекта ОписаниеТипов +// +Функция одПолучитьXMLПредставлениеОписанияТипов(ОписаниеТипов) Экспорт + + УзелТипов = DOM_СоздатьУзел("Типы"); + + Если ТипЗнч(ОписаниеТипов) = Тип("Структура") Тогда + DOM_УстановитьАтрибут(УзелТипов, "ДопустимыйЗнак", СокрЛП(ОписаниеТипов.ДопустимыйЗнак)); + DOM_УстановитьАтрибут(УзелТипов, "Разрядность", СокрЛП(ОписаниеТипов.Разрядность)); + DOM_УстановитьАтрибут(УзелТипов, "РазрядностьДробнойЧасти", СокрЛП(ОписаниеТипов.РазрядностьДробнойЧасти)); + DOM_УстановитьАтрибут(УзелТипов, "Длина", СокрЛП(ОписаниеТипов.Длина)); + DOM_УстановитьАтрибут(УзелТипов, "ДопустимаяДлина", СокрЛП(ОписаниеТипов.ДопустимаяДлина)); + DOM_УстановитьАтрибут(УзелТипов, "СоставДаты", СокрЛП(ОписаниеТипов.ЧастиДаты)); + + Для каждого СтрТип Из ОписаниеТипов.Типы Цикл + DOM_ДобавитьЭлемент(УзелТипов, "Тип", СокрЛП(СтрТип)); + КонецЦикла; + Иначе + КвЧисла = ОписаниеТипов.КвалификаторыЧисла; + КвСтроки = ОписаниеТипов.КвалификаторыСтроки; + КвДаты = ОписаниеТипов.КвалификаторыДаты; + + DOM_УстановитьАтрибут(УзелТипов, "ДопустимыйЗнак", СокрЛП(КвЧисла.ДопустимыйЗнак)); + DOM_УстановитьАтрибут(УзелТипов, "Разрядность", СокрЛП(КвЧисла.Разрядность)); + DOM_УстановитьАтрибут(УзелТипов, "РазрядностьДробнойЧасти", СокрЛП(КвЧисла.РазрядностьДробнойЧасти)); + DOM_УстановитьАтрибут(УзелТипов, "Длина", СокрЛП(КвСтроки.Длина)); + DOM_УстановитьАтрибут(УзелТипов, "ДопустимаяДлина", СокрЛП(КвСтроки.ДопустимаяДлина)); + DOM_УстановитьАтрибут(УзелТипов, "СоставДаты", СокрЛП(КвДаты.ЧастиДаты)); + + Для каждого Тип Из ОписаниеТипов.Типы() Цикл + DOM_ДобавитьЭлемент(УзелТипов, "Тип", одТипЗначенияСтрокой(Тип)); + КонецЦикла; + КонецЕсли; + + Возврат(УзелТипов.XML); + +КонецФункции // одПолучитьXMLПредставлениеОписанияТипов() + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ОБЪЕКТОМ DOM_XML + +// Создает и возвращает узел нового xml-документа +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Узел нового xml-документа +// +Функция DOM_НовыйXMLДокумент() Экспорт + + Попытка + XML = Новый COMОбъект("Msxml2.DOMDocument.4.0"); + Исключение + Попытка + XML = Новый COMОбъект("Msxml2.DOMDocument.3.0"); + Исключение + ЗаписатьВПротоколВыполнения(4); + + УстановитьФлагОшибки(Истина); + + Возврат Неопределено; + КонецПопытки; + КонецПопытки; + + Возврат XML; + +КонецФункции // DOM_НовыйXMLДокумент() + +// Создает новый xml-узел +// +// Параметры: +// Имя - Имя узла +// +// Возвращаемое значение: +// Объект нового xml-узла +// +Функция DOM_СоздатьУзел(Имя) Экспорт + + Возврат мXMLДокумент.createElement(Имя); + +КонецФункции // DOM_СоздатьУзел() + +// Добавляет новый xml-узел к указанному узлу-родителю +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// УзелРодитель - xml-узел-родитель +// Имя - имя добавляемого узла +// +// Возвращаемое значение: +// Новый xml-узел, добавленный к указанному узлу-родителю +// +Функция DOM_ДобавитьУзел(УзелРодитель, Имя) Экспорт + + XMLDOMNode = мXMLДокумент.createElement(Имя); + УзелРодитель.appendChild(XMLDOMNode); + Возврат XMLDOMNode; + +КонецФункции // DOM_ДобавитьУзел() + +// Копирует указанный xml-узел +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// Узел - копируемый узел +// +// Возвращаемое значение: +// Новый xml - копия указанного узла +// +Функция DOM_КопироватьУзел(Узел) Экспорт + + Возврат Узел.cloneNode(Истина); + +КонецФункции // DOM_КопироватьУзел() + +// Добавляет новый xml-узел к указанному узлу-родителю, устанавливает значение +// +// Параметры: +// УзелРодитель - xml-узел-родитель +// Имя - имя добавляемого узла +// Значение - значение добавляемого узла +// +// Возвращаемое значение: +// Новый xml-узел, добавленный к указанному узлу-родителю +// +Функция DOM_ДобавитьЭлемент(УзелРодитель, Имя, Значение="") Экспорт + + XMLDOMElement = мXMLДокумент.createElement(Имя); + XMLDOMElement.text = Значение; + УзелРодитель.appendChild(XMLDOMElement); + Возврат XMLDOMElement; + +КонецФункции // DOM_ДобавитьЭлемент() + +// Подчиняет xml-узел указанному узлу-родителю +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// УзелРодитель - xml-узел-родитель +// Узел - подчиняемый узел +// +Процедура DOM_ДобавитьПодчиненный(УзелРодитель, Узел) Экспорт + + УзелРодитель.appendChild(Узел); + +КонецПроцедуры // DOM_ДобавитьПодчиненный() + +// Устанавливает атрибут указанного xml-узла +// +// Параметры: +// Узел - xml-узел +// Имя - имя атрибута +// Значение - устанавливаемое значение +// +Процедура DOM_УстановитьАтрибут(Узел, Имя, Значение) Экспорт + + Узел.setAttribute(Имя, XMLСтрока(Значение)); + +КонецПроцедуры // DOM_УстановитьАтрибут() + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ОБЪЕКТОМ XMLЗапись + +Процедура ВыполнитьПроверкуНеДопустимыхСимволовВСтроке(Стр) + + Если ПустаяСтрока(Стр) Тогда + Возврат; + КонецЕсли; + + ПозицияНедопустимогоСимвола = НайтиНедопустимыеСимволыXML(Стр); + + Если ПозицияНедопустимогоСимвола > 0 Тогда + + //СтруктураОшибки = Новый Структура("ОписаниеОшибки,Объект"); + //СтруктураОшибки.ОписаниеОшибки = "Найдены недопустимые символы"; + //ЗаписатьВПротоколВыполнения("", СтруктураОшибки); + + НоваяСтрока = ""; + Пока ПозицияНедопустимогоСимвола > 0 Цикл + НоваяСтрока = НоваяСтрока + Лев(Стр, ПозицияНедопустимогоСимвола - 1); + Стр = Сред(Стр, ПозицияНедопустимогоСимвола + 1); + ПозицияНедопустимогоСимвола = НайтиНедопустимыеСимволыXML(Стр); + КонецЦикла; + Стр = НоваяСтрока + Стр; + + КонецЕсли; + +КонецПроцедуры + +// Создает новый xml-узел +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// +// Параметры: +// Имя - Имя узла +// +// Возвращаемое значение: +// Объект нового xml-узла +// +Функция СоздатьУзел(Имя) Экспорт + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + ЗаписьXML.ЗаписатьНачалоЭлемента(Имя); + + Возврат ЗаписьXML; + +КонецФункции // СоздатьУзел() + +// Добавляет новый xml-узел к указанному узлу-родителю +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// УзелРодитель - xml-узел-родитель +// Имя - имя добавляемого узла +// +// Возвращаемое значение: +// Новый xml-узел, добавленный к указанному узлу-родителю +// +Функция ДобавитьУзел(УзелРодитель, Имя) Экспорт + + УзелРодитель.ЗаписатьНачалоЭлемента(Имя); + + Возврат УзелРодитель; + +КонецФункции // ДобавитьУзел() + +// Копирует указанный xml-узел +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// Узел - копируемый узел +// +// Возвращаемое значение: +// Новый xml - копия указанного узла +// +Функция КопироватьУзел(Узел) Экспорт + + Стр = Узел.Закрыть(); + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + + Если ВестиДополнительныйКонтрольЗаписиВXML Тогда + + ВыполнитьПроверкуНеДопустимыхСимволовВСтроке(Стр); + + КонецЕсли; + + ЗаписьXML.ЗаписатьБезОбработки(Стр); + + Возврат ЗаписьXML; + +КонецФункции // КопироватьУзел() + +// Осуществляет запись элемента и его значения в указанный объект +// +// Параметры: +// Объект - объект типа XMLЗапись +// Имя - Строка. Имя элемента +// Значение - Значение элемента +// +Процедура одЗаписатьЭлемент(Объект, Имя, Значение="") Экспорт + + Объект.ЗаписатьНачалоЭлемента(Имя); + Стр = XMLСтрока(Значение); + + Если ВестиДополнительныйКонтрольЗаписиВXML Тогда + + ВыполнитьПроверкуНеДопустимыхСимволовВСтроке(Стр); + + КонецЕсли; + + Объект.ЗаписатьТекст(Стр); + Объект.ЗаписатьКонецЭлемента(); + +КонецПроцедуры // одЗаписатьЭлемент() + +// Подчиняет xml-узел указанному узлу-родителю +// +// Параметры: +// УзелРодитель - xml-узел-родитель +// Узел - подчиняемый узел +// +Процедура ДобавитьПодчиненный(УзелРодитель, Узел) Экспорт + + Если ТипЗнч(Узел) <> одТипСтрока Тогда + Узел.ЗаписатьКонецЭлемента(); + ИнформацияДляЗаписиВФайл = Узел.Закрыть(); + Иначе + ИнформацияДляЗаписиВФайл = Узел; + КонецЕсли; + + УзелРодитель.ЗаписатьБезОбработки(ИнформацияДляЗаписиВФайл); + +КонецПроцедуры // ДобавитьПодчиненный() + +// Устанавливает атрибут указанного xml-узла +// +// Параметры: +// Узел - xml-узел +// Имя - имя атрибута +// Значение - устанавливаемое значение +// +Процедура УстановитьАтрибут(Узел, Имя, Значение) Экспорт + + СтрокаЗаписи = XMLСтрока(Значение); + + Если ВестиДополнительныйКонтрольЗаписиВXML Тогда + + ВыполнитьПроверкуНеДопустимыхСимволовВСтроке(СтрокаЗаписи); + + КонецЕсли; + + Узел.ЗаписатьАтрибут(Имя, СтрокаЗаписи); + +КонецПроцедуры // УстановитьАтрибут() + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ОБЪЕКТОМ XMLЧтение + +// Читает значение атрибута по имени из указанного объекта, приводит значение +// к указанному примитивному типу +// +// Параметры: +// Объект - объект типа XMLЧтение, спозиционированный на начале элемента, +// атрибут которого требуется получить +// Тип - Значение типа Тип. Тип атрибута +// Имя - Строка. Имя атрибута +// +// Возвращаемое значение: +// Значение атрибута полученное по имени и приведенное к указанному типу +// +Функция одАтрибут(Объект, Тип, Имя) Экспорт + + СтрЗначение = Объект.ПолучитьАтрибут(Имя); + Если Не ПустаяСтрока(СтрЗначение) Тогда + Возврат XMLЗначение(Тип, СокрП(СтрЗначение)); + ИначеЕсли Тип = одТипСтрока Тогда + Возврат ""; + ИначеЕсли Тип = одТипБулево Тогда + Возврат Ложь; + ИначеЕсли Тип = одТипЧисло Тогда + Возврат 0; + ИначеЕсли Тип = одТипДата Тогда + Возврат ЗначениеПустаяДата; + КонецЕсли; + +КонецФункции // одАтрибут() + +// Пропускает узлы xml до конца указанного элемента (по умолчанию текущего) +// +// Параметры: +// Объект - объект типа XMLЧтение +// Имя - имя узла, до конца которого пропускаем элементы +// +Процедура одПропустить(Объект, Имя = "") Экспорт + + КолвоВложений = 0; // количество одноименных вложений + + Если Имя = "" Тогда + + Имя = Объект.ЛокальноеИмя; + + КонецЕсли; + + Пока Объект.Прочитать() Цикл + + Если Объект.ЛокальноеИмя <> Имя Тогда + Продолжить; + КонецЕсли; + + ТипУзла = Объект.ТипУзла; + + Если ТипУзла = одТипУзлаXML_КонецЭлемента Тогда + + Если КолвоВложений = 0 Тогда + + Прервать; + + Иначе + + КолвоВложений = КолвоВложений - 1; + + КонецЕсли; + + ИначеЕсли ТипУзла = одТипУзлаXML_НачалоЭлемента Тогда + + КолвоВложений = КолвоВложений + 1; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // одПропустить() + +// Читает текст элемента и приводит значение к указанному типу +// +// Параметры: +// Объект - объект типа XMLЧтение, из которого осуществляется чтение +// Тип - тип получаемого значения +// ИскатьПоСвойству - для ссылочных типов может быть указано свойство, по которому +// следует искать объект: "Код", "Наименование", <ИмяРеквизита>, "Имя" (предопределенного значения) +// +// Возвращаемое значение: +// Значение xml-элемента, приведенное к соответствующему типу +// +Функция одЗначениеЭлемента(Объект, Тип, ИскатьПоСвойству = "", ОбрезатьСтрокуСправа = Истина) Экспорт + + Значение = ""; + Имя = Объект.ЛокальноеИмя; + + Пока Объект.Прочитать() Цикл + + ТипУзла = Объект.ТипУзла; + + Если ТипУзла = одТипУзлаXML_Текст Тогда + + Значение = Объект.Значение; + + Если ОбрезатьСтрокуСправа Тогда + + Значение = СокрП(Значение); + + КонецЕсли; + + ИначеЕсли (Объект.ЛокальноеИмя = Имя) И (ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Прервать; + + Иначе + + Возврат Неопределено; + + КонецЕсли; + + КонецЦикла; + + + Если (Тип = одТипСтрока) ИЛИ (Тип = одТипБулево) ИЛИ (Тип = одТипЧисло) ИЛИ (Тип = одТипДата) + ИЛИ (Тип = одТипХранилищеЗначения) ИЛИ (Тип = одТипВидДвиженияНакопления) + ИЛИ (Тип = одТипВидСчета) Тогда + + Возврат XMLЗначение(Тип, Значение); + + Иначе + + Возврат одПолучитьЗначениеПоСтроке(Значение, Тип, ИскатьПоСвойству); + + КонецЕсли; + +КонецФункции // одЗначениеЭлемента() + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ С ФАЙЛОМ ОБМЕНА + +// Сохраняет в файл указанный xml-узел +// +// Параметры: +// Узел - xml-узел, сохраняемый в файл +// +Процедура ЗаписатьВФайл(Узел) Экспорт + + Если ТипЗнч(Узел) <> одТипСтрока Тогда + ИнформацияДляЗаписиВФайл = Узел.Закрыть(); + Иначе + ИнформацияДляЗаписиВФайл = Узел; + КонецЕсли; + + Если НепосредственноеЧтениеВИБПриемнике Тогда + + СтрокаОшибкиВБазеПриемнике = ""; + ПередатьИнформациюОЗаписиВПриемник(ИнформацияДляЗаписиВФайл, СтрокаОшибкиВБазеПриемнике); + Если Не ПустаяСтрока(СтрокаОшибкиВБазеПриемнике) Тогда + + ВызватьИсключение СтрокаОшибкиВБазеПриемнике; + + КонецЕсли; + + Иначе + + ФайлОбмена.ЗаписатьСтроку(ИнформацияДляЗаписиВФайл); + + КонецЕсли; + +КонецПроцедуры // ЗаписатьВФайл() + +// Открывает файл обмена, записывает заголовок файла в соответствии с форматом обмена +// +// Параметры: +// Нет. +// +Функция ОткрытьФайлВыгрузки(СтрокаСообщенияОбОшибке = "") + + // Архивные файлы будем идентифицировать по расширению ".zip" + + Если АрхивироватьФайл Тогда + ИмяФайлаОбмена = СтрЗаменить(ИмяФайлаОбмена, ".zip", ".xml"); + КонецЕсли; + + ФайлОбмена = Новый ЗаписьТекста; + Попытка + + Если НепосредственноеЧтениеВИБПриемнике Тогда + ФайлОбмена.Открыть(ПолучитьИмяВременногоФайла(".xml"), КодировкаТекста.UTF8); + Иначе + ФайлОбмена.Открыть(ИмяФайлаОбмена, КодировкаТекста.UTF8); + КонецЕсли; + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(8); + Возврат ""; + + КонецПопытки; + + СтрокаИнформацииОXML = ""; + + ФайлОбмена.ЗаписатьСтроку(СтрокаИнформацииОXML); + + ВременныйЗаписьXML = Новый ЗаписьXML(); + + ВременныйЗаписьXML.УстановитьСтроку(); + + ВременныйЗаписьXML.ЗаписатьНачалоЭлемента("ФайлОбмена"); + + УстановитьАтрибут(ВременныйЗаписьXML, "ВерсияФормата", "2.0"); + УстановитьАтрибут(ВременныйЗаписьXML, "ДатаВыгрузки", ТекущаяДата()); + УстановитьАтрибут(ВременныйЗаписьXML, "НачалоПериодаВыгрузки", ДатаНачала); + УстановитьАтрибут(ВременныйЗаписьXML, "ОкончаниеПериодаВыгрузки", ДатаОкончания); + УстановитьАтрибут(ВременныйЗаписьXML, "ИмяКонфигурацииИсточника", Конвертация.Источник); + УстановитьАтрибут(ВременныйЗаписьXML, "ИмяКонфигурацииПриемника", Конвертация.Приемник); + УстановитьАтрибут(ВременныйЗаписьXML, "ИдПравилКонвертации", Конвертация.Ид); + УстановитьАтрибут(ВременныйЗаписьXML, "Комментарий", Комментарий); + + ВременныйЗаписьXML.ЗаписатьКонецЭлемента(); + + Стр = ВременныйЗаписьXML.Закрыть(); + + Стр = СтрЗаменить(Стр, "/>", ">"); + + ФайлОбмена.ЗаписатьСтроку(Стр); + + Возврат СтрокаИнформацииОXML + Символы.ПС + Стр; + +КонецФункции + +// Закрывает файл обмена +// +// Параметры: +// Нет. +// +Процедура ЗакрытьФайл() + + ФайлОбмена.ЗаписатьСтроку(""); + ФайлОбмена.Закрыть(); + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ С ПРОТОКОЛОМ ОБМЕНА + +// Возвращает объект типа структура, содержащий все возможные поля +// записи протокола выполнения (сообщения об ошибках и т.п.) +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Объект типа структура +// +Функция ПолучитьСтруктуруЗаписиПротокола(КодСообщения = "", СтрокаОшибки = "") Экспорт + + СтруктураОшибки = Новый Структура("ИмяПКО,ИмяПОД,Нпп,Гнпп,Источник,ТипОбъекта,Свойство,Значение,ТипЗначения,ПКО,ПКС,ПКГС,ПВД,ПОД,Объект,СвойствоПриемника,КонвертируемоеЗначение,Обработчик,ОписаниеОшибки,ПозицияМодуля,Текст,КодСообщения,УзелПланаОбмена"); + + СтрокаМодуля = ОтделитьРазделителем(СтрокаОшибки, "{"); + ОписаниеОшибки = ОтделитьРазделителем(СтрокаМодуля, "}: "); + + Если ОписаниеОшибки <> "" Тогда + + СтруктураОшибки.ОписаниеОшибки = ОписаниеОшибки; + СтруктураОшибки.ПозицияМодуля = СтрокаМодуля; + + КонецЕсли; + + Если СтруктураОшибки.КодСообщения <> "" Тогда + + СтруктураОшибки.КодСообщения = КодСообщения; + + КонецЕсли; + + Возврат СтруктураОшибки; + +КонецФункции + +Процедура ИнициализироватьВедениеПротоколаОбмена() + + Если ПустаяСтрока(ИмяФайлаПротоколаОбмена) Тогда + + мФайлПротоколаДанных = Неопределено; + ФлагКомментироватьОбработкуОбъектов = ВыводВОкноСообщенийИнформационныхСообщений; + Возврат; + + Иначе + + ФлагКомментироватьОбработкуОбъектов = ВыводВПротоколИнформационныхСообщений ИЛИ ВыводВОкноСообщенийИнформационныхСообщений; + + КонецЕсли; + + мФайлПротоколаДанных = Новый ЗаписьТекста(ИмяФайлаПротоколаОбмена, КодировкаТекста.ANSI, , ДописыватьДанныеВПротоколОбмена) ; + +КонецПроцедуры + +Процедура ИнициализироватьВедениеПротоколаОбменаДляЭкспортаОбработчиков() + + //Получаем уникальное имя файла + ИмяВременногоФайлаПротоколаОбмена = ПолучитьНовоеУникальноеИмяВременногоФайла("ПротоколОбмена", "txt", ИмяВременногоФайлаПротоколаОбмена); + + мФайлПротоколаДанных = Новый ЗаписьТекста(ИмяВременногоФайлаПротоколаОбмена, КодировкаТекста.ANSI); + + ФлагКомментироватьОбработкуОбъектов = Ложь; + +КонецПроцедуры + +Процедура ЗавершитьВедениеПротоколаОбмена() + + Если мФайлПротоколаДанных <> Неопределено Тогда + + мФайлПротоколаДанных.Закрыть(); + + КонецЕсли; + + мФайлПротоколаДанных = Неопределено; + +КонецПроцедуры + +// Сохраняет в протокол выполнения (или выводит на экран) сообщения указанной структуры +// +// Параметры: +// Код - Число. Код сообщения +// СтруктураЗаписи - Структура. Структура записи протокола +// ВзвестиФлагОшибок - Если истина, то - это сообщение об ошибке. Взводится ФлагОшибки +// +Функция ЗаписатьВПротоколВыполнения(Код="", СтруктураЗаписи=Неопределено, ВзвестиФлагОшибок=Истина, + Уровень=0, Выравнивание=22, БезусловнаяЗаписьВПротоколОбмена = Ложь) Экспорт + + Отступ = ""; + Для Сч = 0 По Уровень-1 Цикл + Отступ = Отступ + Символы.Таб; + КонецЦикла; + + Если ТипЗнч(Код) = одТипЧисло Тогда + + Если одСообщения = Неопределено Тогда + ИнициализацияСообщений(); + КонецЕсли; + + Стр = одСообщения[Код]; + + Иначе + + Стр = Строка(Код); + + КонецЕсли; + + Стр = Отступ + Стр; + + Если СтруктураЗаписи <> Неопределено Тогда + + Для каждого Поле Из СтруктураЗаписи Цикл + + Значение = Поле.Значение; + Если Значение = Неопределено Тогда + Продолжить; + КонецЕсли; + Ключ = Поле.Ключ; + Стр = Стр + Символы.ПС + Отступ + Символы.Таб + одДополнитьСтроку(Поле.Ключ, Выравнивание) + " = " + Строка(Значение); + + КонецЦикла; + + КонецЕсли; + + ИтоговаяСтрокаДляЗаписи = Символы.ПС + Стр; + + + Если ВзвестиФлагОшибок Тогда + + УстановитьФлагОшибки(Истина); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ИтоговаяСтрокаДляЗаписи); + + Иначе + + Если НеВыводитьНикакихИнформационныхСообщенийПользователю = Ложь + И (БезусловнаяЗаписьВПротоколОбмена ИЛИ ВыводВОкноСообщенийИнформационныхСообщений) Тогда + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ИтоговаяСтрокаДляЗаписи); + + + КонецЕсли; + + КонецЕсли; + + Если мФайлПротоколаДанных <> Неопределено Тогда + + Если ВзвестиФлагОшибок Тогда + + мФайлПротоколаДанных.ЗаписатьСтроку(Символы.ПС + "Ошибка!!!"); + + КонецЕсли; + + Если ВзвестиФлагОшибок ИЛИ БезусловнаяЗаписьВПротоколОбмена ИЛИ ВыводВПротоколИнформационныхСообщений Тогда + + мФайлПротоколаДанных.ЗаписатьСтроку(ИтоговаяСтрокаДляЗаписи); + + КонецЕсли; + + КонецЕсли; + + Возврат Стр; + +КонецФункции + +Функция ЗаписатьИнформациюОбОшибкеВПротокол(КодСообщения, СтрокаОшибки, Объект, ТипОбъекта = Неопределено) + + ЗП = ПолучитьСтруктуруЗаписиПротокола(КодСообщения, СтрокаОшибки); + ЗП.Объект = Объект; + + Если ТипОбъекта <> Неопределено Тогда + ЗП.ТипОбъекта = ТипОбъекта; + КонецЕсли; + + СтрокаОшибки = ЗаписатьВПротоколВыполнения(КодСообщения, ЗП); + + Возврат СтрокаОшибки; + +КонецФункции + +Функция ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(КодСообщения, СтрокаОшибки, ИмяПравилаОчисткиДанных, Объект = "", ИмяОбработчика = "") + + ЗП = ПолучитьСтруктуруЗаписиПротокола(КодСообщения, СтрокаОшибки); + ЗП.ПОД = ИмяПравилаОчисткиДанных; + + Если Объект <> "" Тогда + ЗП.Объект = Строка(Объект) + " (" + ТипЗнч(Объект) + ")"; + КонецЕсли; + + Если ИмяОбработчика <> "" Тогда + ЗП.Обработчик = ИмяОбработчика; + КонецЕсли; + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КодСообщения, ЗП); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + +КонецФункции + +Функция ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(КодСообщения, СтрокаОшибки, ИмяПравила, Источник = "", + ТипОбъекта, Объект = Неопределено, ИмяОбработчика) Экспорт + + ЗП = ПолучитьСтруктуруЗаписиПротокола(КодСообщения, СтрокаОшибки); + ЗП.ИмяПКО = ИмяПравила; + ЗП.ТипОбъекта = ТипОбъекта; + ЗП.Обработчик = ИмяОбработчика; + + Если Не ПустаяСтрока(Источник) Тогда + + ЗП.Источник = Источник; + + КонецЕсли; + + Если Объект <> Неопределено Тогда + + ЗП.Объект = Строка(Объект); + + КонецЕсли; + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КодСообщения, ЗП); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + +КонецФункции + +Функция ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(КодСообщения, СтрокаОшибки, ПКО, Источник = "", ИмяОбработчика) + + ЗП = ПолучитьСтруктуруЗаписиПротокола(КодСообщения, СтрокаОшибки); + ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; + + Попытка + ЗП.Объект = Строка(Источник) + " (" + ТипЗнч(Источник) + ")"; + Исключение + ЗП.Объект = "(" + ТипЗнч(Источник) + ")"; + КонецПопытки; + + ЗП.Обработчик = ИмяОбработчика; + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КодСообщения, ЗП); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + +КонецФункции + +Функция ЗаписатьИнформациюОбОшибкеОбработчикиПКС(КодСообщения, СтрокаОшибки, ПКО, ПКС, Источник = "", + ИмяОбработчика = "", Значение = Неопределено) Экспорт + + ЗП = ПолучитьСтруктуруЗаписиПротокола(КодСообщения, СтрокаОшибки); + ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; + ЗП.ПКС = ПКС.Имя + " (" + ПКС.Наименование + ")"; + + Попытка + ЗП.Объект = Строка(Источник) + " (" + ТипЗнч(Источник) + ")"; + Исключение + ЗП.Объект = "(" + ТипЗнч(Источник) + ")"; + КонецПопытки; + + ЗП.СвойствоПриемника = ПКС.Приемник + " (" + ПКС.ТипПриемника + ")"; + + Если ИмяОбработчика <> "" Тогда + ЗП.Обработчик = ИмяОбработчика; + КонецЕсли; + + Если Значение <> Неопределено Тогда + ЗП.КонвертируемоеЗначение = Строка(Значение) + " (" + ТипЗнч(Значение) + ")"; + КонецЕсли; + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КодСообщения, ЗП); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + +КонецФункции + +Функция ЗаписатьИнформациюОбОшибкеОбработчикиПВД(КодСообщения, СтрокаОшибки, ИмяПравила, Объект = Неопределено, ИмяОбработчика) + + ЗП = ПолучитьСтруктуруЗаписиПротокола(КодСообщения, СтрокаОшибки); + ЗП.ПВД = ИмяПравила; + + Если Объект <> Неопределено Тогда + ЗП.Объект = Строка(Объект) + " (" + ТипЗнч(Объект) + ")"; + КонецЕсли; + + ЗП.Обработчик = ИмяОбработчика; + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КодСообщения, ЗП); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + +КонецФункции + +Функция ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(КодСообщения, СтрокаОшибки, ИмяОбработчика) + + ЗП = ПолучитьСтруктуруЗаписиПротокола(КодСообщения, СтрокаОшибки); + ЗП.Обработчик = ИмяОбработчика; + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КодСообщения, ЗП); + Возврат СтрокаСообщенияОбОшибке; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ЗАГРУЗКИ ПРАВИЛ ОБМЕНА + +// Осуществляет загрузку правила конвертации группы свойств +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ТаблицаСвойств - таблица значений, содержащая ПКС +// +Процедура ЗагрузитьПКГС(ПравилаОбмена, ТаблицаСвойств) + + Если одАтрибут(ПравилаОбмена, одТипБулево, "Отключить") Тогда + одПропустить(ПравилаОбмена); + Возврат; + КонецЕсли; + + + НоваяСтрока = ТаблицаСвойств.Добавить(); + НоваяСтрока.ЭтоГруппа = Истина; + НоваяСтрока.ПравилаГруппы = мТаблицаПравилКонвертацииСвойств.Скопировать(); + + + // Значения по умолчанию + + НоваяСтрока.НеЗамещать = Ложь; + НоваяСтрока.ПолучитьИзВходящихДанных = Ложь; + НоваяСтрока.УпрощеннаяВыгрузкаСвойства = Ложь; + + СтрокаПолейПоиска = ""; + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Источник" Тогда + НоваяСтрока.Источник = одАтрибут(ПравилаОбмена, одТипСтрока, "Имя"); + НоваяСтрока.ВидИсточника = одАтрибут(ПравилаОбмена, одТипСтрока, "Вид"); + НоваяСтрока.ТипИсточника = одАтрибут(ПравилаОбмена, одТипСтрока, "Тип"); + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "Приемник" Тогда + НоваяСтрока.Приемник = одАтрибут(ПравилаОбмена, одТипСтрока, "Имя"); + НоваяСтрока.ВидПриемника = одАтрибут(ПравилаОбмена, одТипСтрока, "Вид"); + НоваяСтрока.ТипПриемника = одАтрибут(ПравилаОбмена, одТипСтрока, "Тип"); + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "Свойство" Тогда + ЗагрузитьПКС(ПравилаОбмена, НоваяСтрока.ПравилаГруппы, , СтрокаПолейПоиска); + + ИначеЕсли ИмяУзла = "ПередОбработкойВыгрузки" Тогда + НоваяСтрока.ПередОбработкойВыгрузки = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + НоваяСтрока.ЕстьОбработчикПередОбработкойВыгрузки = Не ПустаяСтрока(НоваяСтрока.ПередОбработкойВыгрузки); + + ИначеЕсли ИмяУзла = "ПослеОбработкиВыгрузки" Тогда + НоваяСтрока.ПослеОбработкиВыгрузки = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + НоваяСтрока.ЕстьОбработчикПослеОбработкиВыгрузки = Не ПустаяСтрока(НоваяСтрока.ПослеОбработкиВыгрузки); + + ИначеЕсли ИмяУзла = "Код" Тогда + НоваяСтрока.Имя = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + ИначеЕсли ИмяУзла = "Наименование" Тогда + НоваяСтрока.Наименование = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + ИначеЕсли ИмяУзла = "Порядок" Тогда + НоваяСтрока.Порядок = одЗначениеЭлемента(ПравилаОбмена, одТипЧисло); + + ИначеЕсли ИмяУзла = "НеЗамещать" Тогда + НоваяСтрока.НеЗамещать = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + + ИначеЕсли ИмяУзла = "КодПравилаКонвертации" Тогда + НоваяСтрока.ПравилоКонвертации = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + ИначеЕсли ИмяУзла = "ПередВыгрузкой" Тогда + НоваяСтрока.ПередВыгрузкой = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + НоваяСтрока.ЕстьОбработчикПередВыгрузкой = Не ПустаяСтрока(НоваяСтрока.ПередВыгрузкой); + + ИначеЕсли ИмяУзла = "ПриВыгрузке" Тогда + НоваяСтрока.ПриВыгрузке = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + НоваяСтрока.ЕстьОбработчикПриВыгрузке = Не ПустаяСтрока(НоваяСтрока.ПриВыгрузке); + + ИначеЕсли ИмяУзла = "ПослеВыгрузки" Тогда + НоваяСтрока.ПослеВыгрузки = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + НоваяСтрока.ЕстьОбработчикПослеВыгрузки = Не ПустаяСтрока(НоваяСтрока.ПослеВыгрузки); + + ИначеЕсли ИмяУзла = "ВыгружатьГруппуЧерезФайл" Тогда + НоваяСтрока.ВыгружатьГруппуЧерезФайл = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + + ИначеЕсли ИмяУзла = "ПолучитьИзВходящихДанных" Тогда + НоваяСтрока.ПолучитьИзВходящихДанных = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + + ИначеЕсли (ИмяУзла = "Группа") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + НоваяСтрока.СтрокаПолейПоиска = СтрокаПолейПоиска; + + НоваяСтрока.НуженУзелXMLПриВыгрузке = НоваяСтрока.ЕстьОбработчикПриВыгрузке ИЛИ НоваяСтрока.ЕстьОбработчикПослеВыгрузки; + + НоваяСтрока.НуженУзелXMLПриВыгрузкеГруппы = НоваяСтрока.ЕстьОбработчикПослеОбработкиВыгрузки; + +КонецПроцедуры // ЗагрузитьПКГС() + +Процедура ДобавитьПолеКСтрокеПоиска(СтрокаПолейПоиска, ИмяПоля) + + Если ПустаяСтрока(ИмяПоля) ТОгда + Возврат; + КонецЕсли; + + Если НЕ ПустаяСтрока(СтрокаПолейПоиска) Тогда + СтрокаПолейПоиска = СтрокаПолейПоиска + ","; + КонецЕсли; + + СтрокаПолейПоиска = СтрокаПолейПоиска + ИмяПоля; + +КонецПроцедуры + +// Осуществляет загрузку правила конвертации свойств +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ТаблицаСвойств - таблица значений, содержащая ПКС +// ТаблицаПоиска - таблица значений, содержащая ПКС (синхронизирующих) +// +Процедура ЗагрузитьПКС(ПравилаОбмена, ТаблицаСвойств, ТаблицаПоиска = Неопределено, СтрокаПолейПоиска = "") + + Если одАтрибут(ПравилаОбмена, одТипБулево, "Отключить") Тогда + одПропустить(ПравилаОбмена); + Возврат; + КонецЕсли; + + + ЭтоПолеПоиска = одАтрибут(ПравилаОбмена, одТипБулево, "Поиск"); + + Если ЭтоПолеПоиска + И ТаблицаПоиска <> Неопределено Тогда + + НоваяСтрока = ТаблицаПоиска.Добавить(); + + Иначе + + НоваяСтрока = ТаблицаСвойств.Добавить(); + + КонецЕсли; + + + // Значения по умолчанию + + НоваяСтрока.НеЗамещать = Ложь; + НоваяСтрока.ПолучитьИзВходящихДанных = Ложь; + + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Источник" Тогда + НоваяСтрока.Источник = одАтрибут(ПравилаОбмена, одТипСтрока, "Имя"); + НоваяСтрока.ВидИсточника = одАтрибут(ПравилаОбмена, одТипСтрока, "Вид"); + НоваяСтрока.ТипИсточника = одАтрибут(ПравилаОбмена, одТипСтрока, "Тип"); + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "Приемник" Тогда + НоваяСтрока.Приемник = одАтрибут(ПравилаОбмена, одТипСтрока, "Имя"); + НоваяСтрока.ВидПриемника = одАтрибут(ПравилаОбмена, одТипСтрока, "Вид"); + НоваяСтрока.ТипПриемника = одАтрибут(ПравилаОбмена, одТипСтрока, "Тип"); + + Если ЭтоПолеПоиска Тогда + ДобавитьПолеКСтрокеПоиска(СтрокаПолейПоиска, НоваяСтрока.Приемник); + КонецЕсли; + + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "Код" Тогда + НоваяСтрока.Имя = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + ИначеЕсли ИмяУзла = "Наименование" Тогда + НоваяСтрока.Наименование = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + ИначеЕсли ИмяУзла = "Порядок" Тогда + НоваяСтрока.Порядок = одЗначениеЭлемента(ПравилаОбмена, одТипЧисло); + + ИначеЕсли ИмяУзла = "НеЗамещать" Тогда + НоваяСтрока.НеЗамещать = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + + ИначеЕсли ИмяУзла = "КодПравилаКонвертации" Тогда + НоваяСтрока.ПравилоКонвертации = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + ИначеЕсли ИмяУзла = "ПередВыгрузкой" Тогда + НоваяСтрока.ПередВыгрузкой = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + НоваяСтрока.ЕстьОбработчикПередВыгрузкой = Не ПустаяСтрока(НоваяСтрока.ПередВыгрузкой); + + ИначеЕсли ИмяУзла = "ПриВыгрузке" Тогда + НоваяСтрока.ПриВыгрузке = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + НоваяСтрока.ЕстьОбработчикПриВыгрузке = Не ПустаяСтрока(НоваяСтрока.ПриВыгрузке); + + ИначеЕсли ИмяУзла = "ПослеВыгрузки" Тогда + НоваяСтрока.ПослеВыгрузки = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + НоваяСтрока.ЕстьОбработчикПослеВыгрузки = Не ПустаяСтрока(НоваяСтрока.ПослеВыгрузки); + + ИначеЕсли ИмяУзла = "ПолучитьИзВходящихДанных" Тогда + НоваяСтрока.ПолучитьИзВходящихДанных = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + + ИначеЕсли ИмяУзла = "ПриводитьКДлине" Тогда + НоваяСтрока.ПриводитьКДлине = одЗначениеЭлемента(ПравилаОбмена, одТипЧисло); + + ИначеЕсли ИмяУзла = "ИмяПараметраДляПередачи" Тогда + НоваяСтрока.ИмяПараметраДляПередачи = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + ИначеЕсли ИмяУзла = "ПоискПоДатеНаРавенство" Тогда + НоваяСтрока.ПоискПоДатеНаРавенство = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + + ИначеЕсли (ИмяУзла = "Свойство") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + НоваяСтрока.УпрощеннаяВыгрузкаСвойства = НЕ НоваяСтрока.ПолучитьИзВходящихДанных + И НЕ НоваяСтрока.ЕстьОбработчикПередВыгрузкой + И НЕ НоваяСтрока.ЕстьОбработчикПриВыгрузке + И НЕ НоваяСтрока.ЕстьОбработчикПослеВыгрузки + И ПустаяСтрока(НоваяСтрока.ПравилоКонвертации) + И НоваяСтрока.ТипИсточника = НоваяСтрока.ТипПриемника + И (НоваяСтрока.ТипИсточника = "Строка" ИЛИ НоваяСтрока.ТипИсточника = "Число" ИЛИ НоваяСтрока.ТипИсточника = "Булево" ИЛИ НоваяСтрока.ТипИсточника = "Дата"); + + НоваяСтрока.НуженУзелXMLПриВыгрузке = НоваяСтрока.ЕстьОбработчикПриВыгрузке ИЛИ НоваяСтрока.ЕстьОбработчикПослеВыгрузки; + +КонецПроцедуры // ЗагрузитьПКС() + +// Осуществляет загрузку правил конвертации свойств +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ТаблицаСвойств - таблица значений, содержащая ПКС +// ТаблицаПоиска - таблица значений, содержащая ПКС (синхронизирующих) +// +Процедура ЗагрузитьСвойства(ПравилаОбмена, ТаблицаСвойств, ТаблицаПоиска) + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Свойство" Тогда + ЗагрузитьПКС(ПравилаОбмена, ТаблицаСвойств, ТаблицаПоиска); + ИначеЕсли ИмяУзла = "Группа" Тогда + ЗагрузитьПКГС(ПравилаОбмена, ТаблицаСвойств); + ИначеЕсли (ИмяУзла = "Свойства") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + ТаблицаСвойств.Сортировать("Порядок"); + ТаблицаПоиска.Сортировать("Порядок"); + +КонецПроцедуры // ЗагрузитьСвойства() + +// Осуществляет загрузку правила конвертации значений +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// Значения - соответствие значений объекта источника - строковым +// представлениям объекта приемника +// ТипИсточника - значение типа Тип - тип объекта источника +// +Процедура ЗагрузитьПКЗ(ПравилаОбмена, Значения, ТипИсточника) + + Источник = ""; + Приемник = ""; + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Источник" Тогда + Источник = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + ИначеЕсли ИмяУзла = "Приемник" Тогда + Приемник = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + ИначеЕсли (ИмяУзла = "Значение") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Значения[одПолучитьЗначениеПоСтроке(Источник, ТипИсточника)] = Приемник; + +КонецПроцедуры // ЗагрузитьПКЗ() + +// Осуществляет загрузку правил конвертации значений +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// Значения - соответствие значений объекта источника - строковым +// представлениям объекта приемника +// ТипИсточника - значение типа Тип - тип объекта источника +// +Процедура ЗагрузитьЗначения(ПравилаОбмена, Значения, ТипИсточника); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Значение" Тогда + ЗагрузитьПКЗ(ПравилаОбмена, Значения, ТипИсточника); + ИначеЕсли (ИмяУзла = "Значения") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// процедура очистки ПКо у менеджеров для правил обмена +Процедура ОчиститьПКОМенеджеров() + + Если Менеджеры = Неопределено Тогда + Возврат; + КонецЕсли; + + Для Каждого МенеджерПравила Из Менеджеры Цикл + МенеджерПравила.Значение.ПКО = Неопределено; + КонецЦикла; + +КонецПроцедуры + +// Осуществляет загрузку правила конвертации объектов +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьПравилоКонвертации(ПравилаОбмена, ЗаписьXML) + + ЗаписьXML.ЗаписатьНачалоЭлемента("Правило"); + + НоваяСтрока = ТаблицаПравилКонвертации.Добавить(); + + + // Значения по умолчанию + + НоваяСтрока.ЗапоминатьВыгруженные = Истина; + НоваяСтрока.НеЗамещать = Ложь; + + + ТаблицаПоискПоТЧ = Новый ТаблицаЗначений; + ТаблицаПоискПоТЧ.Колонки.Добавить("ИмяЭлемента"); + ТаблицаПоискПоТЧ.Колонки.Добавить("ПоляПоискаТЧ"); + + НоваяСтрока.ПоискПоТабличнымЧастям = ТаблицаПоискПоТЧ; + + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Код" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + НоваяСтрока.Имя = Значение; + + ИначеЕсли ИмяУзла = "Наименование" Тогда + + НоваяСтрока.Наименование = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + #Если Клиент Тогда + Состояние("Правило конвертации объектов: " + НоваяСтрока.Наименование); + #КонецЕсли + + ИначеЕсли ИмяУзла = "СинхронизироватьПоИдентификатору" Тогда + + НоваяСтрока.СинхронизироватьПоИдентификатору = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, НоваяСтрока.СинхронизироватьПоИдентификатору); + + ИначеЕсли ИмяУзла = "НеСоздаватьЕслиНеНайден" Тогда + + НоваяСтрока.НеСоздаватьЕслиНеНайден = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + + ИначеЕсли ИмяУзла = "НеВыгружатьОбъектыСвойствПоСсылкам" Тогда + + НоваяСтрока.НеВыгружатьОбъектыСвойствПоСсылкам = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + + ИначеЕсли ИмяУзла = "ПродолжитьПоискПоПолямПоискаЕслиПоИдентификаторуНеНашли" Тогда + + НоваяСтрока.ПродолжитьПоискПоПолямПоискаЕслиПоИдентификаторуНеНашли = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, НоваяСтрока.ПродолжитьПоискПоПолямПоискаЕслиПоИдентификаторуНеНашли); + + ИначеЕсли ИмяУзла = "ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD" Тогда + + НоваяСтрока.ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, НоваяСтрока.ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD); + + ИначеЕсли ИмяУзла = "НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике" Тогда + // не влияет на обмен + НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + + ИначеЕсли ИмяУзла = "ИспользоватьБыстрыйПоискПриЗагрузке" Тогда + + НоваяСтрока.ИспользоватьБыстрыйПоискПриЗагрузке = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + + ИначеЕсли ИмяУзла = "ГенерироватьНовыйНомерИлиКодЕслиНеУказан" Тогда + + НоваяСтрока.ГенерироватьНовыйНомерИлиКодЕслиНеУказан = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, НоваяСтрока.ГенерироватьНовыйНомерИлиКодЕслиНеУказан); + + ИначеЕсли ИмяУзла = "НеЗапоминатьВыгруженные" Тогда + + НоваяСтрока.ЗапоминатьВыгруженные = Не одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + + ИначеЕсли ИмяУзла = "НеЗамещать" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + НоваяСтрока.НеЗамещать = Значение; + + ИначеЕсли ИмяУзла = "ПриоритетОбъектовОбмена" Тогда + + // в универсальном обмене не участвует + ПриоритетОбъектовОбмена = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + ИначеЕсли ИмяУзла = "Приемник" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + НоваяСтрока.Приемник = Значение; + + ИначеЕсли ИмяУзла = "Источник" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + + Если РежимОбмена = "Загрузка" Тогда + + НоваяСтрока.Источник = Значение; + + Иначе + + Если Не ПустаяСтрока(Значение) Тогда + + НоваяСтрока.ТипИсточника = Значение; + НоваяСтрока.Источник = Тип(Значение); + + Попытка + + Менеджеры[НоваяСтрока.Источник].ПКО = НоваяСтрока; + + Исключение + + ЗаписатьИнформациюОбОшибкеВПротокол(11, ОписаниеОшибки(), Строка(НоваяСтрока.Источник)); + + КонецПопытки; + + КонецЕсли; + + КонецЕсли; + + + // Свойства + + ИначеЕсли ИмяУзла = "Свойства" Тогда + + НоваяСтрока.СвойстваПоиска = мТаблицаПравилКонвертацииСвойств.Скопировать(); + НоваяСтрока.Свойства = мТаблицаПравилКонвертацииСвойств.Скопировать(); + + + Если НоваяСтрока.СинхронизироватьПоИдентификатору <> Неопределено И НоваяСтрока.СинхронизироватьПоИдентификатору Тогда + + СвойствоПоискаУИ = НоваяСтрока.СвойстваПоиска.Добавить(); + СвойствоПоискаУИ.Имя = "{УникальныйИдентификатор}"; + СвойствоПоискаУИ.Источник = "{УникальныйИдентификатор}"; + СвойствоПоискаУИ.Приемник = "{УникальныйИдентификатор}"; + + КонецЕсли; + + ЗагрузитьСвойства(ПравилаОбмена, НоваяСтрока.Свойства, НоваяСтрока.СвойстваПоиска); + + + // Значения + + ИначеЕсли ИмяУзла = "Значения" Тогда + + ЗагрузитьЗначения(ПравилаОбмена, НоваяСтрока.Значения, НоваяСтрока.Источник); + + + // Обработчики событий + + ИначеЕсли ИмяУзла = "ПередВыгрузкой" Тогда + + НоваяСтрока.ПередВыгрузкой = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + НоваяСтрока.ЕстьОбработчикПередВыгрузкой = Не ПустаяСтрока(НоваяСтрока.ПередВыгрузкой); + + ИначеЕсли ИмяУзла = "ПриВыгрузке" Тогда + + НоваяСтрока.ПриВыгрузке = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + НоваяСтрока.ЕстьОбработчикПриВыгрузке = Не ПустаяСтрока(НоваяСтрока.ПриВыгрузке); + + ИначеЕсли ИмяУзла = "ПослеВыгрузки" Тогда + + НоваяСтрока.ПослеВыгрузки = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + НоваяСтрока.ЕстьОбработчикПослеВыгрузки = Не ПустаяСтрока(НоваяСтрока.ПослеВыгрузки); + + ИначеЕсли ИмяУзла = "ПослеВыгрузкиВФайл" Тогда + + НоваяСтрока.ПослеВыгрузкиВФайл = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + НоваяСтрока.ЕстьОбработчикПослеВыгрузкиВФайл = Не ПустаяСтрока(НоваяСтрока.ПослеВыгрузкиВФайл); + + // Для загрузки + + ИначеЕсли ИмяУзла = "ПередЗагрузкой" Тогда + + Значение = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + + + Если РежимОбмена = "Загрузка" Тогда + + НоваяСтрока.ПередЗагрузкой = Значение; + НоваяСтрока.ЕстьОбработчикПередЗагрузкой = Не ПустаяСтрока(Значение); + + Иначе + + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + + КонецЕсли; + + ИначеЕсли ИмяУзла = "ПриЗагрузке" Тогда + + Значение = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + + Если РежимОбмена = "Загрузка" Тогда + + НоваяСтрока.ПриЗагрузке = Значение; + НоваяСтрока.ЕстьОбработчикПриЗагрузке = Не ПустаяСтрока(Значение); + + Иначе + + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + + КонецЕсли; + + ИначеЕсли ИмяУзла = "ПослеЗагрузки" Тогда + + Значение = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + + Если РежимОбмена = "Загрузка" Тогда + + НоваяСтрока.ПослеЗагрузки = Значение; + НоваяСтрока.ЕстьОбработчикПослеЗагрузки = Не ПустаяСтрока(Значение); + + Иначе + + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + + КонецЕсли; + + ИначеЕсли ИмяУзла = "ПоследовательностьПолейПоиска" Тогда + + Значение = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + + Если РежимОбмена = "Загрузка" Тогда + + НоваяСтрока.ПоследовательностьПолейПоиска = Значение; + НоваяСтрока.ЕстьОбработчикПоследовательностьПолейПоиска = Не ПустаяСтрока(Значение); + + Иначе + + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + + КонецЕсли; + + ИначеЕсли ИмяУзла = "ПоискПоТабличнымЧастям" Тогда + + Значение = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + Для Номер = 1 По СтрЧислоСтрок(Значение) Цикл + + ТекущаяСтрока = СтрПолучитьСтроку(Значение, Номер); + + СтрокаПоиска = ОтделитьРазделителем(ТекущаяСтрока, ":"); + + СтрокаТаблицы = ТаблицаПоискПоТЧ.Добавить(); + СтрокаТаблицы.ИмяЭлемента = ТекущаяСтрока; + + СтрокаТаблицы.ПоляПоискаТЧ = Новый Массив(); + Пока Истина Цикл + + ТекущееПоле = ОтделитьРазделителем(СтрокаПоиска, ","); + Если ПустаяСтрока(ТекущееПоле) Тогда + Прервать; + КонецЕсли; + СтрокаТаблицы.ПоляПоискаТЧ.Добавить(СокрЛП(ТекущееПоле)); + + КонецЦикла; + + СтрокаТаблицы.ПоляПоискаТЧ.Добавить(СокрЛП(СтрокаПоиска)); + + КонецЦикла; + + ИначеЕсли (ИмяУзла = "Правило") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Прервать; + + КонецЕсли; + + КонецЦикла; + + ИтоговаяСтрокаПоискаПоТЧ = ""; + + // в приемник нужно передать информацию о полях поиска для табличных частей + Для Каждого СтрокаСвойств Из НоваяСтрока.Свойства Цикл + + Если Не СтрокаСвойств.ЭтоГруппа + ИЛИ ПустаяСтрока(СтрокаСвойств.ВидИсточника) + ИЛИ ПустаяСтрока(СтрокаСвойств.Приемник) Тогда + + Продолжить; + + КонецЕсли; + + Если ПустаяСтрока(СтрокаСвойств.СтрокаПолейПоиска) Тогда + Продолжить; + КонецЕсли; + + ИтоговаяСтрокаПоискаПоТЧ = ИтоговаяСтрокаПоискаПоТЧ + Символы.ПС + СтрокаСвойств.ВидИсточника + "." + СтрокаСвойств.Приемник + ":" + СтрокаСвойств.СтрокаПолейПоиска; + + КонецЦикла; + + ИтоговаяСтрокаПоискаПоТЧ = СокрЛП(ИтоговаяСтрокаПоискаПоТЧ); + + Если Не ПустаяСтрока(ИтоговаяСтрокаПоискаПоТЧ) Тогда + + одЗаписатьЭлемент(ЗаписьXML, "ПоискПоТабличнымЧастям", ИтоговаяСтрокаПоискаПоТЧ); + + КонецЕсли; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + + + // Быстрый доступ к ПКО по имени + + Правила.Вставить(НоваяСтрока.Имя, НоваяСтрока); + +КонецПроцедуры // ЗагрузитьПравилоКонвертации() + +// Осуществляет загрузку правил конвертации объектов +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьПравилаКонвертации(ПравилаОбмена, ЗаписьXML) + + ТаблицаПравилКонвертации.Очистить(); + ОчиститьПКОМенеджеров(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("ПравилаКонвертацииОбъектов"); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Правило" Тогда + + ЗагрузитьПравилоКонвертации(ПравилаОбмена, ЗаписьXML); + + ИначеЕсли (ИмяУзла = "ПравилаКонвертацииОбъектов") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Прервать; + + КонецЕсли; + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры // ЗагрузитьПравилаКонвертации() + +// Осуществляет загрузку группы правил очистки данных в соответствии с форматом правил обмена +// +// Параметры: +// НоваяСтрока - строка дерева значений, описывающая группу правил очистки данных +// +Процедура ЗагрузитьГруппуПОД(ПравилаОбмена, НоваяСтрока) + + НоваяСтрока.ЭтоГруппа = Истина; + НоваяСтрока.Включить = Число(Не одАтрибут(ПравилаОбмена, одТипБулево, "Отключить")); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + ТипУзла = ПравилаОбмена.ТипУзла; + + Если ИмяУзла = "Код" Тогда + НоваяСтрока.Имя = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + ИначеЕсли ИмяУзла = "Наименование" Тогда + НоваяСтрока.Наименование = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + #Если Клиент Тогда + Состояние("Группа правил очистки данных: " + НоваяСтрока.Наименование); + #КонецЕсли + + ИначеЕсли ИмяУзла = "Порядок" Тогда + НоваяСтрока.Порядок = одЗначениеЭлемента(ПравилаОбмена, одТипЧисло); + + ИначеЕсли ИмяУзла = "Правило" Тогда + СтрокаДЗ = НоваяСтрока.Строки.Добавить(); + ЗагрузитьПОД(ПравилаОбмена, СтрокаДЗ); + + ИначеЕсли (ИмяУзла = "Группа") И (ТипУзла = одТипУзлаXML_НачалоЭлемента) Тогда + СтрокаДЗ = НоваяСтрока.Строки.Добавить(); + ЗагрузитьГруппуПОД(ПравилаОбмена, СтрокаДЗ); + + ИначеЕсли (ИмяУзла = "Группа") И (ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + + Если ПустаяСтрока(НоваяСтрока.Наименование) Тогда + НоваяСтрока.Наименование = НоваяСтрока.Имя; + КонецЕсли; + +КонецПроцедуры // ЗагрузитьГруппуПОД() + +// Осуществляет загрузку правила очистки данных в соответствии с форматом правил обмена +// +// Параметры: +// НоваяСтрока - строка дерева значений, описывающая правило очистки данных +// +Процедура ЗагрузитьПОД(ПравилаОбмена, НоваяСтрока) + + НоваяСтрока.Включить = Число(Не одАтрибут(ПравилаОбмена, одТипБулево, "Отключить")); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Код" Тогда + Значение = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + НоваяСтрока.Имя = Значение; + + ИначеЕсли ИмяУзла = "Наименование" Тогда + НоваяСтрока.Наименование = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + #Если Клиент Тогда + Состояние("Правило очистки данных: " + НоваяСтрока.Наименование); + #КонецЕсли + + ИначеЕсли ИмяУзла = "Порядок" Тогда + НоваяСтрока.Порядок = одЗначениеЭлемента(ПравилаОбмена, одТипЧисло); + + ИначеЕсли ИмяУзла = "СпособОтбораДанных" Тогда + НоваяСтрока.СпособОтбораДанных = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + ИначеЕсли ИмяУзла = "ОбъектВыборки" Тогда + ОбъектВыборки = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + Если Не ПустаяСтрока(ОбъектВыборки) Тогда + НоваяСтрока.ОбъектВыборки = Тип(ОбъектВыборки); + КонецЕсли; + + ИначеЕсли ИмяУзла = "УдалятьЗаПериод" Тогда + НоваяСтрока.УдалятьЗаПериод = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + ИначеЕсли ИмяУзла = "Непосредственно" Тогда + НоваяСтрока.Непосредственно = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + + + // Обработчики событий + + ИначеЕсли ИмяУзла = "ПередОбработкойПравила" Тогда + НоваяСтрока.ПередОбработкой = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "ПослеОбработкиПравила" Тогда + НоваяСтрока.ПослеОбработки = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "ПередУдалениемОбъекта" Тогда + НоваяСтрока.ПередУдалением = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + + // Выход + ИначеЕсли (ИмяУзла = "Правило") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + + КонецЕсли; + + КонецЦикла; + + + Если ПустаяСтрока(НоваяСтрока.Наименование) Тогда + НоваяСтрока.Наименование = НоваяСтрока.Имя; + КонецЕсли; + +КонецПроцедуры // ЗагрузитьПОД() + +// Осуществляет загрузку правил очистки данных +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьПравилаОчистки(ПравилаОбмена, ЗаписьXML) + + ТаблицаПравилОчистки.Строки.Очистить(); + СтрокиДЗ = ТаблицаПравилОчистки.Строки; + + ЗаписьXML.ЗаписатьНачалоЭлемента("ПравилаОчисткиДанных"); + + Пока ПравилаОбмена.Прочитать() Цикл + + ТипУзла = ПравилаОбмена.ТипУзла; + + Если ТипУзла = одТипУзлаXML_НачалоЭлемента Тогда + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + Если РежимОбмена <> "Загрузка" Тогда + ЗаписьXML.ЗаписатьНачалоЭлемента(ПравилаОбмена.Имя); + Пока ПравилаОбмена.ПрочитатьАтрибут() Цикл + ЗаписьXML.ЗаписатьАтрибут(ПравилаОбмена.Имя, ПравилаОбмена.Значение); + КонецЦикла; + Иначе + Если ИмяУзла = "Правило" Тогда + СтрокаДЗ = СтрокиДЗ.Добавить(); + ЗагрузитьПОД(ПравилаОбмена, СтрокаДЗ); + ИначеЕсли ИмяУзла = "Группа" Тогда + СтрокаДЗ = СтрокиДЗ.Добавить(); + ЗагрузитьГруппуПОД(ПравилаОбмена, СтрокаДЗ); + КонецЕсли; + КонецЕсли; + ИначеЕсли ТипУзла = одТипУзлаXML_КонецЭлемента Тогда + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + Если ИмяУзла = "ПравилаОчисткиДанных" Тогда + Прервать; + Иначе + Если РежимОбмена <> "Загрузка" Тогда + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + КонецЕсли; + ИначеЕсли ТипУзла = одТипУзлаXML_Текст Тогда + Если РежимОбмена <> "Загрузка" Тогда + ЗаписьXML.ЗаписатьТекст(ПравилаОбмена.Значение); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + СтрокиДЗ.Сортировать("Порядок", Истина); + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры // ЗагрузитьПравилаОчистки() + +// Осуществляет загрузку алгоритма в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьАлгоритм(ПравилаОбмена, ЗаписьXML) + + ИспользуетсяПриЗагрузке = одАтрибут(ПравилаОбмена, одТипБулево, "ИспользуетсяПриЗагрузке"); + Имя = одАтрибут(ПравилаОбмена, одТипСтрока, "Имя"); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Текст" Тогда + Текст = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + ИначеЕсли (ИмяУзла = "Алгоритм") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + Иначе + одПропустить(ПравилаОбмена); + КонецЕсли; + + КонецЦикла; + + + Если ИспользуетсяПриЗагрузке Тогда + Если РежимОбмена = "Загрузка" Тогда + Алгоритмы.Вставить(Имя, Текст); + Иначе + ЗаписьXML.ЗаписатьНачалоЭлемента("Алгоритм"); + УстановитьАтрибут(ЗаписьXML, "ИспользуетсяПриЗагрузке", Истина); + УстановитьАтрибут(ЗаписьXML, "Имя", Имя); + одЗаписатьЭлемент(ЗаписьXML, "Текст", Текст); + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + Иначе + Если РежимОбмена <> "Загрузка" Тогда + Алгоритмы.Вставить(Имя, Текст); + КонецЕсли; + КонецЕсли; + + +КонецПроцедуры // ЗагрузитьАлгоритм() + +// Осуществляет загрузку алгоритмов в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьАлгоритмы(ПравилаОбмена, ЗаписьXML) + + Алгоритмы.Очистить(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("Алгоритмы"); + + Пока ПравилаОбмена.Прочитать() Цикл + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + Если ИмяУзла = "Алгоритм" Тогда + ЗагрузитьАлгоритм(ПравилаОбмена, ЗаписьXML); + ИначеЕсли (ИмяУзла = "Алгоритмы") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры // ЗагрузитьАлгоритмы() + +// Осуществляет загрузку запроса в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьЗапрос(ПравилаОбмена, ЗаписьXML) + + ИспользуетсяПриЗагрузке = одАтрибут(ПравилаОбмена, одТипБулево, "ИспользуетсяПриЗагрузке"); + Имя = одАтрибут(ПравилаОбмена, одТипСтрока, "Имя"); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Текст" Тогда + Текст = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + ИначеЕсли (ИмяУзла = "Запрос") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + Иначе + одПропустить(ПравилаОбмена); + КонецЕсли; + + КонецЦикла; + + Если ИспользуетсяПриЗагрузке Тогда + Если РежимОбмена = "Загрузка" Тогда + Запрос = Новый Запрос(Текст); + Запросы.Вставить(Имя, Запрос); + Иначе + ЗаписьXML.ЗаписатьНачалоЭлемента("Запрос"); + УстановитьАтрибут(ЗаписьXML, "ИспользуетсяПриЗагрузке", Истина); + УстановитьАтрибут(ЗаписьXML, "Имя", Имя); + одЗаписатьЭлемент(ЗаписьXML, "Текст", Текст); + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + Иначе + Если РежимОбмена <> "Загрузка" Тогда + Запрос = Новый Запрос(Текст); + Запросы.Вставить(Имя, Запрос); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры // ЗагрузитьЗапрос() + +// Осуществляет загрузку запросов в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьЗапросы(ПравилаОбмена, ЗаписьXML) + + Запросы.Очистить(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("Запросы"); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Запрос" Тогда + ЗагрузитьЗапрос(ПравилаОбмена, ЗаписьXML); + ИначеЕсли (ИмяУзла = "Запросы") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры // ЗагрузитьЗапросы() + +// Осуществляет загрузку параметров в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// +Процедура ЗагрузитьПараметры(ПравилаОбмена, ЗаписьXML) + + Параметры.Очистить(); + СобытияПослеЗагрузкиПараметров.Очистить(); + ТаблицаНастройкиПараметров.Очистить(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("Параметры"); + + Пока ПравилаОбмена.Прочитать() Цикл + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + ТипУзла = ПравилаОбмена.ТипУзла; + + Если ИмяУзла = "Параметр" И ТипУзла = одТипУзлаXML_НачалоЭлемента Тогда + + //Загрузка по версии правил 2.01 + Имя = одАтрибут(ПравилаОбмена, одТипСтрока, "Имя"); + Наименование = одАтрибут(ПравилаОбмена, одТипСтрока, "Наименование"); + УстанавливатьВДиалоге = одАтрибут(ПравилаОбмена, одТипБулево, "УстанавливатьВДиалоге"); + СтрокаТипаЗначения = одАтрибут(ПравилаОбмена, одТипСтрока, "ТипЗначения"); + ИспользуетсяПриЗагрузке = одАтрибут(ПравилаОбмена, одТипБулево, "ИспользуетсяПриЗагрузке"); + ПередаватьПараметрПриВыгрузке = одАтрибут(ПравилаОбмена, одТипБулево, "ПередаватьПараметрПриВыгрузке"); + ПравилоКонвертации = одАтрибут(ПравилаОбмена, одТипСтрока, "ПравилоКонвертации"); + АлгоритмПослеЗагрузкиПараметра = одАтрибут(ПравилаОбмена, одТипСтрока, "ПослеЗагрузкиПараметра"); + + Если Не Пустаястрока(АлгоритмПослеЗагрузкиПараметра) тогда + + СобытияПослеЗагрузкиПараметров.Вставить(Имя, АлгоритмПослеЗагрузкиПараметра); + + Конецесли; + + // Определяем типы значений и устанавливаем начальные значения + Если Не ПустаяСтрока(СтрокаТипаЗначения) Тогда + + Попытка + ТипЗначенияДанных = Тип(СтрокаТипаЗначения); + ТипОпределен = ИСТИНА; + Исключение + ТипОпределен = ЛОЖЬ; + КонецПопытки; + + Иначе + + ТипОпределен = ЛОЖЬ; + + КонецЕсли; + + Если ТипОпределен Тогда + ЗначениеПараметра = одПолучитьПустоеЗначение(ТипЗначенияДанных); + Параметры.Вставить(Имя, ЗначениеПараметра); + Иначе + ЗначениеПараметра = ""; + Параметры.Вставить(Имя); + КонецЕсли; + + Если УстанавливатьВДиалоге = ИСТИНА Тогда + + СтрокаТаблицы = ТаблицаНастройкиПараметров.Добавить(); + СтрокаТаблицы.Наименование = Наименование; + СтрокаТаблицы.Имя = Имя; + СтрокаТаблицы.Значение = ЗначениеПараметра; + СтрокаТаблицы.ПередаватьПараметрПриВыгрузке = ПередаватьПараметрПриВыгрузке; + СтрокаТаблицы.ПравилоКонвертации = ПравилоКонвертации; + + КонецЕсли; + + Если ИспользуетсяПриЗагрузке + И РежимОбмена = "Выгрузка" Тогда + + ЗаписьXML.ЗаписатьНачалоЭлемента("Параметр"); + УстановитьАтрибут(ЗаписьXML, "Имя", Имя); + УстановитьАтрибут(ЗаписьXML, "Наименование", Наименование); + + Если НЕ ПустаяСтрока(АлгоритмПослеЗагрузкиПараметра) Тогда + УстановитьАтрибут(ЗаписьXML, "ПослеЗагрузкиПараметра", XMLСтрока(АлгоритмПослеЗагрузкиПараметра)); + КонецЕсли; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + + КонецЕсли; + + ИначеЕсли (ТипУзла = одТипУзлаXML_Текст) Тогда + + // Для совместимости с версией правил 2.0 используем загрузку из строки + СтрокаПараметров = ПравилаОбмена.Значение; + Для каждого Пар Из МассивИзСтроки(СтрокаПараметров) Цикл + Параметры.Вставить(Пар); + КонецЦикла; + + ИначеЕсли (ИмяУзла = "Параметры") И (ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры // ЗагрузитьОбработки() + +// Осуществляет загрузку обработки в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьОбработку(ПравилаОбмена, ЗаписьXML) + + Имя = одАтрибут(ПравилаОбмена, одТипСтрока, "Имя"); + Наименование = одАтрибут(ПравилаОбмена, одТипСтрока, "Наименование"); + ЭтоОбработкаНастройки = одАтрибут(ПравилаОбмена, одТипБулево, "ЭтоОбработкаНастройки"); + + ИспользуетсяПриВыгрузке = одАтрибут(ПравилаОбмена, одТипБулево, "ИспользуетсяПриВыгрузке"); + ИспользуетсяПриЗагрузке = одАтрибут(ПравилаОбмена, одТипБулево, "ИспользуетсяПриЗагрузке"); + + СтрокаПараметров = одАтрибут(ПравилаОбмена, одТипСтрока, "Параметры"); + + ХранилищеОбработки = одЗначениеЭлемента(ПравилаОбмена, одТипХранилищеЗначения); + + ПараметрыДопОбработок.Вставить(Имя, МассивИзСтроки(СтрокаПараметров)); + + + Если ИспользуетсяПриЗагрузке Тогда + Если РежимОбмена = "Загрузка" Тогда + #Если Клиент Тогда + УникальныйИдентификатор = Новый УникальныйИдентификатор(); + ИмяВременногоФайла = КаталогВременныхФайлов() + УникальныйИдентификатор + ".epf"; + ХранилищеОбработки.Получить().Записать(ИмяВременногоФайла); + ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяВременногоФайла); + УдалитьФайлы(ИмяВременногоФайла); + ДопОбработки.Вставить(Имя, ВнешняяОбработка); + #КонецЕсли + Иначе + ЗаписьXML.ЗаписатьНачалоЭлемента("Обработка"); + УстановитьАтрибут(ЗаписьXML, "ИспользуетсяПриЗагрузке", Истина); + УстановитьАтрибут(ЗаписьXML, "Имя", Имя); + УстановитьАтрибут(ЗаписьXML, "Наименование", Наименование); + УстановитьАтрибут(ЗаписьXML, "ЭтоОбработкаНастройки", ЭтоОбработкаНастройки); + ЗаписьXML.ЗаписатьТекст(XMLСтрока(ХранилищеОбработки)); + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + КонецЕсли; + + Если ИспользуетсяПриВыгрузке Тогда + Если РежимОбмена <> "Загрузка" Тогда + #Если Клиент Тогда + УникальныйИдентификатор = Новый УникальныйИдентификатор(); + ИмяВременногоФайла = КаталогВременныхФайлов() + УникальныйИдентификатор + ".epf"; + ХранилищеОбработки.Получить().Записать(ИмяВременногоФайла); + ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяВременногоФайла); + УдалитьФайлы(ИмяВременногоФайла); + ДопОбработки.Вставить(Имя, ВнешняяОбработка); + #КонецЕсли + КонецЕсли; + КонецЕсли; + + Если ЭтоОбработкаНастройки Тогда + Если (РежимОбмена = "Загрузка") И ИспользуетсяПриЗагрузке Тогда + ОбработкиНастройкиЗагрузки.Добавить(Имя, Наименование, , ); + + ИначеЕсли (РежимОбмена = "Выгрузка") И ИспользуетсяПриВыгрузке Тогда + ОбработкиНастройкиВыгрузки.Добавить(Имя, Наименование, , ); + + КонецЕсли; + КонецЕсли; + +КонецПроцедуры // ЗагрузитьОбработку() + +// Осуществляет загрузку внешних обработок в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// ЗаписьXML - Объект типа XMLЗапись - правила, сохраняемые в файл обмена и +// используемые при загрузке данных +// +Процедура ЗагрузитьОбработки(ПравилаОбмена, ЗаписьXML) + + ДопОбработки.Очистить(); + ПараметрыДопОбработок.Очистить(); + + ОбработкиНастройкиВыгрузки.Очистить(); + ОбработкиНастройкиЗагрузки.Очистить(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("Обработки"); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Обработка" Тогда + ЗагрузитьОбработку(ПравилаОбмена, ЗаписьXML); + ИначеЕсли (ИмяУзла = "Обработки") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры // ЗагрузитьОбработки() + +// Осуществляет загрузку группы правил выгрузки данных в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// НоваяСтрока - строка дерева значений, описывающая группу правил выгрузки данных +// +Процедура ЗагрузитьГруппуПВД(ПравилаОбмена, НоваяСтрока) + + НоваяСтрока.ЭтоГруппа = Истина; + НоваяСтрока.Включить = Число(Не одАтрибут(ПравилаОбмена, одТипБулево, "Отключить")); + + Пока ПравилаОбмена.Прочитать() Цикл + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + ТипУзла = ПравилаОбмена.ТипУзла; + Если ИмяУзла = "Код" Тогда + НоваяСтрока.Имя = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + ИначеЕсли ИмяУзла = "Наименование" Тогда + НоваяСтрока.Наименование = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + #Если Клиент Тогда + Состояние("Группа правил выгрузки данных: " + НоваяСтрока.Наименование); + #КонецЕсли + + ИначеЕсли ИмяУзла = "Порядок" Тогда + НоваяСтрока.Порядок = одЗначениеЭлемента(ПравилаОбмена, одТипЧисло); + + ИначеЕсли ИмяУзла = "Правило" Тогда + СтрокаДЗ = НоваяСтрока.Строки.Добавить(); + ЗагрузитьПВД(ПравилаОбмена, СтрокаДЗ); + + ИначеЕсли (ИмяУзла = "Группа") И (ТипУзла = одТипУзлаXML_НачалоЭлемента) Тогда + СтрокаДЗ = НоваяСтрока.Строки.Добавить(); + ЗагрузитьГруппуПВД(ПравилаОбмена, СтрокаДЗ); + + ИначеЕсли (ИмяУзла = "Группа") И (ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + + Если ПустаяСтрока(НоваяСтрока.Наименование) Тогда + НоваяСтрока.Наименование = НоваяСтрока.Имя; + КонецЕсли; + +КонецПроцедуры // ЗагрузитьГруппуПВД() + +// Осуществляет загрузку правила выгрузки данных в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// НоваяСтрока - строка дерева значений, описывающая правило выгрузки данных +// +Процедура ЗагрузитьПВД(ПравилаОбмена, НоваяСтрока) + + НоваяСтрока.Включить = Число(Не одАтрибут(ПравилаОбмена, одТипБулево, "Отключить")); + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + Если ИмяУзла = "Код" Тогда + НоваяСтрока.Имя = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + ИначеЕсли ИмяУзла = "Наименование" Тогда + НоваяСтрока.Наименование = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + #Если Клиент Тогда + Состояние("Правило выгрузки данных: " + НоваяСтрока.Наименование); + #КонецЕсли + + ИначеЕсли ИмяУзла = "Порядок" Тогда + НоваяСтрока.Порядок = одЗначениеЭлемента(ПравилаОбмена, одТипЧисло); + + ИначеЕсли ИмяУзла = "СпособОтбораДанных" Тогда + НоваяСтрока.СпособОтбораДанных = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + ИначеЕсли ИмяУзла = "ВыбиратьДанныеДляВыгрузкиОднимЗапросом" Тогда + НоваяСтрока.ВыбиратьДанныеДляВыгрузкиОднимЗапросом = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + + ИначеЕсли ИмяУзла = "НеВыгружатьОбъектыСозданныеВБазеПриемнике" Тогда + // параметр игнорируется при обмене данными + НеВыгружатьОбъектыСозданныеВБазеПриемнике = одЗначениеЭлемента(ПравилаОбмена, одТипБулево); + + ИначеЕсли ИмяУзла = "ОбъектВыборки" Тогда + ОбъектВыборки = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + Если Не ПустаяСтрока(ОбъектВыборки) Тогда + НоваяСтрока.ОбъектВыборки = Тип(ОбъектВыборки); + КонецЕсли; + // Для поддержки отбора с помощью построителя + Если Найти(ОбъектВыборки, "Ссылка.") Тогда + НоваяСтрока.ИмяОбъектаДляЗапроса = СтрЗаменить(ОбъектВыборки, "Ссылка.", "."); + Иначе + НоваяСтрока.ИмяОбъектаДляЗапросаРегистра = СтрЗаменить(ОбъектВыборки, "Запись.", "."); + КонецЕсли; + + ИначеЕсли ИмяУзла = "КодПравилаКонвертации" Тогда + НоваяСтрока.ПравилоКонвертации = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + // Обработчики событий + + ИначеЕсли ИмяУзла = "ПередОбработкойПравила" Тогда + НоваяСтрока.ПередОбработкой = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "ПослеОбработкиПравила" Тогда + НоваяСтрока.ПослеОбработки = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "ПередВыгрузкойОбъекта" Тогда + НоваяСтрока.ПередВыгрузкой = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "ПослеВыгрузкиОбъекта" Тогда + НоваяСтрока.ПослеВыгрузки = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + + ИначеЕсли (ИмяУзла = "Правило") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Если ПустаяСтрока(НоваяСтрока.Наименование) Тогда + НоваяСтрока.Наименование = НоваяСтрока.Имя; + КонецЕсли; + +КонецПроцедуры // ЗагрузитьПВД() + +// Осуществляет загрузку правил выгрузки данных в соответствии с форматом правил обмена +// +// Параметры: +// ПравилаОбмена - Объект типа XMLЧтение +// +Процедура ЗагрузитьПравилаВыгрузки(ПравилаОбмена) + + ТаблицаПравилВыгрузки.Строки.Очистить(); + + СтрокиДЗ = ТаблицаПравилВыгрузки.Строки; + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Правило" Тогда + + СтрокаДЗ = СтрокиДЗ.Добавить(); + ЗагрузитьПВД(ПравилаОбмена, СтрокаДЗ); + + ИначеЕсли ИмяУзла = "Группа" Тогда + + СтрокаДЗ = СтрокиДЗ.Добавить(); + ЗагрузитьГруппуПВД(ПравилаОбмена, СтрокаДЗ); + + ИначеЕсли (ИмяУзла = "ПравилаВыгрузкиДанных") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Прервать; + + КонецЕсли; + + КонецЦикла; + + СтрокиДЗ.Сортировать("Порядок", Истина); + +КонецПроцедуры // ЗагрузитьПравилаВыгрузки() + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ЭКСПОРТА ОБРАБОТЧИКОВ И АЛГОРИТМОВ В TXT-ФАЙЛ ИЗ ПРАВИЛ ОБМЕНА + +// Выгружает обработчики событий и алгоритмы во временный текстовый файл +// (во временный каталог пользователя) +// Формирует модуль отладки с обработчиками и алгоритмами и со всеми +// необходимыми глобальными переменными, обертками общих функций и комментариями +// +// Параметры: +// Отказ - флаг отказа от создания модуля отладки. Возникает если не +// удалость прочесть правила обмена +// +Процедура ВыгрузитьОбработчикиСобытий(Отказ) Экспорт + + ИнициализироватьВедениеПротоколаОбменаДляЭкспортаОбработчиков(); + + РежимОбработкиДанных = мРежимыОбработкиДанных.ЭкспортОбработчиковСобытий; + + ФлагОшибки = Ложь; + + ЗагрузитьПравилаОбменаДляЭкспортаОбработчиков(); + + Если ФлагОшибки Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + ДополнитьПравилаИнтерфейсамиОбработчиков(Конвертация, ТаблицаПравилКонвертации, ТаблицаПравилВыгрузки, ТаблицаПравилОчистки); + + Если РежимОтладкиАлгоритмов = мРежимыОтладкиАлгоритмов.ИнтеграцияКода Тогда + + ПолучитьПолныйКодАлгоритмовСУчетомВложенности(); + + КонецЕсли; + + //Получаем уникальное имя файла + ИмяВременногоФайлаОбработчиковСобытий = ПолучитьНовоеУникальноеИмяВременногоФайла("ОбработчикиСобытий", "txt", ИмяВременногоФайлаОбработчиковСобытий); + + Результат = Новый ЗаписьТекста(ИмяВременногоФайлаОбработчиковСобытий, КодировкаТекста.ANSI); + + мМакетОбщиеПроцедурыФункции = ПолучитьМакет("ОбщиеПроцедурыФункции"); + + //Выводим комментарии + ДобавитьВПотокКомментарий(Результат, "Шапка"); + ДобавитьВПотокКомментарий(Результат, "ПеременныеОбработки"); + + //Выводим служебный код + ДобавитьВПотокСлужебныйКод(Результат, "ПеременныеОбработки"); + + //Выгружаем глобальные обработчики + ВыгрузитьОбработчикиКонвертации(Результат); + + //Выгружаем ПВД + ДобавитьВПотокКомментарий(Результат, "ПВД", ТаблицаПравилВыгрузки.Строки.Количество() <> 0); + ВыгрузитьОбработчикиПравилВыгрузкиДанных(Результат, ТаблицаПравилВыгрузки.Строки); + + //Выгружаем ПОД + ДобавитьВПотокКомментарий(Результат, "ПОД", ТаблицаПравилОчистки.Строки.Количество() <> 0); + ВыгрузитьОбработчикиПравилОчисткиДанных(Результат, ТаблицаПравилОчистки.Строки); + + //Выгружаем ПКО, ПКС, ПКГС + ВыгрузитьОбработчикиПравилКонвертации(Результат); + + Если РежимОтладкиАлгоритмов = мРежимыОтладкиАлгоритмов.ПроцедурныйВызов Тогда + + //Выгружаем Алгоритмы со стандартными параметрами (параметрами по умолчанию) + ВыгрузитьАлгоритмы(Результат); + + КонецЕсли; + + //Выводим комментарии + ДобавитьВПотокКомментарий(Результат, "Предупреждение"); + ДобавитьВПотокКомментарий(Результат, "ОбщиеПроцедурыФункции"); + + //Выводим общие процедуры и функции в поток + ДобавитьВПотокСлужебныйКод(Результат, "ОбщиеПроцедурыФункции"); + + //Выводим конструктор внешней обработки + ВыгрузитьКонструкторВнешнейОбработки(Результат); + + //Выводим деструктор + ДобавитьВПотокСлужебныйКод(Результат, "Деструктор"); + + Результат.Закрыть(); + + ЗавершитьВедениеПротоколаОбмена(); + + #Если Клиент Тогда + Если ЭтоИнтерактивныйРежим Тогда + + Если ФлагОшибки Тогда + Предупреждение("При выгрузке обработчиков были обнаружены ОШИБКИ!"); + + Иначе + + Предупреждение("Обработчики успешно выгружены!"); + КонецЕсли; + + КонецЕсли; + #КонецЕсли + +КонецПроцедуры + +// Очищает переменные со структурой правил обмена +// +// Параметры: +// Нет. +// +Процедура ОчиститьПравилаОбмена() + + ТаблицаПравилВыгрузки.Строки.Очистить(); + ТаблицаПравилОчистки.Строки.Очистить(); + ТаблицаПравилКонвертации.Очистить(); + Алгоритмы.Очистить(); + Запросы.Очистить(); + + //Обработки + ДопОбработки.Очистить(); + ПараметрыДопОбработок.Очистить(); + ОбработкиНастройкиВыгрузки.Очистить(); + ОбработкиНастройкиЗагрузки.Очистить(); + +КонецПроцедуры + +// Производит загрузку правил обмена из файла-правил или файла-данных +// +// Параметры: +// Нет. +// +Процедура ЗагрузитьПравилаОбменаДляЭкспортаОбработчиков() + + ОчиститьПравилаОбмена(); + + Если ОбработчикиСобытийЧитаемИзФайлаПравилОбмена Тогда + + РежимОбмена = ""; //Выгрузка + + ЗагрузитьПравилаОбмена(); + + мБылиПрочитаныПравилаОбменаПриЗагрузке = Ложь; + + ИнициализироватьПервоначальныеЗначенияПараметров(); + + Иначе //файл данных + + РежимОбмена = "Загрузка"; + + Если ПустаяСтрока(ИмяФайлаОбмена) Тогда + ЗаписатьВПротоколВыполнения(15); + Возврат; + КонецЕсли; + + ОткрытьФайлЗагрузки(Истина); + + //При наличии флага обработка потребует перечитать + //правила при попытке выгрузки данных + мБылиПрочитаныПравилаОбменаПриЗагрузке = Истина; + + КонецЕсли; + +КонецПроцедуры + +// Выгружает глобальные обработчики конвертации в текстовый файл +// +// Параметры: +// Результат - Объект типа ЗаписьТекста - для вывода обработчиков в текстовый файл. +// +// Примечание: +// При выгрузке обработчиков из файла с данными содержимое обработчика "Конвертация_ПослеЗагрузкиПараметров" +// не выгружается, т.к. код обработчика находится не в узле правил обмена, а в отдельном узле. +// При выгрузке обработчиков из файла правил этот алгоритм выгружается как и другие. +Процедура ВыгрузитьОбработчикиКонвертации(Результат) + + ДобавитьВПотокКомментарий(Результат, "Конвертация"); + + Для Каждого Элемент ИЗ ИменаОбработчиков.Конвертация Цикл + + ДобавитьВПотокОбработчикКонвертации(Результат, Элемент.Ключ); + + КонецЦикла; + +КонецПроцедуры + +// Выгружает обработчики правил выгрузки данных в текстовый файл +// +// Параметры: +// Результат - Объект типа ЗаписьТекста - для вывода обработчиков в текстовый файл. +// СтрокиДерева - Объект типа КоллекцияСтрокДереваЗначений - содержит ПВД данного уровня дерева значений +// +Процедура ВыгрузитьОбработчикиПравилВыгрузкиДанных(Результат, СтрокиДерева) + + Для Каждого Правило ИЗ СтрокиДерева Цикл + + Если Правило.ЭтоГруппа Тогда + + ВыгрузитьОбработчикиПравилВыгрузкиДанных(Результат, Правило.Строки); + + Иначе + + Для Каждого Элемент ИЗ ИменаОбработчиков.ПВД Цикл + + ДобавитьВПотокОбработчик(Результат, Правило, "ПВД", Элемент.Ключ); + + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Выгружает обработчики правил очистки данных в текстовый файл +// +// Параметры: +// Результат - Объект типа ЗаписьТекста - для вывода обработчиков в текстовый файл. +// СтрокиДерева - Объект типа КоллекцияСтрокДереваЗначений - содержит ПОД данного уровня дерева значений +// +Процедура ВыгрузитьОбработчикиПравилОчисткиДанных(Результат, СтрокиДерева) + + Для Каждого Правило ИЗ СтрокиДерева Цикл + + Если Правило.ЭтоГруппа Тогда + + ВыгрузитьОбработчикиПравилОчисткиДанных(Результат, Правило.Строки); + + Иначе + + Для Каждого Элемент ИЗ ИменаОбработчиков.ПОД Цикл + + ДобавитьВПотокОбработчик(Результат, Правило, "ПОД", Элемент.Ключ); + + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Выгружает обработчики правил конвертации: ПКО, ПКС, ПКГС в текстовый файл +// +// Параметры: +// Результат - Объект типа ЗаписьТекста - для вывода обработчиков в текстовый файл. +// +Процедура ВыгрузитьОбработчикиПравилКонвертации(Результат) + + ВывестиКомментарий = ТаблицаПравилКонвертации.Количество() <> 0; + + //Выгружаем ПКО + ДобавитьВПотокКомментарий(Результат, "ПКО", ВывестиКомментарий); + + Для Каждого ПКО ИЗ ТаблицаПравилКонвертации Цикл + + Для Каждого Элемент ИЗ ИменаОбработчиков.ПКО Цикл + + ДобавитьВПотокОбработчикПКО(Результат, ПКО, Элемент.Ключ); + + КонецЦикла; + + КонецЦикла; + + //Выгружаем ПКС и ПКГС + ДобавитьВПотокКомментарий(Результат, "ПКС", ВывестиКомментарий); + + Для Каждого ПКО ИЗ ТаблицаПравилКонвертации Цикл + + ВыгрузитьОбработчикиПравилКонвертацииСвойств(Результат, ПКО.СвойстваПоиска); + ВыгрузитьОбработчикиПравилКонвертацииСвойств(Результат, ПКО.Свойства); + + КонецЦикла; + +КонецПроцедуры + +// Выгружает обработчики правил конвертации свойств в текстовый файл +// +// Параметры: +// Результат - Объект типа ЗаписьТекста - для вывода обработчиков в текстовый файл. +// ПКС - ТаблицаЗначений - содержит правила конвертации свойств или групп свойств объекта +// +Процедура ВыгрузитьОбработчикиПравилКонвертацииСвойств(Результат, ПКС) + + Для Каждого Правило ИЗ ПКС Цикл + + Если Правило.ЭтоГруппа Тогда //ПКГС + + Для Каждого Элемент ИЗ ИменаОбработчиков.ПКГС Цикл + + ДобавитьВПотокОбработчикПКО(Результат, Правило, Элемент.Ключ); + + КонецЦикла; + + ВыгрузитьОбработчикиПравилКонвертацииСвойств(Результат, Правило.ПравилаГруппы); + + Иначе + + Для Каждого Элемент ИЗ ИменаОбработчиков.ПКС Цикл + + ДобавитьВПотокОбработчикПКО(Результат, Правило, Элемент.Ключ); + + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Выгружает алгоритмы в текстовый файл +// +// Параметры: +// Результат - Объект типа ЗаписьТекста - для вывода алгоритмов в текстовый файл. +// +Процедура ВыгрузитьАлгоритмы(Результат) + + //Комментарий к блоку "Алгоритмы" + ДобавитьВПотокКомментарий(Результат, "Алгоритмы", Алгоритмы.Количество() <> 0); + + Для Каждого Алгоритм ИЗ Алгоритмы Цикл + + ДобавитьВПотокАлгоритм(Результат, Алгоритм); + + КонецЦикла; + +КонецПроцедуры + +// Выгружает конструктор внешней обработки в текстовый файл +// Если режми отладки алгоритмов - "алгоритмы отлаживать как процедуры", то в конструктор добавляется структура "Алгоритмы". +// Ключ элемента структуры - имя алгоритма, значение - интерфейс вызова процедуры, содержащей код алгоритма. +// +// Параметры: +// Результат - Объект типа ЗаписьТекста - для вывода обработчиков в текстовый файл. +// +Процедура ВыгрузитьКонструкторВнешнейОбработки(Результат) + + //Выводим комментарий + ДобавитьВПотокКомментарий(Результат, "Конструктор"); + + ТелоПроцедуры = ПолучитьСлужебныйКод("Конструктор_ТелоПроцедуры"); + + Если РежимОтладкиАлгоритмов = мРежимыОтладкиАлгоритмов.ПроцедурныйВызов Тогда + + ТелоПроцедуры = ТелоПроцедуры + ПолучитьСлужебныйКод("Конструктор_ТелоПроцедуры_ПроцедурныйВызовАлгоритмов"); + + //Добавляем в тело конструктора вызовы Алгоритмов + Для Каждого Алгоритм ИЗ Алгоритмы Цикл + + КлючАлгоритма = СокрЛП(Алгоритм.Ключ); + + ИнтерфейсАлгоритма = ПолучитьИнтерфейсАлгоритма(КлючАлгоритма) + ";"; + + ИнтерфейсАлгоритма = СтрЗаменить(СтрЗаменить(ИнтерфейсАлгоритма, Символы.ПС, " ")," ",""); + + ТелоПроцедуры = ТелоПроцедуры + Символы.ПС + + "Алгоритмы.Вставить(""" + КлючАлгоритма + """, """ + ИнтерфейсАлгоритма + """);"; + + + КонецЦикла; + + ИначеЕсли РежимОтладкиАлгоритмов = мРежимыОтладкиАлгоритмов.ИнтеграцияКода Тогда + + ТелоПроцедуры = ТелоПроцедуры + ПолучитьСлужебныйКод("Конструктор_ТелоПроцедуры_ИнтеграцияКодаАлгоритмов"); + + ИначеЕсли РежимОтладкиАлгоритмов = мРежимыОтладкиАлгоритмов.НеИспользовать Тогда + + ТелоПроцедуры = ТелоПроцедуры + ПолучитьСлужебныйКод("Конструктор_ТелоПроцедуры_НеИспользоватьОтладкуАлгоритмов"); + + КонецЕсли; + + ИнтерфейсПроцедурыВнешнейОбработки = "Процедура " + ПолучитьИнтерфейсПроцедурыВнешнейОбработки("Конструктор") + " Экспорт"; + + ДобавитьВПотокПолныйОбработчик(Результат, ИнтерфейсПроцедурыВнешнейОбработки, ТелоПроцедуры); + +КонецПроцедуры + + +// Добавляет в объект "Результат" обработчик ПКО, ПКС или ПКГС +// +// Параметры: +// Результат - Объект типа ЗаписьТекста - для вывода обработчика в текстовый файл. +// Правило - строка таблицы значений с правилами конвертации объекта +// ИмяОбработчика - строка - имя обработчика +// +Процедура ДобавитьВПотокОбработчикПКО(Результат, Правило, ИмяОбработчика) + + Если Не Правило["ЕстьОбработчик" + ИмяОбработчика] Тогда + Возврат; + КонецЕсли; + + ИнтерфейсОбработчика = "Процедура " + Правило["ИнтерфейсОбработчика" + ИмяОбработчика] + " Экспорт"; + + ДобавитьВПотокПолныйОбработчик(Результат, ИнтерфейсОбработчика, Правило[ИмяОбработчика]); + +КонецПроцедуры + +// Добавляет в объект "Результат" код алгоритма +// +// Параметры: +// Результат - Объект типа ЗаписьТекста - для вывода обработчика в текстовый файл. +// Алгоритм - элемент структуры - алгоритм для выгрузки +// +Процедура ДобавитьВПотокАлгоритм(Результат, Алгоритм) + + ИнтерфейсАлгоритма = "Процедура " + ПолучитьИнтерфейсАлгоритма(Алгоритм.Ключ); + + ДобавитьВПотокПолныйОбработчик(Результат, ИнтерфейсАлгоритма, Алгоритм.Значение); + +КонецПроцедуры + +// Добавляет в объект "Результат" обработчик ПВД или ПОД +// +// Параметры: +// Результат - Объект типа ЗаписьТекста - для вывода обработчика в текстовый файл. +// Правило - строка дерева значений с правилами +// ПрефиксОбработчика - строка - префикс обработчика: "ПВД" или "ПОД" +// ИмяОбработчика - строка - имя обработчика +// +Процедура ДобавитьВПотокОбработчик(Результат, Правило, ПрефиксОбработчика, ИмяОбработчика) + + Если ПустаяСтрока(Правило[ИмяОбработчика]) Тогда + Возврат; + КонецЕсли; + + ИнтерфейсОбработчика = "Процедура " + Правило["ИнтерфейсОбработчика" + ИмяОбработчика] + " Экспорт"; + + ДобавитьВПотокПолныйОбработчик(Результат, ИнтерфейсОбработчика, Правило[ИмяОбработчика]); + +КонецПроцедуры + +// Добавляет в объект "Результат" глобальный обработчик конвертации +// +// Параметры: +// Результат - Объект типа ЗаписьТекста - для вывода обработчика в текстовый файл. +// ИмяОбработчика - строка - имя обработчика +// +Процедура ДобавитьВПотокОбработчикКонвертации(Результат, ИмяОбработчика) + + АлгоритмОбработчика = ""; + + Если Конвертация.Свойство(ИмяОбработчика, АлгоритмОбработчика) И Не ПустаяСтрока(АлгоритмОбработчика) Тогда + + ИнтерфейсОбработчика = "Процедура " + Конвертация["ИнтерфейсОбработчика" + ИмяОбработчика] + " Экспорт"; + + ДобавитьВПотокПолныйОбработчик(Результат, ИнтерфейсОбработчика, АлгоритмОбработчика); + + КонецЕсли; + +КонецПроцедуры + +// Добавляет в объект "Результат" процедуру с кодом обработчика или кодом алгоритма +// +// Параметры: +// Результат - Объект типа ЗаписьТекста - для вывода процедуры в текстовый файл. +// ИнтерфейсОбработчика - Строка - полное описание интерфейса обработчика: +// имя процедуры, параметры процедуры, ключевое слово "Экспорт" +// Обработчик - Строка - тело обработчика или алгоритма +// +Процедура ДобавитьВПотокПолныйОбработчик(Результат, ИнтерфейсОбработчика, Обработчик) + + СтрокаПрефикса = Символы.Таб; + + Результат.ЗаписатьСтроку(""); + + Результат.ЗаписатьСтроку(ИнтерфейсОбработчика); + + Результат.ЗаписатьСтроку(""); + + Для Индекс = 1 По СтрЧислоСтрок(Обработчик) Цикл + + СтрокаОбработчика = СтрПолучитьСтроку(Обработчик, Индекс); + + //В режиме отладки алгоритмов "Интеграция кода" вставляем код алгоритмов + //непосредственно в код обработчика. Код алгоритма вставляем взамен его вызова. + //В коде алгоритмов уже учтена вложенность алгоритмов друг в друга. + Если РежимОтладкиАлгоритмов = мРежимыОтладкиАлгоритмов.ИнтеграцияКода Тогда + + АлгоритмыОбработчика = ПолучитьАлгоритмыОбработчика(СтрокаОбработчика); + + Если АлгоритмыОбработчика.Количество() <> 0 Тогда //В этой строке есть вызовы алгоритмов + + //Получаем начальное смещение кода алгоритма относительно текущего кода обработчика + СтрокаПрефиксаДляВложенногоКода = ПолучитьПрефиксДляВложенногоАлгоритма(СтрокаОбработчика, СтрокаПрефикса); + + Для Каждого Алгоритм ИЗ АлгоритмыОбработчика Цикл + + ОбработчикАлгоритма = АлгоритмыИнтегрированные[Алгоритм]; + + Для ИндексСтрокиАлгоритма = 1 По СтрЧислоСтрок(ОбработчикАлгоритма) Цикл + + Результат.ЗаписатьСтроку(СтрокаПрефиксаДляВложенногоКода + СтрПолучитьСтроку(ОбработчикАлгоритма, ИндексСтрокиАлгоритма)); + + КонецЦикла; + + КонецЦикла; + + КонецЕсли; + КонецЕсли; + + Результат.ЗаписатьСтроку(СтрокаПрефикса + СтрокаОбработчика); + + КонецЦикла; + + Результат.ЗаписатьСтроку(""); + Результат.ЗаписатьСтроку("КонецПроцедуры"); + +КонецПроцедуры + +// Добавляет в объект "Результат" комментарий +// +// Параметры: +// Результат - Объект типа ЗаписьТекста - для вывода комментария в текстовый файл. +// ИмяОбласти - Строка - имя области текстового макета "мМакетОбщиеПроцедурыФункции" +// в которой содержится требуемый комментарий +// ВывестиКомментарий - Булево - признак необходимости вывода комментария +// +Процедура ДобавитьВПотокКомментарий(Результат, ИмяОбласти, ВывестиКомментарий = Истина) + + Если Не ВывестиКомментарий Тогда + Возврат; + КонецЕсли; + + //Получаем комментарии обработчиков по названию области + ТекущаяОбласть = мМакетОбщиеПроцедурыФункции.ПолучитьОбласть(ИмяОбласти+"_Комментарий"); + + КомментарийИзМакета = СокрЛП(ПолучитьТекстПоОбластиБезНазванияОбласти(ТекущаяОбласть)); + + КомментарийИзМакета = Сред(КомментарийИзМакета, 1, СтрДлина(КомментарийИзМакета)); //исключаем последний перевод строки + + Результат.ЗаписатьСтроку(Символы.ПС + Символы.ПС + КомментарийИзМакета); + +КонецПроцедуры + +// Добавляет в объект "Результат" служебный код: параметры, общие процедуры и функции, деструктор внешней обработки +// +// Параметры: +// Результат - Объект типа ЗаписьТекста - для вывода служебного кода в текстовый файл. +// ИмяОбласти - Строка - имя области текстового макета "мМакетОбщиеПроцедурыФункции" +// в которой содержится требуемый служебный код +// +Процедура ДобавитьВПотокСлужебныйКод(Результат, ИмяОбласти) + + //Получаем текст области + ТекущаяОбласть = мМакетОбщиеПроцедурыФункции.ПолучитьОбласть(ИмяОбласти); + + Текст = СокрЛП(ПолучитьТекстПоОбластиБезНазванияОбласти(ТекущаяОбласть)); + + Текст = Сред(Текст, 1, СтрДлина(Текст)); //исключаем последний перевод строки + + Результат.ЗаписатьСтроку(Символы.ПС + Символы.ПС + Текст); + +КонецПроцедуры + +// Получает служебный код из указанной обоасти макета "мМакетОбщиеПроцедурыФункции" +// +// Параметры: +// ИмяОбласти - Строка - имя области текстового макета "мМакетОбщиеПроцедурыФункции". +// +// Возвращаемое значение: +// Текст из макета +// +Функция ПолучитьСлужебныйКод(ИмяОбласти) + + //Получаем текст области + ТекущаяОбласть = мМакетОбщиеПроцедурыФункции.ПолучитьОбласть(ИмяОбласти); + + Возврат ПолучитьТекстПоОбластиБезНазванияОбласти(ТекущаяОбласть); +КонецФункции + +////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ПОЛУЧЕНИЯ ПОЛНОГО КОДА АЛГОРИТМОВ С УЧЕТОМ ИХ ВЛОЖЕННОСТИ + +// Формирует полный код алгоритмов с учетом их вложенности друг в друга +// +// Параметры: +// Нет. +// +Процедура ПолучитьПолныйКодАлгоритмовСУчетомВложенности() + + //Заполняем структуру интегрированных алгоритмов + АлгоритмыИнтегрированные = Новый Структура; + + Для Каждого Алгоритм ИЗ Алгоритмы Цикл + + АлгоритмыИнтегрированные.Вставить(Алгоритм.Ключ, ЗаменитьВызовыАлгоритмовКодомЭтихАлгоритмовВОбработчике(Алгоритм.Значение, , Алгоритм.Ключ, Новый Массив)); + + КонецЦикла; + +КонецПроцедуры + +// Добавляет строку "ОбработчикНовый" комментарием к вставке кода очередного алгоритма +// +// Параметры: +// ОбработчикНовый - Строка - итоговая строка содержащая полный код алгоритма с учетом вложенности алгоритмов. +// ИмяАлгоритма - Строка - имя алгоритма +// СтрокаПрефикса - строка - задает начальное смещение выводимого комментария +// Заголовок - строка - наименование комментария: "{НАЧАЛО АЛГОРИТМА}", "{КОНЕЦ АЛГОРИТМА}"... +// +Процедура ЗаписатьЗаголовокБлокаАлгоритма(ОбработчикНовый, ИмяАлгоритма, СтрокаПрефикса, Заголовок) + + ЗаголовокАлгоритма = "//============================ " + Заголовок + " """ + ТРег(ИмяАлгоритма) + """ ============================"; + + ОбработчикНовый = ОбработчикНовый + Символы.ПС; + ОбработчикНовый = ОбработчикНовый + Символы.ПС + СтрокаПрефикса + ЗаголовокАлгоритма; + ОбработчикНовый = ОбработчикНовый + Символы.ПС; + +КонецПроцедуры + +// Дополняет массив "АлгоритмыОбработчика" именами алгоритмов, которые вызываются +// из переданной процедуре строки обработчика "СтрокаОбработчика". +// +// Параметры: +// СтрокаОбработчика - Строка - строка обработчика или алгоритма в которой выполняется поиск вызовов алгоритмов +// АлгоритмыОбработчика - Массив- содержит имена алгоритмов, которые вызывается из заданного обработчика +// +Процедура ПолучитьАлгоритмыСтрокиОбработчика(СтрокаОбработчика, АлгоритмыОбработчика) + + СтрокаОбработчика = ВРег(СтрокаОбработчика); + + ШаблонПоиска = "АЛГОРИТМЫ."; + + ДлинаСтрокиШаблона = СтрДлина(ШаблонПоиска); + + СимволНачальный = Найти(СтрокаОбработчика, ШаблонПоиска); + + Если СимволНачальный = 0 Тогда + //В данной строке нет алгоритмов или все алгоритмы из этой строки уже учтены. + Возврат; + КонецЕсли; + + //Проверка на наличие признака того, что этот оператор закомментирован + СтрокаОбработчикаДоВызоваАлгоритма = Лев(СтрокаОбработчика, СимволНачальный); + + Если Найти(СтрокаОбработчикаДоВызоваАлгоритма, "//") <> 0 Тогда + //Этот оператор и все последующие закомментированы. + //Выходим из цикла. + Возврат; + КонецЕсли; + + СтрокаОбработчика = Сред(СтрокаОбработчика, СимволНачальный + ДлинаСтрокиШаблона); + + СимволКонечный = Найти(СтрокаОбработчика, ")") - 1; + + ИмяАлгоритма = Сред(СтрокаОбработчика, 1, СимволКонечный); + + АлгоритмыОбработчика.Добавить(СокрЛП(ИмяАлгоритма)); + + //Пробегаем строку обработчика до конца, + //пока все вызовы алгоритмов из этой строки не будут учтены. + ПолучитьАлгоритмыСтрокиОбработчика(СтрокаОбработчика, АлгоритмыОбработчика); + +КонецПроцедуры + +// Функция возвращает измененный код алгоритма с учетом вложенных алгоритмов. Вместо оператора вызова +// алгоритма "Выполнить(Алгоритмы.Алгоритм_1);" вставляется полный код вызываемого алгоритма +// со сдвигом на величину "СтрокаПрефикса". +// Функция рекурсивно вызывает саму себя до тех по, пока все вложенные алгоритмы не будут учтены. +// +// Параметры: +// Обработчик - Строка - исходный код алгоритма +// СтрокаПрефикса - Строка - значение смещения вставляемого кода алгоритма +// АлгоритмВладелец - Строка - имя алгоритма, являющегося родительским по отношению +// к алгоритму, код которого обрабатывается этой функцией +// МассивЗапрошенныхЭлементов - Массив - содержит имена алгоритмов которые уже были обработаны в данной ветке рекурсии. +// Необходим для предотвращения бесконечной рекурсии функции +// и вывода предупреждения об ошибке. +// +// Возвращаемое значение: +// ОбработчикНовый - Строка - измененный код алгоритма с учетом вложенных алгоритмов. +// +Функция ЗаменитьВызовыАлгоритмовКодомЭтихАлгоритмовВОбработчике(Обработчик, Знач СтрокаПрефикса = "", АлгоритмВладелец, МассивЗапрошенныхЭлементов) + + МассивЗапрошенныхЭлементов.Добавить(ВРег(АлгоритмВладелец)); + + //Инициализируем возвращаемое значение + ОбработчикНовый = ""; + + ЗаписатьЗаголовокБлокаАлгоритма(ОбработчикНовый, АлгоритмВладелец, СтрокаПрефикса, "{НАЧАЛО АЛГОРИТМА}"); + + Для Индекс = 1 По СтрЧислоСтрок(Обработчик) Цикл + + СтрокаОбработчика = СтрПолучитьСтроку(Обработчик, Индекс); + + АлгоритмыОбработчика = ПолучитьАлгоритмыОбработчика(СтрокаОбработчика); + + Если АлгоритмыОбработчика.Количество() <> 0 Тогда //В этой строке есть вызовы алгоритмов + + //Получаем начальное смещение кода алгоритма относительно текущего кода + СтрокаПрефиксаДляВложенногоКода = ПолучитьПрефиксДляВложенногоАлгоритма(СтрокаОбработчика, СтрокаПрефикса); + + //Разворачиваем полный код каждого алгоритма, + //который был вызван из строки "СтрокаОбработчика" + Для Каждого Алгоритм ИЗ АлгоритмыОбработчика Цикл + + Если МассивЗапрошенныхЭлементов.Найти(ВРег(Алгоритм)) <> Неопределено Тогда //Рекурсивный вызов алгоритма + + ЗаписатьЗаголовокБлокаАлгоритма(ОбработчикНовый, Алгоритм, СтрокаПрефиксаДляВложенногоКода, "{!!! РЕКУРСИВНЫЙ ВЫЗОВ АЛГОРИТМА !!!}"); + + СтрокаОператора = "ВызватьИсключение ""РЕКУРСИВНЫЙ ВЫЗОВ АЛГОРИТМА: "+ ТРег(Алгоритм) + """;"; + ОбработчикНовый = ОбработчикНовый + Символы.ПС + СтрокаПрефиксаДляВложенногоКода + СтрокаОператора; + + ЗаписатьЗаголовокБлокаАлгоритма(ОбработчикНовый, Алгоритм, СтрокаПрефиксаДляВложенногоКода, "{!!! РЕКУРСИВНЫЙ ВЫЗОВ АЛГОРИТМА !!!}"); + + СтруктураЗаписи = Новый Структура; + СтруктураЗаписи.Вставить("Алгоритм_1", АлгоритмВладелец); + СтруктураЗаписи.Вставить("Алгоритм_2", Алгоритм); + + ЗаписатьВПротоколВыполнения(79, СтруктураЗаписи); + + Иначе + + ОбработчикНовый = ОбработчикНовый + ЗаменитьВызовыАлгоритмовКодомЭтихАлгоритмовВОбработчике(Алгоритмы[Алгоритм], СтрокаПрефиксаДляВложенногоКода, Алгоритм, СкопироватьМассив(МассивЗапрошенныхЭлементов)); + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + ОбработчикНовый = ОбработчикНовый + Символы.ПС + СтрокаПрефикса + СтрокаОбработчика; + + КонецЦикла; + + ЗаписатьЗаголовокБлокаАлгоритма(ОбработчикНовый, АлгоритмВладелец, СтрокаПрефикса, "{КОНЕЦ АЛГОРИТМА} "); + + Возврат ОбработчикНовый; + +КонецФункции + +// Копирует переданный массив и возвращает новый массив +// +// Параметры: +// МассивИсточник - Массив - источник для получения нового массива копированием +// +// Возвращаемое значение: +// НовыйМассив - Массив - массив, полученный копированием из переданного массива +// +Функция СкопироватьМассив(МассивИсточник) + + НовыйМассив = Новый Массив; + + Для Каждого ЭлементМассива ИЗ МассивИсточник Цикл + + НовыйМассив.Добавить(ЭлементМассива); + + КонецЦикла; + + Возврат НовыйМассив; +КонецФункции + +// Возвращает массив с именами алгоритмов, которые были обнаружены в теле переданного обработчика +// +// Параметры: +// Обработчик - Строка - тело обработчика. +// +// Возвращаемое значение: +// АлгоритмыОбработчика - Массив - массив с именами алгоритмов, которые присутствуют в переданном обработчике +// +Функция ПолучитьАлгоритмыОбработчика(Обработчик) + + //Инициализируем возвращаемое значение + АлгоритмыОбработчика = Новый Массив; + + Для Индекс = 1 По СтрЧислоСтрок(Обработчик) Цикл + + СтрокаОбработчика = СокрЛ(СтрПолучитьСтроку(Обработчик, Индекс)); + + Если Лев(СтрокаОбработчика, 2) = "//" Тогда //Строка закомментирована, её пропускаем.. + Продолжить; + КонецЕсли; + + ПолучитьАлгоритмыСтрокиОбработчика(СтрокаОбработчика, АлгоритмыОбработчика); + + КонецЦикла; + + Возврат АлгоритмыОбработчика; +КонецФункции + +// Получает строку префикса для вывода кода вложенного алгоритма +// +// Параметры: +// СтрокаОбработчика - Строка - строка из которой извлекается значение смещения вызова +// (смещение при котором производится вызов алгоритма) +// СтрокаПрефикса - Строка - начальное смещение +// Возвращаемое значение: +// СтрокаПрефиксаДляВложенногоКода - Строка - Итоговое смещение кода алгоритма +// +Функция ПолучитьПрефиксДляВложенногоАлгоритма(СтрокаОбработчика, СтрокаПрефикса) + + СтрокаОбработчика = ВРег(СтрокаОбработчика); + + НомерПозицииШаблонаВыполнить = Найти(СтрокаОбработчика, "ВЫПОЛНИТЬ"); + + СтрокаПрефиксаДляВложенногоКода = СтрокаПрефикса + Лев(СтрокаОбработчика, НомерПозицииШаблонаВыполнить - 1) + Символы.Таб; + + //Если в строке обработчика был вызов алгоритма (алгоритмов), то строку полностью удаляем из кода + СтрокаОбработчика = ""; + + Возврат СтрокаПрефиксаДляВложенногоКода; +КонецФункции + +////////////////////////////////////////////////////////////////////////////// +// ФУНКЦИИ ФОРМИРОВАНИЯ УНИКАЛЬНОГО ИМЕНИ ОБРАБОТЧИКОВ СОБЫТИЙ + +// Формирует интерфейс обработчика ПКС, ПКГС (уникальное имя процедуры с параметрами соответствующего обработчика). +// +// Параметры: +// ПКО - Строка таблицы значений - содержит правило конвертации объекта +// ПКГС - Строка таблицы значений - содержит правило конвертации группы свойств +// Правило - Строка таблицы значений - содержит правило конвертации свойств объекта +// ИмяОбработчика - Строка - имя обработчика события +// +// Возвращаемое значение: +// Строка - интерфейс обработчика +// +Функция ПолучитьИнтерфейсОбработчикаПКС(ПКО, ПКГС, Правило, ИмяОбработчика) + + ИмяОбласти = "ПК" + ?(Правило.ЭтоГруппа, "Г", "") + "С_" + ИмяОбработчика; + + ИмяВладельца = "_" + СокрЛП(ПКО.Имя); + + ИмяРодителя = ""; + + Если ПКГС <> Неопределено Тогда + + Если Не ПустаяСтрока(ПКГС.ВидПриемника) Тогда + + ИмяРодителя = "_" + СокрЛП(ПКГС.Приемник); + + КонецЕсли; + + КонецЕсли; + + ИмяПриемника = "_" + СокрЛП(Правило.Приемник); + ВидПриемника = "_" + СокрЛП(Правило.ВидПриемника); + + КодСвойства = СокрЛП(Правило.Имя); + + ПолноеИмяОбработчика = ИмяОбласти + ИмяВладельца + ИмяРодителя + ИмяПриемника + ВидПриемника + КодСвойства; + + Возврат ПолноеИмяОбработчика + "(" + ПолучитьПараметрыОбработчика(ИмяОбласти) + ")"; +КонецФункции + +// Формирует интерфейс обработчика ПКО, ПВД, ПОД (уникальное имя процедуры с параметрами соответствующего обработчика). +// +// Параметры: +// Правило - произвольная коллекция значений - ПКО, ПВД, ПОД +// ПрефиксОбработчика - Строка - принимает значения: "ПКО", "ПВД", "ПОД" +// ИмяОбработчика - Строка - имя обработчика события для данного правила +// +// Возвращаемое значение: +// Строка - интерфейс обработчика +// +Функция ПолучитьИнтерфейсОбработчика(Правило, ПрефиксОбработчика, ИмяОбработчика) + + ИмяОбласти = ПрефиксОбработчика + "_" + ИмяОбработчика; + + ИмяПравила = "_" + СокрЛП(Правило.Имя); + + ПолноеИмяОбработчика = ИмяОбласти + ИмяПравила; + + Возврат ПолноеИмяОбработчика + "(" + ПолучитьПараметрыОбработчика(ИмяОбласти) + ")"; +КонецФункции + +// Формирует интерфейс глобального обработчика конвертации (уникальное имя процедуры с параметрами соответствующего обработчика). +// +// Параметры: +// ИмяОбработчика - Строка - имя обработчика события конвертации +// +// Возвращаемое значение: +// Строка - интерфейс обработчика +// +Функция ПолучитьИнтерфейсОбработчикаКонвертация(ИмяОбработчика) + + ИмяОбласти = "Конвертация_" + ИмяОбработчика; + + ПолноеИмяОбработчика = ИмяОбласти; + + Возврат ПолноеИмяОбработчика + "(" + ПолучитьПараметрыОбработчика(ИмяОбласти) + ")"; +КонецФункции + +// Формирует интерфейс процедуры (конструктора или деструктора) для внешней обработки +// +// Параметры: +// ИмяПроцедуры - Строка - имя процедуры +// +// Возвращаемое значение: +// Строка - интерфейс процедуры +// +Функция ПолучитьИнтерфейсПроцедурыВнешнейОбработки(ИмяПроцедуры) + + ИмяОбласти = "Обработка_" + ИмяПроцедуры; + + ПолноеИмяОбработчика = ИмяПроцедуры; + + Возврат ПолноеИмяОбработчика + "(" + ПолучитьПараметрыОбработчика(ИмяОбласти) + ")"; +КонецФункции + +// Формирует интерфейс алгоритма для внешней обработки +// Для всех алгоритмов получаем одинаковый набор параметров по умолчанию +// +// Параметры: +// ИмяАлгоритма - Строка - имя алгоритма +// +// Возвращаемое значение: +// Строка - интерфейс алгоритма +// +Функция ПолучитьИнтерфейсАлгоритма(ИмяАлгоритма) + + ПолноеИмяОбработчика = "Алгоритм_" + ИмяАлгоритма; + + ИмяОбласти = "Алгоритм_ПоУмолчанию"; + + Возврат ПолноеИмяОбработчика + "(" + ПолучитьПараметрыОбработчика(ИмяОбласти) + ")"; +КонецФункции + +Функция ПолучитьСтрокуВызоваОбработчика(Правило, ИмяОбработчика) + + Возврат "ВнешняяОбработкаОбработчиковСобытий." + Правило["ИнтерфейсОбработчика" + ИмяОбработчика] + ";"; + +КонецФункции + +Функция ПолучитьТекстПоОбластиБезНазванияОбласти(Область) + + ТекстОбласти = Область.ПолучитьТекст(); + + Если Найти(ТекстОбласти, "#Область") > 0 Тогда + + ПервыйПереводСтроки = Найти(ТекстОбласти, Символы.ПС); + + ТекстОбласти = Сред(ТекстОбласти, ПервыйПереводСтроки + 1); + + КонецЕсли; + + Возврат ТекстОбласти; + +КонецФункции + +Функция ПолучитьПараметрыОбработчика(ИмяОбласти) + + СтрокаПеревода = Символы.ПС + " "; + + ПараметрыОбработчика = ""; + + ИтогоСтрока = ""; + + Область = мМакетПараметровОбработчиков.ПолучитьОбласть(ИмяОбласти); + + ОбластьПараметров = Область.Области[ИмяОбласти]; + + Для НомерСтроки = ОбластьПараметров.Верх По ОбластьПараметров.Низ Цикл + + ТекущаяОбласть = Область.ПолучитьОбласть(НомерСтроки, 2, НомерСтроки, 2); + + Параметр = СокрЛП(ТекущаяОбласть.ТекущаяОбласть.Текст); + + Если Не ПустаяСтрока(Параметр) Тогда + + ПараметрыОбработчика = ПараметрыОбработчика + Параметр + ", "; + + ИтогоСтрока = ИтогоСтрока + Параметр; + + КонецЕсли; + + Если СтрДлина(ИтогоСтрока) > 50 Тогда + + ИтогоСтрока = ""; + + ПараметрыОбработчика = ПараметрыОбработчика + СтрокаПеревода; + + КонецЕсли; + + КонецЦикла; + + ПараметрыОбработчика = СокрЛП(ПараметрыОбработчика); + + //Убираем последний знак "," и возвращаем строку + + Возврат Сред(ПараметрыОбработчика, 1, СтрДлина(ПараметрыОбработчика) - 1); +КонецФункции + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ СОЗДАНИЯ ИНТЕРФЕЙСА ВЫЗОВА ОБРАБОТЧИКОВ В ПРАВИЛАХ ОБМЕНА + +// Дополняет имеющиеся коллекции с правилами обмена интерфейсами вызова обработчиков +// +// Параметры: +// СтруктураКонвертация - Структура - содержит правила конвертации и глобальные обработчики +// ТаблицаПКО - ТаблицаЗначений - содержит правила конвертации объектов +// ТаблицаПВД - ДеревоЗначений - содержит правила выгрузки данных +// ТаблицаПОД - ДеревоЗначений - содержит правила очистки данных +// +Процедура ДополнитьПравилаИнтерфейсамиОбработчиков(СтруктураКонвертация, ТаблицаПКО, ТаблицаПВД, ТаблицаПОД) Экспорт + + мМакетПараметровОбработчиков = ПолучитьМакет("ПараметрыОбработчиков"); + + //Добавляем интерфейсы Конвертации (глобальные) + ДополнитьИнтерфейсамиОбработчиковПравилаКонвертации(СтруктураКонвертация); + + //Добавляем интерфейсы ПВД + ДополнитьИнтерфейсамиОбработчиковПравилаВыгрузкиДанных(ТаблицаПВД, ТаблицаПВД.Строки); + + //Добавляем интерфейсы ПОД + ДополнитьИнтерфейсамиОбработчиковПравилаОчисткиДанных(ТаблицаПОД, ТаблицаПОД.Строки); + + //Добавляем интерфейсы ПКО, ПКС, ПКГС + ДополнитьИнтерфейсамиОбработчиковПравилаКонвертацииОбъектов(ТаблицаПКО); + +КонецПроцедуры + +// Дополняет коллекцию значений правил очистки данных интерфейсами обработчиков +// +// Параметры: +// ТаблицаПОД - ДеревоЗначений - содержит правила очистки данных +// СтрокиДерева - Объект типа КоллекцияСтрокДереваЗначений - содержит ПОД данного уровня дерева значений +// +Процедура ДополнитьИнтерфейсамиОбработчиковПравилаОчисткиДанных(ТаблицаПОД, СтрокиДерева) + + Для Каждого Правило ИЗ СтрокиДерева Цикл + + Если Правило.ЭтоГруппа Тогда + + ДополнитьИнтерфейсамиОбработчиковПравилаОчисткиДанных(ТаблицаПОД, Правило.Строки); + + Иначе + + Для Каждого Элемент ИЗ ИменаОбработчиков.ПОД Цикл + + ДобавитьИнтерфейсОбработчика(ТаблицаПОД, Правило, "ПОД", Элемент.Ключ); + + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Дополняет коллекцию значений правил выгрузки данных интерфейсами обработчиков +// +// Параметры: +// ТаблицаПВД - ДеревоЗначений - содержит правила выгрузки данных +// СтрокиДерева - Объект типа КоллекцияСтрокДереваЗначений - содержит ПВД данного уровня дерева значений +// +Процедура ДополнитьИнтерфейсамиОбработчиковПравилаВыгрузкиДанных(ТаблицаПВД, СтрокиДерева) + + Для Каждого Правило ИЗ СтрокиДерева Цикл + + Если Правило.ЭтоГруппа Тогда + + ДополнитьИнтерфейсамиОбработчиковПравилаВыгрузкиДанных(ТаблицаПВД, Правило.Строки); + + Иначе + + Для Каждого Элемент ИЗ ИменаОбработчиков.ПВД Цикл + + ДобавитьИнтерфейсОбработчика(ТаблицаПВД, Правило, "ПВД", Элемент.Ключ); + + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Дополняет структуру конвертации интерфейсами обработчиков +// +// Параметры: +// СтруктураКонвертация - Структура - содержит правила конвертации и глобальные обработчики +// +Процедура ДополнитьИнтерфейсамиОбработчиковПравилаКонвертации(СтруктураКонвертация) + + Для Каждого Элемент ИЗ ИменаОбработчиков.Конвертация Цикл + + ДобавитьИнтерфейсОбработчикаКонвертации(СтруктураКонвертация, Элемент.Ключ); + + КонецЦикла; + +КонецПроцедуры + +// Дополняет коллекцию значений правил конвертации объектов интерфейсами обработчиков +// +// Параметры: +// ТаблицаПКО - ТаблицаЗначений - содержит правила конвертации объектов +// +Процедура ДополнитьИнтерфейсамиОбработчиковПравилаКонвертацииОбъектов(ТаблицаПКО) + + Для Каждого ПКО ИЗ ТаблицаПКО Цикл + + Для Каждого Элемент ИЗ ИменаОбработчиков.ПКО Цикл + + ДобавитьИнтерфейсОбработчикаПКО(ТаблицаПКО, ПКО, Элемент.Ключ); + + КонецЦикла; + + //Добавляем интерфейсы для ПКС + ДополнитьИнтерфейсамиОбработчиковПКС(ПКО, ПКО.СвойстваПоиска); + ДополнитьИнтерфейсамиОбработчиковПКС(ПКО, ПКО.Свойства); + + КонецЦикла; + +КонецПроцедуры + +// Дополняет коллекцию значений правил конвертации свойств объектов интерфейсами обработчиков +// +// Параметры: +// ПКО - Строка таблицы значений - содержит правило конвертации объекта +// ПравилаКонвертацииСвойствОбъекта - ТаблицаЗначений - содержит правила конвертации свойств или группы свойств объекта из правила ПКО +// ПКГС - Строка таблицы значений - содержит правило конвертации группы свойств +// +Процедура ДополнитьИнтерфейсамиОбработчиковПКС(ПКО, ПравилаКонвертацииСвойствОбъекта, ПКГС = Неопределено) + + Для Каждого ПКС ИЗ ПравилаКонвертацииСвойствОбъекта Цикл + + Если ПКС.ЭтоГруппа Тогда //ПКГС + + Для Каждого Элемент ИЗ ИменаОбработчиков.ПКГС Цикл + + ДобавитьИнтерфейсОбработчикаПКС(ПравилаКонвертацииСвойствОбъекта, ПКО, ПКГС, ПКС, Элемент.Ключ); + + КонецЦикла; + + ДополнитьИнтерфейсамиОбработчиковПКС(ПКО, ПКС.ПравилаГруппы, ПКС); + + Иначе + + Для Каждого Элемент ИЗ ИменаОбработчиков.ПКС Цикл + + ДобавитьИнтерфейсОбработчикаПКС(ПравилаКонвертацииСвойствОбъекта, ПКО, ПКГС, ПКС, Элемент.Ключ); + + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + + +Процедура ДобавитьИнтерфейсОбработчика(Таблица, Правило, ПрефиксОбработчика, ИмяОбработчика) + + Если ПустаяСтрока(Правило[ИмяОбработчика]) Тогда + Возврат; + КонецЕсли; + + ИмяПоля = "ИнтерфейсОбработчика" + ИмяОбработчика; + + ДобавитьНедостающиеКолонки(Таблица.Колонки, ИмяПоля); + + Правило[ИмяПоля] = ПолучитьИнтерфейсОбработчика(Правило, ПрефиксОбработчика, ИмяОбработчика); + +КонецПроцедуры + +Процедура ДобавитьИнтерфейсОбработчикаПКО(Таблица, Правило, ИмяОбработчика) + + Если Не Правило["ЕстьОбработчик" + ИмяОбработчика] Тогда + Возврат; + КонецЕсли; + + ИмяПоля = "ИнтерфейсОбработчика" + ИмяОбработчика; + + ДобавитьНедостающиеКолонки(Таблица.Колонки, ИмяПоля); + + Правило[ИмяПоля] = ПолучитьИнтерфейсОбработчика(Правило, "ПКО", ИмяОбработчика); + +КонецПроцедуры + +Процедура ДобавитьИнтерфейсОбработчикаПКС(Таблица, ПКО, ПКГС = Неопределено, ПКС, ИмяОбработчика) + + Если Не ПКС["ЕстьОбработчик" + ИмяОбработчика] Тогда + Возврат; + КонецЕсли; + + ИмяПоля = "ИнтерфейсОбработчика" + ИмяОбработчика; + + ДобавитьНедостающиеКолонки(Таблица.Колонки, ИмяПоля); + + ПКС[ИмяПоля] = ПолучитьИнтерфейсОбработчикаПКС(ПКО, ПКГС, ПКС, ИмяОбработчика); + +КонецПроцедуры + +Процедура ДобавитьИнтерфейсОбработчикаКонвертации(СтруктураКонвертация, ИмяОбработчика) + + АлгоритмОбработчика = ""; + + Если СтруктураКонвертация.Свойство(ИмяОбработчика, АлгоритмОбработчика) И Не ПустаяСтрока(АлгоритмОбработчика) Тогда + + ИмяПоля = "ИнтерфейсОбработчика" + ИмяОбработчика; + + СтруктураКонвертация.Вставить(ИмяПоля); + + СтруктураКонвертация[ИмяПоля] = ПолучитьИнтерфейсОбработчикаКонвертация(ИмяОбработчика); + + КонецЕсли; + +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ РАБОТЫ С ПРАВИЛАМИ ОБМЕНА + +// Осуществляет поиск правила конвертации по имени или в соответствии с типом +// переданного объекта +// +// Параметры: +// Объект - Объект-источник, для которого ищем правило конвертации +// ИмяПравила - имя правила конвертации +// +// Возвращаемое значение: +// Ссылка на правило конвертации (строка в таблице правил) +// +Функция НайтиПравило(Объект, ИмяПравила="") Экспорт + + Если Не ПустаяСтрока(ИмяПравила) Тогда + + Правило = Правила[ИмяПравила]; + + Иначе + + Правило = Менеджеры[ТипЗнч(Объект)]; + Если Правило <> Неопределено Тогда + Правило = Правило.ПКО; + + Если Правило <> Неопределено Тогда + ИмяПравила = Правило.Имя; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Возврат Правило; + +КонецФункции + +// Сохраняет правила обмена во внутреннем формате +// +// Параметры: +// Нет. +// +Процедура СохранитьПравилаВоВнутреннемФормате() Экспорт + + Для Каждого Правило Из ТаблицаПравилКонвертации Цикл + Правило.Выгруженные.Очистить(); + Правило.ВыгруженныеТолькоСсылки.Очистить(); + КонецЦикла; + + СтруктураПравил = Новый Структура; + + //Сохраняем запросы + ЗапросыДляСохранения = Новый Структура; + Для Каждого ЭлементСтруктуры Из Запросы Цикл + ЗапросыДляСохранения.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение.Текст); + КонецЦикла; + + ПараметрыДляСохранения = Новый Структура; + Для Каждого ЭлементСтруктуры Из Параметры Цикл + ПараметрыДляСохранения.Вставить(ЭлементСтруктуры.Ключ, Неопределено); + КонецЦикла; + + СтруктураПравил.Вставить("ТаблицаПравилВыгрузки", ТаблицаПравилВыгрузки); + СтруктураПравил.Вставить("ТаблицаПравилКонвертации", ТаблицаПравилКонвертации); + СтруктураПравил.Вставить("Алгоритмы", Алгоритмы); + СтруктураПравил.Вставить("Запросы", ЗапросыДляСохранения); + СтруктураПравил.Вставить("Конвертация", Конвертация); + СтруктураПравил.Вставить("мXMLПравила", мXMLПравила); + СтруктураПравил.Вставить("ТаблицаНастройкиПараметров", ТаблицаНастройкиПараметров); + СтруктураПравил.Вставить("Параметры", ПараметрыДляСохранения); + + СтруктураПравил.Вставить("ВерсияПлатформыПриемника", ВерсияПлатформыПриемника); + + СохраненныеНастройки = Новый ХранилищеЗначения(СтруктураПравил); + +КонецПроцедуры // СохранитьПравилаВоВнутреннемФормате() + +Функция ОпределитьПоВерсииПлатформыПриемникаПлатформу(ВерсияПлатформы) + + Если Найти(ВерсияПлатформы, "8.") > 0 Тогда + + Возврат "V8"; + + Иначе + + Возврат "V7"; + + КонецЕсли; + +КонецФункции + +// Восстанавливает правила из внутреннего формата +// +// Параметры: +// +Процедура ВосстановитьПравилаИзВнутреннегоФормата() Экспорт + + Если СохраненныеНастройки = Неопределено Тогда + Возврат; + КонецЕсли; + + СтруктураПравил = СохраненныеНастройки.Получить(); + + ТаблицаПравилВыгрузки = СтруктураПравил.ТаблицаПравилВыгрузки; + ТаблицаПравилКонвертации = СтруктураПравил.ТаблицаПравилКонвертации; + Алгоритмы = СтруктураПравил.Алгоритмы; + ЗапросыДляВосстановления = СтруктураПравил.Запросы; + Конвертация = СтруктураПравил.Конвертация; + мXMLПравила = СтруктураПравил.мXMLПравила; + ТаблицаНастройкиПараметров = СтруктураПравил.ТаблицаНастройкиПараметров; + Параметры = СтруктураПравил.Параметры; + + ДополнитьСлужебныеТаблицыКолонками(); + + СтруктураПравил.Свойство("ВерсияПлатформыПриемника", ВерсияПлатформыПриемника); + + ПлатформаПриемника = ОпределитьПоВерсииПлатформыПриемникаПлатформу(ВерсияПлатформыПриемника); + + ЕстьГлобальныйОбработчикПередВыгрузкойОбъекта = Не ПустаяСтрока(Конвертация.ПередВыгрузкойОбъекта); + ЕстьГлобальныйОбработчикПослеВыгрузкиОбъекта = Не ПустаяСтрока(Конвертация.ПослеВыгрузкиОбъекта); + ЕстьГлобальныйОбработчикПередЗагрузкойОбъекта = Не ПустаяСтрока(Конвертация.ПередЗагрузкойОбъекта); + ЕстьГлобальныйОбработчикПослеЗагрузкиОбъекта = Не ПустаяСтрока(Конвертация.ПослеЗагрузкиОбъекта); + ЕстьГлобальныйОбработчикПередКонвертациейОбъекта = Не ПустаяСтрока(Конвертация.ПередКонвертациейОбъекта); + + // Восстанавливаем запросы + Запросы.Очистить(); + Для Каждого ЭлементСтруктуры Из ЗапросыДляВосстановления Цикл + Запрос = Новый Запрос(ЭлементСтруктуры.Значение); + Запросы.Вставить(ЭлементСтруктуры.Ключ, Запрос); + КонецЦикла; + + ИнициализироватьМенеджерыИСообщения(); + + Правила.Очистить(); + ОчиститьПКОМенеджеров(); + + Если РежимОбмена = "Выгрузка" Тогда + + Для Каждого СтрокаТаблицы Из ТаблицаПравилКонвертации Цикл + Правила.Вставить(СтрокаТаблицы.Имя, СтрокаТаблицы); + + Если СтрокаТаблицы.Источник <> Неопределено Тогда + + Попытка + Если ТипЗнч(СтрокаТаблицы.Источник) = одТипСтрока Тогда + Менеджеры[Тип(СтрокаТаблицы.Источник)].ПКО = СтрокаТаблицы; + Иначе + Менеджеры[СтрокаТаблицы.Источник].ПКО = СтрокаТаблицы; + КонецЕсли; + Исключение + ЗаписатьИнформациюОбОшибкеВПротокол(11, ОписаниеОшибки(), Строка(СтрокаТаблицы.Источник)); + КонецПопытки; + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры // СохранитьПравилаВоВнутреннемФормате() + +// Устанавливает значения параметров в структуре Параметры +// по таблице ТаблицаНастройкиПараметров +// +Процедура УстановитьПараметрыИзДиалога() Экспорт + + Для Каждого СтрокаТаблицы Из ТаблицаНастройкиПараметров Цикл + Параметры.Вставить(СтрокаТаблицы.Имя, СтрокаТаблицы.Значение); + КонецЦикла; + +КонецПроцедуры + +// Устанавливает значение параметра в таблице параметров в форме обработки +// +Процедура УстановитьЗначениеПараметраВТаблице(ИмяПараметра, ЗначениеПараметра) Экспорт + + СтрокаТаблицы = ТаблицаНастройкиПараметров.Найти(ИмяПараметра, "Имя"); + + Если СтрокаТаблицы <> Неопределено Тогда + + СтрокаТаблицы.Значение = ЗначениеПараметра; + + КонецЕсли; + +КонецПроцедуры + +// Выполняет инициализацию параметров значениями по умолчанию, из правил обмена +// +// Параметры: +// Нет. +// +Процедура ИнициализироватьПервоначальныеЗначенияПараметров() Экспорт + + Для Каждого ТекПараметр Из Параметры Цикл + + УстановитьЗначениеПараметраВТаблице(ТекПараметр.Ключ, ТекПараметр.Значение); + + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТКА ПРАВИЛ ОЧИСТКИ + +Процедура ВыполнитьУдалениеОбъекта(Объект, Свойства, УдалитьНепосредственно) + + Если Свойства.ИмяТипа = "РегистрСведений" Тогда + + Объект.Удалить(); + + Иначе + + Попытка + + Предопределенный = Объект.Предопределенный; + + Исключение + + Предопределенный = Ложь; + + КонецПопытки; + + Если Предопределенный Тогда + + Возврат; + + КонецЕсли; + + Если УдалитьНепосредственно Тогда + + Объект.Удалить(); + + Иначе + + УстановитьПометкуУдаленияУОбъекта(Объект, Истина, Свойства.ИмяТипа); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Производит удаление (или помечает на удаление) объект выборки в соответствии с указанным правилом +// +// Параметры: +// Объект - удаляемый (помечаемый на удаление) объект выборки +// Правило - ссылка на правило очистки данных +// Свойства - свойства объекта метаданного удаляемого объекта +// ВходящиеДанные - произвольные вспомогательные данные +// +Процедура УдалениеОбъектаВыборки(Объект, Правило, Свойства=Неопределено, ВходящиеДанные=Неопределено) Экспорт + + Отказ = Ложь; + УдалитьНепосредственно = Правило.Непосредственно; + + + // Обработчик ПередУдалениемОбъектаВыборки + Если Не ПустаяСтрока(Правило.ПередУдалением) Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Правило, "ПередУдалением")); + + Иначе + + Выполнить(Правило.ПередУдалением); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(29, ОписаниеОшибки(), Правило.Имя, Объект, "ПередУдалениемОбъектаВыборки"); + + КонецПопытки; + + Если Отказ Тогда + + Возврат; + + КонецЕсли; + + КонецЕсли; + + + Попытка + + ВыполнитьУдалениеОбъекта(Объект, Свойства, УдалитьНепосредственно); + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(24, ОписаниеОшибки(), Правило.Имя, Объект, ""); + + КонецПопытки; + +КонецПроцедуры // УдалениеОбъектаВыборки() + +// Очищает данные по указанному правилу +// +// Параметры: +// Правило - ссылка на правило очистки данных +// +Процедура ОчиститьДанныеПоПравилу(Правило) + + // Обработчик ПередОбработкой + + Отказ = Ложь; + ВыборкаДанных = Неопределено; + + ИсходящиеДанные = Неопределено; + + + // Обработчик ПередОбработкойПравилаОчистки + Если Не ПустаяСтрока(Правило.ПередОбработкой) Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Правило, "ПередОбработкой")); + + Иначе + + Выполнить(Правило.ПередОбработкой); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(27, ОписаниеОшибки(), Правило.Имя, "", "ПередОбработкойПравилаОчистки"); + + КонецПопытки; + + Если Отказ Тогда + + Возврат; + + КонецЕсли; + + КонецЕсли; + + // Стандартная выборка + + Попытка + Свойства = Менеджеры[Правило.ОбъектВыборки]; + Исключение + Свойства = Неопределено; + КонецПопытки; + + Если Правило.СпособОтбораДанных = "СтандартнаяВыборка" Тогда + + ИмяТипа = Свойства.ИмяТипа; + + Если ИмяТипа = "РегистрБухгалтерии" + ИЛИ ИмяТипа = "Константы" Тогда + + Возврат; + + КонецЕсли; + + НужныВсеПоля = Не ПустаяСтрока(Правило.ПередУдалением); + + Выборка = ПолучитьВыборкуДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, Истина, Правило.Непосредственно, НужныВсеПоля); + + Пока Выборка.Следующий() Цикл + + #Если Клиент Тогда + ОбработкаПрерыванияПользователя(); + #КонецЕсли + + Если ИмяТипа = "РегистрСведений" Тогда + + МенеджерЗаписи = Свойства.Менеджер.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка); + + УдалениеОбъектаВыборки(МенеджерЗаписи, Правило, Свойства, ИсходящиеДанные); + + Иначе + + УдалениеОбъектаВыборки(Выборка.Ссылка.ПолучитьОбъект(), Правило, Свойства, ИсходящиеДанные); + + КонецЕсли; + + КонецЦикла; + + ИначеЕсли Правило.СпособОтбораДанных = "ПроизвольныйАлгоритм" Тогда + + Если ВыборкаДанных <> Неопределено Тогда + + Выборка = ПолучитьВыборкуДляВыгрузкиПоПроизвольномуАлгоритму(ВыборкаДанных); + + Если Выборка <> Неопределено Тогда + + Пока Выборка.Следующий() Цикл + + Если ИмяТипа = "РегистрСведений" Тогда + + МенеджерЗаписи = Свойства.Менеджер.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка); + + УдалениеОбъектаВыборки(МенеджерЗаписи, Правило, Свойства, ИсходящиеДанные); + + Иначе + + УдалениеОбъектаВыборки(Выборка.Ссылка.ПолучитьОбъект(), Правило, Свойства, ИсходящиеДанные); + + КонецЕсли; + + КонецЦикла; + + Иначе + + Для каждого Объект Из ВыборкаДанных Цикл + + УдалениеОбъектаВыборки(Объект.ПолучитьОбъект(), Правило, Свойства, ИсходящиеДанные); + + КонецЦикла; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + + // Обработчик ПослеОбработкиПравилаОчистки + + Если Не ПустаяСтрока(Правило.ПослеОбработки) Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Правило, "ПослеОбработки")); + + Иначе + + Выполнить(Правило.ПослеОбработки); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(28, ОписаниеОшибки(), Правило.Имя, "", "ПослеОбработкиПравилаОчистки"); + + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры // ОчиститьДанныеПоПравилу() + +// Обходит дерево правил очистки данных и выполняет очистку +// +// Параметры: +// Строки - Коллекция строк дерева значений +// +Процедура ОбработатьПравилаОчистки(Строки) + + Для каждого ПравилоОчистки Из Строки Цикл + + Если ПравилоОчистки.Включить = 0 Тогда + + Продолжить; + + КонецЕсли; + + Если ПравилоОчистки.ЭтоГруппа Тогда + + ОбработатьПравилаОчистки(ПравилоОчистки.Строки); + Продолжить; + + КонецЕсли; + + ОчиститьДанныеПоПравилу(ПравилоОчистки); + + КонецЦикла; + +КонецПроцедуры // ОбработатьПравилаОчистки() + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ЗАГРУЗКИ ДАННЫХ + +// Устанавливает значение параметра "Загрузка" для свойства объекта "ОбменДанными". +// +// Параметры: +// Объект - объект, для которого устанавливается свойство +// Значение - значение устанавливаемого свойства "Загрузка" +// +Процедура УстановитьОбменДаннымиЗагрузка(Объект, Значение = Истина) Экспорт + + Если Не ЗагружатьДанныеВРежимеОбмена Тогда + Возврат; + КонецЕсли; + + Попытка + Объект.ОбменДанными.Загрузка = Значение; + Исключение + КонецПопытки; + +КонецПроцедуры // УстановитьОбменДаннымиЗагрузка() + +Функция УстановитьСсылкуНового(Объект, Менеджер, СвойстваПоиска) + + УИ = СвойстваПоиска["{УникальныйИдентификатор}"]; + + Если УИ <> Неопределено Тогда + + НоваяСсылка = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(УИ)); + + Объект.УстановитьСсылкуНового(НоваяСсылка); + + СвойстваПоиска.Удалить("{УникальныйИдентификатор}"); + + Иначе + + НоваяСсылка = Неопределено; + + КонецЕсли; + + Возврат НоваяСсылка; + +КонецФункции + +// Ищет объект по номеру в списке уже загруженных объектов. +// +// Параметры: +// Нпп - номер искомого объекта в файле обмена +// +// Возвращаемое значение: +// Ссылка на найденный объект. Если объект не найден, возвращается Неопределено. +// +Функция НайтиОбъектПоНомеру(Нпп, РежимПоискаОсновногоОбъекта = Ложь) + + Если Нпп = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + СтруктураРезультата = ЗагруженныеОбъекты[Нпп]; + + Если СтруктураРезультата = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Если РежимПоискаОсновногоОбъекта И СтруктураРезультата.СсылкаФиктивная Тогда + Возврат Неопределено; + Иначе + Возврат СтруктураРезультата.СсылкаНаОбъект; + КонецЕсли; + +КонецФункции // НайтиОбъектПоНомеру() + +Функция НайтиОбъектПоГлобальномуНомеру(Нпп, РежимПоискаОсновногоОбъекта = Ложь) + + СтруктураРезультата = ЗагруженныеГлобальныеОбъекты[Нпп]; + + Если СтруктураРезультата = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Если РежимПоискаОсновногоОбъекта И СтруктураРезультата.СсылкаФиктивная Тогда + Возврат Неопределено; + Иначе + Возврат СтруктураРезультата.СсылкаНаОбъект; + КонецЕсли; + +КонецФункции + +Процедура ЗаписатьОбъектВИБ(Объект, Тип) + + Попытка + + УстановитьОбменДаннымиЗагрузка(Объект); + Объект.Записать(); + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеВПротокол(26, ОписаниеОшибки(), Объект, Тип); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + +КонецПроцедуры + +Процедура УстановитьТекущуюДатуРеквизиту(РеквизитОбъекта) + + #Если Клиент Тогда + РеквизитОбъекта = РабочаяДата; + #Иначе + РеквизитОбъекта = ТекущаяДата(); + #КонецЕсли + +КонецПроцедуры + +// Создает новый объект указанного типа, устанавливает реквизиты, указанные +// в структуре СвойстваПоиска. +// +// Параметры: +// Тип - тип создаваемого объекта +// СвойстваПоиска - Структура, содержащая устанавливаемые реквизиты нового объекта +// +// Возвращаемое значение: +// Новый объект информационной базы +// +Функция СоздатьНовыйОбъект(Тип, СвойстваПоиска, Объект = Неопределено, + ЗаписыватьОбъектСразуПослеСоздания = Истина, НаборЗаписейРегистра = Неопределено, + НоваяСсылка = Неопределено, Нпп = 0, ГНпп = 0, ПараметрыОбъекта = Неопределено, + УстанавливатьУОбъектаВсеСвойстваПоиска = Истина) + + СвойстваМД = Менеджеры[Тип]; + ИмяТипа = СвойстваМД.ИмяТипа; + Менеджер = СвойстваМД.Менеджер; + ПометкаУдаления = Неопределено; + + Если ИмяТипа = "Справочник" + ИЛИ ИмяТипа = "ПланВидовХарактеристик" Тогда + + ЭтоГруппа = СвойстваПоиска["ЭтоГруппа"]; + + Если ЭтоГруппа = Истина Тогда + + Объект = Менеджер.СоздатьГруппу(); + + Иначе + + Объект = Менеджер.СоздатьЭлемент(); + + КонецЕсли; + + ИначеЕсли ИмяТипа = "Документ" Тогда + + Объект = Менеджер.СоздатьДокумент(); + + ИначеЕсли ИмяТипа = "ПланСчетов" Тогда + + Объект = Менеджер.СоздатьСчет(); + + ИначеЕсли ИмяТипа = "ПланВидовРасчета" Тогда + + Объект = Менеджер.СоздатьВидРасчета(); + + ИначеЕсли ИмяТипа = "РегистрСведений" Тогда + + Если ЗаписыватьРегистрыНаборамиЗаписей Тогда + + НаборЗаписейРегистра = Менеджер.СоздатьНаборЗаписей(); + Объект = НаборЗаписейРегистра.Добавить(); + + Иначе + + Объект = Менеджер.СоздатьМенеджерЗаписи(); + + КонецЕсли; + + Возврат Объект; + + ИначеЕсли ИмяТипа = "ПланОбмена" Тогда + + Объект = Менеджер.СоздатьУзел(); + + ИначеЕсли ИмяТипа = "Задача" Тогда + + Объект = Менеджер.СоздатьЗадачу(); + + ИначеЕсли ИмяТипа = "БизнесПроцесс" Тогда + + Объект = Менеджер.СоздатьБизнесПроцесс(); + + ИначеЕсли ИмяТипа = "Перечисление" Тогда + + Объект = СвойстваМД.ПустаяСсылка; + Возврат Объект; + + ИначеЕсли ИмяТипа = "ТочкаМаршрутаБизнесПроцесса" Тогда + + Возврат Неопределено; + + КонецЕсли; + + НоваяСсылка = УстановитьСсылкуНового(Объект, Менеджер, СвойстваПоиска); + + Если УстанавливатьУОбъектаВсеСвойстваПоиска Тогда + УстановитьРеквизитыПоискаУОбъекта(Объект, СвойстваПоиска, , Ложь, Ложь); + КонецЕсли; + + // Проверки + Если ИмяТипа = "Документ" + ИЛИ ИмяТипа = "Задача" + ИЛИ ИмяТипа = "БизнесПроцесс" Тогда + + Если НЕ ЗначениеЗаполнено(Объект.Дата) Тогда + + УстановитьТекущуюДатуРеквизиту(Объект.Дата); + + КонецЕсли; + + КонецЕсли; + + // !!! Если Владелец не установлен, то нужно поле добавить + // в возможные поля поиска, а в событии ПОЛЯПОИСКА указать поля без Владельца, если по нему поиск реально не нужен + + Если ЗаписыватьОбъектСразуПослеСоздания Тогда + + Если НЕ ОбъектыПоСсылкеЗагружатьБезПометкиУдаления Тогда + Объект.ПометкаУдаления = Истина; + КонецЕсли; + + Если ГНпп <> 0 + ИЛИ Не ОптимизированнаяЗаписьОбъектов Тогда + + ЗаписатьОбъектВИБ(Объект, Тип); + + Иначе + + // записывать объект сразу не будем, а только запомним что нужно записать + // сохраним эту информацию в специальном стеке объектов для записи + // вернем и новую ссылку и сам объект, хотя он еще не записан + Если НоваяСсылка = Неопределено Тогда + + // самостоятельно генерируем новую ссылку + НовыйУникальныйИдентификатор = Новый УникальныйИдентификатор; + НоваяСсылка = Менеджер.ПолучитьСсылку(НовыйУникальныйИдентификатор); + Объект.УстановитьСсылкуНового(НоваяСсылка); + + КонецЕсли; + + ДополнитьСтекНеЗаписанныхОбъектов(Нпп, ГНпп, Объект, НоваяСсылка, Тип, ПараметрыОбъекта); + + Возврат НоваяСсылка; + + КонецЕсли; + + Иначе + + Возврат Неопределено; + + КонецЕсли; + + Возврат Объект.Ссылка; + +КонецФункции + +// Читает из файла узел свойства объекта, устанавливает значение свойства +// +// Параметры: +// Тип - тип значения свойства +// ОбъектНайден - если после выполнения функции - Ложь, то значит +// объект свойства не найден в информационной базе и создан новый +// +// Возвращаемое значение: +// Значение свойства +// +Функция ПрочитатьСвойство(Тип) + + Значение = Неопределено; + НаличиеСвойств = Ложь; + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Значение" Тогда + + ИскатьПоСвойству = одАтрибут(ФайлОбмена, одТипСтрока, "Свойство"); + Значение = одЗначениеЭлемента(ФайлОбмена, Тип, ИскатьПоСвойству, ОбрезатьСтрокиСправа); + НаличиеСвойств = Истина; + + ИначеЕсли ИмяУзла = "Ссылка" Тогда + + Значение = НайтиОбъектПоСсылке(Тип); + НаличиеСвойств = Истина; + + ИначеЕсли ИмяУзла = "Нпп" Тогда + + одПропустить(ФайлОбмена); + + ИначеЕсли ИмяУзла = "ГНпп" Тогда + + ФайлОбмена.Прочитать(); + ГНпп = Число(ФайлОбмена.Значение); + Если ГНпп <> 0 Тогда + Значение = НайтиОбъектПоГлобальномуНомеру(ГНпп); + НаличиеСвойств = Истина; + КонецЕсли; + + ФайлОбмена.Прочитать(); + + ИначеЕсли (ИмяУзла = "Свойство" ИЛИ ИмяУзла = "ЗначениеПараметра") И (ФайлОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Если Не НаличиеСвойств + И ЗначениеЗаполнено(Тип) Тогда + + // если вообще ничего нет - значит пустое значение + Значение = одПолучитьПустоеЗначение(Тип); + + КонецЕсли; + + Прервать; + + ИначеЕсли ИмяУзла = "Выражение" Тогда + + Значение = Вычислить(одЗначениеЭлемента(ФайлОбмена, одТипСтрока, , Ложь)); + НаличиеСвойств = Истина; + + ИначеЕсли ИмяУзла = "Пусто" Тогда + + Значение = одПолучитьПустоеЗначение(Тип); + НаличиеСвойств = Истина; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + + Возврат Значение; + +КонецФункции // ПрочитатьСвойство() + +Функция УстановитьРеквизитыПоискаУОбъекта(НайденныйОбъект, СвойстваПоиска, СвойстваПоискаНеЗамещать, + НужноСравниватьСТекущимиРеквизитами = Истина, НЕЗаменятьСвойстваНеПодлежащиеИзменению = Истина) + + ИзмененыРеквизитыОбъекта = Ложь; + + Для каждого Свойство Из СвойстваПоиска Цикл + + Имя = Свойство.Ключ; + Значение = Свойство.Значение; + + Если НЕЗаменятьСвойстваНеПодлежащиеИзменению + И СвойстваПоискаНеЗамещать[Имя] <> Неопределено Тогда + + Продолжить; + + КонецЕсли; + + Если Имя = "ЭтоГруппа" + ИЛИ Имя = "{УникальныйИдентификатор}" + ИЛИ Имя = "{ИмяПредопределенногоЭлемента}" Тогда + + Продолжить; + + ИначеЕсли Имя = "ПометкаУдаления" Тогда + + Если НЕ НужноСравниватьСТекущимиРеквизитами + ИЛИ НайденныйОбъект.ПометкаУдаления <> Значение Тогда + + НайденныйОбъект.ПометкаУдаления = Значение; + ИзмененыРеквизитыОбъекта = Истина; + + КонецЕсли; + + Иначе + + // отличные реквизиты устанавливаем + Если НайденныйОбъект[Имя] <> NULL Тогда + + Если НЕ НужноСравниватьСТекущимиРеквизитами + ИЛИ НайденныйОбъект[Имя] <> Значение Тогда + + НайденныйОбъект[Имя] = Значение; + ИзмененыРеквизитыОбъекта = Истина; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Возврат ИзмененыРеквизитыОбъекта; + +КонецФункции + +Функция НайтиИлиСоздатьОбъектПоСвойству(СтруктураСвойств, ТипОбъекта, СвойстваПоиска, СвойстваПоискаНеЗамещать, + ИмяТипаОбъекта, СвойствоПоиска, ЗначениеСвойстваПоиска, ОбъектНайден, + СоздаватьНовыйЭлементЕслиНеНайден = Истина, НайденныйИлиСозданныйОбъект = Неопределено, + РежимПоискаОсновногоОбъекта = Ложь, СвойстваОбъектаМодифицированы = Ложь, + НоваяСсылкаУникальногоИдентификатора = Неопределено, Нпп = 0, ГНпп = 0, ПараметрыОбъекта = Неопределено) + + ЭтоПеречисление = СтруктураСвойств.ИмяТипа = "Перечисление"; + + Если ЭтоПеречисление Тогда + + СтрокаПоиска = ""; + + Иначе + + СтрокаПоиска = СтруктураСвойств.СтрокаПоиска; + + КонецЕсли; + + + Объект = одНайтиОбъектПоСвойству(СтруктураСвойств.Менеджер, СвойствоПоиска, ЗначениеСвойстваПоиска, + НайденныйИлиСозданныйОбъект, , , РежимПоискаОсновногоОбъекта, СтрокаПоиска); + + ОбъектНайденИлиСоздан = НЕ (Объект = Неопределено + ИЛИ Объект.Пустая()); + + ОбъектНайден = НЕ Объект.Пустая(); + + Если Не ОбъектНайденИлиСоздан + И СоздаватьНовыйЭлементЕслиНеНайден Тогда + + Объект = СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, НайденныйИлиСозданныйОбъект, + НЕ РежимПоискаОсновногоОбъекта,,НоваяСсылкаУникальногоИдентификатора, Нпп, ГНпп, ПараметрыОбъекта); + + СвойстваОбъектаМодифицированы = Истина; + Возврат Объект; + + КонецЕсли; + + Если ЭтоПеречисление Тогда + Возврат Объект; + КонецЕсли; + + Если РежимПоискаОсновногоОбъекта Тогда + + // + Попытка + + Если НайденныйИлиСозданныйОбъект = Неопределено Тогда + НайденныйИлиСозданныйОбъект = Объект.ПолучитьОбъект(); + КонецЕсли; + + Исключение + Возврат Объект; + КонецПопытки; + + СвойстваОбъектаМодифицированы = УстановитьРеквизитыПоискаУОбъекта(НайденныйИлиСозданныйОбъект, СвойстваПоиска, СвойстваПоискаНеЗамещать); + + КонецЕсли; + + Возврат Объект; + +КонецФункции + +Функция ПолучитьТипСвойства() + + СтроковыйТипСвойства = одАтрибут(ФайлОбмена, одТипСтрока, "Тип"); + Если ПустаяСтрока(СтроковыйТипСвойства) Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат Тип(СтроковыйТипСвойства); + +КонецФункции + +Функция ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, ИмяСвойства) + + ТипСвойства = ПолучитьТипСвойства(); + + Если ТипСвойства = Неопределено + И ИнформацияОТипах <> Неопределено Тогда + + ТипСвойства = ИнформацияОТипах[ИмяСвойства]; + + КонецЕсли; + + Возврат ТипСвойства; + +КонецФункции + +Процедура ПрочитатьСвойстваПоискаИзФайла(СвойстваПоиска, СвойстваПоискаНеЗамещать, ИнформацияОТипах, + ПоискПоДатеНаРавенство = Ложь, ПараметрыОбъекта = Неопределено) + + ПоискПоДатеНаРавенство = Ложь; + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Свойство" + ИЛИ ИмяУзла = "ЗначениеПараметра" Тогда + + ЭтоПараметр = (ИмяУзла = "ЗначениеПараметра"); + + Имя = одАтрибут(ФайлОбмена, одТипСтрока, "Имя"); + + Если Имя = "{УникальныйИдентификатор}" + ИЛИ Имя = "{ИмяПредопределенногоЭлемента}" Тогда + + ТипСвойства = одТипСтрока; + + Иначе + + ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + + КонецЕсли; + + НеЗамещатьСвойство = одАтрибут(ФайлОбмена, одТипБулево, "НеЗамещать"); + ПоискПоДатеНаРавенство = ПоискПоДатеНаРавенство + ИЛИ одАтрибут(ФайлОбмена, одТипБулево, "ПоискПоДатеНаРавенство"); + + ЗначениеСвойства = ПрочитатьСвойство(ТипСвойства); + + Если (Имя = "ЭтоГруппа") И (ЗначениеСвойства <> Истина) Тогда + + ЗначениеСвойства = Ложь; + + КонецЕсли; + + Если ЭтоПараметр Тогда + + + ДобавитьПараметрПриНеобходимости(ПараметрыОбъекта, Имя, ЗначениеСвойства); + + Иначе + + СвойстваПоиска[Имя] = ЗначениеСвойства; + + Если НеЗамещатьСвойство Тогда + + СвойстваПоискаНеЗамещать[Имя] = Истина; + + КонецЕсли; + + КонецЕсли; + + ИначеЕсли (ИмяУзла = "Ссылка") И (ФайлОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Прервать; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция ОпределитьУПоляНеограниченнаяДлина(МенеджерТипа, ИмяПараметра) + + ДлинныеСтроки = Неопределено; + Если НЕ МенеджерТипа.Свойство("ДлинныеСтроки", ДлинныеСтроки) Тогда + + ДлинныеСтроки = Новый Соответствие; + Для Каждого Реквизит Из МенеджерТипа.ОбъектМД.Реквизиты Цикл + + Если Реквизит.Тип.СодержитТип(одТипСтрока) + И (Реквизит.Тип.КвалификаторыСтроки.Длина = 0) Тогда + + ДлинныеСтроки.Вставить(Реквизит.Имя, Реквизит.Имя); + + КонецЕсли; + + КонецЦикла; + + МенеджерТипа.Вставить("ДлинныеСтроки", ДлинныеСтроки); + + КонецЕсли; + + Возврат (ДлинныеСтроки[ИмяПараметра] <> Неопределено); + +КонецФункции + +Функция ОпределитьЭтотПараметрНеограниченнойДлинны(МенеджерТипа, ЗначениеПараметра, ИмяПараметра) + + Попытка + + Если ТипЗнч(ЗначениеПараметра) = одТипСтрока Тогда + СтрокаНеограниченнойДлины = ОпределитьУПоляНеограниченнаяДлина(МенеджерТипа, ИмяПараметра); + Иначе + СтрокаНеограниченнойДлины = Ложь; + КонецЕсли; + + Исключение + + СтрокаНеограниченнойДлины = Ложь; + + КонецПопытки; + + Возврат СтрокаНеограниченнойДлины; + +КонецФункции + +Функция НайтиЭлементЗапросом(СтруктураСвойств, СвойстваПоиска, ТипОбъекта = Неопределено, + МенеджерТипа = Неопределено, КоличествоРеальныхСвойствДляПоиска = Неопределено) + + КоличествоСвойствДляПоиска = ?(КоличествоРеальныхСвойствДляПоиска = Неопределено, СвойстваПоиска.Количество(), КоличествоРеальныхСвойствДляПоиска); + + Если КоличествоСвойствДляПоиска = 0 + И СтруктураСвойств.ИмяТипа = "Перечисление" Тогда + + Возврат СтруктураСвойств.ПустаяСсылка; + + КонецЕсли; + + ТекстЗапроса = СтруктураСвойств.СтрокаПоиска; + + Если ПустаяСтрока(ТекстЗапроса) Тогда + Возврат СтруктураСвойств.ПустаяСсылка; + КонецЕсли; + + ЗапросПоиска = Новый Запрос(); + КоличествоСвойствПоКоторымУстановленПоиск = 0; + + Для каждого Свойство Из СвойстваПоиска Цикл + + ИмяПараметра = Свойство.Ключ; + + // не по всем параметрам можно искать + Если ИмяПараметра = "{УникальныйИдентификатор}" + ИЛИ ИмяПараметра = "{ИмяПредопределенногоЭлемента}" Тогда + + Продолжить; + + КонецЕсли; + + ЗначениеПараметра = Свойство.Значение; + ЗапросПоиска.УстановитьПараметр(ИмяПараметра, ЗначениеПараметра); + + Попытка + + //МенеджерТипа = ?(МенеджерТипа = Неопределено, Менеджеры[ТипОбъекта], МенеджерТипа); + + СтрокаНеограниченнойДлины = ОпределитьЭтотПараметрНеограниченнойДлинны(СтруктураСвойств, ЗначениеПараметра, ИмяПараметра); + + Исключение + + СтрокаНеограниченнойДлины = Ложь; + + КонецПопытки; + + КоличествоСвойствПоКоторымУстановленПоиск = КоличествоСвойствПоКоторымУстановленПоиск + 1; + + Если СтрокаНеограниченнойДлины Тогда + + ТекстЗапроса = ТекстЗапроса + ?(КоличествоСвойствПоКоторымУстановленПоиск > 1, " И ", "") + ИмяПараметра + " ПОДОБНО &" + ИмяПараметра; + + Иначе + + ТекстЗапроса = ТекстЗапроса + ?(КоличествоСвойствПоКоторымУстановленПоиск > 1, " И ", "") + ИмяПараметра + " = &" + ИмяПараметра; + + КонецЕсли; + + КонецЦикла; + + Если КоличествоСвойствПоКоторымУстановленПоиск = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + ЗапросПоиска.Текст = ТекстЗапроса; + Результат = ЗапросПоиска.Выполнить(); + + Если Результат.Пустой() Тогда + + Возврат Неопределено; + + Иначе + + // возвращаем первый найденный объект + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + СсылкаНаОбъект = Выборка.Ссылка; + + КонецЕсли; + + Возврат СсылкаНаОбъект; + +КонецФункции + +Функция ОпределитьПоТипуОбъектаИспользоватьДополнительныйПоискПоПолямПоиска(ТипСсылкиСтрокой) + + ЗначениеСоответствия = мСоответствиеДопПараметровПоиска.Получить(ТипСсылкиСтрокой); + + Если ЗначениеСоответствия <> Неопределено Тогда + Возврат ЗначениеСоответствия; + КонецЕсли; + + Попытка + + Для Каждого Элемент Из Правила Цикл + + Если Элемент.Значение.Приемник = ТипСсылкиСтрокой Тогда + + Если Элемент.Значение.СинхронизироватьПоИдентификатору = Истина Тогда + + НужноПродолжитьПоиск = (Элемент.Значение.ПродолжитьПоискПоПолямПоискаЕслиПоИдентификаторуНеНашли = Истина); + мСоответствиеДопПараметровПоиска.Вставить(ТипСсылкиСтрокой, НужноПродолжитьПоиск); + + Возврат НужноПродолжитьПоиск; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + мСоответствиеДопПараметровПоиска.Вставить(ТипСсылкиСтрокой, Ложь); + Возврат Ложь; + + Исключение + + мСоответствиеДопПараметровПоиска.Вставить(ТипСсылкиСтрокой, Ложь); + Возврат Ложь; + + КонецПопытки; + +КонецФункции + +Функция ОпределитьПоТипуОбъектаАлгоритмПоследовательностиПолейПоиска(ТипСсылкиСтрокой) + + ЗначениеСоответствия = мСоответствиеАлгоритмовПоискаЭлементов.Получить(ТипСсылкиСтрокой); + + Если ЗначениеСоответствия <> Неопределено Тогда + Возврат ЗначениеСоответствия; + КонецЕсли; + + Попытка + + Для Каждого Элемент Из Правила Цикл + + Если Элемент.Значение.Приемник = ТипСсылкиСтрокой Тогда + + Если Элемент.Значение.ЕстьОбработчикПоследовательностьПолейПоиска = Истина Тогда + + АлгоритмПоиска = Элемент.Значение.ПоследовательностьПолейПоиска; + мСоответствиеАлгоритмовПоискаЭлементов.Вставить(ТипСсылкиСтрокой, АлгоритмПоиска); + + Возврат АлгоритмПоиска; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + мСоответствиеАлгоритмовПоискаЭлементов.Вставить(ТипСсылкиСтрокой, ""); + Возврат ""; + + Исключение + + мСоответствиеАлгоритмовПоискаЭлементов.Вставить(ТипСсылкиСтрокой, ""); + Возврат ""; + + КонецПопытки; + +КонецФункции + +// Определяет по типу объекта приемника правило конвертации объекта (ПКО) +// +// Параметры: +// ТипСсылкиСтрокой - Строка - тип объекта в строковом представлении, например, "СправочникСсылка.Номенклатура". +// +// Возвращаемое значение: +// ЗначениеСоответствия = Правило конвертации объекта +// +Функция ОпределитьПоТипуОбъектаПриемникаПравилоКонвертации(ТипСсылкиСтрокой) + + ЗначениеСоответствия = мСоответствиеПравилКонвертации.Получить(ТипСсылкиСтрокой); + + Если ЗначениеСоответствия <> Неопределено Тогда + Возврат ЗначениеСоответствия; + КонецЕсли; + + Попытка + + Для Каждого Элемент Из Правила Цикл + + Если Элемент.Значение.Приемник = ТипСсылкиСтрокой Тогда + + Если Элемент.Значение.ЕстьОбработчикПоследовательностьПолейПоиска = Истина Тогда + + Правило = Элемент.Значение; + + мСоответствиеПравилКонвертации.Вставить(ТипСсылкиСтрокой, Правило); + + Возврат Правило; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + мСоответствиеПравилКонвертации.Вставить(ТипСсылкиСтрокой, Неопределено); + Возврат Неопределено; + + Исключение + + мСоответствиеПравилКонвертации.Вставить(ТипСсылкиСтрокой, Неопределено); + Возврат Неопределено; + + КонецПопытки; + +КонецФункции + +Функция НайтиСсылкуНаОбъектПоОдномуСвойству(СвойстваПоиска, СтруктураСвойств) + + Для каждого Свойство Из СвойстваПоиска Цикл + + ИмяПараметра = Свойство.Ключ; + + // не по всем параметрам можно искать + Если ИмяПараметра = "{УникальныйИдентификатор}" + ИЛИ ИмяПараметра = "{ИмяПредопределенногоЭлемента}" Тогда + + Продолжить; + + КонецЕсли; + + ЗначениеПараметра = Свойство.Значение; + СсылкаНаОбъект = одНайтиОбъектПоСвойству(СтруктураСвойств.Менеджер, ИмяПараметра, ЗначениеПараметра, , СтруктураСвойств, СвойстваПоиска); + + КонецЦикла; + + Возврат СсылкаНаОбъект; + +КонецФункции + +Функция НайтиСсылкуНаДокумент(СвойстваПоиска, СтруктураСвойств, КоличествоРеальныхСвойствДляПоиска, ИскатьЗапросом, ПоискПоДатеНаРавенство) + + // попробуем документ по дате и номеру найти + ИскатьЗапросом = ПоискПоДатеНаРавенство ИЛИ (КоличествоРеальныхСвойствДляПоиска <> 2); + + Если ИскатьЗапросом Тогда + Возврат Неопределено; + КонецЕсли; + + НомерДокумента = СвойстваПоиска["Номер"]; + ДатаДокумента = СвойстваПоиска["Дата"]; + + Если (НомерДокумента <> Неопределено) И (ДатаДокумента <> Неопределено) Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.НайтиПоНомеру(НомерДокумента, ДатаДокумента); + + Иначе + + // по дате и номеру найти не удалось - надо искать запросом + ИскатьЗапросом = Истина; + СсылкаНаОбъект = Неопределено; + + КонецЕсли; + + Возврат СсылкаНаОбъект; + +КонецФункции + +Функция НайтиСсылкуНаСправочник(СвойстваПоиска, СтруктураСвойств, КоличествоРеальныхСвойствДляПоиска, ИскатьЗапросом) + + Владелец = СвойстваПоиска["Владелец"]; + Родитель = СвойстваПоиска["Родитель"]; + Код = СвойстваПоиска["Код"]; + Наименование = СвойстваПоиска["Наименование"]; + + Кол = 0; + + Если Владелец <> Неопределено Тогда Кол = 1 + Кол; КонецЕсли; + Если Родитель <> Неопределено Тогда Кол = 1 + Кол; КонецЕсли; + Если Код <> Неопределено Тогда Кол = 1 + Кол; КонецЕсли; + Если Наименование <> Неопределено Тогда Кол = 1 + Кол; КонецЕсли; + + ИскатьЗапросом = (Кол <> КоличествоРеальныхСвойствДляПоиска); + + Если ИскатьЗапросом Тогда + Возврат Неопределено; + КонецЕсли; + + Если (Код <> Неопределено) И (Наименование = Неопределено) Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.НайтиПоКоду(Код, , Родитель, Владелец); + + ИначеЕсли (Код = Неопределено) И (Наименование <> Неопределено) Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.НайтиПоНаименованию(Наименование, ИСТИНА, Родитель, Владелец); + + Иначе + + ИскатьЗапросом = Истина; + СсылкаНаОбъект = Неопределено; + + КонецЕсли; + + Возврат СсылкаНаОбъект; + +КонецФункции + +Функция НайтиСсылкуНаПВХ(СвойстваПоиска, СтруктураСвойств, КоличествоРеальныхСвойствДляПоиска, ИскатьЗапросом) + + Родитель = СвойстваПоиска["Родитель"]; + Код = СвойстваПоиска["Код"]; + Наименование = СвойстваПоиска["Наименование"]; + Кол = 0; + + Если Родитель <> Неопределено Тогда Кол = 1 + Кол КонецЕсли; + Если Код <> Неопределено Тогда Кол = 1 + Кол КонецЕсли; + Если Наименование <> Неопределено Тогда Кол = 1 + Кол КонецЕсли; + + ИскатьЗапросом = (Кол <> КоличествоРеальныхСвойствДляПоиска); + + Если ИскатьЗапросом Тогда + Возврат Неопределено; + КонецЕсли; + + Если (Код <> Неопределено) И (Наименование = Неопределено) Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.НайтиПоКоду(Код, Родитель); + + ИначеЕсли (Код = Неопределено) И (Наименование <> Неопределено) Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.НайтиПоНаименованию(Наименование, ИСТИНА, Родитель); + + Иначе + + ИскатьЗапросом = Истина; + СсылкаНаОбъект = Неопределено; + + КонецЕсли; + + Возврат СсылкаНаОбъект; + +КонецФункции + +Функция НайтиСсылкуНаПланОбмена(СвойстваПоиска, СтруктураСвойств, КоличествоРеальныхСвойствДляПоиска, ИскатьЗапросом) + + Код = СвойстваПоиска["Код"]; + Наименование = СвойстваПоиска["Наименование"]; + Кол = 0; + + Если Код <> Неопределено Тогда Кол = 1 + Кол КонецЕсли; + Если Наименование <> Неопределено Тогда Кол = 1 + Кол КонецЕсли; + + ИскатьЗапросом = (Кол <> КоличествоРеальныхСвойствДляПоиска); + + Если ИскатьЗапросом Тогда + Возврат Неопределено; + КонецЕсли; + + Если (Код <> Неопределено) И (Наименование = Неопределено) Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.НайтиПоКоду(Код); + + ИначеЕсли (Код = Неопределено) И (Наименование <> Неопределено) Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.НайтиПоНаименованию(Наименование, ИСТИНА); + + Иначе + + ИскатьЗапросом = Истина; + СсылкаНаОбъект = Неопределено; + + КонецЕсли; + + Возврат СсылкаНаОбъект; + +КонецФункции + +Функция НайтиСсылкуНаЗадачу(СвойстваПоиска, СтруктураСвойств, КоличествоРеальныхСвойствДляПоиска, ИскатьЗапросом) + + Код = СвойстваПоиска["Номер"]; + Наименование = СвойстваПоиска["Наименование"]; + Кол = 0; + + Если Код <> Неопределено Тогда Кол = 1 + Кол КонецЕсли; + Если Наименование <> Неопределено Тогда Кол = 1 + Кол КонецЕсли; + + ИскатьЗапросом = (Кол <> КоличествоРеальныхСвойствДляПоиска); + + Если ИскатьЗапросом Тогда + Возврат Неопределено; + КонецЕсли; + + + Если (Код <> Неопределено) И (Наименование = Неопределено) Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.НайтиПоНомеру(Код); + + ИначеЕсли (Код = Неопределено) И (Наименование <> Неопределено) Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.НайтиПоНаименованию(Наименование, ИСТИНА); + + Иначе + + ИскатьЗапросом = Истина; + СсылкаНаОбъект = Неопределено; + + КонецЕсли; + + Возврат СсылкаНаОбъект; + +КонецФункции + +Функция НайтиСсылкуНаБизнесПроцесс(СвойстваПоиска, СтруктураСвойств, КоличествоРеальныхСвойствДляПоиска, ИскатьЗапросом) + + Код = СвойстваПоиска["Номер"]; + Кол = 0; + + Если Код <> Неопределено Тогда Кол = 1 + Кол КонецЕсли; + + ИскатьЗапросом = (Кол <> КоличествоРеальныхСвойствДляПоиска); + + Если ИскатьЗапросом Тогда + Возврат Неопределено; + КонецЕсли; + + Если (Код <> Неопределено) Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.НайтиПоНомеру(Код); + + Иначе + + ИскатьЗапросом = Истина; + СсылкаНаОбъект = Неопределено; + + КонецЕсли; + + Возврат СсылкаНаОбъект; + +КонецФункции + +Процедура ДобавитьСсылкуВСписокЗагруженныхОбъектов(ГНппСсылки, НппСсылки, СсылкаНаОбъект, СсылкаФиктивная = Ложь) + + // запоминаем ссылку на объект + Если НЕ ЗапоминатьЗагруженныеОбъекты + ИЛИ СсылкаНаОбъект = Неопределено Тогда + + Возврат; + + КонецЕсли; + + СтруктураЗаписи = Новый Структура("СсылкаНаОбъект, СсылкаФиктивная", СсылкаНаОбъект, СсылкаФиктивная); + + // запоминаем ссылку на объект + Если ГНппСсылки <> 0 Тогда + + ЗагруженныеГлобальныеОбъекты[ГНппСсылки] = СтруктураЗаписи; + + ИначеЕсли НппСсылки <> 0 Тогда + + ЗагруженныеОбъекты[НппСсылки] = СтруктураЗаписи; + + КонецЕсли; + +КонецПроцедуры + +Функция НайтиЭлементПоСвойствамПоиска(ТипОбъекта, ИмяТипаОбъекта, СвойстваПоиска, + СтруктураСвойств, СтрокаИменСвойствПоиска, ПоискПоДатеНаРавенство) + + // не нужно искать по имени предопределенного элемента и по уникальной ссылке на объект + // нужно искать только по тем свойствам, которые имеются в строке имен свойств. Если там пусто, то по + // всем имеющимся свойствам поиска + + ИскатьЗапросом = Ложь; + + Если ПустаяСтрока(СтрокаИменСвойствПоиска) Тогда + + ВременныеСвойстваПоиска = СвойстваПоиска; + + Иначе + + ГотоваяСтрокаДляРазбора = СтрЗаменить(СтрокаИменСвойствПоиска, " ", ""); + ДлинаСтроки = СтрДлина(ГотоваяСтрокаДляРазбора); + Если Сред(ГотоваяСтрокаДляРазбора, ДлинаСтроки, 1) <> "," Тогда + + ГотоваяСтрокаДляРазбора = ГотоваяСтрокаДляРазбора + ","; + + КонецЕсли; + + ВременныеСвойстваПоиска = Новый Соответствие; + Для Каждого ЭлементСвойств Из СвойстваПоиска Цикл + + ИмяПараметра = ЭлементСвойств.Ключ; + Если Найти(ГотоваяСтрокаДляРазбора, ИмяПараметра + ",") > 0 Тогда + + ВременныеСвойстваПоиска.Вставить(ИмяПараметра, ЭлементСвойств.Значение); + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + СвойствоУникальныйИдентификатор = ВременныеСвойстваПоиска["{УникальныйИдентификатор}"]; + СвойствоИмяПредопределенного = ВременныеСвойстваПоиска["{ИмяПредопределенногоЭлемента}"]; + + КоличествоРеальныхСвойствДляПоиска = ВременныеСвойстваПоиска.Количество(); + КоличествоРеальныхСвойствДляПоиска = КоличествоРеальныхСвойствДляПоиска - ?(СвойствоУникальныйИдентификатор <> Неопределено, 1, 0); + КоличествоРеальныхСвойствДляПоиска = КоличествоРеальныхСвойствДляПоиска - ?(СвойствоИмяПредопределенного <> Неопределено, 1, 0); + + + Если КоличествоРеальныхСвойствДляПоиска = 1 Тогда + + СсылкаНаОбъект = НайтиСсылкуНаОбъектПоОдномуСвойству(ВременныеСвойстваПоиска, СтруктураСвойств); + + ИначеЕсли ИмяТипаОбъекта = "Документ" Тогда + + СсылкаНаОбъект = НайтиСсылкуНаДокумент(ВременныеСвойстваПоиска, СтруктураСвойств, КоличествоРеальныхСвойствДляПоиска, ИскатьЗапросом, ПоискПоДатеНаРавенство); + + ИначеЕсли ИмяТипаОбъекта = "Справочник" Тогда + + СсылкаНаОбъект = НайтиСсылкуНаСправочник(ВременныеСвойстваПоиска, СтруктураСвойств, КоличествоРеальныхСвойствДляПоиска, ИскатьЗапросом); + + ИначеЕсли ИмяТипаОбъекта = "ПланВидовХарактеристик" Тогда + + СсылкаНаОбъект = НайтиСсылкуНаПВХ(ВременныеСвойстваПоиска, СтруктураСвойств, КоличествоРеальныхСвойствДляПоиска, ИскатьЗапросом); + + ИначеЕсли ИмяТипаОбъекта = "ПланОбмена" Тогда + + СсылкаНаОбъект = НайтиСсылкуНаПланОбмена(ВременныеСвойстваПоиска, СтруктураСвойств, КоличествоРеальныхСвойствДляПоиска, ИскатьЗапросом); + + ИначеЕсли ИмяТипаОбъекта = "Задача" Тогда + + СсылкаНаОбъект = НайтиСсылкуНаЗадачу(ВременныеСвойстваПоиска, СтруктураСвойств, КоличествоРеальныхСвойствДляПоиска, ИскатьЗапросом); + + ИначеЕсли ИмяТипаОбъекта = "БизнесПроцесс" Тогда + + СсылкаНаОбъект = НайтиСсылкуНаБизнесПроцесс(ВременныеСвойстваПоиска, СтруктураСвойств, КоличествоРеальныхСвойствДляПоиска, ИскатьЗапросом); + + Иначе + + ИскатьЗапросом = Истина; + + КонецЕсли; + + Если ИскатьЗапросом Тогда + + СсылкаНаОбъект = НайтиЭлементЗапросом(СтруктураСвойств, ВременныеСвойстваПоиска, ТипОбъекта, , КоличествоРеальныхСвойствДляПоиска); + + КонецЕсли; + + Возврат СсылкаНаОбъект; + +КонецФункции + +Процедура ОбработатьУстановкуСвойствПоискаУОбъекта(УстанавливатьУОбъектаВсеСвойстваПоиска, ТипОбъекта, СвойстваПоиска, + СвойстваПоискаНеЗамещать, СсылкаНаОбъект, СозданныйОбъект, ЗаписыватьНовыйОбъектВИнформационнуюБазу = Истина, ИзмененыРеквизитыОбъекта = Ложь) + + Если УстанавливатьУОбъектаВсеСвойстваПоиска <> Истина Тогда + Возврат; + КонецЕсли; + + Попытка + + Если СозданныйОбъект = Неопределено Тогда + СозданныйОбъект = СсылкаНаОбъект.ПолучитьОбъект(); + КонецЕсли; + + Исключение + Возврат; + КонецПопытки; + + ИзмененыРеквизитыОбъекта = УстановитьРеквизитыПоискаУОбъекта(СозданныйОбъект, СвойстваПоиска, СвойстваПоискаНеЗамещать); + + // если было то что изменено, тогда перезаписываем объект + Если ИзмененыРеквизитыОбъекта + И ЗаписыватьНовыйОбъектВИнформационнуюБазу Тогда + + ЗаписатьОбъектВИБ(СозданныйОбъект, ТипОбъекта); + + КонецЕсли; + +КонецПроцедуры + +Функция ОбработатьПоискОбъектаПоСтруктуре(НомерОбъекта, ТипОбъекта, СозданныйОбъект, + РежимПоискаОсновногоОбъекта, СвойстваОбъектаМодифицированы, ОбъектНайден, + ЭтоГлобальныйНомер, ПараметрыОбъекта = Неопределено) + + СтруктураДанных = мГлобальныйСтекНеЗаписанныхОбъектов[НомерОбъекта]; + + Если СтруктураДанных <> Неопределено Тогда + + СвойстваОбъектаМодифицированы = Истина; + СозданныйОбъект = СтруктураДанных.Объект; + + Если СтруктураДанных. Ссылка = Неопределено Тогда + + УстановитьСсылкуДляОбъекта(СтруктураДанных); + + КонецЕсли; + + СсылкаНаОбъект = СтруктураДанных.ИзвестнаяСсылка; + ПараметрыОбъекта = СтруктураДанных.ПараметрыОбъекта; + + ОбъектНайден = Ложь; + + Иначе + + СозданныйОбъект = Неопределено; + + Если ЭтоГлобальныйНомер Тогда + СсылкаНаОбъект = НайтиОбъектПоГлобальномуНомеру(НомерОбъекта, РежимПоискаОсновногоОбъекта); + Иначе + СсылкаНаОбъект = НайтиОбъектПоНомеру(НомерОбъекта, РежимПоискаОсновногоОбъекта); + КонецЕсли; + + КонецЕсли; + + + Если СсылкаНаОбъект <> Неопределено Тогда + + Если РежимПоискаОсновногоОбъекта Тогда + + СвойстваПоиска = ""; + СвойстваПоискаНеЗамещать = ""; + ПрочитатьИнформациюОСвойствахПоиска(ТипОбъекта, СвойстваПоиска, СвойстваПоискаНеЗамещать, , ПараметрыОбъекта); + + // для основного поиска нужно поля поиска еще раз проверить, возможно нужно их переустановить... + Если СозданныйОбъект = Неопределено Тогда + + СозданныйОбъект = СсылкаНаОбъект.ПолучитьОбъект(); + + КонецЕсли; + + СвойстваОбъектаМодифицированы = УстановитьРеквизитыПоискаУОбъекта(СозданныйОбъект, СвойстваПоиска, СвойстваПоискаНеЗамещать); + + Иначе + + одПропустить(ФайлОбмена); + + КонецЕсли; + + Возврат СсылкаНаОбъект; + + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +Процедура ПрочитатьИнформациюОСвойствахПоиска(ТипОбъекта, СвойстваПоиска, СвойстваПоискаНеЗамещать, + ПоискПоДатеНаРавенство = Ложь, ПараметрыОбъекта = Неопределено) + + Если СвойстваПоиска = "" Тогда + СвойстваПоиска = Новый Соответствие; + КонецЕсли; + + Если СвойстваПоискаНеЗамещать = "" Тогда + СвойстваПоискаНеЗамещать = Новый Соответствие; + КонецЕсли; + + ИнформацияОТипах = мСоответствиеТиповДанныхДляЗагрузки[ТипОбъекта]; + ПрочитатьСвойстваПоискаИзФайла(СвойстваПоиска, СвойстваПоискаНеЗамещать, ИнформацияОТипах, ПоискПоДатеНаРавенство, ПараметрыОбъекта); + +КонецПроцедуры + +// Производит поиск объекта в информационной базе, если не найден создает новый +// +// Параметры: +// ТипОбъекта - тип искомого объекта +// СвойстваПоиска - структура, содержащая свойства по которым производится поиск объекта +// ОбъектНайден - если Ложь, то объект не найден, а создан новый +// +// Возвращаемое значение: +// Новый или найденный объект информационной базы +// +Функция НайтиОбъектПоСсылке(ТипОбъекта, + СвойстваПоиска = "", + СвойстваПоискаНеЗамещать = "", + ОбъектНайден = Истина, + СозданныйОбъект = Неопределено, + НеСоздаватьОбъектЕслиНеНайден = Неопределено, + РежимПоискаОсновногоОбъекта = Ложь, + СвойстваОбъектаМодифицированы = Ложь, + НППГлобальнойСсылки = 0, + НппСсылки = 0, + ИзвестнаяСсылкаУникальногоИдентификатора = Неопределено, + ПараметрыОбъекта = Неопределено) + + + ПоискПоДатеНаРавенство = Ложь; + СсылкаНаОбъект = Неопределено; + СтруктураСвойств = Неопределено; + ИмяТипаОбъекта = Неопределено; + ЭтоОбъектДокумент = Ложь; + СсылкаНаОбъектФиктивная = Ложь; + + Если ЗапоминатьЗагруженныеОбъекты Тогда + + // есть номер по порядку из файла - по нему и ищем + НППГлобальнойСсылки = одАтрибут(ФайлОбмена, одТипЧисло, "ГНпп"); + + Если НППГлобальнойСсылки <> 0 Тогда + + СсылкаНаОбъект = ОбработатьПоискОбъектаПоСтруктуре(НППГлобальнойСсылки, ТипОбъекта, СозданныйОбъект, + РежимПоискаОсновногоОбъекта, СвойстваОбъектаМодифицированы, ОбъектНайден, Истина, ПараметрыОбъекта); + + Если СсылкаНаОбъект <> Неопределено Тогда + Возврат СсылкаНаОбъект; + КонецЕсли; + + КонецЕсли; + + // есть номер по порядку из файла - по нему и ищем + НппСсылки = одАтрибут(ФайлОбмена, одТипЧисло, "Нпп"); + + Если НппСсылки <> 0 Тогда + + СсылкаНаОбъект = ОбработатьПоискОбъектаПоСтруктуре(НппСсылки, ТипОбъекта, СозданныйОбъект, + РежимПоискаОсновногоОбъекта, СвойстваОбъектаМодифицированы, ОбъектНайден, Ложь, ПараметрыОбъекта); + + Если СсылкаНаОбъект <> Неопределено Тогда + Возврат СсылкаНаОбъект; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + НеСоздаватьОбъектЕслиНеНайден = одАтрибут(ФайлОбмена, одТипБулево, "НеСоздаватьЕслиНеНайден"); + ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD = НЕ РежимПоискаОсновногоОбъекта + И одАтрибут(ФайлОбмена, одТипБулево, "ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD"); + + // создаем свойства поиска объектов + ПрочитатьИнформациюОСвойствахПоиска(ТипОбъекта, СвойстваПоиска, СвойстваПоискаНеЗамещать, ПоискПоДатеНаРавенство, ПараметрыОбъекта); + + СозданныйОбъект = Неопределено; + + Если Не ОбъектНайден Тогда + + СсылкаНаОбъект = СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, СозданныйОбъект, , , , НппСсылки, НППГлобальнойСсылки); + ДобавитьСсылкуВСписокЗагруженныхОбъектов(НППГлобальнойСсылки, НппСсылки, СсылкаНаОбъект); + Возврат СсылкаНаОбъект; + + КонецЕсли; + + СтруктураСвойств = Менеджеры[ТипОбъекта]; + ИмяТипаОбъекта = СтруктураСвойств.ИмяТипа; + + СвойствоУникальныйИдентификатор = СвойстваПоиска["{УникальныйИдентификатор}"]; + СвойствоИмяПредопределенного = СвойстваПоиска["{ИмяПредопределенногоЭлемента}"]; + + ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD = ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD + И СвойствоУникальныйИдентификатор <> Неопределено; + + // если это предопределенный элемент ищем по имени + Если СвойствоИмяПредопределенного <> Неопределено Тогда + + АвтоматическиСоздаватьНовыйОбъект = НЕ НеСоздаватьОбъектЕслиНеНайден + И НЕ ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD; + + СсылкаНаОбъект = НайтиИлиСоздатьОбъектПоСвойству(СтруктураСвойств, ТипОбъекта, СвойстваПоиска, СвойстваПоискаНеЗамещать, + ИмяТипаОбъекта, "{ИмяПредопределенногоЭлемента}", СвойствоИмяПредопределенного, ОбъектНайден, + АвтоматическиСоздаватьНовыйОбъект, СозданныйОбъект, РежимПоискаОсновногоОбъекта, СвойстваОбъектаМодифицированы, , + НппСсылки, НППГлобальнойСсылки, ПараметрыОбъекта); + + ИначеЕсли (СвойствоУникальныйИдентификатор <> Неопределено) Тогда + + // не всегда нужно по уникальному идентификатору новый элемент создавать, возможно нужно продолжить поиск + НужноПродолжитьПоискЕслиЭлементПоGUIDНеНайден = ОпределитьПоТипуОбъектаИспользоватьДополнительныйПоискПоПолямПоиска(СтруктураСвойств.ТипСсылкиСтрокой); + + АвтоматическиСоздаватьНовыйОбъект = (НЕ НеСоздаватьОбъектЕслиНеНайден + И НЕ НужноПродолжитьПоискЕслиЭлементПоGUIDНеНайден) + И НЕ ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD; + + СсылкаНаОбъект = НайтиИлиСоздатьОбъектПоСвойству(СтруктураСвойств, ТипОбъекта, СвойстваПоиска, СвойстваПоискаНеЗамещать, + ИмяТипаОбъекта, "{УникальныйИдентификатор}", СвойствоУникальныйИдентификатор, ОбъектНайден, + АвтоматическиСоздаватьНовыйОбъект, СозданныйОбъект, + РежимПоискаОсновногоОбъекта, СвойстваОбъектаМодифицированы, ИзвестнаяСсылкаУникальногоИдентификатора, + НппСсылки, НППГлобальнойСсылки, ПараметрыОбъекта); + + Если Не НужноПродолжитьПоискЕслиЭлементПоGUIDНеНайден Тогда + + Если Не ЗначениеЗаполнено(СсылкаНаОбъект) + И ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СвойствоУникальныйИдентификатор)); + ОбъектНайден = Ложь; + СсылкаНаОбъектФиктивная = Истина; + + КонецЕсли; + + Если СсылкаНаОбъект <> Неопределено + И СсылкаНаОбъект.Пустая() Тогда + + СсылкаНаОбъект = Неопределено; + + КонецЕсли; + + Если СсылкаНаОбъект <> Неопределено + ИЛИ СозданныйОбъект <> Неопределено Тогда + + ДобавитьСсылкуВСписокЗагруженныхОбъектов(НППГлобальнойСсылки, НппСсылки, СсылкаНаОбъект, СсылкаНаОбъектФиктивная); + + КонецЕсли; + + Возврат СсылкаНаОбъект; + + КонецЕсли; + + КонецЕсли; + + Если СсылкаНаОбъект <> Неопределено + И СсылкаНаОбъект.Пустая() Тогда + + СсылкаНаОбъект = Неопределено; + + КонецЕсли; + + // СсылкаНаОбъект пока не найден + Если СсылкаНаОбъект <> Неопределено + ИЛИ СозданныйОбъект <> Неопределено Тогда + + ДобавитьСсылкуВСписокЗагруженныхОбъектов(НППГлобальнойСсылки, НппСсылки, СсылкаНаОбъект); + Возврат СсылкаНаОбъект; + + КонецЕсли; + + НомерВариантаПоиска = 1; + СтрокаИменСвойствПоиска = ""; + ПредыдущаяСтрокаПоиска = Неопределено; + ПрекратитьПоиск = Ложь; + УстанавливатьУОбъектаВсеСвойстваПоиска = Истина; + + // событие для определения очередного варианта поиска + // если есть событие вызываем его и определяем очередной вариант поиска + + АлгоритмПоиска = ОпределитьПоТипуОбъектаАлгоритмПоследовательностиПолейПоиска(СтруктураСвойств.ТипСсылкиСтрокой); + + ЕстьАлгоритмПоиска = Не ПустаяСтрока(АлгоритмПоиска); + + Пока НомерВариантаПоиска <= 10 + И ЕстьАлгоритмПоиска Цикл + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ОпределитьПоТипуОбъектаПриемникаПравилоКонвертации(СтруктураСвойств.ТипСсылкиСтрокой), + "ПоследовательностьПолейПоиска")); + + Иначе + + Выполнить(АлгоритмПоиска); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(73, ОписаниеОшибки(), "", "", + ТипОбъекта, Неопределено, "Последовательность полей поиска"); + + КонецПопытки; + + НеНужноВыполнятьПоиск = ПрекратитьПоиск = Истина + ИЛИ СтрокаИменСвойствПоиска = ПредыдущаяСтрокаПоиска + ИЛИ ЗначениеЗаполнено(СсылкаНаОбъект); + + Если НЕ НеНужноВыполнятьПоиск Тогда + + // сам поиск непосредственно + СсылкаНаОбъект = НайтиЭлементПоСвойствамПоиска(ТипОбъекта, ИмяТипаОбъекта, СвойстваПоиска, СтруктураСвойств, + СтрокаИменСвойствПоиска, ПоискПоДатеНаРавенство); + + НеНужноВыполнятьПоиск = ЗначениеЗаполнено(СсылкаНаОбъект); + + КонецЕсли; + + Если НеНужноВыполнятьПоиск Тогда + + Если РежимПоискаОсновногоОбъекта Тогда + + ОбработатьУстановкуСвойствПоискаУОбъекта(УстанавливатьУОбъектаВсеСвойстваПоиска, ТипОбъекта, СвойстваПоиска, + СвойстваПоискаНеЗамещать, СсылкаНаОбъект, СозданныйОбъект, НЕ РежимПоискаОсновногоОбъекта, СвойстваОбъектаМодифицированы); + + КонецЕсли; + + Прервать; + + КонецЕсли; + + НомерВариантаПоиска = НомерВариантаПоиска + 1; + ПредыдущаяСтрокаПоиска = СтрокаИменСвойствПоиска; + + КонецЦикла; + + Если Не ЕстьАлгоритмПоиска Тогда + + // сам поиск непосредственно и без алгоритма поиска + СсылкаНаОбъект = НайтиЭлементПоСвойствамПоиска(ТипОбъекта, ИмяТипаОбъекта, СвойстваПоиска, СтруктураСвойств, + СтрокаИменСвойствПоиска, ПоискПоДатеНаРавенство); + + КонецЕсли; + + Если РежимПоискаОсновногоОбъекта + И ЗначениеЗаполнено(СсылкаНаОбъект) + И (ИмяТипаОбъекта = "Документ" + ИЛИ ИмяТипаОбъекта = "Задача" + ИЛИ ИмяТипаОбъекта = "БизнесПроцесс") Тогда + + // если у документа дата есть в свойствах поиска - то устанавливаем ее + ДатаПустая = Не ЗначениеЗаполнено(СвойстваПоиска["Дата"]); + МожноЗамещать = (Не ДатаПустая) + И (СвойстваПоискаНеЗамещать["Дата"] = Неопределено); + + Если МожноЗамещать Тогда + + Если СозданныйОбъект = Неопределено Тогда + СозданныйОбъект = СсылкаНаОбъект.ПолучитьОбъект(); + КонецЕсли; + + СозданныйОбъект.Дата = СвойстваПоиска["Дата"]; + + КонецЕсли; + + КонецЕсли; + + // создавать новый объект нужно не всегда + Если Не ЗначениеЗаполнено(СсылкаНаОбъект) + И СозданныйОбъект = Неопределено Тогда + + Если ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD Тогда + + СсылкаНаОбъект = СтруктураСвойств.Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СвойствоУникальныйИдентификатор)); + СсылкаНаОбъектФиктивная = Истина; + + ИначеЕсли НЕ НеСоздаватьОбъектЕслиНеНайден Тогда + + СсылкаНаОбъект = СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, СозданныйОбъект, НЕ РежимПоискаОсновногоОбъекта, , ИзвестнаяСсылкаУникальногоИдентификатора, НппСсылки, + НППГлобальнойСсылки, ,УстанавливатьУОбъектаВсеСвойстваПоиска); + + СвойстваОбъектаМодифицированы = Истина; + + КонецЕсли; + + ОбъектНайден = Ложь; + + КонецЕсли; + + Если СсылкаНаОбъект <> Неопределено + И СсылкаНаОбъект.Пустая() Тогда + + СсылкаНаОбъект = Неопределено; + + КонецЕсли; + + ДобавитьСсылкуВСписокЗагруженныхОбъектов(НППГлобальнойСсылки, НппСсылки, СсылкаНаОбъект, СсылкаНаОбъектФиктивная); + + Возврат СсылкаНаОбъект; + +КонецФункции // НайтиОбъектПоСсылке() + +// Устанавливает свойства объекта (записи) +// +// Параметры: +// Запись - объект, свойства которого устанавливаем +// Например, строка табличной части или запись регистра +// +Процедура УстановитьСвойстваЗаписи(Запись, ИнформацияОТипах, + ПараметрыОбъекта, ИмяВетки, НомерЗаписи, + ДанныеПоискаПоТЧ = Неопределено, КопияТЧДляПоиска = Неопределено) + + НужноОрганизоватьПоискПоТЧ = (ДанныеПоискаПоТЧ <> Неопределено) + И (КопияТЧДляПоиска <> Неопределено) + И КопияТЧДляПоиска.Количество() <> 0; + + Если НужноОрганизоватьПоискПоТЧ Тогда + + СтруктураЧтенияСвойств = Новый Структура(); + СтруктураЧтенияСубконто = Новый Структура(); + + КонецЕсли; + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Свойство" + ИЛИ ИмяУзла = "ЗначениеПараметра" Тогда + + ЭтоПараметр = (ИмяУзла = "ЗначениеПараметра"); + + Имя = одАтрибут(ФайлОбмена, одТипСтрока, "Имя"); + + Если Имя = "ВидДвижения" И Найти(Метаданные.НайтиПоТипу(ТипЗнч(Запись)).ПолноеИмя(), "РегистрНакопления") Тогда + + ТипСвойства = одТипВидДвиженияНакопления; + + Иначе + + ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + + КонецЕсли; + + ЗначениеСвойства = ПрочитатьСвойство(ТипСвойства); + + Если ЭтоПараметр Тогда + ДобавитьСложныйПараметрПриНеобходимости(ПараметрыОбъекта, ИмяВетки, НомерЗаписи, Имя, ЗначениеСвойства); + ИначеЕсли НужноОрганизоватьПоискПоТЧ Тогда + СтруктураЧтенияСвойств.Вставить(Имя, ЗначениеСвойства); + Иначе + Запись[Имя] = ЗначениеСвойства; + КонецЕсли; + + ИначеЕсли ИмяУзла = "СубконтоДт" ИЛИ ИмяУзла = "СубконтоКт" Тогда + + // поиск по субконто не реализован + + Ключ = Неопределено; + Значение = Неопределено; + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Свойство" Тогда + + Имя = одАтрибут(ФайлОбмена, одТипСтрока, "Имя"); + ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + + Если Имя = "Ключ" Тогда + + Ключ = ПрочитатьСвойство(ТипСвойства); + + ИначеЕсли Имя = "Значение" Тогда + + Значение = ПрочитатьСвойство(ТипСвойства); + + КонецЕсли; + + ИначеЕсли (ИмяУзла = "СубконтоДт" ИЛИ ИмяУзла = "СубконтоКт") И (ФайлОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Прервать; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + + Если Ключ <> Неопределено + И Значение <> Неопределено Тогда + + Если НЕ НужноОрганизоватьПоискПоТЧ Тогда + + Запись[ИмяУзла][Ключ] = Значение; + + Иначе + + СоответствиеЗаписи = Неопределено; + Если НЕ СтруктураЧтенияСубконто.Свойство(ИмяУзла, СоответствиеЗаписи) Тогда + СоответствиеЗаписи = Новый Соответствие; + СтруктураЧтенияСубконто.Вставить(ИмяУзла, СоответствиеЗаписи); + КонецЕсли; + + СоответствиеЗаписи.Вставить(Ключ, Значение); + + КонецЕсли; + + КонецЕсли; + + ИначеЕсли (ИмяУзла = "Запись") И (ФайлОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Прервать; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + + Если НужноОрганизоватьПоискПоТЧ Тогда + + СтруктураПоиска = Новый Структура(); + + Для Каждого ЭлементПоиска Из ДанныеПоискаПоТЧ.ПоляПоискаТЧ Цикл + + ЗначениеЭлемента = Неопределено; + СтруктураЧтенияСвойств.Свойство(ЭлементПоиска, ЗначениеЭлемента); + + СтруктураПоиска.Вставить(ЭлементПоиска, ЗначениеЭлемента); + + КонецЦикла; + + МассивРезультатовПоиска = КопияТЧДляПоиска.НайтиСтроки(СтруктураПоиска); + + НайденаЗапись = МассивРезультатовПоиска.Количество() > 0; + Если НайденаЗапись Тогда + ЗаполнитьЗначенияСвойств(Запись, МассивРезультатовПоиска[0]); + КонецЕсли; + + // поверх заполнение свойствами и значением субконто + Для Каждого Эл Из СтруктураЧтенияСвойств Цикл + + Запись[Эл.Ключ] = Эл.Значение; + + КонецЦикла; + + Для Каждого ЭлИмя Из СтруктураЧтенияСубконто Цикл + + Для Каждого ЭлКлюч Из ЭлИмя.Значение Цикл + + Запись[ЭлИмя.Ключ][ЭлКлюч.Ключ] = ЭлКлюч.Значение; + + КонецЦикла; + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры // УстановитьСвойстваЗаписи() + +// Загружает табличную часть объекта +// +// Параметры: +// Объект - объект, табличную часть которого загружаем +// Имя - имя табличной части +// Очистить - если Истина, то табличная часть предварительно очищается +// +Процедура ЗагрузитьТабличнуюЧасть(Объект, Имя, Очистить, ОбщаяИнформацияОТипеДокумента, НужноЗаписатьОбъект, + ПараметрыОбъекта, Правило) + + ИмяТабличнойЧасти = Имя + "ТабличнаяЧасть"; + Если ОбщаяИнформацияОТипеДокумента <> Неопределено Тогда + ИнформацияОТипах = ОбщаяИнформацияОТипеДокумента[ИмяТабличнойЧасти]; + Иначе + ИнформацияОТипах = Неопределено; + КонецЕсли; + + ДанныеПоискаПоТЧ = Неопределено; + Если Правило <> Неопределено Тогда + ДанныеПоискаПоТЧ = Правило.ПоискПоТабличнымЧастям.Найти("ТабличнаяЧасть." + Имя, "ИмяЭлемента"); + КонецЕсли; + + КопияТЧДляПоиска = Неопределено; + + ТЧ = Объект[Имя]; + + Если Очистить + И ТЧ.Количество() <> 0 Тогда + + НужноЗаписатьОбъект = Истина; + + Попытка + + Если ДанныеПоискаПоТЧ <> Неопределено Тогда + КопияТЧДляПоиска = ТЧ.Выгрузить(); + КонецЕсли; + + ТЧ.Очистить(); + + Исключение + + КонецПопытки; + + ИначеЕсли ДанныеПоискаПоТЧ <> Неопределено Тогда + + КопияТЧДляПоиска = ТЧ.Выгрузить(); + + КонецЕсли; + + НомерЗаписи = 0; + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Запись" Тогда + Попытка + + НужноЗаписатьОбъект = Истина; + Запись = ТЧ.Добавить(); + + Исключение + Запись = Неопределено; + КонецПопытки; + + Если Запись = Неопределено Тогда + одПропустить(ФайлОбмена); + Иначе + УстановитьСвойстваЗаписи(Запись, ИнформацияОТипах, ПараметрыОбъекта, ИмяТабличнойЧасти, НомерЗаписи, ДанныеПоискаПоТЧ, КопияТЧДляПоиска); + КонецЕсли; + + НомерЗаписи = НомерЗаписи + 1; + + ИначеЕсли (ИмяУзла = "ТабличнаяЧасть") И (ФайлОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Прервать; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Загружает движения объекта +// +// Параметры: +// Объект - объект, движения которого загружаем +// Имя - имя регистра +// Очистить - если Истина, то движения предварительно очищается +// +Процедура ЗагрузитьДвижения(Объект, Имя, Очистить, ОбщаяИнформацияОТипеДокумента, НужноЗаписатьОбъект, + ПараметрыОбъекта, Правило) + + ИмяДвижений = Имя + "НаборЗаписей"; + Если ОбщаяИнформацияОТипеДокумента <> Неопределено Тогда + ИнформацияОТипах = ОбщаяИнформацияОТипеДокумента[ИмяДвижений]; + Иначе + ИнформацияОТипах = Неопределено; + КонецЕсли; + + ДанныеПоискаПоТЧ = Неопределено; + Если Правило <> Неопределено Тогда + ДанныеПоискаПоТЧ = Правило.ПоискПоТабличнымЧастям.Найти("НаборЗаписей." + Имя, "ИмяЭлемента"); + КонецЕсли; + + КопияТЧДляПоиска = Неопределено; + + Движения = Объект.Движения[Имя]; + + Движения.Прочитать(); + + Если Очистить + И Движения.Количество() <> 0 Тогда + + НужноЗаписатьОбъект = Истина; + + Если ДанныеПоискаПоТЧ <> Неопределено Тогда + КопияТЧДляПоиска = Движения.Выгрузить(); + КонецЕсли; + + Движения.Очистить(); + + ИначеЕсли ДанныеПоискаПоТЧ <> Неопределено Тогда + + КопияТЧДляПоиска = Движения.Выгрузить(); + + КонецЕсли; + + НомерЗаписи = 0; + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Запись" Тогда + + Запись = Движения.Добавить(); + НужноЗаписатьОбъект = Истина; + УстановитьСвойстваЗаписи(Запись, ИнформацияОТипах, ПараметрыОбъекта, ИмяДвижений, НомерЗаписи, ДанныеПоискаПоТЧ, КопияТЧДляПоиска); + + НомерЗаписи = НомерЗаписи + 1; + + ИначеЕсли (ИмяУзла = "НаборЗаписей") И (ФайлОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Прервать; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Загружает объект типа ОписаниеТипов из указанного xml-источника +// +// Параметры: +// Источник - xml-источник +// +Функция ЗагрузитьТипыОбъекта(Источник) + + // КвалификаторыДаты + + СоставДаты = одАтрибут(Источник, одТипСтрока, "СоставДаты"); + + + // КвалификаторыСтроки + + Длина = одАтрибут(Источник, одТипЧисло, "Длина"); + ДлинаДопустимая = одАтрибут(Источник, одТипСтрока, "ДопустимаяДлина"); + + + // КвалификаторыЧисла + + Разрядность = одАтрибут(Источник, одТипЧисло, "Разрядность"); + РазрядностьДробнойЧасти = одАтрибут(Источник, одТипЧисло, "РазрядностьДробнойЧасти"); + ЗнакДопустимый = одАтрибут(Источник, одТипСтрока, "ДопустимыйЗнак"); + + + // Читаем массив типов + + МассивТипов = Новый Массив; + + Пока Источник.Прочитать() Цикл + ИмяУзла = Источник.ЛокальноеИмя; + + Если ИмяУзла = "Тип" Тогда + МассивТипов.Добавить(Тип(одЗначениеЭлемента(Источник, одТипСтрока))); + ИначеЕсли (ИмяУзла = "Типы") И ( Источник.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + Прервать; + Иначе + ЗаписатьВПротоколВыполнения(9); + Прервать; + КонецЕсли; + + КонецЦикла; + + + + Если МассивТипов.Количество() > 0 Тогда + + // КвалификаторыДаты + + Если СоставДаты = "Дата" Тогда + КвалификаторыДаты = Новый КвалификаторыДаты(ЧастиДаты.Дата); + ИначеЕсли СоставДаты = "ДатаВремя" Тогда + КвалификаторыДаты = Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя); + ИначеЕсли СоставДаты = "Время" Тогда + КвалификаторыДаты = Новый КвалификаторыДаты(ЧастиДаты.Время); + Иначе + КвалификаторыДаты = Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя); + КонецЕсли; + + + // КвалификаторыЧисла + + Если Разрядность > 0 Тогда + Если ЗнакДопустимый = "Неотрицательный" Тогда + Знак = ДопустимыйЗнак.Неотрицательный; + Иначе + Знак = ДопустимыйЗнак.Любой; + КонецЕсли; + КвалификаторыЧисла = Новый КвалификаторыЧисла(Разрядность, РазрядностьДробнойЧасти, Знак); + Иначе + КвалификаторыЧисла = Новый КвалификаторыЧисла(); + КонецЕсли; + + + // КвалификаторыСтроки + + Если Длина > 0 Тогда + Если ДлинаДопустимая = "Фиксированная" Тогда + ДлинаДопустимая = ДопустимаяДлина.Фиксированная; + Иначе + ДлинаДопустимая = ДопустимаяДлина.Переменная; + КонецЕсли; + КвалификаторыСтроки = Новый КвалификаторыСтроки(Длина, ДлинаДопустимая); + Иначе + КвалификаторыСтроки = Новый КвалификаторыСтроки(); + КонецЕсли; + + Возврат Новый ОписаниеТипов(МассивТипов, КвалификаторыЧисла, КвалификаторыСтроки, КвалификаторыДаты); + КонецЕсли; + + Возврат Неопределено; + +КонецФункции // ЗагрузитьТипыОбъекта() + +Процедура УстановитьПометкуУдаленияУОбъекта(Объект, ПометкаУдаления, ИмяТипаОбъекта) + + Если (ПометкаУдаления = Неопределено) + И (Объект.ПометкаУдаления <> Истина) Тогда + + Возврат; + + КонецЕсли; + + ПометкаДляУстановки = ?(ПометкаУдаления <> Неопределено, ПометкаУдаления, Ложь); + + УстановитьОбменДаннымиЗагрузка(Объект); + + // дли иерархических объектов пометку удаления только у конкретного объекта ставим + Если ИмяТипаОбъекта = "Справочник" + ИЛИ ИмяТипаОбъекта = "ПланВидовХарактеристик" + ИЛИ ИмяТипаОбъекта = "ПланСчетов" Тогда + + Объект.УстановитьПометкуУдаления(ПометкаДляУстановки, Ложь); + + Иначе + + Объект.УстановитьПометкуУдаления(ПометкаДляУстановки); + + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаписатьДокументВБезопасномРежиме(Документ, ТипОбъекта) + + Если Документ.Проведен Тогда + + Документ.Проведен = Ложь; + + КонецЕсли; + + ЗаписатьОбъектВИБ(Документ, ТипОбъекта); + +КонецПроцедуры + +Функция ПолучитьОбъектПоСсылкеИДопИнформации(СозданныйОбъект, Ссылка) + + // если объект создали, то работаем с ним, если нашли - получаем объект + Если СозданныйОбъект <> Неопределено Тогда + Объект = СозданныйОбъект; + Иначе + Если Ссылка.Пустая() Тогда + Объект = Неопределено; + Иначе + Объект = Ссылка.ПолучитьОбъект(); + КонецЕсли; + КонецЕсли; + + Возврат Объект; + +КонецФункции + +Процедура КомментарииКЗагрузкеОбъекта(Нпп, ИмяПравила, Источник, ТипОбъекта, ГНпп = 0) + + Если ФлагКомментироватьОбработкуОбъектов Тогда + + Если Нпп <> 0 Тогда + СтрокаСообщения = "Загрузка объекта № " + Нпп; + Иначе + СтрокаСообщения = "Загрузка объекта № " + ГНпп; + КонецЕсли; + + ЗП = ПолучитьСтруктуруЗаписиПротокола(); + + Если Не ПустаяСтрока(ИмяПравила) Тогда + + ЗП.ИмяПКО = ИмяПравила; + + КонецЕсли; + + Если Не ПустаяСтрока(Источник) Тогда + + ЗП.Источник = Источник; + + КонецЕсли; + + ЗП.ТипОбъекта = ТипОбъекта; + ЗаписатьВПротоколВыполнения(СтрокаСообщения, ЗП, Ложь); + + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьПараметрПриНеобходимости(ПараметрыДанных, ИмяПараметра, ЗначениеПараметра) + + Если ПараметрыДанных = Неопределено Тогда + ПараметрыДанных = Новый Соответствие; + КонецЕсли; + + ПараметрыДанных.Вставить(ИмяПараметра, ЗначениеПараметра); + +КонецПроцедуры + +Процедура ДобавитьСложныйПараметрПриНеобходимости(ПараметрыДанных, ИмяВеткиПараметров, НомерСтроки, ИмяПараметра, ЗначениеПараметра) + + Если ПараметрыДанных = Неопределено Тогда + ПараметрыДанных = Новый Соответствие; + КонецЕсли; + + ТекущиеДанныеПараметра = ПараметрыДанных[ИмяВеткиПараметров]; + + Если ТекущиеДанныеПараметра = Неопределено Тогда + + ТекущиеДанныеПараметра = Новый ТаблицаЗначений; + ТекущиеДанныеПараметра.Колонки.Добавить("НомерСтроки"); + ТекущиеДанныеПараметра.Колонки.Добавить("ИмяПараметра"); + ТекущиеДанныеПараметра.Индексы.Добавить("НомерСтроки"); + + ПараметрыДанных.Вставить(ИмяВеткиПараметров, ТекущиеДанныеПараметра); + + КонецЕсли; + + Если ТекущиеДанныеПараметра.Колонки.Найти(ИмяПараметра) = Неопределено Тогда + ТекущиеДанныеПараметра.Колонки.Добавить(ИмяПараметра); + КонецЕсли; + + ДанныеСтроки = ТекущиеДанныеПараметра.Найти(НомерСтроки, "НомерСтроки"); + Если ДанныеСтроки = Неопределено Тогда + ДанныеСтроки = ТекущиеДанныеПараметра.Добавить(); + ДанныеСтроки.НомерСтроки = НомерСтроки; + КонецЕсли; + + ДанныеСтроки[ИмяПараметра] = ЗначениеПараметра; + +КонецПроцедуры + +Процедура УстановитьСсылкуДляОбъекта(СтрокаСтекаНезаписанныхОбъектов) + + // объект еще не записан, а на него ссылаются + ОбъектДляЗаписи = СтрокаСтекаНезаписанныхОбъектов.Объект; + + СвойстваМД = Менеджеры[СтрокаСтекаНезаписанныхОбъектов.ТипОбъекта]; + Менеджер = СвойстваМД.Менеджер; + + НовыйУникальныйИдентификатор = Новый УникальныйИдентификатор; + НоваяСсылка = Менеджер.ПолучитьСсылку(НовыйУникальныйИдентификатор); + + ОбъектДляЗаписи.УстановитьСсылкуНового(НоваяСсылка); + СтрокаСтекаНезаписанныхОбъектов.ИзвестнаяСсылка = НоваяСсылка; + +КонецПроцедуры + +Процедура ДополнитьСтекНеЗаписанныхОбъектов(Нпп, ГНпп, Объект, ИзвестнаяСсылка, ТипОбъекта, ПараметрыОбъекта) + + НомерДляСтека = ?(Нпп = 0, Гнпп, Нпп); + + СтрокаСтека = мГлобальныйСтекНеЗаписанныхОбъектов[НомерДляСтека]; + Если СтрокаСтека <> Неопределено Тогда + Возврат; + КонецЕсли; + + мГлобальныйСтекНеЗаписанныхОбъектов.Вставить(НомерДляСтека, Новый Структура("Объект, ИзвестнаяСсылка, ТипОбъекта, ПараметрыОбъекта", Объект, ИзвестнаяСсылка, ТипОбъекта, ПараметрыОбъекта)); + +КонецПроцедуры + +Процедура УдалитьИзСтекаНеЗаписанныхОбъектов(Нпп, ГНпп) + + НомерДляСтека = ?(Нпп = 0, Гнпп, Нпп); + мГлобальныйСтекНеЗаписанныхОбъектов.Удалить(НомерДляСтека); + +КонецПроцедуры + +Процедура ПровестиЗаписьНеЗаписанныхОбъектов() + + Для Каждого СтрокаДанных Из мГлобальныйСтекНеЗаписанныхОбъектов Цикл + + // отложенная запись объектов + Объект = СтрокаДанных.Значение.Объект; + НппСсылки = СтрокаДанных.Ключ; + + ЗаписатьОбъектВИБ(Объект, СтрокаДанных.Значение.ТипОбъекта); + + ДобавитьСсылкуВСписокЗагруженныхОбъектов(0, НппСсылки, Объект.Ссылка); + + КонецЦикла; + + мГлобальныйСтекНеЗаписанныхОбъектов.Очистить(); + +КонецПроцедуры + +Процедура ПровестиГенерациюКодаНомераПриНеобходимости(ГенерироватьНовыйНомерИлиКодЕслиНеУказан, Объект, ИмяТипаОбъекта, НужноЗаписатьОбъект, + РежимОбменДанными) + + Если Не ГенерироватьНовыйНомерИлиКодЕслиНеУказан + ИЛИ НЕ РежимОбменДанными Тогда + + // если номер не нужно генерировать, или не в режиме обмена данными то ничего не нужно делать... платформа сама все сгенерирует + Возврат; + КонецЕсли; + + // по типу документа смотрим заполнен кол или номер + Если ИмяТипаОбъекта = "Документ" + ИЛИ ИмяТипаОбъекта = "БизнесПроцесс" + ИЛИ ИмяТипаОбъекта = "Задача" Тогда + + Если НЕ ЗначениеЗаполнено(Объект.Номер) Тогда + + Объект.УстановитьНовыйНомер(); + НужноЗаписатьОбъект = Истина; + + КонецЕсли; + + ИначеЕсли ИмяТипаОбъекта = "Справочник" + ИЛИ ИмяТипаОбъекта = "ПланВидовХарактеристик" + ИЛИ ИмяТипаОбъекта = "ПланОбмена" Тогда + + Если НЕ ЗначениеЗаполнено(Объект.Код) Тогда + + Объект.УстановитьНовыйКод(); + НужноЗаписатьОбъект = Истина; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Читает очередной объект из файла обмена, производит загрузку +// +// Параметры: +// Нет. +// +Функция ПрочитатьОбъект() + + Нпп = одАтрибут(ФайлОбмена, одТипЧисло, "Нпп"); + ГНпп = одАтрибут(ФайлОбмена, одТипЧисло, "ГНпп"); + Источник = одАтрибут(ФайлОбмена, одТипСтрока, "Источник"); + ИмяПравила = одАтрибут(ФайлОбмена, одТипСтрока, "ИмяПравила"); + НеЗамещатьОбъект = одАтрибут(ФайлОбмена, одТипБулево, "НеЗамещать"); + ПрефиксАвтонумерации = одАтрибут(ФайлОбмена, одТипСтрока, "ПрефиксАвтонумерации"); + ТипОбъектаСтрокой = одАтрибут(ФайлОбмена, одТипСтрока, "Тип"); + ТипОбъекта = Тип(ТипОбъектаСтрокой); + ИнформацияОТипах = мСоответствиеТиповДанныхДляЗагрузки[ТипОбъекта]; + + КомментарииКЗагрузкеОбъекта(Нпп, ИмяПравила, Источник, ТипОбъекта, ГНпп); + + СтруктураСвойств = Менеджеры[ТипОбъекта]; + ИмяТипаОбъекта = СтруктураСвойств.ИмяТипа; + + Если ИмяТипаОбъекта = "Документ" Тогда + + РежимЗаписи = одАтрибут(ФайлОбмена, одТипСтрока, "РежимЗаписи"); + РежимПроведения = одАтрибут(ФайлОбмена, одТипСтрока, "РежимПроведения"); + + КонецЕсли; + + Ссылка = Неопределено; + Объект = Неопределено; + ОбъектНайден = Истина; + ПометкаУдаления = Неопределено; + + СвойстваПоиска = Новый Соответствие; + СвойстваПоискаНеЗамещать = Новый Соответствие; + + НужноЗаписатьОбъект = НЕ ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты; + + + + Если Не ПустаяСтрока(ИмяПравила) Тогда + + Правило = Правила[ИмяПравила]; + ЕстьОбработчикПередЗагрузкой = Правило.ЕстьОбработчикПередЗагрузкой; + ЕстьОбработчикПриЗагрузке = Правило.ЕстьОбработчикПриЗагрузке; + ЕстьОбработчикПослеЗагрузки = Правило.ЕстьОбработчикПослеЗагрузки; + ГенерироватьНовыйНомерИлиКодЕслиНеУказан = Правило.ГенерироватьНовыйНомерИлиКодЕслиНеУказан; + + Иначе + + ЕстьОбработчикПередЗагрузкой = Ложь; + ЕстьОбработчикПриЗагрузке = Ложь; + ЕстьОбработчикПослеЗагрузки = Ложь; + ГенерироватьНовыйНомерИлиКодЕслиНеУказан = Ложь; + + КонецЕсли; + + + // Глобальный обработчик события ПередЗагрузкойОбъекта + Если ЕстьГлобальныйОбработчикПередЗагрузкойОбъекта Тогда + + Отказ = Ложь; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Конвертация, "ПередЗагрузкойОбъекта")); + + Иначе + + Выполнить(Конвертация.ПередЗагрузкойОбъекта); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(53, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Неопределено, "ПередЗагрузкойОбъекта (глобальный)"); + + КонецПопытки; + + Если Отказ Тогда // Отказ от загрузки объекта + + одПропустить(ФайлОбмена, "Объект"); + Возврат Неопределено; + + КонецЕсли; + + КонецЕсли; + + + // Обработчик события ПередЗагрузкойОбъекта + Если ЕстьОбработчикПередЗагрузкой Тогда + + Отказ = Ложь; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Правило, "ПередЗагрузкой")); + + Иначе + + Выполнить(Правило.ПередЗагрузкой); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(19, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Неопределено, "ПередЗагрузкойОбъекта"); + + КонецПопытки; + + Если Отказ Тогда // Отказ от загрузки объекта + + одПропустить(ФайлОбмена, "Объект"); + Возврат Неопределено; + + КонецЕсли; + + КонецЕсли; + + СвойстваОбъектаМодифицированы = Ложь; + НаборЗаписей = Неопределено; + НППГлобальнойСсылки = 0; + НппСсылки = 0; + ПараметрыОбъекта = Неопределено; + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "Свойство" + ИЛИ ИмяУзла = "ЗначениеПараметра" Тогда + + ЭтоПараметрДляОбъекта = (ИмяУзла = "ЗначениеПараметра"); + + Если НЕ ЭтоПараметрДляОбъекта + И Объект = Неопределено Тогда + + // объект не нашли и не создали - попробуем сейчас это сделать + ОбъектНайден = Ложь; + + // Обработчик события ПриЗагрузкеОбъекта + Если ЕстьОбработчикПриЗагрузке Тогда + + // если есть обработчик при загрузке, то объект нужно перезаписывать, так как могут быть изменения + НужноБылоЗаписатьОбъект = НужноЗаписатьОбъект; + ОбъектМодифицирован = Истина; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Правило, "ПриЗагрузке")); + + Иначе + + Выполнить(Правило.ПриЗагрузке); + + КонецЕсли; + НужноЗаписатьОбъект = ОбъектМодифицирован ИЛИ НужноБылоЗаписатьОбъект; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Объект, "ПриЗагрузкеОбъекта"); + + КонецПопытки; + + КонецЕсли; + + // так м не смогли создать объект в событии - создаем его отдельно + Если Объект = Неопределено Тогда + + НужноЗаписатьОбъект = Истина; + + Если ИмяТипаОбъекта = "Константы" Тогда + + Объект = Константы.СоздатьНабор(); + Объект.Прочитать(); + + Иначе + + СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, Объект, Ложь, НаборЗаписей, , НппСсылки, НППГлобальнойСсылки, ПараметрыОбъекта); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Имя = одАтрибут(ФайлОбмена, одТипСтрока, "Имя"); + НеЗамещатьСвойство = одАтрибут(ФайлОбмена, одТипБулево, "НеЗамещать"); + + + Если НЕ ЭтоПараметрДляОбъекта + И ((ОбъектНайден И НеЗамещатьСвойство) + ИЛИ (Имя = "ЭтоГруппа") + ИЛИ (Объект[Имя] = NULL)) Тогда + + // неизвестное свойство + одПропустить(ФайлОбмена, ИмяУзла); + Продолжить; + + КонецЕсли; + + + // читаем и устанавливаем значение свойства + ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(ИнформацияОТипах, Имя); + Значение = ПрочитатьСвойство(ТипСвойства); + + Если ЭтоПараметрДляОбъекта Тогда + + // дополняем коллекцию параметров объекта + ДобавитьПараметрПриНеобходимости(ПараметрыОбъекта, Имя, Значение); + + Иначе + + Если Имя = "ПометкаУдаления" Тогда + + ПометкаУдаления = Значение; + + Если Объект.ПометкаУдаления <> ПометкаУдаления Тогда + Объект.ПометкаУдаления = ПометкаУдаления; + НужноЗаписатьОбъект = Истина; + КонецЕсли; + + Иначе + + Попытка + + Если Не НужноЗаписатьОбъект Тогда + + НужноЗаписатьОбъект = (Объект[Имя] <> Значение); + + Конецесли; + + Объект[Имя] = Значение; + + Исключение + + ЗП = ПолучитьСтруктуруЗаписиПротокола(26, ОписаниеОшибки()); + ЗП.ИмяПКО = ИмяПравила; + ЗП.Нпп = Нпп; + ЗП.ГНпп = ГНпп; + ЗП.Источник = Источник; + ЗП.Объект = Объект; + ЗП.ТипОбъекта = ТипОбъекта; + ЗП.Свойство = Имя; + ЗП.Значение = Значение; + ЗП.ТипЗначения = ТипЗнч(Значение); + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(26, ЗП, Истина); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + + КонецЕсли; + + КонецЕсли; + + ИначеЕсли ИмяУзла = "Ссылка" Тогда + + // ссылка на элемент - сначала получаем по ссылке объект, а потом устанавливаем свойства + СозданныйОбъект = Неопределено; + НеСоздаватьОбъектЕслиНеНайден = Неопределено; + ИзвестнаяСсылкаУникальногоИдентификатора = Неопределено; + + Ссылка = НайтиОбъектПоСсылке(ТипОбъекта, СвойстваПоиска, СвойстваПоискаНеЗамещать, ОбъектНайден, + СозданныйОбъект, НеСоздаватьОбъектЕслиНеНайден, Истина, СвойстваОбъектаМодифицированы, НППГлобальнойСсылки, + НппСсылки, ИзвестнаяСсылкаУникальногоИдентификатора, ПараметрыОбъекта); + + НужноЗаписатьОбъект = НужноЗаписатьОбъект ИЛИ СвойстваОбъектаМодифицированы; + + Если Ссылка = Неопределено + И НеСоздаватьОбъектЕслиНеНайден = Истина Тогда + + одПропустить(ФайлОбмена, "Объект"); + Прервать; + + ИначеЕсли ИмяТипаОбъекта = "Перечисление" Тогда + + Объект = Ссылка; + + Иначе + + Объект = ПолучитьОбъектПоСсылкеИДопИнформации(СозданныйОбъект, Ссылка); + + Если ОбъектНайден Тогда + + Если Объект.ПометкаУдаления Тогда // Объект создан по ссылке + + // пометку удаления у объекта ставим, если он загружен по ссылке + ПометкаУдаления = Ложь; + + ИначеЕсли НеЗамещатьОбъект И (Не ЕстьОбработчикПриЗагрузке) Тогда + + // если не нужно замещать существующий объект - выходим из обработки + одПропустить(ФайлОбмена, "Объект"); + Прервать; + + КонецЕсли; + + КонецЕсли; + + Если Ссылка = Неопределено Тогда + + ДополнитьСтекНеЗаписанныхОбъектов(Нпп, ГНпп, СозданныйОбъект, ИзвестнаяСсылкаУникальногоИдентификатора, ТипОбъекта, ПараметрыОбъекта); + + КонецЕсли; + + КонецЕсли; + + // Обработчик события ПриЗагрузкеОбъекта + Если ЕстьОбработчикПриЗагрузке Тогда + + НужноБылоЗаписатьОбъект = НужноЗаписатьОбъект; + ОбъектМодифицирован = Истина; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Правило, "ПриЗагрузке")); + + Иначе + + Выполнить(Правило.ПриЗагрузке); + + КонецЕсли; + + НужноЗаписатьОбъект = ОбъектМодифицирован ИЛИ НужноБылоЗаписатьОбъект; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Объект, "ПриЗагрузкеОбъекта"); + + КонецПопытки; + + Если ОбъектНайден И НеЗамещатьОбъект Тогда + + одПропустить(ФайлОбмена, "Объект"); + Прервать; + + КонецЕсли; + + КонецЕсли; + + ИначеЕсли ИмяУзла = "ТабличнаяЧасть" + ИЛИ ИмяУзла = "НаборЗаписей" Тогда + + Если Объект = Неопределено Тогда + + ОбъектНайден = Ложь; + + // Обработчик события ПриЗагрузкеОбъекта + + Если ЕстьОбработчикПриЗагрузке Тогда + + НужноБылоЗаписатьОбъект = НужноЗаписатьОбъект; + ОбъектМодифицирован = Истина; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Правило, "ПриЗагрузке")); + + Иначе + + Выполнить(Правило.ПриЗагрузке); + + КонецЕсли; + + НужноЗаписатьОбъект = ОбъектМодифицирован ИЛИ НужноБылоЗаписатьОбъект; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(20, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Объект, "ПриЗагрузкеОбъекта"); + + КонецПопытки; + + КонецЕсли; + + КонецЕсли; + + + Имя = одАтрибут(ФайлОбмена, одТипСтрока, "Имя"); + НеЗамещатьСвойство = одАтрибут(ФайлОбмена, одТипБулево, "НеЗамещать"); + НеОчищать = одАтрибут(ФайлОбмена, одТипБулево, "НеОчищать"); + + Если ОбъектНайден И НеЗамещатьСвойство Тогда + + одПропустить(ФайлОбмена, ИмяУзла); + Продолжить; + + КонецЕсли; + + Если Объект = Неопределено Тогда + + СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, Объект, Ложь, НаборЗаписей, , НппСсылки, НППГлобальнойСсылки, ПараметрыОбъекта); + НужноЗаписатьОбъект = Истина; + + КонецЕсли; + + Если ИмяУзла = "ТабличнаяЧасть" Тогда + + // загрузка элементов из табличной части + ЗагрузитьТабличнуюЧасть(Объект, Имя, Не НеОчищать, ИнформацияОТипах, НужноЗаписатьОбъект, ПараметрыОбъекта, Правило); + + ИначеЕсли ИмяУзла = "НаборЗаписей" Тогда + + // загрузка движений + ЗагрузитьДвижения(Объект, Имя, Не НеОчищать, ИнформацияОТипах, НужноЗаписатьОбъект, ПараметрыОбъекта, Правило); + + КонецЕсли; + + ИначеЕсли (ИмяУзла = "Объект") И (ФайлОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Отказ = Ложь; + + // Глобальный обработчик события ПослеЗагрузкиОбъекта + Если ЕстьГлобальныйОбработчикПослеЗагрузкиОбъекта Тогда + + НужноБылоЗаписатьОбъект = НужноЗаписатьОбъект; + ОбъектМодифицирован = Истина; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Конвертация, "ПослеЗагрузкиОбъекта")); + + Иначе + + Выполнить(Конвертация.ПослеЗагрузкиОбъекта); + + КонецЕсли; + + НужноЗаписатьОбъект = ОбъектМодифицирован ИЛИ НужноБылоЗаписатьОбъект; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(54, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Объект, "ПослеЗагрузкиОбъекта (глобальный)"); + + КонецПопытки; + + КонецЕсли; + + + // Обработчик события ПослеЗагрузкиОбъекта + Если ЕстьОбработчикПослеЗагрузки Тогда + + НужноБылоЗаписатьОбъект = НужноЗаписатьОбъект; + ОбъектМодифицирован = Истина; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Правило, "ПослеЗагрузки")); + + Иначе + + Выполнить(Правило.ПослеЗагрузки); + + КонецЕсли; + + НужноЗаписатьОбъект = ОбъектМодифицирован ИЛИ НужноБылоЗаписатьОбъект; + + Исключение + + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(21, ОписаниеОшибки(), ИмяПравила, Источник, + ТипОбъекта, Объект, "ПослеЗагрузкиОбъекта"); + + КонецПопытки; + + КонецЕсли; + + Если Отказ Тогда + + ДобавитьСсылкуВСписокЗагруженныхОбъектов(НППГлобальнойСсылки, НппСсылки, Неопределено); + УдалитьИзСтекаНеЗаписанныхОбъектов(Нпп, ГНпп); + Возврат Неопределено; + + КонецЕсли; + + Если ИмяТипаОбъекта = "Документ" Тогда + + Если РежимЗаписи = "Проведение" Тогда + + РежимЗаписи = РежимЗаписиДокумента.Проведение; + + Иначе + + РежимЗаписи = ?(РежимЗаписи = "ОтменаПроведения", РежимЗаписиДокумента.ОтменаПроведения, РежимЗаписиДокумента.Запись); + + КонецЕсли; + + + РежимПроведения = ?(РежимПроведения = "Оперативный", РежимПроведенияДокумента.Оперативный, РежимПроведенияДокумента.Неоперативный); + + + // если хотим провести документ помеченный на удаление, то пометку удаления снимаем ... + Если Объект.ПометкаУдаления + И (РежимЗаписи = РежимЗаписиДокумента.Проведение) Тогда + + Объект.ПометкаУдаления = Ложь; + НужноЗаписатьОбъект = Истина; + + // пометку удаления в любом случае нужно удалять + ПометкаУдаления = Ложь; + + КонецЕсли; + + Попытка + + НужноЗаписатьОбъект = НужноЗаписатьОбъект ИЛИ (РежимЗаписи <> РежимЗаписиДокумента.Запись); + + РежимОбменДанными = РежимЗаписи = РежимЗаписиДокумента.Запись; + + ПровестиГенерациюКодаНомераПриНеобходимости(ГенерироватьНовыйНомерИлиКодЕслиНеУказан, Объект, + ИмяТипаОбъекта, НужноЗаписатьОбъект, РежимОбменДанными); + + Если НужноЗаписатьОбъект Тогда + + УстановитьОбменДаннымиЗагрузка(Объект, РежимОбменДанными); + Если Объект.Проведен Тогда + Объект.ПометкаУдаления = Ложь; + КонецЕсли; + + Объект.Записать(РежимЗаписи, РежимПроведения); + + КонецЕсли; + + Исключение + + // не смогли выполнить необходимые действия для документа + ЗаписатьДокументВБезопасномРежиме(Объект, ТипОбъекта); + + + ЗП = ПолучитьСтруктуруЗаписиПротокола(25, ОписаниеОшибки()); + ЗП.ИмяПКО = ИмяПравила; + + Если Не ПустаяСтрока(Источник) Тогда + + ЗП.Источник = Источник; + + КонецЕсли; + + ЗП.ТипОбъекта = ТипОбъекта; + ЗП.Объект = Строка(Объект); + ЗаписатьВПротоколВыполнения(25, ЗП); + + КонецПопытки; + + ДобавитьСсылкуВСписокЗагруженныхОбъектов(НППГлобальнойСсылки, НппСсылки, Объект.Ссылка); + + УдалитьИзСтекаНеЗаписанныхОбъектов(Нпп, ГНпп); + + ИначеЕсли ИмяТипаОбъекта <> "Перечисление" Тогда + + Если ИмяТипаОбъекта = "РегистрСведений" Тогда + + НужноЗаписатьОбъект = НЕ ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты; + + Если СтруктураСвойств.Периодический + И Не ЗначениеЗаполнено(Объект.Период) Тогда + + УстановитьТекущуюДатуРеквизиту(Объект.Период); + НужноЗаписатьОбъект = Истина; + + КонецЕсли; + + Если ЗаписыватьРегистрыНаборамиЗаписей Тогда + + НужноПроверитьДанныеДляВременногоНабора = + (ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты + И НЕ НужноЗаписатьОбъект) + ИЛИ НеЗамещатьОбъект; + + Если НужноПроверитьДанныеДляВременногоНабора Тогда + + ВременныйНаборЗаписей = РегистрыСведений[СтруктураСвойств.Имя].СоздатьНаборЗаписей(); + + КонецЕсли; + + // нужно отбор установить у регистра + Для Каждого ЭлементОтбора Из НаборЗаписей.Отбор Цикл + + ЭлементОтбора.Установить(Объект[ЭлементОтбора.Имя]); + Если НужноПроверитьДанныеДляВременногоНабора Тогда + ВременныйНаборЗаписей.Отбор[ЭлементОтбора.Имя].Установить(Объект[ЭлементОтбора.Имя]); + КонецЕсли; + + КонецЦикла; + + Если НужноПроверитьДанныеДляВременногоНабора Тогда + + ВременныйНаборЗаписей.Прочитать(); + + Если ВременныйНаборЗаписей.Количество() = 0 Тогда + НужноЗаписатьОбъект = Истина; + Иначе + + // не хотим замещать существующий набор + Если НеЗамещатьОбъект Тогда + Возврат Неопределено; + КонецЕсли; + + НужноЗаписатьОбъект = Ложь; + ТаблицаНовая = НаборЗаписей.Выгрузить(); + ТаблицаСтарая = ВременныйНаборЗаписей.Выгрузить(); + + СтрокаНовая = ТаблицаНовая[0]; + СтрокаСтарая = ТаблицаСтарая[0]; + + Для Каждого КолонкаТаблицы Из ТаблицаНовая.Колонки Цикл + + НужноЗаписатьОбъект = СтрокаНовая[КолонкаТаблицы.Имя] <> СтрокаСтарая[КолонкаТаблицы.Имя]; + Если НужноЗаписатьОбъект Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + КонецЕсли; + + Объект = НаборЗаписей; + + Иначе + + // регистр записываем не набором записей + Если НеЗамещатьОбъект Тогда + + // возможно мы не хотим замещать существующую запись + ВременныйНаборЗаписей = РегистрыСведений[СтруктураСвойств.Имя].СоздатьНаборЗаписей(); + + // нужно отбор установить у регистра + Для Каждого ЭлементОтбора Из ВременныйНаборЗаписей.Отбор Цикл + + ЭлементОтбора.Установить(Объект[ЭлементОтбора.Имя]); + + КонецЦикла; + + ВременныйНаборЗаписей.Прочитать(); + + Если ВременныйНаборЗаписей.Количество() > 0 Тогда + Возврат Неопределено; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + ЭтоСсылочныйТипОбъекта = НЕ( ИмяТипаОбъекта = "РегистрСведений" + ИЛИ ИмяТипаОбъекта = "Константы"); + + Если ЭтоСсылочныйТипОбъекта Тогда + + ПровестиГенерациюКодаНомераПриНеобходимости(ГенерироватьНовыйНомерИлиКодЕслиНеУказан, Объект, ИмяТипаОбъекта, НужноЗаписатьОбъект, ЗагружатьДанныеВРежимеОбмена); + + Если ПометкаУдаления = Неопределено Тогда + ПометкаУдаления = Ложь; + КонецЕсли; + + Если Объект.ПометкаУдаления <> ПометкаУдаления Тогда + Объект.ПометкаУдаления = ПометкаУдаления; + НужноЗаписатьОбъект = Истина; + КонецЕсли; + + КонецЕсли; + + //непосредственная запись самого объекта + Если НужноЗаписатьОбъект Тогда + + ЗаписатьОбъектВИБ(Объект, ТипОбъекта); + + КонецЕсли; + + Если ЭтоСсылочныйТипОбъекта Тогда + + ДобавитьСсылкуВСписокЗагруженныхОбъектов(НППГлобальнойСсылки, НппСсылки, Объект.Ссылка); + + КонецЕсли; + + УдалитьИзСтекаНеЗаписанныхОбъектов(Нпп, ГНпп); + + КонецЕсли; + + Прервать; + + ИначеЕсли ИмяУзла = "НаборЗаписейПоследовательности" Тогда + + одПропустить(ФайлОбмена); + + ИначеЕсли ИмяУзла = "Типы" Тогда + + Если Объект = Неопределено Тогда + + ОбъектНайден = Ложь; + Ссылка = СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, Объект, , , , НппСсылки, НППГлобальнойСсылки, ПараметрыОбъекта); + + КонецЕсли; + + ОписаниеТиповОбъекта = ЗагрузитьТипыОбъекта(ФайлОбмена); + + Если ОписаниеТиповОбъекта <> Неопределено Тогда + + Объект.ТипЗначения = ОписаниеТиповОбъекта; + + КонецЕсли; + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Прервать; + + КонецЕсли; + + КонецЦикла; + + Возврат Объект; + +КонецФункции // ПрочитатьОбъект() + + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ ВЫГРУЗКИ ДАННЫХ ПО ПРАВИЛАМ ОБМЕНА + +Функция ПолучитьНаборДвиженийДокумента(СсылкаНаДокумент, ВидИсточника, ИмяРегистра) + + Если ВидИсточника = "НаборДвиженийРегистраНакопления" Тогда + + НаборДвиженийДокумента = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей(); + + ИначеЕсли ВидИсточника = "НаборДвиженийРегистраСведений" Тогда + + НаборДвиженийДокумента = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей(); + + ИначеЕсли ВидИсточника = "НаборДвиженийРегистраБухгалтерии" Тогда + + НаборДвиженийДокумента = РегистрыБухгалтерии[ИмяРегистра].СоздатьНаборЗаписей(); + + ИначеЕсли ВидИсточника = "НаборДвиженийРегистраРасчета" Тогда + + НаборДвиженийДокумента = РегистрыРасчета[ИмяРегистра].СоздатьНаборЗаписей(); + + Иначе + + Возврат Неопределено; + + КонецЕсли; + + НаборДвиженийДокумента.Отбор.Регистратор.Установить(СсылкаНаДокумент); + НаборДвиженийДокумента.Прочитать(); + + Возврат НаборДвиженийДокумента; + +КонецФункции + + +Процедура ВыполнитьЗаписьСтруктурыВXML(СтруктураДанных, УзелКоллекцииСвойств) + + УзелКоллекцииСвойств.ЗаписатьНачалоЭлемента("Свойство"); + + Для Каждого ЭлементКоллекции Из СтруктураДанных Цикл + + Если ЭлементКоллекции.Ключ = "Выражение" + ИЛИ ЭлементКоллекции.Ключ = "Значение" + ИЛИ ЭлементКоллекции.Ключ = "Нпп" + ИЛИ ЭлементКоллекции.Ключ = "ГНпп" Тогда + + одЗаписатьЭлемент(УзелКоллекцииСвойств, ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение); + + ИначеЕсли ЭлементКоллекции.Ключ = "Ссылка" Тогда + + УзелКоллекцииСвойств.ЗаписатьБезОбработки(ЭлементКоллекции.Значение); + + Иначе + + УстановитьАтрибут(УзелКоллекцииСвойств, ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение); + + КонецЕсли; + + КонецЦикла; + + УзелКоллекцииСвойств.ЗаписатьКонецЭлемента(); + +КонецПроцедуры + +Процедура СоздатьОбъектыДляЗаписиДанныхВXML(СтруктураДанных, УзелСвойства, НуженУзелXML, ИмяУзла, НаименованиеУзлаXML = "Свойство") + + Если НуженУзелXML Тогда + + УзелСвойства = СоздатьУзел(НаименованиеУзлаXML); + УстановитьАтрибут(УзелСвойства, "Имя", ИмяУзла); + + Иначе + + СтруктураДанных = Новый Структура("Имя", ИмяУзла); + + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, ИмяАтрибута, ЗначениеАтрибута) + + Если СтруктураУзлаСвойств <> Неопределено Тогда + СтруктураУзлаСвойств.Вставить(ИмяАтрибута, ЗначениеАтрибута); + Иначе + УстановитьАтрибут(УзелСвойства, ИмяАтрибута, ЗначениеАтрибута); + КонецЕсли; + +КонецПроцедуры + +Процедура ПроизвестиЗаписьДанныхВГоловнойУзел(УзелКоллекцииСвойств, СтруктураУзлаСвойств, УзелСвойства) + + Если СтруктураУзлаСвойств <> Неопределено Тогда + ВыполнитьЗаписьСтруктурыВXML(СтруктураУзлаСвойств, УзелКоллекцииСвойств); + Иначе + ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелСвойства); + КонецЕсли; + +КонецПроцедуры + + + +// Формирует узлы свойств объекта приемника в соответствии с указанной коллекцией правил конвертации свойств +// +// Параметры: +// Источник - произвольный источник данных +// Приемник - xml-узел объекта приемника +// ВходящиеДанные - произвольные вспомогательные данные, передаваемые правилу +// для выполнения конвертации +// ИсходящиеДанные - произвольные вспомогательные данные, передаваемые правилам +// конвертации объектов свойств +// ПКО - ссылка на правило конвертации объектов (родитель коллекции правил конвертации свойств) +// ПКГС - ссылка на правило конвертации группы свойств +// УзелКоллекцииСвойств - xml-узел коллекции свойств +// +Процедура ВыгрузитьГруппуСвойств(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКГС, УзелКоллекцииСвойств, + ВыгрузитьТолькоСсылку, СписокВременныхФайлов = Неопределено) + + КоллекцияОбъектов = Неопределено; + НеЗамещать = ПКГС.НеЗамещать; + НеОчищать = Ложь; + ВыгружатьГруппуЧерезФайл = ПКГС.ВыгружатьГруппуЧерезФайл + И (НепосредственноеЧтениеВИБПриемнике = Ложь); + + + // Обработчик ПередОбработкойВыгрузки + + Если ПКГС.ЕстьОбработчикПередОбработкойВыгрузки Тогда + + Отказ = Ложь; + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКГС, "ПередОбработкойВыгрузки")); + + Иначе + + Выполнить(ПКГС.ПередОбработкойВыгрузки); + + КонецЕсли; + + Исключение + + ЗП = ПолучитьСтруктуруЗаписиПротокола(48, ОписаниеОшибки()); + ЗП.ПКО = ПКО.Имя + " (" + ПКО.Наименование + ")"; + ЗП.ПКГС = ПКГС.Имя + " (" + ПКГС.Наименование + ")"; + + Попытка + ЗП.Объект = Строка(Источник) + " (" + ТипЗнч(Источник) + ")"; + Исключение + ЗП.Объект = "(" + ТипЗнч(Источник) + ")"; + КонецПопытки; + + ЗП.Обработчик = "ПередОбработкойВыгрузкиГруппыСвойств"; + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(48, ЗП); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + + Если Отказ Тогда // Отказ от обработки группы свойств + + Возврат; + + КонецЕсли; + + КонецЕсли; + + + ВидПриемника = ПКГС.ВидПриемника; + ВидИсточника = ПКГС.ВидИсточника; + + + // Создание узла коллекции подчиненных объектов + СтруктураУзлаСвойств = Неопределено; + УзелКоллекцииОбъектов = Неопределено; + ИмяГоловногоУзла = ""; + + Если ВидПриемника = "ТабличнаяЧасть" Тогда + + ИмяГоловногоУзла = "ТабличнаяЧасть"; + + СоздатьОбъектыДляЗаписиДанныхВXML(СтруктураУзлаСвойств, УзелКоллекцииОбъектов, ИСТИНА, ПКГС.Приемник, ИмяГоловногоУзла); + + Если НеЗамещать Тогда + + ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелКоллекцииОбъектов, "НеЗамещать", "true"); + + КонецЕсли; + + Если НеОчищать Тогда + + ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелКоллекцииОбъектов, "НеОчищать", "true"); + + КонецЕсли; + + ИначеЕсли ВидПриемника = "ПодчиненныйСправочник" Тогда + + + ИначеЕсли ВидПриемника = "НаборЗаписейПоследовательности" Тогда + + ИмяГоловногоУзла = "НаборЗаписей"; + + СоздатьОбъектыДляЗаписиДанныхВXML(СтруктураУзлаСвойств, УзелКоллекцииОбъектов, ИСТИНА, ПКГС.Приемник, ИмяГоловногоУзла); + + ИначеЕсли Найти(ВидПриемника, "НаборДвижений") > 0 Тогда + + ИмяГоловногоУзла = "НаборЗаписей"; + + СоздатьОбъектыДляЗаписиДанныхВXML(СтруктураУзлаСвойств, УзелКоллекцииОбъектов, ИСТИНА, ПКГС.Приемник, ИмяГоловногоУзла); + + Если НеЗамещать Тогда + + ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелКоллекцииОбъектов, "НеЗамещать", "true"); + + КонецЕсли; + + Если НеОчищать Тогда + + ДобавитьАтрибутДляЗаписиВXML(СтруктураУзлаСвойств, УзелКоллекцииОбъектов, "НеОчищать", "true"); + + КонецЕсли; + + Иначе // это простая группировка + + ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКГС.ПравилаГруппы, + УзелКоллекцииСвойств, , , ПКО.НеВыгружатьОбъектыСвойствПоСсылкам ИЛИ ВыгрузитьТолькоСсылку); + + Если ПКГС.ЕстьОбработчикПослеОбработкиВыгрузки Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКГС, "ПослеОбработкиВыгрузки")); + + Иначе + + Выполнить(ПКГС.ПослеОбработкиВыгрузки); + + КонецЕсли; + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(49); + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + + КонецЕсли; + + Возврат; + + КонецЕсли; + + Если ВыгружатьГруппуЧерезФайл Тогда + + Если СписокВременныхФайлов = Неопределено Тогда + СписокВременныхФайлов = Новый СписокЗначений(); + КонецЕсли; + + ИмяФайлаЗаписей = ПолучитьИмяВременногоФайла(); + СписокВременныхФайлов.Добавить(ИмяФайлаЗаписей); + + ВременныйФайЗаписей = Новый ЗаписьТекста; + Попытка + + ВременныйФайЗаписей.Открыть(ИмяФайлаЗаписей, КодировкаТекста.UTF8); + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(8); + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(1000, ОписаниеОшибки(), ИмяФайлаЗаписей + ": Ошибка при создании временного файла для выгрузки данных"); + + КонецПопытки; + + ИнформацияДляЗаписиВФайл = УзелКоллекцииОбъектов.Закрыть(); + ВременныйФайЗаписей.ЗаписатьСтроку(ИнформацияДляЗаписиВФайл); + + КонецЕсли; + + + // Получение коллекции подчиненных объектов + + Если КоллекцияОбъектов <> Неопределено Тогда + + // Инициализировали коллекцию в обработчике ПередОбработкой + + ИначеЕсли ПКГС.ПолучитьИзВходящихДанных Тогда + + Попытка + + КоллекцияОбъектов = ВходящиеДанные[ПКГС.Приемник]; + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(66); + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + Возврат; + + КонецПопытки; + + ИначеЕсли ВидИсточника = "ТабличнаяЧасть" Тогда + + КоллекцияОбъектов = Источник[ПКГС.Источник]; + + ИначеЕсли ВидИсточника = "ПодчиненныйСправочник" Тогда + + ИначеЕсли Найти(ВидИсточника, "НаборДвижений") > 0 Тогда + + КоллекцияОбъектов = ПолучитьНаборДвиженийДокумента(Источник, ВидИсточника, ПКГС.Источник); + + ИначеЕсли ПустаяСтрока(ПКГС.Источник) Тогда + + КоллекцияОбъектов = Источник[ПКГС.Приемник]; + + КонецЕсли; + + + Для каждого ОбъектКоллекции Из КоллекцияОбъектов Цикл + + + // Обработчик ПередВыгрузкой + Если ПКГС.ЕстьОбработчикПередВыгрузкой Тогда + + Отказ = Ложь; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКГС, "ПередВыгрузкой")); + + Иначе + + Выполнить(ПКГС.ПередВыгрузкой); + + КонецЕсли; + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(50); + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + Прервать; + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки подчиненного объекта + + Продолжить; + + КонецЕсли; + + КонецЕсли; + + + // Обработчик ПриВыгрузке + + Если ПКГС.НуженУзелXMLПриВыгрузке ИЛИ ВыгружатьГруппуЧерезФайл Тогда + УзелОбъектаКоллекции = СоздатьУзел("Запись"); + Иначе + УзелКоллекцииОбъектов.ЗаписатьНачалоЭлемента("Запись"); + УзелОбъектаКоллекции = УзелКоллекцииОбъектов; + КонецЕсли; + + СтандартнаяОбработка = Истина; + + Если ПКГС.ЕстьОбработчикПриВыгрузке Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКГС, "ПриВыгрузке")); + + Иначе + + Выполнить(ПКГС.ПриВыгрузке); + + КонецЕсли; + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(51); + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + Прервать; + + КонецПопытки; + + КонецЕсли; + + + // Выгрузка свойств объекта коллекции + + Если СтандартнаяОбработка Тогда + + Если ПКГС.ПравилаГруппы.Количество() > 0 Тогда + + ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКГС.ПравилаГруппы, + УзелОбъектаКоллекции, ОбъектКоллекции, , ПКО.НеВыгружатьОбъектыСвойствПоСсылкам ИЛИ ВыгрузитьТолькоСсылку); + + + КонецЕсли; + + КонецЕсли; + + + // Обработчик ПослеВыгрузки + + Если ПКГС.ЕстьОбработчикПослеВыгрузки Тогда + + Отказ = Ложь; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКГС, "ПослеВыгрузки")); + + Иначе + + Выполнить(ПКГС.ПослеВыгрузки); + + КонецЕсли; + + Исключение + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(52); + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + Прервать; + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки подчиненного объекта + + Продолжить; + + КонецЕсли; + + КонецЕсли; + + Если ПКГС.НуженУзелXMLПриВыгрузке Тогда + ДобавитьПодчиненный(УзелКоллекцииОбъектов, УзелОбъектаКоллекции); + КонецЕсли; + + // заполняем файл объектами узла + Если ВыгружатьГруппуЧерезФайл Тогда + + УзелОбъектаКоллекции.ЗаписатьКонецЭлемента(); + ИнформацияДляЗаписиВФайл = УзелОбъектаКоллекции.Закрыть(); + ВременныйФайЗаписей.ЗаписатьСтроку(ИнформацияДляЗаписиВФайл); + + Иначе + + Если Не ПКГС.НуженУзелXMLПриВыгрузке Тогда + + УзелКоллекцииОбъектов.ЗаписатьКонецЭлемента(); + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + + // Обработчик ПослеОбработкиВыгрузки + + Если ПКГС.ЕстьОбработчикПослеОбработкиВыгрузки Тогда + + Отказ = Ложь; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКГС, "ПослеОбработкиВыгрузки")); + + Иначе + + Выполнить(ПКГС.ПослеОбработкиВыгрузки); + + КонецЕсли; + + Исключение + + ЗаписатьВПротоколВыполнения(49); + + КонецПопытки; + + Если Отказ Тогда // Отказ от записи коллекции подчиненных объектов + + Возврат; + + КонецЕсли; + + КонецЕсли; + + Если ВыгружатьГруппуЧерезФайл Тогда + ВременныйФайЗаписей.ЗаписатьСтроку(""); // закрыть узел + ВременныйФайЗаписей.Закрыть(); // закрыть файл явно + Иначе + ПроизвестиЗаписьДанныхВГоловнойУзел(УзелКоллекцииСвойств, СтруктураУзлаСвойств, УзелКоллекцииОбъектов); + КонецЕсли; + +КонецПроцедуры // ВыгрузитьГруппуСвойств() + +Процедура ПолучитьЗначениеСвойства(Значение, ОбъектКоллекции, ПКО, ПКС, ВходящиеДанные, Источник) + + Если Значение <> Неопределено Тогда + Возврат; + КонецЕсли; + + Если ПКС.ПолучитьИзВходящихДанных Тогда + + ОбъектДляПолученияДанных = ВходящиеДанные; + + Если Не ПустаяСтрока(ПКС.Приемник) Тогда + + ИмяСвойства = ПКС.Приемник; + + Иначе + + ИмяСвойства = ПКС.ИмяПараметраДляПередачи; + + КонецЕсли; + + КодОшибки = ?(ОбъектКоллекции <> Неопределено, 67, 68); + + ИначеЕсли ОбъектКоллекции <> Неопределено Тогда + + ОбъектДляПолученияДанных = ОбъектКоллекции; + + Если Не ПустаяСтрока(ПКС.Источник) Тогда + + ИмяСвойства = ПКС.Источник; + КодОшибки = 16; + + Иначе + + ИмяСвойства = ПКС.Приемник; + КодОшибки = 17; + + КонецЕсли; + + Иначе + + ОбъектДляПолученияДанных = Источник; + + Если Не ПустаяСтрока(ПКС.Источник) Тогда + + ИмяСвойства = ПКС.Источник; + КодОшибки = 13; + + Иначе + + ИмяСвойства = ПКС.Приемник; + КодОшибки = 14; + + КонецЕсли; + + КонецЕсли; + + + Попытка + + Значение = ОбъектДляПолученияДанных[ИмяСвойства]; + + Исключение + + Если КодОшибки <> 14 Тогда + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(КодОшибки, ОписаниеОшибки(), ПКО, ПКС, Источник, ""); + КонецЕсли; + + КонецПопытки; + +КонецПроцедуры + +Процедура ВыгрузитьТипСвойстваЭлемента(УзелСвойства, ТипСвойства) + + УстановитьАтрибут(УзелСвойства, "Тип", ТипСвойства); + +КонецПроцедуры + +Процедура _ВыгрузитьСубконто(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКС, + УзелКоллекцииСвойств = Неопределено, ОбъектКоллекции = Неопределено, Знач ВыгрузитьТолькоСсылку = Ложь) + + // Инициализация значения + Значение = Неопределено; + ИмяПКО = ""; + ИмяПКОВидСубконто = ""; + + // Обработчик ПередВыгрузкой + Если ПКС.ЕстьОбработчикПередВыгрузкой Тогда + + Отказ = Ложь; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКС, "ПередВыгрузкой")); + + Иначе + + Выполнить(ПКС.ПередВыгрузкой); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(55, ОписаниеОшибки(), ПКО, ПКС, Источник, + "ПередВыгрузкойСвойства", Значение); + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки + + Возврат; + + КонецЕсли; + + КонецЕсли; + + ПолучитьЗначениеСвойства(Значение, ОбъектКоллекции, ПКО, ПКС, ВходящиеДанные, Источник); + + Если ПКС.ПриводитьКДлине <> 0 Тогда + + ВыполнитьПриведениеЗначенияКДлине(Значение, ПКС); + + КонецЕсли; + + Для каждого КлючИЗначение из Значение Цикл + + ВидСубконто = КлючИЗначение.Ключ; + Субконто = КлючИЗначение.Значение; + + // Обработчик ПриВыгрузке + Если ПКС.ЕстьОбработчикПриВыгрузке Тогда + + Отказ = Ложь; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКС, "ПриВыгрузке")); + + Иначе + + Выполнить(ПКС.ПриВыгрузке); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(56, ОписаниеОшибки(), ПКО, ПКС, Источник, + "ПриВыгрузкеСвойства", Значение); + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки субконто + + Продолжить; + + КонецЕсли; + + КонецЕсли; + + Если Субконто = Неопределено + ИЛИ НайтиПравило(Субконто) = Неопределено Тогда + + Продолжить; + + КонецЕсли; + + УзелСубконто = СоздатьУзел(ПКС.Приемник); + + // Ключ + УзелСвойства = СоздатьУзел("Свойство"); + + Если ПустаяСтрока(ИмяПКОВидСубконто) Тогда + + ПКОКлюч = НайтиПравило(ВидСубконто, ИмяПКОВидСубконто); + + Иначе + + ПКОКлюч = НайтиПравило(, ИмяПКОВидСубконто); + + КонецЕсли; + + УстановитьАтрибут(УзелСвойства, "Имя", "Ключ"); + ВыгрузитьТипСвойстваЭлемента(УзелСвойства, ПКОКлюч.Приемник); + + УзелСсылки = ВыгрузитьПоПравилу(ВидСубконто,, ИсходящиеДанные,, ИмяПКОВидСубконто,, ВыгрузитьТолькоСсылку, ПКОКлюч); + + Если УзелСсылки <> Неопределено Тогда + + //ДобавитьПодчиненный(УзелСвойства, УзелСсылки); + ЭтоПравилоСГлобальнойВыгрузкой = Ложь; + ТипУзлаСсылки = ТипЗнч(УзелСсылки); + ДобавитьСвойстваДляВыгрузки(УзелСсылки, ТипУзлаСсылки, УзелСвойства, ЭтоПравилоСГлобальнойВыгрузкой); + + КонецЕсли; + + ДобавитьПодчиненный(УзелСубконто, УзелСвойства); + + + + // Значение + УзелСвойства = СоздатьУзел("Свойство"); + + ПКОЗначение = НайтиПравило(Субконто); + + ТипПриемника = ПКОЗначение.Приемник; + + ЭтоNULL = Ложь; + Пусто = одПустое(Субконто, ЭтоNULL); + + Если Пусто Тогда + + Если ЭтоNULL + Или Значение = Неопределено Тогда + + Продолжить; + + КонецЕсли; + + Если ПустаяСтрока(ТипПриемника) Тогда + + ТипПриемника = ОпределитьТипДанныхДляПриемника(Субконто); + + КонецЕсли; + + УстановитьАтрибут(УзелСвойства, "Имя", "Значение"); + + Если Не ПустаяСтрока(ТипПриемника) Тогда + УстановитьАтрибут(УзелСвойства, "Тип", ТипПриемника); + КонецЕсли; + + // если тип множественный, то возможно это пустая ссылка и выгрузить ее нужно именно с указанием типа + одЗаписатьЭлемент(УзелСвойства, "Пусто"); + + ДобавитьПодчиненный(УзелСубконто, УзелСвойства); + + Иначе + + ЭтоПравилоСГлобальнойВыгрузкой = Ложь; + УзелСсылки = ВыгрузитьПоПравилу(Субконто,, ИсходящиеДанные, , ИмяПКО, , ВыгрузитьТолькоСсылку, ПКОЗначение, ЭтоПравилоСГлобальнойВыгрузкой); + + УстановитьАтрибут(УзелСвойства, "Имя", "Значение"); + ВыгрузитьТипСвойстваЭлемента(УзелСвойства, ТипПриемника); + + Если УзелСсылки = Неопределено Тогда + + Продолжить; + + КонецЕсли; + + ТипУзлаСсылки = ТипЗнч(УзелСсылки); + + ДобавитьСвойстваДляВыгрузки(УзелСсылки, ТипУзлаСсылки, УзелСвойства, ЭтоПравилоСГлобальнойВыгрузкой); + + ДобавитьПодчиненный(УзелСубконто, УзелСвойства); + + КонецЕсли; + + + + // Обработчик ПослеВыгрузки + Если ПКС.ЕстьОбработчикПослеВыгрузки Тогда + + Отказ = Ложь; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКС, "ПослеВыгрузки")); + + Иначе + + Выполнить(ПКС.ПослеВыгрузки); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(57, ОписаниеОшибки(), ПКО, ПКС, Источник, + "ПослеВыгрузкиСвойства", Значение); + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки + + Продолжить; + + КонецЕсли; + + КонецЕсли; + + ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелСубконто); + + КонецЦикла; + +КонецПроцедуры // _ВыгрузитьСубконто() + +Процедура ДобавитьСвойстваДляВыгрузки(УзелСсылки, ТипУзлаСсылки, УзелСвойства, ЭтоПравилоСГлобальнойВыгрузкой) + + Если ТипУзлаСсылки = одТипСтрока Тогда + + Если Найти(УзелСсылки, "<Ссылка") > 0 Тогда + + УзелСвойства.ЗаписатьБезОбработки(УзелСсылки); + + Иначе + + одЗаписатьЭлемент(УзелСвойства, "Значение", УзелСсылки); + + КонецЕсли; + + ИначеЕсли ТипУзлаСсылки = одТипЧисло Тогда + + Если ЭтоПравилоСГлобальнойВыгрузкой Тогда + + одЗаписатьЭлемент(УзелСвойства, "ГНпп", УзелСсылки); + + Иначе + + одЗаписатьЭлемент(УзелСвойства, "Нпп", УзелСсылки); + + КонецЕсли; + + Иначе + + ДобавитьПодчиненный(УзелСвойства, УзелСсылки); + + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьЗначениеСвойстваВУзел(Значение, ТипЗначения, ТипПриемника, УзелСвойства, СвойствоУстановлено) + + СвойствоУстановлено = Истина; + + Если ТипЗначения = одТипСтрока Тогда + + Если ТипПриемника = "Строка" Тогда + ИначеЕсли ТипПриемника = "Число" Тогда + + Значение = Число(Значение); + + ИначеЕсли ТипПриемника = "Булево" Тогда + + Значение = Булево(Значение); + + ИначеЕсли ТипПриемника = "Дата" Тогда + + Значение = Дата(Значение); + + ИначеЕсли ТипПриемника = "ХранилищеЗначения" Тогда + + Значение = Новый ХранилищеЗначения(Значение); + + ИначеЕсли ПустаяСтрока(ТипПриемника) Тогда + + УстановитьАтрибут(УзелСвойства, "Тип", "Строка"); + + КонецЕсли; + + одЗаписатьЭлемент(УзелСвойства, "Значение", Значение); + + ИначеЕсли ТипЗначения = одТипЧисло Тогда + + Если ТипПриемника = "Число" Тогда + ИначеЕсли ТипПриемника = "Булево" Тогда + + Значение = Булево(Значение); + + ИначеЕсли ТипПриемника = "Строка" Тогда + ИначеЕсли ПустаяСтрока(ТипПриемника) Тогда + + УстановитьАтрибут(УзелСвойства, "Тип", "Число"); + + Иначе + + Возврат; + + КонецЕсли; + + одЗаписатьЭлемент(УзелСвойства, "Значение", Значение); + + ИначеЕсли ТипЗначения = одТипДата Тогда + + Если ТипПриемника = "Дата" Тогда + ИначеЕсли ТипПриемника = "Строка" Тогда + + Значение = Лев(Строка(Значение), 10); + + ИначеЕсли ПустаяСтрока(ТипПриемника) Тогда + + УстановитьАтрибут(УзелСвойства, "Тип", "Дата"); + + Иначе + + Возврат; + + КонецЕсли; + + одЗаписатьЭлемент(УзелСвойства, "Значение", Значение); // Формат(Значение, "ДФ=""ггггММддЧЧммсс""") + + ИначеЕсли ТипЗначения = одТипБулево Тогда + + Если ТипПриемника = "Булево" Тогда + ИначеЕсли ТипПриемника = "Число" Тогда + + Значение = Число(Значение); + + ИначеЕсли ПустаяСтрока(ТипПриемника) Тогда + + УстановитьАтрибут(УзелСвойства, "Тип", "Булево"); + + Иначе + + Возврат; + + КонецЕсли; + + одЗаписатьЭлемент(УзелСвойства, "Значение", Значение); + + ИначеЕсли ТипЗначения = одТипХранилищеЗначения Тогда + + Если ПустаяСтрока(ТипПриемника) Тогда + + УстановитьАтрибут(УзелСвойства, "Тип", "ХранилищеЗначения"); + + ИначеЕсли ТипПриемника <> "ХранилищеЗначения" Тогда + + Возврат; + + КонецЕсли; + + одЗаписатьЭлемент(УзелСвойства, "Значение", Значение); + + ИначеЕсли ТипЗначения = одТипВидДвиженияНакопления Тогда + + одЗаписатьЭлемент(УзелСвойства, "Значение", Строка(Значение)); + + Иначе + + СвойствоУстановлено = Ложь; + + КонецЕсли; + +КонецПроцедуры + + +Функция ВыгрузитьДанныеСсылочногоОбъекта(Значение, ИсходящиеДанные, ИмяПКО, ПКОСвойств, ТипПриемника, УзелСвойства, Знач ВыгрузитьТолькоСсылку) + + ЭтоПравилоСГлобальнойВыгрузкой = Ложь; + УзелСсылки = ВыгрузитьПоПравилу(Значение, , ИсходящиеДанные, , ИмяПКО, , ВыгрузитьТолькоСсылку, ПКОСвойств, ЭтоПравилоСГлобальнойВыгрузкой); + ТипУзлаСсылки = ТипЗнч(УзелСсылки); + + Если ПустаяСтрока(ТипПриемника) Тогда + + ТипПриемника = ПКОСвойств.Приемник; + УстановитьАтрибут(УзелСвойства, "Тип", ТипПриемника); + + КонецЕсли; + + Если УзелСсылки = Неопределено Тогда + + Возврат Неопределено; + + КонецЕсли; + + ДобавитьСвойстваДляВыгрузки(УзелСсылки, ТипУзлаСсылки, УзелСвойства, ЭтоПравилоСГлобальнойВыгрузкой); + + Возврат УзелСсылки; + +КонецФункции + +Функция ОпределитьТипДанныхДляПриемника(Значение) + + ТипПриемника = одТипЗначенияСтрокой(Значение); + + // есть ли хоть какое пко с типом приемника ТипПриемника + // если правила нат - то "", если есть , то то что нашли оставляем + СтрокаТаблицы = ТаблицаПравилКонвертации.Найти(ТипПриемника, "Приемник"); + + Если СтрокаТаблицы = Неопределено Тогда + ТипПриемника = ""; + КонецЕсли; + + Возврат ТипПриемника; + +КонецФункции + +Процедура ВыполнитьПриведениеЗначенияКДлине(Значение, ПКС) + + Значение = ПривестиНомерКДлине(Строка(Значение), ПКС.ПриводитьКДлине); + +КонецПроцедуры + +// Формирует узлы свойств объекта приемника в соответствии с указанной коллекцией правил конвертации свойств +// +// Параметры: +// Источник - произвольный источник данных +// Приемник - xml-узел объекта приемника +// ВходящиеДанные - произвольные вспомогательные данные, передаваемые правилу +// для выполнения конвертации +// ИсходящиеДанные - произвольные вспомогательные данные, передаваемые правилам +// конвертации объектов свойств +// ПКО - ссылка на правило конвертации объектов (родитель коллекции правил конвертации свойств) +// КоллекцияПКС - коллекция правил конвертации свойств +// УзелКоллекцииСвойств - xml-узел коллекции свойств +// ОбъектКоллекции - если указан, то выполняется выгрузка свойств объекта коллекции, иначе Источника +// ИмяПредопределенногоЭлемента - если указан, то в свойствах пишется имя предопределенного элемента +// ПКГС - ссылка на правило конвертации группы свойств (папка-родитель коллекции ПКС). +// Например, табличная часть документа +// +Процедура ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, КоллекцияПКС, УзелКоллекцииСвойств = Неопределено, + ОбъектКоллекции = Неопределено, ИмяПредопределенногоЭлемента = Неопределено, Знач ВыгрузитьТолькоСсылку = Ложь, + СписокВременныхФайлов = Неопределено) + + Перем КлючИЗначение, ВидСубконто, Субконто, ИмяПКОВидСубконто, УзелСубконто; //Пустышки, для корректного запуска обработчиков + + Если УзелКоллекцииСвойств = Неопределено Тогда + + УзелКоллекцииСвойств = Приемник; + + КонецЕсли; + + // Выгружаем имя предопределенного если оно указано + Если ИмяПредопределенногоЭлемента <> Неопределено Тогда + + УзелКоллекцииСвойств.ЗаписатьНачалоЭлемента("Свойство"); + УстановитьАтрибут(УзелКоллекцииСвойств, "Имя", "{ИмяПредопределенногоЭлемента}"); + Если НЕ ВыполнитьОбменДаннымиВОптимизированномФормате Тогда + УстановитьАтрибут(УзелКоллекцииСвойств, "Тип", "Строка"); + КонецЕсли; + одЗаписатьЭлемент(УзелКоллекцииСвойств, "Значение", ИмяПредопределенногоЭлемента); + УзелКоллекцииСвойств.ЗаписатьКонецЭлемента(); + + КонецЕсли; + + Для каждого ПКС Из КоллекцияПКС Цикл + + Если ПКС.УпрощеннаяВыгрузкаСвойства Тогда + + // Создаем узел свойства + + УзелКоллекцииСвойств.ЗаписатьНачалоЭлемента("Свойство"); + УстановитьАтрибут(УзелКоллекцииСвойств, "Имя", ПКС.Приемник); + + Если НЕ ВыполнитьОбменДаннымиВОптимизированномФормате + И Не ПустаяСтрока(ПКС.ТипПриемника) Тогда + + УстановитьАтрибут(УзелКоллекцииСвойств, "Тип", ПКС.ТипПриемника); + + КонецЕсли; + + Если ПКС.НеЗамещать Тогда + + УстановитьАтрибут(УзелКоллекцииСвойств, "НеЗамещать", "true"); + + КонецЕсли; + + Если ПКС.ПоискПоДатеНаРавенство Тогда + + УстановитьАтрибут(УзелКоллекцииСвойств, "ПоискПоДатеНаРавенство", "true"); + + КонецЕсли; + + Значение = Неопределено; + ПолучитьЗначениеСвойства(Значение, ОбъектКоллекции, ПКО, ПКС, ВходящиеДанные, Источник); + + Если ПКС.ПриводитьКДлине <> 0 Тогда + + ВыполнитьПриведениеЗначенияКДлине(Значение, ПКС); + + КонецЕсли; + + ЭтоNULL = Ложь; + Пусто = одПустое(Значение, ЭтоNULL); + + Если Пусто Тогда + + // надо записать что это пустое значение + Если НЕ ВыполнитьОбменДаннымиВОптимизированномФормате Тогда + одЗаписатьЭлемент(УзелКоллекцииСвойств, "Пусто"); + КонецЕсли; + + УзелКоллекцииСвойств.ЗаписатьКонецЭлемента(); + Продолжить; + + КонецЕсли; + + одЗаписатьЭлемент(УзелКоллекцииСвойств, "Значение", Значение); + + УзелКоллекцииСвойств.ЗаписатьКонецЭлемента(); + Продолжить; + + ИначеЕсли ПКС.ВидПриемника = "ВидыСубконтоСчета" Тогда + + _ВыгрузитьСубконто(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, + ПКС, УзелКоллекцииСвойств, ОбъектКоллекции, ВыгрузитьТолькоСсылку); + + + Продолжить; + + ИначеЕсли ПКС.Имя = "{УникальныйИдентификатор}" + И ПКС.Источник = "{УникальныйИдентификатор}" + И ПКС.Приемник = "{УникальныйИдентификатор}" Тогда + + Попытка + + УникальныйИдентификатор = Источник.УникальныйИдентификатор(); + + Исключение + + Попытка + + УникальныйИдентификатор = Источник.Ссылка.УникальныйИдентификатор(); + + Исключение + + Продолжить; + + КонецПопытки; + + КонецПопытки; + + УзелКоллекцииСвойств.ЗаписатьНачалоЭлемента("Свойство"); + УстановитьАтрибут(УзелКоллекцииСвойств, "Имя", "{УникальныйИдентификатор}"); + + Если НЕ ВыполнитьОбменДаннымиВОптимизированномФормате Тогда + УстановитьАтрибут(УзелКоллекцииСвойств, "Тип", "Строка"); + КонецЕсли; + + одЗаписатьЭлемент(УзелКоллекцииСвойств, "Значение", УникальныйИдентификатор); + УзелКоллекцииСвойств.ЗаписатьКонецЭлемента(); + Продолжить; + + ИначеЕсли ПКС.ЭтоГруппа Тогда + + ВыгрузитьГруппуСвойств(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКС, УзелКоллекцииСвойств, ВыгрузитьТолькоСсылку, СписокВременныхФайлов); + Продолжить; + + КонецЕсли; + + + // Инициализируем значение, которое будем конвертировать + Значение = Неопределено; + ИмяПКО = ПКС.ПравилоКонвертации; + НеЗамещать = ПКС.НеЗамещать; + + Пусто = Ложь; + Выражение = Неопределено; + ТипПриемника = ПКС.ТипПриемника; + + ЭтоNULL = Ложь; + + + // Обработчик ПередВыгрузкой + Если ПКС.ЕстьОбработчикПередВыгрузкой Тогда + + Отказ = Ложь; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКС, "ПередВыгрузкой")); + + Иначе + + Выполнить(ПКС.ПередВыгрузкой); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(55, ОписаниеОшибки(), ПКО, ПКС, Источник, + "ПередВыгрузкойСвойства", Значение); + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки свойства + + Продолжить; + + КонецЕсли; + + КонецЕсли; + + + // Создаем узел свойства + Если ПустаяСтрока(ПКС.ИмяПараметраДляПередачи) Тогда + + УзелСвойства = СоздатьУзел("Свойство"); + УстановитьАтрибут(УзелСвойства, "Имя", ПКС.Приемник); + + Иначе + + УзелСвойства = СоздатьУзел("ЗначениеПараметра"); + УстановитьАтрибут(УзелСвойства, "Имя", ПКС.ИмяПараметраДляПередачи); + + КонецЕсли; + + Если НеЗамещать Тогда + + УстановитьАтрибут(УзелСвойства, "НеЗамещать", "true"); + + КонецЕсли; + + Если ПКС.ПоискПоДатеНаРавенство Тогда + + УстановитьАтрибут(УзелКоллекцииСвойств, "ПоискПоДатеНаРавенство", "true"); + + КонецЕсли; + + + // Возможно правило конвертации уже определено + Если Не ПустаяСтрока(ИмяПКО) Тогда + + ПКОСвойств = Правила[ИмяПКО]; + + Иначе + + ПКОСвойств = Неопределено; + + КонецЕсли; + + + // Попытка определить тип свойства приемника + Если ПустаяСтрока(ТипПриемника) И ПКОСвойств <> Неопределено Тогда + + ТипПриемника = ПКОСвойств.Приемник; + УстановитьАтрибут(УзелСвойства, "Тип", ТипПриемника); + + ИначеЕсли НЕ ВыполнитьОбменДаннымиВОптимизированномФормате + И Не ПустаяСтрока(ТипПриемника) Тогда + + УстановитьАтрибут(УзелСвойства, "Тип", ТипПриемника); + + КонецЕсли; + + // Определяем конвертируемое значение + Если Выражение <> Неопределено Тогда + + одЗаписатьЭлемент(УзелСвойства, "Выражение", Выражение); + ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелСвойства); + Продолжить; + + ИначеЕсли Пусто Тогда + + Если ПустаяСтрока(ТипПриемника) Тогда + + Продолжить; + + КонецЕсли; + + Если НЕ ВыполнитьОбменДаннымиВОптимизированномФормате Тогда + одЗаписатьЭлемент(УзелСвойства, "Пусто"); + КонецЕсли; + + ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелСвойства); + Продолжить; + + Иначе + + ПолучитьЗначениеСвойства(Значение, ОбъектКоллекции, ПКО, ПКС, ВходящиеДанные, Источник); + + Если ПКС.ПриводитьКДлине <> 0 Тогда + + ВыполнитьПриведениеЗначенияКДлине(Значение, ПКС); + + КонецЕсли; + + КонецЕсли; + + + СтароеЗначениеДоОбработчикаПриВыгрузке = Значение; + Пусто = одПустое(Значение, ЭтоNULL); + + + // Обработчик ПриВыгрузке + Если ПКС.ЕстьОбработчикПриВыгрузке Тогда + + Отказ = Ложь; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКС, "ПриВыгрузке")); + + Иначе + + Выполнить(ПКС.ПриВыгрузке); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(56, ОписаниеОшибки(), ПКО, ПКС, Источник, + "ПриВыгрузкеСвойства", Значение); + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки свойства + + Продолжить; + + КонецЕсли; + + КонецЕсли; + + + // Инициализируем еще раз переменную Пусто, может быть Значение было изменено + // в обработчике "При выгрузке" + Если СтароеЗначениеДоОбработчикаПриВыгрузке <> Значение Тогда + + Пусто = одПустое(Значение, ЭтоNULL); + + КонецЕсли; + + Если Пусто Тогда + + Если ЭтоNULL + Или Значение = Неопределено Тогда + + Продолжить; + + КонецЕсли; + + Если ПустаяСтрока(ТипПриемника) Тогда + + ТипПриемника = ОпределитьТипДанныхДляПриемника(Значение); + + Если Не ПустаяСтрока(ТипПриемника) Тогда + + УстановитьАтрибут(УзелСвойства, "Тип", ТипПриемника); + + КонецЕсли; + + КонецЕсли; + + // если тип множественный, то возможно это пустая ссылка и выгрузить ее нужно именно с указанием типа + Если НЕ ВыполнитьОбменДаннымиВОптимизированномФормате Тогда + одЗаписатьЭлемент(УзелСвойства, "Пусто"); + КонецЕсли; + + ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелСвойства); + Продолжить; + + КонецЕсли; + + + УзелСсылки = Неопределено; + + Если (ПКОСвойств <> Неопределено) + Или (Не ПустаяСтрока(ИмяПКО)) Тогда + + УзелСсылки = ВыгрузитьДанныеСсылочногоОбъекта(Значение, ИсходящиеДанные, ИмяПКО, ПКОСвойств, ТипПриемника, УзелСвойства, ВыгрузитьТолькоСсылку); + + Если УзелСсылки = Неопределено Тогда + Продолжить; + КонецЕсли; + + Иначе + + СвойствоУстановлено = Ложь; + ТипЗначения = ТипЗнч(Значение); + ДобавитьЗначениеСвойстваВУзел(Значение, ТипЗначения, ТипПриемника, УзелСвойства, СвойствоУстановлено); + + Если НЕ СвойствоУстановлено Тогда + + МенеджерЗначения = Менеджеры[ТипЗначения]; + + Если МенеджерЗначения = Неопределено Тогда + Продолжить; + КонецЕсли; + + ПКОСвойств = МенеджерЗначения.ПКО; + + Если ПКОСвойств = Неопределено Тогда + Продолжить; + КонецЕсли; + + ИмяПКО = ПКОСвойств.Имя; + + УзелСсылки = ВыгрузитьДанныеСсылочногоОбъекта(Значение, ИсходящиеДанные, ИмяПКО, ПКОСвойств, ТипПриемника, УзелСвойства, ВыгрузитьТолькоСсылку); + + Если УзелСсылки = Неопределено Тогда + Продолжить; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + + + // Обработчик ПослеВыгрузки + + Если ПКС.ЕстьОбработчикПослеВыгрузки Тогда + + Отказ = Ложь; + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКС, "ПослеВыгрузки")); + + Иначе + + Выполнить(ПКС.ПослеВыгрузки); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПКС(57, ОписаниеОшибки(), ПКО, ПКС, Источник, + "ПослеВыгрузкиСвойства", Значение); + + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки свойства + + Продолжить; + + КонецЕсли; + + КонецЕсли; + + + ДобавитьПодчиненный(УзелКоллекцииСвойств, УзелСвойства); + + КонецЦикла; // по ПКС + +КонецПроцедуры // ВыгрузитьСвойства() + +// Производит выгрузку объекта в соответствии с указанным правилом конвертации +// +// Параметры: +// Источник - произвольный источник данных +// Приемник - xml-узел объекта приемника +// ВходящиеДанные - произвольные вспомогательные данные, передаваемые правилу +// для выполнения конвертации +// ИсходящиеДанные - произвольные вспомогательные данные, передаваемые правилам +// конвертации свойств +// ИмяПКО - имя правила конвертации, согласно которому осуществляется выгрузка +// УзелСсылки - xml-узел ссылки объекта приемника +// ТолькоПолучитьУзелСсылки - если Истина, то выгрузка объекта не производится, только формируется +// xml-узел ссылки +// ПКО - ссылка на правило конвертации +// +// Возвращаемое значение: +// xml-узел ссылки или значение приемника +// +Функция ВыгрузитьПоПравилу(Источник = Неопределено, + Приемник = Неопределено, + ВходящиеДанные = Неопределено, + ИсходящиеДанные = Неопределено, + ИмяПКО = "", + УзелСсылки = Неопределено, + ТолькоПолучитьУзелСсылки = Ложь, + ПКО = Неопределено, + ЭтоПравилоСГлобальнойВыгрузкойОбъектов = Ложь, + ВыборкаДляВыгрузкиДанных = Неопределено) Экспорт + + #Если Клиент Тогда + ОбработкаПрерыванияПользователя(); + #КонецЕсли + + // Поиск ПКО + Если ПКО = Неопределено Тогда + + ПКО = НайтиПравило(Источник, ИмяПКО); + + ИначеЕсли (Не ПустаяСтрока(ИмяПКО)) + И ПКО.Имя <> ИмяПКО Тогда + + ПКО = НайтиПравило(Источник, ИмяПКО); + + КонецЕсли; + + Если ПКО = Неопределено Тогда + + ЗП = ПолучитьСтруктуруЗаписиПротокола(45); + + ЗП.Объект = Источник; + Попытка + ЗП.ТипОбъекта = ТипЗнч(Источник); + Исключение + КонецПопытки; + + ЗаписатьВПротоколВыполнения(45, ЗП, Истина); // не найдено ПКО + Возврат Неопределено; + + КонецЕсли; + + Если ФлагКомментироватьОбработкуОбъектов Тогда + + Попытка + ИсточникВСтроку = Строка(Источник); + Исключение + ИсточникВСтроку = " "; + КонецПопытки; + + ПрОбъекта = ИсточникВСтроку + " (" + ТипЗнч(Источник) + ")"; + + СтрокаНазванияПКО = " ПКО: " + СокрЛП(ИмяПКО) + " (" + СокрЛП(ПКО.Наименование) + ")"; + + Если ТолькоПолучитьУзелСсылки Тогда + СтрокаПользователю = "Конвертация ссылки на объект: "; + Иначе + СтрокаПользователю = "Конвертация объекта: "; + КонецЕсли; + + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу + 1; + + ЗаписатьВПротоколВыполнения(СтрокаПользователю + ПрОбъекта + СтрокаНазванияПКО, , Ложь, ТекущийУровеньВложенностиВыгрузитьПоПравилу + 1, 7); + + КонецЕсли; + + ЭтоПравилоСГлобальнойВыгрузкойОбъектов = ВыполнитьОбменДаннымиВОптимизированномФормате И ПКО.ИспользоватьБыстрыйПоискПриЗагрузке; + + ЗапоминатьВыгруженные = ПКО.ЗапоминатьВыгруженные; + ВыгруженныеОбъекты = ПКО.Выгруженные; + ВыгруженныеОбъектыТолькоСсылки = ПКО.ВыгруженныеТолькоСсылки; + ВсеОбъектыВыгружены = ПКО.ВсеОбъектыВыгружены; + НеЗамещатьОбъектПриЗагрузке = ПКО.НеЗамещать; + НеСоздаватьЕслиНеНайден = ПКО.НеСоздаватьЕслиНеНайден; + ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD = ПКО.ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD; + + ПрефиксАвтонумерации = ""; + РежимЗаписи = ""; + РежимПроведения = ""; + СписокВременныхФайлов = Неопределено; + + ИмяТипа = ""; + СтруктураСвойств = Менеджеры[ПКО.Источник]; + Если СтруктураСвойств = Неопределено Тогда + СтруктураСвойств = Менеджеры[ТипЗнч(Источник)]; + КонецЕсли; + + Если СтруктураСвойств <> Неопределено Тогда + ИмяТипа = СтруктураСвойств.ИмяТипа; + КонецЕсли; + + // КлючВыгружаемыхДанных + + Если (Источник <> Неопределено) И ЗапоминатьВыгруженные Тогда + Если ИмяТипа = "РегистрСведений" ИЛИ ИмяТипа = "Константы" ИЛИ ПустаяСтрока(ИмяТипа) Тогда + ЗапоминатьВыгруженные = Ложь; + Иначе + КлючВыгружаемыхДанных = ЗначениеВСтрокуВнутр(Источник); + КонецЕсли; + Иначе + КлючВыгружаемыхДанных = ИмяПКО; + ЗапоминатьВыгруженные = Ложь; + КонецЕсли; + + + // Переменная для хранения имени предопределенного элемента + ИмяПредопределенногоЭлемента = Неопределено; + + // Глобальный обработчик ПередКонвертациейОбъекта + Отказ = Ложь; + Если ЕстьГлобальныйОбработчикПередКонвертациейОбъекта Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Конвертация, "ПередКонвертациейОбъекта")); + + Иначе + + Выполнить(Конвертация.ПередКонвертациейОбъекта); + + КонецЕсли; + + Исключение + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(64, ОписаниеОшибки(), ПКО, Источник, "ПередКонвертациейОбъекта (глобальный)"); + КонецПопытки; + + Если Отказ Тогда // Отказ от дальнейшей обработки правила + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат Приемник; + КонецЕсли; + + КонецЕсли; + + + // Обработчик ПередВыгрузкой + Если ПКО.ЕстьОбработчикПередВыгрузкой Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКО, "ПередВыгрузкой")); + + Иначе + + Выполнить(ПКО.ПередВыгрузкой); + + КонецЕсли; + + Исключение + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(41, ОписаниеОшибки(), ПКО, Источник, "ПередВыгрузкойОбъекта"); + КонецПопытки; + + Если Отказ Тогда // Отказ от дальнейшей обработки правила + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат Приемник; + КонецЕсли; + + КонецЕсли; + + // Возможно такие данные уже выгружались + Если Не ВсеОбъектыВыгружены Тогда + + Нпп = 0; + + Если ЗапоминатьВыгруженные Тогда + + УзелСсылки = ВыгруженныеОбъекты[КлючВыгружаемыхДанных]; + Если УзелСсылки <> Неопределено Тогда + + Если ТолькоПолучитьУзелСсылки Тогда + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат УзелСсылки; + КонецЕсли; + + НомерВыгруженнойСсылки = ВыгруженныеОбъектыТолькоСсылки[КлючВыгружаемыхДанных]; + Если НомерВыгруженнойСсылки = Неопределено Тогда + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат УзелСсылки; + Иначе + + СтрокаВСтекеВыгрузки = мСтекВызововВыгрузкиДанных.Найти(КлючВыгружаемыхДанных, "Ссылка"); + + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат Неопределено; + КонецЕсли; + + СтрокаВСтекеВыгрузки = мСтекВызововВыгрузкиДанных.Добавить(); + СтрокаВСтекеВыгрузки.Ссылка = КлючВыгружаемыхДанных; + + Нпп = НомерВыгруженнойСсылки; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если Нпп = 0 Тогда + + мСчетчикНПП = мСчетчикНПП + 1; + Нпп = мСчетчикНПП; + + КонецЕсли; + + // Это позволит избежать циклических ссылок + Если ЗапоминатьВыгруженные Тогда + + ВыгруженныеОбъекты[КлючВыгружаемыхДанных] = Нпп; + Если ТолькоПолучитьУзелСсылки Тогда + ВыгруженныеОбъектыТолькоСсылки[КлючВыгружаемыхДанных] = Нпп; + Иначе + СтрокаВСтекеВыгрузки = мСтекВызововВыгрузкиДанных.Добавить(); + СтрокаВСтекеВыгрузки.Ссылка = КлючВыгружаемыхДанных; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + СоответствиеЗначений = ПКО.Значения; + КоличествоЭлементовСоответствияЗначений = СоответствиеЗначений.Количество(); + + // Обработка соответствий предопределенных элементов + Если ПлатформаПриемника = "V8" Тогда + + // если имя предопределенного элемента пока не определено, то попытаемся его определить + Если ИмяПредопределенногоЭлемента = Неопределено Тогда + + Если СтруктураСвойств <> Неопределено + И КоличествоЭлементовСоответствияЗначений > 0 + И СтруктураСвойств.ВозможенПоискПоПредопределенным Тогда + + Попытка + ИмяПредопределенногоИсточник = СтруктураСвойств.Менеджер.ПолучитьИмяПредопределенного(Источник); + Исключение + ИмяПредопределенногоИсточник = ""; + КонецПопытки; + + Иначе + + ИмяПредопределенногоИсточник = ""; + + Конецесли; + + Если НЕ ПустаяСтрока(ИмяПредопределенногоИсточник) + И КоличествоЭлементовСоответствияЗначений > 0 Тогда + + ИмяПредопределенногоЭлемента = СоответствиеЗначений[Источник]; + + Иначе + ИмяПредопределенногоЭлемента = Неопределено; + КонецЕсли; + + КонецЕсли; + + Если ИмяПредопределенногоЭлемента <> Неопределено Тогда + КоличествоЭлементовСоответствияЗначений = 0; + КонецЕсли; + + Иначе + ИмяПредопределенногоЭлемента = Неопределено; + КонецЕсли; + + НеНужноВыгружатьПоСоответствиюЗначений = (КоличествоЭлементовСоответствияЗначений = 0); + + Если Не НеНужноВыгружатьПоСоответствиюЗначений Тогда + + // если нет объекта в соответствии значений - выгружаем его штатным образом + УзелСсылки = СоответствиеЗначений[Источник]; + Если УзелСсылки = Неопределено + И ПКО.СвойстваПоиска.Количество() > 0 Тогда + + // возможно это конвертация из перечисления в перечисление и мы просто не нашли по + //ПКЗ нужное свойство - тогда просто выгружаем пустую ссылку и все + Если СтруктураСвойств.ИмяТипа = "Перечисление" + И Найти(ПКО.Приемник, "ПеречислениеСсылка.") > 0 Тогда + + УзелСсылки = ""; + + Иначе + + НеНужноВыгружатьПоСоответствиюЗначений = Истина; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + НужноЗапоминатьОбъект = ЗапоминатьВыгруженные И (Не ВсеОбъектыВыгружены); + + Если НеНужноВыгружатьПоСоответствиюЗначений Тогда + + Если ПКО.СвойстваПоиска.Количество() > 0 + ИЛИ ИмяПредопределенногоЭлемента <> Неопределено Тогда + + // Формируем узел ссылки + УзелСсылки = СоздатьУзел("Ссылка"); + + Если НужноЗапоминатьОбъект Тогда + + Если ЭтоПравилоСГлобальнойВыгрузкойОбъектов Тогда + УстановитьАтрибут(УзелСсылки, "ГНпп", Нпп); + Иначе + УстановитьАтрибут(УзелСсылки, "Нпп", Нпп); + КонецЕсли; + + КонецЕсли; + + ВыгрузитьТолькоСсылку = ПКО.НеВыгружатьОбъектыСвойствПоСсылкам ИЛИ ТолькоПолучитьУзелСсылки; + + Если НеСоздаватьЕслиНеНайден Тогда + УстановитьАтрибут(УзелСсылки, "НеСоздаватьЕслиНеНайден", НеСоздаватьЕслиНеНайден); + КонецЕсли; + + Если ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD Тогда + УстановитьАтрибут(УзелСсылки, "ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD", ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD); + КонецЕсли; + + ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКО.СвойстваПоиска, + УзелСсылки, ВыборкаДляВыгрузкиДанных, ИмяПредопределенногоЭлемента, ПКО.НеВыгружатьОбъектыСвойствПоСсылкам ИЛИ ТолькоПолучитьУзелСсылки); + + УзелСсылки.ЗаписатьКонецЭлемента(); + УзелСсылки = УзелСсылки.Закрыть(); + + Если НужноЗапоминатьОбъект Тогда + + ВыгруженныеОбъекты[КлючВыгружаемыхДанных] = УзелСсылки; + + КонецЕсли; + + Иначе + УзелСсылки = Нпп; + КонецЕсли; + + Иначе + + // Поиск в соответствии значений по ПКЗ + Если УзелСсылки = Неопределено Тогда + // по Соответствию значений не нашли - пробуем найти по свойствам поиска + СтруктураЗаписи = Новый Структура("Источник,ТипИсточника", Источник, ТипЗнч(Источник)); + ЗаписатьВПротоколВыполнения(71, СтруктураЗаписи); + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + мСтекВызововВыгрузкиДанных.Удалить(СтрокаВСтекеВыгрузки); + КонецЕсли; + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат Неопределено; + КонецЕсли; + + Если ЗапоминатьВыгруженные Тогда + ВыгруженныеОбъекты[КлючВыгружаемыхДанных] = УзелСсылки; + КонецЕсли; + + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + мСтекВызововВыгрузкиДанных.Удалить(СтрокаВСтекеВыгрузки); + КонецЕсли; + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат УзелСсылки; + + КонецЕсли; + + + Если ТолькоПолучитьУзелСсылки + Или ВсеОбъектыВыгружены Тогда + + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + мСтекВызововВыгрузкиДанных.Удалить(СтрокаВСтекеВыгрузки); + КонецЕсли; + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат УзелСсылки; + + КонецЕсли; + + Если Приемник = Неопределено Тогда + + Приемник = СоздатьУзел("Объект"); + + Если ЭтоПравилоСГлобальнойВыгрузкойОбъектов Тогда + УстановитьАтрибут(Приемник, "ГНпп", Нпп); + Иначе + УстановитьАтрибут(Приемник, "Нпп", Нпп); + КонецЕсли; + + УстановитьАтрибут(Приемник, "Тип", ПКО.Приемник); + УстановитьАтрибут(Приемник, "ИмяПравила", ПКО.Имя); + + Если НеЗамещатьОбъектПриЗагрузке Тогда + УстановитьАтрибут(Приемник, "НеЗамещать", "true"); + КонецЕсли; + + Если Не ПустаяСтрока(ПрефиксАвтонумерации) Тогда + УстановитьАтрибут(Приемник, "ПрефиксАвтонумерации", ПрефиксАвтонумерации); + КонецЕсли; + + Если Не ПустаяСтрока(РежимЗаписи) Тогда + УстановитьАтрибут(Приемник, "РежимЗаписи", РежимЗаписи); + Если Не ПустаяСтрока(РежимПроведения) Тогда + УстановитьАтрибут(Приемник, "РежимПроведения", РежимПроведения); + КонецЕсли; + КонецЕсли; + + Если ТипЗнч(УзелСсылки) <> одТипЧисло Тогда + ДобавитьПодчиненный(Приемник, УзелСсылки); + КонецЕсли; + + КонецЕсли; + + // Обработчик ПриВыгрузке + СтандартнаяОбработка = Истина; + Отказ = Ложь; + + Если ПКО.ЕстьОбработчикПриВыгрузке Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКО, "ПриВыгрузке")); + + Иначе + + Выполнить(ПКО.ПриВыгрузке); + + КонецЕсли; + + Исключение + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(42, ОписаниеОшибки(), ПКО, Источник, "ПриВыгрузкеОбъекта"); + КонецПопытки; + + Если Отказ Тогда // отказ от записи объекта в файл + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + мСтекВызововВыгрузкиДанных.Удалить(СтрокаВСтекеВыгрузки); + КонецЕсли; + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат УзелСсылки; + КонецЕсли; + + КонецЕсли; + + // Выгрузка свойств + Если СтандартнаяОбработка Тогда + + ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКО.Свойства, , ВыборкаДляВыгрузкиДанных, , + ПКО.НеВыгружатьОбъектыСвойствПоСсылкам ИЛИ ТолькоПолучитьУзелСсылки, СписокВременныхФайлов); + + КонецЕсли; + + // Обработчик ПослеВыгрузки + Если ПКО.ЕстьОбработчикПослеВыгрузки Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКО, "ПослеВыгрузки")); + + Иначе + + Выполнить(ПКО.ПослеВыгрузки); + + КонецЕсли; + + Исключение + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(43, ОписаниеОшибки(), ПКО, Источник, "ПослеВыгрузкиОбъекта"); + КонецПопытки; + + Если Отказ Тогда // отказ от записи объекта в файл + + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + мСтекВызововВыгрузкиДанных.Удалить(СтрокаВСтекеВыгрузки); + КонецЕсли; + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + Возврат УзелСсылки; + + КонецЕсли; + + КонецЕсли; + + Если СписокВременныхФайлов = Неопределено Тогда + + // Запись объекта в файл + Приемник.ЗаписатьКонецЭлемента(); + + ЗаписатьВФайл(Приемник); + + Иначе + + ЗаписатьВФайл(Приемник); + + ВременныйФайл = Новый ЧтениеТекста; + Для каждого ИмяВременногоФайла Из СписокВременныхФайлов Цикл + + Попытка + ВременныйФайл.Открыть(ИмяВременногоФайла, КодировкаТекста.UTF8); + Исключение + Продолжить; + КонецПопытки; + + СтрокаВременногоФайла = ВременныйФайл.ПрочитатьСтроку(); + Пока СтрокаВременногоФайла <> Неопределено Цикл + ЗаписатьВФайл(СтрокаВременногоФайла); + СтрокаВременногоФайла = ВременныйФайл.ПрочитатьСтроку(); + КонецЦикла; + + ВременныйФайл.Закрыть(); + + // удалить файлы + Попытка + УдалитьФайлы(ИмяВременногоФайла); + Исключение + КонецПопытки; + + КонецЦикла; + + ЗаписатьВФайл(""); + + КонецЕсли; + + мСчетчикВыгруженныхОбъектов = 1 + мСчетчикВыгруженныхОбъектов; + + Если НужноЗапоминатьОбъект Тогда + + Если ЭтоПравилоСГлобальнойВыгрузкойОбъектов Тогда + ВыгруженныеОбъекты[КлючВыгружаемыхДанных] = НПП; + КонецЕсли; + + КонецЕсли; + + + #Если Клиент Тогда + Если КоличествоОбработанныхОбъектовДляОбновленияСтатуса > 0 + И мСчетчикВыгруженныхОбъектов % КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 0 Тогда + + Попытка + ИмяМетаданных = ТипЗнч(Источник); + Исключение + ИмяМетаданных = ""; + КонецПопытки; + + Попытка + + Состояние("Выгрузка объектов """ + Строка(Источник) + + """. Выгружено: " + Строка(мСчетчикВыгруженныхОбъектов) + + " Объект: " + ИмяМетаданных); + + Исключение + + Состояние("Выгрузка объектов """ + + """. Выгружено: " + Строка(мСчетчикВыгруженныхОбъектов) + + " Объект: " + ИмяМетаданных); + + КонецПопытки; + + КонецЕсли; + #КонецЕсли + + Если СтрокаВСтекеВыгрузки <> Неопределено Тогда + мСтекВызововВыгрузкиДанных.Удалить(СтрокаВСтекеВыгрузки); + КонецЕсли; + + ТекущийУровеньВложенностиВыгрузитьПоПравилу = ТекущийУровеньВложенностиВыгрузитьПоПравилу - 1; + + // Обработчик ПослеВыгрузкиВФайл + Если ПКО.ЕстьОбработчикПослеВыгрузкиВФайл Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПКО, "ПослеВыгрузкиВФайл")); + + Иначе + + Выполнить(ПКО.ПослеВыгрузкиВФайл); + + КонецЕсли; + + Исключение + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(76, ОписаниеОшибки(), ПКО, Источник, "ЕстьОбработчикПослеВыгрузкиВФайл"); + КонецПопытки; + + КонецЕсли; + + Возврат УзелСсылки; + +КонецФункции // ВыгрузитьПоПравилу() + +// Производит выгрузку объекта выборки в соответствии с указанным правилом +// +// Параметры: +// Объект - выгружаемый объект выборки +// Правило - ссылка на правило выгрузки данных +// Свойства - свойства объекта метаданного выгружаемого объекта +// ВходящиеДанные - произвольные вспомогательные данные +// +Процедура ВыгрузкаОбъектаВыборки(Объект, Правило, Свойства=Неопределено, ВходящиеДанные=Неопределено, ВыборкаДляВыгрузкиДанных = Неопределено) + + Если ФлагКомментироватьОбработкуОбъектов Тогда + + Попытка + ПрОбъекта = Строка(Объект) + " (" + ТипЗнч(Объект) + ")"; + Исключение + ПрОбъекта = ТипЗнч(Объект); + КонецПопытки; + + ЗаписатьВПротоколВыполнения("ВЫГРУЗКА ОБЪЕКТА: " + ПрОбъекта, , Ложь, 1, 7); + + КонецЕсли; + + + ИмяПКО = Правило.ПравилоКонвертации; + Отказ = Ложь; + ИсходящиеДанные = Неопределено; + + + // Глобальный обработчик ПередВыгрузкойОбъекта + Если ЕстьГлобальныйОбработчикПередВыгрузкойОбъекта Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Конвертация, "ПередВыгрузкойОбъекта")); + + Иначе + + Выполнить(Конвертация.ПередВыгрузкойОбъекта); + + КонецЕсли; + + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(65, ОписаниеОшибки(), Правило.Имя, Объект, "ПередВыгрузкойОбъектаВыборки (глобальный)"); + КонецПопытки; + + Если Отказ Тогда + Возврат; + КонецЕсли; + + КонецЕсли; + + // Обработчик ПередВыгрузкой + Если Не ПустаяСтрока(Правило.ПередВыгрузкой) Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Правило, "ПередВыгрузкой")); + + Иначе + + Выполнить(Правило.ПередВыгрузкой); + + КонецЕсли; + + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(33, ОписаниеОшибки(), Правило.Имя, Объект, "ПередВыгрузкойОбъектаВыборки"); + КонецПопытки; + + Если Отказ Тогда + Возврат; + КонецЕсли; + + КонецЕсли; + + УзелСсылки = Неопределено; + + ВыгрузитьПоПравилу(Объект, , ИсходящиеДанные, , ИмяПКО, УзелСсылки, , , , ВыборкаДляВыгрузкиДанных); + + + // Глобальный обработчик ПослеВыгрузкиОбъекта + Если ЕстьГлобальныйОбработчикПослеВыгрузкиОбъекта Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Конвертация, "ПослеВыгрузкиОбъекта")); + + Иначе + + Выполнить(Конвертация.ПослеВыгрузкиОбъекта); + + КонецЕсли; + + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(69, ОписаниеОшибки(), Правило.Имя, Объект, "ПослеВыгрузкиОбъектаВыборки (глобальный)"); + КонецПопытки; + + КонецЕсли; + + + // Обработчик ПослеВыгрузки + Если Не ПустаяСтрока(Правило.ПослеВыгрузки) Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Правило, "ПослеВыгрузки")); + + Иначе + + Выполнить(Правило.ПослеВыгрузки); + + КонецЕсли; + + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(34, ОписаниеОшибки(), Правило.Имя, Объект, "ПослеВыгрузкиОбъектаВыборки"); + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры // ВыгрузкаОбъектаВыборки() + +Функция ПолучитьИмяПервогоРеквизитаМетаданных(МетаданныеОбъекта) + + Попытка + Возврат МетаданныеОбъекта.Реквизиты[0].Имя; + Исключение + Возврат ""; + КонецПопытки; + +КонецФункции + +// Возвращает фрагмент текста языка запросов, который выражает условие ограничения на интервал дат +// +Функция ПолучитьСтрокуОграниченияПоДатеДляЗапроса(Свойства, ИмяТипа, ИмяГруппыТаблицы, ВыборкаДляОчисткиДанных = Ложь) Экспорт + + ИтоговоеОграничениеПоДате = ""; + + Если НЕ (ИмяТипа = "Документ" ИЛИ ИмяТипа = "РегистрСведений") Тогда + Возврат ИтоговоеОграничениеПоДате; + КонецЕсли; + + Если ИмяТипа = "РегистрСведений" Тогда + + Непериодический = НЕ Свойства.Периодический; + НеНужноОграничениеПоДатам = ВыборкаДляОчисткиДанных ИЛИ Непериодический; + + Если НеНужноОграничениеПоДатам Тогда + Возврат ИтоговоеОграничениеПоДате; + КонецЕсли; + + КонецЕсли; + + ИмяПоляОграничения = ИмяГруппыТаблицы + "." + ?(ИмяТипа = "Документ", "Дата", "Период"); + + Если ДатаНачала <> ЗначениеПустаяДата Тогда + + ИтоговоеОграничениеПоДате = " + | ГДЕ + | " + ИмяПоляОграничения + " >= &ДатаНачала"; + + КонецЕсли; + + Если ДатаОкончания <> ЗначениеПустаяДата Тогда + + Если ПустаяСтрока(ИтоговоеОграничениеПоДате) Тогда + + ИтоговоеОграничениеПоДате = " + | ГДЕ + | " + ИмяПоляОграничения + " <= &ДатаОкончания"; + + Иначе + + ИтоговоеОграничениеПоДате = ИтоговоеОграничениеПоДате + " + | И + | " + ИмяПоляОграничения + " <= &ДатаОкончания"; + + КонецЕсли; + + КонецЕсли; + + Возврат ИтоговоеОграничениеПоДате; + +КонецФункции + +Функция ПолучитьРезультатЗапросаДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, + ВыборкаДляОчисткиДанных = Ложь, УдалятьОбъектыНепосредственно = Ложь, ВыбиратьВсеПоля = Истина) Экспорт + + СтрокаРазрешения = ?(ВыгружатьТолькоРазрешенные, " РАЗРЕШЕННЫЕ ", ""); + + СтрокаВыбораПолей = ?(ВыбиратьВсеПоля, " * ", " ОбъектДляВыгрузки.Ссылка КАК Ссылка "); + + Если ИмяТипа = "Справочник" + ИЛИ ИмяТипа = "ПланВидовХарактеристик" + ИЛИ ИмяТипа = "ПланСчетов" + ИЛИ ИмяТипа = "ПланВидовРасчета" + ИЛИ ИмяТипа = "РегистрБухгалтерии" + ИЛИ ИмяТипа = "ПланОбмена" + ИЛИ ИмяТипа = "Задача" + ИЛИ ИмяТипа = "БизнесПроцесс" Тогда + + Запрос = Новый Запрос(); + + Если ИмяТипа = "Справочник" Тогда + МетаданныеОбъектов = Метаданные.Справочники[Свойства.Имя]; + ИначеЕсли ИмяТипа = "ПланВидовХарактеристик" Тогда + МетаданныеОбъектов = Метаданные.ПланыВидовХарактеристик[Свойства.Имя]; + ИначеЕсли ИмяТипа = "ПланСчетов" Тогда + МетаданныеОбъектов = Метаданные.ПланыСчетов[Свойства.Имя]; + ИначеЕсли ИмяТипа = "ПланВидовРасчета" Тогда + МетаданныеОбъектов = Метаданные.ПланыВидовРасчета[Свойства.Имя]; + ИначеЕсли ИмяТипа = "РегистрБухгалтерии" Тогда + МетаданныеОбъектов = Метаданные.РегистрыБухгалтерии[Свойства.Имя]; + ИначеЕсли ИмяТипа = "ПланОбмена" Тогда + МетаданныеОбъектов = Метаданные.ПланыОбмена[Свойства.Имя]; + ИначеЕсли ИмяТипа = "Задача" Тогда + МетаданныеОбъектов = Метаданные.Задачи[Свойства.Имя]; + ИначеЕсли ИмяТипа = "БизнесПроцесс" Тогда + МетаданныеОбъектов = Метаданные.БизнесПроцессы[Свойства.Имя]; + КонецЕсли; + + Если ИмяТипа = "РегистрБухгалтерии" Тогда + + СтрокаВыбораПолей = "*"; + ИмяТаблицыДляВыборки = Свойства.Имя + ".ДвиженияССубконто"; + + Иначе + + ИмяТаблицыДляВыборки = Свойства.Имя; + + Если ВыгружатьТолькоРазрешенные + И НЕ ВыбиратьВсеПоля Тогда + + ИмяПервогоРеквизита = ПолучитьИмяПервогоРеквизитаМетаданных(МетаданныеОбъектов); + Если Не ПустаяСтрока(ИмяПервогоРеквизита) Тогда + СтрокаВыбораПолей = СтрокаВыбораПолей + ", ОбъектДляВыгрузки." + ИмяПервогоРеквизита; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Запрос.Текст = "ВЫБРАТЬ " + СтрокаРазрешения + " + | " + СтрокаВыбораПолей + " + |ИЗ + | " + ИмяТипа + "." + ИмяТаблицыДляВыборки + " КАК ОбъектДляВыгрузки + | + |"; + + Если ВыборкаДляОчисткиДанных + И УдалятьОбъектыНепосредственно Тогда + + Если (ИмяТипа = "Справочник" + ИЛИ ИмяТипа = "ПланВидовХарактеристик") Тогда + + Попытка + НужнаИерархия = МетаданныеОбъектов.Иерархический; + Исключение + НужнаИерархия = Ложь + КонецПопытки; + + Если НужнаИерархия Тогда + + Запрос.Текст = Запрос.Текст + " + | ГДЕ ОбъектДляВыгрузки.Родитель = &Родитель + |"; + + Запрос.УстановитьПараметр("Родитель", Свойства.Менеджер.ПустаяСсылка()); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + ИначеЕсли ИмяТипа = "Документ" Тогда + + Если ВыгружатьТолькоРазрешенные Тогда + + ИмяПервогоРеквизита = ПолучитьИмяПервогоРеквизитаМетаданных(Метаданные.Документы[Свойства.Имя]); + Если Не ПустаяСтрока(ИмяПервогоРеквизита) Тогда + СтрокаВыбораПолей = СтрокаВыбораПолей + ", ОбъектДляВыгрузки." + ИмяПервогоРеквизита; + КонецЕсли; + + КонецЕсли; + + ИтоговоеОграничениеПоДате = ПолучитьСтрокуОграниченияПоДатеДляЗапроса(Свойства, ИмяТипа, "ОбъектДляВыгрузки", ВыборкаДляОчисткиДанных); + + Запрос = Новый Запрос(); + + Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); + Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); + + Запрос.Текст = "ВЫБРАТЬ " + СтрокаРазрешения + " + | " + СтрокаВыбораПолей + " + |ИЗ + | " + ИмяТипа + "." + Свойства.Имя + " КАК ОбъектДляВыгрузки + | + |" + ИтоговоеОграничениеПоДате; + + + ИначеЕсли ИмяТипа = "РегистрСведений" Тогда + + Непериодический = НЕ Свойства.Периодический; + ПодчиненныйРегистратору = Свойства.ПодчиненныйРегистратору; + + ИтоговоеОграничениеПоДате = ПолучитьСтрокуОграниченияПоДатеДляЗапроса(Свойства, ИмяТипа, "ОбъектДляВыгрузки", ВыборкаДляОчисткиДанных); + + Запрос = Новый Запрос(); + + Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); + Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); + + СтрокаДополненияПолейВыборкиПодчиненРегистратору = ?(НЕ ПодчиненныйРегистратору, ", NULL КАК Активность, + | NULL КАК Регистратор, + | NULL КАК НомерСтроки", ""); + + СтрокаДополненияПолейВыборкиПериодичность = ?(Непериодический, ", NULL КАК Период", ""); + + Запрос.Текст = "ВЫБРАТЬ " + СтрокаРазрешения + " + | * + | + | " + СтрокаДополненияПолейВыборкиПодчиненРегистратору + " + | " + СтрокаДополненияПолейВыборкиПериодичность + " + | + |ИЗ + | " + ИмяТипа + "." + Свойства.Имя + " КАК ОбъектДляВыгрузки + | + |" + ИтоговоеОграничениеПоДате; + + Иначе + + Возврат Неопределено; + + КонецЕсли; + + Возврат Запрос.Выполнить(); + +КонецФункции + +Функция ПолучитьВыборкуДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, + ВыборкаДляОчисткиДанных = Ложь, УдалятьОбъектыНепосредственно = Ложь, ВыбиратьВсеПоля = Истина) Экспорт + + РезультатЗапроса = ПолучитьРезультатЗапросаДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, + ВыборкаДляОчисткиДанных, УдалятьОбъектыНепосредственно, ВыбиратьВсеПоля); + + Если РезультатЗапроса = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Выборка = РезультатЗапроса.Выбрать(); + + #Если Клиент Тогда + Если ВыборкаДляОчисткиДанных Тогда + Состояние("Очистка " + ИмяТипа + ": " + Свойства.Имя); + Иначе + Состояние("Выгрузка " + ИмяТипа + ": " + Свойства.Имя); + КонецЕсли; + #КонецЕсли + + + Возврат Выборка; + +КонецФункции + +Функция ПолучитьВыборкуДляВыгрузкиСОграничениями(Правило, ВыборкаДляПодстановкиВПКО = Неопределено, Свойства = Неопределено) + + ИмяМетаданных = Правило.ИмяОбъектаДляЗапроса; + + СтрокаРазрешения = ?(ВыгружатьТолькоРазрешенные, " РАЗРЕШЕННЫЕ ", ""); + + ПоляВыборки = ""; + + ЭтоВыгрузкаРегистра = (Правило.ИмяОбъектаДляЗапроса = Неопределено); + + Если ЭтоВыгрузкаРегистра Тогда + + Непериодический = НЕ Свойства.Периодический; + ПодчиненныйРегистратору = Свойства.ПодчиненныйРегистратору; + + СтрокаДополненияПолейВыборкиПодчиненРегистратору = ?(НЕ ПодчиненныйРегистратору, ", NULL КАК Активность, + | NULL КАК Регистратор, + | NULL КАК НомерСтроки", ""); + + СтрокаДополненияПолейВыборкиПериодичность = ?(Непериодический, ", NULL КАК Период", ""); + + ИтоговоеОграничениеПоДате = ПолучитьСтрокуОграниченияПоДатеДляЗапроса(Свойства, Свойства.ИмяТипа, Правило.ИмяОбъектаДляЗапросаРегистра, Ложь); + + ПостроительОтчета.Текст = "ВЫБРАТЬ " + СтрокаРазрешения + " + | * + | + | " + СтрокаДополненияПолейВыборкиПодчиненРегистратору + " + | " + СтрокаДополненияПолейВыборкиПериодичность + " + | + | ИЗ " + Правило.ИмяОбъектаДляЗапросаРегистра + " + | + |" + ИтоговоеОграничениеПоДате; + + ПостроительОтчета.ЗаполнитьНастройки(); + + Иначе + + Если Правило.ВыбиратьДанныеДляВыгрузкиОднимЗапросом Тогда + + // выбираем все поля объекта при выгрузке + ПоляВыборки = "Объект.*"; + + Иначе + + ПоляВыборки = "Объект.Ссылка КАК Ссылка"; + + КонецЕсли; + + ИтоговоеОграничениеПоДате = ПолучитьСтрокуОграниченияПоДатеДляЗапроса(Свойства, Свойства.ИмяТипа, "Объект", Ложь); + + ПостроительОтчета.Текст = "ВЫБРАТЬ " + СтрокаРазрешения + " " + ПоляВыборки + " ИЗ " + ИмяМетаданных + " КАК Объект + | + |" + ИтоговоеОграничениеПоДате + " + | + |{ГДЕ Объект.Ссылка.* КАК " + СтрЗаменить(ИмяМетаданных, ".", "_") + "}"; + + КонецЕсли; + + ПостроительОтчета.Отбор.Сбросить(); + Если Правило.НастройкиПостроителя <> Неопределено Тогда + ПостроительОтчета.УстановитьНастройки(Правило.НастройкиПостроителя); + КонецЕсли; + + ПостроительОтчета.Параметры.Вставить("ДатаНачала", ДатаНачала); + ПостроительОтчета.Параметры.Вставить("ДатаОкончания", ДатаОкончания); + + ПостроительОтчета.Выполнить(); + Выборка = ПостроительОтчета.Результат.Выбрать(); + + Если Правило.ВыбиратьДанныеДляВыгрузкиОднимЗапросом Тогда + ВыборкаДляПодстановкиВПКО = Выборка; + КонецЕсли; + + Возврат Выборка; + +КонецФункции + +Функция ПолучитьВыборкуДляВыгрузкиПоПроизвольномуАлгоритму(ВыборкаДанных) + + Выборка = Неопределено; + + ТипВыборки = ТипЗнч(ВыборкаДанных); + + Если ТипВыборки = Тип("ВыборкаИзРезультатаЗапроса") Тогда + + Выборка = ВыборкаДанных; + + ИначеЕсли ТипВыборки = Тип("РезультатЗапроса") Тогда + + Выборка = ВыборкаДанных.Выбрать(); + + ИначеЕсли ТипВыборки = Тип("Запрос") Тогда + + РезультатЗапроса = ВыборкаДанных.Выполнить(); + Выборка = РезультатЗапроса.Выбрать(); + + КонецЕсли; + + Возврат Выборка; + +КонецФункции + +Функция ПолучитьСтрокуНабораКонстантДляВыгрузки(ТаблицаДанныхКонстантДляВыгрузки) + + СтрокаНабораКонстант = ""; + + Для Каждого СтрокаТаблицы Из ТаблицаДанныхКонстантДляВыгрузки Цикл + + Если Не ПустаяСтрока(СтрокаТаблицы.Источник) Тогда + + СтрокаНабораКонстант = СтрокаНабораКонстант + ", " + СтрокаТаблицы.Источник; + + КонецЕсли; + + КонецЦикла; + + Если Не ПустаяСтрока(СтрокаНабораКонстант) Тогда + + СтрокаНабораКонстант = Сред(СтрокаНабораКонстант, 3); + + КонецЕсли; + + Возврат СтрокаНабораКонстант; + +КонецФункции + +Процедура ВыгрузитьНаборКонстант(Правило, Свойства, ИсходящиеДанные) + + Если Свойства.ПКО <> Неопределено Тогда + + СтрокаИменНабораКонстант = ПолучитьСтрокуНабораКонстантДляВыгрузки(Свойства.ПКО.Свойства); + + Иначе + + СтрокаИменНабораКонстант = ""; + + КонецЕсли; + + НаборКонстант = Константы.СоздатьНабор(СтрокаИменНабораКонстант); + НаборКонстант.Прочитать(); + ВыгрузкаОбъектаВыборки(НаборКонстант, Правило, Свойства, ИсходящиеДанные); + +КонецПроцедуры + +Функция ОпределитьНужноВыбиратьВсеПоля(Правило) + + НужныВсеПоляДляВыборки = НЕ ПустаяСтрока(Конвертация.ПередВыгрузкойОбъекта) + ИЛИ НЕ ПустаяСтрока(Правило.ПередВыгрузкой) + ИЛИ НЕ ПустаяСтрока(Конвертация.ПослеВыгрузкиОбъекта) + ИЛИ НЕ ПустаяСтрока(Правило.ПослеВыгрузки); + + Возврат НужныВсеПоляДляВыборки; + +КонецФункции + +// Выгружает данные по указанному правилу +// +// Параметры: +// Правило - ссылка на правило выгрузки данных +// +Процедура ВыгрузитьДанныеПоПравилу(Правило) + + ИмяПКО = Правило.ПравилоКонвертации; + + Если Не ПустаяСтрока(ИмяПКО) Тогда + + ПКО = Правила[ИмяПКО]; + + КонецЕсли; + + + Если ФлагКомментироватьОбработкуОбъектов Тогда + + ЗаписатьВПротоколВыполнения("ПРАВИЛО ВЫГРУЗКИ ДАННЫХ: " + СокрЛП(Правило.Имя) + " (" + СокрЛП(Правило.Наименование) + ")", , Ложь, , 4); + + КонецЕсли; + + + // Обработчик ПередОбработкой + Отказ = Ложь; + ИсходящиеДанные = Неопределено; + ВыборкаДанных = Неопределено; + + + Если Не ПустаяСтрока(Правило.ПередОбработкой) Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Правило, "ПередОбработкой")); + + Иначе + + Выполнить(Правило.ПередОбработкой); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(31, ОписаниеОшибки(), Правило.Имя, , "ПередОбработкойВыгрузкиДанных"); + + КонецПопытки; + + Если Отказ Тогда + + Возврат; + + КонецЕсли; + + КонецЕсли; + + + // Стандартная выборка с отбором + Если Правило.СпособОтбораДанных = "СтандартнаяВыборка" И Правило.ИспользоватьОтбор Тогда + + Свойства = Менеджеры[Правило.ОбъектВыборки]; + ИмяТипа = Свойства.ИмяТипа; + + ВыборкаДляПКО = Неопределено; + Выборка = ПолучитьВыборкуДляВыгрузкиСОграничениями(Правило, ВыборкаДляПКО, Свойства); + + ЭтоНеСсылочныйТип = ИмяТипа = "РегистрСведений" + ИЛИ ИмяТипа = "РегистрБухгалтерии"; + + Пока Выборка.Следующий() Цикл + + Если ЭтоНеСсылочныйТип Тогда + ВыгрузкаОбъектаВыборки(Выборка, Правило, Свойства, ИсходящиеДанные); + Иначе + ВыгрузкаОбъектаВыборки(Выборка.Ссылка, Правило, Свойства, ИсходящиеДанные, ВыборкаДляПКО); + КонецЕсли; + + КонецЦикла; + + // Стандартная выборка без отбора + ИначеЕсли (Правило.СпособОтбораДанных = "СтандартнаяВыборка") Тогда + + Свойства = Менеджеры[Правило.ОбъектВыборки]; + ИмяТипа = Свойства.ИмяТипа; + + Если ИмяТипа = "Константы" Тогда + + ВыгрузитьНаборКонстант(Правило, Свойства, ИсходящиеДанные); + + Иначе + + ЭтоНеСсылочныйТип = ИмяТипа = "РегистрСведений" + ИЛИ ИмяТипа = "РегистрБухгалтерии"; + + Если ЭтоНеСсылочныйТип Тогда + + ВыбиратьВсеПоля = ОпределитьНужноВыбиратьВсеПоля(Правило); + + Иначе + + // получаем только ссылку + ВыбиратьВсеПоля = Правило.ВыбиратьДанныеДляВыгрузкиОднимЗапросом; + + КонецЕсли; + + + Выборка = ПолучитьВыборкуДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, , , ВыбиратьВсеПоля); + ВыборкаДляПКО = ?(Правило.ВыбиратьДанныеДляВыгрузкиОднимЗапросом, Выборка, Неопределено); + + Если Выборка = Неопределено Тогда + Возврат; + КонецЕсли; + + Пока Выборка.Следующий() Цикл + + Если ЭтоНеСсылочныйТип Тогда + + ВыгрузкаОбъектаВыборки(Выборка, Правило, Свойства, ИсходящиеДанные); + + Иначе + + ВыгрузкаОбъектаВыборки(Выборка.Ссылка, Правило, Свойства, ИсходящиеДанные, ВыборкаДляПКО); + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + ИначеЕсли Правило.СпособОтбораДанных = "ПроизвольныйАлгоритм" Тогда + + Если ВыборкаДанных <> Неопределено Тогда + + Выборка = ПолучитьВыборкуДляВыгрузкиПоПроизвольномуАлгоритму(ВыборкаДанных); + + Если Выборка <> Неопределено Тогда + + Пока Выборка.Следующий() Цикл + + ВыгрузкаОбъектаВыборки(Выборка, Правило, , ИсходящиеДанные); + + КонецЦикла; + + Иначе + + Для каждого Объект Из ВыборкаДанных Цикл + + ВыгрузкаОбъектаВыборки(Объект, Правило, , ИсходящиеДанные); + + КонецЦикла; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + + // Обработчик ПослеОбработки + + //ВсеОбъектыВыгружены = ПКО.ВсеОбъектыВыгружены; + + Если Не ПустаяСтрока(Правило.ПослеОбработки) Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Правило, "ПослеОбработки")); + + Иначе + + Выполнить(Правило.ПослеОбработки); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ОписаниеОшибки(), Правило.Имя, , "ПослеОбработкиВыгрузкиДанных"); + + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры // ВыгрузитьДанныеПоПравилу() + +// Обходит дерево правил выгрузки данных и выполняет выгрузку +// +// Параметры: +// Строки - Коллекция строк дерева значений +// +Процедура ОбработатьПравилаВыгрузки(Строки, СоответствиеУзловПланаОбменаИСтрокВыгрузки) + + Для каждого ПравилоВыгрузки Из Строки Цикл + + Если ПравилоВыгрузки.Включить = 0 Тогда + + Продолжить; + + КонецЕсли; + + Если (ПравилоВыгрузки.СсылкаНаУзелОбмена <> Неопределено + И НЕ ПравилоВыгрузки.СсылкаНаУзелОбмена.Пустая()) Тогда + + МассивПравилВыгрузки = СоответствиеУзловПланаОбменаИСтрокВыгрузки.Получить(ПравилоВыгрузки.СсылкаНаУзелОбмена); + + Если МассивПравилВыгрузки = Неопределено Тогда + + МассивПравилВыгрузки = Новый Массив(); + + КонецЕсли; + + МассивПравилВыгрузки.Добавить(ПравилоВыгрузки); + + СоответствиеУзловПланаОбменаИСтрокВыгрузки.Вставить(ПравилоВыгрузки.СсылкаНаУзелОбмена, МассивПравилВыгрузки); + + Продолжить; + + КонецЕсли; + + Если ПравилоВыгрузки.ЭтоГруппа Тогда + + ОбработатьПравилаВыгрузки(ПравилоВыгрузки.Строки, СоответствиеУзловПланаОбменаИСтрокВыгрузки); + Продолжить; + + КонецЕсли; + + ВыгрузитьДанныеПоПравилу(ПравилоВыгрузки); + + КонецЦикла; + +КонецПроцедуры // ОбработатьПравилаВыгрузки() + +Функция СкопироватьМассивПравилВыгрузки(ИсходныйМассив) + + РезультирующийМассив = Новый Массив(); + + Для Каждого Элемент Из ИсходныйМассив Цикл + + РезультирующийМассив.Добавить(Элемент); + + КонецЦикла; + + Возврат РезультирующийМассив; + +КонецФункции + +Функция НайтиСтрокуДереваПравилВыгрузкиПоТипуВыгрузки(МассивСтрок, ТипВыгрузки) + + Для Каждого СтрокаМассива Из МассивСтрок Цикл + + Если СтрокаМассива.ОбъектВыборки = ТипВыгрузки Тогда + + Возврат СтрокаМассива; + + КонецЕсли; + + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +Процедура УдалитьСтрокуДереваПравилВыгрузкиПоТипуВыгрузкиИзМассива(МассивСтрок, ЭлементУдаления) + + Счетчик = МассивСтрок.Количество() - 1; + Пока Счетчик >= 0 Цикл + + СтрокаМассива = МассивСтрок[Счетчик]; + + Если СтрокаМассива = ЭлементУдаления Тогда + + МассивСтрок.Удалить(Счетчик); + Возврат; + + КонецЕсли; + + Счетчик = Счетчик - 1; + + КонецЦикла; + +КонецПроцедуры + +Процедура ПолучитьСтрокуПравилВыгрузкиПоОбъектуОбмена(Данные, МетаданныеПоследнегоОбъекта, МетаданныеОбъектаВыгрузки, + ПоследняяСтрокаПравилВыгрузки, ТекущаяСтрокаПравилаВыгрузки, ВременныйМассивПравилКонвертации, ОбъектДляПравилВыгрузки, + ВыгружаетсяРегистр, ВыгружаютсяКонстанты, КонстантыБылиВыгружены) + + ТекущаяСтрокаПравилаВыгрузки = Неопределено; + ОбъектДляПравилВыгрузки = Неопределено; + ВыгружаетсяРегистр = Ложь; + ВыгружаютсяКонстанты = Ложь; + + Если МетаданныеПоследнегоОбъекта = МетаданныеОбъектаВыгрузки + И ПоследняяСтрокаПравилВыгрузки = Неопределено Тогда + + Возврат; + + КонецЕсли; + + СтруктураДанных = МенеджерыДляПлановОбмена[МетаданныеОбъектаВыгрузки]; + + Если СтруктураДанных = Неопределено тогда + + ВыгружаютсяКонстанты = Метаданные.Константы.Содержит(МетаданныеОбъектаВыгрузки); + + Если КонстантыБылиВыгружены + ИЛИ НЕ ВыгружаютсяКонстанты Тогда + + Возврат; + + КонецЕсли; + + // нужно найти правило для констант + Если МетаданныеПоследнегоОбъекта <> МетаданныеОбъектаВыгрузки Тогда + + ТекущаяСтрокаПравилаВыгрузки = НайтиСтрокуДереваПравилВыгрузкиПоТипуВыгрузки(ВременныйМассивПравилКонвертации, Тип("КонстантыНабор")); + + Иначе + + ТекущаяСтрокаПравилаВыгрузки = ПоследняяСтрокаПравилВыгрузки; + + КонецЕсли; + + Возврат; + + КонецЕсли; + + Если СтруктураДанных.ЭтоСсылочныйТип = Истина Тогда + + Если МетаданныеПоследнегоОбъекта <> МетаданныеОбъектаВыгрузки Тогда + + ТекущаяСтрокаПравилаВыгрузки = НайтиСтрокуДереваПравилВыгрузкиПоТипуВыгрузки(ВременныйМассивПравилКонвертации, СтруктураДанных.ТипСсылки); + + Иначе + + ТекущаяСтрокаПравилаВыгрузки = ПоследняяСтрокаПравилВыгрузки; + + КонецЕсли; + + ОбъектДляПравилВыгрузки = Данные.Ссылка; + + ИначеЕсли СтруктураДанных.ЭтоРегистр = Истина Тогда + + Если МетаданныеПоследнегоОбъекта <> МетаданныеОбъектаВыгрузки Тогда + + ТекущаяСтрокаПравилаВыгрузки = НайтиСтрокуДереваПравилВыгрузкиПоТипуВыгрузки(ВременныйМассивПравилКонвертации, СтруктураДанных.ТипСсылки); + + Иначе + + ТекущаяСтрокаПравилаВыгрузки = ПоследняяСтрокаПравилВыгрузки; + + КонецЕсли; + + ОбъектДляПравилВыгрузки = Данные; + + ВыгружаетсяРегистр = Истина; + + КонецЕсли; + +КонецПроцедуры + +Функция ВыполнитьВыгрузкуИзмененныхДанныхДляУзлаОбмена(УзелОбмена, МассивПравилКонвертации, СтруктураДляУдаленияРегистрацииИзменений) + + СтруктураДляУдаленияРегистрацииИзменений.Вставить("МассивПКО", Неопределено); + СтруктураДляУдаленияРегистрацииИзменений.Вставить("НомерСообщения", Неопределено); + + ЗаписьXML = Новый ЗаписьXML(); + ЗаписьXML.УстановитьСтроку(); + + // Создаем новое сообщение + ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); + + ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена); + + // считаем количество записанных объектов + КоличествоНайденныхДляЗаписиОбъектов = 0; + + // начинаем транзакцию + Если ИспользоватьТранзакцииПриВыгрузкеДляПлановОбмена Тогда + НачатьТранзакцию(); + КонецЕсли; + + ПоследнийОбъектМетаданных = Неопределено; + ПоследняяСтрокаПравилаВыгрузки = Неопределено; + + ТекущийОбъектМетаданных = Неопределено; + ТекущаяСтрокаПравилаВыгрузки = Неопределено; + + ИсходящиеДанные = Неопределено; + + ВременныйМассивПравилКонвертации = СкопироватьМассивПравилВыгрузки(МассивПравилКонвертации); + + Отказ = Ложь; + ИсходящиеДанные = Неопределено; + ВыборкаДанных = Неопределено; + + ОбъектДляПравилВыгрузки = Неопределено; + КонстантыБылиВыгружены = Ложь; + + Попытка + + // Получаем выборку изменённых данных + МассивВыгружаемыхМетаданных = Новый Массив(); + + // дополняем массив только теми метаданными по которым есть правила выгрузки - остальные метаданные нас не интересуют + Для Каждого СтрокаПравилаВыгрузки Из ВременныйМассивПравилКонвертации Цикл + + МетаданныеПВД = Метаданные.НайтиПоТипу(СтрокаПравилаВыгрузки.ОбъектВыборки); + МассивВыгружаемыхМетаданных.Добавить(МетаданныеПВД); + + КонецЦикла; + + ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, МассивВыгружаемыхМетаданных); + + СтруктураДляУдаленияРегистрацииИзменений.НомерСообщения = ЗаписьСообщения.НомерСообщения; + + Пока ВыборкаИзменений.Следующий() Цикл + + Данные = ВыборкаИзменений.Получить(); + КоличествоНайденныхДляЗаписиОбъектов = КоличествоНайденныхДляЗаписиОбъектов + 1; + + ТипДанныхДляВыгрузки = ТипЗнч(Данные); + + Удаление = (ТипДанныхДляВыгрузки = одТипУдалениеОбъекта); + + // удаление не отрабатываем + Если Удаление Тогда + Продолжить; + КонецЕсли; + + ТекущийОбъектМетаданных = Данные.Метаданные(); + + // работа с данными полученными из узла обмена + // по данным определяем правило конвертации и производим выгрузку данных + + ВыгружаетсяРегистр = Ложь; + ВыгружаютсяКонстанты = Ложь; + + ПолучитьСтрокуПравилВыгрузкиПоОбъектуОбмена(Данные, ПоследнийОбъектМетаданных, ТекущийОбъектМетаданных, + ПоследняяСтрокаПравилаВыгрузки, ТекущаяСтрокаПравилаВыгрузки, ВременныйМассивПравилКонвертации, ОбъектДляПравилВыгрузки, + ВыгружаетсяРегистр, ВыгружаютсяКонстанты, КонстантыБылиВыгружены); + + + Если ПоследнийОбъектМетаданных <> ТекущийОбъектМетаданных Тогда + + + // после обработки + Если ПоследняяСтрокаПравилаВыгрузки <> Неопределено Тогда + + Если Не ПустаяСтрока(ПоследняяСтрокаПравилаВыгрузки.ПослеОбработки) Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПоследняяСтрокаПравилаВыгрузки, "ПослеОбработки")); + + Иначе + + Выполнить(ПоследняяСтрокаПравилаВыгрузки.ПослеОбработки); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ОписаниеОшибки(), ПоследняяСтрокаПравилаВыгрузки.Имя, , "ПослеОбработкиВыгрузкиДанных"); + + КонецПопытки; + + КонецЕсли; + + КонецЕсли; + + + + // перед обработкой + Если ТекущаяСтрокаПравилаВыгрузки <> Неопределено Тогда + + Если ФлагКомментироватьОбработкуОбъектов Тогда + + ЗаписатьВПротоколВыполнения("ПРАВИЛО ВЫГРУЗКИ ДАННЫХ: " + СокрЛП(ТекущаяСтрокаПравилаВыгрузки.Имя) + " (" + СокрЛП(ТекущаяСтрокаПравилаВыгрузки.Наименование) + ")", , Ложь, , 4); + + КонецЕсли; + + // Обработчик ПередОбработкой + Отказ = Ложь; + ИсходящиеДанные = Неопределено; + ВыборкаДанных = Неопределено; + + Если Не ПустаяСтрока(ТекущаяСтрокаПравилаВыгрузки.ПередОбработкой) Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ТекущаяСтрокаПравилаВыгрузки, "ПередОбработкой")); + + Иначе + + Выполнить(ТекущаяСтрокаПравилаВыгрузки.ПередОбработкой); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(31, ОписаниеОшибки(), ТекущаяСтрокаПравилаВыгрузки.Имя, , "ПередОбработкойВыгрузкиДанных"); + + КонецПопытки; + + КонецЕсли; + + Если Отказ Тогда + + // удаляем правило из массива правил + ТекущаяСтрокаПравилаВыгрузки = Неопределено; + УдалитьСтрокуДереваПравилВыгрузкиПоТипуВыгрузкиИзМассива(ВременныйМассивПравилКонвертации, ТекущаяСтрокаПравилаВыгрузки); + ОбъектДляПравилВыгрузки = Неопределено; + + КонецЕсли; + + КонецЕсли; + + + КонецЕсли; + + + // есть правило по которому нужно делать выгрузку данных + Если ТекущаяСтрокаПравилаВыгрузки <> Неопределено Тогда + + Если ВыгружаетсяРегистр Тогда + + Для Каждого СтрокаРегистра Из ОбъектДляПравилВыгрузки Цикл + ВыгрузкаОбъектаВыборки(СтрокаРегистра, ТекущаяСтрокаПравилаВыгрузки, , ИсходящиеДанные); + КонецЦикла; + + ИначеЕсли ВыгружаютсяКонстанты ТОгда + + Свойства = Менеджеры[ТекущаяСтрокаПравилаВыгрузки.ОбъектВыборки]; + ВыгрузитьНаборКонстант(ТекущаяСтрокаПравилаВыгрузки, Свойства, ИсходящиеДанные); + + Иначе + + ВыгрузкаОбъектаВыборки(ОбъектДляПравилВыгрузки, ТекущаяСтрокаПравилаВыгрузки, , ИсходящиеДанные); + + КонецЕсли; + + КонецЕсли; + + ПоследнийОбъектМетаданных = ТекущийОбъектМетаданных; + ПоследняяСтрокаПравилаВыгрузки = ТекущаяСтрокаПравилаВыгрузки; + + Если КоличествоОбработанныхОбъектовДляОбновленияСтатуса > 0 + И КоличествоНайденныхДляЗаписиОбъектов % КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 0 Тогда + + Попытка + ИмяМетаданных = ТекущийОбъектМетаданных.ПолноеИмя(); + Исключение + ИмяМетаданных = ""; + КонецПопытки; + + #Если Клиент Тогда + Попытка + Состояние("Запись изменений для узла """ + УзелОбмена.Наименование + + """. Прочитано: " + Строка(КоличествоНайденныхДляЗаписиОбъектов) + + " Объект: " + ИмяМетаданных); + Исключение + КонецПопытки; + #КонецЕсли + + КонецЕсли; + + Если ИспользоватьТранзакцииПриВыгрузкеДляПлановОбмена + И (КоличествоЭлементовВТранзакцииПриВыгрузкеДляПлановОбмена > 0) + И (КоличествоНайденныхДляЗаписиОбъектов = КоличествоЭлементовВТранзакцииПриВыгрузкеДляПлановОбмена) Тогда + + // промежуточную транзакцию закрываем и открываем новую + ЗафиксироватьТранзакцию(); + НачатьТранзакцию(); + + КоличествоНайденныхДляЗаписиОбъектов = 0; + КонецЕсли; + + + КонецЦикла; + + Если ИспользоватьТранзакцииПриВыгрузкеДляПлановОбмена Тогда + ЗафиксироватьТранзакцию(); + КонецЕсли; + + // Завершаем запись сообщения + ЗаписьСообщения.ЗакончитьЗапись(); + + ЗаписьXML.Закрыть(); + + + + + // событие после обработки + Если ПоследняяСтрокаПравилаВыгрузки <> Неопределено Тогда + + Если Не ПустаяСтрока(ПоследняяСтрокаПравилаВыгрузки.ПослеОбработки) Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(ПоследняяСтрокаПравилаВыгрузки, "ПослеОбработки")); + + Иначе + + Выполнить(ПоследняяСтрокаПравилаВыгрузки.ПослеОбработки); + + КонецЕсли; + + Исключение + + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(32, ОписаниеОшибки(), ПоследняяСтрокаПравилаВыгрузки.Имя, , "ПослеОбработкиВыгрузкиДанных"); + + КонецПопытки; + + КонецЕсли; + + КонецЕсли; + + + Исключение + + Если ИспользоватьТранзакцииПриВыгрузкеДляПлановОбмена Тогда + ОтменитьТранзакцию(); + КонецЕсли; + + ЗП = ПолучитьСтруктуруЗаписиПротокола(72, ОписаниеОшибки()); + ЗП.УзелПланаОбмена = УзелОбмена; + ЗП.Объект = Данные; + ЗП.ТипОбъекта = ТипДанныхДляВыгрузки; + + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(72, ЗП, Истина); + + ЗаписьXML.Закрыть(); + + Возврат Ложь; + + КонецПопытки; + + СтруктураДляУдаленияРегистрацииИзменений.МассивПКО = ВременныйМассивПравилКонвертации; + + Возврат Не Отказ; + +КонецФункции + +Функция ОбработатьВыгрузкуДляПлановОбмена(СоответствиеУзловИПравилВыгрузки, СтруктураДляУдаленияРегистрацииИзменений) + + УдачнаяВыгрузка = Истина; + + Для Каждого СтрокаСоответствия Из СоответствиеУзловИПравилВыгрузки Цикл + + УзелОбмена = СтрокаСоответствия.Ключ; + МассивПравилКонвертации = СтрокаСоответствия.Значение; + + ЛокальнаяСтруктураДляУдаленияРегистрацииИзменений = Новый Структура(); + + ТекущаяУдачнаяВыгрузка = ВыполнитьВыгрузкуИзмененныхДанныхДляУзлаОбмена(УзелОбмена, МассивПравилКонвертации, ЛокальнаяСтруктураДляУдаленияРегистрацииИзменений); + + УдачнаяВыгрузка = УдачнаяВыгрузка И ТекущаяУдачнаяВыгрузка; + + Если ЛокальнаяСтруктураДляУдаленияРегистрацииИзменений.МассивПКО <> Неопределено + И ЛокальнаяСтруктураДляУдаленияРегистрацииИзменений.МассивПКО.Количество() > 0 Тогда + + СтруктураДляУдаленияРегистрацииИзменений.Вставить(УзелОбмена, ЛокальнаяСтруктураДляУдаленияРегистрацииИзменений); + + КонецЕсли; + + КонецЦикла; + + Возврат УдачнаяВыгрузка; + +КонецФункции + +Процедура ОбработатьИзменениеРегистрацииДляУзловОбмена(СоответствиеУзловИПравилВыгрузки) + + Для Каждого Элемент Из СоответствиеУзловИПравилВыгрузки Цикл + + Если ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = 0 Тогда + + Возврат; + + ИначеЕсли ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = 1 Тогда + + // для всех изменений которые были в плане обмена отменяем регистрацию + ПланыОбмена.УдалитьРегистрациюИзменений(Элемент.Ключ, Элемент.Значение.НомерСообщения); + + ИначеЕсли ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = 2 Тогда + + // удаление изменений только для метаданных выгруженных объектов первого уровня + + Для Каждого ВыгруженноеПКО Из Элемент.Значение.МассивПКО Цикл + + Попытка + + Правило = Правила[ВыгруженноеПКО.ПравилоКонвертации]; + + Менеджер = Менеджеры[Правило.Источник]; + + ПланыОбмена.УдалитьРегистрациюИзменений(Элемент.Ключ, Менеджер.ОбъектМД); + + Исключение + + + КонецПопытки; + + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ЭКСПОРТИРУЕМЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Открывает файл обмена, читает атрибуты корневого узла файла в соответствии с форматом обмена +// +// Параметры: +// ТолькоПрочитатьШапку - Булево. если Истина, то после прочтения шапки файла обмена +// (корневой узел), файл закрывается +// +Процедура ОткрытьФайлЗагрузки(ТолькоПрочитатьШапку=Ложь, ДанныеФайлаОбмена = "") Экспорт + + Если ПустаяСтрока(ИмяФайлаОбмена) И ТолькоПрочитатьШапку Тогда + ДатаНачала = ""; + ДатаОкончания = ""; + ДатаВыгрузкиДанных = ""; + ВерсияПравилОбмена = ""; + Комментарий = ""; + Возврат; + КонецЕсли; + + + ИмяФайлаЗагрузкиДанных = ИмяФайлаОбмена; + + + // Архивные файлы будем идентифицировать по расширению ".zip" + Если Найти(ИмяФайлаОбмена, ".zip") > 0 Тогда + + ИмяФайлаЗагрузкиДанных = РаспаковатьZipФайл(ИмяФайлаОбмена); + + КонецЕсли; + + + ФлагОшибки = Ложь; + ФайлОбмена = Новый ЧтениеXML(); + + Попытка + Если НЕ ПустаяСтрока(ДанныеФайлаОбмена) Тогда + ФайлОбмена.УстановитьСтроку(ДанныеФайлаОбмена); + Иначе + ФайлОбмена.ОткрытьФайл(ИмяФайлаЗагрузкиДанных); + КонецЕсли; + Исключение + ЗаписатьВПротоколВыполнения(5); + Возврат; + КонецПопытки; + + ФайлОбмена.Прочитать(); + + + мАтрибутыФайлаОбмена = Новый Структура; + + + Если ФайлОбмена.ЛокальноеИмя = "ФайлОбмена" Тогда + + мАтрибутыФайлаОбмена.Вставить("ВерсияФормата", одАтрибут(ФайлОбмена, одТипСтрока, "ВерсияФормата")); + мАтрибутыФайлаОбмена.Вставить("ДатаВыгрузки", одАтрибут(ФайлОбмена, одТипДата, "ДатаВыгрузки")); + мАтрибутыФайлаОбмена.Вставить("НачалоПериодаВыгрузки", одАтрибут(ФайлОбмена, одТипДата, "НачалоПериодаВыгрузки")); + мАтрибутыФайлаОбмена.Вставить("ОкончаниеПериодаВыгрузки", одАтрибут(ФайлОбмена, одТипДата, "ОкончаниеПериодаВыгрузки")); + мАтрибутыФайлаОбмена.Вставить("ИмяКонфигурацииИсточника", одАтрибут(ФайлОбмена, одТипСтрока, "ИмяКонфигурацииИсточника")); + мАтрибутыФайлаОбмена.Вставить("ИмяКонфигурацииПриемника", одАтрибут(ФайлОбмена, одТипСтрока, "ИмяКонфигурацииПриемника")); + мАтрибутыФайлаОбмена.Вставить("ИдПравилКонвертации", одАтрибут(ФайлОбмена, одТипСтрока, "ИдПравилКонвертации")); + + ДатаНачала = мАтрибутыФайлаОбмена.НачалоПериодаВыгрузки; + ДатаОкончания = мАтрибутыФайлаОбмена.ОкончаниеПериодаВыгрузки; + ДатаВыгрузкиДанных = мАтрибутыФайлаОбмена.ДатаВыгрузки; + Комментарий = одАтрибут(ФайлОбмена, одТипСтрока, "Комментарий"); + + Иначе + + ЗаписатьВПротоколВыполнения(9); + Возврат; + + КонецЕсли; + + + ФайлОбмена.Прочитать(); + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "ПравилаОбмена" Тогда + ЗагрузитьПравилаОбмена(ФайлОбмена, "ЧтениеXML"); + + Иначе + ФайлОбмена.Закрыть(); + ФайлОбмена = Новый ЧтениеXML(); + Попытка + + Если НЕ ПустаяСтрока(ДанныеФайлаОбмена) Тогда + ФайлОбмена.УстановитьСтроку(ДанныеФайлаОбмена); + Иначе + ФайлОбмена.ОткрытьФайл(ИмяФайлаЗагрузкиДанных); + КонецЕсли; + + Исключение + + ЗаписатьВПротоколВыполнения(5); + Возврат; + + КонецПопытки; + + ФайлОбмена.Прочитать(); + + КонецЕсли; + + мБылиПрочитаныПравилаОбменаПриЗагрузке = Истина; + + Если ТолькоПрочитатьШапку Тогда + + ФайлОбмена.Закрыть(); + Возврат; + + КонецЕсли; + +КонецПроцедуры // ОткрытьФайлЗагрузки() + +Процедура ЗаполнитьСписокТиповДоступныхДляУдаления(ТаблицаДанных) Экспорт + + ТаблицаДанных.Очистить(); + + Для каждого ОбъектМД Из Метаданные.Справочники Цикл + + Если Не ПравоДоступа("Удаление", ОбъектМД) Тогда + Продолжить; + КонецЕсли; + + СтрокаТаблицы = ТаблицаДанных.Добавить(); + СтрокаТаблицы.Метаданные = "СправочникСсылка." + ОбъектМД.Имя; + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.ПланыВидовХарактеристик Цикл + + Если Не ПравоДоступа("Удаление", ОбъектМД) Тогда + Продолжить; + КонецЕсли; + + СтрокаТаблицы = ТаблицаДанных.Добавить(); + СтрокаТаблицы.Метаданные = "ПланВидовХарактеристикСсылка." + ОбъектМД.Имя; + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.Документы Цикл + + Если Не ПравоДоступа("Удаление", ОбъектМД) Тогда + Продолжить; + КонецЕсли; + + СтрокаТаблицы = ТаблицаДанных.Добавить(); + СтрокаТаблицы.Метаданные = "ДокументСсылка." + ОбъектМД.Имя; + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.РегистрыСведений Цикл + + Если Не ПравоДоступа("Удаление", ОбъектМД) Тогда + Продолжить; + КонецЕсли; + + Подчинен = (ОбъектМД.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору); + Если Подчинен Тогда Продолжить КонецЕсли; + + СтрокаТаблицы = ТаблицаДанных.Добавить(); + СтрокаТаблицы.Метаданные = "РегистрСведенийЗапись." + ОбъектМД.Имя; + + КонецЦикла; + +КонецПроцедуры + +// Устанавливает состояние пометки у подчиненных строк строки дерева значений +// в зависимости от пометки текущей строки +// +// Параметры: +// ТекСтрока - Строка дерева значений +// +Процедура УстановитьПометкиПодчиненных(ТекСтрока, Реквизит) Экспорт + + Подчиненные = ТекСтрока.Строки; + + Если Подчиненные.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для Каждого Строка из Подчиненные Цикл + + Если Строка.НастройкиПостроителя = Неопределено + И Реквизит = "ИспользоватьОтбор" Тогда + + Строка[Реквизит] = 0; + + Иначе + + Строка[Реквизит] = ТекСтрока[Реквизит]; + + КонецЕсли; + + УстановитьПометкиПодчиненных(Строка, Реквизит); + + КонецЦикла; + +КонецПроцедуры // УстановитьПометкиПодчиненных() + +// Устанавливает состояние пометки у родительских строк строки дерева значений +// в зависимости от пометки текущей строки +// +// Параметры: +// ТекСтрока - Строка дерева значений +// +Процедура УстановитьПометкиРодителей(ТекСтрока, Реквизит) Экспорт + + Родитель = ТекСтрока.Родитель; + Если Родитель = Неопределено Тогда + Возврат; + КонецЕсли; + + ТекСостояние = Родитель[Реквизит]; + + НайденыВключенные = Ложь; + НайденыВыключенные = Ложь; + + Если Реквизит = "ИспользоватьОтбор" Тогда + + Для Каждого Строка из Родитель.Строки Цикл + + Если Строка[Реквизит] = 0 И + Строка.НастройкиПостроителя <> Неопределено Тогда + + НайденыВыключенные = Истина; + + ИначеЕсли Строка[Реквизит] = 1 Тогда + НайденыВключенные = Истина; + КонецЕсли; + + Если НайденыВключенные И НайденыВыключенные Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Иначе + + Для Каждого Строка из Родитель.Строки Цикл + Если Строка[Реквизит] = 0 Тогда + НайденыВыключенные = Истина; + ИначеЕсли Строка[Реквизит] = 1 + ИЛИ Строка[Реквизит] = 2 Тогда + НайденыВключенные = Истина; + КонецЕсли; + Если НайденыВключенные И НайденыВыключенные Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + + Если НайденыВключенные И НайденыВыключенные Тогда + Включить = 2; + ИначеЕсли НайденыВключенные И (Не НайденыВыключенные) Тогда + Включить = 1; + ИначеЕсли (Не НайденыВключенные) И НайденыВыключенные Тогда + Включить = 0; + ИначеЕсли (Не НайденыВключенные) И (Не НайденыВыключенные) Тогда + Включить = 2; + КонецЕсли; + + Если Включить = ТекСостояние Тогда + Возврат; + Иначе + Родитель[Реквизит] = Включить; + УстановитьПометкиРодителей(Родитель, Реквизит); + КонецЕсли; + +КонецПроцедуры // УстановитьПометкиРодителей() + + +Функция ОбновитьПометкиВсехРодителейУПравилВыгрузки(СтрокиДереваПравилВыгрузки, НужноУстанавливатьПометки = Истина) + + Если СтрокиДереваПравилВыгрузки.Строки.Количество() = 0 Тогда + + Если НужноУстанавливатьПометки Тогда + УстановитьПометкиРодителей(СтрокиДереваПравилВыгрузки, "Включить"); + КонецЕсли; + + Возврат Истина; + + Иначе + + НужныПометки = Истина; + + Для Каждого СтрокаДереваПравил Из СтрокиДереваПравилВыгрузки.Строки Цикл + + РезультатУстановки = ОбновитьПометкиВсехРодителейУПравилВыгрузки(СтрокаДереваПравил, НужныПометки); + Если НужныПометки = Истина Тогда + НужныПометки = Ложь; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + +КонецФункции + + +Процедура ЗаполнитьСвойстваДляПоиска(СтруктураДанных, ПКС) + + Для Каждого СтрокаПолей Из ПКС Цикл + + Если СтрокаПолей.ЭтоГруппа ТОгда + + Если СтрокаПолей.ВидПриемника = "ТабличнаяЧасть" + ИЛИ Найти(СтрокаПолей.ВидПриемника, "НаборДвижений") > 0 Тогда + + ИмяСтруктурыПриемника = СтрокаПолей.Приемник + ?(СтрокаПолей.ВидПриемника = "ТабличнаяЧасть", "ТабличнаяЧасть", "НаборЗаписей"); + + ВнутренняяСтруктура = СтруктураДанных[ИмяСтруктурыПриемника]; + + Если ВнутренняяСтруктура = Неопределено Тогда + ВнутренняяСтруктура = Новый Соответствие(); + КонецЕсли; + + СтруктураДанных[ИмяСтруктурыПриемника] = ВнутренняяСтруктура; + + Иначе + + ВнутренняяСтруктура = СтруктураДанных; + + КонецЕсли; + + ЗаполнитьСвойстваДляПоиска(ВнутренняяСтруктура, СтрокаПолей.ПравилаГруппы); + + Иначе + + Если ПустаяСтрока(СтрокаПолей.ТипПриемника) Тогда + + Продолжить; + + КонецЕсли; + + СтруктураДанных[СтрокаПолей.Приемник] = СтрокаПолей.ТипПриемника; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура УдалитьЛишниеЭлементыИзСоответствия(СтруктураДанных) + + Для Каждого Элемент Из СтруктураДанных Цикл + + Если ТипЗнч(Элемент.Значение) = одТипСоответствие Тогда + + УдалитьЛишниеЭлементыИзСоответствия(Элемент.Значение); + + Если Элемент.Значение.Количество() = 0 Тогда + СтруктураДанных.Удалить(Элемент.Ключ); + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаполнитьИнформациюПоТипамДанныхПриемника(СтруктураДанных, Правила) + + Для Каждого Строка Из Правила Цикл + + Если ПустаяСтрока(Строка.Приемник) Тогда + Продолжить; + КонецЕсли; + + ДанныеСтруктуры = СтруктураДанных[Строка.Приемник]; + Если ДанныеСтруктуры = Неопределено Тогда + + ДанныеСтруктуры = Новый Соответствие(); + СтруктураДанных[Строка.Приемник] = ДанныеСтруктуры; + + КонецЕсли; + + // бежим по полям поиск и прочим пкс и запоминаем типы данных + ЗаполнитьСвойстваДляПоиска(ДанныеСтруктуры, Строка.СвойстваПоиска); + + // Свойства + ЗаполнитьСвойстваДляПоиска(ДанныеСтруктуры, Строка.Свойства); + + КонецЦикла; + + УдалитьЛишниеЭлементыИзСоответствия(СтруктураДанных); + +КонецПроцедуры + +Процедура СоздатьСтрокуСТипамиСвойств(ЗаписьXML, ТипыСвойств) + + Если ТипЗнч(ТипыСвойств.Значение) = одТипСоответствие Тогда + + Если ТипыСвойств.Значение.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ЗаписьXML.ЗаписатьНачалоЭлемента(ТипыСвойств.Ключ); + + Для Каждого Эл Из ТипыСвойств.Значение Цикл + СоздатьСтрокуСТипамиСвойств(ЗаписьXML, Эл); + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + + Иначе + + одЗаписатьЭлемент(ЗаписьXML, ТипыСвойств.Ключ, ТипыСвойств.Значение); + + КонецЕсли; + +КонецПроцедуры + +Функция СоздатьСтрокуСТипамиДляПриемника(СтруктураДанных) + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + ЗаписьXML.ЗаписатьНачалоЭлемента("ИнформацияОТипахДанных"); + + Для Каждого Строка Из СтруктураДанных Цикл + + ЗаписьXML.ЗаписатьНачалоЭлемента("ТипДанных"); + УстановитьАтрибут(ЗаписьXML, "Имя", Строка.Ключ); + + Для Каждого СтрокаПодчинения Из Строка.Значение Цикл + + СоздатьСтрокуСТипамиСвойств(ЗаписьXML, СтрокаПодчинения); + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + + СтрокаРезультата = ЗаписьXML.Закрыть(); + Возврат СтрокаРезультата; + +КонецФункции + +Процедура ЗагрузитьОдинТипДанных(ПравилаОбмена, СоответствиеТипа, ИмяЛокЭлемента) + + ИмяУзла = ИмяЛокЭлемента; + + ПравилаОбмена.Прочитать(); + + Если (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + ПравилаОбмена.Прочитать(); + Возврат; + + ИначеЕсли ПравилаОбмена.ТипУзла = одТипУзлаXML_НачалоЭлемента Тогда + + // это новый элемент + НовоеСоответствие = Новый Соответствие; + СоответствиеТипа.Вставить(ИмяУзла, НовоеСоответствие); + + ЗагрузитьОдинТипДанных(ПравилаОбмена, НовоеСоответствие, ПравилаОбмена.ЛокальноеИмя); + ПравилаОбмена.Прочитать(); + + Иначе + СоответствиеТипа.Вставить(ИмяУзла, Тип(ПравилаОбмена.Значение)); + ПравилаОбмена.Прочитать(); + КонецЕсли; + + ЗагрузитьСоответствиеТиповДляОдногоТипа(ПравилаОбмена, СоответствиеТипа); + +КонецПроцедуры + +Процедура ЗагрузитьСоответствиеТиповДляОдногоТипа(ПравилаОбмена, СоответствиеТипа) + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + Если (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Прервать; + + КонецЕсли; + + // прочитали начало элемента + ПравилаОбмена.Прочитать(); + + Если ПравилаОбмена.ТипУзла = одТипУзлаXML_НачалоЭлемента Тогда + + // это новый элемент + НовоеСоответствие = Новый Соответствие; + СоответствиеТипа.Вставить(ИмяУзла, НовоеСоответствие); + + ЗагрузитьОдинТипДанных(ПравилаОбмена, НовоеСоответствие, ПравилаОбмена.ЛокальноеИмя); + + Иначе + СоответствиеТипа.Вставить(ИмяУзла, Тип(ПравилаОбмена.Значение)); + ПравилаОбмена.Прочитать(); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗагрузитьИнформациюОТипахДанных() + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + Если ИмяУзла = "ТипДанных" Тогда + + ИмяТипа = одАтрибут(ФайлОбмена, одТипСтрока, "Имя"); + + СоответствиеТипа = Новый Соответствие; + мСоответствиеТиповДанныхДляЗагрузки.Вставить(Тип(ИмяТипа), СоответствиеТипа); + + ЗагрузитьСоответствиеТиповДляОдногоТипа(ФайлОбмена, СоответствиеТипа); + + ИначеЕсли (ИмяУзла = "ИнформацияОТипахДанных") И (ФайлОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Прервать; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗагрузитьЗначенияПараметровОбменаДанными() + + Имя = одАтрибут(ФайлОбмена, одТипСтрока, "Имя"); + + ТипСвойства = ПолучитьТипСвойстваПоДополнительнымДанным(Неопределено, Имя); + + Значение = ПрочитатьСвойство(ТипСвойства); + + Параметры.Вставить(Имя, Значение); + + АлгоритмПослеЗагрузкиПараметра = ""; + Если СобытияПослеЗагрузкиПараметров.Свойство(Имя, АлгоритмПослеЗагрузкиПараметра) + И Не ПустаяСтрока(АлгоритмПослеЗагрузкиПараметра) Тогда + + Выполнить(АлгоритмПослеЗагрузкиПараметра); + + КонецЕсли; + +КонецПроцедуры + +Функция ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена) + + ТекстОбработчика = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + + Если Найти(ТекстОбработчика, Символы.ПС) = 0 Тогда + Возврат ТекстОбработчика; + КонецЕсли; + + ТекстОбработчика = СтрЗаменить(ТекстОбработчика, Символ(10), Символы.ПС); + + Возврат ТекстОбработчика; + +КонецФункции + +// Осуществляет загрузку правил обмена в соответствии с форматом +// +// Параметры: +// Источник - Объект, из которого осуществляется загрузка правил обмена; +// ТипИсточника - Строка, указывающая тип источника: "XMLФайл", "ЧтениеXML", "Строка" +// +Процедура ЗагрузитьПравилаОбмена(Источник="", ТипИсточника="XMLФайл") Экспорт + + #Если Клиент Тогда + Состояние("Выполняется загрузка правил обмена ..."); + #КонецЕсли + + ИнициализироватьМенеджерыИСообщения(); + + ЕстьГлобальныйОбработчикПередВыгрузкойОбъекта = Ложь; + ЕстьГлобальныйОбработчикПослеВыгрузкиОбъекта = Ложь; + + ЕстьГлобальныйОбработчикПередКонвертациейОбъекта = Ложь; + + ЕстьГлобальныйОбработчикПередЗагрузкойОбъекта = Ложь; + ЕстьГлобальныйОбработчикПослеЗагрузкиОбъекта = Ложь; + + СоздатьСтруктуруКонвертации(); + + мТаблицаПравилКонвертацииСвойств = Новый ТаблицаЗначений; + ИнициализацияТаблицыПравилКонвертацииСвойств(мТаблицаПравилКонвертацииСвойств); + ДополнитьСлужебныеТаблицыКолонками(); + + + // Возможно выбраны встроенные правила обмена (один из макетов) + + ИмяВременногоФайлаПравилОбмена = ""; + Если ПустаяСтрока(Источник) Тогда + + Источник = ИмяФайлаПравилОбмена; + Если мСписокМакетовПравилОбмена.НайтиПоЗначению(Источник) <> Неопределено Тогда + Для каждого Макет Из ЭтотОбъект.Метаданные().Макеты Цикл + Если Макет.Синоним = Источник Тогда + Источник = Макет.Имя; + Прервать; + КонецЕсли; + КонецЦикла; + МакетПравилОбмена = ПолучитьМакет(Источник); + УникальныйИдентификатор = Новый УникальныйИдентификатор(); + ИмяВременногоФайлаПравилОбмена = КаталогВременныхФайлов() + УникальныйИдентификатор + ".xml"; + МакетПравилОбмена.Записать(ИмяВременногоФайлаПравилОбмена); + Источник = ИмяВременногоФайлаПравилОбмена; + КонецЕсли; + + КонецЕсли; + + + Если ТипИсточника="XMLФайл" Тогда + + Если ПустаяСтрока(Источник) Тогда + ЗаписатьВПротоколВыполнения(12); + Возврат; + КонецЕсли; + + Файл = Новый Файл(Источник); + Если Не Файл.Существует() Тогда + ЗаписатьВПротоколВыполнения(3); + Возврат; + КонецЕсли; + + ФайлПравилЗапакован = (Файл.Расширение = ".zip"); + + Если ФайлПравилЗапакован Тогда + + // распаковка файла правил + Источник = РаспаковатьZipФайл(Источник); + + КонецЕсли; + + ПравилаОбмена = Новый ЧтениеXML(); + ПравилаОбмена.ОткрытьФайл(Источник); + ПравилаОбмена.Прочитать(); + + ИначеЕсли ТипИсточника="Строка" Тогда + + ПравилаОбмена = Новый ЧтениеXML(); + ПравилаОбмена.УстановитьСтроку(Источник); + ПравилаОбмена.Прочитать(); + + ИначеЕсли ТипИсточника="ЧтениеXML" Тогда + + ПравилаОбмена = Источник; + + КонецЕсли; + + + Если Не ((ПравилаОбмена.ЛокальноеИмя = "ПравилаОбмена") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_НачалоЭлемента)) Тогда + ЗаписатьВПротоколВыполнения(6); + Возврат; + КонецЕсли; + + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + ЗаписьXML.Отступ = Истина; + ЗаписьXML.ЗаписатьНачалоЭлемента("ПравилаОбмена"); + + + Пока ПравилаОбмена.Прочитать() Цикл + + ИмяУзла = ПравилаОбмена.ЛокальноеИмя; + + #Если Клиент Тогда + ОбработкаПрерыванияПользователя(); + #КонецЕсли + + // Реквизиты конвертации + Если ИмяУзла = "ВерсияФормата" Тогда + Значение = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + Конвертация.Вставить("ВерсияФормата", Значение); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + ИначеЕсли ИмяУзла = "Ид" Тогда + Значение = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + Конвертация.Вставить("Ид", Значение); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + ИначеЕсли ИмяУзла = "Наименование" Тогда + Значение = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + Конвертация.Вставить("Наименование", Значение); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + ИначеЕсли ИмяУзла = "ДатаВремяСоздания" Тогда + Значение = одЗначениеЭлемента(ПравилаОбмена, одТипДата); + Конвертация.Вставить("ДатаВремяСоздания", Значение); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + ВерсияПравилОбмена = Конвертация.ДатаВремяСоздания; + ИначеЕсли ИмяУзла = "Источник" Тогда + Значение = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + Конвертация.Вставить("Источник", Значение); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + ИначеЕсли ИмяУзла = "Приемник" Тогда + + ВерсияПлатформыПриемника = ПравилаОбмена.ПолучитьАтрибут ("ВерсияПлатформы"); + ПлатформаПриемника = ОпределитьПоВерсииПлатформыПриемникаПлатформу(ВерсияПлатформыПриемника); + + Значение = одЗначениеЭлемента(ПравилаОбмена, одТипСтрока); + Конвертация.Вставить("Приемник", Значение); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Значение); + + ИначеЕсли ИмяУзла = "УдалятьСопоставленныеОбъектыВПриемникеПриИхУдаленииВИсточнике" Тогда + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "Комментарий" Тогда + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "ОсновнойПланОбмена" Тогда + одПропустить(ПравилаОбмена); + + ИначеЕсли ИмяУзла = "Параметры" Тогда + ЗагрузитьПараметры(ПравилаОбмена, ЗаписьXML) + + // События конвертации + + ИначеЕсли ИмяУзла = "" Тогда + + ИначеЕсли ИмяУзла = "ПослеЗагрузкиПравилОбмена" Тогда + Конвертация.Вставить("ПослеЗагрузкиПравилОбмена", ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена)); + + ИначеЕсли ИмяУзла = "ПередВыгрузкойДанных" Тогда + Конвертация.Вставить("ПередВыгрузкойДанных", ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена)); + + ИначеЕсли ИмяУзла = "ПослеВыгрузкиДанных" Тогда + Конвертация.Вставить("ПослеВыгрузкиДанных", ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена)); + + ИначеЕсли ИмяУзла = "ПередВыгрузкойОбъекта" Тогда + Конвертация.Вставить("ПередВыгрузкойОбъекта", ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена)); + ЕстьГлобальныйОбработчикПередВыгрузкойОбъекта = Не ПустаяСтрока(Конвертация.ПередВыгрузкойОбъекта); + + ИначеЕсли ИмяУзла = "ПослеВыгрузкиОбъекта" Тогда + Конвертация.Вставить("ПослеВыгрузкиОбъекта", ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена)); + ЕстьГлобальныйОбработчикПослеВыгрузкиОбъекта = Не ПустаяСтрока(Конвертация.ПослеВыгрузкиОбъекта); + + ИначеЕсли ИмяУзла = "ПередЗагрузкойОбъекта" Тогда + Конвертация.Вставить("ПередЗагрузкойОбъекта", ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена)); + ЕстьГлобальныйОбработчикПередЗагрузкойОбъекта = Не ПустаяСтрока(Конвертация.ПередЗагрузкойОбъекта); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Конвертация.ПередЗагрузкойОбъекта); + + ИначеЕсли ИмяУзла = "ПослеЗагрузкиОбъекта" Тогда + Конвертация.Вставить("ПослеЗагрузкиОбъекта", ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена)); + ЕстьГлобальныйОбработчикПослеЗагрузкиОбъекта = Не ПустаяСтрока(Конвертация.ПослеЗагрузкиОбъекта); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Конвертация.ПослеЗагрузкиОбъекта); + + ИначеЕсли ИмяУзла = "ПередКонвертациейОбъекта" Тогда + Конвертация.Вставить("ПередКонвертациейОбъекта", ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена)); + ЕстьГлобальныйОбработчикПередКонвертациейОбъекта = Не ПустаяСтрока(Конвертация.ПередКонвертациейОбъекта); + + ИначеЕсли ИмяУзла = "ПередЗагрузкойДанных" Тогда + Конвертация.ПередЗагрузкойДанных = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Конвертация.ПередЗагрузкойДанных); + + ИначеЕсли ИмяУзла = "ПослеЗагрузкиДанных" Тогда + Конвертация.ПослеЗагрузкиДанных = ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Конвертация.ПослеЗагрузкиДанных); + + ИначеЕсли ИмяУзла = "ПослеЗагрузкиПараметров" Тогда + Конвертация.Вставить("ПослеЗагрузкиПараметров", ПолучитьИзТекстаЗначениеОбработчика(ПравилаОбмена)); + + ИначеЕсли ИмяУзла = "ПередОтправкойИнформацииОбУдалении" Тогда + Конвертация.Вставить("ПередОтправкойИнформацииОбУдалении", одЗначениеЭлемента(ПравилаОбмена, одТипСтрока)); + + ИначеЕсли ИмяУзла = "ПередПолучениемИзмененныхОбъектов" Тогда + Конвертация.Вставить("ПередПолучениемИзмененныхОбъектов", одЗначениеЭлемента(ПравилаОбмена, одТипСтрока)); + + ИначеЕсли ИмяУзла = "ПриПолученииИнформацииОбУдалении" Тогда + Конвертация.Вставить("ПриПолученииИнформацииОбУдалении", одЗначениеЭлемента(ПравилаОбмена, одТипСтрока)); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Конвертация.ПриПолученииИнформацииОбУдалении); + + ИначеЕсли ИмяУзла = "ПослеПолученияИнформацииОбУзлахОбмена" Тогда + Конвертация.Вставить("ПослеПолученияИнформацииОбУзлахОбмена", одЗначениеЭлемента(ПравилаОбмена, одТипСтрока)); + одЗаписатьЭлемент(ЗаписьXML, ИмяУзла, Конвертация.ПослеПолученияИнформацииОбУзлахОбмена); + + // Правила + + ИначеЕсли ИмяУзла = "ПравилаВыгрузкиДанных" Тогда + + Если РежимОбмена = "Загрузка" Тогда + одПропустить(ПравилаОбмена); + Иначе + ЗагрузитьПравилаВыгрузки(ПравилаОбмена); + КонецЕсли; + + ИначеЕсли ИмяУзла = "ПравилаКонвертацииОбъектов" Тогда + ЗагрузитьПравилаКонвертации(ПравилаОбмена, ЗаписьXML); + + ИначеЕсли ИмяУзла = "ПравилаОчисткиДанных" Тогда + ЗагрузитьПравилаОчистки(ПравилаОбмена, ЗаписьXML) + + ИначеЕсли ИмяУзла = "ПравилаРегистрацииОбъектов" Тогда + одПропустить(ПравилаОбмена); // правила регистрации объектов загружаем другой обработкой + + // Алгоритмы / Запросы / Обработки + + ИначеЕсли ИмяУзла = "Алгоритмы" Тогда + ЗагрузитьАлгоритмы(ПравилаОбмена, ЗаписьXML); + + ИначеЕсли ИмяУзла = "Запросы" Тогда + ЗагрузитьЗапросы(ПравилаОбмена, ЗаписьXML); + + ИначеЕсли ИмяУзла = "Обработки" Тогда + ЗагрузитьОбработки(ПравилаОбмена, ЗаписьXML); + + // Выход + ИначеЕсли (ИмяУзла = "ПравилаОбмена") И (ПравилаОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Если РежимОбмена <> "Загрузка" Тогда + ПравилаОбмена.Закрыть(); + КонецЕсли; + Прервать; + + + // Ошибка формата + Иначе + СтруктураЗаписи = Новый Структура("ИмяУзла", ИмяУзла); + ЗаписатьВПротоколВыполнения(7, СтруктураЗаписи); + Возврат; + КонецЕсли; + КонецЦикла; + + + ЗаписьXML.ЗаписатьКонецЭлемента(); + мXMLПравила = ЗаписьXML.Закрыть(); + + Для Каждого СтрокаПравилВыгрузки Из ТаблицаПравилВыгрузки.Строки Цикл + ОбновитьПометкиВсехРодителейУПравилВыгрузки(СтрокаПравилВыгрузки, Истина); + КонецЦикла; + + #Если Клиент Тогда + Состояние(""); + #КонецЕсли + + + // Удаляем временный файл правил + Если Не ПустаяСтрока(ИмяВременногоФайлаПравилОбмена) Тогда + Попытка + УдалитьФайлы(ИмяВременногоФайлаПравилОбмена); + Исключение + КонецПопытки; + КонецЕсли; + + Если ТипИсточника="XMLФайл" + И ФайлПравилЗапакован Тогда + + Попытка + УдалитьФайлы(Источник); + Исключение + КонецПопытки; + + КонецЕсли; + + // дополнительно нужна информация по типам данных приемника для быстрой загрузки данных + СтруктураДанных = Новый Соответствие(); + ЗаполнитьИнформациюПоТипамДанныхПриемника(СтруктураДанных, ТаблицаПравилКонвертации); + + мСтрокаТиповДляПриемника = СоздатьСтрокуСТипамиДляПриемника(СтруктураДанных); + + // нужно вызвать событие после загрузки правил обмена + ТекстСобытияПослеЗагрузкиПравилОбмена = ""; + Если Конвертация.Свойство("ПослеЗагрузкиПравилОбмена", ТекстСобытияПослеЗагрузкиПравилОбмена) + И Не ПустаяСтрока(ТекстСобытияПослеЗагрузкиПравилОбмена) Тогда + + //Отладка данного обработчика не поддерживается! + Попытка + + Выполнить(ТекстСобытияПослеЗагрузкиПравилОбмена); + + Исключение + + Текст = НСтр("ru = 'Обработчик: ""ПослеЗагрузкиПравилОбмена"": '") + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст); + + + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры // ЗагрузитьПравилаОбмена() + + +Процедура ОбработатьОкончаниеЧтенияНовогоЭлемента(ПоследнийОбъектЗагрузки) + + мСчетчикЗагруженныхОбъектов = 1 + мСчетчикЗагруженныхОбъектов; + + Если мСчетчикЗагруженныхОбъектов % КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 0 Тогда + + Если ПоследнийОбъектЗагрузки <> Неопределено Тогда + + СтрокаОбъектаЗагрузки = ", Объект: " + Строка(ТипЗнч(ПоследнийОбъектЗагрузки)) + " " + Строка(ПоследнийОбъектЗагрузки); + + Иначе + + СтрокаОбъектаЗагрузки = ""; + + КонецЕсли; + + #Если Клиент Тогда + Состояние("Обработано объектов: " + мСчетчикЗагруженныхОбъектов + " " + СтрокаОбъектаЗагрузки); + #КонецЕсли + + КонецЕсли; + + Если ЗапоминатьЗагруженныеОбъекты + И мСчетчикЗагруженныхОбъектов % 100 = 0 Тогда + + Если ЗагруженныеОбъекты.Количество() > ЧислоХранимыхЗагруженныхОбъектов Тогда + ЗагруженныеОбъекты.Очистить(); + КонецЕсли; + + КонецЕсли; + + Если мСчетчикЗагруженныхОбъектов % 100 = 0 + И мГлобальныйСтекНеЗаписанныхОбъектов.Количество() > 100 Тогда + + ПровестиЗаписьНеЗаписанныхОбъектов(); + + КонецЕсли; + + Если ИспользоватьТранзакции + И КоличествоОбъектовНаТранзакцию > 0 + И мСчетчикЗагруженныхОбъектов % КоличествоОбъектовНаТранзакцию = 0 Тогда + + ЗафиксироватьТранзакцию(); + НачатьТранзакцию(); + + КонецЕсли; + +КонецПроцедуры + +// Выполняет последовательное чтение файла сообщения обмена и записывает данные в информационную базу +// +// Параметры: +// РезультирующаяСтрокаСИнформациейОбОшибке – Строка – результирующая строка с информацией об ошибке +// +Процедура ПроизвестиЧтениеДанных(РезультирующаяСтрокаСИнформациейОбОшибке = "") Экспорт + + Попытка + + Пока ФайлОбмена.Прочитать() Цикл + + ИмяУзла = ФайлОбмена.ЛокальноеИмя; + + #Если Клиент Тогда + ОбработкаПрерыванияПользователя(); + #КонецЕсли + + Если ИмяУзла = "Объект" Тогда + + ПоследнийОбъектЗагрузки = ПрочитатьОбъект(); + + ОбработатьОкончаниеЧтенияНовогоЭлемента(ПоследнийОбъектЗагрузки); + + ИначеЕсли ИмяУзла = "ЗначениеПараметра" Тогда + + ЗагрузитьЗначенияПараметровОбменаДанными(); + + ИначеЕсли ИмяУзла = "АлгоритмПослеЗагрузкиПараметров" Тогда + + Отказ = Ложь; + ПричинаОтказа = ""; + + ТекстАлгоритма = одЗначениеЭлемента(ФайлОбмена, одТипСтрока); + + Если Не ПустаяСтрока(ТекстАлгоритма) Тогда + + Попытка + + Выполнить(ТекстАлгоритма); + + Если Отказ = Истина Тогда + + Если Не ПустаяСтрока(ПричинаОтказа) Тогда + ВызватьИсключение "Загрузка данных отменена по причине: " + ПричинаОтказа; + Иначе + ВызватьИсключение "Загрузка данных отменена"; + КонецЕсли; + + КонецЕсли; + + Исключение + + ЗП = ПолучитьСтруктуруЗаписиПротокола(75, ОписаниеОшибки()); + ЗП.Обработчик = "ПослеЗагрузкиПараметров"; + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(75, ЗП, Истина); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + + КонецЕсли; + + ИначеЕсли ИмяУзла = "Алгоритм" Тогда + + ТекстАлгоритма = одЗначениеЭлемента(ФайлОбмена, одТипСтрока); + + Если Не ПустаяСтрока(ТекстАлгоритма) Тогда + + Попытка + Выполнить(ТекстАлгоритма); + Исключение + + ЗП = ПолучитьСтруктуруЗаписиПротокола(39, ОписаниеОшибки()); + ЗП.Обработчик = "АлгоритмФайлаОбмена"; + СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(39, ЗП, Истина); + + Если Не ФлагРежимОтладки Тогда + ВызватьИсключение СтрокаСообщенияОбОшибке; + КонецЕсли; + + КонецПопытки; + + КонецЕсли; + + ИначеЕсли ИмяУзла = "ПравилаОбмена" Тогда + + мБылиПрочитаныПравилаОбменаПриЗагрузке = Истина; + + Если ТаблицаПравилКонвертации.Количество() = 0 Тогда + ЗагрузитьПравилаОбмена(ФайлОбмена, "ЧтениеXML"); + Иначе + одПропустить(ФайлОбмена); + КонецЕсли; + + ИначеЕсли ИмяУзла = "ИнформацияОТипахДанных" Тогда + + ЗагрузитьИнформациюОТипахДанных(); + + ИначеЕсли (ИмяУзла = "ФайлОбмена") И (ФайлОбмена.ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда + + Иначе + СтруктураЗаписи = Новый Структура("ИмяУзла", ИмяУзла); + ЗаписатьВПротоколВыполнения(9, СтруктураЗаписи); + КонецЕсли; + + КонецЦикла; + + Исключение + + СтрокаОшибки = ОписаниеОшибки(); + + РезультирующаяСтрокаСИнформациейОбОшибке = ЗаписатьВПротоколВыполнения("Ошибка при загрузке данных: " + СтрокаОшибки, Неопределено, Истина, , , Истина); + + ЗавершитьВедениеПротоколаОбмена(); + ФайлОбмена.Закрыть(); + Возврат; + + КонецПопытки; + +КонецПроцедуры + +Функция ВыполнитьДействияПередЧтениемДанных(СтрокаДанных = "") Экспорт + + РежимОбработкиДанных = мРежимыОбработкиДанных.Загрузка; + + мСоответствиеДопПараметровПоиска = Новый Соответствие; + мСоответствиеАлгоритмовПоискаЭлементов = Новый Соответствие; + мСоответствиеПравилКонвертации = Новый Соответствие; + + Правила.Очистить(); + + ИнициализироватьКомментарииПриВыгрузкеИЗагрузкеДанных(); + + ИнициализироватьВедениеПротоколаОбмена(); + + ЗагрузкаВозможна = Истина; + + Если ПустаяСтрока(СтрокаДанных) Тогда + + Если ПустаяСтрока(ИмяФайлаОбмена) Тогда + ЗаписатьВПротоколВыполнения(15); + ЗагрузкаВозможна = Ложь; + КонецЕсли; + + КонецЕсли; + + //Инициализируем внешнюю обработку с экспортными обработчиками + ИнициализацияВнешнейОбработкиОбработчиковСобытий(ЗагрузкаВозможна, ЭтотОбъект); + + Если Не ЗагрузкаВозможна Тогда + Возврат Ложь; + КонецЕсли; + + ЗаписатьВПротоколВыполнения("Начало загрузки: " + ТекущаяДата(), , Ложь, , , Истина); + + Если ФлагРежимОтладки Тогда + ИспользоватьТранзакции = Ложь; + КонецЕсли; + + Если КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 0 Тогда + + КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 100; + + КонецЕсли; + + мСоответствиеТиповДанныхДляЗагрузки = Новый Соответствие; + мГлобальныйСтекНеЗаписанныхОбъектов = Новый Соответствие; + + мСчетчикЗагруженныхОбъектов = 0; + ФлагОшибки = Ложь; + ЗагруженныеОбъекты = Новый Соответствие; + ЗагруженныеГлобальныеОбъекты = Новый Соответствие; + + ИнициализироватьМенеджерыИСообщения(); + + ОткрытьФайлЗагрузки(,СтрокаДанных); + + Если ФлагОшибки Тогда + ЗавершитьВедениеПротоколаОбмена(); + Возврат Ложь; + КонецЕсли; + + //Определяем интерфейсы обработчиков + Если ФлагРежимОтладкиОбработчиков Тогда + + ДополнитьПравилаИнтерфейсамиОбработчиков(Конвертация, ТаблицаПравилКонвертации, ТаблицаПравилВыгрузки, ТаблицаПравилОчистки); + + КонецЕсли; + + // Обработчик ПередЗагрузкойДанных + Отказ = Ложь; + + Если Не ПустаяСтрока(Конвертация.ПередЗагрузкойДанных) Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Конвертация, "ПередЗагрузкойДанных")); + + Иначе + + Выполнить(Конвертация.ПередЗагрузкойДанных); + + КонецЕсли; + + Исключение + СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(22, ОписаниеОшибки(), "ПередЗагрузкойДанных (конвертация)"); + Отказ = Истина; + КонецПопытки; + + Если Отказ Тогда // Отказ от загрузки данных + ЗавершитьВедениеПротоколаОбмена(); + ФайлОбмена.Закрыть(); + ДеструкторВнешнейОбработкиОбработчиковСобытий(); + Возврат Ложь; + КонецЕсли; + + КонецЕсли; + + // Очистка информационной базы по правилам + ОбработатьПравилаОчистки(ТаблицаПравилОчистки.Строки); + + Если ИспользоватьТранзакции Тогда + НачатьТранзакцию(); + КонецЕсли; + + Возврат Истина; + +КонецФункции + +#Если Клиент тогда + +Процедура ОткрытьДанныеПротоколовОбменаПриНеобходимости() + + Если НЕ ОткрыватьПротоколыОбменаПослеВыполненияОпераций Тогда + Возврат; + КонецЕсли; + + Если Не ПустаяСтрока(ИмяФайлаПротоколаОбмена) Тогда + ЗапуститьПриложение("explorer " + ИмяФайлаПротоколаОбмена); + КонецЕсли; + + Если НепосредственноеЧтениеВИБПриемнике Тогда + + ИмяПротоколаЗагрузки = ПолучитьИмяПротоколаДляВторойИнформационнойБазыComСоединения(); + + Если Не ПустаяСтрока(ИмяПротоколаЗагрузки) Тогда + ЗапуститьПриложение("explorer " + ИмяПротоколаЗагрузки); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Процедура ОткрытьФормуНастройкиОтладкиОбработчиков(ОбъектВладелец, ФормаВладелец, ОбработчикиСобытийИзФайлаПравил) + + ФормаНастройкиОтладкиОбработчиков = ПолучитьФорму("ФормаНастройкиОтладкиОбработчиков", ФормаВладелец); + + ФормаНастройкиОтладкиОбработчиков.ИмяФайлаВнешнейОбработкиОбработчиковСобытий = ОбъектВладелец.ИмяФайлаВнешнейОбработкиОбработчиковСобытий; + ФормаНастройкиОтладкиОбработчиков.РежимОтладкиАлгоритмов = ОбъектВладелец.РежимОтладкиАлгоритмов; + ФормаНастройкиОтладкиОбработчиков.ОбработчикиСобытийЧитаемИзФайлаПравилОбмена = ОбработчикиСобытийИзФайлаПравил; + + Если ФормаНастройкиОтладкиОбработчиков.ОткрытьМодально() = Истина Тогда + + ОбъектВладелец.ИмяФайлаВнешнейОбработкиОбработчиковСобытий = ФормаНастройкиОтладкиОбработчиков.ИмяФайлаВнешнейОбработкиОбработчиковСобытий; + ОбъектВладелец.РежимОтладкиАлгоритмов = ФормаНастройкиОтладкиОбработчиков.РежимОтладкиАлгоритмов; + + КонецЕсли; + + //Будем считать, что при открытии формы были прочитаны правила обмена. + //При этом надо указать обработке (ОбъектВладелец), что нужно перечитать + //правила обмена + Попытка + //При наличии флага ОбъектВладелец потребует перечитать + //правила при попытке выгрузки данных + ОбъектВладелец.мБылиПрочитаныПравилаОбменаПриЗагрузке = Истина; + Исключение + КонецПопытки; + +КонецПроцедуры + +// Открывает форму для формирования файла с обработчиками выгрузки +// +// Параметры: +// Нет. +// +Процедура ОткрытьФормуНастройкиОтладкиОбработчиковВыгрузки(ОбъектВладелец, ФормаВладелец) Экспорт + + ОткрытьФормуНастройкиОтладкиОбработчиков(ОбъектВладелец, ФормаВладелец, Истина); + +КонецПроцедуры + +// Открывает форму для формирования файла с обработчиками выгрузки, когда правила обмена загружаются из макета обработки +// +// Параметры: +// Нет. +// +Процедура ОткрытьФормуНастройкиОтладкиОбработчиковВыгрузкиСПравиламиИзМакета(ОбъектВладелец, ФормаВладелец, ИмяМакета) Экспорт + + //Получаем уникальное имя файла + ИмяФайлаПравилОбмена = ПолучитьНовоеУникальноеИмяВременногоФайла("ПравилаОбмена", "xml", ""); + + МакетПравилОбмена = ОбъектВладелец.ПолучитьМакет(ИмяМакета); + МакетПравилОбмена.Записать(ИмяФайлаПравилОбмена); + + ОткрытьФормуНастройкиОтладкиОбработчиков(ОбъектВладелец, ФормаВладелец, Истина); + + //Удаляем временный файл правил обмена + УдалитьВременныеФайлы(ИмяФайлаПравилОбмена); + + ИмяФайлаПравилОбмена = "1"; + +КонецПроцедуры + +// Открывает форму для формирования файла с обработчиками загрузки +// +// Параметры: +// Нет. +// +Процедура ОткрытьФормуНастройкиОтладкиОбработчиковЗагрузки(ОбъектВладелец, ФормаВладелец) Экспорт + + ОткрытьФормуНастройкиОтладкиОбработчиков(ОбъектВладелец, ФормаВладелец, Ложь); + +КонецПроцедуры + +#КонецЕсли + +// Процедура выполняет действия после итерации загрузки данных: +// - фиксация транзакции (при необходимости) +// - закрытие файла сообщения обмена +// - выполнение обработчика конвертации ПослеЗагрузкиДанных +// - завершение ведения протокола обмена (при необходимости) +// +// Параметры: +// Нет. +// +Процедура ВыполнитьДействияПослеЗавершенияЧтенияДанных() Экспорт + + // отложенная запись того, что не записали с самого начала + ПровестиЗаписьНеЗаписанныхОбъектов(); + + Если ИспользоватьТранзакции Тогда + ЗафиксироватьТранзакцию(); + КонецЕсли; + + ФайлОбмена.Закрыть(); + + // Обработчик ПослеЗагрузкиДанных + Если Не ПустаяСтрока(Конвертация.ПослеЗагрузкиДанных) Тогда + + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Конвертация, "ПослеЗагрузкиДанных")); + + Иначе + + Выполнить(Конвертация.ПослеЗагрузкиДанных); + + КонецЕсли; + + Исключение + СтрокаСообщенияОбОшибке = ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(23, ОписаниеОшибки(), "ПослеЗагрузкиДанных (конвертация)"); + КонецПопытки; + + КонецЕсли; + + ДеструкторВнешнейОбработкиОбработчиковСобытий(); + + ЗаписатьВПротоколВыполнения("Окончание загрузки: " + ТекущаяДата(), , Ложь, , , Истина); + ЗаписатьВПротоколВыполнения("Загружено объектов: " + мСчетчикЗагруженныхОбъектов, , Ложь, , , Истина); + + ЗавершитьВедениеПротоколаОбмена(); + + #Если Клиент Тогда + Если ЭтоИнтерактивныйРежим Тогда + ОткрытьДанныеПротоколовОбменаПриНеобходимости(); + Предупреждение("Загрузка данных завершена!"); + КонецЕсли; + #КонецЕсли + +КонецПроцедуры + +// Выполняет загрузку данных в соответствии с установленными режимами (правилами обмена) +// +// Параметры: +// Нет. +// +Процедура ВыполнитьЗагрузку() Экспорт + + РаботаВозможна = ВыполнитьДействияПередЧтениемДанных(); + + Если НЕ РаботаВозможна Тогда + Возврат; + КонецЕсли; + + + ПроизвестиЧтениеДанных(); + + + ВыполнитьДействияПослеЗавершенияЧтенияДанных(); + +КонецПроцедуры // ВыполнитьЗагрузку() + + +Процедура СжатьРезультирующийФайлОбмена() + + Попытка + #Если Клиент Тогда + Состояние("Выполняется архивация файла обмена..."); + #КонецЕсли + + ИмяИсходногоФайлаОбмена = ИмяФайлаОбмена; + Если АрхивироватьФайл Тогда + ИмяФайлаОбмена = СтрЗаменить(ИмяФайлаОбмена, ".xml", ".zip"); + КонецЕсли; + + Архиватор = Новый ЗаписьZipФайла(ИмяФайлаОбмена, ПарольДляСжатияФайлаОбмена, "Файл обмена данными"); + Архиватор.Добавить(ИмяИсходногоФайлаОбмена); + Архиватор.Записать(); + + УдалитьФайлы(ИмяИсходногоФайлаОбмена); + + Исключение + + КонецПопытки; + +КонецПроцедуры + +// Составляет полное имя файла из имени каталога и имени файла. +// +// Параметры +// ИмяКаталога – Строка, содержащая путь к каталогу файла на диске. +// ИмяФайла – Строка, содержащая имя файла, без имени каталога. +// +// Возвращаемое значение: +// Строка – полное имя файла с учетом каталога. +// +Функция ПолучитьИмяФайлаОбмена(ИмяКаталога, ИмяФайла) Экспорт + + Если Не ПустаяСтрока(ИмяФайла) Тогда + + Возврат ИмяКаталога + ?(Прав(ИмяКаталога, 1) = "\", "", "\") + ИмяФайла; + + Иначе + + Возврат ИмяКаталога; + + КонецЕсли; + +КонецФункции + +Функция РаспаковатьZipФайл(ИмяФайлаДляРаспаковки) + + КаталогДляРаспаковки = КаталогВременныхФайлов(); + + ИмяРаспакованногоФайла = ""; + + Попытка + + #Если Клиент Тогда + Состояние("Выполняется распаковка файла ..."); + #КонецЕсли + + Архиватор = Новый ЧтениеZipФайла(ИмяФайлаДляРаспаковки, ПарольДляРаспаковкиФайлаОбмена); + + Если Архиватор.Элементы.Количество() > 0 Тогда + + Архиватор.Извлечь(Архиватор.Элементы[0], КаталогДляРаспаковки, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); + ИмяРаспакованногоФайла = ПолучитьИмяФайлаОбмена(КаталогДляРаспаковки, Архиватор.Элементы[0].Имя); + + Иначе + + ИмяРаспакованногоФайла = ""; + + КонецЕсли; + + Архиватор.Закрыть(); + + Исключение + + ЗП = ПолучитьСтруктуруЗаписиПротокола(2, ОписаниеОшибки()); + ЗаписатьВПротоколВыполнения(2, ЗП, Истина); + + Возврат ""; + + КонецПопытки; + + Возврат ИмяРаспакованногоФайла; + +КонецФункции + +// Выполняет передачу строки данных для загрузки в базе-приемнике +// +// Параметры: +// ИнформацияДляЗаписиВФайл – Строка (текст XML) – строка с данными +// СтрокаОшибкиВБазеПриемнике – Строка – содержит описание ошибки при загрузке в базе-приемнике +// +Процедура ПередатьИнформациюОЗаписиВПриемник(ИнформацияДляЗаписиВФайл, СтрокаОшибкиВБазеПриемнике = "") Экспорт + + мОбработкаДляЗагрузкиДанных.ФайлОбмена.УстановитьСтроку(ИнформацияДляЗаписиВФайл); + + мОбработкаДляЗагрузкиДанных.ПроизвестиЧтениеДанных(СтрокаОшибкиВБазеПриемнике); + + Если Не ПустаяСтрока(СтрокаОшибкиВБазеПриемнике) Тогда + + ЗаписатьВПротоколВыполнения("ЗАГРУЗКА В ПРИЕМНИКЕ: " + СтрокаОшибкиВБазеПриемнике, Неопределено, Истина, , , Истина); + + КонецЕсли; + +КонецПроцедуры + +Функция ВыполнитьПередачуИнформацииОНачалеОбменаВПриемник(ТекущаяСтрокаДляЗаписи) + + Если НЕ НепосредственноеЧтениеВИБПриемнике Тогда + Возврат Истина; + КонецЕсли; + + ТекущаяСтрокаДляЗаписи = ТекущаяСтрокаДляЗаписи + Символы.ПС + мXMLПравила + Символы.ПС + "" + Символы.ПС; + + РаботаВозможна = мОбработкаДляЗагрузкиДанных.ВыполнитьДействияПередЧтениемДанных(ТекущаяСтрокаДляЗаписи); + + Возврат РаботаВозможна; + +КонецФункции + +Функция ВыполнитьПередачуИнформацииПриЗавершенииПередачиДанных() + + Если НЕ НепосредственноеЧтениеВИБПриемнике Тогда + Возврат Истина; + КонецЕсли; + + мОбработкаДляЗагрузкиДанных.ВыполнитьДействияПослеЗавершенияЧтенияДанных(); + +КонецФункции + +// Выполняет запись имени, типа и значения параметра в фай сообщения обмена для передачи в базу-приемник +// +// Параметры: +// +Процедура ПередатьОдинПараметрВПриемник(Имя, ИсходноеЗначениеПараметра, ПравилоКонвертации = "") Экспорт + + Если ПустаяСтрока(ПравилоКонвертации) Тогда + + УзелПараметра = СоздатьУзел("ЗначениеПараметра"); + + УстановитьАтрибут(УзелПараметра, "Имя", Имя); + УстановитьАтрибут(УзелПараметра, "Тип", Строка(ТипЗнч(ИсходноеЗначениеПараметра))); + + ЭтоNULL = Ложь; + Пусто = одПустое(ИсходноеЗначениеПараметра, ЭтоNULL); + + Если Пусто Тогда + + // надо записать что это пустое значение + одЗаписатьЭлемент(УзелПараметра, "Пусто"); + + УзелПараметра.ЗаписатьКонецЭлемента(); + + ЗаписатьВФайл(УзелПараметра); + + Возврат; + + КонецЕсли; + + одЗаписатьЭлемент(УзелПараметра, "Значение", ИсходноеЗначениеПараметра); + + УзелПараметра.ЗаписатьКонецЭлемента(); + + ЗаписатьВФайл(УзелПараметра); + + Иначе + + УзелПараметра = СоздатьУзел("ЗначениеПараметра"); + + УстановитьАтрибут(УзелПараметра, "Имя", Имя); + + ЭтоNULL = Ложь; + Пусто = одПустое(ИсходноеЗначениеПараметра, ЭтоNULL); + + Если Пусто Тогда + + ПКОСвойств = НайтиПравило(ИсходноеЗначениеПараметра, ПравилоКонвертации); + ТипПриемника = ПКОСвойств.Приемник; + УстановитьАтрибут(УзелПараметра, "Тип", ТипПриемника); + + // надо записать что это пустое значение + одЗаписатьЭлемент(УзелПараметра, "Пусто"); + + УзелПараметра.ЗаписатьКонецЭлемента(); + + ЗаписатьВФайл(УзелПараметра); + + Возврат; + + КонецЕсли; + + ВыгрузитьДанныеСсылочногоОбъекта(ИсходноеЗначениеПараметра, , ПравилоКонвертации, , , УзелПараметра, Истина); + + УзелПараметра.ЗаписатьКонецЭлемента(); + + ЗаписатьВФайл(УзелПараметра); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПередатьДополнительныеПараметрыВПриемник() + + Для Каждого Параметр Из ТаблицаНастройкиПараметров Цикл + + Если Параметр.ПередаватьПараметрПриВыгрузке = Истина Тогда + + ПередатьОдинПараметрВПриемник(Параметр.Имя, Параметр.Значение, Параметр.ПравилоКонвертации); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ПередатьИнформациюОТипахВПриемник() + + Если Не ПустаяСтрока(мСтрокаТиповДляПриемника) Тогда + ЗаписатьВФайл(мСтрокаТиповДляПриемника); + КонецЕсли; + +КонецПроцедуры + +// Выполняет выгрузку данных в соответствии с установленными режимами (правилами обмена) +// +// Параметры: +// Нет. +// +Процедура ВыполнитьВыгрузку() Экспорт + + РежимОбработкиДанных = мРежимыОбработкиДанных.Выгрузка; + + ИнициализироватьВедениеПротоколаОбмена(); + + ИнициализироватьКомментарииПриВыгрузкеИЗагрузкеДанных(); + + ВыгрузкаВозможна = Истина; + ТекущийУровеньВложенностиВыгрузитьПоПравилу = 0; + + мСтекВызововВыгрузкиДанных = Новый ТаблицаЗначений; + мСтекВызововВыгрузкиДанных.Колонки.Добавить("Ссылка"); + мСтекВызововВыгрузкиДанных.Индексы.Добавить("Ссылка"); + + Если мБылиПрочитаныПравилаОбменаПриЗагрузке = Истина тогда + + ЗаписатьВПротоколВыполнения(74); + ВыгрузкаВозможна = Ложь; + + КонецЕсли; + + Если ПустаяСтрока(ИмяФайлаПравилОбмена) Тогда + ЗаписатьВПротоколВыполнения(12); + ВыгрузкаВозможна = Ложь; + КонецЕсли; + + Если НЕ НепосредственноеЧтениеВИБПриемнике Тогда + + Если ПустаяСтрока(ИмяФайлаОбмена) Тогда + ЗаписатьВПротоколВыполнения(10); + ВыгрузкаВозможна = Ложь; + КонецЕсли; + + Иначе + + мОбработкаДляЗагрузкиДанных = ВыполнитьПодключениеКИБПриемнику(); + + ВыгрузкаВозможна = мОбработкаДляЗагрузкиДанных <> Неопределено; + + КонецЕсли; + + //Инициализируем внешнюю обработку с экспортными обработчиками + ИнициализацияВнешнейОбработкиОбработчиковСобытий(ВыгрузкаВозможна, ЭтотОбъект); + + Если Не ВыгрузкаВозможна Тогда + мОбработкаДляЗагрузкиДанных = Неопределено; + Возврат; + КонецЕсли; + + ЗаписатьВПротоколВыполнения("Начало выгрузки: " + ТекущаяДата(), , Ложь, , , Истина); + + ИнициализироватьМенеджерыИСообщения(); + + мXMLДокумент = DOM_НовыйXMLДокумент(); + мСчетчикВыгруженныхОбъектов = 0; + мСчетчикНПП = 0; + ФлагОшибки = Ложь; + + // Загрузка правил обмена + Если Конвертация.Количество() = 9 Тогда + + ЗагрузитьПравилаОбмена(); + Если ФлагОшибки Тогда + ЗавершитьВедениеПротоколаОбмена(); + мОбработкаДляЗагрузкиДанных = Неопределено; + Возврат; + КонецЕсли; + + Иначе + + Для каждого Правило Из ТаблицаПравилКонвертации Цикл + Правило.Выгруженные.Очистить(); + Правило.ВыгруженныеТолькоСсылки.Очистить(); + КонецЦикла; + + КонецЕсли; + + //Присваиваем параметры установленные в диалоге + УстановитьПараметрыИзДиалога(); + + // Открываем файл обмена + ТекущаяСтрокаДляЗаписи = ОткрытьФайлВыгрузки() + Символы.ПС; + + Если ФлагОшибки Тогда + ФайлОбмена = Неопределено; + ЗавершитьВедениеПротоколаОбмена(); + мОбработкаДляЗагрузкиДанных = Неопределено; + Возврат; + КонецЕсли; + + //Определяем интерфейсы обработчиков + Если ФлагРежимОтладкиОбработчиков Тогда + + ДополнитьПравилаИнтерфейсамиОбработчиков(Конвертация, ТаблицаПравилКонвертации, ТаблицаПравилВыгрузки, ТаблицаПравилОчистки); + + КонецЕсли; + + Попытка + + // Включаем правила обмена в файл + ФайлОбмена.ЗаписатьСтроку(мXMLПравила); + + РаботаВозможна = ВыполнитьПередачуИнформацииОНачалеОбменаВПриемник(ТекущаяСтрокаДляЗаписи); + + Если Не РаботаВозможна Тогда + ФайлОбмена = Неопределено; + ЗавершитьВедениеПротоколаОбмена(); + мОбработкаДляЗагрузкиДанных = Неопределено; + ДеструкторВнешнейОбработкиОбработчиковСобытий(); + Возврат; + КонецЕсли; + + // Обработчик ПередВыгрузкойДанных + Отказ = Ложь; + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Если Не ПустаяСтрока(Конвертация.ПередВыгрузкойДанных) Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Конвертация, "ПередВыгрузкойДанных")); + + КонецЕсли; + + Иначе + + Выполнить(Конвертация.ПередВыгрузкойДанных); + + КонецЕсли; + + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(62, ОписаниеОшибки(), "ПередВыгрузкойДанных (конвертация)"); + Отказ = Истина; + КонецПопытки; + + Если Отказ Тогда // Отказ от выгрузки данных + ФайлОбмена = Неопределено; + ЗавершитьВедениеПротоколаОбмена(); + мОбработкаДляЗагрузкиДанных = Неопределено; + ДеструкторВнешнейОбработкиОбработчиковСобытий(); + Возврат; + КонецЕсли; + + Если ВыполнитьОбменДаннымиВОптимизированномФормате Тогда + ПередатьИнформациюОТипахВПриемник(); + КонецЕсли; + + // нужно параметры передать в приемник + ПередатьДополнительныеПараметрыВПриемник(); + + ТекстСобытияПослеЗагрузкиПараметров = ""; + Если Конвертация.Свойство("ПослеЗагрузкиПараметров", ТекстСобытияПослеЗагрузкиПараметров) + И Не ПустаяСтрока(ТекстСобытияПослеЗагрузкиПараметров) Тогда + + ЗаписьСобытия = Новый ЗаписьXML; + ЗаписьСобытия.УстановитьСтроку(); + одЗаписатьЭлемент(ЗаписьСобытия, "АлгоритмПослеЗагрузкиПараметров", ТекстСобытияПослеЗагрузкиПараметров); + ЗаписатьВФайл(ЗаписьСобытия); + + КонецЕсли; + + СоответствиеУзловИПравилВыгрузки = Новый Соответствие(); + СтруктураДляУдаленияРегистрацииИзменений = Новый Соответствие(); + + ОбработатьПравилаВыгрузки(ТаблицаПравилВыгрузки.Строки, СоответствиеУзловИПравилВыгрузки); + + УдачноВыгруженоПоПланамОбмена = ОбработатьВыгрузкуДляПлановОбмена(СоответствиеУзловИПравилВыгрузки, СтруктураДляУдаленияРегистрацииИзменений); + + Если УдачноВыгруженоПоПланамОбмена Тогда + + ОбработатьИзменениеРегистрацииДляУзловОбмена(СтруктураДляУдаленияРегистрацииИзменений); + + КонецЕсли; + + + // Обработчик ПослеВыгрузкиДанных + Попытка + + Если ФлагРежимОтладкиОбработчиков Тогда + + Если Не ПустаяСтрока(Конвертация.ПослеВыгрузкиДанных) Тогда + + Выполнить(ПолучитьСтрокуВызоваОбработчика(Конвертация, "ПослеВыгрузкиДанных")); + + КонецЕсли; + + Иначе + + Выполнить(Конвертация.ПослеВыгрузкиДанных); + + КонецЕсли; + + Исключение + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(63, ОписаниеОшибки(), "ПослеВыгрузкиДанных (конвертация)"); + КонецПопытки; + + Исключение + + СтрокаОшибки = ОписаниеОшибки(); + + ЗаписатьВПротоколВыполнения("Ошибка при выгрузке данных: " + СтрокаОшибки, Неопределено, Истина, , , Истина); + + ВыполнитьПередачуИнформацииПриЗавершенииПередачиДанных(); + + ЗавершитьВедениеПротоколаОбмена(); + ЗакрытьФайл(); + мОбработкаДляЗагрузкиДанных = Неопределено; + + Возврат; + + КонецПопытки; + + Если Отказ Тогда // Отказ от записи файла данных + + ВыполнитьПередачуИнформацииПриЗавершенииПередачиДанных(); + + ЗавершитьВедениеПротоколаОбмена(); + мОбработкаДляЗагрузкиДанных = Неопределено; + ФайлОбмена = Неопределено; + + ДеструкторВнешнейОбработкиОбработчиковСобытий(); + + Возврат; + КонецЕсли; + + // Закрываем файл обмена + ЗакрытьФайл(); + + Если АрхивироватьФайл Тогда + СжатьРезультирующийФайлОбмена(); + КонецЕсли; + + ВыполнитьПередачуИнформацииПриЗавершенииПередачиДанных(); + + ЗаписатьВПротоколВыполнения("Окончание выгрузки: " + ТекущаяДата(), , Ложь, , ,Истина); + ЗаписатьВПротоколВыполнения("Выгружено объектов: " + мСчетчикВыгруженныхОбъектов, , Ложь, , , Истина); + + ЗавершитьВедениеПротоколаОбмена(); + + мОбработкаДляЗагрузкиДанных = Неопределено; + + ДеструкторВнешнейОбработкиОбработчиковСобытий(); + + #Если Клиент Тогда + Если ЭтоИнтерактивныйРежим Тогда + ОткрытьДанныеПротоколовОбменаПриНеобходимости(); + Предупреждение("Выгрузка данных завершена!"); + КонецЕсли; + #КонецЕсли + +КонецПроцедуры // ВыполнитьВыгрузку() + +//////////////////////////////////////////////////////////////////////////////// +// УСТАНОВКА ЗНАЧЕНИЙ РЕКВИЗИТОВ И МОДАЛЬНЫХ ПЕРЕМЕННЫХ ОБРАБОТКИ + +// Процедура установки значения глобальной переменной "ФлагОшибки" +// +// Параметры: +// Значение - Булево, новое значение переменной "ФлагОшибки" +// +Процедура УстановитьФлагОшибки(Значение) + + ФлагОшибки = Значение; + + Если ФлагОшибки Тогда + + ДеструкторВнешнейОбработкиОбработчиковСобытий(); + + КонецЕсли; + +КонецПроцедуры + +// Возвращает текущее значение версии обработки +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Текущее значение версии обработки +// +Функция ВерсияОбъекта() Экспорт + + Возврат 28; + +КонецФункции + +// Возвращает текущее значение версии обработки +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Текущее значение версии обработки +// +Функция ВерсияОбъектаСтрокой() Экспорт + + Возврат "2.0.28"; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ИНИЦИАЛИЗАЦИЯ ТАБЛИЦ ПРАВИЛ ОБМЕНА + +Процедура ДобавитьНедостающиеКолонки(Колонки, Имя, Типы = Неопределено) + + Если Колонки.Найти(Имя) <> Неопределено Тогда + Возврат; + КонецЕсли; + + Колонки.Добавить(Имя, Типы); + +КонецПроцедуры + +// Инициализирует колонки таблицы правил конвертации свойств объектов +// +// Параметры: +// Таб - ТаблицаЗначений. инициализируемая таблица правил конвертации свойств +// +Процедура ИнициализацияТаблицыПравилКонвертацииСвойств(Таб) Экспорт + + Колонки = Таб.Колонки; + + ДобавитьНедостающиеКолонки(Колонки, "Имя"); + ДобавитьНедостающиеКолонки(Колонки, "Наименование"); + ДобавитьНедостающиеКолонки(Колонки, "Порядок"); + + ДобавитьНедостающиеКолонки(Колонки, "ЭтоГруппа", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ПравилаГруппы"); + + ДобавитьНедостающиеКолонки(Колонки, "ВидИсточника"); + ДобавитьНедостающиеКолонки(Колонки, "ВидПриемника"); + + ДобавитьНедостающиеКолонки(Колонки, "УпрощеннаяВыгрузкаСвойства", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "НуженУзелXMLПриВыгрузке", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "НуженУзелXMLПриВыгрузкеГруппы", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "ТипИсточника", одОписаниеТипа("Строка")); + ДобавитьНедостающиеКолонки(Колонки, "ТипПриемника", одОписаниеТипа("Строка")); + + ДобавитьНедостающиеКолонки(Колонки, "Источник"); + ДобавитьНедостающиеКолонки(Колонки, "Приемник"); + + ДобавитьНедостающиеКолонки(Колонки, "ПравилоКонвертации"); + + ДобавитьНедостающиеКолонки(Колонки, "ПолучитьИзВходящихДанных", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "НеЗамещать", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "ПередВыгрузкой"); + ДобавитьНедостающиеКолонки(Колонки, "ПриВыгрузке"); + ДобавитьНедостающиеКолонки(Колонки, "ПослеВыгрузки"); + + ДобавитьНедостающиеКолонки(Колонки, "ПередОбработкойВыгрузки"); + ДобавитьНедостающиеКолонки(Колонки, "ПослеОбработкиВыгрузки"); + + ДобавитьНедостающиеКолонки(Колонки, "ЕстьОбработчикПередВыгрузкой", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ЕстьОбработчикПриВыгрузке", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ЕстьОбработчикПослеВыгрузки", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "ЕстьОбработчикПередОбработкойВыгрузки", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ЕстьОбработчикПослеОбработкиВыгрузки", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "ПриводитьКДлине", одОписаниеТипа("Число")); + ДобавитьНедостающиеКолонки(Колонки, "ИмяПараметраДляПередачи"); + ДобавитьНедостающиеКолонки(Колонки, "ПоискПоДатеНаРавенство", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ВыгружатьГруппуЧерезФайл", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "СтрокаПолейПоиска"); + +КонецПроцедуры // ИнициализацияТаблицыПравилКонвертацииСвойств() + +// Инициализирует колонки таблицы правил конвертации объектов +// +// Параметры: +// Нет. +// +Процедура ИнициализацияТаблицыПравилКонвертации() + + Колонки = ТаблицаПравилКонвертации.Колонки; + + ДобавитьНедостающиеКолонки(Колонки, "Имя"); + ДобавитьНедостающиеКолонки(Колонки, "Наименование"); + ДобавитьНедостающиеКолонки(Колонки, "Порядок"); + + ДобавитьНедостающиеКолонки(Колонки, "СинхронизироватьПоИдентификатору"); + ДобавитьНедостающиеКолонки(Колонки, "НеСоздаватьЕслиНеНайден", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "НеВыгружатьОбъектыСвойствПоСсылкам", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ПродолжитьПоискПоПолямПоискаЕслиПоИдентификаторуНеНашли", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ИспользоватьБыстрыйПоискПриЗагрузке", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ГенерироватьНовыйНомерИлиКодЕслиНеУказан", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "МаленькоеКоличествоОбъектов", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "КоличествоОбращенийДляВыгрузкиСсылки", одОписаниеТипа("Число")); + ДобавитьНедостающиеКолонки(Колонки, "КоличествоЭлементовВИБ", одОписаниеТипа("Число")); + + ДобавитьНедостающиеКолонки(Колонки, "СпособВыгрузки"); + + ДобавитьНедостающиеКолонки(Колонки, "Источник"); + ДобавитьНедостающиеКолонки(Колонки, "Приемник"); + + ДобавитьНедостающиеКолонки(Колонки, "ТипИсточника", одОписаниеТипа("Строка")); + + ДобавитьНедостающиеКолонки(Колонки, "ПередВыгрузкой"); + ДобавитьНедостающиеКолонки(Колонки, "ПриВыгрузке"); + ДобавитьНедостающиеКолонки(Колонки, "ПослеВыгрузки"); + ДобавитьНедостающиеКолонки(Колонки, "ПослеВыгрузкиВФайл"); + + ДобавитьНедостающиеКолонки(Колонки, "ЕстьОбработчикПередВыгрузкой", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ЕстьОбработчикПриВыгрузке", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ЕстьОбработчикПослеВыгрузки", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ЕстьОбработчикПослеВыгрузкиВФайл", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "ПередЗагрузкой"); + ДобавитьНедостающиеКолонки(Колонки, "ПриЗагрузке"); + ДобавитьНедостающиеКолонки(Колонки, "ПослеЗагрузки"); + + ДобавитьНедостающиеКолонки(Колонки, "ПоследовательностьПолейПоиска"); + ДобавитьНедостающиеКолонки(Колонки, "ПоискПоТабличнымЧастям"); + + ДобавитьНедостающиеКолонки(Колонки, "ЕстьОбработчикПередЗагрузкой", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ЕстьОбработчикПриЗагрузке", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ЕстьОбработчикПослеЗагрузки", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "ЕстьОбработчикПоследовательностьПолейПоиска", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "СвойстваПоиска", одОписаниеТипа("ТаблицаЗначений")); + ДобавитьНедостающиеКолонки(Колонки, "Свойства", одОписаниеТипа("ТаблицаЗначений")); + + ДобавитьНедостающиеКолонки(Колонки, "Значения", одОписаниеТипа("Соответствие")); + + ДобавитьНедостающиеКолонки(Колонки, "Выгруженные", одОписаниеТипа("Соответствие")); + ДобавитьНедостающиеКолонки(Колонки, "ВыгруженныеТолькоСсылки", одОписаниеТипа("Соответствие")); + ДобавитьНедостающиеКолонки(Колонки, "ВыгружатьПредставлениеИсточника", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "НеЗамещать", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "ЗапоминатьВыгруженные", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ВсеОбъектыВыгружены", одОписаниеТипа("Булево")); + +КонецПроцедуры // ИнициализацияТаблицыПравилКонвертации() + +// Инициализирует колонки таблицы правил выгрузки данных +// +// Параметры: +// Нет +// +Процедура ИнициализацияТаблицыПравилВыгрузки() + + Колонки = ТаблицаПравилВыгрузки.Колонки; + + ДобавитьНедостающиеКолонки(Колонки, "Включить", одОписаниеТипа("Число")); + ДобавитьНедостающиеКолонки(Колонки, "ЭтоГруппа", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "Имя"); + ДобавитьНедостающиеКолонки(Колонки, "Наименование"); + ДобавитьНедостающиеКолонки(Колонки, "Порядок"); + + ДобавитьНедостающиеКолонки(Колонки, "СпособОтбораДанных"); + ДобавитьНедостающиеКолонки(Колонки, "ОбъектВыборки"); + + ДобавитьНедостающиеКолонки(Колонки, "ПравилоКонвертации"); + + ДобавитьНедостающиеКолонки(Колонки, "ПередОбработкой"); + ДобавитьНедостающиеКолонки(Колонки, "ПослеОбработки"); + + ДобавитьНедостающиеКолонки(Колонки, "ПередВыгрузкой"); + ДобавитьНедостающиеКолонки(Колонки, "ПослеВыгрузки"); + + // Колонки для поддержки отбора с помощью построителя + ДобавитьНедостающиеКолонки(Колонки, "ИспользоватьОтбор", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "НастройкиПостроителя"); + ДобавитьНедостающиеКолонки(Колонки, "ИмяОбъектаДляЗапроса"); + ДобавитьНедостающиеКолонки(Колонки, "ИмяОбъектаДляЗапросаРегистра"); + + ДобавитьНедостающиеКолонки(Колонки, "ВыбиратьДанныеДляВыгрузкиОднимЗапросом", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "СсылкаНаУзелОбмена"); + +КонецПроцедуры // ИнициализацияТаблицыПравилВыгрузки() + +// Инициализирует колонки таблицы правил очистки данных +// +// Параметры: +// Нет. +// +Процедура ИнициализацияТаблицыПравилОчистки() + + Колонки = ТаблицаПравилОчистки.Колонки; + + ДобавитьНедостающиеКолонки(Колонки, "Включить", одОписаниеТипа("Булево")); + ДобавитьНедостающиеКолонки(Колонки, "ЭтоГруппа", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "Имя"); + ДобавитьНедостающиеКолонки(Колонки, "Наименование"); + ДобавитьНедостающиеКолонки(Колонки, "Порядок", одОписаниеТипа("Число")); + + ДобавитьНедостающиеКолонки(Колонки, "СпособОтбораДанных"); + ДобавитьНедостающиеКолонки(Колонки, "ОбъектВыборки"); + + ДобавитьНедостающиеКолонки(Колонки, "УдалятьЗаПериод"); + ДобавитьНедостающиеКолонки(Колонки, "Непосредственно", одОписаниеТипа("Булево")); + + ДобавитьНедостающиеКолонки(Колонки, "ПередОбработкой"); + ДобавитьНедостающиеКолонки(Колонки, "ПослеОбработки"); + ДобавитьНедостающиеКолонки(Колонки, "ПередУдалением"); + +КонецПроцедуры // ИнициализацияТаблицыПравилОчистки() + +// Инициализирует колонки таблицы настройки параметров +// +// Параметры: +// Нет. +// +Процедура ИнициализацияТаблицыНастройкиПараметров() + + Колонки = ТаблицаНастройкиПараметров.Колонки; + + ДобавитьНедостающиеКолонки(Колонки, "Имя"); + ДобавитьНедостающиеКолонки(Колонки, "Наименование"); + ДобавитьНедостающиеКолонки(Колонки, "Значение"); + ДобавитьНедостающиеКолонки(Колонки, "ПередаватьПараметрПриВыгрузке"); + ДобавитьНедостающиеКолонки(Колонки, "ПравилоКонвертации"); + +КонецПроцедуры // ИнициализацияТаблицыПравилОчистки() + +//////////////////////////////////////////////////////////////////////////////// +// ИНИЦИАЛИЗАЦИЯ РЕКВИЗИТОВ И МОДУЛЬНЫХ ПЕРЕМЕННЫХ + +Процедура ИнициализироватьКомментарииПриВыгрузкеИЗагрузкеДанных() + + КомментарийПриВыгрузкеДанных = ""; + КомментарийПриЗагрузкеДанных = ""; + +КонецПроцедуры + +// Инициализирует переменную одСообщения, содержащую соответствия кодов сообщений их описаниям +// +// Параметры: +// Нет. +// +Процедура ИнициализацияСообщений() + + одСообщения = Новый Соответствие; + + одСообщения.Вставить(2, "Ошибка распаковки файла обмена. Файл заблокирован."); + одСообщения.Вставить(3, "Указанный файл правил обмена не существует!"); + одСообщения.Вставить(4, "Ошибка при создании COM-объекта Msxml2.DOMDocument"); + одСообщения.Вставить(5, "Ошибка открытия файла обмена"); + одСообщения.Вставить(6, "Ошибка при загрузке правил обмена"); + одСообщения.Вставить(7, "Ошибка формата правил обмена"); + одСообщения.Вставить(8, "Не корректно указано имя файла для выгрузки данных"); + одСообщения.Вставить(9, "Ошибка формата файла обмена"); + одСообщения.Вставить(10, "Не указано имя файла для выгрузки данных (Имя файла данных)"); + одСообщения.Вставить(11, "Ссылка на несуществующий объект метаданных в правилах обмена"); + одСообщения.Вставить(12, "Не указано имя файла с правилами обмена (Имя файла правил)"); + + одСообщения.Вставить(13, "Ошибка получения значения свойства объекта (по имени свойства источника)"); + одСообщения.Вставить(14, "Ошибка получения значения свойства объекта (по имени свойства приемника)"); + + одСообщения.Вставить(15, "Не указано имя файла для загрузки данных (Имя файла для загрузки)"); + + одСообщения.Вставить(16, "Ошибка получения значения свойства подчиненного объекта (по имени свойства источника)"); + одСообщения.Вставить(17, "Ошибка получения значения свойства подчиненного объекта (по имени свойства приемника)"); + + одСообщения.Вставить(19, "Ошибка в обработчике события ПередЗагрузкойОбъекта"); + одСообщения.Вставить(20, "Ошибка в обработчике события ПриЗагрузкеОбъекта"); + одСообщения.Вставить(21, "Ошибка в обработчике события ПослеЗагрузкиОбъекта"); + одСообщения.Вставить(22, "Ошибка в обработчике события ПередЗагрузкойДанных (конвертация)"); + одСообщения.Вставить(23, "Ошибка в обработчике события ПослеЗагрузкиДанных (конвертация)"); + одСообщения.Вставить(24, "Ошибка при удалении объекта"); + одСообщения.Вставить(25, "Ошибка при записи документа"); + одСообщения.Вставить(26, "Ошибка записи объекта"); + одСообщения.Вставить(27, "Ошибка в обработчике события ПередОбработкойПравилаОчистки"); + одСообщения.Вставить(28, "Ошибка в обработчике события ПослеОбработкиПравилаОчистки"); + одСообщения.Вставить(29, "Ошибка в обработчике события ПередУдалениемОбъекта"); + + одСообщения.Вставить(31, "Ошибка в обработчике события ПередОбработкойПравилаВыгрузки"); + одСообщения.Вставить(32, "Ошибка в обработчике события ПослеОбработкиПравилаВыгрузки"); + одСообщения.Вставить(33, "Ошибка в обработчике события ПередВыгрузкойОбъекта"); + одСообщения.Вставить(34, "Ошибка в обработчике события ПослеВыгрузкиОбъекта"); + + одСообщения.Вставить(39, "Ошибка при выполнении алгоритма, содержащегося в файле обмена"); + + одСообщения.Вставить(41, "Ошибка в обработчике события ПередВыгрузкойОбъекта"); + одСообщения.Вставить(42, "Ошибка в обработчике события ПриВыгрузкеОбъекта"); + одСообщения.Вставить(43, "Ошибка в обработчике события ПослеВыгрузкиОбъекта"); + + одСообщения.Вставить(45, "Не найдено правило конвертации объектов"); + + одСообщения.Вставить(48, "Ошибка в обработчике события ПередОбработкойВыгрузки группы свойств"); + одСообщения.Вставить(49, "Ошибка в обработчике события ПослеОбработкиВыгрузки группы свойств"); + одСообщения.Вставить(50, "Ошибка в обработчике события ПередВыгрузкой (объекта коллекции)"); + одСообщения.Вставить(51, "Ошибка в обработчике события ПриВыгрузке (объекта коллекции)"); + одСообщения.Вставить(52, "Ошибка в обработчике события ПослеВыгрузки (объекта коллекции)"); + одСообщения.Вставить(53, "Ошибка в глобальном обработчике события ПередЗагрузкойОбъекта (конвертация)"); + одСообщения.Вставить(54, "Ошибка в глобальном обработчике события ПослеЗагрузкиОбъекта (конвертация)"); + одСообщения.Вставить(55, "Ошибка в обработчике события ПередВыгрузкой (свойства)"); + одСообщения.Вставить(56, "Ошибка в обработчике события ПриВыгрузке (свойства)"); + одСообщения.Вставить(57, "Ошибка в обработчике события ПослеВыгрузки (свойства)"); + + одСообщения.Вставить(62, "Ошибка в обработчике события ПередВыгрузкойДанных (конвертация)"); + одСообщения.Вставить(63, "Ошибка в обработчике события ПослеВыгрузкиДанных (конвертация)"); + одСообщения.Вставить(64, "Ошибка в глобальном обработчике события ПередКонвертациейОбъекта (конвертация)"); + одСообщения.Вставить(65, "Ошибка в глобальном обработчике события ПередВыгрузкойОбъекта (конвертация)"); + одСообщения.Вставить(66, "Ошибка получения коллекции подчиненных объектов из входящих данных "); + одСообщения.Вставить(67, "Ошибка получения свойства подчиненного объекта из входящих данных "); + одСообщения.Вставить(68, "Ошибка получения свойства объекта из входящих данных "); + + одСообщения.Вставить(69, "Ошибка в глобальном обработчике события ПослеВыгрузкиОбъекта (конвертация)"); + + одСообщения.Вставить(71, "Не найдено соответствие для значения Источника"); + + одСообщения.Вставить(72, "Ошибка при выгрузке данных для узла плана обмена "); + + одСообщения.Вставить(73, "Ошибка в обработчике события ПоследовательностьПолейПоиска "); + + одСообщения.Вставить(74, "Необходимо перезагрузить правила обмена для выгрузки данных."); + + одСообщения.Вставить(75, "Ошибка при выполнении алгоритма после загрузки значений параметров"); + + одСообщения.Вставить(76, "Ошибка в обработчике события ПослеВыгрузкиОбъектаВФайл"); + + одСообщения.Вставить(77, "Не указан файл внешней обработки с подключаемыми процедурами обработчиков событий."); + + одСообщения.Вставить(78, "Ошибка создания внешней обработки из файла с процедурами обработчиков событий."); + + одСообщения.Вставить(79, "Внимание! Рекурсивный вызов алгоритмов! + |Код алгоритмов не может быть интегрирован в обработчик! + |Если в процессе отладки нет необходимости отлаживать код алгоритмов, то укажите режим ""не отлаживать алгоритмы"" + |Если необходимо выполнять отладку алгоритмов с рекурсивным вызовом, то укажите режим ""алгоритмы отлаживать как процедуры"" + |и повторите выгрузку."); + + одСообщения.Вставить(1000, "Ошибка при создании временного файла выгрузки данных"); + +КонецПроцедуры // ИнициализацияСообщений() + +Процедура ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, ИмяТипа, Менеджер, ПрефиксИмениТипа, ВозможенПоискПоПредопределенным = Ложь) + + Имя = ОбъектМД.Имя; + ТипСсылкиСтрокой = ПрефиксИмениТипа + "." + Имя; + СтрокаПоиска = "ВЫБРАТЬ Ссылка ИЗ " + ИмяТипа + "." + Имя + " ГДЕ "; + ТипСсылки = Тип(ТипСсылкиСтрокой); + Структура = Новый Структура("Имя,ИмяТипа,ТипСсылкиСтрокой,Менеджер,ОбъектМД,СтрокаПоиска,ВозможенПоискПоПредопределенным,ПКО", Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, СтрокаПоиска, ВозможенПоискПоПредопределенным); + Менеджеры.Вставить(ТипСсылки, Структура); + + + СтруктураДляПланаОбмена = Новый Структура("Имя,ТипСсылки,ЭтоСсылочныйТип,ЭтоРегистр", Имя, ТипСсылки, Истина, Ложь); + МенеджерыДляПлановОбмена.Вставить(ОбъектМД, СтруктураДляПланаОбмена); + +КонецПроцедуры + +Процедура ДополнитьМассивМенеджеровТипомРегистра(Менеджеры, ОбъектМД, ИмяТипа, Менеджер, ПрефиксИмениТипаЗапись, ПрефиксИмениТипаВыборка) + + Периодический = Неопределено; + + Имя = ОбъектМД.Имя; + ТипСсылкиСтрокой = ПрефиксИмениТипаЗапись + "." + Имя; + ТипСсылки = Тип(ТипСсылкиСтрокой); + Структура = Новый Структура("Имя,ИмяТипа,ТипСсылкиСтрокой,Менеджер,ОбъектМД,ВозможенПоискПоПредопределенным,ПКО", Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, Ложь); + + Если ИмяТипа = "РегистрСведений" Тогда + + Периодический = (ОбъектМД.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический); + ПодчиненныйРегистратору = (ОбъектМД.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору); + + Структура.Вставить("Периодический", Периодический); + Структура.Вставить("ПодчиненныйРегистратору", ПодчиненныйРегистратору); + + КонецЕсли; + + Менеджеры.Вставить(ТипСсылки, Структура); + + + СтруктураДляПланаОбмена = Новый Структура("Имя,ТипСсылки,ЭтоСсылочныйТип,ЭтоРегистр", Имя, ТипСсылки, Ложь, Истина); + МенеджерыДляПлановОбмена.Вставить(ОбъектМД, СтруктураДляПланаОбмена); + + + ТипСсылкиСтрокой = ПрефиксИмениТипаВыборка + "." + Имя; + ТипСсылки = Тип(ТипСсылкиСтрокой); + Структура = Новый Структура("Имя,ИмяТипа,ТипСсылкиСтрокой,Менеджер,ОбъектМД,ВозможенПоискПоПредопределенным,ПКО", Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, Ложь); + + Если Периодический <> Неопределено Тогда + + Структура.Вставить("Периодический", Периодический); + Структура.Вставить("ПодчиненныйРегистратору", ПодчиненныйРегистратору); + + КонецЕсли; + + Менеджеры.Вставить(ТипСсылки, Структура); + +КонецПроцедуры + +// Инициализирует переменную Менеджеры, содержащую соответствия типов объектов их свойствам +// +// Параметры: +// Нет. +// +Процедура ИнициализацияМенеджеров() + + Менеджеры = Новый Соответствие; + + МенеджерыДляПлановОбмена = Новый Соответствие; + + // ССЫЛКИ + + Для каждого ОбъектМД Из Метаданные.Справочники Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "Справочник", Справочники[ОбъектМД.Имя], "СправочникСсылка", Истина); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.Документы Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "Документ", Документы[ОбъектМД.Имя], "ДокументСсылка"); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.ПланыВидовХарактеристик Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "ПланВидовХарактеристик", ПланыВидовХарактеристик[ОбъектМД.Имя], "ПланВидовХарактеристикСсылка", Истина); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.ПланыСчетов Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "ПланСчетов", ПланыСчетов[ОбъектМД.Имя], "ПланСчетовСсылка", Истина); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.ПланыВидовРасчета Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "ПланВидовРасчета", ПланыВидовРасчета[ОбъектМД.Имя], "ПланВидовРасчетаСсылка", Истина); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.ПланыОбмена Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "ПланОбмена", ПланыОбмена[ОбъектМД.Имя], "ПланОбменаСсылка"); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.Задачи Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "Задача", Задачи[ОбъектМД.Имя], "ЗадачаСсылка"); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.БизнесПроцессы Цикл + + ДополнитьМассивМенеджеровСсылочнымТипом(Менеджеры, МенеджерыДляПлановОбмена, ОбъектМД, "БизнесПроцесс", БизнесПроцессы[ОбъектМД.Имя], "БизнесПроцессСсылка"); + + ИмяТипа = "ТочкаМаршрутаБизнесПроцесса"; + // ссылка на точки маршрута + Имя = ОбъектМД.Имя; + Менеджер = БизнесПроцессы[Имя].ТочкиМаршрута; + СтрокаПоиска = ""; + ТипСсылкиСтрокой = "ТочкаМаршрутаБизнесПроцессаСсылка." + Имя; + ТипСсылки = Тип(ТипСсылкиСтрокой); + Структура = Новый Структура("Имя,ИмяТипа,ТипСсылкиСтрокой,Менеджер,ОбъектМД,ПКО,ПустаяСсылка,ВозможенПоискПоПредопределенным,СтрокаПоиска", Имя, + ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, , Неопределено, Ложь, СтрокаПоиска); + Менеджеры.Вставить(ТипСсылки, Структура); + + КонецЦикла; + + // РЕГИСТРЫ + + Для каждого ОбъектМД Из Метаданные.РегистрыСведений Цикл + + ДополнитьМассивМенеджеровТипомРегистра(Менеджеры, ОбъектМД, "РегистрСведений", РегистрыСведений[ОбъектМД.Имя], "РегистрСведенийЗапись", "РегистрСведенийВыборка"); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.РегистрыБухгалтерии Цикл + + ДополнитьМассивМенеджеровТипомРегистра(Менеджеры, ОбъектМД, "РегистрБухгалтерии", РегистрыБухгалтерии[ОбъектМД.Имя], "РегистрБухгалтерииЗапись", "РегистрБухгалтерииВыборка"); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.РегистрыНакопления Цикл + + ДополнитьМассивМенеджеровТипомРегистра(Менеджеры, ОбъектМД, "РегистрНакопления", РегистрыНакопления[ОбъектМД.Имя], "РегистрНакопленияЗапись", "РегистрНакопленияВыборка"); + + КонецЦикла; + + Для каждого ОбъектМД Из Метаданные.РегистрыРасчета Цикл + + ДополнитьМассивМенеджеровТипомРегистра(Менеджеры, ОбъектМД, "РегистрРасчета", РегистрыРасчета[ОбъектМД.Имя], "РегистрРасчетаЗапись", "РегистрРасчетаВыборка"); + + КонецЦикла; + + ИмяТипа = "Перечисление"; + + Для каждого ОбъектМД Из Метаданные.Перечисления Цикл + + Имя = ОбъектМД.Имя; + Менеджер = Перечисления[Имя]; + ТипСсылкиСтрокой = "ПеречислениеСсылка." + Имя; + ТипСсылки = Тип(ТипСсылкиСтрокой); + Структура = Новый Структура("Имя,ИмяТипа,ТипСсылкиСтрокой,Менеджер,ОбъектМД,ПКО,ПустаяСсылка,ВозможенПоискПоПредопределенным", Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, , Перечисления[Имя].ПустаяСсылка(), Ложь); + Менеджеры.Вставить(ТипСсылки, Структура); + + КонецЦикла; + + // Константы + ИмяТипа = "Константы"; + ОбъектМД = Метаданные.Константы; + Имя = "Константы"; + Менеджер = Константы; + ТипСсылкиСтрокой = "КонстантыНабор"; + ТипСсылки = Тип(ТипСсылкиСтрокой); + Структура = Новый Структура("Имя,ИмяТипа,ТипСсылкиСтрокой,Менеджер,ОбъектМД,ВозможенПоискПоПредопределенным,ПКО", Имя, ИмяТипа, ТипСсылкиСтрокой, Менеджер, ОбъектМД, Ложь); + Менеджеры.Вставить(ТипСсылки, Структура); + +КонецПроцедуры // ИнициализацияМенеджеров() + +// Выполняет инициализация менеджеров объектов и всех сообщений протокола обмена данными +// +// Параметры: +// Нет. +// +Процедура ИнициализироватьМенеджерыИСообщения() Экспорт + + Если Менеджеры = Неопределено Тогда + ИнициализацияМенеджеров(); + КонецЕсли; + + Если одСообщения = Неопределено Тогда + ИнициализацияСообщений(); + КонецЕсли; + +КонецПроцедуры + +Процедура СоздатьСтруктуруКонвертации() + + Конвертация = Новый Структура("ПередВыгрузкойДанных, ПослеВыгрузкиДанных, ПередВыгрузкойОбъекта, ПослеВыгрузкиОбъекта, ПередКонвертациейОбъекта, ПередЗагрузкойОбъекта, ПослеЗагрузкиОбъекта, ПередЗагрузкойДанных, ПослеЗагрузкиДанных"); + +КонецПроцедуры + +// Инициализирует реквизиты обработки и модульные переменные +// +// Параметры: +// Нет. +// +Процедура ИнициализацияРеквизитовИМодульныхПеременных() + + КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 100; + + ЗапоминатьЗагруженныеОбъекты = Истина; + ЧислоХранимыхЗагруженныхОбъектов = 5000; + + ПараметрыИнициализированы = Ложь; + + ВестиДополнительныйКонтрольЗаписиВXML = Ложь; + НепосредственноеЧтениеВИБПриемнике = Ложь; + НеВыводитьНикакихИнформационныхСообщенийПользователю = Ложь; + + Менеджеры = Неопределено; + одСообщения = Неопределено; + + ФлагОшибки = Ложь; + + СоздатьСтруктуруКонвертации(); + + Правила = Новый Структура; + Алгоритмы = Новый Структура; + ДопОбработки = Новый Структура; + Запросы = Новый Структура; + + Параметры = Новый Структура; + СобытияПослеЗагрузкиПараметров = Новый Структура; + + ПараметрыДопОбработок = Новый Структура; + + мXMLПравила = Неопределено; + мXMLДокумент = DOM_НовыйXMLДокумент(); + + + // Типы + + одТипСтрока = Тип("Строка"); + одТипБулево = Тип("Булево"); + одТипЧисло = Тип("Число"); + одТипДата = Тип("Дата"); + одТипХранилищеЗначения = Тип("ХранилищеЗначения"); + одТипДвоичныеДанные = Тип("ДвоичныеДанные"); + одТипВидДвиженияНакопления = Тип("ВидДвиженияНакопления"); + одТипУдалениеОбъекта = Тип("УдалениеОбъекта"); + одТипВидСчета = Тип("ВидСчета"); + одТипТип = Тип("Тип"); + одТипСоответствие = Тип("Соответствие"); + + ЗначениеПустаяДата = Дата('00010101'); + + // Типы узлов xml + + одТипУзлаXML_КонецЭлемента = ТипУзлаXML.КонецЭлемента; + одТипУзлаXML_НачалоЭлемента = ТипУзлаXML.НачалоЭлемента; + одТипУзлаXML_Текст = ТипУзлаXML.Текст; + + + мСписокМакетовПравилОбмена = Новый СписокЗначений; + + Для каждого Макет Из ЭтотОбъект.Метаданные().Макеты Цикл + мСписокМакетовПравилОбмена.Добавить(Макет.Синоним); + КонецЦикла; + + мФайлПротоколаДанных = Неопределено; + + ТипИнформационнойБазыДляПодключения = Истина; + АутентификацияWindowsИнформационнойБазыДляПодключения = Ложь; + ВерсияПлатформыИнформационнойБазыДляПодключения = "V8"; + ОткрыватьПротоколыОбменаПослеВыполненияОпераций = Ложь; + ЗагружатьДанныеВРежимеОбмена = Истина; + ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты = Истина; + ЗаписыватьРегистрыНаборамиЗаписей = Истина; + ОптимизированнаяЗаписьОбъектов = Истина; + ВыгружатьТолькоРазрешенные = Истина; + ОбъектыПоСсылкеЗагружатьБезПометкиУдаления = Истина; + ИспользоватьОтборПоДатеДляВсехОбъектов = Истина; + + мСоответствиеПустыхЗначенийТипов = Новый Соответствие; + мСоответствиеОписаниеТипов = Новый Соответствие; + + мБылиПрочитаныПравилаОбменаПриЗагрузке = Ложь; + + ОбработчикиСобытийЧитаемИзФайлаПравилОбмена = Истина; + + мРежимыОбработкиДанных = Новый Структура; + мРежимыОбработкиДанных.Вставить("Выгрузка", 0); + мРежимыОбработкиДанных.Вставить("Загрузка", 1); + мРежимыОбработкиДанных.Вставить("ЗагрузкаПравилОбмена", 2); + мРежимыОбработкиДанных.Вставить("ЭкспортОбработчиковСобытий", 3); + + РежимОбработкиДанных = мРежимыОбработкиДанных.Выгрузка; + + мРежимыОтладкиАлгоритмов = Новый Структура; + мРежимыОтладкиАлгоритмов.Вставить("НеИспользовать", 0); + мРежимыОтладкиАлгоритмов.Вставить("ПроцедурныйВызов", 1); + мРежимыОтладкиАлгоритмов.Вставить("ИнтеграцияКода", 2); + + РежимОтладкиАлгоритмов = мРежимыОтладкиАлгоритмов.НеИспользовать; + +КонецПроцедуры // ИнициализацияРеквизитовИМодульныхПеременных() + +Функция ОпределитьДостаточностьПараметровДляПодключенияКИнформационнойБазе(СтруктураПодключения, СтрокаПодключения = "", СтрокаСообщенияОбОшибке = "") + + НаличиеОшибок = Ложь; + + Если СтруктураПодключения.ФайловыйРежим Тогда + + Если ПустаяСтрока(СтруктураПодключения.КаталогИБ) Тогда + + СтрокаСообщенияОбОшибке = НСтр("'ru = Не задан каталог информационной базы-приемника'"); + #Если Клиент Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщенияОбОшибке); + + #КонецЕсли + НаличиеОшибок = Истина; + + КонецЕсли; + + СтрокаПодключения = "File=""" + СтруктураПодключения.КаталогИБ + """"; + Иначе + + Если ПустаяСтрока(СтруктураПодключения.ИмяСервера) Тогда + + СтрокаСообщенияОбОшибке = НСтр("'ru = Не задано имя сервера 1С:Предприятия информационной базы-приемника'"); + #Если Клиент Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщенияОбОшибке); + #КонецЕсли + НаличиеОшибок = Истина; + + КонецЕсли; + + Если ПустаяСтрока(СтруктураПодключения.ИмяИБНаСервере) Тогда + + СтрокаСообщенияОбОшибке = НСтр("'ru = Не задано имя информационной базы-приемника на сервере 1С:Предприятия'"); + #Если Клиент Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщенияОбОшибке); + #КонецЕсли + НаличиеОшибок = Истина; + + КонецЕсли; + + СтрокаПодключения = "Srvr = """ + СтруктураПодключения.ИмяСервера + """; Ref = """ + СтруктураПодключения.ИмяИБНаСервере + """"; + + КонецЕсли; + + Возврат НЕ НаличиеОшибок; + +КонецФункции + +Функция ПодключитсяКИнформационнойБазе(СтруктураПодключения, СтрокаСообщенияОбОшибке = "") + + Перем СтрокаПодключения; + + ПараметровДостаточно = ОпределитьДостаточностьПараметровДляПодключенияКИнформационнойБазе(СтруктураПодключения, СтрокаПодключения, СтрокаСообщенияОбОшибке); + + Если Не ПараметровДостаточно Тогда + Возврат Неопределено; + КонецЕсли; + + Если Не СтруктураПодключения.АутентификацияWindows Тогда + Если НЕ ПустаяСтрока(СтруктураПодключения.Пользователь) Тогда + СтрокаПодключения = СтрокаПодключения + ";Usr = """ + СтруктураПодключения.Пользователь + """"; + КонецЕсли; + Если НЕ ПустаяСтрока(СтруктураПодключения.Пароль) Тогда + СтрокаПодключения = СтрокаПодключения + ";Pwd = """ + СтруктураПодключения.Пароль + """"; + КонецЕсли; + КонецЕсли; + + //"V8" или "V81" + ОбъектПодключения = СтруктураПодключения.ВерсияПлатформы; + + СтрокаПодключения = СтрокаПодключения + ";"; + + Попытка + + #Если Клиент Тогда + Состояние("Идет процесс соединения ..."); + #КонецЕсли + + ОбъектПодключения = ОбъектПодключения +".COMConnector"; + ТекCOMПодключение = Новый COMОбъект(ОбъектПодключения); + ТекCOMОбъект = ТекCOMПодключение.Connect(СтрокаПодключения); + + #Если Клиент Тогда + Состояние("Соединение установлено"); + #КонецЕсли + + Исключение + + СтрокаСообщенияОбОшибке = "При попытке соединения с COM-сервером произошла следующая ошибка:" + Символы.ПС + + ОписаниеОшибки(); + #Если Клиент Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщенияОбОшибке); + Состояние(НСтр("ru = 'Соединение установить не удалось'")); + Состояние(); + #КонецЕсли + + Возврат Неопределено; + + КонецПопытки; + + Возврат ТекCOMОбъект; + +КонецФункции + +// функция возвращает часть строки после последнего встреченного символа в строке +Функция ПолучитьСтрокуОтделеннойСимволом(Знач ИсходнаяСтрока, Знач СимволПоиска) + + ПозицияСимвола = СтрДлина(ИсходнаяСтрока); + Пока ПозицияСимвола >= 1 Цикл + + Если Сред(ИсходнаяСтрока, ПозицияСимвола, 1) = СимволПоиска Тогда + + Возврат Сред(ИсходнаяСтрока, ПозицияСимвола + 1); + + КонецЕсли; + + ПозицияСимвола = ПозицияСимвола - 1; + КонецЦикла; + + Возврат ""; + +КонецФункции + +// Выделяет из имени файла его расширение (набор символов после последней точки). +// +// Параметры +// ИмяФайла – Строка, содержащая имя файла, неважно с именем каталога или без. +// +// Возвращаемое значение: +// Строка – расширение файла. +// +Функция ПолучитьРасширениеИмениФайла(Знач ИмяФайла) Экспорт + + Расширение = ПолучитьСтрокуОтделеннойСимволом(ИмяФайла, "."); + Возврат Расширение; + +КонецФункции + +Функция ПолучитьИмяПротоколаДляВторойИнформационнойБазыComСоединения() + + Если Не ПустаяСтрока(ИмяФайлаПротоколаОбменаЗагрузка) Тогда + + Возврат ИмяФайлаПротоколаОбменаЗагрузка; + + ИначеЕсли Не ПустаяСтрока(ИмяФайлаПротоколаОбмена) Тогда + + РасширениеФайлаПротокола = ПолучитьРасширениеИмениФайла(ИмяФайлаПротоколаОбмена); + + Если Не ПустаяСтрока(РасширениеФайлаПротокола) Тогда + + ИмяФайлаПротоколаВыгрузки = СтрЗаменить(ИмяФайлаПротоколаОбмена, "." + РасширениеФайлаПротокола, ""); + + КонецЕсли; + + ИмяФайлаПротоколаВыгрузки = ИмяФайлаПротоколаВыгрузки + "_Загрузка"; + + Если Не ПустаяСтрока(РасширениеФайлаПротокола) Тогда + + ИмяФайлаПротоколаВыгрузки = ИмяФайлаПротоколаВыгрузки + "." + РасширениеФайлаПротокола; + + КонецЕсли; + + Возврат ИмяФайлаПротоколаВыгрузки; + + КонецЕсли; + + Возврат ""; + +КонецФункции + +// Выполняет подключение к базе-приемнику по заданным параметрам. +// Возвращает проинициализированную обработку УниверсальныйОбменДаннымиXML базы-приемника, +// которая будет использоваться для загрузки данных в базу-приемник. +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// ОбработкаОбъект – УниверсальныйОбменДаннымиXML – обработка базы-приемника для загрузки данных в базу-приемник +// +Функция ВыполнитьПодключениеКИБПриемнику() Экспорт + + РезультатПодключения = Неопределено; + + СтруктураПодключения = Новый Структура(); + СтруктураПодключения.Вставить("ФайловыйРежим", ТипИнформационнойБазыДляПодключения); + СтруктураПодключения.Вставить("АутентификацияWindows", АутентификацияWindowsИнформационнойБазыДляПодключения); + СтруктураПодключения.Вставить("КаталогИБ", КаталогИнформационнойБазыДляПодключения); + СтруктураПодключения.Вставить("ИмяСервера", ИмяСервераИнформационнойБазыДляПодключения); + СтруктураПодключения.Вставить("ИмяИБНаСервере", ИмяИнформационнойБазыНаСервереДляПодключения); + СтруктураПодключения.Вставить("Пользователь", ПользовательИнформационнойБазыДляПодключения); + СтруктураПодключения.Вставить("Пароль", ПарольИнформационнойБазыДляПодключения); + СтруктураПодключения.Вставить("ВерсияПлатформы", ВерсияПлатформыИнформационнойБазыДляПодключения); + + ОбъектПодключения = ПодключитсяКИнформационнойБазе(СтруктураПодключения); + + Если ОбъектПодключения = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Попытка + РезультатПодключения = ОбъектПодключения.Обработки.УниверсальныйОбменДаннымиXML.Создать(); + Исключение + #Если Клиент тогда + Текст = НСтр("'ru = При попытке создания обработки УниверсальныйОбменДаннымиXML произошла ошибка:'") + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст); + + + #КонецЕсли + РезультатПодключения = Неопределено; + КонецПопытки; + + Если РезультатПодключения <> Неопределено Тогда + + РезультатПодключения.ИспользоватьТранзакции = ИспользоватьТранзакции; + РезультатПодключения.КоличествоОбъектовНаТранзакцию = КоличествоОбъектовНаТранзакцию; + + РезультатПодключения.ФлагРежимОтладки = ФлагРежимОтладки; + + РезультатПодключения.ИмяФайлаПротоколаОбмена = ПолучитьИмяПротоколаДляВторойИнформационнойБазыComСоединения(); + + РезультатПодключения.ДописыватьДанныеВПротоколОбмена = ДописыватьДанныеВПротоколОбмена; + РезультатПодключения.ВыводВПротоколИнформационныхСообщений = ВыводВПротоколИнформационныхСообщений; + + РезультатПодключения.РежимОбмена = "Загрузка"; + + КонецЕсли; + + Возврат РезультатПодключения; + +КонецФункции + +// Выполняет удаление объектов заданного типа по правилам очистки данных +// (физическое удаление или пометка на удаление) +// +// Параметры: +// ИмяТипаДляУдаления – Строка – имя типа в строковом представлении +// +Процедура УдалитьОбъектыТипа(ИмяТипаДляУдаления) Экспорт + + ТипДанныхДляУдаления = Тип(ИмяТипаДляУдаления); + + Менеджер = Менеджеры[ТипДанныхДляУдаления]; + ИмяТипа = Менеджер.ИмяТипа; + Имя = Менеджер.Имя; + Свойства = Менеджеры[ТипДанныхДляУдаления]; + + Правило = Новый Структура("Имя,Непосредственно,ПередУдалением", "УдалениеОбъекта", Истина, ""); + + Выборка = ПолучитьВыборкуДляВыгрузкиОчисткиДанных(Свойства, ИмяТипа, Истина, Истина, Ложь); + + Пока Выборка.Следующий() Цикл + + #Если Клиент Тогда + ОбработкаПрерыванияПользователя(); + #КонецЕсли + + Если ИмяТипа = "РегистрСведений" Тогда + + МенеджерЗаписи = Свойства.Менеджер.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка); + + УдалениеОбъектаВыборки(МенеджерЗаписи, Правило, Свойства, Неопределено); + + Иначе + + УдалениеОбъектаВыборки(Выборка.Ссылка.ПолучитьОбъект(), Правило, Свойства, Неопределено); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ДополнитьСлужебныеТаблицыКолонками() + + ИнициализацияТаблицыПравилКонвертации(); + ИнициализацияТаблицыПравилВыгрузки(); + ИнициализацияТаблицыПравилОчистки(); + ИнициализацияТаблицыНастройкиПараметров(); + +КонецПроцедуры + +// Инициализирует внешнюю обработку с модулем отладки обработчиков событий +// +// Параметры: +// РаботаВозможна - Булево - флаг успешной инициализации внешней обработки +// ОбъектВладелец - ОбработкаОбъект - объект, который будет являться владельцем +// инициализируемой внешней обработки +// +Процедура ИнициализацияВнешнейОбработкиОбработчиковСобытий(РаботаВозможна, ОбъектВладелец) Экспорт + + Если Не РаботаВозможна Тогда + Возврат; + КонецЕсли; + + Если ФлагРежимОтладкиОбработчиков И ПустаяСтрока(ИмяФайлаВнешнейОбработкиОбработчиковСобытий) Тогда + + ЗаписатьВПротоколВыполнения(77); + РаботаВозможна = Ложь; + + ИначеЕсли ФлагРежимОтладкиОбработчиков Тогда + + Попытка + + #Если Клиент Тогда + + ВнешняяОбработкаОбработчиковСобытий = ВнешниеОбработки.Создать(ИмяФайлаВнешнейОбработкиОбработчиковСобытий); + ВнешняяОбработкаОбработчиковСобытий.Конструктор(ОбъектВладелец); + + #Иначе + + // На сервере не можем создать внешнюю обработку с модулем отладки + ВызватьИсключение "Отладка обработчиков не поддерживается при серверном варианте использования обработки ""УниверсальныйОбменДаннымиXML"""; + + #КонецЕсли + + Исключение + + ДеструкторВнешнейОбработкиОбработчиковСобытий(); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьВПротоколВыполнения(78); + + РаботаВозможна = Ложь; + ФлагРежимОтладкиОбработчиков = Ложь; + + КонецПопытки; + + КонецЕсли; + + Если РаботаВозможна Тогда + + ОбщиеПроцедурыФункции = ЭтотОбъект; + + КонецЕсли; + +КонецПроцедуры + +// Деструктор внешней обработки +// +// Параметры: +// Нет. +// +Процедура ДеструкторВнешнейОбработкиОбработчиковСобытий() Экспорт + + Если ВнешняяОбработкаОбработчиковСобытий <> Неопределено Тогда + + Попытка + + ВнешняяОбработкаОбработчиковСобытий.Деструктор(); + + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + КонецЕсли; + + ВнешняяОбработкаОбработчиковСобытий = Неопределено; + ОбщиеПроцедурыФункции = Неопределено; + +КонецПроцедуры + +// Удаляет временные файлы с заданным именем +// +// Параметры: +// ИмяВременногоФайла - Строка - полное имя удаляемого файла. После выполнения процедуры очищается +// +Процедура УдалитьВременныеФайлы(ИмяВременногоФайла) Экспорт + + Если Не ПустаяСтрока(ИмяВременногоФайла) Тогда + + Попытка + + УдалитьФайлы(ИмяВременногоФайла); + + ИмяВременногоФайла = ""; + + Исключение + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры + +Функция ПолучитьНовоеУникальноеИмяВременногоФайла(Префикс = "", Расширение = "", СтароеИмяВременногоФайла) + + //Удаляем предыдущий временный файл + УдалитьВременныеФайлы(СтароеИмяВременногоФайла); + + УникальныйИдентификатор = Новый УникальныйИдентификатор(); + + Префикс = ?(ПустаяСтрока(Префикс), "", Префикс + "_"); + + Расширение = ?(ПустаяСтрока(Расширение), "", "." + Расширение); + + Возврат КаталогВременныхФайлов() + Префикс + УникальныйИдентификатор + Расширение; +КонецФункции + +Процедура ИнициализацияСтруктурыИменОбработчиков() + + //Обработчики Конвертации + ИменаОбработчиковКонвертации = Новый Структура; + ИменаОбработчиковКонвертации.Вставить("ПередВыгрузкойДанных"); + ИменаОбработчиковКонвертации.Вставить("ПослеВыгрузкиДанных"); + ИменаОбработчиковКонвертации.Вставить("ПередВыгрузкойОбъекта"); + ИменаОбработчиковКонвертации.Вставить("ПослеВыгрузкиОбъекта"); + ИменаОбработчиковКонвертации.Вставить("ПередКонвертациейОбъекта"); + ИменаОбработчиковКонвертации.Вставить("ПередОтправкойИнформацииОбУдалении"); + ИменаОбработчиковКонвертации.Вставить("ПередПолучениемИзмененныхОбъектов"); + + ИменаОбработчиковКонвертации.Вставить("ПередЗагрузкойОбъекта"); + ИменаОбработчиковКонвертации.Вставить("ПослеЗагрузкиОбъекта"); + ИменаОбработчиковКонвертации.Вставить("ПередЗагрузкойДанных"); + ИменаОбработчиковКонвертации.Вставить("ПослеЗагрузкиДанных"); + ИменаОбработчиковКонвертации.Вставить("ПриПолученииИнформацииОбУдалении"); + ИменаОбработчиковКонвертации.Вставить("ПослеПолученияИнформацииОбУзлахОбмена"); + + ИменаОбработчиковКонвертации.Вставить("ПослеЗагрузкиПравилОбмена"); + ИменаОбработчиковКонвертации.Вставить("ПослеЗагрузкиПараметров"); + + //Обработчики ПКО + ИменаОбработчиковПКО = Новый Структура; + ИменаОбработчиковПКО.Вставить("ПередВыгрузкой"); + ИменаОбработчиковПКО.Вставить("ПриВыгрузке"); + ИменаОбработчиковПКО.Вставить("ПослеВыгрузки"); + ИменаОбработчиковПКО.Вставить("ПослеВыгрузкиВФайл"); + + ИменаОбработчиковПКО.Вставить("ПередЗагрузкой"); + ИменаОбработчиковПКО.Вставить("ПриЗагрузке"); + ИменаОбработчиковПКО.Вставить("ПослеЗагрузки"); + + ИменаОбработчиковПКО.Вставить("ПоследовательностьПолейПоиска"); + + //Обработчики ПКС + ИменаОбработчиковПКС = Новый Структура; + ИменаОбработчиковПКС.Вставить("ПередВыгрузкой"); + ИменаОбработчиковПКС.Вставить("ПриВыгрузке"); + ИменаОбработчиковПКС.Вставить("ПослеВыгрузки"); + + //Обработчики ПКГС + ИменаОбработчиковПКГС = Новый Структура; + ИменаОбработчиковПКГС.Вставить("ПередВыгрузкой"); + ИменаОбработчиковПКГС.Вставить("ПриВыгрузке"); + ИменаОбработчиковПКГС.Вставить("ПослеВыгрузки"); + + ИменаОбработчиковПКГС.Вставить("ПередОбработкойВыгрузки"); + ИменаОбработчиковПКГС.Вставить("ПослеОбработкиВыгрузки"); + + //Обработчики ПВД + ИменаОбработчиковПВД = Новый Структура; + ИменаОбработчиковПВД.Вставить("ПередОбработкой"); + ИменаОбработчиковПВД.Вставить("ПослеОбработки"); + ИменаОбработчиковПВД.Вставить("ПередВыгрузкой"); + ИменаОбработчиковПВД.Вставить("ПослеВыгрузки"); + + //Обработчики ПОД + ИменаОбработчиковПОД = Новый Структура; + ИменаОбработчиковПОД.Вставить("ПередОбработкой"); + ИменаОбработчиковПОД.Вставить("ПослеОбработки"); + ИменаОбработчиковПОД.Вставить("ПередУдалением"); + + //Глобальная структура с именами обработчиков + ИменаОбработчиков = Новый Структура; + ИменаОбработчиков.Вставить("Конвертация", ИменаОбработчиковКонвертации); + ИменаОбработчиков.Вставить("ПКО", ИменаОбработчиковПКО); + ИменаОбработчиков.Вставить("ПКС", ИменаОбработчиковПКС); + ИменаОбработчиков.Вставить("ПКГС", ИменаОбработчиковПКГС); + ИменаОбработчиков.Вставить("ПВД", ИменаОбработчиковПВД); + ИменаОбработчиков.Вставить("ПОД", ИменаОбработчиковПОД); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ + +ИнициализацияРеквизитовИМодульныхПеременных(); +ДополнитьСлужебныеТаблицыКолонками(); +ИнициализацияСтруктурыИменОбработчиков(); + diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Templates/ОбщиеПроцедурыФункции/Template.txt b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Templates/ОбщиеПроцедурыФункции/Template.txt new file mode 100644 index 000000000..77f78ba4a --- /dev/null +++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Templates/ОбщиеПроцедурыФункции/Template.txt @@ -0,0 +1,652 @@ +#Область Шапка_Комментарий +//////////////////////////////////////////////////////////////////////////////// +// +// Данный модуль содержит экспортные процедуры обработчиков событий конвертации +// и предназначен для отладки правил обмена. +// После отладки рекомендуется внести соответствующие исправления обработчиков +// в базе «Конвертация данных 2.0» и заново сформировать файл правил. +// +//////////////////////////////////////////////////////////////////////////////// +// ИСПОЛЬЗУЕМЫЕ СОКРАЩЕНИЯ ИМЕН ПЕРЕМЕННЫХ (АББРЕВИАТУРЫ) +// +// ПКО - правило конвертации объектов +// ПКС - правило конвертации свойств объектов +// ПКГС - правило конвертации группы свойств объектов +// ПКЗ - правило конвертации значений объектов +// ПВД - правило выгрузки данных +// ПОД - правило очистки данных +#Область Конвертация_Комментарий +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОНВЕРТАЦИИ (ГЛОБАЛЬНЫЕ) +#Область ПКО_Комментарий +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОНВЕРТАЦИИ ОБЪЕКТОВ +#Область ПКС_Комментарий +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОНВЕРТАЦИИ СВОЙСТВ И ГРУПП СВОЙСТВ ОБЪЕКТОВ +#Область ПВД_Комментарий +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ ВЫГРУЗКИ ДАННЫХ +#Область ПОД_Комментарий +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ ОЧИСТКИ ДАННЫХ +#Область Предупреждение_Комментарий +//////////////////////////////////////////////////////////////////////////////// +// !!!ВНИМАНИЕ!!! +// ИЗМЕНЯТЬ КОД В ЭТОМ БЛОКЕ (НИЖЕ) ЗАПРЕЩЕНО! +//////////////////////////////////////////////////////////////////////////////// +#Область ОбщиеПроцедурыФункции_Комментарий +//////////////////////////////////////////////////////////////////////////////// +// ВЫЗОВ ОБЩИХ ПРОЦЕДУР И ФУНКЦИЙ +#Область ПеременныеОбработки_Комментарий +//////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ ОБРАБОТКИ +#Область Алгоритмы_Комментарий +//////////////////////////////////////////////////////////////////////////////// +// АЛГОРИТМЫ +#Область Конструктор_Комментарий +//////////////////////////////////////////////////////////////////////////////// +// КОНСТРУКТОР И ДЕСТРУКТОР ОБРАБОТКИ + +#Область ПеременныеОбработки +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПЕРЕМЕННЫЕ МОДУЛЯ ДЛЯ НАПИСАНИЯ АЛГОРИТМОВ (ОБЩИЕ ДЛЯ ВЫГРУЗКИ И ЗАГРУЗКИ) + +Перем Параметры; +Перем Правила; +Перем Алгоритмы; +Перем Запросы; +Перем УзелДляОбмена; // только для on-line обмена +Перем ОбщиеПроцедурыФункции; +Перем ДатаНачала; +Перем ДатаОкончания; +Перем ДатаВыгрузкиДанных; // только для on-line обмена +Перем КомментарийПриВыгрузкеДанных; +Перем КомментарийПриЗагрузкеДанных; + + +//////////////////////////////////////////////////////////////////////////////// +// ПЕРЕМЕННЫЕ ОБРАБОТОК ОБМЕНА (ОБЩИЕ ДЛЯ ВЫГРУЗКИ И ЗАГРУЗКИ) + +Перем одТипСтрока; // Тип("Строка") +Перем одТипБулево; // Тип("Булево") +Перем одТипЧисло; // Тип("Число") +Перем одТипДата; // Тип("Дата") +Перем одТипХранилищеЗначения; // Тип("ХранилищеЗначения") +Перем одТипДвоичныеДанные; // Тип("ДвоичныеДанные") +Перем одТипВидДвиженияНакопления; // Тип("ВидДвиженияНакопления") +Перем одТипУдалениеОбъекта; // Тип("УдалениеОбъекта") +Перем одТипВидСчета; // Тип("ВидСчета") +Перем одТипТип; // Тип("Тип") +Перем одТипСоответствие; // Тип("Соответствие") + +Перем одТипУзлаXML_КонецЭлемента; +Перем одТипУзлаXML_НачалоЭлемента; +Перем одТипУзлаXML_Текст; + +Перем ЗначениеПустаяДата; + +#Область Конструктор_ТелоПроцедуры +Параметры = Владелец.Параметры; +ОбщиеПроцедурыФункции = Владелец; +Запросы = Владелец.Запросы; +Правила = Владелец.Правила; + +КомментарийПриВыгрузкеДанных = Владелец.КомментарийПриВыгрузкеДанных; +КомментарийПриЗагрузкеДанных = Владелец.КомментарийПриЗагрузкеДанных; + + +//переменная для универсального обмена +Попытка + ДатаНачала = Владелец.ДатаНачала; +Исключение +КонецПопытки; + +//переменная для универсального обмена +Попытка + ДатаОкончания = Владелец.ДатаОкончания; +Исключение +КонецПопытки; + +//переменная для on-line обмена +Попытка + ДатаВыгрузкиДанных = Владелец.ДатаВыгрузкиДанных; +Исключение +КонецПопытки; + +//переменная для on-line обмена +Попытка + УзелДляОбмена = Владелец.УзелДляОбмена; +Исключение +КонецПопытки; + +// Типы +одТипСтрока = Тип("Строка"); +одТипБулево = Тип("Булево"); +одТипЧисло = Тип("Число"); +одТипДата = Тип("Дата"); +одТипХранилищеЗначения = Тип("ХранилищеЗначения"); +одТипДвоичныеДанные = Тип("ДвоичныеДанные"); +одТипВидДвиженияНакопления = Тип("ВидДвиженияНакопления"); +одТипУдалениеОбъекта = Тип("УдалениеОбъекта"); +одТипВидСчета = Тип("ВидСчета"); +одТипТип = Тип("Тип"); +одТипСоответствие = Тип("Соответствие"); + +ЗначениеПустаяДата = Дата('00010101'); + +// Типы узлов xml +одТипУзлаXML_КонецЭлемента = ТипУзлаXML.КонецЭлемента; +одТипУзлаXML_НачалоЭлемента = ТипУзлаXML.НачалоЭлемента; +одТипУзлаXML_Текст = ТипУзлаXML.Текст; + +#Область Конструктор_ТелоПроцедуры_ПроцедурныйВызовАлгоритмов +Алгоритмы = Новый Структура; + +#Область Конструктор_ТелоПроцедуры_ИнтеграцияКодаАлгоритмов +Алгоритмы = Неопределено; + +#Область Конструктор_ТелоПроцедуры_НеИспользоватьОтладкуАлгоритмов +Алгоритмы = Владелец.Алгоритмы; + +#Область Деструктор +Процедура Деструктор() Экспорт + + ОбщиеПроцедурыФункции = Неопределено; + +КонецПроцедуры + +#Область ОбщиеПроцедурыФункции +// Производит выгрузку объекта в соответствии с указанным правилом конвертации +// +// Параметры: +// Источник - произвольный источник данных +// Приемник - xml-узел объекта приемника +// ВходящиеДанные - произвольные вспомогательные данные, передаваемые правилу +// для выполнения конвертации +// ИсходящиеДанные - произвольные вспомогательные данные, передаваемые правилам +// конвертации свойств +// ИмяПКО - имя правила конвертации, согласно которому осуществляется выгрузка +// УзелСсылки - xml-узел ссылки объекта приемника +// ТолькоПолучитьУзелСсылки - если Истина, то выгрузка объекта не производится, только формируется +// xml-узел ссылки +// ПКО - ссылка на правило конвертации +// +// Возвращаемое значение: +// xml-узел ссылки или значение приемника +// +Функция ВыгрузитьПоПравилу(Источник = Неопределено, + Приемник = Неопределено, + ВходящиеДанные = Неопределено, + ИсходящиеДанные = Неопределено, + ИмяПКО = "", + УзелСсылки = Неопределено, + ТолькоПолучитьУзелСсылки = Ложь, + ПКО = Неопределено, + ЭтоПравилоСГлобальнойВыгрузкойОбъектов = Ложь, + ВыборкаДляВыгрузкиДанных = Неопределено) + + + Возврат ОбщиеПроцедурыФункции.ВыгрузитьПоПравилу(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО, УзелСсылки, ТолькоПолучитьУзелСсылки, + ПКО, ЭтоПравилоСГлобальнойВыгрузкойОбъектов, ВыборкаДляВыгрузкиДанных); + +КонецФункции + +// Создает новый xml-узел +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// +// Параметры: +// Имя - Имя узла +// +// Возвращаемое значение: +// Объект нового xml-узла +// +Функция СоздатьУзел(Имя) + + Возврат ОбщиеПроцедурыФункции.СоздатьУзел(Имя); + +КонецФункции + +// Добавляет новый xml-узел к указанному узлу-родителю +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// УзелРодитель - xml-узел-родитель +// Имя - имя добавляемого узла +// +// Возвращаемое значение: +// Новый xml-узел, добавленный к указанному узлу-родителю +// +Функция ДобавитьУзел(УзелРодитель, Имя) + + Возврат ОбщиеПроцедурыФункции.ДобавитьУзел(УзелРодитель, Имя); + +КонецФункции + +// Копирует указанный xml-узел +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// Узел - копируемый узел +// +// Возвращаемое значение: +// Новый xml - копия указанного узла +// +Функция КопироватьУзел(Узел) + + Возврат ОбщиеПроцедурыФункции.КопироватьУзел(Узел); + +КонецФункции + +// Устанавливает значение параметра "Загрузка" для свойства объекта "ОбменДанными". +// +// Параметры: +// Объект - объект, для которого устанавливается свойство +// Значение - значение устанавливаемого свойства "Загрузка" +// +Процедура УстановитьОбменДаннымиЗагрузка(Объект, Значение = Истина) + + ОбщиеПроцедурыФункции.УстановитьОбменДаннымиЗагрузка(Объект, Значение); + +КонецПроцедуры + +// Устанавливает атрибут указанного xml-узла +// +// Параметры: +// Узел - xml-узел +// Имя - имя атрибута +// Значение - устанавливаемое значение +// +Процедура УстановитьАтрибут(Узел, Имя, Значение) + + ОбщиеПроцедурыФункции.УстановитьАтрибут(Узел, Имя, Значение); + +КонецПроцедуры + +// Подчиняет xml-узел указанному узлу-родителю +// +// Параметры: +// УзелРодитель - xml-узел-родитель +// Узел - подчиняемый узел +// +Процедура ДобавитьПодчиненный(УзелРодитель, Узел) + + ОбщиеПроцедурыФункции.ДобавитьПодчиненный(УзелРодитель, Узел); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ОБЪЕКТОМ XMLЧтение + +// Осуществляет запись элемента и его значения в указанный объект +// +// Параметры: +// Объект - объект типа XMLЗапись +// Имя - Строка. Имя элемента +// Значение - Значение элемента +// +Процедура одЗаписатьЭлемент(Объект, Имя, Значение="") + + ОбщиеПроцедурыФункции.одЗаписатьЭлемент(Объект, Имя, Значение); + +КонецПроцедуры + +// Читает значение атрибута по имени из указанного объекта, приводит значение +// к указанному примитивному типу +// +// Параметры: +// Объект - объект типа XMLЧтение, спозиционированный на начале элемента, +// атрибут которого требуется получить +// Тип - Значение типа Тип. Тип атрибута +// Имя - Строка. Имя атрибута +// +// Возвращаемое значение: +// Значение атрибута полученное по имени и приведенное к указанному типу +// +Функция одАтрибут(Объект, Тип, Имя) + + Возврат ОбщиеПроцедурыФункции.одАтрибут(Объект, Тип, Имя); + +КонецФункции + +// Пропускает узлы xml до конца указанного элемента (по умолчанию текущего) +// +// Параметры: +// Объект - объект типа XMLЧтение +// Имя - имя узла, до конца которого пропускаем элементы +// +Процедура одПропустить(Объект, Имя = "") + + ОбщиеПроцедурыФункции.одПропустить(Объект, Имя); + +КонецПроцедуры // одПропустить() + +// Читает текст элемента и приводит значение к указанному типу +// +// Параметры: +// Объект - объект типа XMLЧтение, из которого осуществлется чтение +// Тип - тип получаемого значения +// ИскатьПоСвойству - для ссылочных типов может быть указано свойство, по которому +// следует искать объект: "Код", "Наименование", <ИмяРеквизита>, "Имя" (предопределенного значения) +// +// Возвращаемое значение: +// Значение xml-элемента, приведенное к соответствующему типу +// +Функция одЗначениеЭлемента(Объект, Тип, ИскатьПоСвойству = "", ОбрезатьСтрокуСправа = Истина) + + Возврат ОбщиеПроцедурыФункции.одЗначениеЭлемента(Объект, Тип, ИскатьПоСвойству, ОбрезатьСтрокуСправа); + +КонецФункции // одЗначениеЭлемента() + +//////////////////////////////////////////////////////////////////////////////// +// РАБОТА С ДАННЫМИ + +// Возвращает строку - имя переданного значения перечисления. +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// Значение - значение перечисления +// +// Возвращаемое значение: +// Строка - имя переданного значения перечисления. +// +Функция одИмяЗначенияПеречисления(Значение) + + Возврат ОбщиеПроцедурыФункции.одИмяЗначенияПеречисления(Значение); + +КонецФункции // одИмяЗначенияПеречисления() + +// Определяет заполнено ли переданное значение +// +// Параметры: +// Значение - значение, заполенение которого надо проверить +// +// Возвращаемое значение: +// Истина - значение не заполнено, ложь - иначе. +// +Функция одПустое(Значение, ЭтоNULL=Ложь) + + Возврат ОбщиеПроцедурыФункции.одПустое(Значение, ЭтоNULL); + +КонецФункции // одПустое() + +// Возвращает объект ОписаниеТипов, содержащий указанный тип. +// +// Параметры: +// ЗначениеТипа - строка с именем типа или значение типа Тип. +// +// Возвращаемое значение: +// ОписаниеТипов +// +Функция одОписаниеТипа(ЗначениеТипа) + + Возврат ОбщиеПроцедурыФункции.одОписаниеТипа(ЗначениеТипа); + +КонецФункции // одОписаниеТипа() + +// Возвращает пустое (дефолтное) значение указанного типа +// +// Параметры: +// Тип - строка с именем типа или значение типа Тип. +// +// Возвращаемое значение: +// Пустое значение указанного типа. +// +Функция одПолучитьПустоеЗначение(Тип) + + Возврат ОбщиеПроцедурыФункции.одПолучитьПустоеЗначение(Тип); + +КонецФункции // ПолучитьПустоеЗначение() + +// Осуществляет простой поиск объекта информационной базы по указанному свойству. +// +// Параметры: +// Менеджер - менеджер искомого объекта; +// Свойство - свойство, по которому осуществляем поиск: Имя, Код, +// Наименование или Имя индексируемого реквизита; +// Значение - значение свойства, по которому ищем объект. +// +// Возвращаемое значение: +// Найденный объект информационной базы. +// +Функция одНайтиОбъектПоСвойству(Менеджер, Свойство, Значение, + НайденныйОбъектПоУникальномуИдентификатору = Неопределено, + ОбщаяСтруктураСвойств = Неопределено, ОбщиеСвойстваПоиска = Неопределено, + РежимПоискаОсновногоОбъекта = Истина, СтрокаЗапросаПоискаПоУникальномуИдентификатору = "") + + Возврат ОбщиеПроцедурыФункции.одНайтиОбъектПоСвойству(Менеджер, Свойство, Значение, + НайденныйОбъектПоУникальномуИдентификатору, + ОбщаяСтруктураСвойств, ОбщиеСвойстваПоиска, + РежимПоискаОсновногоОбъекта, СтрокаЗапросаПоискаПоУникальномуИдентификатору); + +КонецФункции // одНайтиОбъектПоСвойству() + +// Осуществляет простой поиск объекта информационной базы по указанному свойству. +// +// Параметры: +// Стр - Строка - значение свойства, по которому осуществляется +// поиск объект; +// Тип - тип искомого объекта; +// Свойство - Строка - имя свойства, по-которому ищем объект. +// +// Возвращаемое значение: +// Найденный объект информационной базы +// +Функция одПолучитьЗначениеПоСтроке(Стр, Тип, Свойство = "") + + Возврат ОбщиеПроцедурыФункции.одПолучитьЗначениеПоСтроке(Стр, Тип, Свойство); + +КонецФункции // одПолучитьЗначениеПоСтроке() + +// Возвращает строковое представление типа значения +// +// Параметры: +// ЗначениеИлиТип - произвольное значение или значение типа тип +// +// Возвращаемое значение: +// Строка - строковое представление типа значения +// +Функция одТипЗначенияСтрокой(ЗначениеИлиТип) + + Возврат ОбщиеПроцедурыФункции.одТипЗначенияСтрокой(ЗначениеИлиТип); + +КонецФункции // одТипЗначенияСтрокой() + +// Возвращает XML представление объекта ОписаниеТипов +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// ОписаниеТипов - объект ОписаниеТипов, XML представление которого требуется получить +// +// Возвращаемое значение: +// Строка - XML представление переданного объекта ОписаниеТипов +// +Функция одПолучитьXMLПредставлениеОписанияТипов(ОписаниеТипов) + + Возврат ОбщиеПроцедурыФункции.одПолучитьXMLПредставлениеОписанияТипов(ОписаниеТипов); + +КонецФункции // одПолучитьXMLПредставлениеОписанияТипов() + +//////////////////////////////////////////////////////////////////////////////// +// РАБОТА СО СТРОКАМИ + +// Разбирает строку на две части: до подстроки разделителя и после. +// +// Параметры: +// Стр - разбираемая строка; +// Разделитель - подстрока-разделитель: +// Режим - 0 - разделитель в возвращаемые подстроки не включается; +// 1 - разделитель включается в левую подстроку; +// 2 - разделитель включается в правую подстроку. +// +// Возвращаемое значение: +// Правая часть строки - до символа-разделителя. +// +Функция ОтделитьРазделителем(Стр, Знач Разделитель, Режим=0) + + Возврат ОбщиеПроцедурыФункции.ОтделитьРазделителем(Стр, Разделитель, Режим); + +КонецФункции // ОтделитьРазделителем() + +// Преобразует значения из строки в массив, используя указанный разделитель +// +// Параметры: +// Стр - Разбираемая строка +// Разделитель - подстрока разделитель +// +// Возвращаемое значение: +// Массив значений +// +Функция МассивИзСтроки(Знач Стр, Разделитель=",") + + Возврат ОбщиеПроцедурыФункции.МассивИзСтроки(Стр, Разделитель); + +КонецФункции // МассивИзСтроки() + +Функция ПолучитьСтроковыйНомерБезПрефиксов(Номер) + + Возврат ОбщиеПроцедурыФункции.ПолучитьСтроковыйНомерБезПрефиксов(Номер); + +КонецФункции + +// Разбирает строку, выделяя из нее префикс и числовую часть. +// +// Параметры: +// Стр - Строка. Разбираемая строка; +// ЧисловаяЧасть - Число. Переменная, в которую возвратится числовая часть строки; +// Режим - Строка. Если "Число", то возвратит числовую часть, иначе - префикс. +// +// Возвращаемое значение: +// Префикс строки +// +Функция ПолучитьПрефиксЧислоНомера(Знач Стр, ЧисловаяЧасть = "", Режим = "") + + Возврат ОбщиеПроцедурыФункции.ПолучитьПрефиксЧислоНомера(Стр, ЧисловаяЧасть, Режим); + +КонецФункции + +// Приводит номер (код) к требуемой длине. При этом выделяется префикс +// и числовая часть номера, остальное пространство между префиксом и +// номером заполняется нулями. +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// Стр - преобразовываемая строка; +// Длина - требуемая длина строки. +// +// Возвращаемое значение: +// Строка - код или номер, приведенная к требуемой длине. +// +Функция ПривестиНомерКДлине(Знач Стр, Длина, ДобавлятьНулиЕслиДлинаНеМеньшеТекущейДлиныНомера = Истина, Префикс = "") + + Возврат ОбщиеПроцедурыФункции.ПривестиНомерКДлине(Стр, Длина, ДобавлятьНулиЕслиДлинаНеМеньшеТекущейДлиныНомера, Префикс); + +КонецФункции // ПривестиНомерКДлине() + +// Добавляет к префиксу номера или кода подстроку +// Функция может быть использована в обработчиках событий, программный код +// которых хранится в правила обмена данными. Вызывается методом Выполнить() +// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации +// не является ошибкой проверки конфигурации +// +// Параметры: +// Стр - Строка. Номер или код; +// Добавок - добаляемая к префиксу подстрока; +// Длина - требуемая результрирующая длина строки; +// Режим - "Слева" - подстрока добавляется слева к префиксу, иначе - справа. +// +// Возвращаемое значение: +// Строка - номер или код, к префиксу которого добавлена указанная подстрока. +// +Функция ДобавитьКПрефиксу(Знач Стр, Добавок = "", Длина = "", Режим = "Слева") + + Возврат ОбщиеПроцедурыФункции.ДобавитьКПрефиксу(Стр, Добавок, Длина, Режим); + +КонецФункции // ДобавитьКПрефиксу() + +// Дополняет строку указанным символом до указанной длины. +// +// Параметры: +// Стр - дополняемая строка; +// Длина - требуемая длина результирующей строки; +// Чем - символ, которым дополняется строка. +// +// Возвращаемое значение: +// Строка, дополненная указанным символом до указанной длины. +// +Функция одДополнитьСтроку(Стр, Длина, Чем = " ") + + Возврат ОбщиеПроцедурыФункции.одДополнитьСтроку(Стр, Длина, Чем); + +КонецФункции // одДополнитьСтроку() + +//////////////////////////////////////////////////////////////////////////////// +// + +Процедура ПередатьИнформациюОЗаписиВПриемник(ИнформацияДляЗаписиВФайл, СтрокаОшибкиВБазеПриемнике = "") + + ОбщиеПроцедурыФункции.ПередатьИнформациюОЗаписиВПриемник(ИнформацияДляЗаписиВФайл, СтрокаОшибкиВБазеПриемнике); + +КонецПроцедуры + +Процедура ПередатьОдинПараметрВПриемник(Имя, ИсходноеЗначениеПараметра, ПравилоКонвертации = "") + + ОбщиеПроцедурыФункции.ПередатьОдинПараметрВПриемник(Имя, ИсходноеЗначениеПараметра, ПравилоКонвертации); + +КонецПроцедуры + +Процедура ПередатьДополнительныеПараметрыВПриемник() + + + ОбщиеПроцедурыФункции.ПередатьДополнительныеПараметрыВПриемник(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ С ФАЙЛОМ ОБМЕНА + +// Сохраняет в файл указанный xml-узел +// +// Параметры: +// Узел - xml-узел, сохранямый в файл +// +Процедура ЗаписатьВФайл(Узел) + + ОбщиеПроцедурыФункции.ЗаписатьВФайл(Узел); + +КонецПроцедуры // ЗаписатьВФайл() + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ С ПРАВИЛАМИ ОБМЕНА + +// Осуществляет поиск правила конвертации по имени или в соответствии с типом +// переданного объекта +// +// Параметры: +// Объект - Объект-источник, для которого ищем правило конвертации +// ИмяПравила - имя правила конвертации +// +// Возвращаемое значение: +// Ссылка на правило конвертации (строка в таблице правил) +// +Функция НайтиПравило(Объект, ИмяПравила="") + + Возврат ОбщиеПроцедурыФункции.НайтиПравило(Объект, ИмяПравила); + +КонецФункции diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Templates/ПараметрыОбработчиков/Template.mxlx b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Templates/ПараметрыОбработчиков/Template.mxlx new file mode 100644 index 000000000..81a041998 --- /dev/null +++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Templates/ПараметрыОбработчиков/Template.mxlx @@ -0,0 +1,5893 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 2 + + 0 + + 1 + + + + 1 + + 2 + + + + + 1 + + + 1 + + 3 + + + ru + Конвертация_ПередВыгрузкойДанных + + + + + + + + 2 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 4 + + + 1 + + 3 + + + ru + Конвертация_ПередВыгрузкойОбъекта + + + + + + + + 5 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 6 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 7 + + + 1 + + 0 + + + ru + ИмяПКО + + + + + + + + 8 + + + 1 + + 0 + + + ru + Правило + + + + + + + + 9 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 10 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 11 + + + 1 + + 0 + + + ru + Объект + + + + + + + + 13 + + + 1 + + 3 + + + ru + Конвертация_ПередКонвертациейОбъекта + + + + + + + + 14 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 15 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 16 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 17 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 18 + + + 1 + + 0 + + + ru + ИмяПКО + + + + + + + + 19 + + + 1 + + 0 + + + ru + ПКО + + + + + + + + 20 + + + 1 + + 0 + + + ru + ВыгруженныеОбъекты + + + + + + + + 21 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 22 + + + 1 + + 0 + + + ru + КлючВыгружаемыхДанных + + + + + + + + 23 + + + 1 + + 0 + + + ru + ЗапоминатьВыгруженные + + + + + + + + 24 + + + 1 + + 0 + + + ru + НеЗамещатьОбъектПриЗагрузке + + + + + + + + 25 + + + 1 + + 0 + + + ru + ВсеОбъектыВыгружены + + + + + + + + 26 + + + 1 + + 0 + + + ru + ТолькоПолучитьУзелСсылки + + + + + + + + 27 + + + 1 + + 0 + + + ru + Приемник + + + + + + + + 28 + + + 1 + + 0 + + + ru + РежимЗаписи + + + + + + + + 29 + + + 1 + + 0 + + + ru + РежимПроведения + + + + + + + + 30 + + + 1 + + 0 + + + ru + НеСоздаватьЕслиНеНайден + + + + + + + + 31 + + + 1 + + 3 + + + + + + 32 + + + 1 + + 3 + + + ru + Конвертация_ПослеВыгрузкиОбъекта + + + + + + + + 33 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 34 + + + 1 + + 0 + + + ru + Объект + + + + + + + + 35 + + + 1 + + 0 + + + ru + ИмяПКО + + + + + + + + 36 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 37 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 38 + + + 1 + + 0 + + + ru + УзелСсылки + + + + + + + + 40 + + + 1 + + 3 + + + ru + Конвертация_ПослеВыгрузкиДанных + + + + + + + + 41 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 43 + + + 1 + + 3 + + + ru + Конвертация_ПередЗагрузкойДанных + + + + + + + + 44 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 46 + + + 1 + + 3 + + + ru + Конвертация_ПослеЗагрузкиДанных + + + + + + + + 49 + + + 1 + + 3 + + + ru + Конвертация_ПередЗагрузкойОбъекта + + + + + + + + 50 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 51 + + + 1 + + 2 + + + ru + Отказ + + + + + + + + 52 + + + 1 + + 0 + + + ru + Нпп + + + + + + + + 53 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 54 + + + 1 + + 0 + + + ru + ИмяПравила + + + + + + + + 55 + + + 1 + + 0 + + + ru + Правило + + + + + + + + 56 + + + 1 + + 0 + + + ru + ГенерироватьНовыйНомерИлиКодЕслиНеУказан + + + + + + + + 57 + + + 1 + + 0 + + + ru + ТипОбъектаСтрокой + + + + + + + + 58 + + + 1 + + 0 + + + ru + ТипОбъекта + + + + + + + + 59 + + + 1 + + 0 + + + ru + НеЗамещатьОбъект + + + + + + + + 60 + + + 1 + + 0 + + + ru + РежимЗаписи + + + + + + + + 61 + + + 1 + + 0 + + + ru + РежимПроведения + + + + + + + + 63 + + + 1 + + 3 + + + ru + Конвертация_ПослеЗагрузкиОбъекта + + + + + + + + 64 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 65 + + + 1 + + 2 + + + ru + Отказ + + + + + + + + 66 + + + 1 + + 0 + + + ru + Ссылка + + + + + + + + 67 + + + 1 + + 0 + + + ru + Объект + + + + + + + + 68 + + + 1 + + 0 + + + ru + ПараметрыОбъекта + + + + + + + + 69 + + + 1 + + 0 + + + ru + ОбъектМодифицирован + + + + + + + + 70 + + + 1 + + 0 + + + ru + ИмяТипаОбъекта + + + + + + + + 71 + + + 1 + + 0 + + + ru + ОбъектНайден + + + + + + + + 73 + + + 1 + + 3 + + + ru + Конвертация_ПослеЗагрузкиПравилОбмена + + + + + + + + 76 + + + 1 + + 3 + + + ru + Конвертация_ПослеЗагрузкиПараметров + + + + + + + + 77 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 78 + + + 1 + + 0 + + + ru + ПричинаОтказа + + + + + + + + 80 + + + 1 + + 4 + + + ru + Конвертация_ПередОтправкойИнформацииОбУдалении + + + + + + + + 81 + + + 1 + + 0 + + + ru + Ссылка + + + + + + + + 82 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 84 + + + 1 + + 3 + + + ru + Конвертация_ПриПолученииИнформацииОбУдалении + + + + + + + + 85 + + + 1 + + 0 + + + ru + Объект + + + + + + + + 86 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 88 + + + 1 + + 4 + + + ru + Конвертация_ПередПолучениемИзмененныхОбъектов + + + + + + + + 89 + + + 1 + + 0 + + + ru + Параметры + + + + + + + + 90 + + + 1 + + 0 + + + ru + УзелОбмена + + + + + + + + 91 + + + 1 + + 0 + + + ru + УзелДляФоновогоОбмена + + + + + + + + 93 + + + 1 + + 4 + + + ru + Конвертация_ПослеПолученияИнформацииОбУзлахОбмена + + + + + + + + 94 + + + 1 + + 0 + + + ru + Параметры + + + + + + + + 95 + + + 1 + + 0 + + + ru + УзелОбменаЗагрузкаДанных + + + + + + + + 97 + + + 1 + + 3 + + + ru + ПВД_ПередОбработкой + + + + + + + + 98 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 99 + + + 1 + + 0 + + + ru + ИмяПКО + + + + + + + + 100 + + + 1 + + 0 + + + ru + Правило + + + + + + + + 101 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 102 + + + 1 + + 0 + + + ru + ВыборкаДанных + + + + + + + + 104 + + + 1 + + 3 + + + ru + ПВД_ПередВыгрузкой + + + + + + + + 105 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 106 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 107 + + + 1 + + 0 + + + ru + ИмяПКО + + + + + + + + 108 + + + 1 + + 0 + + + ru + Правило + + + + + + + + 109 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 110 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 111 + + + 1 + + 0 + + + ru + Объект + + + + + + + + 113 + + + 1 + + 3 + + + ru + ПВД_ПослеВыгрузки + + + + + + + + 114 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 115 + + + 1 + + 0 + + + ru + Объект + + + + + + + + 116 + + + 1 + + 0 + + + ru + ИмяПКО + + + + + + + + 117 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 118 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 119 + + + 1 + + 0 + + + ru + УзелСсылки + + + + + + + + 121 + + + 1 + + 3 + + + ru + ПВД_ПослеОбработки + + + + + + + + 122 + + + 1 + + 0 + + + ru + ИмяПКО + + + + + + + + 123 + + + 1 + + 0 + + + ru + Правило + + + + + + + + 124 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 126 + + + 1 + + 3 + + + ru + ПОД_ПередОбработкой + + + + + + + + 127 + + + 1 + + 0 + + + ru + Правило + + + + + + + + 128 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 129 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 130 + + + 1 + + 0 + + + ru + ВыборкаДанных + + + + + + + + 132 + + + 1 + + 3 + + + ru + ПОД_ПередУдалением + + + + + + + + 133 + + + 1 + + 0 + + + ru + Правило + + + + + + + + 134 + + + 1 + + 0 + + + ru + Объект + + + + + + + + 135 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 136 + + + 1 + + 0 + + + ru + УдалитьНепосредственно + + + + + + + + 137 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 139 + + + 1 + + 3 + + + ru + ПОД_ПослеОбработки + + + + + + + + 140 + + + 1 + + 0 + + + ru + Правило + + + + + + + + 142 + + + 1 + + 3 + + + ru + ПКО_ПередВыгрузкой + + + + + + + + 143 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 144 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 145 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 146 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 147 + + + 1 + + 0 + + + ru + ИмяПКО + + + + + + + + 148 + + + 1 + + 0 + + + ru + ПКО + + + + + + + + 149 + + + 1 + + 0 + + + ru + ВыгруженныеОбъекты + + + + + + + + 150 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 151 + + + 1 + + 0 + + + ru + КлючВыгружаемыхДанных + + + + + + + + 152 + + + 1 + + 0 + + + ru + ЗапоминатьВыгруженные + + + + + + + + 153 + + + 1 + + 0 + + + ru + НеЗамещатьОбъектПриЗагрузке + + + + + + + + 154 + + + 1 + + 0 + + + ru + ВсеОбъектыВыгружены + + + + + + + + 155 + + + 1 + + 0 + + + ru + ТолькоПолучитьУзелСсылки + + + + + + + + 156 + + + 1 + + 0 + + + ru + Приемник + + + + + + + + 157 + + + 1 + + 0 + + + ru + РежимЗаписи + + + + + + + + 158 + + + 1 + + 0 + + + ru + РежимПроведения + + + + + + + + 159 + + + 1 + + 0 + + + ru + НеСоздаватьЕслиНеНайден + + + + + + + + 161 + + + 1 + + 3 + + + ru + ПКО_ПриВыгрузке + + + + + + + + 162 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 163 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 164 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 165 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 166 + + + 1 + + 0 + + + ru + ИмяПКО + + + + + + + + 167 + + + 1 + + 0 + + + ru + ПКО + + + + + + + + 168 + + + 1 + + 0 + + + ru + ВыгруженныеОбъекты + + + + + + + + 169 + + + 1 + + 0 + + + ru + КлючВыгружаемыхДанных + + + + + + + + 170 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 171 + + + 1 + + 0 + + + ru + СтандартнаяОбработка + + + + + + + + 172 + + + 1 + + 0 + + + ru + Приемник + + + + + + + + 173 + + + 1 + + 0 + + + ru + УзелСсылки + + + + + + + + 175 + + + 1 + + 3 + + + ru + ПКО_ПослеВыгрузки + + + + + + + + 176 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 177 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 178 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 179 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 180 + + + 1 + + 0 + + + ru + ИмяПКО + + + + + + + + 181 + + + 1 + + 0 + + + ru + ПКО + + + + + + + + 182 + + + 1 + + 0 + + + ru + ВыгруженныеОбъекты + + + + + + + + 183 + + + 1 + + 0 + + + ru + КлючВыгружаемыхДанных + + + + + + + + 184 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 185 + + + 1 + + 0 + + + ru + Приемник + + + + + + + + 186 + + + 1 + + 0 + + + ru + УзелСсылки + + + + + + + + 187 + + + 1 + + 3 + + + + + + 188 + + + 1 + + 3 + + + ru + ПКО_ПослеВыгрузкиВФайл + + + + + + + + 189 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 190 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 191 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 192 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 193 + + + 1 + + 0 + + + ru + ИмяПКО + + + + + + + + 194 + + + 1 + + 0 + + + ru + ПКО + + + + + + + + 195 + + + 1 + + 0 + + + ru + ВыгруженныеОбъекты + + + + + + + + 196 + + + 1 + + 0 + + + ru + Приемник + + + + + + + + 197 + + + 1 + + 0 + + + ru + УзелСсылки + + + + + + + + 199 + + + 1 + + 3 + + + ru + ПКО_ПередЗагрузкой + + + + + + + + 200 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 201 + + + 1 + + 2 + + + ru + Отказ + + + + + + + + 202 + + + 1 + + 0 + + + ru + Нпп + + + + + + + + 203 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 204 + + + 1 + + 0 + + + ru + ИмяПравила + + + + + + + + 205 + + + 1 + + 0 + + + ru + Правило + + + + + + + + 206 + + + 1 + + 0 + + + ru + ГенерироватьНовыйНомерИлиКодЕслиНеУказан + + + + + + + + 207 + + + 1 + + 0 + + + ru + ТипОбъектаСтрокой + + + + + + + + 208 + + + 1 + + 0 + + + ru + ТипОбъекта + + + + + + + + 209 + + + 1 + + 0 + + + ru + НеЗамещатьОбъект + + + + + + + + 210 + + + 1 + + 0 + + + ru + РежимЗаписи + + + + + + + + 211 + + + 1 + + 0 + + + ru + РежимПроведения + + + + + + + + 213 + + + 1 + + 3 + + + ru + ПКО_ПриЗагрузке + + + + + + + + 214 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 215 + + + 1 + + 0 + + + ru + ОбъектНайден + + + + + + + + 216 + + + 1 + + 0 + + + ru + Объект + + + + + + + + 217 + + + 1 + + 0 + + + ru + НеЗамещатьОбъект + + + + + + + + 218 + + + 1 + + 0 + + + ru + ОбъектМодифицирован + + + + + + + + 220 + + + 1 + + 3 + + + ru + ПКО_ПослеЗагрузки + + + + + + + + 221 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 222 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 223 + + + 1 + + 0 + + + ru + Ссылка + + + + + + + + 224 + + + 1 + + 0 + + + ru + Объект + + + + + + + + 225 + + + 1 + + 0 + + + ru + ПараметрыОбъекта + + + + + + + + 226 + + + 1 + + 0 + + + ru + ОбъектМодифицирован + + + + + + + + 227 + + + 1 + + 2 + + + ru + ИмяТипаОбъекта + + + + + + + + 228 + + + 1 + + 0 + + + ru + ОбъектНайден + + + + + + + + 230 + + + 1 + + 3 + + + ru + ПКО_ПоследовательностьПолейПоиска + + + + + + + + 231 + + + 1 + + 0 + + + ru + НомерВариантаПоиска + + + + + + + + 232 + + + 1 + + 0 + + + ru + СвойстваПоиска + + + + + + + + 233 + + + 1 + + 0 + + + ru + ПрекратитьПоиск + + + + + + + + 234 + + + 1 + + 0 + + + ru + СсылкаНаОбъект + + + + + + + + 235 + + + 1 + + 0 + + + ru + УстанавливатьУОбъектаВсеСвойстваПоиска + + + + + + + + 236 + + + 1 + + 0 + + + ru + СтрокаИменСвойствПоиска + + + + + + + + 238 + + + 1 + + 3 + + + ru + ПКГС_ПередОбработкойВыгрузки + + + + + + + + 239 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 240 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 241 + + + 1 + + 0 + + + ru + Приемник + + + + + + + + 242 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 243 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 244 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 245 + + + 1 + + 0 + + + ru + КоллекцияОбъектов + + + + + + + + 246 + + + 1 + + 0 + + + ru + НеЗамещать + + + + + + + + 247 + + + 1 + + 0 + + + ru + УзелКоллекцииСвойств + + + + + + + + 248 + + + 1 + + 0 + + + ru + НеОчищать + + + + + + + + 250 + + + 1 + + 3 + + + ru + ПКГС_ПередВыгрузкой + + + + + + + + 251 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 252 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 253 + + + 1 + + 0 + + + ru + Приемник + + + + + + + + 254 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 255 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 256 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 257 + + + 1 + + 0 + + + ru + ОбъектКоллекции + + + + + + + + 258 + + + 1 + + 0 + + + ru + УзелКоллекцииСвойств + + + + + + + + 259 + + + 1 + + 0 + + + ru + УзелКоллекцииОбъектов + + + + + + + + 261 + + + 1 + + 3 + + + ru + ПКГС_ПриВыгрузке + + + + + + + + 262 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 263 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 264 + + + 1 + + 0 + + + ru + Приемник + + + + + + + + 265 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 266 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 267 + + + 1 + + 0 + + + ru + ОбъектКоллекции + + + + + + + + 268 + + + 1 + + 0 + + + ru + УзелКоллекцииОбъектов + + + + + + + + 269 + + + 1 + + 0 + + + ru + УзелОбъектаКоллекции + + + + + + + + 270 + + + 1 + + 0 + + + ru + УзелКоллекцииСвойств + + + + + + + + 271 + + + 1 + + 0 + + + ru + СтандартнаяОбработка + + + + + + + + 273 + + + 1 + + 3 + + + ru + ПКГС_ПослеВыгрузки + + + + + + + + 274 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 275 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 276 + + + 1 + + 0 + + + ru + Приемник + + + + + + + + 277 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 278 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 279 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 280 + + + 1 + + 0 + + + ru + ОбъектКоллекции + + + + + + + + 281 + + + 1 + + 0 + + + ru + УзелКоллекцииОбъектов + + + + + + + + 282 + + + 1 + + 0 + + + ru + УзелКоллекцииСвойств + + + + + + + + 283 + + + 1 + + 0 + + + ru + УзелОбъектаКоллекции + + + + + + + + 285 + + + 1 + + 3 + + + ru + ПКГС_ПослеОбработкиВыгрузки + + + + + + + + 286 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 287 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 288 + + + 1 + + 0 + + + ru + Приемник + + + + + + + + 289 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 290 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 291 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 292 + + + 1 + + 0 + + + ru + УзелКоллекцииСвойств + + + + + + + + 293 + + + 1 + + 0 + + + ru + УзелКоллекцииОбъектов + + + + + + + + 295 + + + 1 + + 3 + + + ru + ПКС_ПередВыгрузкой + + + + + + + + 296 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 297 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 298 + + + 1 + + 0 + + + ru + Приемник + + + + + + + + 299 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 300 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 301 + + + 1 + + 0 + + + ru + ПКС + + + + + + + + 302 + + + 1 + + 0 + + + ru + ПКО + + + + + + + + 303 + + + 1 + + 0 + + + ru + ОбъектКоллекции + + + + + + + + 304 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 305 + + + 1 + + 0 + + + ru + Значение + + + + + + + + 306 + + + 1 + + 0 + + + ru + ТипПриемника + + + + + + + + 307 + + + 1 + + 0 + + + ru + ИмяПКО + + + + + + + + 308 + + + 1 + + 0 + + + ru + ИмяПКОВидСубконто + + + + + + + + 309 + + + 1 + + 0 + + + ru + Пусто + + + + + + + + 310 + + + 1 + + 0 + + + ru + Выражение + + + + + + + + 311 + + + 1 + + 0 + + + ru + УзелКоллекцииСвойств + + + + + + + + 312 + + + 1 + + 0 + + + ru + НеЗамещать + + + + + + + + 314 + + + 1 + + 3 + + + ru + ПКС_ПриВыгрузке + + + + + + + + 315 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 316 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 317 + + + 1 + + 0 + + + ru + Приемник + + + + + + + + 318 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 319 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 320 + + + 1 + + 0 + + + ru + ПКС + + + + + + + + 321 + + + 1 + + 0 + + + ru + ПКО + + + + + + + + 322 + + + 1 + + 0 + + + ru + ОбъектКоллекции + + + + + + + + 323 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 324 + + + 1 + + 0 + + + ru + Значение + + + + + + + + 325 + + + 1 + + 0 + + + ru + КлючИЗначение + + + + + + + + 326 + + + 1 + + 0 + + + ru + ВидСубконто + + + + + + + + 327 + + + 1 + + 0 + + + ru + Субконто + + + + + + + + 328 + + + 1 + + 0 + + + ru + Пусто + + + + + + + + 329 + + + 1 + + 0 + + + ru + ИмяПКО + + + + + + + + 330 + + + 1 + + 0 + + + ru + ПКОСвойств + + + + + + + + 331 + + + 1 + + 0 + + + ru + УзелСвойства + + + + + + + + 332 + + + 1 + + 0 + + + ru + УзелКоллекцииСвойств + + + + + + + + 333 + + + 1 + + 0 + + + ru + ИмяПКОВидСубконто + + + + + + + + 335 + + + 1 + + 3 + + + ru + ПКС_ПослеВыгрузки + + + + + + + + 336 + + + 1 + + 0 + + + ru + ФайлОбмена + + + + + + + + 337 + + + 1 + + 0 + + + ru + Источник + + + + + + + + 338 + + + 1 + + 0 + + + ru + Приемник + + + + + + + + 339 + + + 1 + + 0 + + + ru + ВходящиеДанные + + + + + + + + 340 + + + 1 + + 0 + + + ru + ИсходящиеДанные + + + + + + + + 341 + + + 1 + + 0 + + + ru + ПКС + + + + + + + + 342 + + + 1 + + 0 + + + ru + ПКО + + + + + + + + 343 + + + 1 + + 0 + + + ru + ОбъектКоллекции + + + + + + + + 344 + + + 1 + + 0 + + + ru + Отказ + + + + + + + + 345 + + + 1 + + 0 + + + ru + Значение + + + + + + + + 346 + + + 1 + + 0 + + + ru + КлючИЗначение + + + + + + + + 347 + + + 1 + + 0 + + + ru + ВидСубконто + + + + + + + + 348 + + + 1 + + 0 + + + ru + Субконто + + + + + + + + 349 + + + 1 + + 0 + + + ru + ИмяПКО + + + + + + + + 350 + + + 1 + + 0 + + + ru + ИмяПКОВидСубконто + + + + + + + + 351 + + + 1 + + 0 + + + ru + ПКОСвойств + + + + + + + + 352 + + + 1 + + 0 + + + ru + УзелСвойства + + + + + + + + 353 + + + 1 + + 0 + + + ru + УзелСсылки + + + + + + + + 354 + + + 1 + + 0 + + + ru + УзелКоллекцииСвойств + + + + + + + + 355 + + + 1 + + 0 + + + ru + УзелСубконто + + + + + + + + 357 + + + 1 + + 3 + + + ru + Обработка_Конструктор + + + + + + + + 358 + + + 1 + + 0 + + + ru + Владелец + + + + + + + + 360 + + + 1 + + 3 + + + ru + Алгоритм_ПоУмолчанию + + + + + + + true + 5 + 362 + 362 + + Алгоритм_ПоУмолчанию + + Rows + 361 + 361 + -1 + -1 + + + + Конвертация_ПередВыгрузкойДанных + + Rows + 2 + 2 + -1 + -1 + + + + Конвертация_ПередВыгрузкойОбъекта + + Rows + 5 + 11 + -1 + -1 + + + + Конвертация_ПередЗагрузкойДанных + + Rows + 44 + 44 + -1 + -1 + + + + Конвертация_ПередЗагрузкойОбъекта + + Rows + 50 + 61 + -1 + -1 + + + + Конвертация_ПередКонвертациейОбъекта + + Rows + 14 + 30 + -1 + -1 + + + + Конвертация_ПередОтправкойИнформацииОбУдалении + + Rows + 81 + 82 + -1 + -1 + + + + Конвертация_ПередПолучениемИзмененныхОбъектов + + Rows + 89 + 91 + -1 + -1 + + + + Конвертация_ПослеВыгрузкиДанных + + Rows + 41 + 41 + -1 + -1 + + + + Конвертация_ПослеВыгрузкиОбъекта + + Rows + 33 + 38 + -1 + -1 + + + + Конвертация_ПослеЗагрузкиДанных + + Rows + 47 + 47 + -1 + -1 + + + + Конвертация_ПослеЗагрузкиОбъекта + + Rows + 64 + 71 + -1 + -1 + + + + Конвертация_ПослеЗагрузкиПараметров + + Rows + 77 + 78 + -1 + -1 + + + + Конвертация_ПослеЗагрузкиПравилОбмена + + Rows + 74 + 74 + -1 + -1 + + + + Конвертация_ПослеПолученияИнформацииОбУзлахОбмена + + Rows + 94 + 95 + -1 + -1 + + + + Конвертация_ПриПолученииИнформацииОбУдалении + + Rows + 85 + 86 + -1 + -1 + + + + Обработка_Конструктор + + Rows + 358 + 358 + -1 + -1 + + + + ПВД_ПередВыгрузкой + + Rows + 105 + 111 + -1 + -1 + + + + ПВД_ПередОбработкой + + Rows + 98 + 102 + -1 + -1 + + + + ПВД_ПослеВыгрузки + + Rows + 114 + 119 + -1 + -1 + + + + ПВД_ПослеОбработки + + Rows + 122 + 124 + -1 + -1 + + + + ПКГС_ПередВыгрузкой + + Rows + 251 + 259 + -1 + -1 + + + + ПКГС_ПередОбработкойВыгрузки + + Rows + 239 + 248 + -1 + -1 + + + + ПКГС_ПослеВыгрузки + + Rows + 274 + 283 + -1 + -1 + + + + ПКГС_ПослеОбработкиВыгрузки + + Rows + 286 + 293 + -1 + -1 + + + + ПКГС_ПриВыгрузке + + Rows + 262 + 271 + -1 + -1 + + + + ПКО_ПередВыгрузкой + + Rows + 143 + 159 + -1 + -1 + + + + ПКО_ПередЗагрузкой + + Rows + 200 + 211 + -1 + -1 + + + + ПКО_ПослеВыгрузки + + Rows + 176 + 186 + -1 + -1 + + + + ПКО_ПослеВыгрузкиВФайл + + Rows + 189 + 197 + -1 + -1 + + + + ПКО_ПоследовательностьПолейПоиска + + Rows + 231 + 236 + -1 + -1 + + + + ПКО_ПослеЗагрузки + + Rows + 221 + 228 + -1 + -1 + + + + ПКО_ПриВыгрузке + + Rows + 162 + 173 + -1 + -1 + + + + ПКО_ПриЗагрузке + + Rows + 214 + 218 + -1 + -1 + + + + ПКС_ПередВыгрузкой + + Rows + 296 + 312 + -1 + -1 + + + + ПКС_ПослеВыгрузки + + Rows + 336 + 355 + -1 + -1 + + + + ПКС_ПриВыгрузке + + Rows + 315 + 333 + -1 + -1 + + + + ПОД_ПередОбработкой + + Rows + 127 + 130 + -1 + -1 + + + + ПОД_ПередУдалением + + Rows + 133 + 137 + -1 + -1 + + + + ПОД_ПослеОбработки + + Rows + 140 + 140 + -1 + -1 + + + + + 31 + + + 395 + + + 0 + + + 0 + style:FieldTextColor + + + 72 + + \ No newline at end of file diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/УниверсальныйОбменДаннымиXML.mdo b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/УниверсальныйОбменДаннымиXML.mdo new file mode 100644 index 000000000..5be5f4124 --- /dev/null +++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/УниверсальныйОбменДаннымиXML.mdo @@ -0,0 +1,957 @@ + + + + + + + УниверсальныйОбменДаннымиXML + + ru + Универсальный обмен данными в формате XML + + true + DataProcessor.УниверсальныйОбменДаннымиXML.Form.Форма + DataProcessor.УниверсальныйОбменДаннымиXML.Form.ФормаСообщенияОбОбычномРежиме + + + ru + + + + ИмяФайлаОбмена + + ru + Имя файла обмена + + + String + + + + + + + ИмяФайлаПравилОбмена + + ru + Имя файла правил обмена + + + String + + + + + + + ДатаНачала + + ru + Дата начала + + + Date + + + + + + + ДатаОкончания + + ru + Дата окончания + + + Date + + + + + + + ТаблицаПравилКонвертации + + ru + Таблица правил конвертации + + + ValueTable + + + + + + ТаблицаПравилВыгрузки + + ru + Таблица правил выгрузки + + + ValueTree + + + + + + ТаблицаПравилОчистки + + ru + Таблица правил очистки + + + ValueTree + + + + + + Параметры + + ru + Параметры + + + + + + + Данные + + ru + Данные + + + + + + + ФлагОшибки + + ru + Флаг ошибки + + + Boolean + + + + + + ФлагРежимОтладки + + ru + Режим отладки + + + Boolean + + + + + + Комментарий + + ru + Комментарий + + + String + + + + + + + ОбработкиНастройкиВыгрузки + + ru + Обработки настройки выгрузки + + + ValueList + + + + + + ОбработкиНастройкиЗагрузки + + ru + Обработки настройки загрузки + + + ValueList + + + + + + ВерсияПравилОбмена + + ru + Версия правил обмена + + + Date + + + + + + + ДатаВыгрузкиДанных + + ru + Дата выгрузки данных + + + Date + + + + + + + РежимОбмена + + ru + Режим обмена + + + String + + 10 + + + + + + + ЭтоИнтерактивныйРежим + + ru + Это интерактивный режим + + + Boolean + + + + + + АрхивироватьФайл + + ru + Архивировать файл + + + Boolean + + + + + + ПостроительОтчета + + ru + Построитель отчета + + + ReportBuilder + + + + + + СохраненныеНастройки + + ru + Сохраненные настройки + + + + + + + ТаблицаНастройкиПараметров + + ru + Таблица настройки параметров + + + ValueTable + + + + + + ИспользоватьТранзакции + + ru + Использовать транзакции + + + Boolean + + + + + + КоличествоОбъектовНаТранзакцию + + ru + Количество объектов на транзакцию + + + Number + + 10 + true + + + + + + + КоличествоОбработанныхОбъектовДляОбновленияСтатуса + + ru + Количество обработанных объектов для обновления статуса + + + Number + + 10 + true + + + + + + + ИмяФайлаПротоколаОбмена + + ru + Имя файла протокола обмена + + + String + + 255 + + + + + + + ДописыватьДанныеВПротоколОбмена + + ru + Дописывать данные в протокол обмена + + + Boolean + + + + + + ВыводВПротоколИнформационныхСообщений + + ru + Вывод в протокол информационных сообщений + + + Boolean + + + + + + ВыводВПротоколСообщенийОбОшибках + + ru + Вывод в протокол сообщений об ошибках + + + Boolean + + + + + + ВыводВОкноСообщенийИнформационныхСообщений + + ru + Вывод в окно сообщений информационных сообщений + + + Boolean + + + + + + ИспользоватьТранзакцииПриВыгрузкеДляПлановОбмена + + ru + Использовать транзакции при выгрузке для планов обмена + + + Boolean + + + + + + КоличествоЭлементовВТранзакцииПриВыгрузкеДляПлановОбмена + + ru + Количество элементов в транзакции при выгрузке для планов обмена + + + Number + + 10 + true + + + + + + + ВыгружатьТолькоРазрешенные + + ru + Выгружать только разрешенные + + + Boolean + + + + + + ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки + + ru + Тип удаления регистрации изменений для узлов обмена после выгрузки + + + Number + + 10 + + + + + + + ЗадаватьВопросПриЗагрузкеДанныхПриОткрытииОбработки + + ru + Задавать вопрос при начале автоматической загрузки данных при открытии обработки + + + Boolean + + + + + + ВестиДополнительныйКонтрольЗаписиВXML + + ru + Вести дополнительный контроль записи в XML + + + Boolean + + + + + + НепосредственноеЧтениеВИБПриемнике + + ru + Непосредственное чтение в ИБ приемнике + + + Boolean + + + + + + ТипИнформационнойБазыДляПодключения + + ru + Тип информационной базы для подключения + + + Boolean + + + + + + КаталогИнформационнойБазыДляПодключения + + ru + Каталог информационной базы для подключения + + + String + + + + + + + ИмяСервераИнформационнойБазыДляПодключения + + ru + Имя сервера информационной базы для подключения + + + String + + + + + + + ИмяИнформационнойБазыНаСервереДляПодключения + + ru + Имя информационной базы на сервере для подключения + + + String + + + + + + + АутентификацияWindowsИнформационнойБазыДляПодключения + + ru + Аутентификация windows информационной базы для подключения + + + Boolean + + + + + + ПользовательИнформационнойБазыДляПодключения + + ru + Пользователь информационной базы для подключения + + + String + + + + + + + ПарольИнформационнойБазыДляПодключения + + ru + Пароль информационной базы для подключения + + + String + + + + + + + ВерсияПлатформыИнформационнойБазыДляПодключения + + ru + Версия платформы информационной базы для подключения + + + String + + 5 + + + + + + + ИмяФайлаПротоколаОбменаЗагрузка + + ru + Имя файла протокола обмена загрузка + + + String + + 255 + + + + + + + ОткрыватьПротоколыОбменаПослеВыполненияОпераций + + ru + Открывать протоколы обмена после выполнения операций + + + Boolean + + + + + + ЗагружатьДанныеВРежимеОбмена + + ru + Загружать данные в режиме обмена + + + Boolean + + + + + + ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты + + ru + Записывать в информационную базу только измененные объекты + + + Boolean + + + + + + ЗаписыватьРегистрыНаборамиЗаписей + + ru + Записывать регистры наборами записей + + + Boolean + + + + + + ВыполнитьОбменДаннымиВОптимизированномФормате + + ru + Выполнить обмен данными в оптимизированном формате + + + Boolean + + + + + + ОптимизированнаяЗаписьОбъектов + + ru + Оптимизированная запись объектов + + + Boolean + + + + + + ОбрезатьСтрокиСправа + + ru + При загрузке строк обрезать пробелы справа + + При загрузке строк обрезать пробелы справа + + Boolean + + + + + + ОбъектыПоСсылкеЗагружатьБезПометкиУдаления + + ru + Объекты по ссылке загружать без пометки удаления + + + Boolean + + + + + + ИспользоватьОтборПоДатеДляВсехОбъектов + + ru + Использовать отбор по дате для всех объектов + + + Boolean + + + + + + ПарольДляСжатияФайлаОбмена + + ru + Пароль для сжатия файла обмена + + + String + + 50 + + + + + + + ПарольДляРаспаковкиФайлаОбмена + + ru + Пароль для распаковки файла обмена + + + String + + 50 + + + + + + + НеВыводитьНикакихИнформационныхСообщенийПользователю + + ru + Не выводить никаких информационных сообщений пользователю + + + Boolean + + + + + + НеЗадаватьВопросПриЗагрузкеДанныхПриОткрытииОбработки + + ru + Не задавать вопрос при загрузке данных при открытии обработки + + + Boolean + + + + + + НастройкаАвтоматическойЗагрузкиДанных + + ru + Настройка автоматической загрузки данных + + + Number + + 10 + true + + + + + + + ФлагРежимОтладкиОбработчиков + + ru + Режим отладки обработчиков + + + Boolean + + + + + + ИмяФайлаВнешнейОбработкиОбработчиковСобытий + + ru + Имя файла внешней обработки обработчиков событий + + + String + + + + + + + ИмяФайлаОбработчиковСобытий + + ru + Имя файла обработчиков событий + + + String + + + + + + + ОбработчикиСобытийЧитаемИзФайлаПравилОбмена + + ru + Обработчики событий читаем из файла правил обмена + + + Boolean + + + + + + РежимОтладкиАлгоритмов + + ru + Режим отладки алгоритмов + + 0 - без отладки, 1 - процедурный вызов стандартный, 2 - процедурный вызов с параметрами обработчиков, 3 - непосредственная вставка кода в обработчик + + Number + + 1 + true + + + + + + + ИмяВременногоФайлаОбработчиковСобытий + + ru + Имя временного файла обработчиков событий + + + String + + + + + + + ИмяВременногоФайлаПротоколаОбмена + + ru + Имя временного файла протокола обмена + + + String + + + + + + + КомментарийПриВыгрузкеДанных + + ru + Комментарий при выгрузке данных + + + String + + + + + + + КомментарийПриЗагрузкеДанных + + ru + Комментарий при загрузке данных + + + String + + + + + + + Форма + + ru + Форма + + Ordinary + PersonalComputer + MobileDevice + + + ФормаНастройкиОтладкиОбработчиков + + ru + Форма настройки отладки обработчиков + + Ordinary + PersonalComputer + MobileDevice + + + ФормаРедактораТекстовогоДокумента + + ru + Форма редактора текстового документа + + Ordinary + PersonalComputer + MobileDevice + + + ФормаСообщенияОбОбычномРежиме + + ru + Форма сообщения об обычном режиме + + PersonalComputer + MobileDevice + + + ПараметрыОбработчиков + + ru + Параметры обработчиков + + + + ОбщиеПроцедурыФункции + + ru + Общие процедуры функции + + TextDocument + + diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/ConditionalAppearance.dcssca b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/ConditionalAppearance.dcssca new file mode 100644 index 000000000..51bf11d1f --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/ConditionalAppearance.dcssca @@ -0,0 +1,182 @@ + + + + + + ИтогиАгрегатыИтоги + + + + + СписокИтогов.АгрегатыИтоги + Equal + 0 + + + + + Текст + Итоги + + + Регистр в режиме Итогов + + + + + ИтогиАгрегатыИтоги + + + + + СписокИтогов.АгрегатыИтоги + Equal + 1 + + + + + Текст + Агрегаты + + + Регистр в режиме Агрегатов + + + + + ИтогиАгрегатыИтоги + + + + + СписокИтогов.АгрегатыИтоги + Equal + 2 + + + + + Текст + + + + Просто итоговый регистр + + + + + ИтогиРазделениеИтогов + + + + + СписокИтогов.РазрешитьРазделениеИтогов + Equal + false + + + + + ЦветФона + web:Gainsboro + + + Невозможно выполнять разделение итогов + + + + + ИтогиИспользоватьТекущиеИтоги + + + ИтогиПериодИтогов + + + ИтогиРазделениеИтогов + + + + + СписокИтогов.ОборотныйРег + Equal + false + + + + + ЦветФона + web:Gainsboro + + + Невозможно управлять итогами + + + + + ИтогиАгрегатыИтоги + + + + + СписокИтогов.АгрегатыИтоги + Equal + 2 + + + + + ЦветФона + web:Gainsboro + + + Это обычный регистр + + + + + ИтогиИспользоватьИтоги + + + + + СписокИтогов.АгрегатыИтоги + Equal + 1 + + + + + ЦветФона + web:Gainsboro + + + false + Текст + Агрегаты + + + Регистр в режиме Агрегатов + + + + + АгрегатыПоРегистрам + + + + + АгрегатыПоРегистрам.ПостроениеОптимально + Equal + false + + + + + Шрифт + + + + Нужно заменить оптимальные агрегата в метаданных + + diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Form.form b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Form.form new file mode 100644 index 000000000..303e6b64d --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Form.form @@ -0,0 +1,4527 @@ + + + + <key>ru</key> + <value>Управление итогами</value> + + + Операции + 1 + + БыстыйДоступ + 6 + + БыстыйДоступИтоги + 212 + + ГруппаУстановкаПериодаРасчитанныхИтогов + 278 + + УстановитьПериодРасчитанныхИтогов + 219 + true + true + + true + + false + + УстановитьПериодРасчитанныхИтоговРасширеннаяПодсказка + 332 + Label + true + true + + Left + + + UsualButton + Form.Command.УстановитьПериодРасчитанныхИтогов + Normal + Auto + 25 + true + 2 + true + UserCmds + Auto + + + ПростоеОписаниеИтогов + 324 + true + true + + true + + + ОписаниеУстановкиПериода + + None + 2 + + ПростоеОписаниеИтоговРасширеннаяПодсказка + 333 + Label + true + true + + Left + + + + ПростоеОписаниеИтоговКонтекстноеМеню + 325 + true + + LabelField + Enter + true + Left + true + + 55 + true + 2 + true + true + + Web.DarkSlateBlue + + + + true + true + + true + + + <key>ru</key> + <value>Группа установка периода расчитанных итогов</value> + + + ru + Группа установка периода расчитанных итогов + + + ГруппаУстановкаПериодаРасчитанныхИтоговРасширеннаяПодсказка + 331 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаВключениеИтогов + 279 + + ВключитьИспользованиеИтогов + 220 + true + true + + true + + false + + ВключитьИспользованиеИтоговРасширеннаяПодсказка + 336 + Label + true + true + + Left + + + UsualButton + Form.Command.ВключитьИспользованиеИтоговБыстрыйДоступ + Normal + Auto + 25 + true + 2 + true + UserCmds + Auto + + + ПростыеИтогиОписание + 282 + + <key>ru</key> + <value>Включить режим использования итогов для всех регистров, у которых в данный момент выключено использование итогов</value> + + true + true + + true + + + ПростыеИтогиОписаниеРасширеннаяПодсказка + 337 + Label + true + true + + Left + + + + ПростыеИтогиОписаниеКонтекстноеМеню + 283 + true + + Label + 55 + true + 2 + true + true + false + false + + Web.DarkBlue + + + Left + Top + + + true + true + + true + + + <key>ru</key> + <value>Группа включение итогов</value> + + + ru + Группа включение итогов + + + ГруппаВключениеИтоговРасширеннаяПодсказка + 335 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Итоги</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + Быстый доступ итоги + + true + + БыстыйДоступИтогиРасширеннаяПодсказка + 330 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + + ГруппаБыстрыйДоступАггрегаты + 214 + + ГруппаПерестроениеИЗаполнениеАгрегатов + 289 + + ПерестроитьИЗаполнитьАгрегаты + 222 + true + true + + true + + false + + ПерестроитьИЗаполнитьАгрегатыРасширеннаяПодсказка + 340 + Label + true + true + + Left + + + UsualButton + Form.Command.ЗаполнитьАгрегатыИВыполнитьПерестроение + Normal + Auto + 25 + true + 2 + true + UserCmds + Auto + + + ПростоеПостроениеИЗаполнениеОписание + 292 + + <key>ru</key> + <value>Выполнить перестроение и заполнение агрегатов для всех регистров, у которых включен режим агрегатов и установлено их использование</value> + + true + true + + true + + + ПростоеПостроениеИЗаполнениеОписаниеРасширеннаяПодсказка + 341 + Label + true + true + + Left + + + + ПростоеПостроениеИЗаполнениеОписаниеКонтекстноеМеню + 293 + true + + Label + 55 + true + 2 + true + true + false + false + + Web.DarkBlue + + + Left + Top + + + true + true + + true + + + <key>ru</key> + <value>Группа перестроение и заполнение агрегатов</value> + + + ru + Группа перестроение и заполнение агрегатов + + + ГруппаПерестроениеИЗаполнениеАгрегатовРасширеннаяПодсказка + 339 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаПолучениеОптимальныхАгрегатов + 288 + + ПолучитьОптимальныеАгрегаты + 223 + true + true + + true + + false + + ПолучитьОптимальныеАгрегатыРасширеннаяПодсказка + 343 + Label + true + true + + Left + + + UsualButton + Form.Command.ПолучитьОптимальныеАгрегаты + Normal + Auto + 25 + true + 2 + true + UserCmds + Auto + + + ПростоеПолучениеОптимальныхАгрегатов + 290 + + <key>ru</key> + <value>Выполнить расчет списка оптимальных агрегатов для всех регистров, для которых в Конфигураторе заданы агрегаты</value> + + true + true + + true + + + ПростоеПолучениеОптимальныхАгрегатовРасширеннаяПодсказка + 344 + Label + true + true + + Left + + + + ПростоеПолучениеОптимальныхАгрегатовКонтекстноеМеню + 291 + true + + Label + 55 + true + 2 + true + true + false + false + + Web.DarkBlue + + + Left + Top + + + true + true + + true + + + <key>ru</key> + <value>Группа получение оптимальных агрегатов</value> + + + ru + Группа получение оптимальных агрегатов + + + ГруппаПолучениеОптимальныхАгрегатовРасширеннаяПодсказка + 342 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Агрегаты</value> + + + System.DefaultGUIFont + true + false + false + false + + + ru + Группа быстрый доступ аггрегаты + + + ГруппаБыстрыйДоступАггрегатыРасширеннаяПодсказка + 338 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Типовые операции</value> + + + ru + Типовые операции + + true + + БыстыйДоступРасширеннаяПодсказка + 329 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + РасширенныеВозможности + 208 + + РасширенныеИнструменты + 209 + + ГруппаИтогов + 2 + + СписокИтогов + 9 + true + true + + true + + + СписокИтогов + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + OutputList + + ИтогиНаименование + 12 + true + true + + true + + + СписокИтогов.Наименование + + + ИтогиНаименованиеРасширеннаяПодсказка + 380 + Label + true + true + + Left + + + + ИтогиНаименованиеКонтекстноеМеню + 13 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + Normal + + + + ИтогиИспользоватьИтоги + 14 + true + true + + true + + + СписокИтогов.ИспользоватьИтоги + + + ru + Признак использования итогов данным регистром. + + + ИтогиИспользоватьИтогиРасширеннаяПодсказка + 382 + Label + true + true + + Left + + + + ИтогиИспользоватьИтогиКонтекстноеМеню + 15 + true + + CheckBoxField + Auto + true + Left + true + + + + ИтогиИспользоватьТекущиеИтоги + 16 + true + true + + true + + + СписокИтогов.ИспользоватьТекущиеИтоги + + + ru + Признак использования текущих итогов данным регистром. + + + ИтогиИспользоватьТекущиеИтогиРасширеннаяПодсказка + 384 + Label + true + true + + Left + + + + ИтогиИспользоватьТекущиеИтогиКонтекстноеМеню + 17 + true + + CheckBoxField + Auto + true + Left + true + + + + ИтогиПериодИтогов + 18 + true + true + + true + + + СписокИтогов.ПериодИтогов + + + ru + Текущая дата актуальности итогов + + + ИтогиПериодИтоговРасширеннаяПодсказка + 386 + Label + true + true + + Left + + + + ИтогиПериодИтоговКонтекстноеМеню + 19 + true + + InputField + Auto + true + Left + true + + true + true + + ru + DLF=DD + + + ru + DLF=D + + true + true + true + Normal + + + + ИтогиРазделениеИтогов + 185 + true + true + + true + + + СписокИтогов.РазделениеИтогов + + + ru + Возможность разделения итогов + + + ИтогиРазделениеИтоговРасширеннаяПодсказка + 388 + Label + true + true + + Left + + + + ИтогиРазделениеИтоговКонтекстноеМеню + 186 + true + + CheckBoxField + true + Auto + true + Left + true + + + + ИтогиАгрегатыИтоги + 71 + true + true + + true + + + СписокИтогов.АгрегатыИтоги + + + ru + Какой режим использует регистр: итогов или агрегатов + + + ИтогиАгрегатыИтогиРасширеннаяПодсказка + 390 + Label + true + true + + Left + + + + ИтогиАгрегатыИтогиКонтекстноеМеню + 72 + true + + InputField + true + Left + Auto + true + Left + true + + true + true + true + true + true + Normal + + + + СписокИтоговКоманднаяПанель + 11 + + ОбновитьСостояниеИтогов + 42 + true + true + + true + + false + + ОбновитьСостояниеИтоговРасширеннаяПодсказка + 352 + Label + true + true + + Left + + + Form.Command.ОбновитьСостояниеИтогов + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаИтоги + 202 + + ИтогиВключитьИспользованиеИтогов + 204 + true + true + + true + + false + + ИтогиВключитьИспользованиеИтоговРасширеннаяПодсказка + 354 + Label + true + true + + Left + + + Form.Command.ВключитьИспользованиеИтогов + Normal + Auto + true + true + UserCmds + Auto + + + ИтогиВыключитьИспользованиеИтогов + 205 + true + true + + true + + false + + ИтогиВыключитьИспользованиеИтоговРасширеннаяПодсказка + 355 + Label + true + true + + Left + + + Form.Command.ВыключитьИспользованиеИтогов + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Итоги</value> + + + ru + Включение/выключение использования итогов + + + ГруппаИтогиРасширеннаяПодсказка + 353 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + ГруппаТекущиеИтоги + 203 + + ВключитьИспользованиеТекущихИтогов + 206 + true + true + + true + + false + + ВключитьИспользованиеТекущихИтоговРасширеннаяПодсказка + 357 + Label + true + true + + Left + + + Form.Command.ВключитьИспользованиеТекущихИтогов + Normal + Auto + true + true + UserCmds + Auto + + + ВыключитьИспользованиеТекущихИтогов + 207 + true + true + + true + + false + + ВыключитьИспользованиеТекущихИтоговРасширеннаяПодсказка + 358 + Label + true + true + + Left + + + Form.Command.ВыключитьИспользованиеТекущихИтогов + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Текущие итоги</value> + + + ru + Включение/выключение использования текущих итогов + + + ГруппаТекущиеИтогиРасширеннаяПодсказка + 356 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + ГруппаРазделениеИтогов + 294 + + ВключитьРазделениеИтогов + 295 + true + true + + true + + false + + ВключитьРазделениеИтоговРасширеннаяПодсказка + 360 + Label + true + true + + Left + + + Form.Command.ВключитьРазделениеИтогов + Normal + Auto + true + true + UserCmds + Auto + + + ВыключитьРазделениеИтогов + 296 + true + true + + true + + false + + ВыключитьРазделениеИтоговРасширеннаяПодсказка + 361 + Label + true + true + + Left + + + Form.Command.ВыключитьРазделениеИтогов + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Разделение итогов</value> + + + ru + Включение/выключение разделения итогов + + + ГруппаРазделениеИтоговРасширеннаяПодсказка + 359 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + УстановитьПериодИтогов + 45 + true + true + + true + + false + + УстановитьПериодИтоговРасширеннаяПодсказка + 362 + Label + true + true + + Left + + + Form.Command.УстановитьПериодИтогов + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаПересчет + 299 + + ПересчитатьИтоги + 300 + true + true + + true + + false + + ПересчитатьИтогиРасширеннаяПодсказка + 364 + Label + true + true + + Left + + + Form.Command.ПересчитатьИтоги + Normal + Auto + true + true + UserCmds + Auto + + + ПересчитатьТекущиеИтоги + 301 + true + true + + true + + false + + ПересчитатьТекущиеИтогиРасширеннаяПодсказка + 365 + Label + true + true + + Left + + + Form.Command.ПересчитатьТекущиеИтоги + Normal + Auto + true + true + UserCmds + Auto + + + ПересчитатьИтогиЗаПериод + 302 + true + true + + true + + false + + ПересчитатьИтогиЗаПериодРасширеннаяПодсказка + 366 + Label + true + true + + Left + + + Form.Command.ПересчитатьИтогиЗаПериод + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Пересчет</value> + + + ru + Пересчет итогов + + + ГруппаПересчетРасширеннаяПодсказка + 363 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + Найти + 303 + true + true + + true + + false + + НайтиРасширеннаяПодсказка + 367 + Label + true + true + + Left + + + Form.Item.СписокИтогов.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ОтменитьПоиск + 304 + true + true + + true + + false + + ОтменитьПоискРасширеннаяПодсказка + 368 + Label + true + true + + Left + + + Form.Item.СписокИтогов.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + ВыделитьВсе + 305 + true + true + + true + + false + + ВыделитьВсеРасширеннаяПодсказка + 369 + Label + true + true + + Left + + + Form.Item.СписокИтогов.StandardCommand.SelectAll + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + Left + + + Selection + СписокИтоговВыбор + + + OnActivateRow + СписокИтоговПриАктивизацииСтроки + + + СписокИтоговСтрокаПоиска + 371 + + СписокИтоговСтрокаПоискаРасширеннаяПодсказка + 373 + Label + true + true + + Left + + + + СписокИтоговСтрокаПоискаКонтекстноеМеню + 372 + true + + СписокИтогов + + true + + + + СписокИтоговСостояниеПросмотра + 374 + + СписокИтоговСостояниеПросмотраРасширеннаяПодсказка + 376 + Label + true + true + + Left + + + + СписокИтоговСостояниеПросмотраКонтекстноеМеню + 375 + true + + ViewStatusAddition + СписокИтогов + + true + + + + СписокИтоговУправлениеПоиском + 377 + + СписокИтоговУправлениеПоискомРасширеннаяПодсказка + 379 + Label + true + true + + Left + + + + СписокИтоговУправлениеПоискомКонтекстноеМеню + 378 + true + + SearchControlAddition + СписокИтогов + + true + + + + СписокИтоговРасширеннаяПодсказка + 370 + Label + true + true + + Left + + + + СписокИтоговКонтекстноеМеню + 10 + + КонтекстноеМенюИтогиУстановитьПериодИтогов + 307 + true + true + + true + + false + + КонтекстноеМенюИтогиУстановитьПериодИтоговРасширеннаяПодсказка + 348 + Label + true + true + + Left + + + Form.Command.УстановитьПериодИтогов + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюИтогиПересчитатьИтоги + 308 + true + true + + true + + false + + КонтекстноеМенюИтогиПересчитатьИтогиРасширеннаяПодсказка + 349 + Label + true + true + + Left + + + Form.Command.ПересчитатьИтоги + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюИтогиПересчитатьТекущиеИтоги + 309 + true + true + + true + + false + + КонтекстноеМенюИтогиПересчитатьТекущиеИтогиРасширеннаяПодсказка + 350 + Label + true + true + + Left + + + Form.Command.ПересчитатьТекущиеИтоги + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюИтогиВыделитьВсе + 306 + true + true + + true + + false + + КонтекстноеМенюИтогиВыделитьВсеРасширеннаяПодсказка + 351 + Label + true + true + + Left + + + Form.Item.СписокИтогов.StandardCommand.SelectAll + Normal + Auto + true + true + UserCmds + Auto + + + true + true + true + 5 + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + + СписокИтогов.Картинка + + None + None + None + true + +
    + + ПрерыватьПриОшибке + 264 + true + true + + true + + + ПрерыватьПриОшибке + + Right + + ПрерыватьПриОшибкеРасширеннаяПодсказка + 400 + Label + true + true + + Left + + + + ПрерыватьПриОшибкеКонтекстноеМеню + 265 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Итоги</value> + + + ru + Управление итогами + + + ГруппаИтоговРасширеннаяПодсказка + 347 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + + ГруппаАгрегаты + 5 + + АгрегатыПоРегистрам + 56 + true + true + + true + + + АгрегатыПоРегистрам + + false + None + + АгрСписокНаименование + 59 + true + true + + true + + + АгрегатыПоРегистрам.Наименование + + + АгрСписокНаименованиеРасширеннаяПодсказка + 429 + Label + true + true + + Left + + + + АгрСписокНаименованиеКонтекстноеМеню + 60 + true + + InputField + true + Auto + true + Left + true + + 30 + true + true + true + true + true + Normal + + + + АгрСписокРежимАгрегатов + 61 + true + true + + true + + + АгрегатыПоРегистрам.РежимАгрегатов + + + АгрСписокРежимАгрегатовРасширеннаяПодсказка + 431 + Label + true + true + + Left + + + + АгрСписокРежимАгрегатовКонтекстноеМеню + 62 + true + + InputField + true + Auto + true + Left + true + + true + true + + ru + BF=Итоги; BT=Агрегаты + + + ru + BF=Итоги; BT=Агрегаты + + true + true + true + Normal + + + + АгрСписокИспользованиеАгрегатов + 63 + true + true + + true + + + АгрегатыПоРегистрам.ИспользованиеАгрегатов + + + ru + Признак использования агрегатов для регистра. + + + АгрСписокИспользованиеАгрегатовРасширеннаяПодсказка + 433 + Label + true + true + + Left + + + + АгрСписокИспользованиеАгрегатовКонтекстноеМеню + 64 + true + + CheckBoxField + true + Auto + true + Left + true + + + + АгрСписокДатаПостроения + 69 + true + true + + true + + + АгрегатыПоРегистрам.ДатаПостроения + + + АгрСписокДатаПостроенияРасширеннаяПодсказка + 435 + Label + true + true + + Left + + + + АгрСписокДатаПостроенияКонтекстноеМеню + 70 + true + + InputField + true + Auto + true + Left + true + + 10 + true + true + true + true + true + Normal + + + + АгрСписокЭффект + 91 + true + true + + true + + + АгрегатыПоРегистрам.Эффект + + + АгрСписокЭффектРасширеннаяПодсказка + 437 + Label + true + true + + Left + + + + АгрСписокЭффектКонтекстноеМеню + 92 + true + + InputField + true + Auto + true + Left + true + + 10 + true + true + true + true + true + Normal + + + + АгрСписокРазмер + 89 + true + true + + true + + + АгрегатыПоРегистрам.Размер + + + АгрСписокРазмерРасширеннаяПодсказка + 439 + Label + true + true + + Left + + + + АгрСписокРазмерКонтекстноеМеню + 90 + true + + InputField + true + Auto + true + Left + true + + 10 + true + true + true + true + true + Normal + + + + АгрСписокОграничениеРазмера + 107 + true + true + + true + + + АгрегатыПоРегистрам.ОграничениеРазмера + + + АгрСписокОграничениеРазмераРасширеннаяПодсказка + 441 + Label + true + true + + Left + + + + АгрСписокОграничениеРазмераКонтекстноеМеню + 108 + true + + InputField + true + Auto + true + Left + true + + 10 + true + true + true + true + true + Normal + + + + АгрегатыПоРегистрамКоманднаяПанель + 58 + + АгрРегОбновитьИнформациюОбАгрегатах + 109 + true + true + + true + + false + + АгрРегОбновитьИнформациюОбАгрегатахРасширеннаяПодсказка + 407 + Label + true + true + + Left + + + Form.Command.ОбновитьИнформациюОбАгрегатах + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаРежим + 297 + + АгрРегВключитьРежимАгрегатов + 193 + true + true + + true + + false + + АгрРегВключитьРежимАгрегатовРасширеннаяПодсказка + 409 + Label + true + true + + Left + + + Form.Command.ВключитьРежимАгрегатов + Normal + Auto + true + true + UserCmds + Auto + + + АгрРегВключитьРежимИтогов + 195 + true + true + + true + + false + + АгрРегВключитьРежимИтоговРасширеннаяПодсказка + 410 + Label + true + true + + Left + + + Form.Command.ВключитьРежимИтогов + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Режим</value> + + + ru + Изменение режима использования регистра + + + ГруппаРежимРасширеннаяПодсказка + 408 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + ГруппаИспользование + 298 + + АгрРегВключитьИспользованиеАгрегатов + 194 + true + true + + true + + false + + АгрРегВключитьИспользованиеАгрегатовРасширеннаяПодсказка + 412 + Label + true + true + + Left + + + Form.Command.ВключитьИспользованиеАгрегатов + Normal + Auto + true + true + UserCmds + Auto + + + АгрРегОтключитьИспользованиеАгрегатов + 196 + true + true + + true + + false + + АгрРегОтключитьИспользованиеАгрегатовРасширеннаяПодсказка + 413 + Label + true + true + + Left + + + Form.Command.ВыключитьИспользованиеАгрегатов + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Использование</value> + + + ru + Изменение режима использования агрегатов + + + ГруппаИспользованиеРасширеннаяПодсказка + 411 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + АгрРегПерестроить + 198 + true + true + + true + + false + + АгрРегПерестроитьРасширеннаяПодсказка + 414 + Label + true + true + + Left + + + Form.Command.ПерестроитьАгрегаты + Normal + Auto + true + true + UserCmds + Auto + + + АгрРегЗаполнитьАгрегатыПоРегистрам + 200 + true + true + + true + + false + + АгрРегЗаполнитьАгрегатыПоРегистрамРасширеннаяПодсказка + 415 + Label + true + true + + Left + + + Form.Command.ЗаполнитьАгрегатыПоРегистрам + Normal + Auto + true + true + UserCmds + Auto + + + АгрРегОчиститьАгрегатыПоРегистрам + 199 + true + true + + true + + false + + АгрРегОчиститьАгрегатыПоРегистрамРасширеннаяПодсказка + 416 + Label + true + true + + Left + + + Form.Command.ОчиститьАгрегатыПоРегистрам + Normal + Auto + true + true + UserCmds + Auto + + + АгрРегОптимальные + 201 + true + true + + true + + false + + АгрРегОптимальныеРасширеннаяПодсказка + 417 + Label + true + true + + Left + + + Form.Command.АгрегатыОптимальные + Normal + Auto + true + true + UserCmds + Auto + + + АгрРегВыделитьВсе + 317 + true + true + + true + + false + + АгрРегВыделитьВсеРасширеннаяПодсказка + 418 + Label + true + true + + Left + + + Form.Item.АгрегатыПоРегистрам.StandardCommand.SelectAll + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + Left + + + OnActivateRow + АгрегатыПоРегистрамПриАктивизацииСтроки + + + АгрегатыПоРегистрамСтрокаПоиска + 420 + + АгрегатыПоРегистрамСтрокаПоискаРасширеннаяПодсказка + 422 + Label + true + true + + Left + + + + АгрегатыПоРегистрамСтрокаПоискаКонтекстноеМеню + 421 + true + + АгрегатыПоРегистрам + + true + + + + АгрегатыПоРегистрамСостояниеПросмотра + 423 + + АгрегатыПоРегистрамСостояниеПросмотраРасширеннаяПодсказка + 425 + Label + true + true + + Left + + + + АгрегатыПоРегистрамСостояниеПросмотраКонтекстноеМеню + 424 + true + + ViewStatusAddition + АгрегатыПоРегистрам + + true + + + + АгрегатыПоРегистрамУправлениеПоиском + 426 + + АгрегатыПоРегистрамУправлениеПоискомРасширеннаяПодсказка + 428 + Label + true + true + + Left + + + + АгрегатыПоРегистрамУправлениеПоискомКонтекстноеМеню + 427 + true + + SearchControlAddition + АгрегатыПоРегистрам + + true + + + + АгрегатыПоРегистрамРасширеннаяПодсказка + 419 + Label + true + true + + Left + + + + АгрегатыПоРегистрамКонтекстноеМеню + 57 + + КМАгрРегВключитьРежимАгрегатов + 313 + true + true + + true + + false + + КМАгрРегВключитьРежимАгрегатовРасширеннаяПодсказка + 403 + Label + true + true + + Left + + + Form.Command.ВключитьРежимАгрегатов + Normal + Auto + true + true + UserCmds + Auto + + + КМАгрРегПерестроитьАгрегаты + 314 + true + true + + true + + false + + КМАгрРегПерестроитьАгрегатыРасширеннаяПодсказка + 404 + Label + true + true + + Left + + + Form.Command.ПерестроитьАгрегаты + Normal + Auto + true + true + UserCmds + Auto + + + КМАгрРегАгрегатыОптимальные + 315 + true + true + + true + + false + + КМАгрРегАгрегатыОптимальныеРасширеннаяПодсказка + 405 + Label + true + true + + Left + + + Form.Command.АгрегатыОптимальные + Normal + Auto + true + true + UserCmds + Auto + + + КМАгрРегВыделитьВсе + 312 + true + true + + true + + false + + КМАгрРегВыделитьВсеРасширеннаяПодсказка + 406 + Label + true + true + + Left + + + Form.Item.АгрегатыПоРегистрам.StandardCommand.SelectAll + Normal + Auto + true + true + UserCmds + Auto + + + true + true + true + true + true + 4 + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + + АгрегатыПоРегистрам.Картинка + + None + None + None + true + +
    + + СписокАгрегатов + 73 + + System.DefaultGUIFont + true + false + false + false + + true + true + + true + + + СписокАгрегатовРегистра + + false + Top + Add + CancelSearch + Change + Copy + CopyToClipboard + Delete + EndEdit + Find + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + + АгрИспользование + 97 + true + true + + true + + + СписокАгрегатовРегистра.Использование + + + АгрИспользованиеРасширеннаяПодсказка + 461 + Label + true + true + + Left + + + + АгрИспользованиеКонтекстноеМеню + 98 + true + + CheckBoxField + Auto + true + Left + true + + + + АгрПериодичность + 322 + true + true + + true + + + СписокАгрегатовРегистра.Периодичность + + + АгрПериодичностьРасширеннаяПодсказка + 463 + Label + true + true + + Left + + + + АгрПериодичностьКонтекстноеМеню + 323 + true + + InputField + Auto + true + Left + true + + 15 + true + true + true + true + true + Normal + + + + АгрИзмерения + 95 + true + true + + true + + + СписокАгрегатовРегистра.Измерения + + + АгрИзмеренияРасширеннаяПодсказка + 465 + Label + true + true + + Left + + + + АгрИзмеренияКонтекстноеМеню + 96 + true + + InputField + Auto + true + Left + true + + 15 + true + true + true + true + true + Normal + + + + АгрНачалоПериода + 101 + true + true + + true + + + СписокАгрегатовРегистра.НачалоПериода + + + АгрНачалоПериодаРасширеннаяПодсказка + 467 + Label + true + true + + Left + + + + АгрНачалоПериодаКонтекстноеМеню + 102 + true + + InputField + Auto + true + Left + true + + 10 + true + true + true + true + true + Normal + + + + АгрКонецПериода + 99 + true + true + + true + + + СписокАгрегатовРегистра.КонецПериода + + + АгрКонецПериодаРасширеннаяПодсказка + 469 + Label + true + true + + Left + + + + АгрКонецПериодаКонтекстноеМеню + 100 + true + + InputField + Auto + true + Left + true + + 10 + true + true + true + true + true + Normal + + + + АгрРазмер + 105 + true + true + + true + + + СписокАгрегатовРегистра.Размер + + + АгрРазмерРасширеннаяПодсказка + 471 + Label + true + true + + Left + + + + АгрРазмерКонтекстноеМеню + 106 + true + + InputField + Auto + true + Left + true + + 10 + true + true + true + true + true + Normal + + + None + + СписокАгрегатовКоманднаяПанель + 75 + Left + + + СписокАгрегатовСтрокаПоиска + 452 + + СписокАгрегатовСтрокаПоискаРасширеннаяПодсказка + 454 + Label + true + true + + Left + + + + СписокАгрегатовСтрокаПоискаКонтекстноеМеню + 453 + true + + СписокАгрегатов + + true + + + + СписокАгрегатовСостояниеПросмотра + 455 + + СписокАгрегатовСостояниеПросмотраРасширеннаяПодсказка + 457 + Label + true + true + + Left + + + + СписокАгрегатовСостояниеПросмотраКонтекстноеМеню + 456 + true + + ViewStatusAddition + СписокАгрегатов + + true + + + + СписокАгрегатовУправлениеПоиском + 458 + + СписокАгрегатовУправлениеПоискомРасширеннаяПодсказка + 460 + Label + true + true + + Left + + + + СписокАгрегатовУправлениеПоискомКонтекстноеМеню + 459 + true + + SearchControlAddition + СписокАгрегатов + + true + + + + СписокАгрегатовРасширеннаяПодсказка + 451 + Label + true + true + + Left + + + + СписокАгрегатовКонтекстноеМеню + 74 + true + + true + true + true + 3 + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + None + None + None + true + +
    + true + true + + true + + + <key>ru</key> + <value>Агрегаты</value> + + + ru + Управление агрегатами + + + ГруппаАгрегатыРасширеннаяПодсказка + 402 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + true + true + + true + + + <key>ru</key> + <value>Расширенные инструменты</value> + + + ru + Расширенные инструменты + + + РасширенныеИнструментыРасширеннаяПодсказка + 346 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + +
    + true + true + + true + + + <key>ru</key> + <value>Расширенная</value> + + + ru + Расширенные возможности + + + РасширенныеВозможностиРасширеннаяПодсказка + 345 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + true + true + + true + + + <key>ru</key> + <value>Операции</value> + + + ru + Операции + + + ОперацииРасширеннаяПодсказка + 328 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + +
    + + Подвал + 320 + + ГиперссылкаСТекстом + 326 + true + true + + true + + + ТекстГиперСсылки + + None + + ГиперссылкаСТекстомРасширеннаяПодсказка + 482 + Label + true + true + + Left + + + + ГиперссылкаСТекстомКонтекстноеМеню + 327 + true + + LabelField + Right + Enter + true + Left + true + + + Click + ГиперссылкаСТекстомНажатие + + 25 + true + true + true + true + + + + Справка + 321 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 484 + Label + true + true + + Left + + + UsualButton + Form.StandardCommand.Help + Normal + Picture + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Подвал</value> + + + ru + Подвал + + true + + ПодвалРасширеннаяПодсказка + 481 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Right + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + Use + true + true + Vertical + true + true + UseIfNecessary + 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 + + String + + + + true + + + true + + + + ИспользоватьИтоги + + <key>ru</key> + <value>Итоги</value> + + 2 + + Boolean + + + true + + + true + + + + ИспользоватьТекущиеИтоги + + <key>ru</key> + <value>Текущие итоги</value> + + 4 + + Boolean + + + true + + + true + + + + ПериодИтогов + + <key>ru</key> + <value>Период итогов</value> + + 6 + + Date + + Date + + + + true + + + true + + + + Картинка + + <key>ru</key> + <value>Картинка</value> + + 8 + + Picture + + + true + + + true + + + + Тип + + <key>ru</key> + <value>Тип</value> + + 9 + + Number + + 1 + true + + + + true + + + true + + + + ИмяМетаданного + + <key>ru</key> + <value>Имя метаданного</value> + + 10 + + String + + + + true + + + true + + + + ОборотныйРег + + <key>ru</key> + <value>Оборотный рег</value> + + 11 + + Boolean + + + true + + + true + + + + АгрегатыИтоги + + <key>ru</key> + <value>Агрегаты/Итоги</value> + + 12 + + Number + + 1 + true + + + + true + + + true + + + + РазделениеИтогов + + <key>ru</key> + <value>Разделение итогов</value> + + 13 + + Boolean + + + true + + + true + + + + РазрешитьРазделениеИтогов + + <key>ru</key> + <value>Разрешить разделение итогов</value> + + 3 + + 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 + + Boolean + + + true + + + true + + + + ИспользованиеАгрегатов + + <key>ru</key> + <value>Использование агрегатов</value> + + 5 + + Boolean + + + true + + + true + + + + ДатаПостроения + + <key>ru</key> + <value>Дата построения</value> + + 10 + + Date + + Date + + + + true + + + true + + + + Картинка + + <key>ru</key> + <value>Картинка</value> + + 11 + + Picture + + + true + + + true + + + + Размер + + <key>ru</key> + <value>Размер</value> + + 8 + + Number + + 15 + true + + + + true + + + true + + + + Эффект + + <key>ru</key> + <value>Эффект</value> + + 9 + + Number + + 15 + true + + + + true + + + true + + + + ОграничениеРазмера + + <key>ru</key> + <value>Ограничение размера</value> + + 12 + + Number + + 15 + true + + + + true + + + true + + + + ПостроениеОптимально + + <key>ru</key> + <value>Построение оптимально</value> + + 4 + + Boolean + + + true + + + true + + + + + ПрерыватьПриОшибке + + <key>ru</key> + <value>Прерывать обработку после ошибки с одним регистром</value> + + 8 + + Boolean + + + true + + + true + + + ПрерыватьПриОшибке + + + + СписокАгрегатовРегистра + + <key>ru</key> + <value>Агрегаты регистра</value> + + 6 + + 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 + + Boolean + + + true + + + true + + + + КонецПериода + + <key>ru</key> + <value>Конец периода</value> + + 4 + + Date + + + + true + + + true + + + + НачалоПериода + + <key>ru</key> + <value>Начало периода</value> + + 5 + + Date + + + + true + + + true + + + + Периодичность + + <key>ru</key> + <value>Периодичность</value> + + 6 + + String + + + + true + + + true + + + + Размер + + <key>ru</key> + <value>Размер</value> + + 7 + + Number + + 15 + true + + + + true + + + true + + + + + ПолныеВозможности + + <key>ru</key> + <value>Полные возможности</value> + + 7 + + Boolean + + + true + + + true + + + ПолныеВозможности + + + + РассчитатьИтогиНа + + <key>ru</key> + <value>Рассчитать итоги на</value> + + 9 + + Date + + Date + + + + true + + + true + + + + ПутьКОбъектуМетаданных + + <key>ru</key> + <value>Путь к объекту метаданных</value> + + 12 + + String + + + + true + + + true + + + + ПутьКОптимальнымАгрегатам + + <key>ru</key> + <value>Путь к оптимальным агрегатам</value> + + 13 + + String + + + + true + + + true + + + ПутьКОптимальнымАгрегатам + + + + ОтносительныйРазмер + + <key>ru</key> + <value>Относительный размер</value> + + 14 + + Number + + 10 + true + + + + true + + + true + + + ОтносительныйРазмер + + + + МинимальныйЭффект + + <key>ru</key> + <value>Минимальный эффект</value> + + 15 + + Number + + 10 + true + + + + true + + + true + + + МинимальныйЭффект + + + + ОптимальныйОтносительныйРазмер + + <key>ru</key> + <value>Оптимальный относительный размер</value> + + 16 + + Number + + 10 + true + + + + true + + + true + + + ОптимальныйОтносительныйРазмер + + + + ПериодПерерасчетаРегистров + + <key>ru</key> + <value>Период пересчета регистров</value> + + 3 + + StandardPeriod + + + true + + + true + + + ПериодПерерасчетаРегистров + + + + ОписаниеУстановкиПериода + + <key>ru</key> + <value>Описание установки периода</value> + + 10 + + String + + + + true + + + true + + + + ТекстГиперСсылки + + <key>ru</key> + <value>Текст гипер ссылки</value> + + 11 + + String + + + + true + + + true + + + + ВключитьИспользованиеИтогов + + <key>ru</key> + <value>Включить использование итогов</value> + + 1 + + ru + Включить использование итогов + + + true + + + + ВключитьИспользованиеИтогов + + + Auto + Auto + + + ВключитьИспользованиеТекущихИтогов + + <key>ru</key> + <value>Включить использование текущих итогов</value> + + 2 + + ru + Включить использование текущих итогов + + + true + + + + ВключитьИспользованиеТекущихИтогов + + + Auto + Auto + + + ВыключитьИспользованиеИтогов + + <key>ru</key> + <value>Выключить использование итогов</value> + + 3 + + ru + Выключить использование итогов + + + true + + + + ВыключитьИспользованиеИтогов + + + Auto + Auto + + + ВыключитьИспользованиеТекущихИтогов + + <key>ru</key> + <value>Выключить использование текущих итогов</value> + + 4 + + ru + Выключить использование текущих итогов + + + true + + + + ВыключитьИспользованиеТекущихИтогов + + + Auto + Auto + + + ОбновитьСостояниеИтогов + + <key>ru</key> + <value>Обновить состояние итогов</value> + + 5 + + ru + Обновить информацию о состоянии итогов + + + true + + F5 + + StdPicture.Refresh + + + + ОбновитьСостояниеИтогов + + + Picture + Auto + Auto + + + УстановитьПериодИтогов + + <key>ru</key> + <value>Установить период итогов...</value> + + 8 + + ru + Установить период рассчитанных итогов + + + true + + + + УстановитьПериодИтогов + + + Auto + Auto + + + ВключитьРазделениеИтогов + + <key>ru</key> + <value>Включить разделение итогов</value> + + 9 + + ru + Включить разделение итогов + + + true + + + + ВключитьРазделениеИтогов + + + Auto + Auto + + + ВыключитьРазделениеИтогов + + <key>ru</key> + <value>Выключить разделение итогов</value> + + 10 + + ru + Выключить разделение итогов + + + true + + + + ВыключитьРазделениеИтогов + + + Auto + Auto + + + ОбновитьИнформациюОбАгрегатах + + <key>ru</key> + <value>Обновить состояние</value> + + 24 + + ru + Обновить информацию об агрегатах + + + true + + F5 + + StdPicture.Refresh + + + + ОбновитьИнформациюОбАгрегатах + + + Picture + Auto + Auto + + + ВключитьРежимАгрегатов + + <key>ru</key> + <value>Включить режим агрегатов</value> + + 21 + + ru + Включить режим агрегатов + + + true + + + + ВключитьРежимАгрегатов + + + Auto + Auto + + + ВключитьИспользованиеАгрегатов + + <key>ru</key> + <value>Включить использование агрегатов</value> + + 22 + + ru + Включить использование агрегатов + + + true + + + + ВключитьИспользованиеАгрегатов + + + Auto + Auto + + + ВключитьРежимИтогов + + <key>ru</key> + <value>Включить режим итогов</value> + + 23 + + ru + Включить режим итогов + + + true + + + + ВключитьРежимИтогов + + + Auto + Auto + + + ВыключитьИспользованиеАгрегатов + + <key>ru</key> + <value>Выключить использование агрегатов</value> + + 27 + + ru + Выключить использование агрегатов + + + true + + + + ВыключитьИспользованиеАгрегатов + + + Auto + Auto + + + ПерестроитьАгрегаты + + <key>ru</key> + <value>Перестроить ...</value> + + 28 + + ru + Перестроить использование агрегатов + + + true + + + + ПерестроитьАгрегаты + + + Auto + Auto + + + ОчиститьАгрегатыПоРегистрам + + <key>ru</key> + <value>Очистить</value> + + 29 + + ru + Очистить агрегаты + + + true + + + + ОчиститьАгрегатыПоРегистрам + + + Auto + Auto + + + ЗаполнитьАгрегатыПоРегистрам + + <key>ru</key> + <value>Обновить</value> + + 30 + + ru + Обновить агрегаты + + + true + + + + ЗаполнитьАгрегатыПоРегистрам + + + Auto + Auto + + + АгрегатыОптимальные + + <key>ru</key> + <value>Оптимальные ...</value> + + 31 + + ru + Рассчитать оптимальные агрегаты + + + true + + + + АгрегатыОптимальные + + + Auto + Auto + + + УстановитьПериодРасчитанныхИтогов + + <key>ru</key> + <value>Установить период рассчитанных итогов</value> + + 6 + + ru + Установить период рассчитанных итогов по всем регистрам + + + true + + + + УстановитьПериодРасчитанныхИтогов + + + Auto + Auto + + + ВключитьИспользованиеИтоговБыстрыйДоступ + + <key>ru</key> + <value>Включить использование итогов</value> + + 7 + + ru + Включить использование итогов для всех регистров, у которых это использование отключено + + + true + + + + ВключитьИспользованиеИтоговБыстрыйДоступ + + + Auto + Auto + + + ЗаполнитьАгрегатыИВыполнитьПерестроение + + <key>ru</key> + <value>Перестроить и заполнить</value> + + 13 + + ru + Заполнить агрегаты и выполнить перестроение + + + true + + + + ЗаполнитьАгрегатыИВыполнитьПерестроение + + + Auto + Auto + + + ПолучитьОптимальныеАгрегаты + + <key>ru</key> + <value>Получить оптимальные агрегаты</value> + + 15 + + ru + Рассчитать оптимальные агрегаты для всех регистров + + + true + + + + ПолучитьОптимальныеАгрегаты + + + Auto + Auto + + + ПересчитатьИтоги + + <key>ru</key> + <value>Пересчитать итоги</value> + + 35 + + ru + Выполнить пересчет итогов + + + true + + + + ПересчитатьИтоги + + + Auto + Auto + + + ПересчитатьИтогиЗаПериод + + <key>ru</key> + <value>Пересчитать итоги за период...</value> + + 36 + + ru + Выполнить пересчет итогов за период + + + true + + + + ПересчитатьИтогиЗаПериод + + + Auto + Auto + + + ПересчитатьТекущиеИтоги + + <key>ru</key> + <value>Пересчитать текущие итоги</value> + + 37 + + ru + Выполнить пересчет текущих итогов + + + true + + + + ПересчитатьТекущиеИтоги + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Help/ru.html b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Help/ru.html new file mode 100644 index 000000000..c9e4464a1 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Help/ru.html @@ -0,0 +1,44 @@ + +

    Управление итогами

    +

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

    +

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

    +

    Для переключения режимов служит гиперссылка в правом нижнем углу формы. Форма запоминает режим открытия.

    +

    Часто используемые возможности

    +

    Операции с итогами

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

    Операции с агрегатами

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

    Полные возможности

    +

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

    +

    Итоги

    +

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

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

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

    +

    Агрегаты

    +

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

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

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

    +

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

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl new file mode 100644 index 000000000..536293352 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl @@ -0,0 +1,1200 @@ +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ПутьКОбъектуМетаданных = РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя(); + + Если НЕ ПравоДоступа("Администрирование", Метаданные) Тогда + СтандартнаяОбработка = Ложь; + Возврат; + КонецЕсли; + + ПрочитатьИнформациюПоРегистрам(); + + ОбновитьСписокИтоговНаСервере(); + ОбновитьАгрегатыПоРегистрамНаСервере(); + + Если АгрегатыПоРегистрам.Количество() <> 0 Тогда + Элементы.СписокАгрегатов.Заголовок = Префикс() + " " + АгрегатыПоРегистрам[0].Наименование; + Иначе + Элементы.СписокАгрегатов.Заголовок = Префикс(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПрочитатьИнформациюПоРегистрам() + + СписокИтогов.Очистить(); + АгрегатыПоРегистрам.Очистить(); + СписокАгрегатовРегистра.Очистить(); + + Для Каждого Регистр Из Метаданные.РегистрыБухгалтерии Цикл + + Если НЕ ПравоДоступа("УправлениеИтогами", Регистр) Тогда + Продолжить; + КонецЕсли; + + Представление = Регистр.Представление() + НСтр("ru=' (регистр бухгалтерии)'"); + Картинка = БиблиотекаКартинок.РегистрБухгалтерии; + + СтрокаТаблицы = СписокИтогов.Добавить(); + СтрокаТаблицы.Тип = 1; + СтрокаТаблицы.ИмяМетаданного = Регистр.Имя; + СтрокаТаблицы.Картинка = Картинка; + СтрокаТаблицы.ОборотныйРег = Истина; + СтрокаТаблицы.Наименование = Представление; + СтрокаТаблицы.РазрешитьРазделениеИтогов = Регистр.РазрешитьРазделениеИтогов ; + + КонецЦикла; + + Для Каждого Регистр Из Метаданные.РегистрыНакопления Цикл + + Постфикс = ""; + Оборотный = Истина; + Если Регистр.ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Обороты Тогда + Оборотный = Ложь; + Постфикс = НСтр("ru=' (оборотный регистр накопления)'"); + Иначе + Оборотный = Истина; + Постфикс = НСтр("ru=' (регистр накопления)'"); + КонецЕсли; + + Если НЕ ПравоДоступа("УправлениеИтогами", Регистр) Тогда + Продолжить; + КонецЕсли; + + Представление = Регистр.Представление() + Постфикс; + Картинка = БиблиотекаКартинок.РегистрНакопления; + + СтрокаТаблицы = СписокИтогов.Добавить(); + СтрокаТаблицы.Тип = 0; + СтрокаТаблицы.ИмяМетаданного = Регистр.Имя; + СтрокаТаблицы.Картинка = Картинка; + СтрокаТаблицы.ОборотныйРег = Оборотный; + СтрокаТаблицы.Наименование = Представление; + СтрокаТаблицы.РазрешитьРазделениеИтогов = Регистр.РазрешитьРазделениеИтогов ; + + КонецЦикла; + + Для Каждого Регистр Из Метаданные.РегистрыНакопления Цикл + + Если Регистр.ВидРегистра <> Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Обороты Тогда + Продолжить; + КонецЕсли; + + Если НЕ ПравоДоступа("УправлениеИтогами", Регистр) Тогда + Продолжить; + КонецЕсли; + + Представление = Регистр.Представление(); + Картинка = БиблиотекаКартинок.РегистрНакопления; + + Агрегаты = Регистр.Агрегаты; + + Если Агрегаты.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + СтрокаТаблицы = АгрегатыПоРегистрам.Добавить(); + СтрокаТаблицы.ИмяМетаданного = Регистр.Имя; + СтрокаТаблицы.Картинка = Картинка; + СтрокаТаблицы.Наименование = Представление; + СтрокаТаблицы.ПостроениеОптимально = Истина; + + КонецЦикла; + + СписокИтогов.Сортировать("Наименование Возр"); + АгрегатыПоРегистрам.Сортировать("Наименование Возр"); + +КонецПроцедуры // ПрочитатьИнформациюПоРегистрам + +&НаСервере +Процедура ОбновитьСписокИтоговНаСервере() + + Менеджер = Новый Массив; + Менеджер.Добавить(РегистрыНакопления); + Менеджер.Добавить(РегистрыБухгалтерии); + + Для Каждого СтрокаТаблицы Из СписокИтогов Цикл + + Регистр = Менеджер[СтрокаТаблицы.Тип][СтрокаТаблицы.ИмяМетаданного]; + СтрокаТаблицы.ИспользоватьИтоги = Регистр.ПолучитьИспользованиеИтогов(); + СтрокаТаблицы.РазделениеИтогов = Регистр.ПолучитьРежимРазделенияИтогов(); + Если СтрокаТаблицы.ОборотныйРег Тогда + + СтрокаТаблицы.ИспользоватьТекущиеИтоги = Регистр.ПолучитьИспользованиеТекущихИтогов(); + СтрокаТаблицы.ПериодИтогов = Регистр.ПолучитьПериодРассчитанныхИтогов(); + СтрокаТаблицы.АгрегатыИтоги = 2; + + Иначе + + СтрокаТаблицы.ИспользоватьТекущиеИтоги = Ложь; + СтрокаТаблицы.ПериодИтогов = Неопределено; + СтрокаТаблицы.АгрегатыИтоги = Регистр.ПолучитьРежимАгрегатов(); + Если СтрокаТаблицы.АгрегатыИтоги Тогда + СтрокаТаблицы.ИспользоватьИтоги = Ложь; + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // ОбновитьСписокИтоговНаСервере() + +&НаСервере +Процедура ОбновитьАгрегатыПоРегистрамНаСервере() + + СписокАгрегатовРегистра.Очистить(); + + Для Каждого СтрокаТаблицы Из АгрегатыПоРегистрам Цикл + + Менеджер = РегистрыНакопления[СтрокаТаблицы.ИмяМетаданного]; + МенеджерРегистра = Метаданные.РегистрыНакопления[СтрокаТаблицы.ИмяМетаданного]; + + СтрокаТаблицы.РежимАгрегатов = Менеджер.ПолучитьРежимАгрегатов(); + СтрокаТаблицы.ИспользованиеАгрегатов = Менеджер.ПолучитьИспользованиеАгрегатов(); + + Агрегаты = Менеджер.ПолучитьАгрегаты(); + СтрокаТаблицы.ДатаПостроения = Агрегаты.ДатаПостроения; + СтрокаТаблицы.Размер = Агрегаты.Размер; + СтрокаТаблицы.ОграничениеРазмера = Агрегаты.ОграничениеРазмера; + СтрокаТаблицы.Эффект = Агрегаты.Эффект; + + Для Каждого Агрегат Из Агрегаты.Агрегаты Цикл + + СтрокаСпискаАгрРег = СписокАгрегатовРегистра.Добавить(); + СтрокаИзмерений = ""; + Для Каждого Измерения Из Агрегат.Измерения Цикл + СтрокаИзмерений = СтрокаИзмерений + Измерения + ", "; + КонецЦикла; + СтрокаИзмерений = Сред(СтрокаИзмерений, 1, СтрДлина(СтрокаИзмерений)-2); + СтрокаСпискаАгрРег.ИмяМетаданного = СтрокаТаблицы.ИмяМетаданного; + СтрокаСпискаАгрРег.Периодичность = Строка(Агрегат.Периодичность); + СтрокаСпискаАгрРег.Измерения = СтрокаИзмерений; + СтрокаСпискаАгрРег.Использование = Агрегат.Использование; + СтрокаСпискаАгрРег.НачалоПериода = Агрегат.НачалоПериода; + СтрокаСпискаАгрРег.КонецПериода = Агрегат.КонецПериода; + СтрокаСпискаАгрРег.Размер = Агрегат.Размер; + + КонецЦикла; + КонецЦикла; + + СписокАгрегатовРегистра.Сортировать("Использование Убыв"); + +КонецПроцедуры // ОбновитьАгрегатыПоРегистрамНаСервере() + +&НаКлиентеНаСервереБезКонтекста +Функция ОкончаниеПериода(Дата) + + Возврат КонецДня(КонецМесяца(Дата)); + +КонецФункции // ОкончаниеПериода() + +&НаСервереБезКонтекста +Функция УстановитьПараметрыРегистраНаСервере(ВидРегистра, ИмяРегистра, знач Действие, Значение1, Значение2 = Неопределено, ПолеОшибки, СообщениеОбОшибке) + + Менеджеры = Новый Массив; + Менеджеры.Добавить(РегистрыНакопления); + Менеджеры.Добавить(РегистрыБухгалтерии); + + МенеджерыРегистров = Новый Массив; + МенеджерыРегистров.Добавить(Метаданные.РегистрыНакопления); + МенеджерыРегистров.Добавить(Метаданные.РегистрыБухгалтерии); + + Менеджер = Менеджеры[ВидРегистра][ИмяРегистра]; + МенеджерРегистра = МенеджерыРегистров[ВидРегистра][ИмяРегистра]; + Действие = НРег(Действие); + + ОК = Истина; + + Попытка + + + Если Действие = "установитьиспользованиеитогов" Тогда + + Менеджер.УстановитьИспользованиеИтогов(Значение1); + + ИначеЕсли Действие = "использоватьтекущиеитоги" Тогда + + Менеджер.УстановитьИспользованиеТекущихИтогов(Значение1); + + ИначеЕсли Действие = "установитьразделениеитогов" Тогда + + Менеджер.УстановитьРежимРазделенияИтогов(Значение1); + + ИначеЕсли Действие = "установитьпериодитогов" Тогда + + Если ВидРегистра = 0 Тогда + Дата = Значение1; + ИначеЕсли ВидРегистра = 1 Тогда + Дата = Значение2; + КонецЕсли; + + Менеджер.УстановитьПериодРассчитанныхИтогов(Дата); + + ИначеЕсли Действие = "пересчитатьитоги" Тогда + + Менеджер.ПересчитатьИтоги(); + + ИначеЕсли Действие = "пересчитатьтекущиеитоги" Тогда + + Менеджер.ПересчитатьТекущиеИтоги(); + + ИначеЕсли Действие = "пересчитатьитогизапериод" Тогда + + Менеджер.ПересчитатьИтогиЗаПериод(Значение1, Значение2); + + Иначе + ВызватьИсключение "Неправильное имя параметра(1): " + Действие; + КонецЕсли; + + Исключение + ТекстСообщения = + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + СообщениеОбОшибке + Символы.ПС + + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), , ПолеОшибки); + ОК = Ложь; + КонецПопытки; + + Возврат ОК; + +КонецФункции // УстановитьПараметрыРегистраНаСервере() + +&НаСервереБезКонтекста +Функция ИзмеренияАгрегатовРавны(ОптимальныйАгрегат, КонфАгрегат) + + Если ОптимальныйАгрегат.Измерения.ВГраница() <> КонфАгрегат.Измерения.ВГраница() Тогда + Возврат Ложь; + КонецЕсли; + + Для Индекс1=0 По ОптимальныйАгрегат.Измерения.ВГраница() Цикл + Найдено = Ложь; + Для Индекс2=0 По КонфАгрегат.Измерения.ВГраница() Цикл + Если ОптимальныйАгрегат.Измерения[Индекс1] = КонфАгрегат.Измерения[Индекс2].Имя Тогда + Найдено = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + Если НЕ Найдено Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +&НаСервереБезКонтекста +Функция УстановитьПараметрыАгрегатаНаСервере(ИмяРегистра, знач Действие, ЗначениеДействия1 = Истина, ЗначениеДействия2 = Неопределено, ПолеФормы, СообщениеОбОшибке = "", АдресФайлаВоВременномХранилище = "") + + Менеджер = РегистрыНакопления[ИмяРегистра]; + МенеджерРегистра = Метаданные.РегистрыНакопления[ИмяРегистра]; + Действие = НРег(Действие); + ОК = Истина; + Попытка + + Если Действие = "установитьрежимагрегатов" Тогда + + Менеджер.УстановитьРежимАгрегатов(ЗначениеДействия1); + + ИначеЕсли Действие = "установитьиспользованиеагрегатов" Тогда + + Менеджер.УстановитьИспользованиеАгрегатов(ЗначениеДействия1); + + ИначеЕсли Действие = "заполнитьагрегаты" Тогда + + Менеджер.ОбновитьАгрегаты(Ложь); + + ИначеЕсли Действие = "перестроитьагрегаты" Тогда + + Менеджер.ПерестроитьИспользованиеАгрегатов(ЗначениеДействия1, ЗначениеДействия2); + + ИначеЕсли Действие = "очиститьагрегаты" Тогда + + Менеджер.ОчиститьАгрегаты(); + + ИначеЕсли Действие = "получитьоптимальныеагрегаты" Тогда + + ОптимальныеАгрегаты = Менеджер.ОпределитьОптимальныеАгрегаты(ЗначениеДействия1); + + ЗначениеДействия1 = Ложь; + + НайденыеАгрегаты = Новый Соответствие; + + МетаданныеАгрегаты = МенеджерРегистра.Агрегаты; + + Для Индекс1=0 По ОптимальныеАгрегаты.Агрегаты.ВГраница() Цикл + + ЗначениеДействия1 = Ложь; + Для Индекс2=0 По МетаданныеАгрегаты.Количество() - 1 Цикл + + Если ОптимальныеАгрегаты.Агрегаты[Индекс1].Периодичность = МетаданныеАгрегаты[Индекс2].Периодичность И + НайденыеАгрегаты[Индекс2] = Неопределено И + ИзмеренияАгрегатовРавны(ОптимальныеАгрегаты.Агрегаты[Индекс1], МетаданныеАгрегаты[Индекс2]) Тогда + + НайденыеАгрегаты.Вставить(Индекс2, Истина); + ЗначениеДействия1 = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ЗначениеДействия1 Тогда + + Продолжить; + КонецЕсли; + + Для Индекс2=0 По МетаданныеАгрегаты.Количество() - 1 Цикл + Если ОптимальныеАгрегаты.Агрегаты[Индекс1].Периодичность = ПериодичностьАгрегатаРегистраНакопления.Авто И + НайденыеАгрегаты[Индекс2] = Неопределено И + ИзмеренияАгрегатовРавны(ОптимальныеАгрегаты.Агрегаты[Индекс1], МетаданныеАгрегаты[Индекс2]) Тогда + + НайденыеАгрегаты.Вставить(Индекс2, Истина); + ЗначениеДействия1 = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если НЕ ЗначениеДействия1 Тогда + + Прервать; + КонецЕсли; + КонецЦикла; + + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); + + ЗаписьXML = Новый ЗаписьXML(); + ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла); + ЗаписьXML.ЗаписатьОбъявлениеXML(); + СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ОптимальныеАгрегаты); + ЗаписьXML.Закрыть(); + АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище( + Новый ДвоичныеДанные(ИмяВременногоФайла)); + УдалитьФайлы(ИмяВременногоФайла); + + Иначе + + ВызватьИсключение "Неправильное имя параметра: " + Действие; + + КонецЕсли; + + Исключение + СообщениеОбОшибке = СообщениеОбОшибке + " (" + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + ")"; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщениеОбОшибке, , ПолеФормы); + ОК = Ложь; + КонецПопытки; + + Возврат ОК; + +КонецФункции // УстановитьПараметрыАгрегатаНаСервере() + +&НаКлиенте +Процедура УстановитьФильтрСпискаАгрегатов() + + ТекущиеДанные = Элементы.АгрегатыПоРегистрам.ТекущиеДанные; + + Если ТекущиеДанные <> Неопределено Тогда + Фильтр = Новый ФиксированнаяСтруктура("ИмяМетаданного", ТекущиеДанные.ИмяМетаданного); + НовыйЗаголовок = Префикс() + " " + ТекущиеДанные.Наименование; + Иначе + Фильтр = Новый ФиксированнаяСтруктура("ИмяМетаданного", ""); + НовыйЗаголовок = Префикс(); + КонецЕсли; + + Элементы.СписокАгрегатов.ОтборСтрок = Фильтр; + + Если Элементы.СписокАгрегатов.Заголовок <> НовыйЗаголовок Тогда + Элементы.СписокАгрегатов.Заголовок = НовыйЗаголовок; + КонецЕсли; + +КонецПроцедуры // УстановитьФильтрСпискаАгрегатов() + +&НаКлиенте +Процедура УправлениеАгрегатом(ПараметрыСтруктуры) + + Результат = Истина; + ОчиститьСообщения(); + Выбранные = ПараметрыСтруктуры.МассивСтрок; + + Если Выбранные.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ШагПроцесса = 100/Выбранные.Количество(); + Действие = НРег(ПараметрыСтруктуры.Действие); + + Если ПараметрыСтруктуры.Свойство("ГрупповаяОбработка") Тогда + ТребуетсяПрерватьПослеОшибки = ?(ПараметрыСтруктуры.ГрупповаяОбработка, Ложь, ПрерыватьПриОшибке); + Иначе + ТребуетсяПрерватьПослеОшибки = ПрерыватьПриОшибке; + КонецЕсли; + + Для Счетчик=1 По Выбранные.Количество() Цикл + + Если ТипЗнч(Выбранные[Счетчик-1]) = Тип("Число") Тогда + ВыбраннаяСтрока = АгрегатыПоРегистрам.НайтиПоИдентификатору(Выбранные[Счетчик-1]); + Иначе + ВыбраннаяСтрока = Выбранные[Счетчик-1]; + КонецЕсли; + + ПолеСообщенияОбОшибке = ?(ПустаяСтрока(ПараметрыСтруктуры.Поле), "", "АгрегатыПоРегистрам[" + Выбранные[Счетчик-1] + "]."+ПараметрыСтруктуры.Поле); + + Если НЕ ВыбраннаяСтрока.РежимАгрегатов И НЕ (Действие = "установитьрежимагрегатов" ИЛИ Действие = "получитьоптимальныеагрегаты") Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='Операция невозможна в режиме итогов'"), , ПолеСообщенияОбОшибке); + Продолжить; + КонецЕсли; + + Состояние(ПараметрыСтруктуры.ОбрабатыватьЗаголовок, Счетчик*ШагПроцесса, ВыбраннаяСтрока.Наименование); + + АдресФайлаВоВременномХранилище = ""; + Значение1 = ПараметрыСтруктуры.Значение1; + Значение2 = ПараметрыСтруктуры.Значение2; + Результат = УстановитьПараметрыАгрегатаНаСервере(ВыбраннаяСтрока.ИмяМетаданного, ПараметрыСтруктуры.Действие, Значение1, Значение2, ПолеСообщенияОбОшибке, ПараметрыСтруктуры.ТекстСообщенияОбОшибке, АдресФайлаВоВременномХранилище); + + Если Результат И Действие = "получитьоптимальныеагрегаты" Тогда + СохранитьОптимальныеНастройкиАгрегатов(ВыбраннаяСтрока.ИмяМетаданного, АдресФайлаВоВременномХранилище, "АгрегатыПоРегистрам[" + Выбранные[Счетчик-1] + "]."+ПараметрыСтруктуры.Поле); + ВыбраннаяСтрока.ПостроениеОптимально = Значение1; + КонецЕсли; + + ОбработкаПрерыванияПользователя(); + + Если НЕ Результат И ТребуетсяПрерватьПослеОшибки Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Если Действие = "установитьрежимагрегатов" ИЛИ Действие = "установитьиспользованиеагрегатов" Тогда + ОбновитьСписокИтоговНаСервере(); + КонецЕсли; + + ОбновитьАгрегатыПоРегистрамНаСервере(); + + Состояние(ПараметрыСтруктуры.ПослеПроцесса); + УстановитьФильтрСпискаАгрегатов(); + +КонецПроцедуры // УправлениеАгрегатом() + +&НаКлиенте +Процедура УправлениеИтогами(ПараметрыСтруктуры) + + Результат = Истина; + ОчиститьСообщения(); + + Выбранные = ПараметрыСтруктуры.МассивСтрок; + Если Выбранные.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ШагПроцесса = 100/Выбранные.Количество(); + Действие = НРег(ПараметрыСтруктуры.Действие); + + Если ПараметрыСтруктуры.Свойство("ГрупповаяОбработка") Тогда + ТребуетсяПрерватьПослеОшибки = ?(ПараметрыСтруктуры.ГрупповаяОбработка, Ложь, ПрерыватьПриОшибке); + Иначе + ТребуетсяПрерватьПослеОшибки = ПрерыватьПриОшибке; + КонецЕсли; + + Для Счетчик=1 По Выбранные.Количество() Цикл + + Если ТипЗнч(Выбранные[Счетчик-1]) = Тип("Число") Тогда + + ВыбраннаяСтрока = СписокИтогов.НайтиПоИдентификатору(Выбранные[Счетчик-1]); + + Иначе + + ВыбраннаяСтрока = Выбранные[Счетчик-1]; + + КонецЕсли; + Состояние(ПараметрыСтруктуры.ОбрабатыватьЗаголовок, Счетчик*ШагПроцесса, ВыбраннаяСтрока.Наименование); + + Если Действие = "установитьиспользованиеитогов" Тогда + + Если ВыбраннаяСтрока.АгрегатыИтоги = 1 Тогда + + Продолжить; + + КонецЕсли; + ИначеЕсли Действие = "использоватьтекущиеитоги" Тогда + + Если ВыбраннаяСтрока.АгрегатыИтоги = 1 ИЛИ НЕ ВыбраннаяСтрока.ОборотныйРег Тогда + + Продолжить; + + КонецЕсли; + ИначеЕсли Действие = "установитьпериодитогов" Тогда + + Если ВыбраннаяСтрока.АгрегатыИтоги = 1 ИЛИ НЕ ВыбраннаяСтрока.ОборотныйРег Тогда + + Продолжить; + + КонецЕсли; + ИначеЕсли Действие = "установитьразделениеитогов" Тогда + + Если НЕ ВыбраннаяСтрока.РазрешитьРазделениеИтогов Тогда + + Продолжить; + + КонецЕсли; + ИначеЕсли Действие = "пересчитатьитоги" Тогда + + Если ВыбраннаяСтрока.АгрегатыИтоги Тогда + + Продолжить; + + КонецЕсли; + ИначеЕсли Действие = "пересчитатьитогизапериод" Тогда + + Если ВыбраннаяСтрока.АгрегатыИтоги = 1 ИЛИ НЕ ВыбраннаяСтрока.ОборотныйРег Тогда + + Продолжить; + + КонецЕсли; + ИначеЕсли Действие = "пересчитатьтекущиеитоги" Тогда + + Если НЕ ВыбраннаяСтрока.ОборотныйРег Тогда + + Продолжить; + + КонецЕсли; + КонецЕсли; + + Результат = УстановитьПараметрыРегистраНаСервере(ВыбраннаяСтрока.Тип, ВыбраннаяСтрока.ИмяМетаданного, ПараметрыСтруктуры.Действие, ПараметрыСтруктуры.Значение1, ПараметрыСтруктуры.Значение2, ?(ПустаяСтрока(ПараметрыСтруктуры.Поле), "", "СписокИтогов[" + Выбранные[Счетчик-1] + "]." + ПараметрыСтруктуры.Поле), ПараметрыСтруктуры.ТекстСообщенияОбОшибке); + + ОбработкаПрерыванияПользователя(); + Если НЕ Результат И ТребуетсяПрерватьПослеОшибки Тогда + + Прервать; + + КонецЕсли; + КонецЦикла; + + ОбновитьСписокИтоговНаСервере(); + + Состояние(ПараметрыСтруктуры.ПослеПроцесса); + +КонецПроцедуры // УправлениеИтогами() + +&НаКлиенте +Функция ПолучитьПараметрыПерестроения(РежимПерестроения) + + ПараметрыСтруктуры = Новый Структура; + ПараметрыСтруктуры.Вставить("ОтносительныйРазмер", ?(РежимПерестроения, ОтносительныйРазмер, ОптимальныйОтносительныйРазмер)); + ПараметрыСтруктуры.Вставить("МинимальныйЭффект", ?(РежимПерестроения, МинимальныйЭффект, 0)); + ПараметрыСтруктуры.Вставить("РежимПерестроения", РежимПерестроения); + + Форма = ПолучитьФорму(ПутьКОбъектуМетаданных + ".Форма.ФормаПараметровПерестроения", ПараметрыСтруктуры); + + Результат = Форма.ОткрытьМодально(); + + Если Результат = КодВозвратаДиалога.ОК Тогда + Если РежимПерестроения Тогда + ОтносительныйРазмер = Форма.ПараметрыПерестроения[0]; + МинимальныйЭффект = Форма.ПараметрыПерестроения[1]; + Иначе + ОптимальныйОтносительныйРазмер = Форма.ПараметрыПерестроения[0]; + КонецЕсли; + + Возврат Форма.ПараметрыПерестроения; + Иначе + Возврат Результат; + КонецЕсли; + +КонецФункции // ПолучитьПараметрыПерестроения() + +&НаКлиенте +Функция СохранитьОптимальныеНастройкиАгрегатов(ИмяМетаданного, АдресФайлаВоВременномХранилище, Поле) + + Попытка + ПолноеИмяФайла = ?(ПутьКОптимальнымАгрегатам = "web", "", ПутьКОптимальнымАгрегатам + "\") + ИмяМетаданного + ".xml"; +#Если ВебКлиент Тогда + ПолучитьФайл(АдресФайлаВоВременномХранилище, ПолноеИмяФайла, Истина); +#Иначе + ПолучитьФайл(АдресФайлаВоВременномХранилище, ПолноеИмяФайла, Ложь); +#КонецЕсли + УдалитьИзВременногоХранилища(АдресФайлаВоВременномХранилище); + + Возврат Истина; + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru='Ошибка записи файла оптимальных агрегатов'") + + Символы.ПС + + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + + УдалитьИзВременногоХранилища(АдресФайлаВоВременномХранилище); + + Возврат Ложь; + КонецПопытки; + +КонецФункции + +&НаКлиенте +Процедура УстановитьРасширенныйРежим() + + Элементы.Операции.ТекущаяСтраница = ?(ПолныеВозможности, Элементы.РасширенныеВозможности, Элементы.БыстыйДоступ); + + Элементы.БыстыйДоступ.Видимость = НЕ ПолныеВозможности; + Элементы.РасширенныеВозможности.Видимость = ПолныеВозможности; + + ТекстРежимаБезПолныхВозможностей = НСтр("ru='Часто используемые возможности'"); + ТекстРежимаСПолнымиВозможностями = НСтр("ru='Полные возможности'"); + + Заголовок = НСтр("ru='Управление итогами'") + " - " + НРег(?(ПолныеВозможности, ТекстРежимаСПолнымиВозможностями, ТекстРежимаБезПолныхВозможностей)); + ТекстГиперСсылки = ?(ПолныеВозможности, ТекстРежимаБезПолныхВозможностей, ТекстРежимаСПолнымиВозможностями); + +КонецПроцедуры // УстановитьРасширенныйРежим() + +&НаКлиенте +Функция ВыборПутиККаталогу(ТекущийКаталог) + + Каталог = ""; + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + ВыборКаталога = Новый ДиалогВыбораФайла (РежимДиалогаВыбораФайла.ВыборКаталога); + ВыборКаталога.Каталог = ТекущийКаталог; + ВыборКаталога.Заголовок = НСтр("ru='Выберите каталог для размещения файлов с оптимальными агрегатами'"); + Если ВыборКаталога.Выбрать() Тогда + Каталог = ВыборКаталога.Каталог; + КонецЕсли; + Иначе + Каталог = "web"; + КонецЕсли; + + Возврат Каталог; + +КонецФункции // ВыборПутиККаталогу() + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если СписокИтогов.Количество() = 0 Тогда + Элементы.ГруппаИтогов.Доступность = Ложь; + Элементы.УстановитьПериодРасчитанныхИтогов.Доступность = Ложь; + Элементы.ВключитьИспользованиеИтогов.Доступность = Ложь; + КонецЕсли; + + Если АгрегатыПоРегистрам.Количество() = 0 Тогда + Элементы.ГруппаАгрегаты.Доступность = Ложь; + Элементы.ПерестроитьИЗаполнитьАгрегаты.Доступность = Ложь; + Элементы.ПолучитьОптимальныеАгрегаты.Доступность = Ложь; + КонецЕсли; + + Элементы.Операции.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; + + УстановитьРасширенныйРежим(); + + РассчитатьИтогиНа = ТекущаяДата(); + ОписаниеУстановкиПериода = НСтр("ru='Установить период рассчитанных итогов для всех регистров накопления и бухгалтерии, у которых включены итоги. Для регистров накопления - на [1]. Для регистров бухгалтерии - на [2].'"); + ОписаниеУстановкиПериода = СтрЗаменить(ОписаниеУстановкиПериода, "[1]", Формат(ОкончаниеПериода(ДобавитьМесяц(РассчитатьИтогиНа, -1)), "DLF=D")); + ОписаниеУстановкиПериода = СтрЗаменить(ОписаниеУстановкиПериода, "[2]", Формат(ОкончаниеПериода(РассчитатьИтогиНа), "DLF=D")); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокИтоговПриАктивизацииСтроки(Элемент) + + Элементы.ГруппаРазделениеИтогов.Доступность = Элементы.СписокИтогов.ТекущиеДанные.РазрешитьРазделениеИтогов; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокИтоговВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ИмяМетаданного = СписокИтогов.НайтиПоИдентификатору(ВыбраннаяСтрока).ИмяМетаданного; + Если Поле.Имя = "ИтогиАгрегатыИтоги" Тогда + + СтандартнаяОбработка = Ложь; + МассивРезультата = АгрегатыПоРегистрам.НайтиСтроки(Новый Структура("ИмяМетаданного", ИмяМетаданного)); + Если МассивРезультата.Количество() > 0 Тогда + + Индекс = АгрегатыПоРегистрам.Индекс(МассивРезультата[0]); + ТекущийЭлемент = Элементы.АгрегатыПоРегистрам; + Элементы.АгрегатыПоРегистрам.ТекущаяСтрока = Индекс; + Элементы.АгрегатыПоРегистрам.ТекущийЭлемент = Элементы.АгрСписокНаименование; + + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВключитьИспользованиеИтогов() + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Включение использования итогов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Включение использования итогов завершено'"); + ПараметрыСтруктуры.Действие = "УстановитьИспользованиеИтогов"; + ПараметрыСтруктуры.МассивСтрок = Элементы.СписокИтогов.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "ИспользоватьИтоги"; + ПараметрыСтруктуры.Значение1 = Истина; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка включения использования итогов'"); + УправлениеИтогами(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ВключитьИспользованиеТекущихИтогов() + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Включение использования текущих итогов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Включение использования текущих итогов завершено'"); + ПараметрыСтруктуры.Действие = "ИспользоватьТекущиеИтоги"; + ПараметрыСтруктуры.МассивСтрок = Элементы.СписокИтогов.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "ИспользоватьТекущиеИтоги"; + ПараметрыСтруктуры.Значение1 = Истина; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка включения использования текущих итогов'"); + УправлениеИтогами(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыключитьИспользованиеИтогов() + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Выключение использования итогов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Выключение использования итогов завершено'"); + ПараметрыСтруктуры.Действие = "УстановитьИспользованиеИтогов"; + ПараметрыСтруктуры.МассивСтрок = Элементы.СписокИтогов.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "ИспользоватьИтоги"; + ПараметрыСтруктуры.Значение1 = Ложь; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка выключения использования итогов'"); + УправлениеИтогами(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыключитьИспользованиеТекущихИтогов() + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Выключение использования текущих итогов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Выключение использования текущих итогов завершено'"); + ПараметрыСтруктуры.Действие = "ИспользоватьТекущиеИтоги"; + ПараметрыСтруктуры.МассивСтрок = Элементы.СписокИтогов.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "ИспользоватьТекущиеИтоги"; + ПараметрыСтруктуры.Значение1 = Ложь; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка выключения использования текущих итогов'"); + УправлениеИтогами(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьСостояниеИтогов() + + ОбновитьСписокИтоговНаСервере(); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьПериодИтогов() + + ПараметрыСтруктуры = Новый Структура("РегНакопления, РегБухгалтерии", Ложь, Ложь); + Для Каждого Индекс Из Элементы.СписокИтогов.ВыделенныеСтроки Цикл + ИнформацияПоРегистру = СписокИтогов.НайтиПоИдентификатору(Индекс); + ПараметрыСтруктуры.РегНакопления = ?(ИнформацияПоРегистру.Тип = 0, Истина, ПараметрыСтруктуры.РегНакопления); + ПараметрыСтруктуры.РегБухгалтерии = ?(ИнформацияПоРегистру.Тип = 1, Истина, ПараметрыСтруктуры.РегБухгалтерии); + КонецЦикла; + + Форма = ПолучитьФорму(ПутьКОбъектуМетаданных + ".Форма.ФормаВыбораПериода", ПараметрыСтруктуры); + + Результат = Форма.ОткрытьМодально(); + Если Результат <> КодВозвратаДиалога.ОК Тогда + Возврат; + КонецЕсли; + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Установка периода рассчитанных итогов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Установка периода рассчитанных итогов завершено'"); + ПараметрыСтруктуры.Действие = "УстановитьПериодИтогов"; + ПараметрыСтруктуры.МассивСтрок = Элементы.СписокИтогов.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "ПериодИтогов"; + ПараметрыСтруктуры.Значение1 = Форма.ПериодДляРегНакоп; + ПараметрыСтруктуры.Значение2 = Форма.ПериодДляРегБухг; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка установки периода рассчитанных итогов.'"); + + УправлениеИтогами(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ВключитьРазделениеИтогов() + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Включение разделения итогов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Включение разделения итогов завершено'"); + ПараметрыСтруктуры.Действие = "УстановитьРазделениеИтогов"; + ПараметрыСтруктуры.МассивСтрок = Элементы.СписокИтогов.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "РазделениеИтогов"; + ПараметрыСтруктуры.Значение1 = Истина; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка включения разделения итогов'"); + УправлениеИтогами(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыключитьРазделениеИтогов() + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Выключение разделения итогов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Выключение разделения итогов завершено'"); + ПараметрыСтруктуры.Действие = "УстановитьРазделениеИтогов"; + ПараметрыСтруктуры.МассивСтрок = Элементы.СписокИтогов.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "РазделениеИтогов"; + ПараметрыСтруктуры.Значение1 = Ложь; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка выключения разделения итогов'"); + УправлениеИтогами(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИнформациюОбАгрегатах() + + ОбновитьАгрегатыПоРегистрамНаСервере(); + УстановитьФильтрСпискаАгрегатов(); + +КонецПроцедуры + +&НаКлиенте +Процедура АгрегатыПоРегистрамПриАктивизацииСтроки(Элемент) + + УстановитьФильтрСпискаАгрегатов(); + + Если Элементы.АгрегатыПоРегистрам.РежимВыделения = РежимВыделенияТаблицы.Одиночный Тогда + ДоступностьЭлементов = Элементы.АгрегатыПоРегистрам.ТекущиеДанные.РежимАгрегатов; + Иначе + ДоступностьЭлементов = Истина; + КонецЕсли; + + Элементы.АгрРегПерестроить.Доступность = ДоступностьЭлементов; + Элементы.АгрРегОчиститьАгрегатыПоРегистрам.Доступность = ДоступностьЭлементов; + Элементы.АгрРегЗаполнитьАгрегатыПоРегистрам.Доступность = ДоступностьЭлементов; + Элементы.АгрРегОптимальные.Доступность = ДоступностьЭлементов; + Элементы.АгрРегОтключитьИспользованиеАгрегатов.Доступность = ДоступностьЭлементов; + Элементы.АгрРегВключитьИспользованиеАгрегатов.Доступность = ДоступностьЭлементов; + +КонецПроцедуры + +&НаКлиенте +Процедура ВключитьРежимАгрегатов() + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Включение режима агрегатов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Включение режима агрегатов завершено'"); + ПараметрыСтруктуры.Действие = "УстановитьРежимАгрегатов"; + ПараметрыСтруктуры.МассивСтрок = Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "РежимАгрегатов"; + ПараметрыСтруктуры.Значение1 = Истина; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка включения режима агрегатов'"); + УправлениеАгрегатом(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ВключитьРежимИтогов() + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Включение режима итогов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Включение режима итогов завершено'"); + ПараметрыСтруктуры.Действие = "УстановитьРежимАгрегатов"; + ПараметрыСтруктуры.МассивСтрок = Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "РежимАгрегатов"; + ПараметрыСтруктуры.Значение1 = Ложь; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка включения режима итогов'"); + УправлениеАгрегатом(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ВключитьИспользованиеАгрегатов() + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Включение использования агрегатов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Включение использования агрегатов завершено'"); + ПараметрыСтруктуры.Действие = "УстановитьИспользованиеАгрегатов"; + ПараметрыСтруктуры.МассивСтрок = Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "ИспользованиеАгрегатов"; + ПараметрыСтруктуры.Значение1 = Истина; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка включения использования агрегатов'"); + УправлениеАгрегатом(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыключитьИспользованиеАгрегатов() + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Выключение использования агрегатов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Выключение использования агрегатов завершено'"); + ПараметрыСтруктуры.Действие = "УстановитьИспользованиеАгрегатов"; + ПараметрыСтруктуры.МассивСтрок = Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "ИспользованиеАгрегатов"; + ПараметрыСтруктуры.Значение1 = Ложь; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка выключения использования агрегатов'"); + УправлениеАгрегатом(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ПерестроитьАгрегаты() + + Результат = ПолучитьПараметрыПерестроения(Истина); + Если ТипЗнч(Результат) <> Тип("ФиксированныйМассив") Тогда + Возврат; + КонецЕсли; + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Перестроение агрегатов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Перестроение агрегатов завершено'"); + ПараметрыСтруктуры.Действие = "ПерестроитьАгрегаты"; + ПараметрыСтруктуры.МассивСтрок = Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "Наименование"; + ПараметрыСтруктуры.Значение1 = Результат[0]; + ПараметрыСтруктуры.Значение2 = Результат[1]; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка перестроения агрегатов'"); + УправлениеАгрегатом(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьАгрегатыПоРегистрам(Команда) + + Результат = Вопрос(НСтр("ru='Очистка агрегатов приведет к существенному замедлению отчетов'") + Символы.ПС + НСтр("ru='Выполнить очистку?'"), РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); + + Если Результат = КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Очистка агрегатов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Очистка агрегатов завершена'"); + ПараметрыСтруктуры.Действие = "ОчиститьАгрегаты"; + ПараметрыСтруктуры.МассивСтрок = Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "Наименование"; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка очистки агрегатов'"); + УправлениеАгрегатом(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьАгрегатыПоРегистрам(Команда) + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Заполнение агрегатов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Заполнение агрегатов завершено'"); + ПараметрыСтруктуры.Действие = "ЗаполнитьАгрегаты"; + ПараметрыСтруктуры.МассивСтрок = Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "Наименование"; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка заполнения агрегатов'"); + УправлениеАгрегатом(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура АгрегатыОптимальные(Команда) + + Результат = ПолучитьПараметрыПерестроения(Ложь); + + Если ТипЗнч(Результат) <> Тип("ФиксированныйМассив") Тогда + Возврат; + КонецЕсли; + + ПутьКОптимальнымАгрегатам = ВыборПутиККаталогу(ПутьКОптимальнымАгрегатам); + + Если ПустаяСтрока(ПутьКОптимальнымАгрегатам) Тогда + Возврат; + КонецЕсли; + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Получение списка оптимальных агрегатов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Получение списка оптимальных агрегатов завершено.'"); + ПараметрыСтруктуры.Действие = "ПолучитьОптимальныеАгрегаты"; + ПараметрыСтруктуры.МассивСтрок = Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "Наименование"; + ПараметрыСтруктуры.Значение1 = Результат[0]; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка получения списка оптимальных агрегатов.'"); + УправлениеАгрегатом(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ГиперссылкаСТекстомНажатие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ПолныеВозможности = НЕ ПолныеВозможности; + УстановитьРасширенныйРежим(); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьПериодРасчитанныхИтогов(Команда) + + Результат = Истина; + ОчиститьСообщения(); + + МассивДействий = СписокИтогов.НайтиСтроки(Новый Структура("ОборотныйРег", Истина)); + + Если МассивДействий.Количество() = 0 Тогда + Предупреждение(НСтр("ru='Отсутствуют регистры, для которых можно выполнить данную операцию.'")); + Возврат; + КонецЕсли; + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Установка периода рассчитанных итогов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Установка периода рассчитанных итогов завершено'"); + ПараметрыСтруктуры.Действие = "УстановитьПериодИтогов"; + ПараметрыСтруктуры.МассивСтрок = МассивДействий; + ПараметрыСтруктуры.Поле = "ПериодИтогов"; + ПараметрыСтруктуры.Значение1 = ОкончаниеПериода(ДобавитьМесяц(РассчитатьИтогиНа, -1)); + ПараметрыСтруктуры.Значение2 = ОкончаниеПериода(РассчитатьИтогиНа); + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка установки периода рассчитанных итогов.'"); + ПараметрыСтруктуры.Вставить("ГрупповаяОбработка", Истина); + УправлениеИтогами(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ВключитьИспользованиеИтоговБыстрыйДоступ(Команда) + + Результат = Истина; + ОчиститьСообщения(); + + МассивДействий = СписокИтогов.НайтиСтроки(Новый Структура("ИспользоватьИтоги", Ложь)); + + Если МассивДействий.Количество() = 0 Тогда + Предупреждение(НСтр("ru='Отсутствуют регистры, для которых можно выполнить данную операцию.'")); + Возврат; + КонецЕсли; + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Включение использования итогов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Включение использования итогов завершено'"); + ПараметрыСтруктуры.Действие = "УстановитьИспользованиеИтогов"; + ПараметрыСтруктуры.МассивСтрок = МассивДействий; + ПараметрыСтруктуры.Поле = ""; + ПараметрыСтруктуры.Значение1 = Истина; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка включения использования итогов'"); + ПараметрыСтруктуры.Вставить("ГрупповаяОбработка", Истина); + УправлениеИтогами(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьАгрегатыИВыполнитьПерестроение(Команда) + + ОчиститьСообщения(); + + МассивДействий = АгрегатыПоРегистрам.НайтиСтроки(Новый Структура("РежимАгрегатов,ИспользованиеАгрегатов", Истина, Истина)); + + Если МассивДействий.Количество() = 0 Тогда + Предупреждение(НСтр("ru='Отсутствуют регистры, для которых можно выполнить данную операцию.'")); + Возврат; + КонецЕсли; + + ШагПроцесса = 100/МассивДействий.Количество(); + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Перестроение агрегатов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Перестроение агрегатов завершено'"); + ПараметрыСтруктуры.Действие = "ПерестроитьАгрегаты"; + ПараметрыСтруктуры.МассивСтрок = МассивДействий; + ПараметрыСтруктуры.Поле = ""; + ПараметрыСтруктуры.Значение1 = 0; + ПараметрыСтруктуры.Значение2 = 0; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка перестроения агрегатов'"); + ПараметрыСтруктуры.Вставить("ГрупповаяОбработка", Истина); + УправлениеАгрегатом(ПараметрыСтруктуры); + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Заполнение агрегатов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Заполнение агрегатов завершено'"); + ПараметрыСтруктуры.Действие = "ЗаполнитьАгрегаты"; + ПараметрыСтруктуры.МассивСтрок = МассивДействий; + ПараметрыСтруктуры.Поле = ""; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка заполнения агрегатов'"); + УправлениеАгрегатом(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолучитьОптимальныеАгрегаты(Команда) + + Если АгрегатыПоРегистрам.Количество() = 0 Тогда + Предупреждение(НСтр("ru='Отсутствуют регистры, для которых можно выполнить данную операцию.'")); + Возврат; + КонецЕсли; + + ПутьКОптимальнымАгрегатам = ВыборПутиККаталогу(ПутьКОптимальнымАгрегатам); + Если ПустаяСтрока(ПутьКОптимальнымАгрегатам) Тогда + + Возврат; + КонецЕсли; + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Получение списка оптимальных агрегатов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Получение списка оптимальных агрегатов завершено.'"); + ПараметрыСтруктуры.Действие = "ПолучитьОптимальныеАгрегаты"; + ПараметрыСтруктуры.МассивСтрок = АгрегатыПоРегистрам; + ПараметрыСтруктуры.Поле = ""; + ПараметрыСтруктуры.Значение1 = 0; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка получения списка оптимальных агрегатов.'"); + ПараметрыСтруктуры.Вставить("ГрупповаяОбработка", Истина); + УправлениеАгрегатом(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ПересчитатьИтоги(Команда) + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Пересчет итогов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Пересчет итогов завершен'"); + ПараметрыСтруктуры.Действие = "ПересчитатьИтоги"; + ПараметрыСтруктуры.МассивСтрок = Элементы.СписокИтогов.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "Наименование"; + ПараметрыСтруктуры.Значение1 = Ложь; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка пересчета итогов'"); + УправлениеИтогами(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ПересчитатьТекущиеИтоги(Команда) + + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Пересчет итогов ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Пересчет итогов завершен'"); + ПараметрыСтруктуры.Действие = "ПересчитатьТекущиеИтоги"; + ПараметрыСтруктуры.МассивСтрок = Элементы.СписокИтогов.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "Наименование"; + ПараметрыСтруктуры.Значение1 = Ложь; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка пересчета итогов'"); + УправлениеИтогами(ПараметрыСтруктуры); + +КонецПроцедуры + +&НаКлиенте +Процедура ПересчитатьИтогиЗаПериод(Команда) + + Диалог = Новый ДиалогРедактированияСтандартногоПериода; + Диалог.Период = ПериодПерерасчетаРегистров; + Если Диалог.Редактировать() Тогда + + ПериодПерерасчетаРегистров = Диалог.Период; + ПараметрыСтруктуры = Новый Структура("ОбрабатыватьЗаголовок,ПослеПроцесса,Действие,МассивСтрок,Поле,Значение1,Значение2,ТекстСообщенияОбОшибке"); + ПараметрыСтруктуры.ОбрабатыватьЗаголовок = НСтр("ru='Пересчет итогов за период ...'"); + ПараметрыСтруктуры.ПослеПроцесса = НСтр("ru='Пересчет итогов завершен'"); + ПараметрыСтруктуры.Действие = "ПересчитатьИтогиЗаПериод"; + ПараметрыСтруктуры.МассивСтрок = Элементы.СписокИтогов.ВыделенныеСтроки; + ПараметрыСтруктуры.Поле = "Наименование"; + ПараметрыСтруктуры.Значение1 = ПериодПерерасчетаРегистров.ДатаНачала; + ПараметрыСтруктуры.Значение2 = ПериодПерерасчетаРегистров.ДатаОкончания; + ПараметрыСтруктуры.ТекстСообщенияОбОшибке = НСтр("ru='Ошибка пересчета итогов'"); + УправлениеИтогами(ПараметрыСтруктуры); + + КонецЕсли; + +КонецПроцедуры + +Функция Префикс() + + Возврат НСтр("ru='Агрегаты регистра'"); + +КонецФункции \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаВыбораПериода/Form.form b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаВыбораПериода/Form.form new file mode 100644 index 000000000..df42bd800 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаВыбораПериода/Form.form @@ -0,0 +1,269 @@ + + + + ПериодДляРегНакоп + 10 + true + true + + true + + + ПериодДляРегНакоп + + + OnChange + ПериодДляРегНакопПриИзменении + + + ПериодДляРегНакопРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + ПериодДляРегНакопКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ПериодДляРегБухг + 8 + true + true + + true + + + ПериодДляРегБухг + + + OnChange + ПериодДляРегБухгПриИзменении + + + ПериодДляРегБухгРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + ПериодДляРегБухгКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + OK + 5 + true + true + + true + + false + + OKРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.StandardCommand.OK + Auto + true + true + true + UserCmds + Auto + + + Отмена + 6 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 7 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + + <key>ru</key> + <value>Объект</value> + + 1 + + DataProcessorObject.УправлениеИтогамиИАгрегатами + + + true + + + true + +
    true
    +
    + + ПериодДляРегНакоп + + <key>ru</key> + <value>Период итогов для регистров накопления</value> + + 5 + + Date + + Date + + + + true + + + true + + + + ПериодДляРегБухг + + <key>ru</key> + <value>Период итогов для регистров бухгалтерии</value> + + 6 + + Date + + Date + + + + true + + + true + + + + РегБухгалтерии + + Boolean + + + + РегНакопления + + Boolean + + + + + + + +
    diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаВыбораПериода/Help/ru.html b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаВыбораПериода/Help/ru.html new file mode 100644 index 000000000..907c45aae --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаВыбораПериода/Help/ru.html @@ -0,0 +1,9 @@ + +

    Установка периода итогов

    +

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

    +

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

    +
    • +
      для регистров накопления - окончание предыдущего месяца
      +
    • +
      для регистров бухгалтерии - окончание текуещго месяца

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

    +

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

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаВыбораПериода/Module.bsl b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаВыбораПериода/Module.bsl new file mode 100644 index 000000000..0de45a97b --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаВыбораПериода/Module.bsl @@ -0,0 +1,32 @@ +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ПериодДляРегНакоп = КонецПериода(ДобавитьМесяц(ТекущаяДата(),-1)); + ПериодДляРегБухг = КонецПериода(ТекущаяДата()); + + Элементы.ПериодДляРегБухг.Доступность = Параметры.РегБухгалтерии; + Элементы.ПериодДляРегНакоп.Доступность = Параметры.РегНакопления; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция КонецПериода(Дата) + + Возврат КонецДня(КонецМесяца(Дата)); + +КонецФункции + +&НаКлиенте +Процедура ПериодДляРегНакопПриИзменении(Элемент) + + ПериодДляРегНакоп = КонецПериода(ПериодДляРегНакоп); + +КонецПроцедуры + +&НаКлиенте +Процедура ПериодДляРегБухгПриИзменении(Элемент) + + ПериодДляРегБухг = КонецПериода(ПериодДляРегБухг); + +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаПараметровПерестроения/Form.form b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаПараметровПерестроения/Form.form new file mode 100644 index 000000000..4b0b009be --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаПараметровПерестроения/Form.form @@ -0,0 +1,274 @@ + + + + <key>ru</key> + <value>Параметры перестроения</value> + + + ОтносительныйРазмер + 1 + true + true + + true + + + ОтносительныйРазмер + + + ОтносительныйРазмерРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ОтносительныйРазмерКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + МинимальныйЭффект + 3 + true + true + + true + + + МинимальныйЭффект + + + МинимальныйЭффектРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + МинимальныйЭффектКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + OK + 5 + true + true + + true + + false + + OKРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + Form.StandardCommand.OK + Auto + true + true + true + UserCmds + Auto + + + Отмена + 6 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + + <key>ru</key> + <value>Объект</value> + + 1 + + DataProcessorObject.УправлениеИтогамиИАгрегатами + + + true + + + true + +
    true
    +
    + + ОтносительныйРазмер + + <key>ru</key> + <value>Максимальный относительный размер, %</value> + + 2 + + Number + + 10 + true + + + + true + + + true + + + + МинимальныйЭффект + + <key>ru</key> + <value>Минимальный эффект от перестроения, %</value> + + 3 + + Number + + 10 + true + + + + true + + + true + + + + ПараметрыПерестроения + + <key>ru</key> + <value>Заданные параметры</value> + + 4 + + + true + + + true + + + + ОтносительныйРазмер + + Number + + 10 + true + + + + + МинимальныйЭффект + + Number + + 10 + true + + + + + РежимПерестроения + + Boolean + + + + + + + +
    diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаПараметровПерестроения/Help/ru.html b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаПараметровПерестроения/Help/ru.html new file mode 100644 index 000000000..60e5328da --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаПараметровПерестроения/Help/ru.html @@ -0,0 +1,7 @@ + +

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

    +

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

    +
    • +
      Максимальный относительный размер - максимальная сумма размеров агрегатов в процентах от таблицы движений. Если не указан или равен нулю, то нет ограничения размера агрегатов.
      +
    • +
      Минимальный эффект от перестроения - процент, на который необходимо увеличить эффект старой сети при перестроении, если новая сеть увеличивает эффект на Минимальный эффект от перестроения %, то метод реально перестраивает сеть. Если не указан или равен нулю, то нет требований к эффекту. Недоступен для получения списка оптимальных агрегатов.
    \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаПараметровПерестроения/Module.bsl b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаПараметровПерестроения/Module.bsl new file mode 100644 index 000000000..f0dc4b39f --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаПараметровПерестроения/Module.bsl @@ -0,0 +1,21 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ОтносительныйРазмер = Параметры.ОтносительныйРазмер; + МинимальныйЭффект = Параметры.МинимальныйЭффект; + Элементы.МинимальныйЭффект.Видимость = Параметры.РежимПерестроения; + Заголовок = ?(Параметры.РежимПерестроения, НСтр("ru='Параметры перестроения'"), НСтр("ru='Параметр расчета оптимальных агрегатов'")); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Результат = Новый Массив; + Результат.Добавить(ОтносительныйРазмер); + Результат.Добавить(МинимальныйЭффект); + + ПараметрыПерестроения = Новый ФиксированныйМассив(Результат); + +КонецПроцедуры diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/УправлениеИтогамиИАгрегатами.mdo b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/УправлениеИтогамиИАгрегатами.mdo new file mode 100644 index 000000000..fae4f9bc4 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/УправлениеИтогамиИАгрегатами.mdo @@ -0,0 +1,56 @@ + + + + + + + УправлениеИтогамиИАгрегатами + + ru + Управление итогами и агрегатами + + true + DataProcessor.УправлениеИтогамиИАгрегатами.Form.ОсновнаяФорма + + ОсновнаяФорма + + ru + Управление итогами + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаВыбораПериода + + ru + Выбор периода рассчитанных итогов + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаПараметровПерестроения + + ru + Параметры перестроения + + + + ru + + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/DataProcessors/УправлениеНастройкамиФорм/Forms/Форма/Form.form b/SSL/src/DataProcessors/УправлениеНастройкамиФорм/Forms/Форма/Form.form new file mode 100644 index 000000000..5772798c4 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеНастройкамиФорм/Forms/Форма/Form.form @@ -0,0 +1,792 @@ + + + + Пользователь + 7 + true + true + + true + + + Пользователь + + + OnChange + ПользовательПриИзменении + + + ПользовательРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ПользовательКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ГруппаПоиск + 33 + + Поиск + 18 + true + true + + true + + + Поиск + + + OnChange + ПоискПриИзменении + + + ПоискРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ПоискКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Искать + 32 + true + true + + true + + false + + ИскатьРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + UsualButton + Form.Command.Искать + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + true + true + + true + + + ru + Группа поиск + + + ГруппаПоискРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ОтфильтрованныеФормы + 27 + + <key>ru</key> + <value>Настройки форм</value> + + true + true + + true + + + ОтфильтрованныеФормы + + false + Top + + Значение + 34 + true + true + + true + + + ОтфильтрованныеФормы.Value + + + ЗначениеРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + ЗначениеКонтекстноеМеню + 35 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + None + + ОтфильтрованныеФормыКоманднаяПанель + 29 + Left + true + + + ОтфильтрованныеФормыСтрокаПоиска + 50 + + ОтфильтрованныеФормыСтрокаПоискаРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ОтфильтрованныеФормыСтрокаПоискаКонтекстноеМеню + 51 + true + + ОтфильтрованныеФормы + + true + + + + ОтфильтрованныеФормыСостояниеПросмотра + 53 + + ОтфильтрованныеФормыСостояниеПросмотраРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + ОтфильтрованныеФормыСостояниеПросмотраКонтекстноеМеню + 54 + true + + ViewStatusAddition + ОтфильтрованныеФормы + + true + + + + ОтфильтрованныеФормыУправлениеПоиском + 56 + + ОтфильтрованныеФормыУправлениеПоискомРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + ОтфильтрованныеФормыУправлениеПоискомКонтекстноеМеню + 57 + true + + SearchControlAddition + ОтфильтрованныеФормы + + true + + + + ОтфильтрованныеФормыРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + ОтфильтрованныеФормыКонтекстноеМеню + 28 + true + + true + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + + ОтфильтрованныеФормы.Picture + + + Style.BorderColor + + None + None + None + true + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Обновить + 24 + true + true + + true + + false + + ОбновитьРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + Form.Command.Обновить + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Скопировать + 26 + true + true + + true + + false + + СкопироватьРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + Form.Command.Скопировать + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Удалить + 25 + true + true + + true + + false + + УдалитьРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + Form.Command.Удалить + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Закрыть + 37 + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + Form.StandardCommand.Close + true + true + true + UserCmds + Auto + + + Справка + 36 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + DefaultButton + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеНастройкамиФорм + + + true + + + true + +
    true
    +
    + + Формы + + <key>ru</key> + <value>Формы</value> + + 2 + + ValueList + + + 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 + + ValueList + + + 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> + + 9 + + String + + + + true + + + true + + + + Обновить + + <key>ru</key> + <value>Обновить список</value> + + 1 + + ru + Обновить список настроек форм + + + true + + F5 + + StdPicture.Refresh + + + + ОбновитьВыполнить + + + 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 + + + + + + +
    diff --git a/SSL/src/DataProcessors/УправлениеНастройкамиФорм/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/УправлениеНастройкамиФорм/Forms/Форма/Module.bsl new file mode 100644 index 000000000..48f4f5d8c --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеНастройкамиФорм/Forms/Форма/Module.bsl @@ -0,0 +1,197 @@ +////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции +&НаСервере +Процедура ЗаполнитьСписокПользователей() + + СписокПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей(); + + Для Каждого ТекПользователь Из СписокПользователей Цикл + + Элементы.Пользователь.СписокВыбора.Добавить(ТекПользователь.Имя); + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьСписокФорм() + + Обработка = РеквизитФормыВЗначение("Объект"); + СписокФорм = Новый СписокЗначений; + Обработка.ПолучитьСписокФорм(СписокФорм); + Формы.Очистить(); + Обработка.ПолучитьСписокСохраненныхНастроек(СписокФорм, Пользователь, Формы); + +КонецПроцедуры + +&НаСервере +Функция ПолучитьМассивВыделенныхНастроек() + + МассивНастроек = Новый Массив; + + ВыделенныеЭлементы = Элементы.ОтфильтрованныеФормы.ВыделенныеСтроки; + + Для Каждого ВыделенныйЭлемент Из ВыделенныеЭлементы Цикл + + МассивНастроек.Добавить(Формы.НайтиПоЗначению(ОтфильтрованныеФормы.НайтиПоИдентификатору(ВыделенныйЭлемент).Значение).Значение); + + КонецЦикла; + + Возврат МассивНастроек; + +КонецФункции + +&НаСервере +Процедура СкопироватьНаСервере(ПользователиПриемник) + + МассивНастроекДляКопирования = ПолучитьМассивВыделенныхНастроек(); + + Обработка = РеквизитФормыВЗначение("Объект"); + Обработка.СкопироватьНастройкиФорм(Пользователь, ПользователиПриемник, МассивНастроекДляКопирования); + +КонецПроцедуры + +&НаСервере +Процедура УдалитьНаСервере() + + МассивНастроекДляУдаления = ПолучитьМассивВыделенныхНастроек(); + + Обработка = РеквизитФормыВЗначение("Объект"); + Обработка.УдалитьНастройкиФорм(Пользователь, МассивНастроекДляУдаления); + +КонецПроцедуры + +Процедура ПрименитьФильтр() + + ОтфильтрованныеФормы.Очистить(); + + Для Каждого ЭлементФорма Из Формы Цикл + + Если Поиск = "" Или Найти(ВРег(ЭлементФорма.Представление), ВРег(Поиск)) <> 0 Тогда + + ОтфильтрованныеФормы.Добавить(ЭлементФорма.Значение, ЭлементФорма.Представление, ЭлементФорма.Пометка, ЭлементФорма.Картинка); + + КонецЕсли; + + КонецЦикла; + + ПримененныйПоиск = Поиск; + +КонецПроцедуры + +////////////////////////////////////////////////////////////////////// +// Обработчики команд +&НаКлиенте +Процедура ОбновитьВыполнить() + + ОбновитьСписокФорм(); + ПрименитьФильтр(); + +КонецПроцедуры + +&НаКлиенте +Процедура СкопироватьВыполнить() + + Если Элементы.ОтфильтрованныеФормы.ВыделенныеСтроки.Количество() = 0 Тогда + Предупреждение(НСтр("ru = 'Для копирования нужно выбрать настройки, которые требуется скопировать.'")); + Возврат; + КонецЕсли; + + СписокПользователей = Элементы.Пользователь.СписокВыбора.Скопировать(); + + Если СписокПользователей.Количество() = 0 Тогда + Предупреждение(НСтр("ru = 'Невозможно скопировать настройки, так как в системе не заведен ни один пользователь.'")); + Возврат; + КонецЕсли; + + ЭлементСписка = СписокПользователей.НайтиПоЗначению(Пользователь); + Если ЭлементСписка <> Неопределено Тогда + СписокПользователей.Удалить(ЭлементСписка); + КонецЕсли; + + Если СписокПользователей.ОтметитьЭлементы(НСтр("ru = 'Отметьте пользователей, которым нужно скопировать настройки'")) Тогда + ПользователиПриемник = Новый Массив; + Для Каждого Элемент Из СписокПользователей Цикл + Элементы.Пользователь.СписокВыбора.НайтиПоЗначению(Элемент.Значение).Пометка = Элемент.Пометка; + Если Элемент.Пометка Тогда + ПользователиПриемник.Добавить(Элемент.Значение); + КонецЕсли; + КонецЦикла; + + Если ПользователиПриемник.Количество() = 0 Тогда + Предупреждение(НСтр("ru = 'Для копирования нужно отметить пользователей, которым требуется скопировать настройки.'")); + Возврат; + КонецЕсли; + + ТекстВопроса = НСтр("ru = 'После копирования настроек пользователю форма у пользователя будет открываться с настройками, которые ему скопируются. При этом его собственные настройки будут потеряны. Вы действительно хотите скопировать настройки выбранным пользователям?'"); + Если Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да) <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + СкопироватьНаСервере(ПользователиПриемник); + ПоказатьОповещениеПользователя(НСтр("ru = 'Настройки скопированы'")); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьВыполнить() + + Если Элементы.ОтфильтрованныеФормы.ВыделенныеСтроки.Количество() = 0 Тогда + + Предупреждение(НСтр("ru = 'Для удаления нужно выбрать настройки, которые требуется удалить.'")); + Возврат; + + КонецЕсли; + + ТекстВопроса = НСтр("ru = 'После удаления настроек форма будет открываться с настройками по умолчанию. Вы действительно хотите удалить настройки?'"); + Если Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да) <> КодВозвратаДиалога.Да Тогда + + Возврат; + + КонецЕсли; + + УдалитьНаСервере(); + ОбновитьСписокФорм(); + ПрименитьФильтр(); + + ПоказатьОповещениеПользователя(НСтр("ru = 'Настройки удалены'")); + +КонецПроцедуры + +&НаКлиенте +Процедура ИскатьВыполнить() + + ПрименитьФильтр(); + +КонецПроцедуры + +////////////////////////////////////////////////////////////////////// +// Обработчики событий формы +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗаполнитьСписокПользователей(); + Пользователь = ИмяПользователя(); + ОбновитьСписокФорм(); + ПрименитьФильтр(); + +КонецПроцедуры + +////////////////////////////////////////////////////////////////////// +// Обработчики событий элементов управления +&НаКлиенте +Процедура ПользовательПриИзменении(Элемент) + + ОбновитьСписокФорм(); + ПрименитьФильтр(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПоискПриИзменении(Элемент) + + ПрименитьФильтр(); + +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/УправлениеНастройкамиФорм/ObjectModule.bsl b/SSL/src/DataProcessors/УправлениеНастройкамиФорм/ObjectModule.bsl new file mode 100644 index 000000000..738092fe7 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеНастройкамиФорм/ObjectModule.bsl @@ -0,0 +1,205 @@ +Процедура ПолучитьСписокФормИзСпискаМетаданныхФорм(Префикс, ПрефиксПредставления, МетаданныеФорм, Картинка, Список) + + Для Каждого Форма Из МетаданныеФорм Цикл + + Список.Добавить(Префикс + ".Форма." + Форма.Имя, ПрефиксПредставления + "." + Форма.Синоним, Ложь, Картинка); + + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьСтандартнуюФорму(Префикс, ПрефиксПредставления, ОбъектМетаданных, ИмяФормы, ПредставлениеФормы, Картинка, Список) + + Если ОбъектМетаданных["Основная" + ИмяФормы] = Неопределено Тогда + + Список.Добавить(Префикс + "." + ИмяФормы, ПрефиксПредставления + "." + ПредставлениеФормы, Ложь, Картинка); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПолучитьСписокФормОбъектаМетаданных(СписокОбъектовМетаданных, ИмяОбъектаМетаданных, ПредставлениеОбъектаМетаданных, ИменаСтандартныхФорм, Картинка, Список) + + Для Каждого Объект Из СписокОбъектовМетаданных Цикл + + Префикс = ИмяОбъектаМетаданных + "." + Объект.Имя; + ПрефиксПредставления = ПредставлениеОбъектаМетаданных + "." + Объект.Синоним; + + ПолучитьСписокФормИзСпискаМетаданныхФорм(Префикс, ПрефиксПредставления, Объект.Формы, Картинка, Список); + + Для Каждого ИмяСтандартнойФормы Из ИменаСтандартныхФорм Цикл + + ДобавитьСтандартнуюФорму(Префикс, ПрефиксПредставления, Объект, ИмяСтандартнойФормы.Значение, ИмяСтандартнойФормы.Представление, Картинка, Список); + + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +// Получает список форм, в конфигурации, при этом заполняются следующие поля: +// Значение - имя формы, идентифицирующее ее. +// Представление - синоним формы +// Картинка - картинка соответствующая объекту, к которому форма имеет отношение +// Параметры +// Список - СписокЗначений - список значений, в который будут добавлены описания форм +// +Процедура ПолучитьСписокФорм(Список) Экспорт + + Для Каждого Форма Из Метаданные.ОбщиеФормы Цикл + + Список.Добавить("ОбщаяФорма." + Форма.Имя, "Общая форма." + Форма.Синоним, Ложь, БиблиотекаКартинок.Форма); + + КонецЦикла; + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("ФормаОбъекта", "Форма объекта"); + ИменаСтандартныхФорм.Добавить("ФормаГруппы", "Форма группы"); + ИменаСтандартныхФорм.Добавить("ФормаСписка", "Форма списка"); + ИменаСтандартныхФорм.Добавить("ФормаДляВыбора", "Форма выбора"); + ИменаСтандартныхФорм.Добавить("ФормаДляВыбораГруппы", "Форма выбора группы"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.Справочники, "Справочник", "Справочник", ИменаСтандартныхФорм, БиблиотекаКартинок.Справочник, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("Форма", "Форма"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.КритерииОтбора, "КритерийОтбора", "Критерий отбора", ИменаСтандартныхФорм, БиблиотекаКартинок.КритерийОтбора, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("ФормаСохранения", "Форма сохранения"); + ИменаСтандартныхФорм.Добавить("ФормаЗагрузки", "Форма выбора"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.ХранилищаНастроек, "ХранилищеНастроек", "Хранилище настроек", ИменаСтандартныхФорм, БиблиотекаКартинок.ХранилищеНастроек, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("ФормаОбъекта", "Форма объекта"); + ИменаСтандартныхФорм.Добавить("ФормаСписка", "Форма списка"); + ИменаСтандартныхФорм.Добавить("ФормаДляВыбора", "Форма выбора"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.Документы, "Документ", "Документ", ИменаСтандартныхФорм, БиблиотекаКартинок.Документ, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("Форма", "Форма"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.ЖурналыДокументов, "ЖурналДокументов", "Журнал документов", ИменаСтандартныхФорм, БиблиотекаКартинок.ЖурналДокументов, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("ФормаСписка", "Форма списка"); + ИменаСтандартныхФорм.Добавить("ФормаДляВыбора", "Форма выбора"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.Перечисления, "Перечисление", "Перечисление", ИменаСтандартныхФорм, БиблиотекаКартинок.Перечисление, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("Форма", "Форма"); + ИменаСтандартныхФорм.Добавить("ФормаНастроек", "Форма настроек"); + ИменаСтандартныхФорм.Добавить("ФормаВарианта", "Форма варианта"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.Отчеты, "Отчет", "Отчет", ИменаСтандартныхФорм, БиблиотекаКартинок.Отчет, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("Форма", "Форма"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.Обработки, "Обработка", "Обработка", ИменаСтандартныхФорм, БиблиотекаКартинок.Обработка, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("ФормаЗаписи", "Форма записи"); + ИменаСтандартныхФорм.Добавить("ФормаСписка", "Форма списка"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.РегистрыСведений, "РегистрСведений", "Регистр сведений", ИменаСтандартныхФорм, БиблиотекаКартинок.РегистрСведений, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("ФормаСписка", "Форма списка"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.РегистрыНакопления, "РегистрНакопления", "Регистр накопления", ИменаСтандартныхФорм, БиблиотекаКартинок.РегистрНакопления, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("ФормаОбъекта", "Форма объекта"); + ИменаСтандартныхФорм.Добавить("ФормаГруппы", "Форма группы"); + ИменаСтандартныхФорм.Добавить("ФормаСписка", "Форма списка"); + ИменаСтандартныхФорм.Добавить("ФормаДляВыбора", "Форма выбора"); + ИменаСтандартныхФорм.Добавить("ФормаДляВыбораГруппы", "Форма выбора группы"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.ПланыВидовХарактеристик, "ПланВидовХарактеристик", "План видов характеристик", ИменаСтандартныхФорм, БиблиотекаКартинок.ПланВидовХарактеристик, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("ФормаОбъекта", "Форма объекта"); + ИменаСтандартныхФорм.Добавить("ФормаСписка", "Форма списка"); + ИменаСтандартныхФорм.Добавить("ФормаДляВыбора", "Форма выбора"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.ПланыСчетов, "ПланСчетов", "План счетов", ИменаСтандартныхФорм, БиблиотекаКартинок.ПланСчетов, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("ФормаСписка", "Форма списка"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.РегистрыБухгалтерии, "РегистрБухгалтерии", "Регистр бухгалтерии", ИменаСтандартныхФорм, БиблиотекаКартинок.РегистрБухгалтерии, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("ФормаОбъекта", "Форма объекта"); + ИменаСтандартныхФорм.Добавить("ФормаСписка", "Форма списка"); + ИменаСтандартныхФорм.Добавить("ФормаДляВыбора", "Форма выбора"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.ПланыВидовРасчета, "ПланВидовРасчета", "План видов расчета", ИменаСтандартныхФорм, БиблиотекаКартинок.ПланВидовРасчета, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("ФормаСписка", "Форма списка"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.РегистрыРасчета, "РегистрРасчета", "Регистр расчета", ИменаСтандартныхФорм, БиблиотекаКартинок.РегистрРасчета, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("ФормаОбъекта", "Форма объекта"); + ИменаСтандартныхФорм.Добавить("ФормаСписка", "Форма списка"); + ИменаСтандартныхФорм.Добавить("ФормаДляВыбора", "Форма выбора"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.БизнесПроцессы, "БизнесПроцесс", "Бизнес процесс", ИменаСтандартныхФорм, БиблиотекаКартинок.БизнесПроцесс, Список); + + ИменаСтандартныхФорм = Новый СписокЗначений; + ИменаСтандартныхФорм.Добавить("ФормаОбъекта", "Форма объекта"); + ИменаСтандартныхФорм.Добавить("ФормаСписка", "Форма списка"); + ИменаСтандартныхФорм.Добавить("ФормаДляВыбора", "Форма выбора"); + ПолучитьСписокФормОбъектаМетаданных(Метаданные.Задачи, "Задача", "Задача", ИменаСтандартныхФорм, БиблиотекаКартинок.Задача, Список); + +КонецПроцедуры + +// Отбирает из переданных форм те, для которых есть сохраненные настройки по указанному +// в параметре Пользователь пользователю. При этом отобранные формы записываются в параметр +// СписокФормССохраненнымиНастройками. +// +Процедура ПолучитьСписокСохраненныхНастроек(СписокФорм, Пользователь, СписокФормССохраненнымиНастройками) Экспорт + + Для Каждого Элемент Из СписокФорм Цикл + + Добавлен = Ложь; + + Описание = ХранилищеСистемныхНастроек.ПолучитьОписание(Элемент.Значение + "/НастройкиФормы", , Пользователь); + + Если Описание <> Неопределено Тогда + СписокФормССохраненнымиНастройками.Добавить(Элемент.Значение, Элемент.Представление, Элемент.Пометка, Элемент.Картинка); + Добавлен = Истина; + КонецЕсли; + + Описание = ХранилищеСистемныхНастроек.ПолучитьОписание(Элемент.Значение + "/НастройкиОкна", , Пользователь); + Если Описание <> Неопределено И НЕ Добавлен Тогда + СписокФормССохраненнымиНастройками.Добавить(Элемент.Значение, Элемент.Представление, Элемент.Пометка, Элемент.Картинка); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Копирует настройки одного пользователя ИБ другому. +// Параметры +// ПользовательИсточник - строка - имя пользователя ИБ, по которому хранятся настройки +// ПользователиПриемник - строка - имя пользователя ИБ, которому копируются настройки +// МассивНастроекДляКопирования - массив - массив строк каждая из которых - полное имя формы +// +Процедура СкопироватьНастройкиФорм(ПользовательИсточник, ПользователиПриемник, МассивНастроекДляКопирования) Экспорт + + Для Каждого Элемент Из МассивНастроекДляКопирования Цикл + Настройка = ХранилищеСистемныхНастроек.Загрузить(Элемент + "/НастройкиФормы", "", , ПользовательИсточник); + Если Настройка <> Неопределено Тогда + Для Каждого ПользовательПриемник Из ПользователиПриемник Цикл + ХранилищеСистемныхНастроек.Сохранить(Элемент + "/НастройкиФормы", "", Настройка, , ПользовательПриемник); + КонецЦикла; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Процедура удаляет все настройки пользователя пользователя, +// имеющие отношения к формам. +// Пользователь - строка - имя пользователя ИБ +// МассивНастроекДляКопирования - массив - массив строк каждая из которых - полное имя формы +// +Процедура УдалитьНастройкиФорм(Пользователь, МассивНастроекДляУдаления) Экспорт + + Для Каждого Элемент Из МассивНастроекДляУдаления Цикл + ХранилищеСистемныхНастроек.Удалить(Элемент + "/НастройкиФормы", "", Пользователь); + ХранилищеСистемныхНастроек.Удалить(Элемент + "/НастройкиОкна", "", Пользователь); + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/DataProcessors/УправлениеНастройкамиФорм/УправлениеНастройкамиФорм.mdo b/SSL/src/DataProcessors/УправлениеНастройкамиФорм/УправлениеНастройкамиФорм.mdo new file mode 100644 index 000000000..b7cb4cdc8 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеНастройкамиФорм/УправлениеНастройкамиФорм.mdo @@ -0,0 +1,23 @@ + + + + + + + УправлениеНастройкамиФорм + + ru + Управление настройками форм + + true + DataProcessor.УправлениеНастройкамиФорм.Form.Форма + + Форма + + ru + Форма + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/Forms/Форма/ConditionalAppearance.dcssca b/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/Forms/Форма/ConditionalAppearance.dcssca new file mode 100644 index 000000000..60b2f5f4f --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/Forms/Форма/ConditionalAppearance.dcssca @@ -0,0 +1,23 @@ + + + + + + СтатусИндекса + + + + + ИндексАктуален + Equal + false + + + + + Шрифт + + + + + diff --git a/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/Forms/Форма/Form.form b/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/Forms/Форма/Form.form new file mode 100644 index 000000000..f8ce681ac --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/Forms/Форма/Form.form @@ -0,0 +1,342 @@ + + + + <key>ru</key> + <value>Управление полнотекстовым поиском</value> + + + СтатусИндекса + 3 + true + true + + true + + + СтатусИндекса + + None + + СтатусИндексаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + СтатусИндексаКонтекстноеМеню + 4 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ДатаАктуальностиИндекса + 5 + true + true + + true + + + ДатаАктуальностиИндекса + + + ДатаАктуальностиИндексаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ДатаАктуальностиИндексаКонтекстноеМеню + 6 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ОбновитьИндекс + 7 + true + true + + true + + false + + ОбновитьИндексРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + UsualButton + Form.Command.ОбновитьИндекс + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + ОчиститьИндекс + 8 + true + true + + true + + false + + ОчиститьИндексРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + UsualButton + Form.Command.ОчиститьИндекс + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Закрыть + 9 + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + Form.StandardCommand.Close + true + true + true + UserCmds + Auto + + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + 45 + LockOwner + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПолнотекстовымПоиском + + + true + + + true + +
    true
    + true +
    + + СтатусИндекса + + <key>ru</key> + <value>Статус индекса</value> + + 3 + + String + + + + true + + + true + + + + ДатаАктуальностиИндекса + + <key>ru</key> + <value>Дата актуальности индекса</value> + + 4 + + Date + + + + true + + + true + + + + ИндексАктуален + + <key>ru</key> + <value>Индекс актуален</value> + + 5 + + Boolean + + + true + + + true + + + + ИндексРазрешен + + <key>ru</key> + <value>Индекс разрешен</value> + + 6 + + Boolean + + + true + + + true + + + + ОбновитьИндекс + + <key>ru</key> + <value>Обновить индекс</value> + + 1 + + ru + Обновить индекс + + + true + + Role.РедактированиеРеквизитовОбъектов + + + + + ОбновитьИндексВыполнить + + + Auto + Auto + + + ОчиститьИндекс + + <key>ru</key> + <value>Очистить индекс</value> + + 2 + + ru + Очистить индекс + + + true + + Role.РедактированиеРеквизитовОбъектов + + + + + ОчиститьИндексВыполнить + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/Forms/Форма/Module.bsl new file mode 100644 index 000000000..025a768c8 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/Forms/Форма/Module.bsl @@ -0,0 +1,58 @@ + +// Обновить индекс поиска +// +&НаКлиенте +Процедура ОбновитьИндексВыполнить() + + Состояние(НСтр("ru = 'Идет обновление полнотекстового индекса... + |Пожалуйста, подождите.'")); + ОбновитьИндексСервер(); + ОбновитьСтатус(); + Состояние(НСтр("ru = 'Обновление полнотекстового индекса завершено.'")); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьИндексСервер() + ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь, Ложь); +КонецПроцедуры + +// Очистить индекс +// +&НаСервере +Процедура ОчиститьИндексСервер() Экспорт + ПолнотекстовыйПоиск.ОчиститьИндекс(); +КонецПроцедуры + +// Очистить индекс +&НаКлиенте +Процедура ОчиститьИндексВыполнить() + ОчиститьИндексСервер(); + ОбновитьСтатус(); +КонецПроцедуры + +// Обновить статус - доступность кнопок, дата актуальности индекса. +&НаСервере +Процедура ОбновитьСтатус() + РазрешитьПолнотекстовыйПоиск = (ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Разрешить); + Если РазрешитьПолнотекстовыйПоиск Тогда + ДатаАктуальностиИндекса = ПолнотекстовыйПоиск.ДатаАктуальности(); + ИндексАктуален = ПолнотекстовыйПоиск.ИндексАктуален(); + КонецЕсли; + + СтатусИндекса = ""; + + Если РазрешитьПолнотекстовыйПоиск Тогда + Если ИндексАктуален Тогда + СтатусИндекса = НСтр("ru = 'Обновление индекса не требуется'"); + Иначе + СтатусИндекса = НСтр("ru = 'Требуется обновление индекса'"); + КонецЕсли; + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ОбновитьСтатус(); +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/Help/ru.html b/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/Help/ru.html new file mode 100644 index 000000000..50e768bcc --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/Help/ru.html @@ -0,0 +1,8 @@ + +

    +

     

    + + +
    Обновить индексВыполняет обновление полнотекстового индекса, добавляя к нему новые или измененные объекты
    Очистить индексУдаляет все файлы полнотекстового индекса

     

    +

    В клиент-серверном варианте обновление полнотекстового индекса выполняется автоматически.

    +

    См. также: Поиск данных.

    \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/УправлениеПолнотекстовымПоиском.mdo b/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/УправлениеПолнотекстовымПоиском.mdo new file mode 100644 index 000000000..77dbba47b --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПолнотекстовымПоиском/УправлениеПолнотекстовымПоиском.mdo @@ -0,0 +1,33 @@ + + + + + + + УправлениеПолнотекстовымПоиском + + ru + Управление поиском + + true + DataProcessor.УправлениеПолнотекстовымПоиском.Form.Форма + true + + + ru + + + + ru + Управление полнотекстовым поиском + + + Форма + + ru + Форма + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Form.form b/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Form.form new file mode 100644 index 000000000..30be9e7e5 --- /dev/null +++ b/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Form.form @@ -0,0 +1,2835 @@ + + + + ГруппаОсновныеРеквизиты + 15 + + ГруппаНомерДата + 2 + + Номер + 3 + true + true + + true + + + Объект.Number + + + НомерРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 4 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + Дата + 5 + true + true + + true + + + Объект.Date + + + ДатаРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 6 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДатаРедактирования + 66 + true + true + + true + + + Объект.ДатаРедактирования + + + ДатаРедактированияРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + + ДатаРедактированияКонтекстноеМеню + 67 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа номер дата</value> + + + ru + Группа номер дата + + + ГруппаНомерДатаРасширеннаяПодсказка + 118 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаРеквизитыОсновное + 37 + + Опрос + 10 + true + true + + true + + + Объект.Опрос + + + ОпросРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + + ОпросКонтекстноеМеню + 11 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + Респондент + 12 + true + true + + true + + + Объект.Респондент + + + РеспондентРасширеннаяПодсказка + 128 + Label + true + true + + Left + + + + РеспондентКонтекстноеМеню + 13 + true + + InputField + Auto + true + Left + true + + + StartChoice + РеспондентНачалоВыбора + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа реквизиты основное</value> + + + ru + Группа реквизиты основное + + + ГруппаРеквизитыОсновноеРасширеннаяПодсказка + 125 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Реквизиты Документа</value> + + + ru + Группа основные реквизиты + + + ГруппаОсновныеРеквизитыРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаКнопкиШапка + 81 + + СкрытьПоказатьДеревоРазделов + 80 + + <key>ru</key> + <value>Скрыть дерево разделов:</value> + + true + true + + true + + false + + СкрытьПоказатьДеревоРазделовРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + UsualButton + Form.Command.СкрытьПоказатьДеревоРазделов + Normal + Auto + true + true + UserCmds + Auto + + + ДекорацияКнопкиШапка + 82 + true + true + + true + + + ДекорацияКнопкиШапкаРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + + ДекорацияКнопкиШапкаКонтекстноеМеню + 83 + true + + Label + true + true + true + false + + Left + + + + ПредыдущийРаздел + 84 + + <key>ru</key> + <value><< Назад</value> + + true + true + + true + + false + + ПредыдущийРазделРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + UsualButton + Form.Command.ПредыдущийРаздел + Normal + Auto + 20 + true + true + UserCmds + Auto + + + СледующийРаздел + 85 + + <key>ru</key> + <value>Далее >></value> + + true + true + + true + + false + + СледующийРазделРасширеннаяПодсказка + 134 + Label + true + true + + Left + + + UsualButton + Form.Command.СледующийРаздел + Normal + Auto + 20 + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа кнопки шапка</value> + + + ru + Группа кнопки шапка + + + ГруппаКнопкиШапкаРасширеннаяПодсказка + 130 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаДеревоРазделовФормаЗаполнения + 68 + + ГруппаДеревоРазделов + 77 + + ДеревоРазделов + 69 + true + true + + true + + + ДеревоРазделов + + false + None + Add + Copy + Delete + EndEdit + HierarchicalList + List + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + Tree + + ГруппаПолныйКодНаименование + 76 + + ДеревоРазделовФормулировка + 72 + + <key>ru</key> + <value>Раздел</value> + + true + true + + true + + + ДеревоРазделов.Формулировка + + None + + ДеревоРазделовФормулировкаРасширеннаяПодсказка + 150 + Label + true + true + + Left + + + + ДеревоРазделовФормулировкаКонтекстноеМеню + 73 + true + + InputField + Auto + Left + + true + true + true + true + true + true + Normal + + + true + true + + true + + + ru + Группа полный код наименование + + + ГруппаПолныйКодНаименованиеРасширеннаяПодсказка + 149 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + ДеревоРазделовКоманднаяПанель + 71 + Left + + + Selection + ДеревоРазделовВыбор + + + ДеревоРазделовСтрокаПоиска + 140 + + ДеревоРазделовСтрокаПоискаРасширеннаяПодсказка + 142 + Label + true + true + + Left + + + + ДеревоРазделовСтрокаПоискаКонтекстноеМеню + 141 + true + + ДеревоРазделов + + true + + + + ДеревоРазделовСостояниеПросмотра + 143 + + ДеревоРазделовСостояниеПросмотраРасширеннаяПодсказка + 145 + Label + true + true + + Left + + + + ДеревоРазделовСостояниеПросмотраКонтекстноеМеню + 144 + true + + ViewStatusAddition + ДеревоРазделов + + true + + + + ДеревоРазделовУправлениеПоиском + 146 + + ДеревоРазделовУправлениеПоискомРасширеннаяПодсказка + 148 + Label + true + true + + Left + + + + ДеревоРазделовУправлениеПоискомКонтекстноеМеню + 147 + true + + SearchControlAddition + ДеревоРазделов + + true + + + + ДеревоРазделовРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + + ДеревоРазделовКонтекстноеМеню + 70 + + КонтекстноеМенюДеревоРазделовПерейти + 89 + + <key>ru</key> + <value>Перейти</value> + + true + true + + true + + false + + КонтекстноеМенюДеревоРазделовПерейтиРасширеннаяПодсказка + 137 + Label + true + true + + Left + + + Form.Command.ВыборРаздела + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюДеревоРазделовКопировать + 90 + true + true + + true + + false + + КонтекстноеМенюДеревоРазделовКопироватьРасширеннаяПодсказка + 138 + Label + true + true + + Left + + + Form.Item.ДеревоРазделов.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + + + Tree + true + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + true + Auto + Auto + ExpandAllLevels + true + true + true + true + + ДеревоРазделов.КодКартинки + + + CommonPicture.КоллекцияКартинокДеревоАнкеты + + None + None + None + true + + true + true + + true + + + <key>ru</key> + <value>Группа дерево разделов</value> + + + ru + Группа дерево разделов + + + ГруппаДеревоРазделовРасширеннаяПодсказка + 136 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаСтраницыФормаЗаполнения + 94 + + ГруппаТелоАнкеты + 43 + + НадписьВступление + 78 + true + true + + true + + + НадписьВступлениеРасширеннаяПодсказка + 162 + Label + true + true + + Left + + + + НадписьВступлениеКонтекстноеМеню + 79 + true + + Label + true + true + true + false + + Left + + + true + true + + true + + true + + ГруппаТелоАнкетыРасширеннаяПодсказка + 161 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаОжидание + 95 + + ГруппаОжиданиеОтступ + 102 + + ДекорацияОжиданиеОтступ + 104 + true + true + + true + + + ДекорацияОжиданиеОтступРасширеннаяПодсказка + 165 + Label + true + true + + Left + + + + ДекорацияОжиданиеОтступКонтекстноеМеню + 105 + true + + Label + true + 5 + true + false + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа ожидание отступ</value> + + + ru + Группа ожидание отступ + + + ГруппаОжиданиеОтступРасширеннаяПодсказка + 164 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаОжиданиеЭлементы + 103 + + ДекорацияОжиданиеЭлементы + 96 + + <key>ru</key> + <value>Декорация ожидание элементы</value> + + true + true + + true + + + ДекорацияОжиданиеЭлементыРасширеннаяПодсказка + 167 + Label + true + true + + Left + + + + ДекорацияОжиданиеЭлементыКонтекстноеМеню + 97 + true + + 20 + true + true + false + + + + КартинкаДлительныйПроцесс + 98 + + <key>ru</key> + <value>Подождите пожалуйста… +Открывается раздел анкеты</value> + + true + true + + true + + + КартинкаДлительныйПроцессРасширеннаяПодсказка + 168 + Label + true + true + + Left + + + + КартинкаДлительныйПроцессКонтекстноеМеню + 99 + true + + 5 + true + 2 + true + false + false + false + + + CommonPicture.Информация32 + + Stretch + + + + НадписьПодождите + 100 + + <key>ru</key> + <value>Подождите пожалуйста… Открывается раздел анкеты +</value> + + true + true + + true + + + НадписьПодождитеРасширеннаяПодсказка + 169 + Label + true + true + + Left + + + + НадписьПодождитеКонтекстноеМеню + 101 + true + + Label + 20 + true + 2 + true + false + false + false + + Left + Bottom + + + true + true + + true + + + <key>ru</key> + <value>Группа ожидание элементы</value> + + + ru + Группа ожидание элементы + + + ГруппаОжиданиеЭлементыРасширеннаяПодсказка + 166 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница ожидание</value> + + + ru + Страница ожидание + + false + false + + СтраницаОжиданиеРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Группа страницы форма заполнения</value> + + + ru + Группа страницы форма заполнения + + + ГруппаСтраницыФормаЗаполненияРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа дерево разделов форма заполнения</value> + + + ru + Группа дерево разделов форма заполнения + + + ГруппаДеревоРазделовФормаЗаполненияРасширеннаяПодсказка + 135 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + LeftNarrowest + Auto + Auto + + + + ГруппаКнопкиПодвал + 106 + + ДекорацияКнопкиПодвал + 109 + true + true + + true + + + ДекорацияКнопкиПодвалРасширеннаяПодсказка + 171 + Label + true + true + + Left + + + + ДекорацияКнопкиПодвалКонтекстноеМеню + 110 + true + + Label + true + true + true + false + + Left + + + + ПредыдущийРазделПодвал + 107 + + <key>ru</key> + <value> << Назад </value> + + true + true + + true + + false + + ПредыдущийРазделПодвалРасширеннаяПодсказка + 172 + Label + true + true + + Left + + + UsualButton + Form.Command.ПредыдущийРаздел + Normal + Auto + 20 + true + true + UserCmds + Auto + + + СледующийРазделПодвал + 108 + + <key>ru</key> + <value>Далее >></value> + + true + true + + true + + false + + СледующийРазделПодвалРасширеннаяПодсказка + 173 + Label + true + true + + Left + + + UsualButton + Form.Command.СледующийРаздел + Normal + Auto + 20 + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа кнопки подвал</value> + + + ГруппаКнопкиПодвалРасширеннаяПодсказка + 170 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ФормаКоманднаяПанельПровестиИЗакрыть + 86 + true + true + + true + + false + + ФормаКоманднаяПанельПровестиИЗакрытьРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + Form.StandardCommand.PostAndClose + Normal + Auto + true + true + UserCmds + Auto + + + ФормаКоманднаяПанельЗаписать + 87 + true + true + + true + + false + + ФормаКоманднаяПанельЗаписатьРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + Form.StandardCommand.Write + Normal + Auto + true + true + UserCmds + Auto + + + ФормаЗаполненияПровестиЗакрыть + 92 + + <key>ru</key> + <value>Завершить редактирование и закрыть</value> + + true + true + + true + + false + + ФормаЗаполненияПровестиЗакрытьРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + Form.Command.ФормаЗаполненияПровестиЗакрыть + Normal + PictureAndText + true + true + UserCmds + + StdPicture.WriteAndClose + + Auto + + + ФормаЗаполненияЗаписать + 91 + + <key>ru</key> + <value>Записать ответы с возможностью продолжить заполнение</value> + + true + true + + true + + false + + ФормаЗаполненияЗаписатьРасширеннаяПодсказка + 114 + Label + true + true + + Left + + + Form.Command.ФормаЗаполненияЗаписать + Normal + PictureAndText + true + true + UserCmds + + StdPicture.Write + + Auto + + + ФормаЗакрыть + 88 + + <key>ru</key> + <value>Закрыть</value> + + true + true + + true + + false + + ФормаЗакрытьРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + PictureAndText + true + true + UserCmds + Auto + + + Справка + 93 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 116 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DocumentObject.Анкета + + + true + + + true + + + Объект.RegisterRecords + +
    true
    + true +
    + + ОтборРеспондентов + + <key>ru</key> + <value>Отбор респондентов</value> + + 4 + + ValueList + + + true + + + true + + + + + + + ИмяМетаданныхРеспонент + + <key>ru</key> + <value>Имя метаданных респонент</value> + + 5 + + String + + + + true + + + true + + + + ВозможностьПредварительногоСохранения + + <key>ru</key> + <value>Возможность предварительного сохранения</value> + + 2 + + Boolean + + + true + + + true + + + + ШаблонАнкеты + + <key>ru</key> + <value>Шаблон анкеты</value> + + 6 + + CatalogRef.ШаблоныАнкет + + + true + + + true + + + + ВопросыПредставлениеТипы + + <key>ru</key> + <value>Вопросы представление типы</value> + + 7 + + ValueTable + + + true + + + true + + + Вопрос + + <key>ru</key> + <value>Вопрос</value> + + 1 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + Формулировка + + <key>ru</key> + <value>Формулировка</value> + + 2 + + String + + 500 + + + + true + + + true + + + + Тип + + <key>ru</key> + <value>Тип</value> + + 3 + + TypeDescription + + + true + + + true + + + + ТипОтвета + + <key>ru</key> + <value>Тип ответа</value> + + 4 + + EnumRef.ТипыОтветовНаВопрос + + + true + + + true + + + + МинимальноеЗначение + + <key>ru</key> + <value>Минимальное значение</value> + + 5 + + Number + + 15 + + + + true + + + true + + + + МаксимальноеЗначение + + <key>ru</key> + <value>Максимальное значение</value> + + 6 + + Number + + 15 + + + + true + + + true + + + + + ТаблицаВопросовРаздела + + <key>ru</key> + <value>Таблица вопросов раздела</value> + + 8 + + ValueTable + + + true + + + true + + + Наименование + + <key>ru</key> + <value>Наименование</value> + + 2 + + String + + 150 + + + + true + + + true + + + + ТипСтроки + + <key>ru</key> + <value>Тип строки</value> + + 3 + + String + + 10 + + + + true + + + true + + + + ЭлементарныйВопрос + + <key>ru</key> + <value>Элементарный вопрос</value> + + 5 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + Обязательный + + <key>ru</key> + <value>Обязательный</value> + + 6 + + Boolean + + + true + + + true + + + + ТипВопроса + + <key>ru</key> + <value>Тип вопроса</value> + + 7 + + EnumRef.ТипыВопросовШаблонаАнкеты + + + true + + + true + + + + ТипОтвета + + <key>ru</key> + <value>Тип ответа</value> + + 8 + + EnumRef.ТипыОтветовНаВопрос + + + true + + + true + + + + ТипТабличногоВопроса + + <key>ru</key> + <value>Тип табличного вопроса</value> + + 4 + + EnumRef.ТипыТабличныхВопросов + + + true + + + true + + + + СоставТабличногоВопроса + + <key>ru</key> + <value>Состав табличного вопроса</value> + + 9 + + ValueTable + + + true + + + true + + + + ПредопределенныеОтветы + + <key>ru</key> + <value>Предопределенные ответы</value> + + 10 + + ValueTable + + + true + + + true + + + + КлючСтроки + + <key>ru</key> + <value>Ключ строки</value> + + 11 + + UUID + + + true + + + true + + + + Длина + + <key>ru</key> + <value>Длина</value> + + 12 + + Number + + 10 + true + + + + true + + + true + + + + МаксимальноеЗначение + + <key>ru</key> + <value>Максимальное значение</value> + + 13 + + Number + + 15 + + + + true + + + true + + + + МинимальноеЗначение + + <key>ru</key> + <value>Минимальное значение</value> + + 14 + + Number + + 15 + + + + true + + + true + + + + ТипЗначения + + <key>ru</key> + <value>Тип значения</value> + + 15 + + TypeDescription + + + true + + + true + + + + ТребуетсяКомментарий + + <key>ru</key> + <value>Требуется комментарий</value> + + 16 + + Boolean + + + true + + + true + + + + ПояснениеКомментария + + <key>ru</key> + <value>Пояснение комментария</value> + + 17 + + String + + 150 + + + + true + + + true + + + + ВопросШаблона + + <key>ru</key> + <value>Вопрос шаблона</value> + + 18 + + CatalogRef.ВопросыШаблонаАнкеты + + + true + + + true + + + + ПолныйКод + + <key>ru</key> + <value>Полный код</value> + + 19 + + String + + 100 + + + + true + + + true + + + + Формулировка + + <key>ru</key> + <value>Формулировка</value> + + 20 + + String + + 300 + + + + true + + + true + + + + Точность + + <key>ru</key> + <value>Точность</value> + + 21 + + Number + + 1 + true + + + + true + + + true + + + + ВысотаЭлементаФормулировкиВопроса + + <key>ru</key> + <value>Высота элемента формулировки вопроса</value> + + 22 + + Number + + 2 + true + + + + true + + + true + + + + РодительВопрос + + <key>ru</key> + <value>Родитель вопрос</value> + + 1 + + CatalogRef.ВопросыШаблонаАнкеты + + + true + + + true + + + + + ТаблицаВопросовРаздела.СоставТабличногоВопроса + + + ЭлементарныйВопрос + + <key>ru</key> + <value>Элементарный вопрос</value> + + 1 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + НомерСтроки + + <key>ru</key> + <value>Номер строки</value> + + 2 + + Number + + 10 + + + + true + + + true + + + + + + ТаблицаВопросовРаздела.ПредопределенныеОтветы + + + Ответ + + <key>ru</key> + <value>Ответ</value> + + 1 + + Characteristic.ВопросыДляАнкетирования + + + true + + + true + + + + ЭлементарныйВопрос + + <key>ru</key> + <value>Элементарный вопрос</value> + + 2 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + НомерСтроки + + <key>ru</key> + <value>Номер строки</value> + + 3 + + Number + + 10 + + + + true + + + true + + + + + + ВариантыОтветовНаВопросы + + <key>ru</key> + <value>Варианты ответов на вопросы</value> + + 9 + + ValueTable + + + true + + + true + + + Вопрос + + <key>ru</key> + <value>Вопрос</value> + + 1 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + Ответ + + <key>ru</key> + <value>Ответ</value> + + 2 + + CatalogRef.ВариантыОтветовАнкет + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Представление</value> + + 3 + + String + + 150 + + + + true + + + true + + + + ТребуетОткрытогоОтвета + + <key>ru</key> + <value>Требует открытого ответа</value> + + 4 + + Boolean + + + true + + + true + + + + + ПодчиненныеВопросы + + <key>ru</key> + <value>Подчиненные вопросы</value> + + 10 + + ValueTable + + + true + + + true + + + Вопрос + + <key>ru</key> + <value>Вопрос</value> + + 1 + + String + + 36 + + + + true + + + true + + + + Подчиненные + + <key>ru</key> + <value>Подчиненные</value> + + 2 + + 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> + + 12 + + ValueTree + + + true + + + true + + + Формулировка + 1 + + String + + 150 + + + + true + + + true + + + + ПолныйКод + + <key>ru</key> + <value>Полный код</value> + + 3 + + String + + 100 + + + + true + + + true + + + + КодКартинки + + <key>ru</key> + <value>Код картинки</value> + + 4 + + Number + + 1 + + + + true + + + true + + + + ТипСтроки + + <key>ru</key> + <value>Тип строки</value> + + 5 + + String + + 20 + + + + true + + + true + + + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 6 + + CatalogRef.ВопросыШаблонаАнкеты + + + true + + + true + + + + КоличествоВопросов + + <key>ru</key> + <value>Количество вопросов</value> + + 2 + + Number + + 10 + + + + true + + + true + + + + + ДобавленныеДинамическиРеквизиты + + <key>ru</key> + <value>Добавленные динамически реквизиты</value> + + 13 + + ValueList + + + true + + + true + + + + String + + + + + + Вступление + + <key>ru</key> + <value>Вступление</value> + + 3 + + String + + + + true + + + true + + + + Заключение + + <key>ru</key> + <value>Заключение</value> + + 14 + + String + + + + true + + + true + + + + НомерТекущегоРаздела + + <key>ru</key> + <value>Номер текущего раздела</value> + + 15 + + Number + + 10 + true + + + + true + + + true + + + + ПредыдущийРазделБезВопросов + + <key>ru</key> + <value>Предыдущий раздел без вопросов</value> + + 11 + + Boolean + + + true + + + true + + + + ИмяЭлементаДляПозиционирования + + <key>ru</key> + <value>Имя элемента для позиционирования</value> + + 16 + + String + + 200 + + + + true + + + true + + + + ФормаЗаполненияЗаписать + + <key>ru</key> + <value>Форма заполнения записать</value> + + 1 + + ru + Записать + + + true + + Ctrl+S + + + ФормаЗаполненияЗаписать + + + true + Auto + Auto + + + ФормаЗаполненияПровестиЗакрыть + + <key>ru</key> + <value>Форма заполнения провести закрыть</value> + + 2 + + ru + Завершить редактирование анкеты и закрыть + + + true + + + + ФормаЗаполненияПровестиЗакрыть + + + Auto + Auto + + + СкрытьПоказатьДеревоРазделов + + <key>ru</key> + <value>Скрыть показать дерево разделов</value> + + 3 + + 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 + + + + ВыборРаздела + + + Auto + Auto + + + + + + + true + +
    diff --git a/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Help/ru.html b/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Help/ru.html new file mode 100644 index 000000000..915e8f8c7 --- /dev/null +++ b/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Help/ru.html @@ -0,0 +1,20 @@ + +

     

    +

    Документ предназначен для ответов на вопросы анкеты.

    +

     

    +
    Форма заполнения:
    +

     

    +

    При открытии документа на форме отображается вступительный текст Анкеты.

    +

    При нажатии кнопки "Показать разделы" в верхнем левом углу формы, будет отображено дерево разделов "Анкеты".

    +

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

    +

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

    +

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

    +

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

    +

     

    +

     

    +
    Завершение редактирования анкеты:
    +

     

    +

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

    +

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

    +

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

    +

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

    \ No newline at end of file diff --git a/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Module.bsl b/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Module.bsl new file mode 100644 index 000000000..31c0ad23c --- /dev/null +++ b/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Module.bsl @@ -0,0 +1,1329 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ + + // Отвечает за построение формы заполнения + &НаСервере + Процедура ПостроениеФормыСогласноРаздела() + + //определение выбранного раздела + ТекущиеДанныеДеревоРазделов = ДеревоРазделов.НайтиПоИдентификатору(Элементы.ДеревоРазделов.ТекущаяСтрока); + Если ТекущиеДанныеДеревоРазделов = Неопределено Тогда + Возврат; + КонецЕсли; + + Если НЕ Элементы.ГруппаТелоАнкеты.ТолькоПросмотр Тогда + ПреобразоватьРезультатыЗаполненияРазделаВТабличнуюЧасть(); + КонецЕсли; + НомерТекущегоРаздела = Элементы.ДеревоРазделов.ТекущаяСтрока; + Анкетирование.ПостроениеФормыЗаполненияПоРазделу(ЭтаФорма,ТекущиеДанныеДеревоРазделов); + УстановитьЗначенияРеквизитовФормыЗаполненияРаздела(); + Анкетирование.СформироватьТаблицуПодчиненияВопросов(ЭтаФорма); + УстановитьОбработчикСобытияПриИзмененииДляВопросов(); + + Элементы.ПредыдущийРазделПодвал.Видимость = (ТаблицаВопросовРаздела.Количество() > 0); + Элементы.СледующийРазделПодвал.Видимость = (ТаблицаВопросовРаздела.Количество() > 0); + + КонецПроцедуры // + + //////////////////////////////////////////////////////////////////////////////// +// УСТАНОВКА ЗНАЧЕНИЙ РЕКВИЗИТОВ ФОРМЫ + + // Устанавливает значения реквизитов формы заполнения, согласно данным ранее ответам + // + &НаСервере + Процедура УстановитьЗначенияРеквизитовФормыЗаполненияРаздела() + + ТаблицаВопросовРаздела.Выгрузить().ВыгрузитьКолонку("ВопросШаблона"); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ВнешнийИсточник.Вопрос КАК Вопрос, + | ВнешнийИсточник.ЭлементарныйВопрос КАК ЭлементарныйВопрос, + | ВнешнийИсточник.НомерЯчейки КАК НомерЯчейки, + | ВнешнийИсточник.Ответ КАК Ответ, + | ВнешнийИсточник.ОткрытыйОтвет КАК ОткрытыйОтвет + |ПОМЕСТИТЬ ТаблицаОтветов + |ИЗ + | &ВнешнийИсточник КАК ВнешнийИсточник + |ГДЕ + | ВнешнийИсточник.Вопрос В(&ВопросыРаздела) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ТаблицаОтветов.Вопрос КАК Вопрос, + | ТаблицаОтветов.ЭлементарныйВопрос КАК ЭлементарныйВопрос, + | ТаблицаОтветов.НомерЯчейки КАК НомерЯчейки, + | ТаблицаОтветов.Ответ КАК Ответ, + | ТаблицаОтветов.ОткрытыйОтвет КАК ОткрытыйОтвет + |ИЗ + | ТаблицаОтветов КАК ТаблицаОтветов + |ИТОГИ ПО + | Вопрос"; + + Запрос.УстановитьПараметр("ВнешнийИсточник",Объект.Состав.Выгрузить()); + Запрос.УстановитьПараметр("ВопросыРаздела",ТаблицаВопросовРаздела.Выгрузить().ВыгрузитьКолонку("ВопросШаблона")); + + Результат = Запрос.Выполнить(); + Если НЕ Результат.Пустой() Тогда + + Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + Пока Выборка.Следующий() Цикл + + ВыборкаВопрос = Выборка.Выбрать(); + УстановитьЗначениеРеквизита(Выборка.Вопрос,ВыборкаВопрос); + + КонецЦикла; + + КонецЕсли; + + Анкетирование.УстановитьЗначенияРеквизитовВариантОтветаОдинИз(ЭтаФорма); + + КонецПроцедуры // + +// Анализирует тип вопроса и вызывает соответствующие процедуры для установки значений реквизита +// +// Параметры +// ВопросШаблона - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// для которого устанавливаются значения реквзитов +// ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов +// на вопрос шаблона анкеты +// ДеревоАнкетыСервер - ДеревоЗначений - дерево значений, содержащее шаблон анкеты +&НаСервере +Процедура УстановитьЗначениеРеквизита(ВопросШаблона,ВыборкаВопрос) + + НайденныеСтроки = ТаблицаВопросовРаздела.НайтиСтроки(Новый Структура("ВопросШаблона",ВопросШаблона)); + + Если НайденныеСтроки.Количество() > 0 Тогда + НайденнаяСтрока = НайденныеСтроки[0]; + Если НайденнаяСтрока.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда + УстановитьЗначениеРеквизитаТабличныйВопрос(ВопросШаблона,ВыборкаВопрос,НайденнаяСтрока); + Иначе + УстановитьЗначениеРеквизитаПростойВопрос(ВопросШаблона,ВыборкаВопрос,НайденнаяСтрока); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры // + +// Устанавливает значения реквизитов простого вопроса +// +// Параметры +// Вопрос - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// для которого устанавливаются значения реквзитов +// ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов +// на вопрос шаблона анкеты +// СтрокаДерева - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты +&НаСервере +Процедура УстановитьЗначениеРеквизитаПростойВопрос(Вопрос,ВыборкаВопрос,СтрокаДерева) + + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки); + + Если СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда + + ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос,ЭтаФорма); + + Пока ВыборкаВопрос.Следующий() Цикл + + ПараметрыОтвета = НайтиОтветВМассиве(ВыборкаВопрос.Ответ,ВариантыОтветовНаВопрос); + + Если ПараметрыОтвета <> Неопределено Тогда + ЭтаФорма[ИмяВопроса + "_Реквизит_" + ПараметрыОтвета.ПорядковыйНомерРеквзита] = Истина; + Если ПараметрыОтвета.ТребуетОткрытогоОтвета Тогда + + ЭтаФорма[ИмяВопроса + "_Комментарий_" + ПараметрыОтвета.ПорядковыйНомерРеквзита] = ВыборкаВопрос.ОткрытыйОтвет; + + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + Иначе + + Если ВыборкаВопрос.Следующий() Тогда + + Если СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Текст Тогда + + ЭтаФорма[ИмяВопроса] = ВыборкаВопрос.ОткрытыйОтвет; + + Иначе + + ЭтаФорма[ИмяВопроса] = ВыборкаВопрос.Ответ; + + Если (СтрокаДерева.ТребуетсяКомментарий) Тогда + ЭтаФорма[ИмяВопроса + "_Комментарий"] = ВыборкаВопрос.ОткрытыйОтвет; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры // + +// Анализирует тип табличного вопроса и вызывает соответствующие процедуры для установки значений реквизитов +// +// Параметры +// Вопрос - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// для которого устанавливаются значения реквзитов +// ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов +// на вопрос шаблона анкеты +// СтрокаДерева - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты +&НаСервере +Процедура УстановитьЗначениеРеквизитаТабличныйВопрос(Вопрос,ВыборкаВопрос,СтрокаДерева) + + Если СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Тогда + + УстановитьЗначенияРеквизитаТабличныйВопросСоставной(Вопрос,ВыборкаВопрос,СтрокаДерева); + + ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда + + УстановитьЗначенияРеквизитаТабличныйВопросОтветыВСтроках(Вопрос,ВыборкаВопрос,СтрокаДерева); + + ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда + + УстановитьЗначенияРеквизитаТабличныйВопросОтветыВКолонках(Вопрос,ВыборкаВопрос,СтрокаДерева); + + ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + + УстановитьЗначенияРеквизитаТабличныйВопросОтветыВСтрокахКолонках(Вопрос,ВыборкаВопрос,СтрокаДерева); + + КонецЕсли; + +КонецПроцедуры // + +// Устанавливает значения реквизитов составного табличного вопроса +// +// Параметры +// Вопрос - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// для которого устанавливаются значения реквзитов +// ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов +// на вопрос шаблона анкеты +// СтрокаДерева - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты +&НаСервере +Процедура УстановитьЗначенияРеквизитаТабличныйВопросСоставной(Вопрос,ВыборкаВопрос,СтрокаДерева); + + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки); + ИмяТаблицы = ИмяВопроса + "_Таблица"; + Таблица = РеквизитФормыВЗначение(ИмяТаблицы); + + МассивВопросы = СтрокаДерева.СоставТабличногоВопроса.Выгрузить().ВыгрузитьКолонку("ЭлементарныйВопрос"); + + Пока ВыборкаВопрос.Следующий() Цикл + + Если ВыборкаВопрос.НомерЯчейки > Таблица.Количество() Тогда + ДобавитьСтрокиВТаблицу(Таблица,ВыборкаВопрос.НомерЯчейки - Таблица.Количество()); + КонецЕсли; + + НомерВопросаВМассиве = МассивВопросы.Найти(ВыборкаВопрос.ЭлементарныйВопрос); + Если НомерВопросаВМассиве <> Неопределено Тогда + Таблица[ВыборкаВопрос.НомерЯчейки - 1][НомерВопросаВМассиве] = ВыборкаВопрос.Ответ; + КонецЕсли; + + КонецЦикла; + + ЗначениеВРеквизитФормы(Таблица,ИмяТаблицы); + +КонецПроцедуры + +// Устанавливает значения реквизитов табличного вопроса с предопределенными ответами в строках +// +// Параметры +// Вопрос - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// для которого устанавливаются значения реквзитов +// ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов +// на вопрос шаблона анкеты +// СтрокаДерева - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты +&НаСервере +Процедура УстановитьЗначенияРеквизитаТабличныйВопросОтветыВСтроках(Вопрос,ВыборкаВопрос,СтрокаДерева); + + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки); + ИмяТаблицы = ИмяВопроса + "_Таблица"; + Таблица = РеквизитФормыВЗначение(ИмяТаблицы); + + МассивВопросы = СтрокаДерева.СоставТабличногоВопроса.Выгрузить().ВыгрузитьКолонку("ЭлементарныйВопрос"); + + Пока ВыборкаВопрос.Следующий() Цикл + + НомерВопросаВМассиве = МассивВопросы.Найти(ВыборкаВопрос.ЭлементарныйВопрос); + Если (НомерВопросаВМассиве <> Неопределено) И (ВыборкаВопрос.НомерЯчейки <= Таблица.Количество()) Тогда + Таблица[ВыборкаВопрос.НомерЯчейки - 1][НомерВопросаВМассиве] = ВыборкаВопрос.Ответ; + КонецЕсли; + + КонецЦикла; + + ЗначениеВРеквизитФормы(Таблица,ИмяТаблицы); + +КонецПроцедуры + +// Устанавливает значения реквизитов табличного вопроса с предопределенными ответами в колонках +// +// Параметры +// Вопрос - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// для которого устанавливаются значения реквзитов +// ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов +// на вопрос шаблона анкеты +// СтрокаДерева - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты +&НаСервере +Процедура УстановитьЗначенияРеквизитаТабличныйВопросОтветыВКолонках(Вопрос,ВыборкаВопрос,СтрокаДерева); + + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки); + ИмяТаблицы = ИмяВопроса + "_Таблица"; + Таблица = РеквизитФормыВЗначение(ИмяТаблицы); + + МассивВопросы = СтрокаДерева.СоставТабличногоВопроса.Выгрузить().ВыгрузитьКолонку("ЭлементарныйВопрос"); + МассивВопросы.Удалить(0); + + Пока ВыборкаВопрос.Следующий() Цикл + + НомерВопросаВМассиве = МассивВопросы.Найти(ВыборкаВопрос.ЭлементарныйВопрос); + Если (НомерВопросаВМассиве <> Неопределено) Тогда + Если (НомерВопросаВМассиве <= Таблица.Количество()) И (ВыборкаВопрос.НомерЯчейки <= Таблица.Колонки.Количество()) Тогда + Таблица[НомерВопросаВМассиве][ВыборкаВопрос.НомерЯчейки] = ВыборкаВопрос.Ответ; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + ЗначениеВРеквизитФормы(Таблица,ИмяТаблицы); + +КонецПроцедуры // () + +// Устанавливает значения реквизитов табличного вопроса с предопределенными ответами в строках и колонках +// +// Параметры +// Вопрос - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// для которого устанавливаются значения реквзитов +// ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов +// на вопрос шаблона анкеты +// СтрокаДерева - СтрокаДереваЗначений - строка дерева значений, содержащая данные вопроса шаблона анкеты +&НаСервере +Процедура УстановитьЗначенияРеквизитаТабличныйВопросОтветыВСтрокахКолонках(Вопрос,ВыборкаВопрос,СтрокаДерева) + + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки); + ИмяТаблицы = ИмяВопроса + "_Таблица"; + Таблица = РеквизитФормыВЗначение(ИмяТаблицы); + КоличествоКолонок = Таблица.Колонки.Количество(); + КоличествоСтрока = Таблица.Количество(); + + ВопросЯчейка = СтрокаДерева.СоставТабличногоВопроса[2].ЭлементарныйВопрос; + + Пока ВыборкаВопрос.Следующий() Цикл + Если ВыборкаВопрос.ЭлементарныйВопрос = ВопросЯчейка Тогда + НомерКолонки = ?(ВыборкаВопрос.НомерЯчейки%(КоличествоКолонок - 1)=0,КоличествоКолонок - 1,ВыборкаВопрос.НомерЯчейки%(КоличествоКолонок - 1)); + НомерСтроки = ЦЕЛ((ВыборкаВопрос.НомерЯчейки + ЦЕЛ(ВыборкаВопрос.НомерЯчейки/КоличествоКолонок))/КоличествоКолонок); + Таблица[НомерСтроки ][НомерКолонки] = ВыборкаВопрос.Ответ; + КонецЕсли; + КонецЦикла; + + ЗначениеВРеквизитФормы(Таблица,ИмяТаблицы); + +КонецПроцедуры // () + +//////////////////////////////////////////////////////////////////////////////// +// ПРЕОБРАЗОВАНИЕ РЕЗУЛЬТОВ ЗАПОЛНЕНИЯ АНКЕТЫ В ТАБЛИЧНУЮ ЧАСТЬ ДОКУМЕНТА + +&НаСервере +Функция ОкончаниеРедактированиеФормыЗаполнения(РежимЗаписи) + + ПреобразоватьРезультатыЗаполненияРазделаВТабличнуюЧасть(); + Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда + Если ПроверитьЗаполнениеАнкеты() Тогда + Возврат Истина; + КонецЕсли; + КонецЕсли; + + ДокументОбъект = РеквизитФормыВЗначение("Объект"); + ДокументОбъект.Заблокировать(); + ДокументОбъект.ДатаРедактирования = ТекущаяДата(); + ДокументОбъект.Записать(РежимЗаписи); + Если РежимЗаписи = РежимЗаписиДокумента.Запись Тогда + ЗначениеВРеквизитФормы(ДокументОбъект,"Объект"); + Модифицированность = Ложь; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + + // Преобразовает данные в форме заполнения ответы в данные табличной части + // + &НаСервере + Процедура ПреобразоватьРезультатыЗаполненияРазделаВТабличнуюЧасть() + + ТекущийРаздел = ДеревоРазделов.НайтиПоИдентификатору(Элементы.ДеревоРазделов.ТекущаяСтрока); + Если ТекущийРаздел <> Неопределено Тогда + Если ТекущийРаздел.ТипСтроки = "Раздел" Тогда + Объект.РедактируемыйРаздел = ТекущийРаздел.Ссылка; + Иначе + Объект.РедактируемыйРаздел = ТекущийРаздел.ТипСтроки; + КонецЕсли; + КонецЕсли; + + ПредыдущийРазделБезВопросов = (ТаблицаВопросовРаздела.Количество() = 0); + + Для каждого СтрокаТаблицы Из ТаблицаВопросовРаздела Цикл + + //Удаление из табличной части предыдущей информации + НайденныеСтроки = Объект.Состав.НайтиСтроки(Новый Структура("Вопрос",СтрокаТаблицы.ВопросШаблона)); + Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл + Объект.Состав.Удалить(НайденнаяСтрока); + КонецЦикла; + + Если ЗначениеЗаполнено(СтрокаТаблицы.РодительВопрос) Тогда + НайденныеСтроки = ТаблицаВопросовРаздела.НайтиСтроки(Новый Структура("ВопросШаблона",СтрокаТаблицы.РодительВопрос)); + Если НайденныеСтроки.Количество() > 0 Тогда + СтрокаРодитель = НайденныеСтроки[0]; + Если (НЕ ЭтаФорма[АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаРодитель.КлючСтроки)] = Истина) Тогда + Продолжить; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если СтрокаТаблицы.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда + ЗаполнитьТаблицуОтветовТабличныйВопрос(СтрокаТаблицы); + Иначе + ЗаполнитьОтветПростойВопрос(СтрокаТаблицы); + КонецЕсли; + + КонецЦикла; + + КонецПроцедуры // () + +// Анализирует тип табличного вопроса и вызывает соответствующую процедуру для +// получения ответов, данных респондентом на табличный вопрос +// +// Параметры +// СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты +// +&НаСервере +Процедура ЗаполнитьТаблицуОтветовТабличныйВопрос(СтрокаДерева) + + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки); + ИмяТаблицы = ИмяВопроса + "_Таблица"; + Таблица = РеквизитФормыВЗначение(ИмяТаблицы); + + Если Таблица.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Если СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Тогда + + ЗаполнитьОтветыТабличныйВопросСоставной(СтрокаДерева,Таблица); + + ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда + + ЗаполнитьОтветыТабличныйВопросОтветыВСтроках(СтрокаДерева,Таблица); + + ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда + + ЗаполнитьОтветыТабличныйВопросОтветыВКолонках(СтрокаДерева,Таблица); + + ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + + ЗаполнитьОтветыТабличныйВопросОтветыВСтрокахИКолонках(СтрокаДерева,Таблица); + + КонецЕсли; + +КонецПроцедуры // () + +//Получает ответы, данные респондентом на составной табличный вопрос и аккумулирует их в общей +// таблице ответов. +// +// Параметры +// СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты +// Таблица - ТаблицаЗначений - таблица табличного вопроса +// +&НаСервере +Процедура ЗаполнитьОтветыТабличныйВопросСоставной(СтрокаДерева,Таблица) + + Для ИндексКолонки = 0 По СтрокаДерева.СоставТабличногоВопроса.Количество()-1 Цикл + + Для ИндексСтроки = 0 По Таблица.Количество() - 1 Цикл + + Ответ = Таблица[ИндексСтроки][ИндексКолонки]; + Если ЗначениеЗаполнено(Ответ) Тогда + + НоваяСтрока = Объект.Состав.Добавить(); + НоваяСтрока.Вопрос = СтрокаДерева.ВопросШаблона; + НоваяСтрока.ЭлементарныйВопрос = СтрокаДерева.СоставТабличногоВопроса[ИндексКолонки].ЭлементарныйВопрос; + НоваяСтрока.Ответ = Ответ; + НоваяСтрока.НомерЯчейки = ИндексСтроки + 1; + + КонецЕсли; + КонецЦикла; + КонецЦикла; + +КонецПроцедуры // () + +//Получает ответы, данные респондентом на табличный вопрос с предопределенными ответами в строках и +// аккумулирует их в общей таблице ответов. +// +// Параметры +// СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты +// Таблица - ТаблицаЗначений - таблица табличного вопроса +// +&НаСервере +Процедура ЗаполнитьОтветыТабличныйВопросОтветыВСтроках(СтрокаДерева,Таблица) + + ВопросПерваяКолонка = СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос; + + Для ИндексСтроки = 0 По Таблица.Количество() - 1 Цикл + + ЕстьХотяБыОдинОтветУказанныйРеспондентом = ЛОЖЬ; + + Для ИндексКолонки = 1 По СтрокаДерева.СоставТабличногоВопроса.Количество()-1 Цикл + + Ответ = Таблица[ИндексСтроки][ИндексКолонки]; + Если ЗначениеЗаполнено(Ответ) Тогда + + ЕстьХотяБыОдинОтветУказанныйРеспондентом = Истина; + + НоваяСтрока = Объект.Состав.Добавить(); + НоваяСтрока.Вопрос = СтрокаДерева.ВопросШаблона; + НоваяСтрока.ЭлементарныйВопрос = СтрокаДерева.СоставТабличногоВопроса[ИндексКолонки].ЭлементарныйВопрос; + НоваяСтрока.Ответ = Ответ; + НоваяСтрока.НомерЯчейки = ИндексСтроки + 1; + + КонецЕсли; + + КонецЦикла; + + Если ЕстьХотяБыОдинОтветУказанныйРеспондентом Тогда + + Ответ = Таблица[ИндексСтроки][0]; + Если ЗначениеЗаполнено(Ответ) Тогда + + НоваяСтрока = Объект.Состав.Добавить(); + НоваяСтрока.Вопрос = СтрокаДерева.ВопросШаблона; + НоваяСтрока.ЭлементарныйВопрос = ВопросПерваяКолонка; + НоваяСтрока.Ответ = Ответ; + НоваяСтрока.НомерЯчейки = ИндексСтроки + 1; + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // () + +//Получает ответы, данные респондентом на табличный вопрос с предопределенными ответами в строках и колонках и +// аккумулирует их в общейтаблице ответов. +// +// Параметры +// СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты +// Таблица - ТаблицаЗначений - таблица табличного вопроса +// +&НаСервере +Процедура ЗаполнитьОтветыТабличныйВопросОтветыВСтрокахИКолонках(СтрокаДерева,Таблица) + + ВопросДляСтрок = СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос; + ВопросДляКолонок = СтрокаДерева.СоставТабличногоВопроса[1].ЭлементарныйВопрос; + ВопросДляЯчеек = СтрокаДерева.СоставТабличногоВопроса[2].ЭлементарныйВопрос; + + ОтветыСтроки = СтрокаДерева.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ВопросДляСтрок)); + ОтветыКолонки = СтрокаДерева.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ВопросДляКолонок)); + + Для ИндексСтроки = 0 По Таблица.Количество() - 1 Цикл + Для ИндексКолонки = 1 По Таблица.Колонки.Количество() - 1 Цикл + + Ответ = Таблица[ИндексСтроки][ИндексКолонки]; + Если ЗначениеЗаполнено(Ответ) Тогда + + НомерЯчейки = ИндексКолонки + ИндексСтроки * (Таблица.Колонки.Количество() - 1) ; + + НоваяСтрока = Объект.Состав.Добавить(); + НоваяСтрока.Вопрос = СтрокаДерева.ВопросШаблона; + НоваяСтрока.ЭлементарныйВопрос = ВопросДляСтрок; + НоваяСтрока.Ответ = ОтветыСтроки[ИндексСтроки].Ответ; + НоваяСтрока.НомерЯчейки = НомерЯчейки; + + НоваяСтрока = Объект.Состав.Добавить(); + НоваяСтрока.Вопрос = СтрокаДерева.ВопросШаблона; + НоваяСтрока.ЭлементарныйВопрос = ВопросДляКолонок; + НоваяСтрока.Ответ = ОтветыКолонки[ИндексКолонки - 1].Ответ; + НоваяСтрока.НомерЯчейки = НомерЯчейки; + + НоваяСтрока = Объект.Состав.Добавить(); + НоваяСтрока.Вопрос = СтрокаДерева.ВопросШаблона; + НоваяСтрока.ЭлементарныйВопрос = ВопросДляЯчеек; + НоваяСтрока.Ответ = Ответ; + НоваяСтрока.НомерЯчейки = НомерЯчейки; + + КонецЕсли; + КонецЦикла; + КонецЦикла; + +КонецПроцедуры // + +//Получает ответы, данные респондентом на табличный вопрос с предопределенными ответами в колонках и +// аккамулирует их в общей таблице ответов. +// +// Параметры +// СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты +// Таблица - ТаблицаЗначений - таблица табличного вопроса +// +&НаСервере +Процедура ЗаполнитьОтветыТабличныйВопросОтветыВКолонках(СтрокаДерева,Таблица) + + ВопросДляКолонок = СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос; + + Для ИндексКолонки = 1 По Таблица.Колонки.Количество() - 1 Цикл + + ЕстьХотяБыОдинОтветУказанныйРеспондентом = ЛОЖЬ; + + Для ИндексСтроки = 0 По Таблица.Количество() - 1 Цикл + + Ответ = Таблица[ИндексСтроки][ИндексКолонки]; + Если ЗначениеЗаполнено(Ответ) Тогда + + ЕстьХотяБыОдинОтветУказанныйРеспондентом = Истина; + + НоваяСтрока = Объект.Состав.Добавить(); + НоваяСтрока.Вопрос = СтрокаДерева.ВопросШаблона; + НоваяСтрока.ЭлементарныйВопрос = СтрокаДерева.СоставТабличногоВопроса[ИндексСтроки+1].ЭлементарныйВопрос; + НоваяСтрока.Ответ = Ответ; + НоваяСтрока.НомерЯчейки = ИндексКолонки; + + КонецЕсли; + + КонецЦикла; + + Если ЕстьХотяБыОдинОтветУказанныйРеспондентом Тогда + + НоваяСтрока = Объект.Состав.Добавить(); + НоваяСтрока.Вопрос = СтрокаДерева.ВопросШаблона; + НоваяСтрока.ЭлементарныйВопрос = ВопросДляКолонок; + НоваяСтрока.Ответ = СтрокаДерева.ПредопределенныеОтветы[ИндексКолонки - 1].Ответ; + НоваяСтрока.НомерЯчейки = ИндексКолонки; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // () + +//Получает ответы, данные респондентом на простой вопрос и +// аккамулирует их в общей таблице ответов. +// +// Параметры +// СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты +// +&НаСервере +Процедура ЗаполнитьОтветПростойВопрос(СтрокаДерева) + + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки); + + Если СтрокаДерева.ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда + + Ответ = ЭтаФорма[ИмяВопроса]; + Если ЗначениеЗаполнено(Ответ) Тогда + + НоваяСтрока = Объект.Состав.Добавить(); + НоваяСтрока.Вопрос = СтрокаДерева.ВопросШаблона; + НоваяСтрока.ЭлементарныйВопрос = СтрокаДерева.ЭлементарныйВопрос; + Если СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Текст Тогда + НоваяСтрока.ОткрытыйОтвет = Ответ; + Иначе + НоваяСтрока.Ответ = Ответ; + Если СтрокаДерева.ТребуетсяКомментарий Тогда + НоваяСтрока.ОткрытыйОтвет = ЭтаФорма[ИмяВопроса + "_Комментарий"]; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Иначе + + ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос,ЭтаФорма); + + Счётчик = 0; + Для каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл + + Счётчик = Счётчик + 1; + ИмяРеквизита = ИмяВопроса + "_Реквизит_" + Счётчик; + + Если ЭтаФорма[ИмяРеквизита] Тогда + + НоваяСтрока = Объект.Состав.Добавить(); + НоваяСтрока.Вопрос = СтрокаДерева.ВопросШаблона; + НоваяСтрока.ЭлементарныйВопрос = СтрокаДерева.ЭлементарныйВопрос; + НоваяСтрока.Ответ = ВариантОтвета.Ответ; + НоваяСтрока.НомерЯчейки = Счётчик; + Если ВариантОтвета.ТребуетОткрытогоОтвета Тогда + НоваяСтрока.ОткрытыйОтвет = ЭтаФорма[ИмяВопроса + "_Комментарий_" + Счётчик]; + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры // () + + //////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +// Добавляет пустые элементы в Коллекцию +// +// Параметры +// Таблица - Коллекция - коллеция в которую добавляются строки +// ЧислоСтрок - Число - число добавляемых строк +// +&НаСервереБезКонтекста +Процедура ДобавитьСтрокиВТаблицу(Коллекция,ЧислоСтрок); + + Для инд = 1 По ЧислоСтрок Цикл + Коллекция.Добавить(); + КонецЦикла; + +КонецПроцедуры + +// Проверяет, даны ли ответы на обязательные вопросы +// +// Возвращаемое значение: +// Булево - Истина, в случае если проверка заполнения обязательных ответов закончилась неудачей, +// Ложь, в обратном случае. +&НаСервере +Функция ПроверитьЗаполнениеАнкеты() + + Отказ = Ложь; + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | СоставОтветов.Вопрос, + | СоставОтветов.ЭлементарныйВопрос, + | СоставОтветов.НомерЯчейки, + | СоставОтветов.Ответ, + | СоставОтветов.ОткрытыйОтвет + |ПОМЕСТИТЬ СоставОтветов + |ИЗ + | &ВнешнийИсточник КАК СоставОтветов + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВопросыБезОтветов.Ссылка + |ПОМЕСТИТЬ ОбязательныеВопросыБезОтветов + |ИЗ + | (ВЫБРАТЬ + | ВопросыШаблонаАнкеты.Ссылка КАК Ссылка, + | СУММА(ВЫБОР + | КОГДА СоставОтветов.Ответ ЕСТЬ NULL + | ТОГДА 0 + | ИНАЧЕ 1 + | КОНЕЦ) КАК КоличествоОтветов + | ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + | ЛЕВОЕ СОЕДИНЕНИЕ СоставОтветов КАК СоставОтветов + | ПО (СоставОтветов.Вопрос = ВопросыШаблонаАнкеты.Ссылка) + | ГДЕ + | ВопросыШаблонаАнкеты.Обязательный + | И (НЕ ВопросыШаблонаАнкеты.ПометкаУдаления) + | И (НЕ ВопросыШаблонаАнкеты.ЭтоГруппа) + | И ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты + | И ВопросыШаблонаАнкеты.РодительВопрос = ЗНАЧЕНИЕ(Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка) + | + | СГРУППИРОВАТЬ ПО + | ВопросыШаблонаАнкеты.Ссылка + | + | ИМЕЮЩИЕ + | СУММА(ВЫБОР + | КОГДА СоставОтветов.Ответ ЕСТЬ NULL + | ТОГДА 0 + | ИНАЧЕ 1 + | КОНЕЦ) = 0 + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ВопросыШаблонаАнкеты.Ссылка, + | СУММА(ВЫБОР + | КОГДА СоставОтветов.Ответ ЕСТЬ NULL + | ТОГДА 0 + | ИНАЧЕ 1 + | КОНЕЦ) + | ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + | ЛЕВОЕ СОЕДИНЕНИЕ СоставОтветов КАК СоставОтветов + | ПО ВопросыШаблонаАнкеты.Ссылка = СоставОтветов.Вопрос + | ГДЕ + | ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты + | И (НЕ ВопросыШаблонаАнкеты.ПометкаУдаления) + | И (НЕ ВопросыШаблонаАнкеты.ЭтоГруппа) + | И ВопросыШаблонаАнкеты.РодительВопрос <> ЗНАЧЕНИЕ(Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка) + | И ВопросыШаблонаАнкеты.РодительВопрос В + | (ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВложенныйЗапрос.Ссылка + | ИЗ + | (ВЫБРАТЬ + | ВопросыШаблонаАнкеты.Ссылка КАК Ссылка, + | ЕСТЬNULL(СоставОтветов.Ответ, ЛОЖЬ) КАК Ответ + | ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты ЛЕВОЕ СОЕДИНЕНИЕ СоставОтветов КАК СоставОтветов + | ПО + | ВопросыШаблонаАнкеты.Ссылка = СоставОтветов.Вопрос + | ГДЕ + | ВопросыШаблонаАнкеты.ТипВопроса = ЗНАЧЕНИЕ(Перечисление.ТипыВопросовШаблонаАнкеты.ВопросСУсловием) + | И (НЕ ВопросыШаблонаАнкеты.ПометкаУдаления) + | И (НЕ ВопросыШаблонаАнкеты.ЭтоГруппа) + | И ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты + | И ЕСТЬNULL(СоставОтветов.Ответ, ЛОЖЬ) = ИСТИНА + | ) КАК ВложенныйЗапрос) + | И ВопросыШаблонаАнкеты.Обязательный + | + | СГРУППИРОВАТЬ ПО + | ВопросыШаблонаАнкеты.Ссылка + | + | ИМЕЮЩИЕ + | СУММА(ВЫБОР + | КОГДА СоставОтветов.Ответ ЕСТЬ NULL + | ТОГДА 0 + | ИНАЧЕ 1 + | КОНЕЦ) = 0) КАК ВопросыБезОтветов + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВопросыШаблонаАнкеты.Ссылка, + | ВопросыШаблонаАнкеты.Формулировка + |ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + |ГДЕ + | ВопросыШаблонаАнкеты.Ссылка В + | (ВЫБРАТЬ + | ОбязательныеВопросыБезОтветов.Ссылка + | ИЗ + | ОбязательныеВопросыБезОтветов КАК ОбязательныеВопросыБезОтветов) + | + |УПОРЯДОЧИТЬ ПО + | ВопросыШаблонаАнкеты.Ссылка"; + + Запрос.УстановитьПараметр("ВнешнийИсточник",Объект.Состав.Выгрузить()); + Запрос.УстановитьПараметр("ШаблонАнкеты",ШаблонАнкеты); + + Результат = Запрос.Выполнить(); + Если Результат.Пустой() Тогда + Возврат Ложь; + КонецЕсли; + + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='Не указан ответ на вопрос - '") + СтрЗаменить(Выборка.Ссылка.ПолныйКод(),"/",".") + " " + Выборка.Формулировка); + КонецЦикла; + + Возврат Истина; + +КонецФункции // ПроверитьЗаполнениеАнкеты() + +// Находит ответ в массиве содержащем строки таблицы значений +// +// Параметры +// Ответ - Характеристика.ВопросыДляАнкетирования - ответ, который ищем. +// МассивОтветов - Массив - масссив строк таблицы значений +// +// Возвращаемое значение: +// Структура - в структуре содержатся номер реквизита и признак необходимости открытого ответа. +// +&НаСервереБезКонтекста +Функция НайтиОтветВМассиве(Ответ,МассивОтветов) + + СтруктураВозврата = Новый Структура; + + Для инд = 1 По МассивОтветов.Количество() Цикл + + Если МассивОтветов[инд - 1].Ответ = Ответ Тогда + + СтруктураВозврата.Вставить("ПорядковыйНомерРеквзита",инд); + СтруктураВозврата.Вставить("ТребуетОткрытогоОтвета",МассивОтветов[инд - 1].ТребуетОткрытогоОтвета); + Возврат СтруктураВозврата; + КонецЕсли; + + КонецЦикла; + + Возврат Неопределено; + +КонецФункции // () + +&НаСервере +Процедура УстановитьЗначенияРеквизитовСогласноОпросу(РеквизитыОпрос) + + ВозможностьПредварительногоСохранения = РеквизитыОпрос.ВозможностьПредварительногоСохранения; + ШаблонАнкеты = РеквизитыОпрос.ШаблонАнкеты; + Вступление = РеквизитыОпрос.Вступление; + Заключение = РеквизитыОпрос.Заключение; + +КонецПроцедуры + +//Получает необходимые значения реквизита согласно выбранному опросу +&НаСервере +Функция ПолучитьЗначенияРеквизитовНазначениеОпроса(Опрос) + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | НазначениеОпросов.ШаблонАнкеты, + | НазначениеОпросов.ТипРеспондентов, + | НазначениеОпросов.ВозможностьПредварительногоСохранения, + | НазначениеОпросов.Респонденты.( + | Ссылка, + | НомерСтроки, + | Респондент + | ), + | ШаблоныАнкет.Заголовок, + | ШаблоныАнкет.Вступление, + | ШаблоныАнкет.Заключение + |ИЗ + | Документ.НазначениеОпросов КАК НазначениеОпросов + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ШаблоныАнкет КАК ШаблоныАнкет + | ПО НазначениеОпросов.ШаблонАнкеты = ШаблоныАнкет.Ссылка + |ГДЕ + | НазначениеОпросов.Ссылка = &Опрос"; + + Запрос.УстановитьПараметр("Опрос",Опрос); + + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + Возврат Выборка; + +КонецФункции // + +//Устанавливает значения заголовков и надписей +&НаСервере +Процедура УстановитьЗаголовкиНадписей(РеквизитыОпрос) + + Заголовок = РеквизитыОпрос.Заголовок; + Элементы.НадписьВступление.Заголовок = РеквизитыОпрос.Вступление; + Вступление = РеквизитыОпрос.Вступление; + +КонецПроцедуры // () + +//Управляет доступностью элементов формы +&НаКлиенте +Процедура УправлениеДоступностьюПодчиненныеВопросы(УстанавливатьМодифицированность = Истина) + + Для каждого ЭлементКоллекции Из ПодчиненныеВопросы Цикл + + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(ЭлементКоллекции.Вопрос); + + Для каждого ПодчиненныйВопрос Из ЭлементКоллекции.Подчиненные Цикл + + Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса].ТолькоПросмотр = (НЕ ЭтаФорма[ИмяВопроса]); + Если СтрЧислоВхождений(ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса,"Реквизит") = 0 Тогда + + //У флажка и переключателя нет свойства АвтоотметкаНезаполенного. + Попытка + Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса].АвтоотметкаНезаполненного = (ЭтаФорма[ИмяВопроса] И ПодчиненныйВопрос.Обязательный); + Исключение + КонецПопытки; + + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Если ВозможностьПредварительногоСохранения И УстанавливатьМодифицированность Тогда + Модифицированность = Истина; + КонецЕсли; + + ОтключитьОтметкуНезаполненного(); + +КонецПроцедуры // УправлениеДоступностью() + +//Устанавливает доступность и видимость реквзитов в зависимости от вида формы +&НаСервере +Процедура ДействияВЗависимостиОтВидаФормы() + + Если Параметры.Свойство("ТолькоФормаЗаполнения") Тогда + + Элементы.ГруппаОсновныеРеквизиты.Видимость = Ложь; + Элементы.Дата.Доступность = Ложь; + Элементы.ФормаКоманднаяПанельПровестиИЗакрыть.Видимость = Ложь; + Элементы.ФормаКоманднаяПанельЗаписать.Видимость = Ложь; + Если Объект.Ссылка.Пустая() Тогда + Объект.Дата = ТекущаяДата(); + КонецЕсли; + + Если Параметры.ТолькоПросмотр = Истина Тогда + + Элементы.ГруппаТелоАнкеты.ТолькоПросмотр = Истина; + Элементы.ФормаЗаполненияПровестиЗакрыть.Видимость = Ложь; + Элементы.ФормаЗаполненияЗаписать.Видимость = Ложь; + + Иначе + + Элементы.ФормаЗаполненияЗаписать.Видимость = ВозможностьПредварительногоСохранения; + + КонецЕсли; + + Модифицированность = Ложь; + + Иначе + + Элементы.ФормаЗаполненияПровестиЗакрыть.Видимость = Ложь; + Элементы.ФормаЗаполненияЗаписать.Видимость = Ложь; + Элементы.ГруппаТелоАнкеты.ТолькоПросмотр = Истина; + Элементы.ГруппаОсновныеРеквизиты.ТолькоПросмотр = Истина; + + КонецЕсли; + +КонецПроцедуры // () + +//Устанваливает обработчик события при изменения для простых и табличных вопросов +&НаСервере +Процедура УстановитьОбработчикСобытияПриИзмененииДляВопросов() + + Если Не ВозможностьПредварительногоСохранения Тогда + Возврат; + КонецЕсли; + + Для каждого СтрокаТаблицы Из ТаблицаВопросовРаздела Цикл + + Если СтрокаТаблицы.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.ВопросСУсловием Тогда + Продолжить; + КонецЕсли; + + ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаТаблицы.КлючСтроки); + + Если СтрокаТаблицы.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда + Элементы[ИмяВопроса + "_Таблица"].УстановитьДействие("ПриИзменении","ПриИзмененииВопроса"); + Иначе + Если СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда + ВариантыОтветовНаВопрос = Анкетирование.ПолучитьВариантыОтветовНаВопрос(СтрокаТаблицы.ЭлементарныйВопрос,ЭтаФорма); + Для инд = 1 По ВариантыОтветовНаВопрос.Количество() Цикл + Элементы[ИмяВопроса + "_Реквизит_" + инд].УстановитьДействие("ПриИзменении","ПриИзмененииВопроса"); + Если ВариантыОтветовНаВопрос[инд-1].ТребуетОткрытогоОтвета Тогда + Элементы[ИмяВопроса + "_Комментарий_" + инд].УстановитьДействие("ПриИзменении","ПриИзмененииВопроса"); + КонецЕсли; + КонецЦикла; + Иначе + Элементы[ИмяВопроса].УстановитьДействие("ПриИзменении","ПриИзмененииВопроса"); + Если СтрокаТаблицы.ТребуетсяКомментарий Тогда + Элементы[ИмяВопроса + "_Комментарий"].УстановитьДействие("ПриИзменении","ПриИзмененииВопроса"); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры // () + + // Начинает процесс построения формы заполнения согласно разделам + &НаКлиенте + Процедура ВыполнитьПостроениеФормыЗаполнения() + + Элементы.ГруппаСтраницыФормаЗаполнения.ТекущаяСтраница = Элементы.СтраницаОжидание; + ПодключитьОбработчикОжидания("ОкончаниеПостроенияФормыЗаполнения",0.1,Истина); + + КонецПроцедуры // + +// Заканчивает формирование формы заполнения анкеты + &НаКлиенте + Процедура ОкончаниеПостроенияФормыЗаполнения() + + ПостроениеФормыСогласноРаздела(); + УправлениеДоступностьюПодчиненныеВопросы(ПредыдущийРазделБезВопросов = Ложь); + Элементы.ГруппаСтраницыФормаЗаполнения.ТекущаяСтраница = Элементы.ГруппаТелоАнкеты; + УправлениеДоступностьюКнопкиНавигацияРазделов(); + + ЭлементДляПозиционирования = Элементы.Найти(ИмяЭлементаДляПозиционирования); + Если ЭлементДляПозиционирования <> Неопределено Тогда + ТекущийЭлемент = ЭлементДляПозиционирования; + КонецЕсли; + + КонецПроцедуры // () + +// Изменяет видимость дерева разделов +&НаКлиенте +Процедура ИзменитьВидимостьДеревоРазделов() + + Элементы.ГруппаДеревоРазделов.Видимость = НЕ Элементы.ГруппаДеревоРазделов.Видимость; + Элементы.СкрытьПоказатьДеревоРазделов.Заголовок = ?(Элементы.ГруппаДеревоРазделов.Видимость,"Скрыть разделы","Показать разделы"); + Элементы.ДекорацияОжиданиеЭлементы.Ширина = ?(Элементы.ГруппаДеревоРазделов.Видимость,20,45); + +КонецПроцедуры + + // Отвечает за доступность кнопок навигации по разделам + &НаКлиенте + Процедура УправлениеДоступностьюКнопкиНавигацияРазделов() + + Элементы.ПредыдущийРаздел.Доступность = (Элементы.ДеревоРазделов.ТекущаяСтрока > 0); + Элементы.ПредыдущийРазделПодвал.Доступность = (Элементы.ДеревоРазделов.ТекущаяСтрока > 0); + Элементы.СледующийРаздел.Доступность = (ДеревоРазделов.НайтиПоИдентификатору(Элементы.ДеревоРазделов.ТекущаяСтрока + 1) <> Неопределено); + Элементы.СледующийРазделПодвал.Доступность = (ДеревоРазделов.НайтиПоИдентификатору(Элементы.ДеревоРазделов.ТекущаяСтрока + 1) <> Неопределено); + + КонецПроцедуры + + // Изменяет текущий раздел + &НаКлиенте + Процедура ИзменитьРаздел(Направление) + + Элементы.ДеревоРазделов.ТекущаяСтрока = НомерТекущегоРаздела + ?(Направление = "Вперед",1,-1); + НомерТекущегоРаздела = НомерТекущегоРаздела + ?(Направление = "Вперед",1,-1); + ТекущиеДанныеДеревоРазделов = ДеревоРазделов.НайтиПоИдентификатору(Элементы.ДеревоРазделов.ТекущаяСтрока); + Если ТекущиеДанныеДеревоРазделов.КоличествоВопросов = 0 И ТекущиеДанныеДеревоРазделов.ТипСтроки = "Раздел" Тогда + ИзменитьРаздел(Направление); + КонецЕсли; + ВыполнитьПостроениеФормыЗаполнения(); + +КонецПроцедуры // + +//////////////////////////////////////////////////////////////////////////////// +// КОМАНДЫ МОДУЛЯ + +&НаКлиенте +Процедура ФормаЗаполненияЗаписать(Команда) + + Отказ = ОкончаниеРедактированиеФормыЗаполнения(РежимЗаписиДокумента.Запись); + + Если НЕ Отказ Тогда + + ПоказатьОповещениеПользователя(НСтр("ru = 'Изменение'"), + , + Строка(Объект.Ссылка), + БиблиотекаКартинок.Информация32); + + Оповестить("ОкончаниеРедактированияАнкеты"); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ФормаЗаполненияПровестиЗакрыть(Команда) + + Отказ = Ложь; + + Если Вопрос(НСтр("ru='Ваша анкета будет принята. + |Дальнейшее заполнение анкеты будет невозможно + |Продолжить?'"),РежимДиалогаВопрос.ДаНет) <> КодВозвратаДиалога.Да Тогда + + Отказ = Истина; + КонецЕсли; + + Если НЕ Отказ Тогда + Отказ = ОкончаниеРедактированиеФормыЗаполнения(РежимЗаписиДокумента.Проведение); + КонецЕсли; + + Если НЕ Отказ Тогда + + ПоказатьОповещениеПользователя(НСтр("ru = 'Изменение'"), + , + Строка(Объект.Ссылка), + БиблиотекаКартинок.Информация32); + + Оповестить("ОкончаниеРедактированияАнкеты"); + Модифицированность = Ложь; + Закрыть(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СкрытьПоказатьДеревоРазделов(Команда) + + ИзменитьВидимостьДеревоРазделов(); + +КонецПроцедуры + +&НаКлиенте +Процедура СледующийРаздел(Команда) + + ИзменитьРаздел("Вперед"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредыдущийРаздел(Команда) + + ИзменитьРаздел("Назад"); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыборРаздела(Команда) + + ВыполнитьПостроениеФормыЗаполнения(); + УправлениеДоступностьюКнопкиНавигацияРазделов(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + //Для предотвращения открытия документа "Анкета" другими внешними пользователями + Если ЗначениеЗаполнено(ВнешниеПользователи.ТекущийВнешнийПользователь()) Тогда + Если НЕ Объект.Ссылка.Пустая() Тогда + Если Объект.Респондент <> ВнешниеПользователи.ПолучитьЗначениеРеквизитовВнешнегоПользователя(ВнешниеПользователи.ТекущийВнешнийПользователь(),"ОбъектАвторизации",Ложь).ОбъектАвторизации Тогда + Отказ = Истина; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если НЕ Объект.Опрос.Пустая() Тогда + + РеквизитыОпрос = ПолучитьЗначенияРеквизитовНазначениеОпроса(Объект.Опрос); + УстановитьЗначенияРеквизитовСогласноОпросу(РеквизитыОпрос); + + Если Не ШаблонАнкеты.Пустая() Тогда + + Если Параметры.Свойство("ТолькоФормаЗаполнения") Тогда + АвтоЗаголовок = Ложь; + УстановитьЗаголовкиНадписей(РеквизитыОпрос); + КонецЕсли; + + Анкетирование.УстановитьЭлементДереваРазделовАнкетыВступлениеЗаключение(ДеревоРазделов,"Вступление"); + Анкетирование.ЗаполнитьДеревоРазделов(ЭтаФорма,ДеревоРазделов); + Анкетирование.УстановитьЭлементДереваРазделовАнкетыВступлениеЗаключение(ДеревоРазделов,"Заключение"); + АнкетированиеКлиентСервер.СформироватьНумерациюДерева(ДеревоРазделов,Истина); + + Если (НЕ Объект.Проведен) И ЗначениеЗаполнено(Объект.РедактируемыйРаздел) Тогда + + + Если ТипЗнч(Объект.РедактируемыйРаздел) = Тип("СправочникСсылка.ВопросыШаблонаАнкеты") Тогда + + НомерТекущегоРаздела = АнкетированиеКлиентСервер.НайтиСтрокуВДанныхФормыДерево(ДеревоРазделов,Объект.РедактируемыйРаздел,"Ссылка",Истина); + + Иначе + + НомерТекущегоРаздела = АнкетированиеКлиентСервер.НайтиСтрокуВДанныхФормыДерево(ДеревоРазделов,Объект.РедактируемыйРаздел,"ТипСтроки",Истина); + + КонецЕсли; + + Если НомерТекущегоРаздела >= 0 Тогда + + Элементы.ДеревоРазделов.ТекущаяСтрока = НомерТекущегоРаздела; + ПостроениеФормыСогласноРаздела(); + + КонецЕсли; + + КонецЕсли; + + Иначе + + Отказ = Истина; + Возврат; + + КонецЕсли; + + КонецЕсли; + + Элементы.ПредыдущийРазделПодвал.Видимость = Ложь; + Элементы.СледующийРазделПодвал.Видимость = Ложь; + + ДействияВЗависимостиОтВидаФормы(); + + Элементы.ГруппаДеревоРазделов.Видимость = Ложь; + Элементы.СкрытьПоказатьДеревоРазделов.Заголовок = "Показать разделы"; + Элементы.ДекорацияОжиданиеЭлементы.Ширина = 45; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Элементы.ДеревоРазделов.ТекущаяСтрока = НомерТекущегоРаздела; + УправлениеДоступностьюКнопкиНавигацияРазделов(); + + Если (Не ТолькоПросмотр) Тогда + УправлениеДоступностьюПодчиненныеВопросы(Ложь); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Если Элементы.ГруппаТелоАнкеты.ТолькоПросмотр Тогда + Модифицированность = Ложь; + КонецЕсли; + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ОкончаниеРедактированияТекста" Тогда + + Попытка + ЭтаФорма[Параметр.ИмяТаблицы][Параметр.НомерСтроки][Параметр.ИмяКолонки] = Параметр.Текст; + Исключение + Попытка + ЭтаФорма[Параметр.ИмяТаблицы] = Параметр.Текст; + Исключение + КонецПопытки; + КонецПопытки; + + КонецЕсли; + + +КонецПроцедуры + + +&НаКлиенте +Процедура РеспондентНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + МассивОтбора = Новый Массив; + Если ОтборРеспондентов.Количество() > 0 Тогда + МассивОтбора.Добавить(АнкетированиеКлиент.СоздатьСтруктуруПараметраОтбора(Тип("ЭлементОтбораКомпоновкиДанных"),"Ссылка",ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии,ОтборРеспондентов)); + КонецЕсли; + + ОткрытьФорму(ИмяМетаданныхРеспонент + ".ФормаВыбора",Новый Структура("МассивОтбора",МассивОтбора),Элемент); + +КонецПроцедуры + +//Обработчик события ПриИзменении для вопросов с условием + &НаКлиенте +Процедура Подключаемый_ПриИзмененииВопросовСУсловием(Элемент) + + УправлениеДоступностьюПодчиненныеВопросы(); + +КонецПроцедуры // () + +//Обработчик события при изменении для простых и табличных вопросов +&НаКлиенте +Процедура ПриИзмененииВопроса(Элемент) + + Модифицированность = Истина; + +КонецПроцедуры + +//Обработчик начало выбора текстовых ячеек табличных вопросов +&НаКлиенте +Процедура Подключаемый_НачалоВыбораТекстовыхЯчеекТабличныхВопросов(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Если ТипЗнч(Элемент.Родитель) = Тип("ГруппаФормы") Тогда + ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияМногострочногоТекста(Элемент.ТекстРедактирования,ЭтаФорма[Элемент.Имя],Модифицированность); + //ПутьКДанным = ЭтаФорма[Элемент.Имя]; + Иначе + ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияМногострочногоТекста(Элемент.ТекстРедактирования,ЭтаФорма[Элемент.Родитель.Имя][Элемент.Родитель.ТекущаяСтрока][Элемент.Имя],Модифицированность); + //ПутьКДанным = ЭтаФорма[Элемент.Родитель.Имя][Элемент.Родитель.ТекущаяСтрока][Элемент.Имя]; + КонецЕсли; + + //ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияМногострочногоТекста(Элемент.ТекстРедактирования,ПутьКДанным,Модифицированность); + +КонецПроцедуры + +//Обработчик выбора раздела на дереве +&НаКлиенте +Процедура ДеревоРазделовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ТекущиеДанные = Элементы.ДеревоРазделов.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ВыполнитьПостроениеФормыЗаполнения(); + УправлениеДоступностьюКнопкиНавигацияРазделов(); + +КонецПроцедуры + diff --git a/SSL/src/Documents/Анкета/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Documents/Анкета/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Documents/Анкета/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Documents/Анкета/Forms/ФормаСписка/Form.form b/SSL/src/Documents/Анкета/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..aa288d585 --- /dev/null +++ b/SSL/src/Documents/Анкета/Forms/ФормаСписка/Form.form @@ -0,0 +1,374 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Дата + 4 + true + true + + true + + + Список.Date + + true + + ДатаРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Номер + 6 + true + true + + true + + + Список.Number + + + НомерРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Опрос + 8 + true + true + + true + + + Список.Опрос + + + ОпросРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ОпросКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Респондент + 10 + true + true + + true + + + Список.Респондент + + + РеспондентРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + РеспондентКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ДатаРедактирования + 12 + true + true + + true + + + Список.ДатаРедактирования + + + ДатаРедактированияРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ДатаРедактированияКонтекстноеМеню + 13 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 15 + + СписокСтрокаПоискаРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 16 + true + + Список + + true + + + + СписокСостояниеПросмотра + 18 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 19 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 21 + + СписокУправлениеПоискомРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 22 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + Document.Анкета + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/Documents/Анкета/Forms/ФормаСписка/Module.bsl b/SSL/src/Documents/Анкета/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..ea76c5bff --- /dev/null +++ b/SSL/src/Documents/Анкета/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,11 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(ВнешниеПользователи.ТекущийВнешнийПользователь()) Тогда + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Documents/Анкета/ObjectModule.bsl b/SSL/src/Documents/Анкета/ObjectModule.bsl new file mode 100644 index 000000000..98eff87d7 --- /dev/null +++ b/SSL/src/Documents/Анкета/ObjectModule.bsl @@ -0,0 +1,48 @@ + +Процедура ОбработкаПроведения(Отказ, РежимПроведения) + + Движения.ОтветыНаВопросыАнкет.Записывать = Истина; + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ТаблицаСостав.Вопрос, + | ТаблицаСостав.ЭлементарныйВопрос, + | ТаблицаСостав.НомерЯчейки, + | ТаблицаСостав.Ответ, + | ТаблицаСостав.ОткрытыйОтвет, + | ТаблицаСостав.НомерСтроки + |ПОМЕСТИТЬ Состав + |ИЗ + | &ТаблицаСостав КАК ТаблицаСостав + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Состав.Вопрос, + | Состав.ЭлементарныйВопрос, + | Состав.НомерЯчейки, + | Состав.Ответ, + | Состав.ОткрытыйОтвет, + | ИСТИНА КАК Активность, + | &Ссылка КАК Регистратор, + | &Ссылка КАК Анкета, + | Состав.НомерСтроки КАК НомерСтроки + |ИЗ + | Состав КАК Состав"; + + Запрос.УстановитьПараметр("ТаблицаСостав",Состав); + Запрос.УстановитьПараметр("Ссылка",Ссылка); + + Движения.ОтветыНаВопросыАнкет.Загрузить(Запрос.Выполнить().Выгрузить()); + +КонецПроцедуры + + +Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) + + Если ДанныеЗаполнения <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ЭтотОбъект,ДанныеЗаполнения); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Documents/Анкета/Анкета.mdo b/SSL/src/Documents/Анкета/Анкета.mdo new file mode 100644 index 000000000..e61af566b --- /dev/null +++ b/SSL/src/Documents/Анкета/Анкета.mdo @@ -0,0 +1,266 @@ + + + + + + + + + + Анкета + + ru + Анкета + + true + Document.Анкета.StandardAttribute.Number + DontUse + + Use + Posted + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + Date + + ShowError + Use + + + + + Use + Number + + Use + + + + Use + Managed + Use + + ru + Анкеты + + String + 11 + Variable + true + true + Document.Анкета.Form.ФормаДокумента + Document.Анкета.Form.ФормаСписка + InformationRegister.ОтветыНаВопросыАнкет + true + true + + Опрос + + ru + Опрос + + + DocumentRef.НазначениеОпросов + + + + ShowError + + Document.НазначениеОпросов.EmptyRef + + Index + Use + Use + + + Респондент + + ru + Респондент + + + CatalogRef.ФизическиеЛица + + + + ShowError + + Index + Use + Use + + + ДатаРедактирования + + ru + Дата редактирования + + + Date + + + + + + Use + Use + + + РедактируемыйРаздел + + ru + Редактируемый раздел + + + CatalogRef.ВопросыШаблонаАнкеты + String + + 10 + + + + + + Use + Use + + + ФормаДокумента + + ru + Анкета + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + + + + + Состав + + ru + Состав + + + Use + LineNumber + + Use + + + + + Вопрос + + ru + Вопрос + + + CatalogRef.ВопросыШаблонаАнкеты + + + + Use + Use + + + ЭлементарныйВопрос + + ru + Элементарный вопрос + + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + + Use + Use + + + НомерЯчейки + + ru + Номер ячейки + + + Number + + 10 + true + + + + + Use + Use + + + Ответ + + ru + Ответ + + + Characteristic.ВопросыДляАнкетирования + + + + Use + Use + + + ОткрытыйОтвет + + ru + Открытый ответ + + + String + + 150 + + + + + Use + Use + + + diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаВыбора/Form.form b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаВыбора/Form.form new file mode 100644 index 000000000..1e23b292d --- /dev/null +++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаВыбора/Form.form @@ -0,0 +1,335 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Дата + 4 + true + true + + true + + + Список.Date + + true + + ДатаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Номер + 6 + true + true + + true + + + Список.Number + + + НомерРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Наименование + 10 + true + true + + true + + + Список.Наименование + + + НаименованиеРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ШаблонАнкеты + 8 + true + true + + true + + + Список.ШаблонАнкеты + + + ШаблонАнкетыРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ШаблонАнкетыКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 13 + + СписокСтрокаПоискаРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 14 + true + + Список + + true + + + + СписокСостояниеПросмотра + 16 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 17 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 19 + + СписокУправлениеПоискомРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 20 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + true + MultiRow +
    true
    + 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 + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + Document.НазначениеОпросов + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Form.form b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Form.form new file mode 100644 index 000000000..1bbab8f2e --- /dev/null +++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Form.form @@ -0,0 +1,977 @@ + + + + ГруппаНомерДата + 33 + + Номер + 1 + true + true + + true + + + Объект.Number + + + НомерРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 2 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + Дата + 3 + true + true + + true + + + Объект.Date + + + ДатаРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 4 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа номер дата</value> + + + ru + Группа номер дата + + + ГруппаНомерДатаРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Наименование + 36 + true + true + + true + + + Объект.Наименование + + + НаименованиеРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 37 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаРеквизитыШапки + 30 + + ГруппаЛеваяКолонкаРеквизитыШапки + 31 + + ГруппаПериод + 34 + + ДатаНачала + 9 + true + true + + true + + + Объект.ДатаНачала + + + ДатаНачалаРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + ДатаНачалаКонтекстноеМеню + 10 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДатаОкончания + 11 + true + true + + true + + + Объект.ДатаОкончания + + + ДатаОкончанияРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + ДатаОкончанияКонтекстноеМеню + 12 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа период</value> + + + ru + Группа период + + + ГруппаПериодРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ШаблонАнкеты + 5 + true + true + + true + + + Объект.ШаблонАнкеты + + + ШаблонАнкетыРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + ШаблонАнкетыКонтекстноеМеню + 6 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТипРеспондентов + 25 + true + true + + true + + + ТипРеспондентов + + + OnChange + ТипРеспондентовПриИзменении + + + ТипРеспондентовРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + ТипРеспондентовКонтекстноеМеню + 26 + true + + InputField + true + Enter + true + Left + true + + true + true + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа левая колонка реквизиты шапки</value> + + + ru + Группа левая колонка реквизиты шапки + + + ГруппаЛеваяКолонкаРеквизитыШапкиРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаПраваяКолонкаРеквзитыШапки + 32 + + НеПоказыватьВАрхивеАнкет + 38 + true + true + + true + + + Объект.НеПоказыватьВАрхивеАнкет + + Right + + НеПоказыватьВАрхивеАнкетРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + НеПоказыватьВАрхивеАнкетКонтекстноеМеню + 39 + true + + CheckBoxField + Enter + true + Left + true + + + + ВозможностьПредварительногоСохранения + 13 + true + true + + true + + + Объект.ВозможностьПредварительногоСохранения + + Right + + ВозможностьПредварительногоСохраненияРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + ВозможностьПредварительногоСохраненияКонтекстноеМеню + 14 + true + + CheckBoxField + Auto + true + Left + true + + + + СвободныйОпрос + 28 + true + true + + true + + + Объект.СвободныйОпрос + + Right + + ru + Отметка данного значения означает, что опрос не предназначен для определенного круга лиц. Если данное значение не отмечено, то будет необходимо указать респондентов, которым предназначен опрос. + + + OnChange + СвободныйОпросПриИзменении + + + СвободныйОпросРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + СвободныйОпросКонтекстноеМеню + 29 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Группа правая колонка реквзиты шапки</value> + + + ru + Группа правая колонка реквзиты шапки + + + ГруппаПраваяКолонкаРеквзитыШапкиРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа реквизиты шапки</value> + + + ГруппаРеквизитыШапкиРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + LeftWidest + Auto + Auto + + + + Респонденты + 15 + true + true + + true + + + Объект.Респонденты + + false + Top + + РеспондентыНомерСтроки + 18 + true + true + + true + + + Объект.Респонденты.LineNumber + + + РеспондентыНомерСтрокиРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + РеспондентыНомерСтрокиКонтекстноеМеню + 19 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + РеспондентыРеспондент + 20 + true + true + + true + + + Объект.Респонденты.Респондент + + + РеспондентыРеспондентРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + РеспондентыРеспондентКонтекстноеМеню + 21 + true + + InputField + Auto + true + Left + true + + + StartChoice + РеспондентыРеспондентНачалоВыбора + + true + true + true + Items + true + true + true + Normal + + + + РеспондентыКоманднаяПанель + 17 + + КнопкаПодборРеспондентов + 35 + true + true + + true + + false + + КнопкаПодборРеспондентовРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + Form.Command.ПодборРеспондентов + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + OnStartEdit + РеспондентыПриНачалеРедактирования + + + РеспондентыСтрокаПоиска + 72 + + РеспондентыСтрокаПоискаРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + РеспондентыСтрокаПоискаКонтекстноеМеню + 73 + true + + Респонденты + + true + + + + РеспондентыСостояниеПросмотра + 75 + + РеспондентыСостояниеПросмотраРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + + РеспондентыСостояниеПросмотраКонтекстноеМеню + 76 + true + + ViewStatusAddition + Респонденты + + true + + + + РеспондентыУправлениеПоиском + 78 + + РеспондентыУправлениеПоискомРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + РеспондентыУправлениеПоискомКонтекстноеМеню + 79 + true + + SearchControlAddition + Респонденты + + true + + + + РеспондентыРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + РеспондентыКонтекстноеМеню + 16 + true + + 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 + +
    + + Комментарий + 43 + true + true + + true + + + Объект.Комментарий + + + КомментарийРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 44 + true + + InputField + Enter + true + Left + true + + + StartChoice + КомментарийНачалоВыбора + + true + true + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + DocumentObject.НазначениеОпросов + + + true + + + true + + + Объект.RegisterRecords + +
    true
    + true +
    + + ТипРеспондентов + + <key>ru</key> + <value>Тип респондентов</value> + + 2 + + TypeDescription + + + true + + + true + + + + ПодборРеспондентов + + <key>ru</key> + <value>Подбор респондентов</value> + + 1 + + ru + Подбор респондентов + + + true + + + + ПодборРеспондентов + + + Auto + Auto + + + + + + + + BeforeWrite + ПередЗаписью + + true + +
    diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Module.bsl b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Module.bsl new file mode 100644 index 000000000..4d323cc74 --- /dev/null +++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Module.bsl @@ -0,0 +1,169 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ + +//Обрабатывет изменение типа респондента +&НаКлиенте +Процедура ОбработатьИзменениеТипаРеспондента() + + Элементы.РеспондентыРеспондент.ОграничениеТипа = ТипРеспондентов; + Элементы.РеспондентыРеспондент.ДоступныеТипы = ТипРеспондентов; + + Если Объект.ТипРеспондентов <> Неопределено Тогда + Объект.ТипРеспондентов = Новый(ТипРеспондентов.Типы()[0]); + КонецЕсли; + + Для каждого СтрокаРеспонденты Из Объект.Респонденты Цикл + + Если Не ТипРеспондентов.СодержитТип(ТипЗнч(СтрокаРеспонденты.Респондент)) Тогда + Объект.Респонденты.Очистить(); + Элементы.Респонденты.Обновить(); + КонецЕсли; + + Прервать; + + КонецЦикла; + +КонецПроцедуры // () + +// Управляет доступностью элементов формы +&НаКлиенте +Процедура УправлениеДоступностью() + + Элементы.Респонденты.ТолькоПросмотр = Объект.СвободныйОпрос; + Элементы.КнопкаПодборРеспондентов.Доступность = НЕ Объект.СвободныйОпрос; + +КонецПроцедуры // УправлениеДоступностью() + +//////////////////////////////////////////////////////////////////////////////// +// КОМАНДЫ ФОРМЫ + +//Открывает форму подбора респондентов +&НаКлиенте +Процедура ПодборРеспондентов(Команда) + + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("ТипРеспондента",Объект.ТипРеспондентов); + СтруктураОтбора.Вставить("Респонденты",Объект.Респонденты); + + ОткрытьФорму("Документ.НазначениеОпросов.Форма.ФормаПодбораРеспондентов",СтруктураОтбора,ЭтаФорма); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ДоступныеТипы = РеквизитФормыВЗначение("Объект").Метаданные().Реквизиты.ТипРеспондентов.Тип.Типы(); + + Для каждого ДоступныйТип Из ДоступныеТипы Цикл + + МассивТипов = Новый Массив; + МассивТипов.Добавить(ДоступныйТип); + Элементы.ТипРеспондентов.СписокВыбора.Добавить(Новый ОписаниеТипов(МассивТипов),Строка(ДоступныйТип)); + + КонецЦикла; + + Если Объект.ТипРеспондентов = Неопределено Тогда + Если ДоступныеТипы.Количество() > 0 Тогда + Объект.ТипРеспондентов = Новый(ДоступныеТипы[0]); + ТипРеспондентов = Элементы.ТипРеспондентов.СписокВыбора[0].Значение; + КонецЕсли; + Иначе + МассивТипов = Новый Массив; + МассивТипов.Добавить(ТипЗнч(Объект.ТипРеспондентов)); + ТипРеспондентов = Новый ОписаниеТипов(МассивТипов); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ОбработатьИзменениеТипаРеспондента(); + УправлениеДоступностью(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) + + Если (Объект.ДатаНачала > Объект.ДатаОкончания) И (Объект.ДатаОкончания <> Дата(1,1,1)) Тогда + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Нстр("ru = 'Дата начала не может быть больше чем дата окончания.'"),,"Объект.ДатаНачала"); + Отказ = Истина; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ВыборРеспондентов" Тогда + + Для каждого ЭлементМассива Из Параметр.ОтобранныеРеспонденты Цикл + + Если Объект.Респонденты.НайтиСтроки(Новый Структура("Респондент",ЭлементМассива)).Количество() = 0 Тогда + + НоваяСтрока = Объект.Респонденты.Добавить(); + НоваяСтрока.Респондент = ЭлементМассива; + + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ТипРеспондентовПриИзменении(Элемент) + + ОбработатьИзменениеТипаРеспондента(); + УправлениеДоступностью(); + +КонецПроцедуры + +&НаКлиенте +Процедура РеспондентыРеспондентНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ТекущиеДанные = Элементы.Респонденты.ТекущиеДанные; + + Значение = ТекущиеДанные.Респондент; + ТекущиеДанные.Респондент = ТипРеспондентов.ПривестиЗначение(Значение); + Элемент.ВыбиратьТип = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура РеспондентыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) + + ТекущиеДанные = Элементы.Респонденты.ТекущиеДанные; + + Значение = ТекущиеДанные.Респондент; + ТекущиеДанные.Респондент = ТипРеспондентов.ПривестиЗначение(Значение); + +КонецПроцедуры + +&НаКлиенте +Процедура СвободныйОпросПриИзменении(Элемент) + + УправлениеДоступностью(); + Если Объект.Респонденты.Количество() > 0 Тогда + Объект.Респонденты.Очистить(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияКомментария(Элемент.ТекстРедактирования, Объект.Комментарий, Модифицированность); + +КонецПроцедуры + diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Attributes/Респонденты/ExtInfo/ListSettings.dcss b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Attributes/Респонденты/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Attributes/Респонденты/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Form.form b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Form.form new file mode 100644 index 000000000..881211738 --- /dev/null +++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Form.form @@ -0,0 +1,965 @@ + + + + <key>ru</key> + <value>Подбор респондентов</value> + + + ГруппаСписки + 22 + + ГруппаЛевыйСписок + 18 + + ГруппаКоманднаяПанельОтобранныеЗначения + 28 + + Удалить + 29 + true + true + + true + + false + + УдалитьРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + СортироватьПоВозрастанию + 31 + true + true + + true + + false + + СортироватьПоВозрастаниюРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СортироватьПоУбыванию + 32 + true + true + + true + + false + + СортироватьПоУбываниюРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Группа командная панель отобранные значения</value> + + + ru + Группа командная панель отобранные значения + + + ГруппаКоманднаяПанельОтобранныеЗначенияРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + CommandBar + + Left + + + + СписокЗначений + 23 + true + true + + true + + false + None + + СписокЗначенийЗначение + 26 + true + true + + true + + + СписокЗначенийЗначениеРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + СписокЗначенийЗначениеКонтекстноеМеню + 27 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + СписокЗначенийКоманднаяПанель + 25 + Left + + + СписокЗначенийСтрокаПоиска + 41 + + СписокЗначенийСтрокаПоискаРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + СписокЗначенийСтрокаПоискаКонтекстноеМеню + 42 + true + + СписокЗначений + + true + + + + СписокЗначенийСостояниеПросмотра + 44 + + СписокЗначенийСостояниеПросмотраРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + СписокЗначенийСостояниеПросмотраКонтекстноеМеню + 45 + true + + ViewStatusAddition + СписокЗначений + + true + + + + СписокЗначенийУправлениеПоиском + 47 + + СписокЗначенийУправлениеПоискомРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + СписокЗначенийУправлениеПоискомКонтекстноеМеню + 48 + true + + SearchControlAddition + СписокЗначений + + true + + + + СписокЗначенийРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + СписокЗначенийКонтекстноеМеню + 24 + true + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + None + None + None + true + + true + true + + true + + + <key>ru</key> + <value>Группа левый список</value> + + + ru + Группа левый список + + + ГруппаЛевыйСписокРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаПравыйСписок + 19 + + ГруппаКоманднаяПанельРеспонденты + 11 + + Выбрать + 33 + true + true + + true + + false + + ВыбратьРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + Form.Item.Респонденты.StandardCommand.Choose + Normal + Auto + true + true + UserCmds + Auto + + + НастроитьСписок + 12 + true + true + + true + + false + + НастроитьСписокРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + Form.Item.Респонденты.StandardCommand.ListSettings + Normal + PictureAndText + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + Обновить + 13 + true + true + + true + + false + + ОбновитьРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + Form.Item.Респонденты.StandardCommand.Refresh + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ГруппаРеспондентыРежимПросмотра + 14 + + Список + 15 + true + true + + true + + false + + СписокРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + Form.Item.Респонденты.StandardCommand.List + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ИерархическийСписок + 16 + true + true + + true + + false + + ИерархическийСписокРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + Form.Item.Респонденты.StandardCommand.HierarchicalList + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + Дерево + 17 + true + true + + true + + false + + ДеревоРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + Form.Item.Респонденты.StandardCommand.Tree + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + ru + Группа респонденты режим просмотра + + + ГруппаРеспондентыРежимПросмотраРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + Popup + + + StdPicture.HierarchicalView + + Auto + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа командная панель респонденты</value> + + + ru + Группа командная панель респонденты + + + ГруппаКоманднаяПанельРеспондентыРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + CommandBar + + Left + + + + Респонденты + 1 + true + true + + true + + + Респонденты + + false + None + + РеспондентыНаименование + 9 + + <key>ru</key> + <value>Респондент</value> + + true + true + + true + + + Респонденты.Description + + + РеспондентыНаименованиеРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + РеспондентыНаименованиеКонтекстноеМеню + 10 + true + + LabelField + Enter + true + Left + true + + true + true + + + + РеспондентыКоманднаяПанель + 3 + Left + + + ValueChoice + РеспондентыВыборЗначения + + + Selection + РеспондентыВыбор + + + РеспондентыСтрокаПоиска + 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 + + + + РеспондентыРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + РеспондентыКонтекстноеМеню + 2 + + true + true + true + true + true + true + true + MultiRow + Row + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Респонденты.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + + + true + true + + true + + + <key>ru</key> + <value>Группа правый список</value> + + + ru + Группа правый список + + + ГруппаПравыйСписокРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа списки</value> + + + ru + Группа списки + + + ГруппаСпискиРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаПодвал + 4 + + Декорация + 7 + true + true + + true + + + ДекорацияРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + ДекорацияКонтекстноеМеню + 8 + true + + Label + true + true + true + false + + Left + + + + КнопкаЗакрыть + 5 + true + true + + true + + false + + КнопкаЗакрытьРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + UsualButton + Form.StandardCommand.Close + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа подвал</value> + + + ru + Группа подвал + + true + + ГруппаПодвалРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Респонденты + + <key>ru</key> + <value>Респонденты</value> + + 1 + + DynamicList + + + true + + + true + + + Респонденты.Code + + + Респонденты.Description + + + Респонденты.IsFolder + + + Респонденты.Ref + + + Catalog.ФизическиеЛица + true + true + true + true + + + + + + + diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Module.bsl b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Module.bsl new file mode 100644 index 000000000..1ce54b8bb --- /dev/null +++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Module.bsl @@ -0,0 +1,53 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ + +&НаКлиенте +Процедура ОбработатьВыборРеспондента(МассивВыбора) + + Оповестить("ВыборРеспондентов",Новый Структура("ОтобранныеРеспонденты",МассивВыбора)); + +КонецПроцедуры // () + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Параметры.ТипРеспондента)) Тогда + + Респонденты.ОсновнаяТаблица = Параметры.ТипРеспондента.Метаданные().ПолноеИмя(); + + Иначе + + Отказ = Истина; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура РеспондентыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + МассивДляПередачи = Новый Массив; + + Для каждого ЭлементМассива Из ВыбраннаяСтрока Цикл + Если НЕ Элементы.Респонденты.ДанныеСтроки(ЭлементМассива).ЭтоГруппа Тогда + МассивДляПередачи.Добавить(ЭлементМассива) + КонецЕсли; + КонецЦикла; + + ОбработатьВыборРеспондента(МассивДляПередачи); + +КонецПроцедуры + +&НаКлиенте +Процедура РеспондентыВыборЗначения(Элемент, Значение, СтандартнаяОбработка) + + ОбработатьВыборРеспондента(Значение); + +КонецПроцедуры + + + \ No newline at end of file diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаСписка/Form.form b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..830e608ea --- /dev/null +++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаСписка/Form.form @@ -0,0 +1,406 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Дата + 4 + true + true + + true + + + Список.Date + + true + + ДатаРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Номер + 6 + true + true + + true + + + Список.Number + + + НомерРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Наименование + 14 + true + true + + true + + + Список.Наименование + + + НаименованиеРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 15 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ШаблонАнкеты + 8 + true + true + + true + + + Список.ШаблонАнкеты + + + ШаблонАнкетыРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ШаблонАнкетыКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ДатаНачала + 10 + true + true + + true + + + Список.ДатаНачала + + + ДатаНачалаРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ДатаНачалаКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ДатаОкончания + 12 + true + true + + true + + + Список.ДатаОкончания + + + ДатаОкончанияРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ДатаОкончанияКонтекстноеМеню + 13 + 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 + Список + + true + + + + СписокУправлениеПоиском + 23 + + СписокУправлениеПоискомРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 24 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + Document.НазначениеОпросов + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/Documents/НазначениеОпросов/НазначениеОпросов.mdo b/SSL/src/Documents/НазначениеОпросов/НазначениеОпросов.mdo new file mode 100644 index 000000000..ba79c2fee --- /dev/null +++ b/SSL/src/Documents/НазначениеОпросов/НазначениеОпросов.mdo @@ -0,0 +1,296 @@ + + + + + + + + + + НазначениеОпросов + + ru + Назначение опросов + + true + Document.НазначениеОпросов.StandardAttribute.Number + DontUse + + Use + Posted + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + Date + + ShowError + Use + + + + + Use + Number + + Use + + + + Use + Managed + Use + String + 11 + Variable + true + true + Document.НазначениеОпросов.Form.ФормаДокумента + Document.НазначениеОпросов.Form.ФормаСписка + Document.НазначениеОпросов.Form.ФормаВыбора + true + true + + ШаблонАнкеты + + ru + Шаблон анкеты + + + CatalogRef.ШаблоныАнкет + + + + ShowError + + Catalog.ШаблоныАнкет.EmptyRef + + Use + Use + + + ТипРеспондентов + + ru + Тип респондентов + + + CatalogRef.ФизическиеЛица + + + + + Use + Use + + + ДатаНачала + + ru + Дата начала + + + Date + + Date + + + + + + 0001-01-01T00:00:00 + + Use + Use + + + ДатаОкончания + + ru + Дата окончания + + + Date + + Date + + + + + + 0001-01-01T00:00:00 + + Use + Use + + + ВозможностьПредварительногоСохранения + + ru + Возможность предварительного сохранения + + + Boolean + + + + + Use + Use + + + СвободныйОпрос + + ru + Свободный опрос + + + Boolean + + + + + Use + Use + + + Наименование + + ru + Наименование + + + String + + 80 + + + + + ShowError + + Use + Use + + + НеПоказыватьВАрхивеАнкет + + ru + Не показывать в архиве анкет + + + Boolean + + + + + Use + Use + + + Комментарий + + ru + Комментарий + + + String + + + + + + Use + Use + + + ФормаДокумента + + ru + Форма документа + + PersonalComputer + MobileDevice + + + ФормаПодбораРеспондентов + + ru + Форма подбора респондентов + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаВыбора + + ru + Форма выбора + + PersonalComputer + MobileDevice + + + + + + + Респонденты + + ru + Респонденты + + + Use + LineNumber + + Use + + + + + Респондент + + ru + Респондент + + + CatalogRef.ФизическиеЛица + CatalogRef.Пользователи + + + + FoldersAndItems + Use + Use + + + diff --git a/SSL/src/Enums/ВариантыSMTPАутентификации/ВариантыSMTPАутентификации.mdo b/SSL/src/Enums/ВариантыSMTPАутентификации/ВариантыSMTPАутентификации.mdo new file mode 100644 index 000000000..dec0ea47c --- /dev/null +++ b/SSL/src/Enums/ВариантыSMTPАутентификации/ВариантыSMTPАутентификации.mdo @@ -0,0 +1,59 @@ + + + + + + + + ВариантыSMTPАутентификации + + ru + Виды SMTP аутентификации + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + АналогичноPOP3 + + ru + Аналогично POP3 + + + + ЗадаетсяПараметрами + + ru + Задается параметрами + + + + POP3ПередSMTP + + ru + POP3 перед SMTP + + + + НеЗадано + + ru + Не задано + + + diff --git a/SSL/src/Enums/ВариантыВажностиЗадачи/ВариантыВажностиЗадачи.mdo b/SSL/src/Enums/ВариантыВажностиЗадачи/ВариантыВажностиЗадачи.mdo new file mode 100644 index 000000000..28d4d7160 --- /dev/null +++ b/SSL/src/Enums/ВариантыВажностиЗадачи/ВариантыВажностиЗадачи.mdo @@ -0,0 +1,52 @@ + + + + + + + + ВариантыВажностиЗадачи + + ru + Варианты важности задачи + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Высокая + + ru + Высокая + + + + Обычная + + ru + Обычная + + + + Низкая + + ru + Низкая + + + diff --git a/SSL/src/Enums/ВариантыВерсионированияОбъектов/ВариантыВерсионированияОбъектов.mdo b/SSL/src/Enums/ВариантыВерсионированияОбъектов/ВариантыВерсионированияОбъектов.mdo new file mode 100644 index 000000000..b9876210e --- /dev/null +++ b/SSL/src/Enums/ВариантыВерсионированияОбъектов/ВариантыВерсионированияОбъектов.mdo @@ -0,0 +1,52 @@ + + + + + + + + ВариантыВерсионированияОбъектов + + ru + Варианты версионирования объектов + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Версионировать + + ru + Версионировать + + + + ВерсионироватьПриПроведении + + ru + Версионировать при проведении + + + + НеВерсионировать + + ru + Не версионировать + + + diff --git a/SSL/src/Enums/ВариантыПубликацииДополнительныхОтчетовИОбработок/ВариантыПубликацииДополнительныхОтчетовИОбработок.mdo b/SSL/src/Enums/ВариантыПубликацииДополнительныхОтчетовИОбработок/ВариантыПубликацииДополнительныхОтчетовИОбработок.mdo new file mode 100644 index 000000000..b5b35554b --- /dev/null +++ b/SSL/src/Enums/ВариантыПубликацииДополнительныхОтчетовИОбработок/ВариантыПубликацииДополнительныхОтчетовИОбработок.mdo @@ -0,0 +1,53 @@ + + + + + + + + ВариантыПубликацииДополнительныхОтчетовИОбработок + + ru + Варианты публикации дополнительных отчетов и обработок + + true + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Используется + + ru + Используется + + + + НеИспользуется + + ru + Не используется + + + + РежимОтладки + + ru + Режим отладки + + + diff --git a/SSL/src/Enums/ВерсииПодсистемыОбменаДанными/ВерсииПодсистемыОбменаДанными.mdo b/SSL/src/Enums/ВерсииПодсистемыОбменаДанными/ВерсииПодсистемыОбменаДанными.mdo new file mode 100644 index 000000000..e5240a5b5 --- /dev/null +++ b/SSL/src/Enums/ВерсииПодсистемыОбменаДанными/ВерсииПодсистемыОбменаДанными.mdo @@ -0,0 +1,52 @@ + + + + + + + + ВерсииПодсистемыОбменаДанными + + ru + Версии подсистемы обмена данными + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Версия10 + + ru + Версия 1.0 + + + + Версия20 + + ru + Версия 2.0 + + + + Версия30 + + ru + Версия 3.0 + + + diff --git a/SSL/src/Enums/ВидыДополнительныхОтчетовИОбработок/ВидыДополнительныхОтчетовИОбработок.mdo b/SSL/src/Enums/ВидыДополнительныхОтчетовИОбработок/ВидыДополнительныхОтчетовИОбработок.mdo new file mode 100644 index 000000000..2e283e852 --- /dev/null +++ b/SSL/src/Enums/ВидыДополнительныхОтчетовИОбработок/ВидыДополнительныхОтчетовИОбработок.mdo @@ -0,0 +1,74 @@ + + + + + + + + ВидыДополнительныхОтчетовИОбработок + + ru + Виды дополнительных отчетов и обработок + + true + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + ДополнительнаяОбработка + + ru + Дополнительная обработка + + + + ДополнительныйОтчет + + ru + Дополнительный отчет + + + + ЗаполнениеОбъекта + + ru + Заполнение объекта + + + + Отчет + + ru + Отчет + + + + ПечатнаяФорма + + ru + Печатная форма + + + + СозданиеСвязанныхОбъектов + + ru + Создание связанных объектов + + + diff --git a/SSL/src/Enums/ВидыПравилДляОбменаДанными/ВидыПравилДляОбменаДанными.mdo b/SSL/src/Enums/ВидыПравилДляОбменаДанными/ВидыПравилДляОбменаДанными.mdo new file mode 100644 index 000000000..75eeac2fc --- /dev/null +++ b/SSL/src/Enums/ВидыПравилДляОбменаДанными/ВидыПравилДляОбменаДанными.mdo @@ -0,0 +1,46 @@ + + + + + + + + ВидыПравилДляОбменаДанными + + ru + Виды правил для обмена данными + + true + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + ПравилаКонвертацииОбъектов + + ru + Правила конвертации объектов + + + + ПравилаРегистрацииОбъектов + + ru + Правила регистрации объектов + + + diff --git a/SSL/src/Enums/ВидыТранспортаСообщенийОбмена/ВидыТранспортаСообщенийОбмена.mdo b/SSL/src/Enums/ВидыТранспортаСообщенийОбмена/ВидыТранспортаСообщенийОбмена.mdo new file mode 100644 index 000000000..c953967dc --- /dev/null +++ b/SSL/src/Enums/ВидыТранспортаСообщенийОбмена/ВидыТранспортаСообщенийОбмена.mdo @@ -0,0 +1,52 @@ + + + + + + + + ВидыТранспортаСообщенийОбмена + + ru + Виды транспорта сообщений обмена + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + FILE + + ru + Обмен через локальный или сетевой каталог + + + + FTP + + ru + Обмен через FTP-ресурс + + + + EMAIL + + ru + Обмен по почте + + + diff --git a/SSL/src/Enums/ДействияПриОбмене/ДействияПриОбмене.mdo b/SSL/src/Enums/ДействияПриОбмене/ДействияПриОбмене.mdo new file mode 100644 index 000000000..942b2fcf7 --- /dev/null +++ b/SSL/src/Enums/ДействияПриОбмене/ДействияПриОбмене.mdo @@ -0,0 +1,45 @@ + + + + + + + + ДействияПриОбмене + + ru + Действия при обмене + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + ЗагрузкаДанных + + ru + Загрузка данных + + + + ВыгрузкаДанных + + ru + Выгрузка данных + + + diff --git a/SSL/src/Enums/ДействияПриСохраненииСЭЦП/ДействияПриСохраненииСЭЦП.mdo b/SSL/src/Enums/ДействияПриСохраненииСЭЦП/ДействияПриСохраненииСЭЦП.mdo new file mode 100644 index 000000000..000b63257 --- /dev/null +++ b/SSL/src/Enums/ДействияПриСохраненииСЭЦП/ДействияПриСохраненииСЭЦП.mdo @@ -0,0 +1,45 @@ + + + + + + + + ДействияПриСохраненииСЭЦП + + ru + Действия при сохранении с ЭЦП + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + СохранятьВсеПодписи + + ru + Сохранять все подписи + + + + Спрашивать + + ru + Спрашивать + + + diff --git a/SSL/src/Enums/ДействияСФайламиПоДвойномуЩелчку/ДействияСФайламиПоДвойномуЩелчку.mdo b/SSL/src/Enums/ДействияСФайламиПоДвойномуЩелчку/ДействияСФайламиПоДвойномуЩелчку.mdo new file mode 100644 index 000000000..c02966694 --- /dev/null +++ b/SSL/src/Enums/ДействияСФайламиПоДвойномуЩелчку/ДействияСФайламиПоДвойномуЩелчку.mdo @@ -0,0 +1,45 @@ + + + + + + + + ДействияСФайламиПоДвойномуЩелчку + + ru + Действия с файлами по двойному щелчку + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + ОткрыватьФайл + + ru + Открывать файл + + + + ОткрыватьКарточку + + ru + Открывать карточку + + + diff --git a/SSL/src/Enums/ИсточникиПравилДляОбменаДанными/ИсточникиПравилДляОбменаДанными.mdo b/SSL/src/Enums/ИсточникиПравилДляОбменаДанными/ИсточникиПравилДляОбменаДанными.mdo new file mode 100644 index 000000000..dd7cd842d --- /dev/null +++ b/SSL/src/Enums/ИсточникиПравилДляОбменаДанными/ИсточникиПравилДляОбменаДанными.mdo @@ -0,0 +1,46 @@ + + + + + + + + ИсточникиПравилДляОбменаДанными + + ru + Источники правил для обмена данными + + true + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + МакетКонфигурации + + ru + Макет конфигурации + + + + Файл + + ru + Файл + + + diff --git a/SSL/src/Enums/ПоворотИзображения/ПоворотИзображения.mdo b/SSL/src/Enums/ПоворотИзображения/ПоворотИзображения.mdo new file mode 100644 index 000000000..c5efbb796 --- /dev/null +++ b/SSL/src/Enums/ПоворотИзображения/ПоворотИзображения.mdo @@ -0,0 +1,59 @@ + + + + + + + + ПоворотИзображения + + ru + Поворот изображения + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + НетПоворота + + ru + Нет поворота + + + + ВправоНа90 + + ru + Вправо на 90 + + + + ВправоНа180 + + ru + Вправо на 180 + + + + ВлевоНа90 + + ru + Влево на 90 + + + diff --git a/SSL/src/Enums/ПолФизическогоЛица/ПолФизическогоЛица.mdo b/SSL/src/Enums/ПолФизическогоЛица/ПолФизическогоЛица.mdo new file mode 100644 index 000000000..0ec02bbf8 --- /dev/null +++ b/SSL/src/Enums/ПолФизическогоЛица/ПолФизическогоЛица.mdo @@ -0,0 +1,45 @@ + + + + + + + + ПолФизическогоЛица + + ru + Пол физического лица + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Мужской + + ru + Мужской + + + + Женский + + ru + Женский + + + diff --git a/SSL/src/Enums/ПриоритетыОбъектовОбмена/ПриоритетыОбъектовОбмена.mdo b/SSL/src/Enums/ПриоритетыОбъектовОбмена/ПриоритетыОбъектовОбмена.mdo new file mode 100644 index 000000000..437d58ee4 --- /dev/null +++ b/SSL/src/Enums/ПриоритетыОбъектовОбмена/ПриоритетыОбъектовОбмена.mdo @@ -0,0 +1,52 @@ + + + + + + + + ПриоритетыОбъектовОбмена + + ru + Приоритеты объектов обмена + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + ПриоритетПоступившегоПриОбменеОбъектаНиже + + ru + Приоритет объекта обмена ниже + + + + ПриоритетПоступившегоПриОбменеОбъектаСовпадает + + ru + Приоритет объекта обмена совпадает + + + + ПриоритетПоступившегоПриОбменеОбъектаВыше + + ru + Приоритет объекта обмена выше + + + diff --git a/SSL/src/Enums/РазмерыБумаги/РазмерыБумаги.mdo b/SSL/src/Enums/РазмерыБумаги/РазмерыБумаги.mdo new file mode 100644 index 000000000..2cd5c80c1 --- /dev/null +++ b/SSL/src/Enums/РазмерыБумаги/РазмерыБумаги.mdo @@ -0,0 +1,122 @@ + + + + + + + + РазмерыБумаги + + ru + Размеры бумаги + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + НеЗадано + + ru + Не задано + + + + A3 + + ru + A3 + + + + A4 + + ru + A4 + + + + A5 + + ru + A5 + + + + B4 + + ru + B4 + + + + B5 + + ru + B5 + + + + B6 + + ru + B6 + + + + C4 + + ru + C4 + + + + C5 + + ru + C5 + + + + C6 + + ru + C6 + + + + USExecutive + + ru + US Executive + + + + USLegal + + ru + US Legal + + + + USLetter + + ru + US Letter + + + diff --git a/SSL/src/Enums/РазрешенияСканированногоИзображения/РазрешенияСканированногоИзображения.mdo b/SSL/src/Enums/РазрешенияСканированногоИзображения/РазрешенияСканированногоИзображения.mdo new file mode 100644 index 000000000..959ed89b6 --- /dev/null +++ b/SSL/src/Enums/РазрешенияСканированногоИзображения/РазрешенияСканированногоИзображения.mdo @@ -0,0 +1,59 @@ + + + + + + + + РазрешенияСканированногоИзображения + + ru + Разрешения сканированного изображения + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + dpi200 + + ru + 200 dpi + + + + dpi300 + + ru + 300 dpi + + + + dpi600 + + ru + 600 dpi + + + + dpi1200 + + ru + 1200 dpi + + + diff --git a/SSL/src/Enums/РезультатыВыполненияОбмена/РезультатыВыполненияОбмена.mdo b/SSL/src/Enums/РезультатыВыполненияОбмена/РезультатыВыполненияОбмена.mdo new file mode 100644 index 000000000..3cee3f043 --- /dev/null +++ b/SSL/src/Enums/РезультатыВыполненияОбмена/РезультатыВыполненияОбмена.mdo @@ -0,0 +1,66 @@ + + + + + + + + РезультатыВыполненияОбмена + + ru + Результаты выполнения обмена + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Выполнено + + ru + Выполнено + + + + Отменено + + ru + Отменено + + + + Ошибка + + ru + Ошибка + + + + Ошибка_ТранспортСообщения + + ru + Ошибка транспорта сообщения + + + + Предупреждение_СообщениеОбменаБылоРанееПринято + + ru + Сообщение обмена было ранее принято + + + diff --git a/SSL/src/Enums/СпособыPOP3Аутентификации/СпособыPOP3Аутентификации.mdo b/SSL/src/Enums/СпособыPOP3Аутентификации/СпособыPOP3Аутентификации.mdo new file mode 100644 index 000000000..19f05e7ea --- /dev/null +++ b/SSL/src/Enums/СпособыPOP3Аутентификации/СпособыPOP3Аутентификации.mdo @@ -0,0 +1,52 @@ + + + + + + + + СпособыPOP3Аутентификации + + ru + Способы POP3 аутентификации + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + APOP + + ru + APOP + + + + CramMD5 + + ru + Cram MD5 + + + + Обычная + + ru + Обычная + + + diff --git a/SSL/src/Enums/СпособыSMTPАутентификации/СпособыSMTPАутентификации.mdo b/SSL/src/Enums/СпособыSMTPАутентификации/СпособыSMTPАутентификации.mdo new file mode 100644 index 000000000..510f6f794 --- /dev/null +++ b/SSL/src/Enums/СпособыSMTPАутентификации/СпособыSMTPАутентификации.mdo @@ -0,0 +1,66 @@ + + + + + + + + СпособыSMTPАутентификации + + ru + Способы SMTP аутентификации + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + CramMD5 + + ru + Cram MD5 + + + + Login + + ru + Login + + + + Plain + + ru + Plain + + + + БезАутентификации + + ru + Без аутентификации + + + + ПоУмолчанию + + ru + По умолчанию + + + diff --git a/SSL/src/Enums/СпособыВызоваДополнительныхОбработок/СпособыВызоваДополнительныхОбработок.mdo b/SSL/src/Enums/СпособыВызоваДополнительныхОбработок/СпособыВызоваДополнительныхОбработок.mdo new file mode 100644 index 000000000..b32c118b8 --- /dev/null +++ b/SSL/src/Enums/СпособыВызоваДополнительныхОбработок/СпособыВызоваДополнительныхОбработок.mdo @@ -0,0 +1,53 @@ + + + + + + + + СпособыВызоваДополнительныхОбработок + + ru + Способы вызова дополнительных обработок + + true + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + ВызовКлиентскогоМетода + + ru + Вызов клиентского метода + + + + ВызовСерверногоМетода + + ru + Вызов серверного метода + + + + ОткрытиеФормы + + ru + Открытие формы + + + diff --git a/SSL/src/Enums/СпособыСравненияВерсийФайлов/СпособыСравненияВерсийФайлов.mdo b/SSL/src/Enums/СпособыСравненияВерсийФайлов/СпособыСравненияВерсийФайлов.mdo new file mode 100644 index 000000000..bdf6cd5e2 --- /dev/null +++ b/SSL/src/Enums/СпособыСравненияВерсийФайлов/СпособыСравненияВерсийФайлов.mdo @@ -0,0 +1,46 @@ + + + + + + + + СпособыСравненияВерсийФайлов + + ru + Способы сравнения версий файлов + + true + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + MicrosoftOfficeWord + + ru + Microsoft Office Word + + + + OpenOfficeOrgWriter + + ru + OpenOffice.org Writer + + + diff --git a/SSL/src/Enums/СтатусыИзвлеченияТекстаФайлов/СтатусыИзвлеченияТекстаФайлов.mdo b/SSL/src/Enums/СтатусыИзвлеченияТекстаФайлов/СтатусыИзвлеченияТекстаФайлов.mdo new file mode 100644 index 000000000..aaf1e3d8e --- /dev/null +++ b/SSL/src/Enums/СтатусыИзвлеченияТекстаФайлов/СтатусыИзвлеченияТекстаФайлов.mdo @@ -0,0 +1,52 @@ + + + + + + + + СтатусыИзвлеченияТекстаФайлов + + ru + Статусы извлечения текста файлов + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + НеИзвлечен + + ru + Не извлечен + + + + Извлечен + + ru + Извлечен + + + + ИзвлечьНеУдалось + + ru + Извлечь не удалось + + + diff --git a/SSL/src/Enums/ТипыВариантовОтчетов/ТипыВариантовОтчетов.mdo b/SSL/src/Enums/ТипыВариантовОтчетов/ТипыВариантовОтчетов.mdo new file mode 100644 index 000000000..ec1ff23de --- /dev/null +++ b/SSL/src/Enums/ТипыВариантовОтчетов/ТипыВариантовОтчетов.mdo @@ -0,0 +1,54 @@ + + + + + + + + ТипыВариантовОтчетов + + ru + Типы вариантов отчетов + + true + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Пользовательский + + ru + Пользовательский + + + + Предопределенный + + ru + Предопределенный + + + + Отчет + + ru + Отчет + + Открывается отчет без установки варианта + + diff --git a/SSL/src/Enums/ТипыВопросовШаблонаАнкеты/ТипыВопросовШаблонаАнкеты.mdo b/SSL/src/Enums/ТипыВопросовШаблонаАнкеты/ТипыВопросовШаблонаАнкеты.mdo new file mode 100644 index 000000000..90b454053 --- /dev/null +++ b/SSL/src/Enums/ТипыВопросовШаблонаАнкеты/ТипыВопросовШаблонаАнкеты.mdo @@ -0,0 +1,53 @@ + + + + + + + + ТипыВопросовШаблонаАнкеты + + ru + Типы вопросов шаблона анкеты + + true + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Простой + + ru + Простой + + + + ВопросСУсловием + + ru + Вопрос с условием + + + + Табличный + + ru + Табличный + + + diff --git a/SSL/src/Enums/ТипыКонтактнойИнформации/ТипыКонтактнойИнформации.mdo b/SSL/src/Enums/ТипыКонтактнойИнформации/ТипыКонтактнойИнформации.mdo new file mode 100644 index 000000000..6a61aa399 --- /dev/null +++ b/SSL/src/Enums/ТипыКонтактнойИнформации/ТипыКонтактнойИнформации.mdo @@ -0,0 +1,73 @@ + + + + + + + + ТипыКонтактнойИнформации + + ru + Типы контактной информации + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Адрес + + ru + Адрес + + + + Телефон + + ru + Телефон + + + + АдресЭлектроннойПочты + + ru + Адрес электронной почты + + + + ВебСтраница + + ru + Веб страница + + + + Факс + + ru + Факс + + + + Другое + + ru + Другое + + + diff --git a/SSL/src/Enums/ТипыОтветовНаВопрос/ТипыОтветовНаВопрос.mdo b/SSL/src/Enums/ТипыОтветовНаВопрос/ТипыОтветовНаВопрос.mdo new file mode 100644 index 000000000..fa75f709d --- /dev/null +++ b/SSL/src/Enums/ТипыОтветовНаВопрос/ТипыОтветовНаВопрос.mdo @@ -0,0 +1,95 @@ + + + + + + + + ТипыОтветовНаВопрос + + ru + Типы ответов на вопрос + + true + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Строка + + ru + Строка + + + + Текст + + ru + Текст + + + + Число + + ru + Число + + + + Дата + + ru + Дата + + + + Булево + + ru + Булево + + + + ЗначениеИнформационнойБазы + + ru + Значение информационной базы + + + + ВидКонтактнойИнформации + + ru + Вид контактной информации + + + + ОдинВариантИз + + ru + Выбор одного варианта ответа из предложенных + + + + НесколькоВариантовИз + + ru + Выбор нескольких вариантов ответа из предложенных + + + diff --git a/SSL/src/Enums/ТипыТабличныхВопросов/ТипыТабличныхВопросов.mdo b/SSL/src/Enums/ТипыТабличныхВопросов/ТипыТабличныхВопросов.mdo new file mode 100644 index 000000000..dd7564108 --- /dev/null +++ b/SSL/src/Enums/ТипыТабличныхВопросов/ТипыТабличныхВопросов.mdo @@ -0,0 +1,60 @@ + + + + + + + + ТипыТабличныхВопросов + + ru + Типы табличных вопросов + + true + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Составной + + ru + Составной + + + + ПредопределенныеОтветыВСтроках + + ru + Предопределенные ответы в строках + + + + ПредопределенныеОтветыВКолонках + + ru + Предопределенные ответы в колонках + + + + ПредопределенныеОтветыВСтрокахИКолонках + + ru + Предопределенные ответы в строках и колонках + + + diff --git a/SSL/src/Enums/ТипыТекстовЭлектронныхПисем/ТипыТекстовЭлектронныхПисем.mdo b/SSL/src/Enums/ТипыТекстовЭлектронныхПисем/ТипыТекстовЭлектронныхПисем.mdo new file mode 100644 index 000000000..84078e08b --- /dev/null +++ b/SSL/src/Enums/ТипыТекстовЭлектронныхПисем/ТипыТекстовЭлектронныхПисем.mdo @@ -0,0 +1,60 @@ + + + + + + + + ТипыТекстовЭлектронныхПисем + + ru + Типы текстов электронных писем + + true + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + HTML + + ru + HTML + + + + ПростойТекст + + ru + Простой текст + + + + РазмеченныйТекст + + ru + Размеченный текст + + + + HTMLСКартинками + + ru + HTML с картинками + + + diff --git a/SSL/src/Enums/ТипыХраненияФайлов/ТипыХраненияФайлов.mdo b/SSL/src/Enums/ТипыХраненияФайлов/ТипыХраненияФайлов.mdo new file mode 100644 index 000000000..99ba85b2a --- /dev/null +++ b/SSL/src/Enums/ТипыХраненияФайлов/ТипыХраненияФайлов.mdo @@ -0,0 +1,45 @@ + + + + + + + + ТипыХраненияФайлов + + ru + Типы хранения файлов + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + ВИнформационнойБазе + + ru + В информационной базе + + + + ВТомахНаДиске + + ru + В томах на диске + + + diff --git a/SSL/src/Enums/ФорматыСканированногоИзображения/ФорматыСканированногоИзображения.mdo b/SSL/src/Enums/ФорматыСканированногоИзображения/ФорматыСканированногоИзображения.mdo new file mode 100644 index 000000000..a53f7b720 --- /dev/null +++ b/SSL/src/Enums/ФорматыСканированногоИзображения/ФорматыСканированногоИзображения.mdo @@ -0,0 +1,66 @@ + + + + + + + + ФорматыСканированногоИзображения + + ru + Форматы сканированного изображения + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + BMP + + ru + BMP + + + + JPG + + ru + JPG + + + + GIF + + ru + GIF + + + + PNG + + ru + PNG + + + + TIF + + ru + TIF + + + diff --git a/SSL/src/Enums/ЦветностиИзображения/ЦветностиИзображения.mdo b/SSL/src/Enums/ЦветностиИзображения/ЦветностиИзображения.mdo new file mode 100644 index 000000000..eb3995818 --- /dev/null +++ b/SSL/src/Enums/ЦветностиИзображения/ЦветностиИзображения.mdo @@ -0,0 +1,52 @@ + + + + + + + + ЦветностиИзображения + + ru + Цветности изображения + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Монохромное + + ru + Монохромное + + + + ГрадацииСерого + + ru + Градации серого + + + + Цветное + + ru + Цветное + + + diff --git a/SSL/src/EventSubscriptions/ЗаписатьВСписокБизнесПроцессов/ЗаписатьВСписокБизнесПроцессов.mdo b/SSL/src/EventSubscriptions/ЗаписатьВСписокБизнесПроцессов/ЗаписатьВСписокБизнесПроцессов.mdo new file mode 100644 index 000000000..6e72779b4 --- /dev/null +++ b/SSL/src/EventSubscriptions/ЗаписатьВСписокБизнесПроцессов/ЗаписатьВСписокБизнесПроцессов.mdo @@ -0,0 +1,13 @@ + + + ЗаписатьВСписокБизнесПроцессов + + ru + Записать в список бизнес процессов + + + BusinessProcessObject + + OnWrite + CommonModule.БизнесПроцессыИЗадачиСобытия.ЗаписатьВСписокБизнесПроцессов + diff --git a/SSL/src/EventSubscriptions/ЗаписатьГруппыИВидыДоступа/ЗаписатьГруппыИВидыДоступа.mdo b/SSL/src/EventSubscriptions/ЗаписатьГруппыИВидыДоступа/ЗаписатьГруппыИВидыДоступа.mdo new file mode 100644 index 000000000..a6aafb95f --- /dev/null +++ b/SSL/src/EventSubscriptions/ЗаписатьГруппыИВидыДоступа/ЗаписатьГруппыИВидыДоступа.mdo @@ -0,0 +1,16 @@ + + + ЗаписатьГруппыИВидыДоступа + + ru + Записать группы и виды доступа + + + CatalogObject.ГруппыВнешнихПользователей + CatalogObject.ВнешниеПользователи + CatalogObject.ГруппыПользователей + CatalogObject.Пользователи + + OnWrite + CommonModule.УправлениеДоступомСобытия.ЗаписатьГруппыИВидыДоступа + diff --git a/SSL/src/EventSubscriptions/ЗаписатьЗависимыеНаборыЗначенийДоступа/ЗаписатьЗависимыеНаборыЗначенийДоступа.mdo b/SSL/src/EventSubscriptions/ЗаписатьЗависимыеНаборыЗначенийДоступа/ЗаписатьЗависимыеНаборыЗначенийДоступа.mdo new file mode 100644 index 000000000..4a3ce77aa --- /dev/null +++ b/SSL/src/EventSubscriptions/ЗаписатьЗависимыеНаборыЗначенийДоступа/ЗаписатьЗависимыеНаборыЗначенийДоступа.mdo @@ -0,0 +1,13 @@ + + + ЗаписатьЗависимыеНаборыЗначенийДоступа + + ru + Записать зависимые наборы значений доступа + + + ChartOfCharacteristicTypesObject.ВидыДоступа + + OnWrite + CommonModule.УправлениеДоступомСобытия.ЗаписатьЗависимыеНаборыЗначенийДоступа + diff --git a/SSL/src/EventSubscriptions/ЗаписатьНаборыЗначенийДоступа/ЗаписатьНаборыЗначенийДоступа.mdo b/SSL/src/EventSubscriptions/ЗаписатьНаборыЗначенийДоступа/ЗаписатьНаборыЗначенийДоступа.mdo new file mode 100644 index 000000000..973e387a7 --- /dev/null +++ b/SSL/src/EventSubscriptions/ЗаписатьНаборыЗначенийДоступа/ЗаписатьНаборыЗначенийДоступа.mdo @@ -0,0 +1,13 @@ + + + ЗаписатьНаборыЗначенийДоступа + + ru + Записать наборы значений доступа + + + ChartOfCharacteristicTypesObject.ВидыДоступа + + OnWrite + CommonModule.УправлениеДоступомСобытия.ЗаписатьНаборыЗначенийДоступа + diff --git a/SSL/src/EventSubscriptions/ЗаполнитьКонтактнуюИнформацию/ЗаполнитьКонтактнуюИнформацию.mdo b/SSL/src/EventSubscriptions/ЗаполнитьКонтактнуюИнформацию/ЗаполнитьКонтактнуюИнформацию.mdo new file mode 100644 index 000000000..75cbb4234 --- /dev/null +++ b/SSL/src/EventSubscriptions/ЗаполнитьКонтактнуюИнформацию/ЗаполнитьКонтактнуюИнформацию.mdo @@ -0,0 +1,13 @@ + + + ЗаполнитьКонтактнуюИнформацию + + ru + Заполнить контактную информацию + + + CatalogObject.Пользователи + + Filling + CommonModule.УправлениеКонтактнойИнформациейСобытия.ОбработкаЗаполненияКИ + diff --git a/SSL/src/EventSubscriptions/ОбменДаннымиПередЗаписьюУзлаПланаОбмена/ОбменДаннымиПередЗаписьюУзлаПланаОбмена.mdo b/SSL/src/EventSubscriptions/ОбменДаннымиПередЗаписьюУзлаПланаОбмена/ОбменДаннымиПередЗаписьюУзлаПланаОбмена.mdo new file mode 100644 index 000000000..0b2d375e1 --- /dev/null +++ b/SSL/src/EventSubscriptions/ОбменДаннымиПередЗаписьюУзлаПланаОбмена/ОбменДаннымиПередЗаписьюУзлаПланаОбмена.mdo @@ -0,0 +1,13 @@ + + + ОбменДаннымиПередЗаписьюУзлаПланаОбмена + + ru + Обмен данными перед записью узла плана обмена + + + ExchangePlanObject + + BeforeWrite + CommonModule.ОбменДаннымиСобытия.ОбменДаннымиПередЗаписьюУзлаПланаОбменаПередЗаписью + diff --git a/SSL/src/EventSubscriptions/ОбменДаннымиПередУдалениемУзлаПланаОбмена/ОбменДаннымиПередУдалениемУзлаПланаОбмена.mdo b/SSL/src/EventSubscriptions/ОбменДаннымиПередУдалениемУзлаПланаОбмена/ОбменДаннымиПередУдалениемУзлаПланаОбмена.mdo new file mode 100644 index 000000000..7fa1d393a --- /dev/null +++ b/SSL/src/EventSubscriptions/ОбменДаннымиПередУдалениемУзлаПланаОбмена/ОбменДаннымиПередУдалениемУзлаПланаОбмена.mdo @@ -0,0 +1,13 @@ + + + ОбменДаннымиПередУдалениемУзлаПланаОбмена + + ru + Обмен данными перед удалением узла плана обмена + + + ExchangePlanObject + + BeforeDelete + CommonModule.ОбменДаннымиСобытия.ОбменДаннымиПередУдалениемУзлаПланаОбменаПередУдалением + diff --git a/SSL/src/EventSubscriptions/ОбновитьПредставлениеВнешнегоПользователя/ОбновитьПредставлениеВнешнегоПользователя.mdo b/SSL/src/EventSubscriptions/ОбновитьПредставлениеВнешнегоПользователя/ОбновитьПредставлениеВнешнегоПользователя.mdo new file mode 100644 index 000000000..d5514d33d --- /dev/null +++ b/SSL/src/EventSubscriptions/ОбновитьПредставлениеВнешнегоПользователя/ОбновитьПредставлениеВнешнегоПользователя.mdo @@ -0,0 +1,13 @@ + + + ОбновитьПредставлениеВнешнегоПользователя + + ru + Обновить представление внешнего пользователя + + + CatalogObject.ВнешниеПользователи + + OnWrite + CommonModule.ВнешниеПользователиСобытия.ОбновитьПредставлениеВнешнегоПользователя + diff --git a/SSL/src/EventSubscriptions/УстановитьПометкуУдаленияЗадач/УстановитьПометкуУдаленияЗадач.mdo b/SSL/src/EventSubscriptions/УстановитьПометкуУдаленияЗадач/УстановитьПометкуУдаленияЗадач.mdo new file mode 100644 index 000000000..b8dd4826d --- /dev/null +++ b/SSL/src/EventSubscriptions/УстановитьПометкуУдаленияЗадач/УстановитьПометкуУдаленияЗадач.mdo @@ -0,0 +1,13 @@ + + + УстановитьПометкуУдаленияЗадач + + ru + Установить пометку удаления задач + + + BusinessProcessObject + + BeforeWrite + CommonModule.БизнесПроцессыИЗадачиСобытия.УстановитьПометкуУдаленияЗадач + diff --git a/SSL/src/FilterCriteria/СвязанныеДокументы/СвязанныеДокументы.mdo b/SSL/src/FilterCriteria/СвязанныеДокументы/СвязанныеДокументы.mdo new file mode 100644 index 000000000..bd503b2dd --- /dev/null +++ b/SSL/src/FilterCriteria/СвязанныеДокументы/СвязанныеДокументы.mdo @@ -0,0 +1,18 @@ + + + + + + + СвязанныеДокументы + + ru + Связанные документы + + + String + + 10 + + + diff --git a/SSL/src/FilterCriteria/ФайлыВТоме/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/FilterCriteria/ФайлыВТоме/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/FilterCriteria/ФайлыВТоме/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/FilterCriteria/ФайлыВТоме/Forms/ФормаСписка/Form.form b/SSL/src/FilterCriteria/ФайлыВТоме/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..d1528fbb7 --- /dev/null +++ b/SSL/src/FilterCriteria/ФайлыВТоме/Forms/ФормаСписка/Form.form @@ -0,0 +1,370 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + КартинкаИНаименование + 14 + + СсылкаИндексКартинки + 6 + true + true + + true + + + Список.Ref.ИндексКартинки + + + СсылкаИндексКартинкиРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + СсылкаИндексКартинкиКонтекстноеМеню + 7 + true + + PictureField + Enter + Left + true + + true + true + true + true + + CommonPicture.ПиктограммыФайлов + + + + 1 + + + + + СсылкаПутьКФайлу + 8 + true + true + + true + + + Список.Ref.ПутьКФайлу + + + СсылкаПутьКФайлуРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + СсылкаПутьКФайлуКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Картинка и наименование</value> + + + ru + Картинка и наименование + + + КартинкаИНаименованиеРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + СсылкаРазмер + 10 + true + true + + true + + + Список.Ref.Размер + + + СсылкаРазмерРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + СсылкаРазмерКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СсылкаАвтор + 12 + true + true + + true + + + Список.Ref.Автор + + + СсылкаАвторРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + СсылкаАвторКонтекстноеМеню + 13 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 16 + + СписокСтрокаПоискаРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 17 + true + + Список + + true + + + + СписокСостояниеПросмотра + 19 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 20 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 22 + + СписокУправлениеПоискомРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 23 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + FilterCriterion.ФайлыВТоме + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/FilterCriteria/ФайлыВТоме/ФайлыВТоме.mdo b/SSL/src/FilterCriteria/ФайлыВТоме/ФайлыВТоме.mdo new file mode 100644 index 000000000..6f5c633db --- /dev/null +++ b/SSL/src/FilterCriteria/ФайлыВТоме/ФайлыВТоме.mdo @@ -0,0 +1,27 @@ + + + + + + + ФайлыВТоме + + ru + Файлы в томе + + + CatalogRef.ТомаХраненияФайлов + + true + Catalog.ВерсииФайлов.Attribute.Том + FilterCriterion.ФайлыВТоме.Form.ФормаСписка + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/FunctionalOptions/АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО/АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО.mdo b/SSL/src/FunctionalOptions/АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО/АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО.mdo new file mode 100644 index 000000000..317cb8da0 --- /dev/null +++ b/SSL/src/FunctionalOptions/АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО/АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО.mdo @@ -0,0 +1,10 @@ + + + АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО + + ru + Актуальная дата обновления повторно используемых значений МРО + + Constant.ДатаОбновленияПовторноИспользуемыхЗначенийМРО + true + diff --git a/SSL/src/FunctionalOptions/ВариантыВерсионированияОбъектов/ВариантыВерсионированияОбъектов.mdo b/SSL/src/FunctionalOptions/ВариантыВерсионированияОбъектов/ВариантыВерсионированияОбъектов.mdo new file mode 100644 index 000000000..accb760f6 --- /dev/null +++ b/SSL/src/FunctionalOptions/ВариантыВерсионированияОбъектов/ВариантыВерсионированияОбъектов.mdo @@ -0,0 +1,9 @@ + + + ВариантыВерсионированияОбъектов + + ru + Варианты версионирования объектов + + InformationRegister.НастройкаВерсионированияОбъектов.Resource.Вариант + diff --git a/SSL/src/FunctionalOptions/ИзменятьЗаданияЗаднимЧислом/ИзменятьЗаданияЗаднимЧислом.mdo b/SSL/src/FunctionalOptions/ИзменятьЗаданияЗаднимЧислом/ИзменятьЗаданияЗаднимЧислом.mdo new file mode 100644 index 000000000..88e44c2fb --- /dev/null +++ b/SSL/src/FunctionalOptions/ИзменятьЗаданияЗаднимЧислом/ИзменятьЗаданияЗаднимЧислом.mdo @@ -0,0 +1,11 @@ + + + ИзменятьЗаданияЗаднимЧислом + + ru + Изменять задания "задним числом" + + при изменении важности, крайнего срока, наименования и автора у БП Задание изменять их также в невыполненных задачах + Constant.ИзменятьЗаданияЗаднимЧислом + true + diff --git a/SSL/src/FunctionalOptions/ИспользоватьАнкетирование/ИспользоватьАнкетирование.mdo b/SSL/src/FunctionalOptions/ИспользоватьАнкетирование/ИспользоватьАнкетирование.mdo new file mode 100644 index 000000000..f48999652 --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьАнкетирование/ИспользоватьАнкетирование.mdo @@ -0,0 +1,20 @@ + + + ИспользоватьАнкетирование + + ru + Использовать анкетирование + + Constant.ИспользоватьАнкетирование + true + ChartOfCharacteristicTypes.ВопросыДляАнкетирования + Catalog.ВариантыОтветовАнкет + Document.НазначениеОпросов + Document.Анкета + InformationRegister.ОтветыНаВопросыАнкет + Report.АнализОпроса + Catalog.ШаблоныАнкет + Catalog.ВопросыШаблонаАнкеты + Subsystem.СтандартныеПодсистемы.Subsystem.Анкетирование + Report.АнкетированиеАналитическийОтчет + diff --git a/SSL/src/FunctionalOptions/ИспользоватьБизнесПроцессыИЗадачи/ИспользоватьБизнесПроцессыИЗадачи.mdo b/SSL/src/FunctionalOptions/ИспользоватьБизнесПроцессыИЗадачи/ИспользоватьБизнесПроцессыИЗадачи.mdo new file mode 100644 index 000000000..782214c2f --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьБизнесПроцессыИЗадачи/ИспользоватьБизнесПроцессыИЗадачи.mdo @@ -0,0 +1,33 @@ + + + ИспользоватьБизнесПроцессыИЗадачи + + ru + Использовать бизнес процессы и задачи + + Constant.ИспользоватьБизнесПроцессыИЗадачи + true + Task.ЗадачаИсполнителя.Command.ВсеЗадачи + Task.ЗадачаИсполнителя.Command.Выполнено + Task.ЗадачаИсполнителя.Command.МоиЗадачи + Task.ЗадачаИсполнителя.Command.Перенаправить + InformationRegister.СписокБизнесПроцессов.Command.МоиБизнесПроцессы + DataProcessor.КартаМаршрутаБизнесПроцесса + Report.СписокЗависшихЗадач + Report.СписокИстекающихЗадач + Report.СписокПросроченныхЗадач + Report.СправкаОбИсполнительскойДисциплине + Report.Задачи + CommonCommand.ЗадачиПоПредмету + CommonCommand.РолеваяАдресацияПоОбъекту + Catalog.РолиИсполнителей + Enum.ВариантыВажностиЗадачи + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач + InformationRegister.ИсполнителиЗадач + InformationRegister.СписокБизнесПроцессов + BusinessProcess.Задание + InformationRegister.ИсполнителиЗадач.Command.НастройкаРолевойАдресации + CommonCommand.ЗадачиПоБизнесПроцессу + CommonCommand.КартаМаршрутаБизнесПроцесса + Task.ЗадачаИсполнителя + diff --git a/SSL/src/FunctionalOptions/ИспользоватьВерсионированиеОбъекта/ИспользоватьВерсионированиеОбъекта.mdo b/SSL/src/FunctionalOptions/ИспользоватьВерсионированиеОбъекта/ИспользоватьВерсионированиеОбъекта.mdo new file mode 100644 index 000000000..6ffb9aeb9 --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьВерсионированиеОбъекта/ИспользоватьВерсионированиеОбъекта.mdo @@ -0,0 +1,11 @@ + + + ИспользоватьВерсионированиеОбъекта + + ru + Использовать версионирование объекта + + Управляет доступностью версионирования для каждого отдельного объекта + InformationRegister.НастройкаВерсионированияОбъектов.Resource.Использовать + CommonCommand.ИсторияИзменений + diff --git a/SSL/src/FunctionalOptions/ИспользоватьВерсионированиеОбъектов/ИспользоватьВерсионированиеОбъектов.mdo b/SSL/src/FunctionalOptions/ИспользоватьВерсионированиеОбъектов/ИспользоватьВерсионированиеОбъектов.mdo new file mode 100644 index 000000000..c2e032ab4 --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьВерсионированиеОбъектов/ИспользоватьВерсионированиеОбъектов.mdo @@ -0,0 +1,14 @@ + + + ИспользоватьВерсионированиеОбъектов + + ru + Использовать версионирование объектов + + Управляет использованием подсистемы версионирования объектов + Constant.ИспользоватьВерсионированиеОбъектов + true + InformationRegister.НастройкаВерсионированияОбъектов + InformationRegister.ВерсииОбъектов + Report.ОтчетПоВерсиям + diff --git a/SSL/src/FunctionalOptions/ИспользоватьВнешнихПользователей/ИспользоватьВнешнихПользователей.mdo b/SSL/src/FunctionalOptions/ИспользоватьВнешнихПользователей/ИспользоватьВнешнихПользователей.mdo new file mode 100644 index 000000000..34b499fb3 --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьВнешнихПользователей/ИспользоватьВнешнихПользователей.mdo @@ -0,0 +1,14 @@ + + + ИспользоватьВнешнихПользователей + + ru + Использовать внешних пользователей + + Constant.ИспользоватьВнешнихПользователей + true + Catalog.ВнешниеПользователи + Catalog.ГруппыВнешнихПользователей + CommonCommand.ВнешнийПользовательОбъектаАвторизации + CommonCommand.ПраваВнешнегоПользователяПоЗначениямДоступа + diff --git a/SSL/src/FunctionalOptions/ИспользоватьДатуИВремяВСрокахЗадач/ИспользоватьДатуИВремяВСрокахЗадач.mdo b/SSL/src/FunctionalOptions/ИспользоватьДатуИВремяВСрокахЗадач/ИспользоватьДатуИВремяВСрокахЗадач.mdo new file mode 100644 index 000000000..05716433c --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьДатуИВремяВСрокахЗадач/ИспользоватьДатуИВремяВСрокахЗадач.mdo @@ -0,0 +1,11 @@ + + + ИспользоватьДатуИВремяВСрокахЗадач + + ru + Использовать дату и время в сроках задач + + Если Ложь, то только дату, без времени. + Constant.ИспользоватьДатуИВремяВСрокахЗадач + true + diff --git a/SSL/src/FunctionalOptions/ИспользоватьДатуНачалаЗадач/ИспользоватьДатуНачалаЗадач.mdo b/SSL/src/FunctionalOptions/ИспользоватьДатуНачалаЗадач/ИспользоватьДатуНачалаЗадач.mdo new file mode 100644 index 000000000..644203866 --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьДатуНачалаЗадач/ИспользоватьДатуНачалаЗадач.mdo @@ -0,0 +1,11 @@ + + + ИспользоватьДатуНачалаЗадач + + ru + Использовать дату начала задач + + Constant.ИспользоватьДатуНачалаЗадач + true + Task.ЗадачаИсполнителя.Attribute.ДатаНачала + diff --git a/SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиЗаполненияОбъекта/ИспользоватьДополнительныеОтчетыИОбработкиЗаполненияОбъекта.mdo b/SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиЗаполненияОбъекта/ИспользоватьДополнительныеОтчетыИОбработкиЗаполненияОбъекта.mdo new file mode 100644 index 000000000..74c9a7cee --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиЗаполненияОбъекта/ИспользоватьДополнительныеОтчетыИОбработкиЗаполненияОбъекта.mdo @@ -0,0 +1,10 @@ + + + ИспользоватьДополнительныеОтчетыИОбработкиЗаполненияОбъекта + + ru + Использовать дополнительные отчеты и обработки заполнения объекта + + InformationRegister.НазначениеДополнительныхОбработок.Resource.ИспользоватьЗаполнениеОбъекта + CommonCommand.ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта + diff --git a/SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиОтчеты/ИспользоватьДополнительныеОтчетыИОбработкиОтчеты.mdo b/SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиОтчеты/ИспользоватьДополнительныеОтчетыИОбработкиОтчеты.mdo new file mode 100644 index 000000000..5b7006ca6 --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиОтчеты/ИспользоватьДополнительныеОтчетыИОбработкиОтчеты.mdo @@ -0,0 +1,10 @@ + + + ИспользоватьДополнительныеОтчетыИОбработкиОтчеты + + ru + Использовать дополнительные отчеты и обработки отчеты + + InformationRegister.НазначениеДополнительныхОбработок.Resource.ИспользоватьОтчеты + CommonCommand.ДополнительныеОтчетыИОбработкиОтчеты + diff --git a/SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиПечатныеФормы/ИспользоватьДополнительныеОтчетыИОбработкиПечатныеФормы.mdo b/SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиПечатныеФормы/ИспользоватьДополнительныеОтчетыИОбработкиПечатныеФормы.mdo new file mode 100644 index 000000000..5ea96fe2d --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиПечатныеФормы/ИспользоватьДополнительныеОтчетыИОбработкиПечатныеФормы.mdo @@ -0,0 +1,10 @@ + + + ИспользоватьДополнительныеОтчетыИОбработкиПечатныеФормы + + ru + Использовать дополнительные отчеты и обработки печатные формы + + InformationRegister.НазначениеДополнительныхОбработок.Resource.ИспользоватьПечатныеФормы + CommonCommand.ДополнительныеОтчетыИОбработкиПечатныеФормы + diff --git a/SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/ИспользоватьДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов.mdo b/SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/ИспользоватьДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов.mdo new file mode 100644 index 000000000..80207274e --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/ИспользоватьДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов.mdo @@ -0,0 +1,10 @@ + + + ИспользоватьДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов + + ru + Использовать дополнительные отчеты и обработки создание связанных объектов + + InformationRegister.НазначениеДополнительныхОбработок.Resource.ИспользоватьСозданиеСвязанныхОбъектов + CommonCommand.ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов + diff --git a/SSL/src/FunctionalOptions/ИспользоватьДополнительныеРеквизитыИСведения/ИспользоватьДополнительныеРеквизитыИСведения.mdo b/SSL/src/FunctionalOptions/ИспользоватьДополнительныеРеквизитыИСведения/ИспользоватьДополнительныеРеквизитыИСведения.mdo new file mode 100644 index 000000000..ee724ce7a --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьДополнительныеРеквизитыИСведения/ИспользоватьДополнительныеРеквизитыИСведения.mdo @@ -0,0 +1,17 @@ + + + ИспользоватьДополнительныеРеквизитыИСведения + + ru + Использовать дополнительные реквизиты и сведения + + Constant.ИспользоватьДополнительныеРеквизитыИСведения + true + Catalog.НаборыДополнительныхРеквизитовИСведений + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения + CommonCommand.ДополнительныеСведения + InformationRegister.ДополнительныеСведения + Catalog.ЗначенияСвойствОбъектов + Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеРеквизиты + Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеСведения + diff --git a/SSL/src/FunctionalOptions/ИспользоватьОбменДанными/ИспользоватьОбменДанными.mdo b/SSL/src/FunctionalOptions/ИспользоватьОбменДанными/ИспользоватьОбменДанными.mdo new file mode 100644 index 000000000..43427f461 --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьОбменДанными/ИспользоватьОбменДанными.mdo @@ -0,0 +1,38 @@ + + + ИспользоватьОбменДанными + + ru + Обмен данными + + Опция использования подсистемы ОбменДанными в пользовательском интерфейсе + Constant.ИспользоватьОбменДанными + true + Subsystem.СтандартныеПодсистемы.Subsystem.ОбменДанными + Catalog.СценарииОбменовДанными + DataProcessor.ЗагрузкаПравилРегистрацииОбъектов + DataProcessor.КонвертацияОбъектовИнформационныхБаз + DataProcessor.ТранспортСообщенийОбменаFILE + InformationRegister.НастройкиТранспортаОбмена + InformationRegister.СостояниеОбменовДанными + CommonCommand.НастроитьПараметрыТранспортаСообщенийОбмена + CommonCommand.ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + Constant.ДатаОбновленияПовторноИспользуемыхЗначенийМРО + InformationRegister.СоответствиеОбъектовИнформационныхБаз + Enum.ВидыПравилДляОбменаДанными + InformationRegister.ПравилаДляОбменаДанными + Enum.ИсточникиПравилДляОбменаДанными + CommonCommand.ОткрытьПравилаКонвертацииОбъектов + CommonCommand.ОткрытьПравилаРегистрацииОбъектов + DataProcessor.ПомощникСозданияОбменаДанными + DataProcessor.ЗагрузкаПравилКонвертацииОбъектов + DataProcessor.СопоставлениеОбъектовИнформационныхБаз + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз + InformationRegister.СостояниеУспешныхОбменовДанными + DataProcessor.КонвертацияОбъектовРаспределенныхИнформационныхБаз + CommonCommand.ОткрытьФормуУправленияОбменамиДанных + CommonCommand.ВыполнитьОбменДанными + CommonCommand.ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + CommonCommand.ОткрытьСценарииОбменовДанными + Enum.ВерсииПодсистемыОбменаДанными + diff --git a/SSL/src/FunctionalOptions/ИспользоватьПолнотекстовыйПоиск/ИспользоватьПолнотекстовыйПоиск.mdo b/SSL/src/FunctionalOptions/ИспользоватьПолнотекстовыйПоиск/ИспользоватьПолнотекстовыйПоиск.mdo new file mode 100644 index 000000000..07098cf2d --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьПолнотекстовыйПоиск/ИспользоватьПолнотекстовыйПоиск.mdo @@ -0,0 +1,13 @@ + + + ИспользоватьПолнотекстовыйПоиск + + ru + Использовать полнотекстовый поиск + + Constant.ИспользоватьПолнотекстовыйПоиск + true + DataProcessor.ПолнотекстовыйПоискВДанных + DataProcessor.ПолнотекстовыйПоискВДанных.Command.ПолнотекстовыйПоиск + DataProcessor.УправлениеПолнотекстовымПоиском + diff --git a/SSL/src/FunctionalOptions/ИспользоватьЭлектронноЦифровыеПодписиИШифрование/ИспользоватьЭлектронноЦифровыеПодписиИШифрование.mdo b/SSL/src/FunctionalOptions/ИспользоватьЭлектронноЦифровыеПодписиИШифрование/ИспользоватьЭлектронноЦифровыеПодписиИШифрование.mdo new file mode 100644 index 000000000..b199e43e8 --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьЭлектронноЦифровыеПодписиИШифрование/ИспользоватьЭлектронноЦифровыеПодписиИШифрование.mdo @@ -0,0 +1,21 @@ + + + ИспользоватьЭлектронноЦифровыеПодписиИШифрование + + ru + Использовать электронно цифровые подписи и шифрование + + Constant.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + true + Constant.АлгоритмПодписи + Constant.АлгоритмХеширования + Constant.ВыполнятьПроверкуЭЦПНаСервере + Constant.ПровайдерЭЦП + Constant.ТипПровайдераЭЦП + Catalog.ВерсииФайлов.Attribute.Подписан + Catalog.Файлы.Attribute.Подписан + Catalog.ВерсииФайлов.TabularSection.ЭлектронноЦифровыеПодписи + Catalog.Файлы.Attribute.Зашифрован + Catalog.ВерсииФайлов.Attribute.Зашифрован + Catalog.Файлы.TabularSection.СертификатыШифрования + diff --git a/SSL/src/FunctionalOptions/ОграничиватьДоступНаУровнеЗаписей/ОграничиватьДоступНаУровнеЗаписей.mdo b/SSL/src/FunctionalOptions/ОграничиватьДоступНаУровнеЗаписей/ОграничиватьДоступНаУровнеЗаписей.mdo new file mode 100644 index 000000000..fd71dbf17 --- /dev/null +++ b/SSL/src/FunctionalOptions/ОграничиватьДоступНаУровнеЗаписей/ОграничиватьДоступНаУровнеЗаписей.mdo @@ -0,0 +1,28 @@ + + + ОграничиватьДоступНаУровнеЗаписей + + ru + Ограничивать доступ на уровне записей + + Constant.ОграничиватьДоступНаУровнеЗаписей + true + CommonCommand.ПраваВнешнегоПользователяПоЗначениямДоступа + CommonCommand.ПраваПоЗначениюДоступа + CommonCommand.ПраваПользователяПоЗначениямДоступа + Catalog.ПрофилиГруппДоступа.TabularSection.ВидыДоступа + Catalog.ПрофилиГруппДоступа.TabularSection.ВидыДоступа.Attribute.ВидДоступа + Catalog.ПрофилиГруппДоступа.TabularSection.ВидыДоступа.Attribute.Предустановленный + Catalog.ПрофилиГруппДоступа.TabularSection.ВидыДоступа.Attribute.ДоступРазрешен + Catalog.ПрофилиГруппДоступа.TabularSection.ЗначенияДоступа + Catalog.ПрофилиГруппДоступа.TabularSection.ЗначенияДоступа.Attribute.ВидДоступа + Catalog.ПрофилиГруппДоступа.TabularSection.ЗначенияДоступа.Attribute.ЗначениеДоступа + Catalog.ГруппыДоступа.TabularSection.ВидыДоступа + Catalog.ГруппыДоступа.TabularSection.ВидыДоступа.Attribute.ВидДоступа + Catalog.ГруппыДоступа.TabularSection.ВидыДоступа.Attribute.ДоступРазрешен + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа.Attribute.ВидДоступа + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа.Attribute.ЗначениеДоступа + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа.Attribute.ДоступРазрешен + ChartOfCharacteristicTypes.ВидыДоступа + diff --git a/SSL/src/FunctionalOptions/ПрефиксИнформационнойБазы/ПрефиксИнформационнойБазы.mdo b/SSL/src/FunctionalOptions/ПрефиксИнформационнойБазы/ПрефиксИнформационнойБазы.mdo new file mode 100644 index 000000000..fa5b27743 --- /dev/null +++ b/SSL/src/FunctionalOptions/ПрефиксИнформационнойБазы/ПрефиксИнформационнойБазы.mdo @@ -0,0 +1,11 @@ + + + ПрефиксИнформационнойБазы + + ru + Префикс информационной базы + + Содержит префикс ИБ + Constant.ПрефиксУзлаРаспределеннойИнформационнойБазы + true + diff --git a/SSL/src/FunctionalOptions/ПрефиксыОрганизаций/ПрефиксыОрганизаций.mdo b/SSL/src/FunctionalOptions/ПрефиксыОрганизаций/ПрефиксыОрганизаций.mdo new file mode 100644 index 000000000..6b9acb87d --- /dev/null +++ b/SSL/src/FunctionalOptions/ПрефиксыОрганизаций/ПрефиксыОрганизаций.mdo @@ -0,0 +1,10 @@ + + + ПрефиксыОрганизаций + + ru + Префиксы организаций + + Содержит префиксы организаций + Catalog.Организации.Attribute.Префикс + diff --git a/SSL/src/FunctionalOptionsParameters/Организация/Организация.mdo b/SSL/src/FunctionalOptionsParameters/Организация/Организация.mdo new file mode 100644 index 000000000..892929af3 --- /dev/null +++ b/SSL/src/FunctionalOptionsParameters/Организация/Организация.mdo @@ -0,0 +1,9 @@ + + + Организация + + ru + Организация + + Catalog.Организации + diff --git a/SSL/src/FunctionalOptionsParameters/ТипОбъектаКонфигурации/ТипОбъектаКонфигурации.mdo b/SSL/src/FunctionalOptionsParameters/ТипОбъектаКонфигурации/ТипОбъектаКонфигурации.mdo new file mode 100644 index 000000000..1a09fedcb --- /dev/null +++ b/SSL/src/FunctionalOptionsParameters/ТипОбъектаКонфигурации/ТипОбъектаКонфигурации.mdo @@ -0,0 +1,10 @@ + + + ТипОбъектаКонфигурации + + ru + Тип объекта конфигурации + + InformationRegister.НазначениеДополнительныхОбработок.Dimension.ТипОбъекта + InformationRegister.НастройкаВерсионированияОбъектов.Dimension.ТипОбъекта + diff --git a/SSL/src/FunctionalOptionsParameters/ТипФормыСДополнительнымиОтчетамиИОбработками/ТипФормыСДополнительнымиОтчетамиИОбработками.mdo b/SSL/src/FunctionalOptionsParameters/ТипФормыСДополнительнымиОтчетамиИОбработками/ТипФормыСДополнительнымиОтчетамиИОбработками.mdo new file mode 100644 index 000000000..545662be5 --- /dev/null +++ b/SSL/src/FunctionalOptionsParameters/ТипФормыСДополнительнымиОтчетамиИОбработками/ТипФормыСДополнительнымиОтчетамиИОбработками.mdo @@ -0,0 +1,9 @@ + + + ТипФормыСДополнительнымиОтчетамиИОбработками + + ru + Тип формы с дополнительными отчетами и обработками + + InformationRegister.НазначениеДополнительныхОбработок.Dimension.ТипФормы + diff --git a/SSL/src/InformationRegisters/АдресныеСокращения/АдресныеСокращения.mdo b/SSL/src/InformationRegisters/АдресныеСокращения/АдресныеСокращения.mdo new file mode 100644 index 000000000..d6ee56be1 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныеСокращения/АдресныеСокращения.mdo @@ -0,0 +1,154 @@ + + + + + + + + + + + + АдресныеСокращения + + ru + Адресные сокращения + + true + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + Наименование + + ru + Наименование + + + String + + 29 + + + + ru + Полное наименование типа адресного объекта + + + + Use + Use + + + + Сокращение + + ru + Сокращение + + + String + + 10 + + + + ru + Сокращенное наименование типа объекта + + + + Use + Use + + + + Index + + + Уровень + + ru + Уровень + + + Number + + 1 + true + + + + ru + Уровень типа адресного объекта + + + + true + Index + Use + Use + + 0 + + true + + + Код + + ru + Код + + + Number + + 3 + true + + + + ru + Код типа адресного сокращения + + + + true + Use + Use + + 0 + + true + + diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/АутентификацияНаПользовательскомСайте/Form.form b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/АутентификацияНаПользовательскомСайте/Form.form new file mode 100644 index 000000000..47886a539 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/АутентификацияНаПользовательскомСайте/Form.form @@ -0,0 +1,422 @@ + + + + КодПользователя + 10 + true + true + + true + + + КодПользователя + + + КодПользователяРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + КодПользователяКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Пароль + 8 + true + true + + true + + + Пароль + + + ПарольРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ПарольКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СохранятьПароль + 4 + true + true + + true + + + СохранятьПароль + + Right + + СохранятьПарольРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + СохранятьПарольКонтекстноеМеню + 5 + true + + CheckBoxField + Enter + true + Left + true + + + + СсылкаНаПользовательскийСайт + 12 + true + true + + true + + + СсылкаНаПользовательскийСайт + + None + + СсылкаНаПользовательскийСайтРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + СсылкаНаПользовательскийСайтКонтекстноеМеню + 13 + true + + LabelField + Enter + true + Left + true + + + Click + СсылкаНаПользовательскийСайтНажатие + + true + true + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Продолжить + 1 + true + true + + true + + false + + ПродолжитьРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + Form.Command.СохранитьДанныеАутентификацииИПродолжить + Auto + true + true + true + UserCmds + Auto + + + Отмена + 3 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 2 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Пароль + + <key>ru</key> + <value>Пароль</value> + + 1 + + String + + + + 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> + + 2 + + String + + + + true + + + true + + + + СохранитьДанныеАутентификацииИПродолжить + + <key>ru</key> + <value>Продолжить</value> + + 1 + + ru + Сохранить данные аутентификации и продолжить + + + true + + Role.Администрирование + + + Role.ВыводНаПринтерФайлБуферОбмена + + + true + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеОтветовНаВопросыАнкет + + + + + СохранитьДанныеАутентификацииИПродолжитьВыполнить + + + Auto + Auto + + + + + + diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/АутентификацияНаПользовательскомСайте/Help/ru.html b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/АутентификацияНаПользовательскомСайте/Help/ru.html new file mode 100644 index 000000000..998cb8d82 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/АутентификацияНаПользовательскомСайте/Help/ru.html @@ -0,0 +1 @@ +Необходимо ввести данные аутентификации на пользовательском сайте (http://users.v8.1c.ru/). \ No newline at end of file diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/АутентификацияНаПользовательскомСайте/Module.bsl b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/АутентификацияНаПользовательскомСайте/Module.bsl new file mode 100644 index 000000000..57831b7d6 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/АутентификацияНаПользовательскомСайте/Module.bsl @@ -0,0 +1,58 @@ +//------------------------------------------------------------------------------ +// +// ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ +// +// Неопределено - пользователь отказался от ввода пароля +// Структура - +// ключ "Статус", булево - истина или ложь в зависмости от успеха вызова +// ключ "КодПользователя", строка - в случае если статус Истина содержит +// код пользователя +// ключ "Пароль", строка - в случае если статус Истина содержит пароль +// +//------------------------------------------------------------------------------ + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ ОБРАБОТЧИКОВ СОБЫТИЙ ФОРМЫ И ЭЛЕМЕНТОВ ФОРМЫ +// + +// Обработчик события "при создании на сервере" формы +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СсылкаНаПользовательскийСайт = НСтр("ru = 'Перейти к регистрации на пользовательском сайте'"); + + АдресныйКлассификатор.ПолучитьПараметрыАутентификации(КодПользователя, Пароль); + + СохранятьПароль = ? (ПустаяСтрока(Пароль), Ложь, Истина); + +КонецПроцедуры + +// Обработчик события нажатия на кнопку "Продолжить" +// +&НаКлиенте +Процедура СохранитьДанныеАутентификацииИПродолжитьВыполнить() + + Если СохранятьПароль Тогда + АдресныйКлассификатор.СохранитьПараметрыАутентификации(КодПользователя, Пароль); + Иначе + АдресныйКлассификатор.СохранитьПараметрыАутентификации(КодПользователя, Неопределено); + КонецЕсли; + + Закрыть (Новый Структура("Статус, КодПользователя ,Пароль", Истина, КодПользователя, Пароль)); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ СЕРВИСНЫХ ФУНКЦИЙ +// + +// Реализует переход к пользовательскому сайту 1С +// +&НаКлиенте +Процедура СсылкаНаПользовательскийСайтНажатие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ЗапуститьПриложение("http://users.v8.1c.ru/"); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..e43e21797 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,19 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + Наименование + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаВыбора/Form.form b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаВыбора/Form.form new file mode 100644 index 000000000..2e44c84a0 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаВыбора/Form.form @@ -0,0 +1,428 @@ + + + + Список + 14 + true + true + + true + + + Список + + false + None + + Группа + 21 + + Наименование + 17 + true + true + + true + + + Список.Наименование + + + НаименованиеРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 18 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Сокращение + 19 + + <key>ru</key> + <value>Сокр.</value> + + true + true + + true + + + Список.Сокращение + + None + + СокращениеРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + СокращениеКонтекстноеМеню + 20 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + None + + СписокКоманднаяПанель + 16 + Left + true + + + Selection + СписокВыбор + + + СписокСтрокаПоиска + 24 + + СписокСтрокаПоискаРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 25 + true + + Список + + true + + + + СписокСостояниеПросмотра + 27 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 28 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 30 + + СписокУправлениеПоискомРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 31 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 15 + true + + HierarchicalList + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + + Список.DefaultPicture + + + Style.BorderColor + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
    + + ФормаКоманднаяПанель + -1 + + КомандаВыбрать + 13 + + <key>ru</key> + <value>Выбрать</value> + + true + true + + true + + false + + КомандаВыбратьРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + Form.Command.КомандаВыбрать + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + Close + CustomizeForm + Help + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + InformationRegister.АдресныйКлассификатор + true + true + true + true + +
    + + КомандаВыбрать + 1 + + true + + + StdPicture.ChooseFromList + + + + КомандаВыбратьВыполнить + + + TextPicture + Auto + Auto + + + Регион + + String + + + + + Район + + String + + + + + Город + + String + + + + + НаселенныйПункт + + String + + + + + Улица + + String + + + + + Уровень + + Number + + 1 + + + + + + + + +
    diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаВыбора/Module.bsl b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаВыбора/Module.bsl new file mode 100644 index 000000000..6ee62edfa --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаВыбора/Module.bsl @@ -0,0 +1,69 @@ + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ОсуществитьВыбор(); + +КонецПроцедуры + +&НаКлиенте +Процедура КомандаВыбратьВыполнить() + + ОсуществитьВыбор(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОсуществитьВыбор() + + текДанные = Элементы.Список.ТекущиеДанные; + Если текДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Результат = Новый Структура("Наименование,Сокращение", текДанные.Наименование, текДанные.Сокращение); + Закрыть(Результат); + +КонецПроцедуры + +&НаСервере +Функция ПолучитьПоляПоУровню(Уровень) + + Поля = Новый Структура; + Поля.Вставить("Регион", ?(Уровень <= 1, "", Параметры.Регион)); + Поля.Вставить("Район", ?(Уровень <= 2, "", Параметры.Район)); + Поля.Вставить("Город", ?(Уровень <= 3, "", Параметры.Город)); + Поля.Вставить("НаселенныйПункт", ?(Уровень <= 4, "", Параметры.НаселенныйПункт)); + Поля.Вставить("Улица", ?(Уровень <= 5, "", Параметры.Улица)); + + Возврат Поля; + +КонецФункции + +&НаСервере +Функция ПолучитьОграниченияПоУровню(Уровень) + + Поля = ПолучитьПоляПоУровню(Уровень); + Ограничения = УправлениеКонтактнойИнформациейКлассификаторы.ВернутьСтруктуруОграниченийПоРодителю(Поля.Регион, Поля.Район, Поля.Город, Поля.НаселенныйПункт, Поля.Улица, 0); + Ограничения.Вставить("ТипАдресногоЭлемента", Параметры.Уровень); + + Возврат Ограничения; + +КонецФункции + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + // Установим отбор + Параметры.Отбор = ПолучитьОграниченияПоУровню(Параметры.Уровень); + + // Установим текущую строку + Поля = ПолучитьПоляПоУровню(Параметры.Уровень + 1); + СтруктураОтбора = УправлениеКонтактнойИнформациейКлассификаторы.ВернутьСтрокуАдресногоКлассификатораПоАдреснымЭлементам(Поля.Регион, Поля.Район, Поля.Город, Поля.НаселенныйПункт, Поля.Улица); + Если СтруктураОтбора.ТипАдресногоЭлемента = Параметры.Уровень Тогда + Параметры.ТекущаяСтрока = РегистрыСведений.АдресныйКлассификатор.СоздатьКлючЗаписи(СтруктураОтбора); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаЗагрузкиАдресногоКлассификатора/Form.form b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаЗагрузкиАдресногоКлассификатора/Form.form new file mode 100644 index 000000000..ce3ab96f3 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаЗагрузкиАдресногоКлассификатора/Form.form @@ -0,0 +1,1672 @@ + + + + СтраницыФормы + 42 + + СтраницаВыборАдресныхОбъектов + 43 + + ГруппаВыборАдресныхОбъектовДляЗагрузки + 16 + + ТаблицаАдресныхОбъектов + 4 + true + true + + true + + + АдресныеОбъектыДляЗагрузки + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + + Пометка + 34 + + <key>ru</key> + <value>Пометка</value> + + true + true + + true + + + АдресныеОбъектыДляЗагрузки.Пометка + + + ПометкаРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + ПометкаКонтекстноеМеню + 35 + true + + CheckBoxField + Enter + true + Left + true + + + + НаименованиеАдресногоОбъекта + 12 + + <key>ru</key> + <value>Все адресные объекты</value> + + true + true + + true + + + АдресныеОбъектыДляЗагрузки.НаименованиеАдресногоОбъекта + + + НаименованиеАдресногоОбъектаРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + НаименованиеАдресногоОбъектаКонтекстноеМеню + 13 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + + Style.BorderColor + + Normal + + + Top + + ТаблицаАдресныхОбъектовКоманднаяПанель + 6 + + ВыделитьВсе + 37 + true + true + + true + + false + + ВыделитьВсеРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + Form.Command.ВыделитьВсе + Normal + Picture + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ОтменитьВыделитьВсе + 38 + true + true + + true + + false + + ОтменитьВыделитьВсеРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + Form.Command.ОтменитьВыделитьВсе + Normal + Auto + true + true + UserCmds + Auto + + + Найти + 39 + true + true + + true + + false + + НайтиРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + Form.Item.ТаблицаАдресныхОбъектов.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ОтменитьПоиск + 40 + true + true + + true + + false + + ОтменитьПоискРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + Form.Item.ТаблицаАдресныхОбъектов.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + ТаблицаАдресныхОбъектовВыбор + + + ТаблицаАдресныхОбъектовСтрокаПоиска + 72 + + ТаблицаАдресныхОбъектовСтрокаПоискаРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + ТаблицаАдресныхОбъектовСтрокаПоискаКонтекстноеМеню + 73 + true + + ТаблицаАдресныхОбъектов + + true + + + + ТаблицаАдресныхОбъектовСостояниеПросмотра + 75 + + ТаблицаАдресныхОбъектовСостояниеПросмотраРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + + ТаблицаАдресныхОбъектовСостояниеПросмотраКонтекстноеМеню + 76 + true + + ViewStatusAddition + ТаблицаАдресныхОбъектов + + true + + + + ТаблицаАдресныхОбъектовУправлениеПоиском + 78 + + ТаблицаАдресныхОбъектовУправлениеПоискомРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + ТаблицаАдресныхОбъектовУправлениеПоискомКонтекстноеМеню + 79 + true + + SearchControlAddition + ТаблицаАдресныхОбъектов + + true + + + + ТаблицаАдресныхОбъектовРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + ТаблицаАдресныхОбъектовКонтекстноеМеню + 5 + true + + true + true + true + true + MultiRow + Row + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + + Style.BorderColor + + None + None + None + true + + + true + true + + true + + + <key>ru</key> + <value>Группа выбор адресных объектов для загрузки</value> + + + ru + Группа выбор адресных объектов для загрузки + + + ГруппаВыборАдресныхОбъектовДляЗагрузкиРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Выбор адресных объектв</value> + + + ru + Необходимо указать адресные объекты для загрузки классификатора + + + СтраницаВыборАдресныхОбъектовРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаВыборИсточника + 44 + + ВыборСпособаЗагрузки + 20 + + СпособЗагрузки + 21 + true + true + + true + + + ИсточникДанныхДляЗагрузки + + None + + OnChange + СпособЗагрузкиПриИзменении + + + СпособЗагрузкиРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + + СпособЗагрузкиКонтекстноеМеню + 22 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + С сайта компании "1С" (требуется доступ в интернет и регистрация на сайте) + + + 1 + + + + + ru + У меня есть диск Информационно-технологического сопровождения + + + 2 + + + + + ru + У меня есть файлы адресного классификатора + + + 3 + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Выбор способа загрузки</value> + + + ru + Выбор способа загрузки + + + ВыборСпособаЗагрузкиРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + СтраницыСпособаЗагрузки + 23 + + ПустаяСтраница + 31 + + Пуст + 32 + true + true + + true + + + ПустойРекв + + None + + ПустРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + + ПустКонтекстноеМеню + 33 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Пустая страница</value> + + + ru + Пустая страница + + + ПустаяСтраницаРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаЗагрузкаСДискаИТС + 25 + + ДискИТС + 27 + true + true + + true + + + ДискИТС + + + ДискИТСРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + + ДискИТСКонтекстноеМеню + 28 + true + + InputField + Enter + true + Left + true + + + StartChoice + ДискИТСНачалоВыбора + + 39 + true + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Страница загрузка с диска ИТС</value> + + + ru + Страница загрузка с диска ИТС + + + СтраницаЗагрузкаСДискаИТСРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаЗагрузкаФайлов + 26 + + ПутьКФайламДанныхНаДиске + 29 + true + true + + true + + + ПутьКФайламДанныхНаДиске + + + ПутьКФайламДанныхНаДискеРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + ПутьКФайламДанныхНаДискеКонтекстноеМеню + 30 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПутьКФайламДанныхНаДискеНачалоВыбора + + 30 + true + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Страница загрузка файлов</value> + + + ru + Страница загрузка файлов + + + СтраницаЗагрузкаФайловРасширеннаяПодсказка + 104 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы способа загрузки</value> + + + ru + Страницы способа загрузки + + + СтраницыСпособаЗагрузкиРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Выбор источника</value> + + + ru + Необходимо указать "откуда" загружать классификатор + + + СтраницаВыборИсточникаРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + СтраницаЗагрузка + 45 + + ТекстСообщенияОЗагрузке + 46 + + <key>ru</key> + <value>Внимание! Загрузка адресного классификатора может занять длительное время, которое зависит от количества выбранных регионов и факторов, зависящих от способа загрузки.</value> + + true + true + + true + + + ТекстСообщенияОЗагрузкеРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + + ТекстСообщенияОЗагрузкеКонтекстноеМеню + 47 + true + + Label + true + 3 + true + false + + Left + Top + + + + Загрузить + 57 + + <key>ru</key> + <value>Загрузить адресный классификатор</value> + + true + true + + true + + false + + ЗагрузитьРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + UsualButton + Form.Command.Загрузить + Auto + true + true + true + UserCmds + Auto + + + СтраницыЗагрузки + 50 + + ГруппаПустаяГруппа + 51 + + ПустойРекв + 58 + true + true + + true + + + ПустойРекв + + None + + ПустойРеквРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + + ПустойРеквКонтекстноеМеню + 59 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Группа пустая группа</value> + + + ru + Группа пустая группа + + + ГруппаПустаяГруппаРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + Page + + Vertical + + + + СтраницаСтатусЗагрузки + 52 + + ИндикаторЗагрузки + 48 + true + true + + true + + + ИндикаторЗагрузки + + None + + ИндикаторЗагрузкиРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + ИндикаторЗагрузкиКонтекстноеМеню + 49 + true + + ProgressBarField + Enter + true + Left + true + + 32 + true + 1 + true + true + 100 + Broken + + + + СтатусЗагрузки + 55 + true + true + + true + + + СтатусЗагрузки + + None + + СтатусЗагрузкиРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + + СтатусЗагрузкиКонтекстноеМеню + 56 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Страница статус загрузки</value> + + + ru + Страница статус загрузки + + + СтраницаСтатусЗагрузкиРасширеннаяПодсказка + 114 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы загрузки</value> + + + ru + Страницы загрузки + + + СтраницыЗагрузкиРасширеннаяПодсказка + 110 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница загрузка</value> + + + ru + Страница загрузка + + 50 + + СтраницаЗагрузкаРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы формы</value> + + + ru + Страницы формы + + + СтраницыФормыРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + Pages + + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Назад + 41 + true + true + + true + + false + + НазадРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + Form.Command.КомандаНазад + Normal + Auto + true + true + UserCmds + Auto + + + Далее + 18 + true + true + + true + + false + + ДалееРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + Form.Command.КомандаДалее + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Отмена + 17 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Справка + 19 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + 52 + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + АдресныеОбъектыДляЗагрузки + + <key>ru</key> + <value>Адресные объекты для загрузки</value> + + 1 + + ValueTable + + + true + + + true + + + Пометка + + <key>ru</key> + <value>Пометка</value> + + 1 + + Boolean + + + true + + + true + + + + НаименованиеАдресногоОбъекта + + <key>ru</key> + <value>Наименование адресного объекта</value> + + 2 + + String + + + + true + + + true + + + + + ИсточникДанныхДляЗагрузки + + <key>ru</key> + <value>Источник данных для загрузки</value> + + 3 + + Number + + 1 + true + + + + true + + + true + + + + ПутьКФайламДанныхНаДиске + + <key>ru</key> + <value>Путь к файлам данных на диске</value> + + 4 + + String + + + + true + + + true + + + + ДискИТС + + <key>ru</key> + <value>Путь к диску ИТС</value> + + 5 + + String + + + + true + + + true + + + + ПустойРекв + 7 + + String + + + + true + + + true + + + + ИндикаторЗагрузки + + <key>ru</key> + <value>Индикатор загрузки</value> + + 2 + + Number + + 3 + + + + true + + + true + + + + СтатусЗагрузки + + <key>ru</key> + <value>Статус загрузки</value> + + 6 + + String + + + + true + + + true + + + + КомандаДалее + + <key>ru</key> + <value>Далее >></value> + + 5 + + ru + Команда далее + + + true + + + + КомандаДалее + + + Auto + Auto + + + ВыделитьВсе + + <key>ru</key> + <value>Выделить все</value> + + 1 + + ru + Выделить все + + + true + + + StdPicture.CheckAll + + + + ВыделитьВсеВыполнить + + + Auto + Auto + + + ОтменитьВыделитьВсе + + <key>ru</key> + <value>Отменить выделить все</value> + + 2 + + ru + Отменить выделить все + + + true + + + StdPicture.GrayedAll + + + + ОтменитьВыделитьВсеВыполнить + + + Auto + Auto + + + КомандаНазад + + <key>ru</key> + <value><< Назад </value> + + 3 + + ru + Команда назад + + + true + + + + КомандаНазад + + + Auto + Auto + + + Загрузить + + <key>ru</key> + <value>Загрузить</value> + + 4 + + ru + Загрузить адресный классификатор + + + true + + Role.Администрирование + + + Role.БазовыеПрава + + + Role.ВыводНаПринтерФайлБуферОбмена + + + true + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ИзменениеДополнительныхСведений + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеРолейИсполнителей + + + Role.ДобавлениеИзменениеФизическихЛиц + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИзменениеМакетовПечатныхФорм + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеДополнительныхСведений + + + Role.ЧтениеОтветовНаВопросыАнкет + + + Role.ЧтениеПерсональныхДанныхФизическихЛиц + + + + + ЗагрузитьВыполнить + + + Auto + Auto + + + + + + diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаЗагрузкиАдресногоКлассификатора/Help/ru.html b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаЗагрузкиАдресногоКлассификатора/Help/ru.html new file mode 100644 index 000000000..f56f1f1a1 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаЗагрузкиАдресногоКлассификатора/Help/ru.html @@ -0,0 +1,11 @@ + +

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

    +
  • Список адресных объектов
  • +

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

    +
  • Источник данных для загрузки
  • +

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

    +

    файлы адресного классификатора - необходимо самостоятельно загрузить с сайта ГНИВЦ ФНС РФ и указать путь к каталогу с разархивированными файлами классификатора

    +

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

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

    \ No newline at end of file diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаЗагрузкиАдресногоКлассификатора/Module.bsl b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаЗагрузкиАдресногоКлассификатора/Module.bsl new file mode 100644 index 000000000..25d07a999 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаЗагрузкиАдресногоКлассификатора/Module.bsl @@ -0,0 +1,625 @@ + +//////////////////////////////////////////////////////////////////////////////// +// БЛОК ОБРАБОТЧИКОВ СОБЫТИЙ +// + +// Обработчик события "при создании на сервере" формы. +// Заполняет список выбора адресных объектов для загрузки. +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + АдресныеОбъектыПереданные = ?(Параметры.Свойство("АдресныеОбъекты"), Параметры.АдресныеОбъекты, Неопределено); + + ЗаполнитьТаблицуАдресныхОбъектов(АдресныеОбъектыПереданные); + + ИсточникДанныхДляЗагрузки = 0; + ПутьКФайламДанныхНаДиске = ""; + ДискИТС = ""; + + Если АдресныеОбъектыПереданные = Неопределено Тогда + ЗагрузитьСохраненныеПараметрыЗагрузки(); + Иначе + ИсточникДанныхДляЗагрузки = 1; + КонецЕсли; + +КонецПроцедуры + +// Обработчик события "при открытии" формы +// Вызывает функциональность обновления интерфейса +// +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + #Если ВебКлиент Тогда + Предупреждение(НСтр("ru = 'Классификатор не может быть загружен в Веб клиенте'"),, НСтр("ru = 'Загрузка адресного классификатора'")); + Закрыть(); + #КонецЕсли + + УстановитьИзмененияВИнтерфейсе(); + +КонецПроцедуры + +// Обработчик нажатия на "кнопку "ВыделитьВсе" +// командной панели элемента управления "АдресныеОбъектыДляЗагрузки" +// Выделяет все адресные объекты в списке адресных объектов для загрузки +// +&НаКлиенте +Процедура ВыделитьВсеВыполнить() + + Для Каждого ЭлементАдресныйОбъект Из АдресныеОбъектыДляЗагрузки Цикл + ЭлементАдресныйОбъект.Пометка = Истина; + КонецЦикла; + + УстановитьИзмененияВИнтерфейсе(); + +КонецПроцедуры + +// Обработчик нажатия на "кнопку "ОтменитьВыделитьВсе" +// командной панели элемента управления "АдресныеОбъектыДляЗагрузки" +// Снимает выделение со всех адресных объектов в списке +// адресных объектов для загрузки +// +&НаКлиенте +Процедура ОтменитьВыделитьВсеВыполнить() + + Для Каждого ЭлементАдресныйОбъект Из АдресныеОбъектыДляЗагрузки Цикл + ЭлементАдресныйОбъект.Пометка = Ложь; + КонецЦикла; + + УстановитьИзмененияВИнтерфейсе(); + +КонецПроцедуры + +// Обработчик события НачалоВыбора поля ввода формы ПутьКФайламДанныхНаДиске. +// Вызывает диалог выбора директории, после выбора проверяет, существуют +// ли в выбранной директории файлы данных. +// +&НаКлиенте +Процедура ПутьКФайламДанныхНаДискеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + +#Если Не ВебКлиент Тогда + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выбор каталога с файлами данных'"); + ДиалогОткрытияФайла.Каталог = ПутьКФайламДанныхНаДиске; + + Если ДиалогОткрытияФайла.Выбрать() Тогда + ПутьКФайламДанныхНаДиске = ДиалогОткрытияФайла.Каталог; + + ОчиститьСообщения(); + + Если АдресныйКлассификаторКлиент.ПроверитьНаличиеФайловДанныхВКаталоге(ПутьКФайламДанныхНаДиске) Тогда + УстановитьИзмененияВИнтерфейсе (); + Иначе + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файлы данных не найдены в каталоге ""%1"".'"), + ПутьКФайламДанныхНаДиске), , + "ПутьКФайламДанныхНаДиске"); + КонецЕсли; + КонецЕсли; +#Иначе + Предупреждение(НСтр("ru = 'Функциональность не поддерживается на веб клиенте'")); +#КонецЕсли + +КонецПроцедуры + +// Обработчик события НачалоВыбора поля ввода формы ДискИТС. +// Вызывает диалог выбора директории, после выбора проверяет, существуют +// ли в выбранной директории файлы архивов данных. +// +&НаКлиенте +Процедура ДискИТСНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + +#Если Не ВебКлиент Тогда + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); + ДиалогОткрытияФайла.Заголовок = "Выбор пути к диску ИТС"; + ДиалогОткрытияФайла.Каталог = ДискИТС; + + Если ДиалогОткрытияФайла.Выбрать() Тогда + ДискИТС = ДиалогОткрытияФайла.Каталог; + + ФайлыСуществуют = АдресныйКлассификаторКлиент.ПроверитьНаличиеФайловНаДискеИТС(ДискИТС); + + ОчиститьСообщения(); + + Если ФайлыСуществуют Тогда + УстановитьИзмененияВИнтерфейсе(); + Иначе + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файлы данных КЛАДР не найдены: ""%1"". + |Проверьте правильность указанного пути к Диску ИТС.'"), + ДискИТС), , + "ДискИТС"); + КонецЕсли; + КонецЕсли; +#Иначе + Предупреждение(НСтр("ru = 'Функциональность не поддерживается на веб клиенте.'")); +#КонецЕсли + +КонецПроцедуры + +// Обработчик события выбора поля таблицы "ЭлементАдресныйОбъект" +// Изменяет статус загрузки адресного объекта поля на противоположный +// +&НаКлиенте +Процедура ТаблицаАдресныхОбъектовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Элемент.ТекущиеДанные.Пометка = НЕ Элемент.ТекущиеДанные.Пометка; + +КонецПроцедуры + +// Обработчик события ПриИзменении поля переключателя ИсточникДанныхДляЗагрузки +// Устанавливает параметры видимости элементов (параметров вида загрузки) +// в зависимости от значения переключателя. +// +&НаКлиенте +Процедура СпособЗагрузкиПриИзменении(Элемент) + + УстановитьИзмененияВИнтерфейсе(); + +КонецПроцедуры + +// Обработчик нажатия на кнопку "Загрузить" командной панели формы +// +&НаКлиенте +Процедура ЗагрузитьВыполнить() + + ОчиститьСообщения(); + + Если ЗагрузитьКЛАДР() Тогда + Состояние(НСтр("ru = 'Адресный классификатор успешно загружен'")); + Оповестить("ИзменениеАдресногоКлассификатора"); + СохранитьПараметрыЗагрузки(); + Закрыть(Истина); + КонецЕсли; + + УстановитьСтатусЗагрузки(""); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Управление мастером загрузки + +// Обработчик нажатия на кнопку "Далее" +// +&НаКлиенте +Процедура КомандаДалее(Команда) + + ОчиститьСообщения(); + + Если Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаВыборАдресныхОбъектов Тогда + Если КоличествоОтмеченныхАдресныхОбъектов() = 0 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Требуется выбрать хотя бы один адресный объект.'"), , + "АдресныеОбъектыДляЗагрузки"); + Возврат; + КонецЕсли; + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаВыборИсточника; + ИначеЕсли Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаВыборИсточника Тогда + Если ИсточникДанныхДляЗагрузки = 2 + И (ПустаяСтрока(ДискИТС) + ИЛИ НЕ АдресныйКлассификаторКлиент.ПроверитьНаличиеФайловНаДискеИТС(ДискИТС))Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Проверьте правильность указания пути к диску ИТС.'"), , + "ДискИТС"); + Возврат; + ИначеЕсли ИсточникДанныхДляЗагрузки = 3 + И (ПустаяСтрока(ПутьКФайламДанныхНаДиске) + ИЛИ НЕ АдресныйКлассификаторКлиент.ПроверитьНаличиеФайловДанныхВКаталоге(ПутьКФайламДанныхНаДиске))Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Проверьте правильность указания пути к файлам КЛАДР, а так же состав файлов.'"), , + "ПутьКФайламДанныхНаДиске"); + Возврат; + КонецЕсли; + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаЗагрузка; + КонецЕсли; + + УстановитьИзмененияВИнтерфейсе(); + +КонецПроцедуры + +// Обработчик нажатия на кнопку "Назад" +// +&НаКлиенте +Процедура КомандаНазад(Команда) + + Если Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаВыборИсточника Тогда + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаВыборАдресныхОбъектов; + ИначеЕсли Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаЗагрузка Тогда + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаВыборИсточника; + КонецЕсли; + + УстановитьИзмененияВИнтерфейсе(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// БЛОК СЕРВИСНЫХ ФУНКЦИЙ +// + +&НаСервере +Процедура СохранитьПараметрыЗагрузки() + + МассивЗагружаемыхАО = Новый Массив; + + Для Каждого ЭлементАО Из АдресныеОбъектыДляЗагрузки Цикл + Если ЭлементАО.Пометка Тогда + МассивЗагружаемыхАО.Добавить(Лев(ЭлементАО.НаименованиеАдресногоОбъекта, 2)); + КонецЕсли; + КонецЦикла; + + ХранилищеОбщихНастроек.Сохранить("ПараметрыЗагрузкиАдресногоКлассификатора", "ЗагружаемыеРегионы", МассивЗагружаемыхАО); + + ИсточникКЛАДР = Новый Структура("ИсточникДанныхДляЗагрузки"); + ИсточникКЛАДР.ИсточникДанныхДляЗагрузки = ИсточникДанныхДляЗагрузки; + + Если ИсточникДанныхДляЗагрузки = 2 Тогда + ИсточникКЛАДР.Вставить("ДискИТС", ДискИТС); + ИначеЕсли ИсточникДанныхДляЗагрузки = 3 Тогда + ИсточникКЛАДР.Вставить("ПутьКФайламДанныхНаДиске", ПутьКФайламДанныхНаДиске); + КонецЕсли; + + ХранилищеОбщихНастроек.Сохранить("ПараметрыЗагрузкиАдресногоКлассификатора", "ИсточникКЛАДР", ИсточникКЛАДР); + +КонецПроцедуры + +&НаСервере +Процедура ЗагрузитьСохраненныеПараметрыЗагрузки() + + ИсточникКЛАДР = ЗагрузитьНастройкуЗагрузкиКЛАДР("ИсточникКЛАДР"); + + Если ИсточникКЛАДР <> Неопределено Тогда + ИсточникДанныхДляЗагрузки = ИсточникКЛАДР.ИсточникДанныхДляЗагрузки; + Если ИсточникДанныхДляЗагрузки = 2 Тогда + ДискИТС = ИсточникКЛАДР.ДискИТС; + ИначеЕсли ИсточникДанныхДляЗагрузки = 3 Тогда + ПутьКФайламДанныхНаДиске = ИсточникКЛАДР.ПутьКФайламДанныхНаДиске; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Получает значение из системного хранилища настроек ИБ +// +&НаСервереБезКонтекста +Функция ЗагрузитьНастройкуЗагрузкиКЛАДР(КлючНастроек) + + Возврат ХранилищеОбщихНастроек.Загрузить("ПараметрыЗагрузкиАдресногоКлассификатора", КлючНастроек); + +КонецФункции + +// Устанавливает текст статус загрузки +// +&НаКлиенте +Процедура УстановитьСтатусЗагрузки(знач Сообщение = "") + + СтатусЗагрузки = Сообщение; + + Если ПустаяСтрока(Сообщение) Тогда + Элементы.СтраницыЗагрузки.ТекущаяСтраница = Элементы.ГруппаПустаяГруппа; + Иначе + Элементы.СтраницыЗагрузки.ТекущаяСтраница = Элементы.СтраницаСтатусЗагрузки; + КонецЕсли; + + ОбновитьОтображениеДанных(); + +КонецПроцедуры + +// Релизация загрузки классификатора +// +&НаКлиенте +Функция ЗагрузитьКЛАДР() + + // Требуется для аутентификации на пользовательском сайте + Перем ЗапросФормыАутентификации, ДанныеАутентификации, ПутьКДанным; + + ИндикаторЗагрузки = 0; + + ВозвращаемоеЗначение = Истина; + + Если ИсточникДанныхДляЗагрузки = 2 Тогда // загрузка с диска ИТС + Если Прав(ДискИТС, 1) <> "\" Тогда + ДискИТС = ДискИТС + "\"; + КонецЕсли; + ИначеЕсли ИсточникДанныхДляЗагрузки = 3 Тогда // загрузка из файлов на диске + Если Прав(ПутьКФайламДанныхНаДиске, 1) <> "\" Тогда + ПутьКФайламДанныхНаДиске = ПутьКФайламДанныхНаДиске + "\"; + КонецЕсли; + КонецЕсли; + + // Подготавливаем массив адресных объектов для загрузки + АдресныеОбъекты = Новый Массив; + + Для Каждого ЭлементАдресныйОбъект Из АдресныеОбъектыДляЗагрузки Цикл + Если ЭлементАдресныйОбъект.Пометка Тогда + АдресныеОбъекты.Добавить(Лев(ЭлементАдресныйОбъект.НаименованиеАдресногоОбъекта, 2)); + КонецЕсли; + КонецЦикла; + + Попытка + // Первый этап - загрузка адаптированной базы данных КЛАДР на сервер. + // В зависимости от выбора метода загрузка осуществляется по разному. + + Если ИсточникДанныхДляЗагрузки = 1 Тогда // загрузка с пользовательского сайта 1С + Если Не ПолучитьДанныеАутентификации(ДанныеАутентификации, ЗапросФормыАутентификации) Тогда + Возврат Ложь; + КонецЕсли; + + Состояние(НСтр("ru = 'Загружается адресный классификатор...'")); + + Результат = ЗагрузитьАдресныеОбъектыССервера(АдресныеОбъекты, ДанныеАутентификации, ПутьКДанным); + + Если Не Результат.Статус И Не ЗапросФормыАутентификации Тогда + Если Не ПолучитьДанныеАутентификации(ДанныеАутентификации, ЗапросФормыАутентификации, Истина) Тогда + Возврат Ложь; + КонецЕсли; + Результат = ЗагрузитьАдресныеОбъектыССервера(АдресныеОбъекты, ДанныеАутентификации, ПутьКДанным); + КонецЕсли; + + Если Не Результат.Статус Тогда + ВызватьИсключение Результат.СообщениеОбОшибке; + КонецЕсли; + + Если Прав(ПутьКДанным, 1) <> "\" Тогда + ПутьКДанным = ПутьКДанным + "\"; + КонецЕсли; + + ИначеЕсли ИсточникДанныхДляЗагрузки = 2 Тогда // загрузка с диска ИТС + Состояние(НСтр("ru = 'Загружается адресный классификатор...'")); + УстановитьСтатусЗагрузки(НСтр("ru = 'Приведение файлов с диска ИТС к требуемому формату'")); + ПутьКДанным = АдресныйКлассификаторКлиент.ПреобразоватьФайлыКЛАДРEXEВZIP(ДискИТС); + Если ПутьКДанным = Неопределено Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Загрузка адресного классификатора была отменена.'")); + Возврат Ложь; + КонецЕсли; + ИндикаторЗагрузки = 25; + ИначеЕсли ИсточникДанныхДляЗагрузки = 3 Тогда // загрузка из файлов на диске + Состояние(НСтр("ru = 'Загружается адресный классификатор...'")); + УстановитьСтатусЗагрузки(НСтр("ru = 'Сжатие файлов перед передачей на сервер'")); + МассивФайловДляЗагрузки = АдресныйКлассификаторКлиент.СписокФайловДанных(); + Для Каждого ИмяФайла Из МассивФайловДляЗагрузки Цикл + АдресныйКлассификаторКлиент.СжатьФайл(ПутьКФайламДанныхНаДиске, ИмяФайла, ПутьКДанным); + ИндикаторЗагрузки = (МассивФайловДляЗагрузки.Найти(ИмяФайла)+1) * 25 / МассивФайловДляЗагрузки.Количество(); + ОбновитьОтображениеДанных(); + КонецЦикла; + КонецЕсли; + + ОбновитьОтображениеДанных(); + + // Второй этап - передача файлов на сервер 1с:Предприятия + УстановитьСтатусЗагрузки(НСтр("ru = 'Передача файлов на сервер 1С:Предприятия'")); + + Если ИсточникДанныхДляЗагрузки = 1 Тогда + + ПутьКДаннымНаСервере = Неопределено; + + Для Каждого АдресныйОбъект Из АдресныеОбъекты Цикл + АдресныйКлассификаторКлиент.ПередатьФайлыНаСерверПоАдреснымОбъектам( + ПутьКДанным, ПутьКДаннымНаСервере, АдресныйОбъект, + ? (АдресныеОбъекты.Найти(АдресныйОбъект) > 0, Ложь, Истина)); + ИндикаторЗагрузки = 25 + (АдресныеОбъекты.Найти(АдресныйОбъект)+1) * 25 / АдресныеОбъекты.Количество(); + ОбновитьОтображениеДанных(); + КонецЦикла; + + АдресныйКлассификаторКлиент.ПередатьФайлНаСервер(ПутьКДанным, "socrbase.zip", ПутьКДаннымНаСервере); + АдресныйКлассификаторКлиент.ПередатьФайлНаСервер(ПутьКДанным, "altnames.zip", ПутьКДаннымНаСервере); + + Иначе + + ПутьКДаннымНаСервере = Неопределено; + + МассивФайловДляЗагрузки = АдресныйКлассификаторКлиент.СписокФайловДанных(); + Для Каждого ИмяФайла Из МассивФайловДляЗагрузки Цикл + АдресныйКлассификаторКлиент.ПередатьФайлНаСервер(ПутьКДанным, ИмяФайла, ПутьКДаннымНаСервере); + ИндикаторЗагрузки = 25 + (МассивФайловДляЗагрузки.Найти(ИмяФайла)+1) * 25 / МассивФайловДляЗагрузки.Количество(); + ОбновитьОтображениеДанных(); + КонецЦикла; + + КонецЕсли; + + // Третий этап - загрузка адресных сведений в регистр сведений. + // Предполагается что к текущему моменту на сервере в каталоге ПутьКДаннымНаСервере + // содержатся все необходимые файлы данных + + Для Каждого АдресныйОбъект Из АдресныеОбъекты Цикл + + АдресныеСведения = АдресныйКлассификатор.ИнформацияПоАдресномуОбъекту(АдресныйОбъект); + + УстановитьСтатусЗагрузки( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Загружаются сведения по объекту: %1 %2'"), + АдресныеСведения.Наименование, + АдресныеСведения.Сокращение)); + АдресныйКлассификатор.ЗагрузитьКлассификаторПоАдресномуОбъекту( АдресныйОбъект, + ПутьКДаннымНаСервере, + ИсточникДанныхДляЗагрузки = 1); + ИндикаторЗагрузки = 50 + (АдресныеОбъекты.Найти(АдресныйОбъект)+1) * 50 / АдресныеОбъекты.Количество(); + ОбновитьОтображениеДанных(); + КонецЦикла; + + УстановитьСтатусЗагрузки(НСтр("ru = 'Загружаются адресные сокращения'")); + АдресныйКлассификатор.ЗагрузитьАдресныеСокращения(ПутьКДаннымНаСервере); + + Если ИсточникДанныхДляЗагрузки = 1 Тогда + АдресныйКлассификаторКлиентСервер.ПолучитьФайлВерсийИОбновитьВерсиюАдресныхСведений(АдресныеОбъекты); + КонецЕсли; + + Исключение + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Ошибка при загрузке адресных сведений: '") + + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ВозвращаемоеЗначение = Ложь; + КонецПопытки; + + ОбщегоНазначенияКлиентСервер.УдалитьКаталогСФайлами(ПутьКДанным); + + ОбщегоНазначения.УдалитьФайлыНаСервере1СПредприятие(ПутьКДаннымНаСервере); + + Возврат ВозвращаемоеЗначение; + +КонецФункции + +&НаКлиенте +Функция ПолучитьДанныеАутентификации(ДанныеАутентификации, ЗапросФормыАутентификации, знач ЗапросКПользователю = Ложь) + + Перем КодПользователя, Пароль; + + ЗапросФормыАутентификации = Ложь; + + Если ЗапросКПользователю Или Не АдресныйКлассификатор.ПолучитьПараметрыАутентификации(КодПользователя, Пароль) Тогда + ЗапросФормыАутентификации = Истина; + УстановитьСтатусЗагрузки(НСтр("ru = 'Аутентификация на пользовательском сайте 1С'")); + Результат = ОткрытьФормуМодально("РегистрСведений.АдресныйКлассификатор.Форма.АутентификацияНаПользовательскомСайте"); + Если Результат = Неопределено ИЛИ ТипЗнч(Результат) = Тип("КодВозвратаДиалога") Тогда + Возврат Ложь; + Иначе + КодПользователя = Результат.КодПользователя; + Пароль = Результат.Пароль; + КонецЕсли; + КонецЕсли; + + ДанныеАутентификации = Новый Структура("КодПользователя ,Пароль", КодПользователя, Пароль); + + Возврат Истина; + +КонецФункции + +&НаКлиенте +Функция ЗагрузитьАдресныеОбъектыССервера(знач АдресныеОбъекты, знач ДанныеАутентификации, ПутьКДанным) + + Для Каждого АдресныйОбъект Из АдресныеОбъекты Цикл + АдресныеСведения = АдресныйКлассификатор.ИнформацияПоАдресномуОбъекту(АдресныйОбъект); + УстановитьСтатусЗагрузки( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Загрузка файлов с Веб сервера 1С: %1 %2'"), + АдресныеСведения.Наименование, + АдресныеСведения.Сокращение)); + + Результат = АдресныйКлассификаторКлиент.ЗагрузитьКЛАДРСВебСервера( + АдресныйОбъект, + ДанныеАутентификации, + ПутьКДанным); + Если Не Результат.Статус Тогда + Прервать; + КонецЕсли; + ИндикаторЗагрузки = (АдресныеОбъекты.Найти(АдресныйОбъект)+1) * 25 / АдресныеОбъекты.Количество(); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Заполняет переданную таблицу значений по значениям таблицы адресных объектов. +// Выбирается код, наименование и сокращение типа объекта. +// +&НаСервере +Процедура ЗаполнитьТаблицуАдресныхОбъектов(ЗаданныеРегионыДляЗагрузки) + + МассивЗагружаемыхАО = ЗагрузитьНастройкуЗагрузкиКЛАДР("ЗагружаемыеРегионы"); + + АдресныеОбъектыДляЗагрузки.Очистить(); + + КлассификаторАдресныхОбъектовXML = + РегистрыСведений.АдресныйКлассификатор.ПолучитьМакет("КлассификаторАдресныхОбъектовРоссии").ПолучитьТекст(); + + КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(КлассификаторАдресныхОбъектовXML).Данные; + + Для Каждого АдресныйОбъект Из КлассификаторТаблица Цикл + + Наименование = Лев(АдресныйОбъект.Code, 2) + " - " + АдресныйОбъект.Name + " " + АдресныйОбъект.Socr; + + НоваяСтрока = АдресныеОбъектыДляЗагрузки.Добавить(); + НоваяСтрока.НаименованиеАдресногоОбъекта = Наименование; + + Если ЗаданныеРегионыДляЗагрузки <> Неопределено Тогда + Если ЗаданныеРегионыДляЗагрузки.Найти(Лев(АдресныйОбъект.Code, 2)) <> Неопределено Тогда + НоваяСтрока.Пометка = Истина; + Иначе + НоваяСтрока.Пометка = Ложь; + КонецЕсли; + ИначеЕсли МассивЗагружаемыхАО <> Неопределено Тогда + Если МассивЗагружаемыхАО.Найти(Лев(АдресныйОбъект.Code, 2)) <> Неопределено Тогда + НоваяСтрока.Пометка = Истина; + Иначе + НоваяСтрока.Пометка = Ложь; + КонецЕсли; + Иначе + НоваяСтрока.Пометка = Ложь; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Возвращает количество помеченных адресных объектов +// +&НаКлиенте +Функция КоличествоОтмеченныхАдресныхОбъектов() + + КоличествоОтмеченныхАдресныхОбъектов = 0; + + Для Каждого ЭлементАдресныйОбъект Из АдресныеОбъектыДляЗагрузки Цикл + Если ЭлементАдресныйОбъект.Пометка Тогда + КоличествоОтмеченныхАдресныхОбъектов = КоличествоОтмеченныхАдресныхОбъектов + 1; + КонецЕсли; + КонецЦикла; + + Возврат КоличествоОтмеченныхАдресныхОбъектов; + +КонецФункции + +// В зависимости от текущей страницы устанавливает доступность тех или иных полей для пользователя +// +&НаКлиенте +Процедура УстановитьИзмененияВИнтерфейсе() + + ИсточникДанныхДляЗагрузкиВыбран = ИсточникДанныхДляЗагрузкиВыбран(); + КоличествоОтмеченныхАдресныхОбъектов = КоличествоОтмеченныхАдресныхОбъектов(); + + Если Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаВыборАдресныхОбъектов Тогда + Элементы.Назад.Доступность = Ложь; + Элементы.Далее.Доступность = Истина; + ИначеЕсли Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаВыборИсточника Тогда + Элементы.Назад.Доступность = Истина; + Элементы.Далее.Доступность = Истина; + + Если ИсточникДанныхДляЗагрузки = 0 Тогда + ИсточникДанныхДляЗагрузки = 1; + КонецЕсли; + + Если ИсточникДанныхДляЗагрузки = 2 Тогда + Элементы.СтраницыСпособаЗагрузки.ТекущаяСтраница = Элементы.СтраницаЗагрузкаСДискаИТС; + ИначеЕсли ИсточникДанныхДляЗагрузки = 3 Тогда + Элементы.СтраницыСпособаЗагрузки.ТекущаяСтраница = Элементы.СтраницаЗагрузкаФайлов; + Иначе + Элементы.СтраницыСпособаЗагрузки.ТекущаяСтраница = Элементы.ПустаяСтраница; + КонецЕсли; + ИначеЕсли Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаЗагрузка Тогда + Элементы.Назад.Доступность = Истина; + Элементы.Далее.Доступность = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ИсточникДанныхДляЗагрузкиВыбран() + + ИсточникВыбран = Ложь; + + Если ИсточникДанныхДляЗагрузки = 1 Тогда + ИсточникВыбран = Истина; + ИначеЕсли ИсточникДанныхДляЗагрузки = 2 Тогда + Если АдресныйКлассификаторКлиент.ПроверитьНаличиеФайловНаДискеИТС(ДискИТС) Тогда + ИсточникВыбран = Истина; + КонецЕсли; + ИначеЕсли ИсточникДанныхДляЗагрузки = 3 Тогда + Если АдресныйКлассификаторКлиент.ПроверитьНаличиеФайловДанныхВКаталоге(ПутьКФайламДанныхНаДиске) Тогда + ИсточникВыбран = Истина; + КонецЕсли; + КонецЕсли; + + Возврат ИсточникВыбран; + +КонецФункции diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаОчисткиАдресногоКлассификатора/Form.form b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаОчисткиАдресногоКлассификатора/Form.form new file mode 100644 index 000000000..4049ba0d8 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаОчисткиАдресногоКлассификатора/Form.form @@ -0,0 +1,653 @@ + + + + АдресныеОбъекты + 1 + true + true + + true + + + АдресныеОбъекты + + false + None + Add + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + OutputList + SortListAsc + SortListDesc + + ГруппаСтрока + 10 + + Пометка + 4 + true + true + + true + + + АдресныеОбъекты.Пометка + + + ПометкаРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ПометкаКонтекстноеМеню + 5 + true + + CheckBoxField + Enter + true + Left + true + + + + НаименованиеАдресногоОбъекта + 6 + true + true + + true + + + АдресныеОбъекты.НаименованиеАдресногоОбъекта + + + НаименованиеАдресногоОбъектаРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + НаименованиеАдресногоОбъектаКонтекстноеМеню + 7 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа строка</value> + + + ru + Группа строка + + + ГруппаСтрокаРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + ColumnGroup + + auto + true + + + Top + + АдресныеОбъектыКоманднаяПанель + 3 + + ВыделитьВсе + 9 + true + true + + true + + false + + ВыделитьВсеРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.Command.ВыделитьВсе + Normal + Auto + true + true + UserCmds + Auto + + + ОтменитьВыделитьВсе + 8 + true + true + + true + + false + + ОтменитьВыделитьВсеРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Form.Command.ОтменитьВыделитьВсе + Normal + Auto + true + true + UserCmds + Auto + + + Найти + 12 + true + true + + true + + false + + НайтиРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.Item.АдресныеОбъекты.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + Кнопка + 11 + true + true + + true + + false + + КнопкаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + Form.Item.АдресныеОбъекты.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + АдресныеОбъектыВыбор + + + АдресныеОбъектыСтрокаПоиска + 24 + + АдресныеОбъектыСтрокаПоискаРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + АдресныеОбъектыСтрокаПоискаКонтекстноеМеню + 25 + true + + АдресныеОбъекты + + true + + + + АдресныеОбъектыСостояниеПросмотра + 27 + + АдресныеОбъектыСостояниеПросмотраРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + АдресныеОбъектыСостояниеПросмотраКонтекстноеМеню + 28 + true + + ViewStatusAddition + АдресныеОбъекты + + true + + + + АдресныеОбъектыУправлениеПоиском + 30 + + АдресныеОбъектыУправлениеПоискомРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + АдресныеОбъектыУправлениеПоискомКонтекстноеМеню + 31 + true + + SearchControlAddition + АдресныеОбъекты + + true + + + + АдресныеОбъектыРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + АдресныеОбъектыКонтекстноеМеню + 2 + true + + true + true + true + true + true + Row + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + None + None + None + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Очистить + 13 + true + true + + true + + false + + ОчиститьРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + Form.Command.Очистить + Auto + true + true + true + UserCmds + Auto + + + Отмена + 14 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 15 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + АдресныеОбъекты + + <key>ru</key> + <value>Адресные объекты</value> + + 1 + + ValueTable + + + true + + + true + + + Пометка + + <key>ru</key> + <value>Пометка</value> + + 1 + + Boolean + + + true + + + true + + + + НаименованиеАдресногоОбъекта + + <key>ru</key> + <value>Наименование адресного объекта</value> + + 2 + + String + + + + true + + + true + + + + + ВыделитьВсе + + <key>ru</key> + <value>Выделить все</value> + + 1 + + ru + Выделить все + + + true + + + StdPicture.CheckAll + + + + ВыделитьВсеВыполнить + + + Auto + Auto + + + ОтменитьВыделитьВсе + + <key>ru</key> + <value>Отменить выделить все</value> + + 2 + + ru + Отменить выделить все + + + true + + + StdPicture.GrayedAll + + + + ОтменитьВыделитьВсеВыполнить + + + Auto + Auto + + + Очистить + + <key>ru</key> + <value>Очистить</value> + + 3 + + ru + Очистить + + + true + + Role.Администрирование + + + Role.ВыводНаПринтерФайлБуферОбмена + + + true + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеОтветовНаВопросыАнкет + + + + + ОчиститьВыполнить + + + Auto + Auto + + + + + + diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаОчисткиАдресногоКлассификатора/Help/ru.html b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаОчисткиАдресногоКлассификатора/Help/ru.html new file mode 100644 index 000000000..1701acaff --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаОчисткиАдресногоКлассификатора/Help/ru.html @@ -0,0 +1,7 @@ + +

    Удаление адресных сведений по выбранным адресным объектам из адресного классификатора.

    +

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

    +

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

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

    \ No newline at end of file diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаОчисткиАдресногоКлассификатора/Module.bsl b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаОчисткиАдресногоКлассификатора/Module.bsl new file mode 100644 index 000000000..e2f059e9f --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаОчисткиАдресногоКлассификатора/Module.bsl @@ -0,0 +1,146 @@ +//////////////////////////////////////////////////////////////////////////////// +// Блок функций - обработчиков событий +// + +// Обработчик события "при создании на сервере" формы +// Заполняет таблицу по макету +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗаполнитьТаблицуПоМакетуАдресныхОбъектов(); + +КонецПроцедуры + +// Обработчик события "выбор" элемента формы АдресныеОбъекты +// Инвертирует флаг выбора адресного объекта +// +&НаКлиенте +Процедура АдресныеОбъектыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + Элемент.ТекущиеДанные.Пометка = НЕ Элемент.ТекущиеДанные.Пометка; +КонецПроцедуры + +// Обработчик события нажатия на кнопку командной панели +// элемента управления АдресныеОбъекты. +// Устанавливает флаг выбора всем адресным объектам в списке +// +&НаКлиенте +Процедура ВыделитьВсеВыполнить() + + Для Каждого ЭлементАдресныйОбъект Из АдресныеОбъекты Цикл + ЭлементАдресныйОбъект.Пометка = Истина; + КонецЦикла; + +КонецПроцедуры + +// Обработчик события нажатия на кнопку командной панели +// элемента управления АдресныеОбъекты. +// Снимает флаг выбора у всех адресных объектов в списке +// +&НаКлиенте +Процедура ОтменитьВыделитьВсеВыполнить() + + Для Каждого ЭлементАдресныйОбъект Из АдресныеОбъекты Цикл + ЭлементАдресныйОбъект.Пометка = Ложь; + КонецЦикла; + +КонецПроцедуры + +// Обработчик события нажатия на кнопку "Очистить" +// Проверяет корректность данных и вызывает диалог поддверждения +// очистки адресных сведений. +// +&НаКлиенте +Процедура ОчиститьВыполнить() + + ОчиститьСообщения(); + + Если КоличествоВыделенныхАдресныхОбъектов() = 0 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Необходимо выбрать как минимум один адресный объект'"), , + "АдресныеОбъекты"); + Возврат; + КонецЕсли; + + ТекстВопроса = НСтр("ru = 'Адресные сведения по выбранным объектам будут удалены. Вы уверены, что хотите продолжить?'"); + КодВозврата = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); + + Если КодВозврата = КодВозвратаДиалога.ОК Тогда + ОчиститьАдресныеСведения(); + Предупреждение(НСтр("ru = 'Адресные сведения успешно удалены'"),, + НСтр("ru = 'Удаление адресных сведений'")); + Оповестить("ИзменениеАдресногоКлассификатора"); + Закрыть(Истина); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Блок сервисных функций +// + +// Заполняет переданную таблицу значений по значениям таблицы адресных объектов. +// Выбирается код, наименование и сокращение типа объекта. +// +&НаСервере +Процедура ЗаполнитьТаблицуПоМакетуАдресныхОбъектов() + + АдресныеОбъекты.Очистить(); + + КлассификаторАдресныхОбъектовXML = + РегистрыСведений.АдресныйКлассификатор.ПолучитьМакет("КлассификаторАдресныхОбъектовРоссии").ПолучитьТекст(); + + КлассификаторТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(КлассификаторАдресныхОбъектовXML).Данные; + + Для Каждого АдресныйОбъект Из КлассификаторТаблица Цикл + + Наименование = Лев(АдресныйОбъект.Code, 2) + + " - " + + АдресныйОбъект.Name + + " " + + АдресныйОбъект.Socr; + + НоваяСтрока = АдресныеОбъекты.Добавить(); + НоваяСтрока.Пометка = Ложь; + НоваяСтрока.НаименованиеАдресногоОбъекта = Наименование; + + КонецЦикла; + +КонецПроцедуры + +// Возвращает количество помеченных адресных объектов +// +&НаКлиенте +Функция КоличествоВыделенныхАдресныхОбъектов() + + КоличествоВыделенныхАдресныхОбъектов = 0; + + Для Каждого ЭлементАдресныйОбъект Из АдресныеОбъекты Цикл + Если ЭлементАдресныйОбъект.Пометка Тогда + КоличествоВыделенныхАдресныхОбъектов = КоличествоВыделенныхАдресныхОбъектов + 1; + КонецЕсли; + КонецЦикла; + + Возврат КоличествоВыделенныхАдресныхОбъектов; + +КонецФункции + +// Удалает адресные сведения по выбранным адресным объектам +// +&НаСервере +Процедура ОчиститьАдресныеСведения() + + // формируем список адресных объектов, для очистки адресных сведений + + ВыбранныеАО = Новый Массив; + + Для Каждого ЭлементАдресныйОбъект Из АдресныеОбъекты Цикл + Если ЭлементАдресныйОбъект.Пометка Тогда + ВыбранныеАО.Добавить(Лев(ЭлементАдресныйОбъект.НаименованиеАдресногоОбъекта, 2)); + КонецЕсли; + КонецЦикла; + + АдресныйКлассификатор.УдалитьАдресныеСведения(ВыбранныеАО); + АдресныйКлассификатор.ЗагрузитьАдресныеОбъектыПервогоУровня(); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..ed804f2e6 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Form.form @@ -0,0 +1,1136 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + ТипАдресногоЭлемента + 4 + + <key>ru</key> + <value>Тип</value> + + true + true + + true + + + Список.ТипАдресногоЭлемента + + true + + ТипАдресногоЭлементаРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ТипАдресногоЭлементаКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + 1 + true + true + true + true + + Style.BorderColor + + Normal + + + + Код + 6 + + <key>ru</key> + <value>Код</value> + + true + true + + true + + + Список.Код + + true + + КодРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + ru + ЧЦ=21; ЧВН= + + + + + КодАдресногоОбъектаВКоде + 8 + + <key>ru</key> + <value>СС</value> + + true + true + + true + + + Список.КодРегионаВКоде + + true + + КодАдресногоОбъектаВКодеРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + КодАдресногоОбъектаВКодеКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + КодРайонаВКоде + 10 + + <key>ru</key> + <value>РРР</value> + + true + true + + true + + + Список.КодРайонаВКоде + + true + + КодРайонаВКодеРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + КодРайонаВКодеКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + КодГородаВКоде + 12 + + <key>ru</key> + <value>ГГГ</value> + + true + true + + true + + + Список.КодГородаВКоде + + true + + КодГородаВКодеРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + КодГородаВКодеКонтекстноеМеню + 13 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + КодНаселенногоПунктаВКоде + 14 + + <key>ru</key> + <value>ППП</value> + + true + true + + true + + + Список.КодНаселенногоПунктаВКоде + + true + + КодНаселенногоПунктаВКодеРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + КодНаселенногоПунктаВКодеКонтекстноеМеню + 15 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + КодУлицыВКоде + 16 + + <key>ru</key> + <value>УУУУ</value> + + true + true + + true + + + Список.КодУлицыВКоде + + true + + КодУлицыВКодеРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + КодУлицыВКодеКонтекстноеМеню + 17 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Наименование + 18 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Наименование + + true + + НаименованиеРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Сокращение + 20 + + <key>ru</key> + <value>Сокр.</value> + + true + true + + true + + + Список.Сокращение + + true + + СокращениеРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + СокращениеКонтекстноеМеню + 21 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Индекс + 22 + + <key>ru</key> + <value>Индекс</value> + + true + true + + true + + + Список.Индекс + + true + + ИндексРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + ИндексКонтекстноеМеню + 23 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + АльтернативныеНазвания + 24 + + <key>ru</key> + <value>Альтернативные названия</value> + + true + true + + true + + + Список.АльтернативныеНазвания + + true + + АльтернативныеНазванияРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + АльтернативныеНазванияКонтекстноеМеню + 25 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 35 + + СписокСтрокаПоискаРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 36 + true + + Список + + true + + + + СписокСостояниеПросмотра + 38 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 39 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 41 + + СписокУправлениеПоискомРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 42 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + true + 10 + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.DefaultPicture + + + Style.BorderColor + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
    + + ФормаКоманднаяПанель + -1 + + ЗагрузитьКлассификатор + 28 + true + true + + true + + false + + ЗагрузитьКлассификаторРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Form.Command.ЗагрузитьКлассификатор + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + ОчиститьКлассификатор + 29 + true + true + + true + + false + + ОчиститьКлассификаторРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.Command.ОчиститьКлассификатор + Normal + Auto + true + true + UserCmds + Auto + + + ПроверитьОбновление + 30 + true + true + + true + + false + + ПроверитьОбновлениеРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.Command.ПроверитьОбновление + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + NotificationProcessing + ОбработкаОповещения + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + InformationRegister.АдресныйКлассификатор + true + true + true + true + +
    + + ОчиститьКлассификатор + + <key>ru</key> + <value>Очистить классификатор</value> + + 2 + + ru + Очистить классификатор + + + true + + Role.Администрирование + + + Role.БазовыеПрава + + + Role.ВыводНаПринтерФайлБуферОбмена + + + true + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ИзменениеДополнительныхСведений + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеРолейИсполнителей + + + Role.ДобавлениеИзменениеФизическихЛиц + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИзменениеМакетовПечатныхФорм + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеДополнительныхСведений + + + Role.ЧтениеОтветовНаВопросыАнкет + + + Role.ЧтениеПерсональныхДанныхФизическихЛиц + + + + + ОчиститьКлассификаторВыполнить + + + Auto + Auto + + + ПроверитьОбновление + + <key>ru</key> + <value>Проверить обновление</value> + + 3 + + ru + Проверить обновление адресных сведений на сайте 1С + + + true + + Role.Администрирование + + + Role.БазовыеПрава + + + Role.ВыводНаПринтерФайлБуферОбмена + + + true + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ИзменениеДополнительныхСведений + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеРолейИсполнителей + + + Role.ДобавлениеИзменениеФизическихЛиц + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИзменениеМакетовПечатныхФорм + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеДополнительныхСведений + + + Role.ЧтениеОтветовНаВопросыАнкет + + + Role.ЧтениеПерсональныхДанныхФизическихЛиц + + + + + ПроверитьОбновление + + + Auto + Auto + + + ЗагрузитьКлассификатор + + <key>ru</key> + <value>Загрузить классификатор</value> + + 1 + + ru + Загрузить классификатор + + + true + + Role.Администрирование + + + Role.БазовыеПрава + + + Role.ВыводНаПринтерФайлБуферОбмена + + + true + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ИзменениеДополнительныхСведений + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеРолейИсполнителей + + + Role.ДобавлениеИзменениеФизическихЛиц + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИзменениеМакетовПечатныхФорм + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеДополнительныхСведений + + + Role.ЧтениеОтветовНаВопросыАнкет + + + Role.ЧтениеПерсональныхДанныхФизическихЛиц + + + + + ЗагрузитьКлассификатор + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Help/ru.html b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Help/ru.html new file mode 100644 index 000000000..b6beec74d --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Help/ru.html @@ -0,0 +1,21 @@ + +

    Адресный классификатор предназначен для поддержки единого способа получения, использования и поддержки адресных сведений в прикладных подсистемах.  Механизм предоставляет инструменты для управления адресными сведениями: добавления, изменения, удаления адресных сведений, в том числе загрузка адресных сведений с диска информационно-технологического сопровождения либо файлов распространяемых ГНИВЦ ФНС РФ.

    +

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

    +

    + + + + + + + + + + + +
    ТипТип адресного объекта, в зависимости от уровня классификации; поле может принимать значение от 1 до 6
    КодУникальный код адресного объекта (составное поле)
    ССКод субъекта Российской Федерации
    РРРКод района
    ГГГКод города
    ПППКод населенного пункта
    УУУКод улицы
    НаименованиеНаименование адресного объекта
    Сокр.Сокращенное наименование типа адресного объекта
    ИндексСодержит почтовый индекс предприятия почтовой связи, обслуживающего данный адресный объект
    +

    Альтернативные названия

    Альтернативное наименование адресного объекта (например устаревшее название)

     

    +

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

    +
  • Загрузить - вызов мастера загрузки адресных сведений (открывается форма подготовки параметров загрузки) +
  • Очистить классификатор - вызов формы управления очисткой адресных сведений по регионам
  • Адресными сведениями можно так же управлять непосредственно добавляя / удаляя / изменяя строки в табличной части.

    +

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

    \ No newline at end of file diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Module.bsl b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..9f41c7f9b --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,29 @@ + +&НаКлиенте +Процедура ЗагрузитьКлассификатор(Команда) + АдресныйКлассификаторКлиент.ЗагрузитьАдресныйКлассификатор(); +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьКлассификаторВыполнить(Команда) + + АдресныйКлассификаторКлиент.ОчиститьКлассификатор(); + ОбновитьОтображениеДанных(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьОбновление(Команда) + + АдресныйКлассификаторКлиент.ПроверитьОбновлениеАдресныхОбъектов(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ИзменениеАдресногоКлассификатора" Тогда + Элементы.Список.Обновить(); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Help/ru.html b/SSL/src/InformationRegisters/АдресныйКлассификатор/Help/ru.html new file mode 100644 index 000000000..dee19a027 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Help/ru.html @@ -0,0 +1,2 @@ + +

    Адресный классификатор предназначен для поддержки единого способа получения, использования и поддержки адресных сведений в прикладных подсистемах.  Механизм предоставляет инструменты для управления адресными сведениями: добавления, изменения, удаления адресных сведений, в том числе загрузка адресных сведений с диска информационно-технологического сопровождения либо файлов распространяемых ГНИВЦ ФНС РФ.

    \ No newline at end of file diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/Templates/КлассификаторАдресныхОбъектовРоссии/Template.txt b/SSL/src/InformationRegisters/АдресныйКлассификатор/Templates/КлассификаторАдресныхОбъектовРоссии/Template.txt new file mode 100644 index 000000000..239f3ece3 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/Templates/КлассификаторАдресныхОбъектовРоссии/Template.txt @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SSL/src/InformationRegisters/АдресныйКлассификатор/АдресныйКлассификатор.mdo b/SSL/src/InformationRegisters/АдресныйКлассификатор/АдресныйКлассификатор.mdo new file mode 100644 index 000000000..cf6e49839 --- /dev/null +++ b/SSL/src/InformationRegisters/АдресныйКлассификатор/АдресныйКлассификатор.mdo @@ -0,0 +1,423 @@ + + + + + + + + + + + + АдресныйКлассификатор + + ru + Адресный классификатор + + true + InformationRegister.АдресныйКлассификатор.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + 0001-01-01T00:00:00 + + ShowError + Use + + + + true + + + ru + + + Managed + + Наименование + + ru + Наименование + + + String + + 40 + + + + ru + Наименование адресного объекта + + + + Use + Use + + Index + + + Сокращение + + ru + Сокращение + + + String + + 10 + + + + ru + Сокращение типа адресного объекта + + + + Use + Use + + + + + + Индекс + + ru + Индекс + + + String + + 6 + true + + + + ru + Индекс адресного объекта + + + + Use + Use + + + + Index + + + АльтернативныеНазвания + + ru + Альтернативные названия + + + String + + 200 + + + + ru + Альтернативные названия адресного объекта (перечислены через запятые, если есть) + + + + Use + Use + + + + Index + + + ТипАдресногоЭлемента + + ru + Тип адресного элемента + + + Number + + 1 + true + + + + ru + Тип адресного объекта + + + + Index + Use + Use + + 0 + + true + + + Код + + ru + Код + + + Number + + 21 + true + + + + ru + Код адресного объекта + + + + true + Index + Use + Use + + 0 + + true + + + КодАдресногоОбъектаВКоде + + ru + Код адресного объекта в коде + + + Number + + 2 + true + + + + ru + Код региона адресного объекта + + + + Index + Use + Use + + 0 + + true + + + КодРайонаВКоде + + ru + Код района в коде + + + Number + + 3 + true + + + + ru + Код района адресного объекта + + + + Index + Use + Use + + 0 + + true + + + КодГородаВКоде + + ru + Код города в коде + + + Number + + 3 + true + + + + ru + Код города адресного объекта + + + + Index + Use + Use + + 0 + + true + + + КодНаселенногоПунктаВКоде + + ru + Код населенного пункта в коде + + + Number + + 3 + true + + + + ru + Код населенного пункта адресного объекта + + + + Index + Use + Use + + 0 + + true + + + КодУлицыВКоде + + ru + Код улицы в коде + + + Number + + 4 + true + + + + ru + Код улицы адресного объекта + + + + Index + Use + Use + + 0 + + true + + + АутентификацияНаПользовательскомСайте + + ru + Данные аутентификации + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаВыбора + + ru + Форма выбора + + PersonalComputer + MobileDevice + + + ФормаЗагрузкиАдресногоКлассификатора + + ru + Подготовка параметров загрузки + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаОчисткиАдресногоКлассификатора + + ru + Очистка адресного классификатора + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Адресные сведения + + true + + + ru + + + PersonalComputer + MobileDevice + + + КлассификаторАдресныхОбъектовРоссии + + ru + Классификатор адресных объектов россии + + TextDocument + + diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Form.form b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Form.form new file mode 100644 index 000000000..02923143a --- /dev/null +++ b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Form.form @@ -0,0 +1,967 @@ + + + + <key>ru</key> + <value>История изменений</value> + + + ОсновнаяСтраница + 21 + + ВыборВерсийДляСравнения + 22 + + СписокВерсий + 10 + true + true + + true + + + СписокВерсий + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + + Строка + 20 + + НомерВерсии + 13 + true + true + + true + + + СписокВерсий.НомерВерсии + + + НомерВерсииРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + НомерВерсииКонтекстноеМеню + 14 + true + + InputField + true + Enter + true + Left + true + + 3 + true + true + true + true + true + Normal + + + + АвторВерсии + 15 + true + true + + true + + + СписокВерсий.АвторВерсии + + + АвторВерсииРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + АвторВерсииКонтекстноеМеню + 16 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Дата + 17 + true + true + + true + + + СписокВерсий.ДатаВерсии + + + ДатаРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 18 + true + + InputField + true + Enter + true + Left + true + + 10 + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Строка</value> + + + ru + Строка + + + СтрокаРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + ColumnGroup + + auto + true + + + Top + + СписокВерсийКоманднаяПанель + 12 + + ОткрытьВерсиюОбъекта + 19 + true + true + + true + + false + + ОткрытьВерсиюОбъектаРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.Command.ОткрытьВерсиюОбъекта + Normal + Auto + true + true + UserCmds + Auto + + + ОтчетПоИзменениям + 9 + true + true + + true + + false + + ОтчетПоИзменениямРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.Command.СформироватьОтчетПоИзменениям + Normal + Auto + true + true + UserCmds + Auto + + + Найти + 29 + true + true + + true + + false + + НайтиРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.Item.СписокВерсий.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ОтменитьПоиск + 30 + true + true + + true + + false + + ОтменитьПоискРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + Form.Item.СписокВерсий.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + СписокВерсийВыбор + + + СписокВерсийСтрокаПоиска + 40 + + СписокВерсийСтрокаПоискаРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + СписокВерсийСтрокаПоискаКонтекстноеМеню + 41 + true + + СписокВерсий + + true + + + + СписокВерсийСостояниеПросмотра + 43 + + СписокВерсийСостояниеПросмотраРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + СписокВерсийСостояниеПросмотраКонтекстноеМеню + 44 + true + + ViewStatusAddition + СписокВерсий + + true + + + + СписокВерсийУправлениеПоиском + 46 + + СписокВерсийУправлениеПоискомРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + СписокВерсийУправлениеПоискомКонтекстноеМеню + 47 + true + + SearchControlAddition + СписокВерсий + + true + + + + СписокВерсийРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + СписокВерсийКонтекстноеМеню + 11 + + КМ_ОткрытьВерсиюОбъекта + 27 + true + true + + true + + false + + КМ_ОткрытьВерсиюОбъектаРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.Command.СформироватьОтчетПоИзменениям + Normal + Auto + true + true + UserCmds + Auto + + + КМ_ОтчетПоИзменениям + 26 + true + true + + true + + false + + КМ_ОтчетПоИзменениямРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.Command.ОткрытьВерсиюОбъекта + Normal + Auto + true + true + UserCmds + Auto + + + true + 50 + true + true + true + MultiRow + Row +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + None + None + None + true + +
    + + КоманднаяПанель + 8 + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + ru + Командная панель + + + КоманднаяПанельРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + ВыборВерсийДляСравненияРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Page + + Vertical + +
    + + ВерсииДляСравненияОтсутствуют + 23 + + Текст_ВерсииОтсутствуют + 24 + true + true + + true + + + Текст_ВерсииОтсутствуют + + None + + Текст_ВерсииОтсутствуютРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + Текст_ВерсииОтсутствуютКонтекстноеМеню + 25 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + ВерсииДляСравненияОтсутствуютРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + Page + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Основная страница</value> + + + ОсновнаяСтраницаРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Pages + + Auto + +
    + + Группа + 28 + true + true + + true + + + ГруппаРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + CommandBar + + Left + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + Close + CustomizeForm + Help + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + 50 + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + СписокВерсий + + <key>ru</key> + <value>Список версий</value> + + 1 + + ValueTable + + + true + + + true + + + НомерВерсии + + <key>ru</key> + <value>№</value> + + 2 + + Number + + 10 + true + + + + true + + + true + + + + АвторВерсии + + <key>ru</key> + <value>Автор изменений</value> + + 1 + + String + + + + true + + + true + + + + ДатаВерсии + + <key>ru</key> + <value>Дата</value> + + 3 + + String + + + + true + + + true + + + + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 2 + + DocumentRef + CatalogRef + + + true + + + true + + + + Текст_ВерсииОтсутствуют + + <key>ru</key> + <value>Текст версии отсутствуют</value> + + 3 + + String + + + + true + + + true + + + + СформироватьОтчетПоИзменениям + + <key>ru</key> + <value>Отчет по изменениям</value> + + 1 + + ru + Сформировать отчет по изменениям + + + true + + Role.Администрирование + + + Role.ВыводНаПринтерФайлБуферОбмена + + + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеОтветовНаВопросыАнкет + + + + + СформироватьОтчетПоИзменениямВыполнить + + + Auto + Auto + + + ОткрытьВерсиюОбъекта + + <key>ru</key> + <value>Открыть версию объекта</value> + + 2 + + ru + Открыть версию объекта + + + true + + Role.Администрирование + + + Role.ВыводНаПринтерФайлБуферОбмена + + + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеОтветовНаВопросыАнкет + + + + + ОткрытьВерсиюОбъектаВыполнить + + + Auto + Auto + + + Ссылка + + DocumentRef + CatalogRef + + + + ЧислоВерсий + + Number + + 10 + + + + + + + +
    diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Module.bsl b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Module.bsl new file mode 100644 index 000000000..03f482b52 --- /dev/null +++ b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Module.bsl @@ -0,0 +1,129 @@ +//////////////////////////////////////////////////////////////////////////////// +// Секция обработчиков событий формы и элементов формы + +// Обработчик события формы "ПриСозданииНаСервере" +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Ссылка = Параметры.Ссылка; + + Если ВерсионированиеОбъектов.ПолучитьКоличествоВерсийОбъекта(Ссылка) = 0 Тогда + Элементы.ОсновнаяСтраница.ТекущаяСтраница = Элементы.ВерсииДляСравненияОтсутствуют; + Текст_ВерсииОтсутствуют = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Нет хранимых версий, относящихся к объекту <%1>.'"), + Строка(Ссылка)); + КонецЕсли; + + ЗначениеВРеквизитФормы(СформироватьТаблицуВерсий(Ссылка), "СписокВерсий"); + +КонецПроцедуры + +// Функция возвращает список номеров версий объекта переданного по ссылке +// +// Параметры: +// Ссылка - СправочникСсылка, ДокументСсылка - ссылка на объект +// +&НаСервереБезКонтекста +Функция СформироватьТаблицуВерсий(Ссылка) + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ НомерВерсии, АвторВерсии, ДатаВерсии + | ИЗ РегистрСведений.ВерсииОбъектов + | ГДЕ Объект=&Ссылка + | УПОРЯДОЧИТЬ ПО НомерВерсии Убыв"; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +// Обработчик события "Выбор" табличного поля "СписокВерсий" +// +&НаКлиенте +Процедура СписокВерсийВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ОткрытьВерсиюОбъекта(); + +КонецПроцедуры + +// Обработчик нажатия на кнопку "ОткрытьВерсиюОбъекта" +// +&НаКлиенте +Процедура ОткрытьВерсиюОбъектаВыполнить() + + ОткрытьВерсиюОбъекта(); + +КонецПроцедуры + +// Обработчик нажатия на кнопку "ОтчетПоИзменениям" +// +&НаКлиенте +Процедура СформироватьОтчетПоИзменениямВыполнить() + + ВыделенныеСтроки = Элементы.СписокВерсий.ВыделенныеСтроки; + + ВыбранныеВерсии = СформироватьСписокВыбранныхВерсий(ВыделенныеСтроки); + + Если ВыбранныеВерсии.Количество() < 2 Тогда + Предупреждение(НСтр("ru = 'Для формирования отчета по изменениям, необходимо выбрать, как минимум, две версии.'")); + Иначе + ОткрытьФормуОтчета(ВыбранныеВерсии); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Секция вспомогательных функций + +// Проверяет, что в списке версий выбрана версия и вызывает форму +// отчета с переданным параметром - номером выбранной версии. +// +&НаКлиенте +Процедура ОткрытьВерсиюОбъекта() + + Если ЗначениеЗаполнено(Элементы.СписокВерсий.ТекущиеДанные.НомерВерсии) Тогда + ВыбранныеВерсии = Новый СписокЗначений; + ВыбранныеВерсии.Добавить(Элементы.СписокВерсий.ТекущиеДанные.НомерВерсии); + + Если ВыбранныеВерсии <> Неопределено Тогда + ОткрытьФормуОтчета(ВыбранныеВерсии); + КонецЕсли; + Иначе + Предупреждение(НСтр("ru = 'Для продолжения необходимо выбрать версию объекта'")); + КонецЕсли; + +КонецПроцедуры + +// Открывает форму отчета по изменениям, с требуемыми параметрами +// +&НаКлиенте +Процедура ОткрытьФормуОтчета(СписокВерсийПараметр) + + ПараметрыОтчета = Новый Структура; + ПараметрыОтчета.Вставить("Ссылка", Ссылка); + ПараметрыОтчета.Вставить("СписокВерсий", СписокВерсийПараметр); + + ОткрытьФорму("Отчет.ОтчетПоВерсиям.Форма.ФормаОтчета", + ПараметрыОтчета, + ЭтаФорма, + УникальныйИдентификатор); + +КонецПроцедуры + +// Функция возвращает список номеров выбранных версий +// +&НаКлиенте +Функция СформироватьСписокВыбранныхВерсий(ВыделенныеСтроки) + + ВыбранныеВерсии = Новый СписокЗначений; + + Для Каждого НомерВыделеннойСтроки Из ВыделенныеСтроки Цикл + ВыбранныеВерсии.Добавить(СписокВерсий[НомерВыделеннойСтроки].НомерВерсии); + КонецЦикла; + + ВыбранныеВерсии.СортироватьПоЗначению(НаправлениеСортировки.Возр); + + Возврат ВыбранныеВерсии; + +КонецФункции diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..b671d099f --- /dev/null +++ b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,245 @@ + + + + Объект + 1 + true + true + + true + + + Запись.Объект + + + ОбъектРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ОбъектКонтекстноеМеню + 2 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + НомерВерсии + 3 + true + true + + true + + + Запись.НомерВерсии + + + НомерВерсииРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + НомерВерсииКонтекстноеМеню + 4 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + АвторВерсии + 5 + true + true + + true + + + Запись.АвторВерсии + + + АвторВерсииРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + АвторВерсииКонтекстноеМеню + 6 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ДатаВерсии + 7 + true + true + + true + + + Запись.ДатаВерсии + + + ДатаВерсииРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + ДатаВерсииКонтекстноеМеню + 8 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Сжато + 9 + true + true + + true + + + СжатоРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СжатоКонтекстноеМеню + 10 + true + + CheckBoxField + true + Enter + true + Left + true + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + Copy + Write + WriteAndClose + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Запись + 1 + + InformationRegisterRecordManager.ВерсииОбъектов + + + true + + + true + +
    true
    + true +
    + + + + + + + BeforeWrite + ПередЗаписью + + +
    diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаЗаписи/Module.bsl new file mode 100644 index 000000000..03554dc2d --- /dev/null +++ b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаЗаписи/Module.bsl @@ -0,0 +1,5 @@ + +&НаКлиенте +Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) + Отказ = Истина; +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..6e058db57 --- /dev/null +++ b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Form.form @@ -0,0 +1,435 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + Change + Choose + Copy + Create + Delete + + Объект + 4 + true + true + + true + + + Список.Объект + + true + + ОбъектРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ОбъектКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + НомерВерсии + 6 + true + true + + true + + + Список.НомерВерсии + + true + + НомерВерсииРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + НомерВерсииКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + АвторВерсии + 8 + true + true + + true + + + Список.АвторВерсии + + true + + АвторВерсииРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + АвторВерсииКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ДатаВерсии + 10 + true + true + + true + + + Список.ДатаВерсии + + true + + ДатаВерсииРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ДатаВерсииКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Сжато + 12 + true + true + + true + + + Список.Сжато + + true + + СжатоРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + СжатоКонтекстноеМеню + 13 + true + + CheckBoxField + Enter + true + Left + true + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + BeforeAddRow + СписокПередНачаломДобавления + + + СписокСтрокаПоиска + 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 + + + + СписокРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + 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 + +
    + + ФормаКоманднаяПанель + -1 + + УдалитьЗаписи + 14 + true + true + + true + + false + + УдалитьЗаписиРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + Form.Command.УдалитьЗаписи + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + Change + Copy + Create + Delete + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + +
    true
    + + InformationRegister.ВерсииОбъектов + true + true + true + true + +
    + + УдалитьЗаписи + + <key>ru</key> + <value>Удалить записи по версиям</value> + + 1 + + ru + Удалить записи + + + true + + + StdPicture.Delete + + + + УдалитьЗаписи + + + TextPicture + Auto + Auto + + + + + + +
    diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Module.bsl b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..8f2c4b157 --- /dev/null +++ b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,37 @@ + +&НаКлиенте +Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + Отказ = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьЗаписи(Команда) + + ТекстВопроса = НСтр("ru = 'Внимание! Несогласованное удаление записей по версиям объектов может привести + |к нарушению последовательности записей и в дальнейшем к недостоверности отчета по изменениям. Продолжить?'"); + Если Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, НСтр("ru = 'Предупреждение'")) = КодВозвратаДиалога.Да Тогда + УдалитьВерсииИЗРегистра(Элементы.Список.ВыделенныеСтроки); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура УдалитьВерсииИЗРегистра(знач МассивКлючейЗаписей) + + Для Каждого КлючЗаписи Из МассивКлючейЗаписей Цикл + НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); + + НаборЗаписей.Отбор.Объект.Значение = КлючЗаписи.Объект; + НаборЗаписей.Отбор.Объект.ВидСравнения = ВидСравнения.Равно; + НаборЗаписей.Отбор.Объект.Использование = Истина; + + НаборЗаписей.Отбор.НомерВерсии.Значение = КлючЗаписи.НомерВерсии; + НаборЗаписей.Отбор.НомерВерсии.ВидСравнения = ВидСравнения.Равно; + НаборЗаписей.Отбор.НомерВерсии.Использование = Истина; + + НаборЗаписей.Записать(Истина); + КонецЦикла; + + Элементы.Список.Обновить(); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/ВерсииОбъектов.mdo b/SSL/src/InformationRegisters/ВерсииОбъектов/ВерсииОбъектов.mdo new file mode 100644 index 000000000..6901dccc8 --- /dev/null +++ b/SSL/src/InformationRegisters/ВерсииОбъектов/ВерсииОбъектов.mdo @@ -0,0 +1,197 @@ + + + + + + + + + + + + ВерсииОбъектов + + ru + Версии объектов + + InformationRegister.ВерсииОбъектов.Form.ФормаЗаписи + InformationRegister.ВерсииОбъектов.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ru + Версия объекта + + + ru + Записи о версиях объектов + + + ВерсияОбъекта + + ru + Версия объекта + + + ValueStorage + + + ru + Представление объекта в виде Fast InfoSet + + + + Use + + + + АвторВерсии + + ru + Автор версии + + + CatalogRef.ВнешниеПользователи + CatalogRef.Пользователи + + + ru + Пользователь, внесший изменения в объект + + + + Use + Use + + Catalog.Пользователи.EmptyRef + + + + ДатаВерсии + + ru + Дата версии + + + Date + + + + ru + Дата и время изменения объекта + + + + Use + Use + + 0001-01-01T00:00:00 + + + + Объект + + ru + Объект + + + String + + 10 + + + + ru + Ссылка на объект, сведения о версии которого хранятся в регистре + + + + Use + true + + Catalog.Пользователи.EmptyRef + + true + true + + + НомерВерсии + + ru + Номер версии + + + Number + + 10 + true + + + + + Use + + 0 + + true + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + + ВыборХранимыхВерсий + + ru + Выбор хранимых версий + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/ВерсииОбъектовАдресногоКлассификатора/ВерсииОбъектовАдресногоКлассификатора.mdo b/SSL/src/InformationRegisters/ВерсииОбъектовАдресногоКлассификатора/ВерсииОбъектовАдресногоКлассификатора.mdo new file mode 100644 index 000000000..288c1d714 --- /dev/null +++ b/SSL/src/InformationRegisters/ВерсииОбъектовАдресногоКлассификатора/ВерсииОбъектовАдресногоКлассификатора.mdo @@ -0,0 +1,134 @@ + + + + + + + + + + + + ВерсииОбъектовАдресногоКлассификатора + + ru + Версии объектов адресного классификатора + + true + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ДатаВыпускаВерсии + + ru + Дата выпуска версии + + + Date + + Date + + + + ru + ДФ=dd.MM.yyyy + + + ru + ДФ=dd.MM.yyyy + + + ru + Дата выпуска версии классификатора в формате дд.мм.гггг + + + + Use + Use + + 0001-01-01T00:00:00 + + + + Наименование + + ru + Наименование + + + String + + 40 + + + + ru + Наименование адресного объекта + + + + Use + Use + + Index + + + АдресныйОбъект + + ru + Адресный объект + + + String + + 2 + true + + + + ru + Код адресного объекта + + + + Index + Use + Use + + + + true + + diff --git a/SSL/src/InformationRegisters/ВерсииПодсистем/ВерсииПодсистем.mdo b/SSL/src/InformationRegisters/ВерсииПодсистем/ВерсииПодсистем.mdo new file mode 100644 index 000000000..a6b5b95b9 --- /dev/null +++ b/SSL/src/InformationRegisters/ВерсииПодсистем/ВерсииПодсистем.mdo @@ -0,0 +1,97 @@ + + + + + + + + + + + + ВерсииПодсистем + + ru + Версии подсистем + + Версии этой конфигурации и родительских конфигураций на поддержке + true + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + Версия + + ru + Версия + + Версия конфигурации + + String + + 15 + + + + + Use + Use + + + + + + ИмяПодсистемы + + ru + Имя подсистемы + + Имя этой конфигурации или родительской конфигурации на поддержке + + String + + 100 + + + + + Index + Use + Use + + + + true + + diff --git a/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..c9cba3854 --- /dev/null +++ b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/Forms/ФормаСписка/Form.form @@ -0,0 +1,680 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + None + + ВидДоступа + 4 + true + true + + true + + + Список.ВидДоступа + + true + + ВидДоступаРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ВидДоступаКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ЗначениеДоступаСКартинкой + 22 + + КартинкаЗначенияДоступа + 18 + true + true + + true + + + Список.НомерКартинкиЗначенияДоступа + + None + + КартинкаЗначенияДоступаРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + КартинкаЗначенияДоступаКонтекстноеМеню + 19 + true + + PictureField + Enter + true + Left + true + + true + true + true + true + + CommonPicture.ПиктограммыПользователя + + + + 1 + + + + + ЗначениеДоступа + 6 + true + true + + true + + + Список.ЗначениеДоступа + + true + + ЗначениеДоступаРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + ЗначениеДоступаКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Значение доступа с картинкой</value> + + + ЗначениеДоступаСКартинкойРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + ТолькоВидДоступа + 8 + true + true + + true + + + Список.ТолькоВидДоступа + + true + + ТолькоВидДоступаРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ТолькоВидДоступаКонтекстноеМеню + 9 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаДоступаСКартинкой + 23 + + КартинкаГруппыДоступа + 20 + true + true + + true + + + Список.НомерКартинкиГруппыДоступа + + None + + КартинкаГруппыДоступаРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + КартинкаГруппыДоступаКонтекстноеМеню + 21 + true + + PictureField + Enter + true + Left + true + + true + true + true + true + + CommonPicture.ПиктограммыПользователя + + + + 1 + + + + + ГруппаДоступа + 10 + true + true + + true + + + Список.ГруппаДоступа + + true + + ГруппаДоступаРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ГруппаДоступаКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Группа доступа с картинкой</value> + + + ГруппаДоступаСКартинкойРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + НаследоватьПраваРодителей + 12 + true + true + + true + + + Список.НаследоватьПраваРодителей + + true + + НаследоватьПраваРодителейРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + НаследоватьПраваРодителейКонтекстноеМеню + 13 + true + + CheckBoxField + Enter + true + Left + true + + + + СвязьСРодителем + 14 + true + true + + true + + + Список.СвязьСРодителем + + true + + СвязьСРодителемРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + СвязьСРодителемКонтекстноеМеню + 15 + true + + CheckBoxField + Enter + true + Left + true + + + + ИспользоватьПраваСсылки + 16 + true + true + + true + + + Список.ИспользоватьПраваСсылки + + true + + ИспользоватьПраваСсылкиРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ИспользоватьПраваСсылкиКонтекстноеМеню + 17 + true + + CheckBoxField + Enter + true + Left + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 25 + + СписокСтрокаПоискаРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 26 + true + + Список + + true + + + + СписокСостояниеПросмотра + 28 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 29 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 31 + + СписокУправлениеПоискомРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 32 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.DefaultPicture + + + Список.ВидДоступа + + + Список.ГруппаДоступа + + + Список.ЗначениеДоступа + + + Список.ИспользоватьПраваСсылки + + + Список.НаследоватьПраваРодителей + + + Список.НомерКартинкиГруппыДоступа + + + Список.НомерКартинкиЗначенияДоступа + + + Список.СвязьСРодителем + + + Список.ТолькоВидДоступа + +
    true
    + + ВЫБРАТЬ + РегистрСведенийГруппыЗначенийДоступа.ВидДоступа, + ВЫБОР + КОГДА ТИПЗНАЧЕНИЯ(РегистрСведенийГруппыЗначенийДоступа.ЗначениеДоступа) = ТИП(Справочник.Пользователи) + ТОГДА ВЫБОР + КОГДА РегистрСведенийГруппыЗначенийДоступа.ЗначениеДоступа.ПометкаУдаления + ТОГДА 0 + ИНАЧЕ 1 + КОНЕЦ + КОГДА ТИПЗНАЧЕНИЯ(РегистрСведенийГруппыЗначенийДоступа.ЗначениеДоступа) = ТИП(Справочник.ГруппыПользователей) + ТОГДА ВЫБОР + КОГДА РегистрСведенийГруппыЗначенийДоступа.ЗначениеДоступа.ПометкаУдаления + ТОГДА 2 + ИНАЧЕ 3 + КОНЕЦ + КОГДА ТИПЗНАЧЕНИЯ(РегистрСведенийГруппыЗначенийДоступа.ЗначениеДоступа) = ТИП(Справочник.ВнешниеПользователи) + ТОГДА ВЫБОР + КОГДА РегистрСведенийГруппыЗначенийДоступа.ЗначениеДоступа.ПометкаУдаления + ТОГДА 6 + ИНАЧЕ 7 + КОНЕЦ + КОГДА ТИПЗНАЧЕНИЯ(РегистрСведенийГруппыЗначенийДоступа.ЗначениеДоступа) = ТИП(Справочник.ГруппыВнешнихПользователей) + ТОГДА ВЫБОР + КОГДА РегистрСведенийГруппыЗначенийДоступа.ЗначениеДоступа.ПометкаУдаления + ТОГДА 8 + ИНАЧЕ 9 + КОНЕЦ + ИНАЧЕ -1 + КОНЕЦ КАК НомерКартинкиЗначенияДоступа, + РегистрСведенийГруппыЗначенийДоступа.ЗначениеДоступа, + РегистрСведенийГруппыЗначенийДоступа.ТолькоВидДоступа, + ВЫБОР + КОГДА ТИПЗНАЧЕНИЯ(РегистрСведенийГруппыЗначенийДоступа.ГруппаДоступа) = ТИП(Справочник.Пользователи) + ТОГДА ВЫБОР + КОГДА РегистрСведенийГруппыЗначенийДоступа.ГруппаДоступа.ПометкаУдаления + ТОГДА 0 + ИНАЧЕ 1 + КОНЕЦ + КОГДА ТИПЗНАЧЕНИЯ(РегистрСведенийГруппыЗначенийДоступа.ГруппаДоступа) = ТИП(Справочник.ГруппыПользователей) + ТОГДА ВЫБОР + КОГДА РегистрСведенийГруппыЗначенийДоступа.ГруппаДоступа.ПометкаУдаления + ТОГДА 2 + ИНАЧЕ 3 + КОНЕЦ + КОГДА ТИПЗНАЧЕНИЯ(РегистрСведенийГруппыЗначенийДоступа.ГруппаДоступа) = ТИП(Справочник.ВнешниеПользователи) + ТОГДА ВЫБОР + КОГДА РегистрСведенийГруппыЗначенийДоступа.ГруппаДоступа.ПометкаУдаления + ТОГДА 6 + ИНАЧЕ 7 + КОНЕЦ + КОГДА ТИПЗНАЧЕНИЯ(РегистрСведенийГруппыЗначенийДоступа.ГруппаДоступа) = ТИП(Справочник.ГруппыВнешнихПользователей) + ТОГДА ВЫБОР + КОГДА РегистрСведенийГруппыЗначенийДоступа.ГруппаДоступа.ПометкаУдаления + ТОГДА 8 + ИНАЧЕ 9 + КОНЕЦ + ИНАЧЕ -1 + КОНЕЦ КАК НомерКартинкиГруппыДоступа, + РегистрСведенийГруппыЗначенийДоступа.ГруппаДоступа, + РегистрСведенийГруппыЗначенийДоступа.НаследоватьПраваРодителей, + РегистрСведенийГруппыЗначенийДоступа.СвязьСРодителем, + РегистрСведенийГруппыЗначенийДоступа.ИспользоватьПраваСсылки +ИЗ + РегистрСведений.ГруппыЗначенийДоступа КАК РегистрСведенийГруппыЗначенийДоступа + InformationRegister.ГруппыЗначенийДоступа + true + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/RecordSetModule.bsl b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/RecordSetModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ГруппыЗначенийДоступа.mdo b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ГруппыЗначенийДоступа.mdo new file mode 100644 index 000000000..002cdd202 --- /dev/null +++ b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ГруппыЗначенийДоступа.mdo @@ -0,0 +1,190 @@ + + + + + + + + + + + + ГруппыЗначенийДоступа + + ru + Группы значений доступа + + InformationRegister.ГруппыЗначенийДоступа.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + 0 + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + 0001-01-01T00:00:00 + + ShowError + Use + + + + Managed + + НаследоватьПраваРодителей + + ru + Наследовать права родителей + + Когда Ссылка = СсылкаВИерархии, флажок имеет смысл + + Boolean + + + + Use + + + + СвязьСРодителем + + ru + Связь с родителем + + Истина, когда Ссылка <> СсылкаВИерархии, используется в стандартных шаблонах ограничения доступа + + Boolean + + + + Index + Use + + + + ИспользоватьПраваСсылки + + ru + Использовать права ссылки + + Когда Ссылка = СсылкаВИерархии Тогда Истина Иначе СсылкаВИерархии.НаследоватьПраваРодителей, используется в стандартных шаблонах ограничения доступа + + Boolean + + + + Index + Use + + + + ВидДоступа + + ru + Вид доступа + + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + + ShowError + true + Use + true + + ChartOfCharacteristicTypes.ВидыДоступа.EmptyRef + + true + true + + + ЗначениеДоступа + + ru + Значение доступа + + + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + CatalogRef.ГруппыПользователей + CatalogRef.Пользователи + + + + ShowError + true + Use + true + + true + true + + + ТолькоВидДоступа + + ru + Только вид доступа + + + Boolean + + + + Use + + true + + + ГруппаДоступа + + ru + Группа доступа + + + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + CatalogRef.ГруппыПользователей + CatalogRef.Пользователи + + + + Use + true + + true + true + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Commands/ДокументыФизическогоЛица/CommandModule.bsl b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Commands/ДокументыФизическогоЛица/CommandModule.bsl new file mode 100644 index 000000000..f86c27096 --- /dev/null +++ b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Commands/ДокументыФизическогоЛица/CommandModule.bsl @@ -0,0 +1,8 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ПараметрыФормы = Новый Структура("Отбор", Новый Структура("Физлицо", ПараметрКоманды)); + ОткрытьФорму("РегистрСведений.ДокументыФизическихЛиц.Форма.ДокументыФизическогоЛица", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ДокументыФизическогоЛица/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ДокументыФизическогоЛица/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..bb5d2f01c --- /dev/null +++ b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ДокументыФизическогоЛица/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,19 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + Period + Desc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ДокументыФизическогоЛица/Form.form b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ДокументыФизическогоЛица/Form.form new file mode 100644 index 000000000..445ed4cba --- /dev/null +++ b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ДокументыФизическогоЛица/Form.form @@ -0,0 +1,390 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Представление + 6 + true + true + + true + + + Список.Представление + + + ПредставлениеРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ПредставлениеКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Период + 10 + true + true + + true + + + Список.Period + + + ПериодРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + ПериодКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 16 + + СписокСтрокаПоискаРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 17 + true + + Список + + true + + + + СписокСостояниеПросмотра + 19 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 20 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 22 + + СписокУправлениеПоискомРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 23 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
    + + ГруппаУдостоверениеЛичности + 14 + + НетУдостоверения + 12 + + <key>ru</key> + <value>Нет удостоверения</value> + + true + + true + + + НетУдостоверенияРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + НетУдостоверенияКонтекстноеМеню + 13 + true + + 2 + true + 1 + true + + + CommonPicture.Предупреждение32 + + Proportionally + + + + УдостоверениеЛичности + 8 + true + + true + + + УдостоверениеЛичности + + None + + УдостоверениеЛичностиРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + УдостоверениеЛичностиКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Удостоверение личности</value> + + + ru + Удостоверение личности + + + ГруппаУдостоверениеЛичностиРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + InformationRegister.ДокументыФизическихЛиц + true + true + true + true + +
    + + УдостоверениеЛичности + + <key>ru</key> + <value>Удостоверение личности</value> + + 2 + + String + + + + true + + + true + + + + + + + +
    diff --git a/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ДокументыФизическогоЛица/Module.bsl b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ДокументыФизическогоЛица/Module.bsl new file mode 100644 index 000000000..528606fa8 --- /dev/null +++ b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ДокументыФизическогоЛица/Module.bsl @@ -0,0 +1,38 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Отбор.Свойство("Физлицо") Тогда + Физлицо = Параметры.Отбор.Физлицо; + + УдостоверениеЛичности = РегистрыСведений.ДокументыФизическихЛиц.ДокументУдостоверяющийЛичностьФизлица(Физлицо); + + ЕстьУдостоверение = Не ПустаяСтрока(УдостоверениеЛичности); + + Элементы.УдостоверениеЛичности.Высота = ?(ЕстьУдостоверение, 2, 0); + УдостоверениеЛичности = ?(ЕстьУдостоверение, "Удостоверение личности: ", "") + УдостоверениеЛичности; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Физлицо", Физлицо); + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ДокументыФизическихЛиц.Представление + |ИЗ + | РегистрСведений.ДокументыФизическихЛиц КАК ДокументыФизическихЛиц + |ГДЕ + | ДокументыФизическихЛиц.Физлицо = &Физлицо"; + ЕстьДокументы = Не Запрос.Выполнить().Пустой(); + + Если Не ЕстьУдостоверение И ЕстьДокументы Тогда + Элементы.НетУдостоверения.Видимость = Истина; + ТекстСообщения = НСтр("ru = 'Для физлица %1 не задан документ, удостоверяющий личность.'"); + УдостоверениеЛичности = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, Физлицо); + КонецЕсли; + + Элементы.УдостоверениеЛичности.Видимость = Не ПустаяСтрока(УдостоверениеЛичности); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..15fd8111f --- /dev/null +++ b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,517 @@ + + + + Физлицо + 18 + true + true + + true + + + Запись.Физлицо + + + ФизлицоРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + ФизлицоКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ВидДокумента + 5 + true + true + + true + + + Запись.ВидДокумента + + true + + OnChange + ВидДокументаПриИзменении + + + ВидДокументаРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ВидДокументаКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + Normal + + + + ГруппаСерияИНомер + 17 + + Серия + 7 + true + true + + true + + + Запись.Серия + + + СерияРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + СерияКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Номер + 9 + true + true + + true + + + Запись.Номер + + + НомерРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 10 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Серия и номер</value> + + + ru + Серия и номер + + false + + ГруппаСерияИНомерРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаДатаВыдачиИСрокДействия + 20 + + ДатаВыдачи + 21 + true + true + + true + + + Запись.ДатаВыдачи + + + ДатаВыдачиРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + ДатаВыдачиКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СрокДействия + 23 + true + true + + true + + + Запись.СрокДействия + + + СрокДействияРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + СрокДействияКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Дата выдачи и срок действия</value> + + + ru + Дата выдачи и срок действия + + + ГруппаДатаВыдачиИСрокДействияРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + КемВыдан + 11 + true + true + + true + + + Запись.КемВыдан + + + КемВыданРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + КемВыданКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + + 35 + true + true + true + true + true + Normal + + + + КодПодразделения + 13 + true + true + + true + + + Запись.КодПодразделения + + + КодПодразделенияРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + КодПодразделенияКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + Normal + + + + ЯвляетсяДокументомУдостоверяющимЛичность + 25 + true + true + + true + + + Запись.ЯвляетсяДокументомУдостоверяющимЛичность + + Right + + ЯвляетсяДокументомУдостоверяющимЛичностьРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + ЯвляетсяДокументомУдостоверяющимЛичностьКонтекстноеМеню + 26 + true + + CheckBoxField + Enter + true + Left + true + + + + Период + 1 + true + true + + true + + + Запись.Period + + + ПериодРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ПериодКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + Top + true + + ФормаКоманднаяПанель + -1 + Left + true + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Запись + 1 + + InformationRegisterRecordManager.ДокументыФизическихЛиц + + + true + + + true + +
    true
    + true +
    + + + + + +
    diff --git a/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаЗаписи/Module.bsl new file mode 100644 index 000000000..ff7143999 --- /dev/null +++ b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаЗаписи/Module.bsl @@ -0,0 +1,21 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ + +&НаСервереБезКонтекста +Функция ЯвляетсяУдостоверениемЛичности(Физлицо, ВидДокумента, Дата) + + Возврат РегистрыСведений.ДокументыФизическихЛиц.ЯвляетсяУдостоверениемЛичности(Физлицо, ВидДокумента, Дата); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ВидДокументаПриИзменении(Элемент) + + Если ЯвляетсяУдостоверениемЛичности(Запись.Физлицо, Запись.ВидДокумента, Запись.Период) Тогда + Запись.ЯвляетсяДокументомУдостоверяющимЛичность = Истина; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..bb5d2f01c --- /dev/null +++ b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,19 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + Period + Desc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..89cad839f --- /dev/null +++ b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаСписка/Form.form @@ -0,0 +1,296 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Физлицо + 4 + true + true + + true + + + Список.Физлицо + + + ФизлицоРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ФизлицоКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Представление + 6 + true + true + + true + + + Список.Представление + + + ПредставлениеРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ПредставлениеКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Период + 8 + true + true + + true + + + Список.Period + + + ПериодРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ПериодКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 11 + + СписокСтрокаПоискаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 12 + true + + Список + + true + + + + СписокСостояниеПросмотра + 14 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 15 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 17 + + СписокУправлениеПоискомРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 18 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + InformationRegister.ДокументыФизическихЛиц + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаСписка/Module.bsl b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Forms/ФормаСписка/Module.bsl @@ -0,0 +1 @@ + diff --git a/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Help/ru.html b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Help/ru.html new file mode 100644 index 000000000..947a5923c --- /dev/null +++ b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/Help/ru.html @@ -0,0 +1,6 @@ + +

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

    +

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

    +

    См. также:

    + \ No newline at end of file diff --git a/SSL/src/InformationRegisters/ДокументыФизическихЛиц/ManagerModule.bsl b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/ManagerModule.bsl new file mode 100644 index 000000000..0fd934b37 --- /dev/null +++ b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/ManagerModule.bsl @@ -0,0 +1,95 @@ +// Функция возвращает действующий на указанную дату документ, удостоверяющий личность +// +// Параметры +// Физлицо - физическое лицо, для которого необходимо получить документ +// Дата - дата, на которую необходимо получить документ +// +// Возвращаемое значение +// Представление - строка - представление документа, удостоверяющего личность +// +Функция ДокументУдостоверяющийЛичностьФизлица(Физлицо, Дата = Неопределено) Экспорт + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Физлицо", Физлицо); + Запрос.УстановитьПараметр("ДатаСреза", Дата); + + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ДокументыФизическихЛиц.Представление + |ИЗ + | РегистрСведений.ДокументыФизическихЛиц КАК ДокументыФизическихЛиц + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ + | МАКСИМУМ(ДокументыФизическихЛиц.Период) КАК Период, + | ДокументыФизическихЛиц.Физлицо КАК Физлицо + | ИЗ + | РегистрСведений.ДокументыФизическихЛиц КАК ДокументыФизическихЛиц + | ГДЕ + | ДокументыФизическихЛиц.ЯвляетсяДокументомУдостоверяющимЛичность + | И ДокументыФизическихЛиц.Физлицо = &Физлицо + | " + ?(Дата <> Неопределено, "И ДокументыФизическихЛиц.Период <= &ДатаСреза", "") + " + | + | СГРУППИРОВАТЬ ПО + | ДокументыФизическихЛиц.Физлицо) КАК ДокументыСрез + | ПО ДокументыФизическихЛиц.Период = ДокументыСрез.Период + | И ДокументыФизическихЛиц.Физлицо = ДокументыСрез.Физлицо + | И (ДокументыФизическихЛиц.ЯвляетсяДокументомУдостоверяющимЛичность)"; + Выборка = Запрос.Выполнить().Выбрать(); + + УдостоверениеЛичности = Новый Структура("Представление, ЕстьУдостоверение"); + + Если Выборка.Следующий() Тогда + Возврат Выборка.Представление; + КонецЕсли; + + Возврат ""; + +КонецФункции + +// Функция проверяет, является-ли указанный вид документа документом, удостоверяющим личность для этого физлица +// +// Параметры +// Физлицо - физическое лицо, для которого необходимо получить документ +// ВидДокумента - вид документа, удостоверяющего личность +// Дата - дата, на которую необходимо получить документ +// +// Возвращаемое значение +// Является - булево - является ли указанный вид документа документом, удостоверяющим личность +// +Функция ЯвляетсяУдостоверениемЛичности(Физлицо, ВидДокумента, Дата) Экспорт + + Если Физлицо.Пустая() Или ВидДокумента.Пустая() Или Не ЗначениеЗаполнено(Дата) Тогда + Возврат Ложь; + КонецЕсли; + + Если ВидДокумента = Справочники.ВидыДокументовФизическихЛиц.ПаспортРФ Тогда + Возврат Истина; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Физлицо", Физлицо); + Запрос.УстановитьПараметр("ВидДокумента", ВидДокумента); + Запрос.УстановитьПараметр("ДатаСреза", Дата); + + Запрос.Текст = + "ВЫБРАТЬ + | ДокументыФизическихЛиц.ВидДокумента + |ИЗ + | РегистрСведений.ДокументыФизическихЛиц КАК ДокументыФизическихЛиц + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ + | МАКСИМУМ(ДокументыФизическихЛиц.Период) КАК Период, + | ДокументыФизическихЛиц.Физлицо КАК Физлицо + | ИЗ + | РегистрСведений.ДокументыФизическихЛиц КАК ДокументыФизическихЛиц + | ГДЕ + | ДокументыФизическихЛиц.Физлицо = &Физлицо + | И ДокументыФизическихЛиц.Период < &ДатаСреза + | И ДокументыФизическихЛиц.ЯвляетсяДокументомУдостоверяющимЛичность + | + | СГРУППИРОВАТЬ ПО + | ДокументыФизическихЛиц.Физлицо) КАК ДокументыСрез + | ПО ДокументыФизическихЛиц.Физлицо = ДокументыСрез.Физлицо + | И ДокументыФизическихЛиц.Период = ДокументыСрез.Период + | И (ДокументыФизическихЛиц.ВидДокумента = &ВидДокумента)"; + Возврат Не Запрос.Выполнить().Пустой(); + +КонецФункции diff --git a/SSL/src/InformationRegisters/ДокументыФизическихЛиц/RecordSetModule.bsl b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/RecordSetModule.bsl new file mode 100644 index 000000000..533d64dcb --- /dev/null +++ b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/RecordSetModule.bsl @@ -0,0 +1,88 @@ +/////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ + +Процедура ПередЗаписью(Отказ, Замещение) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + ТекстСерия = НСтр("ru = ', серия: %1'"); + ТекстНомер = НСтр("ru = ', № %1'"); + ТекстДатаВыдачи = НСтр("ru = ', выдан: %1 года'"); + ТекстСрокДействия = НСтр("ru = ', действует до: %1 года'"); + ТекстКодПодразделения = НСтр("ru = ', № подр. %1'"); + + Для Каждого Запись Из ЭтотОбъект Цикл + Если Запись.ВидДокумента.Пустая() Тогда + Запись.Представление = ""; + + Иначе + Запись.Представление = "" + + Запись.ВидДокумента + + ?(ЗначениеЗаполнено(Запись.Серия), СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСерия, Запись.Серия), "") + + ?(ЗначениеЗаполнено(Запись.Номер), СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстНомер, Запись.Номер), "") + + ?(ЗначениеЗаполнено(Запись.ДатаВыдачи), СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстДатаВыдачи, Формат(Запись.ДатаВыдачи,"ДФ='дд ММММ гггг'")), "") + + ?(ЗначениеЗаполнено(Запись.СрокДействия), СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСрокДействия, Формат(Запись.СрокДействия,"ДФ='дд ММММ гггг'")), "") + + ?(ЗначениеЗаполнено(Запись.КемВыдан), ", " + Запись.КемВыдан, "") + + ?(ЗначениеЗаполнено(Запись.КодПодразделения) И Запись.ВидДокумента = Справочники.ВидыДокументовФизическихЛиц.ПаспортРФ, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстКодПодразделения, Запись.КодПодразделения), ""); + + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура ПриЗаписи(Отказ, Замещение) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ТаблицаДокументов", Выгрузить(, "Физлицо, Период, ЯвляетсяДокументомУдостоверяющимЛичность")); + + Запрос.Текст = + "ВЫБРАТЬ + | ТаблицаДокументов.Физлицо КАК Физлицо, + | ТаблицаДокументов.Период КАК Период + |ПОМЕСТИТЬ ВТ_Документы + |ИЗ + | &ТаблицаДокументов КАК ТаблицаДокументов + |ГДЕ + | ТаблицаДокументов.ЯвляетсяДокументомУдостоверяющимЛичность + | + |ИНДЕКСИРОВАТЬ ПО + | Физлицо, + | Период + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ДокументыФизическихЛиц.Физлицо КАК Физлицо, + | ДокументыФизическихЛиц.Период КАК Период, + | КОЛИЧЕСТВО(ДокументыФизическихЛиц.Физлицо) КАК КоличествоДокументов + |ИЗ + | РегистрСведений.ДокументыФизическихЛиц КАК ДокументыФизическихЛиц + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Документы КАК ДокументыСрез + | ПО ДокументыФизическихЛиц.Период = ДокументыСрез.Период + | И ДокументыФизическихЛиц.Физлицо = ДокументыСрез.Физлицо + | И (ДокументыФизическихЛиц.ЯвляетсяДокументомУдостоверяющимЛичность) + | + |СГРУППИРОВАТЬ ПО + | ДокументыФизическихЛиц.Физлицо, + | ДокументыФизическихЛиц.Период + | + |ИМЕЮЩИЕ + | КОЛИЧЕСТВО(ДокументыФизическихЛиц.Физлицо) > 1"; + Выборка = Запрос.Выполнить().Выбрать(); + + ТекстСообщения = НСтр("ru = 'На %1 у физлица %2 уже введен документ, удостоверяющий личность.'"); + + Пока Выборка.Следующий() Цикл + Отказ = Истина; + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, Формат(Выборка.Период, "ДЛФ=D"), Выборка.Физлицо)); + КонецЦикла; + +КонецПроцедуры + diff --git a/SSL/src/InformationRegisters/ДокументыФизическихЛиц/ДокументыФизическихЛиц.mdo b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/ДокументыФизическихЛиц.mdo new file mode 100644 index 000000000..01c99ed3a --- /dev/null +++ b/SSL/src/InformationRegisters/ДокументыФизическихЛиц/ДокументыФизическихЛиц.mdo @@ -0,0 +1,330 @@ + + + + + + + + + + + + ДокументыФизическихЛиц + + ru + Документы физических лиц + + InformationRegister.ДокументыФизическихЛиц.Form.ФормаЗаписи + InformationRegister.ДокументыФизическихЛиц.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ru + Запись действует с + + + 0001-01-01T00:00:00 + + ShowError + Use + + + + Day + true + true + + + ru + + + Managed + + ru + Документ + + + ru + Документы + + + Серия + + ru + Серия + + + String + + 14 + + + + ru + Серия документа удостоверяющего личность + + + + Use + Use + + + + Номер + + ru + Номер + + + String + + 14 + + + + ru + Номер документа удостоверяющего личность + + + + Use + Use + + + + ДатаВыдачи + + ru + Дата выдачи + + + Date + + Date + + + + + Use + Use + + + + СрокДействия + + ru + Срок действия + + + Date + + Date + + + + + Use + Use + + + + КемВыдан + + ru + Кем выдан + + + String + + + + ru + Кем выдан документ удостоверяющий личность + + + + Use + Use + + + + КодПодразделения + + ru + Код подразделения + + + String + + 15 + + + + + Use + Use + + + + ЯвляетсяДокументомУдостоверяющимЛичность + + ru + Является документом удостоверяющим личность + + + Boolean + + + + Use + Use + + + + Представление + + ru + Документ + + + String + + + true + + + Use + Use + + + + УдалитьВидДокумента + + ru + Удалить вид документа + + + CatalogRef.ВидыДокументовФизическихЛиц + + + ru + Вид документа удостоверяющего личность + + + + Use + Use + + Catalog.ВидыДокументовФизическихЛиц.ПаспортРФ + + + + Физлицо + + ru + Физ. лицо + + + CatalogRef.ФизическиеЛица + + + ru + Физическое лицо + + + + ShowError + true + Use + Use + true + + Catalog.ФизическиеЛица.EmptyRef + + true + true + + + ВидДокумента + + ru + Вид документа + + + CatalogRef.ВидыДокументовФизическихЛиц + + + + ShowError + true + Use + Use + true + + true + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + + ДокументыФизическогоЛица + + ru + Документы физического лица + + PersonalComputer + MobileDevice + + + ДокументыФизическогоЛица + + ru + Документы + + FormNavigationPanelGoTo + + CatalogRef.ФизическиеЛица + + Auto + + diff --git a/SSL/src/InformationRegisters/ДополнительныеСведения/Help/ru.html b/SSL/src/InformationRegisters/ДополнительныеСведения/Help/ru.html new file mode 100644 index 000000000..f3a48a764 --- /dev/null +++ b/SSL/src/InformationRegisters/ДополнительныеСведения/Help/ru.html @@ -0,0 +1,3 @@ + +

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

    +

    См. также: Дополнительные свойства, Наборы свойств.

    \ No newline at end of file diff --git a/SSL/src/InformationRegisters/ДополнительныеСведения/ДополнительныеСведения.mdo b/SSL/src/InformationRegisters/ДополнительныеСведения/ДополнительныеСведения.mdo new file mode 100644 index 000000000..d0b5df398 --- /dev/null +++ b/SSL/src/InformationRegisters/ДополнительныеСведения/ДополнительныеСведения.mdo @@ -0,0 +1,130 @@ + + + + + + + + + + + + ДополнительныеСведения + + ru + Дополнительные сведения + + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + 0001-01-01T00:00:00 + + ShowError + Use + + + + true + + + ru + + + Managed + Use + + Значение + + ru + Значение + + + Characteristic.ДополнительныеРеквизитыИСведения + + + ru + Значение свойства + + + + DontUse + Use + Use + Use + + + + Объект + + ru + Объект + + + BusinessProcessRef + DocumentRef + TaskRef + CatalogRef + + + ru + Объект информационной базы, к которому относится дополнительное свойство + + + + true + Use + Use + true + + true + true + + + Свойство + + ru + Свойство + + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + + DontUse + Use + true + Use + Use + true + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.EmptyRef + + true + true + + diff --git a/SSL/src/InformationRegisters/ЗависимостиПравДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/ЗависимостиПравДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/InformationRegisters/ЗависимостиПравДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/ЗависимостиПравДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ЗависимостиПравДоступа/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..ec5ddf641 --- /dev/null +++ b/SSL/src/InformationRegisters/ЗависимостиПравДоступа/Forms/ФормаСписка/Form.form @@ -0,0 +1,476 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + ПодчиненнаяТаблица + 4 + true + true + + true + + + Список.ПодчиненнаяТаблица + + true + + ПодчиненнаяТаблицаРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ПодчиненнаяТаблицаКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ВедущаяТаблица + 24 + true + true + + true + + + Список.ВедущаяТаблица + + + ru + При проверке права на элемент данных подчиненной таблицы проверяется право и ограничение права на объект ведущей таблицы + + + ВедущаяТаблицаРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ВедущаяТаблицаКонтекстноеМеню + 25 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ОтключитьПроверкуПравВедущейТаблицы + 34 + + <key>ru</key> + <value>Только огр.</value> + + true + true + + true + + + Список.ОтключитьПроверкуПравВедущейТаблицы + + + ОтключитьПроверкуПравВедущейТаблицыРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ОтключитьПроверкуПравВедущейТаблицыКонтекстноеМеню + 35 + true + + CheckBoxField + Enter + true + Left + true + + + + ПриПроверкеПраваЧтение + 32 + + <key>ru</key> + <value>При чтении</value> + + true + true + + true + + + Список.ПриПроверкеПраваЧтение + + + ПриПроверкеПраваЧтениеРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ПриПроверкеПраваЧтениеКонтекстноеМеню + 33 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ПриПроверкеПраваДобавление + 26 + + <key>ru</key> + <value>При добавлении</value> + + true + true + + true + + + Список.ПриПроверкеПраваДобавление + + + ПриПроверкеПраваДобавлениеРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + ПриПроверкеПраваДобавлениеКонтекстноеМеню + 27 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ПриПроверкеПраваИзменение + 28 + + <key>ru</key> + <value>При изменении</value> + + true + true + + true + + + Список.ПриПроверкеПраваИзменение + + + ПриПроверкеПраваИзменениеРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + ПриПроверкеПраваИзменениеКонтекстноеМеню + 29 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ПриПроверкеПраваУдаление + 30 + + <key>ru</key> + <value>При удалении</value> + + true + true + + true + + + Список.ПриПроверкеПраваУдаление + + + ПриПроверкеПраваУдалениеРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + ПриПроверкеПраваУдалениеКонтекстноеМеню + 31 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 37 + + СписокСтрокаПоискаРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 38 + true + + Список + + true + + + + СписокСостояниеПросмотра + 40 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 41 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 43 + + СписокУправлениеПоискомРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 44 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
    true
    + 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 + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + ВЫБРАТЬ + РегистрСведенийЗависимостиПравДоступа.ПодчиненнаяТаблица, + РегистрСведенийЗависимостиПравДоступа.ТипВедущейТаблицы, + ПрофилиГруппДоступаТипыСсылок.Таблица КАК ВедущаяТаблица, + РегистрСведенийЗависимостиПравДоступа.ОтключитьПроверкуПравВедущейТаблицы, + РегистрСведенийЗависимостиПравДоступа.ПриПроверкеПраваЧтение, + РегистрСведенийЗависимостиПравДоступа.ПриПроверкеПраваДобавление, + РегистрСведенийЗависимостиПравДоступа.ПриПроверкеПраваИзменение, + РегистрСведенийЗависимостиПравДоступа.ПриПроверкеПраваУдаление +ИЗ + РегистрСведений.ЗависимостиПравДоступа КАК РегистрСведенийЗависимостиПравДоступа + ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ПрофилиГруппДоступаТипыСсылок + ПО РегистрСведенийЗависимостиПравДоступа.ТипВедущейТаблицы = ПрофилиГруппДоступаТипыСсылок.ТипТаблицы + InformationRegister.ЗависимостиПравДоступа + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/InformationRegisters/ЗависимостиПравДоступа/RecordSetModule.bsl b/SSL/src/InformationRegisters/ЗависимостиПравДоступа/RecordSetModule.bsl new file mode 100644 index 000000000..4985aec77 --- /dev/null +++ b/SSL/src/InformationRegisters/ЗависимостиПравДоступа/RecordSetModule.bsl @@ -0,0 +1,49 @@ + +Процедура ПередЗаписью(Отказ, Замещение) + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ЗависимостиПравДоступа.ПодчиненнаяТаблица, + | ЗависимостиПравДоступа.ТипВедущейТаблицы, + | ЗависимостиПравДоступа.ОтключитьПроверкуПравВедущейТаблицы, + | ЗависимостиПравДоступа.ПриПроверкеПраваЧтение, + | ЗависимостиПравДоступа.ПриПроверкеПраваДобавление, + | ЗависимостиПравДоступа.ПриПроверкеПраваИзменение, + | ЗависимостиПравДоступа.ПриПроверкеПраваУдаление + |ПОМЕСТИТЬ ЗависимостиПравДоступа + |ИЗ + | &ЗависимостиПравДоступа КАК ЗависимостиПравДоступа + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ЗависимостиПравДоступа.ПодчиненнаяТаблица, + | ЗависимостиПравДоступа.ТипВедущейТаблицы, + | ЗависимостиПравДоступа.ОтключитьПроверкуПравВедущейТаблицы, + | ВЫБОР + | КОГДА ЗависимостиПравДоступа.ПриПроверкеПраваЧтение В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) + | ТОГДА ЗависимостиПравДоступа.ПриПроверкеПраваЧтение + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения) + | КОНЕЦ КАК ПриПроверкеПраваЧтение, + | ВЫБОР + | КОГДА ЗависимостиПравДоступа.ПриПроверкеПраваДобавление В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) + | ТОГДА ЗависимостиПравДоступа.ПриПроверкеПраваДобавление + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) + | КОНЕЦ КАК ПриПроверкеПраваДобавление, + | ВЫБОР + | КОГДА ЗависимостиПравДоступа.ПриПроверкеПраваИзменение В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) + | ТОГДА ЗависимостиПравДоступа.ПриПроверкеПраваИзменение + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) + | КОНЕЦ КАК ПриПроверкеПраваИзменение, + | ВЫБОР + | КОГДА ЗависимостиПравДоступа.ПриПроверкеПраваУдаление В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) + | ТОГДА ЗависимостиПравДоступа.ПриПроверкеПраваУдаление + | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) + | КОНЕЦ КАК ПриПроверкеПраваУдаление + |ИЗ + | ЗависимостиПравДоступа КАК ЗависимостиПравДоступа"); + Запрос.УстановитьПараметр("ЗависимостиПравДоступа", Выгрузить()); + + Загрузить(Запрос.Выполнить().Выгрузить()); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ЗависимостиПравДоступа/ЗависимостиПравДоступа.mdo b/SSL/src/InformationRegisters/ЗависимостиПравДоступа/ЗависимостиПравДоступа.mdo new file mode 100644 index 000000000..774a01c97 --- /dev/null +++ b/SSL/src/InformationRegisters/ЗависимостиПравДоступа/ЗависимостиПравДоступа.mdo @@ -0,0 +1,206 @@ + + + + + + + + + + + + ЗависимостиПравДоступа + + ru + Зависимости прав доступа + + InDialog + InformationRegister.ЗависимостиПравДоступа.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ОтключитьПроверкуПравВедущейТаблицы + + ru + Отключить проверку прав ведущей таблицы + + Не проверять права ведущей таблицы, а проверять только ограничения прав + + Boolean + + + ru + Проверять только ограничения прав на объект ведущей таблицы + + + + Use + + + + ПриПроверкеПраваЧтение + + ru + При проверке права чтение + + При проверке права "Чтение" подчиненной таблицы, выполнить проверки объекта ведущей таблицы для права + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + ru + При проверке права "Чтение" подчиненной таблицы, выполнить проверку объекта ведущей таблицы для права, заданного одним из видов доступа "ПравоЧтения" или "ПравоДобавления" или "ПравоИзменения" + + + + ShowError + Use + + + + ПриПроверкеПраваДобавление + + ru + При проверке права добавление + + При проверке права "Добавление" подчиненной таблицы, выполнить проверки объекта ведущей таблицы для права + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + ru + При проверке права "Добавление" подчиненной таблицы, выполнить проверку объекта ведущей таблицы для права, заданного одним из видов доступа "ПравоЧтения" или "ПравоДобавления" или "ПравоИзменения" + + + + ShowError + Use + + + + ПриПроверкеПраваИзменение + + ru + При проверке права изменение + + При проверке права "Изменение" подчиненной таблицы, выполнить проверки объекта ведущей таблицы для права + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + ru + При проверке права "Изменение" подчиненной таблицы, выполнить проверку объекта ведущей таблицы для права, заданного одним из видов доступа "ПравоЧтения" или "ПравоДобавления" или "ПравоИзменения" + + + + ShowError + Use + + + + ПриПроверкеПраваУдаление + + ru + При проверке права удаление + + При проверке права "Удаление" подчиненной таблицы, выполнить проверки объекта ведущей таблицы для права + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + ru + При проверке права "Удаление" подчиненной таблицы, выполнить проверку объекта ведущей таблицы для права, заданного одним из видов доступа "ПравоЧтения" или "ПравоДобавления" или "ПравоИзменения" + + + + ShowError + Use + + + + ПодчиненнаяТаблица + + ru + Подчиненная таблица + + Полное имя подчиненной таблицы + + String + + 150 + + + + ru + При проверке права на элемент данных подчиненной таблицы проверяется право и ограничение права на объект ведущей таблицы + + + + ShowError + true + Use + + true + + + ТипВедущейТаблицы + + ru + Тип ведущей таблицы + + Тип ведущей таблицы, заданный пустой ссылкой + + AnyRef + + + ru + При проверке права на элемент данных подчиненной таблицы проверяется право и ограничение права на объект ведущей таблицы + + + + Use + + true + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/ЗначенияГруппДоступа/ЗначенияГруппДоступа.mdo b/SSL/src/InformationRegisters/ЗначенияГруппДоступа/ЗначенияГруппДоступа.mdo new file mode 100644 index 000000000..4e4f5cf9e --- /dev/null +++ b/SSL/src/InformationRegisters/ЗначенияГруппДоступа/ЗначенияГруппДоступа.mdo @@ -0,0 +1,125 @@ + + + + + + + + + + + + ЗначенияГруппДоступа + + ru + Значения групп доступа + + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ГруппаДоступа + + ru + Группа доступа + + + CatalogRef.ГруппыДоступа + + + + ShowError + true + Use + true + + Catalog.ГруппыДоступа.EmptyRef + + true + true + + + ВидДоступа + + ru + Вид доступа + + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + + ShowError + true + Use + true + + ChartOfCharacteristicTypes.ВидыДоступа.EmptyRef + + true + true + + + ТолькоВидДоступа + + ru + Только вид доступа + + + Boolean + + + + Use + + true + + + ЗначениеДоступа + + ru + Значение доступа + + + Characteristic.ВидыДоступа + + + + Use + true + + true + true + + diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Commands/НастройкаРолевойАдресации/CommandModule.bsl b/SSL/src/InformationRegisters/ИсполнителиЗадач/Commands/НастройкаРолевойАдресации/CommandModule.bsl new file mode 100644 index 000000000..7e2be14dd --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Commands/НастройкаРолевойАдресации/CommandModule.bsl @@ -0,0 +1,10 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОткрытьФорму("РегистрСведений.ИсполнителиЗадач.Форма.АдресацияПоОбъекту",, + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъекту/Form.form b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъекту/Form.form new file mode 100644 index 000000000..9827b0f49 --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъекту/Form.form @@ -0,0 +1,608 @@ + + + + ОсновнойОбъектАдресации + 14 + + true + true + + true + + + ОсновнойОбъектАдресации + + + OnChange + ПолеОсновнойОбъектАдресацииПриИзменении + + + ОсновнойОбъектАдресацииРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + ОсновнойОбъектАдресацииКонтекстноеМеню + 15 + true + + LabelField + Enter + true + Left + true + + true + true + + + + + Список + 45 + true + true + + true + + + Список + + false + None + + Роль + 48 + true + true + + true + + + Список.Роль + + + РольРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + РольКонтекстноеМеню + 49 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Исполнители + 50 + + <key>ru</key> + <value>Исполнители</value> + + true + true + + true + + + Список.ИсполнителиСтрока + + + ИсполнителиРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + ИсполнителиКонтекстноеМеню + 51 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 47 + Left + + + Selection + СписокВыбор + + + СписокСтрокаПоиска + 60 + + СписокСтрокаПоискаРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 61 + true + + Список + + true + + + + СписокСостояниеПросмотра + 63 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 64 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 66 + + СписокУправлениеПоискомРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 67 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 46 + true + + true + true + 50 + true + true + 10 + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + + Список.Картинка + + + CommonPicture.КоллекцияВидыСобытийЖурналаРегистрации + + None + None + None + true + +
    + + ФормаКоманднаяПанель + -1 + + НазначитьИсполнителей + 53 + true + true + + true + + false + + НазначитьИсполнителейРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + Form.Command.НазначитьИсполнителей + Normal + Auto + true + true + UserCmds + Auto + + + ВсеНазначения + 39 + true + true + + true + + false + + ВсеНазначенияРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + Form.Command.ВсеНазначения + Normal + PictureAndText + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Обновить + 52 + true + true + + true + + false + + ОбновитьРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + Form.Command.Обновить + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ОсновнойОбъектАдресации + + <key>ru</key> + <value>Основной объект адресации</value> + + 2 + + Characteristic.ОбъектыАдресацииЗадач + + + true + + + true + + + + ТипыОбъектовАдресации + + <key>ru</key> + <value>Типы объектов адресации</value> + + 3 + + ValueList + + + true + + + true + + + + ChartOfCharacteristicTypesRef.ОбъектыАдресацииЗадач + + + + + Список + + <key>ru</key> + <value>Список</value> + + 4 + + 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 + + CatalogRef.РолиИсполнителей + + + true + + + true + + + + Картинка + + <key>ru</key> + <value>Картинка</value> + + 4 + + Number + + 10 + + + + true + + + true + + + + Исполнители + + <key>ru</key> + <value>Исполнители</value> + + 5 + + Number + + 10 + + + + true + + + true + + + + + ВсеНазначения + + <key>ru</key> + <value>Список всех назначений</value> + + 2 + + ru + Открыть все назначения исполнителей + + + true + + + + ВсеНазначенияВыполнить + + + TextPicture + Auto + Auto + + + Обновить + + <key>ru</key> + <value>Обновить</value> + + 1 + + ru + Обновить + + + true + + + StdPicture.Refresh + + + + ОбновитьВыполнить + + + Auto + Auto + + + НазначитьИсполнителей + + <key>ru</key> + <value>Назначить исполнителей</value> + + 3 + + ru + Назначить исполнителей + + + true + + + + НазначитьИсполнителей + + + Auto + Auto + + + ОсновнойОбъектАдресации + + CatalogRef + + true + + + + + +
    diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъекту/Help/ru.html b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъекту/Help/ru.html new file mode 100644 index 000000000..fdaaadd87 --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъекту/Help/ru.html @@ -0,0 +1,6 @@ + +

    В этом списке содержится актуальная (текущая) информация о соответствии пользователей ролям исполнителей.

    +

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

    +

    См. также:

    + \ No newline at end of file diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъекту/Module.bsl b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъекту/Module.bsl new file mode 100644 index 000000000..461ee64cd --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъекту/Module.bsl @@ -0,0 +1,108 @@ +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ОбновитьДанныеЭлементов() + + Если ОсновнойОбъектАдресации <> Неопределено И ОсновнойОбъектАдресации <> "" Тогда + Элементы.ОсновнойОбъектАдресации.Заголовок = ОсновнойОбъектАдресации.Метаданные().ПредставлениеОбъекта; + КонецЕсли; + ВыборкаЗапроса = БизнесПроцессыИЗадачиСервер.ВыбратьРолиСКоличествомИсполнителей(ОсновнойОбъектАдресации); + СписокОбъект = РеквизитФормыВЗначение("Список"); + СписокОбъект.Очистить(); + Пока ВыборкаЗапроса.Следующий() Цикл + ТипЗначения = ВыборкаЗапроса.ТипыОсновногоОбъектаАдресации.ТипЗначения; + ВключаетТип = Истина; + Если ОсновнойОбъектАдресации <> Неопределено Тогда + ВключаетТип = ТипЗначения <> Неопределено И ТипЗначения.СодержитТип(ТипЗнч(ОсновнойОбъектАдресации)); + КонецЕсли; + Если ВключаетТип Тогда + НоваяСтрока = СписокОбъект.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаЗапроса, "Исполнители,Роль,РольСсылка"); + КонецЕсли; + КонецЦикла; + СписокОбъект.Сортировать("Роль"); + Для каждого СтрокаСписка Из СписокОбъект Цикл + Если СтрокаСписка.Исполнители = 0 Тогда + СтрокаСписка.ИсполнителиСтрока = НСтр("ru = 'не заданы'"); + СтрокаСписка.Картинка = 1; + ИначеЕсли СтрокаСписка.Исполнители = 1 Тогда + СтрокаСписка.ИсполнителиСтрока = Строка(БизнесПроцессыИЗадачиСервер.ВыбратьИсполнителя(ОсновнойОбъектАдресации, СтрокаСписка.РольСсылка)); + СтрокаСписка.Картинка = -1; + Иначе + СтрокаСписка.ИсполнителиСтрока = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 чел'"), Строка(СтрокаСписка.Исполнители) ); + + СтрокаСписка.Картинка = -1; + КонецЕсли; + КонецЦикла; + ЗначениеВРеквизитФормы(СписокОбъект, "Список"); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.ОсновнойОбъектАдресации <> Неопределено Тогда + ОсновнойОбъектАдресации = Параметры.ОсновнойОбъектАдресации; + Иначе + Элементы.ОсновнойОбъектАдресации.Видимость = Ложь; + КонецЕсли; + + ОбновитьДанныеЭлементов(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "РолеваяАдресацияИзменена" Тогда + ОбновитьДанныеЭлементов(); + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + НазначитьИсполнителей(Неопределено); +КонецПроцедуры + +&НаКлиенте +Процедура ПолеОсновнойОбъектАдресацииПриИзменении(Элемент) + ОбновитьДанныеЭлементов(); +КонецПроцедуры + +&НаКлиенте +Процедура ВсеНазначенияВыполнить() + + ОткрытьФорму("РегистрСведений.ИсполнителиЗадач.ФормаСписка", + Новый Структура("Отбор", Новый Структура("ОсновнойОбъектАдресации", ОсновнойОбъектАдресации)), + ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьВыполнить() + ОбновитьДанныеЭлементов(); +КонецПроцедуры + +&НаКлиенте +Процедура НазначитьИсполнителей(Команда) + + Назначение = Элементы.Список.ТекущиеДанные; + Если Назначение = Неопределено Тогда + Предупреждение(НСтр("ru = 'Необходимо выбрать роль в списке.'")); + Возврат; + КонецЕсли; + + ОткрытьФормуМодально("РегистрСведений.ИсполнителиЗадач.Форма.АдресацияПоОбъектуИРоли", + Новый Структура("ОсновнойОбъектАдресации,Роль", + ОсновнойОбъектАдресации, + Назначение.РольСсылка)); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъектуИРоли/Form.form b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъектуИРоли/Form.form new file mode 100644 index 000000000..4dbd61049 --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъектуИРоли/Form.form @@ -0,0 +1,476 @@ + + + + <key>ru</key> + <value>Исполнители роли</value> + + + ГруппаШапка + 21 + + ОсновнойОбъектАдресации + 18 + + true + true + + true + + + ОсновнойОбъектАдресации + + + ОсновнойОбъектАдресацииРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ОсновнойОбъектАдресацииКонтекстноеМеню + 19 + true + + LabelField + true + Enter + true + Left + true + + true + true + + + + + Роль + 16 + + true + true + + true + + + Роль + + + РольРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + РольКонтекстноеМеню + 17 + true + + LabelField + true + Enter + true + Left + true + + true + true + + + + true + true + + true + + + ГруппаШапкаРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Список + 22 + true + true + + true + + + НаборЗаписей + + false + None + + Исполнитель + 27 + true + true + + true + + + НаборЗаписей.Исполнитель + + + ИсполнительРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + ИсполнительКонтекстноеМеню + 28 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ДополнительныйОбъектАдресации + 31 + true + true + + true + + + НаборЗаписей.ДополнительныйОбъектАдресации + + + ДополнительныйОбъектАдресацииРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + ДополнительныйОбъектАдресацииКонтекстноеМеню + 32 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 24 + Left + true + + + BeforeEditEnd + СписокПередОкончаниемРедактирования + + + OnStartEdit + СписокПриНачалеРедактирования + + + СписокСтрокаПоиска + 40 + + СписокСтрокаПоискаРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 41 + true + + Список + + true + + + + СписокСостояниеПросмотра + 43 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 44 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 46 + + СписокУправлениеПоискомРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 47 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 23 + true + + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + None + None + None + true + +
    + + ФормаКоманднаяПанель + -1 + + ГруппаКомандСписка + 20 + true + true + + true + + + <key>ru</key> + <value>Группа команд списка</value> + + + ru + Группа команд списка + + + ГруппаКомандСпискаРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + Item.Список + + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Роль + + <key>ru</key> + <value>Роль</value> + + 2 + + CatalogRef.РолиИсполнителей + + + true + + + true + + + + ОсновнойОбъектАдресации + + <key>ru</key> + <value>Основной объект адресации</value> + + 3 + + Characteristic.ОбъектыАдресацииЗадач + + + true + + + true + + + + НаборЗаписей + + <key>ru</key> + <value>Набор записей</value> + + 4 + + InformationRegisterRecordSet.ИсполнителиЗадач + + + true + + + true + +
    true
    + true +
    + + ТипыДополнительногоОбъектаАдресации + + <key>ru</key> + <value>Типы доп объекта адресации</value> + + 1 + + TypeDescription + + + true + + + true + + + + Роль + + CatalogRef.РолиИсполнителей + + true + + + ОсновнойОбъектАдресации + + CatalogRef + + true + + + + + + + + AfterWrite + ПослеЗаписи + + +
    diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъектуИРоли/Help/ru.html b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъектуИРоли/Help/ru.html new file mode 100644 index 000000000..ac065b66c --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъектуИРоли/Help/ru.html @@ -0,0 +1,6 @@ + +

    В этом списке содержится актуальная (текущая) информация о назначении пользователей на роль исполнителей по указанному объекту адресации задач.

    +

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

    +

    См. также:

    + \ No newline at end of file diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъектуИРоли/Module.bsl b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъектуИРоли/Module.bsl new file mode 100644 index 000000000..a6980edfb --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/АдресацияПоОбъектуИРоли/Module.bsl @@ -0,0 +1,50 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Роль = Параметры.Роль; + ОсновнойОбъектАдресации = Параметры.ОсновнойОбъектАдресации; + Если ОсновнойОбъектАдресации = Неопределено ИЛИ ОсновнойОбъектАдресации = "" Тогда + Элементы.ДополнительныйОбъектАдресации.Видимость = Ложь; + Элементы.ОсновнойОбъектАдресации.Видимость = Ложь; + Иначе + Элементы.ОсновнойОбъектАдресации.Заголовок = ОсновнойОбъектАдресации.Метаданные().ПредставлениеОбъекта; + ДополнительныйОбъектАдресации = Параметры.Роль.ТипыДополнительногоОбъектаАдресации; + Элементы.ДополнительныйОбъектАдресации.Видимость = НЕ ДополнительныйОбъектАдресации.Пустая(); + Элементы.ДополнительныйОбъектАдресации.Заголовок = ДополнительныйОбъектАдресации.Наименование; + ТипыДополнительногоОбъектаАдресации = ДополнительныйОбъектАдресации.ТипЗначения; + КонецЕсли; + НаборЗаписейОбъект = РеквизитФормыВЗначение("НаборЗаписей"); + НаборЗаписейОбъект.Отбор.ОсновнойОбъектАдресации.Установить(ОсновнойОбъектАдресации); + НаборЗаписейОбъект.Отбор.РольИсполнителя.Установить(Роль); + НаборЗаписейОбъект.Прочитать(); + ЗначениеВРеквизитФормы(НаборЗаписейОбъект, "НаборЗаписей"); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура СписокПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ) + Если Роль <> Неопределено Тогда + Элемент.ТекущиеДанные.РольИсполнителя = Роль; + КонецЕсли; + Если ОсновнойОбъектАдресации <> Неопределено Тогда + Элемент.ТекущиеДанные.ОсновнойОбъектАдресации = ОсновнойОбъектАдресации; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура СписокПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) + Если Элементы.ДополнительныйОбъектАдресации.Видимость Тогда + Элементы.ДополнительныйОбъектАдресации.ОграничениеТипа = ТипыДополнительногоОбъектаАдресации; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи() + Оповестить("РолеваяАдресацияИзменена", НаборЗаписей); +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..4add77be6 --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,217 @@ + + + + Исполнитель + 10 + true + true + + true + + + Запись.Исполнитель + + + ИсполнительРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ИсполнительКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + РольИсполнителя + 1 + + <key>ru</key> + <value>Выполняет роль</value> + + true + true + + true + + + Запись.РольИсполнителя + + + OnChange + РольИсполнителяПриИзменении + + + РольИсполнителяРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + РольИсполнителяКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ОсновнойОбъектАдресации + 12 + true + true + + true + + + Запись.ОсновнойОбъектАдресации + + + ОсновнойОбъектАдресацииРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ОсновнойОбъектАдресацииКонтекстноеМеню + 13 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ДополнительныйОбъектАдресации + 14 + true + true + + true + + + Запись.ДополнительныйОбъектАдресации + + + ДополнительныйОбъектАдресацииРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ДополнительныйОбъектАдресацииКонтекстноеМеню + 15 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Запись + 1 + + InformationRegisterRecordManager.ИсполнителиЗадач + + + true + + + true + +
    true
    + true +
    + + + + + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + +
    diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаЗаписи/Module.bsl new file mode 100644 index 000000000..5118a91bc --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаЗаписи/Module.bsl @@ -0,0 +1,68 @@ +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура УстановитьСостояниеЭлементов() + + ТипыОсновногоОбъектаАдресации = Запись.РольИсполнителя.ТипыОсновногоОбъектаАдресации.ТипЗначения; + ТипыДополнительногоОбъектаАдресации = Запись.РольИсполнителя.ТипыДополнительногоОбъектаАдресации.ТипЗначения; + ИспользуетсяСОбъектамиАдресации = Запись.РольИсполнителя.ИспользуетсяСОбъектамиАдресации; + ИспользуетсяБезОбъектовАдресации = Запись.РольИсполнителя.ИспользуетсяБезОбъектовАдресации; + + ЗаданаРоль = НЕ Запись.РольИсполнителя.Пустая(); + ЗаголовокОсновногоОбъектаАдресации = ?(ЗаданаРоль, Строка(Запись.РольИсполнителя.ТипыОсновногоОбъектаАдресации), ""); + ЗаголовокДополнительногоОбъектаАдресации = ?(ЗаданаРоль, Строка(Запись.РольИсполнителя.ТипыДополнительногоОбъектаАдресации), ""); + + ЗаданыТипыОсновногоОбъектаАдресации = ЗаданаРоль И ИспользуетсяСОбъектамиАдресации + И ЗначениеЗаполнено(ТипыОсновногоОбъектаАдресации); + ЗаданыТипыДополнительногоОбъектаАдресации = ЗаданаРоль И ИспользуетсяСОбъектамиАдресации + И ЗначениеЗаполнено(ТипыДополнительногоОбъектаАдресации); + Элементы.ОсновнойОбъектАдресации.Доступность = ЗаданыТипыОсновногоОбъектаАдресации; + Элементы.ДополнительныйОбъектАдресации.Доступность = ЗаданыТипыДополнительногоОбъектаАдресации; + + Элементы.ОсновнойОбъектАдресации.АвтоОтметкаНезаполненного = ЗаданыТипыОсновногоОбъектаАдресации + И НЕ ИспользуетсяБезОбъектовАдресации; + Если ТипыОсновногоОбъектаАдресации <> Неопределено Тогда + Элементы.ОсновнойОбъектАдресации.ОграничениеТипа = ТипыОсновногоОбъектаАдресации; + КонецЕсли; + Элементы.ОсновнойОбъектАдресации.Заголовок = ЗаголовокОсновногоОбъектаАдресации; + + Элементы.ДополнительныйОбъектАдресации.АвтоОтметкаНезаполненного = ЗаданыТипыДополнительногоОбъектаАдресации + И НЕ ИспользуетсяБезОбъектовАдресации; + Если ТипыДополнительногоОбъектаАдресации <> Неопределено Тогда + Элементы.ДополнительныйОбъектАдресации.ОграничениеТипа = ТипыДополнительногоОбъектаАдресации; + КонецЕсли; + Элементы.ДополнительныйОбъектАдресации.Заголовок = ЗаголовокДополнительногоОбъектаАдресации; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + УстановитьСостояниеЭлементов(); +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект) + Если НЕ ЗначениеЗаполнено(ТекущийОбъект.ОсновнойОбъектАдресации) Тогда + ТекущийОбъект.ОсновнойОбъектАдресации = Неопределено; + КонецЕсли; + Если НЕ ЗначениеЗаполнено(ТекущийОбъект.ДополнительныйОбъектАдресации) Тогда + ТекущийОбъект.ДополнительныйОбъектАдресации = Неопределено; + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура РольИсполнителяПриИзменении(Элемент) + + Запись.ОсновнойОбъектАдресации = Неопределено; + Запись.ДополнительныйОбъектАдресации = Неопределено; + УстановитьСостояниеЭлементов(); + +КонецПроцедуры + diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..a11df8b91 --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Form.form @@ -0,0 +1,372 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Исполнитель + 6 + true + true + + true + + + Список.Исполнитель + + true + + ИсполнительРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ИсполнительКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + РольИсполнителя + 4 + + <key>ru</key> + <value>Роль исполнителя</value> + + true + true + + true + + + Список.РольИсполнителя + + true + + РольИсполнителяРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + РольИсполнителяКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ОсновнойОбъектАдресации + 8 + + <key>ru</key> + <value>Основной объект адресации</value> + + true + true + + true + + + Список.ОсновнойОбъектАдресации + + true + + ОсновнойОбъектАдресацииРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ОсновнойОбъектАдресацииКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ДополнительныйОбъектАдресации + 10 + + <key>ru</key> + <value>Дополнительный объект адресации</value> + + true + true + + true + + + Список.ДополнительныйОбъектАдресации + + true + + ДополнительныйОбъектАдресацииРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ДополнительныйОбъектАдресацииКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 13 + + СписокСтрокаПоискаРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 14 + true + + Список + + true + + + + СписокСостояниеПросмотра + 16 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 17 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 19 + + СписокУправлениеПоискомРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 20 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + 60 + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.ГруппаИсполнителейЗадач + +
    true
    + + InformationRegister.ИсполнителиЗадач + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Module.bsl b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..58ef5ff04 --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,7 @@ + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "РолеваяАдресацияИзменена" Тогда + Элементы.Список.Обновить(); + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/Help/ru.html b/SSL/src/InformationRegisters/ИсполнителиЗадач/Help/ru.html new file mode 100644 index 000000000..e0f2cc2fd --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/Help/ru.html @@ -0,0 +1,34 @@ + +

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

    +

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

    +

    + + + + + + + + +
    Роль исполнителяПользовательПояснение
    Старший по залуИванов И.Задачи, назначенные на роль "Старший по залу", попадут в список задач Иванова И.
    Старший по залуФедоров К.Задачи, назначенные на роль "Старший по залу", попадут в список задач Федорова К.
    РуководительПетров А.Поручения выданные руководителю попадут в список поручений Петрова А.

     

    +

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

    +

    + + + + + + + + + + + + + + + + +
    Роль исполнителяОсновной объект адресации
    (тип, значение)
    Дополнительный объект адресации
    (тип, значение)
    ПользовательПояснение
    Руководитель подразделенияСтруктурное подразделение,
    Отдел бухгалтерии
    -Федоров К.Задачи, выданные роли "Руководитель подразделения" подразделения "Отдел бухгалтерии", попадут в список задач Федорова К.
    Руководитель проектаПроект,
    Проект по внедрению системы бухучета
    Структурное подразделение,
    Отдел бухгалтерии
    Иванов И.Задачи, выданные роли "Руководитель проекта" по проекту "Проект по внедрению системы бухучета" подразделения "Отдел бухгалтерии", попадут в список задач Иванова И.
    Руководитель компании--Петров А.Задачи, выданные руководителю компании, попадут в список задач Петрова А.

     

    +

    См. также:

    + \ No newline at end of file diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/ManagerModule.bsl b/SSL/src/InformationRegisters/ИсполнителиЗадач/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/RecordSetModule.bsl b/SSL/src/InformationRegisters/ИсполнителиЗадач/RecordSetModule.bsl new file mode 100644 index 000000000..026e437ce --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/RecordSetModule.bsl @@ -0,0 +1,61 @@ +// УправлениеДоступом + +Процедура ПередЗаписью(Отказ, Замещение) + + Если Количество() <= 0 Тогда + Возврат; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | НовыеЗаписи.РольИсполнителя КАК РольИсполнителя, + | НовыеЗаписи.ОсновнойОбъектАдресации КАК ОсновнойОбъектАдресации, + | НовыеЗаписи.ДополнительныйОбъектАдресации КАК ДополнительныйОбъектАдресации + |ПОМЕСТИТЬ НовыеЗаписи + |ИЗ + | &НовыеЗаписи КАК НовыеЗаписи + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ЕСТЬNULL(ГруппыИсполнителейЗадач.Ссылка, ЗНАЧЕНИЕ(Справочник.ГруппыИсполнителейЗадач.ПустаяСсылка)) КАК Ссылка, + | НовыеЗаписи.РольИсполнителя КАК РольИсполнителя, + | НовыеЗаписи.ОсновнойОбъектАдресации КАК ОсновнойОбъектАдресации, + | НовыеЗаписи.ДополнительныйОбъектАдресации КАК ДополнительныйОбъектАдресации + |ИЗ + | НовыеЗаписи КАК НовыеЗаписи + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыИсполнителейЗадач КАК ГруппыИсполнителейЗадач + | ПО НовыеЗаписи.РольИсполнителя = ГруппыИсполнителейЗадач.РольИсполнителя + | И НовыеЗаписи.ОсновнойОбъектАдресации = ГруппыИсполнителейЗадач.ОсновнойОбъектАдресации + | И НовыеЗаписи.ДополнительныйОбъектАдресации = ГруппыИсполнителейЗадач.ДополнительныйОбъектАдресации"); + Запрос.УстановитьПараметр("НовыеЗаписи", Выгрузить(, "РольИсполнителя, ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации")); + ГруппыИсполнителей = Запрос.Выполнить().Выгрузить(); + ОтборГруппыИсполнителей = Новый Структура("РольИсполнителя, ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации"); + + Для каждого Запись Из ЭтотОбъект Цикл + ЗаполнитьЗначенияСвойств(ОтборГруппыИсполнителей, Запись); + ГруппаИсполнителей = ГруппыИсполнителей.НайтиСтроки(ОтборГруппыИсполнителей)[0]; + // нужно обновить ссылку в найденной строке. + Если НЕ ЗначениеЗаполнено(ГруппаИсполнителей.Ссылка) Тогда + // Требуется добавить новую группу исполнителей. + ГруппаИсполнителейОбъект = Справочники.ГруппыИсполнителейЗадач.СоздатьЭлемент(); + ЗаполнитьЗначенияСвойств(ГруппаИсполнителейОбъект, ОтборГруппыИсполнителей); + ГруппаИсполнителейОбъект.Записать(); + ГруппаИсполнителей.Ссылка = ГруппаИсполнителейОбъект.Ссылка; + КонецЕсли; + Запись.ГруппаИсполнителейЗадач = ГруппаИсполнителей.Ссылка; + КонецЦикла; + + УстановитьПривилегированныйРежим(Ложь); + +КонецПроцедуры + +Процедура ПриЗаписи(Отказ, Замещение) + + УправлениеДоступом.ЗаписатьГруппыИВидыДоступа(Справочники.ГруппыПользователей.ВсеПользователи); + +КонецПроцедуры + +// Конец УправлениеДоступом diff --git a/SSL/src/InformationRegisters/ИсполнителиЗадач/ИсполнителиЗадач.mdo b/SSL/src/InformationRegisters/ИсполнителиЗадач/ИсполнителиЗадач.mdo new file mode 100644 index 000000000..114bb09c9 --- /dev/null +++ b/SSL/src/InformationRegisters/ИсполнителиЗадач/ИсполнителиЗадач.mdo @@ -0,0 +1,223 @@ + + + + + + + + + + + + ИсполнителиЗадач + + ru + Исполнители задач + + true + InformationRegister.ИсполнителиЗадач.Form.ФормаЗаписи + InformationRegister.ИсполнителиЗадач.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + true + + + ru + + + Managed + + ru + Исполнитель + + + ru + Исполнитель задачи + + + ГруппаИсполнителейЗадач + + ru + Группа исполнителей задач + + + CatalogRef.ГруппыИсполнителейЗадач + + + + Index + Use + Use + + + + РольИсполнителя + + ru + Роль + + + CatalogRef.РолиИсполнителей + + + + ShowError + true + Use + Use + true + + Catalog.РолиИсполнителей.EmptyRef + + true + true + + + Исполнитель + + ru + Исполнитель + + + CatalogRef.Пользователи + + + + ShowError + true + Use + Use + true + + Catalog.Пользователи.EmptyRef + + true + true + + + ОсновнойОбъектАдресации + + ru + Основной объект адресации + + + Characteristic.ОбъектыАдресацииЗадач + + + + Use + Use + true + + true + true + + + ДополнительныйОбъектАдресации + + ru + Дополнительный объект адресации + + + Characteristic.ОбъектыАдресацииЗадач + + + + Use + Use + true + + true + true + + + АдресацияПоОбъекту + + ru + Роли и исполнители бизнес-процессов + + + + ru + + + PersonalComputer + MobileDevice + + + АдресацияПоОбъектуИРоли + + ru + Роли и исполнители бизнес-процессов + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + НастройкаРолевойАдресации + + ru + Роли и исполнители бизнес-процессов + + NavigationPanelOrdinary + Auto + + ru + Назначить исполнителей на роли бизнес-процессов + + + diff --git a/SSL/src/InformationRegisters/КалендарныеГрафики/КалендарныеГрафики.mdo b/SSL/src/InformationRegisters/КалендарныеГрафики/КалендарныеГрафики.mdo new file mode 100644 index 000000000..b06b9066a --- /dev/null +++ b/SSL/src/InformationRegisters/КалендарныеГрафики/КалендарныеГрафики.mdo @@ -0,0 +1,162 @@ + + + + + + + + + + + + КалендарныеГрафики + + ru + Календарные графики + + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ru + Календарный график + + + ДеньВключенВГрафик + + ru + День включен в график + + + Boolean + + + + Use + Use + + + + КоличествоДнейВГрафикеСНачалаГода + + ru + Количество дней в графике с начала года + + + Number + + 3 + true + + + + + Use + Use + + 0 + + + + Календарь + + ru + Календарь + + + CatalogRef.Календари + + + + ShowError + true + Use + Use + true + + Catalog.Календари.EmptyRef + + true + true + + + Год + + ru + Год + + + Number + + 4 + true + + + + ru + Год, за который заполняется график + + + + true + Use + Use + + 0 + + true + + + ДатаГрафика + + ru + Дата графика + + + Date + + Date + + + + + ShowError + true + Use + Use + + 0001-01-01T00:00:00 + + + diff --git a/SSL/src/InformationRegisters/КурсыВалют/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/КурсыВалют/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..39a81cffe --- /dev/null +++ b/SSL/src/InformationRegisters/КурсыВалют/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,205 @@ + + + + Период + 1 + true + true + + true + + + Запись.Period + + + ПериодРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ПериодКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Валюта + 3 + true + true + + true + + + Запись.Валюта + + + ВалютаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ВалютаКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Курс + 5 + true + true + + true + + + Запись.Курс + + + КурсРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + КурсКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Кратность + 7 + true + true + + true + + + Запись.Кратность + + + КратностьРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + КратностьКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Запись + 1 + + InformationRegisterRecordManager.КурсыВалют + + + true + + + true + +
    true
    + true +
    + + + + + + + AfterWrite + ПослеЗаписи + + +
    diff --git a/SSL/src/InformationRegisters/КурсыВалют/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/КурсыВалют/Forms/ФормаЗаписи/Module.bsl new file mode 100644 index 000000000..a70d0eefb --- /dev/null +++ b/SSL/src/InformationRegisters/КурсыВалют/Forms/ФормаЗаписи/Module.bsl @@ -0,0 +1,5 @@ + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + Оповестить("ИзменениеКурсовВалют"); +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/КурсыВалют/RecordSetModule.bsl b/SSL/src/InformationRegisters/КурсыВалют/RecordSetModule.bsl new file mode 100644 index 000000000..edf1a57b6 --- /dev/null +++ b/SSL/src/InformationRegisters/КурсыВалют/RecordSetModule.bsl @@ -0,0 +1,61 @@ + +// Обработчик события ПриЗаписи регистра сведений КурсыВалют. +// При записи нового элемента(ов) вызывает функциональность записи +// курса подчиненных валют. +// +Процедура ПриЗаписи(Отказ, Замещение) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если Количество() > 0 Тогда + Для Каждого Запись Из ЭтотОбъект Цикл + // Найти все зависимые валюты от данной и изменить их курс + ЗагрузитьКурсДляПодчиненныхВалют(Запись.Валюта, + Запись.Период, + Запись.Курс, + Запись.Кратность); + КонецЦикла; + Иначе + УдалитьКурсДляПодчиненныхВалют(Отбор.Валюта.Значение, Отбор.Период); + КонецЕсли; + +КонецПроцедуры + +Процедура ЗагрузитьКурсДляПодчиненныхВалют(ВалютаБазовая, Период, Курс, Кратность) + + ТаблицаВалют = РаботаСКурсамиВалют.ПолучитьСписокЗависимыхВалют(ВалютаБазовая); + + РегистрКурсыВалют = РегистрыСведений.КурсыВалют; + + Для Каждого ЭлементВалюта Из ТаблицаВалют Цикл + ЗаписьКурсовВалют = РегистрКурсыВалют.СоздатьМенеджерЗаписи(); + + ЗаписьКурсовВалют.Валюта = ЭлементВалюта.Ссылка; + ЗаписьКурсовВалют.Период = Период; + ЗаписьКурсовВалют.Курс = Курс + Курс * ЭлементВалюта.КоэффициентПодчиненногоКурса / 100; + ЗаписьКурсовВалют.Кратность = Кратность; + ЗаписьКурсовВалют.Записать(); + КонецЦикла; + +КонецПроцедуры + +Процедура УдалитьКурсДляПодчиненныхВалют(ВалютаБазовая, Период) + + ТаблицаВалют = РаботаСКурсамиВалют.ПолучитьСписокЗависимыхВалют(ВалютаБазовая); + + Для Каждого ЭлементВалюта Из ТаблицаВалют Цикл + НаборЗаписейКурсовВалют = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); + НаборЗаписейКурсовВалют.Отбор.Валюта.Значение = ЭлементВалюта.Ссылка; + НаборЗаписейКурсовВалют.Отбор.Период.Значение = Период.Значение; + НаборЗаписейКурсовВалют.Отбор.Период.ЗначениеПо = Период.ЗначениеПО; + НаборЗаписейКурсовВалют.Отбор.Период.ЗначениеС = Период.ЗначениеС; + НаборЗаписейКурсовВалют.Отбор.Период.ВидСравнения = Период.ВидСравнения; + НаборЗаписейКурсовВалют.Отбор.Валюта.Использование = Истина; + НаборЗаписейКурсовВалют.Отбор.Период.Использование = Истина; + + НаборЗаписейКурсовВалют.Записать(); + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/КурсыВалют/КурсыВалют.mdo b/SSL/src/InformationRegisters/КурсыВалют/КурсыВалют.mdo new file mode 100644 index 000000000..07c01c82c --- /dev/null +++ b/SSL/src/InformationRegisters/КурсыВалют/КурсыВалют.mdo @@ -0,0 +1,157 @@ + + + + + + + + + + + + КурсыВалют + + ru + Курсы валют + + true + InformationRegister.КурсыВалют.Form.ФормаЗаписи + + Use + Active + + Use + + + + + Use + LineNumber + + 0 + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ru + Дата курса + + + ru + Дата курса валюты + + + 0001-01-01T00:00:00 + + ShowError + Use + + + + Day + true + Managed + + Курс + + ru + Курс + + + Number + + 10 + 4 + true + + + + ru + Курс валюты + + + + ShowError + Use + Use + + 0 + + + + Кратность + + ru + Кратность + + + Number + + 10 + true + + + + ru + Кратность валюты + + + + ShowError + Use + Use + true + + 1 + + + + Валюта + + ru + Валюта + + + CatalogRef.Валюты + + + ru + Ссылка на валюты + + + + DontUse + Use + true + Use + Use + true + + Catalog.Валюты.EmptyRef + + true + true + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..70677cf76 --- /dev/null +++ b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,878 @@ + + + + Объект + 1 + true + true + + true + + + Запись.Объект + + + ОбъектРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + ОбъектКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СвойстваИРеквизиты + 33 + + Свойства + 31 + + НомерНабора + 3 + true + true + + true + + + Запись.НомерНабора + + + НомерНабораРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + НомерНабораКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ВидДоступа + 5 + true + true + + true + + + Запись.ВидДоступа + + + OnChange + СвойствоПриИзменении + + + ВидДоступаРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ВидДоступаКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ЗначениеДоступа + 7 + true + true + + true + + + Запись.ЗначениеДоступа + + + OnChange + СвойствоПриИзменении + + + ЗначениеДоступаРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ЗначениеДоступаКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Чтение + 9 + true + true + + true + + + Запись.Чтение + + + OnChange + СвойствоПриИзменении + + + ЧтениеРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ЧтениеКонтекстноеМеню + 10 + true + + CheckBoxField + Enter + true + Left + true + + + + Добавление + 11 + true + true + + true + + + Запись.Добавление + + + OnChange + СвойствоПриИзменении + + + ДобавлениеРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ДобавлениеКонтекстноеМеню + 12 + true + + CheckBoxField + Enter + true + Left + true + + + + Изменение + 13 + true + true + + true + + + Запись.Изменение + + + OnChange + СвойствоПриИзменении + + + ИзменениеРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + ИзменениеКонтекстноеМеню + 14 + true + + CheckBoxField + Enter + true + Left + true + + + + Удаление + 15 + true + true + + true + + + Запись.Удаление + + + OnChange + СвойствоПриИзменении + + + УдалениеРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + УдалениеКонтекстноеМеню + 16 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Свойства</value> + + + ru + Свойства + + + СвойстваРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + АвтоРеквизиты + 32 + + ВидДоступаЧерезПраваПоЗначениямДоступа + 21 + true + true + + true + + + Запись.ВидДоступаЧерезПраваПоЗначениямДоступа + + + ВидДоступаЧерезПраваПоЗначениямДоступаРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + ВидДоступаЧерезПраваПоЗначениямДоступаКонтекстноеМеню + 22 + true + + CheckBoxField + Enter + true + Left + true + + + + ВидДоступаЕдинственныйДляТипаЗначенияДоступа + 19 + true + true + + true + + + Запись.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + + + ВидДоступаЕдинственныйДляТипаЗначенияДоступаРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + ВидДоступаЕдинственныйДляТипаЗначенияДоступаКонтекстноеМеню + 20 + true + + CheckBoxField + Enter + true + Left + true + + + + ВидДоступаБезГруппЗначенияДоступа + 17 + true + true + + true + + + Запись.ВидДоступаБезГруппЗначенияДоступа + + + ВидДоступаБезГруппЗначенияДоступаРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + + ВидДоступаБезГруппЗначенияДоступаКонтекстноеМеню + 18 + true + + CheckBoxField + Enter + true + Left + true + + + + ВидДоступаПравоЧтения + 25 + true + true + + true + + + Запись.ВидДоступаПравоЧтения + + + ВидДоступаПравоЧтенияРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + + ВидДоступаПравоЧтенияКонтекстноеМеню + 26 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ВидДоступаПравоДобавления + 27 + true + true + + true + + + Запись.ВидДоступаПравоДобавления + + + ВидДоступаПравоДобавленияРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + + ВидДоступаПравоДобавленияКонтекстноеМеню + 28 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ВидДоступаПравоИзменения + 29 + true + true + + true + + + Запись.ВидДоступаПравоИзменения + + + ВидДоступаПравоИзмененияРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + ВидДоступаПравоИзмененияКонтекстноеМеню + 30 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТипОбъекта + 36 + true + true + + true + + + Запись.ТипОбъекта + + + ТипОбъектаРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + ТипОбъектаКонтекстноеМеню + 37 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТипЗначенияДоступа + 23 + true + true + + true + + + Запись.ТипЗначенияДоступа + + + ТипЗначенияДоступаРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + ТипЗначенияДоступаКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Авто реквизиты</value> + + + ru + Авто реквизиты, заполняемые автоматически, для ускорения работы запросов стандартных шаблонов ограничения доступа + + true + + АвтоРеквизитыРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Свойства и реквизиты</value> + + + ru + Свойства и реквизиты + + + СвойстваИРеквизитыРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + + + + ФормаКоманднаяПанель + -1 + + ВключитьРедактированиеАвтоРеквизитов + 34 + true + true + + true + + false + + ВключитьРедактированиеАвтоРеквизитовРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + Form.Command.ВключитьРедактированиеАвтоРеквизитов + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ЗаполнитьАвтоРеквизиты + 35 + true + true + + true + + false + + ЗаполнитьАвтоРеквизитыРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + Form.Command.ЗаполнитьАвтоРеквизиты + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + Left + true + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Запись + 1 + + InformationRegisterRecordManager.НаборыЗначенийДоступа + + + true + + + true + +
    true
    + true +
    + + РедактированиеАвтоРеквизитов + + <key>ru</key> + <value>Редактирование авто реквизитов</value> + + 2 + + Boolean + + + true + + + true + + + + ВключитьРедактированиеАвтоРеквизитов + + <key>ru</key> + <value>Включить редактирование авто реквизитов</value> + + 1 + + ru + Включить редактирование авто реквизитов для целей сложного анализа + + + true + + + + ВключитьРедактированиеАвтоРеквизитов + + + Auto + Auto + + + ЗаполнитьАвтоРеквизиты + + <key>ru</key> + <value>Заполнить авто реквизиты</value> + + 2 + + ru + Заполнить авто реквизиты вручную, если в режиме редактирования авто реквизиты изменены и нужно сделать авто заполнение + + + true + + + + ЗаполнитьАвтоРеквизиты + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаЗаписи/Module.bsl new file mode 100644 index 000000000..cb443168b --- /dev/null +++ b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаЗаписи/Module.bsl @@ -0,0 +1,57 @@ + +&НаКлиенте +Процедура ВключитьРедактированиеАвтоРеквизитов(Команда) + + Элементы.АвтоРеквизиты.ТолькоПросмотр = Ложь; + РедактированиеАвтоРеквизитов = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура СвойствоПриИзменении(Элемент) + + ЗаполнитьАвтоРеквизитыНаСервере(); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьАвтоРеквизитыНаСервере(ПоКомандеПользователя = Ложь) + + Если РедактированиеАвтоРеквизитов И НЕ ПоКомандеПользователя Тогда + Возврат; + КонецЕсли; + + НаборЗаписей = РегистрыСведений.НаборыЗначенийДоступа.СоздатьНаборЗаписей(); + ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), Запись); + + УправлениеДоступом.ДобавитьНаборыЗначенийДоступа(НаборЗаписей, УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(), Ложь, Истина, Запись.Объект); + + ЗаполнитьЗначенияСвойств(Запись, НаборЗаписей[0], "ВидДоступаЧерезПраваПоЗначениямДоступа, + |ВидДоступаЕдинственныйДляТипаЗначенияДоступа, + |ВидДоступаБезГруппЗначенияДоступа, + |ВидДоступаПравоЧтения, + |ВидДоступаПравоДобавления, + |ВидДоступаПравоИзменения, + |ТипЗначенияДоступа"); + Если НЕ Запись.Чтение И + НЕ Запись.Добавление И + НЕ Запись.Изменение И + НЕ Запись.Удаление Тогда + + Запись.ВидДоступаПравоЧтения = Неопределено; + Запись.ВидДоступаПравоДобавления = Неопределено; + Запись.ВидДоступаПравоИзменения = Неопределено; + КонецЕсли; + + Если ПоКомандеПользователя Тогда + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьАвтоРеквизиты(Команда) + + ЗаполнитьАвтоРеквизитыНаСервере(Истина); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..2efb64f37 --- /dev/null +++ b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаСписка/Form.form @@ -0,0 +1,841 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Объект + 4 + true + true + + true + + + Список.Объект + + true + + ОбъектРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ОбъектКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + НомерНабора + 6 + true + true + + true + + + Список.НомерНабора + + + НомерНабораРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + НомерНабораКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ВидДоступа + 8 + true + true + + true + + + Список.ВидДоступа + + + ВидДоступаРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ВидДоступаКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ЗначениеДоступа + 10 + true + true + + true + + + Список.ЗначениеДоступа + + + ЗначениеДоступаРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ЗначениеДоступаКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Чтение + 12 + + <key>ru</key> + <value>Чт</value> + + true + true + + true + + + Список.Чтение + + + ЧтениеРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + ЧтениеКонтекстноеМеню + 13 + true + + CheckBoxField + Enter + true + Left + true + + + + Добавление + 14 + + <key>ru</key> + <value>Доб</value> + + true + true + + true + + + Список.Добавление + + + ДобавлениеРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + ДобавлениеКонтекстноеМеню + 15 + true + + CheckBoxField + Enter + true + Left + true + + + + Изменение + 16 + + <key>ru</key> + <value>Изм</value> + + true + true + + true + + + Список.Изменение + + + ИзменениеРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + ИзменениеКонтекстноеМеню + 17 + true + + CheckBoxField + Enter + true + Left + true + + + + Удаление + 18 + + <key>ru</key> + <value>Уд</value> + + true + true + + true + + + Список.Удаление + + + УдалениеРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + УдалениеКонтекстноеМеню + 19 + true + + CheckBoxField + Enter + true + Left + true + + + + ВидДоступаБезГруппЗначенияДоступа + 20 + + <key>ru</key> + <value>ВД без групп</value> + + true + true + + true + + + Список.ВидДоступаБезГруппЗначенияДоступа + + + ВидДоступаБезГруппЗначенияДоступаРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + ВидДоступаБезГруппЗначенияДоступаКонтекстноеМеню + 21 + true + + CheckBoxField + Enter + true + Left + true + + + + ВидДоступаЕдинственныйДляТипаЗначенияДоступа + 22 + + <key>ru</key> + <value>ВД ед. для типа</value> + + true + true + + true + + + Список.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + + + ВидДоступаЕдинственныйДляТипаЗначенияДоступаРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + ВидДоступаЕдинственныйДляТипаЗначенияДоступаКонтекстноеМеню + 23 + true + + CheckBoxField + Enter + true + Left + true + + + + ВидДоступаЧерезПраваПоЗначениямДоступа + 24 + + <key>ru</key> + <value>ВД через права</value> + + true + true + + true + + + Список.ВидДоступаЧерезПраваПоЗначениямДоступа + + + ВидДоступаЧерезПраваПоЗначениямДоступаРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + ВидДоступаЧерезПраваПоЗначениямДоступаКонтекстноеМеню + 25 + true + + CheckBoxField + Enter + true + Left + true + + + + ВидДоступаПравоЧтения + 28 + + <key>ru</key> + <value>ВД право Чт</value> + + true + true + + true + + + Список.ВидДоступаПравоЧтения + + + ru + Когда свойство Чтение установлено, содержит вид доступа ПравоЧтения + + + ВидДоступаПравоЧтенияРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + ВидДоступаПравоЧтенияКонтекстноеМеню + 29 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ВидДоступаПравоДобавления + 30 + + <key>ru</key> + <value>ВД право Доб</value> + + true + true + + true + + + Список.ВидДоступаПравоДобавления + + + ru + Когда свойство Добавление установлено, содержит вид доступа ПравоДобавления + + + ВидДоступаПравоДобавленияРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + + ВидДоступаПравоДобавленияКонтекстноеМеню + 31 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ВидДоступаПравоИзменения + 32 + + <key>ru</key> + <value>ВД право Изм</value> + + true + true + + true + + + Список.ВидДоступаПравоИзменения + + + ru + Когда свойство Изменение установлено, содержит вид доступа ПравоИзменения + + + ВидДоступаПравоИзмененияРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + + ВидДоступаПравоИзмененияКонтекстноеМеню + 33 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ТаблицаОбъекта + 34 + + <key>ru</key> + <value>Тип Объекта</value> + + true + true + + true + + + Список.ТаблицаОбъекта + + + ru + Одна запись среди всех наборов содержит пустую ссылку типа объекта + + + ТаблицаОбъектаРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + ТаблицаОбъектаКонтекстноеМеню + 35 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ТаблицаЗначенияДоступа + 26 + + <key>ru</key> + <value>Тип ЗД</value> + + true + true + + true + + + Список.ТаблицаЗначенияДоступа + + + ru + Когда вид доступа ПравоЧтения или ПравоДобавления или ПравоИзменения, содержит пустую ссылку типа значения доступа + + + ТаблицаЗначенияДоступаРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + ТаблицаЗначенияДоступаКонтекстноеМеню + 27 + true + + LabelField + Enter + true + Left + true + + 15 + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 37 + + СписокСтрокаПоискаРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 38 + true + + Список + + true + + + + СписокСостояниеПросмотра + 40 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 41 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 43 + + СписокУправлениеПоискомРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 44 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
    true
    + 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 + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + ВЫБРАТЬ + РегистрСведенийНаборыЗначенийДоступа.Объект, + РегистрСведенийНаборыЗначенийДоступа.НомерНабора, + РегистрСведенийНаборыЗначенийДоступа.ВидДоступа, + РегистрСведенийНаборыЗначенийДоступа.ЗначениеДоступа, + РегистрСведенийНаборыЗначенийДоступа.Чтение, + РегистрСведенийНаборыЗначенийДоступа.Добавление, + РегистрСведенийНаборыЗначенийДоступа.Изменение, + РегистрСведенийНаборыЗначенийДоступа.Удаление, + РегистрСведенийНаборыЗначенийДоступа.ВидДоступаБезГруппЗначенияДоступа, + РегистрСведенийНаборыЗначенийДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, + РегистрСведенийНаборыЗначенийДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа, + РегистрСведенийНаборыЗначенийДоступа.ТипЗначенияДоступа, + РегистрСведенийНаборыЗначенийДоступа.ВидДоступаПравоЧтения, + РегистрСведенийНаборыЗначенийДоступа.ВидДоступаПравоДобавления, + РегистрСведенийНаборыЗначенийДоступа.ВидДоступаПравоИзменения, + ПрофилиГруппДоступаТипыСсылокОбъекта.Таблица КАК ТаблицаОбъекта, + ПрофилиГруппДоступаТипыСсылокЗначенияДоступа.Таблица КАК ТаблицаЗначенияДоступа +ИЗ + РегистрСведений.НаборыЗначенийДоступа КАК РегистрСведенийНаборыЗначенийДоступа + ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ПрофилиГруппДоступаТипыСсылокЗначенияДоступа + ПО (РегистрСведенийНаборыЗначенийДоступа.ТипЗначенияДоступа <> НЕОПРЕДЕЛЕНО) + И РегистрСведенийНаборыЗначенийДоступа.ТипЗначенияДоступа = ПрофилиГруппДоступаТипыСсылокЗначенияДоступа.ТипТаблицы + ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ПрофилиГруппДоступаТипыСсылокОбъекта + ПО (РегистрСведенийНаборыЗначенийДоступа.ТипОбъекта <> НЕОПРЕДЕЛЕНО) + И РегистрСведенийНаборыЗначенийДоступа.ТипОбъекта = ПрофилиГруппДоступаТипыСсылокОбъекта.ТипТаблицы + InformationRegister.НаборыЗначенийДоступа + true + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/InformationRegisters/НаборыЗначенийДоступа/RecordSetModule.bsl b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/RecordSetModule.bsl new file mode 100644 index 000000000..cbb66111a --- /dev/null +++ b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/RecordSetModule.bsl @@ -0,0 +1,35 @@ + +// Обработчик события ПередЗаписью выполняет заполнение стандартных полей в наборе записей, +// содержащего сформированные наборы значений доступа в модуле объекта: +// - ресурсы Чтение,Добавление,Изменение,Удаление заполняются Истина, если все Ложь; +// - реквизиты устанавливаются по свойства видов доступа для повышения производительности +// стандартных шаблонов ограничения доступа. +// +Процедура ПередЗаписью(Отказ, Замещение) + + Если ОбменДанными.Загрузка ИЛИ ДополнительныеСвойства.Свойство("ВосстановлениеНаборовЗначенийДоступа") Тогда + Возврат; + КонецЕсли; + + // При обычной записи наборов значений доступа объекта, + // в каждой записи заполняются + // 1) ссылка на объект; + // 2) реквизиты оптимизации производительности + // - ВидДоступаБезГруппЗначенияДоступа, + // - ВидДоступаЕдинственныйДляТипаЗначенияДоступа, + // - ВидДоступаЧерезПраваПоЗначениямДоступа; + // и нормализуются ресурсы получения номеров наборов по правам доступа: + // Чтение, Добавление, Изменение, Удаление. + Если Отбор.Объект.Использование + И НЕ Отбор.НомерНабора.Использование + И НЕ Отбор.ВидДоступа.Использование + И НЕ Отбор.ЗначениеДоступа.Использование Тогда + + Если НЕ ДополнительныеСвойства.Свойство("НаборыЗначенийДоступаПодготовлены") Тогда + УправлениеДоступом.ПодготовкаНаборовЗначенийДоступаПередЗаписью(Отбор.Объект.Значение, ЭтотОбъект); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры // ПередЗаписью() + diff --git a/SSL/src/InformationRegisters/НаборыЗначенийДоступа/НаборыЗначенийДоступа.mdo b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/НаборыЗначенийДоступа.mdo new file mode 100644 index 000000000..5b73db18c --- /dev/null +++ b/SSL/src/InformationRegisters/НаборыЗначенийДоступа/НаборыЗначенийДоступа.mdo @@ -0,0 +1,399 @@ + + + + + + + + + + + + НаборыЗначенийДоступа + + ru + Наборы значений доступа + + InformationRegister.НаборыЗначенийДоступа.Form.ФормаЗаписи + InformationRegister.НаборыЗначенийДоступа.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + Чтение + + ru + Чтение использует номер набора + + + Boolean + + + ru + При проверке права чтения объекта +использовать набор с заданным номером +(флажок устанавливается только для одной строки набора) + + + + Use + + + + Добавление + + ru + Добавление использует номер набора + + + Boolean + + + ru + При проверке права добавления объекта +использовать набор с заданным номером +(флажок устанавливается только для одной строки набора) + + + + Use + + + + Изменение + + ru + Изменение использует номер набора + + + Boolean + + + ru + При проверке права изменения объекта +использовать набор с заданным номером +(флажок устанавливается только для одной строки набора) + + + + Use + + + + Удаление + + ru + Удаление использует номер набора + + + Boolean + + + ru + При проверке права удаления объекта +использовать набор с заданным номером +(флажок устанавливается только для одной строки набора) + + + + Use + + + + ВидДоступаБезГруппЗначенияДоступа + + ru + Вид доступа без групп значения доступа + + + Boolean + + + ru + Вид доступа без групп значений доступа (кэш свойства вида доступа) + + + + Use + + + + ВидДоступаЕдинственныйДляТипаЗначенияДоступа + + ru + Вид доступа единственный для типа значения доступа + + + Boolean + + + ru + Вид доступа единственный для типа значений доступа (кэш свойства вида доступа) + + + + Use + + + + ВидДоступаЧерезПраваПоЗначениямДоступа + + ru + Вид доступа через права по значениям доступа + + + Boolean + + + ru + Вид доступа через права по значениям доступа (кэш свойства вида доступа) + + + + Use + + + + ВидДоступаПравоЧтения + + ru + Вид доступа право чтения + + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + ru + Когда свойство Чтение установлено, содержит вид доступа ПравоЧтения + + + + Use + + + + ВидДоступаПравоДобавления + + ru + Вид доступа право добавления + + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + ru + Когда свойство Добавление установлено, содержит вид доступа ПравоДобавления + + + + Use + + + + ВидДоступаПравоИзменения + + ru + Вид доступа право изменения + + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + ru + Когда свойство Изменение установлено, содержит вид доступа ПравоИзменения + + + + Use + + + + ТипОбъекта + + ru + Тип объекта + + + AnyRef + + + ru + Одна запись среди всех наборов содержит пустую ссылку типа объекта + + + + Index + Use + + + + ТипЗначенияДоступа + + ru + Тип значения доступа + + + AnyRef + + + ru + Когда вид доступа ПравоЧтения или ПравоДобавления или ПравоИзменения, содержит пустую ссылку типа значения доступа + + + + Use + + + + Объект + + ru + Объект + + + String + + 10 + + + + ru + Ссылка на объект-владелец наборов значений доступа + + + + ShowError + true + Use + true + + true + true + + + НомерНабора + + ru + Номер набора + + + Number + + 10 + true + + + + ru + Число, объединяющие несколько строк в один набор. +Результаты проверок строк в наборе объединяется по логическому "И", +а результаты проверок наборов объекта по логическому "ИЛИ" + + + + Use + + 0 + + true + true + + + ВидДоступа + + ru + Вид доступа + + Незаполненные значения нужно допустить, чтобы избежать ошибок при записи проверяемых объектов + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + ru + Вид доступа по которому проверяется разрешенность значения доступа + + + + Use + true + + ChartOfCharacteristicTypes.ВидыДоступа.EmptyRef + + true + true + + + ЗначениеДоступа + + ru + Значение доступа + + Незаполненные значения нужно допустить, чтобы избежать ошибок при записи проверяемых объектов + + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + CatalogRef.ГруппыПользователей + CatalogRef.Пользователи + + + ru + Ссылка на значение, например, на организацию, контрагента, ... + + + + Use + true + + true + true + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/НазначениеДополнительныхОбработок/НазначениеДополнительныхОбработок.mdo b/SSL/src/InformationRegisters/НазначениеДополнительныхОбработок/НазначениеДополнительныхОбработок.mdo new file mode 100644 index 000000000..e88c912c1 --- /dev/null +++ b/SSL/src/InformationRegisters/НазначениеДополнительныхОбработок/НазначениеДополнительныхОбработок.mdo @@ -0,0 +1,153 @@ + + + + + + + + + + + + НазначениеДополнительныхОбработок + + ru + Назначение дополнительных обработок + + true + InDialog + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ИспользоватьЗаполнениеОбъекта + + ru + Использовать заполнение объекта + + + Boolean + + + + Use + + + + ИспользоватьОтчеты + + ru + Использовать отчеты + + + Boolean + + + + Use + + + + ИспользоватьПечатныеФормы + + ru + Использовать печатные формы + + + Boolean + + + + Use + + + + ИспользоватьСозданиеСвязанныхОбъектов + + ru + Использовать создание связанных объектов + + + Boolean + + + + Use + + + + ТипОбъекта + + ru + Тип объекта + + + String + + 100 + + + + ru + Полное имя объекта + + + + true + Index + Use + + + + true + + + ТипФормы + + ru + Тип формы + + + String + + 20 + + + + + Use + + true + + diff --git a/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/Forms/ФормаНастройкиВерсионированияОбъектов/Form.form b/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/Forms/ФормаНастройкиВерсионированияОбъектов/Form.form new file mode 100644 index 000000000..1f7e88523 --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/Forms/ФормаНастройкиВерсионированияОбъектов/Form.form @@ -0,0 +1,1135 @@ + + + + ДеревоОбъектовМетаданных + 11 + true + true + + true + + + ДеревоОбъектовМетаданных + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + HierarchicalList + List + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + Tree + + КартинкаНаименование + 20 + + Картинка + 21 + true + true + + true + + + ДеревоОбъектовМетаданных.КодКартинки + + None + + КартинкаРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + КартинкаКонтекстноеМеню + 22 + true + + PictureField + true + Enter + true + Left + true + + 2 + true + 1 + true + true + true + + 1 + + + + + НаименованиеОбъекта + 14 + true + true + + true + + + ДеревоОбъектовМетаданных.СинонимНаименованияОбъекта + + + НаименованиеОбъектаРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + НаименованиеОбъектаКонтекстноеМеню + 15 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Картинка наименование</value> + + + ru + Картинка наименование + + + КартинкаНаименованиеРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + ВариантВерсионирования + 16 + true + true + + true + + + ДеревоОбъектовМетаданных.ВариантВерсионирования + + + ВариантВерсионированияРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + ВариантВерсионированияКонтекстноеМеню + 17 + true + + InputField + Enter + true + Left + true + + + StartListChoice + ВариантВерсионированияНачалоВыбораИзСписка + + + ChoiceProcessing + ВариантВерсионированияОбработкаВыбора + + true + true + true + false + + Style.BorderColor + + Normal + + + + КлассОбъекта + 18 + true + false + + + ДеревоОбъектовМетаданных.КлассОбъекта + + + КлассОбъектаРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + КлассОбъектаКонтекстноеМеню + 19 + true + + InputField + Enter + Left + + true + true + true + true + true + + Style.BorderColor + + Normal + + + None + + ДеревоОбъектовМетаданныхКоманднаяПанель + 13 + Left + true + + + BeforeRowChange + ДеревоОбъектовМетаданныхПередНачаломИзменения + + + ДеревоОбъектовМетаданныхСтрокаПоиска + 42 + + ДеревоОбъектовМетаданныхСтрокаПоискаРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ДеревоОбъектовМетаданныхСтрокаПоискаКонтекстноеМеню + 43 + true + + ДеревоОбъектовМетаданных + + true + + + + ДеревоОбъектовМетаданныхСостояниеПросмотра + 45 + + ДеревоОбъектовМетаданныхСостояниеПросмотраРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ДеревоОбъектовМетаданныхСостояниеПросмотраКонтекстноеМеню + 46 + true + + ViewStatusAddition + ДеревоОбъектовМетаданных + + true + + + + ДеревоОбъектовМетаданныхУправлениеПоиском + 48 + + ДеревоОбъектовМетаданныхУправлениеПоискомРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ДеревоОбъектовМетаданныхУправлениеПоискомКонтекстноеМеню + 49 + true + + SearchControlAddition + ДеревоОбъектовМетаданных + + true + + + + ДеревоОбъектовМетаданныхРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ДеревоОбъектовМетаданныхКонтекстноеМеню + 12 + + КМ_УстановитьВариантВерсионированияНеВерсионировать + 28 + true + true + + true + + false + + КМ_УстановитьВариантВерсионированияНеВерсионироватьРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.Command.УстановитьВариантВерсионированияНеВерсионировать + Normal + Auto + true + true + UserCmds + Auto + + + КМ_УстановитьВариантВерсионированияВсегда + 29 + true + true + + true + + false + + КМ_УстановитьВариантВерсионированияВсегдаРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + Form.Command.УстановитьВариантВерсионированияВсегда + Normal + Auto + true + true + UserCmds + Auto + + + КМ_УстановитьВариантВерсионированияПриПроведении + 30 + true + true + + true + + false + + КМ_УстановитьВариантВерсионированияПриПроведенииРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + Form.Command.УстановитьВариантВерсионированияПриПроведении + Normal + Auto + true + true + UserCmds + Auto + + + КМ_УстановитьНастройкиПоУмолчанию + 31 + true + true + + true + + false + + КМ_УстановитьНастройкиПоУмолчаниюРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + Form.Command.УстановитьНастройкиПоУмолчанию + Normal + Auto + true + true + UserCmds + Auto + + + Tree + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + ExpandAllLevels + true + true + + Style.BorderColor + + None + None + None + true +
    + + ФормаКоманднаяПанель + -1 + + ВариантВерсионированияГруппа + 24 + + УстановитьВариантВерсионированияНеВерсионировать + 27 + true + true + + true + + false + + УстановитьВариантВерсионированияНеВерсионироватьРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.Command.УстановитьВариантВерсионированияНеВерсионировать + Normal + Auto + true + true + UserCmds + Auto + + + УстановитьВариантВерсионированияВсегда + 26 + true + true + + true + + false + + УстановитьВариантВерсионированияВсегдаРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.Command.УстановитьВариантВерсионированияВсегда + Normal + Auto + true + true + UserCmds + Auto + + + УстановитьВариантВерсионированияПриПроведении + 25 + true + true + + true + + false + + УстановитьВариантВерсионированияПриПроведенииРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.Command.УстановитьВариантВерсионированияПриПроведении + Normal + Auto + true + true + UserCmds + Auto + + + УстановитьНастройкиПоУмолчанию + 23 + true + true + + true + + false + + УстановитьНастройкиПоУмолчаниюРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.Command.УстановитьНастройкиПоУмолчанию + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Вариант версионирования</value> + + + ru + Установитьрежим версионирования для выделенных объектов + + + ВариантВерсионированияГруппаРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + 70 + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ДеревоОбъектовМетаданных + + <key>ru</key> + <value>Дерево объектов метаданных</value> + + 2 + + ValueTree + + + true + + + true + + + ТипОбъекта + + <key>ru</key> + <value>Объект</value> + + 1 + + String + + + + true + + + true + + + + ВариантВерсионирования + + <key>ru</key> + <value>Вариант версионирования</value> + + 2 + + EnumRef.ВариантыВерсионированияОбъектов + + + true + + + true + + + + КлассОбъекта + + <key>ru</key> + <value>Класс объекта</value> + + 3 + + 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 + + Boolean + + + true + + + true + + + + + СписокВыбораПолный + + <key>ru</key> + <value>Список выбора полный</value> + + 1 + + ValueList + + + true + + + true + + + + + + + СписокВыбораБезПроведения + + <key>ru</key> + <value>Список выбора без проведения</value> + + 3 + + ValueList + + + true + + + true + + + + + + + УстановитьНастройкиПоУмолчанию + + <key>ru</key> + <value>По умолчанию</value> + + 1 + + ru + Установить настройки версионирования для всех объектов по умолчанию + + + true + + Role.Администрирование + + + Role.ВыводНаПринтерФайлБуферОбмена + + + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеОтветовНаВопросыАнкет + + + + + УстановитьНастройкиПоУмолчаниюВыполнить + + + Auto + Auto + + + УстановитьВариантВерсионированияПриПроведении + + <key>ru</key> + <value>Версионировать при проведении</value> + + 2 + + ru + Установить режим версионирования "при проведении" для выделенных объектов + + + true + + Role.Администрирование + + + Role.ВыводНаПринтерФайлБуферОбмена + + + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеОтветовНаВопросыАнкет + + + + + УстановитьВариантВерсионированияПриПроведенииВыполнить + + + Auto + Auto + + + УстановитьВариантВерсионированияВсегда + + <key>ru</key> + <value>Версионировать</value> + + 3 + + ru + Установить режим версионирования "всегда" для выделенных объектов + + + true + + Role.Администрирование + + + Role.ВыводНаПринтерФайлБуферОбмена + + + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеОтветовНаВопросыАнкет + + + + + УстановитьРежимВерсионированияВсегдаВыполнить + + + Auto + Auto + + + УстановитьВариантВерсионированияНеВерсионировать + + <key>ru</key> + <value>Не версионировать</value> + + 4 + + ru + Установить режим версионирования "не версионировать" для выделенных объектов + + + true + + Role.Администрирование + + + Role.ВыводНаПринтерФайлБуферОбмена + + + Role.ДобавлениеИзменениеБазовойНСИ + + + Role.ДобавлениеИзменениеВнешнихПользователей + + + Role.ДобавлениеИзменениеОпросов + + + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + + + Role.ДобавлениеИзменениеПользователейИГруппДоступа + + + Role.ДобавлениеИзменениеШаблоновАнкет + + + Role.ЗапускAutomation + + + Role.ЗапускВебКлиента + + + Role.ЗапускВнешнегоСоединения + + + Role.ЗапускТолстогоКлиента + + + Role.ЗапускТонкогоКлиента + + + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + + Role.ОбновлениеКонфигурацииБазыДанных + + + true + Role.ПолныеПрава + + + Role.ПросмотрЖурналаРегистрации + + + Role.РедактированиеРеквизитовОбъектов + + + Role.ЧтениеБазовойНСИ + + + Role.ЧтениеОтветовНаВопросыАнкет + + + + + УстановитьВариантВерсионированияНеВерсионироватьВыполнить + + + Auto + Auto + + + + + +
    diff --git a/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/Forms/ФормаНастройкиВерсионированияОбъектов/Help/ru.html b/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/Forms/ФормаНастройкиВерсионированияОбъектов/Help/ru.html new file mode 100644 index 000000000..bfcd2e698 --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/Forms/ФормаНастройкиВерсионированияОбъектов/Help/ru.html @@ -0,0 +1,5 @@ + +

    Настройка версионирования документов и справочников. Влияет на сохранение версий объекта при изменении (создании).

    +
    • Не версионировать - версии объекта не сохраняются +
    • Версионировать всегда - версии объекта сохраняются при любом изменении (создании) +
    • Версионировать при проведении - версии сохраняются только при проведении; настройка применяется только для документов, для которых разрешено проведение

    Допускается установка настроек версионирования для группы объектов.

    \ No newline at end of file diff --git a/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/Forms/ФормаНастройкиВерсионированияОбъектов/Module.bsl b/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/Forms/ФормаНастройкиВерсионированияОбъектов/Module.bsl new file mode 100644 index 000000000..d5fb09ff1 --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/Forms/ФормаНастройкиВерсионированияОбъектов/Module.bsl @@ -0,0 +1,340 @@ +//////////////////////////////////////////////////////////////////////////////// +// Секция сервисных функций +// + +// Функция ДокументПроводится возвращает значение свойства Проведение +// объекта метаданнх из коллекции "Метаданные.Документы". +// +// Параметры: +// ИмяДокумента - Строка, возможно два варианта ПолноеИмя и КраткоеИмя, +// например, "Документ.ПриходнаяНакладная" или "ПриходнаяНакладная". +// +// Возвращаемое значение: +// Булево. +// +Функция ДокументПроводится(знач ИмяДокумента) Экспорт + + ИмяДокументаМассив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяДокумента, "."); + + Если ИмяДокументаМассив.Количество() > 1 Тогда + ИмяДокумента = ИмяДокументаМассив[1]; + КонецЕсли; + + Возврат Метаданные.Документы[ИмяДокумента].Проведение = + Метаданные.СвойстваОбъектов.Проведение.Разрешить; + +КонецФункции // ДокументПроводится() + +// Заполняет дерево значений наименованиями объектов метаданных: +// справочники и документы. +// +&НаСервере +Процедура ЗаполнитьТипыОбъектовВДеревеЗначений() + + ДеревоОМ = РеквизитФормыВЗначение("ДеревоОбъектовМетаданных"); + ДеревоОМ.Строки.Очистить(); + + // Тип параметра команды ИсторияИзменений содержит состав объектов для которых + // применяется версионирование + МассивТипов = Метаданные.ОбщиеКоманды.ИсторияИзменений.ТипПараметраКоманды.Типы(); + ЕстьСправочники = Ложь; + ЕстьДокументы = Ложь; + ВсеСправочники = Справочники.ТипВсеСсылки(); + ВсеДокументы = Документы.ТипВсеСсылки(); + УзелСправочники = НеОпределено; + УзелДокументы = НеОпределено; + + + Для Каждого Тип Из МассивТипов Цикл + Если ВсеСправочники.СодержитТип(Тип) Тогда + Если УзелСправочники = НеОпределено Тогда + УзелСправочники = ДеревоОМ.Строки.Добавить(); + УзелСправочники.СинонимНаименованияОбъекта = "Справочники"; + УзелСправочники.КлассОбъекта = "01КлассСправочникиКорень"; + УзелСправочники.КодКартинки = 2; + КонецЕсли; + НоваяСтрокаТаблицы = УзелСправочники.Строки.Добавить(); + НоваяСтрокаТаблицы.КодКартинки = 19; + НоваяСтрокаТаблицы.КлассОбъекта = "КлассСправочники"; + + ИначеЕсли ВсеДокументы.СодержитТип(Тип) Тогда + Если УзелДокументы = НеОпределено Тогда + УзелДокументы = ДеревоОМ.Строки.Добавить(); + УзелДокументы.СинонимНаименованияОбъекта = "Документы"; + УзелДокументы.КлассОбъекта = "02КлассДокументыКорень"; + УзелДокументы.КодКартинки = 3; + КонецЕсли; + НоваяСтрокаТаблицы = УзелДокументы.Строки.Добавить(); + НоваяСтрокаТаблицы.КодКартинки = 20; + НоваяСтрокаТаблицы.КлассОбъекта = "КлассДокументы"; + КонецЕсли; + МетаданныеОбъекта = Метаданные.НайтиПоТипу(Тип); + НоваяСтрокаТаблицы.ТипОбъекта = МетаданныеОбъекта.ПолноеИмя(); + НоваяСтрокаТаблицы.СинонимНаименованияОбъекта = МетаданныеОбъекта.Синоним; + НоваяСтрокаТаблицы.ВариантВерсионирования = + ПолучитьФункциональнуюОпцию("ВариантыВерсионированияОбъектов", + Новый Структура("ТипОбъектаКонфигурации", НоваяСтрокаТаблицы.ТипОбъекта)); + Если НоваяСтрокаТаблицы.КлассОбъекта = "КлассДокументы" Тогда + НоваяСтрокаТаблицы.Проводится = ? (МетаданныеОбъекта.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить, Истина, Ложь); + КонецЕсли; + КонецЦикла; + ДеревоОМ.Строки.Сортировать("КлассОбъекта"); + Для Каждого УзелВерхнегоУровня Из ДеревоОМ.Строки Цикл + УзелВерхнегоУровня.Строки.Сортировать("СинонимНаименованияОбъекта"); + КонецЦикла; + ЗначениеВРеквизитФормы(ДеревоОМ, "ДеревоОбъектовМетаданных"); + +КонецПроцедуры + +// Записывает настройку версионирования +// +&НаСервереБезКонтекста +Процедура ЗаписатьНастройкуВерсионирования(знач ТипОбъекта, знач ВариантВерсионирования) + + ВерсионированиеОбъектов.ЗаписатьНастройкуВерсионированияПоОбъекту( + ТипОбъекта, ВариантВерсионирования); + +КонецПроцедуры + +// По выделенным строкам определяет какие из них являются именованиями +// документов и возвращает массив +// +&НаКлиенте +Функция СредиВыделенныхДокументовЕстьНепроводящиеся() + + Для Каждого ИдентификаторСтроки Из Элементы.ДеревоОбъектовМетаданных.ВыделенныеСтроки Цикл + ЭлементДерева = ДеревоОбъектовМетаданных.НайтиПоИдентификатору(ИдентификаторСтроки); + Если ЭлементДерева.КлассОбъекта = "КлассДокументы" И Не ЭлементДерева.Проводится Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +///////////////////////////////////////////////////////////////// +// Блок фунцкий устанавливающих вариант версионирования +// + +// Устанавливает все настройки версионирования по умолчанию +// и переформирует дерево +// +&НаСервере +Процедура УстановитьНастройкиПоУмолчанию() + + Для Каждого ИдентификаторСтроки Из Элементы.ДеревоОбъектовМетаданных.ВыделенныеСтроки Цикл + ЭлементДерева = ДеревоОбъектовМетаданных.НайтиПоИдентификатору(ИдентификаторСтроки); + Если ЭлементДерева.КлассОбъекта = "КлассСправочники" Тогда + ЭлементДерева.ВариантВерсионирования = Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать; + ВерсионированиеОбъектов.ЗаписатьНастройкуВерсионированияПоОбъекту( + ЭлементДерева.ТипОбъекта, + Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать); + КонецЕсли; + Если ЭлементДерева.КлассОбъекта = "КлассДокументы" Тогда + Если ДокументПроводится(ЭлементДерева.ТипОбъекта) Тогда + ЭлементДерева.ВариантВерсионирования = Перечисления.ВариантыВерсионированияОбъектов.ВерсионироватьПриПроведении; + ВерсионированиеОбъектов.ЗаписатьНастройкуВерсионированияПоОбъекту( + ЭлементДерева.ТипОбъекта, + Перечисления.ВариантыВерсионированияОбъектов.ВерсионироватьПриПроведении); + Иначе + ЭлементДерева.ВариантВерсионирования = Перечисления.ВариантыВерсионированияОбъектов.Версионировать; + ВерсионированиеОбъектов.ЗаписатьНастройкуВерсионированияПоОбъекту( + ЭлементДерева.ТипОбъекта, + Перечисления.ВариантыВерсионированияОбъектов.Версионировать); + КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Устанавливает все настройки версионирования "не версионировать" +// и переформирует дерево +// +&НаСервере +Процедура УстановитьВариантВерсионированияНеВерсионировать() + + Для Каждого ИдентификаторСтроки Из Элементы.ДеревоОбъектовМетаданных.ВыделенныеСтроки Цикл + ЭлементДерева = ДеревоОбъектовМетаданных.НайтиПоИдентификатору(ИдентификаторСтроки); + + Если ЭлементДерева.КлассОбъекта = "КлассСправочники" Тогда + ЭлементДерева.ВариантВерсионирования = Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать; + ВерсионированиеОбъектов.ЗаписатьНастройкуВерсионированияПоОбъекту( + ЭлементДерева.ТипОбъекта, + Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать); + КонецЕсли; + Если ЭлементДерева.КлассОбъекта = "КлассДокументы" Тогда + ЭлементДерева.ВариантВерсионирования = Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать; + ВерсионированиеОбъектов.ЗаписатьНастройкуВерсионированияПоОбъекту( + ЭлементДерева.ТипОбъекта, + Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Устанавливает все настройки версионирования "при проведении" +// и переформирует дерево +// +&НаСервере +Процедура УстановитьВариантВерсионированияВсегда() + + Для Каждого ИдентификаторСтроки Из Элементы.ДеревоОбъектовМетаданных.ВыделенныеСтроки Цикл + ЭлементДерева = ДеревоОбъектовМетаданных.НайтиПоИдентификатору(ИдентификаторСтроки); + Если ЭлементДерева.КлассОбъекта = "КлассСправочники" Тогда + ЭлементДерева.ВариантВерсионирования = Перечисления.ВариантыВерсионированияОбъектов.Версионировать; + ВерсионированиеОбъектов.ЗаписатьНастройкуВерсионированияПоОбъекту( + ЭлементДерева.ТипОбъекта, + Перечисления.ВариантыВерсионированияОбъектов.Версионировать); + КонецЕсли; + Если ЭлементДерева.КлассОбъекта = "КлассДокументы" Тогда + ЭлементДерева.ВариантВерсионирования = Перечисления.ВариантыВерсионированияОбъектов.Версионировать; + ВерсионированиеОбъектов.ЗаписатьНастройкуВерсионированияПоОбъекту( + ЭлементДерева.ТипОбъекта, + Перечисления.ВариантыВерсионированияОбъектов.Версионировать); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Устанавливает все настройки версионирования "при проведении" +// и переформирует дерево +// +&НаСервере +Процедура УстановитьВариантВерсионированияПриПроведении() + + Для Каждого ИдентификаторСтроки Из Элементы.ДеревоОбъектовМетаданных.ВыделенныеСтроки Цикл + ЭлементДерева = ДеревоОбъектовМетаданных.НайтиПоИдентификатору(ИдентификаторСтроки); + Если ЭлементДерева.КлассОбъекта = "КлассДокументы" И ДокументПроводится(ЭлементДерева.ТипОбъекта) Тогда + ЭлементДерева.ВариантВерсионирования = Перечисления.ВариантыВерсионированияОбъектов.ВерсионироватьПриПроведении; + ВерсионированиеОбъектов.ЗаписатьНастройкуВерсионированияПоОбъекту( + ЭлементДерева.ТипОбъекта, + Перечисления.ВариантыВерсионированияОбъектов.ВерсионироватьПриПроведении); + ИначеЕсли (ЭлементДерева.КлассОбъекта = "КлассДокументы" И НЕ ДокументПроводится(ЭлементДерева.ТипОбъекта)) + ИЛИ (ЭлементДерева.КлассОбъекта = "КлассСправочники") Тогда + ЭлементДерева.ВариантВерсионирования = Перечисления.ВариантыВерсионированияОбъектов.Версионировать; + ВерсионированиеОбъектов.ЗаписатьНастройкуВерсионированияПоОбъекту( + ЭлементДерева.ТипОбъекта, + Перечисления.ВариантыВерсионированияОбъектов.Версионировать); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Секция обработчиков событий +// + +// Обработчик события "при создании на сервере" формы +// Заполняет дерево формы наименованиями объектов метаданных +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗаполнитьТипыОбъектовВДеревеЗначений(); + + СписокВыбораПолный = Новый СписокЗначений; + СписокВыбораПолный.Добавить(Перечисления.ВариантыВерсионированияОбъектов.Версионировать); + СписокВыбораПолный.Добавить(Перечисления.ВариантыВерсионированияОбъектов.ВерсионироватьПриПроведении); + СписокВыбораПолный.Добавить(Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать); + + СписокВыбораБезПроведения = Новый СписокЗначений; + СписокВыбораБезПроведения.Добавить(Перечисления.ВариантыВерсионированияОбъектов.Версионировать); + СписокВыбораБезПроведения.Добавить(Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать); + +КонецПроцедуры + +// Обработчик события "перед началом изменения" элемента формы +// ДеревоОбъектовМетаданных. +// Отказывает в измении свойств, если указатель на корневом элементе +// +&НаКлиенте +Процедура ДеревоОбъектовМетаданныхПередНачаломИзменения(Элемент, Отказ) + + Если Элемент.ТекущиеДанные.КлассОбъекта = "01КлассСправочникиКорень" + Или Элемент.ТекущиеДанные.КлассОбъекта = "02КлассДокументыКорень" Тогда + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры + +// Обработка события "начало выбора из списка" поля дерева формы (ДеревоОбъектовМетаданных) +// Формирует и показывает список выбора варианта версионирования по классу объекта +// +&НаКлиенте +Процедура ВариантВерсионированияНачалоВыбораИзСписка(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтрокаДерева = Элементы.ДеревоОбъектовМетаданных.ТекущиеДанные; + + Элемент.СписокВыбора.Очистить(); + + Если СтрокаДерева.КлассОбъекта = "КлассДокументы" И СтрокаДерева.Проводится Тогда + СписокВыбора = СписокВыбораПолный; + Иначе + СписокВыбора = СписокВыбораБезПроведения; + КонецЕсли; + + Для Каждого ЭлементСписка Из СписокВыбора Цикл + Элемент.СписокВыбора.Добавить(ЭлементСписка.Значение); + КонецЦикла; + +КонецПроцедуры + + +// Обработчик события "обработка выбора" элемента поля дерева формы (ДеревоОбъектовМетаданных) +// Вписывает выбранное значение версионирования в таблицу и записывает регистр сведений +// +&НаКлиенте +Процедура ВариантВерсионированияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + СтрокаДерева = Элементы.ДеревоОбъектовМетаданных.ТекущиеДанные; + СтрокаДерева.ВариантВерсионирования = ВыбранноеЗначение; + + ТипОбъекта = СтрокаДерева.ТипОбъекта; + ВариантВерсионирования = СтрокаДерева.ВариантВерсионирования; + + ЗаписатьНастройкуВерсионирования(ТипОбъекта, ВариантВерсионирования); + +КонецПроцедуры + +// Обработчик нажатия на кнопку "Заполнить по умолчанию" командной панели формы +// Устанавливает все настройки версионирования по умолчанию +// +&НаКлиенте +Процедура УстановитьНастройкиПоУмолчаниюВыполнить(Команда) + + УстановитьНастройкиПоУмолчанию(); + +КонецПроцедуры + +// Обработчик нажатия на кнопку "Не версионировать" командной панели формы +// +&НаКлиенте +Процедура УстановитьВариантВерсионированияНеВерсионироватьВыполнить(Команда) + + УстановитьВариантВерсионированияНеВерсионировать(); + +КонецПроцедуры + +// Обработчик нажатия на кнопку "Версионировать при проведении" командной панели формы +// +&НаКлиенте +Процедура УстановитьВариантВерсионированияПриПроведенииВыполнить(Команда) + + Если СредиВыделенныхДокументовЕстьНепроводящиеся() Тогда + Предупреждение(НСтр("ru = 'Документам, которые не могут быть проведены, будет установлен режим версонирования ""Версионировать всегда"".'")); + КонецЕсли; + + УстановитьВариантВерсионированияПриПроведении(); + +КонецПроцедуры + +// Обработчик нажатия на кнопку "Версионировать всегда" командной панели формы +// +&НаКлиенте +Процедура УстановитьРежимВерсионированияВсегдаВыполнить(Команда) + + УстановитьВариантВерсионированияВсегда(); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/ManagerModule.bsl b/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/RecordSetModule.bsl b/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/RecordSetModule.bsl new file mode 100644 index 000000000..1135c6e55 --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/RecordSetModule.bsl @@ -0,0 +1,9 @@ +Процедура ПередЗаписью(Отказ, Замещение) + Для Каждого Строка Из ЭтотОбъект Цикл + Если Строка.Вариант = Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать Тогда + Строка.Использовать = Ложь; + Иначе + Строка.Использовать = Истина; + КонецЕсли; + КонецЦикла; +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/НастройкаВерсионированияОбъектов.mdo b/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/НастройкаВерсионированияОбъектов.mdo new file mode 100644 index 000000000..b5986706f --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкаВерсионированияОбъектов/НастройкаВерсионированияОбъектов.mdo @@ -0,0 +1,137 @@ + + + + + + + + + + + + НастройкаВерсионированияОбъектов + + ru + Настройка версионирования объектов + + true + InformationRegister.НастройкаВерсионированияОбъектов.Form.ФормаНастройкиВерсионированияОбъектов + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ru + Версионируемые объекты + + + Вариант + + ru + Вариант + + + EnumRef.ВариантыВерсионированияОбъектов + + + ru + Вариант версионирования типа объекта + + + + Use + DontUse + Use + Use + + Enum.ВариантыВерсионированияОбъектов.EmptyRef + + + + Использовать + + ru + Использовать + + + Boolean + + + ru + Использовать версионирование объекта метаданных + + + + Use + Use + + + + ТипОбъекта + + ru + Тип объекта + + + String + + 200 + + + + ru + Полное имя объекта + + + + true + Use + Use + + true + + + ФормаНастройкиВерсионированияОбъектов + + ru + Версионирование объектов + + + + ru + + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..d3cdc517d --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,1175 @@ + + + + <key>ru</key> + <value>Параметры транспорта сообщений обмена</value> + + + ГруппаУзелИнформационнойБазы + 44 + + Узел + 3 + true + true + + true + + + Запись.Узел + + + OnChange + УзелПриИзменении + + + УзелРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + УзелКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа узел информационной базы</value> + + + ru + Группа узел информационной базы + + + ГруппаУзелИнформационнойБазыРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ВидТранспортаСообщенийОбменаПоУмолчанию + 1 + true + true + + true + + + Запись.ВидТранспортаСообщенийОбменаПоУмолчанию + + + ВидТранспортаСообщенийОбменаПоУмолчаниюРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + ВидТранспортаСообщенийОбменаПоУмолчаниюКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + false + true + true + true + true + Normal + + + + СтраницыВидовТранспорта + 47 + + НастройкиТранспортаFILE + 5 + + FILEКаталогОбменаИнформацией + 8 + true + true + + true + + + Запись.FILEКаталогОбменаИнформацией + + + FILEКаталогОбменаИнформациейРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + FILEКаталогОбменаИнформациейКонтекстноеМеню + 9 + true + + InputField + true + Enter + true + Left + true + + + StartChoice + FILEКаталогОбменаИнформациейНачалоВыбора + + + Opening + FILEКаталогОбменаИнформациейОткрытие + + true + true + true + true + true + true + true + true + true + Normal + + + + FILEСжиматьФайлИсходящегоСообщения + 10 + true + true + + true + + + Запись.FILEСжиматьФайлИсходящегоСообщения + + Right + + FILEСжиматьФайлИсходящегоСообщенияРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + FILEСжиматьФайлИсходящегоСообщенияКонтекстноеМеню + 11 + true + + CheckBoxField + Enter + true + Left + true + + + + ПроверитьПодключениеFILE + 42 + true + true + + true + + false + + ПроверитьПодключениеFILEРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + UsualButton + Form.Command.ПроверитьПодключениеFILE + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Обмен через сетевой каталог</value> + + + ru + Настройки транспорта FILE + + + НастройкиТранспортаFILEРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + НастройкиТранспортаFTP + 6 + + ГруппаСерверПорт + 37 + + FTPСоединениеПуть + 14 + true + true + + true + + + Запись.FTPСоединениеПуть + + + FTPСоединениеПутьРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + FTPСоединениеПутьКонтекстноеМеню + 15 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + FTPСоединениеПорт + 16 + true + true + + true + + + Запись.FTPСоединениеПорт + + + FTPСоединениеПортРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + FTPСоединениеПортКонтекстноеМеню + 17 + true + + InputField + true + Enter + true + Left + true + + true + true + true + + ru + ЧГ=0 + + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа сервер порт</value> + + + ru + Группа сервер порт + + + ГруппаСерверПортРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаПользовательПароль + 38 + + FTPСоединениеПользователь + 18 + true + true + + true + + + Запись.FTPСоединениеПользователь + + + FTPСоединениеПользовательРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + + FTPСоединениеПользовательКонтекстноеМеню + 19 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + FTPСоединениеПароль + 22 + true + true + + true + + + Запись.FTPСоединениеПароль + + + FTPСоединениеПарольРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + FTPСоединениеПарольКонтекстноеМеню + 23 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа пользователь пароль</value> + + + ru + Группа пользователь пароль + + + ГруппаПользовательПарольРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + FTPСоединениеМаксимальныйДопустимыйРазмерСообщения + 39 + true + true + + true + + + Запись.FTPСоединениеМаксимальныйДопустимыйРазмерСообщения + + + FTPСоединениеМаксимальныйДопустимыйРазмерСообщенияРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + FTPСоединениеМаксимальныйДопустимыйРазмерСообщенияКонтекстноеМеню + 40 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + FTPСоединениеПассивноеСоединение + 20 + true + true + + true + + + Запись.FTPСоединениеПассивноеСоединение + + Right + + FTPСоединениеПассивноеСоединениеРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + FTPСоединениеПассивноеСоединениеКонтекстноеМеню + 21 + true + + CheckBoxField + Enter + true + Left + true + + + + FTPСжиматьФайлИсходящегоСообщения + 12 + true + true + + true + + + Запись.FTPСжиматьФайлИсходящегоСообщения + + Right + + FTPСжиматьФайлИсходящегоСообщенияРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + + FTPСжиматьФайлИсходящегоСообщенияКонтекстноеМеню + 13 + true + + CheckBoxField + Enter + true + Left + true + + + + ПроверитьПодключениеFTP + 41 + true + true + + true + + false + + ПроверитьПодключениеFTPРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + UsualButton + Form.Command.ПроверитьПодключениеFTP + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Обмен через FTP</value> + + + ru + Настройки транспорта FILE + + + НастройкиТранспортаFTPРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + НастройкиТранспортаEMAIL + 7 + + EMAILУчетнаяЗапись + 30 + true + true + + true + + + Запись.EMAILУчетнаяЗапись + + + EMAILУчетнаяЗаписьРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + EMAILУчетнаяЗаписьКонтекстноеМеню + 31 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + EMAILМаксимальныйДопустимыйРазмерСообщения + 26 + true + true + + true + + + Запись.EMAILМаксимальныйДопустимыйРазмерСообщения + + + EMAILМаксимальныйДопустимыйРазмерСообщенияРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + EMAILМаксимальныйДопустимыйРазмерСообщенияКонтекстноеМеню + 27 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + EMAILСжиматьФайлИсходящегоСообщения + 28 + true + true + + true + + + Запись.EMAILСжиматьФайлИсходящегоСообщения + + Right + + EMAILСжиматьФайлИсходящегоСообщенияРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + EMAILСжиматьФайлИсходящегоСообщенияКонтекстноеМеню + 29 + true + + CheckBoxField + Enter + true + Left + true + + + + ПроверитьПодключениеEMAIL + 43 + true + true + + true + + false + + ПроверитьПодключениеEMAILРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + UsualButton + Form.Command.ПроверитьПодключениеEMAIL + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Обмен почтовыми сообщениями</value> + + + ru + Настройки транспорта FILE + + + НастройкиТранспортаEMAILРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + Page + + Vertical + auto + + + true + true + + true + + + <key>ru</key> + <value>Страницы видов транспорта</value> + + + ru + Страницы видов транспорта + + + СтраницыВидовТранспортаРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + + + + ОбщиеНастройки + 36 + + ПарольАрхиваСообщенияОбмена + 34 + true + true + + true + + + Запись.ПарольАрхиваСообщенияОбмена + + + ПарольАрхиваСообщенияОбменаРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + + ПарольАрхиваСообщенияОбменаКонтекстноеМеню + 35 + true + + InputField + Enter + true + Left + true + + 20 + true + true + false + true + true + true + true + true + Normal + + + + ИмяФайлаПротоколаОбмена + 32 + true + true + + true + + + Запись.ИмяФайлаПротоколаОбмена + + + ИмяФайлаПротоколаОбменаРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + ИмяФайлаПротоколаОбменаКонтекстноеМеню + 33 + true + + InputField + Enter + true + Left + true + + + StartChoice + ИмяФайлаПротоколаОбменаНачалоВыбора + + + Opening + ИмяФайлаПротоколаОбменаОткрытие + + true + true + true + true + true + true + true + true + Normal + + + + ВыполнятьОбменВРежимеОтладки + 45 + true + true + + true + + + Запись.ВыполнятьОбменВРежимеОтладки + + Right + + ВыполнятьОбменВРежимеОтладкиРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + + ВыполнятьОбменВРежимеОтладкиКонтекстноеМеню + 46 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Общие настройки</value> + + + ru + Общие настройки + + + ОбщиеНастройкиРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Запись + 1 + + InformationRegisterRecordManager.НастройкиТранспортаОбмена + + + true + + + true + +
    true
    + true +
    + + ПроверитьПодключениеFTP + + <key>ru</key> + <value>Проверить подключение</value> + + 1 + + ru + Проверить подключение через FTP ресурс + + + true + + + + ПроверитьПодключениеFTP + + + Auto + Auto + + + ПроверитьПодключениеFILE + + <key>ru</key> + <value>Проверить подключение</value> + + 2 + + ru + Проверить подключение по сетевому каталогу + + + true + + + + ПроверитьПодключениеFILE + + + Auto + Auto + + + ПроверитьПодключениеEMAIL + + <key>ru</key> + <value>Проверить подключение</value> + + 3 + + ru + Проверить подключение по электронной почте + + + true + + + + ПроверитьПодключениеEMAIL + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаЗаписи/Module.bsl new file mode 100644 index 000000000..7a4ca094f --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаЗаписи/Module.bsl @@ -0,0 +1,145 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Перем Узел; + + Если Параметры.ЗначенияЗаполнения.Свойство("Узел", Узел) + И ЗначениеЗаполнено(Узел) Тогда + + Элементы.ГруппаУзелИнформационнойБазы.Видимость = Ложь; + + КонецЕсли; + + УстановитьВидимостьЭлементовФормыПриИзмененииУзла(); + + Если ЗначениеЗаполнено(Запись.ВидТранспортаСообщенийОбменаПоУмолчанию) Тогда + + ИмяСтраницы = "НастройкиТранспорта[ВидТранспорта]"; + ИмяСтраницы = СтрЗаменить(ИмяСтраницы, "[ВидТранспорта]", ОбщегоНазначения.ИмяЗначенияПеречисления(Запись.ВидТранспортаСообщенийОбменаПоУмолчанию)); + + Если Элементы[ИмяСтраницы].Видимость Тогда + + Элементы.СтраницыВидовТранспорта.ТекущаяСтраница = Элементы[ИмяСтраницы]; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура УзелПриИзменении(Элемент) + + УстановитьВидимостьЭлементовФормыПриИзмененииУзла(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьПодключениеFILE(Команда) + + ПроверитьПодключение("FILE"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьПодключениеFTP(Команда) + + ПроверитьПодключение("FTP"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьПодключениеEMAIL(Команда) + + ПроверитьПодключение("EMAIL"); + +КонецПроцедуры + +&НаКлиенте +Процедура FILEКаталогОбменаИнформациейНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ОбменДаннымиКлиент.ОбработчикВыбораФайловогоКаталога(Запись, "FILEКаталогОбменаИнформацией", СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура FILEКаталогОбменаИнформациейОткрытие(Элемент, СтандартнаяОбработка) + + ОбменДаннымиКлиент.ОбработчикОткрытияФайлаИлиКаталога(Запись, "FILEКаталогОбменаИнформацией", СтандартнаяОбработка) + +КонецПроцедуры + +&НаКлиенте +Процедура ИмяФайлаПротоколаОбменаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ОбменДаннымиКлиент.ОбработчикВыбораФайла(Запись, "ИмяФайлаПротоколаОбмена", СтандартнаяОбработка, НСтр("ru = 'Текстовый документ(*.txt)|*.txt'"), Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ИмяФайлаПротоколаОбменаОткрытие(Элемент, СтандартнаяОбработка) + + ОбменДаннымиКлиент.ОбработчикОткрытияФайлаИлиКаталога(Запись, "ИмяФайлаПротоколаОбмена", СтандартнаяОбработка) + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ПроверитьПодключение(ВидТранспортаСтрокой) + + Отказ = Ложь; + + ПроверитьПодключениеНаСервере(Отказ, ВидТранспортаСтрокой); + + Если Отказ Тогда + Предупреждение(НСтр("ru = 'Ошибка установки подключения!'")); + Иначе + Предупреждение(НСтр("ru = 'Подключение успешно установлено!'")); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПроверитьПодключениеНаСервере(Отказ, ВидТранспортаСтрокой) + + ОбменДаннымиСервер.ПроверитьПодключениеОбработкиТранспортаСообщенийОбмена(Отказ, Запись, Перечисления.ВидыТранспортаСообщенийОбмена[ВидТранспортаСтрокой]); + +КонецПроцедуры + +&НаСервере +Процедура УстановитьВидимостьЭлементовФормыПриИзмененииУзла() + + ИспользуемыеТранспорты = Новый Массив; + + Если ЗначениеЗаполнено(Запись.Узел) Тогда + + ИспользуемыеТранспорты = ПланыОбмена[ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(Запись.Узел)].ИспользуемыеТранспортыСообщенийОбмена(); + + КонецЕсли; + + Элементы.НастройкиТранспортаFILE.Видимость = Ложь; + Элементы.НастройкиТранспортаFTP.Видимость = Ложь; + Элементы.НастройкиТранспортаEMAIL.Видимость = Ложь; + + Элементы.ВидТранспортаСообщенийОбменаПоУмолчанию.СписокВыбора.Очистить(); + + Для Каждого Элемент Из ИспользуемыеТранспорты Цикл + + ИмяЭлементаФормы = "НастройкиТранспорта[ВидТранспорта]"; + ИмяЭлементаФормы = СтрЗаменить(ИмяЭлементаФормы, "[ВидТранспорта]", ОбщегоНазначения.ИмяЗначенияПеречисления(Элемент)); + + Элементы[ИмяЭлементаФормы].Видимость = Истина; + + Элементы.ВидТранспортаСообщенийОбменаПоУмолчанию.СписокВыбора.Добавить(Элемент, Строка(Элемент)); + + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..09999c9f5 --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Forms/ФормаСписка/Form.form @@ -0,0 +1,232 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Узел + 4 + + <key>ru</key> + <value>Узел</value> + + true + true + + true + + + Список.Узел + + true + + УзелРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + УзелКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 7 + + СписокСтрокаПоискаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 8 + true + + Список + + true + + + + СписокСостояниеПросмотра + 10 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 11 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 13 + + СписокУправлениеПоискомРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 14 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + InformationRegister.НастройкиТранспортаОбмена + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Help/ru.html b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Help/ru.html new file mode 100644 index 000000000..815534a61 --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/Help/ru.html @@ -0,0 +1,7 @@ + +

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

    +

    Общими для всех являются следующие настройки:

    +
    • "Вид транспорта сообщений обмена по умолчанию" – поле для задания вида транспорта, который будет использоваться по умолчанию при выполнении автоматического и интерактивного обмена данными. +
    • "Пароль архива сообщения обмена" – поле для задания пароля для сжатия и распаковки архива сообщения обмена. Подразумевается, что пароль сжатия в базе источнике и пароль распаковки в базе приемнике должны быть одинаковыми для пары обменивающихся конфигураций. +
    • "Имя файла протокола обмена" – поле для задания файла протокола обмена. Если файл протокола обмена задан, то процесс обмена данными, возникающие события и ошибки обмена будут записываться в этот файл. +
    • "Выполнять обмен в режиме отладки" – флаг для задания режима отладки обмена. Если этот флаг установлен, то процесс обмена данными не будет остановлен при возникновении какой-либо ошибки. Обмен завершится до конца с выводом отладочных сообщений в файл протокола обмена и журнал регистрации. Этот режим рекомендуется использовать при отладке правил обмена.
    \ No newline at end of file diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/ManagerModule.bsl b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/ManagerModule.bsl new file mode 100644 index 000000000..1b6497fe3 --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/ManagerModule.bsl @@ -0,0 +1,207 @@ + +// Процедура добавляет запись в регистр по переданным значениям структуры +Процедура ДобавитьЗапись(СтруктураЗаписи) Экспорт + + ОбменДаннымиСервер.ДобавитьЗаписьВРегистрСведений(СтруктураЗаписи, "НастройкиТранспортаОбмена"); + +КонецПроцедуры + +// Процедура обновляет запись в регистре по переданным значениям структуры +Процедура ОбновитьЗапись(СтруктураЗаписи) Экспорт + + ОбменДаннымиСервер.ОбновитьЗаписьВРегистрСведений(СтруктураЗаписи, "НастройкиТранспортаОбмена"); + +КонецПроцедуры + +////////////////////////////////////////////////////////////// +// Функции получения значений настроек для узла плана обмена + +// Получает значения настроек транспорта определенного вида. +// Если вид транспорта не указан (ВидТранспортаОбмена = Неопределено), +// то получает настройки всех видов транспорта, заведенных в системе +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// +// +Функция ПолучитьНастройкиТранспортаДляУзла(Узел, ВидТранспортаОбмена = Неопределено) Экспорт + + СтруктураНастроек = Новый Структура; + + // общие настройки для всех видов транспорта + СтруктураНастроек.Вставить("ВидТранспортаСообщенийОбменаПоУмолчанию"); + СтруктураНастроек.Вставить("ПарольАрхиваСообщенияОбмена"); + СтруктураНастроек.Вставить("ИмяФайлаПротоколаОбмена"); + СтруктураНастроек.Вставить("ВыполнятьОбменВРежимеОтладки"); + + Если ВидТранспортаОбмена = Неопределено Тогда + + Для Каждого ВидТранспорта ИЗ Перечисления.ВидыТранспортаСообщенийОбмена Цикл + + СтруктураНастроекТранспорта = ПолучитьСтруктуруНастроек(ОбщегоНазначения.ИмяЗначенияПеречисления(ВидТранспорта)); + + СтруктураНастроек = ОбъединитьКоллекции(СтруктураНастроек, СтруктураНастроекТранспорта); + + КонецЦикла; + + Иначе + + СтруктураНастроекТранспорта = ПолучитьСтруктуруНастроек(ОбщегоНазначения.ИмяЗначенияПеречисления(ВидТранспортаОбмена)); + + СтруктураНастроек = ОбъединитьКоллекции(СтруктураНастроек, СтруктураНастроекТранспорта); + + КонецЕсли; + + Возврат ПолучитьДанныеРегистраПоСтруктуре(Узел, СтруктураНастроек); + +КонецФункции + +Функция ВидТранспортаСообщенийОбменаПоУмолчанию(УзелИнформационнойБазы) Экспорт + + // возвращаемое значение функции + ВидТранспортаСообщений = Неопределено; + + ТекстЗапроса = " + |ВЫБРАТЬ + | НастройкиТранспортаОбмена.ВидТранспортаСообщенийОбменаПоУмолчанию КАК ВидТранспортаСообщенийОбменаПоУмолчанию + |ИЗ + | РегистрСведений.НастройкиТранспортаОбмена КАК НастройкиТранспортаОбмена + |ГДЕ + | НастройкиТранспортаОбмена.Узел = &УзелИнформационнойБазы + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("УзелИнформационнойБазы", УзелИнформационнойБазы); + + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + + ВидТранспортаСообщений = Выборка.ВидТранспортаСообщенийОбменаПоУмолчанию; + + КонецЕсли; + + Возврат ВидТранспортаСообщений; +КонецФункции + +Функция ИмяКаталогаОбменаИнформацией(ВидТранспортаСообщенийОбмена, УзелИнформационнойБазы) Экспорт + + // возвращаемое значение функции + Результат = ""; + + Если ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FILE Тогда + + НастройкиТранспорта = РегистрыСведений.НастройкиТранспортаОбмена.ПолучитьНастройкиТранспортаДляУзла(УзелИнформационнойБазы); + + Результат = НастройкиТранспорта["FILEКаталогОбменаИнформацией"]; + + ИначеЕсли ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FTP Тогда + + НастройкиТранспорта = РегистрыСведений.НастройкиТранспортаОбмена.ПолучитьНастройкиТранспортаДляУзла(УзелИнформационнойБазы); + + Результат = "ftp://[FTPСоединениеПуть]/"; + Результат = СтрЗаменить(Результат, "[FTPСоединениеПуть]", НастройкиТранспорта["FTPСоединениеПуть"]); + + КонецЕсли; + + Возврат Результат; +КонецФункции + +////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции + +Функция ПолучитьДанныеРегистраПоСтруктуре(Узел, СтруктураНастроек) + + Если Не ЗначениеЗаполнено(Узел) Тогда + Возврат СтруктураНастроек; + КонецЕсли; + + Если СтруктураНастроек.Количество() = 0 Тогда + Возврат СтруктураНастроек; + КонецЕсли; + + // Формируем текст запроса только по необходимым полям - + // параметрам для указанного вида транспорта + ТекстЗапроса = "ВЫБРАТЬ "; + + Для Каждого ЭлементНастройки ИЗ СтруктураНастроек Цикл + + ТекстЗапроса = ТекстЗапроса + ЭлементНастройки.Ключ + ", "; + + КонецЦикла; + + // убираем последний символ ", " + СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(ТекстЗапроса, 2); + + ТекстЗапроса = ТекстЗапроса + " + |ИЗ + | РегистрСведений.НастройкиТранспортаОбмена КАК НастройкиТранспортаОбмена + |ГДЕ + | НастройкиТранспортаОбмена.Узел = &Узел + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Узел", Узел); + + Выборка = Запрос.Выполнить().Выбрать(); + + // Если есть данные для узла, то заполняем структуру + Если Выборка.Следующий() Тогда + + Для Каждого ЭлементНастройки ИЗ СтруктураНастроек Цикл + + СтруктураНастроек[ЭлементНастройки.Ключ] = Выборка[ЭлементНастройки.Ключ]; + + КонецЦикла; + + КонецЕсли; + + Возврат СтруктураНастроек; + +КонецФункции + +Функция ПолучитьСтруктуруНастроек(ПодстрокаПоиска) + + СтруктураНастроекТранспорта = Новый Структура(); + + МетаданныеРегистра = Метаданные.РегистрыСведений.НастройкиТранспортаОбмена; + + Для Каждого Ресурс ИЗ МетаданныеРегистра.Ресурсы Цикл + + Если Найти(Ресурс.Имя, ПодстрокаПоиска) <> 0 Тогда + + СтруктураНастроекТранспорта.Вставить(Ресурс.Имя, Ресурс.Синоним); + + КонецЕсли; + + КонецЦикла; + + Возврат СтруктураНастроекТранспорта; +КонецФункции + +Функция ОбъединитьКоллекции(Структура1, Структура2) + + СтруктураРезультат = Новый Структура; + + ДополнитьКоллекцию(Структура1, СтруктураРезультат); + ДополнитьКоллекцию(Структура2, СтруктураРезультат); + + Возврат СтруктураРезультат; +КонецФункции + +Процедура ДополнитьКоллекцию(Источник, Приемник) + + Для Каждого Элемент ИЗ Источник Цикл + + Приемник.Вставить(Элемент.Ключ, Элемент.Значение); + + КонецЦикла; + +КонецПроцедуры + + + diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/RecordSetModule.bsl b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/RecordSetModule.bsl new file mode 100644 index 000000000..c58540b12 --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/RecordSetModule.bsl @@ -0,0 +1,13 @@ + +Процедура ПередЗаписью(Отказ, Замещение) + + // объекты данного типа не должны мигрировать при обмене + ОбменДанными.Получатели.Очистить(); + +КонецПроцедуры + +Процедура ПриЗаписи(Отказ, Замещение) + + ОбновитьПовторноИспользуемыеЗначения(); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/НастройкиТранспортаОбмена.mdo b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/НастройкиТранспортаОбмена.mdo new file mode 100644 index 000000000..3971cec24 --- /dev/null +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбмена/НастройкиТранспортаОбмена.mdo @@ -0,0 +1,373 @@ + + + + + + + + + + + + НастройкиТранспортаОбмена + + ru + Настройки транспорта сообщений обмена + + InformationRegister.НастройкиТранспортаОбмена.Form.ФормаЗаписи + InformationRegister.НастройкиТранспортаОбмена.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + + + ru + + + Managed + + ru + Настройка транспорта для узла + + + ru + Настройки транспорта обмена данными + + + EMAILМаксимальныйДопустимыйРазмерСообщения + + ru + Допустимый размер вложения письма (0 – нет ограничений), КБт + + + Number + + 10 + true + + + + ru + Максимальный размер отправляемого файла сообщения обмена (Кб) + + + + Use + Use + + + + EMAILСжиматьФайлИсходящегоСообщения + + ru + Сжимать файл исходящего сообщения + + + Boolean + + + + Use + Use + + + + EMAILУчетнаяЗапись + + ru + Учетная запись электронной почты + + + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + + ru + Учетная запись для обмена + + + + Use + Use + + + + FILEКаталогОбменаИнформацией + + ru + Каталог обмена информацией + + + String + + + + + Use + Use + + + + FILEСжиматьФайлИсходящегоСообщения + + ru + Сжимать файл исходящего сообщения + + + Boolean + + + + Use + Use + + + + FTPСжиматьФайлИсходящегоСообщения + + ru + Сжимать файл исходящего сообщения + + + Boolean + + + + Use + Use + + + + FTPСоединениеМаксимальныйДопустимыйРазмерСообщения + + ru + Допустимый размер сообщения обмена (0 – нет ограничений), КБт + + + Number + + 10 + true + + + + ru + Максимальный размер отправляемого файла сообщения обмена (Кб) + + + + Use + Use + + + + FTPСоединениеПароль + + ru + Пароль + + + String + + + true + + + Use + + + + FTPСоединениеПассивноеСоединение + + ru + Пассивное соединение + + + Boolean + + + + Use + Use + + + + FTPСоединениеПользователь + + ru + Пользователь (логин) + + + String + + + + + Use + Use + + + + FTPСоединениеПорт + + ru + Порт + + + Number + + 5 + + + + + Use + Use + + + + FTPСоединениеПуть + + ru + Путь к каталогу + + + String + + + + + Use + Use + + + + ВидТранспортаСообщенийОбменаПоУмолчанию + + ru + Вид транспорта сообщений обмена по умолчанию + + + EnumRef.ВидыТранспортаСообщенийОбмена + + + + Use + Use + + + + ВыполнятьОбменВРежимеОтладки + + ru + Выполнять обмен в режиме отладки + + + Boolean + + + + Use + Use + + + + ИмяФайлаПротоколаОбмена + + ru + Имя файла протокола обмена + + + String + + 255 + + + + + Use + Use + + + + ПарольАрхиваСообщенияОбмена + + ru + Пароль архива сообщения обмена + + + String + + + + + Use + + + + Узел + + ru + Узел информационной базы + + + ExchangePlanRef + + + + ShowError + true + Use + Use + true + + true + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/НомераСканированныхФайлов/НомераСканированныхФайлов.mdo b/SSL/src/InformationRegisters/НомераСканированныхФайлов/НомераСканированныхФайлов.mdo new file mode 100644 index 000000000..d018c6798 --- /dev/null +++ b/SSL/src/InformationRegisters/НомераСканированныхФайлов/НомераСканированныхФайлов.mdo @@ -0,0 +1,88 @@ + + + + + + + + + + + + НомераСканированныхФайлов + + ru + Номера сканированных файлов + + InDialog + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + Номер + + ru + Номер + + + Number + + 9 + + + + + Use + Use + + + + Владелец + + ru + Владелец + + + CatalogRef.ПапкиФайлов + + + + Use + Use + true + + true + true + + diff --git a/SSL/src/InformationRegisters/ОтветыНаВопросыАнкет/ОтветыНаВопросыАнкет.mdo b/SSL/src/InformationRegisters/ОтветыНаВопросыАнкет/ОтветыНаВопросыАнкет.mdo new file mode 100644 index 000000000..414433ed2 --- /dev/null +++ b/SSL/src/InformationRegisters/ОтветыНаВопросыАнкет/ОтветыНаВопросыАнкет.mdo @@ -0,0 +1,152 @@ + + + + + + + + + + + + ОтветыНаВопросыАнкет + + ru + Ответы на вопросы анкет + + true + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + RecorderSubordinate + Managed + + Ответ + + ru + Ответ + + + Characteristic.ВопросыДляАнкетирования + + + + Use + Use + + + + ОткрытыйОтвет + + ru + Открытый ответ + + + String + + + + + Use + Use + + + + Анкета + + ru + Анкета + + + DocumentRef.Анкета + + + + Use + Use + + true + + + Вопрос + + ru + Вопрос + + + CatalogRef.ВопросыШаблонаАнкеты + + + + Use + Use + + true + + + ЭлементарныйВопрос + + ru + Элементарный вопрос + + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + + Use + Use + + true + + + НомерЯчейки + + ru + Номер ячейки + + + Number + + 10 + true + + + + + Use + Use + + true + + diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Form.form b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Form.form new file mode 100644 index 000000000..889d24e37 --- /dev/null +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Form.form @@ -0,0 +1,403 @@ + + + + <key>ru</key> + <value>Как открыть макет?</value> + + + Группа + 8 + + КакОткрывать + 1 + + <key>ru</key> + <value>Выберите режим открытия макета</value> + + true + true + + true + + + КакОткрывать + + Top + + КакОткрыватьРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + КакОткрыватьКонтекстноеМеню + 2 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Только для просмотра + + + 0 + + + + + ru + Для редактирования + + + 1 + + + Vertical + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаИнформация + 13 + + ДекорацияКартинка + 11 + true + true + + true + + + ДекорацияКартинкаРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ДекорацияКартинкаКонтекстноеМеню + 12 + true + + 2 + true + 2 + true + false + + + CommonPicture.Информация + + + + + ДекорацияНадпись + 14 + + <key>ru</key> + <value>Совет - для редактирования макета удобно использовать кнопку F4.</value> + + true + true + + true + + + ДекорацияНадписьРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ДекорацияНадписьКонтекстноеМеню + 15 + true + + Label + true + 2 + true + false + + Left + + + true + true + + true + + + ru + Группа информация + + + ГруппаИнформацияРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + UsualGroup + + Auto + StrongSeparation + true + true + Auto + Auto + + + + БольшеНеСпрашивать + 6 + true + true + + true + + + БольшеНеСпрашивать + + Right + + БольшеНеСпрашиватьРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + БольшеНеСпрашиватьКонтекстноеМеню + 7 + true + + CheckBoxField + Enter + true + Left + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ОК + 16 + true + true + + true + + false + + ОКРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 4 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 5 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + 43 + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + КакОткрывать + + <key>ru</key> + <value>Как открывать</value> + + 1 + + Number + + 10 + + + + true + + + true + + + + БольшеНеСпрашивать + + <key>ru</key> + <value>Больше не спрашивать</value> + + 2 + + Boolean + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + БольшеНеСпрашивать + + Boolean + + + + + + + diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Help/ru.html b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Help/ru.html new file mode 100644 index 000000000..bc062ebf3 --- /dev/null +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Help/ru.html @@ -0,0 +1,10 @@ + +

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

    +
    • клавишу Enter  +
    • двойной щелчок левой кнопкой мыши +
    • команду "Открыть"

     

    +

    Варианты открытия макета:

    +

    + + +
    Только для просмотраМакет не будет помечен как занятый Вами для редактирования и откроется внешним приложением в режиме "только просмотр"
    Для редактированияМакет будет помечен как занятый Вами для редактирования и откроется внешним приложением с возможностью внесения и сохранения изменений

     

    \ No newline at end of file diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Module.bsl b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Module.bsl new file mode 100644 index 000000000..9808c1f05 --- /dev/null +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Module.bsl @@ -0,0 +1,47 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Значение = ХранилищеОбщихНастроек.Загрузить("НастройкаОткрытияМакетов", "СпрашиватьРежимОткрытияМакета"); + + Если Значение = Неопределено Тогда + БольшеНеСпрашивать = Ложь; + Иначе + БольшеНеСпрашивать = НЕ Значение; + КонецЕсли; + + Значение = ХранилищеОбщихНастроек.Загрузить("НастройкаОткрытияМакетов", "РежимОткрытияМакетаПросмотр"); + + Если Значение = Неопределено Тогда + КакОткрывать = 0; + Иначе + Если Значение Тогда + КакОткрывать = 0; + Иначе + КакОткрывать = 1; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + + СпрашиватьРежимОткрытияМакета = НЕ БольшеНеСпрашивать; + РежимОткрытияМакетаПросмотр = ?(КакОткрывать = 0, Истина, Ложь); + + СохранитьНастройкиРежимаОткрытияМакета(СпрашиватьРежимОткрытияМакета, РежимОткрытияМакетаПросмотр); + + Закрыть(Новый Структура("БольшеНеСпрашивать, РежимОткрытияПросмотр", + БольшеНеСпрашивать, + РежимОткрытияМакетаПросмотр) ); + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура СохранитьНастройкиРежимаОткрытияМакета(СпрашиватьРежимОткрытияМакета, РежимОткрытияМакетаПросмотр) + + ХранилищеОбщихНастроек.Сохранить("НастройкаОткрытияМакетов", "СпрашиватьРежимОткрытияМакета", СпрашиватьРежимОткрытияМакета); + ХранилищеОбщихНастроек.Сохранить("НастройкаОткрытияМакетов", "РежимОткрытияМакетаПросмотр", РежимОткрытияМакетаПросмотр); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ДиалогПовтораПечати/Form.form b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ДиалогПовтораПечати/Form.form new file mode 100644 index 000000000..05dd116c7 --- /dev/null +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ДиалогПовтораПечати/Form.form @@ -0,0 +1,245 @@ + + + + <key>ru</key> + <value>Ошибка печати</value> + + + Сообщение + 1 + + <key>ru</key> + <value>Не удалось получить файл макета печатной формы на диск:</value> + + true + true + + true + + + СообщениеРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СообщениеКонтекстноеМеню + 2 + true + + Label + true + true + false + + Left + + + + ИзменитьРабочийКаталогПечати + 3 + true + true + + true + + false + + ИзменитьРабочийКаталогПечатиРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + Hyperlink + Form.Command.ИзменитьРабочийКаталогПечати + Normal + Auto + true + true + UserCmds + Auto + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ПовторитьПечать + 4 + true + true + + true + + false + + ПовторитьПечатьРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + Form.Command.ПовторитьПечать + Auto + true + true + true + UserCmds + Auto + + + Отмена + 5 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 6 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + 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 + + + СообщениеОбОшибке + + String + + + + + + + + diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ДиалогПовтораПечати/Module.bsl b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ДиалогПовтораПечати/Module.bsl new file mode 100644 index 000000000..eaaedacf7 --- /dev/null +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ДиалогПовтораПечати/Module.bsl @@ -0,0 +1,24 @@ + +&НаКлиенте +Процедура ИзменитьРабочийКаталогПечати(Команда) + + Результат = ОткрытьФормуМодально("РегистрСведений.ПользовательскиеМакетыПечати.Форма.НастройкаКаталогаФайловПечати"); + + Если ТипЗнч(Результат) = Тип("Строка") Тогда + КаталогДляСохраненияДанныхПечати = Результат; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПовторитьПечать(Команда) + Закрыть(КаталогДляСохраненияДанныхПечати); +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + КаталогДляСохраненияДанныхПечати = УправлениеПечатью.ПолучитьЛокальныйКаталогФайловПечати(); + Элементы.Сообщение.Заголовок = Элементы.Сообщение.Заголовок + Символы.ПС + Параметры.СообщениеОбОшибке; + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/ConditionalAppearance.dcssca b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/ConditionalAppearance.dcssca new file mode 100644 index 000000000..89d7e43b8 --- /dev/null +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/ConditionalAppearance.dcssca @@ -0,0 +1,23 @@ + + + + + + СписокМакетовПредставление + + + + + СписокМакетов.Редактируется + Equal + true + + + + + Шрифт + + + + + diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Form.form b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Form.form new file mode 100644 index 000000000..8beb027e1 --- /dev/null +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Form.form @@ -0,0 +1,1154 @@ + + + + СписокМакетов + 1 + true + true + + true + + + СписокМакетов + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + SelectAll + SortListAsc + SortListDesc + + СписокМакетовПредставление + 22 + + <key>ru</key> + <value>Печатная форма</value> + + true + true + + true + + + СписокМакетов.Представление + + + СписокМакетовПредставлениеРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + + СписокМакетовПредставлениеКонтекстноеМеню + 23 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + Normal + + + + ГруппаИспользованиеМакета + 37 + + СписокМакетовЕстьПользовательскийМакет + 31 + + <key>ru</key> + <value>Есть пользовательский макет</value> + + true + true + + true + + + СписокМакетов.ЕстьПользовательскийМакет + + + СписокМакетовЕстьПользовательскийМакетРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + + СписокМакетовЕстьПользовательскийМакетКонтекстноеМеню + 32 + true + + CheckBoxField + true + Center + Auto + true + Left + true + + + + СписокМакетовИспользованиеСтрока + 43 + true + true + + true + + + СписокМакетов.ИспользованиеСтрока + + + СписокМакетовИспользованиеСтрокаРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + + СписокМакетовИспользованиеСтрокаКонтекстноеМеню + 44 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа использование макета</value> + + + ru + Группа использование макета + + + ГруппаИспользованиеМакетаРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + ColumnGroup + + auto + true + + + + СписокМакетовКоманднаяПанель + 3 + + СписокМакетовОткрытьДляПросмотра + 26 + true + true + + true + + false + + СписокМакетовОткрытьДляПросмотраРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + Form.Command.ОткрытьДляПросмотра + Normal + PictureAndText + true + true + UserCmds + Auto + + + Группа + 33 + + СписокМакетовРедактировать + 29 + true + true + + true + + false + + СписокМакетовРедактироватьРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + Form.Command.Редактировать + Normal + Auto + true + true + UserCmds + Auto + + + СписокМакетовЗавершитьРедактирование + 28 + true + true + + true + + false + + СписокМакетовЗавершитьРедактированиеРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + Form.Command.ЗавершитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + + СписокМакетовОтменитьРедактирование + 27 + true + true + + true + + false + + СписокМакетовОтменитьРедактированиеРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + Form.Command.ОтменитьРедактирование + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + + + СписокМакетовИспользоватьПользовательскийМакет + 24 + true + true + + true + + false + + СписокМакетовИспользоватьПользовательскийМакетРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + Form.Command.ИспользоватьПользовательскийМакет + Normal + Auto + true + true + UserCmds + Auto + + + СписокМакетовИспользоватьПоставляемыйМакет + 25 + true + true + + true + + false + + СписокМакетовИспользоватьПоставляемыйМакетРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + Form.Command.ИспользоватьПоставляемыйМакет + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаДополнительно + 34 + + СписокМакетовУдалитьИЗИБ + 30 + true + true + + true + + false + + СписокМакетовУдалитьИЗИБРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + Form.Command.УдалитьИЗИБ + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа дополнительно</value> + + + ru + Группа дополнительно + + + ГруппаДополнительноРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + + + НастройкиРежимаОткрытияМакета + 40 + true + true + + true + + false + + НастройкиРежимаОткрытияМакетаРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + Form.Command.ЗадатьДействиеПриВыбореМакетаПечатнойФормы + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + Selection + СписокМакетовВыбор + + + OnActivateRow + СписокМакетовПриАктивизацииСтроки + + + СписокМакетовСтрокаПоиска + 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 + + + + СписокМакетовРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + СписокМакетовКонтекстноеМеню + 2 + + КонтекстноеМенюСписокМакетовИспользоватьПользовательскийМакет + 41 + true + true + + true + + false + + КонтекстноеМенюСписокМакетовИспользоватьПользовательскийМакетРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + Form.Command.ИспользоватьПользовательскийМакет + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокМакетовИспользоватьПоставляемыйМакет + 42 + true + true + + true + + false + + КонтекстноеМенюСписокМакетовИспользоватьПоставляемыйМакетРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.Command.ИспользоватьПоставляемыйМакет + Normal + Auto + true + true + UserCmds + Auto + + true + + Tree + true + true + 70 + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + + СписокМакетов.Картинка + + + CommonPicture.ТипыМакетов + + None + None + None + true +
    + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + СписокМакетов + + <key>ru</key> + <value>Список макетов</value> + + 1 + + ValueTree + + + true + + + true + + + ИмяМакета + + <key>ru</key> + <value>Имя макета</value> + + 1 + + String + + + + true + + + true + + + + Использование + + <key>ru</key> + <value>Использование</value> + + 3 + + Boolean + + + true + + + true + + + + ТипМакета + + <key>ru</key> + <value>Тип макета</value> + + 4 + + String + + 3 + + + + true + + + true + + + + ЕстьПользовательскийМакет + + <key>ru</key> + <value>Пользовательский макет</value> + + 5 + + Boolean + + + true + + + true + + + + Редактируется + + <key>ru</key> + <value>Редактируется</value> + + 6 + + Boolean + + + true + + + true + + + + ПутьКФайлуМакета + + <key>ru</key> + <value>Путь к файлу макета</value> + + 7 + + String + + + + true + + + true + + + + Картинка + + <key>ru</key> + <value>Картинка</value> + + 8 + + Number + + 1 + true + + + + true + + + true + + + + ПолноеИмяОМ + + <key>ru</key> + <value>Полное имя ОМ</value> + + 9 + + String + + + + true + + + true + + + + ЭтоКлассификатор + + <key>ru</key> + <value>Это классификатор</value> + + 10 + + Boolean + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Представление</value> + + 2 + + String + + + + true + + + true + + + + ИспользованиеСтрока + + <key>ru</key> + <value>Использование</value> + + 11 + + String + + + + true + + + true + + + + + Отбор + + <key>ru</key> + <value>Отбор</value> + + 2 + + String + + + + true + + + true + + + + ПутьККаталогуФайловПечати + + <key>ru</key> + <value>Путь к каталогу файлов печати</value> + + 3 + + String + + + + true + + + true + + + + СпрашиватьРежимОткрытияМакета + + <key>ru</key> + <value>Спрашивать режим открытия макета</value> + + 4 + + Boolean + + + true + + + true + + + + РежимОткрытияМакетаПросмотр + + <key>ru</key> + <value>Режим открытия макета просмотр</value> + + 5 + + Boolean + + + true + + + true + + + + Редактировать + + <key>ru</key> + <value>Редактировать</value> + + 1 + + ru + Редактировать + + + true + + F4 + + CommonPicture.РедактироватьМакет + + + + Редактировать + + + TextPicture + Auto + Auto + + + ЗавершитьРедактирование + + <key>ru</key> + <value>Завершить редактирование</value> + + 4 + + ru + Завершить редактирование и поместить измененный макет в информационную базу + + + true + + + CommonPicture.ЗавершитьРедактированиеМакета + + + + ЗавершитьРедактирование + + + TextPicture + Auto + Auto + + + ОтменитьРедактирование + + <key>ru</key> + <value>Отменить редактирование</value> + + 3 + + ru + Отменить редактирование макета + + + true + + + CommonPicture.ОтменитьРедактированиеМакета + + + + ОтменитьРедактирование + + + Auto + Auto + + + ОткрытьДляПросмотра + + <key>ru</key> + <value>Открыть</value> + + 6 + + ru + Открыть используемый макет для просмотра + + + true + + + CommonPicture.ОткрытьМакет + + + + ОткрытьДляПросмотра + + + Auto + Auto + + + УдалитьИЗИБ + + <key>ru</key> + <value>Удалить пользовательский макет</value> + + 7 + + ru + Удалить пользовательский макет из информационной базы + + + true + + + CommonPicture.УдалитьПользовательскийМакет + + + + УдалитьИЗИБ + + + TextPicture + Auto + Auto + + + ИспользоватьПользовательскийМакет + + <key>ru</key> + <value>Использовать пользовательский макет</value> + + 8 + + ru + Использовать пользовательский макет + + + true + + + CommonPicture.ИспользоватьПользовательскийМакет + + + + ИспользоватьПользовательскийМакет + + + Auto + Auto + + + ИспользоватьПоставляемыйМакет + + <key>ru</key> + <value>Использовать поставляемый макет</value> + + 9 + + ru + Использовать поставляемый макет + + + true + + + CommonPicture.ИспользоватьПоставляемыйМакет + + + + ИспользоватьПоставляемыйМакет + + + Auto + Auto + + + ЗадатьДействиеПриВыбореМакетаПечатнойФормы + + <key>ru</key> + <value>Задать действие при выборе макета печатной формы...</value> + + 2 + + ru + Задать действие при выборе макета печатной формы + + + true + + + + ЗадатьДействиеПриВыбореМакетаПечатнойФормы + + + Auto + Auto + + + + + +
    diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Module.bsl b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Module.bsl new file mode 100644 index 000000000..19cf2319e --- /dev/null +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Module.bsl @@ -0,0 +1,910 @@ +&НаСервереБезКонтекста +Процедура ЗаполнитьДеревоПоКоллекцииМетаданных(СписокМакетовДерево, + КоллекцияМетаданных, + знач КоллекцияМакетов, + Фильтр = Неопределено) + + Если КоллекцияМакетов Тогда + ДобавитьКоллекциюМакетов(КоллекцияМетаданных, + СписокМакетовДерево, + "ОбщийМакет", + "Общие макеты", + Фильтр); + Иначе + Для Каждого ЭлементОбъектМД Из КоллекцияМетаданных Цикл + ДобавитьКоллекциюМакетов(ЭлементОбъектМД.Макеты, + СписокМакетовДерево, + ЭлементОбъектМД.ПолноеИмя(), + ЭлементОбъектМД.Синоним, + Фильтр); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ДобавитьКоллекциюМакетов(Макеты, СписокМакетовДерево, ПолноеИмя, Представление, Фильтр) + + Перем ТипМакета; + + Если ЗначениеЗаполнено(Фильтр) И Врег(ПолноеИмя) <> ВРег(Фильтр) Тогда + Возврат; + КонецЕсли; + + ПервыйМакетПФ = Истина; + + Для Каждого ЭлементМакет Из Макеты Цикл + Если ЭтоПечатнаяФорма(ЭлементМакет.Имя, ТипМакета) Тогда + Если ПервыйМакетПФ Тогда + НоваяСтрокаОМ = СписокМакетовДерево.Строки.Добавить(); + НоваяСтрокаОМ.ЭтоКлассификатор = Истина; + НоваяСтрокаОМ.ПолноеИмяОМ = ПолноеИмя; + НоваяСтрокаОМ.Представление = Представление; + НоваяСтрокаОМ.Картинка = ПолучитьКодКартинки(ПолноеИмя); + ПервыйМакетПФ = Ложь; + КонецЕсли; + НоваяСтрокаМакет = НоваяСтрокаОМ.Строки.Добавить(); + НоваяСтрокаМакет.ИмяМакета = ЭлементМакет.Имя; + НоваяСтрокаМакет.Представление = ЭлементМакет.Синоним; + НоваяСтрокаМакет.ТипМакета = ТипМакета; + НоваяСтрокаМакет.Использование = Ложь; + НоваяСтрокаМакет.ИспользованиеСтрока = ПолучитьТекстПоИспользованию(НоваяСтрокаМакет.Использование); + НоваяСтрокаМакет.ЕстьПользовательскийМакет = Ложь; + НоваяСтрокаМакет.ЭтоКлассификатор = Ложь; + НоваяСтрокаМакет.Картинка = ПолучитьКодКартинки(ТипМакета); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Проверяет каждый объект метаданных - документ на печатные формы подсистем +// (по префиксу ПФ_<тип печатной формы>) далее заполняет список выбора на форме +// +&НаСервере +Процедура ЗаполнитьСписокМетаданных(Фильтр = Неопределено) + + СписокМакетовДерево = РеквизитФормыВЗначение("СписокМакетов"); + + ЗаполнитьДеревоПоКоллекцииМетаданных(СписокМакетовДерево, Метаданные.Документы, Ложь, Фильтр); + ЗаполнитьДеревоПоКоллекцииМетаданных(СписокМакетовДерево, Метаданные.Обработки, Ложь); + ЗаполнитьДеревоПоКоллекцииМетаданных(СписокМакетовДерево, Метаданные.ОбщиеМакеты, Истина); + + Если СписокМакетовДерево.Строки.Количество() > 0 Тогда + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ Объект, ИмяМакета, Использование + |ИЗ + | РегистрСведений.ПользовательскиеМакетыПечати"; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + СтрокаДерева = СписокМакетовДерево.Строки.Найти(Выборка.Объект, "ПолноеИмяОМ"); + Если СтрокаДерева = Неопределено Тогда + Продолжить; + КонецЕсли; + СтрокаОписанияМакета = СтрокаДерева.Строки.Найти(Выборка.ИмяМакета, "ИмяМакета"); + Если СтрокаОписанияМакета <> Неопределено Тогда + СтрокаОписанияМакета.ЕстьПользовательскийМакет = Истина; + СтрокаОписанияМакета.Использование = Выборка.Использование; + СтрокаОписанияМакета.ИспользованиеСтрока = ПолучитьТекстПоИспользованию(СтрокаОписанияМакета.Использование); + СтрокаОписанияМакета.Картинка = ПолучитьКодКартинки(СтрокаОписанияМакета.ТипМакета) + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ЗначениеВРеквизитФормы(СписокМакетовДерево, "СписокМакетов"); + +КонецПроцедуры // ЗаполнитьСписокМетаданных() + +// Проверяет по переданному наименованию макета (из метаданных), что это печатная форма +// +&НаСервереБезКонтекста +Функция ЭтоПечатнаяФорма(ИмяМакета, ТипМакета = "") + + Позиция = Найти(ИмяМакета, "ПФ_DOC"); + Позиция = ?(Позиция = 0, Найти(ИмяМакета, "ПФ_ODT"), Позиция); + Позиция = ?(Позиция = 0, Найти(ИмяМакета, "ПФ_MXL"), Позиция); + + Если Позиция = 0 Тогда + Возврат Ложь; + Иначе + ТипМакета = Сред(ИмяМакета, Позиция + 3, 3); + Возврат Истина; + КонецЕсли; + +КонецФункции + +// Процедура используется для установления доступности кнопок формы, +// в зависимости от выбранных данных +// +&НаКлиенте +Процедура ОбновитьЭлементыУправления() + + ВыделенныеСтроки = Элементы.СписокМакетов.ВыделенныеСтроки; + + ВсеНеРедактируемые = Истина; + ВсеРедактируемые = Истина; + ВсеСНеИспользуемымИНеРедактируемымПМ = Истина; + ЕстьСНеИспользуемымПМ = Ложь; + ЕстьСИспользуемымПМ = Ложь; + ЕстьВыделенныеЭлементы = Ложь; + + Для Каждого Строка Из ВыделенныеСтроки Цикл + ЭлементДерева = Элементы.СписокМакетов.ДанныеСтроки(Строка); + + Если ЭлементДерева.ЭтоКлассификатор Тогда + Продолжить; + КонецЕсли; + + ЕстьВыделенныеЭлементы = Истина; + + Если ЭлементДерева.Редактируется Тогда + ВсеНеРедактируемые = Ложь; + Иначе + ВсеРедактируемые = Ложь; + КонецЕсли; + + Если ЭлементДерева.ЕстьПользовательскийМакет Тогда + Если ЭлементДерева.Использование Тогда + ЕстьСИспользуемымПМ = Истина; + ВсеСНеИспользуемымИНеРедактируемымПМ = Ложь; + Иначе + ЕстьСНеИспользуемымПМ = Истина; + Если ЭлементДерева.Редактируется Тогда + ВсеСНеИспользуемымИНеРедактируемымПМ = Ложь; + КонецЕсли; + КонецЕсли; + Иначе + ВсеСНеИспользуемымИНеРедактируемымПМ = Ложь; + КонецЕсли; + + КонецЦикла; + + Если ЕстьВыделенныеЭлементы Тогда + // запрещающая политика - закрываем доступность команды если хотя бы один выделенный объект не подходит + // все не редактируемые + ОткрытьДляПросмотра = ВсеНеРедактируемые; + // все редактируемые + ЗавершитьРедактирование = ВсеРедактируемые; + ОтменитьРедактирование = ВсеРедактируемые; + // у всех есть пользовательский макет, который не редактируется и не используется + УдалитьИЗИБ = ВсеСНеИспользуемымИНеРедактируемымПМ; + // разрешающая политика - открываем доступность команды если хотя бы один выделенный объект подходит + // хотя бы один у которого есть пользовательский макет и он не используется + ИспользоватьПользовательскийМакет = ЕстьСНеИспользуемымПМ; + // хотя бы один у которого есть пользовательский макет и используется + ИспользоватьПоставляемыйМакет = ЕстьСИспользуемымПМ; + Иначе + ОткрытьДляПросмотра = Ложь; + ЗавершитьРедактирование = Ложь; + ОтменитьРедактирование = Ложь; + УдалитьИЗИБ = Ложь; + ИспользоватьПользовательскийМакет = Ложь; + ИспользоватьПоставляемыйМакет = Ложь; + КонецЕсли; + + Элементы.СписокМакетовОткрытьДляПросмотра.Доступность = ОткрытьДляПросмотра; + Элементы.СписокМакетовЗавершитьРедактирование.Доступность = ЗавершитьРедактирование; + Элементы.СписокМакетовОтменитьРедактирование.Доступность = ОтменитьРедактирование; + Элементы.СписокМакетовУдалитьИЗИБ.Доступность = УдалитьИЗИБ; + + Элементы.СписокМакетовИспользоватьПользовательскийМакет.Доступность = ИспользоватьПользовательскийМакет; + Элементы.СписокМакетовИспользоватьПоставляемыйМакет.Доступность = ИспользоватьПоставляемыйМакет; + + Элементы.КонтекстноеМенюСписокМакетовИспользоватьПользовательскийМакет.Доступность = ИспользоватьПользовательскийМакет; + Элементы.КонтекстноеМенюСписокМакетовИспользоватьПоставляемыйМакет.Доступность = ИспользоватьПоставляемыйМакет; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ УПРАВЛЕНИЯ МАКЕТАМИ // +//////////////////////////////////////////////////////////////////////////////// + +&НаКлиентеНаСервереБезКонтекста +Функция ПолучитьТекстПоИспользованию(знач Использование) + + Если Использование Тогда + Возврат НСтр("ru = 'Измененный макет'"); + Иначе + Возврат НСтр("ru = 'Поставляемый макет'"); + КонецЕсли; + +КонецФункции + +&НаСервереБезКонтекста +Функция ПолучитьДвоичныеДанныеМакетов(ПутиКМакетам) + + СоотвДвоичныеДанные = Новый Соответствие; + + Для Каждого ПутьКМакету Из ПутиКМакетам Цикл + Данные = УправлениеПечатью.ПолучитьМакет(ПутьКМакету.Значение + "." + ПутьКМакету.Ключ); + Если ТипЗнч(Данные) = Тип("ТабличныйДокумент") Тогда + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); + Данные.Записать(ИмяВременногоФайла); + Данные = Новый ДвоичныеДанные(ИмяВременногоФайла); + УдалитьФайлы(ИмяВременногоФайла); + КонецЕсли; + СоотвДвоичныеДанные.Вставить( + ПутьКМакету.Ключ, + Данные); + КонецЦикла; + + Возврат СоотвДвоичныеДанные; + +КонецФункции + +&НаКлиенте +Функция СохранитьМакетПечатнойФормыНаДиск(ДвоичныеДанныеМакета, ТипМакета) +#Если Не ВебКлиент Тогда + + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(ТипМакета); + ДвоичныеДанныеМакета.Записать(ИмяВременногоФайла); + + Возврат ИмяВременногоФайла; + +#КонецЕсли +КонецФункции + +&НаКлиенте +Функция ПолучитьМакетПечатнойФормыСДиска(знач ПутьКМакетуНаДиске, знач НаименованиеОМ, знач ИмяМакета) +#Если Не ВебКлиент Тогда + ТабличныйДокумент = Неопределено; + + Файл = Новый Файл(ПутьКМакетуНаДиске); + + Если Файл.Существует() Тогда + + ДвоичныеДанныеТабДок = Новый ДвоичныеДанные(ПутьКМакетуНаДиске); + + ТабличныйДокумент = ПолучитьТабличныйДокументИзДвоичныхДанных(ДвоичныеДанныеТабДок); + + КонецЕсли; + + Если ТабличныйДокумент = Неопределено Тогда + ТабличныйДокумент = ПолучитьМакетПечатнойФормы(НаименованиеОМ, ИмяМакета); + КонецЕсли; + + Возврат ТабличныйДокумент; +#КонецЕсли +КонецФункции + +&НаСервереБезКонтекста +Функция ПолучитьТабличныйДокументИзДвоичныхДанных(ДвоичныеДанные) + + ИмяФайла = ПолучитьИмяВременногоФайла("mxl"); + + ДвоичныеДанные.Записать(ИмяФайла); + + ТабличныйДокумент = Новый ТабличныйДокумент; + + ТабличныйДокумент.Прочитать(ИмяФайла); + + УдалитьФайлы(ИмяФайла); + + Возврат ТабличныйДокумент; + +КонецФункции + +&НаСервереБезКонтекста +Процедура УстановитьИспользованиеМакета(УстанавливаемыеМакеты, Использование) + + Для Каждого Макет Из УстанавливаемыеМакеты Цикл + Запись = РегистрыСведений.ПользовательскиеМакетыПечати.СоздатьМенеджерЗаписи(); + Запись.Объект = Макет.ИмяОМ; + Запись.ИмяМакета = Макет.ИмяМакета; + Запись.Прочитать(); + Если НЕ ПустаяСтрока(Запись.Объект) Тогда + Запись.Использование = Использование; + Запись.Записать(); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьМакетПечатнойФормы(знач НаименованиеОМ, знач ИмяМакета) + + Возврат УправлениеПечатью.ПолучитьМакет(НаименованиеОМ+"."+ИмяМакета); + +КонецФункции + +&НаСервереБезКонтекста +Процедура СохранитьМакетыВИнформационнойБазе(знач СохраняемыеМакеты, знач ПомещенныеФайлы = Неопределено) + + Для Каждого СохраняемыйМакет Из СохраняемыеМакеты Цикл + + Запись = РегистрыСведений.ПользовательскиеМакетыПечати.СоздатьМенеджерЗаписи(); + + Запись.Объект = СохраняемыйМакет.ИмяОМ; + Запись.ИмяМакета = СохраняемыйМакет.ИмяМакета; + Запись.Использование = Истина; + + Если ПомещенныеФайлы <> Неопределено Тогда + Значение = ПолучитьДвоичныеДанныеПолученногоФайлаПоИмениМакета(СохраняемыйМакет.ИмяМакета, ПомещенныеФайлы); + Запись.Макет = Новый ХранилищеЗначения(Значение, Новый СжатиеДанных(9)); + Иначе + Запись.Макет = Новый ХранилищеЗначения(СохраняемыйМакет.ДанныеМакета, Новый СжатиеДанных(9)); + КонецЕсли; + + Запись.Записать(); + + КонецЦикла; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьДвоичныеДанныеПолученногоФайлаПоИмениМакета(ИмяМакета, ПомещенныеФайлы) + + Для Каждого ОписаниеПередаваемогоФайла ИЗ ПомещенныеФайлы Цикл + ИмяФайла = ОписаниеПередаваемогоФайла.Имя; + ИмяФайла = Лев(ИмяФайла, СтрДлина(ИмяФайла) - 4); + Пока Найти(ИмяФайла, "\") <> 0 Цикл + Позиция = Найти(ИмяФайла, "\"); + ИмяФайла = Прав(ИмяФайла, СтрДлина(ИмяФайла) - Позиция); + КонецЦикла; + Если ВРег(ИмяФайла) = ВРег(ИмяМакета) Тогда + Возврат ПолучитьИзВременногоХранилища(ОписаниеПередаваемогоФайла.Хранение); + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +// Удаляет пользовательский макет из информационной базы +// +&НаСервереБезКонтекста +Процедура УдалитьМакетИзИнформационнойБазы(УдаляемыеМакеты) + + Для Каждого УдаляемыйМакет Из УдаляемыеМакеты Цикл + МенеджерЗаписи = РегистрыСведений.ПользовательскиеМакетыПечати.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Объект = УдаляемыйМакет.ПолноеИмяОМ; + МенеджерЗаписи.ИмяМакета = УдаляемыйМакет.ИмяМакета; + МенеджерЗаписи.Удалить(); + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьМакетыПечатнойФормы(знач Редактировать = Ложь) + + Если НЕ ПредложитьУстановкуРасширенияРаботыСФайлами() Тогда + Возврат; + КонецЕсли; + + ВыделенныеСтроки = Элементы.СписокМакетов.ВыделенныеСтроки; + +#Если ВебКлиент Тогда + ПутиКМакетам = Новый Соответствие; + ТипыМакетов = Новый Соответствие; + Для Каждого Строка Из ВыделенныеСтроки Цикл + + ЭлементДерева = Элементы.СписокМакетов.ДанныеСтроки(Строка); + + Если ЭлементДерева.ЭтоКлассификатор Тогда + Продолжить; + КонецЕсли; + + Если ЭлементДерева.Редактируется Тогда + Продолжить; + КонецЕсли; + + ПутиКМакетам.Вставить(ЭлементДерева.ИмяМакета, ЭлементДерева.ПолучитьРодителя().ПолноеИмяОМ); + ТипыМакетов.Вставить(ЭлементДерева.ИмяМакета, ЭлементДерева.ТипМакета); + КонецЦикла; + НаборДвоичныхДанных = ПолучитьДвоичныеДанныеМакетов(ПутиКМакетам); + + ПриведенныйНаборДвоичныхДанных = Новый Соответствие; + + Для Каждого ТипМакета Из ТипыМакетов Цикл + ПриведенныйНаборДвоичныхДанных.Вставить(ТипМакета.Ключ+"."+ТипМакета.Значение, НаборДвоичныхДанных[ТипМакета.Ключ]); + КонецЦикла; + + Результат = УправлениеПечатьюКлиент.ПолучитьФайлыВКаталогФайловПечати(ПутьККаталогуФайловПечати, ПриведенныйНаборДвоичныхДанных); + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + ПутьККаталогуФайловПечати = Результат; + + ТекстПредупреждения = ""; + + Для Каждого Строка Из ВыделенныеСтроки Цикл + ЭлементДерева = Элементы.СписокМакетов.ДанныеСтроки(Строка); + Если ЭлементДерева.ЭтоКлассификатор Тогда + Продолжить; + КонецЕсли; + + ПутьКФайлуМакета = ПутьККаталогуФайловПечати + ЭлементДерева.ИмяМакета + "." + ЭлементДерева.ТипМакета; + + Если ЭлементДерева.ТипМакета = "MXL" И Редактировать Тогда + Если ПустаяСтрока(ТекстПредупреждения) Тогда + ТекстПредупреждения = НСтр("ru = 'Файлы макетов табличных документов сохранены на диск.'"); + КонецЕсли; + + ТекстПредупреждения = ТекстПредупреждения + + Символы.ПС + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Макет ""%1"" сохранен на диск под именем + |""%2"".'"), + ЭлементДерева.ИмяМакета, + ПутьКФайлуМакета); + Иначе + ОткрытьФайл(ПутьКФайлуМакета); + КонецЕсли; + + Если Редактировать Тогда + ЭлементДерева.Редактируется = Истина; + ЭлементДерева.ПутьКФайлуМакета = ПутьКФайлуМакета; + КонецЕсли; + КонецЦикла; + + Если Не ПустаяСтрока(ТекстПредупреждения) Тогда + Предупреждение(ТекстПредупреждения); + КонецЕсли; +#Иначе + Для Каждого Строка Из ВыделенныеСтроки Цикл + ЭлементДерева = Элементы.СписокМакетов.ДанныеСтроки(Строка); + + Если ЭлементДерева.ЭтоКлассификатор Тогда + Продолжить; + КонецЕсли; + + Если ЭлементДерева.Редактируется Тогда + Если ЭлементДерева.ТипМакета = "MXL" Тогда + ТабличныйДокумент = ПолучитьМакетПечатнойФормыСДиска(ЭлементДерева.ПутьКФайлуМакета, + ЭлементДерева.ПолучитьРодителя().ПолноеИмяОМ, + ЭлементДерева.ИмяМакета); + ТабличныйДокумент.Показать(ЭлементДерева.Представление, ЭлементДерева.ПутьКФайлуМакета); + Иначе + ЗапуститьПриложение(ЭлементДерева.ПутьКФайлуМакета) + КонецЕсли; + Продолжить; + КонецЕсли; + + Если ЭлементДерева.ТипМакета = "MXL" Тогда + ТабличныйДокумент = ПолучитьМакетПечатнойФормы( + ЭлементДерева.ПолучитьРодителя().ПолноеИмяОМ, + ЭлементДерева.ИмяМакета); + + Если Редактировать Тогда + ПутьКФайлуМакета = ПолучитьИмяВременногоФайла(ЭлементДерева.ТипМакета); + ТабличныйДокумент.Показать(ЭлементДерева.Представление, ПутьКФайлуМакета); + ЭлементДерева.ПутьКФайлуМакета = ПутьКФайлуМакета; + ЭлементДерева.Редактируется = Истина; + Иначе + ТабличныйДокумент.Показать(ЭлементДерева.Представление); + КонецЕсли; + Иначе + ДвоичныеДанныеМакета = ПолучитьМакетПечатнойФормы( + ЭлементДерева.ПолучитьРодителя().ПолноеИмяОМ, + ЭлементДерева.ИмяМакета); + + ПутьКФайлуМакета = СохранитьМакетПечатнойФормыНаДиск(ДвоичныеДанныеМакета, ЭлементДерева.ТипМакета); + + ЗапуститьПриложение(ПутьКФайлуМакета); + Если Редактировать Тогда + ЭлементДерева.Редактируется = Истина; + ЭлементДерева.ПутьКФайлуМакета = ПутьКФайлуМакета; + КонецЕсли; + КонецЕсли; + КонецЦикла; +#КонецЕсли + + ОбновитьЭлементыУправления(); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьИспользованиеМакетаПоЗначению(Значение) + + УстанавливаемыеМакеты = Новый Массив; + + ВыделенныеСтроки = Элементы.СписокМакетов.ВыделенныеСтроки; + + Для Каждого Строка Из ВыделенныеСтроки Цикл + + ЭлементДерева = Элементы.СписокМакетов.ДанныеСтроки(Строка); + + Если ЭлементДерева.ЭтоКлассификатор Тогда + Продолжить; + КонецЕсли; + + Если Значение И НЕ ЭлементДерева.ЕстьПользовательскийМакет Тогда + Продолжить; + КонецЕсли; + + УстанавливаемыеМакеты.Добавить(Новый Структура("ИмяОМ, ИмяМакета", + ЭлементДерева.ПолучитьРодителя().ПолноеИмяОМ, + ЭлементДерева.ИмяМакета)); + ЭлементДерева.Использование = Значение; + ЭлементДерева.ИспользованиеСтрока = ПолучитьТекстПоИспользованию(ЭлементДерева.Использование); + ЭлементДерева.Картинка = ПолучитьКодКартинки(ЭлементДерева.ТипМакета); + КонецЦикла; + + Если УстанавливаемыеМакеты.Количество() > 0 Тогда + УстановитьИспользованиеМакета(УстанавливаемыеМакеты, Значение); + КонецЕсли; + + ОбновитьЭлементыУправления(); + +КонецПроцедуры + +// Получить номер картинки по типу макету и его использованию +// +&НаКлиентеНаСервереБезКонтекста +Функция ПолучитьКодКартинки(ТипМакетаИмяОМ) + + Если ВРег(ТипМакетаИмяОМ) = "DOC" Тогда + Картинка = 0; + ИначеЕсли ВРег(ТипМакетаИмяОМ) = "ODT" Тогда + Картинка = 1; + ИначеЕсли ВРег(ТипМакетаИмяОМ) = "MXL" Тогда + Картинка = 2; + Иначе + ИмяВладельца = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТипМакетаИмяОМ, ".")[0]; + Если ВРег(ИмяВладельца) = "ДОКУМЕНТ" Тогда + Картинка = 4; + ИначеЕсли ВРег(ИмяВладельца) = "ОБРАБОТКА" Тогда + Картинка = 3; + ИначеЕсли ВРег(ИмяВладельца) = "ОБЩИЕМАКЕТЫ" Тогда + Картинка = 5; + Иначе + Картинка = 4; + КонецЕсли; + КонецЕсли; + + Возврат Картинка; + +КонецФункции // ПолучитьКодКартинки() + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ УПРАВЛЕНИЯ МАКЕТАМИ // +//////////////////////////////////////////////////////////////////////////////// + +#Если ВебКлиент Тогда +&НаКлиенте +Процедура ОткрытьФайл(ИмяОткрываемогоФайла) + + Попытка + ЗапуститьПриложение(ИмяОткрываемогоФайла); + Исключение + Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Описание=""%1""'"), + ИнформацияОбОшибке().Описание)); + КонецПопытки; + +КонецПроцедуры // ОткрытьФайл() +#КонецЕсли + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЯ КОМАНД ФОРМЫ // +//////////////////////////////////////////////////////////////////////////////// + +&НаКлиенте +Процедура ОткрытьДляПросмотра(Команда) + + ОткрытьМакетыПечатнойФормы(Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура Редактировать(Команда) + + ОткрытьМакетыПечатнойФормы(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершитьРедактирование(Команда) + + СохраняемыеМакеты = Новый Массив; + +#Если ВебКлиент Тогда + ПомещаемыеФайлы = Новый Массив; + ПомещенныеФайлы = Новый Массив; +#КонецЕсли + + ВыделенныеСтроки = Элементы.СписокМакетов.ВыделенныеСтроки; + + Для Каждого Строка Из ВыделенныеСтроки Цикл + ЭлементДерева = Элементы.СписокМакетов.ДанныеСтроки(Строка); + Если ЭлементДерева.ЭтоКлассификатор Тогда + Продолжить; + КонецЕсли; + + Файл = Новый Файл(ЭлементДерева.ПутьКФайлуМакета); + + Если Файл.Существует() Тогда +#Если ВебКлиент Тогда + ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(Файл.ПолноеИмя, "")); + СохраняемыеМакеты.Добавить(Новый Структура("ИмяОМ, ИмяМакета", + ЭлементДерева.ПолучитьРодителя().ПолноеИмяОМ, + ЭлементДерева.ИмяМакета)); +#Иначе + Попытка + ДанныеМакета = Новый ДвоичныеДанные(ЭлементДерева.ПутьКФайлуМакета) + Исключение + СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + СообщениеОбОшибке = СообщениеОбОшибке + Символы.ПС + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Убедитесь, что приложение работы с файлом %1 закрыто'"), + ЭлементДерева.Представление); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщениеОбОшибке); + Продолжить; + КонецПопытки; + + СохраняемыеМакеты.Добавить(Новый Структура("ИмяОМ, ИмяМакета, ДанныеМакета", + ЭлементДерева.ПолучитьРодителя().ПолноеИмяОМ, + ЭлементДерева.ИмяМакета, + ДанныеМакета)); + + УдалитьФайлы(ЭлементДерева.ПутьКФайлуМакета); + + ЭлементДерева.Использование = Истина; + ЭлементДерева.ИспользованиеСтрока = ПолучитьТекстПоИспользованию(ЭлементДерева.Использование); + ЭлементДерева.ЕстьПользовательскийМакет = Истина; + ЭлементДерева.Картинка = ПолучитьКодКартинки(ЭлементДерева.ТипМакета); +#КонецЕсли + КонецЕсли; +#Если НЕ ВебКлиент Тогда + ЭлементДерева.Редактируется = Ложь; + ЭлементДерева.ПутьКФайлуМакета = ""; +#КонецЕсли + КонецЦикла; + +#Если ВебКлиент Тогда + Попытка + Если НЕ ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь) Тогда + Предупреждение(НСтр("ru = 'Ошибка при помещении файлов в хранилище.'")); + Возврат; + КонецЕсли; + Исключение + СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при помещении файла в хранилище: %1. Убедитесь, что приложение работы с файлом закрыто.'"), СообщениеОбОшибке)); + Возврат; + КонецПопытки; +#КонецЕсли + +#Если ВебКлиент Тогда + СохранитьМакетыВИнформационнойБазе(СохраняемыеМакеты, ПомещенныеФайлы); + + ВыделенныеСтроки = Элементы.СписокМакетов.ВыделенныеСтроки; + + Для Каждого Строка Из ВыделенныеСтроки Цикл + ЭлементДерева = Элементы.СписокМакетов.ДанныеСтроки(Строка); + Если ЭлементДерева.ЭтоКлассификатор Тогда + Продолжить; + КонецЕсли; + + Файл = Новый Файл(ЭлементДерева.ПутьКФайлуМакета); + + Если Файл.Существует() Тогда + УдалитьФайлы(ЭлементДерева.ПутьКФайлуМакета); + КонецЕсли; + + ЭлементДерева.Использование = Истина; + ЭлементДерева.ИспользованиеСтрока = ПолучитьТекстПоИспользованию(ЭлементДерева.Использование); + ЭлементДерева.ЕстьПользовательскийМакет = Истина; + ЭлементДерева.Картинка = ПолучитьКодКартинки(ЭлементДерева.ТипМакета); + ЭлементДерева.Редактируется = Ложь; + ЭлементДерева.ПутьКФайлуМакета = ""; + КонецЦикла; +#Иначе + СохранитьМакетыВИнформационнойБазе(СохраняемыеМакеты); +#КонецЕсли + + КоличествоМакетов = ВыделенныеСтроки.Количество(); + Если КоличествоМакетов = 1 Тогда + ПоказатьОповещениеПользователя(НСтр("ru = 'Макет изменен'"),, + Элементы.СписокМакетов.ДанныеСтроки(ВыделенныеСтроки[0]).Представление); + ИначеЕсли КоличествоМакетов > 1 Тогда + ПоказатьОповещениеПользователя(НСтр("ru = 'Макеты изменены'"),, + НСтр("ru = 'Количество макетов: '") + КоличествоМакетов); + КонецЕсли; + + ОбновитьЭлементыУправления(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтменитьРедактирование(Команда) + + ВыделенныеСтроки = Элементы.СписокМакетов.ВыделенныеСтроки; + + Для Каждого Строка Из ВыделенныеСтроки Цикл + ЭлементДерева = Элементы.СписокМакетов.ДанныеСтроки(Строка); + Если ЭлементДерева.ЭтоКлассификатор Тогда + Продолжить; + КонецЕсли; + УдалитьФайлы(ЭлементДерева.ПутьКФайлуМакета); + ЭлементДерева.Редактируется = Ложь; + ЭлементДерева.ПутьКФайлуМакета = ""; + КонецЦикла; + + ОбновитьЭлементыУправления(); + +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьИЗИБ(Команда) + + УдаляемыеМакеты = Новый Массив; + + ВыделенныеСтроки = Элементы.СписокМакетов.ВыделенныеСтроки; + + Для Каждого Строка Из ВыделенныеСтроки Цикл + ЭлементДерева = Элементы.СписокМакетов.ДанныеСтроки(Строка); + Если ЭлементДерева.ЭтоКлассификатор Тогда + Продолжить; + КонецЕсли; + + УдаляемыеМакеты.Добавить(Новый Структура("ПолноеИмяОМ, ИмяМакета", + ЭлементДерева.ПолучитьРодителя().ПолноеИмяОМ, + ЭлементДерева.ИмяМакета)); + ЭлементДерева.ЕстьПользовательскийМакет = Ложь; + КонецЦикла; + + Если УдаляемыеМакеты.Количество() > 0 Тогда + УдалитьМакетИзИнформационнойБазы(УдаляемыеМакеты); + ОбновитьЭлементыУправления(); + КонецЕсли; + + КоличествоМакетов = ВыделенныеСтроки.Количество(); + Если КоличествоМакетов = 1 Тогда + ПоказатьОповещениеПользователя(НСтр("ru = 'Удален пользовательский макет'"),, + Элементы.СписокМакетов.ДанныеСтроки(ВыделенныеСтроки[0]).Представление); + ИначеЕсли КоличествоМакетов > 1 Тогда + ПоказатьОповещениеПользователя(НСтр("ru = 'Удалены пользовательские макеты'"),, + НСтр("ru = 'Количество макетов: '" + КоличествоМакетов)); + КонецЕсли; + + +КонецПроцедуры + +&НаКлиенте +Процедура ИспользоватьПользовательскийМакет(Команда) + + УстановитьИспользованиеМакетаПоЗначению(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ИспользоватьПоставляемыйМакет(Команда) + + УстановитьИспользованиеМакетаПоЗначению(Ложь); + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура СохранитьНастройкиРежимаОткрытияМакета(СпрашиватьРежимОткрытияМакета, РежимОткрытияМакетаПросмотр) + + ХранилищеОбщихНастроек.Сохранить("НастройкаОткрытияМакетов", "СпрашиватьРежимОткрытияМакета", СпрашиватьРежимОткрытияМакета); + ХранилищеОбщихНастроек.Сохранить("НастройкаОткрытияМакетов", "РежимОткрытияМакетаПросмотр", РежимОткрытияМакетаПросмотр); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗадатьДействиеПриВыбореМакетаПечатнойФормы(Команда) + + Результат = ОткрытьФормуМодально("РегистрСведений.ПользовательскиеМакетыПечати.Форма.ВыбораРежимаОткрытияМакета"); + + Если ТипЗнч(Результат) = Тип("Структура") Тогда + РежимОткрытияМакетаПросмотр = Результат.РежимОткрытияПросмотр; + СпрашиватьРежимОткрытияМакета = НЕ Результат.БольшеНеСпрашивать; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ПредложитьУстановкуРасширенияРаботыСФайлами() + + ТекстСообщения = НСтр("ru = 'Не подключено расширение для работы с файлами в Веб-клиенте.'"); + ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(ТекстСообщения); + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + Возврат Истина; + КонецЕсли; + + Предупреждение(НСтр("ru = 'Для открытия и редактирования макетов необходимо подключить расширение для работы с файлами в Веб-клиенте.'")); + + Возврат Ложь; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ И ЭЛЕМЕНТОВ УПРАВЛЕНИЯ ФОРМЫ // +//////////////////////////////////////////////////////////////////////////////// + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Перем Фильтр; + + Если Параметры.Свойство("Фильтр") Тогда + Фильтр = Параметры.Фильтр.Метаданные().ПолноеИмя(); + КонецЕсли; + + ЗаполнитьСписокМетаданных(Фильтр); + + ПутьККаталогуФайловПечати = УправлениеПечатью.ПолучитьЛокальныйКаталогФайловПечати(); + + Значение = ХранилищеОбщихНастроек.Загрузить("НастройкаОткрытияМакетов", "СпрашиватьРежимОткрытияМакета"); + + Если Значение = Неопределено Тогда + СпрашиватьРежимОткрытияМакета = Истина; + Иначе + СпрашиватьРежимОткрытияМакета = Значение; + КонецЕсли; + + Значение = ХранилищеОбщихНастроек.Загрузить("НастройкаОткрытияМакетов", "РежимОткрытияМакетаПросмотр"); + + Если Значение = Неопределено Тогда + РежимОткрытияМакетаПросмотр = Ложь; + Иначе + РежимОткрытияМакетаПросмотр = Значение; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокМакетовПриАктивизацииСтроки(Элемент) + + ОбновитьЭлементыУправления(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + ЕстьРедактируемые = Ложь; + + Для Каждого ГруппаМакетов Из СписокМакетов.ПолучитьЭлементы() Цикл + ЭлементыГруппы = ГруппаМакетов.ПолучитьЭлементы(); + Для Каждого ЭлементОМ Из ЭлементыГруппы Цикл + Если ЭлементОМ.Редактируется Тогда + ЕстьРедактируемые = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + Если ЕстьРедактируемые Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Если ЕстьРедактируемые Тогда + Результат = Вопрос(НСтр("ru = 'Внимание, в списке остались макеты отмеченные как редактируемые. Продолжить с закрытием формы?'"), РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет,); + Если Результат = КодВозвратаДиалога.Нет Тогда + Отказ = Истина; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокМакетовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Если Элементы.СписокМакетов.ДанныеСтроки(ВыбраннаяСтрока).ЭтоКлассификатор Тогда + Возврат; + КонецЕсли; + + Если СпрашиватьРежимОткрытияМакета Тогда + + Результат = ОткрытьФормуМодально("РегистрСведений.ПользовательскиеМакетыПечати.Форма.ВыбораРежимаОткрытияМакета"); + + Если ТипЗнч(Результат) = Тип("Структура") Тогда + РежимОткрытияМакетаПросмотр = Результат.РежимОткрытияПросмотр; + СпрашиватьРежимОткрытияМакета = НЕ Результат.БольшеНеСпрашивать; + Если Результат.БольшеНеСпрашивать Тогда + СохранитьНастройкиРежимаОткрытияМакета(СпрашиватьРежимОткрытияМакета, РежимОткрытияМакетаПросмотр); + КонецЕсли; + Иначе + Возврат; + КонецЕсли; + + КонецЕсли; + + ОткрытьМакетыПечатнойФормы(НЕ РежимОткрытияМакетаПросмотр); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/НастройкаКаталогаФайловПечати/Form.form b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/НастройкаКаталогаФайловПечати/Form.form new file mode 100644 index 000000000..9ae276502 --- /dev/null +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/НастройкаКаталогаФайловПечати/Form.form @@ -0,0 +1,198 @@ + + + + КаталогДляСохраненияДанныхПечати + 1 + true + true + + true + + + КаталогДляСохраненияДанныхПечати + + Top + + КаталогДляСохраненияДанныхПечатиРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + КаталогДляСохраненияДанныхПечатиКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПутьККаталогуНачалоВыбора + + 50 + true + true + true + true + true + true + true + Normal + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + Применить + 5 + true + true + + true + + false + + ПрименитьРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 6 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 7 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + КаталогДляСохраненияДанныхПечати + + <key>ru</key> + <value>Рабочий каталог для хранения временных файлов печати:</value> + + 1 + + String + + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + Установить каталог + + + true + + + + ОК + + + Auto + Auto + + + + + + diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/НастройкаКаталогаФайловПечати/Module.bsl b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/НастройкаКаталогаФайловПечати/Module.bsl new file mode 100644 index 000000000..16254f1aa --- /dev/null +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/НастройкаКаталогаФайловПечати/Module.bsl @@ -0,0 +1,32 @@ +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + КаталогДляСохраненияДанныхПечати = УправлениеПечатью.ПолучитьЛокальныйКаталогФайловПечати(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПутьККаталогуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + ДиалогОткрытияФайла.Каталог = КаталогДляСохраненияДанныхПечати; + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите путь к каталогу для файлов печати'"); + Если ДиалогОткрытияФайла.Выбрать() Тогда + КаталогДляСохраненияДанныхПечати = ДиалогОткрытияФайла.Каталог + "\"; + КонецЕсли; + Иначе + Предупреждение(НСтр("ru = 'Для выбора каталога необходимо установить расширение для работы с файлами в Веб-клиенте.'")); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + + УправлениеПечатью.СохранитьЛокальныйКаталогФайловПечати(КаталогДляСохраненияДанныхПечати); + Закрыть(КаталогДляСохраненияДанныхПечати); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/ПользовательскиеМакетыПечати.mdo b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/ПользовательскиеМакетыПечати.mdo new file mode 100644 index 000000000..a5cdc4fa7 --- /dev/null +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/ПользовательскиеМакетыПечати.mdo @@ -0,0 +1,174 @@ + + + + + + + + + + + + ПользовательскиеМакетыПечати + + ru + Пользовательские макеты печати + + true + InDialog + InformationRegister.ПользовательскиеМакетыПечати.Form.МакетыПечатныхФорм + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ru + Макеты печатных форм + + + Макет + + ru + Макет + + + ValueStorage + + + + Use + Use + + + + Использование + + ru + Использование + + + Boolean + + + ru + Использовать макет + + + + Use + Use + + + + ИмяМакета + + ru + Имя макета + + + String + + 100 + + + + + true + Use + Use + + true + + + Объект + + ru + Объект + + + String + + 100 + + + + + true + Use + Use + + true + + + ВыбораРежимаОткрытияМакета + + ru + Выбора режима открытия макета + + true + + + ru + + + PersonalComputer + MobileDevice + + + ДиалогПовтораПечати + + ru + Диалог повтора печати + + PersonalComputer + MobileDevice + + + МакетыПечатныхФорм + + ru + Макеты печатных форм + + PersonalComputer + MobileDevice + + + НастройкаКаталогаФайловПечати + + ru + Настройка каталога файлов печати + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/ПользовательскиеНастройкиДоступаКОбработкам/ПользовательскиеНастройкиДоступаКОбработкам.mdo b/SSL/src/InformationRegisters/ПользовательскиеНастройкиДоступаКОбработкам/ПользовательскиеНастройкиДоступаКОбработкам.mdo new file mode 100644 index 000000000..7814f62cf --- /dev/null +++ b/SSL/src/InformationRegisters/ПользовательскиеНастройкиДоступаКОбработкам/ПользовательскиеНастройкиДоступаКОбработкам.mdo @@ -0,0 +1,124 @@ + + + + + + + + + + + + ПользовательскиеНастройкиДоступаКОбработкам + + ru + Пользовательские настройки доступа к обработкам + + InDialog + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + Доступно + + ru + Доступно + + + Boolean + + + ru + Исключать из быстрого доступа + + + + Use + + + + ДополнительныйОтчетИлиОбработка + + ru + Дополнительный отчет или обработка + + + CatalogRef.ДополнительныеОтчетыИОбработки + + + + true + Use + true + + true + true + + + ИдентификаторКоманды + + ru + Идентификатор команды + + + String + + 100 + + + + + true + Index + Use + + true + + + Пользователь + + ru + Пользователь + + + CatalogRef.Пользователи + + + + Index + Use + + true + + diff --git a/SSL/src/InformationRegisters/ПраваПоЗначениямДоступа/RecordSetModule.bsl b/SSL/src/InformationRegisters/ПраваПоЗначениямДоступа/RecordSetModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/InformationRegisters/ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo b/SSL/src/InformationRegisters/ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo new file mode 100644 index 000000000..bd6ea98fb --- /dev/null +++ b/SSL/src/InformationRegisters/ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo @@ -0,0 +1,288 @@ + + + + + + + + + + + + ПраваПоЗначениямДоступа + + ru + Права по значениям доступа + + InDialog + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + Запрещено + + ru + Запрещено + + + Boolean + + + + Use + + + + РаспространяетсяВИерархии + + ru + Распространяется в иерархии + + + Boolean + + + + Use + + Index + + + Чтение + + ru + Чтение + + + Boolean + + + + Index + Use + + + + ЧтениеЗапрещено + + ru + Чтение запрещено + + + Boolean + + + + Index + Use + + + + Добавление + + ru + Добавление + + + Boolean + + + + Index + Use + + + + ДобавлениеЗапрещено + + ru + Добавление запрещено + + + Boolean + + + + Index + Use + + + + Изменение + + ru + Изменение + + + Boolean + + + + Index + Use + + + + ИзменениеЗапрещено + + ru + Изменение запрещено + + + Boolean + + + + Index + Use + + + + Удаление + + ru + Удаление + + + Boolean + + + + Index + Use + + + + УдалениеЗапрещено + + ru + Удаление запрещено + + + Boolean + + + + Index + Use + + + + ЗначениеДоступа + + ru + Значение доступа + + + String + + 10 + + + + + true + Use + true + + Catalog.ПапкиФайлов.EmptyRef + + true + true + + + Пользователь + + ru + Пользователь + + + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + CatalogRef.ГруппыПользователей + CatalogRef.Пользователи + + + + true + Use + true + + Catalog.Пользователи.EmptyRef + + true + true + + + Право + + ru + Право пользователя + + + String + + 60 + + + + + ShowError + true + Index + Use + + true + + + Таблица + + ru + Таблица + + + String + + 150 + + + + + ShowError + Index + Use + + true + + diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..886de03d1 --- /dev/null +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,765 @@ + + + + ГруппаПланаОбмена + 26 + + ИмяПланаОбмена + 1 + true + true + + true + + + Запись.ИмяПланаОбмена + + + OnChange + ИмяПланаОбменаПриИзменении + + + ИмяПланаОбменаРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ИмяПланаОбменаКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа плана обмена</value> + + + ru + Группа плана обмена + + + ГруппаПланаОбменаРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаОсновная + 25 + + ИсточникПравил + 9 + true + true + + true + + + Запись.ИсточникПравил + + None + + OnChange + ИсточникПравилПриИзменении + + + ИсточникПравилРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + ИсточникПравилКонтекстноеМеню + 10 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Типовые правила + + + Enum.ИсточникиПравилДляОбменаДанными.EnumValue.МакетКонфигурации + + + + + ru + Правила из файла + + + Enum.ИсточникиПравилДляОбменаДанными.EnumValue.Файл + + + Vertical + + + + ГруппаИсточникиПравил + 15 + + Источник_МакетКонфигурации + 16 + + ИмяМакетаПравил + 7 + true + true + + true + + + Запись.ИмяМакетаПравил + + + ИмяМакетаПравилРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + ИмяМакетаПравилКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + false + true + true + true + Normal + + + + ЗагрузитьПравила + 19 + true + true + + true + + false + + ЗагрузитьПравилаРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + UsualButton + Form.Command.ЗагрузитьПравила + Normal + Auto + true + true + UserCmds + Auto + + + ВыгрузитьПравила + 20 + true + true + + true + + false + + ВыгрузитьПравилаРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + UsualButton + Form.Command.ВыгрузитьПравила + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Источник макет конфигурации</value> + + + ru + Источник макет конфигурации + + + Источник_МакетКонфигурацииРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Page + + auto + + + + Источник_Файл + 17 + + ИмяФайлаПравил + 5 + true + true + + true + + + Запись.ИмяФайлаПравил + + + ИмяФайлаПравилРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + ИмяФайлаПравилКонтекстноеМеню + 6 + true + + InputField + true + Enter + true + Left + true + + true + true + true + false + false + true + true + true + Normal + + + + ЗагрузитьПравила1 + 21 + true + true + + true + + false + + ЗагрузитьПравила1РасширеннаяПодсказка + 44 + Label + true + true + + Left + + + UsualButton + Form.Command.ЗагрузитьПравила + Normal + Auto + true + true + UserCmds + Auto + + + ВыгрузитьПравила1 + 22 + true + true + + true + + false + + ВыгрузитьПравила1РасширеннаяПодсказка + 45 + Label + true + true + + Left + + + UsualButton + Form.Command.ВыгрузитьПравила + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Источник файл</value> + + + ru + Источник файл + + + Источник_ФайлРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + Page + + auto + + + true + true + + true + + + <key>ru</key> + <value>Группа источники правил</value> + + + ru + Группа источники правил + + + ГруппаИсточникиПравилРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Источник правил</value> + + + ru + Группа основная + + + ГруппаОсновнаяРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + StrongSeparation + true + true + auto + Auto + Auto + + + + ИнформацияОПравилах + 11 + true + true + + true + + + Запись.ИнформацияОПравилах + + + ИнформацияОПравилахРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ИнформацияОПравилахКонтекстноеМеню + 12 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаДополнительно + 18 + + ИспользоватьФильтрВыборочнойРегистрацииОбъектов + 13 + true + true + + true + + + Запись.ИспользоватьФильтрВыборочнойРегистрацииОбъектов + + Right + + ИспользоватьФильтрВыборочнойРегистрацииОбъектовРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + ИспользоватьФильтрВыборочнойРегистрацииОбъектовКонтекстноеМеню + 14 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Дополнительно</value> + + + ru + Группа дополнительно + + + ГруппаДополнительноРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ГруппаКнопок + 24 + + ПолучитьИнформациюОПравилахИзФайла + 23 + true + true + + true + + false + + ПолучитьИнформациюОПравилахИзФайлаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.Command.ПолучитьИнформациюОПравилахИзФайла + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа кнопок</value> + + + ru + Группа кнопок + + + ГруппаКнопокРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + Copy + LockOwner + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Запись + 1 + + InformationRegisterRecordManager.ПравилаДляОбменаДанными + + + true + + + true + +
    true
    + true +
    + + ЗагрузитьПравила + + <key>ru</key> + <value>Загрузить правила</value> + + 1 + + ru + Загрузить правила + + + true + + + StdPicture.OpenFile + + + + ЗагрузитьПравила + + + Picture + Auto + Auto + + + ВыгрузитьПравила + + <key>ru</key> + <value>Выгрузить правила</value> + + 2 + + ru + Выгрузить правила в файл + + + true + + + StdPicture.SaveFile + + + + ВыгрузитьПравила + + + Picture + Auto + Auto + + + ПолучитьИнформациюОПравилахИзФайла + + <key>ru</key> + <value>Получить информацию о правилах из файла</value> + + 3 + + ru + Получить информацию о правилах из файла + + + true + + + StdPicture.InputFieldOpen + + + + ПолучитьИнформациюОПравилахИзФайла + + + Picture + Auto + Auto + + + + + + +
    diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаЗаписи/Module.bsl new file mode 100644 index 000000000..22f6ecce7 --- /dev/null +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаЗаписи/Module.bsl @@ -0,0 +1,189 @@ +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ОбновитьСписокВыбораПлановОбмена(); + + ОбновитьСписокВыбораМакетаПравил(); + + УстановитьВидимость(); + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ИмяПланаОбменаПриИзменении(Элемент) + + Запись.ИмяМакетаПравил = ""; + + // вызов сервера + ОбновитьСписокВыбораМакетаПравил(); + +КонецПроцедуры + +&НаКлиенте +Процедура ИсточникПравилПриИзменении(Элемент) + + // вызов сервера + УстановитьВидимость(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗагрузитьПравила(Команда) + + Перем АдресВременногоХранилища; + Перем ВыбранноеИмяФайла; + + Отказ = Ложь; + + ИмяФайлаПравил = ""; + + Если Запись.ИсточникПравил = ПредопределенноеЗначение("Перечисление.ИсточникиПравилДляОбменаДанными.Файл") Тогда + + Если ПоместитьФайл(АдресВременногоХранилища, Запись.ИмяФайлаПравил, ВыбранноеИмяФайла, Истина, УникальныйИдентификатор) Тогда + + Файл = Новый Файл(ВыбранноеИмяФайла); + + ИмяФайлаПравил = Файл.Имя; + + Иначе + Возврат; + КонецЕсли; + + КонецЕсли; + + НСтрока = НСтр("ru = 'Выполняется загрузка правил в информационную базу...'"); + Состояние(НСтрока); + + // загрузка правил на сервере + ЗагрузитьПравилаНаСервере(Отказ, АдресВременногоХранилища, ИмяФайлаПравил); + + // информация о статусе загрузки правил + НСтрокаУспешно = НСтр("ru = 'Правила успешно загружены в информационную базу.'"); + НСтрокаОшибка = НСтр("ru = 'В процессе загрузки правил были обнаружены ошибки! Загрузка не выполнена (см. журнал регистрации).'"); + + СтрокаСообщения = ?(Отказ, НСтрокаОшибка, НСтрокаУспешно); + + Состояние(СтрокаСообщения); + + Предупреждение(СтрокаСообщения); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыгрузитьПравила(Команда) + + Адрес = ПолучитьНавигационнуюСсылкуНаСервере(); + + ИмяФайлаПравил = ?(ПустаяСтрока(Запись.ИмяФайлаПравил), "ПравилаДляОбменаДанными.xml", Запись.ИмяФайлаПравил); + + ПолучитьФайл(Адрес, ИмяФайлаПравил, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолучитьИнформациюОПравилахИзФайла(Команда) + + ОбменДаннымиКлиент.ПолучитьИнформациюОПравилах(УникальныйИдентификатор); + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ОбновитьСписокВыбораПлановОбмена() + + СписокПлановОбмена = ОбменДаннымиПовтИсп.ПолучитьСписокПлановОбменаКонфигурацииВерсии30(); + + ЗаполнитьСписок(СписокПлановОбмена, Элементы.ИмяПланаОбмена.СписокВыбора); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьСписокВыбораМакетаПравил() + + Если Запись.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов Тогда + + СписокМакетов = ОбменДаннымиПовтИсп.ПолучитьСписокТиповыхПравилОбмена(Запись.ИмяПланаОбмена); + + Иначе // ПравилаРегистрацииОбъектов + + СписокМакетов = ОбменДаннымиПовтИсп.ПолучитьСписокТиповыхПравилРегистрации(Запись.ИмяПланаОбмена); + + КонецЕсли; + + СписокВыбора = Элементы.ИмяМакетаПравил.СписокВыбора; + СписокВыбора.Очистить(); + + ЗаполнитьСписок(СписокМакетов, СписокВыбора); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСписок(СписокИсточник, СписокПриемник) + + Для Каждого Элемент ИЗ СписокИсточник Цикл + + ЗаполнитьЗначенияСвойств(СписокПриемник.Добавить(), Элемент); + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьВидимость() + + // если план обмена был ранее задан, то изменять его не даем + Элементы.ГруппаПланаОбмена.Видимость = ПустаяСтрока(Запись.ИмяПланаОбмена); + + Элементы.ГруппаДополнительно.Видимость = (Запись.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов); + + ГруппаИсточникиПравил = Элементы.ГруппаИсточникиПравил; + + ГруппаИсточникиПравил.ТекущаяСтраница = ?(Запись.ИсточникПравил = Перечисления.ИсточникиПравилДляОбменаДанными.МакетКонфигурации, + ГруппаИсточникиПравил.ПодчиненныеЭлементы.Источник_МакетКонфигурации, + ГруппаИсточникиПравил.ПодчиненныеЭлементы.Источник_Файл); + // + + // назначаем заголовок формы + Заголовок = Строка(Запись.ВидПравил); + +КонецПроцедуры + +&НаСервере +Процедура ЗагрузитьПравилаНаСервере(Отказ, АдресВременногоХранилища, ИмяФайлаПравил) + + Объект = РеквизитФормыВЗначение("Запись"); + + РегистрыСведений.ПравилаДляОбменаДанными.ЗагрузитьПравила(Отказ, Объект, АдресВременногоХранилища, ИмяФайлаПравил); + + Если Не Отказ Тогда + + Объект.Записать(); + + Модифицированность = Ложь; + + КонецЕсли; + + ЗначениеВРеквизитФормы(Объект, "Запись"); + +КонецПроцедуры + +&НаСервере +Функция ПолучитьНавигационнуюСсылкуНаСервере() + + Отбор = Новый Структура; + Отбор.Вставить("ИмяПланаОбмена", Запись.ИмяПланаОбмена); + Отбор.Вставить("ВидПравил", Запись.ВидПравил); + + КлючЗаписи = РегистрыСведений.ПравилаДляОбменаДанными.СоздатьКлючЗаписи(Отбор); + + Возврат ПолучитьНавигационнуюСсылку(КлючЗаписи, "ПравилаXML"); + +КонецФункции diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..0ea7709df --- /dev/null +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,20 @@ + + + + + ВидПравил + Equal + Перечисление.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..c4c2a8ec2 --- /dev/null +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Form.form @@ -0,0 +1,733 @@ + + + + ГруппаСтраницы + 10 + + ГруппаПравилаКонвертацииОбъектов + 11 + + ПравилаКонвертацииОбъектов + 1 + true + true + + true + + + Список + + false + None + Copy + + ИмяПланаОбмена + 4 + true + true + + true + + + Список.ИмяПланаОбмена + + true + + ИмяПланаОбменаРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + ИмяПланаОбменаКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ИспользоватьФильтрВыборочнойРегистрацииОбъектов + 8 + + <key>ru</key> + <value>Использовать фильтр ВРО</value> + + true + true + + true + + + Список.ИспользоватьФильтрВыборочнойРегистрацииОбъектов + + true + + ИспользоватьФильтрВыборочнойРегистрацииОбъектовРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ИспользоватьФильтрВыборочнойРегистрацииОбъектовКонтекстноеМеню + 9 + true + + CheckBoxField + Enter + true + Left + true + + + + ПравилаЗагружены + 21 + true + true + + true + + + Список.ПравилаЗагружены + + + ПравилаЗагруженыРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ПравилаЗагруженыКонтекстноеМеню + 22 + true + + PictureField + Enter + true + Left + true + + true + true + true + true + + StdPicture.WriteAndClose + + + + 1 + + + + None + + ПравилаКонвертацииОбъектовКоманднаяПанель + 3 + Left + true + + + BeforeAddRow + ПравилаКонвертацииОбъектовПередНачаломДобавления + + + ПравилаКонвертацииОбъектовСтрокаПоиска + 30 + + ПравилаКонвертацииОбъектовСтрокаПоискаРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ПравилаКонвертацииОбъектовСтрокаПоискаКонтекстноеМеню + 31 + true + + ПравилаКонвертацииОбъектов + + true + + + + ПравилаКонвертацииОбъектовСостояниеПросмотра + 33 + + ПравилаКонвертацииОбъектовСостояниеПросмотраРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ПравилаКонвертацииОбъектовСостояниеПросмотраКонтекстноеМеню + 34 + true + + ViewStatusAddition + ПравилаКонвертацииОбъектов + + true + + + + ПравилаКонвертацииОбъектовУправлениеПоиском + 36 + + ПравилаКонвертацииОбъектовУправлениеПоискомРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ПравилаКонвертацииОбъектовУправлениеПоискомКонтекстноеМеню + 37 + true + + SearchControlAddition + ПравилаКонвертацииОбъектов + + true + + + + ПравилаКонвертацииОбъектовРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ПравилаКонвертацииОбъектовКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + + Список.DefaultPicture + + 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 + Группа правила конвертации объектов + + + ГруппаПравилаКонвертацииОбъектовРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + + ГруппаПравилаРегистрацииОбъектов + 12 + + ПравилаРегистрацииОбъектов + 13 + true + true + + true + + + Список + + false + None + Copy + + ИмяПланаОбмена1 + 16 + true + true + + true + + + Список.ИмяПланаОбмена + + + ИмяПланаОбмена1РасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + ИмяПланаОбмена1КонтекстноеМеню + 17 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ПравилаЗагружены1 + 23 + true + true + + true + + + Список.ПравилаЗагружены + + + ПравилаЗагружены1РасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + ПравилаЗагружены1КонтекстноеМеню + 24 + true + + PictureField + Enter + true + Left + true + + true + true + true + true + + StdPicture.WriteAndClose + + + + 1 + + + + None + + ПравилаРегистрацииОбъектовКоманднаяПанель + 15 + Left + true + + + BeforeAddRow + ПравилаРегистрацииОбъектовПередНачаломДобавления + + + ПравилаРегистрацииОбъектовСтрокаПоиска + 55 + + ПравилаРегистрацииОбъектовСтрокаПоискаРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + ПравилаРегистрацииОбъектовСтрокаПоискаКонтекстноеМеню + 56 + true + + ПравилаРегистрацииОбъектов + + true + + + + ПравилаРегистрацииОбъектовСостояниеПросмотра + 58 + + ПравилаРегистрацииОбъектовСостояниеПросмотраРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + ПравилаРегистрацииОбъектовСостояниеПросмотраКонтекстноеМеню + 59 + true + + ViewStatusAddition + ПравилаРегистрацииОбъектов + + true + + + + ПравилаРегистрацииОбъектовУправлениеПоиском + 61 + + ПравилаРегистрацииОбъектовУправлениеПоискомРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + + ПравилаРегистрацииОбъектовУправлениеПоискомКонтекстноеМеню + 62 + true + + SearchControlAddition + ПравилаРегистрацииОбъектов + + true + + + + ПравилаРегистрацииОбъектовРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + ПравилаРегистрацииОбъектовКонтекстноеМеню + 14 + true + + true + true + true + true + true + MultiRow +
    true
    + 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 + +
    + true + true + + true + + + <key>ru</key> + <value>Правила регистрации объектов</value> + + + ru + Группа правила регистрации объектов + + + ГруппаПравилаРегистрацииОбъектовРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + true + true + + true + + + <key>ru</key> + <value>Группа страницы</value> + + + ru + Группа страницы + + + ГруппаСтраницыРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Pages + + + OnCurrentPageChange + ГруппаСтраницыПриСменеСтраницы + + TabsOnTop + Auto + +
    + + ФормаКоманднаяПанель + -1 + + ГруппаКнопок + 20 + + ПолучитьИнформациюОПравилахИзФайла + 19 + true + true + + true + + false + + ПолучитьИнформациюОПравилахИзФайлаРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + Form.Command.ПолучитьИнформациюОПравилахИзФайла + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа кнопок</value> + + + ru + Группа кнопок + + + ГруппаКнопокРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + Copy + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + + <key>ru</key> + <value>Список</value> + + 1 + + DynamicList + + + true + + + true + +
    true
    + + InformationRegister.ПравилаДляОбменаДанными + true + true + true + true + +
    + + ПолучитьИнформациюОПравилахИзФайла + + <key>ru</key> + <value>Получить информацию о правилах из файла</value> + + 1 + + ru + Получить информацию о правилах из файла + + + true + + + CommonPicture.КартинкаРедактировать + + + + ПолучитьИнформациюОПравилахИзФайла + + + Picture + Auto + Auto + + + + + + +
    diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Module.bsl b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..d8f46d6b7 --- /dev/null +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,69 @@ +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСтраницы.ПодчиненныеЭлементы.ГруппаПравилаКонвертацииОбъектов; + + ГруппаСтраницыПриСменеСтраницыНаСервере(); + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница) + + ГруппаСтраницыПриСменеСтраницыНаСервере(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолучитьИнформациюОПравилахИзФайла(Команда) + + ОбменДаннымиКлиент.ПолучитьИнформациюОПравилах(УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура ПравилаКонвертацииОбъектовПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + // запрещено копирование записей данного РС + Если Копирование Тогда + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПравилаРегистрацииОбъектовПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + // запрещено копирование записей данного РС + Если Копирование Тогда + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ГруппаСтраницыПриСменеСтраницыНаСервере() + + Если Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСтраницы.ПодчиненныеЭлементы.ГруппаПравилаКонвертацииОбъектов Тогда + + ПравоеЗначение = Перечисления.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов; + + Иначе + + ПравоеЗначение = Перечисления.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов; + + КонецЕсли; + + Список.Отбор.Элементы[0].ПравоеЗначение = ПравоеЗначение; + +КонецПроцедуры + diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ManagerModule.bsl b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ManagerModule.bsl new file mode 100644 index 000000000..314b50d8d --- /dev/null +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ManagerModule.bsl @@ -0,0 +1,331 @@ +Процедура ЗагрузитьПравила(Отказ, Запись, АдресВременногоХранилища = "", ИмяФайлаПравил = "") Экспорт + + // проверка заполнения обязательныех полей записи + ВыполнитьПроверкуЗаполненияПолей(Отказ, Запись); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + // получаем двоичные данные правил из файла или макета конфигурации + Если Запись.ИсточникПравил = Перечисления.ИсточникиПравилДляОбменаДанными.МакетКонфигурации Тогда + + ДвоичныеДанные = ПолучитьДвоичныеДанныеИзМакетаКонфигурации(Отказ, Запись.ИмяПланаОбмена, Запись.ИмяМакетаПравил); + + Иначе + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища); + + КонецЕсли; + + Если Отказ Тогда + Возврат; + КонецЕсли; + + // получаем имя временного файла в локальной ФС на сервере + ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml"); + + // получаем файл правил для зачитки + ДвоичныеДанные.Записать(ИмяВременногоФайла); + + Если Запись.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов Тогда + + // зачитываем правила конвертации + КонвертацияОбъектовИнформационныхБаз = Обработки.КонвертацияОбъектовИнформационныхБаз.Создать(); + + // свойства обработки + КонвертацияОбъектовИнформационныхБаз.ИмяПланаОбменаВРО = Запись.ИмяПланаОбмена; + + // методы обработки + ПравилаЗачитанные = КонвертацияОбъектовИнформационныхБаз.ПолучитьСтруктуруПравилОбмена(ИмяВременногоФайла); + + ИнформацияОПравилах = КонвертацияОбъектовИнформационныхБаз.ПолучитьИнформациюОПравилах(); + + Если КонвертацияОбъектовИнформационныхБаз.ФлагОшибки() Тогда + Отказ = Истина; + КонецЕсли; + + Иначе // ПравилаРегистрацииОбъектов + + // зачитываем правила регистрации + ЗагрузкаПравилРегистрации = Обработки.ЗагрузкаПравилРегистрацииОбъектов.Создать(); + + // свойства обработки + ЗагрузкаПравилРегистрации.ИмяПланаОбменаДляЗагрузки = Запись.ИмяПланаОбмена; + + // методы обработки + ЗагрузкаПравилРегистрации.ЗагрузитьПравила(ИмяВременногоФайла); + + ПравилаЗачитанные = ЗагрузкаПравилРегистрации.ПравилаРегистрацииОбъектов; + + ИнформацияОПравилах = ЗагрузкаПравилРегистрации.ПолучитьИнформациюОПравилах(); + + Если ЗагрузкаПравилРегистрации.ФлагОшибки Тогда + Отказ = Истина; + КонецЕсли; + + КонецЕсли; + + // удаляем временный файл правил + УдалитьВременныйФайл(ИмяВременногоФайла); + + Если Не Отказ Тогда + + Запись.ПравилаXML = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных()); + Запись.ПравилаЗачитанные = Новый ХранилищеЗначения(ПравилаЗачитанные); + + Запись.ИнформацияОПравилах = ИнформацияОПравилах; + + Запись.ИмяФайлаПравил = ИмяФайлаПравил; + + Запись.ПравилаЗагружены = Истина; + + Запись.ИмяПланаОбменаИзПравил = Запись.ИмяПланаОбмена; + + КонецЕсли; + +КонецПроцедуры + +// Получает зачитанные правила конвертации объектов из ИБ для плана обмена +// +// Параметры: +// ИмяПланаОбмена - Строка - имя плана обмена как объекта метаданных +// +// Возвращаемое значение: +// ПравилаЗачитанные - ХранилищеЗначения - зачитанные правила конвертации объектов +// Неопределено - Если правила конвертации не были загружены в базу для плана обмена +// +Функция ПолучитьЗачитанныеПравилаКонвертацииОбъектов(Знач ИмяПланаОбмена) Экспорт + + // возвращаемое значение функции + ПравилаЗачитанные = Неопределено; + + ТекстЗапроса = " + |ВЫБРАТЬ + | ПравилаДляОбменаДанными.ПравилаЗачитанные КАК ПравилаЗачитанные + |ИЗ + | РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными + |ГДЕ + | ПравилаДляОбменаДанными.ИмяПланаОбмена = &ИмяПланаОбмена + | И ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов) + | И ПравилаДляОбменаДанными.ПравилаЗагружены + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("ИмяПланаОбмена", ИмяПланаОбмена); + + Результат = Запрос.Выполнить(); + + Если Не Результат.Пустой() Тогда + + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + + ПравилаЗачитанные = Выборка.ПравилаЗачитанные; + + КонецЕсли; + + Возврат ПравилаЗачитанные; + +КонецФункции + +Функция ПолучитьСтруктуруПравилКонвертации(Отказ, ИмяПланаОбмена) Экспорт + + ДвоичныеДанные = ПолучитьДвоичныеДанныеИзМакетаКонфигурации(Отказ, ИмяПланаОбмена, "ПравилаОбмена"); + + Если Отказ Тогда + Возврат Неопределено; + КонецЕсли; + + // получаем имя временного файла в локальной ФС на сервере + ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml"); + + // получаем файл правил для зачитки + ДвоичныеДанные.Записать(ИмяВременногоФайла); + + // зачитываем правила конвертации + ЗагрузкаПравилКонвертацииОбъектов = Обработки.ЗагрузкаПравилКонвертацииОбъектов.Создать(); + + // возвращаемое значение функции + СтруктураПравилКонвертации = ЗагрузкаПравилКонвертацииОбъектов.ПолучитьСтруктуруПравилОбмена(ИмяВременногоФайла); + + Если ЗагрузкаПравилКонвертацииОбъектов.ФлагОшибки Тогда + Отказ = Истина; + КонецЕсли; + + // удаляем временный файл правил + УдалитьВременныйФайл(ИмяВременногоФайла); + + Возврат СтруктураПравилКонвертации; +КонецФункции + +Процедура ЗагрузитьИнформациюОПравилах(Отказ, АдресВременногоХранилища, СтрокаИнформацииОПравилах) Экспорт + + Перем ВидПравил; + + СтрокаИнформацииОПравилах = ""; + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища); + + // получаем имя временного файла в локальной ФС на сервере + ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml"); + + // получаем файл правил для зачитки + ДвоичныеДанные.Записать(ИмяВременногоФайла); + + ОпределитьВидПравилДляОбменаДанными(ВидПравил, ИмяВременногоФайла, Отказ); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + Если ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов Тогда + + // зачитываем правила конвертации + КонвертацияОбъектовИнформационныхБаз = Обработки.КонвертацияОбъектовИнформационныхБаз.Создать(); + + КонвертацияОбъектовИнформационныхБаз.ЗагрузитьПравилаОбмена(ИмяВременногоФайла, "XMLФайл",, Истина); + + Если КонвертацияОбъектовИнформационныхБаз.ФлагОшибки() Тогда + Отказ = Истина; + КонецЕсли; + + Если Не Отказ Тогда + СтрокаИнформацииОПравилах = КонвертацияОбъектовИнформационныхБаз.ПолучитьИнформациюОПравилах(); + КонецЕсли; + + Иначе // ПравилаРегистрацииОбъектов + + // зачитываем правила регистрации + ЗагрузкаПравилРегистрации = Обработки.ЗагрузкаПравилРегистрацииОбъектов.Создать(); + + ЗагрузкаПравилРегистрации.ЗагрузитьПравила(ИмяВременногоФайла, Истина); + + Если ЗагрузкаПравилРегистрации.ФлагОшибки Тогда + Отказ = Истина; + КонецЕсли; + + Если Не Отказ Тогда + СтрокаИнформацииОПравилах = ЗагрузкаПравилРегистрации.ПолучитьИнформациюОПравилах(); + КонецЕсли; + + КонецЕсли; + + // удаляем временный файл правил + УдалитьВременныйФайл(ИмяВременногоФайла); + +КонецПроцедуры + +Функция ПолучитьДвоичныеДанныеИзМакетаКонфигурации(Отказ, ИмяПланаОбмена, ИмяМакета) + + // получаем имя временного файла в локальной ФС на сервере + ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml"); + + ПланОбменаМенеджер = ОбменДаннымиПовтИсп.ПолучитьМенеджерПланаОбменаПоИмени(ИмяПланаОбмена); + + // получаем макет типовых правил + Попытка + МакетПравил = ПланОбменаМенеджер.ПолучитьМакет(ИмяМакета); + Исключение + + СтрокаСообщения = НСтр("ru = 'Ошибка получения макета конфигурации [ИмяМакета] для плана обмена [ИмяПланаОбмена]'"); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ИмяМакета]", ИмяМакета); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ИмяПланаОбмена]", ИмяПланаОбмена); + ОбменДаннымиСервер.СообщитьОбОшибке(СтрокаСообщения, Отказ); + + Возврат Неопределено; + + КонецПопытки; + + МакетПравил.Записать(ИмяВременногоФайла); + + ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла); + + // удаляем временный файл правил + УдалитьВременныйФайл(ИмяВременногоФайла); + + Возврат ДвоичныеДанные; +КонецФункции + +Процедура УдалитьВременныйФайл(ИмяВременногоФайла) + + Попытка + Если Не ПустаяСтрока(ИмяВременногоФайла) Тогда + УдалитьФайлы(ИмяВременногоФайла); + КонецЕсли; + Исключение + КонецПопытки; + +КонецПроцедуры + +Процедура ВыполнитьПроверкуЗаполненияПолей(Отказ, Запись) + + Если ПустаяСтрока(Запись.ИмяПланаОбмена) Тогда + + НСтрока = НСтр("ru = 'Не задан план обмена!'"); + + ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ); + + ИначеЕсли Запись.ИсточникПравил = Перечисления.ИсточникиПравилДляОбменаДанными.МакетКонфигурации + И ПустаяСтрока(Запись.ИмяМакетаПравил) Тогда + + НСтрока = НСтр("ru = 'Не указаны типовые правила!'"); + + ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ); + + КонецЕсли; + +КонецПроцедуры + +Процедура ОпределитьВидПравилДляОбменаДанными(ВидПравил, ИмяФайла, Отказ) + + // открываем файл для чтения + Попытка + Правила = Новый ЧтениеXML(); + Правила.ОткрытьФайл(ИмяФайла); + Правила.Прочитать(); + Исключение + Правила = Неопределено; + + НСтрока = НСтр("ru = 'Ошибка разбора XML-файла'"); + ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ); + Возврат; + КонецПопытки; + + Если Правила.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + + Если Правила.ЛокальноеИмя = "ПравилаОбмена" Тогда + + ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов; + + ИначеЕсли Правила.ЛокальноеИмя = "ПравилаРегистрации" Тогда + + ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов; + + Иначе + + НСтрока = НСтр("ru = 'Ошибка формата правил!'"); + ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ); + КонецЕсли; + + Иначе + + НСтрока = НСтр("ru = 'Ошибка формата правил!'"); + ОбменДаннымиСервер.СообщитьОбОшибке(НСтрока, Отказ); + КонецЕсли; + + Правила.Закрыть(); + Правила = Неопределено; + +КонецПроцедуры + +// + +// Процедура добавляет запись в регистр по переданным значениям структуры +Процедура ДобавитьЗапись(СтруктураЗаписи) Экспорт + + ОбменДаннымиСервер.ДобавитьЗаписьВРегистрСведений(СтруктураЗаписи, "ПравилаДляОбменаДанными"); + +КонецПроцедуры + diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/RecordSetModule.bsl b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/RecordSetModule.bsl new file mode 100644 index 000000000..261335100 --- /dev/null +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/RecordSetModule.bsl @@ -0,0 +1,28 @@ + +Процедура ПередЗаписью(Отказ, Замещение) + + // объекты данного типа не должны мигрировать при обмене + ОбменДанными.Получатели.Очистить(); + + // если были загружены правила, то изменять план обмена нельзя + Если Количество() > 0 Тогда + + Если ЗначениеЗаполнено(ЭтотОбъект[0].ИмяПланаОбменаИзПравил) // ранее были загружены правила для плана обмена + И Отбор.ИмяПланаОбмена.Значение <> ЭтотОбъект[0].ИмяПланаОбменаИзПравил Тогда + + ТекстСообщения = НСтр("ru = 'Нельзя изменять план обмена после загрузки правил!'"); + ОбменДаннымиСервер.СообщитьОбОшибке(ТекстСообщения, Отказ); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Процедура ПриЗаписи(Отказ, Замещение) + + // кеш открытых сеансов для МРО стал неактуальным + ОбменДаннымиСервер.УстановитьДатуОбновленияПовторноИспользуемыхЗначенийМРО(); + +КонецПроцедуры + diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ПравилаДляОбменаДанными.mdo b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ПравилаДляОбменаДанными.mdo new file mode 100644 index 000000000..9eab5cd95 --- /dev/null +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ПравилаДляОбменаДанными.mdo @@ -0,0 +1,257 @@ + + + + + + + + + + + + ПравилаДляОбменаДанными + + ru + Правила для обмена данными + + InformationRegister.ПравилаДляОбменаДанными.Form.ФормаЗаписи + InformationRegister.ПравилаДляОбменаДанными.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ПравилаЗачитанные + + ru + Правила зачитанные + + + ValueStorage + + + + Use + + + + ПравилаXML + + ru + Правила XML + + + ValueStorage + + + + Use + + + + ИмяФайлаПравил + + ru + Имя файла с правилами + + + String + + 255 + + + + + Use + Use + + + + ИмяМакетаПравил + + ru + Типовые правила из конфигурации + + + String + + 150 + + + + + Use + Use + + + + ИсточникПравил + + ru + Источник правил + + + EnumRef.ИсточникиПравилДляОбменаДанными + + + + ShowError + Use + Use + + Enum.ИсточникиПравилДляОбменаДанными.EnumValue.МакетКонфигурации + + + + ИнформацияОПравилах + + ru + Информация о правилах + + + String + + + + + Use + Use + + + + ИмяПланаОбменаИзПравил + + ru + План обмена + + + String + + 150 + + + + + Use + Use + + + + ИспользоватьФильтрВыборочнойРегистрацииОбъектов + + ru + Использовать фильтр выборочной регистрации объектов + + + Boolean + + + + Use + Use + + + + ПравилаЗагружены + + ru + Правила загружены + + + Boolean + + + + Use + Use + + + + ИмяПланаОбмена + + ru + План обмена + + + String + + 150 + + + + + true + Use + Use + true + + + + ВидПравил + + ru + Вид правил + + + EnumRef.ВидыПравилДляОбменаДанными + + + + ShowError + true + Use + Use + true + + Enum.ВидыПравилДляОбменаДанными.EmptyRef + + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/ПутиМодулейКриптографииСерверовЛинукс/ПутиМодулейКриптографииСерверовЛинукс.mdo b/SSL/src/InformationRegisters/ПутиМодулейКриптографииСерверовЛинукс/ПутиМодулейКриптографииСерверовЛинукс.mdo new file mode 100644 index 000000000..66ef35240 --- /dev/null +++ b/SSL/src/InformationRegisters/ПутиМодулейКриптографииСерверовЛинукс/ПутиМодулейКриптографииСерверовЛинукс.mdo @@ -0,0 +1,106 @@ + + + + + + + + + + + + ПутиМодулейКриптографииСерверовЛинукс + + ru + Пути модулей криптографии серверов линукс + + true + InDialog + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + Комментарий + + ru + Комментарий + + + String + + + + + Use + Use + + + + ПутьМодуляКриптографии + + ru + Путь модуля криптографии + + + String + + + + + Use + Use + + + + ИмяКомпьютера + + ru + Имя компьютера + + + String + + 255 + + + + + Use + Use + true + + true + true + + diff --git a/SSL/src/InformationRegisters/РабочиеКаталогиФайлов/RecordSetModule.bsl b/SSL/src/InformationRegisters/РабочиеКаталогиФайлов/RecordSetModule.bsl new file mode 100644 index 000000000..4735c68f8 --- /dev/null +++ b/SSL/src/InformationRegisters/РабочиеКаталогиФайлов/RecordSetModule.bsl @@ -0,0 +1,41 @@ + +Процедура ПередЗаписью(Отказ, Замещение) + + Если Количество() = 1 Тогда + Папка = Получить(0).Папка; + Путь = Получить(0).Путь; + + Если ПустаяСтрока(Путь) Тогда + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ПапкиФайлов.Ссылка, + | ПапкиФайлов.Наименование + |ИЗ + | Справочник.ПапкиФайлов КАК ПапкиФайлов + |ГДЕ + | ПапкиФайлов.Родитель = &Ссылка"; + + Запрос.УстановитьПараметр("Ссылка", Папка); + + Результат = Запрос.Выполнить(); + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + + РабочийКаталог = Путь; + // Добавляем слэш в конце, если его нет + Если Прав(РабочийКаталог,1) <> "\" Тогда + РабочийКаталог = РабочийКаталог + "\"; + КонецЕсли; + + РабочийКаталог = РабочийКаталог + Выборка.Наименование + "\"; + + РаботаСФайлами.СохранитьРабочийКаталог(Выборка.Ссылка, РабочийКаталог); + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/РабочиеКаталогиФайлов/РабочиеКаталогиФайлов.mdo b/SSL/src/InformationRegisters/РабочиеКаталогиФайлов/РабочиеКаталогиФайлов.mdo new file mode 100644 index 000000000..4b6b39fe9 --- /dev/null +++ b/SSL/src/InformationRegisters/РабочиеКаталогиФайлов/РабочиеКаталогиФайлов.mdo @@ -0,0 +1,107 @@ + + + + + + + + + + + + РабочиеКаталогиФайлов + + ru + Рабочие каталоги файлов + + InDialog + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + Путь + + ru + Путь + + Путь к каталогу на диске + + String + + + + + Use + Use + + + + Папка + + ru + Папка + + Папка в информационной базе + + CatalogRef.ПапкиФайлов + + + + Use + Use + true + + true + true + + + Пользователь + + ru + Пользователь + + Пользователь + + CatalogRef.Пользователи + + + + Use + Use + true + + true + true + + diff --git a/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..21644edf5 --- /dev/null +++ b/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,362 @@ + + + + УзелИнформационнойБазы + 1 + true + true + + true + + + Запись.УзелИнформационнойБазы + + + УзелИнформационнойБазыРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Источник + 18 + + УникальныйИдентификаторИсточника + 15 + true + true + + true + + + Запись.УникальныйИдентификаторИсточника + + + УникальныйИдентификаторИсточникаРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + УникальныйИдентификаторИсточникаКонтекстноеМеню + 16 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТипИсточника + 23 + true + true + + true + + + Запись.ТипИсточника + + + ТипИсточникаРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ТипИсточникаКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + УникальныйИдентификаторИсточникаСтрокой + 27 + true + true + + true + + + Запись.УникальныйИдентификаторИсточникаСтрокой + + + УникальныйИдентификаторИсточникаСтрокойРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + УникальныйИдентификаторИсточникаСтрокойКонтекстноеМеню + 28 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Источник</value> + + + ru + Источник + + + ИсточникРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + Приемник + 17 + + УникальныйИдентификаторПриемника + 25 + true + true + + true + + + Запись.УникальныйИдентификаторПриемника + + + УникальныйИдентификаторПриемникаРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + УникальныйИдентификаторПриемникаКонтекстноеМеню + 26 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТипПриемника + 21 + true + true + + true + + + Запись.ТипПриемника + + + ТипПриемникаРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ТипПриемникаКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Приемник</value> + + + ru + Приемник + + + ПриемникРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + true + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Запись + 1 + + InformationRegisterRecordManager.СоответствиеОбъектовИнформационныхБаз + + + true + + + true + +
    true
    + true +
    + + + + + +
    diff --git a/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..82e65545c --- /dev/null +++ b/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/Forms/ФормаСписка/Form.form @@ -0,0 +1,439 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + УзелИнформационнойБазы + 4 + true + true + + true + + + Список.УзелИнформационнойБазы + + true + + УзелИнформационнойБазыРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ГруппаИсточника + 14 + + ТипИсточника + 16 + true + true + + true + + + Список.ТипИсточника + + + ТипИсточникаРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + ТипИсточникаКонтекстноеМеню + 17 + true + + LabelField + Enter + true + Left + true + + true + true + + + + УникальныйИдентификаторИсточника + 6 + true + true + + true + + + Список.УникальныйИдентификаторИсточника + + true + + УникальныйИдентификаторИсточникаРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + УникальныйИдентификаторИсточникаКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Группа источника</value> + + + ru + Группа источника + + + ГруппаИсточникаРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + ColumnGroup + + Vertical + auto + true + + + + ГруппаПриемника + 15 + + ТипПриемника + 12 + true + true + + true + + + Список.ТипПриемника + + true + + ТипПриемникаРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ТипПриемникаКонтекстноеМеню + 13 + true + + LabelField + Enter + true + Left + true + + true + true + + + + УникальныйИдентификаторПриемника + 8 + true + true + + true + + + Список.УникальныйИдентификаторПриемника + + true + + УникальныйИдентификаторПриемникаРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + УникальныйИдентификаторПриемникаКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Группа приемника</value> + + + ru + Группа приемника + + + ГруппаПриемникаРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + ColumnGroup + + Vertical + auto + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 19 + + СписокСтрокаПоискаРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 20 + true + + Список + + true + + + + СписокСостояниеПросмотра + 22 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 23 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 25 + + СписокУправлениеПоискомРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 26 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + InformationRegister.СоответствиеОбъектовИнформационныхБаз + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/ManagerModule.bsl b/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/ManagerModule.bsl new file mode 100644 index 000000000..b312ebed8 --- /dev/null +++ b/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/ManagerModule.bsl @@ -0,0 +1,15 @@ + +// Процедура добавляет запись в регистр по переданным значениям структуры +Процедура ДобавитьЗапись(СтруктураЗаписи) Экспорт + + ОбменДаннымиСервер.ДобавитьЗаписьВРегистрСведений(СтруктураЗаписи, "СоответствиеОбъектовИнформационныхБаз"); + +КонецПроцедуры + +// Процедура удаляет набор записей в регистре по переданным значениям структуры +Процедура УдалитьЗапись(СтруктураЗаписи) Экспорт + + ОбменДаннымиСервер.УдалитьНаборЗаписейВРегистреСведений(СтруктураЗаписи, "СоответствиеОбъектовИнформационныхБаз"); + +КонецПроцедуры + diff --git a/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/RecordSetModule.bsl b/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/RecordSetModule.bsl new file mode 100644 index 000000000..45166bc0c --- /dev/null +++ b/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/RecordSetModule.bsl @@ -0,0 +1,27 @@ + +Процедура ПередЗаписью(Отказ, Замещение) + + // заполняем свойство УникальныйИдентификаторИсточникаСтрокой из ссылки источника + Если Количество() > 0 Тогда + ЭтотОбъект[0]["УникальныйИдентификаторИсточникаСтрокой"] = Строка(ЭтотОбъект[0]["УникальныйИдентификаторИсточника"].УникальныйИдентификатор()); + КонецЕсли; + + Если ОбменДанными.Загрузка + ИЛИ Не ЗначениеЗаполнено(Отбор.УзелИнформационнойБазы.Значение) + ИЛИ Не ОбщегоНазначения.СсылкаСуществует(Отбор.УзелИнформационнойБазы.Значение) Тогда + Возврат; + КонецЕсли; + + // отказываемся от выполнения типового механизма регистрации объектов + ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина); + + // удаляем все узлы, добавленные по авторегистрации, если признак авторегистрации был ошибочно установлен + ОбменДанными.Получатели.Очистить(); + + // набор записей должен регистрироваться только на одном узле, указанном в отборе + ОбменДанными.Получатели.Добавить(Отбор.УзелИнформационнойБазы.Значение); + +КонецПроцедуры + + + diff --git a/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/СоответствиеОбъектовИнформационныхБаз.mdo b/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/СоответствиеОбъектовИнформационныхБаз.mdo new file mode 100644 index 000000000..af49c2111 --- /dev/null +++ b/SSL/src/InformationRegisters/СоответствиеОбъектовИнформационныхБаз/СоответствиеОбъектовИнформационныхБаз.mdo @@ -0,0 +1,179 @@ + + + + + + + + + + + + СоответствиеОбъектовИнформационныхБаз + + ru + Соответствие объектов информационных баз + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.Form.ФормаЗаписи + InformationRegister.СоответствиеОбъектовИнформационныхБаз.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + УникальныйИдентификаторИсточникаСтрокой + + ru + Уникальный идентификатор источника строкой + + + String + + 36 + + + + + Use + true + + + + УзелИнформационнойБазы + + ru + Узел информационной базы + + + ExchangePlanRef + + + + true + Use + Use + true + + true + true + + + УникальныйИдентификаторИсточника + + ru + Уникальный идентификатор источника + + + AnyRef + + + + Use + true + + true + true + + + УникальныйИдентификаторПриемника + + ru + Уникальный идентификатор приемника + + + String + + 36 + + + + + Use + + true + + + ТипПриемника + + ru + Тип приемника + + + String + + 150 + + + + + Use + + true + + + ТипИсточника + + ru + Тип источника + + + String + + 150 + + + + + Use + + true + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/СоставГруппПользователей/СоставГруппПользователей.mdo b/SSL/src/InformationRegisters/СоставГруппПользователей/СоставГруппПользователей.mdo new file mode 100644 index 000000000..ca76cd5e4 --- /dev/null +++ b/SSL/src/InformationRegisters/СоставГруппПользователей/СоставГруппПользователей.mdo @@ -0,0 +1,94 @@ + + + + + + + + + + + + СоставГруппПользователей + + ru + Состав групп пользователей + + InDialog + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ГруппаПользователей + + ru + Группа пользователей + + + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + CatalogRef.ГруппыПользователей + CatalogRef.Пользователи + + + + true + Use + Use + true + + true + true + + + Пользователь + + ru + Пользователь + + + CatalogRef.ВнешниеПользователи + CatalogRef.Пользователи + + + + true + Use + Use + true + + true + true + + diff --git a/SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..0b231dd06 --- /dev/null +++ b/SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,282 @@ + + + + УзелИнформационнойБазы + 1 + true + true + + true + + + Запись.УзелИнформационнойБазы + + + УзелИнформационнойБазыРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДействиеПриОбмене + 3 + true + true + + true + + + Запись.ДействиеПриОбмене + + + ДействиеПриОбменеРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + ДействиеПриОбменеКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ГруппаРесурсов + 11 + + РезультатВыполненияОбмена + 5 + true + true + + true + + + Запись.РезультатВыполненияОбмена + + + РезультатВыполненияОбменаРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + РезультатВыполненияОбменаКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДатаНачала + 7 + true + true + + true + + + Запись.ДатаНачала + + + ДатаНачалаРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ДатаНачалаКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДатаОкончания + 9 + true + true + + true + + + Запись.ДатаОкончания + + + ДатаОкончанияРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + ДатаОкончанияКонтекстноеМеню + 10 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа ресурсов</value> + + + ru + Группа ресурсов + + + ГруппаРесурсовРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + true + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Запись + 1 + + InformationRegisterRecordManager.СостояниеОбменовДанными + + + true + + + true + +
    true
    + true +
    + + + + + +
    diff --git a/SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаЗаписи/Module.bsl new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаЗаписи/Module.bsl @@ -0,0 +1 @@ + diff --git a/SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..dd927a495 --- /dev/null +++ b/SSL/src/InformationRegisters/СостояниеОбменовДанными/Forms/ФормаСписка/Form.form @@ -0,0 +1,369 @@ + + + + Список + 1 + true + true + + true + + + Список + + false + None + + УзелИнформационнойБазы + 4 + true + true + + true + + + Список.УзелИнформационнойБазы + + + УзелИнформационнойБазыРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ДействиеПриОбмене + 6 + true + true + + true + + + Список.ДействиеПриОбмене + + + ДействиеПриОбменеРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ДействиеПриОбменеКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + РезультатВыполненияОбмена + 8 + true + true + + true + + + Список.РезультатВыполненияОбмена + + + РезультатВыполненияОбменаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + РезультатВыполненияОбменаКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ДатаНачала + 10 + true + true + + true + + + Список.ДатаНачала + + + ДатаНачалаРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + ДатаНачалаКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ДатаОкончания + 12 + true + true + + true + + + Список.ДатаОкончания + + + ДатаОкончанияРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ДатаОкончанияКонтекстноеМеню + 13 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 15 + + СписокСтрокаПоискаРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 16 + true + + Список + + true + + + + СписокСостояниеПросмотра + 18 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 19 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 21 + + СписокУправлениеПоискомРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 22 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + InformationRegister.СостояниеОбменовДанными + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/InformationRegisters/СостояниеОбменовДанными/ManagerModule.bsl b/SSL/src/InformationRegisters/СостояниеОбменовДанными/ManagerModule.bsl new file mode 100644 index 000000000..8945677d4 --- /dev/null +++ b/SSL/src/InformationRegisters/СостояниеОбменовДанными/ManagerModule.bsl @@ -0,0 +1,140 @@ + +// Процедура добавляет запись в регистр по переданным значениям структуры +Процедура ДобавитьЗапись(СтруктураЗаписи) Экспорт + + ОбменДаннымиСервер.ДобавитьЗаписьВРегистрСведений(СтруктураЗаписи, "СостояниеОбменовДанными"); + +КонецПроцедуры + +// Возвращает структуру с данными последнего обмена для заданного узла информационной базы +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// СостояниеОбменовДанными - Структура - структура с данными последнего обмена для заданного узла информационной базы +// +Функция СостояниеОбменовДаннымиДляУзлаИнформационнойБазы(Знач УзелИнформационнойБазы) Экспорт + + // возвращаемое значение функции + СостояниеОбменовДанными = Новый Структура; + СостояниеОбменовДанными.Вставить("УзелИнформационнойБазы"); + СостояниеОбменовДанными.Вставить("РезультатЗагрузкиДанных", "Неопределено"); + СостояниеОбменовДанными.Вставить("РезультатВыгрузкиДанных", "Неопределено"); + + ТекстЗапроса = " + |// {ЗАПРОС №0} + |//////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВЫБОР + | КОГДА СостояниеОбменовДанными.РезультатВыполненияОбмена = ЗНАЧЕНИЕ(Перечисление.РезультатыВыполненияОбмена.Выполнено) + | ТОГДА ""Успех"" + | + | КОГДА СостояниеОбменовДанными.РезультатВыполненияОбмена = ЗНАЧЕНИЕ(Перечисление.РезультатыВыполненияОбмена.Предупреждение_СообщениеОбменаБылоРанееПринято) + | ТОГДА ""Предупреждение_СообщениеОбменаБылоРанееПринято"" + | + | КОГДА СостояниеОбменовДанными.РезультатВыполненияОбмена = ЗНАЧЕНИЕ(Перечисление.РезультатыВыполненияОбмена.Ошибка_ТранспортСообщения) + | ТОГДА ""Ошибка_ТранспортСообщения"" + | + | ИНАЧЕ ""Ошибка"" + | + | КОНЕЦ КАК РезультатВыполненияОбмена + |ИЗ + | РегистрСведений.СостояниеОбменовДанными КАК СостояниеОбменовДанными + |ГДЕ + | СостояниеОбменовДанными.УзелИнформационнойБазы = &УзелИнформационнойБазы + | И СостояниеОбменовДанными.ДействиеПриОбмене = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ЗагрузкаДанных) + |; + |// {ЗАПРОС №1} + |//////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВЫБОР + | КОГДА СостояниеОбменовДанными.РезультатВыполненияОбмена = ЗНАЧЕНИЕ(Перечисление.РезультатыВыполненияОбмена.Выполнено) + | ТОГДА ""Успех"" + | + | КОГДА СостояниеОбменовДанными.РезультатВыполненияОбмена = ЗНАЧЕНИЕ(Перечисление.РезультатыВыполненияОбмена.Предупреждение_СообщениеОбменаБылоРанееПринято) + | ТОГДА ""Предупреждение_СообщениеОбменаБылоРанееПринято"" + | + | КОГДА СостояниеОбменовДанными.РезультатВыполненияОбмена = ЗНАЧЕНИЕ(Перечисление.РезультатыВыполненияОбмена.Ошибка_ТранспортСообщения) + | ТОГДА ""Ошибка_ТранспортСообщения"" + | + | ИНАЧЕ ""Ошибка"" + | КОНЕЦ КАК РезультатВыполненияОбмена + | + |ИЗ + | РегистрСведений.СостояниеОбменовДанными КАК СостояниеОбменовДанными + |ГДЕ + | СостояниеОбменовДанными.УзелИнформационнойБазы = &УзелИнформационнойБазы + | И СостояниеОбменовДанными.ДействиеПриОбмене = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ВыгрузкаДанных) + |; + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("УзелИнформационнойБазы", УзелИнформационнойБазы); + + МассивРезультатовЗапроса = Запрос.ВыполнитьПакет(); + + ВыборкаРезультатовЗагрузкиДанных = МассивРезультатовЗапроса[0].Выбрать(); + ВыборкаРезультатовВыгрузкиДанных = МассивРезультатовЗапроса[1].Выбрать(); + + Если ВыборкаРезультатовЗагрузкиДанных.Следующий() Тогда + + СостояниеОбменовДанными.РезультатЗагрузкиДанных = ВыборкаРезультатовЗагрузкиДанных.РезультатВыполненияОбмена; + + КонецЕсли; + + Если ВыборкаРезультатовВыгрузкиДанных.Следующий() Тогда + + СостояниеОбменовДанными.РезультатВыгрузкиДанных = ВыборкаРезультатовВыгрузкиДанных.РезультатВыполненияОбмена; + + КонецЕсли; + + СостояниеОбменовДанными.УзелИнформационнойБазы = УзелИнформационнойБазы; + + Возврат СостояниеОбменовДанными; +КонецФункции + +// Возвращает структуру с данными последнего обмена для заданного узла информационной базы и действия при обмене +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// СостояниеОбменовДанными - Структура - структура с данными последнего обмена для заданного узла информационной базы +// +Функция СостояниеОбменовДанными(Знач УзелИнформационнойБазы, ДействиеПриОбмене) Экспорт + + // возвращаемое значение функции + СостояниеОбменовДанными = Новый Структура; + СостояниеОбменовДанными.Вставить("ДатаНачала", Дата('00010101')); + СостояниеОбменовДанными.Вставить("ДатаОкончания", Дата('00010101')); + + ТекстЗапроса = " + |ВЫБРАТЬ + | ДатаНачала, + | ДатаОкончания + |ИЗ + | РегистрСведений.СостояниеОбменовДанными КАК СостояниеОбменовДанными + |ГДЕ + | СостояниеОбменовДанными.УзелИнформационнойБазы = &УзелИнформационнойБазы + | И СостояниеОбменовДанными.ДействиеПриОбмене = &ДействиеПриОбмене + |"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("УзелИнформационнойБазы", УзелИнформационнойБазы); + Запрос.УстановитьПараметр("ДействиеПриОбмене", ДействиеПриОбмене); + + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + + ЗаполнитьЗначенияСвойств(СостояниеОбменовДанными, Выборка); + + КонецЕсли; + + Возврат СостояниеОбменовДанными; + +КонецФункции + diff --git a/SSL/src/InformationRegisters/СостояниеОбменовДанными/RecordSetModule.bsl b/SSL/src/InformationRegisters/СостояниеОбменовДанными/RecordSetModule.bsl new file mode 100644 index 000000000..e84fb1837 --- /dev/null +++ b/SSL/src/InformationRegisters/СостояниеОбменовДанными/RecordSetModule.bsl @@ -0,0 +1,7 @@ + +Процедура ПередЗаписью(Отказ, Замещение) + + // объекты данного типа не должны мигрировать при обмене + ОбменДанными.Получатели.Очистить(); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/СостояниеОбменовДанными/СостояниеОбменовДанными.mdo b/SSL/src/InformationRegisters/СостояниеОбменовДанными/СостояниеОбменовДанными.mdo new file mode 100644 index 000000000..5ed58035d --- /dev/null +++ b/SSL/src/InformationRegisters/СостояниеОбменовДанными/СостояниеОбменовДанными.mdo @@ -0,0 +1,152 @@ + + + + + + + + + + + + СостояниеОбменовДанными + + ru + Состояние обменов данными + + InformationRegister.СостояниеОбменовДанными.Form.ФормаЗаписи + InformationRegister.СостояниеОбменовДанными.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + РезультатВыполненияОбмена + + ru + Результат выполнения обмена + + + EnumRef.РезультатыВыполненияОбмена + + + + Use + Use + + Enum.РезультатыВыполненияОбмена.EmptyRef + + + + ДатаНачала + + ru + Дата начала + + + Date + + + + + Use + Use + + + + ДатаОкончания + + ru + Дата окончания + + + Date + + + + + Use + Use + + + + УзелИнформационнойБазы + + ru + Узел информационной базы + + + ExchangePlanRef + + + + Use + Use + true + + true + + + ДействиеПриОбмене + + ru + Действие при обмене + + + EnumRef.ДействияПриОбмене + + + + Use + Use + + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..0dbf74efc --- /dev/null +++ b/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,163 @@ + + + + УзелИнформационнойБазы + 1 + true + true + + true + + + Запись.УзелИнформационнойБазы + + + УзелИнформационнойБазыРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДействиеПриОбмене + 3 + true + true + + true + + + Запись.ДействиеПриОбмене + + + ДействиеПриОбменеРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ДействиеПриОбменеКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДатаОкончания + 5 + true + true + + true + + + Запись.ДатаОкончания + + + ДатаОкончанияРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ДатаОкончанияКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Запись + 1 + + InformationRegisterRecordManager.СостояниеУспешныхОбменовДанными + + + true + + + true + +
    true
    + true +
    + + + + + +
    diff --git a/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..426a5cc3c --- /dev/null +++ b/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/Forms/ФормаСписка/Form.form @@ -0,0 +1,297 @@ + + + + Список + 1 + true + true + + true + + + Список + + false + None + + УзелИнформационнойБазы + 4 + true + true + + true + + + Список.УзелИнформационнойБазы + + + УзелИнформационнойБазыРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 5 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ДействиеПриОбмене + 6 + true + true + + true + + + Список.ДействиеПриОбмене + + + ДействиеПриОбменеРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ДействиеПриОбменеКонтекстноеМеню + 7 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ДатаОкончания + 8 + true + true + + true + + + Список.ДатаОкончания + + + ДатаОкончанияРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ДатаОкончанияКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 11 + + СписокСтрокаПоискаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 12 + true + + Список + + true + + + + СписокСостояниеПросмотра + 14 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 15 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 17 + + СписокУправлениеПоискомРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 18 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + 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 + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + InformationRegister.СостояниеУспешныхОбменовДанными + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/ManagerModule.bsl b/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/ManagerModule.bsl new file mode 100644 index 000000000..04987c86c --- /dev/null +++ b/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/ManagerModule.bsl @@ -0,0 +1,7 @@ + +// Процедура добавляет запись в регистр по переданным значениям структуры +Процедура ДобавитьЗапись(СтруктураЗаписи) Экспорт + + ОбменДаннымиСервер.ДобавитьЗаписьВРегистрСведений(СтруктураЗаписи, "СостояниеУспешныхОбменовДанными"); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/RecordSetModule.bsl b/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/RecordSetModule.bsl new file mode 100644 index 000000000..e84fb1837 --- /dev/null +++ b/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/RecordSetModule.bsl @@ -0,0 +1,7 @@ + +Процедура ПередЗаписью(Отказ, Замещение) + + // объекты данного типа не должны мигрировать при обмене + ОбменДанными.Получатели.Очистить(); + +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/СостояниеУспешныхОбменовДанными.mdo b/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/СостояниеУспешныхОбменовДанными.mdo new file mode 100644 index 000000000..68c306b9c --- /dev/null +++ b/SSL/src/InformationRegisters/СостояниеУспешныхОбменовДанными/СостояниеУспешныхОбменовДанными.mdo @@ -0,0 +1,120 @@ + + + + + + + + + + + + СостояниеУспешныхОбменовДанными + + ru + Состояние успешных обменов данными + + InDialog + InformationRegister.СостояниеУспешныхОбменовДанными.Form.ФормаЗаписи + InformationRegister.СостояниеУспешныхОбменовДанными.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ДатаОкончания + + ru + Дата окончания + + + Date + + + + + Use + Use + + + + УзелИнформационнойБазы + + ru + Узел информационной базы + + + ExchangePlanRef + + + + Use + Use + true + + true + + + ДействиеПриОбмене + + ru + Действие при обмене + + + EnumRef.ДействияПриОбмене + + + + Use + Use + + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/СписокБизнесПроцессов/Commands/МоиБизнесПроцессы/CommandModule.bsl b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Commands/МоиБизнесПроцессы/CommandModule.bsl new file mode 100644 index 000000000..121db9f68 --- /dev/null +++ b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Commands/МоиБизнесПроцессы/CommandModule.bsl @@ -0,0 +1,10 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + ОткрытьФорму("РегистрСведений.СписокБизнесПроцессов.Форма.МоиБизнесПроцессы", + , + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); +КонецПроцедуры + diff --git a/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..5c29d4e48 --- /dev/null +++ b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,53 @@ + + + + + Завершен + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + Завершен + Asc + + + Дата + Asc + + + Наименование + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + + + + + Завершен + Equal + true + + + + + false + ЦветФона + auto + + + ЦветТекста + style:ЗавершенныйБизнесПроцесс + + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Form.form b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Form.form new file mode 100644 index 000000000..66a74dd17 --- /dev/null +++ b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Form.form @@ -0,0 +1,604 @@ + + + + <key>ru</key> + <value>Мои бизнес-процессы</value> + + + ПоказыватьЗавершенные + 29 + true + true + + true + + + ПоказыватьЗавершенные + + Right + + OnChange + ПоказыватьЗавершенныеПриИзменении + + + ПоказыватьЗавершенныеРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + ПоказыватьЗавершенныеКонтекстноеМеню + 30 + true + + CheckBoxField + Enter + true + Left + true + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + Choose + Copy + CopyToClipboard + Create + Delete + + Номер + 6 + + <key>ru</key> + <value>Номер</value> + + true + true + + true + + + Список.Номер + + true + + НомерРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Наименование + 22 + true + true + + true + + + Список.Наименование + + + НаименованиеРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 23 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Дата + 8 + + <key>ru</key> + <value>Дата</value> + + true + true + + true + + + Список.Дата + + true + + ДатаРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Стартован + 12 + + <key>ru</key> + <value>Стартован</value> + + true + true + + true + + + Список.Стартован + + true + + СтартованРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + СтартованКонтекстноеМеню + 13 + true + + CheckBoxField + Enter + true + Left + true + + + + Завершен + 10 + + <key>ru</key> + <value>Завершен</value> + + true + true + + true + + + Список.Завершен + + true + + ЗавершенРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ЗавершенКонтекстноеМеню + 11 + true + + CheckBoxField + Enter + true + Left + true + + + + ДатаЗавершения + 16 + + <key>ru</key> + <value>Дата завершения</value> + + true + true + + true + + + Список.ДатаЗавершения + + true + + ДатаЗавершенияРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + ДатаЗавершенияКонтекстноеМеню + 17 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + Selection + СписокВыбор + + + BeforeRowChange + СписокПередНачаломИзменения + + + СписокСтрокаПоиска + 36 + + СписокСтрокаПоискаРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 37 + true + + Список + + true + + + + СписокСостояниеПросмотра + 39 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 40 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 42 + + СписокУправлениеПоискомРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 43 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.КартинкаСтроки + + + CommonPicture.КоллекцияПиктограммЭлементов + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
    + + ФормаКоманднаяПанель + -1 + + ФормаПометкаУдаления + 31 + true + true + + true + + + ФормаПометкаУдаленияРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.Command.ПометкаУдаления + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + DontBlock + Use + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.ОтветственныйЗаБизнесПроцесс + + + Список.Автор + + + Список.БизнесПроцесс + +
    true
    + + ВЫБРАТЬ + РегистрСведенийСписокБизнесПроцессов.БизнесПроцесс, + РегистрСведенийСписокБизнесПроцессов.Номер, + РегистрСведенийСписокБизнесПроцессов.Дата, + РегистрСведенийСписокБизнесПроцессов.Завершен, + РегистрСведенийСписокБизнесПроцессов.Стартован, + РегистрСведенийСписокБизнесПроцессов.Автор, + РегистрСведенийСписокБизнесПроцессов.ДатаЗавершения, + РегистрСведенийСписокБизнесПроцессов.Наименование, + РегистрСведенийСписокБизнесПроцессов.ПометкаУдаления, + ВЫБОР + КОГДА РегистрСведенийСписокБизнесПроцессов.ПометкаУдаления + ТОГДА 3 + ИНАЧЕ 2 + КОНЕЦ КАК КартинкаСтроки +ИЗ + РегистрСведений.СписокБизнесПроцессов КАК РегистрСведенийСписокБизнесПроцессов + InformationRegister.СписокБизнесПроцессов + true + true + true + true + true + +
    + + ПоказыватьЗавершенные + + <key>ru</key> + <value>Показывать завершенные</value> + + 2 + + Boolean + + + true + + + true + + + ПоказыватьЗавершенные + + + + ПометкаУдаления + + <key>ru</key> + <value>Пометить на удаление / Снять пометку</value> + + 1 + + ru + Пометка удаления + + + true + + + StdPicture.MarkToDelete + + + + ПометкаУдаления + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Help/ru.html b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Help/ru.html new file mode 100644 index 000000000..2459b0325 --- /dev/null +++ b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Help/ru.html @@ -0,0 +1,3 @@ + +

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

    +

    См. также: Поручения.

    \ No newline at end of file diff --git a/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Module.bsl b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Module.bsl new file mode 100644 index 000000000..b6068812c --- /dev/null +++ b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/МоиБизнесПроцессы/Module.bsl @@ -0,0 +1,72 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьОтбор(Новый Структура("ПоказыватьЗавершенные", ПоказыватьЗавершенные)); + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор, "Автор", ОбщегоНазначения.ТекущийПользователь()); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "ЗадачаВыполнена" ИЛИ ИмяСобытия = "ЗадачаИзменена" Тогда + Элементы.Список.Обновить(); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + + УстановитьОтбор(Настройки); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда + ОткрытьЗначение(Элементы.Список.ТекущиеДанные.БизнесПроцесс); + КонецЕсли; + СтандартнаяОбработка = Ложь; +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломИзменения(Элемент, Отказ) + Если Элемент.ТекущиеДанные <> Неопределено Тогда + ОткрытьЗначение(Элемент.ТекущиеДанные.БизнесПроцесс); + Отказ = Истина; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПоказыватьЗавершенныеПриИзменении(Элемент) + + УстановитьОтбор(Новый Структура("ПоказыватьЗавершенные", ПоказыватьЗавершенные)); + +КонецПроцедуры + +&НаКлиенте +Процедура ПометкаУдаления(Команда) + БизнесПроцессыИЗадачиКлиент.СписокБизнесПроцессовПометкаУдаления(Элементы.Список); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура УстановитьОтбор(ПараметрыОтбора) + + ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "Завершен"); + + Если НЕ ПараметрыОтбора["ПоказыватьЗавершенные"] Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор, "Завершен", Ложь); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..fd2bc7671 --- /dev/null +++ b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,44 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + false + Завершен + Asc + + + Дата + Asc + + + Наименование + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + + + + + Завершен + Equal + true + + + + + ЦветТекста + style:ЗавершенныйБизнесПроцесс + + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..789d4eca6 --- /dev/null +++ b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/ФормаСписка/Form.form @@ -0,0 +1,581 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + Change + Choose + Copy + CopyToClipboard + Create + Delete + + Номер + 6 + + <key>ru</key> + <value>Номер</value> + + true + true + + true + + + Список.Номер + + true + + НомерРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Наименование + 22 + true + true + + true + + + Список.Наименование + + + НаименованиеРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 23 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Куратор + 14 + + <key>ru</key> + <value>Куратор</value> + + true + true + + true + + + Список.Куратор + + true + + КураторРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + КураторКонтекстноеМеню + 15 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Дата + 8 + + <key>ru</key> + <value>Дата</value> + + true + true + + true + + + Список.Дата + + true + + ДатаРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Стартован + 12 + + <key>ru</key> + <value>Стартован</value> + + true + true + + true + + + Список.Стартован + + true + + СтартованРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + СтартованКонтекстноеМеню + 13 + true + + CheckBoxField + Enter + true + Left + true + + + + Завершен + 10 + + <key>ru</key> + <value>Завершен</value> + + true + true + + true + + + Список.Завершен + + true + + ЗавершенРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ЗавершенКонтекстноеМеню + 11 + true + + CheckBoxField + Enter + true + Left + true + + + + ДатаЗавершения + 16 + + <key>ru</key> + <value>Дата завершения</value> + + true + true + + true + + + Список.ДатаЗавершения + + true + + ДатаЗавершенияРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ДатаЗавершенияКонтекстноеМеню + 17 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + Selection + СписокВыбор + + + BeforeRowChange + СписокПередНачаломИзменения + + + СписокСтрокаПоиска + 27 + + СписокСтрокаПоискаРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 28 + true + + Список + + true + + + + СписокСостояниеПросмотра + 30 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 31 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 33 + + СписокУправлениеПоискомРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 34 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.КартинкаСтроки + + + CommonPicture.КоллекцияПиктограммЭлементов + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
    + + ФормаКоманднаяПанель + -1 + + ФормаПометкаУдаления + 24 + true + true + + true + + + ФормаПометкаУдаленияРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + Form.Command.ПометкаУдаления + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + NotificationProcessing + ОбработкаОповещения + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.Предмет + + + Список.Автор + + + Список.БизнесПроцесс + +
    true
    + + ВЫБРАТЬ + РегистрСведенийСписокБизнесПроцессов.БизнесПроцесс, + РегистрСведенийСписокБизнесПроцессов.Номер, + РегистрСведенийСписокБизнесПроцессов.Дата, + РегистрСведенийСписокБизнесПроцессов.Завершен, + РегистрСведенийСписокБизнесПроцессов.Стартован, + РегистрСведенийСписокБизнесПроцессов.Автор, + РегистрСведенийСписокБизнесПроцессов.ДатаЗавершения, + РегистрСведенийСписокБизнесПроцессов.Наименование, + РегистрСведенийСписокБизнесПроцессов.ПометкаУдаления, + ВЫБОР + КОГДА РегистрСведенийСписокБизнесПроцессов.ПометкаУдаления + ТОГДА 3 + ИНАЧЕ 2 + КОНЕЦ КАК КартинкаСтроки +ИЗ + РегистрСведений.СписокБизнесПроцессов КАК РегистрСведенийСписокБизнесПроцессов + InformationRegister.СписокБизнесПроцессов + true + true + true + true + true + +
    + + ПометкаУдаления + + <key>ru</key> + <value>Пометить на удаление / Снять пометку</value> + + 1 + + ru + Пометка удаления + + + true + + + StdPicture.MarkToDelete + + + + ПометкаУдаления + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/ФормаСписка/Module.bsl b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..cd75060db --- /dev/null +++ b/SSL/src/InformationRegisters/СписокБизнесПроцессов/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,33 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "ЗадачаВыполнена" ИЛИ ИмяСобытия = "ЗадачаИзменена" Тогда + Элементы.Список.Обновить(); + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда + ОткрытьЗначение(Элементы.Список.ТекущиеДанные.БизнесПроцесс); + КонецЕсли; + СтандартнаяОбработка = Ложь; +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломИзменения(Элемент, Отказ) + Если Элемент.ТекущиеДанные <> Неопределено Тогда + ОткрытьЗначение(Элемент.ТекущиеДанные.БизнесПроцесс); + Отказ = Истина; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПометкаУдаления(Команда) + БизнесПроцессыИЗадачиКлиент.СписокБизнесПроцессовПометкаУдаления(Элементы.Список); +КонецПроцедуры diff --git a/SSL/src/InformationRegisters/СписокБизнесПроцессов/ManagerModule.bsl b/SSL/src/InformationRegisters/СписокБизнесПроцессов/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/InformationRegisters/СписокБизнесПроцессов/RecordSetModule.bsl b/SSL/src/InformationRegisters/СписокБизнесПроцессов/RecordSetModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/InformationRegisters/СписокБизнесПроцессов/СписокБизнесПроцессов.mdo b/SSL/src/InformationRegisters/СписокБизнесПроцессов/СписокБизнесПроцессов.mdo new file mode 100644 index 000000000..c9adb2c86 --- /dev/null +++ b/SSL/src/InformationRegisters/СписокБизнесПроцессов/СписокБизнесПроцессов.mdo @@ -0,0 +1,254 @@ + + + + + + + + + + + + СписокБизнесПроцессов + + ru + Бизнес-процессы + + InformationRegister.СписокБизнесПроцессов.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + 0001-01-01T00:00:00 + + ShowError + Use + + + + Managed + + ru + Бизнес-процесс + + + ru + Список бизнес-процессов + + + Номер + + ru + Номер + + + String + + 9 + + + + + Use + + Index + + + Дата + + ru + Дата + + + Date + + + + + Use + + 0001-01-01T00:00:00 + + Index + + + Завершен + + ru + Завершен + + + Boolean + + + + Use + + Index + + + Стартован + + ru + Стартован + + + Boolean + + + + Use + + Index + + + Автор + + ru + Автор + + + CatalogRef.Пользователи + + + + Use + + Catalog.Пользователи.EmptyRef + + Index + + + ДатаЗавершения + + ru + Дата завершения + + + Date + + + + + Use + + 0001-01-01T00:00:00 + + Index + + + Наименование + + ru + Наименование + + + String + + 250 + + + + + Use + + + + ПометкаУдаления + + ru + Пометка удаления + + + Boolean + + + + Use + Use + + + + БизнесПроцесс + + ru + Бизнес-процесс + + + BusinessProcessRef + + + + ShowError + true + Use + Use + true + + BusinessProcess.Задание.EmptyRef + + true + true + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + МоиБизнесПроцессы + + ru + Мои бизнес-процессы + + Бизнес-процессы в работе с отбором по автору + + + ru + + + PersonalComputer + MobileDevice + + + МоиБизнесПроцессы + + ru + Мои бизнес-процессы + + NavigationPanelOrdinary + Auto + + ru + Список инициированных мной бизнес-процессов + + + diff --git a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ТаблицыГруппДоступа.mdo b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ТаблицыГруппДоступа.mdo new file mode 100644 index 000000000..2ac700c78 --- /dev/null +++ b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ТаблицыГруппДоступа.mdo @@ -0,0 +1,201 @@ + + + + + + + + + + + + ТаблицыГруппДоступа + + ru + Таблицы групп доступа + + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + Добавление + + ru + Добавление + + + Boolean + + + + Use + + + + Изменение + + ru + Изменение + + + Boolean + + + + Use + + + + Удаление + + ru + Удаление + + + Boolean + + + + Use + + + + ТипТаблицы + + ru + Тип таблицы + + + AnyRef + + + + Index + Use + + + + ВидДоступаПравоДобавления + + ru + Вид доступа право добавления + + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + + Use + + + + ВидДоступаПравоИзменения + + ru + Вид доступа право изменения + + + ChartOfCharacteristicTypesRef.ВидыДоступа + + + + Use + + + + Таблица + + ru + Таблица + + + String + + 150 + + + + + ShowError + true + Use + + true + + + Пользователь + + ru + Пользователь + + + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + CatalogRef.ГруппыПользователей + CatalogRef.Пользователи + + + + ShowError + true + Use + true + + Catalog.Пользователи.EmptyRef + + true + true + + + ГруппаДоступа + + ru + Группа доступа + + + CatalogRef.ГруппыДоступа + + + + ShowError + true + Use + true + + Catalog.ГруппыДоступа.EmptyRef + + true + true + + diff --git a/SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..91027f589 --- /dev/null +++ b/SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,15 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..e737b5982 --- /dev/null +++ b/SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/Forms/ФормаСписка/Form.form @@ -0,0 +1,525 @@ + + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Владелец + 18 + true + true + + true + + + Список.Версия.Owner + + + ВладелецРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ВладелецКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Версия + 4 + + <key>ru</key> + <value>Версия</value> + + true + true + + true + + + Список.Версия + + true + + ВерсияРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ВерсияКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Пользователь + 6 + + <key>ru</key> + <value>Пользователь</value> + + true + true + + true + + + Список.Пользователь + + true + + ПользовательРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ПользовательКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Путь + 8 + + <key>ru</key> + <value>Путь</value> + + true + true + + true + + + Список.Путь + + true + + ПутьРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ПутьКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Размер + 10 + + <key>ru</key> + <value>Размер</value> + + true + true + + true + + + Список.Размер + + true + + РазмерРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + РазмерКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ДатаПомещенияВРабочийКаталог + 12 + + <key>ru</key> + <value>Дата помещения в рабочий каталог</value> + + true + true + + true + + + Список.ДатаПомещенияВРабочийКаталог + + true + + ДатаПомещенияВРабочийКаталогРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + ДатаПомещенияВРабочийКаталогКонтекстноеМеню + 13 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + НаЧтение + 14 + + <key>ru</key> + <value>На чтение</value> + + true + true + + true + + + Список.НаЧтение + + true + + НаЧтениеРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + НаЧтениеКонтекстноеМеню + 15 + true + + CheckBoxField + Enter + true + Left + true + + + + ВРабочемКаталогеВладельца + 20 + true + true + + true + + + Список.ВРабочемКаталогеВладельца + + + ВРабочемКаталогеВладельцаРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ВРабочемКаталогеВладельцаКонтекстноеМеню + 21 + true + + CheckBoxField + Enter + true + Left + true + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 23 + + СписокСтрокаПоискаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 24 + true + + Список + + true + + + + СписокСостояниеПросмотра + 26 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 27 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 29 + + СписокУправлениеПоискомРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 30 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
    + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + InformationRegister.ФайлыВРабочемКаталоге + true + true + true + true + +
    + + + + + +
    diff --git a/SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/ФайлыВРабочемКаталоге.mdo b/SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/ФайлыВРабочемКаталоге.mdo new file mode 100644 index 000000000..db275bf1f --- /dev/null +++ b/SSL/src/InformationRegisters/ФайлыВРабочемКаталоге/ФайлыВРабочемКаталоге.mdo @@ -0,0 +1,199 @@ + + + + + + + + + + + + ФайлыВРабочемКаталоге + + ru + Файлы в рабочем каталоге + + InformationRegister.ФайлыВРабочемКаталоге.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + Путь + + ru + Путь + + Относительный путь к файлу (путь к рабочему каталогу сюда не входит) + + String + + 255 + + + + + Use + Use + + Index + + + Размер + + ru + Размер + + Размер файла в байтах + + Number + + 10 + + + + + Use + Use + + 0 + + + + ДатаПомещенияВРабочийКаталог + + ru + Дата помещения в рабочий каталог + + Дата помещения в рабочий каталог + + Date + + + + + Use + Use + + 0001-01-01T00:00:00 + + + + НаЧтение + + ru + На чтение + + Файл помещен на чтение + + Boolean + + + + Use + Use + + + + ВРабочемКаталогеВладельца + + ru + В рабочем каталоге владельца + + если Истина - файл находится в рабочем каталоге владельца, если Ложь - в локальном кэше файлов + + Boolean + + + + Use + Use + + + + Версия + + ru + Версия + + Версия файла + + CatalogRef.ВерсииФайлов + + + + DontUse + Use + Use + Use + true + + Catalog.ВерсииФайлов.EmptyRef + + true + true + + + Пользователь + + ru + Пользователь + + Пользователь + + CatalogRef.Пользователи + + + + DontUse + Use + Use + Use + true + + Catalog.Пользователи.EmptyRef + + true + true + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/Reports/АнализОпроса/Forms/РасшифровкаПростыхОтветов/Form.form b/SSL/src/Reports/АнализОпроса/Forms/РасшифровкаПростыхОтветов/Form.form new file mode 100644 index 000000000..d015ebfe4 --- /dev/null +++ b/SSL/src/Reports/АнализОпроса/Forms/РасшифровкаПростыхОтветов/Form.form @@ -0,0 +1,294 @@ + + + + ВариантОтчета + 3 + true + true + + true + + + ВариантОтчета + + + OnChange + ВариантОтчетаПриИзменении + + + ВариантОтчетаРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + + ВариантОтчетаКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + + + ru + С группировкой по респонденту + + + Респонденты + + + + + ru + С группировкой по ответам + + + Ответы + + + Normal + + + + ТаблицаОтчета + 1 + true + true + + true + + + ТаблицаОтчета + + None + + ТаблицаОтчетаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ТаблицаОтчетаКонтекстноеМеню + 2 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + 50 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Always + Auto + true + true + true + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ВопросШаблонаАнкеты + + <key>ru</key> + <value>Вопрос шаблона анкеты</value> + + 1 + + CatalogRef.ВопросыШаблонаАнкеты + + + true + + + true + + + + ТаблицаОтчета + + <key>ru</key> + <value>Таблица отчета</value> + + 2 + + SpreadsheetDocument + + + true + + + true + + + + + Опрос + + <key>ru</key> + <value>Опрос</value> + + 3 + + DocumentRef.НазначениеОпросов + + + true + + + true + + + + ВариантОтчета + + <key>ru</key> + <value>Вариант отчета</value> + + 4 + + String + + 100 + + + + true + + + true + + + + ПолныйКод + + <key>ru</key> + <value>Полный код</value> + + 5 + + String + + 50 + + + + true + + + true + + + + ДатаОпроса + + <key>ru</key> + <value>Дата опроса</value> + + 6 + + Date + + Date + + + + true + + + true + + + + НаименованиеОпроса + + <key>ru</key> + <value>Наименование опроса</value> + + 7 + + String + + 80 + + + + true + + + true + + + + Формулировка + + <key>ru</key> + <value>Формулировка</value> + + 8 + + String + + 300 + + + + true + + + true + + + + + + + diff --git a/SSL/src/Reports/АнализОпроса/Forms/РасшифровкаПростыхОтветов/Module.bsl b/SSL/src/Reports/АнализОпроса/Forms/РасшифровкаПростыхОтветов/Module.bsl new file mode 100644 index 000000000..073485631 --- /dev/null +++ b/SSL/src/Reports/АнализОпроса/Forms/РасшифровкаПростыхОтветов/Module.bsl @@ -0,0 +1,101 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ + +// Формирует отчёт +&НаСервере +Процедура СформироватьОтчёт() + + ТаблицаОтчета.Очистить(); + СКД = Отчеты.АнализОпроса.ПолучитьМакет("ПростыеВопросы"); + Настройки = СКД.ВариантыНастроек[ВариантОтчета].Настройки; + + СКД.Параметры.ВопросШаблонаАнкеты.Значение = ВопросШаблонаАнкеты; + СКД.Параметры.Опрос.Значение = Опрос; + + КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; + МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД,Настройки); + + ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; + ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки); + + ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; + ПроцессорВывода.УстановитьДокумент(ТаблицаОтчета); + ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); + + ТаблицаОтчета.ОтображатьСетку = Ложь; + ТаблицаОтчета.ОтображатьЗаголовки = Ложь; + ТаблицаОтчета.Показать(); + +КонецПроцедуры // () + +// Обрабатывает входящие параметры формы +// +// Возвращаемое значение: +// Булево - отказ от запуска формы +// +&НаСервере +Функция ОбработатьВходящиеПараметры() + + Если Параметры.Свойство("ВопросШаблонаАнкеты") Тогда + ВопросШаблонаАнкеты = Параметры.ВопросШаблонаАнкеты; + Иначе + Возврат Истина; + КонецЕсли; + + Если Параметры.Свойство("Опрос") Тогда + Опрос = Параметры.Опрос; + Иначе + Отказ = Истина; + КонецЕсли; + + Если Параметры.Свойство("ПолныйКод") Тогда + ПолныйКод = Параметры.ПолныйКод; + Иначе + Отказ = Истина; + КонецЕсли; + + Если Параметры.Свойство("НаименованиеОпроса") Тогда + НаименованиеОпроса = Параметры.НаименованиеОпроса; + Иначе + Отказ = Истина; + КонецЕсли; + + + + Если Параметры.Свойство("ДатаОпроса") Тогда + ДатаОпроса = Параметры.ДатаОпроса; + Иначе + Отказ = Истина; + КонецЕсли; + + Если Параметры.Свойство("ВариантОтчета") Тогда + ВариантОтчета = Параметры.ВариантОтчета; + Иначе + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции // () + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Отказ = ОбработатьВходящиеПараметры(); + + Заголовок = "Ответы на вопрос № " + ПолныйКод + " опроса " + НаименованиеОпроса + " от " + Формат(ДатаОпроса,"ДФ=dd.MM.yyyy"); + + СформироватьОтчёт(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВариантОтчетаПриИзменении(Элемент) + + СформироватьОтчёт(); + +КонецПроцедуры diff --git a/SSL/src/Reports/АнализОпроса/Forms/РасшифровкаТабличныхВопросов/Form.form b/SSL/src/Reports/АнализОпроса/Forms/РасшифровкаТабличныхВопросов/Form.form new file mode 100644 index 000000000..0980475f6 --- /dev/null +++ b/SSL/src/Reports/АнализОпроса/Forms/РасшифровкаТабличныхВопросов/Form.form @@ -0,0 +1,292 @@ + + + + ТаблицаОтчета + 1 + true + true + + true + + + ТаблицаОтчета + + None + + ТаблицаОтчетаРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + ТаблицаОтчетаКонтекстноеМеню + 2 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + 50 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Always + Auto + true + true + true + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ТипТабличногоВопроса + + <key>ru</key> + <value>Тип табличного вопроса</value> + + 1 + + EnumRef.ТипыТабличныхВопросов + + + true + + + true + + + + Опрос + + <key>ru</key> + <value>Опрос</value> + + 2 + + DocumentRef.НазначениеОпросов + + + true + + + true + + + + ВопросШаблонаАнкеты + + <key>ru</key> + <value>Вопрос шаблона анкеты</value> + + 3 + + CatalogRef.ВопросыШаблонаАнкеты + + + true + + + true + + + + ТаблицаОтчета + + <key>ru</key> + <value>Таблица отчета</value> + + 4 + + SpreadsheetDocument + + + true + + + true + + + + + СоставТабличногоВопроса + + <key>ru</key> + <value>Состав табличного вопроса</value> + + 5 + + ValueTable + + + true + + + true + + + ЭлементарныйВопрос + + <key>ru</key> + <value>Элементарный вопрос</value> + + 1 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + + ПредопределенныеОтветы + + <key>ru</key> + <value>Предопределенные ответы</value> + + 6 + + ValueTable + + + true + + + true + + + ЭлементарныйВопрос + + <key>ru</key> + <value>Элементарный вопрос</value> + + 1 + + ChartOfCharacteristicTypesRef.ВопросыДляАнкетирования + + + true + + + true + + + + Ответ + + <key>ru</key> + <value>Ответ</value> + + 2 + + Characteristic.ВопросыДляАнкетирования + + + true + + + true + + + + + НаименованиеОпроса + + <key>ru</key> + <value>Наименование опроса</value> + + 7 + + String + + 80 + + + + true + + + true + + + + ДатаОпроса + + <key>ru</key> + <value>Дата опроса</value> + + 8 + + Date + + Date + + + + true + + + true + + + + Формулировка + + <key>ru</key> + <value>Формулировка</value> + + 9 + + String + + 300 + + + + true + + + true + + + + + + + diff --git a/SSL/src/Reports/АнализОпроса/Forms/РасшифровкаТабличныхВопросов/Module.bsl b/SSL/src/Reports/АнализОпроса/Forms/РасшифровкаТабличныхВопросов/Module.bsl new file mode 100644 index 000000000..02ef86784 --- /dev/null +++ b/SSL/src/Reports/АнализОпроса/Forms/РасшифровкаТабличныхВопросов/Module.bsl @@ -0,0 +1,386 @@ +Перем ФормулировкиЭлементарныхВопросов; + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ + +// Формирует отчет +// +&НаСервере +Процедура СформироватьОтчет() + + ТаблицаОтчета.Очистить(); + + РезультатЗапроса = ВыполнитьЗапросПоВопросуАнкеты(); + Если РезультатЗапроса.Пустой() Тогда + Возврат; + КонецЕсли; + + Макет = Отчеты.АнализОпроса.ПолучитьМакет("МакетОтветы"); + + Область = Макет.ПолучитьОбласть("Вопрос"); + Область.Параметры.ФормулировкаВопроса = Формулировка; + ТаблицаОтчета.Вывести(Область,1); + + ДеревоОтветов = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); + Для каждого СтрокаДерева Из ДеревоОтветов.Строки Цикл + ВывестиВДокументРеспондентов(СтрокаДерева,Макет); + КонецЦикла; + + ТаблицаОтчета.Показать() + +КонецПроцедуры // СформироватьОтчет() + +&НаСервере +Процедура ВывестиВДокументРеспондентов(СтрокаДерева,Макет) + + Область = Макет.ПолучитьОбласть("Респондент"); + Область.Параметры.Респондент = СтрокаДерева.Респондент; + ТаблицаОтчета.Вывести(Область,1); + + ТаблицаОтчета.НачатьГруппуСтрок(СтрокаДерева.Респондент); + ВывестиТабличныйОтвет(СтрокаДерева,Макет); + ТаблицаОтчета.ЗакончитьГруппуСтрок(); + +КонецПроцедуры + +&НаСервере +Процедура ВывестиТабличныйОтвет(СтрокаДерева,Макет) + + Если ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Тогда + + ВывестиОтветСоставнойТабличныйВопрос(СтрокаДерева,Макет); + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда + + ВывестиОтветПредопределенныеОтветыВКолонкахТабличныйВопрос(СтрокаДерева,Макет); + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда + + ВывестиОтветПредопределенныеОтветыВСтрокахТабличныйВопрос(СтрокаДерева,Макет); + + ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + + ВывестиОтветПредопределенныеОтветыВСтрокахИКолонкахТабличныйВопрос(СтрокаДерева,Макет); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ВывестиОтветСоставнойТабличныйВопрос(СтрокаДерева,Макет) + + ПерваяКолонка = Истина; + + Для каждого Вопрос Из СоставТабличногоВопроса Цикл + + Если ПерваяКолонка Тогда + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + ПерваяКолонка = Ложь; + КонецЕсли; + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + Область.Параметры.Значение = ФормулировкиЭлементарныхВопросов.Получить(Вопрос.ЭлементарныйВопрос); + ТаблицаОтчета.Присоединить(Область); + + КонецЦикла; + + ПерваяКолонка = Истина; + + Для каждого СтрокаДереваЯчейка Из СтрокаДерева.Строки Цикл + + ПерваяКолонка = Истина; + + Для каждого СтрокаСоставаТабличногоВопроса Из СоставТабличногоВопроса Цикл + + НайденнаяСтрока = СтрокаДереваЯчейка.Строки.Найти(СтрокаСоставаТабличногоВопроса.ЭлементарныйВопрос,"ЭлементарныйВопрос"); + + Если ПерваяКолонка Тогда + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + ПерваяКолонка = Ложь; + КонецЕсли; + + Область = Макет.ПолучитьОбласть("ЯчейкаТабличногоВопроса"); + Область.Параметры.Значение = ?(НайденнаяСтрока = Неопределено,"",НайденнаяСтрока.Ответ); + ТаблицаОтчета.Присоединить(Область); + + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ВывестиОтветПредопределенныеОтветыВКолонкахТабличныйВопрос(СтрокаДерева,Макет) + + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + ТаблицаОтчета.Присоединить(Область); + + Для Каждого Ответ Из ПредопределенныеОтветы Цикл + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + Область.Параметры.Значение = Ответ.Ответ; + ТаблицаОтчета.Присоединить(Область); + + КонецЦикла; + + Для ИндексСтрок = 2 По СоставТабличногоВопроса.Количество() Цикл + + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + Область.Параметры.Значение = ФормулировкиЭлементарныхВопросов.Получить(СоставТабличногоВопроса[ИндексСтрок - 1].ЭлементарныйВопрос); + ТаблицаОтчета.Присоединить(Область); + + Для ИндексКолонок = 1 По ПредопределенныеОтветы.Количество() Цикл + + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("ЭлементарныйВопрос", СоставТабличногоВопроса[ИндексСтрок-1].ЭлементарныйВопрос); + СтруктураОтбора.Вставить("НомерЯчейки",ИндексКолонок); + НайденныеСтроки = СтрокаДерева.Строки.НайтиСтроки(СтруктураОтбора,Истина); + + Область = Макет.ПолучитьОбласть("ЯчейкаТабличногоВопроса"); + Если НайденныеСтроки.Количество() > 0 Тогда + Область.Параметры.Значение = НайденныеСтроки[0].Ответ; + КонецЕсли; + ТаблицаОтчета.Присоединить(Область); + + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ВывестиОтветПредопределенныеОтветыВСтрокахТабличныйВопрос(СтрокаДерева,Макет) + + ПерваяКолонка = Истина; + + Для каждого Вопрос Из СоставТабличногоВопроса Цикл + + Если ПерваяКолонка Тогда + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + ПерваяКолонка = Ложь; + КонецЕсли; + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + Область.Параметры.Значение = ФормулировкиЭлементарныхВопросов.Получить(Вопрос.ЭлементарныйВопрос); + ТаблицаОтчета.Присоединить(Область); + + КонецЦикла; + + Для каждого СтрокаДереваЯчейка Из СтрокаДерева.Строки Цикл + + ПерваяКолонка = Истина; + + Для ИндексКолонок = 1 По СоставТабличногоВопроса.Количество() Цикл + + Если ПерваяКолонка Тогда + + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + ПерваяКолонка = Ложь; + + Область = Макет.ПолучитьОбласть("ЭлементЯчейкиТабличногоВопросаПредопределенныйОтвет"); + Область.Параметры.Значение = ПредопределенныеОтветы[СтрокаДереваЯчейка.НомерЯчейки - 1].Ответ; + ТаблицаОтчета.Присоединить(Область); + + Иначе + + СтруктураОтбора = Новый Структура; + НайденнаяСтрока = СтрокаДереваЯчейка.Строки.Найти(СоставТабличногоВопроса[ИндексКолонок - 1].ЭлементарныйВопрос,"ЭлементарныйВопрос"); + + Область = Макет.ПолучитьОбласть("ЯчейкаТабличногоВопроса"); + Область.Параметры.Значение = ?(НайденнаяСтрока = Неопределено,"",НайденнаяСтрока.Ответ); + + ТаблицаОтчета.Присоединить(Область); + + КонецЕсли; + + КонецЦикла; + КонецЦикла; + +КонецПроцедуры // + +&НаСервере +Процедура ВывестиОтветПредопределенныеОтветыВСтрокахИКолонкахТабличныйВопрос(СтрокаДерева,Макет) + + ОтветыКолонки = ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",СоставТабличногоВопроса[1].ЭлементарныйВопрос)); + ОтветыСтроки = ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",СоставТабличногоВопроса[0].ЭлементарныйВопрос)); + + Если ОтветыКолонки.Количество() = 0 И ОтветыСтроки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + ТаблицаОтчета.Присоединить(Область); + + Для Каждого Ответ Из ОтветыКолонки Цикл + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + Область.Параметры.Значение = Ответ.Ответ; + ТаблицаОтчета.Присоединить(Область); + + КонецЦикла; + + Для ИндексСтроки = 1 По ОтветыСтроки.Количество() Цикл + + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + Область.Параметры.Значение = ОтветыСтроки[ИндексСтроки - 1].Ответ; + ТаблицаОтчета.Присоединить(Область); + + Для ИндексКолонки = 1 По ОтветыКолонки.Количество() Цикл + + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("НомерЯчейки", ИндексКолонки + (ИндексСтроки-1) * ОтветыКолонки.Количество()); + СтруктураОтбора.Вставить("ЭлементарныйВопрос",СоставТабличногоВопроса[2].ЭлементарныйВопрос); + НайденныеСтроки = СтрокаДерева.Строки.НайтиСтроки(СтруктураОтбора,Истина); + + Область = Макет.ПолучитьОбласть("ЯчейкаТабличногоВопроса"); + Если НайденныеСтроки.Количество() > 0 Тогда + Область.Параметры.Значение = НайденныеСтроки[0].Ответ; + КонецЕсли; + ТаблицаОтчета.Присоединить(Область); + + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры // + +// Выполняет запрос по шаблону анкеты +// +// Возвращаемое значение: +// РезультатЗапроса - результат выполненного запроса +// +&НаСервере +Функция ВыполнитьЗапросПоВопросуАнкеты() + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ДокументАнкета.Респондент КАК Респондент, + | ОтветыНаВопросыАнкет.НомерЯчейки КАК НомерЯчейки, + | ОтветыНаВопросыАнкет.ЭлементарныйВопрос КАК ЭлементарныйВопрос, + | ОтветыНаВопросыАнкет.Ответ + |ИЗ + | РегистрСведений.ОтветыНаВопросыАнкет КАК ОтветыНаВопросыАнкет + | ЛЕВОЕ СОЕДИНЕНИЕ Документ.Анкета КАК ДокументАнкета + | ПО ОтветыНаВопросыАнкет.Анкета = ДокументАнкета.Ссылка + |ГДЕ + | ОтветыНаВопросыАнкет.Вопрос = &ВопросШаблона + | И ДокументАнкета.Опрос = &Опрос + | + |УПОРЯДОЧИТЬ ПО + | Респондент, + | НомерЯчейки + |ИТОГИ ПО + | Респондент, + | НомерЯчейки"; + + Запрос.УстановитьПараметр("ВопросШаблона",ВопросШаблонаАнкеты); + Запрос.УстановитьПараметр("Опрос",Опрос); + + Возврат Запрос.Выполнить(); + +КонецФункции // ВыполнитьЗапросПоВопросуАнкеты() + +// Обрабатывает входящие параметры формы +// +// Возвращаемое значение: +// Булево - отказ от запуска формы +// +&НаСервере +Функция ОбработатьВходящиеПараметры() + + Если Параметры.Свойство("ВопросШаблонаАнкеты") Тогда + ВопросШаблонаАнкеты = Параметры.ВопросШаблонаАнкеты; + Иначе + Возврат Истина; + КонецЕсли; + + Если Параметры.Свойство("Опрос") Тогда + Опрос = Параметры.Опрос; + Иначе + Возврат Истина; + КонецЕсли; + + Если Параметры.Свойство("ПолныйКод") Тогда + ПолныйКод = Параметры.ПолныйКод; + Иначе + Отказ = Истина; + КонецЕсли; + + Если Параметры.Свойство("НаименованиеОпроса") Тогда + НаименованиеОпроса = Параметры.НаименованиеОпроса; + Иначе + Отказ = Истина; + КонецЕсли; + + Если Параметры.Свойство("ДатаОпроса") Тогда + ДатаОпроса = Параметры.ДатаОпроса; + Иначе + Отказ = Истина; + КонецЕсли; + + РеквизитыВопросШаблона = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ВопросШаблонаАнкеты,"ТипТабличногоВопроса,СоставТабличногоВопроса,ПредопределенныеОтветы,Формулировка"); + Формулировка = РеквизитыВопросШаблона.Формулировка; + ТипТабличногоВопроса = РеквизитыВопросШаблона.ТипТабличногоВопроса; + СоставТабличногоВопроса.Загрузить(РеквизитыВопросШаблона.СоставТабличногоВопроса.Выгрузить()); + ПредопределенныеОтветы.Загрузить(РеквизитыВопросШаблона.ПредопределенныеОтветы.Выгрузить()); + ПолучитьФормулировкиЭлементарныхВопросов(); + + Заголовок = "Ответы на вопрос № " + ПолныйКод + " опроса " + НаименованиеОпроса + " от " + Формат(ДатаОпроса,"ДФ=dd.MM.yyyy");; + + Возврат Ложь; + +КонецФункции // () + + &НаСервере + Функция ПолучитьФормулировкиЭлементарныхВопросов() + + ФормулировкиЭлементарныхВопросов = Новый Соответствие; + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ВопросыДляАнкетирования.Ссылка, + | ВопросыДляАнкетирования.Формулировка, + | ВопросыДляАнкетирования.АгрегироватьСуммуВОтчетах + |ИЗ + | ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования + |ГДЕ + | ВопросыДляАнкетирования.Ссылка В(&МассивВопросов)"; + + Запрос.УстановитьПараметр("МассивВопросов",СоставТабличногоВопроса.Выгрузить().ВыгрузитьКолонку("ЭлементарныйВопрос")); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + ФормулировкиЭлементарныхВопросов.Вставить(Выборка.Ссылка,Выборка.Формулировка); + КонецЦикла; + + Возврат ФормулировкиЭлементарныхВопросов; + + КонецФункции // () + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Отказ = ОбработатьВходящиеПараметры(); + СформироватьОтчет(); + +КонецПроцедуры + diff --git a/SSL/src/Reports/АнализОпроса/Forms/ФормаОтчета/Form.form b/SSL/src/Reports/АнализОпроса/Forms/ФормаОтчета/Form.form new file mode 100644 index 000000000..bab05c365 --- /dev/null +++ b/SSL/src/Reports/АнализОпроса/Forms/ФормаОтчета/Form.form @@ -0,0 +1,363 @@ + + + + Кнопка + 5 + true + true + + true + + false + + КнопкаРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + UsualButton + Form.Command.Сформировать + Normal + Auto + true + true + UserCmds + Auto + + + ВидОтчета + 6 + true + true + + true + + + ВидОтчета + + + ВидОтчетаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ВидОтчетаКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + + + ru + Анализ ответов + + + Анализ ответов + + + + + ru + Анализ ответивших + + + Анализ ответивших + + + Normal + + + + Опрос + 3 + true + true + + true + + + Опрос + + + ОпросРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ОпросКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаОтчета + 1 + true + true + + true + + + ТаблицаОтчета + + None + + ТаблицаОтчетаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ТаблицаОтчетаКонтекстноеМеню + 2 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + + DetailProcessing + ТаблицаОтчетаОбработкаРасшифровки + + 50 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Always + Auto + true + true + true + + + None + false + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Отчет + 1 + + ReportObject.АнализОпроса + + + true + + + true + +
    true
    +
    + + ТаблицаОтчета + 2 + + SpreadsheetDocument + + + true + + + true + + + + + Опрос + + <key>ru</key> + <value>Опрос</value> + + 3 + + DocumentRef.НазначениеОпросов + + + true + + + true + + + + ПредопределеныеЗначенияНеобходимыеНаКлиенте + + <key>ru</key> + <value>Предопределеные значения необходимые на клиенте</value> + + 4 + + ValueList + + + true + + + true + + + + + + + НаименованиеОпроса + + <key>ru</key> + <value>Наименование опроса</value> + + 5 + + String + + 80 + + + + true + + + true + + + + ДатаОпроса + + <key>ru</key> + <value>Дата опроса</value> + + 6 + + Date + + Date + + + + true + + + true + + + + ВидОтчета + + <key>ru</key> + <value>Вид отчета</value> + + 7 + + String + + + + true + + + true + + + + Сформировать + + <key>ru</key> + <value>Сформировать</value> + + 1 + + ru + Сформировать + + + true + + + + Сформировать + + + Auto + Auto + + + + + + + ShowOnComposition + +
    diff --git a/SSL/src/Reports/АнализОпроса/Forms/ФормаОтчета/Module.bsl b/SSL/src/Reports/АнализОпроса/Forms/ФормаОтчета/Module.bsl new file mode 100644 index 000000000..8ad4584ed --- /dev/null +++ b/SSL/src/Reports/АнализОпроса/Forms/ФормаОтчета/Module.bsl @@ -0,0 +1,74 @@ +&НаКлиенте +Перем ЗначенияПеречисленияТипыВопросовШаблонаАнкеты; + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ + +&НаСервере +Процедура СформироватьОтчет() + + РеквизитФормыВЗначение("Отчет").СформироватьОтчет(ТаблицаОтчета, Опрос,ВидОтчета); + РеквизитыОпрос = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(Опрос,"Наименование,Дата"); + НаименованиеОпроса = РеквизитыОпрос.Наименование; + ДатаОпроса = РеквизитыОпрос.Дата; + +КонецПроцедуры // СформироватьОтчет() + +// Процедура получает необходмые значения предопределенных значений, +// необходимых на клиенте. +&НаСервере +Процедура ПолучениеПредопределенныхЗначенийНеобходимыхНаКлиенте() + + ПеречислениеТипыВопросовШаблонаАнкеты = Анкетирование.ПолучитьСтруктуруЗначенияПеречисления("ТипыВопросовШаблонаАнкеты",Истина); + ПредопределеныеЗначенияНеобходимыеНаКлиенте.Вставить(0,ПеречислениеТипыВопросовШаблонаАнкеты); + +КонецПроцедуры // ПредопределеныеЗначенияНеобходимыеНаКлиенте() + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ПолучениеПредопределенныхЗначенийНеобходимыхНаКлиенте(); + ВидОтчета = "Анализ ответов"; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + ЗначенияПеречисленияТипыВопросовШаблонаАнкеты = ПредопределеныеЗначенияНеобходимыеНаКлиенте.Получить(0).Значение; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +//КОМАНДЫ ФОРМЫ + +&НаКлиенте +Процедура Сформировать(Команда) + + Если Опрос.Пустая() Тогда + Возврат; + КонецЕсли; + + СформироватьОтчет(); + ТаблицаОтчета.Показать(); + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ТаблицаОтчетаОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Если Расшифровка.ТипВопроса = ЗначенияПеречисленияТипыВопросовШаблонаАнкеты.Табличный Тогда + ОткрытьФорму("Отчет.АнализОпроса.Форма.РасшифровкаТабличныхВопросов",Новый Структура("Опрос,ВопросШаблонаАнкеты,ПолныйКод,НаименованиеОпроса,ДатаОпроса", + Опрос,Расшифровка.ВопросШаблона,Расшифровка.ПолныйКод,НаименованиеОпроса,ДатаОпроса),ЭтаФорма); + Иначе + ОткрытьФорму("Отчет.АнализОпроса.Форма.РасшифровкаПростыхОтветов",Новый Структура("Опрос,ВопросШаблонаАнкеты,ВариантОтчета,ПолныйКод,НаименованиеОпроса,ДатаОпроса", + Опрос,Расшифровка.ВопросШаблона,"Респонденты",Расшифровка.ПолныйКод,НаименованиеОпроса,ДатаОпроса),ЭтаФорма); + КонецЕсли; + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/Reports/АнализОпроса/ObjectModule.bsl b/SSL/src/Reports/АнализОпроса/ObjectModule.bsl new file mode 100644 index 000000000..272d86133 --- /dev/null +++ b/SSL/src/Reports/АнализОпроса/ObjectModule.bsl @@ -0,0 +1,1100 @@ +Перем ПредставленияВопросов; + +// Формирует табличный документ отчет +// +// Параметры +// ТаблицаОтчета - ТабличныйДокумент - +// Опрос - ДокументСсылка.НазначениеОпросов - Опрос, по которому формируется отчет +// +Процедура СформироватьОтчет(ТаблицаОтчета,Опрос,ВидОтчета) Экспорт + + ТаблицаОтчета.Очистить(); + + Если ВидОтчета = "Анализ ответов" Тогда + + СформироватьОтчетАнализОтветов(ТаблицаОтчета,Опрос); + + ИначеЕсли ВидОтчета = "Анализ ответивших" Тогда + + СформироватьОтчетАнализОтветивших(ТаблицаОтчета,Опрос); + + Иначе + + Возврат; + + КонецЕсли; + +КонецПроцедуры // + +////////////////////////////////////////////////////////////////////////////////////////////////// +// Общие процедуры и функции видов отчета + +// Формирует представление опроса для заголовка отчёта +Функция ПолучитьПредставлениеОпросаДляЗаголовка(РеквизитыОпрос) + + ПредставлениеОпросаДляЗаголовка = НСтр("ru='Опрос '"); + Если РеквизитыОпрос.ДатаНачала <> Дата(1,1,1) ИЛИ РеквизитыОпрос.ДатаОкончания <> Дата(1,1,1) Тогда + ПредставлениеОпросаДляЗаголовка = ПредставлениеОпросаДляЗаголовка + НСтр("ru='проводился в период '"); + КонецЕсли; + + Если РеквизитыОпрос.ДатаНачала <> Дата(1,1,1) Тогда + ПредставлениеОпросаДляЗаголовка = ПредставлениеОпросаДляЗаголовка + НСтр("ru='с '") + Формат(РеквизитыОпрос.ДатаНачала,"ДФ=dd.MM.yy") + " "; + КонецЕсли; + + Если РеквизитыОпрос.ДатаОкончания <> Дата(1,1,1) Тогда + ПредставлениеОпросаДляЗаголовка = ПредставлениеОпросаДляЗаголовка + НСтр("ru = 'по '") + Формат(РеквизитыОпрос.ДатаОкончания,"ДФ=dd.MM.yy")+ " "; + КонецЕсли; + + ПредставлениеОпросаДляЗаголовка = ПредставлениеОпросаДляЗаголовка + НСтр("ru = 'на основании документа '") + РеквизитыОпрос.Представление + "."; + + Возврат ПредставлениеОпросаДляЗаголовка; + +КонецФункции // () + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Анализ ответов + +Процедура СформироватьОтчетАнализОтветов(ТаблицаОтчета,Опрос) + + РеквизитыОпрос = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(Опрос,"ШаблонАнкеты,ДатаНачала,ДатаОкончания,Представление"); + ШаблонАнкеты = РеквизитыОпрос.ШаблонАнкеты; + ПредставленияВопросов = Анкетирование.ПолучитьПредставленияЭлементарныхВопросовТабличногоВопроса(ШаблонАнкеты); + + РезультатЗапроса = ВыполнитьЗапросПоВопросамШаблонаАнкеты(Опрос,ШаблонАнкеты); + Если РезультатЗапроса.Пустой() Тогда + Возврат; + КонецЕсли; + + Макет = ПолучитьМакет("МакетОтветы"); + + Область = Макет.ПолучитьОбласть("Заголовок"); + Область.Параметры.Заголовок = ШаблонАнкеты.Заголовок; + Область.Параметры.Опрос = ПолучитьПредставлениеОпросаДляЗаголовка(РеквизитыОпрос); + ТаблицаОтчета.Вывести(Область,1); + + Область = Макет.ПолучитьОбласть("ПустаяСтрока"); + ТаблицаОтчета.Вывести(Область,1); + ТаблицаОтчета.НачатьГруппуСтрок("Аннотация"); + + Область = Макет.ПолучитьОбласть("Аннотация"); + ТаблицаОтчета.Вывести(Область,2); + ТаблицаОтчета.ЗакончитьГруппуСтрок(); + + Область = Макет.ПолучитьОбласть("ПустаяСтрока"); + ТаблицаОтчета.Вывести(Область,1); + + ДеревоАнкеты = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); + Если ДеревоАнкеты.Строки.Количество() > 0 Тогда + ВывестиВТабличныйДокумент(ДеревоАнкеты.Строки,ТаблицаОтчета,Макет,1,Новый Массив); + КонецЕсли; + +КонецПроцедуры + +// Вызывается рекурсивно, формирует полный код, и вызывает процедуры вывода вопросов и разделов . +// +// Параметры +// СтрокиДерева - СтрокиДереваЗначений - +// ТаблицаОтчета - ТабличныйДокумент - +// Макет - Макет - +// УровеньРекурсии - Число - +// МассивПолныйКод - Массив - +// +Процедура ВывестиВТабличныйДокумент(СтрокиДерева,ТаблицаОтчета,Макет,УровеньРекурсии,МассивПолныйКод) + + Если МассивПолныйКод.Количество() < УровеньРекурсии Тогда + МассивПолныйКод.Добавить(0); + КонецЕсли; + + Для каждого СтрокаДерева Из СтрокиДерева Цикл + + МассивПолныйКод[УровеньРекурсии-1] = МассивПолныйКод[УровеньРекурсии-1] + 1; + Для инд = УровеньРекурсии По МассивПолныйКод.Количество()-1 Цикл + МассивПолныйКод[инд] = 0; + КонецЦикла; + + ПолныйКод = АнкетированиеКлиентСервер.ПреобразоватьМассивВСтроку(МассивПолныйКод,"."); + ПолныйКод = АнкетированиеКлиентСервер.УдалитьПоследниеСимволыИзСтроки(ПолныйКод,"0.","."); + + + Если СтрокаДерева.ЭтоРаздел Тогда + ВывестиРаздел(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод); + Если СтрокаДерева.Строки.Количество() > 0 Тогда + ВывестиВТабличныйДокумент(СтрокаДерева.Строки,ТаблицаОтчета,Макет,УровеньРекурсии + 1,МассивПолныйКод); + КонецЕсли + Иначе + ВывестиВопрос(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод); + КонецЕсли; + ТаблицаОтчета.ЗакончитьГруппуСтрок(); + + КонецЦикла; + +КонецПроцедуры // () + +// Выводит в таблицу отчета раздел. +// +// Параметры +// ТаблицаОтчета - ТабличныйДокумент - +// СтрокаДерева - СтрокаДереваЗначений - +// Макет - Макет - +// Полный код - Строка +// +Процедура ВывестиРаздел(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод) + + Область = Макет.ПолучитьОбласть("Раздел"); + Область.Параметры.ИмяРаздела = ПолныйКод + " " + СтрокаДерева.Наименование; + ТаблицаОтчета.Вывести(Область); + ТаблицаОтчета.НачатьГруппуСтрок("ПолныйКод_" + СтрокаДерева.Наименование); + +КонецПроцедуры + +// Выводит в таблицу отчета вопрос, и вызывает соответствующие процедуры, в зависимости от типа вопроса. +// +// Параметры +// ТаблицаОтчета - ТабличныйДокумент - +// СтрокаДерева - СтрокаДереваЗначений - +// Макет - Макет - +// Полный код - Строка +// +Процедура ВывестиВопрос(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод) + + Область = Макет.ПолучитьОбласть("Вопрос"); + Область.Параметры.ФормулировкаВопроса = ПолныйКод + " " + СтрокаДерева.Наименование; + ТаблицаОтчета.Вывести(Область); + ТаблицаОтчета.НачатьГруппуСтрок("ПолныйКод_" + СтрокаДерева.Наименование); + + Если СтрокаДерева.Строки.Количество() > 0 Тогда + + Если СтрокаДерева.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда + + ВывестиОтветТабличныйВопрос(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод); + + Иначе + + ВывестиОтветПростойВопрос(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Вызывает соответствующие процедуры в зависимости от типа табличного вопроса. +// +// Параметры +// ТаблицаОтчета - ТабличныйДокумент - +// СтрокаДерева - СтрокаДереваЗначений - +// Макет - Макет - +// +Процедура ВывестиОтветТабличныйВопрос(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод) + + Если СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Тогда + + ВывестиОтветСоставнойТабличныйВопрос(ТаблицаОтчета,СтрокаДерева.Строки[0],Макет,ПолныйКод); + + ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда + + ВывестиОтветПредопределенныеОтветыВКолонкахТабличныйВопрос(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод); + + ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда + + ВывестиОтветПредопределенныеОтветыВСтрокахТабличныйВопрос(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод); + + ИначеЕсли СтрокаДерева.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда + + ВывестиОтветПредопределенныеОтветыВСтрокахИКолонкахТабличныйВопрос(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод); + + КонецЕсли; + +КонецПроцедуры + +// Выводит в таблицу отчета ответы табличного вопроса с предопределенными ответами в колонках. +// +// Параметры +// ТаблицаОтчета - ТабличныйДокумент - +// СтрокаДерева - СтрокаДереваЗначений - +// Макет - Макет - +// +Процедура ВывестиОтветПредопределенныеОтветыВКолонкахТабличныйВопрос(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод) + + СтрокаДереваДетали = СтрокаДерева.Строки[0]; + + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + ТаблицаОтчета.Присоединить(Область); + + СтрокаДереваДетали.ПредопределенныеОтветы.Сортировать("НомерСтроки Возр"); + СтрокаДереваДетали.СоставТабличногоВопроса.Сортировать("НомерСтроки Возр"); + Для Каждого Ответ Из СтрокаДереваДетали.ПредопределенныеОтветы Цикл + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + Область.Параметры.Значение = Ответ.Ответ; + ТаблицаОтчета.Присоединить(Область); + + КонецЦикла; + + Для ИндексСтрок = 2 По СтрокаДереваДетали.СоставТабличногоВопроса.Количество() Цикл + + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + Область.Параметры.Значение = ПредставленияВопросов.Получить(СтрокаДереваДетали.СоставТабличногоВопроса[ИндексСтрок - 1].ЭлементарныйВопрос).Формулировка; + ТаблицаОтчета.Присоединить(Область); + + Для ИндексКолонок = 1 По СтрокаДереваДетали.ПредопределенныеОтветы.Количество() Цикл + + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("ЭлементарныйВопросРегистр",СтрокаДереваДетали.СоставТабличногоВопроса[ИндексСтрок-1].ЭлементарныйВопрос); + СтруктураОтбора.Вставить("НомерЯчейки",ИндексКолонок); + НайденныеСтроки = СтрокаДерева.Строки.НайтиСтроки(СтруктураОтбора); + + Область = Макет.ПолучитьОбласть("ЯчейкаТабличногоВопроса"); + Если НайденныеСтроки.Количество() > 0 Тогда + Если ТипЗнч(НайденныеСтроки[0].ВариантОтвета) <> Тип("Булево") Тогда + Область.Параметры.Значение = АгрегатныеЗначенияВСтроку(НайденныеСтроки[0],ПредставленияВопросов.Получить(СтрокаДереваДетали.СоставТабличногоВопроса[ИндексСтрок-1].ЭлементарныйВопрос).АгрегироватьСуммуВОтчетах); + Область.Параметры.Расшифровка = Новый Структура("ВопросШаблона,ТипВопроса,ПолныйКод",СтрокаДерева.ВопросШаблона,СтрокаДерева.ТипВопроса,ПолныйКод); + Иначе + Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл + Если НайденнаяСтрока.ВариантОтвета = Истина Тогда + Область.Параметры.Значение = НайденнаяСтрока.Количество; + Область.Параметры.Расшифровка = Новый Структура("ВопросШаблона,ТипВопроса,ПолныйКод",СтрокаДерева.ВопросШаблона,СтрокаДерева.ТипВопроса,ПолныйКод); + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; + ТаблицаОтчета.Присоединить(Область); + + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +// Выводит в таблицу отчета ответы табличного вопроса с предопределенными ответами в строках. +// +// Параметры +// ТаблицаОтчета - ТабличныйДокумент - +// СтрокаДерева - СтрокаДереваЗначений - +// Макет - Макет - +// +Процедура ВывестиОтветПредопределенныеОтветыВСтрокахТабличныйВопрос(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод) + + ПерваяКолонка = Истина; + СтрокаДереваДетали = СтрокаДерева.Строки[0]; + СтрокаДереваДетали.ПредопределенныеОтветы.Сортировать("НомерСтроки Возр"); + СтрокаДереваДетали.СоставТабличногоВопроса.Сортировать("НомерСтроки Возр"); + + Для каждого Вопрос Из СтрокаДереваДетали.СоставТабличногоВопроса Цикл + + Если ПерваяКолонка Тогда + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + ПерваяКолонка = Ложь; + КонецЕсли; + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + Область.Параметры.Значение = ПредставленияВопросов.Получить(Вопрос.ЭлементарныйВопрос).Формулировка; + ТаблицаОтчета.Присоединить(Область); + + КонецЦикла; + + Для ИндексСтрок = 1 По СтрокаДереваДетали.ПредопределенныеОтветы.Количество() Цикл + + ПерваяКолонка = Истина; + + Для ИндексКолонок = 1 По СтрокаДереваДетали.СоставТабличногоВопроса.Количество() Цикл + + Если ПерваяКолонка Тогда + + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + ПерваяКолонка = Ложь; + + Область = Макет.ПолучитьОбласть("ЭлементЯчейкиТабличногоВопросаПредопределенныйОтвет"); + Область.Параметры.Значение = СтрокаДереваДетали.ПредопределенныеОтветы[ИндексСтрок -1].Ответ; + ТаблицаОтчета.Присоединить(Область); + + Иначе + + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("ЭлементарныйВопросРегистр",СтрокаДереваДетали.СоставТабличногоВопроса[ИндексКолонок-1].ЭлементарныйВопрос); + СтруктураОтбора.Вставить("НомерЯчейки",ИндексСтрок); + НайденныеСтроки = СтрокаДерева.Строки.НайтиСтроки(СтруктураОтбора); + + Область = Макет.ПолучитьОбласть("ЯчейкаТабличногоВопроса"); + Если НайденныеСтроки.Количество() > 0 Тогда + Если ТипЗнч(НайденныеСтроки[0].ВариантОтвета) <> Тип("Булево") Тогда + Область.Параметры.Значение = АгрегатныеЗначенияВСтроку(НайденныеСтроки[0],ПредставленияВопросов.Получить(СтрокаДереваДетали.СоставТабличногоВопроса[ИндексКолонок-1].ЭлементарныйВопрос).АгрегироватьСуммуВОтчетах); + Область.Параметры.Расшифровка = Новый Структура("ВопросШаблона,ТипВопроса,ПолныйКод",СтрокаДереваДетали.ВопросШаблона,СтрокаДереваДетали.ТипВопроса,ПолныйКод); + Иначе + Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл + Если НайденнаяСтрока.ВариантОтвета = Истина Тогда + Область.Параметры.Значение = НайденнаяСтрока.Количество; + Область.Параметры.Расшифровка = Новый Структура("ВопросШаблона,ТипВопроса,ПолныйКод",СтрокаДереваДетали.ВопросШаблона,СтрокаДереваДетали.ТипВопроса,ПолныйКод); + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; + ТаблицаОтчета.Присоединить(Область); + + КонецЕсли; + + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +// Выводит в таблицу отчета ответы табличного вопроса с предопределенными ответами в строках и колонках. +// +// Параметры +// ТаблицаОтчета - ТабличныйДокумент - +// СтрокаДерева - СтрокаДереваЗначений - +// Макет - Макет - +// +Процедура ВывестиОтветПредопределенныеОтветыВСтрокахИКолонкахТабличныйВопрос(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод) + + СтрокаДереваДетали = СтрокаДерева.Строки[0]; + + СтрокаДереваДетали.ПредопределенныеОтветы.Сортировать("НомерСтроки Возр"); + СтрокаДереваДетали.СоставТабличногоВопроса.Сортировать("НомерСтроки Возр"); + + Если СтрокаДереваДетали.СоставТабличногоВопроса.Количество() <> 3 Тогда + Возврат; + КонецЕсли; + + АгрегироватьСуммуВОтчетах = ПредставленияВопросов.Получить(СтрокаДереваДетали.СоставТабличногоВопроса[2].ЭлементарныйВопрос).АгрегироватьСуммуВОтчетах; + + ОтветыКолонки = СтрокаДереваДетали.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопросОтвет",СтрокаДереваДетали.СоставТабличногоВопроса[1].ЭлементарныйВопрос)); + ОтветыСтроки = СтрокаДереваДетали.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопросОтвет",СтрокаДереваДетали.СоставТабличногоВопроса[0].ЭлементарныйВопрос)); + + Если ОтветыКолонки.Количество() = 0 И ОтветыСтроки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + ТаблицаОтчета.Присоединить(Область); + + Для Каждого Ответ Из ОтветыКолонки Цикл + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + Область.Параметры.Значение = Ответ.Ответ; + ТаблицаОтчета.Присоединить(Область); + + КонецЦикла; + + Для ИндексСтроки = 1 По ОтветыСтроки.Количество() Цикл + + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + Область.Параметры.Значение = ОтветыСтроки[ИндексСтроки - 1].Ответ; + ТаблицаОтчета.Присоединить(Область); + + Для ИндексКолонки = 1 По ОтветыКолонки.Количество() Цикл + + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("НомерЯчейки", ИндексКолонки + (ИндексСтроки-1) * ОтветыКолонки.Количество()); + СтруктураОтбора.Вставить("ЭлементарныйВопросРегистр",СтрокаДереваДетали.СоставТабличногоВопроса[2].ЭлементарныйВопрос); + НайденныеСтроки = СтрокаДерева.Строки.НайтиСтроки(СтруктураОтбора); + + Область = Макет.ПолучитьОбласть("ЯчейкаТабличногоВопроса"); + Если НайденныеСтроки.Количество() > 0 Тогда + Если ТипЗнч(НайденныеСтроки[0].ВариантОтвета) <> Тип("Булево") Тогда + Область.Параметры.Значение = АгрегатныеЗначенияВСтроку(НайденныеСтроки[0],АгрегироватьСуммуВОтчетах); + Область.Параметры.Расшифровка = Новый Структура("ВопросШаблона,ТипВопроса,ПолныйКод",СтрокаДерева.ВопросШаблона,СтрокаДерева.ТипВопроса,ПолныйКод); + Иначе + Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл + Если НайденнаяСтрока.ВариантОтвета = Истина Тогда + Область.Параметры.Значение = НайденнаяСтрока.Количество; + Область.Параметры.Расшифровка = Новый Структура("ВопросШаблона,ТипВопроса",СтрокаДерева.ВопросШаблона,СтрокаДерева.ТипВопроса,ПолныйКод); + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; + ТаблицаОтчета.Присоединить(Область); + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +// Выводит в таблицу отчета ответы составного табличного вопроса. +// +// Параметры +// ТаблицаОтчета - ТабличныйДокумент - +// СтрокаДерева - СтрокаДереваЗначений - +// Макет - Макет - +// +Процедура ВывестиОтветСоставнойТабличныйВопрос(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод) + + ПерваяКолонка = Истина; + + СтрокаДерева.СоставТабличногоВопроса.Сортировать("НомерСтроки Возр"); + Для каждого Вопрос Из СтрокаДерева.СоставТабличногоВопроса Цикл + + Если ПерваяКолонка Тогда + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + ПерваяКолонка = Ложь; + КонецЕсли; + + Область = Макет.ПолучитьОбласть("ЭлементШапкиТабличногоВопроса"); + Область.Параметры.Значение = ПредставленияВопросов.Получить(Вопрос.ЭлементарныйВопрос).Формулировка; + ТаблицаОтчета.Присоединить(Область); + + КонецЦикла; + + Для ИндексСтрок = 1 По 3 Цикл + + ПерваяКолонка = Истина; + + Для ИндексКолонок = 1 По СтрокаДерева.СоставТабличногоВопроса.Количество() Цикл + + Если ПерваяКолонка Тогда + Область = Макет.ПолучитьОбласть("Отступ"); + ТаблицаОтчета.Вывести(Область); + ПерваяКолонка = Ложь; + КонецЕсли; + + Область = Макет.ПолучитьОбласть("ЯчейкаТабличногоВопроса"); + Область.Параметры.Расшифровка = Новый Структура("ВопросШаблона,ТипВопроса,ПолныйКод",СтрокаДерева.ВопросШаблона,СтрокаДерева.ТипВопроса,ПолныйКод); + ТаблицаОтчета.Присоединить(Область); + + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +// Выводит в таблицу отчета ответ простого вопроса. +// +// Параметры +// ТаблицаОтчета - ТабличныйДокумент - +// СтрокаДерева - СтрокаДереваЗначений - +// Макет - Макет - +// +Процедура ВывестиОтветПростойВопрос(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод) + + СтрокаДереваДетали = СтрокаДерева.Строки[0]; + + Если СтрокаДереваДетали.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Булево + ИЛИ СтрокаДереваДетали.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ОдинВариантИз + ИЛИ СтрокаДереваДетали.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда + + ВывестиОтветВариантыОтвета(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод); + + Иначе + + Область = Макет.ПолучитьОбласть("ОтветПростогоВопроса"); + Область.Параметры.Значение = АгрегатныеЗначенияВСтроку(СтрокаДереваДетали); + Область.Параметры.Расшифровка = Новый Структура("ВопросШаблона,ТипВопроса,ПолныйКод",СтрокаДерева.ВопросШаблона,СтрокаДерева.ТипВопроса,ПолныйКод); + ТаблицаОтчета.Вывести(Область); + + КонецЕсли; + +КонецПроцедуры + +// Выводит в таблицу отчета варианты ответов для вопросов с типом Булево, ОдинВариантИз,НесколькоВариантовИз +// +// Параметры +// ТаблицаОтчета - ТабличныйДокумент - +// СтрокаДерева - СтрокаДереваЗначений - +// Макет - Макет - +// +Процедура ВывестиОтветВариантыОтвета(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод) + + + Если СтрокаДерева.Строки[0].ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Булево Тогда + + Область = Макет.ПолучитьОбласть("ВариантыОтветов"); + Область.Параметры.ВариантОтвета = "Да"; + НайденнаяСтрока = СтрокаДерева.Строки.Найти(Истина,"ВариантОтвета"); + Если НайденнаяСтрока <> Неопределено Тогда + Область.Параметры.Значение = НайденнаяСтрока.Количество; + Область.Параметры.Расшифровка =Новый Структура("ВопросШаблона,ТипВопроса,ПолныйКод",СтрокаДерева.ВопросШаблона,СтрокаДерева.ТипВопроса,ПолныйКод); + КонецЕсли; + ТаблицаОтчета.Вывести(Область); + + Область = Макет.ПолучитьОбласть("ВариантыОтветов"); + Область.Параметры.ВариантОтвета = "Нет"; + НайденнаяСтрока = СтрокаДерева.Строки.Найти(ЛОЖЬ,"ВариантОтвета"); + Если НайденнаяСтрока <> Неопределено Тогда + Область.Параметры.Значение = НайденнаяСтрока.Количество; + Область.Параметры.Расшифровка = Новый Структура("ВопросШаблона,ТипВопроса,ПолныйКод",СтрокаДерева.ВопросШаблона,СтрокаДерева.ТипВопроса,ПолныйКод); + КонецЕсли; + ТаблицаОтчета.Вывести(Область); + + Иначе + + Для каждого СтрокаДетали Из СтрокаДерева.Строки Цикл + + Область = Макет.ПолучитьОбласть("ВариантыОтветов"); + Область.Параметры.ВариантОтвета = СтрокаДетали.ВариантОтвета; + Область.Параметры.Значение = СтрокаДетали.Количество; + Область.Параметры.Расшифровка = Новый Структура("ВопросШаблона,ТипВопроса,ПолныйКод",СтрокаДерева.ВопросШаблона,СтрокаДерева.ТипВопроса,ПолныйКод); + ТаблицаОтчета.Вывести(Область); + + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +// Выполняет запрос по шаблону анкеты и данным регистра ответов +// +// Параметры +// Опрос - ДокументСсылка.НазначениеОпросов - Опрос, по которому строится запрос +// ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет, по которому проводился опрос +// +// Возвращаемое значение: +// РезультатЗапроса - результат выполненного запроса +// +Функция ВыполнитьЗапросПоВопросамШаблонаАнкеты(Опрос,ШаблонАнкеты) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ВопросыШаблонаАнкеты.Формулировка КАК Наименование, + | ВопросыШаблонаАнкеты.Ссылка КАК ВопросШаблона, + | ВопросыШаблонаАнкеты.ЭтоГруппа КАК ЭтоРаздел, + | ОсновнойЗапрос.ЭлементарныйВопросРегистр, + | ОсновнойЗапрос.НомерЯчейки КАК НомерЯчейки, + | ОсновнойЗапрос.ВариантОтвета, + | ЕСТЬNULL(ОсновнойЗапрос.КоличествоРазличных, 0) КАК Количество, + | ЕСТЬNULL(ОсновнойЗапрос.МИНИМУМ, 0) КАК МИНИМУМ, + | ЕСТЬNULL(ОсновнойЗапрос.МАКСИМУМ, 0) КАК МАКСИМУМ, + | ЕСТЬNULL(ОсновнойЗапрос.Среднее, 0) КАК Среднее, + | ЕСТЬNULL(ОсновнойЗапрос.СУММА, 0) КАК СУММА, + | ОсновнойЗапрос.ТипОтвета, + | ВопросыШаблонаАнкеты.ТипВопроса, + | ВопросыШаблонаАнкеты.ТипТабличногоВопроса, + | ВопросыШаблонаАнкеты.СоставТабличногоВопроса.( + | НомерСтроки, + | ЭлементарныйВопрос + | ), + | ВопросыШаблонаАнкеты.ПредопределенныеОтветы.( + | НомерСтроки КАК НомерСтроки, + | ЭлементарныйВопрос КАК ЭлементарныйВопросОтвет, + | Ответ + | ), + | ОсновнойЗапрос.АгрегироватьСуммуВОтчетах + |{ВЫБРАТЬ + | ЭлементарныйВопрос.*} + |ИЗ + | (ВЫБРАТЬ + | Вопросы.Ссылка КАК ВопросШаблона, + | Вопросы.ЭтоРаздел КАК ЭтоРаздел, + | ДанныеРегистра.ЭлементарныйВопрос КАК ЭлементарныйВопросРегистр, + | ДанныеРегистра.НомерЯчейки КАК НомерЯчейки, + | ДанныеРегистра.ВариантОтвета КАК ВариантОтвета, + | ДанныеРегистра.КоличествоРазличных КАК КоличествоРазличных, + | ДанныеРегистра.МИНИМУМ КАК МИНИМУМ, + | ДанныеРегистра.МАКСИМУМ КАК МАКСИМУМ, + | ДанныеРегистра.Среднее КАК Среднее, + | ДанныеРегистра.СУММА КАК СУММА, + | Вопросы.ТипОтвета КАК ТипОтвета, + | Вопросы.АгрегироватьСуммуВОтчетах КАК АгрегироватьСуммуВОтчетах, + | 0 КАК КодВариантаОтвета + | ИЗ + | (ВЫБРАТЬ + | ВложенныйЗапрос.ЭтоРаздел КАК ЭтоРаздел, + | ВложенныйЗапрос.ТипОтвета КАК ТипОтвета, + | ВложенныйЗапрос.Ссылка КАК Ссылка, + | ВложенныйЗапрос.АгрегироватьСуммуВОтчетах КАК АгрегироватьСуммуВОтчетах + | ИЗ + | (ВЫБРАТЬ + | ВопросыШаблонаАнкеты.Представление КАК Формулировка, + | ВопросыШаблонаАнкеты.ЭтоГруппа КАК ЭтоРаздел, + | ЕСТЬNULL(ВопросыДляАнкетирования.ТипОтвета, ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.ПустаяСсылка)) КАК ТипОтвета, + | ВопросыШаблонаАнкеты.Ссылка КАК Ссылка, + | ЕСТЬNULL(ВопросыДляАнкетирования.АгрегироватьСуммуВОтчетах, ЛОЖЬ) КАК АгрегироватьСуммуВОтчетах + | ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования + | ПО ВопросыШаблонаАнкеты.ЭлементарныйВопрос = ВопросыДляАнкетирования.Ссылка + | ГДЕ + | ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты + | И (НЕ ВопросыШаблонаАнкеты.ЭтоГруппа)) КАК ВложенныйЗапрос + | ГДЕ + | ВложенныйЗапрос.ТипОтвета <> ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.ОдинВариантИз) + | И ВложенныйЗапрос.ТипОтвета <> ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.НесколькоВариантовИз)) КАК Вопросы + | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ + | ОтветыНаВопросыАнкет.Вопрос КАК Вопрос, + | ОтветыНаВопросыАнкет.ЭлементарныйВопрос КАК ЭлементарныйВопрос, + | ОтветыНаВопросыАнкет.НомерЯчейки КАК НомерЯчейки, + | NULL КАК ВариантОтвета, + | МИНИМУМ(ОтветыНаВопросыАнкет.Ответ) КАК МИНИМУМ, + | МАКСИМУМ(ОтветыНаВопросыАнкет.Ответ) КАК МАКСИМУМ, + | СРЕДНЕЕ(ВЫРАЗИТЬ(ОтветыНаВопросыАнкет.Ответ КАК ЧИСЛО)) КАК Среднее, + | СУММА(ВЫРАЗИТЬ(ОтветыНаВопросыАнкет.Ответ КАК ЧИСЛО)) КАК СУММА, + | КОЛИЧЕСТВО(ОтветыНаВопросыАнкет.Ответ) КАК КоличествоРазличных + | ИЗ + | РегистрСведений.ОтветыНаВопросыАнкет КАК ОтветыНаВопросыАнкет + | ГДЕ + | ОтветыНаВопросыАнкет.Анкета.Опрос = &Опрос + | И ТИПЗНАЧЕНИЯ(ОтветыНаВопросыАнкет.Ответ) = ТИП(ЧИСЛО) + | + | СГРУППИРОВАТЬ ПО + | ОтветыНаВопросыАнкет.Вопрос, + | ОтветыНаВопросыАнкет.ЭлементарныйВопрос, + | ОтветыНаВопросыАнкет.НомерЯчейки + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ОтветыНаВопросыАнкет.Вопрос, + | ОтветыНаВопросыАнкет.ЭлементарныйВопрос, + | ОтветыНаВопросыАнкет.НомерЯчейки, + | NULL, + | МИНИМУМ(ОтветыНаВопросыАнкет.Ответ), + | МАКСИМУМ(ОтветыНаВопросыАнкет.Ответ), + | СРЕДНЕЕ(0), + | СУММА(0), + | КОЛИЧЕСТВО(ОтветыНаВопросыАнкет.Ответ) + | ИЗ + | РегистрСведений.ОтветыНаВопросыАнкет КАК ОтветыНаВопросыАнкет + | ГДЕ + | ОтветыНаВопросыАнкет.Анкета.Опрос = &Опрос + | И ТИПЗНАЧЕНИЯ(ОтветыНаВопросыАнкет.Ответ) = ТИП(ДАТА) + | + | СГРУППИРОВАТЬ ПО + | ОтветыНаВопросыАнкет.Вопрос, + | ОтветыНаВопросыАнкет.ЭлементарныйВопрос, + | ОтветыНаВопросыАнкет.НомерЯчейки + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ОтветыНаВопросыАнкет.Вопрос, + | ОтветыНаВопросыАнкет.ЭлементарныйВопрос, + | ОтветыНаВопросыАнкет.НомерЯчейки, + | ОтветыНаВопросыАнкет.Ответ, + | NULL, + | NULL, + | NULL, + | NULL, + | КОЛИЧЕСТВО(ОтветыНаВопросыАнкет.Ответ) + | ИЗ + | РегистрСведений.ОтветыНаВопросыАнкет КАК ОтветыНаВопросыАнкет + | ГДЕ + | ОтветыНаВопросыАнкет.Анкета.Опрос = &Опрос + | И ТИПЗНАЧЕНИЯ(ОтветыНаВопросыАнкет.Ответ) = ТИП(БУЛЕВО) + | + | СГРУППИРОВАТЬ ПО + | ОтветыНаВопросыАнкет.Вопрос, + | ОтветыНаВопросыАнкет.ЭлементарныйВопрос, + | ОтветыНаВопросыАнкет.НомерЯчейки, + | ОтветыНаВопросыАнкет.Ответ + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ОтветыНаВопросыАнкет.Вопрос, + | ОтветыНаВопросыАнкет.ЭлементарныйВопрос, + | ОтветыНаВопросыАнкет.НомерЯчейки, + | NULL, + | NULL, + | NULL, + | NULL, + | NULL, + | КОЛИЧЕСТВО(ОтветыНаВопросыАнкет.Ответ) + | ИЗ + | РегистрСведений.ОтветыНаВопросыАнкет КАК ОтветыНаВопросыАнкет + | ГДЕ + | ОтветыНаВопросыАнкет.Анкета.Опрос = &Опрос + | И ТИПЗНАЧЕНИЯ(ОтветыНаВопросыАнкет.Ответ) <> ТИП(БУЛЕВО) + | И ТИПЗНАЧЕНИЯ(ОтветыНаВопросыАнкет.Ответ) <> ТИП(ДАТА) + | И ТИПЗНАЧЕНИЯ(ОтветыНаВопросыАнкет.Ответ) <> ТИП(ЧИСЛО) + | И ТИПЗНАЧЕНИЯ(ОтветыНаВопросыАнкет.Ответ) <> ТИП(Справочник.ВариантыОтветовАнкет) + | + | СГРУППИРОВАТЬ ПО + | ОтветыНаВопросыАнкет.Вопрос, + | ОтветыНаВопросыАнкет.ЭлементарныйВопрос, + | ОтветыНаВопросыАнкет.НомерЯчейки) КАК ДанныеРегистра + | ПО Вопросы.Ссылка = ДанныеРегистра.Вопрос + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | Вопросы.Ссылка, + | Вопросы.ЭтоРаздел, + | ЕСТЬNULL(ДанныеРегистра.ЭлементарныйВопрос, Вопросы.ЭлементарныйВопрос), + | ДанныеРегистра.НомерЯчейки, + | Вопросы.ВариантОтвета, + | ДанныеРегистра.КоличествоРазличных, + | NULL, + | NULL, + | NULL, + | NULL, + | Вопросы.ТипОтвета, + | Вопросы.АгрегироватьСуммуВОтчетах, + | Вопросы.Код + | ИЗ + | (ВЫБРАТЬ + | ВопросыШаблонаАнкеты.Представление КАК Формулировка, + | ВопросыШаблонаАнкеты.ЭтоГруппа КАК ЭтоРаздел, + | ЕСТЬNULL(ВопросыДляАнкетирования.ТипОтвета, ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.ПустаяСсылка)) КАК ТипОтвета, + | ВопросыШаблонаАнкеты.Ссылка КАК Ссылка, + | ВариантыОтветовАнкет.Ссылка КАК ВариантОтвета, + | ЕСТЬNULL(ВопросыДляАнкетирования.АгрегироватьСуммуВОтчетах, ЛОЖЬ) КАК АгрегироватьСуммуВОтчетах, + | ВариантыОтветовАнкет.РеквизитДопУпорядочивания КАК Код, + | ВопросыШаблонаАнкеты.ЭлементарныйВопрос КАК ЭлементарныйВопрос + | ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтветовАнкет КАК ВариантыОтветовАнкет + | ПО ВопросыДляАнкетирования.Ссылка = ВариантыОтветовАнкет.Владелец + | ПО ВопросыШаблонаАнкеты.ЭлементарныйВопрос = ВопросыДляАнкетирования.Ссылка + | ГДЕ + | ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты + | И (НЕ ВопросыШаблонаАнкеты.ЭтоГруппа) + | И (ВопросыДляАнкетирования.ТипОтвета = ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.ОдинВариантИЗ) + | ИЛИ ВопросыДляАнкетирования.ТипОтвета = ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.НесколькоВариантовИз))) КАК Вопросы + | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ + | ОтветыНаВопросыАнкет.Вопрос КАК Вопрос, + | ОтветыНаВопросыАнкет.ЭлементарныйВопрос КАК ЭлементарныйВопрос, + | ОтветыНаВопросыАнкет.НомерЯчейки КАК НомерЯчейки, + | ОтветыНаВопросыАнкет.Ответ КАК ВариантОтвета, + | КОЛИЧЕСТВО(ОтветыНаВопросыАнкет.Ответ) КАК КоличествоРазличных + | ИЗ + | РегистрСведений.ОтветыНаВопросыАнкет КАК ОтветыНаВопросыАнкет + | ГДЕ + | ОтветыНаВопросыАнкет.Анкета.Опрос = &Опрос + | И (ТИПЗНАЧЕНИЯ(ОтветыНаВопросыАнкет.Ответ) = ТИП(БУЛЕВО) + | ИЛИ ТИПЗНАЧЕНИЯ(ОтветыНаВопросыАнкет.Ответ) = ТИП(Справочник.ВариантыОтветовАнкет)) + | + | СГРУППИРОВАТЬ ПО + | ОтветыНаВопросыАнкет.Вопрос, + | ОтветыНаВопросыАнкет.ЭлементарныйВопрос, + | ОтветыНаВопросыАнкет.НомерЯчейки, + | ОтветыНаВопросыАнкет.Ответ) КАК ДанныеРегистра + | ПО Вопросы.Ссылка = ДанныеРегистра.Вопрос + | И Вопросы.ВариантОтвета = ДанныеРегистра.ВариантОтвета + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка, + | ВопросыШаблонаАнкеты.ЭтоГруппа, + | ВопросыШаблонаАнкетыСоставТабличногоВопроса.ЭлементарныйВопрос, + | ДанныеРегистра.НомерЯчейки, + | NULL, + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеРегистра.Ответ), + | NULL, + | NULL, + | NULL, + | NULL, + | NULL, + | NULL, + | NULL + | ИЗ + | Справочник.ВопросыШаблонаАнкеты.СоставТабличногоВопроса КАК ВопросыШаблонаАнкетыСоставТабличногоВопроса + | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования + | ПО ВопросыШаблонаАнкетыСоставТабличногоВопроса.ЭлементарныйВопрос = ВопросыДляАнкетирования.Ссылка + | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ + | ОтветыНаВопросыАнкет.Вопрос КАК Вопрос, + | ОтветыНаВопросыАнкет.ЭлементарныйВопрос КАК ЭлементарныйВопрос, + | ОтветыНаВопросыАнкет.НомерЯчейки КАК НомерЯчейки, + | ОтветыНаВопросыАнкет.Ответ КАК Ответ + | ИЗ + | РегистрСведений.ОтветыНаВопросыАнкет КАК ОтветыНаВопросыАнкет + | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования + | ПО ОтветыНаВопросыАнкет.ЭлементарныйВопрос = ВопросыДляАнкетирования.Ссылка + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + | ПО ОтветыНаВопросыАнкет.Вопрос = ВопросыШаблонаАнкеты.Ссылка + | ГДЕ + | ОтветыНаВопросыАнкет.Анкета.Опрос = &Опрос + | И (НЕ ВопросыШаблонаАнкеты.ТипТабличногоВопроса = ЗНАЧЕНИЕ(Перечисление.ТипыТабличныхВопросов.Составной)) + | И ВопросыШаблонаАнкеты.ТипВопроса = ЗНАЧЕНИЕ(Перечисление.ТипыВопросовШаблонаАнкеты.Табличный) + | И (ВопросыДляАнкетирования.ТипОтвета = ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.Булево) + | ИЛИ ВопросыДляАнкетирования.ТипОтвета = ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.ОдинВариантИз) + | ИЛИ ВопросыДляАнкетирования.ТипОтвета = ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.НесколькоВариантовИз))) КАК ДанныеРегистра + | ПО ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка = ДанныеРегистра.Вопрос + | И ВопросыШаблонаАнкетыСоставТабличногоВопроса.ЭлементарныйВопрос = ДанныеРегистра.ЭлементарныйВопрос + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + | ПО ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка = ВопросыШаблонаАнкеты.Ссылка + | ГДЕ + | ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка В + | (ВЫБРАТЬ + | ВопросыШаблонаАнкеты.Ссылка + | ИЗ + | Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + | ГДЕ + | ВопросыШаблонаАнкеты.ТипВопроса = ЗНАЧЕНИЕ(Перечисление.ТипыВопросовШаблонаАнкеты.Табличный) + | И ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты + | И (НЕ ВопросыШаблонаАнкеты.ТипТабличногоВопроса = ЗНАЧЕНИЕ(Перечисление.ТипыТабличныхВопросов.Составной))) + | И (ВопросыДляАнкетирования.ТипОтвета = ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.Булево) + | ИЛИ ВопросыДляАнкетирования.ТипОтвета = ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.ОдинВариантИз) + | ИЛИ ВопросыДляАнкетирования.ТипОтвета = ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.НесколькоВариантовИз)) + | + | СГРУППИРОВАТЬ ПО + | ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка, + | ВопросыШаблонаАнкеты.ЭтоГруппа, + | ВопросыШаблонаАнкетыСоставТабличногоВопроса.ЭлементарныйВопрос, + | ДанныеРегистра.НомерЯчейки) КАК ОсновнойЗапрос + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + | ПО ОсновнойЗапрос.ВопросШаблона = ВопросыШаблонаАнкеты.Ссылка + | + |УПОРЯДОЧИТЬ ПО + | ВопросШаблона, + | ОсновнойЗапрос.КодВариантаОтвета, + | НомерЯчейки + |ИТОГИ ПО + | ВопросШаблона ИЕРАРХИЯ"; + + Запрос.УстановитьПараметр("Опрос", Опрос); + Запрос.УстановитьПараметр("ШаблонАнкеты",ШаблонАнкеты); + + Возврат Запрос.Выполнить(); + +КонецФункции // () + +//Преобразует агрегатные значения запроса в строку, для дальнейшего вывода в отчет +// +//Параметры +//СтрокаДерева - строка дерева значений - строка дерева, данные которой будут преобразованы +// +//Возвращаемое значение - Строка - строка, предназначенная для вывод в отчет +Функция АгрегатныеЗначенияВСтроку(СтрокаДерева,АгрегироватьСуммуВОтчетах = Неопределено) + + Если ТипЗнч(СтрокаДерева.Максимум) = Тип("Дата") Тогда + Максимум = Формат(СтрокаДерева.Максимум, "ДФ=dd.MM.yyyy"); + Иначе + Максимум = Формат(ОКР(СтрокаДерева.Максимум,2),"ЧРД=."); + КонецЕсли; + + Если ТипЗнч(СтрокаДерева.Минимум) = Тип("Дата") Тогда + Минимум = Формат(СтрокаДерева.Минимум, "ДФ=dd.MM.yyyy"); + Иначе + Минимум = Формат(ОКР(СтрокаДерева.Минимум,2),"ЧРД=."); + КонецЕсли; + + Количество = Формат(СтрокаДерева.Количество,"ЧРД=."); + Среднее = Формат(ОКР(СтрокаДерева.Среднее,2),"ЧРД=."); + Сумма = Формат(ОКР(СтрокаДерева.Сумма,2),"ЧРД=."); + + СтрокаСлеш = " / "; + + СтрокаВозврата = "" + ?(ПустаяСтрока(Количество),"",Количество) + Символы.ПС + + ?(ПустаяСтрока(Минимум),"",Минимум + СтрокаСлеш)+ ?(ПустаяСтрока(Максимум),"",Максимум + СтрокаСлеш) + ?(ПустаяСтрока(Среднее),"",Среднее)+ + ?(?(АгрегироватьСуммуВОтчетах = Неопределено,СтрокаДерева.АгрегироватьСуммуВОтчетах,АгрегироватьСуммуВОтчетах),Символы.ПС + ?(ПустаяСтрока(Сумма) = "∑ 0","","∑ " + Сумма),""); + + АнкетированиеКлиентСервер.УдалитьПоследниеСимволыИзСтроки(СтрокаВозврата,СтрокаСлеш); + + Возврат СтрокаВозврата; + +КонецФункции // () + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Анализ ответивших + +// Формирует отчет в варианте анализа ответивших +// +// Параметры +// ТаблицаОтчета - ТабличныйДокумент - табличный документ в который выводится отчет +// Опрос - Документ.НазначениеОпросов - опрос, для которого строится отчет +// +Процедура СформироватьОтчетАнализОтветивших(ТаблицаОтчета,Опрос) + + РеквизитыОпрос = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(Опрос,"ШаблонАнкеты,ТипРеспондентов,СвободныйОпрос,ДатаНачала,ДатаОкончания,Представление"); + + Если РеквизитыОпрос.СвободныйОпрос Тогда + РезультатЗапроса = ВыполнитьЗапросПоОтветившимСвободныйОпрос(Опрос, РеквизитыОпрос.ТипРеспондентов); + Иначе + РезультатЗапроса = ВыполнитьЗапросПоОтветившимОпросСОпределеннымСоставомРеспондентов(Опрос); + КонецЕсли; + Если РезультатЗапроса.Пустой() Тогда + Возврат; + КонецЕсли; + + ВывестиРезультатЗапросаОтветившиеВТабличныйДокумент(РезультатЗапроса,РеквизитыОпрос,ТаблицаОтчета); + +КонецПроцедуры + +// Обрабатывает результат запроса и осуществляет вывод в табличный документ +// +// Параметры +// РезультатЗапроса - РезультатЗапроса - результат выполненного запроса +// РеквизитыОпрос - Структура - содержит значения необходимых реквизитов НазначениеОпроса +// ТаблицаОтчета - ТабличныйДокумент - табличный документ в который выводится отчет +// +Процедура ВывестиРезультатЗапросаОтветившиеВТабличныйДокумент(РезультатЗапроса,РеквизитыОпрос,ТаблицаОтчета) + + Макет = ПолучитьМакет("МакетОтветившие"); + + Область = Макет.ПолучитьОбласть("Заголовок"); + Область.Параметры.Заголовок = РеквизитыОпрос.ШаблонАнкеты.Заголовок; + Область.Параметры.Опрос = ПолучитьПредставлениеОпросаДляЗаголовка(РеквизитыОпрос); + ТаблицаОтчета.Вывести(Область,1); + + ВыборкаОбщиеИтоги = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + Пока ВыборкаОбщиеИтоги.Следующий() Цикл + + ВывестиСтрокуОтветившиеВТабличныйДокумент(ВыборкаОбщиеИтоги,Макет,ТаблицаОтчета,"ОбщийИтог"); + ТаблицаОтчета.НачатьГруппуСтрок("ОбщийИтог"); + + ВыборкаОтветил = ВыборкаОбщиеИтоги.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + Пока ВыборкаОтветил.Следующий() Цикл + ВывестиСтрокуОтветившиеВТабличныйДокумент(ВыборкаОтветил,Макет,ТаблицаОтчета,"ИтогОтветил"); + ТаблицаОтчета.НачатьГруппуСтрок("ОтветилИтог"); + ВыборкаДетали = ВыборкаОтветил.Выбрать(); + Пока ВыборкаДетали.Следующий() Цикл + ВывестиСтрокуОтветившиеВТабличныйДокумент(ВыборкаДетали,Макет,ТаблицаОтчета,"Респондент"); + КонецЦикла; + ТаблицаОтчета.ЗакончитьГруппуСтрок(); + КонецЦикла; + ТаблицаОтчета.ЗакончитьГруппуСтрок(); + КонецЦикла; + +КонецПроцедуры + +// Выводит строку в табличный документ +// +// Параметры +// Выборка - ВыборкаИзРезультатаЗапроса - выборка, в которой содержатся данные выводимые в отчет +// Макет - ТабличныйДокумент - табличный документ, в котором находится макет отчета +// ТаблицаОтчета - ТабличныйДокумент - табличный документ, в который осуществляется вывод +// ИмяОбласти - Строка - имя области макета,которая будет использована для вывода +// +Процедура ВывестиСтрокуОтветившиеВТабличныйДокумент(Выборка,Макет,ТаблицаОтчета,ИмяОбласти); + + Область = Макет.ПолучитьОбласть(ИмяОбласти); + Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ОбщийИтог Тогда + Область.Параметры.Количество = Выборка.Респондент; + ИначеЕсли Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке Тогда + Область.Параметры.Количество = Выборка.Респондент; + Область.Параметры.Ответил = Выборка.Отвечал; + Иначе + Область.Параметры.Респондент = Выборка.Респондент; + КонецЕсли; + ТаблицаОтчета.Вывести(Область); + +КонецПроцедуры + + +// Формирует и выполняет запрос, для свободных опросов +// +// Параметры +// Опрос - Документ.НазначениеОпросов - опрос, для которого строится отчет +// Возвращаемое значение: +// РезультатЗапроса - результат выполненного запроса +// +Функция ВыполнитьЗапросПоОтветившимОпросСОпределеннымСоставомРеспондентов(Опрос) + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ + | Анкета.Респондент, + | Анкета.Проведен + |ПОМЕСТИТЬ ОтветившиеРеспонденты + |ИЗ + | Документ.Анкета КАК Анкета + |ГДЕ + | Анкета.Опрос = &Опрос + | И (НЕ Анкета.ПометкаУдаления) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВЫБОР + | КОГДА ОтветившиеРеспонденты.Респондент ЕСТЬ NULL + | ТОГДА ""Не заполнял"" + | ИНАЧЕ ВЫБОР + | КОГДА ОтветившиеРеспонденты.Проведен + | ТОГДА ""Заполнил"" + | ИНАЧЕ ""Начал заполнять"" + | КОНЕЦ + | КОНЕЦ КАК Отвечал, + | НазначениеОпросовРеспонденты.Респондент КАК Респондент + |ИЗ + | Документ.НазначениеОпросов.Респонденты КАК НазначениеОпросовРеспонденты + | ЛЕВОЕ СОЕДИНЕНИЕ ОтветившиеРеспонденты КАК ОтветившиеРеспонденты + | ПО (ОтветившиеРеспонденты.Респондент = НазначениеОпросовРеспонденты.Респондент) + |ГДЕ + | НазначениеОпросовРеспонденты.Ссылка = &Опрос + | + |УПОРЯДОЧИТЬ ПО + | Отвечал, + | Респондент + |ИТОГИ + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Респондент) + |ПО + | ОБЩИЕ, + | Отвечал"; + + Запрос.УстановитьПараметр("Опрос",Опрос); + + Возврат Запрос.Выполнить(); + + КонецФункции + + +// Формирует и выполняет запрос, для свободных опросов +// +// Параметры +// Опрос - Документ.НазначениеОпросов - опрос, для которого строится отчет +// ТипРеспондентов - СправочникСсылка - пустая ссылка на справочник, элементы которого являются +// респондентами для данного опроса +// Возвращаемое значение: +// РезультатЗапроса - результат выполненного запроса +// + Функция ВыполнитьЗапросПоОтветившимСвободныйОпрос(Опрос,ТипРеспондентов) + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ТаблицаСправочника.Ссылка + |ПОМЕСТИТЬ ДанныеСправочника + |ИЗ + | " + ТипРеспондентов.Метаданные().ПолноеИмя() + " КАК ТаблицаСправочника + |ГДЕ + | (НЕ ТаблицаСправочника.ПометкаУдаления) + | " + ?(ТипРеспондентов.Метаданные().Иерархический," И (НЕ ТаблицаСправочника.ЭтоГруппа)","") + " + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Анкета.Респондент, + | Анкета.Проведен + |ПОМЕСТИТЬ ОтветившиеРеспонденты + |ИЗ + | Документ.Анкета КАК Анкета + |ГДЕ + | (НЕ Анкета.ПометкаУдаления) + | И Анкета.Опрос = &Опрос + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВЫБОР + | КОГДА ОтветившиеРеспонденты.Респондент ЕСТЬ NULL + | ТОГДА ""Не заполнял"" + | ИНАЧЕ ВЫБОР + | КОГДА ОтветившиеРеспонденты.Проведен + | ТОГДА ""Заполнил"" + | ИНАЧЕ ""Начал заполнять"" + | КОНЕЦ + | КОНЕЦ КАК Отвечал, + | ДанныеСправочника.Ссылка КАК Респондент + |ИЗ + | ДанныеСправочника КАК ДанныеСправочника + | ЛЕВОЕ СОЕДИНЕНИЕ ОтветившиеРеспонденты КАК ОтветившиеРеспонденты + | ПО ДанныеСправочника.Ссылка = ОтветившиеРеспонденты.Респондент + | + |УПОРЯДОЧИТЬ ПО + | Отвечал, + | Респондент + |ИТОГИ + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Респондент) + |ПО + | ОБЩИЕ, + | Отвечал"; + + Запрос.УстановитьПараметр("Опрос",Опрос); + + Возврат Запрос.Выполнить(); + + КонецФункции // () + diff --git a/SSL/src/Reports/АнализОпроса/Templates/МакетОтветившие/Template.mxlx b/SSL/src/Reports/АнализОпроса/Templates/МакетОтветившие/Template.mxlx new file mode 100644 index 000000000..8fd1719d0 --- /dev/null +++ b/SSL/src/Reports/АнализОпроса/Templates/МакетОтветившие/Template.mxlx @@ -0,0 +1,970 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 34 + + 0 + + 1 + + + + + 1 + + + + 2 + + + + + 3 + Заголовок + + + + + + 2 + + + + 2 + + + + + 4 + Опрос + + + + + + 4 + + 5 + + + 2 + + + + + 6 + + + ru + Итого + + + + + + 7 + + 7 + Количество + + + + 9 + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + + 5 + + + + 2 + + + + 9 + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + + 6 + + 8 + + + 2 + + + + + 9 + Ответил + + + + 7 + + 9 + Количество + + + + 9 + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + + 7 + + + + 2 + + + + 9 + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + + 8 + + 10 + + + 2 + + + + + 11 + Респондент + + + + + 12 + + + + + 12 + + + + + 12 + + + + + 12 + + + + + 12 + + + + + 13 + + + + + 12 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + 2 + + + + + true + 14 + 11 + 11 + + 1 + 1 + 13 + + + 2 + 1 + 13 + + + 4 + 1 + 5 + + + 4 + 7 + 1 + + + 6 + 1 + 5 + + + 6 + 7 + 1 + + + 8 + 1 + 5 + + + 8 + 7 + 1 + + + Заголовок + + Rows + 1 + 2 + -1 + -1 + + + + ИтогОтветил + + Rows + 6 + 6 + -1 + -1 + + + + ОбщийИтог + + Rows + 4 + 4 + -1 + -1 + + + + ПустаяСтрока + + Rows + 10 + 10 + -1 + -1 + + + + Респондент + + Rows + 8 + 8 + -1 + -1 + + + + Solid + + + + + + + 16 + + + style:FieldBackColor + + + 0 + Wrap + Parameter + + + 1 + Parameter + + + d3p1:PaleGoldenrod + + + 2 + 0 + d3p1:PaleGoldenrod + + + 2 + 0 + d3p1:PaleGoldenrod + Parameter + + + d3p1:LemonChiffon + + + 2 + 0 + d3p1:LemonChiffon + Parameter + + + d3p1:LightYellow + + + 3 + 0 + 72 + d3p1:LightYellow + Parameter + + + 72 + d3p1:LightYellow + + + 2 + 0 + 72 + d3p1:LightYellow + Text + + + 72 + + \ No newline at end of file diff --git a/SSL/src/Reports/АнализОпроса/Templates/МакетОтветы/Template.mxlx b/SSL/src/Reports/АнализОпроса/Templates/МакетОтветы/Template.mxlx new file mode 100644 index 000000000..1c7682560 --- /dev/null +++ b/SSL/src/Reports/АнализОпроса/Templates/МакетОтветы/Template.mxlx @@ -0,0 +1,697 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 12 + + 0 + + 1 + + + + 1 + + 2 + + + + 2 + + 3 + + + + 3 + + 4 + + + + 10 + + 5 + + + + 11 + + 6 + + + + + 0752e464-59bd-4b23-990f-0b5fcb8324f1 + 3 + + 0 + + 1 + + + + 1 + + 2 + + + + 2 + + 7 + + + + 3 + + 4 + + + + 10 + + 5 + + + + 11 + + 6 + + + + + 0 + + + + 8 + + + + + + 1 + + + + 8 + + + + + 9 + Заголовок + + + + + + 2 + + + + 8 + + + + + 10 + Опрос + + + + + + 3 + + + + 8 + + + + + + 4 + + + + 8 + + + + + 11 + + + ru + Как читать отчет: если в ячейке указано одно число - это число респондентов, ответивших на вопрос. Если в ячейке дополнительно указаны несколько чисел через дробь, то это: МИНИМУМ / МАКСИМУМ/ СРЕДНЕЕ. Также может быть указана СУММА. Она выделена символом '∑'. Для вопросов с ответами типа дата вывод значений СРЕДНЕЕ и CУММА не предусмотрен. + + + + + + 10 + + 12 + + + + + 12 + + + + + + 5 + + + + 8 + + + + + + 6 + + + + 8 + + + + + + 7 + + + + 8 + + + + + + 8 + + + + 13 + + + + + 14 + ИмяРаздела + + + + + + 9 + + + + 8 + + + + + + 10 + + + + 15 + + + + + 16 + ФормулировкаВопроса + + + + + + 11 + + + + 8 + + + + + 0 + + + + + + + 12 + + + + 8 + + + + + 17 + Значение + Расшифровка + + + + + + 13 + + + + 8 + + + + + + 14 + + + + 18 + + + + + 19 + ВариантОтвета + + + + 3 + + 20 + Значение + Расшифровка + + + + + + 16 + + + + 0 + + + + + + 17 + + 0752e464-59bd-4b23-990f-0b5fcb8324f1 + + 2 + + 21 + Значение + + + + + + 18 + + 0752e464-59bd-4b23-990f-0b5fcb8324f1 + + 2 + + 22 + Значение + Расшифровка + + + + + + 19 + + 0752e464-59bd-4b23-990f-0b5fcb8324f1 + + 2 + + 21 + Значение + + + + + + 21 + + + 1 + + 23 + Респондент + + + + + + 34 + + + 6 + + 24 + + + + + true + 25 + 35 + 35 + + 1 + 1 + 8 + + + 2 + 1 + 10 + + + 4 + 1 + 8 + + + 8 + 1 + 8 + + + 10 + 1 + 8 + + + 12 + 1 + 8 + + + 14 + 1 + 1 + + + 14 + 3 + 6 + + + 21 + 1 + 8 + + + Аннотация + + Rows + 4 + 4 + -1 + -1 + + + + ВариантыОтветов + + Rows + 14 + 14 + -1 + -1 + + + + Вопрос + + Rows + 10 + 10 + -1 + -1 + + + + Заголовок + + Rows + 1 + 2 + -1 + -1 + + + + ОтветПростогоВопроса + + Rows + 12 + 12 + -1 + -1 + + + + Отступ + + Rectangle + 16 + 16 + 0 + 0 + + + + ПустаяСтрока + + Rows + 6 + 6 + -1 + -1 + + + + Раздел + + Rows + 8 + 8 + -1 + -1 + + + + Респондент + + Rows + 21 + 21 + -1 + -1 + + + + ЭлементШапкиТабличногоВопроса + + Rectangle + 17 + 17 + 2 + 2 + 0752e464-59bd-4b23-990f-0b5fcb8324f1 + + + + ЭлементЯчейкиТабличногоВопросаПредопределенныйОтвет + + Rectangle + 19 + 19 + 2 + 2 + 0752e464-59bd-4b23-990f-0b5fcb8324f1 + + + + ЯчейкаТабличногоВопроса + + Rectangle + 18 + 18 + 2 + 2 + 0752e464-59bd-4b23-990f-0b5fcb8324f1 + + + + Solid + + + Solid + + + + + + + + + + + + 24 + + + 86 + + + 110 + + + 105 + + + 95 + + + 208 + + + 151 + + + style:FieldBackColor + + + 0 + Wrap + Parameter + + + 1 + Parameter + + + d3p1:RoyalBlue + Wrap + + + d3p1:Crimson + Wrap + + + 2 + style:FieldBackColor + Wrap + + + 2 + 0 + d3p1:Gainsboro + Wrap + Parameter + + + 3 + style:FieldBackColor + Wrap + + + 4 + 1 + d3p1:LemonChiffon + Wrap + Parameter + + + 1 + Right + Parameter + Row + + + 5 + Right + style:FieldBackColor + Wrap + + + 5 + 1 + 1 + 1 + Right + d3p1:LightYellow + Wrap + Parameter + + + 1 + 72 + Right + Parameter + Row + + + 6 + 1 + 112 + d3p1:Gainsboro + Wrap + Parameter + + + 5 + 1 + 105 + Center + Wrap + Parameter + Cell + + + 7 + 1 + d3p1:LemonChiffon + Parameter + + + 8 + + + 72 + + \ No newline at end of file diff --git a/SSL/src/Reports/АнализОпроса/Templates/ПростыеВопросы/Template.dcs b/SSL/src/Reports/АнализОпроса/Templates/ПростыеВопросы/Template.dcs new file mode 100644 index 000000000..db9809a85 --- /dev/null +++ b/SSL/src/Reports/АнализОпроса/Templates/ПростыеВопросы/Template.dcs @@ -0,0 +1,259 @@ + + + + ИсточникДанных1 + Local + + + ПростыеОтветы + + Ответ + Ответ + + <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> + + + + Респондент + Респондент + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Респондент</v8:content> + </v8:item> + + + + Формулировка + Формулировка + + ИсточникДанных1 + ВЫБРАТЬ + ОтветыНаВопросыАнкет.Ответ КАК Ответ, + ОтветыНаВопросыАнкет.ОткрытыйОтвет КАК Комментарий, + ДокументыАнкета.Респондент КАК Респондент, + ВопросыШаблонаАнкеты.Формулировка +ИЗ + РегистрСведений.ОтветыНаВопросыАнкет КАК ОтветыНаВопросыАнкет + ЛЕВОЕ СОЕДИНЕНИЕ Документ.Анкета КАК ДокументыАнкета + ПО ОтветыНаВопросыАнкет.Анкета = ДокументыАнкета.Ссылка + ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + ПО ОтветыНаВопросыАнкет.Вопрос = ВопросыШаблонаАнкеты.Ссылка +ГДЕ + ОтветыНаВопросыАнкет.Вопрос = &ВопросШаблонаАнкеты + И ДокументыАнкета.Опрос = &Опрос + + + РеспондентРесурс + Респондент + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Респондент</v8:content> + </v8:item> + + + + РеспондентРесурс + Количество(РеспондентРесурс) + Ответ + + + ВопросШаблонаАнкеты + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Вопрос шаблона анкеты</v8:content> + </v8:item> + + + d4p1:CatalogRef.ВопросыШаблонаАнкеты + + Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка + true + + + Опрос + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Опрос</v8:content> + </v8:item> + + + d4p1:DocumentRef.НазначениеОпросов + + Документ.НазначениеОпросов.ПустаяСсылка + true + + + Респонденты + + + ru + Респонденты + + + + + + Респондент + + + Ответ + + + Комментарий + + + + + РасположениеПолейГруппировки + Together + + + ВыводитьЗаголовок + DontOutput + + + + + + Формулировка + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + Респондент + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + + + + + + + + + Ответы + + + ru + Ответы + + + + + + Ответ + + + Комментарий + + + РеспондентРесурс + + + + + ГоризонтальноеРасположениеОбщихИтогов + None + + + ВертикальноеРасположениеОбщихИтогов + None + + + ВыводитьЗаголовок + DontOutput + + + + + + Формулировка + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + false + + + Формулировка + + + + + + + Ответ + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SSL/src/Reports/АнализОпроса/АнализОпроса.mdo b/SSL/src/Reports/АнализОпроса/АнализОпроса.mdo new file mode 100644 index 000000000..a2704de77 --- /dev/null +++ b/SSL/src/Reports/АнализОпроса/АнализОпроса.mdo @@ -0,0 +1,63 @@ + + + + + + + АнализОпроса + + ru + Анализ опроса + + true + Report.АнализОпроса.Form.ФормаОтчета + + ФормаОтчета + + ru + Форма отчета + + PersonalComputer + MobileDevice + + + РасшифровкаПростыхОтветов + + ru + Расшифровка простых ответов + + PersonalComputer + MobileDevice + + + РасшифровкаТабличныхВопросов + + ru + Расшифровка табличных вопросов + + PersonalComputer + MobileDevice + + + МакетОтветы + + ru + Макет ответы + + + + ПростыеВопросы + + ru + Простые вопросы + + DataCompositionSchema + + + МакетОтветившие + + ru + Макет ответившие + + + diff --git a/SSL/src/Reports/АнкетированиеАналитическийОтчет/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs b/SSL/src/Reports/АнкетированиеАналитическийОтчет/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs new file mode 100644 index 000000000..94fbca2db --- /dev/null +++ b/SSL/src/Reports/АнкетированиеАналитическийОтчет/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs @@ -0,0 +1,2243 @@ + + + + ИсточникДанных1 + Local + + + ДанныеПоАнкетированию + + Анкета + Анкета + + + Ответ + Ответ + + + Аналитика1 + Аналитика1 + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Аналитика1</v8:content> + </v8:item> + + + + Аналитика2 + Аналитика2 + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Аналитика2</v8:content> + </v8:item> + + + + Вопрос + Вопрос + + + Опрос + Опрос + + + ОткрытыйОтвет + ОткрытыйОтвет + + + ШаблонАнкеты + ШаблонАнкеты + + + ЭлементарныйВопрос + ЭлементарныйВопрос + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Элементарный вопрос</v8:content> + </v8:item> + + + + Респондент + Респондент + + + НаименованиеОпроса + НаименованиеОпроса + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Наименование опроса</v8:content> + </v8:item> + + + ИсточникДанных1 + ВЫБРАТЬ + ОтветыНаВопросыАнкет.Анкета, + ОтветыНаВопросыАнкет.Вопрос, + ОтветыНаВопросыАнкет.НомерЯчейки, + ОтветыНаВопросыАнкет.Ответ, + ОтветыНаВопросыАнкет.ЭлементарныйВопрос КАК ЭлементарныйВопросДанныеРегистра, + ОтветыНаВопросыАнкет.ОткрытыйОтвет, + ВопросыШаблонаАнкеты.ТипВопроса, + ВопросыШаблонаАнкеты.ТипТабличногоВопроса +ПОМЕСТИТЬ ДанныеРегистра +ИЗ + РегистрСведений.ОтветыНаВопросыАнкет КАК ОтветыНаВопросыАнкет + ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты + ПО ОтветыНаВопросыАнкет.Вопрос = ВопросыШаблонаАнкеты.Ссылка +; + +//////////////////////////////////////////////////////////////////////////////// +ВЫБРАТЬ + ДанныеРегистра.Анкета КАК Анкета, + ДанныеРегистра.Вопрос КАК Вопрос, + ДанныеРегистра.Ответ, + ДанныеРегистра.ОткрытыйОтвет, + ДанныеРегистра.ЭлементарныйВопросДанныеРегистра +ПОМЕСТИТЬ ПростыеВопросы +ИЗ + ДанныеРегистра КАК ДанныеРегистра +ГДЕ + ДанныеРегистра.ТипВопроса <> ЗНАЧЕНИЕ(Перечисление.ТипыВопросовШаблонаАнкеты.Табличный) +; + +//////////////////////////////////////////////////////////////////////////////// +ВЫБРАТЬ + ДанныеРегистра.Анкета КАК Анкета, + ДанныеРегистра.Вопрос КАК Вопрос, + ДанныеРегистра.НомерЯчейки КАК Аналитика1, + ДанныеРегистра.Ответ, + ДанныеРегистра.ЭлементарныйВопросДанныеРегистра КАК Аналитика2, + ДанныеРегистра.ЭлементарныйВопросДанныеРегистра КАК ЭлементарныйВопросДанныеРегистра +ПОМЕСТИТЬ Составной +ИЗ + ДанныеРегистра КАК ДанныеРегистра +ГДЕ + ДанныеРегистра.ТипТабличногоВопроса = ЗНАЧЕНИЕ(Перечисление.ТипыТабличныхВопросов.Составной) +; + +//////////////////////////////////////////////////////////////////////////////// +ВЫБРАТЬ + ДанныеРегистра.Анкета КАК Анкета, + ДанныеРегистра.Вопрос КАК Вопрос, + ДанныеРегистра.НомерЯчейки КАК НомерЯчейки, + ДанныеРегистра.Ответ, + ВопросыШаблонаАнкетыСоставТабличногоВопроса.НомерСтроки, + ДанныеРегистра.ЭлементарныйВопросДанныеРегистра +ПОМЕСТИТЬ ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов +ИЗ + ДанныеРегистра КАК ДанныеРегистра + ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВопросыШаблонаАнкеты.СоставТабличногоВопроса КАК ВопросыШаблонаАнкетыСоставТабличногоВопроса + ПО ДанныеРегистра.Вопрос = ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка + И ДанныеРегистра.ЭлементарныйВопросДанныеРегистра = ВопросыШаблонаАнкетыСоставТабличногоВопроса.ЭлементарныйВопрос +ГДЕ + (ДанныеРегистра.ТипТабличногоВопроса = ЗНАЧЕНИЕ(Перечисление.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках) + ИЛИ ДанныеРегистра.ТипТабличногоВопроса = ЗНАЧЕНИЕ(Перечисление.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках)) +; + +//////////////////////////////////////////////////////////////////////////////// +ВЫБРАТЬ + ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов.Анкета КАК Анкета, + ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов.Вопрос КАК Вопрос, + ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов.Ответ КАК Аналитика1, + ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов.НомерЯчейки КАК НомерЯчейки +ПОМЕСТИТЬ АналитикаОдниНаборПредопределенныхОтветов +ИЗ + ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов КАК ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов +ГДЕ + ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов.НомерСтроки = 1 +; + +//////////////////////////////////////////////////////////////////////////////// +ВЫБРАТЬ + ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов.Анкета КАК Анкета, + ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов.Вопрос КАК Вопрос, + ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов.НомерЯчейки КАК НомерЯчейки, + ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов.Ответ, + ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов.ЭлементарныйВопросДанныеРегистра, + ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов.ЭлементарныйВопросДанныеРегистра КАК Аналитика2 +ПОМЕСТИТЬ ОтветыОдинНаборПредопределенныхОтветов +ИЗ + ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов КАК ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов +ГДЕ + ДанныеТабличныеВопросыОдинНаборПредопределенныхОтветов.НомерСтроки <> 1 +; + +//////////////////////////////////////////////////////////////////////////////// +ВЫБРАТЬ + АналитикаОдниНоборПредопределенныхОтветов.Анкета КАК Анкета, + АналитикаОдниНоборПредопределенныхОтветов.Вопрос КАК Вопрос, + АналитикаОдниНоборПредопределенныхОтветов.Аналитика1 КАК Аналитика1, + ОтветыОдинНаборПредопределенныхОтветов.Ответ, + ОтветыОдинНаборПредопределенныхОтветов.ЭлементарныйВопросДанныеРегистра, + ОтветыОдинНаборПредопределенныхОтветов.Аналитика2 +ПОМЕСТИТЬ ОдинНаборОтветов +ИЗ + АналитикаОдниНаборПредопределенныхОтветов КАК АналитикаОдниНоборПредопределенныхОтветов + ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОтветыОдинНаборПредопределенныхОтветов КАК ОтветыОдинНаборПредопределенныхОтветов + ПО АналитикаОдниНоборПредопределенныхОтветов.Анкета = ОтветыОдинНаборПредопределенныхОтветов.Анкета + И АналитикаОдниНоборПредопределенныхОтветов.Вопрос = ОтветыОдинНаборПредопределенныхОтветов.Вопрос + И АналитикаОдниНоборПредопределенныхОтветов.НомерЯчейки = ОтветыОдинНаборПредопределенныхОтветов.НомерЯчейки +; + +//////////////////////////////////////////////////////////////////////////////// +ВЫБРАТЬ + ДанныеРегистра.Анкета КАК Анкета, + ДанныеРегистра.Вопрос КАК Вопрос, + ДанныеРегистра.НомерЯчейки КАК НомерЯчейки, + ДанныеРегистра.Ответ, + ВопросыШаблонаАнкетыСоставТабличногоВопроса.НомерСтроки, + ДанныеРегистра.ЭлементарныйВопросДанныеРегистра +ПОМЕСТИТЬ ДанныеТабличныеВопросыДваНабораПредопределенныхОтветов +ИЗ + ДанныеРегистра КАК ДанныеРегистра + ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВопросыШаблонаАнкеты.СоставТабличногоВопроса КАК ВопросыШаблонаАнкетыСоставТабличногоВопроса + ПО ДанныеРегистра.Вопрос = ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка + И ДанныеРегистра.ЭлементарныйВопросДанныеРегистра = ВопросыШаблонаАнкетыСоставТабличногоВопроса.ЭлементарныйВопрос +ГДЕ + ДанныеРегистра.ТипТабличногоВопроса = ЗНАЧЕНИЕ(Перечисление.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках) +; + +//////////////////////////////////////////////////////////////////////////////// +ВЫБРАТЬ + Данные.Анкета КАК Анкета, + Данные.Вопрос, + Данные.НомерЯчейки КАК НомерЯчейки, + Данные.Ответ КАК Аналитика1 +ПОМЕСТИТЬ Аналитика1ДваНабораПредопределенныхОтветов +ИЗ + ДанныеТабличныеВопросыДваНабораПредопределенныхОтветов КАК Данные +ГДЕ + Данные.НомерСтроки = 1 +; + +//////////////////////////////////////////////////////////////////////////////// +ВЫБРАТЬ + Данные.Анкета КАК Анкета, + Данные.Вопрос, + Данные.НомерЯчейки, + Данные.Ответ КАК Аналитика2 +ПОМЕСТИТЬ Аналитика2ДваНабораПредопределенныхОтветов +ИЗ + ДанныеТабличныеВопросыДваНабораПредопределенныхОтветов КАК Данные +ГДЕ + Данные.НомерСтроки = 2 +; + +//////////////////////////////////////////////////////////////////////////////// +ВЫБРАТЬ + Данные.Анкета КАК Анкета, + Данные.Вопрос, + Данные.НомерЯчейки, + Данные.Ответ, + Данные.ЭлементарныйВопросДанныеРегистра +ПОМЕСТИТЬ ОтветыДваНабораПредопределенныхОтветов +ИЗ + ДанныеТабличныеВопросыДваНабораПредопределенныхОтветов КАК Данные +ГДЕ + Данные.НомерСтроки = 3 +; + +//////////////////////////////////////////////////////////////////////////////// +ВЫБРАТЬ + ДанныеАналитика1.Анкета КАК Анкета, + ДанныеАналитика1.Вопрос, + ДанныеАналитика1.Аналитика1 КАК Аналитика1, + ДанныеАналитика2.Аналитика2 КАК Аналитика2, + ДанныеОтветы.Ответ, + ДанныеОтветы.ЭлементарныйВопросДанныеРегистра +ПОМЕСТИТЬ ДваНабораОтветов +ИЗ + Аналитика1ДваНабораПредопределенныхОтветов КАК ДанныеАналитика1 + ВНУТРЕННЕЕ СОЕДИНЕНИЕ Аналитика2ДваНабораПредопределенныхОтветов КАК ДанныеАналитика2 + ПО ДанныеАналитика1.Анкета = ДанныеАналитика2.Анкета + И ДанныеАналитика1.Вопрос = ДанныеАналитика2.Вопрос + И ДанныеАналитика1.НомерЯчейки = ДанныеАналитика2.НомерЯчейки + ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОтветыДваНабораПредопределенныхОтветов КАК ДанныеОтветы + ПО ДанныеАналитика1.Анкета = ДанныеОтветы.Анкета + И ДанныеАналитика1.Вопрос = ДанныеОтветы.Вопрос + И ДанныеАналитика1.НомерЯчейки = ДанныеОтветы.НомерЯчейки +; + +//////////////////////////////////////////////////////////////////////////////// +ВЫБРАТЬ + ПростыеВопросы.Анкета КАК Анкета, + ПростыеВопросы.Вопрос КАК Вопрос, + NULL КАК Аналитика1, + NULL КАК Аналитика2, + ПростыеВопросы.Ответ, + ПростыеВопросы.ОткрытыйОтвет, + ПростыеВопросы.ЭлементарныйВопросДанныеРегистра КАК ЭлементарныйВопрос +ПОМЕСТИТЬ ДанныеПоВсемТипамВопросов +ИЗ + ПростыеВопросы КАК ПростыеВопросы + +ОБЪЕДИНИТЬ ВСЕ + +ВЫБРАТЬ + Составной.Анкета, + Составной.Вопрос, + Составной.Аналитика1, + Составной.Аналитика2, + Составной.Ответ, + NULL, + Составной.ЭлементарныйВопросДанныеРегистра +ИЗ + Составной КАК Составной + +ОБЪЕДИНИТЬ ВСЕ + +ВЫБРАТЬ + ОдинНаборОтветов.Анкета, + ОдинНаборОтветов.Вопрос, + ОдинНаборОтветов.Аналитика1, + ОдинНаборОтветов.Аналитика2, + ОдинНаборОтветов.Ответ, + NULL, + ОдинНаборОтветов.ЭлементарныйВопросДанныеРегистра +ИЗ + ОдинНаборОтветов КАК ОдинНаборОтветов + +ОБЪЕДИНИТЬ ВСЕ + +ВЫБРАТЬ + ДваНабораОтветов.Анкета, + ДваНабораОтветов.Вопрос, + ДваНабораОтветов.Аналитика1, + ДваНабораОтветов.Аналитика2, + ДваНабораОтветов.Ответ, + NULL, + ДваНабораОтветов.ЭлементарныйВопросДанныеРегистра +ИЗ + ДваНабораОтветов КАК ДваНабораОтветов +; + +//////////////////////////////////////////////////////////////////////////////// +ВЫБРАТЬ + ДанныеПоВсемТипамВопросов.Анкета КАК Анкета, + ДанныеПоВсемТипамВопросов.Вопрос КАК Вопрос, + ДанныеПоВсемТипамВопросов.Аналитика1 КАК Аналитика1, + ДанныеПоВсемТипамВопросов.Аналитика2 КАК Аналитика2, + ДанныеПоВсемТипамВопросов.Ответ, + ДанныеПоВсемТипамВопросов.ОткрытыйОтвет, + ДокументАнкета.Опрос, + НазначениеОпросов.ШаблонАнкеты, + ДанныеПоВсемТипамВопросов.ЭлементарныйВопрос, + ДокументАнкета.Респондент, + НазначениеОпросов.Наименование КАК НаименованиеОпроса +ИЗ + ДанныеПоВсемТипамВопросов КАК ДанныеПоВсемТипамВопросов + ЛЕВОЕ СОЕДИНЕНИЕ Документ.Анкета КАК ДокументАнкета + ЛЕВОЕ СОЕДИНЕНИЕ Документ.НазначениеОпросов КАК НазначениеОпросов + ПО ДокументАнкета.Опрос = НазначениеОпросов.Ссылка + ПО ДанныеПоВсемТипамВопросов.Анкета = ДокументАнкета.Ссылка + + + ОтветРесурс + Ответ + + + КоличествоОтветов + Ответ + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Количество</v8:content> + </v8:item> + + + + Формат + ЧДЦ=0 + + + + + МинимальныйОтвет + Ответ + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Минимум</v8:content> + </v8:item> + + + + false + Формат + ЧДЦ=2 + + + + + МаксимальныйОтвет + Ответ + + <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> + + + + Формат + ЧДЦ=2 + + + + + СуммаОтвет + Ответ + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сумма </v8:content> + </v8:item> + + + + Формат + ЧДЦ=2 + + + + + ОтветРесурс + Максимум(ОтветРесурс) + Аналитика1 + Аналитика2 + + + КоличествоОтветов + Количество(КоличествоОтветов) + Анкета + Вопрос + НаименованиеОпроса + Опрос + Ответ + ОбщийИтог + + + МинимальныйОтвет + Минимум(МинимальныйОтвет) + Анкета + Вопрос + НаименованиеОпроса + Опрос + ОбщийИтог + + + МаксимальныйОтвет + Максимум(МаксимальныйОтвет) + Анкета + Вопрос + НаименованиеОпроса + Опрос + ОбщийИтог + + + СреднийОтвет + Среднее(СреднийОтвет) + Анкета + Вопрос + НаименованиеОпроса + Опрос + ОбщийИтог + + + СуммаОтвет + Сумма(СуммаОтвет) + Анкета + Вопрос + НаименованиеОпроса + Опрос + ОбщийИтог + + + ПросмотрОтветовПростыеВопросы + + + ru + Просмотр ответов простые вопросы + + + + + + Ответ + + + ОткрытыйОтвет + + + false + Анкета + + + false + Опрос + + + false + ШаблонАнкеты + + + false + ЭлементарныйВопрос + + Normal + cc59db21-5bb3-4e5f-82c9-73dac56b9a3e + + + + false + Анкета + Equal + Документ.Анкета.ПустаяСсылка + Normal + + + Вопрос.ТипВопроса + NotEqual + Перечисление.ТипыВопросовШаблонаАнкеты.Табличный + Inaccessible + + + false + Ответ + Equal + Normal + + + false + Респондент + Equal + 57ebdfcc-83a1-4dff-a868-058d96aef695 + + + false + Вопрос + Equal + Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка + dcc264b8-2942-4c9b-9ce6-0c88eb10b562 + + + false + Опрос + Equal + Документ.НазначениеОпросов.ПустаяСсылка + ba750ba3-8e2f-4609-9353-3efad5e07fb4 + + Normal + 8e6cb7be-1c87-43ae-813b-fac7bc6b4983 + + + + false + Анкета + Asc + + + false + Вопрос + Asc + + + false + Опрос + Asc + + + false + Ответ + Asc + + + false + ОткрытыйОтвет + Asc + + + false + Респондент + Asc + + + false + ШаблонАнкеты + Asc + + + false + ЭлементарныйВопрос + Asc + + Normal + 83b5c1ff-1c55-4ad0-99ae-5002671a3092 + + + Normal + f1609840-4c36-4b90-bb6d-89abab176d11 + + + + + Опрос + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Респондент + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Вопрос + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + + + + + + + + Normal + 8d648108-f14d-4b31-af30-100be750e7da + + + + ПросмотрТабличныхВопросовПлоскийВид + + + ru + Просмотр табличных вопросов плоский вид + + + + + + false + Аналитика1 + + + false + Аналитика2 + + + false + Анкета + + + false + Вопрос + + + false + ДатаРедактированияАнкеты + + + false + НаименованиеОпроса + + + false + НаименованиеШаблонаАнкеты + + + false + Опрос + + + Ответ + + + false + Респондент + + + false + ТипТабличногоВопроса + + + false + ФормулировкаВопросаШаблонаАнкеты + + Normal + cc3efa10-b878-40b4-9b81-692f4d06645d + + + + false + Аналитика1 + Equal + + + false + Аналитика2 + Equal + + + false + Анкета + Equal + Документ.Анкета.ПустаяСсылка + + + false + Вопрос + Equal + Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка + 2e00559b-826d-4378-bfe2-5b45dbde0ec7 + + + false + Опрос + Equal + Документ.НазначениеОпросов.ПустаяСсылка + 69da8568-f153-42e8-b285-3340e1f7948b + + + false + Ответ + Equal + + + false + Респондент + Equal + f83e652f-9bed-471c-972c-48d023ee61f0 + + + false + ШаблонАнкеты + Equal + Справочник.ШаблоныАнкет.ПустаяСсылка + + + Вопрос.ТипВопроса + Equal + Перечисление.ТипыВопросовШаблонаАнкеты.Табличный + Inaccessible + + Normal + e53e2a8e-0b7e-4757-af82-1cf9d3b91b31 + + + + false + Аналитика1 + Asc + + + false + Аналитика2 + Asc + + + false + Анкета + Asc + + + false + Вопрос + Asc + + + false + Опрос + Asc + + + false + Ответ + Asc + + + false + Респондент + Asc + + + false + ШаблонАнкеты + Asc + + Normal + 2ca3f5bf-973d-4637-9db7-504bd1e10595 + + + Normal + ece16993-59b6-4d6c-86c2-9390670d4397 + + + + + Респондент + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Вопрос + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Аналитика1 + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + Аналитика2 + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + Ответ + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Normal + d6844593-4b84-489e-863f-bdd434380807 + + + + ПросмотрТабличныхВопросовТабличныйВид + + + ru + Просмотр табличных вопросов табличный вид + + + + + + false + + + ОтветРесурс + + Normal + 265f9cb9-dce2-49cb-b897-9d35a7e87010 + + + + Вопрос.ТипВопроса + Equal + Перечисление.ТипыВопросовШаблонаАнкеты.Табличный + + + false + Анкета + Equal + Документ.Анкета.ПустаяСсылка + + + false + Вопрос + Equal + Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка + a85d5637-fa34-428b-961f-b783fa76bba1 + + + false + Опрос + Equal + Документ.НазначениеОпросов.ПустаяСсылка + bfc5aa72-e7a8-4160-a033-c90a9ae52e5d + + + false + ОтветРесурс + Equal + + + false + Респондент + Equal + ec8c942e-54d8-4e8c-b148-92f04183db30 + + + false + ШаблонАнкеты + Equal + Справочник.ШаблоныАнкет.ПустаяСсылка + + + false + Аналитика1 + Equal + + + false + Аналитика2 + Equal + + Normal + 9f06ab2f-b51a-40c4-ae3a-b9330d025663 + + + + Аналитика1 + Asc + + + Аналитика2 + Asc + + + Анкета + Asc + + + Вопрос + Asc + + + Опрос + Asc + + + Респондент + Asc + + + ШаблонАнкеты + Asc + + Normal + 98b75ce3-8cee-4258-97b8-c07d4cd4c330 + + + Normal + 9aa8f9b9-b32c-4658-87b7-f398a7f35fff + + + + ГоризонтальноеРасположениеОбщихИтогов + None + + + ВертикальноеРасположениеОбщихИтогов + None + + + + + + Респондент + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Вопрос + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + Аналитика2 + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + Аналитика1 + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + Normal + ac64d5c5-8b3c-400b-b730-a747c9d7ee36 + + + + ПростыеВопросыКоличествоОтветов + + + ru + Простые вопросы количество ответов + + + + + + КоличествоОтветов + + Normal + fb854de9-f8cd-4a73-9210-122b95ff6cb3 + + + + false + Анкета + Equal + Документ.Анкета.ПустаяСсылка + + + false + Вопрос + Equal + Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка + 50b4dec2-5a39-4b8d-928b-79c4946ed002 + + + false + КоличествоОтветов + Equal + + + false + Опрос + Equal + Документ.НазначениеОпросов.ПустаяСсылка + f7974acf-6021-4fd5-bd62-aff85727c60c + + + false + Ответ + Equal + + + false + Респондент + Equal + + + Вопрос.ТипВопроса + NotEqual + Перечисление.ТипыВопросовШаблонаАнкеты.Табличный + Inaccessible + + + false + ЭлементарныйВопрос + Equal + + Normal + 90fb2a81-084b-4b26-899c-624f3cd5656c + + + + false + Анкета + Asc + + + false + Вопрос + Asc + + + false + Опрос + Asc + + + false + Ответ + Asc + + + false + ОткрытыйОтвет + Asc + + + false + Респондент + Asc + + + false + ШаблонАнкеты + Asc + + + false + КоличествоОтветов + Asc + + + false + ЭлементарныйВопрос + Asc + + Normal + c4a52ca0-5114-41c3-9d77-90770e926db7 + + + Normal + 29569383-f04d-4076-8809-f163f07f3208 + + + + + Вопрос + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Ответ + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + Normal + ce80510f-963a-4357-bb36-c9633718741a + + + + ПростыеВопросыАгрегируемыеПоказатели + + + ru + Простые вопросы агрегируемые показатели + + + + + + КоличествоОтветов + + + МинимальныйОтвет + + + МаксимальныйОтвет + + + СреднийОтвет + + + СуммаОтвет + + Normal + f516e639-7f62-497c-aa09-0e07e4c3ef77 + + + + false + Анкета + Equal + Документ.Анкета.ПустаяСсылка + + + false + Вопрос + Equal + Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка + 320baa1e-c380-42ee-a5eb-bad9c3c92286 + + + false + КоличествоОтветов + Equal + + + false + МаксимальныйОтвет + Equal + + + false + МинимальныйОтвет + Equal + + + false + Опрос + Equal + Документ.НазначениеОпросов.ПустаяСсылка + e50b36a6-d4fa-49c4-965c-23cf388ab2fc + + + false + Ответ + Equal + + + false + ОткрытыйОтвет + Equal + + + false + Респондент + Equal + + + false + СреднийОтвет + Equal + + + false + СуммаОтвет + Equal + + + Вопрос.ТипВопроса + NotEqual + Перечисление.ТипыВопросовШаблонаАнкеты.Табличный + Inaccessible + + + ЭлементарныйВопрос.ТипОтвета + InList + Перечисление.ТипыОтветовНаВопрос.Число + Inaccessible + + + false + ШаблонАнкеты + Equal + Справочник.ШаблоныАнкет.ПустаяСсылка + + + false + ЭлементарныйВопрос + Equal + + Normal + 3a64d9b5-24f2-4ab8-82bd-e295137906f3 + + + + Анкета + Asc + + + Вопрос + Asc + + + Опрос + Asc + + + Ответ + Asc + + + Респондент + Asc + + + ШаблонАнкеты + Asc + + + ЭлементарныйВопрос + Asc + + + КоличествоОтветов + Asc + + + МаксимальныйОтвет + Asc + + + МинимальныйОтвет + Asc + + + СреднийОтвет + Asc + + + СуммаОтвет + Asc + + Normal + e3214592-c399-43a2-8c63-4e7f0fd8e4ca + + + Normal + 77239374-758b-4a82-b79f-52c76eb8c150 + + + + + Вопрос + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + Normal + d6362a86-27e2-4a37-bcfd-7fa2517f2d80 + + + + ТабличныеВопросыКоличествоОтветов + + + ru + Табличные вопросы количество ответов + + + + + + КоличествоОтветов + + Normal + f1fb266a-2f09-455b-965e-fe7133668da1 + + + + false + Аналитика1 + Equal + + + false + Аналитика2 + Equal + + + false + Анкета + Equal + Документ.Анкета.ПустаяСсылка + + + false + Вопрос + Equal + Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка + dce7ed45-70d6-4e27-b5d7-85a882d10719 + + + false + Опрос + Equal + Документ.НазначениеОпросов.ПустаяСсылка + 344873a4-ca6e-4a27-99cd-0edf03d5f686 + + + false + Ответ + Equal + + + false + Респондент + Equal + + + false + КоличествоОтветов + Equal + + + Вопрос.ТипВопроса + Equal + Перечисление.ТипыВопросовШаблонаАнкеты.Табличный + Inaccessible + + + false + ШаблонАнкеты + Equal + Справочник.ШаблоныАнкет.ПустаяСсылка + + + false + ЭлементарныйВопрос + Equal + ПланВидовХарактеристик.ВопросыДляАнкетирования.ПустаяСсылка + + Normal + fff43570-4afb-47be-a9ab-7c0b9a9da692 + + + + false + Аналитика1 + Asc + + + false + Аналитика2 + Asc + + + false + Анкета + Asc + + + false + Вопрос + Asc + + + false + Опрос + Asc + + + false + Ответ + Asc + + + false + Респондент + Asc + + + false + ШаблонАнкеты + Asc + + + false + ЭлементарныйВопрос + Asc + + Normal + fb38726a-713c-43e4-9079-d3aff1433045 + + + Normal + fd389248-04ea-4bc4-bbf4-59af3f8c8ef5 + + + + + Вопрос + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Аналитика1 + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + Аналитика2 + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Ответ + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Normal + 43e1f3f0-fa9b-494c-b8a3-5c8940184386 + + + + ТабличныеВопросыАгрегируемыеПоказатели + + + ru + Табличные вопросы агрегируемые показатели + + + + + + КоличествоОтветов + + + МаксимальныйОтвет + + + МинимальныйОтвет + + + СреднийОтвет + + + СуммаОтвет + + Normal + ceab96e0-4b2d-4f87-af14-d4ae6169cd98 + + + + false + Аналитика1 + Equal + + + false + Аналитика2 + Equal + + + false + Анкета + Equal + Документ.Анкета.ПустаяСсылка + + + false + Вопрос + Equal + Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка + 29410274-65f3-4a3f-b434-a070982d9b31 + + + false + КоличествоОтветов + Equal + + + false + МинимальныйОтвет + Equal + + + false + МаксимальныйОтвет + Equal + + + false + Опрос + Equal + Документ.НазначениеОпросов.ПустаяСсылка + 8693eb2d-0a16-4995-b32b-2170f7b8db9a + + + false + Ответ + Equal + + + false + Респондент + Equal + + + false + СреднийОтвет + Equal + + + false + СуммаОтвет + Equal + + + Вопрос.ТипВопроса + Equal + Перечисление.ТипыВопросовШаблонаАнкеты.Табличный + Inaccessible + + + ЭлементарныйВопрос.ТипОтвета + InList + Перечисление.ТипыОтветовНаВопрос.Число + Inaccessible + + + false + ШаблонАнкеты + Equal + Справочник.ШаблоныАнкет.ПустаяСсылка + + + false + ЭлементарныйВопрос + Equal + ПланВидовХарактеристик.ВопросыДляАнкетирования.ПустаяСсылка + + Normal + 8bdce37a-09a3-4b8f-a482-ec72ffd6e94e + + + + Аналитика1 + Asc + + + Аналитика2 + Asc + + + Анкета + Asc + + + Вопрос + Asc + + + Опрос + Asc + + + Респондент + Asc + + + ШаблонАнкеты + Asc + + + ЭлементарныйВопрос + Asc + + Normal + b159abb1-85d5-4310-8f47-877deeb6174a + + + Normal + 34810b4a-b30a-4b75-8f47-6fe11323ecd6 + + + + + Вопрос + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Аналитика1 + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + Аналитика2 + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + Normal + 6877863b-11eb-4b8e-b94d-07f7f73dcb65 + + + + ПростыеВопросыКоличествоОтветовСравнениеПоОпросам + + + ru + Простые вопросы количество ответов сравнение по опросам + + + + + + КоличествоОтветов + + Normal + fb854de9-f8cd-4a73-9210-122b95ff6cb3 + + + + false + Анкета + Equal + Документ.Анкета.ПустаяСсылка + + + false + Вопрос + Equal + Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка + + + false + КоличествоОтветов + Equal + + + false + Опрос + Equal + Документ.НазначениеОпросов.ПустаяСсылка + ed930d82-0987-4e45-af06-70c537b50182 + + + false + Ответ + Equal + + + false + Респондент + Equal + + + Вопрос.ТипВопроса + NotEqual + Перечисление.ТипыВопросовШаблонаАнкеты.Табличный + Inaccessible + + + false + ЭлементарныйВопрос + Equal + a53bcbc0-1350-44dd-9a86-4f3d62e20c0d + + Normal + 90fb2a81-084b-4b26-899c-624f3cd5656c + + + + false + Анкета + Asc + + + false + Вопрос + Asc + + + false + Опрос + Asc + + + false + Ответ + Asc + + + false + ОткрытыйОтвет + Asc + + + false + Респондент + Asc + + + false + ШаблонАнкеты + Asc + + + false + КоличествоОтветов + Asc + + + false + ЭлементарныйВопрос + Asc + + Normal + c4a52ca0-5114-41c3-9d77-90770e926db7 + + + Normal + 29569383-f04d-4076-8809-f163f07f3208 + + + + + + Опрос.Наименование + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + ЭлементарныйВопрос + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Ответ + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Normal + ce80510f-963a-4357-bb36-c9633718741a + + + + ТабличныеВопросыАгрегируемыеПоказателиСравнениеПоОпросам + + + ru + Табличные вопросы агрегируемые показатели сравнение по опросам + + + + + + КоличествоОтветов + + + МаксимальныйОтвет + + + МинимальныйОтвет + + + СреднийОтвет + + + СуммаОтвет + + Normal + ceab96e0-4b2d-4f87-af14-d4ae6169cd98 + + + + false + Аналитика1 + Equal + + + false + Аналитика2 + Equal + + + false + Анкета + Equal + Документ.Анкета.ПустаяСсылка + + + false + Вопрос + Equal + Справочник.ВопросыШаблонаАнкеты.ПустаяСсылка + + + false + КоличествоОтветов + Equal + + + false + МинимальныйОтвет + Equal + + + false + МаксимальныйОтвет + Equal + + + false + Опрос + Equal + Документ.НазначениеОпросов.ПустаяСсылка + cef879c5-1c5a-48ee-a84b-e237f8b912d3 + + + false + Ответ + Equal + + + false + Респондент + Equal + 652da0d5-9a13-43ab-bd22-29ecaf309c3c + + + false + СреднийОтвет + Equal + + + false + СуммаОтвет + Equal + + + Вопрос.ТипВопроса + Equal + Перечисление.ТипыВопросовШаблонаАнкеты.Табличный + Inaccessible + + + ЭлементарныйВопрос.ТипОтвета + InList + Перечисление.ТипыОтветовНаВопрос.Число + Inaccessible + + + false + ШаблонАнкеты + Equal + Справочник.ШаблоныАнкет.ПустаяСсылка + + + false + ЭлементарныйВопрос + Equal + ПланВидовХарактеристик.ВопросыДляАнкетирования.ПустаяСсылка + fce963d4-971e-45d8-b669-2a483f95d074 + + Normal + 8bdce37a-09a3-4b8f-a482-ec72ffd6e94e + + + + Аналитика1 + Asc + + + Аналитика2 + Asc + + + Анкета + Asc + + + Вопрос + Asc + + + Опрос + Asc + + + Респондент + Asc + + + ШаблонАнкеты + Asc + + + ЭлементарныйВопрос + Asc + + Normal + b159abb1-85d5-4310-8f47-877deeb6174a + + + Normal + 34810b4a-b30a-4b75-8f47-6fe11323ecd6 + + + + + + НаименованиеОпроса + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + ЭлементарныйВопрос + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Аналитика1 + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + Аналитика2 + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Normal + 6877863b-11eb-4b8e-b94d-07f7f73dcb65 + + + \ No newline at end of file diff --git a/SSL/src/Reports/АнкетированиеАналитическийОтчет/АнкетированиеАналитическийОтчет.mdo b/SSL/src/Reports/АнкетированиеАналитическийОтчет/АнкетированиеАналитическийОтчет.mdo new file mode 100644 index 000000000..e60ca9bc8 --- /dev/null +++ b/SSL/src/Reports/АнкетированиеАналитическийОтчет/АнкетированиеАналитическийОтчет.mdo @@ -0,0 +1,22 @@ + + + + + + + АнкетированиеАналитическийОтчет + + ru + Аналитический отчет по анкетированию + + true + Report.АнкетированиеАналитическийОтчет.Template.ОсновнаяСхемаКомпоновкиДанных + + ОсновнаяСхемаКомпоновкиДанных + + ru + Основная схема компоновки данных + + DataCompositionSchema + + diff --git a/SSL/src/Reports/Задачи/Forms/ФормаОтчета/Form.form b/SSL/src/Reports/Задачи/Forms/ФормаОтчета/Form.form new file mode 100644 index 000000000..24c7aa07f --- /dev/null +++ b/SSL/src/Reports/Задачи/Forms/ФормаОтчета/Form.form @@ -0,0 +1,710 @@ + + + + ГруппаВарианта + 1 + + НаименованиеТекущегоВарианта + 2 + true + true + + true + + + НаименованиеТекущегоВарианта + + Left + + НаименованиеТекущегоВариантаРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + НаименованиеТекущегоВариантаКонтекстноеМеню + 3 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ВыбратьВариантКнопка + 4 + true + true + + true + + false + + ВыбратьВариантКнопкаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + UsualButton + Form.StandardCommand.LoadVariant + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ГруппаВариантаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ОсновнаяКоманднаяПанель + 5 + + СформироватьОтчет + 6 + true + true + + true + + false + + СформироватьОтчетРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.StandardCommand.Generate + Auto + true + true + true + UserCmds + Auto + + + Настройка + 7 + true + true + + true + + false + + НастройкаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.StandardCommand.ReportSettings + Normal + Auto + true + true + UserCmds + Auto + + + ВыбратьНастройку + 8 + true + true + + true + + false + + ВыбратьНастройкуРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Form.StandardCommand.LoadReportSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьНастройку + 9 + true + true + + true + + false + + СохранитьНастройкуРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Form.StandardCommand.SaveReportSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СтандартнаяНастройка + 10 + true + true + + true + + false + + СтандартнаяНастройкаРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Form.StandardCommand.StandardSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + НовоеОкно + 11 + true + true + + true + + false + + НовоеОкноРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.StandardCommand.NewWindow + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИзменитьВариант + 12 + true + true + + true + + false + + ИзменитьВариантРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.StandardCommand.ChangeVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ВыбратьВариант + 13 + true + true + + true + + false + + ВыбратьВариантРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.StandardCommand.LoadVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьВариант + 14 + true + true + + true + + false + + СохранитьВариантРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.StandardCommand.SaveVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИзменитьФорму + 15 + true + true + + true + + false + + ИзменитьФормуРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Справка + 16 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + CommandBar + + Left + + + + ПользовательскиеНастройки + 17 + true + true + + true + + + Отчет.SettingsComposer.UserSettings + + false + None + HierarchicalList + List + Tree + None + + ПользовательскиеНастройкиКоманднаяПанель + 19 + Left + true + + + ПользовательскиеНастройкиСтрокаПоиска + 39 + + ПользовательскиеНастройкиСтрокаПоискаРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ПользовательскиеНастройкиСтрокаПоискаКонтекстноеМеню + 40 + true + + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиСостояниеПросмотра + 42 + + ПользовательскиеНастройкиСостояниеПросмотраРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ПользовательскиеНастройкиСостояниеПросмотраКонтекстноеМеню + 43 + true + + ViewStatusAddition + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиУправлениеПоиском + 45 + + ПользовательскиеНастройкиУправлениеПоискомРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ПользовательскиеНастройкиУправлениеПоискомКонтекстноеМеню + 46 + true + + SearchControlAddition + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ПользовательскиеНастройкиКонтекстноеМеню + 18 + true + + HierarchicalList + true + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + None + None + None + true + QuickAccess + Show + + + Результат + 20 + true + true + + true + + + Результат + + true + None + + РезультатРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + РезультатКонтекстноеМеню + 21 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + + DetailProcessing + РезультатОбработкаРасшифровки + + 100 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Always + Auto + true + true + true + + + None + false + + ФормаКоманднаяПанель + -1 + Left + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Отчет + 1 + + ReportObject.Задачи + + + true + + + true + +
    true
    +
    + + НаименованиеТекущегоВарианта + + <key>ru</key> + <value>Вариант отчета</value> + + 2 + + String + + + + true + + + true + + + + Результат + + <key>ru</key> + <value>Результат</value> + + 3 + + SpreadsheetDocument + + + true + + + true + + + + + ДанныеРасшифровки + 4 + + String + + + + true + + + true + + + + + + + + ShowOnComposition + Результат + ДанныеРасшифровки + НаименованиеТекущегоВарианта + +
    diff --git a/SSL/src/Reports/Задачи/Forms/ФормаОтчета/Module.bsl b/SSL/src/Reports/Задачи/Forms/ФормаОтчета/Module.bsl new file mode 100644 index 000000000..47092cdd7 --- /dev/null +++ b/SSL/src/Reports/Задачи/Forms/ФормаОтчета/Module.bsl @@ -0,0 +1,9 @@ + +&НаКлиенте +Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) + ЗначениеРасшифровки = Неопределено; + Если БизнесПроцессыИЗадачиСервер.ЭтоЗадачаИсполнителю(Расшифровка, ДанныеРасшифровки, ЗначениеРасшифровки) Тогда + СтандартнаяОбработка = НЕ БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(ЗначениеРасшифровки); + КонецЕсли; +КонецПроцедуры + diff --git a/SSL/src/Reports/Задачи/Help/ru.html b/SSL/src/Reports/Задачи/Help/ru.html new file mode 100644 index 000000000..462795e9e --- /dev/null +++ b/SSL/src/Reports/Задачи/Help/ru.html @@ -0,0 +1,12 @@ + +

    Для формирования отчета нажмите кнопку "Сформировать".

    +

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

    +

    + + + + + + +
    АвторБудут отобраны только задачи указанного куратора
    Дата исполненияБудут отобраны только задачи, дата исполнения которых соответствует указанной
    ИсполнительБудут отобраны только задачи, адресованные указанному исполнителю
    Срок исполненияБудут отобраны только задачи, срок исполнения которых соответствует указанной дате
    Дата созданияБудут отобраны только задачи, созданные за указанный период
    ВыполненаПозволяет отобрать только выполненные или не выполненные задачи

     

    +

    Для детальной настройки отчета используйте команду "Все действия - Изменить вариант".

    \ No newline at end of file diff --git a/SSL/src/Reports/Задачи/ManagerModule.bsl b/SSL/src/Reports/Задачи/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Reports/Задачи/ObjectModule.bsl b/SSL/src/Reports/Задачи/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Reports/Задачи/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs b/SSL/src/Reports/Задачи/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs new file mode 100644 index 000000000..5acc5e472 --- /dev/null +++ b/SSL/src/Reports/Задачи/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs @@ -0,0 +1,395 @@ + + + + ИсточникДанных1 + Local + + + СписокЗадач + + Дата + Дата + + + Наименование + Наименование + + + Важность + Важность + + + Исполнитель + Исполнитель + + + Описание + Описание + + + СрокИсполнения + СрокИсполнения + + <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> + + + + РольИсполнителя + РольИсполнителя + + + Ссылка + Ссылка + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Задача</v8:content> + </v8:item> + + Наименование + + + БизнесПроцесс + БизнесПроцесс + + + ТочкаМаршрута + ТочкаМаршрута + + + Автор + Автор + + + Номер + Номер + + + ЗадачаВыполнена + ЗадачаВыполнена + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Задача выполнена</v8:content> + </v8:item> + + + ИсточникДанных1 + ВЫБРАТЬ РАЗРЕШЕННЫЕ + Задачи.Номер, + Задачи.Наименование, + Задачи.СрокИсполнения, + Задачи.ДатаИсполнения, + Задачи.Важность, + Задачи.Описание, + Задачи.Автор, + Задачи.Исполнитель, + Задачи.РольИсполнителя, + Задачи.Дата, + Задачи.Ссылка, + Задачи.БизнесПроцесс, + Задачи.ТочкаМаршрута +ИЗ + Задача.ЗадачаИсполнителя КАК Задачи +ГДЕ + Задачи.ПометкаУдаления = ЛОЖЬ +{ГДЕ + (Задачи.Дата >= &ДатаНачала), + (Задачи.Дата <= &ДатаОкончания), + (Задачи.Выполнена) Как ЗадачаВыполнена} + + + + Количество + 1 + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Количество</v8:content> + </v8:item> + + + + ДатаНачала + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Дата начала</v8:content> + </v8:item> + + + xs:dateTime + + DateTime + + + 0001-01-01T00:00:00 + false + + + ДатаОкончания + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Дата окончания</v8:content> + </v8:item> + + + xs:dateTime + + DateTime + + + 0001-01-01T00:00:00 + false + + + ТекущиеЗадачи + + + ru + Текущие задачи + + + + + + Номер + + + Исполнитель + + + Ссылка + + + СрокИсполнения + + + false + Наименование + + + false + Описание + + + false + БизнесПроцесс + + + false + Важность + + + false + Дата + + + false + ДатаИсполнения + + + false + РольИсполнителя + + + false + ТочкаМаршрута + + + Количество + + + + + false + ЗадачаВыполнена + Equal + false + 3262f5ac-8db5-48f5-a6fd-cab5ed4b6bcf + Выводить выполненные задачи + + + СрокИсполнения + LessOrEqual + + BeginningOfThisDay + + 6986aa91-f648-465d-88d8-1c7d7c7a7d84 + + + ДатаИсполнения + GreaterOrEqual + + BeginningOfThisWeek + + 2b010cb4-de38-4d2b-ab7e-10c40c23f459 + + + false + Автор + Equal + Справочник.Пользователи.ПустаяСсылка + 5f599205-29c3-4667-88de-e895cb4e3131 + + + + + ДатаНачала + 0001-01-01T00:00:00 + e306d1cb-adbf-4f45-b245-981519a772e8 + + + ДатаОкончания + 0001-01-01T00:00:00 + fb76feb8-391a-42d7-9ee0-b34bfd875702 + + + + + СрокИсполнения + Asc + + + + + + + + СрокИсполнения + Filled + + + OrGroup + + AndGroup + + Ссылка.Executed + Equal + false + + + СрокИсполнения + Less + + BeginningOfNextDay + + + + + AndGroup + + Ссылка.Executed + Equal + true + + + СрокИсполнения + Less + ДатаИсполнения + + + + + + + ЦветТекста + style:ПросроченнаяЗадача + + + Выделять просроченные задачи + 11966583-ef0c-482c-95ef-a54f5538f28f + + + + + + Ссылка.Executed + Equal + true + + + + + ЦветТекста + style:ВыполненнаяЗадача + + + false + Шрифт + + + + Выделять выполненные задачи + a53cd573-1732-4bae-98d9-22ab69ed44cb + + + + + ВертикальноеРасположениеОбщихИтогов + Begin + + + ВыводитьЗаголовок + DontOutput + + + Заголовок + + + ru + Задачи + + + + + ВыводитьПараметрыДанных + DontOutput + + + ВыводитьОтбор + DontOutput + + + + + + Исполнитель + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SSL/src/Reports/Задачи/Задачи.mdo b/SSL/src/Reports/Задачи/Задачи.mdo new file mode 100644 index 000000000..ee217dd94 --- /dev/null +++ b/SSL/src/Reports/Задачи/Задачи.mdo @@ -0,0 +1,38 @@ + + + + + + + Задачи + + ru + Задачи + + true + Report.Задачи.Form.ФормаОтчета + Report.Задачи.Template.ОсновнаяСхемаКомпоновкиДанных + SettingsStorage.ХранилищеВариантовОтчетов + + + ru + + + + ФормаОтчета + + ru + Форма отчета + + PersonalComputer + MobileDevice + + + ОсновнаяСхемаКомпоновкиДанных + + ru + Основная схема компоновки данных + + DataCompositionSchema + + diff --git a/SSL/src/Reports/ОтчетПоБизнесПроцессам/ManagerModule.bsl b/SSL/src/Reports/ОтчетПоБизнесПроцессам/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Reports/ОтчетПоБизнесПроцессам/Templates/Макет/Template.dcs b/SSL/src/Reports/ОтчетПоБизнесПроцессам/Templates/Макет/Template.dcs new file mode 100644 index 000000000..207709b18 --- /dev/null +++ b/SSL/src/Reports/ОтчетПоБизнесПроцессам/Templates/Макет/Template.dcs @@ -0,0 +1,467 @@ + + + + ИсточникДанных1 + Local + + + НаборДанных1 + + Автор + Автор + + + БизнесПроцесс + БизнесПроцесс + Наименование + + + Дата + Дата + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Создан</v8:content> + </v8:item> + + + + ДатаЗавершения + ДатаЗавершения + + + Завершен + Завершен + + + Наименование + Наименование + + + Стартован + Стартован + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Начат</v8:content> + </v8:item> + + + + ВидБизнесПроцесса + ВидБизнесПроцесса + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Вид бизнес-процесса</v8:content> + </v8:item> + + + ИсточникДанных1 + ВЫБРАТЬ + СписокБизнесПроцессов.БизнесПроцесс, + СписокБизнесПроцессов.Дата, + СписокБизнесПроцессов.Завершен, + СписокБизнесПроцессов.Стартован, + СписокБизнесПроцессов.Автор, + СписокБизнесПроцессов.ДатаЗавершения, + СписокБизнесПроцессов.Наименование, + ТИПЗНАЧЕНИЯ(СписокБизнесПроцессов.БизнесПроцесс) КАК ВидБизнесПроцесса +ИЗ + РегистрСведений.СписокБизнесПроцессов КАК СписокБизнесПроцессов +{ГДЕ + (СписокБизнесПроцессов.Дата <= &ПериодОкончание + И СписокБизнесПроцессов.ДатаЗавершения >= &ПериодНачало)} + + + Количество + 1 + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Количество</v8:content> + </v8:item> + + + + СостояниеБизнесПроцессов + Завершен + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Состояние бизнес процессов</v8:content> + </v8:item> + + Завершен + + false + + + ru + Бизнес-процессы в работе + + + + + true + + + ru + Завершенные бизнес-процессы + + + + + xs:boolean + + + + Количество + Сумма(Количество) + + + Период + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Период</v8:content> + </v8:item> + + + v8:StandardPeriod + + + Custom + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + false + + + ПериодНачало + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Период начало</v8:content> + </v8:item> + + + xs:dateTime + + DateTime + + + 0001-01-01T00:00:00 + true + &Период.ДатаНачала + + + ПериодОкончание + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Период окончание</v8:content> + </v8:item> + + + xs:dateTime + + DateTime + + + 0001-01-01T00:00:00 + true + &Период.ДатаОкончания + + + СписокБизнесПроцессов + + + ru + Список бизнес-процессов + + + + + + СистемныеПоля.НомерПоПорядкуВГруппировке + № + + + БизнесПроцесс + + + Автор + + + Дата + + + Стартован + + + Завершен + + + ДатаЗавершения + + + Количество + + + + + false + ВидБизнесПроцесса + InList + 68c21fb2-0c55-4303-92c4-ecfcdf71607a + + + + + Период + + ThisMonth + + 654e1469-dd6e-46e1-94a3-6b5e6eaa0722 + + + + + Дата + Asc + + + + + + + Дата + + + ДатаЗавершения + + + + + + Формат + ДФ=dd.MM.yyyy + + + + + + + + Завершен + Equal + true + + + + + ЦветТекста + style:ЗавершенныйБизнесПроцесс + + + + + + + Стартован + + + + + Стартован + Equal + false + + + + + ЦветТекста + style:НеСтартованныйБизнесПроцесс + + + + + + + Автор + + + + + + МаксимальнаяШирина + 20 + + + + + + + + ВидБизнесПроцесса + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + + + + + + + + + СтатистикаПоВидам + + + ru + Статистика по видам + + + + + + Количество + + + + + false + ВидБизнесПроцесса + InList + f555e331-a53e-4ed4-a1b3-2e39c6264cd6 + + + + + Период + + ThisMonth + + 93407f28-3a8c-4a6c-847b-cebc19df5411 + + + + + ВидБизнесПроцесса + Asc + + + + + + + Завершен + + + + + Завершен + Equal + false + + + + + Текст + Бизнес-процессы в работе + + + + + + + Завершен + + + + + Завершен + Equal + true + + + + + Текст + Завершенные бизнес-процессы + + + + + + + ТипДиаграммы + Column3D + + ТипДиаграммы.ВидПодписей + Value + + + + Заголовок + Статистика по видам бизнес-процессов + + + + + + + ВидБизнесПроцесса + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + Завершен + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + 516adb45-eacf-4811-813b-a0adc3aea0b1 + Показать завершенные бизнес-процессы отдельно + + + + + + + + \ No newline at end of file diff --git a/SSL/src/Reports/ОтчетПоБизнесПроцессам/ОтчетПоБизнесПроцессам.mdo b/SSL/src/Reports/ОтчетПоБизнесПроцессам/ОтчетПоБизнесПроцессам.mdo new file mode 100644 index 000000000..7d5697c4c --- /dev/null +++ b/SSL/src/Reports/ОтчетПоБизнесПроцессам/ОтчетПоБизнесПроцессам.mdo @@ -0,0 +1,27 @@ + + + + + + + ОтчетПоБизнесПроцессам + + ru + Бизнес-процессы + + true + Report.ОтчетПоБизнесПроцессам.Template.Макет + SettingsStorage.ХранилищеВариантовОтчетов + + ru + Отчет по бизнес-процессам + + + Макет + + ru + Макет + + DataCompositionSchema + + diff --git a/SSL/src/Reports/ОтчетПоВерсиям/Forms/ФормаОтчета/Form.form b/SSL/src/Reports/ОтчетПоВерсиям/Forms/ФормаОтчета/Form.form new file mode 100644 index 000000000..ccd23cc50 --- /dev/null +++ b/SSL/src/Reports/ОтчетПоВерсиям/Forms/ФормаОтчета/Form.form @@ -0,0 +1,151 @@ + + + + ТаблицаОтчета + 1 + true + true + + true + + + ТаблицаОтчета + + None + + ТаблицаОтчетаРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + ТаблицаОтчетаКонтекстноеМеню + 2 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + 50 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Auto + true + true + true + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Отчет + 1 + + ReportObject.ОтчетПоВерсиям + + + true + + + true + +
    true
    +
    + + ТаблицаОтчета + + <key>ru</key> + <value>Таблица отчета</value> + + 2 + + SpreadsheetDocument + + + true + + + true + + + + + СписокВерсий + + <key>ru</key> + <value>Список версий</value> + + 4 + + ValueList + + + true + + + true + + + + + + + Ссылка + + DocumentRef + CatalogRef + + true + + + СписокВерсий + + ValueList + + + + + + + + ShowOnComposition + ТаблицаОтчета + +
    diff --git a/SSL/src/Reports/ОтчетПоВерсиям/Forms/ФормаОтчета/Module.bsl b/SSL/src/Reports/ОтчетПоВерсиям/Forms/ФормаОтчета/Module.bsl new file mode 100644 index 000000000..2e5060573 --- /dev/null +++ b/SSL/src/Reports/ОтчетПоВерсиям/Forms/ФормаОтчета/Module.bsl @@ -0,0 +1,67 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Блок сервисных функций +// + +// Заполняет отчет +// +&НаСервере +Функция ВывестиОтчет() + + РеквизитФормыВЗначение("Отчет").СформироватьОтчет(ТаблицаОтчета, СписокВерсий); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Блок обработчиков событий +// + +// Обработчик события "при создании на сервере" формы +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Параметры.Ссылка) + И Параметры.Свойство("СписокВерсий") Тогда + Отчет.СсылкаНаОбъект = Параметры.Ссылка; + + СписокВерсий = Параметры.СписокВерсий; + + Если СписокВерсий.Количество() > 1 Тогда + СтрокаНомераВерсий = ""; + + СписокВерсий.СортироватьПоЗначению(); + + Для Каждого ЭлементСпискаВерсий Из СписокВерсий Цикл + СтрокаНомераВерсий = СтрокаНомераВерсий + Строка(ЭлементСпискаВерсий) + ", "; + КонецЦикла; + + СтрокаНомераВерсий = Лев(СтрокаНомераВерсий, СтрДлина(СтрокаНомераВерсий) - 2); + + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отчет по изменениям версий объекта %1 №№ %2'"), + Параметры.Ссылка, + СтрокаНомераВерсий); + Иначе + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Версия объекта %1 № %2'"), + Параметры.Ссылка, + Строка(СписокВерсий[0])); + КонецЕсли; + + ВывестиОтчет(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если Не ЗначениеЗаполнено(Отчет.СсылкаНаОбъект) + И СписокВерсий.Количество() = 0 Тогда + Отказ = Истина; + Предупреждение(НСтр("ru = 'Интерактивное использование запрещено'")); + Возврат; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Reports/ОтчетПоВерсиям/ManagerModule.bsl b/SSL/src/Reports/ОтчетПоВерсиям/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Reports/ОтчетПоВерсиям/ObjectModule.bsl b/SSL/src/Reports/ОтчетПоВерсиям/ObjectModule.bsl new file mode 100644 index 000000000..eb5316689 --- /dev/null +++ b/SSL/src/Reports/ОтчетПоВерсиям/ObjectModule.bsl @@ -0,0 +1,2618 @@ +//////////////////////////////////////////////////////////////////////////////// +// МОДУЛЬ ОБЪЕКТА ОТЧЕТА "ОТЧЕТ ПО ИЗМЕНЕНИЯМ" +// СОДЕРЖИТ ФУНКЦИИ ДЛЯ ФОРМИРОВАНИЯ ОТЧЕТА ПО ИЗМЕНЕНИЯМ ОБЪЕКТА, +// А ТАК ЖЕ ФУНКЦИИ ДЛЯ ДЕСЕРИАЛИЗАЦИИ И ПОДГОТОВКИ ПРЕДСТАВЛЕНИЯ ОБЪЕКТА +// + +// Заполняется при формировании отчета табличным документом из макета "ОбщийШаблон" отчета +Перем ОбщийШаблон; + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ ЭКСПОРТНЫХ ФУНКЦИЙ + +// Основная экспортная функция модуля, отвечающая за формирование отчета. +// В зависимости от числа версий в массиве вызывает либо функциональность +// формирования отчета по одной версии либо функциональность формирования +// отчета по изменениям между несколькими версиями. +// +Процедура СформироватьОтчет(ТЧОтчета, знач СписокВерсий) Экспорт + + ОбщийШаблон = Отчеты.ОтчетПоВерсиям.ПолучитьМакет("СтандартныйМакетПредставленияОбъекта"); + + МассивВерсий = Новый Массив; + Для Каждого ИдентификаторВерсии Из СписокВерсий Цикл + МассивВерсий.Добавить(ИдентификаторВерсии.Значение); + КонецЦикла; + + Если МассивВерсий.Количество() = 1 Тогда + СформироватьОтчетПоВерсииОбъекта(ТЧОтчета, МассивВерсий[0]); + Иначе + СформироватьОтчетПоИзменениям(ТЧОтчета, МассивВерсий); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Функции для получения отчета по объекту + +// Функция предназначена для формирования отчета по версии объекта +// +// Параметры: +// ТЧОтчета - ТабличныйДокумент - табличный документ, в который будет выводится отчет +// ИдентификаторВерсии - строка/число - номер версии объекта +// +Процедура СформироватьОтчетПоВерсииОбъекта(ТЧОтчета, ИдентификаторВерсии) + + ТЧОтчета.Очистить(); + + НаименованиеОбъекта = СсылкаНаОбъект.Метаданные().Имя; + + Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(СсылкаНаОбъект)) Тогда + Если Метаданные.Справочники[НаименованиеОбъекта].Макеты.Найти("МакетОбъекта") <> Неопределено Тогда + Макет = Справочники[НаименованиеОбъекта].ПолучитьМакет("МакетОбъекта"); + Иначе + Макет = Неопределено; + КонецЕсли; + Иначе + Если Метаданные.Документы[НаименованиеОбъекта].Макеты.Найти("МакетОбъекта") <> Неопределено Тогда + Макет = Документы[НаименованиеОбъекта].ПолучитьМакет("МакетОбъекта"); + Иначе + Макет = Неопределено; + КонецЕсли; + КонецЕсли; + + ОписаниеВерсии = ПолучитьОписаниеПоВерсии(ИдентификаторВерсии); + + Если Макет <> Неопределено Тогда + ФормированиеПоСтандартномуМакету(ТЧОтчета, + Макет, + ПолучитьОбъектИзXML(СохранитьФайлПоВерсии(ИдентификаторВерсии)), + ОписаниеВерсии); + Иначе + ВерсияОбъекта = РазборВерсии(ИдентификаторВерсии, СсылкаНаОбъект); + + Секция = ТЧОтчета.ПолучитьОбласть("R2"); + ВывестиТекстВОтчет(ТЧОтчета, Секция, "R2C2", СсылкаНаОбъект.Метаданные().Синоним,,,16, Истина); + + /////////////////////////////////////////////////////////////////////////////// + // вывод списка изменившихся реквизитов + + ТЧОтчета.Область("C2").ШиринаКолонки = 30; + ВывестиШапкуПоВерсии(ТЧОтчета, ОписаниеВерсии, 3); + ЧислоВыведенныхСтрок = ВывестиРеквизитыПоРазобранномуОбъекту(ТЧОтчета, ВерсияОбъекта); + ЧислоВыведенныхСтрок = ВывестиТабличныеЧастиПоРазобранномуОбъекту(ТЧОтчета, ВерсияОбъекта, ЧислоВыведенныхСтрок+7); + КонецЕсли; + +КонецПроцедуры + +// Формирует отчет по объекту, используя стандартный макет. +// +// Параметры: +// ТЧОтчета - ТабличныйДокумент - табличный документ, в который будет выводится отчет +// ВерсияОбъекта - СправочникОбъект,ДокументОбъект - объект, данные которого необходимо отобразить в отчете +// НаименованиеОбъекта - Строка - наименование объекта, по которому +// +Процедура ФормированиеПоСтандартномуМакету(ТЧОтчета, Макет, ВерсияОбъекта, знач ОписаниеВерсии) + + МетаданныеОбъекта = СсылкаНаОбъект.Метаданные(); + + НаименованиеОбъекта = МетаданныеОбъекта.Имя; + + ТЧОтчета = Новый ТабличныйДокумент; + + Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(СсылкаНаОбъект)) Тогда + Макет = Справочники[НаименованиеОбъекта].ПолучитьМакет("МакетОбъекта"); + Иначе + Макет = Документы[НаименованиеОбъекта].ПолучитьМакет("МакетОбъекта"); + КонецЕсли; + + // Заголовок + Область = Макет.ПолучитьОбласть("Заголовок"); + ТЧОтчета.Вывести(Область); + + Область = ТЧОтчета.ПолучитьОбласть("R3"); + УстановитьСвойстваТекста(Область.Область("R1C2"), ОписаниеВерсии, , , , Истина); + ТЧОтчета.Вывести(Область); + + Область = ТЧОтчета.ПолучитьОбласть("R5"); + ТЧОтчета.Вывести(Область); + + // Шапка + Шапка = Макет.ПолучитьОбласть("Шапка"); + Шапка.Параметры.Заполнить(ВерсияОбъекта); + ТЧОтчета.Вывести(Шапка); + + Для Каждого МетаданныеТЧ Из МетаданныеОбъекта.ТабличныеЧасти Цикл + Если ВерсияОбъекта[МетаданныеТЧ.Имя].Количество() > 0 Тогда + Область = Макет.ПолучитьОбласть(МетаданныеТЧ.Имя+"Шапка"); + ТЧОтчета.Вывести(Область); + + ОбластьДеталиПриходаТовара = Макет.ПолучитьОбласть(МетаданныеТЧ.Имя); + Для Каждого ТекСтрокаДеталиПриходаТовара Из ВерсияОбъекта[МетаданныеТЧ.Имя] Цикл + ОбластьДеталиПриходаТовара.Параметры.Заполнить(ТекСтрокаДеталиПриходаТовара); + ТЧОтчета.Вывести(ОбластьДеталиПриходаТовара); + КонецЦикла; + КонецЕсли; + КонецЦикла; + + ТЧОтчета.ОтображатьСетку = Ложь; + ТЧОтчета.Защита = Истина; + ТЧОтчета.ТолькоПросмотр = Истина; + ТЧОтчета.ОтображатьЗаголовки = Ложь; + +КонецПроцедуры + +// Выводит изменившиеся реквизиты в отчет. При этом получает их представление. +// +Функция ВывестиРеквизитыПоРазобранномуОбъекту(ТЧОтчета, ВерсияОбъекта) + + Секция = ТЧОтчета.ПолучитьОбласть("R6"); + ВывестиТекстВОтчет(ТЧОтчета, Секция, "R1C1:R1C3", " "); + ВывестиТекстВОтчет(ТЧОтчета, Секция, "R1C2", "Реквизиты", , , 11, Истина); + ТЧОтчета.НачатьГруппуСтрок("ГруппаРеквизитов"); + ВывестиТекстВОтчет(ТЧОтчета, Секция, "R1C1:R1C3", " "); + + ЧислоВыводимыхСтрок = 0; + + Для Каждого ЭлементРеквизит Из ВерсияОбъекта.Реквизиты Цикл + + НаименованиеРеквизита = ПолучитьПредставлениеРеквизитаНаЯзыке(ЭлементРеквизит.НаименованиеРеквизита); + + ОписаниеРеквизита = СсылкаНаОбъект.Метаданные().Реквизиты.Найти(НаименованиеРеквизита); + + Если ОписаниеРеквизита = Неопределено Тогда + Для Каждого ОписаниеСтандартногоРеквизита Из СсылкаНаОбъект.Метаданные().СтандартныеРеквизиты Цикл + Если ОписаниеСтандартногоРеквизита.Имя = НаименованиеРеквизита Тогда + ОписаниеРеквизита = ОписаниеСтандартногоРеквизита; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ЗначениеРеквизита = ?(ЭлементРеквизит.ЗначениеРеквизита = Неопределено, "", ЭлементРеквизит.ЗначениеРеквизита); + + Если ЗначениеЗаполнено(ЭлементРеквизит.ТипРеквизита) Тогда + ВыводимоеНаименование = НаименованиеРеквизита; + ПредставлениеЗначения = ПривестиКПредставлениюПоТипуИЗначению( + ЭлементРеквизит.ТипРеквизита, + ЗначениеРеквизита); + ИначеЕсли (ОписаниеРеквизита <> Неопределено) Тогда + ВыводимоеНаименование = ?(ЗначениеЗаполнено(ОписаниеРеквизита.Синоним), ОписаниеРеквизита.Синоним, ОписаниеРеквизита.Имя); + ОписаниеТипаРеквизита = ОписаниеРеквизита.Тип; + // пытаемся найти прямое соответствие + ПредставлениеЗначения = + СформироватьПредставлениеПоОписаниюТипа(ОписаниеТипаРеквизита, + ЗначениеРеквизита); + Иначе + ВыводимоеНаименование = НаименованиеРеквизита; + КонецЕсли; + + УстановитьСвойстваТекста(Секция.Область("R1C2"), ВыводимоеНаименование, ,WebЦвета.Белый, , Истина); + УстановитьСвойстваТекста(Секция.Область("R1C3"), ПредставлениеЗначения); + Секция.Область("R1C2:R1C3").ГраницаСнизу = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1, 0); + Секция.Область("R1C2:R1C3").ЦветРамки = Новый Цвет (200,200,200); + + ТЧОтчета.Вывести(Секция); + + ЧислоВыводимыхСтрок = ЧислоВыводимыхСтрок + 1; + КонецЦикла; + + ТЧОтчета.ЗакончитьГруппуСтрок(); + + Возврат ЧислоВыводимыхСтрок; + +КонецФункции + +// Выводит табличные части по разобранному объекту, при выводе единственного объекта +// +Функция ВывестиТабличныеЧастиПоРазобранномуОбъекту(ТЧОтчета, ВерсияОбъекта, НомерСтрокиВывода); + + ЧислоВыводимыхСтрок = 0; + + Если ВерсияОбъекта.ТабличныеЧасти.Количество() <> 0 Тогда + + Для Каждого СтрокаТабличнаяЧасть Из ВерсияОбъекта.ТабличныеЧасти Цикл + НаименованиеТабличнойЧасти = СтрокаТабличнаяЧасть.Ключ; + ТабличнаяЧасть = СтрокаТабличнаяЧасть.Значение; + Если ТабличнаяЧасть.Количество() > 0 Тогда + + МетаданныеТЧ = СсылкаНаОбъект.Метаданные().ТабличныеЧасти[НаименованиеТабличнойЧасти]; + СинонимТЧ = МетаданныеТЧ.Синоним; + СинонимТЧ = ?(ЗначениеЗаполнено(СинонимТЧ), СинонимТЧ, НаименованиеТабличнойЧасти); + + Секция = ТЧОтчета.ПолучитьОбласть("R" + Строка(НомерСтрокиВывода)); + ВывестиТекстВОтчет(ТЧОтчета, Секция, "R1C1:R1C3", " "); + ВывестиТекстВОтчет(ТЧОтчета, Секция, "R1C2", СинонимТЧ, , , 11, Истина); + ТЧОтчета.НачатьГруппуСтрок("ГруппаСтрок"); + ВывестиТекстВОтчет(ТЧОтчета, Секция, "R1C1:R1C3", " "); + + ЧислоВыводимыхСтрок = ЧислоВыводимыхСтрок + 1; + + НомерСтрокиВывода = НомерСтрокиВывода + 3; + + ДобавляемаяТЧ = Новый ТабличныйДокумент; + + ДобавляемаяТЧ.Присоединить(СформироватьПустойСектор(ТабличнаяЧасть.Количество()+1)); + + НомерКолонки = 2; + + СоответствиеРазмерностиКолонок = Новый Соответствие; + + Секция = Новый ТабличныйДокумент; + + УстановитьСвойстваТекста(Секция.Область("R1C1"),"N", ,WebЦвета.СветлоСерый, , Истина, Истина); + + НомерСтроки = 1; + Для Каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл + НомерСтроки = НомерСтроки + 1; + УстановитьСвойстваТекста(Секция.Область("R" + НомерСтроки + "C1"), Строка(НомерСтроки-1), ,WEBЦвета.Белый,,,Истина); + КонецЦикла; + ДобавляемаяТЧ.Присоединить(Секция); + + НомерКолонки = 3; + + Для Каждого КолонкаТабличнойЧасти Из ТабличнаяЧасть.Колонки Цикл + Секция = Новый ТабличныйДокумент; + НаименованиеПоля = КолонкаТабличнойЧасти.Имя; + ОписаниеПоля = МетаданныеТЧ.Реквизиты.Найти(НаименованиеПоля); + Если ОписаниеПоля = Неопределено Или Не ЗначениеЗаполнено(ОписаниеПоля.Синоним) Тогда + ВыводимоеНаименованиеПоля = НаименованиеПоля; + Иначе + ВыводимоеНаименованиеПоля = ОписаниеПоля.Синоним; + КонецЕсли; + ЦветЗаголовкаКолонки = ?(ОписаниеПоля = Неопределено, WebЦвета.КрасноФиолетовый, WebЦвета.СветлоСерый); + УстановитьСвойстваТекста(Секция.Область("R1C1"), + ВыводимоеНаименованиеПоля, ,ЦветЗаголовкаКолонки, , Истина, Истина); + СоответствиеРазмерностиКолонок.Вставить(НомерКолонки, СтрДлина(НаименованиеПоля) + 4); + НомерСтроки = 1; + Для Каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл + НомерСтроки = НомерСтроки + 1; + Значение = ?(СтрокаТабличнойЧасти[НаименованиеПоля] = Неопределено, "", СтрокаТабличнойЧасти[НаименованиеПоля]); + Если ОписаниеПоля <> Неопределено Тогда + ПредставлениеЗначения = СформироватьПредставлениеПоОписаниюТипа(ОписаниеПоля.Тип, Значение); + Иначе + ПредставлениеЗначения = Значение; + КонецЕсли; + УстановитьСвойстваТекста(Секция.Область("R" + НомерСтроки + "C1"), ПредставлениеЗначения, ,WEBЦвета.Белый,,,Истина); + Если СтрДлина(ПредставлениеЗначения) > (СоответствиеРазмерностиКолонок[НомерКолонки] - 4) Тогда + СоответствиеРазмерностиКолонок[НомерКолонки] = СтрДлина(ПредставлениеЗначения) + 4; + КонецЕсли; + КонецЦикла; // Для Каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл + + ДобавляемаяТЧ.Присоединить(Секция); + НомерКолонки = НомерКолонки + 1; + КонецЦикла; // Для Каждого КолонкаТабличнойЧасти Из ТабличнаяЧасть.Колонки Цикл + + ОбластьВывода = ТЧОтчета.Вывести(ДобавляемаяТЧ); + ТЧОтчета.Область("R"+ОбластьВывода.Верх+"C1:R"+ОбластьВывода.Низ+"C"+НомерКолонки).СоздатьФорматСтрок(); + ТЧОтчета.Область("R"+ОбластьВывода.Верх+"C2").ШиринаКолонки = 7; + Для ТекущийНомерКолонки = 3 По НомерКолонки-1 Цикл + ТЧОтчета.Область("R"+ОбластьВывода.Верх+"C"+ТекущийНомерКолонки).ШиринаКолонки = СоответствиеРазмерностиКолонок[ТекущийНомерКолонки]; + КонецЦикла; + ТЧОтчета.ЗакончитьГруппуСтрок(); + + КонецЕсли; // Если ТабличнаяЧасть.Количество() > 0 Тогда + КонецЦикла; // Для Каждого СтрокаТабличнаяЧасть Из ВерсияОбъекта.ТабличныеЧасти Цикл + + КонецЕсли; + +КонецФункции + +// Выводит шапку отчета при выводе отчета по версии объекта +// +Процедура ВывестиШапкуПоВерсии(ТЧОтчета, знач Текст, знач НомерКолонки) + + ТЧОтчета.Область("C"+Строка(НомерКолонки)).ШиринаКолонки = 50; + + Регион = "R4C"+Строка(НомерКолонки); + ТЧОтчета.Область(Регион).Текст = Текст; + ТЧОтчета.Область(Регион).ЦветФона = WebЦвета.СветлоСерый; + ТЧОтчета.Область(Регион).Шрифт = Новый Шрифт(, 8, Истина, , , ); + ТЧОтчета.Область(Регион).ГраницаСверху = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная); + ТЧОтчета.Область(Регион).ГраницаСнизу = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная); + ТЧОтчета.Область(Регион).ГраницаСлева = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная); + ТЧОтчета.Область(Регион).ГраницаСправа = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Функции для получения отчета по изменениям + +// Основная управляющая функция для формирование отчета по изменениям. +// Состоит из трех этапов: +// 1. Получение XML представления хранимых версий объекта. Формирование +// специальных структур данных для сравнения объектов. +// 2. Получение +// +Процедура СформироватьОтчетПоИзменениям(ТЧОтчета, знач МассивВерсий) + + // Хранит переходную разобранную версию объекта, + // что бы сократить число разборов XML + Перем ВерсияОбъекта; + + // "Сквозной" идентификатор измененных строк в версиях + Перем счетчикУникальныйИд; + + ТЧОтчета.Очистить(); + + // Формируем массив номеров версий (так как некоторые могут отсутствовать + // и иметь непоследовательную нумерацию), массив отсортирован по возрастанию. + МассивНомеровВерсий = МассивВерсий; + + // Количество версий объекта хранящихся в базе (k). + // Для формирования отчета необходимо сделать (k-1) сравнений. + // Фактически это означает, что у таблиц изменений будет (k) колонок + //КоличествоВерсийОбъекта = КоличествоВерсий; + КоличествоВерсийОбъекта = МассивНомеровВерсий.Количество(); + + // Хранит в себе все изменения реквизитов имеет две размерности: + // первая (строки) содержит значения наименований реквизитов объекта + // вторая (столбцы) содержит идентификацию версии объекта и характеристику + // изменения идентификация версии это строка которая однозначно идентифицирует + // версию объекта среди остальных и сообщает дополнительную информацию по изменению + ТаблицаИзмененийРеквизитов = Новый ТаблицаЗначений; + ПодготовитьКолонкиТаблицИзмененийРеквизитов(ТаблицаИзмененийРеквизитов, МассивНомеровВерсий); + + // Хранит в себе изменения табличных частей в виде соответствий имен + // таблиц значений объекта истории изменений этой таблицы значений + // каждое соответствие - табличная часть + // первая (строки) содержит значения наименований полей табличной части + // вторая (столбцы) содержит идентификацию версии объекта + // идентификация версии это строка которая однозначно идентифицирует версию + // объекта среди остальных и сообщает дополнительную информацию по изменению + ТаблицаИзмененийТабличныхЧастей = Новый Соответствие; + + // формируем начальные версии объекта, значения которых показываются всегда + // (при наличии последующих изменений) + ВерсияОбъекта_Пред = СчитатьНачальныеЗначенияРеквизитовИТабличныхЧастей( + ТаблицаИзмененийРеквизитов, + ТаблицаИзмененийТабличныхЧастей, + КоличествоВерсийОбъекта, + МассивНомеровВерсий); + + счетчикУникальныйИд = ПолучитьУникальныеУникальныйИд(ТаблицаИзмененийТабличныхЧастей, "Вер" + МассивНомеровВерсий[0]); + + Для ИндексВерсии = 2 По МассивНомеровВерсий.Количество() Цикл + НомерВерсии = МассивНомеровВерсий[ИндексВерсии-1]; + НомерПредыдущейВерсии = "Вер" + (Число(МассивНомеровВерсий[ИндексВерсии-2])); + ИмяКолонкиТекущейВерсии = "Вер" + НомерВерсии; + + РезультатСравнения = РассчитатьИзменения(НомерВерсии, ВерсияОбъекта_Пред, ВерсияОбъекта); + + ИзмРек = РезультатСравнения["Реквизиты"]["и"]; + ДобРек = РезультатСравнения["Реквизиты"]["д"]; + УдлРек = РезультатСравнения["Реквизиты"]["у"]; + + // заполнение таблицы отчета по реквизитам + ЗаполнитьХарактеристикуИзмененияРеквизита(ИзмРек, "И", ТаблицаИзмененийРеквизитов, ИмяКолонкиТекущейВерсии, ВерсияОбъекта); + ЗаполнитьХарактеристикуИзмененияРеквизита(ДобРек, "Д", ТаблицаИзмененийРеквизитов, ИмяКолонкиТекущейВерсии, ВерсияОбъекта); + ЗаполнитьХарактеристикуИзмененияРеквизита(УдлРек, "У", ТаблицаИзмененийРеквизитов, ИмяКолонкиТекущейВерсии, ВерсияОбъекта); + + // Изменения в табличных частях + ИзмТЧ = РезультатСравнения["ТабличныеЧасти"]["и"]; + + // Данная функциональность пока не реализуется + ДобТЧ = РезультатСравнения["ТабличныеЧасти"]["д"]; + УдлТЧ = РезультатСравнения["ТабличныеЧасти"]["у"]; + + Для Каждого ЭлементСоответствия Из ВерсияОбъекта.ТабличныеЧасти Цикл + ИмяТаблицы = ЭлементСоответствия.Ключ; + + Если ЗначениеЗаполнено(ДобТЧ.Найти(ИмяТаблицы)) + Или ЗначениеЗаполнено(УдлТЧ.Найти(ИмяТаблицы)) Тогда + Продолжить; + КонецЕсли; + + ТаблицаИзмененийТабличныхЧастей[ИмяТаблицы][ИмяКолонкиТекущейВерсии] = + ВерсияОбъекта.ТабличныеЧасти[ИмяТаблицы].Скопировать(); + СсылкаНаВерсиюТаблицы = ТаблицаИзмененийТабличныхЧастей[ИмяТаблицы][ИмяКолонкиТекущейВерсии]; + СсылкаНаВерсиюТаблицы.Колонки.Добавить("_ИдСтроки"); + СсылкаНаВерсиюТаблицы.ЗаполнитьЗначения(Неопределено, "_ИдСтроки"); + СсылкаНаВерсиюТаблицы.Колонки.Добавить("_Модификация"); + СсылкаНаВерсиюТаблицы.ЗаполнитьЗначения(Неопределено, "_Модификация"); + ТаблицаСИзменениями = ИзмТЧ.Получить(ИмяТаблицы); + Если ТаблицаСИзменениями <> Неопределено Тогда + ИзмТЧ_СтрокиИ = ТаблицаСИзменениями["И"]; + ИзмТЧ_СтрокиД = ТаблицаСИзменениями["Д"]; + ИзмТЧ_СтрокиУ = ТаблицаСИзменениями["У"]; + + РазмерностьВТЧ0 = ВерсияОбъекта_Пред.ТабличныеЧасти[ИмяТаблицы].Количество(); + Если РазмерностьВТЧ0 = 0 Тогда + ПомеченныеВТЧ0 = Новый Массив; + Иначе + ПомеченныеВТЧ0 = Новый Массив(РазмерностьВТЧ0); + КонецЕсли; + + РазмерностьВТЧ1 = ВерсияОбъекта.ТабличныеЧасти[ИмяТаблицы].Количество(); + Если РазмерностьВТЧ1 = 0 Тогда + ПомеченныеВТЧ1 = Новый Массив; + Иначе + ПомеченныеВТЧ1 = Новый Массив(РазмерностьВТЧ1); + КонецЕсли; + + Для Каждого ЭлементТЧ Из ИзмТЧ_СтрокиИ Цикл + СтрокаТИЗ = ТаблицаИзмененийТабличныхЧастей[ИмяТаблицы][НомерПредыдущейВерсии][ЭлементТЧ.ИндексВТЧ0-1]; + СсылкаНаВерсиюТаблицы[ЭлементТЧ.ИндексВТЧ1-1]._ИдСтроки = СтрокаТИЗ._ИдСтроки; + СсылкаНаВерсиюТаблицы[ЭлементТЧ.ИндексВТЧ1-1]._Модификация = "И"; + КонецЦикла; + + Для Каждого ЭлементТЧ Из ИзмТЧ_СтрокиД Цикл + СсылкаНаВерсиюТаблицы[ЭлементТЧ.ИндексВТЧ1-1]._ИдСтроки = УвеличитьСчетчик(счетчикУникальныйИд, ИмяТаблицы); + СсылкаНаВерсиюТаблицы[ЭлементТЧ.ИндексВТЧ1-1]._Модификация = "Д"; + КонецЦикла; + + // необходимо заполнить всем элементам УникальныйИд (сопоставить с предыдущей версией) + Для Индекс = 1 По СсылкаНаВерсиюТаблицы.Количество() Цикл + Если СсылкаНаВерсиюТаблицы[Индекс-1]._ИдСтроки = Неопределено Тогда + // найдена строка, для которой необходимо найти соответствие в предыдущей таблице + СтрокаТЧ = СсылкаНаВерсиюТаблицы[Индекс-1]; + + ПараметрыОтбора = Новый Структура; + Для Каждого ЭлементКоллекции Из СсылкаНаВерсиюТаблицы.Колонки Цикл + Если (ЭлементКоллекции.Имя <> "_ИдСтроки") И (ЭлементКоллекции.Имя <> "_Модификация") Тогда + ПараметрыОтбора.Вставить(ЭлементКоллекции.Имя, СтрокаТЧ[ЭлементКоллекции.Имя]); + КонецЕсли; + КонецЦикла; + МассивСтрокТекущейТЧ = СсылкаНаВерсиюТаблицы.НайтиСтроки(ПараметрыОтбора); + МассивСтрокПредыдущейТЧ = ТаблицаИзмененийТабличныхЧастей[ИмяТаблицы][НомерПредыдущейВерсии].НайтиСтроки(ПараметрыОтбора); + + Для ИндПоТЗ_Текущей = 1 По МассивСтрокТекущейТЧ.Количество() Цикл + Если ИндПоТЗ_Текущей <= МассивСтрокПредыдущейТЧ.Количество() Тогда + МассивСтрокТекущейТЧ[ИндПоТЗ_Текущей-1]._ИдСтроки = МассивСтрокПредыдущейТЧ[ИндПоТЗ_Текущей-1]._ИдСтроки; + КонецЕсли; + МассивСтрокТекущейТЧ[ИндПоТЗ_Текущей-1]._Модификация = Ложь; + КонецЦикла; + КонецЕсли; + КонецЦикла; + Для Каждого ЭлементТЧ Из ИзмТЧ_СтрокиУ Цикл + СтрокаМнимая = СсылкаНаВерсиюТаблицы.Добавить(); + СтрокаМнимая._ИдСтроки = ТаблицаИзмененийТабличныхЧастей[ИмяТаблицы][НомерПредыдущейВерсии][ЭлементТЧ.ИндексВТЧ0-1]._ИдСтроки; + СтрокаМнимая._Модификация = "У"; + КонецЦикла; + КонецЕсли; + КонецЦикла; + ВерсияОбъекта_Пред = ВерсияОбъекта; + КонецЦикла; + + // передаем скомпонованную информацию в спец блок для вывода данных в отчет + ВывестиРезультатыКомпоновкиВОтчет(ТаблицаИзмененийРеквизитов, + ТаблицаИзмененийТабличныхЧастей, + счетчикУникальныйИд, + МассивНомеровВерсий, + ТЧОтчета); + + ШаблонЛегенда = ОбщийШаблон.ПолучитьОбласть("Легенда"); + ТЧОтчета.Вывести(ШаблонЛегенда); + +КонецПроцедуры + +Процедура ВывестиИзмененияРеквизитов(ТЧОтчета, + ТаблицаИзмененийРеквизитов, + МассивНомеровВерсий) + + ОбластьШапкаРеквизитов = ОбщийШаблон.ПолучитьОбласть("ШапкаРеквизитов"); + ТЧОтчета.Вывести(ОбластьШапкаРеквизитов); + ТЧОтчета.НачатьГруппуСтрок("ГруппаРеквизитов"); + + Для Каждого ЭлементМодРеквизит Из ТаблицаИзмененийРеквизитов Цикл + Если ЭлементМодРеквизит._Модификация = Истина Тогда + // получаем имя реквизита + НаименованиеРеквизита = ЭлементМодРеквизит.Наименование; + // выводим наименование, предварительно заменяя его на другое, если + // оно является предопределенным + ВыводимоеНаименование = ПолучитьПредставлениеРеквизитаНаЯзыке(НаименованиеРеквизита); + + ОписаниеРеквизита = СсылкаНаОбъект.Метаданные().Реквизиты.Найти(ВыводимоеНаименование); + + Если ОписаниеРеквизита = Неопределено Тогда + Для Каждого ОписаниеСтандартногоРеквизита Из СсылкаНаОбъект.Метаданные().СтандартныеРеквизиты Цикл + Если ОписаниеСтандартногоРеквизита.Имя = ПолучитьПредставлениеРеквизитаНаЯзыке(НаименованиеРеквизита) Тогда + ОписаниеРеквизита = ОписаниеСтандартногоРеквизита; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ПустаяЯчейка = ОбщийШаблон.ПолучитьОбласть("ПустаяЯчейка"); + ТЧОтчета.Вывести(ПустаяЯчейка);; + + НаименованиеРеквизита = ОбщийШаблон.ПолучитьОбласть("НаименованиеРеквизитаПоля"); + НаименованиеРеквизита.Параметры.НаименованиеРеквизитаПоля = ВыводимоеНаименование; + ТЧОтчета.Присоединить(НаименованиеРеквизита); + + ИндексПоВерсиямРеквизитов = МассивНомеровВерсий.Количество(); + + Пока ИндексПоВерсиямРеквизитов >= 1 Цикл + СтруктураХарактеристикаИзменения = ЭлементМодРеквизит["Вер"+МассивНомеровВерсий[ИндексПоВерсиямРеквизитов-1]]; + + ПредставлениеЗначенияРеквизита = ""; + ЗначениеРеквизита = ""; + Изменение = Неопределено; + ТипЗначения = ""; + + // если в текущей версии не было изменений реквизита, то пропускаем до следующей версии + Если ТипЗнч(СтруктураХарактеристикаИзменения) = Тип("Строка") Тогда + ЗначениеРеквизита = СтруктураХарактеристикаИзменения; + + ОписаниеТипаРеквизита = ОписаниеРеквизита.Тип; + // пытаемся найти прямое соответствие + ПредставлениеЗначенияРеквизита = + СформироватьПредставлениеПоОписаниюТипа(ОписаниеТипаРеквизита, + ЗначениеРеквизита); + ИначеЕсли СтруктураХарактеристикаИзменения <> Неопределено Тогда + Если СтруктураХарактеристикаИзменения.ТипИзменения = "У" Тогда + Иначе + ЗначениеРеквизита = СтруктураХарактеристикаИзменения.Значение.ЗначениеРеквизита; + ТипЗначения = СтруктураХарактеристикаИзменения.Значение.ТипРеквизита; + Если ЗначениеЗаполнено(ТипЗначения) Тогда + ПредставлениеЗначенияРеквизита = + ПривестиКПредставлениюПоТипуИЗначению( + ТипЗначения, + ЗначениеРеквизита); + ИначеЕсли (ОписаниеРеквизита <> Неопределено) Тогда + ОписаниеТипаРеквизита = ОписаниеРеквизита.Тип; + // пытаемся найти прямое соответствие + ПредставлениеЗначенияРеквизита = + СформироватьПредставлениеПоОписаниюТипа(ОписаниеТипаРеквизита, + ЗначениеРеквизита); + КонецЕсли; + КонецЕсли; + // получаем структуру изменения реквизита в текущей версии + Изменение = СтруктураХарактеристикаИзменения.ТипИзменения; + КонецЕсли; + + Если ПредставлениеЗначенияРеквизита = "" Тогда + ПредставлениеЗначенияРеквизита = ЗначениеРеквизита; + Если ПредставлениеЗначенияРеквизита = "" Тогда + ПредставлениеЗначенияРеквизита = " "; + КонецЕсли; + КонецЕсли; + + Если Изменение = Неопределено Тогда + ОбластьЗначениеРеквизита = ОбщийШаблон.ПолучитьОбласть("ИсходноеЗначениеРеквизита"); + ОбластьЗначениеРеквизита.Параметры.ЗначениеРеквизита = ПредставлениеЗначенияРеквизита; + ИначеЕсли Изменение = "И" Тогда + ОбластьЗначениеРеквизита = ОбщийШаблон.ПолучитьОбласть("ИзмененноеЗначениеРеквизита"); + ОбластьЗначениеРеквизита.Параметры.ЗначениеРеквизита = ПредставлениеЗначенияРеквизита; + ИначеЕсли Изменение = "У" Тогда + ОбластьЗначениеРеквизита = ОбщийШаблон.ПолучитьОбласть("УдаленныйРеквизит"); + ОбластьЗначениеРеквизита.Параметры.ЗначениеРеквизита = ПредставлениеЗначенияРеквизита; + ИначеЕсли Изменение = "Д" Тогда + ОбластьЗначениеРеквизита = ОбщийШаблон.ПолучитьОбласть("ДобавленныйРеквизит"); + ОбластьЗначениеРеквизита.Параметры.ЗначениеРеквизита = ПредставлениеЗначенияРеквизита; + КонецЕсли; + + ТЧОтчета.Присоединить(ОбластьЗначениеРеквизита); + + ИндексПоВерсиямРеквизитов = ИндексПоВерсиямРеквизитов - 1; + КонецЦикла; + КонецЕсли; // Если ЭлементМодРеквизит._Модификация = Истина Тогда + КонецЦикла; + + ТЧОтчета.ЗакончитьГруппуСтрок(); + +КонецПроцедуры + +Процедура ВывестиИзмененияТабличныхЧастей(ТЧОтчета, + ТаблицаИзмененийТабличныхЧастей, + МассивНомеровВерсий, + счетчикУникальныйИд) + + ЗаголовокСекцииТабличныхЧастейВыводился = Ложь; + + ШаблонСвободнаяСтрока = ОбщийШаблон.ПолучитьОбласть("СвободнаяСтрока"); + ШаблонОчереднаяСтрокаТЧ = ОбщийШаблон.ПолучитьОбласть("ШапкаСтрокиТабличнойЧасти"); + + ТЧОтчета.Вывести(ШаблонСвободнаяСтрока); + + // цикл по всем измененным + Для Каждого ЭлементИзмененнаяТЧ Из ТаблицаИзмененийТабличныхЧастей Цикл + ИмяТабличнойЧасти = ЭлементИзмененнаяТЧ.Ключ; + ВерсииТекущейТЧ = ЭлементИзмененнаяТЧ.Значение; + + ТекущаяТабличнаяЧастьИзменилась = Ложь; + + Для ТекСчетчикУникальныйИд = 1 По СчетчикУникальныйИд[ИмяТабличнойЧасти] Цикл + + СтрокаУникальныйИдИзменена = Ложь; + // в случае если найдено изменение, необходимо так же показать изначальную версию, + // от которой происходят изменения + НачальнаяВерсияЗаполнена = Ложь; + + // поиск по всем версиям изменений по текущей строке (УникальныйИд = ТекСчетчикУникальныйИд) + // если строка была удалена, то поиск можно прервать и перейти к следующей + // строке, предварительно подсветив "удалено" цветом удаленной сущности + ИндексПоВерсиям = МассивНомеровВерсий.Количество(); + + // --------------------------------------------------------------------------------- + // просмотрим версии наперед, что бы быть уверенными, что изменения встречаются --- + + МодифицированностьСтроки = Ложь; + + Пока ИндексПоВерсиям >= 1 Цикл + ТекущаяКолонкаВерсииТЧ = "Вер"+МассивНомеровВерсий[ИндексПоВерсиям-1]; + ТекущаяТЧВерсии = ВерсииТекущейТЧ[ТекущаяКолонкаВерсииТЧ]; + НайденнаяСтрока = ТекущаяТЧВерсии.Найти(ТекСчетчикУникальныйИд, "_ИдСтроки"); + Если НайденнаяСтрока <> Неопределено Тогда + Если (НайденнаяСтрока._Модификация <> Неопределено) Тогда + Если (ТипЗнч(НайденнаяСтрока._Модификация) = Тип("Строка") + ИЛИ (ТипЗнч(НайденнаяСтрока._Модификация) = Тип("Булево") + И НайденнаяСтрока._Модификация = Истина)) Тогда + МодифицированностьСтроки = Истина; + КонецЕсли; + КонецЕсли; + КонецЕсли; + ИндексПоВерсиям = ИндексПоВерсиям - 1; + КонецЦикла; + + Если Не МодифицированностьСтроки Тогда + Продолжить; + КонецЕсли; + + // --------------------------------------------------------------------------------- + + // приступаем к отображению версий в табличный документ + ИндексПоВерсиям = МассивНомеровВерсий.Количество(); + + ПромежутокМеждуЗаполнениями = 0; + + // Цикл по всем версиям. Пытаемся найти изменения по строку в каждой версии + // по ее УникальныйИд. + Пока ИндексПоВерсиям >= 1 Цикл + ПромежутокМеждуЗаполнениями = ПромежутокМеждуЗаполнениями + 1; + ТекущаяКолонкаВерсииТЧ = "Вер"+МассивНомеровВерсий[ИндексПоВерсиям-1]; + // табличная часть текущей версии (таблица значений с признаками модификации) + ТекущаяТЧВерсии = ВерсииТекущейТЧ[ТекущаяКолонкаВерсииТЧ]; + НайденнаяСтрока = ТекущаяТЧВерсии.Найти(ТекСчетчикУникальныйИд, "_ИдСтроки"); + + // в очередной версии найдено изменение строки (возможно это первое изменение с конца) + Если НайденнаяСтрока <> Неопределено Тогда + + // блок для вывода шапки секции всех табличных частей + Если Не ЗаголовокСекцииТабличныхЧастейВыводился Тогда + ЗаголовокСекцииТабличныхЧастейВыводился = Истина; + ШаблонОбщаяШапкаСекцииТЧ = ОбщийШаблон.ПолучитьОбласть("ШапкаТабличныхЧастей"); + ТЧОтчета.Вывести(ШаблонОбщаяШапкаСекцииТЧ); + ТЧОтчета.НачатьГруппуСтрок("ГруппаТабличныхЧастей"); + ТЧОтчета.Вывести(ШаблонСвободнаяСтрока); + КонецЕсли; + + // блок для вывода шапки текущей обрабатываемой табличной части + Если Не ТекущаяТабличнаяЧастьИзменилась Тогда + ТекущаяТабличнаяЧастьИзменилась = Истина; + ШаблонШапкаТекущейТЧ = ОбщийШаблон.ПолучитьОбласть("ШапкаТабличнойЧасти"); + ШаблонШапкаТекущейТЧ.Параметры.НаименованиеТабличнойЧасти = ИмяТабличнойЧасти; + ТЧОтчета.Вывести(ШаблонШапкаТекущейТЧ); + ТЧОтчета.НачатьГруппуСтрок("ТабличнаяЧасть"+ИмяТабличнойЧасти); + ТЧОтчета.Вывести(ШаблонСвободнаяСтрока); + КонецЕсли; + + Модификация = НайденнаяСтрока._Модификация; + + Если СтрокаУникальныйИдИзменена = Ложь Тогда + СтрокаУникальныйИдИзменена = Истина; + + ШаблонШапкаСтрокиТЧ = ОбщийШаблон.ПолучитьОбласть("ШапкаСтрокиТабличнойЧасти"); + ШаблонШапкаСтрокиТЧ.Параметры.НомерСтрокиТабличнойЧасти = ТекСчетчикУникальныйИд; + ТЧОтчета.Вывести(ШаблонШапкаСтрокиТЧ); + ТЧОтчета.НачатьГруппуСтрок("ГруппаСтрок"+ИмяТабличнойЧасти+ТекСчетчикУникальныйИд); + + ТипВывода = ""; + Если Модификация = "У" Тогда + ТипВывода = "У" + КонецЕсли; + МассивЗаполнения = Новый Массив; + Для Каждого Колонка Из ТекущаяТЧВерсии.Колонки Цикл + Если Колонка.Имя = "_ИдСтроки" + Или Колонка.Имя = "_Модификация" Тогда + Продолжить; + КонецЕсли; + МассивЗаполнения.Добавить(Колонка.Имя); + КонецЦикла; + + ПустойСектор = СформироватьПустойСектор(ТекущаяТЧВерсии.Колонки.Количество()-2); + ПустойСекторЗаполняемый = СформироватьПустойСектор(ТекущаяТЧВерсии.Колонки.Количество()-2, ТипВывода); + Секция = СформироватьСекторСтрокиТЧ(МассивЗаполнения, ТипВывода); + + ТЧОтчета.Присоединить(ПустойСектор); + ТЧОтчета.Присоединить(Секция); + КонецЕсли; + + Пока ПромежутокМеждуЗаполнениями > 1 Цикл + ТЧОтчета.Присоединить(ПустойСекторЗаполняемый); + ПромежутокМеждуЗаполнениями = ПромежутокМеждуЗаполнениями - 1; + КонецЦикла; + + ПромежутокМеждуЗаполнениями = 0; + + // теперь заполняем очередную измененную табличную строку + МассивЗаполнения = Новый Массив; + Для Каждого Колонка Из ТекущаяТЧВерсии.Колонки Цикл + Если Колонка.Имя = "_ИдСтроки" + Или Колонка.Имя = "_Модификация" Тогда + Продолжить; + КонецЕсли; + + Значение = НайденнаяСтрока[Колонка.Имя]; + + ОписаниеТабличногоПоля = СсылкаНаОбъект.Метаданные().ТабличныеЧасти.Найти(ИмяТабличнойЧасти).Реквизиты.Найти(Колонка.Имя); + Представление = ОпределитьПредставление(Значение, Колонка.Имя, ОписаниеТабличногоПоля); + МассивЗаполнения.Добавить(Представление); + + КонецЦикла; + + Если ТипЗнч(Модификация) = Тип("Булево") Тогда + ТипВывода = ""; + Иначе + ТипВывода = Модификация; + КонецЕсли; + + Секция = СформироватьСекторСтрокиТЧ(МассивЗаполнения, ТипВывода); + + ТЧОтчета.Присоединить(Секция); + + КонецЕсли; // НайденнаяСтрока <> Неопределено + ИндексПоВерсиям = ИндексПоВерсиям - 1; + КонецЦикла; + + Если СтрокаУникальныйИдИзменена Тогда + ТЧОтчета.ЗакончитьГруппуСтрок(); + ТЧОтчета.Вывести(ШаблонСвободнаяСтрока); + КонецЕсли; + + КонецЦикла; + + Если ТекущаяТабличнаяЧастьИзменилась Тогда + ТЧОтчета.ЗакончитьГруппуСтрок(); + ТЧОтчета.Вывести(ШаблонСвободнаяСтрока); + КонецЕсли; + + КонецЦикла; + + Если ЗаголовокСекцииТабличныхЧастейВыводился Тогда + ТЧОтчета.ЗакончитьГруппуСтрок(); + ТЧОтчета.Вывести(ШаблонСвободнаяСтрока); + КонецЕсли; + +КонецПроцедуры + +Функция ВывестиРезультатыКомпоновкиВОтчет(ТаблицаИзмененийРеквизитов, + ТаблицаИзмененийТабличныхЧастей, + счетчикУникальныйИд, + МассивНомеровВерсий, + ТЧОтчета) + + ЧислоИзменившихсяРеквизитов = РассчитатьЧислоИзменившихсяРеквизитов(ТаблицаИзмененийРеквизитов, МассивНомеровВерсий); + ЧислоВерсий = МассивНомеровВерсий.Количество(); + + /////////////////////////////////////////////////////////////////////////////// + // ВЫВОДИМ ОТЧЕТ // + /////////////////////////////////////////////////////////////////////////////// + + ТЧОтчета.Очистить(); + + ВывестиШапку(ТЧОтчета, МассивНомеровВерсий, ЧислоВерсий); + + Если ЧислоИзменившихсяРеквизитов = 0 Тогда + ОбластьШапкаРеквизитов = ОбщийШаблон.ПолучитьОбласть("ШапкаРеквизитов"); + ТЧОтчета.Вывести(ОбластьШапкаРеквизитов); + ТЧОтчета.НачатьГруппуСтрок("ГруппаРеквизитов"); + ОбластьРеквизитыНеИзменялись = ОбщийШаблон.ПолучитьОбласть("РеквизитыНеИзменялись"); + ТЧОтчета.Вывести(ОбластьРеквизитыНеИзменялись); + ТЧОтчета.ЗакончитьГруппуСтрок(); + Иначе + ВывестиИзмененияРеквизитов(ТЧОтчета, + ТаблицаИзмененийРеквизитов, + МассивНомеровВерсий); + + КонецЕсли; + + ВывестиИзмененияТабличныхЧастей(ТЧОтчета, + ТаблицаИзмененийТабличныхЧастей, + МассивНомеровВерсий, + счетчикУникальныйИд); + + ТЧОтчета.ИтогиСнизу = Ложь; + ТЧОтчета.ОтображатьСетку = Ложь; + ТЧОтчета.Защита = Ложь; + ТЧОтчета.ТолькоПросмотр = Истина; + +КонецФункции + +Функция ВывестиШапку(ТЧОтчета, МассивНомеровВерсий, ЧислоВерсий) + + ОбластьШапка = ОбщийШаблон.ПолучитьОбласть("Шапка"); + ОбластьШапка.Параметры.НаименованиеОтчета = НСтр("ru = 'Отчет по изменениям версий объекта'"); + ОбластьШапка.Параметры.НаименованиеОбъекта = Строка(СсылкаНаОбъект); + + ТЧОтчета.Вывести(ОбластьШапка); + + ПустаяЯчейка = ОбщийШаблон.ПолучитьОбласть("ПустаяЯчейка"); + ОбластьВерсии = ОбщийШаблон.ПолучитьОбласть("ЗаголовокВерсии"); + ТЧОтчета.Присоединить(ПустаяЯчейка); + ТЧОтчета.Присоединить(ОбластьВерсии); + + ОбластьВерсии = ОбщийШаблон.ПолучитьОбласть("ПредставлениеВерсии"); + + ИндексПоВерсиям = ЧислоВерсий; + Пока ИндексПоВерсиям > 0 Цикл + ОбластьВерсии.Параметры.ПредставлениеВерсии = + ПолучитьОписаниеПоВерсии(МассивНомеровВерсий[ИндексПоВерсиям-1]); + ТЧОтчета.Присоединить(ОбластьВерсии); + ТЧОтчета.Область("C"+Строка(ИндексПоВерсиям+2)).ШиринаКолонки = 50; + ИндексПоВерсиям = ИндексПоВерсиям - 1; + КонецЦикла; + + ОбластьСвободнаяСтрока = ОбщийШаблон.ПолучитьОбласть("СвободнаяСтрока"); + ТЧОтчета.Вывести(ОбластьСвободнаяСтрока); + +КонецФункции + +// Движок отчета. Заполняет отчет по номеру переданной версии. +// Выполняется сравнение между версиями переданной в качестве параметра РезультатРазбораВерсии_0 +// и заданной по НомерВерсии +// Последовательность выполнения: +// 1. Получение результата разбора версий сравниваемых объектов +// 2. Формирование списка реквизитов и табличных частей, которые были +// - изменены +// - добавлены +// - удалены +// +Функция РассчитатьИзменения(НомерВерсии, + РезультатРазбораВерсии_0, + РезультатРазбораВерсии_1) + + ЭтоДокумент = Ложь; + + Если Метаданные.Документы.Содержит(СсылкаНаОбъект.Метаданные()) Тогда + ЭтоДокумент = Истина; + КонецЕсли; + + // Выполняем разбор предпоследней версии + Реквизиты_0 = РезультатРазбораВерсии_0.Реквизиты; + ТабличныеЧасти_0 = РезультатРазбораВерсии_0.ТабличныеЧасти; + + // Выполняем разбор последней версии + РезультатРазбораВерсии_1 = РазборВерсии(НомерВерсии, СсылкаНаОбъект); + Реквизиты_1 = РезультатРазбораВерсии_1.Реквизиты; + ТабличныеЧасти_1 = РезультатРазбораВерсии_1.ТабличныеЧасти; + + /////////////////////////////////////////////////////////////////////////////// + // Формируем список табличных частей, которые изменились // + /////////////////////////////////////////////////////////////////////////////// + СписокТабличныхЧастей_0 = СоздатьТаблицуСравнения(); + Для Каждого Элемент Из ТабличныеЧасти_0 Цикл + НоваяСтрока = СписокТабличныхЧастей_0.Добавить(); + НоваяСтрока.Установить(0, СокрЛП(Элемент.Ключ)); + КонецЦикла; + + СписокТабличныхЧастей_1 = СоздатьТаблицуСравнения(); + Для Каждого Элемент Из ТабличныеЧасти_1 Цикл + НоваяСтрока = СписокТабличныхЧастей_1.Добавить(); + НоваяСтрока.Установить(0, СокрЛП(Элемент.Ключ)); + КонецЦикла; + + // возможно была изменена структура метаданных - добавились или были удалены реквизиты + СписокДобавленныхТЧ = ВычестьТаблицу(СписокТабличныхЧастей_1, СписокТабличныхЧастей_0); + СписокУдаленныхТЧ = ВычестьТаблицу(СписокТабличныхЧастей_0, СписокТабличныхЧастей_1); + + // список не изменившихся реквизитов, по которым будем искать совпадения / расхождения + СписокОставшихсяТЧ = ВычестьТаблицу(СписокТабличныхЧастей_1, СписокДобавленныхТЧ); + + // список реквизитов, которые были изменены + СписокИзменившихсяТЧ = НайтиИзменившиесяТабличныеЧасти(СписокОставшихсяТЧ, + ТабличныеЧасти_0, + ТабличныеЧасти_1); + + /////////////////////////////////////////////////////////////////////////////// + // Формируем список реквизитов, которые изменились // + /////////////////////////////////////////////////////////////////////////////// + СписокРеквизитов0 = СоздатьТаблицуСравнения(); + Для Каждого Реквизит Из РезультатРазбораВерсии_0.Реквизиты Цикл + НоваяСтрока = СписокРеквизитов0.Добавить(); + НоваяСтрока.Установить(0, СокрЛП(Строка(Реквизит.НаименованиеРеквизита))); + КонецЦикла; + + СписокРеквизитов1 = СоздатьТаблицуСравнения(); + Для Каждого Реквизит Из РезультатРазбораВерсии_1.Реквизиты Цикл + НоваяСтрока = СписокРеквизитов1.Добавить(); + НоваяСтрока.Установить(0, СокрЛП(Строка(Реквизит.НаименованиеРеквизита))); + КонецЦикла; + + // возможно была изменена структура метаданных - добавились или были удалены реквизиты + СписокДобавленныхРеквизитов = ВычестьТаблицу(СписокРеквизитов1, СписокРеквизитов0); + СписокУдаленныхРеквизитов = ВычестьТаблицу(СписокРеквизитов0, СписокРеквизитов1); + + // список не изменившихся реквизитов, по которым будем искать совпадения / расхождения + СписокОставшихсяРеквизитов = ВычестьТаблицу(СписокРеквизитов1, СписокДобавленныхРеквизитов); + + // список реквизитов, которые были изменены + СписокИзменившихсяРеквизитов = СоздатьТаблицуСравнения(); + + ИзмененияВРеквизитах = Новый Соответствие; + ИзмененияВРеквизитах.Вставить("д", СписокДобавленныхРеквизитов); + ИзмененияВРеквизитах.Вставить("у", СписокУдаленныхРеквизитов); + ИзмененияВРеквизитах.Вставить("и", СписокИзменившихсяРеквизитов); + + Для Каждого СтрокаТаблицыЗначений Из СписокОставшихсяРеквизитов Цикл + + Реквизит = СтрокаТаблицыЗначений.Значение; + Зн_0 = Реквизиты_0.Найти(Реквизит, "НаименованиеРеквизита").ЗначениеРеквизита; + Зн_1 = Реквизиты_1.Найти(Реквизит, "НаименованиеРеквизита").ЗначениеРеквизита; + + Если Зн_0 <> Зн_1 Тогда + НоваяСтрока = СписокИзменившихсяРеквизитов.Добавить(); + НоваяСтрока.Установить(0, Реквизит); + КонецЕсли; + + КонецЦикла; + + ИзмененияВТаблицах = РассчитатьИзмененияТабличныхЧастей( + СписокИзменившихсяТЧ, + ТабличныеЧасти_0, + ТабличныеЧасти_1); + + МодификацииТабличныхЧастей = Новый Структура; + МодификацииТабличныхЧастей.Вставить("д", СписокДобавленныхТЧ); + МодификацииТабличныхЧастей.Вставить("у", СписокУдаленныхТЧ); + МодификацииТабличныхЧастей.Вставить("и", ИзмененияВТаблицах); + + КомпоновкаИзменений = Новый Соответствие; + КомпоновкаИзменений.Вставить("Реквизиты", ИзмененияВРеквизитах); + КомпоновкаИзменений.Вставить("ТабличныеЧасти", МодификацииТабличныхЧастей); + + Возврат КомпоновкаИзменений; + +КонецФункции + +// Функция добавляет колонки, соответственно количеству версий объекта +// Колонки имеют называния в виде "Вер<Номер>", где <Номер> принимает +// значения от 1 до количества сохраненных версий объекта. Нумерация +// является условной, т.е. например название "Вер1" может не соответствовать +// сохраненной версии объекта с версией 0. +// +Процедура ПодготовитьКолонкиТаблицИзмененийРеквизитов(ТаблицаЗначений, + МассивНомеровВерсий) + + ТаблицаЗначений = Новый ТаблицаЗначений; + + ТаблицаЗначений.Колонки.Добавить("Наименование"); + ТаблицаЗначений.Колонки.Добавить("_Модификация"); + ТаблицаЗначений.Колонки.Добавить("_ТипЗначения"); // предполагаемый тип значения + + Для Индекс = 1 По МассивНомеровВерсий.Количество() Цикл + ТаблицаЗначений.Колонки.Добавить("Вер" + МассивНомеровВерсий[Индекс-1]); + КонецЦикла; + +КонецПроцедуры + +Функция РассчитатьИзмененияТабличныхЧастей(СписокИзменившихсяТЧ, + ТабличныеЧасти_0, + ТабличныеЧасти_1) + + ИзмененияВТаблицах = Новый Соответствие; + + // цикл по количеству табличных частей + Для Индекс = 1 По СписокИзменившихсяТЧ.Количество() Цикл + + ИзмененияВТаблицах.Вставить(СписокИзменившихсяТЧ[Индекс-1].Значение, Новый Соответствие); + + // Таблица разбиений предназначена для хранения интервалов поиска + // поиск прекратиться только тогда, когда в таблице разбиений + // не останется ненулевых размерностей. Поиск может происходить ТОЛЬКО + // по таблице интервалов и только по текущему интервалу!!! + // + ТаблицаИнтерваловПоиска = Новый ТаблицаЗначений; + ТаблицаИнтерваловПоиска.Колонки.Добавить("БлокНачало_1"); + ТаблицаИнтерваловПоиска.Колонки.Добавить("БлокКонец_1"); + ТаблицаИнтерваловПоиска.Колонки.Добавить("БлокНачало_2"); + ТаблицаИнтерваловПоиска.Колонки.Добавить("БлокКонец_2"); + + ТаблицаДляАнализа = СписокИзменившихсяТЧ[Индекс-1].Значение; + ТЧ0 = ТабличныеЧасти_0[ТаблицаДляАнализа]; + ТЧ1 = ТабличныеЧасти_1[ТаблицаДляАнализа]; + + ПервоеРазбиение = ТаблицаИнтерваловПоиска.Добавить(); + ПервоеРазбиение.БлокНачало_1 = 1; + ПервоеРазбиение.БлокКонец_1 = ТЧ0.Количество(); + ПервоеРазбиение.БлокНачало_2 = 1; + ПервоеРазбиение.БлокКонец_2 = ТЧ1.Количество(); + + // Часть №1: + // фильтрация совпадающих элементов элементов + // на выходе - заполненная ТаблицаИнтерваловПоиска. + // Далее необходимо эту таблицу обработать и вычислить + // добавленные/удаленные/измененные элементы. + + ИзмененияВИнтервалах = Истина; + // цикл до тех пока появляются новые интервалы для поиска + Пока ИзмененияВИнтервалах Цикл + + // число интервалов в которых будет происходить поиск + ЧислоИнтерваловПоиска = ТаблицаИнтерваловПоиска.Количество(); + + ИзмененияВИнтервалах = Ложь; + + Для НомерИнтервалаПоиска = 1 По ЧислоИнтерваловПоиска Цикл + + БлокНачало_1 = ТаблицаИнтерваловПоиска[НомерИнтервалаПоиска-1].БлокНачало_1; + БлокКонец_1 = ТаблицаИнтерваловПоиска[НомерИнтервалаПоиска-1].БлокКонец_1; + + БлокНачало_2 = ТаблицаИнтерваловПоиска[НомерИнтервалаПоиска-1].БлокНачало_2; + БлокКонец_2 = ТаблицаИнтерваловПоиска[НомерИнтервалаПоиска-1].БлокКонец_2; + + Если (БлокНачало_1 > БлокКонец_1) + ИЛИ (БлокНачало_2 > БлокКонец_2) Тогда + + Продолжить; + + КонецЕсли; + + // этот интервал можно удалить + Если (БлокКонец_1 = 0) И (БлокКонец_2 = 0) Тогда + // удаляем этот интервал и сбрасываем счетчик по разбиениям + ТаблицаИнтерваловПоиска.Удалить(НомерИнтервалаПоиска); + Прервать; + // Если интервал разбиения ТЧ0 нулевой, то строки были добавлены в ТЧ1 + ИначеЕсли (БлокКонец_1 = 0) Тогда + // Если интервал разбиения ТЧ1 нулевой, то строки были удалены в ТЧ1 + ИначеЕсли (БлокКонец_2 = 0) Тогда + + Иначе + Результат = НайтиОдинаковыеБлоки(ТЧ0, ТЧ1, + БлокНачало_1, + БлокКонец_1, + БлокНачало_2, + БлокКонец_2, + ТаблицаИнтерваловПоиска, + НомерИнтервалаПоиска); + + Если Результат <> Неопределено Тогда + + ИзмененияВИнтервалах = Истина; + + // разбиваем текущий интервал - выделяем в нем участок, в котором отсутствуют совпадающие элементы + + Строка = ТаблицаИнтерваловПоиска.Вставить(НомерИнтервалаПоиска-1); + Строка.БлокНачало_1 = БлокНачало_1; + Строка.БлокКонец_1 = Результат.БлокНачало_1 - 1; + + Строка.БлокНачало_2 = БлокНачало_2; + Строка.БлокКонец_2 = Результат.БлокНачало_2 - 1; + + Строка = ТаблицаИнтерваловПоиска.Вставить(НомерИнтервалаПоиска); + Строка.БлокНачало_1 = Результат.БлокНачало_1+Результат.Размер; + Строка.БлокКонец_1 = БлокКонец_1; + + Строка.БлокНачало_2 = Результат.БлокНачало_2+Результат.Размер; + Строка.БлокКонец_2 = БлокКонец_2; + + ТаблицаИнтерваловПоиска.Удалить(НомерИнтервалаПоиска+1); + + Продолжить; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + // Удаляем "пустые интервалы". + Для Каждого Элемент Из ТаблицаИнтерваловПоиска Цикл + Если (Элемент.БлокНачало_1 > Элемент.БлокКонец_1) + И (Элемент.БлокНачало_2 > Элемент.БлокКонец_2) Тогда + ТаблицаИнтерваловПоиска.Удалить(Элемент); + КонецЕсли; + КонецЦикла; + + // шаг 3- сортировка строк по признаку добавлены / удалены / изменены + + ТаблицаДобавленныхСтрок = Новый ТаблицаЗначений; + ТаблицаУдаленныхСтрок = Новый ТаблицаЗначений; + ТаблицаИзмененныхСтрок = Новый ТаблицаЗначений; + + Для Каждого Элемент Из ТЧ0.Колонки Цикл + ТаблицаДобавленныхСтрок.Колонки.Добавить(Элемент.Имя); + ТаблицаУдаленныхСтрок.Колонки.Добавить(Элемент.Имя); + ТаблицаИзмененныхСтрок.Колонки.Добавить(Элемент.Имя); + КонецЦикла; + + // 3.1 ищем все вхождения в своих под-интервалах + + ТаблицаИзмененныхСтрок = Новый ТаблицаЗначений; + ТаблицаИзмененныхСтрок.Колонки.Добавить("ИндексВТЧ0"); + ТаблицаИзмененныхСтрок.Колонки.Добавить("ИндексВТЧ1"); + + ТаблицаДобавленныхСтрок = Новый ТаблицаЗначений; + ТаблицаДобавленныхСтрок.Колонки.Добавить("ИндексВТЧ1"); + + ТаблицаУдаленныхСтрок = Новый ТаблицаЗначений; + ТаблицаУдаленныхСтрок.Колонки.Добавить("ИндексВТЧ0"); + + Для Каждого Элемент Из ТаблицаИнтерваловПоиска Цикл + ИзмененныеСтроки = РассчитатьИзмененияПоСтрокам(ТаблицаИзмененныхСтрок, + ТаблицаДобавленныхСтрок, + ТаблицаУдаленныхСтрок, + Элемент, + ТЧ0, + ТЧ1); + КонецЦикла; + + ИзмененияВТаблицах[СписокИзменившихсяТЧ[Индекс-1].Значение].Вставить("Д", ТаблицаДобавленныхСтрок); + ИзмененияВТаблицах[СписокИзменившихсяТЧ[Индекс-1].Значение].Вставить("У", ТаблицаУдаленныхСтрок); + ИзмененияВТаблицах[СписокИзменившихсяТЧ[Индекс-1].Значение].Вставить("И", ТаблицаИзмененныхСтрок); + + КонецЦикла; + + Возврат ИзмененияВТаблицах; + +КонецФункции + +// Сравнивает две табличные части, список которых передается в первом параметре +// и пытается найти расхождения в них (не совпадающие элементы). Если таковые +// таблицы есть, то формируется список таких табличных частей. +// +Функция НайтиИзменившиесяТабличныеЧасти(СписокОставшихсяТЧ, + ТабличныеЧасти_0, + ТабличныеЧасти_1) + + СписокИзменившихсяТЧ = СоздатьТаблицуСравнения(); + + // Поиск Табличных частей, в которых изменились строки + Для Каждого Элемент Из СписокОставшихсяТЧ Цикл + + ТЧ_0 = ТабличныеЧасти_0[Элемент.Значение]; + ТЧ_1 = ТабличныеЧасти_1[Элемент.Значение]; + + Если ТЧ_0.Количество() = ТЧ_1.Количество() Тогда + + НайденоОтличие = Ложь; + // проверяем, что структура колонок осталась прежней (эквивалентна) + Если ТЧЭквиваленты (ТЧ_0.Колонки, ТЧ_1.Колонки) Тогда + + // ищем различающиеся элементы - строки + Для Индекс = 0 По ТЧ_0.Количество() - 1 Цикл + Строка_0 = ТЧ_0[Индекс]; + Строка_1 = ТЧ_1[Индекс]; + + Если НЕ СтрокиТЧРавны(Строка_0, Строка_1, ТЧ_0.Колонки) Тогда + НайденоОтличие = Истина; + Прервать; + КонецЕсли + КонецЦикла; + + Иначе + НайденоОтличие = Истина; + КонецЕсли; + + Если НайденоОтличие Тогда + НоваяСтрока = СписокИзменившихсяТЧ.Добавить(); + НоваяСтрока.Установить(0, Элемент.Значение); + КонецЕсли; + + Иначе + НоваяСтрока = СписокИзменившихсяТЧ.Добавить(); + НоваяСтрока.Установить(0, Элемент.Значение); + КонецЕсли; + + КонецЦикла; + + Возврат СписокИзменившихсяТЧ; + +КонецФункции + +// Функция по номеру версии объекта и ссылке на него получает объект из +// регистра сведений, записывает его на диск и вызывает функцию разбора +// XML представления объекта. +// Параметры: +// НомерВерсии - число - номер версии документа в регистре сведений +// Ссылка - СправочникСсылка/ДокументСсылка - ссылка на экземпляр +// объекта метаданных +// Возвращаемое значение: +// Структура: +// +Функция РазборВерсии(НомерВерсии, Ссылка) + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ АвторВерсии, ДатаВерсии, ВерсияОбъекта + |ИЗ РегистрСведений.ВерсииОбъектов + |ГДЕ Объект = &Ссылка + |И НомерВерсии = &НомВер"; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.УстановитьПараметр("НомВер", Число(НомерВерсии)); + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + + ВерсияОбъекта = Выборка.ВерсияОбъекта.Получить(); + + Если ВерсияОбъекта = Неопределено Тогда + Возврат Ложь; + Иначе + Результат = РазборПредставленияОбъектаXML(ВерсияОбъекта, Ссылка); + Результат.Вставить("ИмяОбъекта", Строка(Ссылка)); + Результат.Вставить("АвторИзменения", СокрЛП(Строка(Выборка.АвторВерсии))); + Результат.Вставить("ДатаИзменения", Выборка.ДатаВерсии); + Возврат Результат; + КонецЕсли; + +КонецФункции + +// Функция считывает начальные значения реквизитов и табличных частей документа +// формат формируемой структуры данных для реквизитов: +// ТаблицаРеквизитов - ТаблицаЗначений +// Колонки +// |-Вер<младший номер версии> +// |-... +// |-Вер<старший номер версии> +// |-_Модификация (Булево) +// |-Наименование +// +// Строки содержат список реквизитов и их изменения во времени, в колонке _Модификация +// содержится признак модифицированности строки: +// ложь - строка не была изменена +// "д" - строка была добавлена +// "у" - строка была удалена +// "и" - строка была изменена +// +// Формат формируемой структуры данных для таблиц значений: +// ТаблицаТЧ - Соответствие +// |- <Имя табличной части1> - Соответствие +// |-Вер<младший номер версии> - ТаблицаЗначений +// Колонки +// |- Базовые колонки соответствующей таблицы части объекта +// |- _ИдСтроки - уникальный, в пределах таблицы, идентификатор данной строки +// |- _Модификация - признак модифицированности строки +// принимает следующие значения: +// ложь - строка не была изменена +// "д" - строка была добавлена +// "у" - строка была удалена +// "и" - строка была изменена +// |-... +// |-Вер<старший номер версии> +// |-... +// |- <Имя табличной частиN> +// +Функция СчитатьНачальныеЗначенияРеквизитовИТабличныхЧастей(ТаблицаРеквизитов, + ТаблицаТЧ, + КоличествоВерсий, + МассивНомеровВерсий) + + МладшаяВерсияОбъекта = МассивНомеровВерсий[0]; + + // Выполняем разбор первой версии + ВерсияОбъекта = РазборВерсии(МладшаяВерсияОбъекта, СсылкаНаОбъект); + Реквизиты = ВерсияОбъекта.Реквизиты; + ТабличныеЧасти = ВерсияОбъекта.ТабличныеЧасти; + + Колонка = "Вер" + МассивНомеровВерсий[0]; + + Для Каждого СтрокаТаблицыЗначений Из Реквизиты Цикл + НоваяСтрока = ТаблицаРеквизитов.Добавить(); + НоваяСтрока[Колонка] = СтрокаТаблицыЗначений.ЗначениеРеквизита; + НоваяСтрока.Наименование = СтрокаТаблицыЗначений.НаименованиеРеквизита; + НоваяСтрока._Модификация = Ложь; + НоваяСтрока._ТипЗначения = СтрокаТаблицыЗначений.ТипРеквизита; + КонецЦикла; + + Для Каждого ЭлементТЧ Из ТабличныеЧасти Цикл + + ТаблицаТЧ.Вставить(ЭлементТЧ.Ключ, Новый Соответствие); + ПодготовитьКолонкиТаблицИзмененийДляСоответствия(ТаблицаТЧ[ЭлементТЧ.Ключ], МассивНомеровВерсий); + ТаблицаТЧ[ЭлементТЧ.Ключ]["Вер"+МладшаяВерсияОбъекта] = ЭлементТЧ.Значение.Скопировать(); + + ТекущаяТЗ = ТаблицаТЧ[ЭлементТЧ.Ключ]["Вер"+МладшаяВерсияОбъекта]; + + // спец идентификатор строки что бы различать строки + // значение является уникальным в пределах данной таблицы значений + ТекущаяТЗ.Колонки.Добавить("_ИдСтроки"); + ТекущаяТЗ.Колонки.Добавить("_Модификация"); + + Для Индекс = 1 По ТекущаяТЗ.Количество() Цикл + ТекущаяТЗ[Индекс-1]._ИдСтроки = Индекс; + ТекущаяТЗ[Индекс-1]._Модификация = Ложь; + КонецЦикла; + + КонецЦикла; + + Возврат ВерсияОбъекта; + +КонецФункции + +// Процедура считывает данные XML из файла и заполняет структуры данных +// +// Возвращаемое значение: +// Структура, содержащая два соответствия: ТабличныеЧасти, Реквизиты +// Структура хранения данных: +// Соответствие ТабличныеЧасти, которое содержит в себе значения табличных частей +// формат: +// СоответствиеИмя1 -> ТаблицаЗначений1 +// | | ... | +// Поле1 Поле2 ПолеM1 +// +// СоответствиеИмя2 -> ТаблицаЗначений2 +// | | ... | +// Поле1 Поле2 ПолеM2 +// +// +// СоответствиеИмяN -> ТаблицаЗначенийN +// | | ... | +// Поле1 Поле2 ПолеM3 +// +// Соответствие ЗначенияРеквизитов +// ИмяРеквизита1 -> Значение1 +// ИмяРеквизита2 -> Значение2 +// ... +// ИмяРеквизитаN -> ЗначениеN +// +Функция РазборПредставленияОбъектаXML(ДвоичныеДанные, Ссылка) + + // содержит имя метаданного измененного объекта + Перем ИмяОбъекта; + + // Содержит положение маркера в дереве XML. + // Требуется для идентификации текущего элемента. + Перем УровеньЧтения; + + // Содержат значения реквизитов справочников / документов + ЗначенияРеквизитов = Новый ТаблицаЗначений; + + ЗначенияРеквизитов.Колонки.Добавить("НаименованиеРеквизита"); + ЗначенияРеквизитов.Колонки.Добавить("ЗначениеРеквизита"); + ЗначенияРеквизитов.Колонки.Добавить("ТипРеквизита"); + + ТабличныеЧасти = Новый Соответствие; + + ЧтениеXML = Новый ЧтениеFastInfoSet; + + ЧтениеXML.УстановитьДвоичныеДанные(ДвоичныеДанные); + + // уровень позиции маркера в иерархии XML: + // 0 - уровень не задан + // 1 - первый элемент (имя объекта) + // 2 - описание реквизита или табличной части + // 3 - описание строки табличной части + // 4 - описание поля строки табличной части + УровеньЧтения = 0; + + ТабличныеЧастиМТД = Ссылка.Метаданные().ТабличныеЧасти; + + ТипЗначения = ""; + + ТипЗначенияПоляТЧ = ""; + + // основной цикл разбора по XML + Пока ЧтениеXML.Прочитать() Цикл + + Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + УровеньЧтения = УровеньЧтения + 1; + Если УровеньЧтения = 1 Тогда // указатель на первом элементе XML - корень XML + ИмяОбъекта = ЧтениеXML.Имя; + ИначеЕсли УровеньЧтения = 2 Тогда // указатель на втором уровне - это реквизит или имя табличной части + ИмяРеквизита = ЧтениеXML.Имя; + Если ТабличныеЧастиМТД.Найти(ИмяРеквизита) <> Неопределено Тогда + ИмяТабличнойЧасти = ИмяРеквизита; + // создаем новую таблицу значений в таблице соответствий + Если ТабличныеЧасти[ИмяТабличнойЧасти] = Неопределено Тогда + ТабличныеЧасти.Вставить(ИмяТабличнойЧасти, Новый ТаблицаЗначений); + КонецЕсли; + КонецЕсли; + НовоеЗР = ЗначенияРеквизитов.Добавить(); + НовоеЗР.НаименованиеРеквизита = ИмяРеквизита; + + Если ЧтениеXML.КоличествоАтрибутов() > 0 Тогда + Пока ЧтениеXML.ПрочитатьАтрибут() Цикл + Если ЧтениеXML.ТипУзла = ТипУзлаXML.Атрибут + И ЧтениеXML.Имя = "xsi:type" Тогда + НовоеЗР.ТипРеквизита = ЧтениеXML.Значение; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ИначеЕсли (УровеньЧтения = 3) и (ЧтениеXML.Имя = "Row") Тогда // указатель на поле табличной части + ТабличныеЧасти[ИмяТабличнойЧасти].Добавить(); + ИначеЕсли УровеньЧтения = 4 Тогда // указатель на поле табличной части + + ТипЗначенияПоляТЧ = ""; + + ИмяПоляТЧ = ЧтениеXML.Имя; // + Таблица = ТабличныеЧасти[ИмяТабличнойЧасти]; + Если Таблица.Колонки.Найти(ИмяПоляТЧ)= Неопределено Тогда + Таблица.Колонки.Добавить(ИмяПоляТЧ); + КонецЕсли; + + Если ЧтениеXML.КоличествоАтрибутов() > 0 Тогда + Пока ЧтениеXML.ПрочитатьАтрибут() Цикл + Если ЧтениеXML.ТипУзла = ТипУзлаXML.Атрибут + И ЧтениеXML.Имя = "xsi:type" Тогда + ТипЗначенияПоляТЧ = ЧтениеXML.Значение; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + КонецЕсли; + ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда + УровеньЧтения = УровеньЧтения - 1; + ТипЗначения = ""; + ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда + Если (УровеньЧтения = 2) Тогда // значение реквизита + НовоеЗР.ЗначениеРеквизита = ЧтениеXML.Значение; + //ЗначенияРеквизитов[ИмяРеквизита] = ЧтениеXML.Значение; + + ИначеЕсли (УровеньЧтения = 4) Тогда // значение реквизита + ПоследняяСтрока = ТабличныеЧасти[ИмяТабличнойЧасти].Получить(ТабличныеЧасти[ИмяТабличнойЧасти].Количество()-1); + + ПоследняяСтрока[ИмяПоляТЧ] = ?(ПустаяСтрока(ТипЗначенияПоляТЧ), ЧтениеXML.Значение, XMLЗначение(Тип(ТипЗначенияПоляТЧ), ЧтениеXML.Значение)); + + КонецЕсли; + КонецЕсли; + КонецЦикла; + + // 2-й этап: из списка реквизитов исключаем табличные части + Для Каждого Элемент Из ТабличныеЧасти Цикл + ЗначенияРеквизитов.Удалить(ЗначенияРеквизитов.Найти(Элемент.Ключ)); + КонецЦикла; + //ТабличныеЧастиМТД + Для Каждого ЭлементСоответствия Из ТабличныеЧасти Цикл + Таблица = ЭлементСоответствия.Значение; + Если Таблица.Колонки.Количество() = 0 Тогда + ТаблицаМТД = ТабличныеЧастиМТД.Найти(ЭлементСоответствия.Ключ); + Если ТаблицаМТД <> Неопределено Тогда + Для Каждого ОписаниеКолонки Из ТаблицаМТД.Реквизиты Цикл + Если Таблица.Колонки.Найти(ОписаниеКолонки.Имя)= Неопределено Тогда + Таблица.Колонки.Добавить(ОписаниеКолонки.Имя); + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Результат = Новый Структура; + Результат.Вставить("Реквизиты", ЗначенияРеквизитов); + Результат.Вставить("ТабличныеЧасти", ТабличныеЧасти); + + Возврат Результат; + +КонецФункции + +Процедура ПодготовитьКолонкиТаблицИзмененийДляСоответствия(Соответствие, МассивНомеровВерсий) + + Количество = МассивНомеровВерсий.Количество(); + + Для Индекс = 1 По Количество Цикл + Соответствие.Вставить("Вер" + МассивНомеровВерсий[Индекс-1], Новый ТаблицаЗначений); + КонецЦикла; + +КонецПроцедуры + +// Функция ищет одно вхождение части одного блока в другой +// +Функция НайтиОдинаковыеБлоки(ТаблицаЗначений1, + ТаблицаЗначений2, + БлокНачало_1, + БлокКонец_1, + БлокНачало_2, + БлокКонец_2, + ТаблицаИнтерваловПоиска, + ТекущийНомерИнтервала); + + // количество разбиений меньшей таблицы значений интервала поиска + ЧислоРазбиений = 0; + + // инициализация, что бы компилятор не ругался + Кон = 0; + + НайденоСовпадение = Ложь; + + ТаблицаСовпадений = Новый ТаблицаЗначений; + ТаблицаСовпадений.Колонки.Добавить("БлокНачало_1"); + ТаблицаСовпадений.Колонки.Добавить("БлокНачало_2"); + ТаблицаСовпадений.Колонки.Добавить("Размер"); + + Размерность1 = БлокКонец_1 - БлокНачало_1 + 1; + Размерность2 = БлокКонец_2 - БлокНачало_2 + 1; + + // находим разбиваемую таблицу - это таблица с наименьшим числом + // элементов + + Если Размерность1 <= Размерность2 Тогда + ТаблицаАнализа1 = ТаблицаЗначений1; + ТаблицаАнализа2 = ТаблицаЗначений2; + ПервыйБлок_Нач = БлокНачало_1; + ПервыйБлок_Кон = БлокКонец_1; + ВторойБлок_Нач = БлокНачало_2; + ВторойБлок_Кон = БлокКонец_2; + ПрямоеСоответствие = Истина; + Иначе + ТаблицаАнализа1 = ТаблицаЗначений2; + ТаблицаАнализа2 = ТаблицаЗначений1; + ПервыйБлок_Нач = БлокНачало_2; + ПервыйБлок_Кон = БлокКонец_2; + ВторойБлок_Нач = БлокНачало_1; + ВторойБлок_Кон = БлокКонец_1; + ПрямоеСоответствие = Ложь; + КонецЕсли; + + Пока НЕ НайденоСовпадение Цикл + + ЧислоРазбиений = ЧислоРазбиений + 1; + + Если ЧислоРазбиений > (ПервыйБлок_Кон - ПервыйБлок_Нач + 1) Тогда + Прервать; + КонецЕсли; + + Для Счетчик = 1 По ЧислоРазбиений Цикл + + // ограничиваем область искомого блока в ТЧ + Если Счетчик = 1 Тогда + Нач = Цел(ПервыйБлок_Нач + (ПервыйБлок_Кон-ПервыйБлок_Нач)/ЧислоРазбиений*(Счетчик-1)); + Иначе + Нач = Кон + 1; + КонецЕсли; + + Кон = Цел(ПервыйБлок_Нач + (ПервыйБлок_Кон-ПервыйБлок_Нач)/ЧислоРазбиений*Счетчик); + + // возвращает номер позиции + Результат = ПоискПодтаблицы(ТаблицаАнализа1, Нач, Кон, ТаблицаАнализа2, ВторойБлок_Нач, ВторойБлок_Кон); + + // Если совпадение найдено - развиваем успех: + // ищем продолжение подтаблицы до найденного паттерна и после. + // Нижняя граница искомого паттерна ограничена ПервыйБлок_Нач, его верхняя граница + // ограничена ПервыйБлок_Кон. Граница таблицы на основе которой происходит поиск + // ограничивается ВторойБлок_Нач и ВторойБлок_Кон соответственно. + // + Если Результат <> Неопределено Тогда + + // 1. пробуем "откатиться" к началу + + НижняяСдвигаемаяГраницаТаблицыАнализа1 = Нач; + НижняяСдвигаемаяГраницаТаблицыАнализа2 = Результат; + + Пока (НижняяСдвигаемаяГраницаТаблицыАнализа1 - 1) >= 1 + И (НижняяСдвигаемаяГраницаТаблицыАнализа2 - 1) >= 1 + И (НижняяСдвигаемаяГраницаТаблицыАнализа1 - 1) > ТаблицаИнтерваловПоиска[ТекущийНомерИнтервала-1].БлокНачало_1 + И (НижняяСдвигаемаяГраницаТаблицыАнализа2 - 1) > ТаблицаИнтерваловПоиска[ТекущийНомерИнтервала-1].БлокНачало_2 + И СтрокиТЧРавны(ТаблицаАнализа1[НижняяСдвигаемаяГраницаТаблицыАнализа1-2], ТаблицаАнализа2[НижняяСдвигаемаяГраницаТаблицыАнализа2-2], ТаблицаАнализа1.Колонки) Цикл + + Если (НижняяСдвигаемаяГраницаТаблицыАнализа1-1)>=ПервыйБлок_Нач И (НижняяСдвигаемаяГраницаТаблицыАнализа2-1)>=ВторойБлок_Нач Тогда + НижняяСдвигаемаяГраницаТаблицыАнализа1 = НижняяСдвигаемаяГраницаТаблицыАнализа1 - 1; + НижняяСдвигаемаяГраницаТаблицыАнализа2 = НижняяСдвигаемаяГраницаТаблицыАнализа2 - 1; + Иначе + Прервать; + КонецЕсли; + КонецЦикла; + + // 2. пробуем "откатиться" к концу таблицы + + ВерхняяСдвигаемаяГраницаТаблицыАнализа1 = Кон; + ВерхняяСдвигаемаяГраницаТаблицыАнализа2 = Результат + Кон - Нач; + + Пока ВерхняяСдвигаемаяГраницаТаблицыАнализа1 < ТаблицаАнализа1.Количество() + И ВерхняяСдвигаемаяГраницаТаблицыАнализа2 < ТаблицаАнализа2.Количество() + И СтрокиТЧРавны(ТаблицаАнализа1[ВерхняяСдвигаемаяГраницаТаблицыАнализа1-1+1], ТаблицаАнализа2[ВерхняяСдвигаемаяГраницаТаблицыАнализа2-1+1], ТаблицаАнализа1.Колонки) Цикл + + Если ВерхняяСдвигаемаяГраницаТаблицыАнализа1 < ПервыйБлок_Кон И ВерхняяСдвигаемаяГраницаТаблицыАнализа2 < ВторойБлок_Кон Тогда + ВерхняяСдвигаемаяГраницаТаблицыАнализа1 = ВерхняяСдвигаемаяГраницаТаблицыАнализа1 + 1; + ВерхняяСдвигаемаяГраницаТаблицыАнализа2 = ВерхняяСдвигаемаяГраницаТаблицыАнализа2 + 1; + Иначе + Прервать; + КонецЕсли; + КонецЦикла; + + // 3. ТаблицаСовпадений + // когда нашли продолжение вычисляем индекс, с которого начинается совпадение + // и размер совпадения в строках (число строк) + НоваяСтрока = ТаблицаСовпадений.Добавить(); + НоваяСтрока.БлокНачало_1 = НижняяСдвигаемаяГраницаТаблицыАнализа1; + НоваяСтрока.БлокНачало_2 = НижняяСдвигаемаяГраницаТаблицыАнализа2; + НоваяСтрока.Размер = ВерхняяСдвигаемаяГраницаТаблицыАнализа1-НижняяСдвигаемаяГраницаТаблицыАнализа1 + 1; + + НайденоСовпадение = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Макс_Инд = -1; + + Для I = 1 По ТаблицаСовпадений.Количество() Цикл + + Если Макс_Инд = -1 Тогда + Макс_Инд = I; + КонецЕсли; + + Если ТаблицаСовпадений[I-1].Размер > ТаблицаСовпадений[Макс_Инд-1].Размер Тогда + Макс_Инд = I; + КонецЕсли; + + КонецЦикла; + + Если Макс_Инд = -1 Тогда + Возврат Неопределено; + Иначе + + Если Не ПрямоеСоответствие Тогда + ВремПерем = ТаблицаСовпадений[Макс_Инд-1].БлокНачало_1; + ТаблицаСовпадений[Макс_Инд-1].БлокНачало_1 = ТаблицаСовпадений[Макс_Инд-1].БлокНачало_2; + ТаблицаСовпадений[Макс_Инд-1].БлокНачало_2 = ВремПерем; + КонецЕсли; + + Возврат ТаблицаСовпадений[Макс_Инд-1]; + КонецЕсли; + +КонецФункции + +// Спецификация функции +// функция производит точный поиск ВСЕГО ОКНА поиска ИскомыйШаблон(НачальнаяПозицияВОкнеПоиска, ОконечнаяПозицияВОкнеПоиска) в границах поиска +// АнализируемаяТаблица (НижняяГраницаПоиска, ВерхняяГраницаПоиска) +// Возвращает номер позиции в АнализируемаяТаблица (нумерация с 1) с которой найдена подтаблица +Функция ПоискПодтаблицы( + ИскомыйШаблон, // искомая таблица + НачальнаяПозицияВОкнеПоиска, // индекс первого элемента в окне поиска + ОконечнаяПозицияВОкнеПоиска, // индекс последнего элемента в окне поиска + // НачальнаяПозицияВОкнеПоиска и ОконечнаяПозицияВОкнеПоиска определяют окно поиска + АнализируемаяТаблица, // Таблица в которой производится поиск + НижняяГраницаПоиска, // НижняяГраницаПоиска, ВерхняяГраницаПоиска - определяют границы, + ВерхняяГраницаПоиска) // в которых возможен поиск + + // имеет смысл искать только до тех пор пока выполняется неравенство + // ТекущаяПозицияПоиска + (ОконечнаяПозицияВОкнеПоиска - НачальнаяПозицияВОкнеПоиска) <= ВерхняяГраницаПоиска + + ТекущаяПозицияПоиска = НижняяГраницаПоиска; + + Пока ((ТекущаяПозицияПоиска + (ОконечнаяПозицияВОкнеПоиска - НачальнаяПозицияВОкнеПоиска)) <= ВерхняяГраницаПоиска) Цикл + + ПодстрокаНайдена = Истина; + + Для Индекс = НачальнаяПозицияВОкнеПоиска По ОконечнаяПозицияВОкнеПоиска Цикл + Если НЕ СтрокиТЧРавны(ИскомыйШаблон[Индекс-1], АнализируемаяТаблица[ТекущаяПозицияПоиска+Индекс-НачальнаяПозицияВОкнеПоиска-1], ИскомыйШаблон.Колонки) Тогда + ПодстрокаНайдена = Ложь; //НижняяГраницаПоиска+ТекущаяПозицияПоиска+Индекс-НачальнаяПозицияВОкнеПоиска-2 + Прервать; + КонецЕсли + КонецЦикла; + + Если ПодстрокаНайдена Тогда + Прервать; + КонецЕсли; + + ТекущаяПозицияПоиска = ТекущаяПозицияПоиска + 1; + + КонецЦикла; + + Если ПодстрокаНайдена Тогда + + Возврат ТекущаяПозицияПоиска; + + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +// Принимает две табличные части с записью об интервалах, в которых необходимо найти +// изменения +Функция РассчитатьИзмененияПоСтрокам(ТаблицаИзмененныхСтрок, + ТаблицаДобавленныхСтрок, + ТаблицаУдаленныхСтрок, + Элемент, + ТЧ0, + ТЧ1) + + кТЧ0 = Новый ТаблицаЗначений; + кТЧ1 = Новый ТаблицаЗначений; + + Колонки = ТЧ0.Колонки; + + Для Каждого Колонка Из ТЧ0.Колонки Цикл + кТЧ0.Колонки.Добавить(Колонка.Имя); + кТЧ1.Колонки.Добавить(Колонка.Имя); + КонецЦикла; + + кТЧ0.Колонки.Добавить("Использована"); + кТЧ1.Колонки.Добавить("Использована"); + + Для Индекс = Элемент.БлокНачало_1 По Элемент.БлокКонец_1 Цикл + НоваяСтрока = кТЧ0.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ТЧ0[Индекс-1]); + КонецЦикла; + + Для Индекс = Элемент.БлокНачало_2 По Элемент.БлокКонец_2 Цикл + НоваяСтрока = кТЧ1.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ТЧ1[Индекс-1]); + КонецЦикла; + + РазмерностьТЧ0 = Элемент.БлокКонец_1 - Элемент.БлокНачало_1 + 1; + РазмерностьТЧ1 = Элемент.БлокКонец_2 - Элемент.БлокНачало_2 + 1; + + Для Индекс1 = 1 По РазмерностьТЧ0 Цикл + + СтрокаТЧ0 = кТЧ0[Индекс1 - 1]; + СоответствиеНайдено = Ложь; + + Если СтрокаТЧ0.Использована <> Истина Тогда + Для Индекс2 = 1 По РазмерностьТЧ1 Цикл + СтрокаТЧ1 = кТЧ1[Индекс2 - 1]; + Если СтрокаТЧ1.Использована <> Истина Тогда + Если ПроверитьСтрокиНаРавенство (СтрокаТЧ0, СтрокаТЧ1, Колонки) Тогда + СоответствиеНайдено = Истина; + Прервать; + КонецЕсли; + КонецЕсли; // Если СтрокаТЧ1.Использована <> Истина Тогда + КонецЦикла; // Для Индекс2= 1 По РазмерностьТЧ1 Цикл + КонецЕсли; // Если СтрокаТЧ0.Использована <> Истина Тогда + + Если СоответствиеНайдено Тогда + СтрокаТЧ0.Использована = Истина; + СтрокаТЧ1.Использована = Истина; + НоваяСтрока = ТаблицаИзмененныхСтрок.Добавить(); + НоваяСтрока.ИндексВТЧ0 = Индекс1+Элемент.БлокНачало_1-1; + НоваяСтрока.ИндексВТЧ1 = Индекс2+Элемент.БлокНачало_2-1; + Иначе + СтрокаТЧ0.Использована = Истина; + НоваяСтрока = ТаблицаУдаленныхСтрок.Добавить(); + НоваяСтрока.ИндексВТЧ0 = Индекс1+Элемент.БлокНачало_1-1; + КонецЕсли; + + КонецЦикла; // Для Индекс1 = 1 По РазмерностьТЧ0 Цикл + + Для Индекс = 1 По РазмерностьТЧ1 Цикл + + СтрокаТЧ1 = кТЧ1[Индекс - 1]; + Если СтрокаТЧ1.Использована <> Истина Тогда + СтрокаТЧ1.Использована = Истина; + НоваяСтрока = ТаблицаДобавленныхСтрок.Добавить(); + НоваяСтрока.ИндексВТЧ1 = Индекс+Элемент.БлокНачало_2-1; + КонецЕсли; // Если СтрокаТЧ0.Использована <> Истина Тогда + + КонецЦикла; // Для Индекс1 = 1 По РазмерностьТЧ0 Цикл + +КонецФункции + +// Принимает на вход две строки из табличных частей с одинаковой структурой и сравнивает их. +// Строки считаются измененными, если у них совпадает хотя бы одна колонка. +Функция ПроверитьСтрокиНаРавенство(Строка1, Строка2, НаборКолонок) + + ЧислоОдинаковыхКолонок = 0; + ЧислоКолонок = 0; + + Для Каждого Колонка Из НаборКолонок Цикл + ЧислоКолонок = ЧислоКолонок + 1; + Если Строка1[Колонка.Имя] = Строка2[Колонка.Имя] Тогда + ЧислоОдинаковыхКолонок = ЧислоОдинаковыхКолонок + 1; + КонецЕсли; + КонецЦикла; + + Если (ЧислоОдинаковыхКолонок/ЧислоКолонок) >= КритерийДоступаНаРавенствоСтрок() Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Возвращает доступ - отношение числа неизмененных колонок в строке табличной +// части к общему числу колонок. На данный момент доступ - 3/5. Т.е. если +// при сравнении двух строк в двух табличной частях с одинаковым составом колонок +// изменилось всего 2 колонки из 5 то считается, что это та же самая строка. +// +Функция КритерийДоступаНаРавенствоСтрок() + Возврат (0.6); +КонецФункции + +// Возвращает Истина или Ложь в зависимости от того, эквивалентны табличные +// части или нет. ТЧ считаются эквивалентными, если количество, наименование +// и тип их полей одинаков. Изменение порядка следования колонок не считается +// изменением табличной части. +// +Функция ТЧЭквиваленты(Колонки1, Колонки2) + + ТаблицаКолонок1 = СоздатьТаблицуСравнения(); + Для Каждого Элемент Из Колонки1 Цикл + НоваяСтрока = ТаблицаКолонок1.Добавить(); + НоваяСтрока.Установить(0, Элемент.Имя); + КонецЦикла; + + ТаблицаКолонок2 = СоздатьТаблицуСравнения(); + Для Каждого Элемент Из Колонки2 Цикл + НоваяСтрока = ТаблицаКолонок2.Добавить(); + НоваяСтрока.Установить(0, Элемент.Имя); + КонецЦикла; + + СписокДобавленныхКолонок = ВычестьТаблицу(ТаблицаКолонок1, ТаблицаКолонок2); + Если СписокДобавленныхКолонок.Количество() > 0 Тогда + Возврат Ложь; + КонецЕсли; + + СписокУдаленныхКолонок = ВычестьТаблицу(ТаблицаКолонок1, ТаблицаКолонок2); + Если СписокУдаленныхКолонок.Количество() > 0 Тогда + Возврат Ложь; + КонецЕсли; + + // проверяем совпадение типов колонок + Для Каждого Элемент1 Из Колонки1 Цикл + + Элемент2 = Колонки2.Найти(Элемент1.Имя); + Типы1 = Элемент1.ТипЗначения.Типы(); + Для Каждого Тип Из Типы1 Цикл + Если Не Элемент2.ТипЗначения.СодержитТип (Тип) Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + КонецЦикла; + + // проверяем совпадение типов колонок + Для Каждого Элемент2 Из Колонки2 Цикл + + Элемент1 = Колонки1.Найти(Элемент1.Имя); + Типы2 = Элемент2.ТипЗначения.Типы(); + Для Каждого Тип Из Типы2 Цикл + Если Не Элемент1.ТипЗначения.СодержитТип (Тип) Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + КонецЦикла; + + Возврат Истина; + +КонецФункции + +// Функция сравнивает значения двух строк (по значению) и возвращает +// Истина, в случае если строки равны, иначе возвращает Ложь +// Предполагается что структура метаданных табличных частей эквивалентна. +// +Функция СтрокиТЧРавны(СтрокаТЧ1, СтрокаТЧ2, Колонки) + + Для Каждого Колонка Из Колонки Цикл + ИмяКолонки = Колонка.Имя; + ЗначениеИзТЧ1 = СтрокаТЧ1[ИмяКолонки]; + ЗначениеИзТЧ2 = СтрокаТЧ2[ИмяКолонки]; + Если ЗначениеИзТЧ1 <> ЗначениеИзТЧ2 Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +// Функция пытается получить представление реквизита по описанию его типа +// +Функция ОпределитьПредставление(ЗначениеРеквизита, НаименованиеПоля, ОписаниеРеквизита) + + Если НаименованиеПоля = "Date" Тогда + МассивТипов = Новый Массив; + МассивТипов.Добавить(Тип("Дата")); + ОписаниеТипаДаты = Новый ОписаниеТипов(МассивТипов); + ОписаниеРеквизита = ОписаниеТипаДаты; + КонецЕсли; + + Если (ОписаниеРеквизита <> Неопределено) Тогда + ОписаниеТипаРеквизита = ОписаниеРеквизита.Тип; + // пытаемся найти прямое соответствие + ПредставлениеЗначенияРеквизита = + СформироватьПредставлениеПоОписаниюТипа(ОписаниеТипаРеквизита, + ЗначениеРеквизита); + КонецЕсли; + + Если ПредставлениеЗначенияРеквизита = "" Тогда + ПредставлениеЗначенияРеквизита = ЗначениеРеквизита; + Если ПредставлениеЗначенияРеквизита = "" Тогда + ПредставлениеЗначенияРеквизита = " "; + КонецЕсли; + КонецЕсли; + + Возврат ПредставлениеЗначенияРеквизита; + +КонецФункции + +// Функция пытается привести значение реквизита по типу его значения +// к представлению для пользователя +// +Функция ПривестиКПредставлениюПоТипуИЗначению(ТипЗначения, + Значение) + + Представление = Значение; + + Попытка + GUID = Новый УникальныйИдентификатор (Значение); + Исключение + Возврат Представление; + КонецПопытки; + + Если Лев(ТипЗначения, 10) = "CatalogRef" Тогда + ИмяСправочника = Прав(ТипЗначения, СтрДлина(ТипЗначения) - 11); + Представление = НайтиЭлементСправочникаПоGUIDИСформироватьПредставление( + GUID, + ИмяСправочника); + ИначеЕсли Лев(ТипЗначения, 11) = "DocumentRef" Тогда + ИмяДокумента = Прав(ТипЗначения, СтрДлина(ТипЗначения) - 12); + Представление = НайтиДокументПоGUIDИСформироватьПредставление( + GUID, + ИмяДокумента); + ИначеЕсли Лев(ТипЗначения, 29) = "ChartOfCharacteristicTypesRef" Тогда + ИмяПланаВидаХарактеристик = Прав(ТипЗначения, СтрДлина(ТипЗначения) - 30); + Представление = НайтиПланВидовХарактеристикПоGUIDИСформироватьПредставление( + GUID, + ИмяПланаВидаХарактеристик); + ИначеЕсли Лев(ТипЗначения, 18) = "ChartOfAccountsRef" Тогда + ИмяПланаСчетов = Прав(ТипЗначения, СтрДлина(ТипЗначения) - 19); + Представление = НайтиПланСчетовПоGUIDИСформироватьПредставление( + GUID, + ИмяПланаСчетов); + ИначеЕсли Лев(ТипЗначения, 26) = "ChartOfCalculationTypesRef" Тогда + ИмяПланаВидовРасчета = Прав(ТипЗначения, СтрДлина(ТипЗначения) - 27); + Представление = НайтиПланВидовРасчетаПоGUIDИСформироватьПредставление( + GUID, + ИмяПланаВидовРасчета); + ИначеЕсли Лев(ТипЗначения, 18) = "BusinessProcessRef" Тогда + ИмяБизнесПроцесса = Прав(ТипЗначения, СтрДлина(ТипЗначения) - 19); + Представление = НайтиБизнесПроцессПоGUIDИСформироватьПредставление( + GUID, + ИмяБизнесПроцесса); + ИначеЕсли Лев(ТипЗначения, 7) = "TaskRef" Тогда + ИмяЗадачи = Прав(ТипЗначения, СтрДлина(ТипЗначения) - 8); + Представление = НайтиЗадачуПоGUIDИСформироватьПредставление(GUID, ИмяЗадачи); + ИначеЕсли Лев(ТипЗначения, 15) = "ExchangePlanRef" Тогда + ИмяПланаОбмена = Прав(ТипЗначения, СтрДлина(ТипЗначения) - 16); + Представление = НайтиПланОбменаПоGUIDИСформироватьПредставление(GUID, ИмяПланаОбмена); + КонецЕсли; + + Возврат Представление; + +КонецФункции + +// Получает представление наименования системного реквизита +// +Функция ПолучитьПредставлениеРеквизитаНаЯзыке(знач ИмяРеквизита) + + Если ИмяРеквизита = "Number" Тогда + Возврат НСтр("ru = 'Номер'; en='Number'"); + ИначеЕсли ИмяРеквизита = "Name" Тогда + Возврат НСтр("ru = 'Наименование'; en='Name'"); + ИначеЕсли ИмяРеквизита = "Code" Тогда + Возврат НСтр("ru = 'Код'; en='Code'"); + ИначеЕсли ИмяРеквизита = "IsFolder" Тогда + Возврат НСтр("ru = 'ЭтоГруппа'; en='Is folder'"); + ИначеЕсли ИмяРеквизита = "Description" Тогда + Возврат НСтр("ru = 'Наименование'; en='Description'"); + ИначеЕсли ИмяРеквизита = "Date" Тогда + Возврат НСтр("ru = 'Дата'; en='Date'"); + ИначеЕсли ИмяРеквизита = "Posted" Тогда + Возврат НСтр("ru = 'Проведен'; en='Posted'"); + ИначеЕсли ИмяРеквизита = "DeletionMark" Тогда + Возврат НСтр("ru = 'ПометкаУдаления'; en='Deletion mark'"); + ИначеЕсли ИмяРеквизита = "Ref" Тогда + Возврат НСтр("ru = 'Ссылка'; en='Ref'"); + ИначеЕсли ИмяРеквизита = "Parent" Тогда + Возврат НСтр("ru = 'Родитель'; en='Parent'"); + Иначе + Возврат ИмяРеквизита; + КонецЕсли; + +КонецФункции + +// Используется для вывода текста в область табличного документа +// с условным оформлением +// +Процедура УстановитьСвойстваТекста(ОбластьСекции, Текст, + знач ЦветТекста = Неопределено, + знач ЦветФона = Неопределено, + знач Размер = 9, + знач Жирный = Ложь, + знач ПоказыватьГраницы = Ложь) + + ОбластьСекции.Текст = Текст; + + Если ЦветТекста = Неопределено Тогда + ЦветТекста = WebЦвета.Черный; + КонецЕсли; + + ОбластьСекции.ЦветТекста = ЦветТекста; + + Если ЦветФона <> Неопределено Тогда + ОбластьСекции.ЦветФона = ЦветФона; + КонецЕсли; + + ОбластьСекции.Шрифт = Новый Шрифт(, Размер, Жирный, , , ); + + Если ПоказыватьГраницы Тогда + ОбластьСекции.ГраницаСверху = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная); + ОбластьСекции.ГраницаСнизу = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная); + ОбластьСекции.ГраницаСлева = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная); + ОбластьСекции.ГраницаСправа = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная); + ОбластьСекции.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр; + КонецЕсли; + +КонецПроцедуры + +// Получает описание хранимой версии объекта в виде строки +// +Функция ПолучитьОписаниеПоВерсии(НомерВерсии) + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ АвторВерсии, ДатаВерсии + |ИЗ РегистрСведений.ВерсииОбъектов + |ГДЕ Объект = &Ссылка + |И НомерВерсии = &НомВер"; + Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект); + Запрос.УстановитьПараметр("НомВер", Число(НомерВерсии)); + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + + ОписаниеХранимойВерсии = "№"+ НомерВерсии + " / (" + + Строка(Выборка.ДатаВерсии) + " ) / " + + СокрЛП(Выборка.АвторВерсии.Наименование); + + Возврат ОписаниеХранимойВерсии; + +КонецФункции + +// Подсчитывает число изменившихся реквизитов в таблице изменившихся реквизитов +// +Функция РассчитатьЧислоИзменившихсяРеквизитов(ТаблицаИзмененийРеквизитов, МассивНомеровВерсий) + + Результат = 0; + + Для Каждого ЭлементТЗ Из ТаблицаИзмененийРеквизитов Цикл + Если ЭлементТЗ._Модификация <> Неопределено И ЭлементТЗ._Модификация = Истина Тогда + Результат = Результат + 1; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Увеличивает значение сквозного счетчика для таблицы +// +Функция УвеличитьСчетчик(счетчикУникальныйИд, ИмяТаблицы); + + счетчикУникальныйИд[ИмяТаблицы] = счетчикУникальныйИд[ИмяТаблицы] + 1; + + Возврат счетчикУникальныйИд[ИмяТаблицы]; + +КонецФункции + +// Возвращает уникальный номер для идентификации строки из таблицы по версии +// +Функция ПолучитьУникальныеУникальныйИд(ТаблицаИзмененийТЧ, ИмяКолонкиВерсии) + + СоответствиеУникальныйИд = Новый Соответствие; + + Для Каждого ЭлементСоотв Из ТаблицаИзмененийТЧ Цикл + СоответствиеУникальныйИд[ЭлементСоотв.Ключ] = Число(ЭлементСоотв.Значение[ИмяКолонкиВерсии].Количество()); + КонецЦикла; + + Возврат СоответствиеУникальныйИд; + +КонецФункции + +// Заполняет таблицу отчета по результатам сравнения на некотором шаге +// +// Параметры: +// ПометкаИзменения - строка - "д" - реквизит добавлен +// "у" - реквизит удален +// "и" - реквизит изменен +// +Процедура ЗаполнитьХарактеристикуИзмененияРеквизита(ТаблицаИзмененийРеквизита, + ПометкаИзменения, + ТаблицаИзмененийРеквизитов, + ИмяКолонкиТекущейВерсии, + ВерсияОбъекта) + + Для Каждого Элемент Из ТаблицаИзмененийРеквизита Цикл + Наименование = Элемент.Значение; + ИзменениеРеквизита = ТаблицаИзмененийРеквизитов.Найти (Наименование, "Наименование"); + + Если ИзменениеРеквизита = Неопределено Тогда + ИзменениеРеквизита = ТаблицаИзмененийРеквизитов.Добавить(); + ИзменениеРеквизита.Наименование = Наименование; + КонецЕсли; + + ПараметрыИзменения = Новый Структура; + ПараметрыИзменения.Вставить("ТипИзменения", ПометкаИзменения); + + Если ПометкаИзменения = "у" Тогда + ПараметрыИзменения.Вставить("Значение", "удалено"); + Иначе + ПараметрыИзменения.Вставить("Значение", ВерсияОбъекта.Реквизиты.Найти(Наименование, "НаименованиеРеквизита")); + КонецЕсли; + + ИзменениеРеквизита[ИмяКолонкиТекущейВерсии] = ПараметрыИзменения; + ИзменениеРеквизита._Модификация = Истина; + КонецЦикла; + +КонецПроцедуры + +// Пытается сформировать представление значения по описанию его типа +// +Функция СформироватьПредставлениеПоОписаниюТипа(ОписаниеТипаРеквизита, РеквизитЗначение) + + Если ТипЗнч(РеквизитЗначение) <> Тип("Строка") Тогда + Возврат Строка(РеквизитЗначение); + КонецЕсли; + + Текст = ""; + Если ОписаниеТипаРеквизита.СодержитТип(Тип("Дата")) Тогда + ЗначениеДаты = XMLЗначение(Тип("Дата"),РеквизитЗначение); + + Если Год(ЗначениеДаты) <> 1 Тогда + Текст = Формат(ЗначениеДаты, "ЧЦ=2; ЧВН=; ДФ=dd.MM.yyyy"); + КонецЕсли; + + Если НЕ (Секунда(ЗначениеДаты) = 0 И Минута(ЗначениеДаты) = 0 И Час(ЗначениеДаты) = 0) Тогда + Текст = Текст + " " + Формат(ЗначениеДаты, "ЧВН=; ДЛФ=T"); + КонецЕсли; + + Текст = ?(ПустаяСтрока(Текст), " ", Текст); + + Возврат Текст; + КонецЕсли; + + НайденоЗначение = Ложь; + + Если ОписаниеТипаРеквизита.СодержитТип(Тип("Булево")) Тогда + Если РеквизитЗначение = "true" Тогда + Текст = "Истина"; + Иначе + Текст = "Ложь"; + КонецЕсли; + НайденоЗначение = Истина; + КонецЕсли; + + Если НайденоЗначение Тогда + Возврат Текст; + КонецЕсли; + + Если ОписаниеТипаРеквизита.СодержитТип(Тип("Число")) Тогда + Если РеквизитЗначение = Неопределено Тогда + РеквизитЗначение = 0; + КонецЕсли; + Текст = Формат(Число(РеквизитЗначение), "ЧДЦ="+Строка(ОписаниеТипаРеквизита.КвалификаторыЧисла.РазрядностьДробнойЧасти)); + НайденоЗначение = Истина; + КонецЕсли; + + Если НайденоЗначение Тогда + Возврат Текст; + КонецЕсли; + + Попытка + GUID = Новый УникальныйИдентификатор(РеквизитЗначение); + Исключение + Возврат РеквизитЗначение; + КонецПопытки; + + Для Каждого Элемент Из Метаданные.Справочники Цикл + Оп = Новый ОписаниеТипов("СправочникСсылка." + Элемент.Имя); + Если ОписаниеТипаРеквизита.СодержитТип(Оп.Типы()[0]) Тогда + Текст = НайтиЭлементСправочникаПоGUIDИСформироватьПредставление(GUID, Элемент.Имя, НайденоЗначение); + Если НайденоЗначение Тогда + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если НайденоЗначение Тогда + Возврат Текст; + КонецЕсли; + + Для Каждого Элемент Из Метаданные.Документы Цикл + Оп = Новый ОписаниеТипов("ДокументСсылка." + Элемент.Имя); + Если ОписаниеТипаРеквизита.СодержитТип(Оп.Типы()[0]) Тогда + Текст = НайтиДокументПоGUIDИСформироватьПредставление(GUID, Элемент.Имя, НайденоЗначение); + Если НайденоЗначение Тогда + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если НайденоЗначение Тогда + Возврат Текст; + КонецЕсли; + + Для Каждого Элемент Из Метаданные.БизнесПроцессы Цикл + Оп = Новый ОписаниеТипов("БизнесПроцессСсылка." + Элемент.Имя); + Если ОписаниеТипаРеквизита.СодержитТип(Оп.Типы()[0]) Тогда + Текст = НайтиБизнесПроцессПоGUIDИСформироватьПредставление(GUID, Элемент.Имя, НайденоЗначение); + Если НайденоЗначение Тогда + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если НайденоЗначение Тогда + Возврат Текст; + КонецЕсли; + + Для Каждого Элемент Из Метаданные.БизнесПроцессы Цикл + Оп = Новый ОписаниеТипов("БизнесПроцессСсылка." + Элемент.Имя); + Если ОписаниеТипаРеквизита.СодержитТип(Оп.Типы()[0]) Тогда + Текст = НайтиБизнесПроцессПоGUIDИСформироватьПредставление(GUID, Элемент.Имя, НайденоЗначение); + Если НайденоЗначение Тогда + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если НайденоЗначение Тогда + Возврат Текст; + КонецЕсли; + + Для Каждого Элемент Из Метаданные.Задачи Цикл + Оп = Новый ОписаниеТипов("ЗадачаСсылка." + Элемент.Имя); + Если ОписаниеТипаРеквизита.СодержитТип(Оп.Типы()[0]) Тогда + Текст = НайтиЗадачуПоGUIDИСформироватьПредставление(GUID, Элемент.Имя, НайденоЗначение); + Если НайденоЗначение Тогда + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если НайденоЗначение Тогда + Возврат Текст; + КонецЕсли; + + Для Каждого Элемент Из Метаданные.ПланыВидовХарактеристик Цикл + Оп = Новый ОписаниеТипов("ПланВидовХарактеристикСсылка." + Элемент.Имя); + Если ОписаниеТипаРеквизита.СодержитТип(Оп.Типы()[0]) Тогда + Текст = НайтиПланВидовХарактеристикПоGUIDИСформироватьПредставление(GUID, Элемент.Имя, НайденоЗначение); + Если НайденоЗначение Тогда + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если НайденоЗначение Тогда + Возврат Текст; + КонецЕсли; + + Для Каждого Элемент Из Метаданные.ПланыВидовРасчета Цикл + Оп = Новый ОписаниеТипов("ПланВидовРасчетаСсылка." + Элемент.Имя); + Если ОписаниеТипаРеквизита.СодержитТип(Оп.Типы()[0]) Тогда + Текст = НайтиПланВидовРасчетаПоGUIDИСформироватьПредставление(GUID, Элемент.Имя, НайденоЗначение); + Если НайденоЗначение Тогда + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если НайденоЗначение Тогда + Возврат Текст; + КонецЕсли; + + Для Каждого Элемент Из Метаданные.ПланыСчетов Цикл + Оп = Новый ОписаниеТипов("ПланСчетовСсылка." + Элемент.Имя); + Если ОписаниеТипаРеквизита.СодержитТип(Оп.Типы()[0]) Тогда + Текст = НайтиПланСчетовПоGUIDИСформироватьПредставление(GUID, Элемент.Имя, НайденоЗначение); + Если НайденоЗначение Тогда + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если НайденоЗначение ИЛИ ЗначениеЗаполнено(Текст) или Текст = " " Тогда + Возврат Текст; + КонецЕсли; + + Возврат РеквизитЗначение; + +КонецФункции + +// Получает ссылку на объект - план обмена по GUID +// +Функция НайтиПланОбменаПоGUIDИСформироватьПредставление(GUID, ИмяПланаОбмена, НайденоЗначение = Ложь) + + Если Строка(GUID) = XMLСтрока(ПланыОбмена[ИмяПланаОбмена].ПустаяСсылка()) Тогда + Возврат " "; + КонецЕсли; + + Ссылка = ПланыОбмена[ИмяПланаОбмена].ПолучитьСсылку(GUID); + НайденоЗначение = ОбъектСуществует(Ссылка, "ПланОбмена", ИмяПланаОбмена); + Возврат Строка(Ссылка); + +КонецФункции + +// Получает ссылку на объект - план счетов по GUID +// +Функция НайтиПланСчетовПоGUIDИСформироватьПредставление(GUID, ИмяПланаСчетов, НайденоЗначение = Ложь) + + Если Строка(GUID) = XMLСтрока(ПланыСчетов[ИмяПланаСчетов].ПустаяСсылка()) Тогда + Возврат " "; + КонецЕсли; + + Ссылка = ПланыСчетов[ИмяПланаСчетов].ПолучитьСсылку(GUID); + НайденоЗначение = ОбъектСуществует(Ссылка, "ПланСчетов", ИмяПланаСчетов); + Возврат Строка(Ссылка); + +КонецФункции + +// Получает ссылку на объект - план видов расчета по GUID +// +Функция НайтиПланВидовРасчетаПоGUIDИСформироватьПредставление(GUID, ИмяПланаВидовРасчета, НайденоЗначение = Ложь) + + Если Строка(GUID) = XMLСтрока(ПланыВидовРасчета[ИмяПланаВидовРасчета].ПустаяСсылка()) Тогда + Возврат " "; + КонецЕсли; + + Ссылка = ПланыВидовРасчета[ИмяПланаВидовРасчета].ПолучитьСсылку(GUID); + НайденоЗначение = ОбъектСуществует(Ссылка, "ПланВидовРасчета", ИмяПланаВидовРасчета); + Возврат Строка(Ссылка); + +КонецФункции + +// Получает ссылку на объект - план видов характеристик по GUID +// +Функция НайтиПланВидовХарактеристикПоGUIDИСформироватьПредставление(GUID, ИмяПланаВидовХарактеристик, НайденоЗначение = Ложь) + + Если Строка(GUID) = XMLСтрока(ПланыВидовХарактеристик[ИмяПланаВидовХарактеристик].ПустаяСсылка()) Тогда + Возврат " "; + КонецЕсли; + + Ссылка = ПланыВидовХарактеристик[ИмяПланаВидовХарактеристик].ПолучитьСсылку(GUID); + НайденоЗначение = ОбъектСуществует(Ссылка, "ПланВидовХарактеристик", ИмяПланаВидовХарактеристик); + Возврат Строка(Ссылка); + +КонецФункции + +// Получает ссылку на объект - задачу по GUID +// +Функция НайтиЗадачуПоGUIDИСформироватьПредставление(GUID, ИмяЗадачи, НайденоЗначение = Ложь) + + Если Строка(GUID) = XMLСтрока(Задачи[ИмяЗадачи].ПустаяСсылка()) Тогда + Возврат " "; + КонецЕсли; + + Ссылка = Задачи[ИмяЗадачи].ПолучитьСсылку(GUID); + НайденоЗначение = ОбъектСуществует(Ссылка, "Задача", ИмяЗадачи); + Возврат Строка(Ссылка); + +КонецФункции + +// Получает ссылку на объект - бизнес процесс по GUID +// +Функция НайтиБизнесПроцессПоGUIDИСформироватьПредставление(GUID, ИмяБизнесПроцесса, НайденоЗначение = Ложь) + + Если Строка(GUID) = XMLСтрока(БизнесПроцессы[ИмяБизнесПроцесса].ПустаяСсылка()) Тогда + Возврат " "; + КонецЕсли; + + Ссылка = БизнесПроцессы[ИмяБизнесПроцесса].ПолучитьСсылку(GUID); + НайденоЗначение = ОбъектСуществует(Ссылка, "БизнесПроцесс", ИмяБизнесПроцесса); + Возврат Строка(Ссылка); + +КонецФункции + +// Получает ссылку на объект - документ по GUID +// +Функция НайтиДокументПоGUIDИСформироватьПредставление(GUID, ИмяДокумента, НайденоЗначение = Ложь) + + Если Строка(GUID) = XMLСтрока(Документы[ИмяДокумента].ПустаяСсылка()) Тогда + Возврат " "; + КонецЕсли; + + Ссылка = Документы[ИмяДокумента].ПолучитьСсылку(GUID); + НайденоЗначение = ОбъектСуществует(Ссылка, "Документ", ИмяДокумента); + Возврат Строка(Ссылка); + +КонецФункции + +// Получает ссылку на объект - справочник по GUID +// +Функция НайтиЭлементСправочникаПоGUIDИСформироватьПредставление(GUID, ИмяСправочника, НайденоЗначение = Ложь) + + Если Строка(GUID) = XMLСтрока(Справочники[ИмяСправочника].ПустаяСсылка()) Тогда + Возврат " "; + КонецЕсли; + + Ссылка = Справочники[ИмяСправочника].ПолучитьСсылку(GUID); + НайденоЗначение = ОбъектСуществует(Ссылка, "Справочник", ИмяСправочника); + Возврат Строка(Ссылка); + +КонецФункции + +Функция ОбъектСуществует(Ссылка, КлассификаторСтрока, ИмяОМ) + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ " + КлассификаторСтрока + "." + ИмяОМ + " ГДЕ Ссылка=&Ссылка"; + Запрос.Параметры.Вставить("Ссылка", Ссылка); + + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; + +КонецФункции + +// Выводит текст в область табличного документа с определенным оформлением +// +Процедура ВывестиТекстВОтчет(ТЧОтчета, + знач Секция, + знач Регион, + знач Текст, + знач ЦветТекста = Неопределено, + знач ЦветФона = Неопределено, + знач Размер = 9, + знач Жирный = Ложь) + + Если ЦветТекста = Неопределено Тогда + ЦветТекста = WEBЦвета.Черный; + КонецЕсли; + + Если ЦветФона = Неопределено Тогда + ЦветФона = WEBЦвета.Белый; + КонецЕсли; + + Секция.Область(Регион).Текст = Текст; + Секция.Область(Регион).ЦветФона = ЦветФона; + Секция.Область(Регион).ЦветТекста = ЦветТекста; + Секция.Область(Регион).Шрифт = Новый Шрифт(, Размер, Жирный, , , ); + + Секция.Область(Регион).ГраницаСверху = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии); + Секция.Область(Регион).ГраницаСнизу = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии); + Секция.Область(Регион).ГраницаСлева = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии); + Секция.Область(Регион).ГраницаСправа = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии); + + ТЧОтчета.Вывести(Секция); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЕКЦИЯ СЛУЖЕБНЫХ ФУНКЦИЙ (ВНУТРЕННЯЯ ЛОГИКА) + +// Функция по номеру версии объекта и ссылке на него получает объект из +// регистра сведений, записывает его на диск и вызывает функцию разбора +// XML представления объекта. +// Параметры: +// НомерВерсии - число - номер версии документа в регистре сведений +// Ссылка - СправочникСсылка/ДокументСсылка - ссылка на экземпляр +// объекта метаданных +// Возвращаемое значение: +// Структура: +// +Функция СохранитьФайлПоВерсии(НомерВерсии) + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ АвторВерсии, ДатаВерсии, ВерсияОбъекта + |ИЗ РегистрСведений.ВерсииОбъектов + |ГДЕ Объект = &Ссылка + |И НомерВерсии = &НомВер"; + Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект); + Запрос.УстановитьПараметр("НомВер", Число(НомерВерсии)); + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + + ВерсияОбъекта = Выборка.ВерсияОбъекта.Получить(); + + Если ВерсияОбъекта = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Ошибка получения версии объекта из информационной базы'"); + Иначе + Возврат ВерсияОбъекта; + КонецЕсли; + +КонецФункции + +// Восстанавливает сериализованный в XML объект. +// Параметры +// ИмяФайла - строка - путь к файлу, в котором хранится сериализованное +// представление объекта +// +Функция ПолучитьОбъектИзXML(ДвоичныеДанные) + + ЧтениеXML = Новый ЧтениеFastInfoSet; + ЧтениеXML.УстановитьДвоичныеДанные(ДвоичныеДанные); + Если ЧтениеXML.Прочитать() Тогда + Если ВозможностьЧтенияXML(ЧтениеXML) Тогда + Объект = ПрочитатьXML(ЧтениеXML); + ЧтениеXML.Закрыть(); + Возврат Объект; + Иначе + ЧтениеXML.Закрыть(); + ВызватьИсключение НСтр("ru = 'Ошибка при восстановлении объекта'"); + КонецЕсли; + Иначе + ЧтениеXML.Закрыть(); + ВызватьИсключение НСтр("ru = 'Ошибка чтения данных'"); + КонецЕсли; + +КонецФункции + +// ЗначениеЗаполнения - массив строк +// ТипВывода - строка : +// "и" - изменение +// "д" - добавление +// "у" - удаление +// "" - обычный вывод +Функция СформироватьСекторСтрокиТЧ(знач ЗначениеЗаполнения,знач ТипВывода = "") + + ТабличныйДокумент = Новый ТабличныйДокумент; + + Если ТипВывода = "" Тогда + Шаблон = ОбщийШаблон.ПолучитьОбласть("ИсходноеЗначениеРеквизита"); + ИначеЕсли ТипВывода = "И" Тогда + Шаблон = ОбщийШаблон.ПолучитьОбласть("ИзмененноеЗначениеРеквизита"); + ИначеЕсли ТипВывода = "Д" Тогда + Шаблон = ОбщийШаблон.ПолучитьОбласть("ДобавленныйРеквизит"); + ИначеЕсли ТипВывода = "У" Тогда + Шаблон = ОбщийШаблон.ПолучитьОбласть("УдаленныйРеквизит"); + КонецЕсли; + + Для Каждого ОчередноеЗначение Из ЗначениеЗаполнения Цикл + Шаблон.Параметры.ЗначениеРеквизита = ОчередноеЗначение; + ТабличныйДокумент.Вывести(Шаблон); + КонецЦикла; + + Возврат ТабличныйДокумент; + +КонецФункции + +// Формирует пустой сектор для вывода в отчет. Используется, +// если строка не была изменена в одной из версий. +// +Функция СформироватьПустойСектор(знач ЧислоСтрок, знач ТипВывода = "") + + ЗначениеЗаполнения = Новый Массив; + + Для Индекс = 1 По ЧислоСтрок Цикл + ЗначениеЗаполнения.Добавить(" "); + КонецЦикла; + + Возврат СформироватьСекторСтрокиТЧ(ЗначениеЗаполнения, ТипВывода); + +КонецФункции + +// Функция возвращает результат вычитания элементов множества таблицы +// ТаблицаВычитаемая из ТаблицаОсновная. +// +Функция ВычестьТаблицу(знач ТаблицаОсновная, + знач ТаблицаВычитаемая, + знач КолонкаСравненияОсновнойТаблицы = "", + знач КолонкаСравненияВычитаемойТаблицы = "") + + Если Не ЗначениеЗаполнено(КолонкаСравненияОсновнойТаблицы) Тогда + КолонкаСравненияОсновнойТаблицы = "Значение"; + КонецЕсли; + + Если Не ЗначениеЗаполнено(КолонкаСравненияВычитаемойТаблицы) Тогда + КолонкаСравненияВычитаемойТаблицы = "Значение"; + КонецЕсли; + + ТаблицаРезультат = Новый ТаблицаЗначений; + ТаблицаРезультат = ТаблицаОсновная.Скопировать(); + + Для Каждого Элемент Из ТаблицаВычитаемая Цикл + Значение = Элемент[КолонкаСравненияОсновнойТаблицы]; + НайденнаяСтрока = ТаблицаРезультат.Найти(Значение, КолонкаСравненияОсновнойТаблицы); + Если НайденнаяСтрока <> Неопределено Тогда + ТаблицаРезультат.Удалить(НайденнаяСтрока); + КонецЕсли; + КонецЦикла; + + Возврат ТаблицаРезультат; + +КонецФункции + +// Функция возвращает таблицу созданную на основе ТаблицаИнициализации. +// Если ТаблицаИнициализации не указана, то создается пустая таблица. +// +Функция СоздатьТаблицуСравнения(ТаблицаИнициализации = Неопределено, + ИмяКолонкиСравнения = "Значение") + + Таблица = Новый ТаблицаЗначений; + Таблица.Колонки.Добавить(ИмяКолонкиСравнения); + + Если ТаблицаИнициализации <> Неопределено Тогда + + МассивЗначений = ТаблицаИнициализации.ВыгрузитьКолонку(ИмяКолонкиСравнения); + + Для Каждого Элемент Из ТаблицаИнициализации Цикл + НоваяСтрока = Таблица.Добавить(); + НоваяСтрока.Установить(0, Элемент[ИмяКолонкиСравнения]); + КонецЦикла; + + КонецЕсли; + + Возврат Таблица; + +КонецФункции diff --git a/SSL/src/Reports/ОтчетПоВерсиям/Templates/СтандартныйМакетПредставленияОбъекта/Template.mxlx b/SSL/src/Reports/ОтчетПоВерсиям/Templates/СтандартныйМакетПредставленияОбъекта/Template.mxlx new file mode 100644 index 000000000..35472d6a2 --- /dev/null +++ b/SSL/src/Reports/ОтчетПоВерсиям/Templates/СтандартныйМакетПредставленияОбъекта/Template.mxlx @@ -0,0 +1,839 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 3 + + 1 + + 1 + + + + 2 + + 2 + + + + + 0a84e64e-bded-4ad6-99ae-d67a7e3710ec + 3 + + 0 + + 3 + + + + 1 + + 4 + + + + 2 + + 5 + + + + + 0 + + + 1 + + 6 + + + + + 7 + НаименованиеОтчета + + + + + + 1 + + + 1 + + 8 + + + ru + Имя измененного объекта + + + + + + + 9 + НаименованиеОбъекта + + + + + + 2 + + + 1 + + 10 + + + + + + 4 + + + 1 + + 11 + + + ru + Версии + + + + + + + 12 + ПредставлениеВерсии + + + + + + 5 + + + + 0 + + Text + 0 + 13 + + + ru + Пустая строка + + + 1 + -21 + 5 + 51 + 1 + 21 + 0 + 243 + true + Stretch + 0 + + + + + + 10 + + + + + + 6 + + + 1 + + 8 + + + ru + Реквизиты + + + + + + + + 8 + + + + 3 + + + + + 14 + + + + + 0 + + + + + + 9 + + + + 3 + + + + + 14 + + + + + 0 + + + + + + 10 + + + + 3 + + + + + 14 + + + + + 15 + + + ru + Не изменялись + + + + + + + + 11 + + + + 3 + + + + + 14 + + + + + 0 + + + + + + 12 + + + + 3 + + + + + 16 + НаименованиеРеквизитаПоля + + + + + 17 + ЗначениеРеквизита + + + + + + 13 + + + 1 + + 18 + + + + + 19 + ЗначениеРеквизита + + + + + + 14 + + + 1 + + 18 + + + + + 20 + ЗначениеРеквизита + + + + + + 15 + + + 1 + + 18 + + + + + 21 + ЗначениеРеквизита + + + + + + 17 + + + 1 + + 11 + + + ru + Табличные части + + + + + + + + 18 + + + 1 + + 8 + + + + + + 19 + + + 1 + + 22 + НаименованиеТабличнойЧасти + + + + + + 21 + + + 1 + + 23 + + + ru + Строка № [НомерСтрокиТабличнойЧасти] + + + + + + + + 23 + + 0a84e64e-bded-4ad6-99ae-d67a7e3710ec + + 1 + + 24 + + + ru + Легенда + + + + + + + 0 + + + ru + + + + + + + + + 24 + + 0a84e64e-bded-4ad6-99ae-d67a7e3710ec + + 1 + + 25 + + + ru + Предыдущее значение реквизита + + + + + + + 0 + + + ru + + + + + + + + + 25 + + 0a84e64e-bded-4ad6-99ae-d67a7e3710ec + + 1 + + 26 + + + ru + Новое значение реквизита или строка табличной части + + + + + + + 0 + + + ru + + + + + + + + + 26 + + 0a84e64e-bded-4ad6-99ae-d67a7e3710ec + + 1 + + 27 + + + ru + Удаленный реквизит или строка табличной части + + + + + + + 0 + + + ru + + + + + + + + true + 3 + 27 + 27 + + ДобавленныйРеквизит + + Rectangle + 14 + 14 + 2 + 2 + + + + ЗаголовокВерсии + + Rectangle + 4 + 4 + 1 + 1 + + + + ИзмененноеЗначениеРеквизита + + Rectangle + 13 + 13 + 2 + 2 + + + + ИсходноеЗначениеРеквизита + + Rectangle + 12 + 12 + 2 + 2 + + + + Легенда + + Rows + 23 + 26 + -1 + -1 + + + + НаименованиеРеквизитаПоля + + Rectangle + 12 + 12 + 1 + 1 + + + + ПредставлениеВерсии + + Rectangle + 4 + 4 + 2 + 2 + + + + ПустаяЯчейка + + Rectangle + 4 + 4 + 0 + 0 + + + + РеквизитыНеИзменялись + + Rows + 10 + 10 + -1 + -1 + + + + СвободнаяСтрока + + Rows + 8 + 8 + -1 + -1 + + + + УдаленныйРеквизит + + Rectangle + 15 + 15 + 2 + 2 + + + + Шапка + + Rows + 0 + 2 + -1 + -1 + + + + ШапкаРеквизитов + + Rows + 6 + 6 + -1 + -1 + + + + ШапкаСтрокиТабличнойЧасти + + Rows + 21 + 21 + -1 + -1 + + + + ШапкаТабличнойЧасти + + Rows + 19 + 19 + -1 + -1 + + + + ШапкаТабличныхЧастей + + Rows + 17 + 17 + -1 + -1 + + + + Solid + + + + + + + + + 294 + Left + 0 + Cell + false + QuickChange + + + 369 + + + 72 + + + 362 + Left + 0 + Cell + false + QuickChange + + + 301 + + + 0 + 72 + Left + 0 + false + QuickChange + + + 0 + 72 + Parameter + Cell + + + 1 + 249 + Left + 0 + false + QuickChange + + + 345 + Parameter + + + Left + 0 + false + QuickChange + + + 1 + 249 + Left + 0 + Cell + false + QuickChange + + + 0 + 72 + style:FormBackColor + Parameter + + + Top + style:ToolTipTextColor + style:ToolTipBackColor + + + 2 + 72 + Left + 0 + false + QuickChange + + + 2 + style:BorderColor + #FF0000 + + + 3 + 72 + Left + Parameter + 0 + false + QuickChange + + + 4 + Parameter + + + 72 + Left + 0 + false + QuickChange + + + 322 + d3p1:Blue + #CCFFFF + Parameter + + + 322 + #CCFFCC + Parameter + + + 322 + d3p1:LightPink + Parameter + false + + + 1 + 249 + Left + Parameter + 0 + false + QuickChange + + + 3 + Left + Template + 0 + false + QuickChange + + + 5 + + + d3p1:Blue + #CCFFFF + + + #CCFFCC + + + d3p1:LightPink + + \ No newline at end of file diff --git a/SSL/src/Reports/ОтчетПоВерсиям/ОтчетПоВерсиям.mdo b/SSL/src/Reports/ОтчетПоВерсиям/ОтчетПоВерсиям.mdo new file mode 100644 index 000000000..0220610b2 --- /dev/null +++ b/SSL/src/Reports/ОтчетПоВерсиям/ОтчетПоВерсиям.mdo @@ -0,0 +1,46 @@ + + + + + + + ОтчетПоВерсиям + + ru + Отчет по изменениям версий объектов + + true + + СсылкаНаОбъект + + ru + Ссылка на объект + + + DocumentRef + CatalogRef + + + ru + Объект информационной базы для формирования отчета + + + + + + ФормаОтчета + + ru + Отчет по изменениям версий и отдельной версии объекта + + PersonalComputer + MobileDevice + + + СтандартныйМакетПредставленияОбъекта + + ru + Стандартный макет представления объекта + + + diff --git a/SSL/src/Reports/ОтчетПоЗаданиям/ManagerModule.bsl b/SSL/src/Reports/ОтчетПоЗаданиям/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Reports/ОтчетПоЗаданиям/Templates/Макет/Template.dcs b/SSL/src/Reports/ОтчетПоЗаданиям/Templates/Макет/Template.dcs new file mode 100644 index 000000000..832a411df --- /dev/null +++ b/SSL/src/Reports/ОтчетПоЗаданиям/Templates/Макет/Template.dcs @@ -0,0 +1,912 @@ + + + + ИсточникДанных1 + Local + + + НаборДанных1 + + Завершен + Завершен + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Завершено</v8:content> + </v8:item> + + + + Дата + Дата + + + Стартован + Стартован + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Стартовано</v8:content> + </v8:item> + + + + Автор + Автор + + + Важность + Важность + + + ДатаЗавершения + ДатаЗавершения + + + Наименование + Наименование + + + НомерИтерации + НомерИтерации + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Количество циклов</v8:content> + </v8:item> + + + + Предмет + Предмет + + + СрокИсполнения + СрокИсполнения + + + Ссылка + Ссылка + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Наименование</v8:content> + </v8:item> + + Наименование + + + Выполнено + Выполнено + + + Подтверждено + Подтверждено + + + Результат + Результат + + ИсточникДанных1 + ВЫБРАТЬ + Задание.Ссылка, + Задание.Дата, + Задание.Завершен, + Задание.Стартован, + Задание.Наименование, + Задание.Важность, + Задание.СрокИсполнения, + Задание.Предмет, + Задание.Автор, + Задание.ДатаЗавершения, + Задание.НомерИтерации, + Задание.Выполнено, + Задание.Подтверждено, + ВЫБОР + КОГДА Задание.Завершен + И Задание.Выполнено + ТОГДА 0 + КОГДА Задание.Завершен + И (НЕ Задание.Выполнено) + ТОГДА 1 + ИНАЧЕ 2 + КОНЕЦ КАК Результат +ИЗ + БизнесПроцесс.Задание КАК Задание +{ГДЕ + (Задание.Завершен = &Завершен), + (Задание.ДатаЗавершения >= &ПериодНачало + ИЛИ Задание.ДатаЗавершения = ДАТАВРЕМЯ(1, 1, 1))} + + + Количество + 1 + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Количество</v8:content> + </v8:item> + + + + Длительность + РазностьДат(Дата, ДатаЗавершения, "ДЕНЬ") + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Длительность</v8:content> + </v8:item> + + + xs:decimal + + 0 + 0 + Any + + + + + КоличествоЦиклов + НомерИтерации + + <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:decimal + + 0 + 0 + Any + + + + + Количество + Сумма(Количество) + + + НомерИтерации + Среднее(НомерИтерации) + + + Длительность + Среднее(Длительность) + + + КоличествоЦиклов + Сумма(КоличествоЦиклов) + + + Период + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Период</v8:content> + </v8:item> + + + v8:StandardPeriod + + + Custom + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + false + + + ПериодНачало + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Период начало</v8:content> + </v8:item> + + + xs:dateTime + + DateTime + + + 0001-01-01T00:00:00 + true + &Период.ДатаНачала + + + ПериодОкончание + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Период окончание</v8:content> + </v8:item> + + + xs:dateTime + + DateTime + + + 0001-01-01T00:00:00 + true + &Период.ДатаОкончания + + + Завершен + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Завершен</v8:content> + </v8:item> + + + xs:boolean + + false + false + + + + Длительность + + + + СписокЗаданий + + + ru + Список заданий за период + + + + + + СистемныеПоля.НомерПоПорядку + + + Ссылка + + + Выполнено + + + Автор + + + Дата + Начато + + + false + ДатаЗавершения + Завершено + + + КоличествоЦиклов + Циклов + + + Дней + + + + + Период + + ThisMonth + + 09dca850-78ce-4bf6-bf12-f80bcf3fd280 + + + false + Завершен + true + 86a02492-4342-4c85-adb5-d49ba42769c8 + Только завершенные задания + + + + + Дата + Asc + + + + + + + Дата + + + ДатаЗавершения + + + + + + Формат + ДФ=dd.MM.yyyy + + + + + + + + Завершен + Equal + true + + + + + ЦветТекста + style:ВыполненнаяЗадача + + + + + + + Выполнено + + + + + Выполнено + Equal + false + + + + + ЦветТекста + auto + + + + + + + Выполнено + + + + + Выполнено + Equal + true + + + + + ЦветТекста + auto + + + + + + + Дней + + + + + Завершен + Equal + false + + + + + Текст + + + + + + + + ВертикальноеРасположениеОбщихИтогов + End + + + ВыводитьЗаголовок + Output + + + Заголовок + Задания за период + + + + + + + + + + + + + + СтатистикаЗаданий + + + ru + Статистика результатов выполнения заданий + + + + + + Количество.ПроцентОбщий + + + + + Период + + ThisMonth + + 35ea3880-0af4-4ef2-a0fe-5aecf395706a + + + false + Завершен + true + ad6b8ea4-e867-41b5-b333-93372d69b530 + Только завершенные задания + + + + + + + Результат + + + + + Результат + Equal + 0 + + + + + Текст + Выполнено + + + + + + + Результат + + + + + Результат + Equal + 1 + + + + + Текст + Отменено + + + + + + + Результат + + + + + Результат + Equal + 2 + + + + + Текст + Выполняется + + + + + + + ТипДиаграммы + Pie3D + + ТипДиаграммы.ВидПодписей + SeriesPercent + + + false + ТипДиаграммы.АвтоРаздвижениеСерий + All + + + false + ТипДиаграммы.ОтображатьТаблицуДанных + true + + + false + ТипДиаграммы.СтильГраницы + + None + + + + ТипДиаграммы.РасположениеЛегенды + None + + + + ВыводитьЗаголовок + Auto + + + Заголовок + Статистика результатов выполнения заданий + + + + + + + Результат + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + + + + + СтатистикаЦикловВыполненияПроверки + + + ru + Статистика циклов выполнения-проверки заданий + + + + + + Автор + + + НомерИтерации + + + + + Период + + ThisMonth + + 6b152230-c8b4-45df-9ac6-d74c11abd16b + + + false + Завершен + true + 473e843f-7589-413e-a475-c28f73cde86b + Только завершенные задания + + + + + НомерИтерации + Desc + + + + + ТипДиаграммы + Column3D + + ТипДиаграммы.ВидПодписей + Value + + + ТипДиаграммы.РасположениеЛегенды + None + + + + Заголовок + Среднее количество циклов выполнения-проверки заданий по авторам + + + + + + + Автор + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + КоличествоЗаписей + 10 + + + + + + НомерИтерации + + + + + Заголовок + Топ 10 авторов по среднему количеству циклов выполнения-проверки заданий + + + + + + + Автор + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + Автор + + + НомерИтерации + Среднее количество циклов + + + + + + + НомерИтерации + + + + + + Формат + ЧЦ=5; ЧДЦ=1 + + + + + + + Заголовок + Полный список + + + + + + + СтатистикаДлительности + + + ru + Средняя длительность выполнения заданий + + + + + + Длительность + + + + + Завершен + Equal + true + Inaccessible + + + + + Период + + ThisMonth + + 38079913-6795-44c3-b6f9-d84f1aa5bb62 + + + false + Завершен + true + Inaccessible + 2dc8ac90-b103-48cb-92d1-48bb72df5e73 + Только завершенные задания + + + + + Длительность + Desc + + + + + ТипДиаграммы + Column3D + + ТипДиаграммы.РасположениеЛегенды + None + + + + Заголовок + Средняя продолжительность выполнения заданий + + + + + + + Автор + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + КоличествоЗаписей + 10 + + + + + + Длительность + + + + + false + ТипДиаграммы + Column3D + + ТипДиаграммы.ВидПодписей + Value + + + + Заголовок + Топ 10 авторов + + + + + + + Автор + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + Автор + + + Длительность + Средняя длительность (в днях) + + + + + РасположениеИтогов + Auto + + + ВертикальноеРасположениеОбщихИтогов + None + + + Заголовок + Полный список + + + ВыводитьОтбор + DontOutput + + + Normal + 641ce35b-cb85-4c9d-972a-19eb7e96e9af + Список средней продолжительности по авторам + + + + \ No newline at end of file diff --git a/SSL/src/Reports/ОтчетПоЗаданиям/ОтчетПоЗаданиям.mdo b/SSL/src/Reports/ОтчетПоЗаданиям/ОтчетПоЗаданиям.mdo new file mode 100644 index 000000000..339714db4 --- /dev/null +++ b/SSL/src/Reports/ОтчетПоЗаданиям/ОтчетПоЗаданиям.mdo @@ -0,0 +1,27 @@ + + + + + + + ОтчетПоЗаданиям + + ru + Задания + + true + Report.ОтчетПоЗаданиям.Template.Макет + SettingsStorage.ХранилищеВариантовОтчетов + + ru + Отчет по заданиям + + + Макет + + ru + Макет + + DataCompositionSchema + + diff --git a/SSL/src/Reports/СписокЗависшихЗадач/Forms/ФормаОтчета/Form.form b/SSL/src/Reports/СписокЗависшихЗадач/Forms/ФормаОтчета/Form.form new file mode 100644 index 000000000..35e14ecdd --- /dev/null +++ b/SSL/src/Reports/СписокЗависшихЗадач/Forms/ФормаОтчета/Form.form @@ -0,0 +1,710 @@ + + + + ГруппаВарианта + 1 + + НаименованиеТекущегоВарианта + 2 + true + true + + true + + + НаименованиеТекущегоВарианта + + Left + + НаименованиеТекущегоВариантаРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + НаименованиеТекущегоВариантаКонтекстноеМеню + 3 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ВыбратьВариантКнопка + 4 + true + true + + true + + false + + ВыбратьВариантКнопкаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + UsualButton + Form.StandardCommand.LoadVariant + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ГруппаВариантаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ОсновнаяКоманднаяПанель + 5 + + СформироватьОтчет + 6 + true + true + + true + + false + + СформироватьОтчетРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.StandardCommand.Generate + Auto + true + true + true + UserCmds + Auto + + + Настройка + 7 + true + true + + true + + false + + НастройкаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.StandardCommand.ReportSettings + Normal + Auto + true + true + UserCmds + Auto + + + ВыбратьНастройку + 8 + true + true + + true + + false + + ВыбратьНастройкуРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Form.StandardCommand.LoadReportSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьНастройку + 9 + true + true + + true + + false + + СохранитьНастройкуРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Form.StandardCommand.SaveReportSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СтандартнаяНастройка + 10 + true + true + + true + + false + + СтандартнаяНастройкаРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Form.StandardCommand.StandardSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + НовоеОкно + 11 + true + true + + true + + false + + НовоеОкноРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.StandardCommand.NewWindow + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИзменитьВариант + 12 + true + true + + true + + false + + ИзменитьВариантРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.StandardCommand.ChangeVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ВыбратьВариант + 13 + true + true + + true + + false + + ВыбратьВариантРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.StandardCommand.LoadVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьВариант + 14 + true + true + + true + + false + + СохранитьВариантРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.StandardCommand.SaveVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИзменитьФорму + 15 + true + true + + true + + false + + ИзменитьФормуРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Справка + 16 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + CommandBar + + Left + + + + ПользовательскиеНастройки + 17 + true + true + + true + + + Отчет.SettingsComposer.UserSettings + + false + None + HierarchicalList + List + Tree + None + + ПользовательскиеНастройкиКоманднаяПанель + 19 + Left + true + + + ПользовательскиеНастройкиСтрокаПоиска + 39 + + ПользовательскиеНастройкиСтрокаПоискаРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ПользовательскиеНастройкиСтрокаПоискаКонтекстноеМеню + 40 + true + + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиСостояниеПросмотра + 42 + + ПользовательскиеНастройкиСостояниеПросмотраРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ПользовательскиеНастройкиСостояниеПросмотраКонтекстноеМеню + 43 + true + + ViewStatusAddition + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиУправлениеПоиском + 45 + + ПользовательскиеНастройкиУправлениеПоискомРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ПользовательскиеНастройкиУправлениеПоискомКонтекстноеМеню + 46 + true + + SearchControlAddition + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ПользовательскиеНастройкиКонтекстноеМеню + 18 + true + + HierarchicalList + true + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + None + None + None + true + QuickAccess + Show + + + Результат + 20 + true + true + + true + + + Результат + + true + None + + РезультатРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + РезультатКонтекстноеМеню + 21 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + + DetailProcessing + РезультатОбработкаРасшифровки + + 100 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Always + Auto + true + true + true + + + None + false + + ФормаКоманднаяПанель + -1 + Left + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Отчет + 1 + + ReportObject.СписокЗависшихЗадач + + + true + + + true + +
    true
    +
    + + НаименованиеТекущегоВарианта + + <key>ru</key> + <value>Вариант отчета</value> + + 2 + + String + + + + true + + + true + + + + Результат + + <key>ru</key> + <value>Результат</value> + + 3 + + SpreadsheetDocument + + + true + + + true + + + + + ДанныеРасшифровки + 4 + + String + + + + true + + + true + + + + + + + + ShowOnComposition + Результат + ДанныеРасшифровки + НаименованиеТекущегоВарианта + +
    diff --git a/SSL/src/Reports/СписокЗависшихЗадач/Forms/ФормаОтчета/Module.bsl b/SSL/src/Reports/СписокЗависшихЗадач/Forms/ФормаОтчета/Module.bsl new file mode 100644 index 000000000..47092cdd7 --- /dev/null +++ b/SSL/src/Reports/СписокЗависшихЗадач/Forms/ФормаОтчета/Module.bsl @@ -0,0 +1,9 @@ + +&НаКлиенте +Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) + ЗначениеРасшифровки = Неопределено; + Если БизнесПроцессыИЗадачиСервер.ЭтоЗадачаИсполнителю(Расшифровка, ДанныеРасшифровки, ЗначениеРасшифровки) Тогда + СтандартнаяОбработка = НЕ БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(ЗначениеРасшифровки); + КонецЕсли; +КонецПроцедуры + diff --git a/SSL/src/Reports/СписокЗависшихЗадач/Help/ru.html b/SSL/src/Reports/СписокЗависшихЗадач/Help/ru.html new file mode 100644 index 000000000..9e32258f8 --- /dev/null +++ b/SSL/src/Reports/СписокЗависшихЗадач/Help/ru.html @@ -0,0 +1,8 @@ + +

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

    +

    Если установлен отбор по "Координатору выполнения задач", то в отчет будут выводиться только те задачи, которые назначены исполнителям в объектах адресации, за которые отвечает указанный Координатор выполнения задач.

    +

    Чтобы установить группировку списка зависших задач по объектам адресации, выберите вариант отчета "Зависшие задачи".

    +

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

    +

    Вариант отчета "Зависшие задачи по объектам адресации" позволяет посмотреть количество зависших задач в разрезе ролей исполнителей.

    +

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

    +

    Для детальной настройки отчета используйте команду "Все действия - Изменить вариант".

    \ No newline at end of file diff --git a/SSL/src/Reports/СписокЗависшихЗадач/ManagerModule.bsl b/SSL/src/Reports/СписокЗависшихЗадач/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Reports/СписокЗависшихЗадач/ObjectModule.bsl b/SSL/src/Reports/СписокЗависшихЗадач/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Reports/СписокЗависшихЗадач/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs b/SSL/src/Reports/СписокЗависшихЗадач/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs new file mode 100644 index 000000000..001810849 --- /dev/null +++ b/SSL/src/Reports/СписокЗависшихЗадач/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs @@ -0,0 +1,667 @@ + + + + ИсточникДанных1 + Local + + + ОсновнойНаборДанных + + Ссылка + Ссылка + + <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> + + + + Количество + Количество + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Количество</v8:content> + </v8:item> + + + + Автор + Автор + + ИсточникДанных1 + ВЫБРАТЬ РАЗЛИЧНЫЕ + Поручения.Ссылка, + Поручения.ОсновнойОбъектАдресации, + Поручения.ДополнительныйОбъектАдресации, + Поручения.РольИсполнителя, + Поручения.ПризнакНаличияИсполнителей, + Поручения.Автор КАК Автор, + Поручения.Количество +ИЗ + (ВЫБРАТЬ + Поручения.Координатор КАК Координатор, + Поручения.ОсновнойОбъектАдресации КАК ОсновнойОбъектАдресации, + Поручения.ДополнительныйОбъектАдресации КАК ДополнительныйОбъектАдресации, + Поручения.РольИсполнителя КАК РольИсполнителя, + Поручения.Автор КАК Автор, + Поручения.Ссылка КАК Ссылка, + Поручения.Количество КАК Количество, + Поручения.ПризнакНаличияИсполнителей КАК ПризнакНаличияИсполнителей + ИЗ + (ВЫБРАТЬ + ВЫБОР + КОГДА ИсполнителиПоручений2.Исполнитель ЕСТЬ НЕ NULL + И ИсполнителиПоручений2.Исполнитель <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + ТОГДА ИсполнителиПоручений2.Исполнитель + ИНАЧЕ ИсполнителиПоручений4.Исполнитель + КОНЕЦ КАК Координатор, + Поручения.ОсновнойОбъектАдресации КАК ОсновнойОбъектАдресации, + Поручения.ДополнительныйОбъектАдресации КАК ДополнительныйОбъектАдресации, + Поручения.РольИсполнителя КАК РольИсполнителя, + Поручения.Автор КАК Автор, + Поручения.Ссылка КАК Ссылка, + 1 КАК Количество, + ВЫБОР + КОГДА Поручения.Исполнитель = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + И ИсполнителиПоручений.Исполнитель ЕСТЬ NULL + ТОГДА 0 + ИНАЧЕ 1 + КОНЕЦ КАК ПризнакНаличияИсполнителей + ИЗ + Задача.ЗадачаИсполнителя КАК Поручения + ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсполнителиЗадач КАК ИсполнителиПоручений + ПО (ИсполнителиПоручений.РольИсполнителя = Поручения.РольИсполнителя) + И (ИсполнителиПоручений.ОсновнойОбъектАдресации = Поручения.ОсновнойОбъектАдресации) + И (ИсполнителиПоручений.ДополнительныйОбъектАдресации = Поручения.ДополнительныйОбъектАдресации) + ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсполнителиЗадач КАК ИсполнителиПоручений2 + ПО (ИсполнителиПоручений2.РольИсполнителя = ЗНАЧЕНИЕ(Справочник.РолиИсполнителей.ОтветственныйЗаКонтрольИсполнения)) + И (ИсполнителиПоручений2.ОсновнойОбъектАдресации = Поручения.ОсновнойОбъектАдресации) + ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсполнителиЗадач КАК ИсполнителиПоручений4 + ПО (ИсполнителиПоручений4.РольИсполнителя = ЗНАЧЕНИЕ(Справочник.РолиИсполнителей.ОтветственныйЗаКонтрольИсполнения)) + И (ИсполнителиПоручений4.ОсновнойОбъектАдресации = НЕОПРЕДЕЛЕНО) + ГДЕ + Поручения.Выполнена = ЛОЖЬ + И Поручения.ПометкаУдаления = ЛОЖЬ + + СГРУППИРОВАТЬ ПО + Поручения.Ссылка, + Поручения.Автор, + Поручения.ОсновнойОбъектАдресации, + Поручения.РольИсполнителя, + ИсполнителиПоручений.Исполнитель, + ИсполнителиПоручений2.Исполнитель, + ИсполнителиПоручений4.Исполнитель, + Поручения.ДополнительныйОбъектАдресации, + ВЫБОР + КОГДА Поручения.Исполнитель = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + И ИсполнителиПоручений.Исполнитель ЕСТЬ NULL + ТОГДА 0 + ИНАЧЕ 1 + КОНЕЦ) КАК Поручения + {ГДЕ + (&Координатор = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + ИЛИ &Координатор <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + И Поручения.Координатор = &Координатор)}) КАК Поручения + + + Количество + Сумма(Количество) + + + Координатор + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Координатор выполнения задач</v8:content> + </v8:item> + + + d4p1:CatalogRef.Пользователи + + Справочник.Пользователи.ПустаяСсылка + false + + + БыстрыйВыбор + true + + + + + ГруппироватьПоОбъектамАдресации + + + ru + Зависшие задачи по объектам адресации + + + + + + + Количество + + + + + ПризнакНаличияИсполнителей + Equal + 0 + Inaccessible + + + false + Автор + Equal + Справочник.Пользователи.ПустаяСсылка + 7da04b8a-5d82-4dc2-8ef2-bfdfbba3f062 + + + + + false + Координатор + Справочник.Пользователи.ПустаяСсылка + 64e2601b-16f3-4149-91a6-9022c43d561e + + + + + ОсновнойОбъектАдресации + Asc + + + ДополнительныйОбъектАдресации + Asc + + + РольИсполнителя + Asc + + + + + ВыводитьЗаголовок + DontOutput + + + Заголовок + Зависшие задачи по объектам адресации + + + ВыводитьПараметрыДанных + DontOutput + + + ВыводитьОтбор + DontOutput + + + + + + + ОсновнойОбъектАдресации + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + ДополнительныйОбъектАдресации + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + ОсновнойОбъектАдресации + + + ДополнительныйОбъектАдресации + + + Количество + + + + + + РольИсполнителя + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + РольИсполнителя + + + + + + + + + + + + ГруппироватьПоРолям + + + ru + Зависшие задачи по ролям + + + + + + + + + ПризнакНаличияИсполнителей + Equal + 0 + Inaccessible + + + + + Координатор + Справочник.Пользователи.ПустаяСсылка + 06ff3cc9-3c4a-48c8-80f4-8a9bb885d31d + Координатор + + + + + РольИсполнителя + Asc + + + ОсновнойОбъектАдресации + Asc + + + ДополнительныйОбъектАдресации + Asc + + + + + ВыводитьЗаголовок + DontOutput + + + Заголовок + Зависшие задачи по ролям + + + ВыводитьПараметрыДанных + DontOutput + + + ВыводитьОтбор + DontOutput + + + + + + + РольИсполнителя + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + РольИсполнителя + + + Количество + + + + + + ОсновнойОбъектАдресации + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + ДополнительныйОбъектАдресации + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + Ссылка + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + ОсновнойОбъектАдресации + + + ДополнительныйОбъектАдресации + + + Ссылка + + + + + + + + + + + + ЗависшиеЗадачи + + + ru + Зависшие задачи + + + + + + + + + ПризнакНаличияИсполнителей + Equal + 0 + Inaccessible + + + + + Координатор + Справочник.Пользователи.ПустаяСсылка + 37d72304-c3f4-4a5e-8be7-73a94849ed04 + Координатор + + + + + ОсновнойОбъектАдресации + Asc + + + ДополнительныйОбъектАдресации + Asc + + + РольИсполнителя + Asc + + + + + ВыводитьЗаголовок + DontOutput + + + Заголовок + Зависшие задачи + + + ВыводитьПараметрыДанных + DontOutput + + + ВыводитьОтбор + DontOutput + + + + + + + ОсновнойОбъектАдресации + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + ДополнительныйОбъектАдресации + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + ОсновнойОбъектАдресации + + + ДополнительныйОбъектАдресации + + + Количество + + + + + + + + + Ссылка + + + + + + + + + + + + ИстекКрайнийСрокЗадач + + + ru + Просроченные задачи + + + + + + + Количество + + + + + OrGroup + + Ссылка.СрокИсполнения + Less + + BeginningOfThisDay + + Inaccessible + + + ПризнакНаличияИсполнителей + Equal + 0 + Inaccessible + + Inaccessible + + + + + Координатор + Справочник.Пользователи.ПустаяСсылка + 7bf58fb5-9cae-4276-ad35-85ad1cdc8921 + Координатор + + + + + ОсновнойОбъектАдресации + Asc + + + ДополнительныйОбъектАдресации + Asc + + + РольИсполнителя + Asc + + + + + + + Ссылка + + + + + ПризнакНаличияИсполнителей + Equal + 0 + + + + + ЦветТекста + style:SpecialTextColor + + + 8f0025cd-eb21-4541-81ac-0c30842ca2cf + Выделять задачи без назначенных исполнителей + + + + + ВыводитьЗаголовок + DontOutput + + + Заголовок + Просроченные задачи + + + ВыводитьПараметрыДанных + DontOutput + + + ВыводитьОтбор + DontOutput + + + + + + + ОсновнойОбъектАдресации + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + ДополнительныйОбъектАдресации + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + ОсновнойОбъектАдресации + + + ДополнительныйОбъектАдресации + + + Количество + + + + + + + + + Ссылка + + + + + + + + + + + \ No newline at end of file diff --git a/SSL/src/Reports/СписокЗависшихЗадач/СписокЗависшихЗадач.mdo b/SSL/src/Reports/СписокЗависшихЗадач/СписокЗависшихЗадач.mdo new file mode 100644 index 000000000..57ac0bebc --- /dev/null +++ b/SSL/src/Reports/СписокЗависшихЗадач/СписокЗависшихЗадач.mdo @@ -0,0 +1,38 @@ + + + + + + + СписокЗависшихЗадач + + ru + Список зависших задач + + true + Report.СписокЗависшихЗадач.Form.ФормаОтчета + Report.СписокЗависшихЗадач.Template.ОсновнаяСхемаКомпоновкиДанных + SettingsStorage.ХранилищеВариантовОтчетов + + + ru + + + + ФормаОтчета + + ru + Форма отчета + + PersonalComputer + MobileDevice + + + ОсновнаяСхемаКомпоновкиДанных + + ru + Основная схема компоновки данных + + DataCompositionSchema + + diff --git a/SSL/src/Reports/СписокИстекающихЗадач/Forms/ФормаОтчета/Form.form b/SSL/src/Reports/СписокИстекающихЗадач/Forms/ФормаОтчета/Form.form new file mode 100644 index 000000000..e36340001 --- /dev/null +++ b/SSL/src/Reports/СписокИстекающихЗадач/Forms/ФормаОтчета/Form.form @@ -0,0 +1,710 @@ + + + + ГруппаВарианта + 1 + + НаименованиеТекущегоВарианта + 2 + true + true + + true + + + НаименованиеТекущегоВарианта + + Left + + НаименованиеТекущегоВариантаРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + НаименованиеТекущегоВариантаКонтекстноеМеню + 3 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ВыбратьВариантКнопка + 4 + true + true + + true + + false + + ВыбратьВариантКнопкаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + UsualButton + Form.StandardCommand.LoadVariant + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ГруппаВариантаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ОсновнаяКоманднаяПанель + 5 + + СформироватьОтчет + 6 + true + true + + true + + false + + СформироватьОтчетРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.StandardCommand.Generate + Auto + true + true + true + UserCmds + Auto + + + Настройка + 7 + true + true + + true + + false + + НастройкаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.StandardCommand.ReportSettings + Normal + Auto + true + true + UserCmds + Auto + + + ВыбратьНастройку + 8 + true + true + + true + + false + + ВыбратьНастройкуРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Form.StandardCommand.LoadReportSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьНастройку + 9 + true + true + + true + + false + + СохранитьНастройкуРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Form.StandardCommand.SaveReportSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СтандартнаяНастройка + 10 + true + true + + true + + false + + СтандартнаяНастройкаРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Form.StandardCommand.StandardSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + НовоеОкно + 11 + true + true + + true + + false + + НовоеОкноРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.StandardCommand.NewWindow + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИзменитьВариант + 12 + true + true + + true + + false + + ИзменитьВариантРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.StandardCommand.ChangeVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ВыбратьВариант + 13 + true + true + + true + + false + + ВыбратьВариантРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.StandardCommand.LoadVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьВариант + 14 + true + true + + true + + false + + СохранитьВариантРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.StandardCommand.SaveVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИзменитьФорму + 15 + true + true + + true + + false + + ИзменитьФормуРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Справка + 16 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + CommandBar + + Left + + + + ПользовательскиеНастройки + 17 + true + true + + true + + + Отчет.SettingsComposer.UserSettings + + false + None + HierarchicalList + List + Tree + None + + ПользовательскиеНастройкиКоманднаяПанель + 19 + Left + true + + + ПользовательскиеНастройкиСтрокаПоиска + 39 + + ПользовательскиеНастройкиСтрокаПоискаРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ПользовательскиеНастройкиСтрокаПоискаКонтекстноеМеню + 40 + true + + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиСостояниеПросмотра + 42 + + ПользовательскиеНастройкиСостояниеПросмотраРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ПользовательскиеНастройкиСостояниеПросмотраКонтекстноеМеню + 43 + true + + ViewStatusAddition + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиУправлениеПоиском + 45 + + ПользовательскиеНастройкиУправлениеПоискомРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ПользовательскиеНастройкиУправлениеПоискомКонтекстноеМеню + 46 + true + + SearchControlAddition + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ПользовательскиеНастройкиКонтекстноеМеню + 18 + true + + HierarchicalList + true + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + None + None + None + true + QuickAccess + Show + + + Результат + 20 + true + true + + true + + + Результат + + true + None + + РезультатРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + РезультатКонтекстноеМеню + 21 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + + DetailProcessing + РезультатОбработкаРасшифровки + + 100 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Always + Auto + true + true + true + + + None + false + + ФормаКоманднаяПанель + -1 + Left + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Отчет + 1 + + ReportObject.СписокИстекающихЗадач + + + true + + + true + +
    true
    +
    + + НаименованиеТекущегоВарианта + + <key>ru</key> + <value>Вариант отчета</value> + + 2 + + String + + + + true + + + true + + + + Результат + + <key>ru</key> + <value>Результат</value> + + 3 + + SpreadsheetDocument + + + true + + + true + + + + + ДанныеРасшифровки + 4 + + String + + + + true + + + true + + + + + + + + ShowOnComposition + Результат + ДанныеРасшифровки + НаименованиеТекущегоВарианта + +
    diff --git a/SSL/src/Reports/СписокИстекающихЗадач/Forms/ФормаОтчета/Module.bsl b/SSL/src/Reports/СписокИстекающихЗадач/Forms/ФормаОтчета/Module.bsl new file mode 100644 index 000000000..47092cdd7 --- /dev/null +++ b/SSL/src/Reports/СписокИстекающихЗадач/Forms/ФормаОтчета/Module.bsl @@ -0,0 +1,9 @@ + +&НаКлиенте +Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) + ЗначениеРасшифровки = Неопределено; + Если БизнесПроцессыИЗадачиСервер.ЭтоЗадачаИсполнителю(Расшифровка, ДанныеРасшифровки, ЗначениеРасшифровки) Тогда + СтандартнаяОбработка = НЕ БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(ЗначениеРасшифровки); + КонецЕсли; +КонецПроцедуры + diff --git a/SSL/src/Reports/СписокИстекающихЗадач/Help/ru.html b/SSL/src/Reports/СписокИстекающихЗадач/Help/ru.html new file mode 100644 index 000000000..5ba1d16fd --- /dev/null +++ b/SSL/src/Reports/СписокИстекающихЗадач/Help/ru.html @@ -0,0 +1,3 @@ + +

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

    +

    Для детальной настройки отчета используйте команду "Все действия - Изменить вариант".

    \ No newline at end of file diff --git a/SSL/src/Reports/СписокИстекающихЗадач/ManagerModule.bsl b/SSL/src/Reports/СписокИстекающихЗадач/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Reports/СписокИстекающихЗадач/ObjectModule.bsl b/SSL/src/Reports/СписокИстекающихЗадач/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Reports/СписокИстекающихЗадач/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs b/SSL/src/Reports/СписокИстекающихЗадач/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs new file mode 100644 index 000000000..7905f08c3 --- /dev/null +++ b/SSL/src/Reports/СписокИстекающихЗадач/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs @@ -0,0 +1,173 @@ + + + + ИсточникДанных1 + Local + + + СписокЗадач + + Важность + Важность + + + СрокИсполнения + СрокИсполнения + + + Задача + Задача + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Задача</v8:content> + </v8:item> + + + + ВсегоЗадач + ВсегоЗадач + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Задач</v8:content> + </v8:item> + + + + Исполнитель + Исполнитель + + + Автор + Автор + + ИсточникДанных1 + ВЫБРАТЬ РАЗРЕШЕННЫЕ + Задачи.Ссылка КАК Задача, + Задачи.Исполнитель КАК Исполнитель, + Задачи.Важность, + 1 КАК ВсегоЗадач, + Задачи.СрокИсполнения, + Задачи.Автор КАК Автор +ИЗ + Задача.ЗадачаИсполнителя КАК Задачи +ГДЕ + Задачи.Выполнена = ЛОЖЬ + И Задачи.ПометкаУдаления = ЛОЖЬ +{ГДЕ + Задачи.СрокИсполнения <= &ДатаИсполнения} + + + + ВсегоЗадач + Сумма(ВсегоЗадач) + + + ДатаИсполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Крайний срок</v8:content> + </v8:item> + + + xs:dateTime + + DateTime + + + 0001-01-01T00:00:00 + false + + + Основной + Основной + + + + Исполнитель + + + Задача + + + Важность + + + СрокИсполнения + + + ВсегоЗадач + + + + + false + Автор + Equal + Справочник.Пользователи.ПустаяСсылка + 74ca9c09-914b-455b-a776-17f859429be1 + + + false + Важность + Equal + Перечисление.ВариантыВажностиЗадачи.ПустаяСсылка + 0d7d0056-d056-4ac9-b236-7c9f90d1fbc0 + + + + + ДатаИсполнения + + BeginningOfNextWeek + + 80282384-41f1-4d0e-820e-bf9e5009a254 + + + + + ВертикальноеРасположениеОбщихИтогов + Begin + + + ВыводитьЗаголовок + DontOutput + + + Заголовок + Задачи, истекающие на дату + + + ВыводитьПараметрыДанных + DontOutput + + + ВыводитьОтбор + DontOutput + + + + + + Исполнитель + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + SystemFields.SerialNumber + + + + + + + \ No newline at end of file diff --git a/SSL/src/Reports/СписокИстекающихЗадач/СписокИстекающихЗадач.mdo b/SSL/src/Reports/СписокИстекающихЗадач/СписокИстекающихЗадач.mdo new file mode 100644 index 000000000..24df96779 --- /dev/null +++ b/SSL/src/Reports/СписокИстекающихЗадач/СписокИстекающихЗадач.mdo @@ -0,0 +1,39 @@ + + + + + + + СписокИстекающихЗадач + + ru + Список задач, истекающих на дату + + true + Report.СписокИстекающихЗадач.Form.ФормаОтчета + Report.СписокИстекающихЗадач.Template.ОсновнаяСхемаКомпоновкиДанных + SettingsStorage.ХранилищеВариантовОтчетов + true + + + ru + + + + ФормаОтчета + + ru + Форма отчета + + PersonalComputer + MobileDevice + + + ОсновнаяСхемаКомпоновкиДанных + + ru + Основная схема компоновки данных + + DataCompositionSchema + + diff --git a/SSL/src/Reports/СписокПросроченныхЗадач/Forms/ФормаОтчета/Form.form b/SSL/src/Reports/СписокПросроченныхЗадач/Forms/ФормаОтчета/Form.form new file mode 100644 index 000000000..5bbd5166b --- /dev/null +++ b/SSL/src/Reports/СписокПросроченныхЗадач/Forms/ФормаОтчета/Form.form @@ -0,0 +1,710 @@ + + + + ГруппаВарианта + 1 + + НаименованиеТекущегоВарианта + 2 + true + true + + true + + + НаименованиеТекущегоВарианта + + Left + + НаименованиеТекущегоВариантаРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + НаименованиеТекущегоВариантаКонтекстноеМеню + 3 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ВыбратьВариантКнопка + 4 + true + true + + true + + false + + ВыбратьВариантКнопкаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + UsualButton + Form.StandardCommand.LoadVariant + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ГруппаВариантаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ОсновнаяКоманднаяПанель + 5 + + СформироватьОтчет + 6 + true + true + + true + + false + + СформироватьОтчетРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.StandardCommand.Generate + Auto + true + true + true + UserCmds + Auto + + + Настройка + 7 + true + true + + true + + false + + НастройкаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.StandardCommand.ReportSettings + Normal + Auto + true + true + UserCmds + Auto + + + ВыбратьНастройку + 8 + true + true + + true + + false + + ВыбратьНастройкуРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Form.StandardCommand.LoadReportSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьНастройку + 9 + true + true + + true + + false + + СохранитьНастройкуРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Form.StandardCommand.SaveReportSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СтандартнаяНастройка + 10 + true + true + + true + + false + + СтандартнаяНастройкаРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Form.StandardCommand.StandardSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + НовоеОкно + 11 + true + true + + true + + false + + НовоеОкноРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.StandardCommand.NewWindow + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИзменитьВариант + 12 + true + true + + true + + false + + ИзменитьВариантРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.StandardCommand.ChangeVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ВыбратьВариант + 13 + true + true + + true + + false + + ВыбратьВариантРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.StandardCommand.LoadVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьВариант + 14 + true + true + + true + + false + + СохранитьВариантРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.StandardCommand.SaveVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИзменитьФорму + 15 + true + true + + true + + false + + ИзменитьФормуРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Справка + 16 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + CommandBar + + Left + + + + ПользовательскиеНастройки + 17 + true + true + + true + + + Отчет.SettingsComposer.UserSettings + + false + None + HierarchicalList + List + Tree + None + + ПользовательскиеНастройкиКоманднаяПанель + 19 + Left + true + + + ПользовательскиеНастройкиСтрокаПоиска + 39 + + ПользовательскиеНастройкиСтрокаПоискаРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ПользовательскиеНастройкиСтрокаПоискаКонтекстноеМеню + 40 + true + + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиСостояниеПросмотра + 42 + + ПользовательскиеНастройкиСостояниеПросмотраРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ПользовательскиеНастройкиСостояниеПросмотраКонтекстноеМеню + 43 + true + + ViewStatusAddition + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиУправлениеПоиском + 45 + + ПользовательскиеНастройкиУправлениеПоискомРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ПользовательскиеНастройкиУправлениеПоискомКонтекстноеМеню + 46 + true + + SearchControlAddition + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ПользовательскиеНастройкиКонтекстноеМеню + 18 + true + + HierarchicalList + true + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + None + None + None + true + QuickAccess + Show + + + Результат + 20 + true + true + + true + + + Результат + + true + None + + РезультатРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + РезультатКонтекстноеМеню + 21 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + + DetailProcessing + РезультатОбработкаРасшифровки + + 100 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Always + Auto + true + true + true + + + None + false + + ФормаКоманднаяПанель + -1 + Left + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Отчет + 1 + + ReportObject.СписокПросроченныхЗадач + + + true + + + true + +
    true
    +
    + + НаименованиеТекущегоВарианта + + <key>ru</key> + <value>Вариант отчета</value> + + 2 + + String + + + + true + + + true + + + + Результат + + <key>ru</key> + <value>Результат</value> + + 3 + + SpreadsheetDocument + + + true + + + true + + + + + ДанныеРасшифровки + 4 + + String + + + + true + + + true + + + + + + + + ShowOnComposition + Результат + ДанныеРасшифровки + НаименованиеТекущегоВарианта + +
    diff --git a/SSL/src/Reports/СписокПросроченныхЗадач/Forms/ФормаОтчета/Module.bsl b/SSL/src/Reports/СписокПросроченныхЗадач/Forms/ФормаОтчета/Module.bsl new file mode 100644 index 000000000..47092cdd7 --- /dev/null +++ b/SSL/src/Reports/СписокПросроченныхЗадач/Forms/ФормаОтчета/Module.bsl @@ -0,0 +1,9 @@ + +&НаКлиенте +Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) + ЗначениеРасшифровки = Неопределено; + Если БизнесПроцессыИЗадачиСервер.ЭтоЗадачаИсполнителю(Расшифровка, ДанныеРасшифровки, ЗначениеРасшифровки) Тогда + СтандартнаяОбработка = НЕ БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(ЗначениеРасшифровки); + КонецЕсли; +КонецПроцедуры + diff --git a/SSL/src/Reports/СписокПросроченныхЗадач/Help/ru.html b/SSL/src/Reports/СписокПросроченныхЗадач/Help/ru.html new file mode 100644 index 000000000..6a10057f3 --- /dev/null +++ b/SSL/src/Reports/СписокПросроченныхЗадач/Help/ru.html @@ -0,0 +1,3 @@ + +

    Для формирования отчета нажмите кнопку "Сформировать". По умолчанию в отчет попадут все задачи за текущий месяц с истекшим сроком исполнения.

    +

    Для детальной настройки отчета используйте команду "Все действия - Изменить вариант".

    \ No newline at end of file diff --git a/SSL/src/Reports/СписокПросроченныхЗадач/ManagerModule.bsl b/SSL/src/Reports/СписокПросроченныхЗадач/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Reports/СписокПросроченныхЗадач/ObjectModule.bsl b/SSL/src/Reports/СписокПросроченныхЗадач/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Reports/СписокПросроченныхЗадач/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs b/SSL/src/Reports/СписокПросроченныхЗадач/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs new file mode 100644 index 000000000..183f5022d --- /dev/null +++ b/SSL/src/Reports/СписокПросроченныхЗадач/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs @@ -0,0 +1,250 @@ + + + + ИсточникДанных1 + Local + + + СписокЗадач + + Важность + Важность + + + СрокИсполнения + СрокИсполнения + + <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> + + + + НеВСрок + НеВСрок + + <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> + + + + ВсегоЗадач + ВсегоЗадач + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Всего задач</v8:content> + </v8:item> + + + + ПросроченоДней + ПросроченоДней + + + Автор + Автор + + + ДатаЗадачи + ДатаЗадачи + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Дата задачи</v8:content> + </v8:item> + + + ИсточникДанных1 + ВЫБРАТЬ РАЗРЕШЕННЫЕ + Задачи.Ссылка КАК Задача, + Задачи.Ссылка КАК ВсегоЗадач, + Задачи.Дата КАК ДатаЗадачи, + Задачи.Автор КАК Автор, + Задачи.Исполнитель КАК Исполнитель, + Задачи.Важность, + ВЫБОР + КОГДА Задачи.Выполнена + И НАЧАЛОПЕРИОДА(Задачи.ДатаИсполнения, ДЕНЬ) > Задачи.СрокИсполнения + И ГОД(Задачи.СрокИсполнения) > 1 + ТОГДА 1 + ИНАЧЕ 0 + КОНЕЦ КАК НеВСрок, + Задачи.СрокИсполнения, + РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Задачи.СрокИсполнения, ДЕНЬ), Задачи.ДатаИсполнения, ДЕНЬ) КАК ПросроченоДней, + Задачи.ДатаИсполнения +ИЗ + Задача.ЗадачаИсполнителя КАК Задачи +ГДЕ + Задачи.Выполнена = ИСТИНА + + + НеВСрок + Сумма(НеВСрок) + + + ВсегоЗадач + Количество(ВсегоЗадач) + + + ЗадачиВыполненныеСНарушениемСроков + + + ru + Задачи, выполненные с нарушением сроков + + + + + + Исполнитель + + + Задача + + + Важность + + + СрокИсполнения + + + ДатаИсполнения + + + ПросроченоДней + + + + + false + Автор + Equal + Справочник.Пользователи.ПустаяСсылка + ae24a270-ba28-4bd4-ba5f-36804851339e + + + ДатаЗадачи + GreaterOrEqual + + BeginningOfThisWeek + + 5427796f-bad4-4e42-a4da-85b6ed3eab36 + Дата начала + + + ДатаЗадачи + LessOrEqual + + BeginningOfThisDay + + 4487cfa3-fd3c-478f-b3ed-54af1134ad0a + Дата окончания + + + + + ВыводитьЗаголовок + DontOutput + + + Заголовок + Задачи, выполненные с нарушением сроков + + + ВыводитьПараметрыДанных + DontOutput + + + ВыводитьОтбор + DontOutput + + + + + + + Исполнитель + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + НеВСрок + + + + + + НеВСрок + Equal + 1 + + + + + Важность + Desc + + + ПросроченоДней + Desc + + + СрокИсполнения + Asc + + + + + + false + НеВСрок + + + + + ВыводитьОтбор + DontOutput + + + + + + + + \ No newline at end of file diff --git a/SSL/src/Reports/СписокПросроченныхЗадач/СписокПросроченныхЗадач.mdo b/SSL/src/Reports/СписокПросроченныхЗадач/СписокПросроченныхЗадач.mdo new file mode 100644 index 000000000..c9ba42d7e --- /dev/null +++ b/SSL/src/Reports/СписокПросроченныхЗадач/СписокПросроченныхЗадач.mdo @@ -0,0 +1,39 @@ + + + + + + + СписокПросроченныхЗадач + + ru + Список просроченных задач + + true + Report.СписокПросроченныхЗадач.Form.ФормаОтчета + Report.СписокПросроченныхЗадач.Template.ОсновнаяСхемаКомпоновкиДанных + SettingsStorage.ХранилищеВариантовОтчетов + true + + + ru + + + + ФормаОтчета + + ru + Форма отчета + + PersonalComputer + MobileDevice + + + ОсновнаяСхемаКомпоновкиДанных + + ru + Основная схема компоновки данных + + DataCompositionSchema + + diff --git a/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Forms/ФормаОтчета/Form.form b/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Forms/ФормаОтчета/Form.form new file mode 100644 index 000000000..a63c95d75 --- /dev/null +++ b/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Forms/ФормаОтчета/Form.form @@ -0,0 +1,710 @@ + + + + ГруппаВарианта + 1 + + НаименованиеТекущегоВарианта + 2 + true + true + + true + + + НаименованиеТекущегоВарианта + + Left + + НаименованиеТекущегоВариантаРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + НаименованиеТекущегоВариантаКонтекстноеМеню + 3 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ВыбратьВариантКнопка + 4 + true + true + + true + + false + + ВыбратьВариантКнопкаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + UsualButton + Form.StandardCommand.LoadVariant + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ГруппаВариантаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ОсновнаяКоманднаяПанель + 5 + + СформироватьОтчет + 6 + true + true + + true + + false + + СформироватьОтчетРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.StandardCommand.Generate + Auto + true + true + true + UserCmds + Auto + + + Настройка + 7 + true + true + + true + + false + + НастройкаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.StandardCommand.ReportSettings + Normal + Auto + true + true + UserCmds + Auto + + + ВыбратьНастройку + 8 + true + true + + true + + false + + ВыбратьНастройкуРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Form.StandardCommand.LoadReportSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьНастройку + 9 + true + true + + true + + false + + СохранитьНастройкуРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Form.StandardCommand.SaveReportSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СтандартнаяНастройка + 10 + true + true + + true + + false + + СтандартнаяНастройкаРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Form.StandardCommand.StandardSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + НовоеОкно + 11 + true + true + + true + + false + + НовоеОкноРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.StandardCommand.NewWindow + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИзменитьВариант + 12 + true + true + + true + + false + + ИзменитьВариантРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Form.StandardCommand.ChangeVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ВыбратьВариант + 13 + true + true + + true + + false + + ВыбратьВариантРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.StandardCommand.LoadVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьВариант + 14 + true + true + + true + + false + + СохранитьВариантРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Form.StandardCommand.SaveVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИзменитьФорму + 15 + true + true + + true + + false + + ИзменитьФормуРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Справка + 16 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + CommandBar + + Left + + + + ПользовательскиеНастройки + 17 + true + true + + true + + + Отчет.SettingsComposer.UserSettings + + false + None + HierarchicalList + List + Tree + None + + ПользовательскиеНастройкиКоманднаяПанель + 19 + Left + true + + + ПользовательскиеНастройкиСтрокаПоиска + 39 + + ПользовательскиеНастройкиСтрокаПоискаРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ПользовательскиеНастройкиСтрокаПоискаКонтекстноеМеню + 40 + true + + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиСостояниеПросмотра + 42 + + ПользовательскиеНастройкиСостояниеПросмотраРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ПользовательскиеНастройкиСостояниеПросмотраКонтекстноеМеню + 43 + true + + ViewStatusAddition + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиУправлениеПоиском + 45 + + ПользовательскиеНастройкиУправлениеПоискомРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ПользовательскиеНастройкиУправлениеПоискомКонтекстноеМеню + 46 + true + + SearchControlAddition + ПользовательскиеНастройки + + true + + + + ПользовательскиеНастройкиРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ПользовательскиеНастройкиКонтекстноеМеню + 18 + true + + HierarchicalList + true + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + None + None + None + true + QuickAccess + Show + + + Результат + 20 + true + true + + true + + + Результат + + true + None + + РезультатРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + РезультатКонтекстноеМеню + 21 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + + DetailProcessing + РезультатОбработкаРасшифровки + + 100 + true + 10 + true + true + true + Special + ScrollAlways + ScrollAlways + Always + Auto + true + true + true + + + None + false + + ФормаКоманднаяПанель + -1 + Left + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Отчет + 1 + + ReportObject.СправкаОбИсполнительскойДисциплине + + + true + + + true + +
    true
    +
    + + НаименованиеТекущегоВарианта + + <key>ru</key> + <value>Вариант отчета</value> + + 2 + + String + + + + true + + + true + + + + Результат + + <key>ru</key> + <value>Результат</value> + + 3 + + SpreadsheetDocument + + + true + + + true + + + + + ДанныеРасшифровки + 4 + + String + + + + true + + + true + + + + + + + + ShowOnComposition + Результат + ДанныеРасшифровки + НаименованиеТекущегоВарианта + +
    diff --git a/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Forms/ФормаОтчета/Module.bsl b/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Forms/ФормаОтчета/Module.bsl new file mode 100644 index 000000000..47092cdd7 --- /dev/null +++ b/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Forms/ФормаОтчета/Module.bsl @@ -0,0 +1,9 @@ + +&НаКлиенте +Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) + ЗначениеРасшифровки = Неопределено; + Если БизнесПроцессыИЗадачиСервер.ЭтоЗадачаИсполнителю(Расшифровка, ДанныеРасшифровки, ЗначениеРасшифровки) Тогда + СтандартнаяОбработка = НЕ БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(ЗначениеРасшифровки); + КонецЕсли; +КонецПроцедуры + diff --git a/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Help/ru.html b/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Help/ru.html new file mode 100644 index 000000000..4f706da7c --- /dev/null +++ b/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Help/ru.html @@ -0,0 +1,3 @@ + +

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

    +

    Для детальной настройки отчета используйте команду "Все действия - Изменить вариант".

    \ No newline at end of file diff --git a/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/ManagerModule.bsl b/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/ObjectModule.bsl b/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs b/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs new file mode 100644 index 000000000..d962161cc --- /dev/null +++ b/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs @@ -0,0 +1,341 @@ + + + + ИсточникДанных1 + Local + + + Задачи + + Выполнено + Выполнено + + <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> + + + + НеВСрок + НеВСрок + + <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> + + + + Количество + Количество + + <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> + + + + Выполняются + Выполняются + + <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> + + + + Автор + Автор + + + ДатаСозданияЗадачи + ДатаСозданияЗадачи + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Дата создания задачи</v8:content> + </v8:item> + + + ИсточникДанных1 + ВЫБРАТЬ РАЗРЕШЕННЫЕ + СУММА(ВЫБОР + КОГДА Задачи.Выполнена + И (Задачи.СрокИсполнения >= Задачи.ДатаИсполнения ИЛИ Задачи.СрокИсполнения = "00010101") + ТОГДА 1 + ИНАЧЕ 0 + КОНЕЦ) КАК ВСрок, + СУММА(ВЫБОР + КОГДА Задачи.Выполнена + И Задачи.СрокИсполнения < Задачи.ДатаИсполнения И Задачи.СрокИсполнения <> "00010101" + ТОГДА 1 + ИНАЧЕ 0 + КОНЕЦ) КАК НеВСрок, + СУММА(ВЫБОР + КОГДА Задачи.Выполнена + ТОГДА 1 + ИНАЧЕ 0 + КОНЕЦ) КАК Выполнено, + СУММА(ВЫБОР + КОГДА (НЕ Задачи.Выполнена) + ТОГДА 1 + ИНАЧЕ 0 + КОНЕЦ) КАК НеВыполнено, + СУММА(ВЫБОР + КОГДА НЕ Задачи.Выполнена + И (Задачи.СрокИсполнения >= &КрайнийСрок ИЛИ Задачи.СрокИсполнения = "00010101") + ТОГДА 1 + ИНАЧЕ 0 + КОНЕЦ) КАК Выполняются, + СУММА(ВЫБОР + КОГДА НЕ Задачи.Выполнена + И Задачи.СрокИсполнения < &КрайнийСрок И Задачи.СрокИсполнения <> "00010101" + ТОГДА 1 + ИНАЧЕ 0 + КОНЕЦ) КАК Просроченные, + Задачи.Исполнитель КАК Исполнитель, + Задачи.Автор КАК Автор, + Задачи.Дата КАК ДатаСозданияЗадачи, + КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Задачи.Ссылка) КАК Количество +ИЗ + Задача.ЗадачаИсполнителя КАК Задачи + +СГРУППИРОВАТЬ ПО + Задачи.Автор, + Задачи.Дата, + Задачи.Исполнитель + + + ВСрок + Сумма(ВСрок) + + + Выполнено + Сумма(Выполнено) + + + Количество + Сумма(Количество) + + + НеВСрок + Сумма(НеВСрок) + + + НеВыполнено + Сумма(НеВыполнено) + + + Выполняются + Сумма(Выполняются) + + + Просроченные + Сумма(Просроченные) + + + КрайнийСрок + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Крайний срок</v8:content> + </v8:item> + + + xs:dateTime + + DateTime + + + 0001-01-01T00:00:00 + false + + + ПоИсполнителям + + + ru + По исполнителям + + + + + + Исполнитель + + + Количество + + + Выполнено + + Выполнено + Всего + + + ВСрок + В срок + + + НеВСрок + Не в срок + + Auto + + + Не выполнено + + НеВыполнено + Всего + + + false + Выполняются + Из них в срок + + + Просроченные + Просрочено + + Auto + + Normal + + + + false + Автор + Equal + Справочник.Пользователи.ПустаяСсылка + 266006ea-d93b-4c66-80b4-1c4351ee3bc9 + + + ДатаСозданияЗадачи + GreaterOrEqual + + BeginningOfThisWeek + + 5c622f5e-03f3-49ab-b2d3-7019ad10b0da + Дата начала + + + ДатаСозданияЗадачи + LessOrEqual + + BeginningOfNextDay + + 3f6f709f-45c8-4c94-bbb2-30c025ac53bc + Дата окончания + + Normal + 8232bbf8-4f3f-4d3a-8b46-5819419fe7c7 + + + + КрайнийСрок + + Custom + 0001-01-01T00:00:00 + + ffa23fbd-3518-4a34-8ef1-742af4f2471f + + + + + НеВыполнено + Desc + + Normal + + + Normal + + + + ВертикальноеРасположениеОбщихИтогов + BeginAndEnd + + + ВыводитьЗаголовок + DontOutput + + + Заголовок + Справка об исполнительской дисциплине + + + ВыводитьПараметрыДанных + DontOutput + + + ВыводитьОтбор + DontOutput + + + + + + Исполнитель + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + SystemFields.SerialNumber + + + + + Normal + + + \ No newline at end of file diff --git a/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/СправкаОбИсполнительскойДисциплине.mdo b/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/СправкаОбИсполнительскойДисциплине.mdo new file mode 100644 index 000000000..5a442e335 --- /dev/null +++ b/SSL/src/Reports/СправкаОбИсполнительскойДисциплине/СправкаОбИсполнительскойДисциплине.mdo @@ -0,0 +1,39 @@ + + + + + + + СправкаОбИсполнительскойДисциплине + + ru + Справка об исполнительской дисциплине + + true + Report.СправкаОбИсполнительскойДисциплине.Form.ФормаОтчета + Report.СправкаОбИсполнительскойДисциплине.Template.ОсновнаяСхемаКомпоновкиДанных + SettingsStorage.ХранилищеВариантовОтчетов + true + + + ru + + + + ФормаОтчета + + ru + Форма отчета + + PersonalComputer + MobileDevice + + + ОсновнаяСхемаКомпоновкиДанных + + ru + Основная схема компоновки данных + + DataCompositionSchema + + diff --git a/SSL/src/Roles/Администрирование/Rights.rights b/SSL/src/Roles/Администрирование/Rights.rights new file mode 100644 index 000000000..2e37e94c1 --- /dev/null +++ b/SSL/src/Roles/Администрирование/Rights.rights @@ -0,0 +1,57 @@ + + + false + false + true + + Configuration.БиблиотекаСтандартныхПодсистем + + Administration + true + + + DataAdministration + true + + + ActiveUsers + true + + + TechnicalSpecialistMode + true + + + MainWindowModeNormal + true + + + MainWindowModeWorkplace + true + + + MainWindowModeEmbeddedWorkplace + true + + + MainWindowModeFullscreenWorkplace + true + + + MainWindowModeKiosk + true + + + AnalyticsSystemClient + true + + + ExclusiveModeTerminationAtSessionStart + true + + + SaveUserData + true + + + diff --git a/SSL/src/Roles/Администрирование/Администрирование.mdo b/SSL/src/Roles/Администрирование/Администрирование.mdo new file mode 100644 index 000000000..fc7efb129 --- /dev/null +++ b/SSL/src/Roles/Администрирование/Администрирование.mdo @@ -0,0 +1,8 @@ + + + Администрирование + + ru + Администрирование + + diff --git a/SSL/src/Roles/БазовыеПрава/Rights.rights b/SSL/src/Roles/БазовыеПрава/Rights.rights new file mode 100644 index 000000000..77adb2bed --- /dev/null +++ b/SSL/src/Roles/БазовыеПрава/Rights.rights @@ -0,0 +1,7969 @@ + + + false + false + true + + CommonForm.ВводТелефона + + View + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.Операции.Attribute.СвязиПараметровВыбора + + View + true + + + Edit + true + + + + Catalog.НаборыДополнительныхРеквизитовИСведений + + Read + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.АдресТолькоРоссийский + + View + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.Attribute.ИспользуютсяДопСведения + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения + + Read + true + + #ПоЗначениямРасширенный( "ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения", "Чтение", "НеОграничиватьДоступКГруппам", +"", +"", +"ДополнительныеСведения","Ссылка","ИЛИ", +"Условие","НЕ ЭтоДополнительноеСведение","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","") + + + + + DataProcessor.ГрупповоеИзменениеОбъектов.Attribute.ПрерыватьПриОшибке + + View + true + + + Edit + true + + + + CommonForm.ПанельОтчетов + + View + true + + + + CommonForm.ВопросОбУстановкеРасширенияРаботыСФайлами + + View + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.Тип + + View + true + + + + CommonForm.ПерсональныеНастройкиЭЦП + + View + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.Операции.Attribute.ВыборГруппИЭлементов + + View + true + + + Edit + true + + + + CommonForm.ПараметрыПроксиСервера + + View + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.РедактированиеТолькоВДиалоге + + View + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.Операции.Attribute.ВидОперации + + View + true + + + Edit + true + + + + CommonForm.ВыборОбъектовМетаданных + + View + true + + + + CommonForm.ПоискПоИндексу + + View + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.Операции.Attribute.Значение + + View + true + + + Edit + true + + + + CommonForm.НастройкиЭЦП + + View + true + + + + Catalog.ВидыДокументовФизическихЛиц + + Read + true + + + + DataProcessor.ПолнотекстовыйПоискВДанных + + Use + true + + + View + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.Операции.Attribute.Изменять + + View + true + + + Edit + true + + + + Catalog.ВидыКонтактнойИнформации + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Predefined + + View + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Ref + + View + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.IsFolder + + View + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Owner + + View + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Parent + + View + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Description + + View + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Code + + View + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.Attribute.ИзменятьВТранзакции + + View + true + + + Edit + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.Операции.Attribute.ЗаблокированныйРеквизит + + View + true + + + Edit + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.Attribute.ИспользуютсяДопРеквизиты + + View + true + + + Edit + true + + + + DataProcessor.ПолнотекстовыйПоискВДанных.Command.ПолнотекстовыйПоиск + + View + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.ОбъектыДляИзменения + + View + true + + + Edit + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.РеквизитДопУпорядочивания + + View + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.Операции.Attribute.ПараметрыВыбора + + View + true + + + Edit + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.Операции.Attribute.ИмяРеквизита + + View + true + + + Edit + true + + + + Constant.ЗаголовокСистемы + + Read + true + + + + CommonForm.НастройкаЛокальногоКэшаФайлов + + View + true + + + + Catalog.ЗначенияСвойствОбъектов.Attribute.Вес + + View + true + + + + Catalog.ЗначенияСвойствОбъектов + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Predefined + + View + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Ref + + View + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.IsFolder + + View + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Owner + + View + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Parent + + View + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Description + + View + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Code + + View + true + + + + CommonForm.ФормаСертификатаЭЦП + + View + true + + + + CommonForm.ВыборСертификатаЭЦПДляПодписи + + View + true + + + + CommonForm.ВсеОтчеты + + View + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.Операции + + View + true + + + Edit + true + + + + CommonForm.ПечатьДокументов + + View + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.ОбъектыДляИзменения.Attribute.СоставДопСведений + + View + true + + + Edit + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.Операции.Attribute.Свойство + + View + true + + + Edit + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.ОбъектыДляИзменения.Attribute.Ссылка + + View + true + + + Edit + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.Операции.Attribute.Представление + + View + true + + + Edit + true + + + + CommonForm.НастройкаПечатныхФормПередОтправкой + + View + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.МожноИзменятьСпособРедактирования + + View + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.Операции.Attribute.ДопустимыеТипы + + View + true + + + Edit + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов + + Use + true + + + View + true + + + + DataProcessor.ГрупповоеИзменениеОбъектов.TabularSection.ОбъектыДляИзменения.Attribute.СоставДопРеквизитов + + View + true + + + Edit + true + + + + CommonCommand.ПерсональнаяНастройкаПроксиСервера + + View + true + + + + ПоЗначениям + // ПоЗначениям ( Таблица, Право, Модификатор, В1,П1, В2,Р2, ..., В(n), П(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, ..., 2+n*2,3+n*2 . +// Читается так: "ограничение доступа по значениям". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле значения, проверяемого по виду доступа, кроме случая В(n) = "Условие" (или ""). +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И <Условие по группе параметров 2> И ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", +// "Организации","Организация", +// "Поставщики","Контрагент", "","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр5 + ПО + ТипЗначения(#Параметр(5)) = ТипЗначения(ТипыСсылокПараметр5.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр9 + ПО + ТипЗначения(#Параметр(9)) = ТипЗначения(ТипыСсылокПараметр9.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр11 + ПО + ТипЗначения(#Параметр(11)) = ТипЗначения(ТипыСсылокПараметр11.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр15 + ПО + ТипЗначения(#Параметр(15)) = ТипЗначения(ТипыСсылокПараметр15.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр17 + ПО + ТипЗначения(#Параметр(17)) = ТипЗначения(ТипыСсылокПараметр17.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр21 + ПО + ТипЗначения(#Параметр(21)) = ТипЗначения(ТипыСсылокПараметр21.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр23 + ПО + ТипЗначения(#Параметр(23)) = ТипЗначения(ТипыСсылокПараметр23.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр27 + ПО + ТипЗначения(#Параметр(27)) = ТипЗначения(ТипыСсылокПараметр27.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр29 + ПО + ТипЗначения(#Параметр(29)) = ТипЗначения(ТипыСсылокПараметр29.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр33 + ПО + ТипЗначения(#Параметр(33)) = ТипЗначения(ТипыСсылокПараметр33.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр35 + ПО + ТипЗначения(#Параметр(35)) = ТипЗначения(ТипыСсылокПараметр35.ТипТаблицы) +#КонецЕсли + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(4)" = "Условие" ИЛИ "#Параметр(4)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(5) ) +#ИначеЕсли "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + #Параметр(5) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр5.ТипТаблицы + #Если "#Параметр(4)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(4)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(4) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(4)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(4)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(4) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(5) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(5) + #ИначеЕсли "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(4) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(4) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(4) + #КонецЕсли + #Иначе // "Т.##Параметр(5)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(6)" = "" И "#Параметр(7)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + И #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(7) + #ИначеЕсли "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "Т.##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(8)" = "" И "#Параметр(9)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(8)" = "Условие" ИЛИ "#Параметр(8)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(9) ) +#ИначеЕсли "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + И #Параметр(9) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр9.ТипТаблицы + #Если "#Параметр(8)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(8)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(8) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(8)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(8)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(8) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(9) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(9) + #ИначеЕсли "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(8) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(8) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(8) + #КонецЕсли + #Иначе // "Т.##Параметр(9)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(10)" = "" И "#Параметр(11)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(10)" = "Условие" ИЛИ "#Параметр(10)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(11) ) +#ИначеЕсли "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + И #Параметр(11) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр11.ТипТаблицы + #Если "#Параметр(10)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(10)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(10) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(10)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(10)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(10) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(11) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(11) + #ИначеЕсли "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(10) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(10) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(10) + #КонецЕсли + #Иначе // "Т.##Параметр(11)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + И #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(13) + #ИначеЕсли "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "Т.##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(14)" = "" И "#Параметр(15)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(14)" = "Условие" ИЛИ "#Параметр(14)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(15) ) +#ИначеЕсли "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + И #Параметр(15) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр15.ТипТаблицы + #Если "#Параметр(14)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(14)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(14) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(14)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(14)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(14) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(15) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(15) + #ИначеЕсли "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(14) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(14) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(14) + #КонецЕсли + #Иначе // "Т.##Параметр(15)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(16)" = "" И "#Параметр(17)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(16)" = "Условие" ИЛИ "#Параметр(16)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(17) ) +#ИначеЕсли "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + И #Параметр(17) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр17.ТипТаблицы + #Если "#Параметр(16)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(16)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(16) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(16)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(16)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(16) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(17) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(17) + #ИначеЕсли "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(16) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(16) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(16) + #КонецЕсли + #Иначе // "Т.##Параметр(17)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + И #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(19) + #ИначеЕсли "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "Т.##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(20)" = "" И "#Параметр(21)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(20)" = "Условие" ИЛИ "#Параметр(20)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(21) ) +#ИначеЕсли "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + И #Параметр(21) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр21.ТипТаблицы + #Если "#Параметр(20)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(20)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(20) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(20)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(20)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(20) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(21) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(21) + #ИначеЕсли "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(20) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(20) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(20) + #КонецЕсли + #Иначе // "Т.##Параметр(21)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(22)" = "" И "#Параметр(23)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(22)" = "Условие" ИЛИ "#Параметр(22)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(23) ) +#ИначеЕсли "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + И #Параметр(23) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр23.ТипТаблицы + #Если "#Параметр(22)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(22)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(22) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(22)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(22)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(22) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(23) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(23) + #ИначеЕсли "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(22) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(22) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(22) + #КонецЕсли + #Иначе // "Т.##Параметр(23)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + И #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(25) + #ИначеЕсли "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "Т.##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(26)" = "" И "#Параметр(27)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(26)" = "Условие" ИЛИ "#Параметр(26)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(27) ) +#ИначеЕсли "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + И #Параметр(27) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр27.ТипТаблицы + #Если "#Параметр(26)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(26)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(26) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(26)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(26)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(26) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(27) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(27) + #ИначеЕсли "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(26) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(26) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(26) + #КонецЕсли + #Иначе // "Т.##Параметр(27)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(28)" = "" И "#Параметр(29)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(28)" = "Условие" ИЛИ "#Параметр(28)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(29) ) +#ИначеЕсли "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + И #Параметр(29) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр29.ТипТаблицы + #Если "#Параметр(28)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(28)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(28) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(28)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(28)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(28) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(29) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(29) + #ИначеЕсли "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(28) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(28) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(28) + #КонецЕсли + #Иначе // "Т.##Параметр(29)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + И #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(31) + #ИначеЕсли "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "Т.##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(32)" = "" И "#Параметр(33)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(32)" = "Условие" ИЛИ "#Параметр(32)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(33) ) +#ИначеЕсли "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + И #Параметр(33) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр33.ТипТаблицы + #Если "#Параметр(32)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(32)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(32) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(32)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(32)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(32) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(33) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(33) + #ИначеЕсли "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(32) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(32) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(32) + #КонецЕсли + #Иначе // "Т.##Параметр(33)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(34)" = "" И "#Параметр(35)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(34)" = "Условие" ИЛИ "#Параметр(34)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(35) ) +#ИначеЕсли "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + И #Параметр(35) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр35.ТипТаблицы + #Если "#Параметр(34)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(34)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(34) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(34)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(34)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(34) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(35) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(35) + #ИначеЕсли "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(34) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(34) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(34) + #КонецЕсли + #Иначе // "Т.##Параметр(35)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + + ) +) +#КонецЕсли + + + + + ПоЗначениямРасширенный + // ПоЗначениямРасширенный ( Таблица, Право, Модификатор, ПрисоединяемыеТаблицы, О, В1,П1,О1, В2,П2,О2,..., В(n), П(n), О(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,...,3+n*3,4+n*3,5+n*3 . +// Читается так: "ограничение доступа по значениям расширенный". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ПрисоединяемыеТаблицы - текст присоедиения дополнительных таблиц на языке запросов, например, +// "ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ОплатаПоставщикам КАК Т1 +// ПО Т.Ссылка = Т1.Ссылка". +// Присоединение позволяет указать поля таблицы ОплатаПоставщикам, как поля основной таблицы +// для проверки их значений, как значений основной таблицы. +// Следует помнить, что при размножении строк в результате соединения, достаточно чтобы +// всего одна строка прошла условия проверки, т.е. результаты проверки строк объединяются по "ИЛИ". +// О - Начальные скобки "(". +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле с псевдонимом, например "Т.Организация", значение которого проверяется +// по виду доступа, кроме случая В(n) = "Условие" (или ""). +// О(n) - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")". +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И/ИЛИ <Условие по группе параметров 2> И/ИЛИ ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениямРасширенный("Документ.ПеремещениеТоваров", "Чтение", "", +// "", +// "", +// "Организации","Т.Организация","И(", +// "Склады","Т.СкладОтправитель","ИЛИ", +// "Склады","Т.СкладПолучатель",")", "","","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр10 + ПО + ТипЗначения(#Параметр(10)) = ТипЗначения(ТипыСсылокПараметр10.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр16 + ПО + ТипЗначения(#Параметр(16)) = ТипЗначения(ТипыСсылокПараметр16.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр22 + ПО + ТипЗначения(#Параметр(22)) = ТипЗначения(ТипыСсылокПараметр22.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр28 + ПО + ТипЗначения(#Параметр(28)) = ТипЗначения(ТипыСсылокПараметр28.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр34 + ПО + ТипЗначения(#Параметр(34)) = ТипЗначения(ТипыСсылокПараметр34.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр37 + ПО + ТипЗначения(#Параметр(37)) = ТипЗначения(ТипыСсылокПараметр37.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр40 + ПО + ТипЗначения(#Параметр(40)) = ТипЗначения(ТипыСсылокПараметр40.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр43 + ПО + ТипЗначения(#Параметр(43)) = ТипЗначения(ТипыСсылокПараметр43.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр46 + ПО + ТипЗначения(#Параметр(46)) = ТипЗначения(ТипыСсылокПараметр46.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр49 + ПО + ТипЗначения(#Параметр(49)) = ТипЗначения(ТипыСсылокПараметр49.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр52 + ПО + ТипЗначения(#Параметр(52)) = ТипЗначения(ТипыСсылокПараметр52.ТипТаблицы) +#КонецЕсли + +// Присоединяемые таблицы к проверяемой строке текущей таблицы "Т". +#Параметр(4) + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + + #Параметр(5) // [([(][(]...] 0-n открывающихся скобок. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(7) + #ИначеЕсли "#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(8) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(9)" = "" И "#Параметр(10)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(9)" = "Условие" ИЛИ "#Параметр(9)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(10) ) +#ИначеЕсли "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + #Параметр(10) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр10.ТипТаблицы + #Если "#Параметр(9)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(9)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(9) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(9)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(9)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(10)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(9) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(10) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(10) + #ИначеЕсли "#Параметр(10)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(9) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(9) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(9) + #КонецЕсли + #Иначе // "##Параметр(10)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(11) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(13) + #ИначеЕсли "#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(14) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(15)" = "" И "#Параметр(16)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(15)" = "Условие" ИЛИ "#Параметр(15)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(16) ) +#ИначеЕсли "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + #Параметр(16) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр16.ТипТаблицы + #Если "#Параметр(15)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(15)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(15) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(15)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(15)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(16)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(15) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(16) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(16) + #ИначеЕсли "#Параметр(16)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(15) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(15) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(15) + #КонецЕсли + #Иначе // "##Параметр(16)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(17) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(19) + #ИначеЕсли "#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(20) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(21)" = "" И "#Параметр(22)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(21)" = "Условие" ИЛИ "#Параметр(21)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(22) ) +#ИначеЕсли "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + #Параметр(22) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр22.ТипТаблицы + #Если "#Параметр(21)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(21)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(21) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(21)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(21)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(22)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(21) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(22) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(22) + #ИначеЕсли "#Параметр(22)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(21) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(21) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(21) + #КонецЕсли + #Иначе // "##Параметр(22)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(23) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(25) + #ИначеЕсли "#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(26) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(27)" = "" И "#Параметр(28)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(27)" = "Условие" ИЛИ "#Параметр(27)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(28) ) +#ИначеЕсли "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + #Параметр(28) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр28.ТипТаблицы + #Если "#Параметр(27)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(27)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(27) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(27)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(27)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(28)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(27) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(28) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(28) + #ИначеЕсли "#Параметр(28)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(27) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(27) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(27) + #КонецЕсли + #Иначе // "##Параметр(28)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(29) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(31) + #ИначеЕсли "#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(32) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(33)" = "" И "#Параметр(34)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(33)" = "Условие" ИЛИ "#Параметр(33)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(34) ) +#ИначеЕсли "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + #Параметр(34) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр34.ТипТаблицы + #Если "#Параметр(33)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(33)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(33) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(33)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(33)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(34)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(33) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(34) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(34) + #ИначеЕсли "#Параметр(34)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(33) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(33) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(33) + #КонецЕсли + #Иначе // "##Параметр(34)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(35) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(36)" = "" И "#Параметр(37)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(36)" = "Условие" ИЛИ "#Параметр(36)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(37) ) +#ИначеЕсли "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + #Параметр(37) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр37.ТипТаблицы + #Если "#Параметр(36)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(36)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(36) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(36)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(36)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(37)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(36) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(37) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(37) + #ИначеЕсли "#Параметр(37)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(36) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(36) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(36) + #КонецЕсли + #Иначе // "##Параметр(37)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(38) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(39)" = "" И "#Параметр(40)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(39)" = "Условие" ИЛИ "#Параметр(39)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(40) ) +#ИначеЕсли "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + #Параметр(40) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр40.ТипТаблицы + #Если "#Параметр(39)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(39)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(39) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(39)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(39)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(40)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(39) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(40) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(40) + #ИначеЕсли "#Параметр(40)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(39) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(39) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(39) + #КонецЕсли + #Иначе // "##Параметр(40)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(41) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(42)" = "" И "#Параметр(43)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(42)" = "Условие" ИЛИ "#Параметр(42)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(43) ) +#ИначеЕсли "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + #Параметр(43) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр43.ТипТаблицы + #Если "#Параметр(42)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(42)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(42) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(42)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(42)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(43)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(42) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(43) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(43) + #ИначеЕсли "#Параметр(43)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(42) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(42) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(42) + #КонецЕсли + #Иначе // "##Параметр(43)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(44) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(45)" = "" И "#Параметр(46)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(45)" = "Условие" ИЛИ "#Параметр(45)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(46) ) +#ИначеЕсли "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + #Параметр(46) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр46.ТипТаблицы + #Если "#Параметр(45)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(45)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(45) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(45)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(45)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(46)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(45) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(46) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(46) + #ИначеЕсли "#Параметр(46)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(45) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(45) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(45) + #КонецЕсли + #Иначе // "##Параметр(46)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(47) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(48)" = "" И "#Параметр(49)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(48)" = "Условие" ИЛИ "#Параметр(48)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(49) ) +#ИначеЕсли "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + #Параметр(49) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр49.ТипТаблицы + #Если "#Параметр(48)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(48)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(48) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(48)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(48)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(49)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(48) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(49) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(49) + #ИначеЕсли "#Параметр(49)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(48) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(48) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(48) + #КонецЕсли + #Иначе // "##Параметр(49)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(50) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(51)" = "" И "#Параметр(52)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(51)" = "Условие" ИЛИ "#Параметр(51)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(52) ) +#ИначеЕсли "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + #Параметр(52) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр52.ТипТаблицы + #Если "#Параметр(51)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(51)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(51) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(51)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(51)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(52)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(51) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(52) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(52) + #ИначеЕсли "#Параметр(52)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(51) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(51) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(51) + #КонецЕсли + #Иначе // "##Параметр(52)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(53) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + + ) +) +#КонецЕсли + + + + diff --git a/SSL/src/Roles/БазовыеПрава/БазовыеПрава.mdo b/SSL/src/Roles/БазовыеПрава/БазовыеПрава.mdo new file mode 100644 index 000000000..d1c2d06fb --- /dev/null +++ b/SSL/src/Roles/БазовыеПрава/БазовыеПрава.mdo @@ -0,0 +1,9 @@ + + + БазовыеПрава + + ru + Базовые права + + Это базовые права БСП, которые должны быть у любого пользователя и внешнего пользователя + diff --git a/SSL/src/Roles/ВыводНаПринтерФайлБуферОбмена/Rights.rights b/SSL/src/Roles/ВыводНаПринтерФайлБуферОбмена/Rights.rights new file mode 100644 index 000000000..9518b1fde --- /dev/null +++ b/SSL/src/Roles/ВыводНаПринтерФайлБуферОбмена/Rights.rights @@ -0,0 +1,45 @@ + + + false + false + true + + Configuration.БиблиотекаСтандартныхПодсистем + + TechnicalSpecialistMode + true + + + MainWindowModeNormal + true + + + MainWindowModeWorkplace + true + + + MainWindowModeEmbeddedWorkplace + true + + + MainWindowModeFullscreenWorkplace + true + + + MainWindowModeKiosk + true + + + AnalyticsSystemClient + true + + + SaveUserData + true + + + Output + true + + + diff --git a/SSL/src/Roles/ВыводНаПринтерФайлБуферОбмена/ВыводНаПринтерФайлБуферОбмена.mdo b/SSL/src/Roles/ВыводНаПринтерФайлБуферОбмена/ВыводНаПринтерФайлБуферОбмена.mdo new file mode 100644 index 000000000..fd8fc9f2f --- /dev/null +++ b/SSL/src/Roles/ВыводНаПринтерФайлБуферОбмена/ВыводНаПринтерФайлБуферОбмена.mdo @@ -0,0 +1,8 @@ + + + ВыводНаПринтерФайлБуферОбмена + + ru + Вывод на принтер, в файл, в буфер обмена + + diff --git a/SSL/src/Roles/ВыполнениеОбменовДанными/Rights.rights b/SSL/src/Roles/ВыполнениеОбменовДанными/Rights.rights new file mode 100644 index 000000000..e3e98a7b0 --- /dev/null +++ b/SSL/src/Roles/ВыполнениеОбменовДанными/Rights.rights @@ -0,0 +1,1445 @@ + + + false + false + true + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ДанныеУспешноЗагружены + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.КоличествоОбъектовНесопоставленных + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаСортировки.Attribute.ИмяПоля + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаНеутвержденныхСвязей.Attribute.УникальныйИдентификаторПриемника + + View + true + + + Edit + true + + + + CommonCommand.НастроитьПараметрыТранспортаСообщенийОбмена + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FILEСжиматьФайлИсходящегоСообщения + + View + true + + + + Catalog.СценарииОбменовДанными.Attribute.РегламентноеЗаданиеGUID + + View + true + + + + InformationRegister.ПравилаДляОбменаДанными.Resource.ПравилаXML + + View + true + + + + CommonForm.ВыполнениеОбменаДанными + + View + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными.Resource.ДатаОкончания + + View + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ПоляТаблицы + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаНеутвержденныхСвязей.Attribute.УникальныйИдентификаторИсточника + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ПриемникПоле3 + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.СписокИспользуемыхПолей + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ИмяТаблицыПриемника + + View + true + + + Edit + true + + + + DataProcessor.ТранспортСообщенийОбменаEMAIL + + Use + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз + + Read + true + + + Update + true + + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.StandardAttribute.Active + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.StandardAttribute.LineNumber + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.StandardAttribute.Recorder + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.StandardAttribute.Period + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.Dimension.УникальныйИдентификаторИсточника + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаНеутвержденныхСвязей.Attribute.ТипПриемника + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ИмяФайлаСообщенияОбмена + + View + true + + + Edit + true + + + + CommonCommand.ОткрытьСценарииОбменовДанными + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ПриемникПоле1 + + View + true + + + Edit + true + + + + DataProcessor.КонвертацияОбъектовРаспределенныхИнформационныхБаз + + Use + true + + + + DataProcessor.ТранспортСообщенийОбменаFTP + + Use + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз + + Use + true + + + View + true + + + + Catalog.СценарииОбменовДанными.TabularSection.НастройкиОбмена + + View + true + + + + Catalog.СценарииОбменовДанными.TabularSection.НастройкиОбмена.Attribute.ВыполняемоеДействие + + View + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.КоличествоОбъектовВИсточнике + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Resource.ИмяМакетаПравил + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FTPСжиматьФайлИсходящегоСообщения + + View + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.Dimension.УникальныйИдентификаторПриемника + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ПриемникПоле5 + + View + true + + + Edit + true + + + + CommonCommand.ОткрытьФормуУправленияОбменамиДанных + + View + true + + + + CommonCommand.ВыполнитьОбменДаннымиИнтерактивно + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ТипИсточника + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Resource.ИмяПланаОбменаИзПравил + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ПриемникПоле2 + + View + true + + + Edit + true + + + + InformationRegister.СостояниеОбменовДанными.Dimension.ДействиеПриОбмене + + View + true + + + + InformationRegister.ПравилаДляОбменаДанными.Resource.ИсточникПравил + + View + true + + + + Catalog.СценарииОбменовДанными + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.Predefined + + View + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.Ref + + View + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.DeletionMark + + View + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.IsFolder + + View + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.Owner + + View + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.Parent + + View + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.Description + + View + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.Code + + View + true + + + + InformationRegister.ПравилаДляОбменаДанными.Resource.ИмяФайлаПравил + + View + true + + + + InformationRegister.СостояниеОбменовДанными.Resource.РезультатВыполненияОбмена + + View + true + + + + CommonCommand.ВыполнитьОбменДанными + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.ВидТранспортаСообщенийОбменаПоУмолчанию + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ИсточникПоле5 + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ТипИсточникаСтрокой + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ПоляПоиска + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.EMAILМаксимальныйДопустимыйРазмерСообщения + + View + true + + + + InformationRegister.СостояниеОбменовДанными.Dimension.УзелИнформационнойБазы + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаСортировки.Attribute.Использование + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.EMAILСжиматьФайлИсходящегоСообщения + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ИсточникПоле2 + + View + true + + + Edit + true + + + + InformationRegister.СостояниеОбменовДанными + + Read + true + + + View + true + + + + InformationRegister.СостояниеОбменовДанными.StandardAttribute.Active + + View + true + + + + InformationRegister.СостояниеОбменовДанными.StandardAttribute.LineNumber + + View + true + + + + InformationRegister.СостояниеОбменовДанными.StandardAttribute.Recorder + + View + true + + + + InformationRegister.СостояниеОбменовДанными.StandardAttribute.Period + + View + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.Attribute.НомерВходящегоСообщения + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.Attribute.ИспользоватьРегламентноеЗадание + + View + true + + + + Catalog.СценарииОбменовДанными.TabularSection.НастройкиОбмена.Attribute.УзелИнформационнойБазы + + View + true + + + + InformationRegister.ПравилаДляОбменаДанными.Resource.ПравилаЗачитанные + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FTPСоединениеМаксимальныйДопустимыйРазмерСообщения + + View + true + + + + CommonCommand.ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + + View + true + + + + InformationRegister.ПравилаДляОбменаДанными.Dimension.ИмяПланаОбмена + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FTPСоединениеПорт + + View + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.Attribute.ВидТранспортаСообщенийОбмена + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.СинхронизироватьПоИдентификатору + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Resource.ИнформацияОПравилах + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ТипПриемника + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.Attribute.ИмяВременногоКаталогаСообщенийОбмена + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FILEКаталогОбменаИнформацией + + View + true + + + + InformationRegister.СостояниеОбменовДанными.Resource.ДатаНачала + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаНеутвержденныхСвязей + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ТипПриемникаСтрокой + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.Resource.УникальныйИдентификаторИсточникаСтрокой + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.КоличествоОбъектовВПриемнике + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.УзелИнформационнойБазы + + View + true + + + Edit + true + + + + DataProcessor.КонвертацияОбъектовИнформационныхБаз + + Use + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ИмяТаблицыПриемника + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.TabularSection.НастройкиОбмена.Attribute.КоличествоЭлементовВТранзакции + + View + true + + + + Subsystem.СтандартныеПодсистемы.Subsystem.ОбменДанными + + View + true + + + + InformationRegister.СостояниеОбменовДанными.Resource.ДатаОкончания + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.ВыполнятьОбменВРежимеОтладки + + View + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.КоличествоОбъектовСопоставленных + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ТипОбъектаСтрокой + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.Attribute.УзелИнформационнойБазы + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ПоляТаблицыПриемника + + View + true + + + Edit + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными.Dimension.ДействиеПриОбмене + + View + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ПроцентСопоставленияОбъектов + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Attribute.ИспользоватьФильтрВыборочнойРегистрацииОбъектов + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ПриемникПоле4 + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Dimension.ВидПравил + + View + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз + + Use + true + + + View + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.Dimension.УзелИнформационнойБазы + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.Attribute.ИмяПланаОбмена + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ИсточникПоле1 + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаНеутвержденныхСвязей.Attribute.ТипИсточника + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена + + Read + true + + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.StandardAttribute.Active + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.StandardAttribute.LineNumber + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.StandardAttribute.Recorder + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.StandardAttribute.Period + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Dimension.Узел + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.Dimension.ТипПриемника + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными + + Read + true + + + View + true + + + + InformationRegister.ПравилаДляОбменаДанными.StandardAttribute.Active + + View + true + + + + InformationRegister.ПравилаДляОбменаДанными.StandardAttribute.LineNumber + + View + true + + + + InformationRegister.ПравилаДляОбменаДанными.StandardAttribute.Recorder + + View + true + + + + InformationRegister.ПравилаДляОбменаДанными.StandardAttribute.Period + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.ПарольАрхиваСообщенияОбмена + + View + true + + + + CommonForm.УправлениеОбменамиДанных + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.EMAILУчетнаяЗапись + + View + true + + + + DataProcessor.ТранспортСообщенийОбменаFILE + + Use + true + + + + InformationRegister.ПравилаДляОбменаДанными.Attribute.ПравилаЗагружены + + View + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ТипПриемникаСтрокой + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ТипИсточникаСтрокой + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.УникальныйИдентификаторПриемника + + View + true + + + Edit + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными.Dimension.УзелИнформационнойБазы + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ИсточникПоле4 + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ИндексКартинки + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики + + View + true + + + Edit + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными + + Read + true + + + View + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными.StandardAttribute.Active + + View + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными.StandardAttribute.LineNumber + + View + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными.StandardAttribute.Recorder + + View + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными.StandardAttribute.Period + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FTPСоединениеПароль + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.Пометка + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FTPСоединениеПользователь + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FTPСоединениеПассивноеСоединение + + View + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.Dimension.ТипИсточника + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ИмяТипаОбъектаТаблицыИсточника + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.СписокПолейТаблицы + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ИсточникПоле3 + + View + true + + + Edit + true + + + + DataProcessor.ЗагрузкаПравилКонвертацииОбъектов + + Use + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ДанныеУспешноЗагружены + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.Attribute.Комментарий + + View + true + + + + DataProcessor.ЗагрузкаПравилРегистрацииОбъектов + + Use + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FTPСоединениеПуть + + View + true + + + + Catalog.СценарииОбменовДанными.TabularSection.НастройкиОбмена.Attribute.ВидТранспортаОбмена + + View + true + + + + Constant.ИспользоватьОбменДанными + + Read + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.Attribute.ИмяФайлаСообщенияОбмена + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаСортировки.Attribute.НаправлениеСортировки + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ПоляПоискаТаблицыПриемника + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаСортировки + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.ИмяФайлаПротоколаОбмена + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.УникальныйИдентификаторИсточника + + View + true + + + Edit + true + + + + CommonCommand.ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + + View + true + + + diff --git a/SSL/src/Roles/ВыполнениеОбменовДанными/ВыполнениеОбменовДанными.mdo b/SSL/src/Roles/ВыполнениеОбменовДанными/ВыполнениеОбменовДанными.mdo new file mode 100644 index 000000000..592573b61 --- /dev/null +++ b/SSL/src/Roles/ВыполнениеОбменовДанными/ВыполнениеОбменовДанными.mdo @@ -0,0 +1,8 @@ + + + ВыполнениеОбменовДанными + + ru + Выполнение обменов данными + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеБазовойНСИ/Rights.rights b/SSL/src/Roles/ДобавлениеИзменениеБазовойНСИ/Rights.rights new file mode 100644 index 000000000..f9ec992c6 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеБазовойНСИ/Rights.rights @@ -0,0 +1,3168 @@ + + + false + false + true + + Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеСведения.Attribute.Свойство + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.TabularSection.Пользователи + + View + true + + + + Catalog.НаборыДополнительныхРеквизитовИСведений + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.НаборыДополнительныхРеквизитовИСведений.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.НаборыДополнительныхРеквизитовИСведений.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.НаборыДополнительныхРеквизитовИСведений.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.НаборыДополнительныхРеквизитовИСведений.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.НаборыДополнительныхРеквизитовИСведений.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.НаборыДополнительныхРеквизитовИСведений.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.НаборыДополнительныхРеквизитовИСведений.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.НаборыДополнительныхРеквизитовИСведений.StandardAttribute.Code + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.Пароль + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа.Attribute.ДоступРазрешен + + View + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.СпособSMTPАутентификации + + View + true + + + Edit + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.АдресТолькоРоссийский + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.ValueType + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.Description + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.Code + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.Parent + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.Ref + + View + true + + + Edit + true + + + + InformationRegister.КурсыВалют + + Read + true + + + Update + true + + + View + true + + + Edit + true + + + + InformationRegister.КурсыВалют.StandardAttribute.Active + + View + true + + + Edit + true + + + + InformationRegister.КурсыВалют.StandardAttribute.LineNumber + + View + true + + + Edit + true + + + + InformationRegister.КурсыВалют.StandardAttribute.Recorder + + View + true + + + Edit + true + + + + InformationRegister.КурсыВалют.StandardAttribute.Period + + View + true + + + Edit + true + + + + InformationRegister.ВерсииОбъектовАдресногоКлассификатора.Dimension.АдресныйОбъект + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ПарольSMTP + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор.Resource.Наименование + + View + true + + + Edit + true + + + + InformationRegister.КалендарныеГрафики + + Read + true + + + Update + true + + + View + true + + + Edit + true + + + + InformationRegister.КалендарныеГрафики.StandardAttribute.Active + + View + true + + + Edit + true + + + + InformationRegister.КалендарныеГрафики.StandardAttribute.LineNumber + + View + true + + + Edit + true + + + + InformationRegister.КалендарныеГрафики.StandardAttribute.Recorder + + View + true + + + Edit + true + + + + InformationRegister.КалендарныеГрафики.StandardAttribute.Period + + View + true + + + Edit + true + + + + InformationRegister.КалендарныеГрафики.Resource.КоличествоДнейВГрафикеСНачалаГода + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Страна + + View + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.Attribute.ЭтоДополнительноеСведение + + View + true + + + Edit + true + + + + Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеСведения + + View + true + + + Edit + true + + + + CommonForm.ВводАдреса + + View + true + + + + Catalog.Календари + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.Календари.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.Календари.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.Календари.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.Календари.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.Календари.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.Календари.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.Календари.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.Календари.StandardAttribute.Code + + View + true + + + Edit + true + + + + InformationRegister.ВерсииОбъектовАдресногоКлассификатора.Resource.ДатаВыпускаВерсии + + View + true + + + Edit + true + + + + Catalog.Валюты + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.Валюты.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.Валюты.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.Валюты.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.Валюты.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.Валюты.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.Валюты.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.Валюты.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.Валюты.StandardAttribute.Code + + View + true + + + Edit + true + + + + Catalog.СтраныМира.Attribute.КодАльфа2 + + View + true + + + Edit + true + + + + InformationRegister.ВерсииОбъектовАдресногоКлассификатора.Resource.Наименование + + View + true + + + Edit + true + + + + Catalog.Валюты.Attribute.НаименованиеПолное + + View + true + + + Edit + true + + + + Catalog.ГруппыПользователей.Attribute.Комментарий + + View + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.Тип + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.Attribute.Подсказка + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор.Dimension.ТипАдресногоЭлемента + + View + true + + + Edit + true + + + + DataProcessor.КурсыВалютРБК.Attribute.ОкончаниеПериодаЗагрузки + + View + true + + + Edit + true + + + + DataProcessor.КурсыВалютРБК.TabularSection.СписокВалют + + View + true + + + Edit + true + + + + DataProcessor.КурсыВалютРБК.TabularSection.СписокВалют.Attribute.Кратность + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ИспользоватьДляОтправки + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.TabularSection.ВидыДоступа.Attribute.ВидДоступа + + View + true + + + + InformationRegister.АдресныеСокращения + + Read + true + + + Update + true + + + View + true + + + Edit + true + + + + InformationRegister.АдресныеСокращения.StandardAttribute.Active + + View + true + + + Edit + true + + + + InformationRegister.АдресныеСокращения.StandardAttribute.LineNumber + + View + true + + + Edit + true + + + + InformationRegister.АдресныеСокращения.StandardAttribute.Recorder + + View + true + + + Edit + true + + + + InformationRegister.АдресныеСокращения.StandardAttribute.Period + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.TabularSection.ВидыДоступа + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.ЗначенияПолей + + View + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.Attribute.ФорматСвойства + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.SMTPАутентификация + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор + + Read + true + + + Update + true + + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор.StandardAttribute.Active + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор.StandardAttribute.LineNumber + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор.StandardAttribute.Recorder + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор.StandardAttribute.Period + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ОставлятьКопииСообщенийНаСервере + + View + true + + + Edit + true + + + + InformationRegister.КалендарныеГрафики.Dimension.Год + + View + true + + + Edit + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.РедактированиеТолькоВДиалоге + + View + true + + + Edit + true + + + + InformationRegister.КурсыВалют.Resource.Кратность + + View + true + + + Edit + true + + + + DataProcessor.КурсыВалютРБК.TabularSection.СписокВалют.Attribute.ДатаКурса + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.Attribute.Профиль + + View + true + + + + DataProcessor.КурсыВалютРБК.TabularSection.СписокВалют.Attribute.Курс + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор.Resource.АльтернативныеНазвания + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Command.ПроверкаУчетнойЗаписи + + View + true + + + + Catalog.Пользователи + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.Пользователи.StandardAttribute.Predefined + + View + true + + + + Catalog.Пользователи.StandardAttribute.Ref + + View + true + + + + Catalog.Пользователи.StandardAttribute.DeletionMark + + View + true + + + + Catalog.Пользователи.StandardAttribute.IsFolder + + View + true + + + + Catalog.Пользователи.StandardAttribute.Owner + + View + true + + + + Catalog.Пользователи.StandardAttribute.Parent + + View + true + + + + Catalog.Пользователи.StandardAttribute.Description + + View + true + + + + Catalog.Пользователи.StandardAttribute.Code + + View + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ОтветственныйЗаОбработкуПисем + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.TabularSection.Пользователи.Attribute.Пользователь + + View + true + + + + CommonForm.ПоискПоИндексу + + View + true + + + + Catalog.Валюты.Attribute.ПодчиненныйКурсОт + + View + true + + + Edit + true + + + + DataProcessor.КурсыВалютРБК.Attribute.НачалоПериодаЗагрузки + + View + true + + + Edit + true + + + + InformationRegister.АдресныеСокращения.Resource.Наименование + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.АдресЭП + + View + true + + + + Catalog.ГруппыПользователей.TabularSection.Состав + + View + true + + + + Constant.ИспользоватьДополнительныеРеквизитыИСведения + + Read + true + + + View + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ПортSMTP + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.НомерТелефонаБезКодов + + View + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.Code + + View + true + + + Edit + true + + + + Catalog.ВидыДокументовФизическихЛиц + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.Code + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.TabularSection.ВидыДоступа.Attribute.ДоступРазрешен + + View + true + + + + InformationRegister.КалендарныеГрафики.Resource.ДеньВключенВГрафик + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.POP3Сервер + + View + true + + + Edit + true + + + + Catalog.ВидыКонтактнойИнформации + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Code + + View + true + + + Edit + true + + + + Catalog.СтраныМира + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.СтраныМира.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.СтраныМира.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.СтраныМира.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.СтраныМира.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.СтраныМира.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.СтраныМира.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.СтраныМира.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.СтраныМира.StandardAttribute.Code + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ПользовательSMTP + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.Attribute.МногострочноеПолеВвода + + View + true + + + Edit + true + + + + InformationRegister.СоставГруппПользователей + + Read + true + + + + Catalog.Валюты.Attribute.КоэффициентПодчиненногоКурса + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ИспользоватьДляПолучения + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор.Resource.Индекс + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.Attribute.Комментарий + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ВремяОжидания + + View + true + + + Edit + true + + + + DataProcessor.КурсыВалютРБК.TabularSection.СписокВалют.Attribute.КодВалюты + + View + true + + + Edit + true + + + + InformationRegister.КурсыВалют.Resource.Курс + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.АдресЭлектроннойПочты + + View + true + + + Edit + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.РеквизитДопУпорядочивания + + View + true + + + Edit + true + + + + Catalog.Пользователи.Attribute.ИдентификаторПользователяИБ + + View + true + + + + Catalog.Валюты.Attribute.ВалютаЗагружается + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Регион + + View + true + + + + Catalog.ГруппыПользователей + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Predefined + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Ref + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.IsFolder + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Owner + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Parent + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Description + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Code + + View + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ВПредставлениеВключатьИмяПользователя + + View + true + + + Edit + true + + + + InformationRegister.ВерсииОбъектовАдресногоКлассификатора + + Read + true + + + Update + true + + + View + true + + + Edit + true + + + + InformationRegister.ВерсииОбъектовАдресногоКлассификатора.StandardAttribute.Active + + View + true + + + Edit + true + + + + InformationRegister.ВерсииОбъектовАдресногоКлассификатора.StandardAttribute.LineNumber + + View + true + + + Edit + true + + + + InformationRegister.ВерсииОбъектовАдресногоКлассификатора.StandardAttribute.Recorder + + View + true + + + Edit + true + + + + InformationRegister.ВерсииОбъектовАдресногоКлассификатора.StandardAttribute.Period + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор.Dimension.Код + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Вид + + View + true + + + + Catalog.ЗначенияСвойствОбъектов.Attribute.Вес + + View + true + + + Edit + true + + + + Catalog.ЗначенияСвойствОбъектов + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Code + + View + true + + + Edit + true + + + + InformationRegister.КурсыВалют.Dimension.Валюта + + View + true + + + Edit + true + + + + Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеРеквизиты + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ПортPOP3 + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор.Dimension.КодГородаВКоде + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Представление + + View + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ПериодХраненияСообщенийНаСервере + + View + true + + + Edit + true + + + + DataProcessor.КурсыВалютРБК.TabularSection.СписокВалют.Attribute.Валюта + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор.Dimension.КодАдресногоОбъектаВКоде + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор.Dimension.КодНаселенногоПунктаВКоде + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.НомерТелефона + + View + true + + + + Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеРеквизиты.Attribute.Свойство + + View + true + + + Edit + true + + + + CommonCommand.ДополнительныеСведения + + View + true + + + + Catalog.ГруппыДоступа.Attribute.Комментарий + + View + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.Attribute.СклоненияПредмета + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ИмяПользователя + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Тип + + View + true + + + + Catalog.ГруппыПользователей.TabularSection.Состав.Attribute.Пользователь + + View + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.МожноИзменятьСпособРедактирования + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор.Dimension.КодУлицыВКоде + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа + + Read + true + + ГруппыДоступа +ГДЕ + ГруппыДоступа.ЭтоГруппа + ИЛИ ИСТИНА В + (ВЫБРАТЬ ПЕРВЫЕ 1 + ИСТИНА + ИЗ + Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ГруппыДоступаПользователи.Ссылка = ГруппыДоступа.Ссылка + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ + И ПользователиИГруппыПользователей.ГруппаДоступа = ГруппыДоступаПользователи.Пользователь + ) + + + + + View + true + + + InputByString + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Predefined + + View + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Ref + + View + true + + + + Catalog.ГруппыДоступа.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ГруппыДоступа.StandardAttribute.IsFolder + + View + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Owner + + View + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Parent + + View + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Description + + View + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Code + + View + true + + + + ChartOfCharacteristicTypes.ВидыДоступа + + Read + true + + + + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа.Attribute.ЗначениеДоступа + + View + true + + + + InformationRegister.КалендарныеГрафики.Dimension.ДатаГрафика + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация + + View + true + + + + Catalog.СтраныМира.Attribute.КодАльфа3 + + View + true + + + Edit + true + + + + InformationRegister.АдресныеСокращения.Dimension.Код + + View + true + + + Edit + true + + + + InformationRegister.АдресныеСокращения.Dimension.Уровень + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.Пользователь + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа.Attribute.ВидДоступа + + View + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.SMTPСервер + + View + true + + + Edit + true + + + + InformationRegister.АдресныеСокращения.Resource.Сокращение + + View + true + + + Edit + true + + + + Catalog.ПрофилиГруппДоступа + + Read + true + + ПрофилиГруппДоступа +ГДЕ + ПрофилиГруппДоступа.ЭтоГруппа + ИЛИ ИСТИНА В + (ВЫБРАТЬ ПЕРВЫЕ 1 + ИСТИНА + ИЗ + Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступа.Ссылка + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ + И ПользователиИГруппыПользователей.ГруппаДоступа = ГруппыДоступаПользователи.Пользователь + ) + + + + + + DataProcessor.КурсыВалютРБК + + Use + true + + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.ДоменноеИмяСервера + + View + true + + + + InformationRegister.АдресныйКлассификатор.Resource.Сокращение + + View + true + + + Edit + true + + + + InformationRegister.АдресныйКлассификатор.Dimension.КодРайонаВКоде + + View + true + + + Edit + true + + + + CommonForm.РедактированиеЗначенийСвойств + + View + true + + + + Catalog.СтраныМира.Attribute.НаименованиеПолное + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.Attribute.ТипПользователей + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Город + + View + true + + + + Catalog.Валюты.Attribute.ПараметрыПрописиНаРусском + + View + true + + + Edit + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.СпособPOP3Аутентификации + + View + true + + + Edit + true + + + + InformationRegister.КалендарныеГрафики.Dimension.Календарь + + View + true + + + Edit + true + + + + ПоНаборамЗначений + // ПоНаборамЗначений ( Таблица, Право, Модификатор, ВладелецНаборов). +// № параметра: 1, 2, 3, 4 . +// Читается так: "ограничение доступа по наборам значений". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ВладелецНаборов - имя поля, содержащего ссылку на объект-владелец +// наборов значений доступа в регистре сведений НаборыЗначенийДоступа. +// Если имя поля не задано, считается, что проверяется сам объект-владелец +// наборов значений доступа, который имеет табличную часть <Таблица>.НаборыЗначенийДоступа. +// Эта табличная часть применяется, когда Право - "Добавление" или "Изменение". +// Табличная часть точно такая, как РегистрСведений.НаборыЗначенийДоступа +// без измерения Объект и без реквизитов, которые используются для повышения производительности. +// Для журналов документов нужно указать "Ссылка". +// +// Пример1: ПоНаборамЗначений("Документ.КорректировкаДенежныхСредств", "Чтение", "", "" ) +// Пример2: ПоНаборамЗначений("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", "" ) +// Пример3: ПоНаборамЗначений("ЖурналДокументов.СкладскиеДокументы", "Чтение", "", "Ссылка" ) +// Пример4: ПоНаборамЗначений("Справочник.ВложенияЭлектронныхПисем", "Чтение", "", "Владелец" ) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ГДЕ // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + ИЗ #Параметр(1).НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Ссылка = Т.Ссылка + #Иначе + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + #Если "#Параметр(4)" = "" #Тогда + НомераНаборов.Объект = Т.Ссылка + #Иначе + НомераНаборов.Объект = Т.#Параметр(4) + #КонецЕсли + #КонецЕсли + И НомераНаборов.#Параметр(2) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + ИЗ #Параметр(1).НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Ссылка = Т.Ссылка + #Иначе + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + #Если "#Параметр(4)" = "" #Тогда + НаборыЗначений.Объект = Т.Ссылка + #Иначе + НаборыЗначений.Объект = Т.#Параметр(4) + #КонецЕсли + #КонецЕсли + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + ( + Выбор + // Проверка заведомого ложного или заведомо истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), + Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) ) + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТипЗначения(ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы) = ТипЗначения(НаборыЗначений.ЗначениеДоступа) + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Иначе + Когда НаборыЗначений.ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #КонецЕсли + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаЧерезПраваПоЗначениямДоступа) + #Иначе + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + #КонецЕсли + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + НаборыЗначений.ВидДоступа В (&ВидыДоступаЕдинственныеДляТипаЗначенияДоступа) + #Иначе + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + #КонецЕсли + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезГруппЗначенияДоступа) + #Иначе + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + #КонецЕсли + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) + ) // НЕ Ложь В + ) +) +#КонецЕсли + + + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеБазовойНСИ/ДобавлениеИзменениеБазовойНСИ.mdo b/SSL/src/Roles/ДобавлениеИзменениеБазовойНСИ/ДобавлениеИзменениеБазовойНСИ.mdo new file mode 100644 index 000000000..84f7e06b9 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеБазовойНСИ/ДобавлениеИзменениеБазовойНСИ.mdo @@ -0,0 +1,8 @@ + + + ДобавлениеИзменениеБазовойНСИ + + ru + Добавление и изменение базовой нормативно-справочной информации + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеВариантовОтчетов/Rights.rights b/SSL/src/Roles/ДобавлениеИзменениеВариантовОтчетов/Rights.rights new file mode 100644 index 000000000..9d66dfb2d --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеВариантовОтчетов/Rights.rights @@ -0,0 +1,49 @@ + + + false + true + true + + Catalog.ВариантыОтчетов + + Read + true + + + Insert + true + + + Update + true + + + Delete + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеВариантовОтчетов/ДобавлениеИзменениеВариантовОтчетов.mdo b/SSL/src/Roles/ДобавлениеИзменениеВариантовОтчетов/ДобавлениеИзменениеВариантовОтчетов.mdo new file mode 100644 index 000000000..4a26db46f --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеВариантовОтчетов/ДобавлениеИзменениеВариантовОтчетов.mdo @@ -0,0 +1,8 @@ + + + ДобавлениеИзменениеВариантовОтчетов + + ru + Добавление изменение вариантов отчетов + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеВнешнихПользователей/Rights.rights b/SSL/src/Roles/ДобавлениеИзменениеВнешнихПользователей/Rights.rights new file mode 100644 index 000000000..5a77f9e74 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеВнешнихПользователей/Rights.rights @@ -0,0 +1,365 @@ + + + false + false + true + + Catalog.ВнешниеПользователи.Attribute.ИдентификаторПользователяИБ + + View + true + + + Edit + true + + + + CommonForm.ПраваПоЗначениямДоступа + + View + true + + + + CommonCommand.ПраваВнешнегоПользователяПоЗначениямДоступа + + View + true + + + + CommonCommand.ВнешнийПользовательОбъектаАвторизации + + View + true + + + + Catalog.ВнешниеПользователи + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Code + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.Attribute.ТипОбъектовАвторизации + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.Attribute.Комментарий + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Состав + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.Attribute.УдалитьПароль + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Predefined + + View + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Состав.Attribute.ВнешнийПользователь + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.Attribute.ВсеОбъектыАвторизации + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.Attribute.УстановитьРолиНепосредственно + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.Attribute.ОбъектАвторизации + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Роли + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Роли.Attribute.Роль + + View + true + + + Edit + true + + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеВнешнихПользователей/ДобавлениеИзменениеВнешнихПользователей.mdo b/SSL/src/Roles/ДобавлениеИзменениеВнешнихПользователей/ДобавлениеИзменениеВнешнихПользователей.mdo new file mode 100644 index 000000000..c4ca2382c --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеВнешнихПользователей/ДобавлениеИзменениеВнешнихПользователей.mdo @@ -0,0 +1,8 @@ + + + ДобавлениеИзменениеВнешнихПользователей + + ru + Добавление и изменение внешних пользователей + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеДополнительныхОтчетовИОбработок/Rights.rights b/SSL/src/Roles/ДобавлениеИзменениеДополнительныхОтчетовИОбработок/Rights.rights new file mode 100644 index 000000000..f2d574b22 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеДополнительныхОтчетовИОбработок/Rights.rights @@ -0,0 +1,379 @@ + + + false + false + true + + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.Команды.Attribute.ПоказыватьОповещение + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.Команды + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.Команды.Attribute.Модификатор + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.Команды.Attribute.РегламентноеЗаданиеGUID + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.Attribute.Ответственный + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.Назначение.Attribute.ПолноеИмяОбъектаМетаданных + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.Команды.Attribute.Идентификатор + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.Attribute.Комментарий + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.Attribute.БезопасныйРежим + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.Attribute.Версия + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.Attribute.Вид + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.Attribute.ИспользоватьДляФормыОбъекта + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.Назначение + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.Разделы + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.Разделы.Attribute.ИмяРаздела + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки + + Read + true + + + Insert + true + + + Update + true + + + Delete + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ДополнительныеОтчетыИОбработки.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.StandardAttribute.Code + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.Attribute.ИмяФайла + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.Attribute.ХранилищеОбработки + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.Attribute.Публикация + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.Команды.Attribute.Представление + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.TabularSection.Команды.Attribute.ВариантЗапуска + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.Attribute.Информация + + View + true + + + Edit + true + + + + Catalog.ДополнительныеОтчетыИОбработки.Attribute.ИспользоватьДляФормыСписка + + View + true + + + Edit + true + + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеДополнительныхОтчетовИОбработок/ДобавлениеИзменениеДополнительныхОтчетовИОбработок.mdo b/SSL/src/Roles/ДобавлениеИзменениеДополнительныхОтчетовИОбработок/ДобавлениеИзменениеДополнительныхОтчетовИОбработок.mdo new file mode 100644 index 000000000..d7e467b0d --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеДополнительныхОтчетовИОбработок/ДобавлениеИзменениеДополнительныхОтчетовИОбработок.mdo @@ -0,0 +1,8 @@ + + + ДобавлениеИзменениеДополнительныхОтчетовИОбработок + + ru + Добавление и изменение дополнительных обработкок + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеЗаданий/Rights.rights b/SSL/src/Roles/ДобавлениеИзменениеЗаданий/Rights.rights new file mode 100644 index 000000000..ada48de7f --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеЗаданий/Rights.rights @@ -0,0 +1,16433 @@ + + + false + false + true + + Task.ЗадачаИсполнителя.Attribute.РезультатВыполнения + + View + true + + + + InformationRegister.СписокБизнесПроцессов.Resource.Дата + + View + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.ДополнительныйОбъектАдресации + + View + true + + + + BusinessProcess.Задание.Attribute.Выполнено + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.Command.Выполнено + + View + true + + + + InformationRegister.СписокБизнесПроцессов.Resource.Автор + + View + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.ОсновнойОбъектАдресации + + View + true + + + + InformationRegister.СписокБизнесПроцессов.Resource.Завершен + + View + true + + + + SessionParameter.ТекущийПользователь + + Get + true + + + + Task.ЗадачаИсполнителя.Attribute.ДатаНачала + + View + true + + + + BusinessProcess.Задание.Attribute.ОписаниеЗадания + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.Attribute.ГруппаИсполнителейЗадач + + View + true + + + + Task.ЗадачаИсполнителя + + Read + true + + #ПоЗначениямИНаборамРасширенный( "Задача.ЗадачаИсполнителя", "Чтение", "", +"", +"", +"Объект","Т.БизнесПроцесс","ИЛИ", +"Пользователи","Т.Автор","ИЛИ", +"Пользователи","Т.Исполнитель","ИЛИ", +"Пользователи","Т.ГруппаИсполнителейЗадач","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","") + + + + + + View + true + + + InputByString + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Executed + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Description + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.RoutePoint + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.BusinessProcess + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Ref + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.DeletionMark + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Date + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Number + + View + true + + + + BusinessProcess.Задание.Attribute.Проверяющий + + View + true + + + Edit + true + + + + BusinessProcess.Задание.Attribute.СрокИсполнения + + View + true + + + Edit + true + + + + InformationRegister.СписокБизнесПроцессов.Resource.ДатаЗавершения + + View + true + + + + BusinessProcess.Задание.Attribute.Важность + + View + true + + + Edit + true + + + + InformationRegister.СписокБизнесПроцессов.Resource.Наименование + + View + true + + + + BusinessProcess.Задание.Attribute.Исполнитель + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.Attribute.СрокИсполнения + + View + true + + + + InformationRegister.СписокБизнесПроцессов.Resource.Стартован + + View + true + + + + Task.ЗадачаИсполнителя.Command.ВсеЗадачи + + View + true + + + + InformationRegister.СписокБизнесПроцессов.Dimension.БизнесПроцесс + + View + true + + + + InformationRegister.СписокБизнесПроцессов.Resource.ПометкаУдаления + + View + true + + + + BusinessProcess.Задание.Attribute.НомерИтерации + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.Исполнитель + + View + true + + + + InformationRegister.СписокБизнесПроцессов + + Read + true + + #ПоЗначениямИНаборамРасширенный( "РегистрСведений.СписокБизнесПроцессов", "Чтение", "", +"", +"", +"Объект","Т.БизнесПроцесс","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","") + + + + + View + true + + + + InformationRegister.СписокБизнесПроцессов.StandardAttribute.Active + + View + true + + + + InformationRegister.СписокБизнесПроцессов.StandardAttribute.LineNumber + + View + true + + + + InformationRegister.СписокБизнесПроцессов.StandardAttribute.Recorder + + View + true + + + + InformationRegister.СписокБизнесПроцессов.StandardAttribute.Period + + View + true + + + + BusinessProcess.Задание.Attribute.РезультатВыполнения + + View + true + + + Edit + true + + + + BusinessProcess.Задание.Attribute.Подтверждено + + View + true + + + Edit + true + + + + BusinessProcess.Задание.Attribute.СрокПроверки + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.Attribute.Предмет + + View + true + + + + BusinessProcess.Задание.Attribute.Наименование + + View + true + + + Edit + true + + + + BusinessProcess.Задание.Attribute.Автор + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.Attribute.Важность + + View + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.РольИсполнителя + + View + true + + + + Task.ЗадачаИсполнителя.Command.МоиЗадачи + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.ПредметСтрокой + + View + true + + + + BusinessProcess.Задание.Attribute.Предмет + + View + true + + + Edit + true + + + + BusinessProcess.Задание.Attribute.ДатаЗавершения + + View + true + + + Edit + true + + + + BusinessProcess.Задание + + Read + true + + #ПоЗначениямИНаборамРасширенный( "БизнесПроцесс.Задание", "Чтение", "", +"", +"", +"Пользователи","Т.Автор","ИЛИ", +"Пользователи","Т.Исполнитель","ИЛИ", +"Пользователи","Т.Проверяющий","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","") + + + + + Insert + true + + #ПоЗначениям( "БизнесПроцесс.Задание", "Добавление", "", +"Пользователи","Автор", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","") + + + + Update + true + + #ПоЗначениям( "БизнесПроцесс.Задание", "Изменение", "", +"Пользователи","Автор", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","") + + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + InteractiveActivate + true + + + Start + true + + + InteractiveStart + true + + + + BusinessProcess.Задание.StandardAttribute.Started + + View + true + + + Edit + true + + + + BusinessProcess.Задание.StandardAttribute.HeadTask + + View + true + + + Edit + true + + + + BusinessProcess.Задание.StandardAttribute.Completed + + View + true + + + Edit + true + + + + BusinessProcess.Задание.StandardAttribute.Ref + + View + true + + + Edit + true + + + + BusinessProcess.Задание.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + BusinessProcess.Задание.StandardAttribute.Date + + View + true + + + Edit + true + + + + BusinessProcess.Задание.StandardAttribute.Number + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.Command.Перенаправить + + View + true + + + + InformationRegister.СписокБизнесПроцессов.Resource.Номер + + View + true + + + + BusinessProcess.Задание.Attribute.НаПроверке + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.Attribute.Описание + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.ДатаИсполнения + + View + true + + + + InformationRegister.СписокБизнесПроцессов.Command.МоиБизнесПроцессы + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.Автор + + View + true + + + + ПоЗначениям + // ПоЗначениям ( Таблица, Право, Модификатор, В1,П1, В2,Р2, ..., В(n), П(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, ..., 2+n*2,3+n*2 . +// Читается так: "ограничение доступа по значениям". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле значения, проверяемого по виду доступа, кроме случая В(n) = "Условие" (или ""). +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И <Условие по группе параметров 2> И ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", +// "Организации","Организация", +// "Поставщики","Контрагент", "","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр5 + ПО + ТипЗначения(#Параметр(5)) = ТипЗначения(ТипыСсылокПараметр5.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр9 + ПО + ТипЗначения(#Параметр(9)) = ТипЗначения(ТипыСсылокПараметр9.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр11 + ПО + ТипЗначения(#Параметр(11)) = ТипЗначения(ТипыСсылокПараметр11.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр15 + ПО + ТипЗначения(#Параметр(15)) = ТипЗначения(ТипыСсылокПараметр15.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр17 + ПО + ТипЗначения(#Параметр(17)) = ТипЗначения(ТипыСсылокПараметр17.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр21 + ПО + ТипЗначения(#Параметр(21)) = ТипЗначения(ТипыСсылокПараметр21.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр23 + ПО + ТипЗначения(#Параметр(23)) = ТипЗначения(ТипыСсылокПараметр23.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр27 + ПО + ТипЗначения(#Параметр(27)) = ТипЗначения(ТипыСсылокПараметр27.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр29 + ПО + ТипЗначения(#Параметр(29)) = ТипЗначения(ТипыСсылокПараметр29.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр33 + ПО + ТипЗначения(#Параметр(33)) = ТипЗначения(ТипыСсылокПараметр33.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр35 + ПО + ТипЗначения(#Параметр(35)) = ТипЗначения(ТипыСсылокПараметр35.ТипТаблицы) +#КонецЕсли + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(4)" = "Условие" ИЛИ "#Параметр(4)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(5) ) +#ИначеЕсли "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + #Параметр(5) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр5.ТипТаблицы + #Если "#Параметр(4)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(4)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(4) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(4)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(4)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(4) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(5) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(5) + #ИначеЕсли "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(4) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(4) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(4) + #КонецЕсли + #Иначе // "Т.##Параметр(5)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(6)" = "" И "#Параметр(7)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + И #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(7) + #ИначеЕсли "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "Т.##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(8)" = "" И "#Параметр(9)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(8)" = "Условие" ИЛИ "#Параметр(8)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(9) ) +#ИначеЕсли "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + И #Параметр(9) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр9.ТипТаблицы + #Если "#Параметр(8)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(8)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(8) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(8)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(8)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(8) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(9) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(9) + #ИначеЕсли "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(8) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(8) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(8) + #КонецЕсли + #Иначе // "Т.##Параметр(9)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(10)" = "" И "#Параметр(11)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(10)" = "Условие" ИЛИ "#Параметр(10)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(11) ) +#ИначеЕсли "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + И #Параметр(11) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр11.ТипТаблицы + #Если "#Параметр(10)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(10)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(10) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(10)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(10)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(10) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(11) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(11) + #ИначеЕсли "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(10) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(10) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(10) + #КонецЕсли + #Иначе // "Т.##Параметр(11)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + И #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(13) + #ИначеЕсли "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "Т.##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(14)" = "" И "#Параметр(15)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(14)" = "Условие" ИЛИ "#Параметр(14)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(15) ) +#ИначеЕсли "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + И #Параметр(15) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр15.ТипТаблицы + #Если "#Параметр(14)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(14)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(14) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(14)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(14)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(14) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(15) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(15) + #ИначеЕсли "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(14) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(14) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(14) + #КонецЕсли + #Иначе // "Т.##Параметр(15)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(16)" = "" И "#Параметр(17)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(16)" = "Условие" ИЛИ "#Параметр(16)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(17) ) +#ИначеЕсли "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + И #Параметр(17) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр17.ТипТаблицы + #Если "#Параметр(16)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(16)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(16) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(16)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(16)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(16) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(17) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(17) + #ИначеЕсли "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(16) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(16) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(16) + #КонецЕсли + #Иначе // "Т.##Параметр(17)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + И #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(19) + #ИначеЕсли "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "Т.##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(20)" = "" И "#Параметр(21)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(20)" = "Условие" ИЛИ "#Параметр(20)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(21) ) +#ИначеЕсли "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + И #Параметр(21) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр21.ТипТаблицы + #Если "#Параметр(20)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(20)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(20) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(20)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(20)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(20) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(21) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(21) + #ИначеЕсли "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(20) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(20) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(20) + #КонецЕсли + #Иначе // "Т.##Параметр(21)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(22)" = "" И "#Параметр(23)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(22)" = "Условие" ИЛИ "#Параметр(22)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(23) ) +#ИначеЕсли "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + И #Параметр(23) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр23.ТипТаблицы + #Если "#Параметр(22)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(22)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(22) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(22)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(22)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(22) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(23) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(23) + #ИначеЕсли "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(22) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(22) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(22) + #КонецЕсли + #Иначе // "Т.##Параметр(23)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + И #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(25) + #ИначеЕсли "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "Т.##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(26)" = "" И "#Параметр(27)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(26)" = "Условие" ИЛИ "#Параметр(26)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(27) ) +#ИначеЕсли "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + И #Параметр(27) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр27.ТипТаблицы + #Если "#Параметр(26)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(26)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(26) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(26)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(26)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(26) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(27) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(27) + #ИначеЕсли "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(26) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(26) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(26) + #КонецЕсли + #Иначе // "Т.##Параметр(27)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(28)" = "" И "#Параметр(29)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(28)" = "Условие" ИЛИ "#Параметр(28)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(29) ) +#ИначеЕсли "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + И #Параметр(29) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр29.ТипТаблицы + #Если "#Параметр(28)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(28)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(28) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(28)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(28)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(28) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(29) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(29) + #ИначеЕсли "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(28) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(28) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(28) + #КонецЕсли + #Иначе // "Т.##Параметр(29)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + И #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(31) + #ИначеЕсли "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "Т.##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(32)" = "" И "#Параметр(33)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(32)" = "Условие" ИЛИ "#Параметр(32)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(33) ) +#ИначеЕсли "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + И #Параметр(33) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр33.ТипТаблицы + #Если "#Параметр(32)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(32)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(32) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(32)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(32)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(32) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(33) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(33) + #ИначеЕсли "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(32) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(32) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(32) + #КонецЕсли + #Иначе // "Т.##Параметр(33)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(34)" = "" И "#Параметр(35)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(34)" = "Условие" ИЛИ "#Параметр(34)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(35) ) +#ИначеЕсли "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + И #Параметр(35) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр35.ТипТаблицы + #Если "#Параметр(34)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(34)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(34) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(34)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(34)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(34) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(35) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(35) + #ИначеЕсли "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(34) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(34) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(34) + #КонецЕсли + #Иначе // "Т.##Параметр(35)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + + ) +) +#КонецЕсли + + + + + ПоЗначениямИНаборамРасширенный + // ПоЗначениямИНаборамРасширенный ( Таблица, Право, Модификатор, ПрисоединяемыеТаблицы, О, В1,П1,О1, В2,П2,О2,..., В(n), П(n), О(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,...,3+n*3,4+n*3,5+n*3 . +// Читается так: "ограничение доступа по наборам и значениям расширенный". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ПрисоединяемыеТаблицы - текст присоедиения дополнительных таблиц на языке запросов, например, +// "ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ОплатаПоставщикам КАК Т1 +// ПО Т.Ссылка = Т1.Ссылка". +// Присоединение позволяет указать поля таблицы ОплатаПоставщикам, как поля основной таблицы +// для проверки их значений, как значений основной таблицы. +// Следует помнить, что при размножении строк в результате соединения, достаточно чтобы +// всего одна строка прошла условия проверки, т.е. результаты проверки строк объединяются по "ИЛИ". +// О - Начальные скобки "(". +// В(n) - ВидДоступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// Когда В(n) = "Объект" (или " "), то +// когда есть запись зависимости прав в регистре сведений ЗависимостиПравДоступа +// тогда используется данные записи - проверка указанного права Т.Р(n) и/или наборов значений доступа +// в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.Р(n) для указанного ограничения права; +// иначе используется стандартное правило: +// когда Право = "Чтение" тогда выполняется проверка права чтения Т.Р(n) и наборов значений доступа +// в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.Р(n) для права чтения; +// когда Право = "Добавление" ИЛИ "Изменение" ИЛИ "Удаление" тогда выполняется проверка права изменения Т.Р(n) +// и наборов значений доступа, считываемых по ссылке Т.Р(n) для права изменения. +// П(n) - Поле с псевдонимом, например "Т.Организация", значение которого проверяется +// по виду доступа, кроме случая В(n) = "Условие" (или ""). +// О(n) - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")". +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Соединение по таблице1> <Соединение по таблице2> ... <Соединение по таблице(m)> +// <Общая часть условий> <Условие по группе параметров 1> И/ИЛИ <Условие по группе параметров 1> И/ИЛИ ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениямИНаборамРасширенный("ЖурналДокументов.СкладскиеДокументы", "Чтение", "", +// "", +// "", +// "Объект","Т.Ссылка","И", +// "Объект","Т.ОсновнойДокумент","", "","","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 1. +#Если "#Параметр(6)" = "Объект" ИЛИ "#Параметр(6)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр7 + ПО + ТипыСсылокПараметр7.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр7.Объект = #Параметр(7) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр7 + ПО + ЗависимостиПравПараметр7.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр7.ТипВедущейТаблицы = ТипыСсылокПараметр7.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр10 + ПО + ТипЗначения(#Параметр(10)) = ТипЗначения(ТипыСсылокПараметр10.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 2. +#Если "#Параметр(9)" = "Объект" ИЛИ "#Параметр(9)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр10 + ПО + ТипыСсылокПараметр10.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр10.Объект = #Параметр(10) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр10 + ПО + ЗависимостиПравПараметр10.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр10.ТипВедущейТаблицы = ТипыСсылокПараметр10.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 3. +#Если "#Параметр(12)" = "Объект" ИЛИ "#Параметр(12)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр13 + ПО + ТипыСсылокПараметр13.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр13.Объект = #Параметр(13) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр13 + ПО + ЗависимостиПравПараметр13.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр13.ТипВедущейТаблицы = ТипыСсылокПараметр13.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр16 + ПО + ТипЗначения(#Параметр(16)) = ТипЗначения(ТипыСсылокПараметр16.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 4. +#Если "#Параметр(15)" = "Объект" ИЛИ "#Параметр(15)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр16 + ПО + ТипыСсылокПараметр16.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр16.Объект = #Параметр(16) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр16 + ПО + ЗависимостиПравПараметр16.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр16.ТипВедущейТаблицы = ТипыСсылокПараметр16.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 5. +#Если "#Параметр(18)" = "Объект" ИЛИ "#Параметр(18)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр19 + ПО + ТипыСсылокПараметр19.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр19.Объект = #Параметр(19) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр19 + ПО + ЗависимостиПравПараметр19.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр19.ТипВедущейТаблицы = ТипыСсылокПараметр19.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр22 + ПО + ТипЗначения(#Параметр(22)) = ТипЗначения(ТипыСсылокПараметр22.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 6. +#Если "#Параметр(21)" = "Объект" ИЛИ "#Параметр(21)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр22 + ПО + ТипыСсылокПараметр22.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр22.Объект = #Параметр(22) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр22 + ПО + ЗависимостиПравПараметр22.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр22.ТипВедущейТаблицы = ТипыСсылокПараметр22.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 7. +#Если "#Параметр(24)" = "Объект" ИЛИ "#Параметр(24)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр25 + ПО + ТипыСсылокПараметр25.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр25.Объект = #Параметр(25) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр25 + ПО + ЗависимостиПравПараметр25.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр25.ТипВедущейТаблицы = ТипыСсылокПараметр25.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр28 + ПО + ТипЗначения(#Параметр(28)) = ТипЗначения(ТипыСсылокПараметр28.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 8. +#Если "#Параметр(27)" = "Объект" ИЛИ "#Параметр(27)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр28 + ПО + ТипыСсылокПараметр28.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр28.Объект = #Параметр(28) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр28 + ПО + ЗависимостиПравПараметр28.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр28.ТипВедущейТаблицы = ТипыСсылокПараметр28.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 9. +#Если "#Параметр(30)" = "Объект" ИЛИ "#Параметр(30)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр31 + ПО + ТипыСсылокПараметр31.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр31.Объект = #Параметр(31) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр31 + ПО + ЗависимостиПравПараметр31.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр31.ТипВедущейТаблицы = ТипыСсылокПараметр31.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр34 + ПО + ТипЗначения(#Параметр(34)) = ТипЗначения(ТипыСсылокПараметр34.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 10. +#Если "#Параметр(33)" = "Объект" ИЛИ "#Параметр(33)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр34 + ПО + ТипыСсылокПараметр34.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр34.Объект = #Параметр(34) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр34 + ПО + ЗависимостиПравПараметр34.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр34.ТипВедущейТаблицы = ТипыСсылокПараметр34.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр37 + ПО + ТипЗначения(#Параметр(37)) = ТипЗначения(ТипыСсылокПараметр37.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 11. +#Если "#Параметр(36)" = "Объект" ИЛИ "#Параметр(36)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр37 + ПО + ТипыСсылокПараметр37.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр37.Объект = #Параметр(37) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр37 + ПО + ЗависимостиПравПараметр37.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр37.ТипВедущейТаблицы = ТипыСсылокПараметр37.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр40 + ПО + ТипЗначения(#Параметр(40)) = ТипЗначения(ТипыСсылокПараметр40.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 12. +#Если "#Параметр(39)" = "Объект" ИЛИ "#Параметр(39)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр40 + ПО + ТипыСсылокПараметр40.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр40.Объект = #Параметр(40) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр40 + ПО + ЗависимостиПравПараметр40.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр40.ТипВедущейТаблицы = ТипыСсылокПараметр40.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр43 + ПО + ТипЗначения(#Параметр(43)) = ТипЗначения(ТипыСсылокПараметр43.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 13. +#Если "#Параметр(42)" = "Объект" ИЛИ "#Параметр(42)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр43 + ПО + ТипыСсылокПараметр43.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр43.Объект = #Параметр(43) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр43 + ПО + ЗависимостиПравПараметр43.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр43.ТипВедущейТаблицы = ТипыСсылокПараметр43.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр46 + ПО + ТипЗначения(#Параметр(46)) = ТипЗначения(ТипыСсылокПараметр46.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 14. +#Если "#Параметр(45)" = "Объект" ИЛИ "#Параметр(45)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр46 + ПО + ТипыСсылокПараметр46.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр46.Объект = #Параметр(46) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр46 + ПО + ЗависимостиПравПараметр46.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр46.ТипВедущейТаблицы = ТипыСсылокПараметр46.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр49 + ПО + ТипЗначения(#Параметр(49)) = ТипЗначения(ТипыСсылокПараметр49.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 15. +#Если "#Параметр(48)" = "Объект" ИЛИ "#Параметр(48)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр49 + ПО + ТипыСсылокПараметр49.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр49.Объект = #Параметр(49) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр49 + ПО + ЗависимостиПравПараметр49.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр49.ТипВедущейТаблицы = ТипыСсылокПараметр49.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр52 + ПО + ТипЗначения(#Параметр(52)) = ТипЗначения(ТипыСсылокПараметр52.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 16. +#Если "#Параметр(51)" = "Объект" ИЛИ "#Параметр(51)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр52 + ПО + ТипыСсылокПараметр52.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр52.Объект = #Параметр(52) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр52 + ПО + ЗависимостиПравПараметр52.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр52.ТипВедущейТаблицы = ТипыСсылокПараметр52.ТипОбъекта +#КонецЕсли + +// Присоединяемые таблицы к проверяемой строке текущей таблицы "Т". +#Параметр(4) + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + + #Параметр(5) // [([(][(]...] 0-n открывающихся скобок. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(6)" = "Объект" ИЛИ "#Параметр(6)" = " " #Тогда + #Параметр(7) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр7.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр7.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(7) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(7) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(7) + #ИначеЕсли "#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(8) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(9)" = "" И "#Параметр(10)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(9)" = "Условие" ИЛИ "#Параметр(9)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(10) ) +#ИначеЕсли "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + #Параметр(10) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр10.ТипТаблицы + #Если "#Параметр(9)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(9)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(9)" = "Объект" ИЛИ "#Параметр(9)" = " " #Тогда + #Параметр(10) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр10.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр10.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(10) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(10) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(9) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(9)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(9)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(10)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(9) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(10) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(10) + #ИначеЕсли "#Параметр(10)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(9) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(9) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(9) + #КонецЕсли + #Иначе // "##Параметр(10)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(11) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(12)" = "Объект" ИЛИ "#Параметр(12)" = " " #Тогда + #Параметр(13) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр13.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр13.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(13) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(13) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(13) + #ИначеЕсли "#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(14) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(15)" = "" И "#Параметр(16)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(15)" = "Условие" ИЛИ "#Параметр(15)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(16) ) +#ИначеЕсли "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + #Параметр(16) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр16.ТипТаблицы + #Если "#Параметр(15)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(15)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(15)" = "Объект" ИЛИ "#Параметр(15)" = " " #Тогда + #Параметр(16) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр16.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр16.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(16) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(16) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(15) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(15)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(15)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(16)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(15) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(16) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(16) + #ИначеЕсли "#Параметр(16)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(15) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(15) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(15) + #КонецЕсли + #Иначе // "##Параметр(16)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(17) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(18)" = "Объект" ИЛИ "#Параметр(18)" = " " #Тогда + #Параметр(19) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр19.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр19.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(19) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(19) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(19) + #ИначеЕсли "#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(20) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(21)" = "" И "#Параметр(22)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(21)" = "Условие" ИЛИ "#Параметр(21)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(22) ) +#ИначеЕсли "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + #Параметр(22) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр22.ТипТаблицы + #Если "#Параметр(21)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(21)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(21)" = "Объект" ИЛИ "#Параметр(21)" = " " #Тогда + #Параметр(22) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр22.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр22.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(22) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(22) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(21) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(21)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(21)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(22)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(21) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(22) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(22) + #ИначеЕсли "#Параметр(22)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(21) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(21) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(21) + #КонецЕсли + #Иначе // "##Параметр(22)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(23) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(24)" = "Объект" ИЛИ "#Параметр(24)" = " " #Тогда + #Параметр(25) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр25.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр25.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(25) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(25) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(25) + #ИначеЕсли "#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(26) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(27)" = "" И "#Параметр(28)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(27)" = "Условие" ИЛИ "#Параметр(27)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(28) ) +#ИначеЕсли "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + #Параметр(28) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр28.ТипТаблицы + #Если "#Параметр(27)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(27)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(27)" = "Объект" ИЛИ "#Параметр(27)" = " " #Тогда + #Параметр(28) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр28.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр28.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(28) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(28) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(27) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(27)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(27)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(28)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(27) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(28) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(28) + #ИначеЕсли "#Параметр(28)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(27) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(27) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(27) + #КонецЕсли + #Иначе // "##Параметр(28)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(29) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(30)" = "Объект" ИЛИ "#Параметр(30)" = " " #Тогда + #Параметр(31) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр31.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр31.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(31) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(31) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(31) + #ИначеЕсли "#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(32) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(33)" = "" И "#Параметр(34)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(33)" = "Условие" ИЛИ "#Параметр(33)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(34) ) +#ИначеЕсли "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + #Параметр(34) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр34.ТипТаблицы + #Если "#Параметр(33)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(33)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(33)" = "Объект" ИЛИ "#Параметр(33)" = " " #Тогда + #Параметр(34) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр34.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр34.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(34) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(34) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(33) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(33)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(33)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(34)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(33) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(34) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(34) + #ИначеЕсли "#Параметр(34)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(33) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(33) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(33) + #КонецЕсли + #Иначе // "##Параметр(34)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(35) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(36)" = "" И "#Параметр(37)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(36)" = "Условие" ИЛИ "#Параметр(36)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(37) ) +#ИначеЕсли "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + #Параметр(37) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр37.ТипТаблицы + #Если "#Параметр(36)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(36)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(36)" = "Объект" ИЛИ "#Параметр(36)" = " " #Тогда + #Параметр(37) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр37.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр37.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(37) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(37) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(36) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(36)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(36)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(37)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(36) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(37) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(37) + #ИначеЕсли "#Параметр(37)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(36) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(36) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(36) + #КонецЕсли + #Иначе // "##Параметр(37)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(38) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(39)" = "" И "#Параметр(40)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(39)" = "Условие" ИЛИ "#Параметр(39)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(40) ) +#ИначеЕсли "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + #Параметр(40) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр40.ТипТаблицы + #Если "#Параметр(39)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(39)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(39)" = "Объект" ИЛИ "#Параметр(39)" = " " #Тогда + #Параметр(40) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр40.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр40.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(40) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(40) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(39) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(39)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(39)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(40)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(39) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(40) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(40) + #ИначеЕсли "#Параметр(40)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(39) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(39) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(39) + #КонецЕсли + #Иначе // "##Параметр(40)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(41) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(42)" = "" И "#Параметр(43)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(42)" = "Условие" ИЛИ "#Параметр(42)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(43) ) +#ИначеЕсли "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + #Параметр(43) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр43.ТипТаблицы + #Если "#Параметр(42)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(42)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(42)" = "Объект" ИЛИ "#Параметр(42)" = " " #Тогда + #Параметр(43) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр43.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр43.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(43) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(43) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(42) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(42)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(42)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(43)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(42) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(43) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(43) + #ИначеЕсли "#Параметр(43)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(42) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(42) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(42) + #КонецЕсли + #Иначе // "##Параметр(43)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(44) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(45)" = "" И "#Параметр(46)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(45)" = "Условие" ИЛИ "#Параметр(45)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(46) ) +#ИначеЕсли "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + #Параметр(46) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр46.ТипТаблицы + #Если "#Параметр(45)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(45)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(45)" = "Объект" ИЛИ "#Параметр(45)" = " " #Тогда + #Параметр(46) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр46.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр46.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(46) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(46) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(45) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(45)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(45)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(46)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(45) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(46) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(46) + #ИначеЕсли "#Параметр(46)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(45) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(45) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(45) + #КонецЕсли + #Иначе // "##Параметр(46)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(47) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(48)" = "" И "#Параметр(49)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(48)" = "Условие" ИЛИ "#Параметр(48)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(49) ) +#ИначеЕсли "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + #Параметр(49) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр49.ТипТаблицы + #Если "#Параметр(48)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(48)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(48)" = "Объект" ИЛИ "#Параметр(48)" = " " #Тогда + #Параметр(49) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр49.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр49.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(49) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(49) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(48) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(48)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(48)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(49)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(48) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(49) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(49) + #ИначеЕсли "#Параметр(49)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(48) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(48) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(48) + #КонецЕсли + #Иначе // "##Параметр(49)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(50) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(51)" = "" И "#Параметр(52)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(51)" = "Условие" ИЛИ "#Параметр(51)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(52) ) +#ИначеЕсли "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + #Параметр(52) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр52.ТипТаблицы + #Если "#Параметр(51)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(51)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(51)" = "Объект" ИЛИ "#Параметр(51)" = " " #Тогда + #Параметр(52) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр52.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр52.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(52) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(52) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(51) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(51)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(51)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(52)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(51) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(52) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(52) + #ИначеЕсли "#Параметр(52)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(51) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(51) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(51) + #КонецЕсли + #Иначе // "##Параметр(52)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(53) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + + ) +) +#КонецЕсли + + + + + ПоЗначениямРасширенный + // ПоЗначениямРасширенный ( Таблица, Право, Модификатор, ПрисоединяемыеТаблицы, О, В1,П1,О1, В2,П2,О2,..., В(n), П(n), О(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,...,3+n*3,4+n*3,5+n*3 . +// Читается так: "ограничение доступа по значениям расширенный". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ПрисоединяемыеТаблицы - текст присоедиения дополнительных таблиц на языке запросов, например, +// "ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ОплатаПоставщикам КАК Т1 +// ПО Т.Ссылка = Т1.Ссылка". +// Присоединение позволяет указать поля таблицы ОплатаПоставщикам, как поля основной таблицы +// для проверки их значений, как значений основной таблицы. +// Следует помнить, что при размножении строк в результате соединения, достаточно чтобы +// всего одна строка прошла условия проверки, т.е. результаты проверки строк объединяются по "ИЛИ". +// О - Начальные скобки "(". +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле с псевдонимом, например "Т.Организация", значение которого проверяется +// по виду доступа, кроме случая В(n) = "Условие" (или ""). +// О(n) - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")". +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И/ИЛИ <Условие по группе параметров 2> И/ИЛИ ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениямРасширенный("Документ.ПеремещениеТоваров", "Чтение", "", +// "", +// "", +// "Организации","Т.Организация","И(", +// "Склады","Т.СкладОтправитель","ИЛИ", +// "Склады","Т.СкладПолучатель",")", "","","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр10 + ПО + ТипЗначения(#Параметр(10)) = ТипЗначения(ТипыСсылокПараметр10.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр16 + ПО + ТипЗначения(#Параметр(16)) = ТипЗначения(ТипыСсылокПараметр16.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр22 + ПО + ТипЗначения(#Параметр(22)) = ТипЗначения(ТипыСсылокПараметр22.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр28 + ПО + ТипЗначения(#Параметр(28)) = ТипЗначения(ТипыСсылокПараметр28.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр34 + ПО + ТипЗначения(#Параметр(34)) = ТипЗначения(ТипыСсылокПараметр34.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр37 + ПО + ТипЗначения(#Параметр(37)) = ТипЗначения(ТипыСсылокПараметр37.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр40 + ПО + ТипЗначения(#Параметр(40)) = ТипЗначения(ТипыСсылокПараметр40.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр43 + ПО + ТипЗначения(#Параметр(43)) = ТипЗначения(ТипыСсылокПараметр43.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр46 + ПО + ТипЗначения(#Параметр(46)) = ТипЗначения(ТипыСсылокПараметр46.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр49 + ПО + ТипЗначения(#Параметр(49)) = ТипЗначения(ТипыСсылокПараметр49.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр52 + ПО + ТипЗначения(#Параметр(52)) = ТипЗначения(ТипыСсылокПараметр52.ТипТаблицы) +#КонецЕсли + +// Присоединяемые таблицы к проверяемой строке текущей таблицы "Т". +#Параметр(4) + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + + #Параметр(5) // [([(][(]...] 0-n открывающихся скобок. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(7) + #ИначеЕсли "#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(8) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(9)" = "" И "#Параметр(10)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(9)" = "Условие" ИЛИ "#Параметр(9)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(10) ) +#ИначеЕсли "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + #Параметр(10) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр10.ТипТаблицы + #Если "#Параметр(9)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(9)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(9) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(9)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(9)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(10)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(9) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(10) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(10) + #ИначеЕсли "#Параметр(10)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(9) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(9) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(9) + #КонецЕсли + #Иначе // "##Параметр(10)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(11) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(13) + #ИначеЕсли "#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(14) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(15)" = "" И "#Параметр(16)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(15)" = "Условие" ИЛИ "#Параметр(15)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(16) ) +#ИначеЕсли "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + #Параметр(16) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр16.ТипТаблицы + #Если "#Параметр(15)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(15)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(15) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(15)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(15)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(16)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(15) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(16) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(16) + #ИначеЕсли "#Параметр(16)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(15) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(15) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(15) + #КонецЕсли + #Иначе // "##Параметр(16)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(17) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(19) + #ИначеЕсли "#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(20) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(21)" = "" И "#Параметр(22)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(21)" = "Условие" ИЛИ "#Параметр(21)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(22) ) +#ИначеЕсли "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + #Параметр(22) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр22.ТипТаблицы + #Если "#Параметр(21)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(21)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(21) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(21)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(21)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(22)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(21) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(22) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(22) + #ИначеЕсли "#Параметр(22)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(21) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(21) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(21) + #КонецЕсли + #Иначе // "##Параметр(22)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(23) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(25) + #ИначеЕсли "#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(26) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(27)" = "" И "#Параметр(28)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(27)" = "Условие" ИЛИ "#Параметр(27)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(28) ) +#ИначеЕсли "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + #Параметр(28) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр28.ТипТаблицы + #Если "#Параметр(27)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(27)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(27) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(27)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(27)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(28)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(27) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(28) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(28) + #ИначеЕсли "#Параметр(28)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(27) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(27) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(27) + #КонецЕсли + #Иначе // "##Параметр(28)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(29) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(31) + #ИначеЕсли "#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(32) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(33)" = "" И "#Параметр(34)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(33)" = "Условие" ИЛИ "#Параметр(33)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(34) ) +#ИначеЕсли "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + #Параметр(34) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр34.ТипТаблицы + #Если "#Параметр(33)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(33)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(33) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(33)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(33)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(34)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(33) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(34) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(34) + #ИначеЕсли "#Параметр(34)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(33) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(33) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(33) + #КонецЕсли + #Иначе // "##Параметр(34)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(35) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(36)" = "" И "#Параметр(37)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(36)" = "Условие" ИЛИ "#Параметр(36)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(37) ) +#ИначеЕсли "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + #Параметр(37) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр37.ТипТаблицы + #Если "#Параметр(36)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(36)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(36) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(36)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(36)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(37)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(36) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(37) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(37) + #ИначеЕсли "#Параметр(37)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(36) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(36) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(36) + #КонецЕсли + #Иначе // "##Параметр(37)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(38) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(39)" = "" И "#Параметр(40)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(39)" = "Условие" ИЛИ "#Параметр(39)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(40) ) +#ИначеЕсли "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + #Параметр(40) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр40.ТипТаблицы + #Если "#Параметр(39)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(39)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(39) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(39)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(39)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(40)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(39) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(40) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(40) + #ИначеЕсли "#Параметр(40)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(39) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(39) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(39) + #КонецЕсли + #Иначе // "##Параметр(40)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(41) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(42)" = "" И "#Параметр(43)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(42)" = "Условие" ИЛИ "#Параметр(42)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(43) ) +#ИначеЕсли "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + #Параметр(43) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр43.ТипТаблицы + #Если "#Параметр(42)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(42)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(42) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(42)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(42)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(43)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(42) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(43) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(43) + #ИначеЕсли "#Параметр(43)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(42) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(42) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(42) + #КонецЕсли + #Иначе // "##Параметр(43)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(44) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(45)" = "" И "#Параметр(46)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(45)" = "Условие" ИЛИ "#Параметр(45)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(46) ) +#ИначеЕсли "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + #Параметр(46) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр46.ТипТаблицы + #Если "#Параметр(45)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(45)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(45) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(45)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(45)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(46)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(45) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(46) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(46) + #ИначеЕсли "#Параметр(46)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(45) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(45) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(45) + #КонецЕсли + #Иначе // "##Параметр(46)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(47) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(48)" = "" И "#Параметр(49)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(48)" = "Условие" ИЛИ "#Параметр(48)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(49) ) +#ИначеЕсли "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + #Параметр(49) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр49.ТипТаблицы + #Если "#Параметр(48)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(48)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(48) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(48)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(48)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(49)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(48) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(49) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(49) + #ИначеЕсли "#Параметр(49)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(48) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(48) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(48) + #КонецЕсли + #Иначе // "##Параметр(49)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(50) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(51)" = "" И "#Параметр(52)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(51)" = "Условие" ИЛИ "#Параметр(51)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(52) ) +#ИначеЕсли "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + #Параметр(52) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр52.ТипТаблицы + #Если "#Параметр(51)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(51)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(51) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(51)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(51)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(52)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(51) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(52) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(52) + #ИначеЕсли "#Параметр(52)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(51) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(51) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(51) + #КонецЕсли + #Иначе // "##Параметр(52)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(53) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + + ) +) +#КонецЕсли + + + + + ПоНаборамЗначений + // ПоНаборамЗначений ( Таблица, Право, Модификатор, ВладелецНаборов). +// № параметра: 1, 2, 3, 4 . +// Читается так: "ограничение доступа по наборам значений". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ВладелецНаборов - имя поля, содержащего ссылку на объект-владелец +// наборов значений доступа в регистре сведений НаборыЗначенийДоступа. +// Если имя поля не задано, считается, что проверяется сам объект-владелец +// наборов значений доступа, который имеет табличную часть <Таблица>.НаборыЗначенийДоступа. +// Эта табличная часть применяется, когда Право - "Добавление" или "Изменение". +// Табличная часть точно такая, как РегистрСведений.НаборыЗначенийДоступа +// без измерения Объект и без реквизитов, которые используются для повышения производительности. +// Для журналов документов нужно указать "Ссылка". +// +// Пример1: ПоНаборамЗначений("Документ.КорректировкаДенежныхСредств", "Чтение", "", "" ) +// Пример2: ПоНаборамЗначений("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", "" ) +// Пример3: ПоНаборамЗначений("ЖурналДокументов.СкладскиеДокументы", "Чтение", "", "Ссылка" ) +// Пример4: ПоНаборамЗначений("Справочник.ВложенияЭлектронныхПисем", "Чтение", "", "Владелец" ) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ГДЕ // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + ИЗ #Параметр(1).НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Ссылка = Т.Ссылка + #Иначе + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + #Если "#Параметр(4)" = "" #Тогда + НомераНаборов.Объект = Т.Ссылка + #Иначе + НомераНаборов.Объект = Т.#Параметр(4) + #КонецЕсли + #КонецЕсли + И НомераНаборов.#Параметр(2) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + ИЗ #Параметр(1).НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Ссылка = Т.Ссылка + #Иначе + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + #Если "#Параметр(4)" = "" #Тогда + НаборыЗначений.Объект = Т.Ссылка + #Иначе + НаборыЗначений.Объект = Т.#Параметр(4) + #КонецЕсли + #КонецЕсли + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + ( + Выбор + // Проверка заведомого ложного или заведомо истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), + Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) ) + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТипЗначения(ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы) = ТипЗначения(НаборыЗначений.ЗначениеДоступа) + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Иначе + Когда НаборыЗначений.ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #КонецЕсли + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаЧерезПраваПоЗначениямДоступа) + #Иначе + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + #КонецЕсли + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + НаборыЗначений.ВидДоступа В (&ВидыДоступаЕдинственныеДляТипаЗначенияДоступа) + #Иначе + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + #КонецЕсли + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезГруппЗначенияДоступа) + #Иначе + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + #КонецЕсли + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) + ) // НЕ Ложь В + ) +) +#КонецЕсли + + + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеЗаданий/ДобавлениеИзменениеЗаданий.mdo b/SSL/src/Roles/ДобавлениеИзменениеЗаданий/ДобавлениеИзменениеЗаданий.mdo new file mode 100644 index 000000000..8f54f16a7 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеЗаданий/ДобавлениеИзменениеЗаданий.mdo @@ -0,0 +1,8 @@ + + + ДобавлениеИзменениеЗаданий + + ru + Добавление и изменение заданий + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеОбменовДанными/Rights.rights b/SSL/src/Roles/ДобавлениеИзменениеОбменовДанными/Rights.rights new file mode 100644 index 000000000..721c08764 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеОбменовДанными/Rights.rights @@ -0,0 +1,2026 @@ + + + false + false + true + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ДанныеУспешноЗагружены + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.КоличествоОбъектовНесопоставленных + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаСортировки.Attribute.ИмяПоля + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаНеутвержденныхСвязей.Attribute.УникальныйИдентификаторПриемника + + View + true + + + Edit + true + + + + CommonCommand.НастроитьПараметрыТранспортаСообщенийОбмена + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FILEСжиматьФайлИсходящегоСообщения + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.ПрефиксИнформационнойБазыИсточника + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.Attribute.РегламентноеЗаданиеGUID + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.EMAILУчетнаяЗапись + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Resource.ПравилаXML + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.FTPСоединениеПорт + + View + true + + + Edit + true + + + + CommonForm.ВыполнениеОбменаДанными + + View + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными.Resource.ДатаОкончания + + View + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ПоляТаблицы + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаНеутвержденныхСвязей.Attribute.УникальныйИдентификаторИсточника + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.КодНовогоУзла + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ПриемникПоле3 + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.ИмяПланаОбмена + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.СписокИспользуемыхПолей + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ИмяТаблицыПриемника + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными + + Use + true + + + View + true + + + + DataProcessor.ТранспортСообщенийОбменаEMAIL + + Use + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз + + Read + true + + + Update + true + + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.StandardAttribute.Active + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.StandardAttribute.LineNumber + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.StandardAttribute.Recorder + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.StandardAttribute.Period + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.FILEКаталогОбменаИнформацией + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.Dimension.УникальныйИдентификаторИсточника + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаНеутвержденныхСвязей.Attribute.ТипПриемника + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ИмяФайлаСообщенияОбмена + + View + true + + + Edit + true + + + + CommonCommand.ОткрытьСценарииОбменовДанными + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ПриемникПоле1 + + View + true + + + Edit + true + + + + DataProcessor.КонвертацияОбъектовРаспределенныхИнформационныхБаз + + Use + true + + + + DataProcessor.ТранспортСообщенийОбменаFTP + + Use + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз + + Use + true + + + View + true + + + + Catalog.СценарииОбменовДанными.TabularSection.НастройкиОбмена + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.TabularSection.НастройкиОбмена.Attribute.ВыполняемоеДействие + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.КоличествоОбъектовВИсточнике + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Resource.ИмяМакетаПравил + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FTPСжиматьФайлИсходящегоСообщения + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.Dimension.УникальныйИдентификаторПриемника + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ПриемникПоле5 + + View + true + + + Edit + true + + + + CommonCommand.ОткрытьФормуУправленияОбменамиДанных + + View + true + + + + CommonCommand.ВыполнитьОбменДаннымиИнтерактивно + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ТипИсточника + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Resource.ИмяПланаОбменаИзПравил + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ПриемникПоле2 + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.ВидТранспортаСообщенийОбмена + + View + true + + + Edit + true + + + + InformationRegister.СостояниеОбменовДанными.Dimension.ДействиеПриОбмене + + View + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.FILEСжиматьФайлИсходящегоСообщения + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Resource.ИсточникПравил + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.StandardAttribute.Code + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Resource.ИмяФайлаПравил + + View + true + + + Edit + true + + + + InformationRegister.СостояниеОбменовДанными.Resource.РезультатВыполненияОбмена + + View + true + + + + CommonCommand.ВыполнитьОбменДанными + + View + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.ВариантРаботыМастера + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.ВидТранспортаСообщенийОбменаПоУмолчанию + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ИсточникПоле5 + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ТипИсточникаСтрокой + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ПоляПоиска + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.ЭтоНастройкаРаспределеннойИнформационнойБазы + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.EMAILМаксимальныйДопустимыйРазмерСообщения + + View + true + + + Edit + true + + + + InformationRegister.СостояниеОбменовДанными.Dimension.УзелИнформационнойБазы + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаСортировки.Attribute.Использование + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.ИспользоватьПараметрыТранспортаFILE + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.ИспользоватьПараметрыТранспортаEMAIL + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.EMAILСжиматьФайлИсходящегоСообщения + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ИсточникПоле2 + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.ИмяФайлаНастроекОбменаДаннымиДляЗагрузки + + View + true + + + Edit + true + + + + InformationRegister.СостояниеОбменовДанными + + Read + true + + + View + true + + + + InformationRegister.СостояниеОбменовДанными.StandardAttribute.Active + + View + true + + + + InformationRegister.СостояниеОбменовДанными.StandardAttribute.LineNumber + + View + true + + + + InformationRegister.СостояниеОбменовДанными.StandardAttribute.Recorder + + View + true + + + + InformationRegister.СостояниеОбменовДанными.StandardAttribute.Period + + View + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.Attribute.НомерВходящегоСообщения + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.Attribute.ИспользоватьРегламентноеЗадание + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.FTPСоединениеМаксимальныйДопустимыйРазмерСообщения + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.TabularSection.НастройкиОбмена.Attribute.УзелИнформационнойБазы + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Resource.ПравилаЗачитанные + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FTPСоединениеМаксимальныйДопустимыйРазмерСообщения + + View + true + + + Edit + true + + + + CommonCommand.ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + + View + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.FTPСоединениеПассивноеСоединение + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Dimension.ИмяПланаОбмена + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FTPСоединениеПорт + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.Attribute.ВидТранспортаСообщенийОбмена + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.СинхронизироватьПоИдентификатору + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Resource.ИнформацияОПравилах + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.EMAILМаксимальныйДопустимыйРазмерСообщения + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ТипПриемника + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.Attribute.ИмяВременногоКаталогаСообщенийОбмена + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FILEКаталогОбменаИнформацией + + View + true + + + Edit + true + + + + InformationRegister.СостояниеОбменовДанными.Resource.ДатаНачала + + View + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.ИмяФайлаНастроекОбменаДанными + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаНеутвержденныхСвязей + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ТипПриемникаСтрокой + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.Resource.УникальныйИдентификаторИсточникаСтрокой + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.КоличествоОбъектовВПриемнике + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.УзелИнформационнойБазы + + View + true + + + Edit + true + + + + DataProcessor.КонвертацияОбъектовИнформационныхБаз + + Use + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ИмяТаблицыПриемника + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.TabularSection.НастройкиОбмена.Attribute.КоличествоЭлементовВТранзакции + + View + true + + + Edit + true + + + + Subsystem.СтандартныеПодсистемы.Subsystem.ОбменДанными + + View + true + + + + InformationRegister.СостояниеОбменовДанными.Resource.ДатаОкончания + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.ВыполнятьОбменВРежимеОтладки + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.КоличествоОбъектовСопоставленных + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.КодПредопределенногоУзла + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.ПарольАрхиваСообщенияОбмена + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ТипОбъектаСтрокой + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.FTPСжиматьФайлИсходящегоСообщения + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.Attribute.УзелИнформационнойБазы + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ПоляТаблицыПриемника + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.FTPСоединениеПользователь + + View + true + + + Edit + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными.Dimension.ДействиеПриОбмене + + View + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ПроцентСопоставленияОбъектов + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Attribute.ИспользоватьФильтрВыборочнойРегистрацииОбъектов + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ПриемникПоле4 + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.Dimension.ВидПравил + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз + + Use + true + + + View + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.Dimension.УзелИнформационнойБазы + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.Attribute.ИмяПланаОбмена + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ИсточникПоле1 + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаНеутвержденныхСвязей.Attribute.ТипИсточника + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена + + Read + true + + + Update + true + + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.StandardAttribute.Active + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.StandardAttribute.LineNumber + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.StandardAttribute.Recorder + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.StandardAttribute.Period + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Dimension.Узел + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.Dimension.ТипПриемника + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными + + Read + true + + + Update + true + + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.StandardAttribute.Active + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.StandardAttribute.LineNumber + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.StandardAttribute.Recorder + + View + true + + + Edit + true + + + + InformationRegister.ПравилаДляОбменаДанными.StandardAttribute.Period + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.ПарольАрхиваСообщенияОбмена + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.EMAILСжиматьФайлИсходящегоСообщения + + View + true + + + Edit + true + + + + CommonForm.УправлениеОбменамиДанных + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.EMAILУчетнаяЗапись + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.FTPСоединениеПароль + + View + true + + + Edit + true + + + + DataProcessor.ТранспортСообщенийОбменаFILE + + Use + true + + + + CommonCommand.ОткрытьПравилаКонвертацииОбъектов + + View + true + + + + InformationRegister.ПравилаДляОбменаДанными.Attribute.ПравилаЗагружены + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ТипПриемникаСтрокой + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ТипИсточникаСтрокой + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.УникальныйИдентификаторПриемника + + View + true + + + Edit + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными.Dimension.УзелИнформационнойБазы + + View + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ИсточникПоле4 + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики.Attribute.ИндексКартинки + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.TabularSection.ИнформацияСтатистики + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.FTPСоединениеПуть + + View + true + + + Edit + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными + + Read + true + + + View + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными.StandardAttribute.Active + + View + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными.StandardAttribute.LineNumber + + View + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными.StandardAttribute.Recorder + + View + true + + + + InformationRegister.СостояниеУспешныхОбменовДанными.StandardAttribute.Period + + View + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FTPСоединениеПароль + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.Пометка + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FTPСоединениеПользователь + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FTPСоединениеПассивноеСоединение + + View + true + + + Edit + true + + + + InformationRegister.СоответствиеОбъектовИнформационныхБаз.Dimension.ТипИсточника + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.УзелИнформационнойБазы + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ИмяТипаОбъектаТаблицыИсточника + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.ИспользоватьПараметрыТранспортаFTP + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.СписокПолейТаблицы + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.ПрефиксИнформационнойБазыИсточникаУстановлен + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.ИсточникПоле3 + + View + true + + + Edit + true + + + + DataProcessor.ЗагрузкаПравилКонвертацииОбъектов + + Use + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ДанныеУспешноЗагружены + + View + true + + + Edit + true + + + + DataProcessor.ПомощникСозданияОбменаДанными.Attribute.НаименованиеНастройкиВыполненияОбмена + + View + true + + + Edit + true + + + + CommonCommand.ОткрытьПравилаРегистрацииОбъектов + + View + true + + + + Catalog.СценарииОбменовДанными.Attribute.Комментарий + + View + true + + + Edit + true + + + + DataProcessor.ЗагрузкаПравилРегистрацииОбъектов + + Use + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.FTPСоединениеПуть + + View + true + + + Edit + true + + + + Catalog.СценарииОбменовДанными.TabularSection.НастройкиОбмена.Attribute.ВидТранспортаОбмена + + View + true + + + Edit + true + + + + Constant.ИспользоватьОбменДанными + + Read + true + + + + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз.Attribute.ИмяФайлаСообщенияОбмена + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаСортировки.Attribute.НаправлениеСортировки + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.Attribute.ПоляПоискаТаблицыПриемника + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаСортировки + + View + true + + + Edit + true + + + + InformationRegister.НастройкиТранспортаОбмена.Resource.ИмяФайлаПротоколаОбмена + + View + true + + + Edit + true + + + + DataProcessor.СопоставлениеОбъектовИнформационныхБаз.TabularSection.ТаблицаАвтоматическиСопоставленныхОбъектов.Attribute.УникальныйИдентификаторИсточника + + View + true + + + Edit + true + + + + CommonCommand.ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + + View + true + + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеОбменовДанными/ДобавлениеИзменениеОбменовДанными.mdo b/SSL/src/Roles/ДобавлениеИзменениеОбменовДанными/ДобавлениеИзменениеОбменовДанными.mdo new file mode 100644 index 000000000..852a4dfa8 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеОбменовДанными/ДобавлениеИзменениеОбменовДанными.mdo @@ -0,0 +1,8 @@ + + + ДобавлениеИзменениеОбменовДанными + + ru + Добавление и изменение обменов данными + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеОпросов/Rights.rights b/SSL/src/Roles/ДобавлениеИзменениеОпросов/Rights.rights new file mode 100644 index 000000000..84874d3ad --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеОпросов/Rights.rights @@ -0,0 +1,361 @@ + + + false + false + true + + Catalog.ШаблоныАнкет + + Read + true + + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Predefined + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Ref + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.IsFolder + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Owner + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Parent + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Description + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Code + + View + true + + + + Catalog.ВопросыШаблонаАнкеты + + Read + true + + + + Document.НазначениеОпросов.Attribute.СвободныйОпрос + + View + true + + + Edit + true + + + + Document.НазначениеОпросов.Attribute.Комментарий + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.Attribute.Заключение + + View + true + + + + Document.НазначениеОпросов.Attribute.ВозможностьПредварительногоСохранения + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.Attribute.Вступление + + View + true + + + + Document.НазначениеОпросов.TabularSection.Респонденты.Attribute.Респондент + + View + true + + + Edit + true + + + + Catalog.ВариантыОтветовАнкет + + Read + true + + + + Document.НазначениеОпросов + + Read + true + + + Insert + true + + + Update + true + + + Posting + true + + + UndoPosting + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InteractivePosting + true + + + InteractivePostingRegular + true + + + InteractiveUndoPosting + true + + + InteractiveChangeOfPosted + true + + + InputByString + true + + + + Document.НазначениеОпросов.StandardAttribute.Posted + + View + true + + + Edit + true + + + + Document.НазначениеОпросов.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Document.НазначениеОпросов.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Document.НазначениеОпросов.StandardAttribute.Date + + View + true + + + Edit + true + + + + Document.НазначениеОпросов.StandardAttribute.Number + + View + true + + + Edit + true + + + + Document.НазначениеОпросов.Attribute.ДатаНачала + + View + true + + + Edit + true + + + + Document.НазначениеОпросов.TabularSection.Респонденты + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.Attribute.РедактированиеШаблонаЗавершено + + View + true + + + + Document.НазначениеОпросов.Attribute.ДатаОкончания + + View + true + + + Edit + true + + + + Document.НазначениеОпросов.Attribute.ТипРеспондентов + + View + true + + + Edit + true + + + + Document.НазначениеОпросов.Attribute.Наименование + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.Attribute.Заголовок + + View + true + + + + Document.НазначениеОпросов.Attribute.НеПоказыватьВАрхивеАнкет + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования + + Read + true + + + + Document.НазначениеОпросов.Attribute.ШаблонАнкеты + + View + true + + + Edit + true + + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеОпросов/ДобавлениеИзменениеОпросов.mdo b/SSL/src/Roles/ДобавлениеИзменениеОпросов/ДобавлениеИзменениеОпросов.mdo new file mode 100644 index 000000000..d1c99ae56 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеОпросов/ДобавлениеИзменениеОпросов.mdo @@ -0,0 +1,8 @@ + + + ДобавлениеИзменениеОпросов + + ru + Добавление и изменение опросов + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеОтветовНаВопросыАнкет/Rights.rights b/SSL/src/Roles/ДобавлениеИзменениеОтветовНаВопросыАнкет/Rights.rights new file mode 100644 index 000000000..4ff2d7828 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеОтветовНаВопросыАнкет/Rights.rights @@ -0,0 +1,360 @@ + + + false + false + true + + Catalog.ШаблоныАнкет + + Read + true + + + + InformationRegister.ОтветыНаВопросыАнкет + + Read + true + + + Update + true + + + + Catalog.ВопросыШаблонаАнкеты + + Read + true + + + + Catalog.ВариантыОтветовАнкет.Attribute.ТребуетОткрытогоОтвета + + View + true + + + + Document.Анкета.Attribute.ДатаРедактирования + + View + true + + + Edit + true + + + + Catalog.ВариантыОтветовАнкет + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Predefined + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Ref + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.IsFolder + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Owner + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Parent + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Description + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Code + + View + true + + + + Document.Анкета.TabularSection.Состав + + View + true + + + Edit + true + + + + Document.НазначениеОпросов + + Read + true + + + + Document.Анкета.TabularSection.Состав.Attribute.ЭлементарныйВопрос + + View + true + + + Edit + true + + + + Document.Анкета + + Read + true + + + Insert + true + + + Update + true + + + Posting + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractivePosting + true + + + InteractivePostingRegular + true + + + InputByString + true + + + + Document.Анкета.StandardAttribute.Posted + + View + true + + + Edit + true + + + + Document.Анкета.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Document.Анкета.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Document.Анкета.StandardAttribute.Date + + View + true + + + Edit + true + + + + Document.Анкета.StandardAttribute.Number + + View + true + + + Edit + true + + + + Document.Анкета.TabularSection.Состав.Attribute.Ответ + + View + true + + + Edit + true + + + + Document.Анкета.TabularSection.Состав.Attribute.ОткрытыйОтвет + + View + true + + + Edit + true + + + + Document.Анкета.Attribute.Опрос + + View + true + + + Edit + true + + + + DataProcessor.СписокРеспондента + + Use + true + + + View + true + + + + Catalog.ВариантыОтветовАнкет.Attribute.РеквизитДопУпорядочивания + + View + true + + + + Document.Анкета.TabularSection.Состав.Attribute.Вопрос + + View + true + + + Edit + true + + + + Document.Анкета.TabularSection.Состав.Attribute.НомерЯчейки + + View + true + + + Edit + true + + + + Document.Анкета.Attribute.РедактируемыйРаздел + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования + + Read + true + + + + DataProcessor.СписокРеспондента.Attribute.Респондент + + View + true + + + Edit + true + + + + Document.Анкета.Attribute.Респондент + + View + true + + + Edit + true + + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеОтветовНаВопросыАнкет/ДобавлениеИзменениеОтветовНаВопросыАнкет.mdo b/SSL/src/Roles/ДобавлениеИзменениеОтветовНаВопросыАнкет/ДобавлениеИзменениеОтветовНаВопросыАнкет.mdo new file mode 100644 index 000000000..0898195f9 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеОтветовНаВопросыАнкет/ДобавлениеИзменениеОтветовНаВопросыАнкет.mdo @@ -0,0 +1,8 @@ + + + ДобавлениеИзменениеОтветовНаВопросыАнкет + + ru + Добавление и изменение ответов на вопросы анкет + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц/Rights.rights b/SSL/src/Roles/ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц/Rights.rights new file mode 100644 index 000000000..44583a1c7 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц/Rights.rights @@ -0,0 +1,346 @@ + + + false + false + true + + Catalog.ФизическиеЛица.Attribute.ДатаРождения + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц + + Read + true + + + Update + true + + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.StandardAttribute.Active + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.StandardAttribute.LineNumber + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.StandardAttribute.Recorder + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.StandardAttribute.Period + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.ЯвляетсяДокументомУдостоверяющимЛичность + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.Dimension.Физлицо + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Code + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.Номер + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.Command.ДокументыФизическогоЛица + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.ДатаВыдачи + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.Серия + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.КемВыдан + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.СрокДействия + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.Представление + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.КодПодразделения + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.Attribute.Пол + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.УдалитьВидДокумента + + View + true + + + Edit + true + + + + InformationRegister.ДокументыФизическихЛиц.Dimension.ВидДокумента + + View + true + + + Edit + true + + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц/ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц.mdo b/SSL/src/Roles/ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц/ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц.mdo new file mode 100644 index 000000000..a6a9ca354 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц/ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц.mdo @@ -0,0 +1,8 @@ + + + ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц + + ru + Добавление и изменение персональных данных физических лиц + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеПользователейИГруппДоступа/Rights.rights b/SSL/src/Roles/ДобавлениеИзменениеПользователейИГруппДоступа/Rights.rights new file mode 100644 index 000000000..a8a10ae53 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеПользователейИГруппДоступа/Rights.rights @@ -0,0 +1,17473 @@ + + + false + false + true + + Catalog.ГруппыДоступа.TabularSection.Пользователи + + View + true + + + Edit + true + + + + InformationRegister.НаборыЗначенийДоступа + + Read + true + + + View + true + + + + InformationRegister.ГруппыЗначенийДоступа.Resource.НаследоватьПраваРодителей + + View + true + + + + InformationRegister.ПраваПоЗначениямДоступа.Attribute.ДобавлениеЗапрещено + + View + true + + + + InformationRegister.ТаблицыГруппДоступа.Dimension.ГруппаДоступа + + View + true + + + + CommonCommand.ПраваПользователяПоЗначениямДоступа + + View + true + + + + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа.Attribute.ДоступРазрешен + + View + true + + + Edit + true + + + + InformationRegister.ТаблицыГруппДоступа + + Read + true + + + View + true + + + + InformationRegister.ТаблицыГруппДоступа.StandardAttribute.Active + + View + true + + + + InformationRegister.ТаблицыГруппДоступа.StandardAttribute.LineNumber + + View + true + + + + InformationRegister.ТаблицыГруппДоступа.StandardAttribute.Recorder + + View + true + + + + InformationRegister.ТаблицыГруппДоступа.StandardAttribute.Period + + View + true + + + + InformationRegister.НаборыЗначенийДоступа.Attribute.ТипЗначенияДоступа + + View + true + + + + Catalog.ПрофилиГруппДоступа.Attribute.Комментарий + + View + true + + + + Subsystem.СтандартныеПодсистемы.Subsystem.УправлениеДоступом + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Страна + + View + true + + + Edit + true + + + + CommonCommand.ПраваПоЗначениюДоступа + + View + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ВидыДоступа.Attribute.ВидДоступа + + View + true + + + + InformationRegister.ЗначенияГруппДоступа + + Read + true + + + View + true + + + + InformationRegister.ТаблицыГруппДоступа.Dimension.Пользователь + + View + true + + + + InformationRegister.ПраваПоЗначениямДоступа.Dimension.ЗначениеДоступа + + View + true + + + + Catalog.ГруппыПользователей.Attribute.Комментарий + + View + true + + + Edit + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ТаблицыРолей.Attribute.Таблица + + View + true + + + + InformationRegister.ТаблицыГруппДоступа.Resource.Удаление + + View + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ЗначенияДоступа.Attribute.ЗначениеДоступа + + View + true + + + + InformationRegister.ЗначенияГруппДоступа.Dimension.ВидДоступа + + View + true + + + + InformationRegister.ПраваПоЗначениямДоступа.Attribute.ЧтениеЗапрещено + + View + true + + + + InformationRegister.ЗначенияГруппДоступа.Dimension.ТолькоВидДоступа + + View + true + + + + Catalog.ГруппыДоступа.TabularSection.ВидыДоступа.Attribute.ВидДоступа + + View + true + + + Edit + true + + + + InformationRegister.НаборыЗначенийДоступа.Dimension.ЗначениеДоступа + + View + true + + + + Catalog.ГруппыДоступа.TabularSection.ВидыДоступа + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.ЗначенияПолей + + View + true + + + Edit + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ВидыДоступа + + View + true + + + + Catalog.ВнешниеПользователи.Attribute.ИдентификаторПользователяИБ + + View + true + + + Edit + true + + + + InformationRegister.ПраваПоЗначениямДоступа.Resource.РаспространяетсяВИерархии + + View + true + + + + InformationRegister.ПраваПоЗначениямДоступа.Dimension.Таблица + + View + true + + + + InformationRegister.НаборыЗначенийДоступа.Dimension.ВидДоступа + + View + true + + + + InformationRegister.ГруппыЗначенийДоступа.Dimension.ЗначениеДоступа + + View + true + + + + Catalog.ГруппыДоступа.Attribute.Профиль + + View + true + + + Edit + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ТаблицыРолей.Attribute.Удаление + + View + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ТаблицыРолей + + View + true + + + + CommonForm.ПраваПоЗначениямДоступа + + View + true + + + + CommonCommand.ПраваВнешнегоПользователяПоЗначениямДоступа + + View + true + + + + InformationRegister.НаборыЗначенийДоступа.Attribute.ВидДоступаПравоИзменения + + View + true + + + + Catalog.Пользователи + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.Пользователи.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.Пользователи.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.Пользователи.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.Пользователи.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.Пользователи.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.Пользователи.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.Пользователи.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.Пользователи.StandardAttribute.Code + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.TabularSection.Пользователи.Attribute.Пользователь + + View + true + + + Edit + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.Роли + + View + true + + + + InformationRegister.НаборыЗначенийДоступа.Attribute.ВидДоступаБезГруппЗначенияДоступа + + View + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ЗначенияДоступа.Attribute.ВидДоступа + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.АдресЭП + + View + true + + + Edit + true + + + + Catalog.ГруппыПользователей.TabularSection.Состав + + View + true + + + Edit + true + + + + InformationRegister.ТаблицыГруппДоступа.Resource.Добавление + + View + true + + + + InformationRegister.НаборыЗначенийДоступа.Resource.Добавление + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.НомерТелефонаБезКодов + + View + true + + + Edit + true + + + + InformationRegister.НаборыЗначенийДоступа.Attribute.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + + View + true + + + + Catalog.ГруппыДоступа.TabularSection.ВидыДоступа.Attribute.ДоступРазрешен + + View + true + + + Edit + true + + + + InformationRegister.ГруппыЗначенийДоступа.Dimension.ГруппаДоступа + + View + true + + + + InformationRegister.ТаблицыГруппДоступа.Resource.Изменение + + View + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ЗначенияДоступа + + View + true + + + + InformationRegister.ТаблицыГруппДоступа.Dimension.Таблица + + View + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ВидыДоступа.Attribute.ДоступРазрешен + + View + true + + + + InformationRegister.ГруппыЗначенийДоступа.Attribute.СвязьСРодителем + + View + true + + + + InformationRegister.СоставГруппПользователей + + Read + true + + + + InformationRegister.ГруппыЗначенийДоступа.Dimension.ТолькоВидДоступа + + View + true + + + + CommonCommand.ВнешнийПользовательОбъектаАвторизации + + View + true + + + + InformationRegister.НаборыЗначенийДоступа.Attribute.ВидДоступаПравоЧтения + + View + true + + + + InformationRegister.НаборыЗначенийДоступа.Dimension.Объект + + View + true + + + + InformationRegister.НаборыЗначенийДоступа.Attribute.ВидДоступаПравоДобавления + + View + true + + + + InformationRegister.ЗначенияГруппДоступа.Dimension.ГруппаДоступа + + View + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ТаблицыРолей.Attribute.Роль + + View + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ТипыСсылок.Attribute.ТипТаблицы + + View + true + + + + InformationRegister.НаборыЗначенийДоступа.Resource.Изменение + + View + true + + + + Catalog.ВнешниеПользователи + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Predefined + + View + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Description + + View + true + + + + InformationRegister.НаборыЗначенийДоступа.Resource.Чтение + + View + true + + + + InformationRegister.ГруппыЗначенийДоступа.Dimension.ВидДоступа + + View + true + + + + Catalog.Пользователи.Attribute.ИдентификаторПользователяИБ + + View + true + + + Edit + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ТипыСсылок + + View + true + + + + InformationRegister.ПраваПоЗначениямДоступа.Attribute.Удаление + + View + true + + + + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Регион + + View + true + + + Edit + true + + + + Catalog.ГруппыПользователей + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Predefined + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ГруппыПользователей.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Description + + View + true + + + Edit + true + + + + InformationRegister.ПраваПоЗначениямДоступа.Dimension.Пользователь + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Вид + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.Attribute.ТипОбъектовАвторизации + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.Attribute.Комментарий + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Представление + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Состав + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.НомерТелефона + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.Attribute.УдалитьПароль + + View + true + + + Edit + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ТипыСсылок.Attribute.Таблица + + View + true + + + + InformationRegister.НаборыЗначенийДоступа.Attribute.ТипОбъекта + + View + true + + + + Catalog.ГруппыДоступа.Attribute.Комментарий + + View + true + + + Edit + true + + + + InformationRegister.ТаблицыГруппДоступа.Attribute.ВидДоступаПравоДобавления + + View + true + + + + InformationRegister.ПраваПоЗначениямДоступа.Attribute.ИзменениеЗапрещено + + View + true + + + + InformationRegister.ПраваПоЗначениямДоступа.Dimension.Право + + View + true + + + + InformationRegister.ПраваПоЗначениямДоступа.Attribute.УдалениеЗапрещено + + View + true + + + + InformationRegister.НаборыЗначенийДоступа.Dimension.НомерНабора + + View + true + + + + Catalog.ГруппыВнешнихПользователей + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Predefined + + View + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Тип + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Состав.Attribute.ВнешнийПользователь + + View + true + + + Edit + true + + + + Catalog.ГруппыПользователей.TabularSection.Состав.Attribute.Пользователь + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Code + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.Attribute.ВсеОбъектыАвторизации + + View + true + + + Edit + true + + + + InformationRegister.ГруппыЗначенийДоступа.Attribute.ИспользоватьПраваСсылки + + View + true + + + + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа.Attribute.ЗначениеДоступа + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.Attribute.УстановитьРолиНепосредственно + + View + true + + + Edit + true + + + + InformationRegister.ГруппыЗначенийДоступа + + Read + true + + + View + true + + + + InformationRegister.НаборыЗначенийДоступа.Resource.Удаление + + View + true + + + + Catalog.ВнешниеПользователи.Attribute.ОбъектАвторизации + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация + + View + true + + + Edit + true + + + + InformationRegister.ПраваПоЗначениямДоступа.Attribute.Изменение + + View + true + + + + Catalog.ПрофилиГруппДоступа.Attribute.ПоставляемыйПрофильИзменен + + View + true + + + + InformationRegister.ПраваПоЗначениямДоступа + + Read + true + + + View + true + + + + InformationRegister.НаборыЗначенийДоступа.Attribute.ВидДоступаЧерезПраваПоЗначениямДоступа + + View + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ТаблицыРолей.Attribute.Изменение + + View + true + + + + InformationRegister.ЗначенияГруппДоступа.Dimension.ЗначениеДоступа + + View + true + + + + Configuration.БиблиотекаСтандартныхПодсистем + + ExclusiveMode + true + + + ActiveUsers + true + + + TechnicalSpecialistMode + true + + + MainWindowModeNormal + true + + + MainWindowModeWorkplace + true + + + MainWindowModeEmbeddedWorkplace + true + + + MainWindowModeFullscreenWorkplace + true + + + MainWindowModeKiosk + true + + + AnalyticsSystemClient + true + + + SaveUserData + true + + + + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа.Attribute.ВидДоступа + + View + true + + + Edit + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ТаблицыРолей.Attribute.Добавление + + View + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Роли + + View + true + + + Edit + true + + + + Catalog.ПрофилиГруппДоступа + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.ПрофилиГруппДоступа.StandardAttribute.Predefined + + View + true + + + + Catalog.ПрофилиГруппДоступа.StandardAttribute.Ref + + View + true + + + + Catalog.ПрофилиГруппДоступа.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ПрофилиГруппДоступа.StandardAttribute.IsFolder + + View + true + + + + Catalog.ПрофилиГруппДоступа.StandardAttribute.Owner + + View + true + + + + Catalog.ПрофилиГруппДоступа.StandardAttribute.Parent + + View + true + + + + Catalog.ПрофилиГруппДоступа.StandardAttribute.Description + + View + true + + + + Catalog.ПрофилиГруппДоступа.StandardAttribute.Code + + View + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Роли.Attribute.Роль + + View + true + + + Edit + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.Роли.Attribute.Роль + + View + true + + + + InformationRegister.ТаблицыГруппДоступа.Attribute.ТипТаблицы + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.ДоменноеИмяСервера + + View + true + + + Edit + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ТаблицыРолей.Attribute.ТипТаблицы + + View + true + + + + InformationRegister.ПраваПоЗначениямДоступа.Attribute.Добавление + + View + true + + + + InformationRegister.ТаблицыГруппДоступа.Attribute.ВидДоступаПравоИзменения + + View + true + + + + InformationRegister.ПраваПоЗначениямДоступа.Attribute.Чтение + + View + true + + + + Catalog.ГруппыДоступа.Attribute.ТипПользователей + + View + true + + + Edit + true + + + + Catalog.ПрофилиГруппДоступа.TabularSection.ВидыДоступа.Attribute.Предустановленный + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Город + + View + true + + + Edit + true + + + + InformationRegister.ПраваПоЗначениямДоступа.Resource.Запрещено + + View + true + + + + ПоЗначениям + // ПоЗначениям ( Таблица, Право, Модификатор, В1,П1, В2,Р2, ..., В(n), П(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, ..., 2+n*2,3+n*2 . +// Читается так: "ограничение доступа по значениям". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле значения, проверяемого по виду доступа, кроме случая В(n) = "Условие" (или ""). +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И <Условие по группе параметров 2> И ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", +// "Организации","Организация", +// "Поставщики","Контрагент", "","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр5 + ПО + ТипЗначения(#Параметр(5)) = ТипЗначения(ТипыСсылокПараметр5.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр9 + ПО + ТипЗначения(#Параметр(9)) = ТипЗначения(ТипыСсылокПараметр9.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр11 + ПО + ТипЗначения(#Параметр(11)) = ТипЗначения(ТипыСсылокПараметр11.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр15 + ПО + ТипЗначения(#Параметр(15)) = ТипЗначения(ТипыСсылокПараметр15.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр17 + ПО + ТипЗначения(#Параметр(17)) = ТипЗначения(ТипыСсылокПараметр17.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр21 + ПО + ТипЗначения(#Параметр(21)) = ТипЗначения(ТипыСсылокПараметр21.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр23 + ПО + ТипЗначения(#Параметр(23)) = ТипЗначения(ТипыСсылокПараметр23.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр27 + ПО + ТипЗначения(#Параметр(27)) = ТипЗначения(ТипыСсылокПараметр27.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр29 + ПО + ТипЗначения(#Параметр(29)) = ТипЗначения(ТипыСсылокПараметр29.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр33 + ПО + ТипЗначения(#Параметр(33)) = ТипЗначения(ТипыСсылокПараметр33.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр35 + ПО + ТипЗначения(#Параметр(35)) = ТипЗначения(ТипыСсылокПараметр35.ТипТаблицы) +#КонецЕсли + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(4)" = "Условие" ИЛИ "#Параметр(4)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(5) ) +#ИначеЕсли "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + #Параметр(5) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр5.ТипТаблицы + #Если "#Параметр(4)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(4)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(4) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(4)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(4)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(4) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(5) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(5) + #ИначеЕсли "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(4) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(4) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(4) + #КонецЕсли + #Иначе // "Т.##Параметр(5)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(6)" = "" И "#Параметр(7)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + И #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(7) + #ИначеЕсли "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "Т.##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(8)" = "" И "#Параметр(9)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(8)" = "Условие" ИЛИ "#Параметр(8)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(9) ) +#ИначеЕсли "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + И #Параметр(9) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр9.ТипТаблицы + #Если "#Параметр(8)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(8)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(8) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(8)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(8)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(8) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(9) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(9) + #ИначеЕсли "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(8) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(8) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(8) + #КонецЕсли + #Иначе // "Т.##Параметр(9)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(10)" = "" И "#Параметр(11)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(10)" = "Условие" ИЛИ "#Параметр(10)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(11) ) +#ИначеЕсли "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + И #Параметр(11) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр11.ТипТаблицы + #Если "#Параметр(10)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(10)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(10) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(10)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(10)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(10) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(11) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(11) + #ИначеЕсли "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(10) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(10) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(10) + #КонецЕсли + #Иначе // "Т.##Параметр(11)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + И #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(13) + #ИначеЕсли "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "Т.##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(14)" = "" И "#Параметр(15)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(14)" = "Условие" ИЛИ "#Параметр(14)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(15) ) +#ИначеЕсли "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + И #Параметр(15) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр15.ТипТаблицы + #Если "#Параметр(14)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(14)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(14) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(14)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(14)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(14) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(15) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(15) + #ИначеЕсли "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(14) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(14) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(14) + #КонецЕсли + #Иначе // "Т.##Параметр(15)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(16)" = "" И "#Параметр(17)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(16)" = "Условие" ИЛИ "#Параметр(16)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(17) ) +#ИначеЕсли "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + И #Параметр(17) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр17.ТипТаблицы + #Если "#Параметр(16)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(16)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(16) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(16)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(16)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(16) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(17) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(17) + #ИначеЕсли "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(16) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(16) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(16) + #КонецЕсли + #Иначе // "Т.##Параметр(17)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + И #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(19) + #ИначеЕсли "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "Т.##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(20)" = "" И "#Параметр(21)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(20)" = "Условие" ИЛИ "#Параметр(20)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(21) ) +#ИначеЕсли "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + И #Параметр(21) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр21.ТипТаблицы + #Если "#Параметр(20)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(20)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(20) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(20)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(20)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(20) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(21) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(21) + #ИначеЕсли "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(20) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(20) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(20) + #КонецЕсли + #Иначе // "Т.##Параметр(21)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(22)" = "" И "#Параметр(23)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(22)" = "Условие" ИЛИ "#Параметр(22)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(23) ) +#ИначеЕсли "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + И #Параметр(23) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр23.ТипТаблицы + #Если "#Параметр(22)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(22)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(22) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(22)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(22)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(22) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(23) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(23) + #ИначеЕсли "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(22) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(22) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(22) + #КонецЕсли + #Иначе // "Т.##Параметр(23)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + И #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(25) + #ИначеЕсли "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "Т.##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(26)" = "" И "#Параметр(27)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(26)" = "Условие" ИЛИ "#Параметр(26)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(27) ) +#ИначеЕсли "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + И #Параметр(27) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр27.ТипТаблицы + #Если "#Параметр(26)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(26)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(26) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(26)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(26)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(26) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(27) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(27) + #ИначеЕсли "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(26) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(26) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(26) + #КонецЕсли + #Иначе // "Т.##Параметр(27)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(28)" = "" И "#Параметр(29)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(28)" = "Условие" ИЛИ "#Параметр(28)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(29) ) +#ИначеЕсли "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + И #Параметр(29) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр29.ТипТаблицы + #Если "#Параметр(28)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(28)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(28) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(28)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(28)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(28) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(29) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(29) + #ИначеЕсли "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(28) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(28) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(28) + #КонецЕсли + #Иначе // "Т.##Параметр(29)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + И #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(31) + #ИначеЕсли "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "Т.##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(32)" = "" И "#Параметр(33)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(32)" = "Условие" ИЛИ "#Параметр(32)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(33) ) +#ИначеЕсли "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + И #Параметр(33) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр33.ТипТаблицы + #Если "#Параметр(32)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(32)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(32) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(32)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(32)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(32) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(33) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(33) + #ИначеЕсли "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(32) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(32) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(32) + #КонецЕсли + #Иначе // "Т.##Параметр(33)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(34)" = "" И "#Параметр(35)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(34)" = "Условие" ИЛИ "#Параметр(34)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(35) ) +#ИначеЕсли "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + И #Параметр(35) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр35.ТипТаблицы + #Если "#Параметр(34)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(34)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(34) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(34)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(34)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(34) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(35) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(35) + #ИначеЕсли "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(34) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(34) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(34) + #КонецЕсли + #Иначе // "Т.##Параметр(35)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + + ) +) +#КонецЕсли + + + + + ПоЗначениямИНаборамРасширенный + // ПоЗначениямИНаборамРасширенный ( Таблица, Право, Модификатор, ПрисоединяемыеТаблицы, О, В1,П1,О1, В2,П2,О2,..., В(n), П(n), О(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,...,3+n*3,4+n*3,5+n*3 . +// Читается так: "ограничение доступа по наборам и значениям расширенный". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ПрисоединяемыеТаблицы - текст присоедиения дополнительных таблиц на языке запросов, например, +// "ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ОплатаПоставщикам КАК Т1 +// ПО Т.Ссылка = Т1.Ссылка". +// Присоединение позволяет указать поля таблицы ОплатаПоставщикам, как поля основной таблицы +// для проверки их значений, как значений основной таблицы. +// Следует помнить, что при размножении строк в результате соединения, достаточно чтобы +// всего одна строка прошла условия проверки, т.е. результаты проверки строк объединяются по "ИЛИ". +// О - Начальные скобки "(". +// В(n) - ВидДоступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// Когда В(n) = "Объект" (или " "), то +// когда есть запись зависимости прав в регистре сведений ЗависимостиПравДоступа +// тогда используется данные записи - проверка указанного права Т.Р(n) и/или наборов значений доступа +// в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.Р(n) для указанного ограничения права; +// иначе используется стандартное правило: +// когда Право = "Чтение" тогда выполняется проверка права чтения Т.Р(n) и наборов значений доступа +// в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.Р(n) для права чтения; +// когда Право = "Добавление" ИЛИ "Изменение" ИЛИ "Удаление" тогда выполняется проверка права изменения Т.Р(n) +// и наборов значений доступа, считываемых по ссылке Т.Р(n) для права изменения. +// П(n) - Поле с псевдонимом, например "Т.Организация", значение которого проверяется +// по виду доступа, кроме случая В(n) = "Условие" (или ""). +// О(n) - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")". +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Соединение по таблице1> <Соединение по таблице2> ... <Соединение по таблице(m)> +// <Общая часть условий> <Условие по группе параметров 1> И/ИЛИ <Условие по группе параметров 1> И/ИЛИ ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениямИНаборамРасширенный("ЖурналДокументов.СкладскиеДокументы", "Чтение", "", +// "", +// "", +// "Объект","Т.Ссылка","И", +// "Объект","Т.ОсновнойДокумент","", "","","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 1. +#Если "#Параметр(6)" = "Объект" ИЛИ "#Параметр(6)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр7 + ПО + ТипыСсылокПараметр7.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр7.Объект = #Параметр(7) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр7 + ПО + ЗависимостиПравПараметр7.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр7.ТипВедущейТаблицы = ТипыСсылокПараметр7.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр10 + ПО + ТипЗначения(#Параметр(10)) = ТипЗначения(ТипыСсылокПараметр10.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 2. +#Если "#Параметр(9)" = "Объект" ИЛИ "#Параметр(9)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр10 + ПО + ТипыСсылокПараметр10.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр10.Объект = #Параметр(10) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр10 + ПО + ЗависимостиПравПараметр10.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр10.ТипВедущейТаблицы = ТипыСсылокПараметр10.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 3. +#Если "#Параметр(12)" = "Объект" ИЛИ "#Параметр(12)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр13 + ПО + ТипыСсылокПараметр13.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр13.Объект = #Параметр(13) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр13 + ПО + ЗависимостиПравПараметр13.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр13.ТипВедущейТаблицы = ТипыСсылокПараметр13.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр16 + ПО + ТипЗначения(#Параметр(16)) = ТипЗначения(ТипыСсылокПараметр16.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 4. +#Если "#Параметр(15)" = "Объект" ИЛИ "#Параметр(15)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр16 + ПО + ТипыСсылокПараметр16.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр16.Объект = #Параметр(16) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр16 + ПО + ЗависимостиПравПараметр16.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр16.ТипВедущейТаблицы = ТипыСсылокПараметр16.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 5. +#Если "#Параметр(18)" = "Объект" ИЛИ "#Параметр(18)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр19 + ПО + ТипыСсылокПараметр19.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр19.Объект = #Параметр(19) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр19 + ПО + ЗависимостиПравПараметр19.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр19.ТипВедущейТаблицы = ТипыСсылокПараметр19.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр22 + ПО + ТипЗначения(#Параметр(22)) = ТипЗначения(ТипыСсылокПараметр22.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 6. +#Если "#Параметр(21)" = "Объект" ИЛИ "#Параметр(21)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр22 + ПО + ТипыСсылокПараметр22.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр22.Объект = #Параметр(22) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр22 + ПО + ЗависимостиПравПараметр22.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр22.ТипВедущейТаблицы = ТипыСсылокПараметр22.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 7. +#Если "#Параметр(24)" = "Объект" ИЛИ "#Параметр(24)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр25 + ПО + ТипыСсылокПараметр25.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр25.Объект = #Параметр(25) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр25 + ПО + ЗависимостиПравПараметр25.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр25.ТипВедущейТаблицы = ТипыСсылокПараметр25.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр28 + ПО + ТипЗначения(#Параметр(28)) = ТипЗначения(ТипыСсылокПараметр28.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 8. +#Если "#Параметр(27)" = "Объект" ИЛИ "#Параметр(27)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр28 + ПО + ТипыСсылокПараметр28.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр28.Объект = #Параметр(28) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр28 + ПО + ЗависимостиПравПараметр28.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр28.ТипВедущейТаблицы = ТипыСсылокПараметр28.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 9. +#Если "#Параметр(30)" = "Объект" ИЛИ "#Параметр(30)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр31 + ПО + ТипыСсылокПараметр31.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр31.Объект = #Параметр(31) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр31 + ПО + ЗависимостиПравПараметр31.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр31.ТипВедущейТаблицы = ТипыСсылокПараметр31.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр34 + ПО + ТипЗначения(#Параметр(34)) = ТипЗначения(ТипыСсылокПараметр34.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 10. +#Если "#Параметр(33)" = "Объект" ИЛИ "#Параметр(33)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр34 + ПО + ТипыСсылокПараметр34.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр34.Объект = #Параметр(34) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр34 + ПО + ЗависимостиПравПараметр34.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр34.ТипВедущейТаблицы = ТипыСсылокПараметр34.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр37 + ПО + ТипЗначения(#Параметр(37)) = ТипЗначения(ТипыСсылокПараметр37.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 11. +#Если "#Параметр(36)" = "Объект" ИЛИ "#Параметр(36)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр37 + ПО + ТипыСсылокПараметр37.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр37.Объект = #Параметр(37) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр37 + ПО + ЗависимостиПравПараметр37.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр37.ТипВедущейТаблицы = ТипыСсылокПараметр37.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр40 + ПО + ТипЗначения(#Параметр(40)) = ТипЗначения(ТипыСсылокПараметр40.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 12. +#Если "#Параметр(39)" = "Объект" ИЛИ "#Параметр(39)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр40 + ПО + ТипыСсылокПараметр40.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр40.Объект = #Параметр(40) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр40 + ПО + ЗависимостиПравПараметр40.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр40.ТипВедущейТаблицы = ТипыСсылокПараметр40.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр43 + ПО + ТипЗначения(#Параметр(43)) = ТипЗначения(ТипыСсылокПараметр43.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 13. +#Если "#Параметр(42)" = "Объект" ИЛИ "#Параметр(42)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр43 + ПО + ТипыСсылокПараметр43.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр43.Объект = #Параметр(43) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр43 + ПО + ЗависимостиПравПараметр43.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр43.ТипВедущейТаблицы = ТипыСсылокПараметр43.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр46 + ПО + ТипЗначения(#Параметр(46)) = ТипЗначения(ТипыСсылокПараметр46.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 14. +#Если "#Параметр(45)" = "Объект" ИЛИ "#Параметр(45)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр46 + ПО + ТипыСсылокПараметр46.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр46.Объект = #Параметр(46) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр46 + ПО + ЗависимостиПравПараметр46.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр46.ТипВедущейТаблицы = ТипыСсылокПараметр46.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр49 + ПО + ТипЗначения(#Параметр(49)) = ТипЗначения(ТипыСсылокПараметр49.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 15. +#Если "#Параметр(48)" = "Объект" ИЛИ "#Параметр(48)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр49 + ПО + ТипыСсылокПараметр49.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр49.Объект = #Параметр(49) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр49 + ПО + ЗависимостиПравПараметр49.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр49.ТипВедущейТаблицы = ТипыСсылокПараметр49.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр52 + ПО + ТипЗначения(#Параметр(52)) = ТипЗначения(ТипыСсылокПараметр52.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 16. +#Если "#Параметр(51)" = "Объект" ИЛИ "#Параметр(51)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр52 + ПО + ТипыСсылокПараметр52.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр52.Объект = #Параметр(52) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр52 + ПО + ЗависимостиПравПараметр52.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр52.ТипВедущейТаблицы = ТипыСсылокПараметр52.ТипОбъекта +#КонецЕсли + +// Присоединяемые таблицы к проверяемой строке текущей таблицы "Т". +#Параметр(4) + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + + #Параметр(5) // [([(][(]...] 0-n открывающихся скобок. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(6)" = "Объект" ИЛИ "#Параметр(6)" = " " #Тогда + #Параметр(7) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр7.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр7.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(7) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(7) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(7) + #ИначеЕсли "#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(8) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(9)" = "" И "#Параметр(10)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(9)" = "Условие" ИЛИ "#Параметр(9)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(10) ) +#ИначеЕсли "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + #Параметр(10) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр10.ТипТаблицы + #Если "#Параметр(9)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(9)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(9)" = "Объект" ИЛИ "#Параметр(9)" = " " #Тогда + #Параметр(10) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр10.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр10.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(10) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(10) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(9) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(9)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(9)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(10)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(9) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(10) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(10) + #ИначеЕсли "#Параметр(10)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(9) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(9) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(9) + #КонецЕсли + #Иначе // "##Параметр(10)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(11) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(12)" = "Объект" ИЛИ "#Параметр(12)" = " " #Тогда + #Параметр(13) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр13.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр13.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(13) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(13) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(13) + #ИначеЕсли "#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(14) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(15)" = "" И "#Параметр(16)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(15)" = "Условие" ИЛИ "#Параметр(15)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(16) ) +#ИначеЕсли "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + #Параметр(16) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр16.ТипТаблицы + #Если "#Параметр(15)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(15)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(15)" = "Объект" ИЛИ "#Параметр(15)" = " " #Тогда + #Параметр(16) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр16.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр16.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(16) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(16) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(15) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(15)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(15)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(16)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(15) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(16) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(16) + #ИначеЕсли "#Параметр(16)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(15) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(15) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(15) + #КонецЕсли + #Иначе // "##Параметр(16)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(17) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(18)" = "Объект" ИЛИ "#Параметр(18)" = " " #Тогда + #Параметр(19) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр19.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр19.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(19) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(19) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(19) + #ИначеЕсли "#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(20) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(21)" = "" И "#Параметр(22)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(21)" = "Условие" ИЛИ "#Параметр(21)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(22) ) +#ИначеЕсли "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + #Параметр(22) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр22.ТипТаблицы + #Если "#Параметр(21)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(21)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(21)" = "Объект" ИЛИ "#Параметр(21)" = " " #Тогда + #Параметр(22) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр22.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр22.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(22) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(22) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(21) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(21)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(21)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(22)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(21) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(22) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(22) + #ИначеЕсли "#Параметр(22)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(21) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(21) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(21) + #КонецЕсли + #Иначе // "##Параметр(22)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(23) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(24)" = "Объект" ИЛИ "#Параметр(24)" = " " #Тогда + #Параметр(25) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр25.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр25.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(25) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(25) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(25) + #ИначеЕсли "#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(26) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(27)" = "" И "#Параметр(28)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(27)" = "Условие" ИЛИ "#Параметр(27)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(28) ) +#ИначеЕсли "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + #Параметр(28) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр28.ТипТаблицы + #Если "#Параметр(27)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(27)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(27)" = "Объект" ИЛИ "#Параметр(27)" = " " #Тогда + #Параметр(28) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр28.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр28.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(28) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(28) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(27) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(27)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(27)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(28)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(27) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(28) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(28) + #ИначеЕсли "#Параметр(28)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(27) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(27) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(27) + #КонецЕсли + #Иначе // "##Параметр(28)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(29) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(30)" = "Объект" ИЛИ "#Параметр(30)" = " " #Тогда + #Параметр(31) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр31.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр31.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(31) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(31) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(31) + #ИначеЕсли "#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(32) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(33)" = "" И "#Параметр(34)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(33)" = "Условие" ИЛИ "#Параметр(33)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(34) ) +#ИначеЕсли "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + #Параметр(34) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр34.ТипТаблицы + #Если "#Параметр(33)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(33)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(33)" = "Объект" ИЛИ "#Параметр(33)" = " " #Тогда + #Параметр(34) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр34.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр34.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(34) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(34) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(33) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(33)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(33)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(34)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(33) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(34) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(34) + #ИначеЕсли "#Параметр(34)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(33) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(33) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(33) + #КонецЕсли + #Иначе // "##Параметр(34)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(35) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(36)" = "" И "#Параметр(37)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(36)" = "Условие" ИЛИ "#Параметр(36)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(37) ) +#ИначеЕсли "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + #Параметр(37) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр37.ТипТаблицы + #Если "#Параметр(36)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(36)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(36)" = "Объект" ИЛИ "#Параметр(36)" = " " #Тогда + #Параметр(37) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр37.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр37.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(37) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(37) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(36) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(36)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(36)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(37)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(36) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(37) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(37) + #ИначеЕсли "#Параметр(37)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(36) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(36) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(36) + #КонецЕсли + #Иначе // "##Параметр(37)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(38) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(39)" = "" И "#Параметр(40)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(39)" = "Условие" ИЛИ "#Параметр(39)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(40) ) +#ИначеЕсли "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + #Параметр(40) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр40.ТипТаблицы + #Если "#Параметр(39)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(39)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(39)" = "Объект" ИЛИ "#Параметр(39)" = " " #Тогда + #Параметр(40) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр40.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр40.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(40) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(40) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(39) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(39)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(39)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(40)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(39) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(40) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(40) + #ИначеЕсли "#Параметр(40)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(39) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(39) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(39) + #КонецЕсли + #Иначе // "##Параметр(40)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(41) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(42)" = "" И "#Параметр(43)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(42)" = "Условие" ИЛИ "#Параметр(42)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(43) ) +#ИначеЕсли "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + #Параметр(43) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр43.ТипТаблицы + #Если "#Параметр(42)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(42)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(42)" = "Объект" ИЛИ "#Параметр(42)" = " " #Тогда + #Параметр(43) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр43.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр43.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(43) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(43) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(42) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(42)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(42)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(43)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(42) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(43) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(43) + #ИначеЕсли "#Параметр(43)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(42) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(42) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(42) + #КонецЕсли + #Иначе // "##Параметр(43)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(44) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(45)" = "" И "#Параметр(46)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(45)" = "Условие" ИЛИ "#Параметр(45)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(46) ) +#ИначеЕсли "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + #Параметр(46) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр46.ТипТаблицы + #Если "#Параметр(45)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(45)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(45)" = "Объект" ИЛИ "#Параметр(45)" = " " #Тогда + #Параметр(46) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр46.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр46.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(46) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(46) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(45) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(45)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(45)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(46)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(45) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(46) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(46) + #ИначеЕсли "#Параметр(46)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(45) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(45) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(45) + #КонецЕсли + #Иначе // "##Параметр(46)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(47) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(48)" = "" И "#Параметр(49)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(48)" = "Условие" ИЛИ "#Параметр(48)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(49) ) +#ИначеЕсли "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + #Параметр(49) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр49.ТипТаблицы + #Если "#Параметр(48)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(48)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(48)" = "Объект" ИЛИ "#Параметр(48)" = " " #Тогда + #Параметр(49) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр49.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр49.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(49) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(49) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(48) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(48)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(48)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(49)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(48) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(49) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(49) + #ИначеЕсли "#Параметр(49)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(48) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(48) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(48) + #КонецЕсли + #Иначе // "##Параметр(49)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(50) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(51)" = "" И "#Параметр(52)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(51)" = "Условие" ИЛИ "#Параметр(51)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(52) ) +#ИначеЕсли "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + #Параметр(52) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр52.ТипТаблицы + #Если "#Параметр(51)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(51)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(51)" = "Объект" ИЛИ "#Параметр(51)" = " " #Тогда + #Параметр(52) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр52.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр52.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(52) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(52) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(51) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(51)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(51)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(52)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(51) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(52) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(52) + #ИначеЕсли "#Параметр(52)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(51) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(51) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(51) + #КонецЕсли + #Иначе // "##Параметр(52)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(53) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + + ) +) +#КонецЕсли + + + + + ПоЗначениямРасширенный + // ПоЗначениямРасширенный ( Таблица, Право, Модификатор, ПрисоединяемыеТаблицы, О, В1,П1,О1, В2,П2,О2,..., В(n), П(n), О(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,...,3+n*3,4+n*3,5+n*3 . +// Читается так: "ограничение доступа по значениям расширенный". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ПрисоединяемыеТаблицы - текст присоедиения дополнительных таблиц на языке запросов, например, +// "ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ОплатаПоставщикам КАК Т1 +// ПО Т.Ссылка = Т1.Ссылка". +// Присоединение позволяет указать поля таблицы ОплатаПоставщикам, как поля основной таблицы +// для проверки их значений, как значений основной таблицы. +// Следует помнить, что при размножении строк в результате соединения, достаточно чтобы +// всего одна строка прошла условия проверки, т.е. результаты проверки строк объединяются по "ИЛИ". +// О - Начальные скобки "(". +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле с псевдонимом, например "Т.Организация", значение которого проверяется +// по виду доступа, кроме случая В(n) = "Условие" (или ""). +// О(n) - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")". +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И/ИЛИ <Условие по группе параметров 2> И/ИЛИ ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениямРасширенный("Документ.ПеремещениеТоваров", "Чтение", "", +// "", +// "", +// "Организации","Т.Организация","И(", +// "Склады","Т.СкладОтправитель","ИЛИ", +// "Склады","Т.СкладПолучатель",")", "","","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр10 + ПО + ТипЗначения(#Параметр(10)) = ТипЗначения(ТипыСсылокПараметр10.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр16 + ПО + ТипЗначения(#Параметр(16)) = ТипЗначения(ТипыСсылокПараметр16.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр22 + ПО + ТипЗначения(#Параметр(22)) = ТипЗначения(ТипыСсылокПараметр22.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр28 + ПО + ТипЗначения(#Параметр(28)) = ТипЗначения(ТипыСсылокПараметр28.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр34 + ПО + ТипЗначения(#Параметр(34)) = ТипЗначения(ТипыСсылокПараметр34.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр37 + ПО + ТипЗначения(#Параметр(37)) = ТипЗначения(ТипыСсылокПараметр37.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр40 + ПО + ТипЗначения(#Параметр(40)) = ТипЗначения(ТипыСсылокПараметр40.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр43 + ПО + ТипЗначения(#Параметр(43)) = ТипЗначения(ТипыСсылокПараметр43.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр46 + ПО + ТипЗначения(#Параметр(46)) = ТипЗначения(ТипыСсылокПараметр46.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр49 + ПО + ТипЗначения(#Параметр(49)) = ТипЗначения(ТипыСсылокПараметр49.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр52 + ПО + ТипЗначения(#Параметр(52)) = ТипЗначения(ТипыСсылокПараметр52.ТипТаблицы) +#КонецЕсли + +// Присоединяемые таблицы к проверяемой строке текущей таблицы "Т". +#Параметр(4) + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + + #Параметр(5) // [([(][(]...] 0-n открывающихся скобок. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(7) + #ИначеЕсли "#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(8) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(9)" = "" И "#Параметр(10)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(9)" = "Условие" ИЛИ "#Параметр(9)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(10) ) +#ИначеЕсли "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + #Параметр(10) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр10.ТипТаблицы + #Если "#Параметр(9)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(9)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(9) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(9)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(9)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(10)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(9) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(10) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(10) + #ИначеЕсли "#Параметр(10)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(9) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(9) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(9) + #КонецЕсли + #Иначе // "##Параметр(10)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(11) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(13) + #ИначеЕсли "#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(14) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(15)" = "" И "#Параметр(16)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(15)" = "Условие" ИЛИ "#Параметр(15)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(16) ) +#ИначеЕсли "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + #Параметр(16) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр16.ТипТаблицы + #Если "#Параметр(15)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(15)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(15) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(15)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(15)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(16)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(15) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(16) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(16) + #ИначеЕсли "#Параметр(16)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(15) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(15) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(15) + #КонецЕсли + #Иначе // "##Параметр(16)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(17) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(19) + #ИначеЕсли "#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(20) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(21)" = "" И "#Параметр(22)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(21)" = "Условие" ИЛИ "#Параметр(21)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(22) ) +#ИначеЕсли "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + #Параметр(22) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр22.ТипТаблицы + #Если "#Параметр(21)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(21)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(21) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(21)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(21)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(22)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(21) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(22) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(22) + #ИначеЕсли "#Параметр(22)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(21) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(21) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(21) + #КонецЕсли + #Иначе // "##Параметр(22)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(23) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(25) + #ИначеЕсли "#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(26) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(27)" = "" И "#Параметр(28)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(27)" = "Условие" ИЛИ "#Параметр(27)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(28) ) +#ИначеЕсли "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + #Параметр(28) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр28.ТипТаблицы + #Если "#Параметр(27)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(27)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(27) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(27)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(27)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(28)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(27) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(28) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(28) + #ИначеЕсли "#Параметр(28)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(27) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(27) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(27) + #КонецЕсли + #Иначе // "##Параметр(28)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(29) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(31) + #ИначеЕсли "#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(32) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(33)" = "" И "#Параметр(34)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(33)" = "Условие" ИЛИ "#Параметр(33)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(34) ) +#ИначеЕсли "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + #Параметр(34) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр34.ТипТаблицы + #Если "#Параметр(33)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(33)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(33) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(33)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(33)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(34)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(33) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(34) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(34) + #ИначеЕсли "#Параметр(34)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(33) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(33) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(33) + #КонецЕсли + #Иначе // "##Параметр(34)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(35) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(36)" = "" И "#Параметр(37)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(36)" = "Условие" ИЛИ "#Параметр(36)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(37) ) +#ИначеЕсли "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + #Параметр(37) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр37.ТипТаблицы + #Если "#Параметр(36)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(36)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(36) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(36)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(36)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(37)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(36) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(37) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(37) + #ИначеЕсли "#Параметр(37)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(36) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(36) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(36) + #КонецЕсли + #Иначе // "##Параметр(37)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(38) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(39)" = "" И "#Параметр(40)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(39)" = "Условие" ИЛИ "#Параметр(39)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(40) ) +#ИначеЕсли "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + #Параметр(40) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр40.ТипТаблицы + #Если "#Параметр(39)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(39)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(39) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(39)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(39)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(40)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(39) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(40) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(40) + #ИначеЕсли "#Параметр(40)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(39) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(39) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(39) + #КонецЕсли + #Иначе // "##Параметр(40)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(41) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(42)" = "" И "#Параметр(43)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(42)" = "Условие" ИЛИ "#Параметр(42)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(43) ) +#ИначеЕсли "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + #Параметр(43) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр43.ТипТаблицы + #Если "#Параметр(42)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(42)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(42) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(42)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(42)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(43)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(42) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(43) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(43) + #ИначеЕсли "#Параметр(43)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(42) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(42) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(42) + #КонецЕсли + #Иначе // "##Параметр(43)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(44) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(45)" = "" И "#Параметр(46)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(45)" = "Условие" ИЛИ "#Параметр(45)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(46) ) +#ИначеЕсли "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + #Параметр(46) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр46.ТипТаблицы + #Если "#Параметр(45)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(45)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(45) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(45)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(45)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(46)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(45) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(46) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(46) + #ИначеЕсли "#Параметр(46)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(45) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(45) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(45) + #КонецЕсли + #Иначе // "##Параметр(46)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(47) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(48)" = "" И "#Параметр(49)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(48)" = "Условие" ИЛИ "#Параметр(48)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(49) ) +#ИначеЕсли "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + #Параметр(49) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр49.ТипТаблицы + #Если "#Параметр(48)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(48)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(48) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(48)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(48)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(49)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(48) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(49) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(49) + #ИначеЕсли "#Параметр(49)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(48) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(48) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(48) + #КонецЕсли + #Иначе // "##Параметр(49)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(50) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(51)" = "" И "#Параметр(52)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(51)" = "Условие" ИЛИ "#Параметр(51)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(52) ) +#ИначеЕсли "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + #Параметр(52) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр52.ТипТаблицы + #Если "#Параметр(51)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(51)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(51) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(51)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(51)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(52)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(51) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(52) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(52) + #ИначеЕсли "#Параметр(52)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(51) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(51) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(51) + #КонецЕсли + #Иначе // "##Параметр(52)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(53) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + + ) +) +#КонецЕсли + + + + + ПоНаборамЗначений + // ПоНаборамЗначений ( Таблица, Право, Модификатор, ВладелецНаборов). +// № параметра: 1, 2, 3, 4 . +// Читается так: "ограничение доступа по наборам значений". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ВладелецНаборов - имя поля, содержащего ссылку на объект-владелец +// наборов значений доступа в регистре сведений НаборыЗначенийДоступа. +// Если имя поля не задано, считается, что проверяется сам объект-владелец +// наборов значений доступа, который имеет табличную часть <Таблица>.НаборыЗначенийДоступа. +// Эта табличная часть применяется, когда Право - "Добавление" или "Изменение". +// Табличная часть точно такая, как РегистрСведений.НаборыЗначенийДоступа +// без измерения Объект и без реквизитов, которые используются для повышения производительности. +// Для журналов документов нужно указать "Ссылка". +// +// Пример1: ПоНаборамЗначений("Документ.КорректировкаДенежныхСредств", "Чтение", "", "" ) +// Пример2: ПоНаборамЗначений("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", "" ) +// Пример3: ПоНаборамЗначений("ЖурналДокументов.СкладскиеДокументы", "Чтение", "", "Ссылка" ) +// Пример4: ПоНаборамЗначений("Справочник.ВложенияЭлектронныхПисем", "Чтение", "", "Владелец" ) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ГДЕ // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + ИЗ #Параметр(1).НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Ссылка = Т.Ссылка + #Иначе + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + #Если "#Параметр(4)" = "" #Тогда + НомераНаборов.Объект = Т.Ссылка + #Иначе + НомераНаборов.Объект = Т.#Параметр(4) + #КонецЕсли + #КонецЕсли + И НомераНаборов.#Параметр(2) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + ИЗ #Параметр(1).НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Ссылка = Т.Ссылка + #Иначе + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + #Если "#Параметр(4)" = "" #Тогда + НаборыЗначений.Объект = Т.Ссылка + #Иначе + НаборыЗначений.Объект = Т.#Параметр(4) + #КонецЕсли + #КонецЕсли + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + ( + Выбор + // Проверка заведомого ложного или заведомо истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), + Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) ) + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТипЗначения(ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы) = ТипЗначения(НаборыЗначений.ЗначениеДоступа) + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Иначе + Когда НаборыЗначений.ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #КонецЕсли + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаЧерезПраваПоЗначениямДоступа) + #Иначе + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + #КонецЕсли + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + НаборыЗначений.ВидДоступа В (&ВидыДоступаЕдинственныеДляТипаЗначенияДоступа) + #Иначе + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + #КонецЕсли + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезГруппЗначенияДоступа) + #Иначе + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + #КонецЕсли + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) + ) // НЕ Ложь В + ) +) +#КонецЕсли + + + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеПользователейИГруппДоступа/ДобавлениеИзменениеПользователейИГруппДоступа.mdo b/SSL/src/Roles/ДобавлениеИзменениеПользователейИГруппДоступа/ДобавлениеИзменениеПользователейИГруппДоступа.mdo new file mode 100644 index 000000000..7f3e8b6ba --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеПользователейИГруппДоступа/ДобавлениеИзменениеПользователейИГруппДоступа.mdo @@ -0,0 +1,8 @@ + + + ДобавлениеИзменениеПользователейИГруппДоступа + + ru + Добавление и изменение пользователей и групп доступа + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеРолейИсполнителей/Rights.rights b/SSL/src/Roles/ДобавлениеИзменениеРолейИсполнителей/Rights.rights new file mode 100644 index 000000000..3e5355665 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеРолейИсполнителей/Rights.rights @@ -0,0 +1,495 @@ + + + false + false + true + + Report.СписокПросроченныхЗадач + + Use + true + + + View + true + + + + InformationRegister.ИсполнителиЗадач.Dimension.ОсновнойОбъектАдресации + + View + true + + + Edit + true + + + + Report.СправкаОбИсполнительскойДисциплине + + Use + true + + + View + true + + + + Report.СписокИстекающихЗадач + + Use + true + + + View + true + + + + InformationRegister.ИсполнителиЗадач + + Read + true + + + Update + true + + + View + true + + + Edit + true + + + + InformationRegister.ИсполнителиЗадач.StandardAttribute.Active + + View + true + + + Edit + true + + + + InformationRegister.ИсполнителиЗадач.StandardAttribute.LineNumber + + View + true + + + Edit + true + + + + InformationRegister.ИсполнителиЗадач.StandardAttribute.Recorder + + View + true + + + Edit + true + + + + InformationRegister.ИсполнителиЗадач.StandardAttribute.Period + + View + true + + + Edit + true + + + + Catalog.РолиИсполнителей + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.РолиИсполнителей.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.РолиИсполнителей.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Code + + View + true + + + Edit + true + + + + InformationRegister.ИсполнителиЗадач.Dimension.Исполнитель + + View + true + + + Edit + true + + + + Report.СписокЗависшихЗадач + + Use + true + + + View + true + + + + InformationRegister.ИсполнителиЗадач.Command.НастройкаРолевойАдресации + + View + true + + + + InformationRegister.ИсполнителиЗадач.Dimension.РольИсполнителя + + View + true + + + Edit + true + + + + Catalog.РолиИсполнителей.Attribute.ТипыДополнительногоОбъектаАдресации + + View + true + + + Edit + true + + + + InformationRegister.ИсполнителиЗадач.Dimension.ДополнительныйОбъектАдресации + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.ValueType + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Description + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Code + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Parent + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.РолиИсполнителей.Attribute.ИспользуетсяСОбъектамиАдресации + + View + true + + + Edit + true + + + + Catalog.РолиИсполнителей.Attribute.ТипыОсновногоОбъектаАдресации + + View + true + + + Edit + true + + + + Catalog.РолиИсполнителей.Attribute.Комментарий + + View + true + + + Edit + true + + + + Report.Задачи + + Use + true + + + View + true + + + + Catalog.РолиИсполнителей.Attribute.ИспользуетсяБезОбъектовАдресации + + View + true + + + Edit + true + + + + InformationRegister.ИсполнителиЗадач.Attribute.ГруппаИсполнителейЗадач + + View + true + + + Edit + true + + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеРолейИсполнителей/ДобавлениеИзменениеРолейИсполнителей.mdo b/SSL/src/Roles/ДобавлениеИзменениеРолейИсполнителей/ДобавлениеИзменениеРолейИсполнителей.mdo new file mode 100644 index 000000000..2e6c125c6 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеРолейИсполнителей/ДобавлениеИзменениеРолейИсполнителей.mdo @@ -0,0 +1,8 @@ + + + ДобавлениеИзменениеРолейИсполнителей + + ru + Добавление и изменение ролей исполнителей + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеФизическихЛиц/Rights.rights b/SSL/src/Roles/ДобавлениеИзменениеФизическихЛиц/Rights.rights new file mode 100644 index 000000000..faeb0474a --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеФизическихЛиц/Rights.rights @@ -0,0 +1,133 @@ + + + false + false + true + + Catalog.ФизическиеЛица + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Code + + View + true + + + Edit + true + + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеФизическихЛиц/ДобавлениеИзменениеФизическихЛиц.mdo b/SSL/src/Roles/ДобавлениеИзменениеФизическихЛиц/ДобавлениеИзменениеФизическихЛиц.mdo new file mode 100644 index 000000000..3aa8f9fad --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеФизическихЛиц/ДобавлениеИзменениеФизическихЛиц.mdo @@ -0,0 +1,8 @@ + + + ДобавлениеИзменениеФизическихЛиц + + ru + Добавление и изменение физических лиц + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеШаблоновАнкет/Rights.rights b/SSL/src/Roles/ДобавлениеИзменениеШаблоновАнкет/Rights.rights new file mode 100644 index 000000000..00d147f00 --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеШаблоновАнкет/Rights.rights @@ -0,0 +1,851 @@ + + + false + false + true + + CommonForm.МастерАнкетыПоРазделам + + View + true + + + + Catalog.ШаблоныАнкет + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Code + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.Code + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.ТипОтвета + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.Точность + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.Attribute.Заключение + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.АгрегироватьСуммуВОтчетах + + View + true + + + Edit + true + + + + Catalog.ВариантыОтветовАнкет.Attribute.ТребуетОткрытогоОтвета + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.Attribute.Вступление + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.Формулировка + + View + true + + + Edit + true + + + + Catalog.ВариантыОтветовАнкет + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Code + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.МинимальноеЗначение + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.Обязательный + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.TabularSection.ПредопределенныеОтветы.Attribute.ЭлементарныйВопрос + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.МаксимальноеЗначение + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.ЭлементарныйВопрос + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.Attribute.РедактированиеШаблонаЗавершено + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.ВысотаЭлементаФормулировкиВопроса + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.Заметки + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.TabularSection.ПредопределенныеОтветы + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.ЗаполнятьАвтоматически + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.Формулировка + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.Длина + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.ПояснениеКомментария + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.ТипТабличногоВопроса + + View + true + + + Edit + true + + + + Catalog.ВариантыОтветовАнкет.Attribute.РеквизитДопУпорядочивания + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.TabularSection.СоставТабличногоВопроса + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.TabularSection.СоставТабличногоВопроса.Attribute.ЭлементарныйВопрос + + View + true + + + Edit + true + + + + Catalog.ШаблоныАнкет.Attribute.Заголовок + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.РодительВопрос + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.ТребуетсяКомментарий + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.ТипВопроса + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования + + Read + true + + + Insert + true + + + Update + true + + + View + true + + + InteractiveInsert + true + + + Edit + true + + + InteractiveSetDeletionMark + true + + + InteractiveClearDeletionMark + true + + + InputByString + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.ValueType + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.Description + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.Code + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.Parent + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ВопросыШаблонаАнкеты.TabularSection.ПредопределенныеОтветы.Attribute.Ответ + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.ВидКонтактнойИнформации + + View + true + + + Edit + true + + + diff --git a/SSL/src/Roles/ДобавлениеИзменениеШаблоновАнкет/ДобавлениеИзменениеШаблоновАнкет.mdo b/SSL/src/Roles/ДобавлениеИзменениеШаблоновАнкет/ДобавлениеИзменениеШаблоновАнкет.mdo new file mode 100644 index 000000000..32e723ebb --- /dev/null +++ b/SSL/src/Roles/ДобавлениеИзменениеШаблоновАнкет/ДобавлениеИзменениеШаблоновАнкет.mdo @@ -0,0 +1,8 @@ + + + ДобавлениеИзменениеШаблоновАнкет + + ru + Добавление и изменение шаблонов анкет + + diff --git a/SSL/src/Roles/ЗапускAutomation/Rights.rights b/SSL/src/Roles/ЗапускAutomation/Rights.rights new file mode 100644 index 000000000..a21357997 --- /dev/null +++ b/SSL/src/Roles/ЗапускAutomation/Rights.rights @@ -0,0 +1,45 @@ + + + false + false + true + + Configuration.БиблиотекаСтандартныхПодсистем + + Automation + true + + + TechnicalSpecialistMode + true + + + MainWindowModeNormal + true + + + MainWindowModeWorkplace + true + + + MainWindowModeEmbeddedWorkplace + true + + + MainWindowModeFullscreenWorkplace + true + + + MainWindowModeKiosk + true + + + AnalyticsSystemClient + true + + + SaveUserData + true + + + diff --git a/SSL/src/Roles/ЗапускAutomation/ЗапускAutomation.mdo b/SSL/src/Roles/ЗапускAutomation/ЗапускAutomation.mdo new file mode 100644 index 000000000..387a77ad7 --- /dev/null +++ b/SSL/src/Roles/ЗапускAutomation/ЗапускAutomation.mdo @@ -0,0 +1,8 @@ + + + ЗапускAutomation + + ru + Запуск Automation + + diff --git a/SSL/src/Roles/ЗапускВебКлиента/Rights.rights b/SSL/src/Roles/ЗапускВебКлиента/Rights.rights new file mode 100644 index 000000000..b6d320652 --- /dev/null +++ b/SSL/src/Roles/ЗапускВебКлиента/Rights.rights @@ -0,0 +1,45 @@ + + + false + false + true + + Configuration.БиблиотекаСтандартныхПодсистем + + WebClient + true + + + TechnicalSpecialistMode + true + + + MainWindowModeNormal + true + + + MainWindowModeWorkplace + true + + + MainWindowModeEmbeddedWorkplace + true + + + MainWindowModeFullscreenWorkplace + true + + + MainWindowModeKiosk + true + + + AnalyticsSystemClient + true + + + SaveUserData + true + + + diff --git a/SSL/src/Roles/ЗапускВебКлиента/ЗапускВебКлиента.mdo b/SSL/src/Roles/ЗапускВебКлиента/ЗапускВебКлиента.mdo new file mode 100644 index 000000000..9f11b9e59 --- /dev/null +++ b/SSL/src/Roles/ЗапускВебКлиента/ЗапускВебКлиента.mdo @@ -0,0 +1,8 @@ + + + ЗапускВебКлиента + + ru + Запуск веб-клиента + + diff --git a/SSL/src/Roles/ЗапускВнешнегоСоединения/Rights.rights b/SSL/src/Roles/ЗапускВнешнегоСоединения/Rights.rights new file mode 100644 index 000000000..96e5f583b --- /dev/null +++ b/SSL/src/Roles/ЗапускВнешнегоСоединения/Rights.rights @@ -0,0 +1,45 @@ + + + false + false + true + + Configuration.БиблиотекаСтандартныхПодсистем + + ExternalConnection + true + + + TechnicalSpecialistMode + true + + + MainWindowModeNormal + true + + + MainWindowModeWorkplace + true + + + MainWindowModeEmbeddedWorkplace + true + + + MainWindowModeFullscreenWorkplace + true + + + MainWindowModeKiosk + true + + + AnalyticsSystemClient + true + + + SaveUserData + true + + + diff --git a/SSL/src/Roles/ЗапускВнешнегоСоединения/ЗапускВнешнегоСоединения.mdo b/SSL/src/Roles/ЗапускВнешнегоСоединения/ЗапускВнешнегоСоединения.mdo new file mode 100644 index 000000000..53763b6fd --- /dev/null +++ b/SSL/src/Roles/ЗапускВнешнегоСоединения/ЗапускВнешнегоСоединения.mdo @@ -0,0 +1,8 @@ + + + ЗапускВнешнегоСоединения + + ru + Запуск внешнего соединения + + diff --git a/SSL/src/Roles/ЗапускТолстогоКлиента/Rights.rights b/SSL/src/Roles/ЗапускТолстогоКлиента/Rights.rights new file mode 100644 index 000000000..ee4a3590a --- /dev/null +++ b/SSL/src/Roles/ЗапускТолстогоКлиента/Rights.rights @@ -0,0 +1,45 @@ + + + false + false + true + + Configuration.БиблиотекаСтандартныхПодсистем + + ThickClient + true + + + TechnicalSpecialistMode + true + + + MainWindowModeNormal + true + + + MainWindowModeWorkplace + true + + + MainWindowModeEmbeddedWorkplace + true + + + MainWindowModeFullscreenWorkplace + true + + + MainWindowModeKiosk + true + + + AnalyticsSystemClient + true + + + SaveUserData + true + + + diff --git a/SSL/src/Roles/ЗапускТолстогоКлиента/ЗапускТолстогоКлиента.mdo b/SSL/src/Roles/ЗапускТолстогоКлиента/ЗапускТолстогоКлиента.mdo new file mode 100644 index 000000000..e32f1d2dc --- /dev/null +++ b/SSL/src/Roles/ЗапускТолстогоКлиента/ЗапускТолстогоКлиента.mdo @@ -0,0 +1,8 @@ + + + ЗапускТолстогоКлиента + + ru + Запуск толстого клиента + + diff --git a/SSL/src/Roles/ЗапускТонкогоКлиента/Rights.rights b/SSL/src/Roles/ЗапускТонкогоКлиента/Rights.rights new file mode 100644 index 000000000..feafab51f --- /dev/null +++ b/SSL/src/Roles/ЗапускТонкогоКлиента/Rights.rights @@ -0,0 +1,45 @@ + + + false + false + true + + Configuration.БиблиотекаСтандартныхПодсистем + + ThinClient + true + + + TechnicalSpecialistMode + true + + + MainWindowModeNormal + true + + + MainWindowModeWorkplace + true + + + MainWindowModeEmbeddedWorkplace + true + + + MainWindowModeFullscreenWorkplace + true + + + MainWindowModeKiosk + true + + + AnalyticsSystemClient + true + + + SaveUserData + true + + + diff --git a/SSL/src/Roles/ЗапускТонкогоКлиента/ЗапускТонкогоКлиента.mdo b/SSL/src/Roles/ЗапускТонкогоКлиента/ЗапускТонкогоКлиента.mdo new file mode 100644 index 000000000..b8c2fd4cf --- /dev/null +++ b/SSL/src/Roles/ЗапускТонкогоКлиента/ЗапускТонкогоКлиента.mdo @@ -0,0 +1,8 @@ + + + ЗапускТонкогоКлиента + + ru + Запуск тонкого клиента + + diff --git a/SSL/src/Roles/ИзменениеВыполнениеЗадач/Rights.rights b/SSL/src/Roles/ИзменениеВыполнениеЗадач/Rights.rights new file mode 100644 index 000000000..bccb993ee --- /dev/null +++ b/SSL/src/Roles/ИзменениеВыполнениеЗадач/Rights.rights @@ -0,0 +1,16354 @@ + + + false + false + true + + Task.ЗадачаИсполнителя.Attribute.РезультатВыполнения + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.ДополнительныйОбъектАдресации + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.Command.Выполнено + + View + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.ОсновнойОбъектАдресации + + View + true + + + Edit + true + + + + SessionParameter.ТекущийПользователь + + Get + true + + + + Task.ЗадачаИсполнителя.Attribute.ДатаНачала + + View + true + + + Edit + true + + + + Report.СписокИстекающихЗадач + + Use + true + + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.ГруппаИсполнителейЗадач + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя + + Read + true + + #ПоЗначениямИНаборамРасширенный( "Задача.ЗадачаИсполнителя", "Чтение", "", +"", +"", +"Объект","Т.БизнесПроцесс","ИЛИ", +"Пользователи","Т.Автор","ИЛИ", +"Пользователи","Т.Исполнитель","ИЛИ", +"Пользователи","Т.ГруппаИсполнителейЗадач","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","") + + + + + + Update + true + + #ПоЗначениямИНаборамРасширенный( "Задача.ЗадачаИсполнителя", "Изменение", "", +"", +"", +"Пользователи","Т.Исполнитель","ИЛИ", +"Пользователи","Т.ГруппаИсполнителейЗадач", "","","", "","","", "", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","") + + + + + View + true + + + Edit + true + + + InputByString + true + + + InteractiveActivate + true + + + Execute + true + + + InteractiveExecute + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Executed + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Description + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.RoutePoint + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.BusinessProcess + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Date + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Number + + View + true + + + Edit + true + + + + InformationRegister.ИсполнителиЗадач + + Read + true + + + + Catalog.РолиИсполнителей + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Predefined + + View + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Ref + + View + true + + + + Catalog.РолиИсполнителей.StandardAttribute.DeletionMark + + View + true + + + + Catalog.РолиИсполнителей.StandardAttribute.IsFolder + + View + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Owner + + View + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Parent + + View + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Description + + View + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Code + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.СрокИсполнения + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.Command.ВсеЗадачи + + View + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.Исполнитель + + View + true + + + Edit + true + + + + CommonCommand.ЗадачиПоПредмету + + View + true + + + + DataProcessor.КартаМаршрутаБизнесПроцесса + + Use + true + + + View + true + + + + Catalog.РолиИсполнителей.Attribute.ТипыДополнительногоОбъектаАдресации + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.Предмет + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач + + Read + true + + + View + true + + + InputByString + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.ValueType + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Description + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Code + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.IsFolder + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Parent + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Predefined + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.DeletionMark + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Ref + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.Важность + + View + true + + + Edit + true + + + + CommonCommand.КартаМаршрутаБизнесПроцесса + + View + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.РольИсполнителя + + View + true + + + Edit + true + + + + Catalog.РолиИсполнителей.Attribute.ИспользуетсяСОбъектамиАдресации + + View + true + + + + Task.ЗадачаИсполнителя.Command.МоиЗадачи + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.ПредметСтрокой + + View + true + + + Edit + true + + + + Catalog.РолиИсполнителей.Attribute.ТипыОсновногоОбъектаАдресации + + View + true + + + + Task.ЗадачаИсполнителя.Command.Перенаправить + + View + true + + + + Catalog.РолиИсполнителей.Attribute.Комментарий + + View + true + + + + Report.Задачи + + Use + true + + + View + true + + + + Catalog.РолиИсполнителей.Attribute.ИспользуетсяБезОбъектовАдресации + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.Описание + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.Attribute.ДатаИсполнения + + View + true + + + Edit + true + + + + Task.ЗадачаИсполнителя.Attribute.Автор + + View + true + + + Edit + true + + + + ПоЗначениям + // ПоЗначениям ( Таблица, Право, Модификатор, В1,П1, В2,Р2, ..., В(n), П(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, ..., 2+n*2,3+n*2 . +// Читается так: "ограничение доступа по значениям". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле значения, проверяемого по виду доступа, кроме случая В(n) = "Условие" (или ""). +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И <Условие по группе параметров 2> И ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", +// "Организации","Организация", +// "Поставщики","Контрагент", "","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр5 + ПО + ТипЗначения(#Параметр(5)) = ТипЗначения(ТипыСсылокПараметр5.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр9 + ПО + ТипЗначения(#Параметр(9)) = ТипЗначения(ТипыСсылокПараметр9.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр11 + ПО + ТипЗначения(#Параметр(11)) = ТипЗначения(ТипыСсылокПараметр11.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр15 + ПО + ТипЗначения(#Параметр(15)) = ТипЗначения(ТипыСсылокПараметр15.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр17 + ПО + ТипЗначения(#Параметр(17)) = ТипЗначения(ТипыСсылокПараметр17.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр21 + ПО + ТипЗначения(#Параметр(21)) = ТипЗначения(ТипыСсылокПараметр21.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр23 + ПО + ТипЗначения(#Параметр(23)) = ТипЗначения(ТипыСсылокПараметр23.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр27 + ПО + ТипЗначения(#Параметр(27)) = ТипЗначения(ТипыСсылокПараметр27.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр29 + ПО + ТипЗначения(#Параметр(29)) = ТипЗначения(ТипыСсылокПараметр29.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр33 + ПО + ТипЗначения(#Параметр(33)) = ТипЗначения(ТипыСсылокПараметр33.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр35 + ПО + ТипЗначения(#Параметр(35)) = ТипЗначения(ТипыСсылокПараметр35.ТипТаблицы) +#КонецЕсли + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(4)" = "Условие" ИЛИ "#Параметр(4)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(5) ) +#ИначеЕсли "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + #Параметр(5) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр5.ТипТаблицы + #Если "#Параметр(4)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(4)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(4) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(4)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(4)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(4) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(5) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(5) + #ИначеЕсли "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(4) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(4) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(4) + #КонецЕсли + #Иначе // "Т.##Параметр(5)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(6)" = "" И "#Параметр(7)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + И #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(7) + #ИначеЕсли "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "Т.##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(8)" = "" И "#Параметр(9)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(8)" = "Условие" ИЛИ "#Параметр(8)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(9) ) +#ИначеЕсли "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + И #Параметр(9) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр9.ТипТаблицы + #Если "#Параметр(8)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(8)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(8) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(8)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(8)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(8) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(9) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(9) + #ИначеЕсли "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(8) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(8) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(8) + #КонецЕсли + #Иначе // "Т.##Параметр(9)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(10)" = "" И "#Параметр(11)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(10)" = "Условие" ИЛИ "#Параметр(10)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(11) ) +#ИначеЕсли "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + И #Параметр(11) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр11.ТипТаблицы + #Если "#Параметр(10)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(10)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(10) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(10)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(10)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(10) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(11) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(11) + #ИначеЕсли "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(10) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(10) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(10) + #КонецЕсли + #Иначе // "Т.##Параметр(11)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + И #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(13) + #ИначеЕсли "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "Т.##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(14)" = "" И "#Параметр(15)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(14)" = "Условие" ИЛИ "#Параметр(14)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(15) ) +#ИначеЕсли "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + И #Параметр(15) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр15.ТипТаблицы + #Если "#Параметр(14)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(14)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(14) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(14)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(14)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(14) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(15) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(15) + #ИначеЕсли "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(14) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(14) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(14) + #КонецЕсли + #Иначе // "Т.##Параметр(15)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(16)" = "" И "#Параметр(17)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(16)" = "Условие" ИЛИ "#Параметр(16)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(17) ) +#ИначеЕсли "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + И #Параметр(17) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр17.ТипТаблицы + #Если "#Параметр(16)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(16)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(16) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(16)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(16)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(16) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(17) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(17) + #ИначеЕсли "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(16) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(16) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(16) + #КонецЕсли + #Иначе // "Т.##Параметр(17)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + И #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(19) + #ИначеЕсли "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "Т.##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(20)" = "" И "#Параметр(21)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(20)" = "Условие" ИЛИ "#Параметр(20)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(21) ) +#ИначеЕсли "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + И #Параметр(21) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр21.ТипТаблицы + #Если "#Параметр(20)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(20)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(20) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(20)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(20)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(20) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(21) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(21) + #ИначеЕсли "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(20) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(20) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(20) + #КонецЕсли + #Иначе // "Т.##Параметр(21)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(22)" = "" И "#Параметр(23)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(22)" = "Условие" ИЛИ "#Параметр(22)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(23) ) +#ИначеЕсли "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + И #Параметр(23) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр23.ТипТаблицы + #Если "#Параметр(22)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(22)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(22) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(22)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(22)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(22) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(23) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(23) + #ИначеЕсли "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(22) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(22) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(22) + #КонецЕсли + #Иначе // "Т.##Параметр(23)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + И #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(25) + #ИначеЕсли "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "Т.##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(26)" = "" И "#Параметр(27)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(26)" = "Условие" ИЛИ "#Параметр(26)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(27) ) +#ИначеЕсли "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + И #Параметр(27) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр27.ТипТаблицы + #Если "#Параметр(26)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(26)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(26) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(26)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(26)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(26) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(27) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(27) + #ИначеЕсли "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(26) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(26) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(26) + #КонецЕсли + #Иначе // "Т.##Параметр(27)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(28)" = "" И "#Параметр(29)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(28)" = "Условие" ИЛИ "#Параметр(28)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(29) ) +#ИначеЕсли "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + И #Параметр(29) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр29.ТипТаблицы + #Если "#Параметр(28)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(28)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(28) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(28)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(28)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(28) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(29) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(29) + #ИначеЕсли "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(28) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(28) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(28) + #КонецЕсли + #Иначе // "Т.##Параметр(29)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + И #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(31) + #ИначеЕсли "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "Т.##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(32)" = "" И "#Параметр(33)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(32)" = "Условие" ИЛИ "#Параметр(32)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(33) ) +#ИначеЕсли "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + И #Параметр(33) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр33.ТипТаблицы + #Если "#Параметр(32)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(32)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(32) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(32)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(32)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(32) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(33) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(33) + #ИначеЕсли "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(32) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(32) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(32) + #КонецЕсли + #Иначе // "Т.##Параметр(33)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(34)" = "" И "#Параметр(35)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(34)" = "Условие" ИЛИ "#Параметр(34)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(35) ) +#ИначеЕсли "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + И #Параметр(35) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр35.ТипТаблицы + #Если "#Параметр(34)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(34)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(34) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(34)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(34)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(34) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(35) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(35) + #ИначеЕсли "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(34) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(34) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(34) + #КонецЕсли + #Иначе // "Т.##Параметр(35)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + + ) +) +#КонецЕсли + + + + + ПоЗначениямИНаборамРасширенный + // ПоЗначениямИНаборамРасширенный ( Таблица, Право, Модификатор, ПрисоединяемыеТаблицы, О, В1,П1,О1, В2,П2,О2,..., В(n), П(n), О(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,...,3+n*3,4+n*3,5+n*3 . +// Читается так: "ограничение доступа по наборам и значениям расширенный". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ПрисоединяемыеТаблицы - текст присоедиения дополнительных таблиц на языке запросов, например, +// "ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ОплатаПоставщикам КАК Т1 +// ПО Т.Ссылка = Т1.Ссылка". +// Присоединение позволяет указать поля таблицы ОплатаПоставщикам, как поля основной таблицы +// для проверки их значений, как значений основной таблицы. +// Следует помнить, что при размножении строк в результате соединения, достаточно чтобы +// всего одна строка прошла условия проверки, т.е. результаты проверки строк объединяются по "ИЛИ". +// О - Начальные скобки "(". +// В(n) - ВидДоступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// Когда В(n) = "Объект" (или " "), то +// когда есть запись зависимости прав в регистре сведений ЗависимостиПравДоступа +// тогда используется данные записи - проверка указанного права Т.Р(n) и/или наборов значений доступа +// в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.Р(n) для указанного ограничения права; +// иначе используется стандартное правило: +// когда Право = "Чтение" тогда выполняется проверка права чтения Т.Р(n) и наборов значений доступа +// в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.Р(n) для права чтения; +// когда Право = "Добавление" ИЛИ "Изменение" ИЛИ "Удаление" тогда выполняется проверка права изменения Т.Р(n) +// и наборов значений доступа, считываемых по ссылке Т.Р(n) для права изменения. +// П(n) - Поле с псевдонимом, например "Т.Организация", значение которого проверяется +// по виду доступа, кроме случая В(n) = "Условие" (или ""). +// О(n) - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")". +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Соединение по таблице1> <Соединение по таблице2> ... <Соединение по таблице(m)> +// <Общая часть условий> <Условие по группе параметров 1> И/ИЛИ <Условие по группе параметров 1> И/ИЛИ ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениямИНаборамРасширенный("ЖурналДокументов.СкладскиеДокументы", "Чтение", "", +// "", +// "", +// "Объект","Т.Ссылка","И", +// "Объект","Т.ОсновнойДокумент","", "","","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 1. +#Если "#Параметр(6)" = "Объект" ИЛИ "#Параметр(6)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр7 + ПО + ТипыСсылокПараметр7.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр7.Объект = #Параметр(7) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр7 + ПО + ЗависимостиПравПараметр7.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр7.ТипВедущейТаблицы = ТипыСсылокПараметр7.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр10 + ПО + ТипЗначения(#Параметр(10)) = ТипЗначения(ТипыСсылокПараметр10.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 2. +#Если "#Параметр(9)" = "Объект" ИЛИ "#Параметр(9)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр10 + ПО + ТипыСсылокПараметр10.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр10.Объект = #Параметр(10) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр10 + ПО + ЗависимостиПравПараметр10.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр10.ТипВедущейТаблицы = ТипыСсылокПараметр10.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 3. +#Если "#Параметр(12)" = "Объект" ИЛИ "#Параметр(12)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр13 + ПО + ТипыСсылокПараметр13.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр13.Объект = #Параметр(13) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр13 + ПО + ЗависимостиПравПараметр13.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр13.ТипВедущейТаблицы = ТипыСсылокПараметр13.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр16 + ПО + ТипЗначения(#Параметр(16)) = ТипЗначения(ТипыСсылокПараметр16.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 4. +#Если "#Параметр(15)" = "Объект" ИЛИ "#Параметр(15)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр16 + ПО + ТипыСсылокПараметр16.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр16.Объект = #Параметр(16) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр16 + ПО + ЗависимостиПравПараметр16.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр16.ТипВедущейТаблицы = ТипыСсылокПараметр16.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 5. +#Если "#Параметр(18)" = "Объект" ИЛИ "#Параметр(18)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр19 + ПО + ТипыСсылокПараметр19.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр19.Объект = #Параметр(19) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр19 + ПО + ЗависимостиПравПараметр19.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр19.ТипВедущейТаблицы = ТипыСсылокПараметр19.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр22 + ПО + ТипЗначения(#Параметр(22)) = ТипЗначения(ТипыСсылокПараметр22.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 6. +#Если "#Параметр(21)" = "Объект" ИЛИ "#Параметр(21)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр22 + ПО + ТипыСсылокПараметр22.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр22.Объект = #Параметр(22) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр22 + ПО + ЗависимостиПравПараметр22.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр22.ТипВедущейТаблицы = ТипыСсылокПараметр22.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 7. +#Если "#Параметр(24)" = "Объект" ИЛИ "#Параметр(24)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр25 + ПО + ТипыСсылокПараметр25.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр25.Объект = #Параметр(25) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр25 + ПО + ЗависимостиПравПараметр25.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр25.ТипВедущейТаблицы = ТипыСсылокПараметр25.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр28 + ПО + ТипЗначения(#Параметр(28)) = ТипЗначения(ТипыСсылокПараметр28.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 8. +#Если "#Параметр(27)" = "Объект" ИЛИ "#Параметр(27)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр28 + ПО + ТипыСсылокПараметр28.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр28.Объект = #Параметр(28) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр28 + ПО + ЗависимостиПравПараметр28.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр28.ТипВедущейТаблицы = ТипыСсылокПараметр28.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 9. +#Если "#Параметр(30)" = "Объект" ИЛИ "#Параметр(30)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр31 + ПО + ТипыСсылокПараметр31.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр31.Объект = #Параметр(31) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр31 + ПО + ЗависимостиПравПараметр31.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр31.ТипВедущейТаблицы = ТипыСсылокПараметр31.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр34 + ПО + ТипЗначения(#Параметр(34)) = ТипЗначения(ТипыСсылокПараметр34.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 10. +#Если "#Параметр(33)" = "Объект" ИЛИ "#Параметр(33)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр34 + ПО + ТипыСсылокПараметр34.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр34.Объект = #Параметр(34) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр34 + ПО + ЗависимостиПравПараметр34.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр34.ТипВедущейТаблицы = ТипыСсылокПараметр34.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр37 + ПО + ТипЗначения(#Параметр(37)) = ТипЗначения(ТипыСсылокПараметр37.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 11. +#Если "#Параметр(36)" = "Объект" ИЛИ "#Параметр(36)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр37 + ПО + ТипыСсылокПараметр37.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр37.Объект = #Параметр(37) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр37 + ПО + ЗависимостиПравПараметр37.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр37.ТипВедущейТаблицы = ТипыСсылокПараметр37.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр40 + ПО + ТипЗначения(#Параметр(40)) = ТипЗначения(ТипыСсылокПараметр40.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 12. +#Если "#Параметр(39)" = "Объект" ИЛИ "#Параметр(39)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр40 + ПО + ТипыСсылокПараметр40.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр40.Объект = #Параметр(40) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр40 + ПО + ЗависимостиПравПараметр40.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр40.ТипВедущейТаблицы = ТипыСсылокПараметр40.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр43 + ПО + ТипЗначения(#Параметр(43)) = ТипЗначения(ТипыСсылокПараметр43.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 13. +#Если "#Параметр(42)" = "Объект" ИЛИ "#Параметр(42)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр43 + ПО + ТипыСсылокПараметр43.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр43.Объект = #Параметр(43) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр43 + ПО + ЗависимостиПравПараметр43.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр43.ТипВедущейТаблицы = ТипыСсылокПараметр43.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр46 + ПО + ТипЗначения(#Параметр(46)) = ТипЗначения(ТипыСсылокПараметр46.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 14. +#Если "#Параметр(45)" = "Объект" ИЛИ "#Параметр(45)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр46 + ПО + ТипыСсылокПараметр46.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр46.Объект = #Параметр(46) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр46 + ПО + ЗависимостиПравПараметр46.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр46.ТипВедущейТаблицы = ТипыСсылокПараметр46.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр49 + ПО + ТипЗначения(#Параметр(49)) = ТипЗначения(ТипыСсылокПараметр49.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 15. +#Если "#Параметр(48)" = "Объект" ИЛИ "#Параметр(48)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр49 + ПО + ТипыСсылокПараметр49.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр49.Объект = #Параметр(49) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр49 + ПО + ЗависимостиПравПараметр49.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр49.ТипВедущейТаблицы = ТипыСсылокПараметр49.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр52 + ПО + ТипЗначения(#Параметр(52)) = ТипЗначения(ТипыСсылокПараметр52.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 16. +#Если "#Параметр(51)" = "Объект" ИЛИ "#Параметр(51)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр52 + ПО + ТипыСсылокПараметр52.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр52.Объект = #Параметр(52) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр52 + ПО + ЗависимостиПравПараметр52.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр52.ТипВедущейТаблицы = ТипыСсылокПараметр52.ТипОбъекта +#КонецЕсли + +// Присоединяемые таблицы к проверяемой строке текущей таблицы "Т". +#Параметр(4) + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + + #Параметр(5) // [([(][(]...] 0-n открывающихся скобок. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(6)" = "Объект" ИЛИ "#Параметр(6)" = " " #Тогда + #Параметр(7) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр7.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр7.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(7) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(7) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(7) + #ИначеЕсли "#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(8) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(9)" = "" И "#Параметр(10)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(9)" = "Условие" ИЛИ "#Параметр(9)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(10) ) +#ИначеЕсли "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + #Параметр(10) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр10.ТипТаблицы + #Если "#Параметр(9)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(9)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(9)" = "Объект" ИЛИ "#Параметр(9)" = " " #Тогда + #Параметр(10) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр10.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр10.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(10) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(10) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(9) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(9)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(9)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(10)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(9) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(10) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(10) + #ИначеЕсли "#Параметр(10)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(9) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(9) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(9) + #КонецЕсли + #Иначе // "##Параметр(10)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(11) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(12)" = "Объект" ИЛИ "#Параметр(12)" = " " #Тогда + #Параметр(13) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр13.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр13.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(13) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(13) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(13) + #ИначеЕсли "#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(14) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(15)" = "" И "#Параметр(16)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(15)" = "Условие" ИЛИ "#Параметр(15)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(16) ) +#ИначеЕсли "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + #Параметр(16) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр16.ТипТаблицы + #Если "#Параметр(15)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(15)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(15)" = "Объект" ИЛИ "#Параметр(15)" = " " #Тогда + #Параметр(16) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр16.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр16.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(16) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(16) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(15) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(15)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(15)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(16)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(15) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(16) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(16) + #ИначеЕсли "#Параметр(16)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(15) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(15) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(15) + #КонецЕсли + #Иначе // "##Параметр(16)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(17) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(18)" = "Объект" ИЛИ "#Параметр(18)" = " " #Тогда + #Параметр(19) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр19.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр19.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(19) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(19) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(19) + #ИначеЕсли "#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(20) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(21)" = "" И "#Параметр(22)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(21)" = "Условие" ИЛИ "#Параметр(21)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(22) ) +#ИначеЕсли "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + #Параметр(22) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр22.ТипТаблицы + #Если "#Параметр(21)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(21)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(21)" = "Объект" ИЛИ "#Параметр(21)" = " " #Тогда + #Параметр(22) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр22.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр22.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(22) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(22) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(21) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(21)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(21)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(22)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(21) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(22) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(22) + #ИначеЕсли "#Параметр(22)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(21) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(21) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(21) + #КонецЕсли + #Иначе // "##Параметр(22)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(23) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(24)" = "Объект" ИЛИ "#Параметр(24)" = " " #Тогда + #Параметр(25) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр25.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр25.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(25) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(25) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(25) + #ИначеЕсли "#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(26) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(27)" = "" И "#Параметр(28)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(27)" = "Условие" ИЛИ "#Параметр(27)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(28) ) +#ИначеЕсли "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + #Параметр(28) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр28.ТипТаблицы + #Если "#Параметр(27)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(27)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(27)" = "Объект" ИЛИ "#Параметр(27)" = " " #Тогда + #Параметр(28) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр28.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр28.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(28) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(28) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(27) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(27)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(27)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(28)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(27) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(28) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(28) + #ИначеЕсли "#Параметр(28)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(27) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(27) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(27) + #КонецЕсли + #Иначе // "##Параметр(28)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(29) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(30)" = "Объект" ИЛИ "#Параметр(30)" = " " #Тогда + #Параметр(31) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр31.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр31.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(31) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(31) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(31) + #ИначеЕсли "#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(32) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(33)" = "" И "#Параметр(34)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(33)" = "Условие" ИЛИ "#Параметр(33)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(34) ) +#ИначеЕсли "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + #Параметр(34) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр34.ТипТаблицы + #Если "#Параметр(33)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(33)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(33)" = "Объект" ИЛИ "#Параметр(33)" = " " #Тогда + #Параметр(34) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр34.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр34.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(34) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(34) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(33) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(33)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(33)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(34)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(33) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(34) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(34) + #ИначеЕсли "#Параметр(34)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(33) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(33) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(33) + #КонецЕсли + #Иначе // "##Параметр(34)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(35) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(36)" = "" И "#Параметр(37)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(36)" = "Условие" ИЛИ "#Параметр(36)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(37) ) +#ИначеЕсли "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + #Параметр(37) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр37.ТипТаблицы + #Если "#Параметр(36)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(36)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(36)" = "Объект" ИЛИ "#Параметр(36)" = " " #Тогда + #Параметр(37) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр37.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр37.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(37) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(37) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(36) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(36)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(36)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(37)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(36) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(37) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(37) + #ИначеЕсли "#Параметр(37)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(36) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(36) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(36) + #КонецЕсли + #Иначе // "##Параметр(37)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(38) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(39)" = "" И "#Параметр(40)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(39)" = "Условие" ИЛИ "#Параметр(39)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(40) ) +#ИначеЕсли "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + #Параметр(40) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр40.ТипТаблицы + #Если "#Параметр(39)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(39)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(39)" = "Объект" ИЛИ "#Параметр(39)" = " " #Тогда + #Параметр(40) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр40.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр40.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(40) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(40) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(39) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(39)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(39)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(40)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(39) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(40) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(40) + #ИначеЕсли "#Параметр(40)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(39) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(39) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(39) + #КонецЕсли + #Иначе // "##Параметр(40)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(41) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(42)" = "" И "#Параметр(43)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(42)" = "Условие" ИЛИ "#Параметр(42)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(43) ) +#ИначеЕсли "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + #Параметр(43) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр43.ТипТаблицы + #Если "#Параметр(42)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(42)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(42)" = "Объект" ИЛИ "#Параметр(42)" = " " #Тогда + #Параметр(43) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр43.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр43.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(43) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(43) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(42) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(42)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(42)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(43)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(42) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(43) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(43) + #ИначеЕсли "#Параметр(43)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(42) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(42) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(42) + #КонецЕсли + #Иначе // "##Параметр(43)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(44) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(45)" = "" И "#Параметр(46)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(45)" = "Условие" ИЛИ "#Параметр(45)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(46) ) +#ИначеЕсли "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + #Параметр(46) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр46.ТипТаблицы + #Если "#Параметр(45)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(45)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(45)" = "Объект" ИЛИ "#Параметр(45)" = " " #Тогда + #Параметр(46) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр46.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр46.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(46) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(46) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(45) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(45)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(45)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(46)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(45) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(46) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(46) + #ИначеЕсли "#Параметр(46)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(45) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(45) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(45) + #КонецЕсли + #Иначе // "##Параметр(46)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(47) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(48)" = "" И "#Параметр(49)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(48)" = "Условие" ИЛИ "#Параметр(48)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(49) ) +#ИначеЕсли "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + #Параметр(49) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр49.ТипТаблицы + #Если "#Параметр(48)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(48)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(48)" = "Объект" ИЛИ "#Параметр(48)" = " " #Тогда + #Параметр(49) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр49.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр49.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(49) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(49) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(48) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(48)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(48)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(49)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(48) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(49) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(49) + #ИначеЕсли "#Параметр(49)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(48) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(48) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(48) + #КонецЕсли + #Иначе // "##Параметр(49)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(50) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(51)" = "" И "#Параметр(52)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(51)" = "Условие" ИЛИ "#Параметр(51)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(52) ) +#ИначеЕсли "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + #Параметр(52) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр52.ТипТаблицы + #Если "#Параметр(51)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(51)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(51)" = "Объект" ИЛИ "#Параметр(51)" = " " #Тогда + #Параметр(52) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр52.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр52.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(52) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(52) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(51) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(51)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(51)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(52)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(51) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(52) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(52) + #ИначеЕсли "#Параметр(52)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(51) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(51) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(51) + #КонецЕсли + #Иначе // "##Параметр(52)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(53) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + + ) +) +#КонецЕсли + + + + + ПоЗначениямРасширенный + // ПоЗначениямРасширенный ( Таблица, Право, Модификатор, ПрисоединяемыеТаблицы, О, В1,П1,О1, В2,П2,О2,..., В(n), П(n), О(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,...,3+n*3,4+n*3,5+n*3 . +// Читается так: "ограничение доступа по значениям расширенный". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ПрисоединяемыеТаблицы - текст присоедиения дополнительных таблиц на языке запросов, например, +// "ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ОплатаПоставщикам КАК Т1 +// ПО Т.Ссылка = Т1.Ссылка". +// Присоединение позволяет указать поля таблицы ОплатаПоставщикам, как поля основной таблицы +// для проверки их значений, как значений основной таблицы. +// Следует помнить, что при размножении строк в результате соединения, достаточно чтобы +// всего одна строка прошла условия проверки, т.е. результаты проверки строк объединяются по "ИЛИ". +// О - Начальные скобки "(". +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле с псевдонимом, например "Т.Организация", значение которого проверяется +// по виду доступа, кроме случая В(n) = "Условие" (или ""). +// О(n) - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")". +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И/ИЛИ <Условие по группе параметров 2> И/ИЛИ ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениямРасширенный("Документ.ПеремещениеТоваров", "Чтение", "", +// "", +// "", +// "Организации","Т.Организация","И(", +// "Склады","Т.СкладОтправитель","ИЛИ", +// "Склады","Т.СкладПолучатель",")", "","","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр10 + ПО + ТипЗначения(#Параметр(10)) = ТипЗначения(ТипыСсылокПараметр10.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр16 + ПО + ТипЗначения(#Параметр(16)) = ТипЗначения(ТипыСсылокПараметр16.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр22 + ПО + ТипЗначения(#Параметр(22)) = ТипЗначения(ТипыСсылокПараметр22.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр28 + ПО + ТипЗначения(#Параметр(28)) = ТипЗначения(ТипыСсылокПараметр28.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр34 + ПО + ТипЗначения(#Параметр(34)) = ТипЗначения(ТипыСсылокПараметр34.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр37 + ПО + ТипЗначения(#Параметр(37)) = ТипЗначения(ТипыСсылокПараметр37.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр40 + ПО + ТипЗначения(#Параметр(40)) = ТипЗначения(ТипыСсылокПараметр40.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр43 + ПО + ТипЗначения(#Параметр(43)) = ТипЗначения(ТипыСсылокПараметр43.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр46 + ПО + ТипЗначения(#Параметр(46)) = ТипЗначения(ТипыСсылокПараметр46.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр49 + ПО + ТипЗначения(#Параметр(49)) = ТипЗначения(ТипыСсылокПараметр49.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр52 + ПО + ТипЗначения(#Параметр(52)) = ТипЗначения(ТипыСсылокПараметр52.ТипТаблицы) +#КонецЕсли + +// Присоединяемые таблицы к проверяемой строке текущей таблицы "Т". +#Параметр(4) + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + + #Параметр(5) // [([(][(]...] 0-n открывающихся скобок. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(7) + #ИначеЕсли "#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(8) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(9)" = "" И "#Параметр(10)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(9)" = "Условие" ИЛИ "#Параметр(9)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(10) ) +#ИначеЕсли "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + #Параметр(10) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр10.ТипТаблицы + #Если "#Параметр(9)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(9)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(9) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(9)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(9)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(10)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(9) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(10) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(10) + #ИначеЕсли "#Параметр(10)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(9) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(9) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(9) + #КонецЕсли + #Иначе // "##Параметр(10)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(11) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(13) + #ИначеЕсли "#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(14) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(15)" = "" И "#Параметр(16)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(15)" = "Условие" ИЛИ "#Параметр(15)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(16) ) +#ИначеЕсли "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + #Параметр(16) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр16.ТипТаблицы + #Если "#Параметр(15)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(15)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(15) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(15)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(15)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(16)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(15) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(16) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(16) + #ИначеЕсли "#Параметр(16)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(15) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(15) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(15) + #КонецЕсли + #Иначе // "##Параметр(16)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(17) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(19) + #ИначеЕсли "#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(20) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(21)" = "" И "#Параметр(22)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(21)" = "Условие" ИЛИ "#Параметр(21)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(22) ) +#ИначеЕсли "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + #Параметр(22) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр22.ТипТаблицы + #Если "#Параметр(21)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(21)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(21) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(21)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(21)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(22)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(21) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(22) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(22) + #ИначеЕсли "#Параметр(22)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(21) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(21) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(21) + #КонецЕсли + #Иначе // "##Параметр(22)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(23) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(25) + #ИначеЕсли "#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(26) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(27)" = "" И "#Параметр(28)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(27)" = "Условие" ИЛИ "#Параметр(27)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(28) ) +#ИначеЕсли "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + #Параметр(28) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр28.ТипТаблицы + #Если "#Параметр(27)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(27)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(27) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(27)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(27)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(28)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(27) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(28) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(28) + #ИначеЕсли "#Параметр(28)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(27) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(27) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(27) + #КонецЕсли + #Иначе // "##Параметр(28)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(29) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(31) + #ИначеЕсли "#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(32) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(33)" = "" И "#Параметр(34)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(33)" = "Условие" ИЛИ "#Параметр(33)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(34) ) +#ИначеЕсли "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + #Параметр(34) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр34.ТипТаблицы + #Если "#Параметр(33)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(33)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(33) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(33)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(33)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(34)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(33) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(34) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(34) + #ИначеЕсли "#Параметр(34)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(33) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(33) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(33) + #КонецЕсли + #Иначе // "##Параметр(34)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(35) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(36)" = "" И "#Параметр(37)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(36)" = "Условие" ИЛИ "#Параметр(36)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(37) ) +#ИначеЕсли "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + #Параметр(37) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр37.ТипТаблицы + #Если "#Параметр(36)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(36)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(36) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(36)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(36)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(37)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(36) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(37) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(37) + #ИначеЕсли "#Параметр(37)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(36) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(36) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(36) + #КонецЕсли + #Иначе // "##Параметр(37)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(38) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(39)" = "" И "#Параметр(40)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(39)" = "Условие" ИЛИ "#Параметр(39)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(40) ) +#ИначеЕсли "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + #Параметр(40) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр40.ТипТаблицы + #Если "#Параметр(39)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(39)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(39) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(39)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(39)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(40)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(39) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(40) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(40) + #ИначеЕсли "#Параметр(40)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(39) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(39) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(39) + #КонецЕсли + #Иначе // "##Параметр(40)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(41) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(42)" = "" И "#Параметр(43)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(42)" = "Условие" ИЛИ "#Параметр(42)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(43) ) +#ИначеЕсли "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + #Параметр(43) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр43.ТипТаблицы + #Если "#Параметр(42)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(42)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(42) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(42)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(42)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(43)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(42) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(43) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(43) + #ИначеЕсли "#Параметр(43)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(42) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(42) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(42) + #КонецЕсли + #Иначе // "##Параметр(43)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(44) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(45)" = "" И "#Параметр(46)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(45)" = "Условие" ИЛИ "#Параметр(45)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(46) ) +#ИначеЕсли "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + #Параметр(46) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр46.ТипТаблицы + #Если "#Параметр(45)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(45)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(45) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(45)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(45)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(46)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(45) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(46) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(46) + #ИначеЕсли "#Параметр(46)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(45) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(45) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(45) + #КонецЕсли + #Иначе // "##Параметр(46)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(47) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(48)" = "" И "#Параметр(49)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(48)" = "Условие" ИЛИ "#Параметр(48)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(49) ) +#ИначеЕсли "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + #Параметр(49) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр49.ТипТаблицы + #Если "#Параметр(48)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(48)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(48) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(48)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(48)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(49)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(48) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(49) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(49) + #ИначеЕсли "#Параметр(49)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(48) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(48) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(48) + #КонецЕсли + #Иначе // "##Параметр(49)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(50) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(51)" = "" И "#Параметр(52)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(51)" = "Условие" ИЛИ "#Параметр(51)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(52) ) +#ИначеЕсли "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + #Параметр(52) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр52.ТипТаблицы + #Если "#Параметр(51)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(51)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(51) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(51)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(51)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(52)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(51) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(52) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(52) + #ИначеЕсли "#Параметр(52)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(51) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(51) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(51) + #КонецЕсли + #Иначе // "##Параметр(52)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(53) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + + ) +) +#КонецЕсли + + + + + ПоНаборамЗначений + // ПоНаборамЗначений ( Таблица, Право, Модификатор, ВладелецНаборов). +// № параметра: 1, 2, 3, 4 . +// Читается так: "ограничение доступа по наборам значений". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ВладелецНаборов - имя поля, содержащего ссылку на объект-владелец +// наборов значений доступа в регистре сведений НаборыЗначенийДоступа. +// Если имя поля не задано, считается, что проверяется сам объект-владелец +// наборов значений доступа, который имеет табличную часть <Таблица>.НаборыЗначенийДоступа. +// Эта табличная часть применяется, когда Право - "Добавление" или "Изменение". +// Табличная часть точно такая, как РегистрСведений.НаборыЗначенийДоступа +// без измерения Объект и без реквизитов, которые используются для повышения производительности. +// Для журналов документов нужно указать "Ссылка". +// +// Пример1: ПоНаборамЗначений("Документ.КорректировкаДенежныхСредств", "Чтение", "", "" ) +// Пример2: ПоНаборамЗначений("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", "" ) +// Пример3: ПоНаборамЗначений("ЖурналДокументов.СкладскиеДокументы", "Чтение", "", "Ссылка" ) +// Пример4: ПоНаборамЗначений("Справочник.ВложенияЭлектронныхПисем", "Чтение", "", "Владелец" ) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ГДЕ // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + ИЗ #Параметр(1).НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Ссылка = Т.Ссылка + #Иначе + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + #Если "#Параметр(4)" = "" #Тогда + НомераНаборов.Объект = Т.Ссылка + #Иначе + НомераНаборов.Объект = Т.#Параметр(4) + #КонецЕсли + #КонецЕсли + И НомераНаборов.#Параметр(2) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + ИЗ #Параметр(1).НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Ссылка = Т.Ссылка + #Иначе + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + #Если "#Параметр(4)" = "" #Тогда + НаборыЗначений.Объект = Т.Ссылка + #Иначе + НаборыЗначений.Объект = Т.#Параметр(4) + #КонецЕсли + #КонецЕсли + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + ( + Выбор + // Проверка заведомого ложного или заведомо истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), + Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) ) + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТипЗначения(ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы) = ТипЗначения(НаборыЗначений.ЗначениеДоступа) + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Иначе + Когда НаборыЗначений.ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #КонецЕсли + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаЧерезПраваПоЗначениямДоступа) + #Иначе + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + #КонецЕсли + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + НаборыЗначений.ВидДоступа В (&ВидыДоступаЕдинственныеДляТипаЗначенияДоступа) + #Иначе + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + #КонецЕсли + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезГруппЗначенияДоступа) + #Иначе + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + #КонецЕсли + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) + ) // НЕ Ложь В + ) +) +#КонецЕсли + + + + diff --git a/SSL/src/Roles/ИзменениеВыполнениеЗадач/ИзменениеВыполнениеЗадач.mdo b/SSL/src/Roles/ИзменениеВыполнениеЗадач/ИзменениеВыполнениеЗадач.mdo new file mode 100644 index 000000000..5580a5dbd --- /dev/null +++ b/SSL/src/Roles/ИзменениеВыполнениеЗадач/ИзменениеВыполнениеЗадач.mdo @@ -0,0 +1,8 @@ + + + ИзменениеВыполнениеЗадач + + ru + Изменение и выполнение задач + + diff --git a/SSL/src/Roles/ИзменениеДополнительныхСведений/Rights.rights b/SSL/src/Roles/ИзменениеДополнительныхСведений/Rights.rights new file mode 100644 index 000000000..143ecb366 --- /dev/null +++ b/SSL/src/Roles/ИзменениеДополнительныхСведений/Rights.rights @@ -0,0 +1,3916 @@ + + + false + false + true + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.ValueType + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.Description + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.Code + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.IsFolder + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.Parent + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения.StandardAttribute.Ref + + View + true + + + Edit + true + + + + InformationRegister.ДополнительныеСведения + + Read + true + + #ПоЗначениям( "РегистрСведений.ДополнительныеСведения", "Чтение","", +"ДополнительныеСведения", "Свойство", +"","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","") + + + + Update + true + + #ПоЗначениям( "РегистрСведений.ДополнительныеСведения", "Изменение","", +"ДополнительныеСведения", "Свойство", +"","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","") + + + + + InformationRegister.ДополнительныеСведения.StandardAttribute.Active + + View + true + + + Edit + true + + + + InformationRegister.ДополнительныеСведения.StandardAttribute.LineNumber + + View + true + + + Edit + true + + + + InformationRegister.ДополнительныеСведения.StandardAttribute.Recorder + + View + true + + + Edit + true + + + + InformationRegister.ДополнительныеСведения.StandardAttribute.Period + + View + true + + + Edit + true + + + + Constant.ИспользоватьДополнительныеРеквизитыИСведения + + Read + true + + + View + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Predefined + + View + true + + + Edit + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Ref + + View + true + + + Edit + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.DeletionMark + + View + true + + + Edit + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Owner + + View + true + + + Edit + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Parent + + View + true + + + Edit + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Description + + View + true + + + Edit + true + + + + Catalog.ЗначенияСвойствОбъектов.StandardAttribute.Code + + View + true + + + Edit + true + + + + CommonCommand.ДополнительныеСведения + + View + true + + + + CommonForm.РедактированиеЗначенийСвойств + + View + true + + + + ПоЗначениям + // ПоЗначениям ( Таблица, Право, Модификатор, В1,П1, В2,Р2, ..., В(n), П(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, ..., 2+n*2,3+n*2 . +// Читается так: "ограничение доступа по значениям". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле значения, проверяемого по виду доступа, кроме случая В(n) = "Условие" (или ""). +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И <Условие по группе параметров 2> И ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", +// "Организации","Организация", +// "Поставщики","Контрагент", "","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр5 + ПО + ТипЗначения(#Параметр(5)) = ТипЗначения(ТипыСсылокПараметр5.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр9 + ПО + ТипЗначения(#Параметр(9)) = ТипЗначения(ТипыСсылокПараметр9.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр11 + ПО + ТипЗначения(#Параметр(11)) = ТипЗначения(ТипыСсылокПараметр11.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр15 + ПО + ТипЗначения(#Параметр(15)) = ТипЗначения(ТипыСсылокПараметр15.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр17 + ПО + ТипЗначения(#Параметр(17)) = ТипЗначения(ТипыСсылокПараметр17.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр21 + ПО + ТипЗначения(#Параметр(21)) = ТипЗначения(ТипыСсылокПараметр21.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр23 + ПО + ТипЗначения(#Параметр(23)) = ТипЗначения(ТипыСсылокПараметр23.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр27 + ПО + ТипЗначения(#Параметр(27)) = ТипЗначения(ТипыСсылокПараметр27.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр29 + ПО + ТипЗначения(#Параметр(29)) = ТипЗначения(ТипыСсылокПараметр29.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр33 + ПО + ТипЗначения(#Параметр(33)) = ТипЗначения(ТипыСсылокПараметр33.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр35 + ПО + ТипЗначения(#Параметр(35)) = ТипЗначения(ТипыСсылокПараметр35.ТипТаблицы) +#КонецЕсли + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(4)" = "Условие" ИЛИ "#Параметр(4)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(5) ) +#ИначеЕсли "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + #Параметр(5) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр5.ТипТаблицы + #Если "#Параметр(4)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(4)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(4) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(4)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(4)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(4) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(5) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(5) + #ИначеЕсли "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(4) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(4) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(4) + #КонецЕсли + #Иначе // "Т.##Параметр(5)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(6)" = "" И "#Параметр(7)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + И #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(7) + #ИначеЕсли "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "Т.##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(8)" = "" И "#Параметр(9)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(8)" = "Условие" ИЛИ "#Параметр(8)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(9) ) +#ИначеЕсли "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + И #Параметр(9) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр9.ТипТаблицы + #Если "#Параметр(8)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(8)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(8) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(8)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(8)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(8) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(9) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(9) + #ИначеЕсли "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(8) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(8) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(8) + #КонецЕсли + #Иначе // "Т.##Параметр(9)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(10)" = "" И "#Параметр(11)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(10)" = "Условие" ИЛИ "#Параметр(10)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(11) ) +#ИначеЕсли "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + И #Параметр(11) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр11.ТипТаблицы + #Если "#Параметр(10)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(10)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(10) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(10)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(10)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(10) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(11) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(11) + #ИначеЕсли "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(10) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(10) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(10) + #КонецЕсли + #Иначе // "Т.##Параметр(11)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + И #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(13) + #ИначеЕсли "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "Т.##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(14)" = "" И "#Параметр(15)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(14)" = "Условие" ИЛИ "#Параметр(14)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(15) ) +#ИначеЕсли "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + И #Параметр(15) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр15.ТипТаблицы + #Если "#Параметр(14)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(14)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(14) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(14)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(14)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(14) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(15) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(15) + #ИначеЕсли "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(14) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(14) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(14) + #КонецЕсли + #Иначе // "Т.##Параметр(15)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(16)" = "" И "#Параметр(17)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(16)" = "Условие" ИЛИ "#Параметр(16)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(17) ) +#ИначеЕсли "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + И #Параметр(17) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр17.ТипТаблицы + #Если "#Параметр(16)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(16)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(16) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(16)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(16)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(16) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(17) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(17) + #ИначеЕсли "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(16) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(16) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(16) + #КонецЕсли + #Иначе // "Т.##Параметр(17)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + И #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(19) + #ИначеЕсли "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "Т.##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(20)" = "" И "#Параметр(21)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(20)" = "Условие" ИЛИ "#Параметр(20)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(21) ) +#ИначеЕсли "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + И #Параметр(21) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр21.ТипТаблицы + #Если "#Параметр(20)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(20)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(20) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(20)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(20)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(20) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(21) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(21) + #ИначеЕсли "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(20) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(20) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(20) + #КонецЕсли + #Иначе // "Т.##Параметр(21)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(22)" = "" И "#Параметр(23)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(22)" = "Условие" ИЛИ "#Параметр(22)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(23) ) +#ИначеЕсли "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + И #Параметр(23) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр23.ТипТаблицы + #Если "#Параметр(22)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(22)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(22) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(22)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(22)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(22) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(23) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(23) + #ИначеЕсли "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(22) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(22) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(22) + #КонецЕсли + #Иначе // "Т.##Параметр(23)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + И #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(25) + #ИначеЕсли "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "Т.##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(26)" = "" И "#Параметр(27)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(26)" = "Условие" ИЛИ "#Параметр(26)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(27) ) +#ИначеЕсли "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + И #Параметр(27) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр27.ТипТаблицы + #Если "#Параметр(26)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(26)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(26) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(26)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(26)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(26) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(27) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(27) + #ИначеЕсли "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(26) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(26) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(26) + #КонецЕсли + #Иначе // "Т.##Параметр(27)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(28)" = "" И "#Параметр(29)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(28)" = "Условие" ИЛИ "#Параметр(28)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(29) ) +#ИначеЕсли "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + И #Параметр(29) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр29.ТипТаблицы + #Если "#Параметр(28)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(28)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(28) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(28)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(28)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(28) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(29) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(29) + #ИначеЕсли "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(28) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(28) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(28) + #КонецЕсли + #Иначе // "Т.##Параметр(29)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + И #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(31) + #ИначеЕсли "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "Т.##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(32)" = "" И "#Параметр(33)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(32)" = "Условие" ИЛИ "#Параметр(32)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(33) ) +#ИначеЕсли "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + И #Параметр(33) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр33.ТипТаблицы + #Если "#Параметр(32)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(32)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(32) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(32)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(32)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(32) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(33) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(33) + #ИначеЕсли "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(32) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(32) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(32) + #КонецЕсли + #Иначе // "Т.##Параметр(33)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(34)" = "" И "#Параметр(35)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(34)" = "Условие" ИЛИ "#Параметр(34)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(35) ) +#ИначеЕсли "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + И #Параметр(35) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр35.ТипТаблицы + #Если "#Параметр(34)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(34)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(34) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(34)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(34)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(34) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(35) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(35) + #ИначеЕсли "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(34) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(34) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(34) + #КонецЕсли + #Иначе // "Т.##Параметр(35)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + + ) +) +#КонецЕсли + + + + diff --git a/SSL/src/Roles/ИзменениеДополнительныхСведений/ИзменениеДополнительныхСведений.mdo b/SSL/src/Roles/ИзменениеДополнительныхСведений/ИзменениеДополнительныхСведений.mdo new file mode 100644 index 000000000..34275328a --- /dev/null +++ b/SSL/src/Roles/ИзменениеДополнительныхСведений/ИзменениеДополнительныхСведений.mdo @@ -0,0 +1,8 @@ + + + ИзменениеДополнительныхСведений + + ru + Изменение дополнительных сведений + + diff --git a/SSL/src/Roles/ИзменениеМакетовПечатныхФорм/Rights.rights b/SSL/src/Roles/ИзменениеМакетовПечатныхФорм/Rights.rights new file mode 100644 index 000000000..340a4583e --- /dev/null +++ b/SSL/src/Roles/ИзменениеМакетовПечатныхФорм/Rights.rights @@ -0,0 +1,120 @@ + + + false + false + true + + InformationRegister.ПользовательскиеМакетыПечати.Dimension.Объект + + View + true + + + Edit + true + + + + InformationRegister.ПользовательскиеМакетыПечати.Attribute.Использование + + View + true + + + Edit + true + + + + InformationRegister.ПользовательскиеМакетыПечати + + Read + true + + + Update + true + + + View + true + + + Edit + true + + + + InformationRegister.ПользовательскиеМакетыПечати.StandardAttribute.Active + + View + true + + + Edit + true + + + + InformationRegister.ПользовательскиеМакетыПечати.StandardAttribute.LineNumber + + View + true + + + Edit + true + + + + InformationRegister.ПользовательскиеМакетыПечати.StandardAttribute.Recorder + + View + true + + + Edit + true + + + + InformationRegister.ПользовательскиеМакетыПечати.StandardAttribute.Period + + View + true + + + Edit + true + + + + InformationRegister.ПользовательскиеМакетыПечати.Resource.Макет + + View + true + + + Edit + true + + + + CommonCommand.РедактированиеМакетовПечатныхФорм + + View + true + + + + InformationRegister.ПользовательскиеМакетыПечати.Dimension.ИмяМакета + + View + true + + + Edit + true + + + diff --git a/SSL/src/Roles/ИзменениеМакетовПечатныхФорм/ИзменениеМакетовПечатныхФорм.mdo b/SSL/src/Roles/ИзменениеМакетовПечатныхФорм/ИзменениеМакетовПечатныхФорм.mdo new file mode 100644 index 000000000..8135af6e5 --- /dev/null +++ b/SSL/src/Roles/ИзменениеМакетовПечатныхФорм/ИзменениеМакетовПечатныхФорм.mdo @@ -0,0 +1,8 @@ + + + ИзменениеМакетовПечатныхФорм + + ru + Изменение макетов печатных форм + + diff --git a/SSL/src/Roles/ИзменениеТекущегоВнешнегоПользователя/Rights.rights b/SSL/src/Roles/ИзменениеТекущегоВнешнегоПользователя/Rights.rights new file mode 100644 index 000000000..45be46e1e --- /dev/null +++ b/SSL/src/Roles/ИзменениеТекущегоВнешнегоПользователя/Rights.rights @@ -0,0 +1,219 @@ + + + false + false + true + + Catalog.ВнешниеПользователи.Attribute.ИдентификаторПользователяИБ + + View + true + + + Edit + true + + + + InformationRegister.СоставГруппПользователей + + Read + true + + ГДЕ Пользователь = &ТекущийВнешнийПользователь + + + + + Catalog.ВнешниеПользователи + + Read + true + + ГДЕ Ссылка = &ТекущийВнешнийПользователь + + + + Update + true + + ГДЕ Ссылка = &ТекущийВнешнийПользователь + + + + View + true + + + Edit + true + + + InputByString + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Predefined + + View + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Ref + + View + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Description + + View + true + + + + Catalog.ГруппыВнешнихПользователей.Attribute.ТипОбъектовАвторизации + + View + true + + + + Catalog.ГруппыВнешнихПользователей.Attribute.Комментарий + + View + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Состав + + View + true + + + + Catalog.ВнешниеПользователи.Attribute.УдалитьПароль + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей + + Read + true + + ГДЕ Ссылка = Значение(Справочник.ГруппыВнешнихПользователей.ВсеВнешниеПользователи) + + + + View + true + + + InputByString + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Predefined + + View + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Ref + + View + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Parent + + View + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Description + + View + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Состав.Attribute.ВнешнийПользователь + + View + true + + + + Catalog.ГруппыВнешнихПользователей.Attribute.ВсеОбъектыАвторизации + + View + true + + + + Catalog.ВнешниеПользователи.Attribute.УстановитьРолиНепосредственно + + View + true + + + Edit + true + + + + Catalog.ВнешниеПользователи.Attribute.ОбъектАвторизации + + View + true + + + Edit + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Роли + + View + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Роли.Attribute.Роль + + View + true + + + diff --git a/SSL/src/Roles/ИзменениеТекущегоВнешнегоПользователя/ИзменениеТекущегоВнешнегоПользователя.mdo b/SSL/src/Roles/ИзменениеТекущегоВнешнегоПользователя/ИзменениеТекущегоВнешнегоПользователя.mdo new file mode 100644 index 000000000..1b0b47463 --- /dev/null +++ b/SSL/src/Roles/ИзменениеТекущегоВнешнегоПользователя/ИзменениеТекущегоВнешнегоПользователя.mdo @@ -0,0 +1,8 @@ + + + ИзменениеТекущегоВнешнегоПользователя + + ru + Изменение текущего внешнего пользователя + + diff --git a/SSL/src/Roles/ИзменениеТекущегоПользователя/Rights.rights b/SSL/src/Roles/ИзменениеТекущегоПользователя/Rights.rights new file mode 100644 index 000000000..119e4ce9a --- /dev/null +++ b/SSL/src/Roles/ИзменениеТекущегоПользователя/Rights.rights @@ -0,0 +1,290 @@ + + + false + false + true + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Страна + + View + true + + + Edit + true + + + + Catalog.ГруппыПользователей.Attribute.Комментарий + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.ЗначенияПолей + + View + true + + + Edit + true + + + + Catalog.Пользователи + + Read + true + + ГДЕ Ссылка = &ТекущийПользователь + + + + Update + true + + ГДЕ Ссылка = &ТекущийПользователь + + + + View + true + + + Edit + true + + + InputByString + true + + + + Catalog.Пользователи.StandardAttribute.Predefined + + View + true + + + + Catalog.Пользователи.StandardAttribute.Ref + + View + true + + + + Catalog.Пользователи.StandardAttribute.DeletionMark + + View + true + + + + Catalog.Пользователи.StandardAttribute.Description + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.АдресЭП + + View + true + + + Edit + true + + + + Catalog.ГруппыПользователей.TabularSection.Состав + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.НомерТелефонаБезКодов + + View + true + + + Edit + true + + + + InformationRegister.СоставГруппПользователей + + Read + true + + ГДЕ Пользователь = &ТекущийПользователь + + + + + Catalog.Пользователи.Attribute.ИдентификаторПользователяИБ + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Регион + + View + true + + + Edit + true + + + + Catalog.ГруппыПользователей + + Read + true + + ГДЕ Ссылка = Значение(Справочник.ГруппыПользователей.ВсеПользователи) + + + + View + true + + + InputByString + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Predefined + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Ref + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Parent + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Description + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Вид + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Представление + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.НомерТелефона + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Тип + + View + true + + + Edit + true + + + + Catalog.ГруппыПользователей.TabularSection.Состав.Attribute.Пользователь + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.ДоменноеИмяСервера + + View + true + + + Edit + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Город + + View + true + + + Edit + true + + + diff --git a/SSL/src/Roles/ИзменениеТекущегоПользователя/ИзменениеТекущегоПользователя.mdo b/SSL/src/Roles/ИзменениеТекущегоПользователя/ИзменениеТекущегоПользователя.mdo new file mode 100644 index 000000000..f7dc29af8 --- /dev/null +++ b/SSL/src/Roles/ИзменениеТекущегоПользователя/ИзменениеТекущегоПользователя.mdo @@ -0,0 +1,8 @@ + + + ИзменениеТекущегоПользователя + + ru + Изменение текущего пользователя + + diff --git a/SSL/src/Roles/ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок/Rights.rights b/SSL/src/Roles/ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок/Rights.rights new file mode 100644 index 000000000..b834db8b6 --- /dev/null +++ b/SSL/src/Roles/ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок/Rights.rights @@ -0,0 +1,49 @@ + + + false + false + true + + Configuration.БиблиотекаСтандартныхПодсистем + + TechnicalSpecialistMode + true + + + MainWindowModeNormal + true + + + MainWindowModeWorkplace + true + + + MainWindowModeEmbeddedWorkplace + true + + + MainWindowModeFullscreenWorkplace + true + + + MainWindowModeKiosk + true + + + AnalyticsSystemClient + true + + + SaveUserData + true + + + InteractiveOpenExtDataProcessors + true + + + InteractiveOpenExtReports + true + + + diff --git a/SSL/src/Roles/ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок/ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок.mdo b/SSL/src/Roles/ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок/ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок.mdo new file mode 100644 index 000000000..276c224df --- /dev/null +++ b/SSL/src/Roles/ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок/ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок.mdo @@ -0,0 +1,8 @@ + + + ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + + ru + Интерактивное открытие внешних отчетов и обработок + + diff --git a/SSL/src/Roles/ИспользованиеДополнительныхОтчетовИОбработок/Rights.rights b/SSL/src/Roles/ИспользованиеДополнительныхОтчетовИОбработок/Rights.rights new file mode 100644 index 000000000..518b6d0dd --- /dev/null +++ b/SSL/src/Roles/ИспользованиеДополнительныхОтчетовИОбработок/Rights.rights @@ -0,0 +1,69 @@ + + + false + false + true + + CommonCommand.ДополнительныеОтчетыИОбработкиПечатныеФормы + + View + true + + + + InformationRegister.ПользовательскиеНастройкиДоступаКОбработкам + + Read + true + + + + CommonCommand.ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов + + View + true + + + + InformationRegister.НазначениеДополнительныхОбработок + + Read + true + + + + Catalog.ДополнительныеОтчетыИОбработки + + Read + true + + + + CommonCommand.ДополнительныеОтчетыИОбработкиОтчеты + + View + true + + + + CommonForm.ДополнительныеОтчетыИОбработки + + View + true + + + + CommonForm.НастройкаМоихОтчетовИОбработок + + View + true + + + + CommonCommand.ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта + + View + true + + + diff --git a/SSL/src/Roles/ИспользованиеДополнительныхОтчетовИОбработок/ИспользованиеДополнительныхОтчетовИОбработок.mdo b/SSL/src/Roles/ИспользованиеДополнительныхОтчетовИОбработок/ИспользованиеДополнительныхОтчетовИОбработок.mdo new file mode 100644 index 000000000..a21237748 --- /dev/null +++ b/SSL/src/Roles/ИспользованиеДополнительныхОтчетовИОбработок/ИспользованиеДополнительныхОтчетовИОбработок.mdo @@ -0,0 +1,8 @@ + + + ИспользованиеДополнительныхОтчетовИОбработок + + ru + Использование дополнительных отчетов и обработок + + diff --git a/SSL/src/Roles/ИспользованиеУчетныхЗаписейЭлектроннойПочты/Rights.rights b/SSL/src/Roles/ИспользованиеУчетныхЗаписейЭлектроннойПочты/Rights.rights new file mode 100644 index 000000000..4f308c606 --- /dev/null +++ b/SSL/src/Roles/ИспользованиеУчетныхЗаписейЭлектроннойПочты/Rights.rights @@ -0,0 +1,4002 @@ + + + false + true + true + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.Пароль + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.СпособSMTPАутентификации + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ПарольSMTP + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ИспользоватьДляОтправки + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.SMTPАутентификация + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ОставлятьКопииСообщенийНаСервере + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Command.ПроверкаУчетнойЗаписи + + View + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ОтветственныйЗаОбработкуПисем + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ПортSMTP + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты + + Read + true + + #ПоЗначениям( "Справочник.УчетныеЗаписиЭлектроннойПочты", "Чтение","", +"УчетныеЗаписиЭлектроннойПочты", "Ссылка", +"","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","") + + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.Predefined + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.Ref + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.DeletionMark + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.IsFolder + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.Owner + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.Parent + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.Description + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.StandardAttribute.Code + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.POP3Сервер + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ПользовательSMTP + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ИспользоватьДляПолучения + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ВремяОжидания + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.АдресЭлектроннойПочты + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ВПредставлениеВключатьИмяПользователя + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ПортPOP3 + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ПериодХраненияСообщенийНаСервере + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.ИмяПользователя + + View + false + + + Edit + false + + + + CommonForm.ПодтверждениеПароляУчетнойЗаписи + + View + true + + + + CommonForm.РедактированиеНовогоПисьма + + View + true + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.Пользователь + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.SMTPСервер + + View + false + + + Edit + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты.Attribute.СпособPOP3Аутентификации + + View + false + + + Edit + false + + + + ПоЗначениям + // ПоЗначениям ( Таблица, Право, Модификатор, В1,П1, В2,Р2, ..., В(n), П(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, ..., 2+n*2,3+n*2 . +// Читается так: "ограничение доступа по значениям". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле значения, проверяемого по виду доступа, кроме случая В(n) = "Условие" (или ""). +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И <Условие по группе параметров 2> И ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", +// "Организации","Организация", +// "Поставщики","Контрагент", "","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр5 + ПО + ТипЗначения(#Параметр(5)) = ТипЗначения(ТипыСсылокПараметр5.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр9 + ПО + ТипЗначения(#Параметр(9)) = ТипЗначения(ТипыСсылокПараметр9.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр11 + ПО + ТипЗначения(#Параметр(11)) = ТипЗначения(ТипыСсылокПараметр11.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр15 + ПО + ТипЗначения(#Параметр(15)) = ТипЗначения(ТипыСсылокПараметр15.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр17 + ПО + ТипЗначения(#Параметр(17)) = ТипЗначения(ТипыСсылокПараметр17.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр21 + ПО + ТипЗначения(#Параметр(21)) = ТипЗначения(ТипыСсылокПараметр21.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр23 + ПО + ТипЗначения(#Параметр(23)) = ТипЗначения(ТипыСсылокПараметр23.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр27 + ПО + ТипЗначения(#Параметр(27)) = ТипЗначения(ТипыСсылокПараметр27.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр29 + ПО + ТипЗначения(#Параметр(29)) = ТипЗначения(ТипыСсылокПараметр29.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр33 + ПО + ТипЗначения(#Параметр(33)) = ТипЗначения(ТипыСсылокПараметр33.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр35 + ПО + ТипЗначения(#Параметр(35)) = ТипЗначения(ТипыСсылокПараметр35.ТипТаблицы) +#КонецЕсли + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(4)" = "Условие" ИЛИ "#Параметр(4)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(5) ) +#ИначеЕсли "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + #Параметр(5) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр5.ТипТаблицы + #Если "#Параметр(4)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(4)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(4) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(4)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(4)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(4) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(5) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(5) + #ИначеЕсли "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(4) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(4) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(4) + #КонецЕсли + #Иначе // "Т.##Параметр(5)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(6)" = "" И "#Параметр(7)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + И #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(7) + #ИначеЕсли "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "Т.##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(8)" = "" И "#Параметр(9)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(8)" = "Условие" ИЛИ "#Параметр(8)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(9) ) +#ИначеЕсли "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + И #Параметр(9) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр9.ТипТаблицы + #Если "#Параметр(8)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(8)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(8) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(8)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(8)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(8) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(9) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(9) + #ИначеЕсли "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(8) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(8) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(8) + #КонецЕсли + #Иначе // "Т.##Параметр(9)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(10)" = "" И "#Параметр(11)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(10)" = "Условие" ИЛИ "#Параметр(10)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(11) ) +#ИначеЕсли "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + И #Параметр(11) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр11.ТипТаблицы + #Если "#Параметр(10)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(10)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(10) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(10)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(10)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(10) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(11) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(11) + #ИначеЕсли "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(10) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(10) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(10) + #КонецЕсли + #Иначе // "Т.##Параметр(11)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + И #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(13) + #ИначеЕсли "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "Т.##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(14)" = "" И "#Параметр(15)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(14)" = "Условие" ИЛИ "#Параметр(14)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(15) ) +#ИначеЕсли "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + И #Параметр(15) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр15.ТипТаблицы + #Если "#Параметр(14)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(14)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(14) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(14)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(14)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(14) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(15) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(15) + #ИначеЕсли "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(14) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(14) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(14) + #КонецЕсли + #Иначе // "Т.##Параметр(15)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(16)" = "" И "#Параметр(17)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(16)" = "Условие" ИЛИ "#Параметр(16)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(17) ) +#ИначеЕсли "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + И #Параметр(17) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр17.ТипТаблицы + #Если "#Параметр(16)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(16)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(16) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(16)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(16)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(16) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(17) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(17) + #ИначеЕсли "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(16) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(16) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(16) + #КонецЕсли + #Иначе // "Т.##Параметр(17)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + И #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(19) + #ИначеЕсли "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "Т.##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(20)" = "" И "#Параметр(21)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(20)" = "Условие" ИЛИ "#Параметр(20)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(21) ) +#ИначеЕсли "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + И #Параметр(21) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр21.ТипТаблицы + #Если "#Параметр(20)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(20)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(20) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(20)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(20)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(20) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(21) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(21) + #ИначеЕсли "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(20) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(20) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(20) + #КонецЕсли + #Иначе // "Т.##Параметр(21)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(22)" = "" И "#Параметр(23)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(22)" = "Условие" ИЛИ "#Параметр(22)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(23) ) +#ИначеЕсли "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + И #Параметр(23) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр23.ТипТаблицы + #Если "#Параметр(22)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(22)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(22) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(22)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(22)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(22) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(23) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(23) + #ИначеЕсли "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(22) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(22) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(22) + #КонецЕсли + #Иначе // "Т.##Параметр(23)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + И #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(25) + #ИначеЕсли "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "Т.##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(26)" = "" И "#Параметр(27)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(26)" = "Условие" ИЛИ "#Параметр(26)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(27) ) +#ИначеЕсли "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + И #Параметр(27) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр27.ТипТаблицы + #Если "#Параметр(26)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(26)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(26) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(26)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(26)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(26) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(27) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(27) + #ИначеЕсли "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(26) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(26) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(26) + #КонецЕсли + #Иначе // "Т.##Параметр(27)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(28)" = "" И "#Параметр(29)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(28)" = "Условие" ИЛИ "#Параметр(28)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(29) ) +#ИначеЕсли "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + И #Параметр(29) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр29.ТипТаблицы + #Если "#Параметр(28)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(28)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(28) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(28)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(28)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(28) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(29) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(29) + #ИначеЕсли "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(28) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(28) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(28) + #КонецЕсли + #Иначе // "Т.##Параметр(29)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + И #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(31) + #ИначеЕсли "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "Т.##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(32)" = "" И "#Параметр(33)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(32)" = "Условие" ИЛИ "#Параметр(32)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(33) ) +#ИначеЕсли "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + И #Параметр(33) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр33.ТипТаблицы + #Если "#Параметр(32)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(32)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(32) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(32)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(32)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(32) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(33) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(33) + #ИначеЕсли "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(32) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(32) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(32) + #КонецЕсли + #Иначе // "Т.##Параметр(33)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(34)" = "" И "#Параметр(35)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(34)" = "Условие" ИЛИ "#Параметр(34)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(35) ) +#ИначеЕсли "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + И #Параметр(35) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр35.ТипТаблицы + #Если "#Параметр(34)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(34)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(34) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(34)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(34)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(34) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(35) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(35) + #ИначеЕсли "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(34) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(34) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(34) + #КонецЕсли + #Иначе // "Т.##Параметр(35)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + + ) +) +#КонецЕсли + + + + diff --git a/SSL/src/Roles/ИспользованиеУчетныхЗаписейЭлектроннойПочты/ИспользованиеУчетныхЗаписейЭлектроннойПочты.mdo b/SSL/src/Roles/ИспользованиеУчетныхЗаписейЭлектроннойПочты/ИспользованиеУчетныхЗаписейЭлектроннойПочты.mdo new file mode 100644 index 000000000..900d32f2c --- /dev/null +++ b/SSL/src/Roles/ИспользованиеУчетныхЗаписейЭлектроннойПочты/ИспользованиеУчетныхЗаписейЭлектроннойПочты.mdo @@ -0,0 +1,8 @@ + + + ИспользованиеУчетныхЗаписейЭлектроннойПочты + + ru + Использование учетных записей электронной почты + + diff --git a/SSL/src/Roles/ОбновлениеКонфигурацииБазыДанных/Rights.rights b/SSL/src/Roles/ОбновлениеКонфигурацииБазыДанных/Rights.rights new file mode 100644 index 000000000..5bb39c486 --- /dev/null +++ b/SSL/src/Roles/ОбновлениеКонфигурацииБазыДанных/Rights.rights @@ -0,0 +1,45 @@ + + + false + false + true + + Configuration.БиблиотекаСтандартныхПодсистем + + UpdateDataBaseConfiguration + true + + + TechnicalSpecialistMode + true + + + MainWindowModeNormal + true + + + MainWindowModeWorkplace + true + + + MainWindowModeEmbeddedWorkplace + true + + + MainWindowModeFullscreenWorkplace + true + + + MainWindowModeKiosk + true + + + AnalyticsSystemClient + true + + + SaveUserData + true + + + diff --git a/SSL/src/Roles/ОбновлениеКонфигурацииБазыДанных/ОбновлениеКонфигурацииБазыДанных.mdo b/SSL/src/Roles/ОбновлениеКонфигурацииБазыДанных/ОбновлениеКонфигурацииБазыДанных.mdo new file mode 100644 index 000000000..298514573 --- /dev/null +++ b/SSL/src/Roles/ОбновлениеКонфигурацииБазыДанных/ОбновлениеКонфигурацииБазыДанных.mdo @@ -0,0 +1,8 @@ + + + ОбновлениеКонфигурацииБазыДанных + + ru + Обновление конфигурации базы данных + + diff --git a/SSL/src/Roles/ПолныеПрава/Rights.rights b/SSL/src/Roles/ПолныеПрава/Rights.rights new file mode 100644 index 000000000..6a1e4df79 --- /dev/null +++ b/SSL/src/Roles/ПолныеПрава/Rights.rights @@ -0,0 +1,793 @@ + + + true + true + true + + Catalog.ШаблоныАнкет + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.НаборыДополнительныхРеквизитовИСведений + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ВариантыОтчетов + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ВопросыШаблонаАнкеты + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.Календари + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.Валюты + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ФизическиеЛица + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ВариантыОтветовАнкет + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Task.ЗадачаИсполнителя + + InteractiveDelete + false + + + + Document.НазначениеОпросов + + InteractiveDelete + false + + + + Catalog.СценарииОбменовДанными + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.РолиИсполнителей + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.Пользователи + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.УчетныеЗаписиЭлектроннойПочты + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ВидыДокументовФизическихЛиц + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Document.Анкета + + InteractiveDelete + false + + + + Catalog.ВидыКонтактнойИнформации + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.СтраныМира + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ДополнительныеОтчетыИОбработки + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ВнешниеПользователи + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ПапкиФайлов + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ГруппыПользователей + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ГруппыИсполнителейЗадач + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ЗначенияСвойствОбъектов + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.Организации + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.НазначенияСертификатовЭЦП + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ГруппыВнешнихПользователей + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ГруппыДоступа + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + ChartOfCharacteristicTypes.ВидыДоступа + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ТомаХраненияФайлов + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + BusinessProcess.Задание + + InteractiveDelete + false + + + + Catalog.Файлы + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ВерсииФайлов + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + + Catalog.ПрофилиГруппДоступа + + InteractiveDelete + false + + + InteractiveDeletePredefinedData + false + + + InteractiveSetDeletionMarkPredefinedData + false + + + InteractiveClearDeletionMarkPredefinedData + false + + + InteractiveDeleteMarkedPredefinedData + false + + + diff --git a/SSL/src/Roles/ПолныеПрава/ПолныеПрава.mdo b/SSL/src/Roles/ПолныеПрава/ПолныеПрава.mdo new file mode 100644 index 000000000..af57ec47b --- /dev/null +++ b/SSL/src/Roles/ПолныеПрава/ПолныеПрава.mdo @@ -0,0 +1,8 @@ + + + ПолныеПрава + + ru + Полные права + + diff --git a/SSL/src/Roles/ПроверкаДоступныхОбновленийКонфигурации/Rights.rights b/SSL/src/Roles/ПроверкаДоступныхОбновленийКонфигурации/Rights.rights new file mode 100644 index 000000000..388ef0929 --- /dev/null +++ b/SSL/src/Roles/ПроверкаДоступныхОбновленийКонфигурации/Rights.rights @@ -0,0 +1,556 @@ + + + false + false + true + + DataProcessor.ОбновлениеКонфигурации.Attribute.ПарольАдминистратораКластера + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.НестандартныеПортыСервера + + View + true + + + Edit + true + + + + SessionParameter.ТекущийПользователь + + Get + true + + + Set + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ИсточникОбновления + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.Версия2Разряд + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.РезультатОбновления + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.КодПользователяСервераОбновлений + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.ФайлОбновления + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.КодЗадачиПланировщика + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.НомерДискаИТС + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ПарольАдминистратораИБ + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации + + Use + true + + + View + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ДатаВремяОбновления + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ПортАгентаСервера + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ИмяАдминистратораКластера + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.РежимОбновления + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ИспользоватьРасписаниеДляПроверкиОбновления + + View + true + + + Edit + true + + + + Constant.СтатусОбновленияКонфигурации + + Read + true + + + View + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ЗапомнитьПарольСервераОбновлений + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ВосстанавливатьИнформационнуюБазу + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.ПутьКЛокальномуФайлуОбновления + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ИмяКаталогаРезервнойКопииИБ + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ИмяФайлаОбновления + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ПортКластераСерверов + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ПропускатьПриветствие + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.РазмерФайлаОбновления + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.РасписаниеПроверкиНаличияОбновления + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.ВерсияДляОбновления + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.Версия4Разряд + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ПовторныйЗапуск + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.ЛокальныйОтносительныйКаталог + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ТехническаяИнформацияОбОшибке + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.Версия1Разряд + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ПарольСервераОбновлений + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.Версия3Разряд + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.НуженФайлОбновления + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.АдресЭлектроннойПочты + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.КластерТребуетАутентификации + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ПроверятьНаличиеОбновленияПриЗапуске + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ИмяАдминистратораИБ + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ВыслатьОтчетНаПочту + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.Версия + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.СоздаватьРезервнуюКопию + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.ПутьКЛокальномуФайлу + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ИсточникДискаИТС + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.ПутьКФайлуОбновления + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.Attribute.ПарольАдминистратораИБПроверка + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.Поставщик + + View + true + + + Edit + true + + + + DataProcessor.ОбновлениеКонфигурации.TabularSection.ДоступныеОбновления.Attribute.Конфигурация + + View + true + + + Edit + true + + + diff --git a/SSL/src/Roles/ПроверкаДоступныхОбновленийКонфигурации/ПроверкаДоступныхОбновленийКонфигурации.mdo b/SSL/src/Roles/ПроверкаДоступныхОбновленийКонфигурации/ПроверкаДоступныхОбновленийКонфигурации.mdo new file mode 100644 index 000000000..f0cc73b3e --- /dev/null +++ b/SSL/src/Roles/ПроверкаДоступныхОбновленийКонфигурации/ПроверкаДоступныхОбновленийКонфигурации.mdo @@ -0,0 +1,8 @@ + + + ПроверкаДоступныхОбновленийКонфигурации + + ru + Проверка доступных обновлений конфигурации + + diff --git a/SSL/src/Roles/ПросмотрЖурналаРегистрации/Rights.rights b/SSL/src/Roles/ПросмотрЖурналаРегистрации/Rights.rights new file mode 100644 index 000000000..7a5c2482b --- /dev/null +++ b/SSL/src/Roles/ПросмотрЖурналаРегистрации/Rights.rights @@ -0,0 +1,63 @@ + + + false + false + true + + DataProcessor.ЖурналРегистрации.Command.ЖурналРегистрации + + View + true + + + + Configuration.БиблиотекаСтандартныхПодсистем + + EventLog + true + + + TechnicalSpecialistMode + true + + + MainWindowModeNormal + true + + + MainWindowModeWorkplace + true + + + MainWindowModeEmbeddedWorkplace + true + + + MainWindowModeFullscreenWorkplace + true + + + MainWindowModeKiosk + true + + + AnalyticsSystemClient + true + + + SaveUserData + true + + + + DataProcessor.ЖурналРегистрации + + Use + true + + + View + true + + + diff --git a/SSL/src/Roles/ПросмотрЖурналаРегистрации/ПросмотрЖурналаРегистрации.mdo b/SSL/src/Roles/ПросмотрЖурналаРегистрации/ПросмотрЖурналаРегистрации.mdo new file mode 100644 index 000000000..1077e7781 --- /dev/null +++ b/SSL/src/Roles/ПросмотрЖурналаРегистрации/ПросмотрЖурналаРегистрации.mdo @@ -0,0 +1,8 @@ + + + ПросмотрЖурналаРегистрации + + ru + Просмотр журнала регистрации + + diff --git a/SSL/src/Roles/РедактированиеРеквизитовОбъектов/Rights.rights b/SSL/src/Roles/РедактированиеРеквизитовОбъектов/Rights.rights new file mode 100644 index 000000000..1f52d8f5b --- /dev/null +++ b/SSL/src/Roles/РедактированиеРеквизитовОбъектов/Rights.rights @@ -0,0 +1,6 @@ + + + false + false + true + diff --git a/SSL/src/Roles/РедактированиеРеквизитовОбъектов/РедактированиеРеквизитовОбъектов.mdo b/SSL/src/Roles/РедактированиеРеквизитовОбъектов/РедактированиеРеквизитовОбъектов.mdo new file mode 100644 index 000000000..5d4114cc3 --- /dev/null +++ b/SSL/src/Roles/РедактированиеРеквизитовОбъектов/РедактированиеРеквизитовОбъектов.mdo @@ -0,0 +1,8 @@ + + + РедактированиеРеквизитовОбъектов + + ru + Редактирование реквизитов объектов + + diff --git a/SSL/src/Roles/ЧтениеБазовойНСИ/Rights.rights b/SSL/src/Roles/ЧтениеБазовойНСИ/Rights.rights new file mode 100644 index 000000000..09be4141e --- /dev/null +++ b/SSL/src/Roles/ЧтениеБазовойНСИ/Rights.rights @@ -0,0 +1,1145 @@ + + + false + false + true + + Catalog.ГруппыДоступа.TabularSection.Пользователи + + View + true + + + + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа.Attribute.ДоступРазрешен + + View + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.АдресТолькоРоссийский + + View + true + + + + Catalog.ФизическиеЛица.Attribute.ДатаРождения + + View + true + + + + InformationRegister.КурсыВалют + + Read + true + + + View + true + + + + InformationRegister.КурсыВалют.StandardAttribute.Period + + View + true + + + + InformationRegister.ВерсииОбъектовАдресногоКлассификатора.Dimension.АдресныйОбъект + + View + true + + + + InformationRegister.АдресныйКлассификатор.Resource.Наименование + + View + true + + + + InformationRegister.КалендарныеГрафики + + Read + true + + + View + true + + + + InformationRegister.КалендарныеГрафики.StandardAttribute.Active + + View + true + + + + InformationRegister.КалендарныеГрафики.StandardAttribute.LineNumber + + View + true + + + + InformationRegister.КалендарныеГрафики.StandardAttribute.Recorder + + View + true + + + + InformationRegister.КалендарныеГрафики.StandardAttribute.Period + + View + true + + + + InformationRegister.КалендарныеГрафики.Resource.КоличествоДнейВГрафикеСНачалаГода + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Страна + + View + true + + + + CommonForm.ВводАдреса + + View + true + + + + Catalog.Календари + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.Календари.StandardAttribute.Predefined + + View + true + + + + Catalog.Календари.StandardAttribute.Ref + + View + true + + + + Catalog.Календари.StandardAttribute.DeletionMark + + View + true + + + + Catalog.Календари.StandardAttribute.IsFolder + + View + true + + + + Catalog.Календари.StandardAttribute.Owner + + View + true + + + + Catalog.Календари.StandardAttribute.Parent + + View + true + + + + Catalog.Календари.StandardAttribute.Description + + View + true + + + + Catalog.Календари.StandardAttribute.Code + + View + true + + + + InformationRegister.ВерсииОбъектовАдресногоКлассификатора.Resource.ДатаВыпускаВерсии + + View + true + + + + Catalog.Валюты + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.Валюты.StandardAttribute.Predefined + + View + true + + + + Catalog.Валюты.StandardAttribute.Ref + + View + true + + + + Catalog.Валюты.StandardAttribute.DeletionMark + + View + true + + + + Catalog.Валюты.StandardAttribute.Description + + View + true + + + + Catalog.Валюты.StandardAttribute.Code + + View + true + + + + Catalog.СтраныМира.Attribute.КодАльфа2 + + View + true + + + + InformationRegister.ВерсииОбъектовАдресногоКлассификатора.Resource.Наименование + + View + true + + + + Catalog.Валюты.Attribute.НаименованиеПолное + + View + true + + + + Catalog.ГруппыПользователей.Attribute.Комментарий + + View + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.Тип + + View + true + + + + InformationRegister.АдресныйКлассификатор.Dimension.ТипАдресногоЭлемента + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Predefined + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Ref + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.IsFolder + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Parent + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Description + + View + true + + + + Catalog.ГруппыДоступа.TabularSection.ВидыДоступа.Attribute.ВидДоступа + + View + true + + + + InformationRegister.АдресныеСокращения + + Read + true + + + View + true + + + + Catalog.ГруппыДоступа.TabularSection.ВидыДоступа + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.ЗначенияПолей + + View + true + + + + InformationRegister.АдресныйКлассификатор + + Read + true + + + View + true + + + + InformationRegister.КалендарныеГрафики.Dimension.Год + + View + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.РедактированиеТолькоВДиалоге + + View + true + + + + InformationRegister.КурсыВалют.Resource.Кратность + + View + true + + + + Catalog.ГруппыДоступа.Attribute.Профиль + + View + true + + + + InformationRegister.АдресныйКлассификатор.Resource.АльтернативныеНазвания + + View + true + + + + Catalog.Пользователи + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.Пользователи.StandardAttribute.Predefined + + View + true + + + + Catalog.Пользователи.StandardAttribute.Ref + + View + true + + + + Catalog.Пользователи.StandardAttribute.DeletionMark + + View + true + + + + Catalog.Пользователи.StandardAttribute.Description + + View + true + + + + Catalog.ГруппыДоступа.TabularSection.Пользователи.Attribute.Пользователь + + View + true + + + + CommonForm.ПоискПоИндексу + + View + true + + + + Catalog.Валюты.Attribute.ПодчиненныйКурсОт + + View + true + + + + InformationRegister.АдресныеСокращения.Resource.Наименование + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.АдресЭП + + View + true + + + + Catalog.ГруппыПользователей.TabularSection.Состав + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.НомерТелефонаБезКодов + + View + true + + + + Catalog.ВидыДокументовФизическихЛиц + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.Predefined + + View + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.Ref + + View + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.IsFolder + + View + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.Owner + + View + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.Parent + + View + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.Description + + View + true + + + + Catalog.ВидыДокументовФизическихЛиц.StandardAttribute.Code + + View + true + + + + Catalog.ГруппыДоступа.TabularSection.ВидыДоступа.Attribute.ДоступРазрешен + + View + true + + + + InformationRegister.КалендарныеГрафики.Resource.ДеньВключенВГрафик + + View + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Predefined + + View + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Ref + + View + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.IsFolder + + View + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Parent + + View + true + + + + Catalog.ВидыКонтактнойИнформации.StandardAttribute.Description + + View + true + + + + Catalog.СтраныМира + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.СтраныМира.StandardAttribute.Predefined + + View + true + + + + Catalog.СтраныМира.StandardAttribute.Ref + + View + true + + + + Catalog.СтраныМира.StandardAttribute.DeletionMark + + View + true + + + + Catalog.СтраныМира.StandardAttribute.Description + + View + true + + + + Catalog.СтраныМира.StandardAttribute.Code + + View + true + + + + InformationRegister.СоставГруппПользователей + + Read + true + + + + Catalog.Валюты.Attribute.КоэффициентПодчиненногоКурса + + View + true + + + + InformationRegister.АдресныйКлассификатор.Resource.Индекс + + View + true + + + + InformationRegister.КурсыВалют.Resource.Курс + + View + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.РеквизитДопУпорядочивания + + View + true + + + + Catalog.Пользователи.Attribute.ИдентификаторПользователяИБ + + View + true + + + + Catalog.Валюты.Attribute.ВалютаЗагружается + + View + true + + + + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Регион + + View + true + + + + Catalog.ГруппыПользователей + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Predefined + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Ref + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ГруппыПользователей.StandardAttribute.Description + + View + true + + + + InformationRegister.ВерсииОбъектовАдресногоКлассификатора + + Read + true + + + View + true + + + + InformationRegister.АдресныйКлассификатор.Dimension.Код + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Вид + + View + true + + + + InformationRegister.КурсыВалют.Dimension.Валюта + + View + true + + + + Catalog.ФизическиеЛица.Attribute.Пол + + View + true + + + + InformationRegister.АдресныйКлассификатор.Dimension.КодГородаВКоде + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Представление + + View + true + + + + InformationRegister.АдресныйКлассификатор.Dimension.КодАдресногоОбъектаВКоде + + View + true + + + + InformationRegister.АдресныйКлассификатор.Dimension.КодНаселенногоПунктаВКоде + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.НомерТелефона + + View + true + + + + Catalog.ГруппыДоступа.Attribute.Комментарий + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Тип + + View + true + + + + Catalog.ГруппыПользователей.TabularSection.Состав.Attribute.Пользователь + + View + true + + + + Catalog.ВидыКонтактнойИнформации.Attribute.МожноИзменятьСпособРедактирования + + View + true + + + + InformationRegister.АдресныйКлассификатор.Dimension.КодУлицыВКоде + + View + true + + + + Catalog.ГруппыДоступа + + Read + true + + ГруппыДоступа +ГДЕ + ГруппыДоступа.ЭтоГруппа + ИЛИ ИСТИНА В + (ВЫБРАТЬ ПЕРВЫЕ 1 + ИСТИНА + ИЗ + Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ГруппыДоступаПользователи.Ссылка = ГруппыДоступа.Ссылка + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ + И ПользователиИГруппыПользователей.ГруппаДоступа = ГруппыДоступаПользователи.Пользователь + ) + + + + + View + true + + + InputByString + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Predefined + + View + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Ref + + View + true + + + + Catalog.ГруппыДоступа.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ГруппыДоступа.StandardAttribute.IsFolder + + View + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Owner + + View + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Parent + + View + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Description + + View + true + + + + Catalog.ГруппыДоступа.StandardAttribute.Code + + View + true + + + + ChartOfCharacteristicTypes.ВидыДоступа + + Read + true + + + + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа.Attribute.ЗначениеДоступа + + View + true + + + + InformationRegister.КалендарныеГрафики.Dimension.ДатаГрафика + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация + + View + true + + + + Catalog.СтраныМира.Attribute.КодАльфа3 + + View + true + + + + InformationRegister.АдресныеСокращения.Dimension.Код + + View + true + + + + InformationRegister.АдресныеСокращения.Dimension.Уровень + + View + true + + + + Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа.Attribute.ВидДоступа + + View + true + + + + InformationRegister.АдресныеСокращения.Resource.Сокращение + + View + true + + + + Catalog.ПрофилиГруппДоступа + + Read + true + + ПрофилиГруппДоступа +ГДЕ + ПрофилиГруппДоступа.ЭтоГруппа + ИЛИ ИСТИНА В + (ВЫБРАТЬ ПЕРВЫЕ 1 + ИСТИНА + ИЗ + Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступа.Ссылка + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ + И ПользователиИГруппыПользователей.ГруппаДоступа = ГруппыДоступаПользователи.Пользователь + ) + + + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.ДоменноеИмяСервера + + View + true + + + + InformationRegister.АдресныйКлассификатор.Resource.Сокращение + + View + true + + + + InformationRegister.АдресныйКлассификатор.Dimension.КодРайонаВКоде + + View + true + + + + Catalog.СтраныМира.Attribute.НаименованиеПолное + + View + true + + + + Catalog.ГруппыДоступа.Attribute.ТипПользователей + + View + true + + + + Catalog.Пользователи.TabularSection.КонтактнаяИнформация.Attribute.Город + + View + true + + + + Catalog.Валюты.Attribute.ПараметрыПрописиНаРусском + + View + true + + + + InformationRegister.КалендарныеГрафики.Dimension.Календарь + + View + true + + + diff --git a/SSL/src/Roles/ЧтениеБазовойНСИ/ЧтениеБазовойНСИ.mdo b/SSL/src/Roles/ЧтениеБазовойНСИ/ЧтениеБазовойНСИ.mdo new file mode 100644 index 000000000..326e4711d --- /dev/null +++ b/SSL/src/Roles/ЧтениеБазовойНСИ/ЧтениеБазовойНСИ.mdo @@ -0,0 +1,8 @@ + + + ЧтениеБазовойНСИ + + ru + Чтение базовой нормативно-справочной информации + + diff --git a/SSL/src/Roles/ЧтениеВнешнихПользователей/Rights.rights b/SSL/src/Roles/ЧтениеВнешнихПользователей/Rights.rights new file mode 100644 index 000000000..8f46645a8 --- /dev/null +++ b/SSL/src/Roles/ЧтениеВнешнихПользователей/Rights.rights @@ -0,0 +1,197 @@ + + + false + false + true + + Catalog.ВнешниеПользователи.Attribute.ИдентификаторПользователяИБ + + View + true + + + + CommonForm.ПраваПоЗначениямДоступа + + View + true + + + + InformationRegister.СоставГруппПользователей + + Read + true + + + + CommonCommand.ВнешнийПользовательОбъектаАвторизации + + View + true + + + + Catalog.ВнешниеПользователи + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Predefined + + View + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Ref + + View + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ВнешниеПользователи.StandardAttribute.Description + + View + true + + + + Catalog.ГруппыВнешнихПользователей.Attribute.ТипОбъектовАвторизации + + View + true + + + + Catalog.ГруппыВнешнихПользователей.Attribute.Комментарий + + View + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Состав + + View + true + + + + Catalog.ВнешниеПользователи.Attribute.УдалитьПароль + + View + true + + + + Catalog.ГруппыВнешнихПользователей + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Predefined + + View + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Ref + + View + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Parent + + View + true + + + + Catalog.ГруппыВнешнихПользователей.StandardAttribute.Description + + View + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Состав.Attribute.ВнешнийПользователь + + View + true + + + + Catalog.ГруппыВнешнихПользователей.Attribute.ВсеОбъектыАвторизации + + View + true + + + + Catalog.ВнешниеПользователи.Attribute.УстановитьРолиНепосредственно + + View + true + + + + Catalog.ВнешниеПользователи.Attribute.ОбъектАвторизации + + View + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Роли + + View + true + + + + Catalog.ГруппыВнешнихПользователей.TabularSection.Роли.Attribute.Роль + + View + true + + + diff --git a/SSL/src/Roles/ЧтениеВнешнихПользователей/ЧтениеВнешнихПользователей.mdo b/SSL/src/Roles/ЧтениеВнешнихПользователей/ЧтениеВнешнихПользователей.mdo new file mode 100644 index 000000000..3ac8c6471 --- /dev/null +++ b/SSL/src/Roles/ЧтениеВнешнихПользователей/ЧтениеВнешнихПользователей.mdo @@ -0,0 +1,8 @@ + + + ЧтениеВнешнихПользователей + + ru + Чтение внешних пользователей + + diff --git a/SSL/src/Roles/ЧтениеДополнительныхСведений/Rights.rights b/SSL/src/Roles/ЧтениеДополнительныхСведений/Rights.rights new file mode 100644 index 000000000..c086b85bb --- /dev/null +++ b/SSL/src/Roles/ЧтениеДополнительныхСведений/Rights.rights @@ -0,0 +1,3698 @@ + + + false + false + true + + InformationRegister.ДополнительныеСведения + + Read + true + + #ПоЗначениям( "РегистрСведений.ДополнительныеСведения", "Чтение","", +"ДополнительныеСведения", "Свойство", +"","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","") + + + + + Constant.ИспользоватьДополнительныеРеквизитыИСведения + + Read + true + + + View + true + + + + CommonCommand.ДополнительныеСведения + + View + true + + + + CommonForm.РедактированиеЗначенийСвойств + + View + true + + + + ПоЗначениям + // ПоЗначениям ( Таблица, Право, Модификатор, В1,П1, В2,Р2, ..., В(n), П(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, ..., 2+n*2,3+n*2 . +// Читается так: "ограничение доступа по значениям". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле значения, проверяемого по виду доступа, кроме случая В(n) = "Условие" (или ""). +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И <Условие по группе параметров 2> И ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", +// "Организации","Организация", +// "Поставщики","Контрагент", "","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр5 + ПО + ТипЗначения(#Параметр(5)) = ТипЗначения(ТипыСсылокПараметр5.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр9 + ПО + ТипЗначения(#Параметр(9)) = ТипЗначения(ТипыСсылокПараметр9.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр11 + ПО + ТипЗначения(#Параметр(11)) = ТипЗначения(ТипыСсылокПараметр11.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр15 + ПО + ТипЗначения(#Параметр(15)) = ТипЗначения(ТипыСсылокПараметр15.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр17 + ПО + ТипЗначения(#Параметр(17)) = ТипЗначения(ТипыСсылокПараметр17.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр21 + ПО + ТипЗначения(#Параметр(21)) = ТипЗначения(ТипыСсылокПараметр21.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр23 + ПО + ТипЗначения(#Параметр(23)) = ТипЗначения(ТипыСсылокПараметр23.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр27 + ПО + ТипЗначения(#Параметр(27)) = ТипЗначения(ТипыСсылокПараметр27.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр29 + ПО + ТипЗначения(#Параметр(29)) = ТипЗначения(ТипыСсылокПараметр29.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр33 + ПО + ТипЗначения(#Параметр(33)) = ТипЗначения(ТипыСсылокПараметр33.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр35 + ПО + ТипЗначения(#Параметр(35)) = ТипЗначения(ТипыСсылокПараметр35.ТипТаблицы) +#КонецЕсли + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(4)" = "Условие" ИЛИ "#Параметр(4)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(5) ) +#ИначеЕсли "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + #Параметр(5) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр5.ТипТаблицы + #Если "#Параметр(4)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(4)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(4) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(4)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(4)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(4) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(5) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(5) + #ИначеЕсли "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(4) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(4) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(4) + #КонецЕсли + #Иначе // "Т.##Параметр(5)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(6)" = "" И "#Параметр(7)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + И #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(7) + #ИначеЕсли "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "Т.##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(8)" = "" И "#Параметр(9)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(8)" = "Условие" ИЛИ "#Параметр(8)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(9) ) +#ИначеЕсли "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + И #Параметр(9) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр9.ТипТаблицы + #Если "#Параметр(8)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(8)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(8) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(8)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(8)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(8) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(9) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(9) + #ИначеЕсли "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(8) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(8) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(8) + #КонецЕсли + #Иначе // "Т.##Параметр(9)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(10)" = "" И "#Параметр(11)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(10)" = "Условие" ИЛИ "#Параметр(10)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(11) ) +#ИначеЕсли "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + И #Параметр(11) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр11.ТипТаблицы + #Если "#Параметр(10)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(10)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(10) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(10)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(10)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(10) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(11) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(11) + #ИначеЕсли "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(10) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(10) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(10) + #КонецЕсли + #Иначе // "Т.##Параметр(11)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + И #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(13) + #ИначеЕсли "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "Т.##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(14)" = "" И "#Параметр(15)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(14)" = "Условие" ИЛИ "#Параметр(14)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(15) ) +#ИначеЕсли "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + И #Параметр(15) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр15.ТипТаблицы + #Если "#Параметр(14)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(14)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(14) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(14)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(14)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(14) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(15) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(15) + #ИначеЕсли "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(14) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(14) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(14) + #КонецЕсли + #Иначе // "Т.##Параметр(15)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(16)" = "" И "#Параметр(17)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(16)" = "Условие" ИЛИ "#Параметр(16)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(17) ) +#ИначеЕсли "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + И #Параметр(17) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр17.ТипТаблицы + #Если "#Параметр(16)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(16)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(16) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(16)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(16)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(16) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(17) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(17) + #ИначеЕсли "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(16) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(16) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(16) + #КонецЕсли + #Иначе // "Т.##Параметр(17)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + И #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(19) + #ИначеЕсли "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "Т.##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(20)" = "" И "#Параметр(21)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(20)" = "Условие" ИЛИ "#Параметр(20)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(21) ) +#ИначеЕсли "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + И #Параметр(21) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр21.ТипТаблицы + #Если "#Параметр(20)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(20)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(20) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(20)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(20)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(20) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(21) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(21) + #ИначеЕсли "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(20) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(20) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(20) + #КонецЕсли + #Иначе // "Т.##Параметр(21)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(22)" = "" И "#Параметр(23)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(22)" = "Условие" ИЛИ "#Параметр(22)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(23) ) +#ИначеЕсли "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + И #Параметр(23) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр23.ТипТаблицы + #Если "#Параметр(22)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(22)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(22) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(22)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(22)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(22) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(23) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(23) + #ИначеЕсли "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(22) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(22) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(22) + #КонецЕсли + #Иначе // "Т.##Параметр(23)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + И #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(25) + #ИначеЕсли "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "Т.##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(26)" = "" И "#Параметр(27)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(26)" = "Условие" ИЛИ "#Параметр(26)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(27) ) +#ИначеЕсли "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + И #Параметр(27) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр27.ТипТаблицы + #Если "#Параметр(26)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(26)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(26) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(26)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(26)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(26) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(27) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(27) + #ИначеЕсли "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(26) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(26) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(26) + #КонецЕсли + #Иначе // "Т.##Параметр(27)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(28)" = "" И "#Параметр(29)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(28)" = "Условие" ИЛИ "#Параметр(28)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(29) ) +#ИначеЕсли "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + И #Параметр(29) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр29.ТипТаблицы + #Если "#Параметр(28)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(28)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(28) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(28)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(28)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(28) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(29) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(29) + #ИначеЕсли "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(28) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(28) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(28) + #КонецЕсли + #Иначе // "Т.##Параметр(29)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + И #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(31) + #ИначеЕсли "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "Т.##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(32)" = "" И "#Параметр(33)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(32)" = "Условие" ИЛИ "#Параметр(32)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(33) ) +#ИначеЕсли "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + И #Параметр(33) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр33.ТипТаблицы + #Если "#Параметр(32)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(32)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(32) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(32)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(32)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(32) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(33) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(33) + #ИначеЕсли "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(32) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(32) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(32) + #КонецЕсли + #Иначе // "Т.##Параметр(33)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(34)" = "" И "#Параметр(35)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(34)" = "Условие" ИЛИ "#Параметр(34)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(35) ) +#ИначеЕсли "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + И #Параметр(35) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр35.ТипТаблицы + #Если "#Параметр(34)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(34)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(34) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(34)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(34)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(34) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(35) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(35) + #ИначеЕсли "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(34) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(34) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(34) + #КонецЕсли + #Иначе // "Т.##Параметр(35)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + + ) +) +#КонецЕсли + + + + diff --git a/SSL/src/Roles/ЧтениеДополнительныхСведений/ЧтениеДополнительныхСведений.mdo b/SSL/src/Roles/ЧтениеДополнительныхСведений/ЧтениеДополнительныхСведений.mdo new file mode 100644 index 000000000..f060a23d6 --- /dev/null +++ b/SSL/src/Roles/ЧтениеДополнительныхСведений/ЧтениеДополнительныхСведений.mdo @@ -0,0 +1,8 @@ + + + ЧтениеДополнительныхСведений + + ru + Чтение дополнительных сведений + + diff --git a/SSL/src/Roles/ЧтениеЗаданий/Rights.rights b/SSL/src/Roles/ЧтениеЗаданий/Rights.rights new file mode 100644 index 000000000..3a3e632f4 --- /dev/null +++ b/SSL/src/Roles/ЧтениеЗаданий/Rights.rights @@ -0,0 +1,16229 @@ + + + false + false + true + + Task.ЗадачаИсполнителя.Attribute.РезультатВыполнения + + View + true + + + + Report.СписокПросроченныхЗадач + + Use + true + + + View + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.ДополнительныйОбъектАдресации + + View + true + + + + BusinessProcess.Задание.Attribute.Выполнено + + View + true + + + + Task.ЗадачаИсполнителя.Command.Выполнено + + View + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.ОсновнойОбъектАдресации + + View + true + + + + Report.СправкаОбИсполнительскойДисциплине + + Use + true + + + View + true + + + + SessionParameter.ТекущийПользователь + + Get + true + + + + Task.ЗадачаИсполнителя.Attribute.ДатаНачала + + View + true + + + + Report.СписокИстекающихЗадач + + Use + true + + + View + true + + + + BusinessProcess.Задание.Attribute.ОписаниеЗадания + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.ГруппаИсполнителейЗадач + + View + true + + + + Task.ЗадачаИсполнителя + + Read + true + + #ПоЗначениямИНаборамРасширенный( "Задача.ЗадачаИсполнителя", "Чтение", "", +"", +"", +"Объект","Т.БизнесПроцесс","ИЛИ", +"Пользователи","Т.Автор","ИЛИ", +"Пользователи","Т.Исполнитель","ИЛИ", +"Пользователи","Т.ГруппаИсполнителейЗадач","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","") + + + + + + View + true + + + InputByString + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Executed + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Description + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.RoutePoint + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.BusinessProcess + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Ref + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.DeletionMark + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Date + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Number + + View + true + + + + BusinessProcess.Задание.Attribute.Проверяющий + + View + true + + + + BusinessProcess.Задание.Attribute.СрокИсполнения + + View + true + + + + BusinessProcess.Задание.Attribute.Важность + + View + true + + + + BusinessProcess.Задание.Attribute.Исполнитель + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.СрокИсполнения + + View + true + + + + Task.ЗадачаИсполнителя.Command.ВсеЗадачи + + View + true + + + + BusinessProcess.Задание.Attribute.НомерИтерации + + View + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.Исполнитель + + View + true + + + + BusinessProcess.Задание.Attribute.РезультатВыполнения + + View + true + + + + BusinessProcess.Задание.Attribute.Подтверждено + + View + true + + + + BusinessProcess.Задание.Attribute.СрокПроверки + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.Предмет + + View + true + + + + BusinessProcess.Задание.Attribute.Наименование + + View + true + + + + BusinessProcess.Задание.Attribute.Автор + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.Важность + + View + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.РольИсполнителя + + View + true + + + + Task.ЗадачаИсполнителя.Command.МоиЗадачи + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.ПредметСтрокой + + View + true + + + + BusinessProcess.Задание.Attribute.Предмет + + View + true + + + + BusinessProcess.Задание.Attribute.ДатаЗавершения + + View + true + + + + BusinessProcess.Задание + + Read + true + + #ПоЗначениямИНаборамРасширенный( "БизнесПроцесс.Задание", "Чтение", "", +"", +"", +"Пользователи","Т.Автор","ИЛИ", +"Пользователи","Т.Исполнитель","ИЛИ", +"Пользователи","Т.Проверяющий","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","") + + + + + View + true + + + InputByString + true + + + + BusinessProcess.Задание.StandardAttribute.Started + + View + true + + + + BusinessProcess.Задание.StandardAttribute.HeadTask + + View + true + + + + BusinessProcess.Задание.StandardAttribute.Completed + + View + true + + + + BusinessProcess.Задание.StandardAttribute.Ref + + View + true + + + + BusinessProcess.Задание.StandardAttribute.DeletionMark + + View + true + + + + BusinessProcess.Задание.StandardAttribute.Date + + View + true + + + + BusinessProcess.Задание.StandardAttribute.Number + + View + true + + + + Task.ЗадачаИсполнителя.Command.Перенаправить + + View + true + + + + Report.Задачи + + Use + true + + + View + true + + + + BusinessProcess.Задание.Attribute.НаПроверке + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.Описание + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.ДатаИсполнения + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.Автор + + View + true + + + + ПоЗначениям + // ПоЗначениям ( Таблица, Право, Модификатор, В1,П1, В2,Р2, ..., В(n), П(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, ..., 2+n*2,3+n*2 . +// Читается так: "ограничение доступа по значениям". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле значения, проверяемого по виду доступа, кроме случая В(n) = "Условие" (или ""). +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И <Условие по группе параметров 2> И ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", +// "Организации","Организация", +// "Поставщики","Контрагент", "","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр5 + ПО + ТипЗначения(#Параметр(5)) = ТипЗначения(ТипыСсылокПараметр5.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр9 + ПО + ТипЗначения(#Параметр(9)) = ТипЗначения(ТипыСсылокПараметр9.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр11 + ПО + ТипЗначения(#Параметр(11)) = ТипЗначения(ТипыСсылокПараметр11.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр15 + ПО + ТипЗначения(#Параметр(15)) = ТипЗначения(ТипыСсылокПараметр15.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр17 + ПО + ТипЗначения(#Параметр(17)) = ТипЗначения(ТипыСсылокПараметр17.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр21 + ПО + ТипЗначения(#Параметр(21)) = ТипЗначения(ТипыСсылокПараметр21.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр23 + ПО + ТипЗначения(#Параметр(23)) = ТипЗначения(ТипыСсылокПараметр23.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр27 + ПО + ТипЗначения(#Параметр(27)) = ТипЗначения(ТипыСсылокПараметр27.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр29 + ПО + ТипЗначения(#Параметр(29)) = ТипЗначения(ТипыСсылокПараметр29.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр33 + ПО + ТипЗначения(#Параметр(33)) = ТипЗначения(ТипыСсылокПараметр33.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр35 + ПО + ТипЗначения(#Параметр(35)) = ТипЗначения(ТипыСсылокПараметр35.ТипТаблицы) +#КонецЕсли + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(4)" = "Условие" ИЛИ "#Параметр(4)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(5) ) +#ИначеЕсли "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + #Параметр(5) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр5.ТипТаблицы + #Если "#Параметр(4)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(4)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(4) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(4)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(4)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(4) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(5) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(5) + #ИначеЕсли "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(4) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(4) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(4) + #КонецЕсли + #Иначе // "Т.##Параметр(5)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(6)" = "" И "#Параметр(7)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + И #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(7) + #ИначеЕсли "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "Т.##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(8)" = "" И "#Параметр(9)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(8)" = "Условие" ИЛИ "#Параметр(8)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(9) ) +#ИначеЕсли "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + И #Параметр(9) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр9.ТипТаблицы + #Если "#Параметр(8)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(8)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(8) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(8)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(8)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(8) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(9) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(9) + #ИначеЕсли "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(8) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(8) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(8) + #КонецЕсли + #Иначе // "Т.##Параметр(9)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(10)" = "" И "#Параметр(11)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(10)" = "Условие" ИЛИ "#Параметр(10)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(11) ) +#ИначеЕсли "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + И #Параметр(11) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр11.ТипТаблицы + #Если "#Параметр(10)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(10)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(10) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(10)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(10)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(10) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(11) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(11) + #ИначеЕсли "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(10) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(10) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(10) + #КонецЕсли + #Иначе // "Т.##Параметр(11)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + И #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(13) + #ИначеЕсли "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "Т.##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(14)" = "" И "#Параметр(15)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(14)" = "Условие" ИЛИ "#Параметр(14)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(15) ) +#ИначеЕсли "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + И #Параметр(15) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр15.ТипТаблицы + #Если "#Параметр(14)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(14)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(14) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(14)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(14)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(14) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(15) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(15) + #ИначеЕсли "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(14) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(14) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(14) + #КонецЕсли + #Иначе // "Т.##Параметр(15)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(16)" = "" И "#Параметр(17)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(16)" = "Условие" ИЛИ "#Параметр(16)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(17) ) +#ИначеЕсли "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + И #Параметр(17) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр17.ТипТаблицы + #Если "#Параметр(16)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(16)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(16) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(16)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(16)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(16) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(17) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(17) + #ИначеЕсли "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(16) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(16) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(16) + #КонецЕсли + #Иначе // "Т.##Параметр(17)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + И #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(19) + #ИначеЕсли "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "Т.##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(20)" = "" И "#Параметр(21)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(20)" = "Условие" ИЛИ "#Параметр(20)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(21) ) +#ИначеЕсли "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + И #Параметр(21) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр21.ТипТаблицы + #Если "#Параметр(20)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(20)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(20) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(20)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(20)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(20) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(21) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(21) + #ИначеЕсли "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(20) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(20) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(20) + #КонецЕсли + #Иначе // "Т.##Параметр(21)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(22)" = "" И "#Параметр(23)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(22)" = "Условие" ИЛИ "#Параметр(22)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(23) ) +#ИначеЕсли "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + И #Параметр(23) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр23.ТипТаблицы + #Если "#Параметр(22)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(22)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(22) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(22)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(22)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(22) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(23) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(23) + #ИначеЕсли "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(22) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(22) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(22) + #КонецЕсли + #Иначе // "Т.##Параметр(23)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + И #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(25) + #ИначеЕсли "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "Т.##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(26)" = "" И "#Параметр(27)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(26)" = "Условие" ИЛИ "#Параметр(26)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(27) ) +#ИначеЕсли "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + И #Параметр(27) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр27.ТипТаблицы + #Если "#Параметр(26)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(26)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(26) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(26)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(26)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(26) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(27) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(27) + #ИначеЕсли "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(26) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(26) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(26) + #КонецЕсли + #Иначе // "Т.##Параметр(27)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(28)" = "" И "#Параметр(29)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(28)" = "Условие" ИЛИ "#Параметр(28)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(29) ) +#ИначеЕсли "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + И #Параметр(29) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр29.ТипТаблицы + #Если "#Параметр(28)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(28)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(28) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(28)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(28)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(28) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(29) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(29) + #ИначеЕсли "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(28) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(28) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(28) + #КонецЕсли + #Иначе // "Т.##Параметр(29)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + И #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(31) + #ИначеЕсли "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "Т.##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(32)" = "" И "#Параметр(33)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(32)" = "Условие" ИЛИ "#Параметр(32)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(33) ) +#ИначеЕсли "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + И #Параметр(33) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр33.ТипТаблицы + #Если "#Параметр(32)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(32)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(32) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(32)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(32)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(32) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(33) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(33) + #ИначеЕсли "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(32) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(32) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(32) + #КонецЕсли + #Иначе // "Т.##Параметр(33)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(34)" = "" И "#Параметр(35)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(34)" = "Условие" ИЛИ "#Параметр(34)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(35) ) +#ИначеЕсли "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + И #Параметр(35) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр35.ТипТаблицы + #Если "#Параметр(34)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(34)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(34) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(34)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(34)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(34) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(35) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(35) + #ИначеЕсли "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(34) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(34) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(34) + #КонецЕсли + #Иначе // "Т.##Параметр(35)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + + ) +) +#КонецЕсли + + + + + ПоЗначениямИНаборамРасширенный + // ПоЗначениямИНаборамРасширенный ( Таблица, Право, Модификатор, ПрисоединяемыеТаблицы, О, В1,П1,О1, В2,П2,О2,..., В(n), П(n), О(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,...,3+n*3,4+n*3,5+n*3 . +// Читается так: "ограничение доступа по наборам и значениям расширенный". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ПрисоединяемыеТаблицы - текст присоедиения дополнительных таблиц на языке запросов, например, +// "ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ОплатаПоставщикам КАК Т1 +// ПО Т.Ссылка = Т1.Ссылка". +// Присоединение позволяет указать поля таблицы ОплатаПоставщикам, как поля основной таблицы +// для проверки их значений, как значений основной таблицы. +// Следует помнить, что при размножении строк в результате соединения, достаточно чтобы +// всего одна строка прошла условия проверки, т.е. результаты проверки строк объединяются по "ИЛИ". +// О - Начальные скобки "(". +// В(n) - ВидДоступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// Когда В(n) = "Объект" (или " "), то +// когда есть запись зависимости прав в регистре сведений ЗависимостиПравДоступа +// тогда используется данные записи - проверка указанного права Т.Р(n) и/или наборов значений доступа +// в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.Р(n) для указанного ограничения права; +// иначе используется стандартное правило: +// когда Право = "Чтение" тогда выполняется проверка права чтения Т.Р(n) и наборов значений доступа +// в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.Р(n) для права чтения; +// когда Право = "Добавление" ИЛИ "Изменение" ИЛИ "Удаление" тогда выполняется проверка права изменения Т.Р(n) +// и наборов значений доступа, считываемых по ссылке Т.Р(n) для права изменения. +// П(n) - Поле с псевдонимом, например "Т.Организация", значение которого проверяется +// по виду доступа, кроме случая В(n) = "Условие" (или ""). +// О(n) - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")". +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Соединение по таблице1> <Соединение по таблице2> ... <Соединение по таблице(m)> +// <Общая часть условий> <Условие по группе параметров 1> И/ИЛИ <Условие по группе параметров 1> И/ИЛИ ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениямИНаборамРасширенный("ЖурналДокументов.СкладскиеДокументы", "Чтение", "", +// "", +// "", +// "Объект","Т.Ссылка","И", +// "Объект","Т.ОсновнойДокумент","", "","","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 1. +#Если "#Параметр(6)" = "Объект" ИЛИ "#Параметр(6)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр7 + ПО + ТипыСсылокПараметр7.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр7.Объект = #Параметр(7) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр7 + ПО + ЗависимостиПравПараметр7.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр7.ТипВедущейТаблицы = ТипыСсылокПараметр7.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр10 + ПО + ТипЗначения(#Параметр(10)) = ТипЗначения(ТипыСсылокПараметр10.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 2. +#Если "#Параметр(9)" = "Объект" ИЛИ "#Параметр(9)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр10 + ПО + ТипыСсылокПараметр10.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр10.Объект = #Параметр(10) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр10 + ПО + ЗависимостиПравПараметр10.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр10.ТипВедущейТаблицы = ТипыСсылокПараметр10.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 3. +#Если "#Параметр(12)" = "Объект" ИЛИ "#Параметр(12)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр13 + ПО + ТипыСсылокПараметр13.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр13.Объект = #Параметр(13) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр13 + ПО + ЗависимостиПравПараметр13.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр13.ТипВедущейТаблицы = ТипыСсылокПараметр13.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр16 + ПО + ТипЗначения(#Параметр(16)) = ТипЗначения(ТипыСсылокПараметр16.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 4. +#Если "#Параметр(15)" = "Объект" ИЛИ "#Параметр(15)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр16 + ПО + ТипыСсылокПараметр16.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр16.Объект = #Параметр(16) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр16 + ПО + ЗависимостиПравПараметр16.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр16.ТипВедущейТаблицы = ТипыСсылокПараметр16.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 5. +#Если "#Параметр(18)" = "Объект" ИЛИ "#Параметр(18)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр19 + ПО + ТипыСсылокПараметр19.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр19.Объект = #Параметр(19) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр19 + ПО + ЗависимостиПравПараметр19.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр19.ТипВедущейТаблицы = ТипыСсылокПараметр19.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр22 + ПО + ТипЗначения(#Параметр(22)) = ТипЗначения(ТипыСсылокПараметр22.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 6. +#Если "#Параметр(21)" = "Объект" ИЛИ "#Параметр(21)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр22 + ПО + ТипыСсылокПараметр22.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр22.Объект = #Параметр(22) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр22 + ПО + ЗависимостиПравПараметр22.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр22.ТипВедущейТаблицы = ТипыСсылокПараметр22.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 7. +#Если "#Параметр(24)" = "Объект" ИЛИ "#Параметр(24)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр25 + ПО + ТипыСсылокПараметр25.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр25.Объект = #Параметр(25) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр25 + ПО + ЗависимостиПравПараметр25.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр25.ТипВедущейТаблицы = ТипыСсылокПараметр25.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр28 + ПО + ТипЗначения(#Параметр(28)) = ТипЗначения(ТипыСсылокПараметр28.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 8. +#Если "#Параметр(27)" = "Объект" ИЛИ "#Параметр(27)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр28 + ПО + ТипыСсылокПараметр28.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр28.Объект = #Параметр(28) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр28 + ПО + ЗависимостиПравПараметр28.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр28.ТипВедущейТаблицы = ТипыСсылокПараметр28.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 9. +#Если "#Параметр(30)" = "Объект" ИЛИ "#Параметр(30)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр31 + ПО + ТипыСсылокПараметр31.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр31.Объект = #Параметр(31) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр31 + ПО + ЗависимостиПравПараметр31.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр31.ТипВедущейТаблицы = ТипыСсылокПараметр31.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр34 + ПО + ТипЗначения(#Параметр(34)) = ТипЗначения(ТипыСсылокПараметр34.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 10. +#Если "#Параметр(33)" = "Объект" ИЛИ "#Параметр(33)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр34 + ПО + ТипыСсылокПараметр34.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр34.Объект = #Параметр(34) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр34 + ПО + ЗависимостиПравПараметр34.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр34.ТипВедущейТаблицы = ТипыСсылокПараметр34.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр37 + ПО + ТипЗначения(#Параметр(37)) = ТипЗначения(ТипыСсылокПараметр37.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 11. +#Если "#Параметр(36)" = "Объект" ИЛИ "#Параметр(36)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр37 + ПО + ТипыСсылокПараметр37.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр37.Объект = #Параметр(37) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр37 + ПО + ЗависимостиПравПараметр37.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр37.ТипВедущейТаблицы = ТипыСсылокПараметр37.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр40 + ПО + ТипЗначения(#Параметр(40)) = ТипЗначения(ТипыСсылокПараметр40.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 12. +#Если "#Параметр(39)" = "Объект" ИЛИ "#Параметр(39)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр40 + ПО + ТипыСсылокПараметр40.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр40.Объект = #Параметр(40) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр40 + ПО + ЗависимостиПравПараметр40.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр40.ТипВедущейТаблицы = ТипыСсылокПараметр40.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр43 + ПО + ТипЗначения(#Параметр(43)) = ТипЗначения(ТипыСсылокПараметр43.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 13. +#Если "#Параметр(42)" = "Объект" ИЛИ "#Параметр(42)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр43 + ПО + ТипыСсылокПараметр43.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр43.Объект = #Параметр(43) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр43 + ПО + ЗависимостиПравПараметр43.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр43.ТипВедущейТаблицы = ТипыСсылокПараметр43.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр46 + ПО + ТипЗначения(#Параметр(46)) = ТипЗначения(ТипыСсылокПараметр46.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 14. +#Если "#Параметр(45)" = "Объект" ИЛИ "#Параметр(45)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр46 + ПО + ТипыСсылокПараметр46.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр46.Объект = #Параметр(46) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр46 + ПО + ЗависимостиПравПараметр46.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр46.ТипВедущейТаблицы = ТипыСсылокПараметр46.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр49 + ПО + ТипЗначения(#Параметр(49)) = ТипЗначения(ТипыСсылокПараметр49.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 15. +#Если "#Параметр(48)" = "Объект" ИЛИ "#Параметр(48)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр49 + ПО + ТипыСсылокПараметр49.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр49.Объект = #Параметр(49) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр49 + ПО + ЗависимостиПравПараметр49.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр49.ТипВедущейТаблицы = ТипыСсылокПараметр49.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр52 + ПО + ТипЗначения(#Параметр(52)) = ТипЗначения(ТипыСсылокПараметр52.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 16. +#Если "#Параметр(51)" = "Объект" ИЛИ "#Параметр(51)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр52 + ПО + ТипыСсылокПараметр52.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр52.Объект = #Параметр(52) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр52 + ПО + ЗависимостиПравПараметр52.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр52.ТипВедущейТаблицы = ТипыСсылокПараметр52.ТипОбъекта +#КонецЕсли + +// Присоединяемые таблицы к проверяемой строке текущей таблицы "Т". +#Параметр(4) + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + + #Параметр(5) // [([(][(]...] 0-n открывающихся скобок. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(6)" = "Объект" ИЛИ "#Параметр(6)" = " " #Тогда + #Параметр(7) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр7.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр7.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(7) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(7) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(7) + #ИначеЕсли "#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(8) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(9)" = "" И "#Параметр(10)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(9)" = "Условие" ИЛИ "#Параметр(9)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(10) ) +#ИначеЕсли "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + #Параметр(10) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр10.ТипТаблицы + #Если "#Параметр(9)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(9)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(9)" = "Объект" ИЛИ "#Параметр(9)" = " " #Тогда + #Параметр(10) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр10.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр10.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(10) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(10) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(9) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(9)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(9)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(10)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(9) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(10) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(10) + #ИначеЕсли "#Параметр(10)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(9) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(9) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(9) + #КонецЕсли + #Иначе // "##Параметр(10)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(11) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(12)" = "Объект" ИЛИ "#Параметр(12)" = " " #Тогда + #Параметр(13) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр13.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр13.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(13) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(13) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(13) + #ИначеЕсли "#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(14) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(15)" = "" И "#Параметр(16)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(15)" = "Условие" ИЛИ "#Параметр(15)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(16) ) +#ИначеЕсли "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + #Параметр(16) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр16.ТипТаблицы + #Если "#Параметр(15)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(15)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(15)" = "Объект" ИЛИ "#Параметр(15)" = " " #Тогда + #Параметр(16) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр16.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр16.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(16) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(16) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(15) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(15)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(15)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(16)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(15) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(16) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(16) + #ИначеЕсли "#Параметр(16)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(15) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(15) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(15) + #КонецЕсли + #Иначе // "##Параметр(16)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(17) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(18)" = "Объект" ИЛИ "#Параметр(18)" = " " #Тогда + #Параметр(19) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр19.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр19.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(19) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(19) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(19) + #ИначеЕсли "#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(20) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(21)" = "" И "#Параметр(22)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(21)" = "Условие" ИЛИ "#Параметр(21)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(22) ) +#ИначеЕсли "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + #Параметр(22) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр22.ТипТаблицы + #Если "#Параметр(21)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(21)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(21)" = "Объект" ИЛИ "#Параметр(21)" = " " #Тогда + #Параметр(22) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр22.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр22.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(22) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(22) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(21) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(21)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(21)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(22)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(21) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(22) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(22) + #ИначеЕсли "#Параметр(22)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(21) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(21) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(21) + #КонецЕсли + #Иначе // "##Параметр(22)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(23) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(24)" = "Объект" ИЛИ "#Параметр(24)" = " " #Тогда + #Параметр(25) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр25.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр25.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(25) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(25) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(25) + #ИначеЕсли "#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(26) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(27)" = "" И "#Параметр(28)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(27)" = "Условие" ИЛИ "#Параметр(27)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(28) ) +#ИначеЕсли "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + #Параметр(28) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр28.ТипТаблицы + #Если "#Параметр(27)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(27)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(27)" = "Объект" ИЛИ "#Параметр(27)" = " " #Тогда + #Параметр(28) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр28.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр28.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(28) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(28) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(27) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(27)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(27)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(28)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(27) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(28) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(28) + #ИначеЕсли "#Параметр(28)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(27) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(27) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(27) + #КонецЕсли + #Иначе // "##Параметр(28)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(29) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(30)" = "Объект" ИЛИ "#Параметр(30)" = " " #Тогда + #Параметр(31) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр31.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр31.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(31) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(31) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(31) + #ИначеЕсли "#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(32) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(33)" = "" И "#Параметр(34)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(33)" = "Условие" ИЛИ "#Параметр(33)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(34) ) +#ИначеЕсли "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + #Параметр(34) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр34.ТипТаблицы + #Если "#Параметр(33)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(33)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(33)" = "Объект" ИЛИ "#Параметр(33)" = " " #Тогда + #Параметр(34) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр34.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр34.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(34) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(34) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(33) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(33)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(33)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(34)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(33) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(34) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(34) + #ИначеЕсли "#Параметр(34)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(33) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(33) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(33) + #КонецЕсли + #Иначе // "##Параметр(34)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(35) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(36)" = "" И "#Параметр(37)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(36)" = "Условие" ИЛИ "#Параметр(36)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(37) ) +#ИначеЕсли "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + #Параметр(37) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр37.ТипТаблицы + #Если "#Параметр(36)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(36)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(36)" = "Объект" ИЛИ "#Параметр(36)" = " " #Тогда + #Параметр(37) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр37.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр37.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(37) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(37) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(36) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(36)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(36)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(37)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(36) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(37) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(37) + #ИначеЕсли "#Параметр(37)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(36) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(36) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(36) + #КонецЕсли + #Иначе // "##Параметр(37)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(38) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(39)" = "" И "#Параметр(40)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(39)" = "Условие" ИЛИ "#Параметр(39)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(40) ) +#ИначеЕсли "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + #Параметр(40) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр40.ТипТаблицы + #Если "#Параметр(39)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(39)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(39)" = "Объект" ИЛИ "#Параметр(39)" = " " #Тогда + #Параметр(40) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр40.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр40.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(40) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(40) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(39) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(39)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(39)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(40)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(39) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(40) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(40) + #ИначеЕсли "#Параметр(40)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(39) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(39) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(39) + #КонецЕсли + #Иначе // "##Параметр(40)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(41) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(42)" = "" И "#Параметр(43)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(42)" = "Условие" ИЛИ "#Параметр(42)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(43) ) +#ИначеЕсли "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + #Параметр(43) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр43.ТипТаблицы + #Если "#Параметр(42)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(42)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(42)" = "Объект" ИЛИ "#Параметр(42)" = " " #Тогда + #Параметр(43) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр43.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр43.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(43) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(43) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(42) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(42)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(42)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(43)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(42) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(43) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(43) + #ИначеЕсли "#Параметр(43)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(42) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(42) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(42) + #КонецЕсли + #Иначе // "##Параметр(43)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(44) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(45)" = "" И "#Параметр(46)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(45)" = "Условие" ИЛИ "#Параметр(45)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(46) ) +#ИначеЕсли "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + #Параметр(46) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр46.ТипТаблицы + #Если "#Параметр(45)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(45)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(45)" = "Объект" ИЛИ "#Параметр(45)" = " " #Тогда + #Параметр(46) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр46.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр46.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(46) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(46) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(45) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(45)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(45)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(46)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(45) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(46) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(46) + #ИначеЕсли "#Параметр(46)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(45) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(45) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(45) + #КонецЕсли + #Иначе // "##Параметр(46)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(47) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(48)" = "" И "#Параметр(49)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(48)" = "Условие" ИЛИ "#Параметр(48)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(49) ) +#ИначеЕсли "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + #Параметр(49) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр49.ТипТаблицы + #Если "#Параметр(48)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(48)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(48)" = "Объект" ИЛИ "#Параметр(48)" = " " #Тогда + #Параметр(49) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр49.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр49.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(49) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(49) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(48) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(48)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(48)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(49)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(48) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(49) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(49) + #ИначеЕсли "#Параметр(49)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(48) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(48) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(48) + #КонецЕсли + #Иначе // "##Параметр(49)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(50) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(51)" = "" И "#Параметр(52)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(51)" = "Условие" ИЛИ "#Параметр(51)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(52) ) +#ИначеЕсли "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + #Параметр(52) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр52.ТипТаблицы + #Если "#Параметр(51)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(51)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(51)" = "Объект" ИЛИ "#Параметр(51)" = " " #Тогда + #Параметр(52) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр52.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр52.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(52) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(52) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(51) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(51)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(51)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(52)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(51) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(52) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(52) + #ИначеЕсли "#Параметр(52)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(51) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(51) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(51) + #КонецЕсли + #Иначе // "##Параметр(52)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(53) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + + ) +) +#КонецЕсли + + + + + ПоЗначениямРасширенный + // ПоЗначениямРасширенный ( Таблица, Право, Модификатор, ПрисоединяемыеТаблицы, О, В1,П1,О1, В2,П2,О2,..., В(n), П(n), О(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,...,3+n*3,4+n*3,5+n*3 . +// Читается так: "ограничение доступа по значениям расширенный". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ПрисоединяемыеТаблицы - текст присоедиения дополнительных таблиц на языке запросов, например, +// "ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ОплатаПоставщикам КАК Т1 +// ПО Т.Ссылка = Т1.Ссылка". +// Присоединение позволяет указать поля таблицы ОплатаПоставщикам, как поля основной таблицы +// для проверки их значений, как значений основной таблицы. +// Следует помнить, что при размножении строк в результате соединения, достаточно чтобы +// всего одна строка прошла условия проверки, т.е. результаты проверки строк объединяются по "ИЛИ". +// О - Начальные скобки "(". +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле с псевдонимом, например "Т.Организация", значение которого проверяется +// по виду доступа, кроме случая В(n) = "Условие" (или ""). +// О(n) - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")". +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И/ИЛИ <Условие по группе параметров 2> И/ИЛИ ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениямРасширенный("Документ.ПеремещениеТоваров", "Чтение", "", +// "", +// "", +// "Организации","Т.Организация","И(", +// "Склады","Т.СкладОтправитель","ИЛИ", +// "Склады","Т.СкладПолучатель",")", "","","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр10 + ПО + ТипЗначения(#Параметр(10)) = ТипЗначения(ТипыСсылокПараметр10.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр16 + ПО + ТипЗначения(#Параметр(16)) = ТипЗначения(ТипыСсылокПараметр16.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр22 + ПО + ТипЗначения(#Параметр(22)) = ТипЗначения(ТипыСсылокПараметр22.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр28 + ПО + ТипЗначения(#Параметр(28)) = ТипЗначения(ТипыСсылокПараметр28.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр34 + ПО + ТипЗначения(#Параметр(34)) = ТипЗначения(ТипыСсылокПараметр34.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр37 + ПО + ТипЗначения(#Параметр(37)) = ТипЗначения(ТипыСсылокПараметр37.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр40 + ПО + ТипЗначения(#Параметр(40)) = ТипЗначения(ТипыСсылокПараметр40.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр43 + ПО + ТипЗначения(#Параметр(43)) = ТипЗначения(ТипыСсылокПараметр43.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр46 + ПО + ТипЗначения(#Параметр(46)) = ТипЗначения(ТипыСсылокПараметр46.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр49 + ПО + ТипЗначения(#Параметр(49)) = ТипЗначения(ТипыСсылокПараметр49.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр52 + ПО + ТипЗначения(#Параметр(52)) = ТипЗначения(ТипыСсылокПараметр52.ТипТаблицы) +#КонецЕсли + +// Присоединяемые таблицы к проверяемой строке текущей таблицы "Т". +#Параметр(4) + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + + #Параметр(5) // [([(][(]...] 0-n открывающихся скобок. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(7) + #ИначеЕсли "#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(8) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(9)" = "" И "#Параметр(10)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(9)" = "Условие" ИЛИ "#Параметр(9)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(10) ) +#ИначеЕсли "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + #Параметр(10) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр10.ТипТаблицы + #Если "#Параметр(9)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(9)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(9) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(9)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(9)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(10)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(9) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(10) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(10) + #ИначеЕсли "#Параметр(10)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(9) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(9) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(9) + #КонецЕсли + #Иначе // "##Параметр(10)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(11) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(13) + #ИначеЕсли "#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(14) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(15)" = "" И "#Параметр(16)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(15)" = "Условие" ИЛИ "#Параметр(15)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(16) ) +#ИначеЕсли "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + #Параметр(16) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр16.ТипТаблицы + #Если "#Параметр(15)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(15)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(15) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(15)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(15)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(16)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(15) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(16) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(16) + #ИначеЕсли "#Параметр(16)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(15) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(15) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(15) + #КонецЕсли + #Иначе // "##Параметр(16)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(17) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(19) + #ИначеЕсли "#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(20) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(21)" = "" И "#Параметр(22)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(21)" = "Условие" ИЛИ "#Параметр(21)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(22) ) +#ИначеЕсли "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + #Параметр(22) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр22.ТипТаблицы + #Если "#Параметр(21)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(21)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(21) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(21)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(21)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(22)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(21) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(22) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(22) + #ИначеЕсли "#Параметр(22)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(21) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(21) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(21) + #КонецЕсли + #Иначе // "##Параметр(22)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(23) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(25) + #ИначеЕсли "#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(26) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(27)" = "" И "#Параметр(28)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(27)" = "Условие" ИЛИ "#Параметр(27)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(28) ) +#ИначеЕсли "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + #Параметр(28) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр28.ТипТаблицы + #Если "#Параметр(27)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(27)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(27) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(27)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(27)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(28)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(27) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(28) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(28) + #ИначеЕсли "#Параметр(28)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(27) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(27) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(27) + #КонецЕсли + #Иначе // "##Параметр(28)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(29) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(31) + #ИначеЕсли "#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(32) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(33)" = "" И "#Параметр(34)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(33)" = "Условие" ИЛИ "#Параметр(33)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(34) ) +#ИначеЕсли "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + #Параметр(34) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр34.ТипТаблицы + #Если "#Параметр(33)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(33)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(33) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(33)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(33)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(34)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(33) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(34) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(34) + #ИначеЕсли "#Параметр(34)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(33) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(33) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(33) + #КонецЕсли + #Иначе // "##Параметр(34)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(35) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(36)" = "" И "#Параметр(37)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(36)" = "Условие" ИЛИ "#Параметр(36)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(37) ) +#ИначеЕсли "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + #Параметр(37) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр37.ТипТаблицы + #Если "#Параметр(36)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(36)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(36) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(36)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(36)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(37)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(36) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(37) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(37) + #ИначеЕсли "#Параметр(37)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(36) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(36) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(36) + #КонецЕсли + #Иначе // "##Параметр(37)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(38) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(39)" = "" И "#Параметр(40)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(39)" = "Условие" ИЛИ "#Параметр(39)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(40) ) +#ИначеЕсли "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + #Параметр(40) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр40.ТипТаблицы + #Если "#Параметр(39)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(39)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(39) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(39)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(39)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(40)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(39) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(40) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(40) + #ИначеЕсли "#Параметр(40)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(39) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(39) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(39) + #КонецЕсли + #Иначе // "##Параметр(40)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(41) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(42)" = "" И "#Параметр(43)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(42)" = "Условие" ИЛИ "#Параметр(42)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(43) ) +#ИначеЕсли "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + #Параметр(43) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр43.ТипТаблицы + #Если "#Параметр(42)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(42)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(42) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(42)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(42)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(43)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(42) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(43) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(43) + #ИначеЕсли "#Параметр(43)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(42) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(42) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(42) + #КонецЕсли + #Иначе // "##Параметр(43)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(44) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(45)" = "" И "#Параметр(46)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(45)" = "Условие" ИЛИ "#Параметр(45)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(46) ) +#ИначеЕсли "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + #Параметр(46) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр46.ТипТаблицы + #Если "#Параметр(45)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(45)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(45) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(45)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(45)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(46)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(45) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(46) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(46) + #ИначеЕсли "#Параметр(46)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(45) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(45) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(45) + #КонецЕсли + #Иначе // "##Параметр(46)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(47) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(48)" = "" И "#Параметр(49)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(48)" = "Условие" ИЛИ "#Параметр(48)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(49) ) +#ИначеЕсли "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + #Параметр(49) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр49.ТипТаблицы + #Если "#Параметр(48)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(48)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(48) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(48)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(48)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(49)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(48) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(49) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(49) + #ИначеЕсли "#Параметр(49)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(48) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(48) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(48) + #КонецЕсли + #Иначе // "##Параметр(49)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(50) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(51)" = "" И "#Параметр(52)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(51)" = "Условие" ИЛИ "#Параметр(51)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(52) ) +#ИначеЕсли "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + #Параметр(52) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр52.ТипТаблицы + #Если "#Параметр(51)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(51)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(51) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(51)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(51)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(52)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(51) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(52) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(52) + #ИначеЕсли "#Параметр(52)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(51) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(51) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(51) + #КонецЕсли + #Иначе // "##Параметр(52)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(53) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + + ) +) +#КонецЕсли + + + + + ПоНаборамЗначений + // ПоНаборамЗначений ( Таблица, Право, Модификатор, ВладелецНаборов). +// № параметра: 1, 2, 3, 4 . +// Читается так: "ограничение доступа по наборам значений". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ВладелецНаборов - имя поля, содержащего ссылку на объект-владелец +// наборов значений доступа в регистре сведений НаборыЗначенийДоступа. +// Если имя поля не задано, считается, что проверяется сам объект-владелец +// наборов значений доступа, который имеет табличную часть <Таблица>.НаборыЗначенийДоступа. +// Эта табличная часть применяется, когда Право - "Добавление" или "Изменение". +// Табличная часть точно такая, как РегистрСведений.НаборыЗначенийДоступа +// без измерения Объект и без реквизитов, которые используются для повышения производительности. +// Для журналов документов нужно указать "Ссылка". +// +// Пример1: ПоНаборамЗначений("Документ.КорректировкаДенежныхСредств", "Чтение", "", "" ) +// Пример2: ПоНаборамЗначений("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", "" ) +// Пример3: ПоНаборамЗначений("ЖурналДокументов.СкладскиеДокументы", "Чтение", "", "Ссылка" ) +// Пример4: ПоНаборамЗначений("Справочник.ВложенияЭлектронныхПисем", "Чтение", "", "Владелец" ) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ГДЕ // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + ИЗ #Параметр(1).НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Ссылка = Т.Ссылка + #Иначе + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + #Если "#Параметр(4)" = "" #Тогда + НомераНаборов.Объект = Т.Ссылка + #Иначе + НомераНаборов.Объект = Т.#Параметр(4) + #КонецЕсли + #КонецЕсли + И НомераНаборов.#Параметр(2) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + ИЗ #Параметр(1).НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Ссылка = Т.Ссылка + #Иначе + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + #Если "#Параметр(4)" = "" #Тогда + НаборыЗначений.Объект = Т.Ссылка + #Иначе + НаборыЗначений.Объект = Т.#Параметр(4) + #КонецЕсли + #КонецЕсли + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + ( + Выбор + // Проверка заведомого ложного или заведомо истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), + Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) ) + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТипЗначения(ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы) = ТипЗначения(НаборыЗначений.ЗначениеДоступа) + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Иначе + Когда НаборыЗначений.ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #КонецЕсли + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаЧерезПраваПоЗначениямДоступа) + #Иначе + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + #КонецЕсли + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + НаборыЗначений.ВидДоступа В (&ВидыДоступаЕдинственныеДляТипаЗначенияДоступа) + #Иначе + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + #КонецЕсли + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезГруппЗначенияДоступа) + #Иначе + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + #КонецЕсли + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) + ) // НЕ Ложь В + ) +) +#КонецЕсли + + + + diff --git a/SSL/src/Roles/ЧтениеЗаданий/ЧтениеЗаданий.mdo b/SSL/src/Roles/ЧтениеЗаданий/ЧтениеЗаданий.mdo new file mode 100644 index 000000000..46e3a6370 --- /dev/null +++ b/SSL/src/Roles/ЧтениеЗаданий/ЧтениеЗаданий.mdo @@ -0,0 +1,8 @@ + + + ЧтениеЗаданий + + ru + Чтение заданий + + diff --git a/SSL/src/Roles/ЧтениеЗадач/Rights.rights b/SSL/src/Roles/ЧтениеЗадач/Rights.rights new file mode 100644 index 000000000..aad375528 --- /dev/null +++ b/SSL/src/Roles/ЧтениеЗадач/Rights.rights @@ -0,0 +1,16220 @@ + + + false + false + true + + Task.ЗадачаИсполнителя.Attribute.РезультатВыполнения + + View + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.ДополнительныйОбъектАдресации + + View + true + + + + Task.ЗадачаИсполнителя.Command.Выполнено + + View + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.ОсновнойОбъектАдресации + + View + true + + + + SessionParameter.ТекущийПользователь + + Get + true + + + + Task.ЗадачаИсполнителя.Attribute.ДатаНачала + + View + true + + + + Report.СписокИстекающихЗадач + + Use + true + + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.ГруппаИсполнителейЗадач + + View + true + + + + Task.ЗадачаИсполнителя + + Read + true + + #ПоЗначениямИНаборамРасширенный( "Задача.ЗадачаИсполнителя", "Чтение", "", +"", +"", +"Объект","Т.БизнесПроцесс","ИЛИ", +"Пользователи","Т.Автор","ИЛИ", +"Пользователи","Т.Исполнитель","ИЛИ", +"Пользователи","Т.ГруппаИсполнителейЗадач","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","") + + + + + + View + true + + + InputByString + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Executed + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Description + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.RoutePoint + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.BusinessProcess + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Ref + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.DeletionMark + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Date + + View + true + + + + Task.ЗадачаИсполнителя.StandardAttribute.Number + + View + true + + + + InformationRegister.ИсполнителиЗадач + + Read + true + + + + Catalog.РолиИсполнителей + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Predefined + + View + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Ref + + View + true + + + + Catalog.РолиИсполнителей.StandardAttribute.DeletionMark + + View + true + + + + Catalog.РолиИсполнителей.StandardAttribute.IsFolder + + View + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Owner + + View + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Parent + + View + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Description + + View + true + + + + Catalog.РолиИсполнителей.StandardAttribute.Code + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.СрокИсполнения + + View + true + + + + Task.ЗадачаИсполнителя.Command.ВсеЗадачи + + View + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.Исполнитель + + View + true + + + + CommonCommand.ЗадачиПоПредмету + + View + true + + + + Catalog.РолиИсполнителей.Attribute.ТипыДополнительногоОбъектаАдресации + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.Предмет + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач + + Read + true + + + View + true + + + InputByString + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.ValueType + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Description + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Code + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.IsFolder + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Parent + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Predefined + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.DeletionMark + + View + true + + + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.StandardAttribute.Ref + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.Важность + + View + true + + + + Task.ЗадачаИсполнителя.AddressingAttribute.РольИсполнителя + + View + true + + + + Catalog.РолиИсполнителей.Attribute.ИспользуетсяСОбъектамиАдресации + + View + true + + + + Task.ЗадачаИсполнителя.Command.МоиЗадачи + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.ПредметСтрокой + + View + true + + + + Catalog.РолиИсполнителей.Attribute.ТипыОсновногоОбъектаАдресации + + View + true + + + + Task.ЗадачаИсполнителя.Command.Перенаправить + + View + true + + + + Catalog.РолиИсполнителей.Attribute.Комментарий + + View + true + + + + Report.Задачи + + Use + true + + + View + true + + + + Catalog.РолиИсполнителей.Attribute.ИспользуетсяБезОбъектовАдресации + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.Описание + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.ДатаИсполнения + + View + true + + + + Task.ЗадачаИсполнителя.Attribute.Автор + + View + true + + + + ПоЗначениям + // ПоЗначениям ( Таблица, Право, Модификатор, В1,П1, В2,Р2, ..., В(n), П(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, ..., 2+n*2,3+n*2 . +// Читается так: "ограничение доступа по значениям". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле значения, проверяемого по виду доступа, кроме случая В(n) = "Условие" (или ""). +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И <Условие по группе параметров 2> И ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", +// "Организации","Организация", +// "Поставщики","Контрагент", "","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр5 + ПО + ТипЗначения(#Параметр(5)) = ТипЗначения(ТипыСсылокПараметр5.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр9 + ПО + ТипЗначения(#Параметр(9)) = ТипЗначения(ТипыСсылокПараметр9.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр11 + ПО + ТипЗначения(#Параметр(11)) = ТипЗначения(ТипыСсылокПараметр11.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр15 + ПО + ТипЗначения(#Параметр(15)) = ТипЗначения(ТипыСсылокПараметр15.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр17 + ПО + ТипЗначения(#Параметр(17)) = ТипЗначения(ТипыСсылокПараметр17.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр21 + ПО + ТипЗначения(#Параметр(21)) = ТипЗначения(ТипыСсылокПараметр21.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр23 + ПО + ТипЗначения(#Параметр(23)) = ТипЗначения(ТипыСсылокПараметр23.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр27 + ПО + ТипЗначения(#Параметр(27)) = ТипЗначения(ТипыСсылокПараметр27.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр29 + ПО + ТипЗначения(#Параметр(29)) = ТипЗначения(ТипыСсылокПараметр29.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр33 + ПО + ТипЗначения(#Параметр(33)) = ТипЗначения(ТипыСсылокПараметр33.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр35 + ПО + ТипЗначения(#Параметр(35)) = ТипЗначения(ТипыСсылокПараметр35.ТипТаблицы) +#КонецЕсли + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(4)" = "Условие" ИЛИ "#Параметр(4)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(5) ) +#ИначеЕсли "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда + #Параметр(5) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр5.ТипТаблицы + #Если "#Параметр(4)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(4)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(4) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(4)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(4)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(5) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(4) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(5) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(5) + #ИначеЕсли "Т.#Параметр(5)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(4) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(4) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(4) + #КонецЕсли + #Иначе // "Т.##Параметр(5)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(5) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(6)" = "" И "#Параметр(7)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + И #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(7) + #ИначеЕсли "Т.#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "Т.##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(8)" = "" И "#Параметр(9)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(8)" = "Условие" ИЛИ "#Параметр(8)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(9) ) +#ИначеЕсли "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда + И #Параметр(9) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр9.ТипТаблицы + #Если "#Параметр(8)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(8)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(8) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(8)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(8)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(9) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(8) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(9) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(9) + #ИначеЕсли "Т.#Параметр(9)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(8) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(8) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(8) + #КонецЕсли + #Иначе // "Т.##Параметр(9)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(9) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(10)" = "" И "#Параметр(11)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(10)" = "Условие" ИЛИ "#Параметр(10)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(11) ) +#ИначеЕсли "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда + И #Параметр(11) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр11.ТипТаблицы + #Если "#Параметр(10)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(10)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(10) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(10)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(10)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(11) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(10) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(11) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(11) + #ИначеЕсли "Т.#Параметр(11)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(10) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(10) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(10) + #КонецЕсли + #Иначе // "Т.##Параметр(11)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(11) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + И #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(13) + #ИначеЕсли "Т.#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "Т.##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(14)" = "" И "#Параметр(15)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(14)" = "Условие" ИЛИ "#Параметр(14)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(15) ) +#ИначеЕсли "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда + И #Параметр(15) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр15.ТипТаблицы + #Если "#Параметр(14)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(14)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(14) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(15) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(14)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(14)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(15) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(14) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(15) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(15) + #ИначеЕсли "Т.#Параметр(15)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(14) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(14) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(14) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(14) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(14) + #КонецЕсли + #Иначе // "Т.##Параметр(15)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(15) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(16)" = "" И "#Параметр(17)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(16)" = "Условие" ИЛИ "#Параметр(16)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(17) ) +#ИначеЕсли "#Параметр(16)" = "ПравоЧтения" ИЛИ "#Параметр(16)" = "ПравоДобавления" ИЛИ "#Параметр(16)" = "ПравоИзменения" #Тогда + И #Параметр(17) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр17.ТипТаблицы + #Если "#Параметр(16)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(16)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(16) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(17) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(16)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(16)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(17) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(16) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(17) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(17) + #ИначеЕсли "Т.#Параметр(17)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(16) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(16) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(16) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(16) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(16) + #КонецЕсли + #Иначе // "Т.##Параметр(17)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(17) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(16)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + И #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(19) + #ИначеЕсли "Т.#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "Т.##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(20)" = "" И "#Параметр(21)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(20)" = "Условие" ИЛИ "#Параметр(20)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(21) ) +#ИначеЕсли "#Параметр(20)" = "ПравоЧтения" ИЛИ "#Параметр(20)" = "ПравоДобавления" ИЛИ "#Параметр(20)" = "ПравоИзменения" #Тогда + И #Параметр(21) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр21.ТипТаблицы + #Если "#Параметр(20)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(20)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(20) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(21) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(20)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(20)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(21) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(20) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(21) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(21) + #ИначеЕсли "Т.#Параметр(21)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(20) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(20) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(20) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(20) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(20) + #КонецЕсли + #Иначе // "Т.##Параметр(21)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(21) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(20)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(22)" = "" И "#Параметр(23)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(22)" = "Условие" ИЛИ "#Параметр(22)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(23) ) +#ИначеЕсли "#Параметр(22)" = "ПравоЧтения" ИЛИ "#Параметр(22)" = "ПравоДобавления" ИЛИ "#Параметр(22)" = "ПравоИзменения" #Тогда + И #Параметр(23) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр23.ТипТаблицы + #Если "#Параметр(22)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(22)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(22) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(23) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(22)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(22)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(23) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(22) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(23) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(23) + #ИначеЕсли "Т.#Параметр(23)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(22) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(22) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(22) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(22) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(22) + #КонецЕсли + #Иначе // "Т.##Параметр(23)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(23) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(22)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + И #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(25) + #ИначеЕсли "Т.#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "Т.##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(26)" = "" И "#Параметр(27)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(26)" = "Условие" ИЛИ "#Параметр(26)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(27) ) +#ИначеЕсли "#Параметр(26)" = "ПравоЧтения" ИЛИ "#Параметр(26)" = "ПравоДобавления" ИЛИ "#Параметр(26)" = "ПравоИзменения" #Тогда + И #Параметр(27) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр27.ТипТаблицы + #Если "#Параметр(26)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(26)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(26) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(27) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(26)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(26)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(27) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(26) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(27) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(27) + #ИначеЕсли "Т.#Параметр(27)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(26) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(26) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(26) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(26) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(26) + #КонецЕсли + #Иначе // "Т.##Параметр(27)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(27) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(26)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(28)" = "" И "#Параметр(29)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(28)" = "Условие" ИЛИ "#Параметр(28)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(29) ) +#ИначеЕсли "#Параметр(28)" = "ПравоЧтения" ИЛИ "#Параметр(28)" = "ПравоДобавления" ИЛИ "#Параметр(28)" = "ПравоИзменения" #Тогда + И #Параметр(29) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр29.ТипТаблицы + #Если "#Параметр(28)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(28)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(28) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(29) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(28)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(28)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(29) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(28) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(29) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(29) + #ИначеЕсли "Т.#Параметр(29)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(28) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(28) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(28) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(28) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(28) + #КонецЕсли + #Иначе // "Т.##Параметр(29)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(29) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(28)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + И #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(31) + #ИначеЕсли "Т.#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "Т.##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(32)" = "" И "#Параметр(33)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(32)" = "Условие" ИЛИ "#Параметр(32)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(33) ) +#ИначеЕсли "#Параметр(32)" = "ПравоЧтения" ИЛИ "#Параметр(32)" = "ПравоДобавления" ИЛИ "#Параметр(32)" = "ПравоИзменения" #Тогда + И #Параметр(33) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр33.ТипТаблицы + #Если "#Параметр(32)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(32)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(32) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(33) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(32)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(32)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(33) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(32) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(33) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(33) + #ИначеЕсли "Т.#Параметр(33)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(32) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(32) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(32) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(32) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(32) + #КонецЕсли + #Иначе // "Т.##Параметр(33)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(33) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(32)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(34)" = "" И "#Параметр(35)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(34)" = "Условие" ИЛИ "#Параметр(34)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + И ( #Параметр(35) ) +#ИначеЕсли "#Параметр(34)" = "ПравоЧтения" ИЛИ "#Параметр(34)" = "ПравоДобавления" ИЛИ "#Параметр(34)" = "ПравоИзменения" #Тогда + И #Параметр(35) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр35.ТипТаблицы + #Если "#Параметр(34)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(34)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(34) = "" #Тогда + И + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(35) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(34)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(34)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = Т.#Параметр(35) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(34) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(35) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.#Параметр(35) + #ИначеЕсли "Т.#Параметр(35)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(34) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(34) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(34) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(34) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(34) + #КонецЕсли + #Иначе // "Т.##Параметр(35)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(35) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(34)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#КонецЕсли + + ) +) +#КонецЕсли + + + + + ПоЗначениямИНаборамРасширенный + // ПоЗначениямИНаборамРасширенный ( Таблица, Право, Модификатор, ПрисоединяемыеТаблицы, О, В1,П1,О1, В2,П2,О2,..., В(n), П(n), О(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,...,3+n*3,4+n*3,5+n*3 . +// Читается так: "ограничение доступа по наборам и значениям расширенный". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ПрисоединяемыеТаблицы - текст присоедиения дополнительных таблиц на языке запросов, например, +// "ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ОплатаПоставщикам КАК Т1 +// ПО Т.Ссылка = Т1.Ссылка". +// Присоединение позволяет указать поля таблицы ОплатаПоставщикам, как поля основной таблицы +// для проверки их значений, как значений основной таблицы. +// Следует помнить, что при размножении строк в результате соединения, достаточно чтобы +// всего одна строка прошла условия проверки, т.е. результаты проверки строк объединяются по "ИЛИ". +// О - Начальные скобки "(". +// В(n) - ВидДоступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// Когда В(n) = "Объект" (или " "), то +// когда есть запись зависимости прав в регистре сведений ЗависимостиПравДоступа +// тогда используется данные записи - проверка указанного права Т.Р(n) и/или наборов значений доступа +// в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.Р(n) для указанного ограничения права; +// иначе используется стандартное правило: +// когда Право = "Чтение" тогда выполняется проверка права чтения Т.Р(n) и наборов значений доступа +// в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.Р(n) для права чтения; +// когда Право = "Добавление" ИЛИ "Изменение" ИЛИ "Удаление" тогда выполняется проверка права изменения Т.Р(n) +// и наборов значений доступа, считываемых по ссылке Т.Р(n) для права изменения. +// П(n) - Поле с псевдонимом, например "Т.Организация", значение которого проверяется +// по виду доступа, кроме случая В(n) = "Условие" (или ""). +// О(n) - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")". +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Соединение по таблице1> <Соединение по таблице2> ... <Соединение по таблице(m)> +// <Общая часть условий> <Условие по группе параметров 1> И/ИЛИ <Условие по группе параметров 1> И/ИЛИ ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениямИНаборамРасширенный("ЖурналДокументов.СкладскиеДокументы", "Чтение", "", +// "", +// "", +// "Объект","Т.Ссылка","И", +// "Объект","Т.ОсновнойДокумент","", "","","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 1. +#Если "#Параметр(6)" = "Объект" ИЛИ "#Параметр(6)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр7 + ПО + ТипыСсылокПараметр7.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр7.Объект = #Параметр(7) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр7 + ПО + ЗависимостиПравПараметр7.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр7.ТипВедущейТаблицы = ТипыСсылокПараметр7.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр10 + ПО + ТипЗначения(#Параметр(10)) = ТипЗначения(ТипыСсылокПараметр10.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 2. +#Если "#Параметр(9)" = "Объект" ИЛИ "#Параметр(9)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр10 + ПО + ТипыСсылокПараметр10.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр10.Объект = #Параметр(10) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр10 + ПО + ЗависимостиПравПараметр10.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр10.ТипВедущейТаблицы = ТипыСсылокПараметр10.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 3. +#Если "#Параметр(12)" = "Объект" ИЛИ "#Параметр(12)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр13 + ПО + ТипыСсылокПараметр13.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр13.Объект = #Параметр(13) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр13 + ПО + ЗависимостиПравПараметр13.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр13.ТипВедущейТаблицы = ТипыСсылокПараметр13.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр16 + ПО + ТипЗначения(#Параметр(16)) = ТипЗначения(ТипыСсылокПараметр16.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 4. +#Если "#Параметр(15)" = "Объект" ИЛИ "#Параметр(15)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр16 + ПО + ТипыСсылокПараметр16.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр16.Объект = #Параметр(16) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр16 + ПО + ЗависимостиПравПараметр16.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр16.ТипВедущейТаблицы = ТипыСсылокПараметр16.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 5. +#Если "#Параметр(18)" = "Объект" ИЛИ "#Параметр(18)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр19 + ПО + ТипыСсылокПараметр19.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр19.Объект = #Параметр(19) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр19 + ПО + ЗависимостиПравПараметр19.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр19.ТипВедущейТаблицы = ТипыСсылокПараметр19.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр22 + ПО + ТипЗначения(#Параметр(22)) = ТипЗначения(ТипыСсылокПараметр22.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 6. +#Если "#Параметр(21)" = "Объект" ИЛИ "#Параметр(21)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр22 + ПО + ТипыСсылокПараметр22.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр22.Объект = #Параметр(22) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр22 + ПО + ЗависимостиПравПараметр22.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр22.ТипВедущейТаблицы = ТипыСсылокПараметр22.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 7. +#Если "#Параметр(24)" = "Объект" ИЛИ "#Параметр(24)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр25 + ПО + ТипыСсылокПараметр25.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр25.Объект = #Параметр(25) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр25 + ПО + ЗависимостиПравПараметр25.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр25.ТипВедущейТаблицы = ТипыСсылокПараметр25.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр28 + ПО + ТипЗначения(#Параметр(28)) = ТипЗначения(ТипыСсылокПараметр28.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 8. +#Если "#Параметр(27)" = "Объект" ИЛИ "#Параметр(27)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр28 + ПО + ТипыСсылокПараметр28.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр28.Объект = #Параметр(28) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр28 + ПО + ЗависимостиПравПараметр28.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр28.ТипВедущейТаблицы = ТипыСсылокПараметр28.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 9. +#Если "#Параметр(30)" = "Объект" ИЛИ "#Параметр(30)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр31 + ПО + ТипыСсылокПараметр31.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр31.Объект = #Параметр(31) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр31 + ПО + ЗависимостиПравПараметр31.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр31.ТипВедущейТаблицы = ТипыСсылокПараметр31.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр34 + ПО + ТипЗначения(#Параметр(34)) = ТипЗначения(ТипыСсылокПараметр34.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 10. +#Если "#Параметр(33)" = "Объект" ИЛИ "#Параметр(33)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр34 + ПО + ТипыСсылокПараметр34.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр34.Объект = #Параметр(34) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр34 + ПО + ЗависимостиПравПараметр34.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр34.ТипВедущейТаблицы = ТипыСсылокПараметр34.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр37 + ПО + ТипЗначения(#Параметр(37)) = ТипЗначения(ТипыСсылокПараметр37.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 11. +#Если "#Параметр(36)" = "Объект" ИЛИ "#Параметр(36)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр37 + ПО + ТипыСсылокПараметр37.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр37.Объект = #Параметр(37) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр37 + ПО + ЗависимостиПравПараметр37.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр37.ТипВедущейТаблицы = ТипыСсылокПараметр37.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр40 + ПО + ТипЗначения(#Параметр(40)) = ТипЗначения(ТипыСсылокПараметр40.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 12. +#Если "#Параметр(39)" = "Объект" ИЛИ "#Параметр(39)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр40 + ПО + ТипыСсылокПараметр40.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр40.Объект = #Параметр(40) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр40 + ПО + ЗависимостиПравПараметр40.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр40.ТипВедущейТаблицы = ТипыСсылокПараметр40.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр43 + ПО + ТипЗначения(#Параметр(43)) = ТипЗначения(ТипыСсылокПараметр43.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 13. +#Если "#Параметр(42)" = "Объект" ИЛИ "#Параметр(42)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр43 + ПО + ТипыСсылокПараметр43.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр43.Объект = #Параметр(43) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр43 + ПО + ЗависимостиПравПараметр43.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр43.ТипВедущейТаблицы = ТипыСсылокПараметр43.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр46 + ПО + ТипЗначения(#Параметр(46)) = ТипЗначения(ТипыСсылокПараметр46.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 14. +#Если "#Параметр(45)" = "Объект" ИЛИ "#Параметр(45)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр46 + ПО + ТипыСсылокПараметр46.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр46.Объект = #Параметр(46) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр46 + ПО + ЗависимостиПравПараметр46.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр46.ТипВедущейТаблицы = ТипыСсылокПараметр46.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр49 + ПО + ТипЗначения(#Параметр(49)) = ТипЗначения(ТипыСсылокПараметр49.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 15. +#Если "#Параметр(48)" = "Объект" ИЛИ "#Параметр(48)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр49 + ПО + ТипыСсылокПараметр49.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр49.Объект = #Параметр(49) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр49 + ПО + ЗависимостиПравПараметр49.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр49.ТипВедущейТаблицы = ТипыСсылокПараметр49.ТипОбъекта +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр52 + ПО + ТипЗначения(#Параметр(52)) = ТипЗначения(ТипыСсылокПараметр52.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаОбъекта и зависимости прав доступа текущей таблицы и объекта группы параметров 16. +#Если "#Параметр(51)" = "Объект" ИЛИ "#Параметр(51)" = " " #Тогда + // ТипОбъекта + Левое Соединение РегистрСведений.НаборыЗначенийДоступа КАК ТипыСсылокПараметр52 + ПО + ТипыСсылокПараметр52.ТипОбъекта <> Неопределено + И ТипыСсылокПараметр52.Объект = #Параметр(52) + // Зависимости прав доступа текущей таблицы и объекта + Левое Соединение РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравПараметр52 + ПО + ЗависимостиПравПараметр52.ПодчиненнаяТаблица = "#Параметр(1)" + И ЗависимостиПравПараметр52.ТипВедущейТаблицы = ТипыСсылокПараметр52.ТипОбъекта +#КонецЕсли + +// Присоединяемые таблицы к проверяемой строке текущей таблицы "Т". +#Параметр(4) + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + + #Параметр(5) // [([(][(]...] 0-n открывающихся скобок. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(6)" = "Объект" ИЛИ "#Параметр(6)" = " " #Тогда + #Параметр(7) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр7.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр7.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(7) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр7.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(7) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(7) + #ИначеЕсли "#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(8) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(9)" = "" И "#Параметр(10)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(9)" = "Условие" ИЛИ "#Параметр(9)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(10) ) +#ИначеЕсли "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + #Параметр(10) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр10.ТипТаблицы + #Если "#Параметр(9)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(9)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(9)" = "Объект" ИЛИ "#Параметр(9)" = " " #Тогда + #Параметр(10) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр10.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр10.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(10) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр10.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(10) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(9) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(9)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(9)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(10)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(9) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(10) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(10) + #ИначеЕсли "#Параметр(10)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(9) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(9) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(9) + #КонецЕсли + #Иначе // "##Параметр(10)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(11) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(12)" = "Объект" ИЛИ "#Параметр(12)" = " " #Тогда + #Параметр(13) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр13.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр13.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(13) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр13.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(13) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(13) + #ИначеЕсли "#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(14) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(15)" = "" И "#Параметр(16)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(15)" = "Условие" ИЛИ "#Параметр(15)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(16) ) +#ИначеЕсли "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + #Параметр(16) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр16.ТипТаблицы + #Если "#Параметр(15)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(15)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(15)" = "Объект" ИЛИ "#Параметр(15)" = " " #Тогда + #Параметр(16) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр16.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр16.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(16) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр16.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(16) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(15) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(15)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(15)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(16)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(15) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(16) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(16) + #ИначеЕсли "#Параметр(16)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(15) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(15) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(15) + #КонецЕсли + #Иначе // "##Параметр(16)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(17) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(18)" = "Объект" ИЛИ "#Параметр(18)" = " " #Тогда + #Параметр(19) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр19.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр19.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(19) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр19.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(19) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(19) + #ИначеЕсли "#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(20) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(21)" = "" И "#Параметр(22)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(21)" = "Условие" ИЛИ "#Параметр(21)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(22) ) +#ИначеЕсли "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + #Параметр(22) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр22.ТипТаблицы + #Если "#Параметр(21)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(21)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(21)" = "Объект" ИЛИ "#Параметр(21)" = " " #Тогда + #Параметр(22) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр22.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр22.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(22) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр22.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(22) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(21) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(21)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(21)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(22)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(21) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(22) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(22) + #ИначеЕсли "#Параметр(22)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(21) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(21) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(21) + #КонецЕсли + #Иначе // "##Параметр(22)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(23) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(24)" = "Объект" ИЛИ "#Параметр(24)" = " " #Тогда + #Параметр(25) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр25.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр25.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(25) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр25.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(25) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(25) + #ИначеЕсли "#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(26) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(27)" = "" И "#Параметр(28)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(27)" = "Условие" ИЛИ "#Параметр(27)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(28) ) +#ИначеЕсли "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + #Параметр(28) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр28.ТипТаблицы + #Если "#Параметр(27)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(27)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(27)" = "Объект" ИЛИ "#Параметр(27)" = " " #Тогда + #Параметр(28) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр28.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр28.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(28) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр28.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(28) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(27) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(27)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(27)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(28)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(27) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(28) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(28) + #ИначеЕсли "#Параметр(28)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(27) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(27) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(27) + #КонецЕсли + #Иначе // "##Параметр(28)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(29) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(30)" = "Объект" ИЛИ "#Параметр(30)" = " " #Тогда + #Параметр(31) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр31.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр31.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(31) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр31.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(31) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(31) + #ИначеЕсли "#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(32) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(33)" = "" И "#Параметр(34)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(33)" = "Условие" ИЛИ "#Параметр(33)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(34) ) +#ИначеЕсли "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + #Параметр(34) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр34.ТипТаблицы + #Если "#Параметр(33)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(33)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(33)" = "Объект" ИЛИ "#Параметр(33)" = " " #Тогда + #Параметр(34) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр34.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр34.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(34) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр34.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(34) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(33) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(33)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(33)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(34)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(33) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(34) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(34) + #ИначеЕсли "#Параметр(34)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(33) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(33) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(33) + #КонецЕсли + #Иначе // "##Параметр(34)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(35) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(36)" = "" И "#Параметр(37)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(36)" = "Условие" ИЛИ "#Параметр(36)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(37) ) +#ИначеЕсли "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + #Параметр(37) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр37.ТипТаблицы + #Если "#Параметр(36)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(36)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(36)" = "Объект" ИЛИ "#Параметр(36)" = " " #Тогда + #Параметр(37) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр37.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр37.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(37) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр37.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(37) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(36) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(36)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(36)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(37)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(36) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(37) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(37) + #ИначеЕсли "#Параметр(37)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(36) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(36) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(36) + #КонецЕсли + #Иначе // "##Параметр(37)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(38) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(39)" = "" И "#Параметр(40)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(39)" = "Условие" ИЛИ "#Параметр(39)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(40) ) +#ИначеЕсли "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + #Параметр(40) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр40.ТипТаблицы + #Если "#Параметр(39)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(39)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(39)" = "Объект" ИЛИ "#Параметр(39)" = " " #Тогда + #Параметр(40) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр40.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр40.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(40) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр40.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(40) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(39) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(39)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(39)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(40)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(39) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(40) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(40) + #ИначеЕсли "#Параметр(40)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(39) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(39) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(39) + #КонецЕсли + #Иначе // "##Параметр(40)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(41) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(42)" = "" И "#Параметр(43)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(42)" = "Условие" ИЛИ "#Параметр(42)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(43) ) +#ИначеЕсли "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + #Параметр(43) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр43.ТипТаблицы + #Если "#Параметр(42)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(42)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(42)" = "Объект" ИЛИ "#Параметр(42)" = " " #Тогда + #Параметр(43) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр43.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр43.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(43) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр43.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(43) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(42) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(42)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(42)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(43)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(42) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(43) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(43) + #ИначеЕсли "#Параметр(43)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(42) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(42) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(42) + #КонецЕсли + #Иначе // "##Параметр(43)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(44) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(45)" = "" И "#Параметр(46)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(45)" = "Условие" ИЛИ "#Параметр(45)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(46) ) +#ИначеЕсли "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + #Параметр(46) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр46.ТипТаблицы + #Если "#Параметр(45)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(45)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(45)" = "Объект" ИЛИ "#Параметр(45)" = " " #Тогда + #Параметр(46) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр46.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр46.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(46) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр46.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(46) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(45) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(45)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(45)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(46)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(45) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(46) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(46) + #ИначеЕсли "#Параметр(46)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(45) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(45) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(45) + #КонецЕсли + #Иначе // "##Параметр(46)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(47) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(48)" = "" И "#Параметр(49)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(48)" = "Условие" ИЛИ "#Параметр(48)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(49) ) +#ИначеЕсли "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + #Параметр(49) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр49.ТипТаблицы + #Если "#Параметр(48)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(48)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(48)" = "Объект" ИЛИ "#Параметр(48)" = " " #Тогда + #Параметр(49) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр49.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр49.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(49) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр49.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(49) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(48) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(48)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(48)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(49)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(48) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(49) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(49) + #ИначеЕсли "#Параметр(49)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(48) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(48) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(48) + #КонецЕсли + #Иначе // "##Параметр(49)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(50) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(51)" = "" И "#Параметр(52)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(51)" = "Условие" ИЛИ "#Параметр(51)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(52) ) +#ИначеЕсли "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + #Параметр(52) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр52.ТипТаблицы + #Если "#Параметр(51)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(51)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли "#Параметр(51)" = "Объект" ИЛИ "#Параметр(51)" = " " #Тогда + #Параметр(52) <> Неопределено + // Проверка права + И НЕ + ( + НЕ ЕстьNULL(ЗависимостиПравПараметр52.ОтключитьПроверкуПравВедущейТаблицы, Ложь) + И НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта + ГДЕ + ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы = ТипыСсылокПараметр52.ТипОбъекта + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваОбъекта.ВидДоступаПравоИзменения ) + ) + ) + // Проверка ограничения права + И Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Объект = #Параметр(52) + #Если "#Параметр(2)" = "Чтение" #Тогда + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения)) ) В + #Иначе + И (ЕстьNULL(ЗависимостиПравПараметр52.ПриПроверкеПрава#Параметр(2), Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) ) В + #КонецЕсли + ( НомераНаборов.ВидДоступаПравоЧтения, + НомераНаборов.ВидДоступаПравоДобавления, + НомераНаборов.ВидДоступаПравоИзменения ) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Объект = #Параметр(52) + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + Выбор + // Проверка заведомого ложного или истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + Когда ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) // НЕ Ложь В + ) + +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(51) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(51)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(51)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(52)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(51) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(52) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(52) + #ИначеЕсли "#Параметр(52)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(51) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(51) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(51) + #КонецЕсли + #Иначе // "##Параметр(52)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли + +#Иначе + Истина +#КонецЕсли + + #Параметр(53) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + + ) +) +#КонецЕсли + + + + + ПоЗначениямРасширенный + // ПоЗначениямРасширенный ( Таблица, Право, Модификатор, ПрисоединяемыеТаблицы, О, В1,П1,О1, В2,П2,О2,..., В(n), П(n), О(n)). +// № параметра: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,...,3+n*3,4+n*3,5+n*3 . +// Читается так: "ограничение доступа по значениям расширенный". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ПрисоединяемыеТаблицы - текст присоедиения дополнительных таблиц на языке запросов, например, +// "ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ОплатаПоставщикам КАК Т1 +// ПО Т.Ссылка = Т1.Ссылка". +// Присоединение позволяет указать поля таблицы ОплатаПоставщикам, как поля основной таблицы +// для проверки их значений, как значений основной таблицы. +// Следует помнить, что при размножении строк в результате соединения, достаточно чтобы +// всего одна строка прошла условия проверки, т.е. результаты проверки строк объединяются по "ИЛИ". +// О - Начальные скобки "(". +// В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). +// Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например +// "Т.Автор = &ТекущийПользователь", +// "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы. +// Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа, +// то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь. +// Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения", +// выполняется проверка наличия права на таблицу значения Т.Р(n). +// П(n) - Поле с псевдонимом, например "Т.Организация", значение которого проверяется +// по виду доступа, кроме случая В(n) = "Условие" (или ""). +// О(n) - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")". +// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но +// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. +// Шаблон имеет структуру: +// <Общая часть условий> <Условие по группе параметров 1> И/ИЛИ <Условие по группе параметров 2> И/ИЛИ ... <Условие по группе параметров(n)> +// Пример: +// ПоЗначениямРасширенный("Документ.ПеремещениеТоваров", "Чтение", "", +// "", +// "", +// "Организации","Т.Организация","И(", +// "Склады","Т.СкладОтправитель","ИЛИ", +// "Склады","Т.СкладПолучатель",")", "","","", ...) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +//// Подготовка ТипаСсылки значения поля группы параметров 1. +#Если "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр7 + ПО + ТипЗначения(#Параметр(7)) = ТипЗначения(ТипыСсылокПараметр7.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 2. +#Если "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр10 + ПО + ТипЗначения(#Параметр(10)) = ТипЗначения(ТипыСсылокПараметр10.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 3. +#Если "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр13 + ПО + ТипЗначения(#Параметр(13)) = ТипЗначения(ТипыСсылокПараметр13.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 4. +#Если "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр16 + ПО + ТипЗначения(#Параметр(16)) = ТипЗначения(ТипыСсылокПараметр16.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 5. +#Если "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр19 + ПО + ТипЗначения(#Параметр(19)) = ТипЗначения(ТипыСсылокПараметр19.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 6. +#Если "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр22 + ПО + ТипЗначения(#Параметр(22)) = ТипЗначения(ТипыСсылокПараметр22.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 7. +#Если "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр25 + ПО + ТипЗначения(#Параметр(25)) = ТипЗначения(ТипыСсылокПараметр25.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 8. +#Если "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр28 + ПО + ТипЗначения(#Параметр(28)) = ТипЗначения(ТипыСсылокПараметр28.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 9. +#Если "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр31 + ПО + ТипЗначения(#Параметр(31)) = ТипЗначения(ТипыСсылокПараметр31.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 10. +#Если "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр34 + ПО + ТипЗначения(#Параметр(34)) = ТипЗначения(ТипыСсылокПараметр34.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 11. +#Если "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр37 + ПО + ТипЗначения(#Параметр(37)) = ТипЗначения(ТипыСсылокПараметр37.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 12. +#Если "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр40 + ПО + ТипЗначения(#Параметр(40)) = ТипЗначения(ТипыСсылокПараметр40.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 13. +#Если "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр43 + ПО + ТипЗначения(#Параметр(43)) = ТипЗначения(ТипыСсылокПараметр43.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 14. +#Если "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр46 + ПО + ТипЗначения(#Параметр(46)) = ТипЗначения(ТипыСсылокПараметр46.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 15. +#Если "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр49 + ПО + ТипЗначения(#Параметр(49)) = ТипЗначения(ТипыСсылокПараметр49.ТипТаблицы) +#КонецЕсли + +//// Подготовка ТипаСсылки значения поля группы параметров 16. +#Если "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + Левое Соединение Справочник.ПрофилиГруппДоступа.ТипыСсылок КАК ТипыСсылокПараметр52 + ПО + ТипЗначения(#Параметр(52)) = ТипЗначения(ТипыСсылокПараметр52.ТипТаблицы) +#КонецЕсли + +// Присоединяемые таблицы к проверяемой строке текущей таблицы "Т". +#Параметр(4) + +ГДЕ + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа. + + #Параметр(5) // [([(][(]...] 0-n открывающихся скобок. + +//// Проверка значения поля группы параметров 1. +#Если "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(7) ) +#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда + #Параметр(7) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр7.ТипТаблицы + #Если "#Параметр(6)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(7) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(6)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(7) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(7)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(6) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(7) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(7) + #ИначеЕсли "#Параметр(7)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6) + #КонецЕсли + #Иначе // "##Параметр(7)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(7) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(8) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 2. +#Если "#Параметр(9)" = "" И "#Параметр(10)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(9)" = "Условие" ИЛИ "#Параметр(9)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(10) ) +#ИначеЕсли "#Параметр(9)" = "ПравоЧтения" ИЛИ "#Параметр(9)" = "ПравоДобавления" ИЛИ "#Параметр(9)" = "ПравоИзменения" #Тогда + #Параметр(10) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр10.ТипТаблицы + #Если "#Параметр(9)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(9)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(9) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(10) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(9)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(9)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(10) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(10)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(9) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(10) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(10) + #ИначеЕсли "#Параметр(10)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(9) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(9) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(9) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(9) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(9) + #КонецЕсли + #Иначе // "##Параметр(10)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(10) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(9)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(11) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 3. +#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(13) ) +#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда + #Параметр(13) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр13.ТипТаблицы + #Если "#Параметр(12)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(13) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(12)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(13) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(13)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(12) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(13) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(13) + #ИначеЕсли "#Параметр(13)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12) + #КонецЕсли + #Иначе // "##Параметр(13)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(13) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(14) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 4. +#Если "#Параметр(15)" = "" И "#Параметр(16)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(15)" = "Условие" ИЛИ "#Параметр(15)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(16) ) +#ИначеЕсли "#Параметр(15)" = "ПравоЧтения" ИЛИ "#Параметр(15)" = "ПравоДобавления" ИЛИ "#Параметр(15)" = "ПравоИзменения" #Тогда + #Параметр(16) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр16.ТипТаблицы + #Если "#Параметр(15)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(15)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(15) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(16) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(15)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(15)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(16) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(16)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(15) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(16) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(16) + #ИначеЕсли "#Параметр(16)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(15) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(15) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(15) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(15) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(15) + #КонецЕсли + #Иначе // "##Параметр(16)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(16) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(15)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(17) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 5. +#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(18)" = "Условие" ИЛИ "#Параметр(18)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(19) ) +#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" ИЛИ "#Параметр(18)" = "ПравоДобавления" ИЛИ "#Параметр(18)" = "ПравоИзменения" #Тогда + #Параметр(19) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр19.ТипТаблицы + #Если "#Параметр(18)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(18)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(18) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(19) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(18)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(18)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(19) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(19)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(18) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(19) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(19) + #ИначеЕсли "#Параметр(19)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(18) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(18) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(18) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(18) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(18) + #КонецЕсли + #Иначе // "##Параметр(19)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(19) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(18)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(20) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 6. +#Если "#Параметр(21)" = "" И "#Параметр(22)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(21)" = "Условие" ИЛИ "#Параметр(21)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(22) ) +#ИначеЕсли "#Параметр(21)" = "ПравоЧтения" ИЛИ "#Параметр(21)" = "ПравоДобавления" ИЛИ "#Параметр(21)" = "ПравоИзменения" #Тогда + #Параметр(22) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр22.ТипТаблицы + #Если "#Параметр(21)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(21)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(21) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(22) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(21)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(21)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(22) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(22)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(21) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(22) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(22) + #ИначеЕсли "#Параметр(22)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(21) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(21) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(21) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(21) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(21) + #КонецЕсли + #Иначе // "##Параметр(22)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(22) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(21)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(23) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 7. +#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(24)" = "Условие" ИЛИ "#Параметр(24)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(25) ) +#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" ИЛИ "#Параметр(24)" = "ПравоДобавления" ИЛИ "#Параметр(24)" = "ПравоИзменения" #Тогда + #Параметр(25) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр25.ТипТаблицы + #Если "#Параметр(24)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(24)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(24) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(25) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(24)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(24)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(25) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(25)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(24) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(25) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(25) + #ИначеЕсли "#Параметр(25)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(24) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(24) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(24) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(24) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(24) + #КонецЕсли + #Иначе // "##Параметр(25)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(25) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(24)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(26) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 8. +#Если "#Параметр(27)" = "" И "#Параметр(28)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(27)" = "Условие" ИЛИ "#Параметр(27)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(28) ) +#ИначеЕсли "#Параметр(27)" = "ПравоЧтения" ИЛИ "#Параметр(27)" = "ПравоДобавления" ИЛИ "#Параметр(27)" = "ПравоИзменения" #Тогда + #Параметр(28) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр28.ТипТаблицы + #Если "#Параметр(27)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(27)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(27) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(28) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(27)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(27)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(28) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(28)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(27) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(28) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(28) + #ИначеЕсли "#Параметр(28)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(27) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(27) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(27) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(27) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(27) + #КонецЕсли + #Иначе // "##Параметр(28)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(28) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(27)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(29) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 9. +#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(30)" = "Условие" ИЛИ "#Параметр(30)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(31) ) +#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" ИЛИ "#Параметр(30)" = "ПравоДобавления" ИЛИ "#Параметр(30)" = "ПравоИзменения" #Тогда + #Параметр(31) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр31.ТипТаблицы + #Если "#Параметр(30)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(30)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(30) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(31) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(30)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(30)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(31) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(31)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(30) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(31) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(31) + #ИначеЕсли "#Параметр(31)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(30) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(30) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(30) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(30) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(30) + #КонецЕсли + #Иначе // "##Параметр(31)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(31) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(30)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(32) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 10. +#Если "#Параметр(33)" = "" И "#Параметр(34)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(33)" = "Условие" ИЛИ "#Параметр(33)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(34) ) +#ИначеЕсли "#Параметр(33)" = "ПравоЧтения" ИЛИ "#Параметр(33)" = "ПравоДобавления" ИЛИ "#Параметр(33)" = "ПравоИзменения" #Тогда + #Параметр(34) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр34.ТипТаблицы + #Если "#Параметр(33)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(33)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(33) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(34) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(33)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(33)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(34) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(34)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(33) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(34) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(34) + #ИначеЕсли "#Параметр(34)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(33) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(33) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(33) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(33) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(33) + #КонецЕсли + #Иначе // "##Параметр(34)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(34) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(33)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(35) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 11. +#Если "#Параметр(36)" = "" И "#Параметр(37)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(36)" = "Условие" ИЛИ "#Параметр(36)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(37) ) +#ИначеЕсли "#Параметр(36)" = "ПравоЧтения" ИЛИ "#Параметр(36)" = "ПравоДобавления" ИЛИ "#Параметр(36)" = "ПравоИзменения" #Тогда + #Параметр(37) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр37.ТипТаблицы + #Если "#Параметр(36)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(36)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(36) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(37) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(36)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(36)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(37) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(37)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(36) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(37) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(37) + #ИначеЕсли "#Параметр(37)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(36) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(36) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(36) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(36) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(36) + #КонецЕсли + #Иначе // "##Параметр(37)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(37) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(36)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(38) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 12. +#Если "#Параметр(39)" = "" И "#Параметр(40)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(39)" = "Условие" ИЛИ "#Параметр(39)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(40) ) +#ИначеЕсли "#Параметр(39)" = "ПравоЧтения" ИЛИ "#Параметр(39)" = "ПравоДобавления" ИЛИ "#Параметр(39)" = "ПравоИзменения" #Тогда + #Параметр(40) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр40.ТипТаблицы + #Если "#Параметр(39)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(39)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(39) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(40) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(39)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(39)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(40) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(40)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(39) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(40) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(40) + #ИначеЕсли "#Параметр(40)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(39) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(39) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(39) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(39) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(39) + #КонецЕсли + #Иначе // "##Параметр(40)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(40) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(39)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(41) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 13. +#Если "#Параметр(42)" = "" И "#Параметр(43)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(42)" = "Условие" ИЛИ "#Параметр(42)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(43) ) +#ИначеЕсли "#Параметр(42)" = "ПравоЧтения" ИЛИ "#Параметр(42)" = "ПравоДобавления" ИЛИ "#Параметр(42)" = "ПравоИзменения" #Тогда + #Параметр(43) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр43.ТипТаблицы + #Если "#Параметр(42)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(42)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(42) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(43) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(42)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(42)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(43) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(43)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(42) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(43) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(43) + #ИначеЕсли "#Параметр(43)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(42) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(42) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(42) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(42) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(42) + #КонецЕсли + #Иначе // "##Параметр(43)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(43) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(42)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(44) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 14. +#Если "#Параметр(45)" = "" И "#Параметр(46)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(45)" = "Условие" ИЛИ "#Параметр(45)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(46) ) +#ИначеЕсли "#Параметр(45)" = "ПравоЧтения" ИЛИ "#Параметр(45)" = "ПравоДобавления" ИЛИ "#Параметр(45)" = "ПравоИзменения" #Тогда + #Параметр(46) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр46.ТипТаблицы + #Если "#Параметр(45)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(45)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(45) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(46) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(45)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(45)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(46) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(46)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(45) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(46) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(46) + #ИначеЕсли "#Параметр(46)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(45) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(45) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(45) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(45) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(45) + #КонецЕсли + #Иначе // "##Параметр(46)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(46) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(45)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(47) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 15. +#Если "#Параметр(48)" = "" И "#Параметр(49)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(48)" = "Условие" ИЛИ "#Параметр(48)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(49) ) +#ИначеЕсли "#Параметр(48)" = "ПравоЧтения" ИЛИ "#Параметр(48)" = "ПравоДобавления" ИЛИ "#Параметр(48)" = "ПравоИзменения" #Тогда + #Параметр(49) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр49.ТипТаблицы + #Если "#Параметр(48)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(48)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(48) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(49) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(48)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(48)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(49) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(49)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(48) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(49) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(49) + #ИначеЕсли "#Параметр(49)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(48) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(48) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(48) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(48) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(48) + #КонецЕсли + #Иначе // "##Параметр(49)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(49) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(48)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(50) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + +//// Проверка значения поля группы параметров 16. +#Если "#Параметр(51)" = "" И "#Параметр(52)" = "" #Тогда + // Группа параметров не используется. +#ИначеЕсли "#Параметр(51)" = "Условие" ИЛИ "#Параметр(51)" = "" #Тогда + // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. + ( #Параметр(52) ) +#ИначеЕсли "#Параметр(51)" = "ПравоЧтения" ИЛИ "#Параметр(51)" = "ПравоДобавления" ИЛИ "#Параметр(51)" = "ПравоИзменения" #Тогда + #Параметр(52) <> Неопределено + И Истина В + ( // Проверка права пользователя на таблицу Значения, установленного в поле. + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава + ГДЕ + ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы = ТипыСсылокПараметр52.ТипТаблицы + #Если "#Параметр(51)" = "ПравоДобавления" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Добавление + #ИначеЕсли "#Параметр(51)" = "ПравоИзменения" #Тогда + И ТаблицыГруппДоступаПроверкаПрава.Изменение + #КонецЕсли + ) +#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(51) = "" #Тогда + + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЧерезПраваПоЗначениямДоступа" #Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ИерархияЗначений.ЗначениеДоступа = #Параметр(52) + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #Иначе + ( + #Если "#Параметр(51)" = "Пользователи" #Тогда + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + #ИначеЕсли "#Параметр(51)" = "ВнешниеПользователи" #Тогда + #Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда + Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = #Параметр(52) + ) + ИЛИ + #КонецЕсли + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда + ( + #Если "#Параметр(52)" = "Т.Ссылка" #Тогда + Т.ВидДоступа#Параметр(51) + #Иначе + НЕ Истина В + ( + Выбрать Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения + ГДЕ + ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ВидыЗначения.ЗначениеДоступа = #Параметр(52) + И ВидыЗначения.ТолькоВидДоступа = Истина + ) + #КонецЕсли + ) И + #КонецЕсли + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений. + ( + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, БезГрупп" ИЛИ + &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,БезГрупп" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = #Параметр(52) + #ИначеЕсли "#Параметр(52)" = "Т.Ссылка" #Тогда + #Если &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид, ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(51) + #ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(51) = "ЕдинственныйВид ,МножествоГрупп" #Тогда + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #Иначе // &ОграничиватьДоступПоВиду##Параметр(51) = "ОдинИзМногихВидов,МножествоГрупп" + Выбрать Первые 1 Истина + ИЗ #Параметр(1).ГруппыДоступа#Параметр(51) КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.Ссылка = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(51) + #КонецЕсли + #Иначе // "##Параметр(52)" <> "Т.Ссылка" + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И ГруппыЗначений.ЗначениеДоступа = #Параметр(52) + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + #КонецЕсли + ) + Тогда Истина + Иначе Ложь + Конец + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(51)) + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + ) + #КонецЕсли +#Иначе + Истина +#КонецЕсли + + #Параметр(53) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. + + ) +) +#КонецЕсли + + + + + ПоНаборамЗначений + // ПоНаборамЗначений ( Таблица, Право, Модификатор, ВладелецНаборов). +// № параметра: 1, 2, 3, 4 . +// Читается так: "ограничение доступа по наборам значений". +// Параметры: +// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". +// Право - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление". +// Модификатор - изменяет шаблон. +// 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает +// безусловно выбирать группы иерархического справочника. +// Других модификаторов в этой версии шаблона не предусмотрено. +// ВладелецНаборов - имя поля, содержащего ссылку на объект-владелец +// наборов значений доступа в регистре сведений НаборыЗначенийДоступа. +// Если имя поля не задано, считается, что проверяется сам объект-владелец +// наборов значений доступа, который имеет табличную часть <Таблица>.НаборыЗначенийДоступа. +// Эта табличная часть применяется, когда Право - "Добавление" или "Изменение". +// Табличная часть точно такая, как РегистрСведений.НаборыЗначенийДоступа +// без измерения Объект и без реквизитов, которые используются для повышения производительности. +// Для журналов документов нужно указать "Ссылка". +// +// Пример1: ПоНаборамЗначений("Документ.КорректировкаДенежныхСредств", "Чтение", "", "" ) +// Пример2: ПоНаборамЗначений("Документ.ПоступлениеТоваровИУслуг", "Чтение", "", "" ) +// Пример3: ПоНаборамЗначений("ЖурналДокументов.СкладскиеДокументы", "Чтение", "", "Ссылка" ) +// Пример4: ПоНаборамЗначений("Справочник.ВложенияЭлектронныхПисем", "Чтение", "", "Владелец" ) + +// Проверка правильности параметра Модификатор. +#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверныйМодификатор: #Параметр(3) +#КонецЕсли +// Проверка правильности параметра Право. +#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ + "#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда + // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. + НеверноеПраво: #Параметр(2) +#КонецЕсли + +// Общая проверка использования ограничений доступа на уровне записей. +#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда + +Т ГДЕ // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). + +// Безусловная выборка групп в иерархическом объекте метаданных (если нужно). +#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда + Т.ЭтоГруппа ИЛИ +#КонецЕсли + +Истина В +( // Проверка права пользователя на текущую таблицу в целом. + // Права на таблицы формируются по составу ролей профиля группы доступа. + Выбрать Первые 1 Истина + ИЗ + ( + Выбрать РАЗЛИЧНЫЕ + ТаблицыГруппДоступа.ГруппаДоступа + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + ТаблицыГруппДоступа.Таблица = "#Параметр(1)" + #Если НЕ "#Параметр(2)" = "Чтение" #Тогда + И ТаблицыГруппДоступа.#Параметр(2) + #КонецЕсли + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь + ) КАК ТаблицыГруппДоступа + ГДЕ + Истина В + ( + Выбрать Первые 1 Истина // Выбор первого набора по которому доступ разрешен. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + ИЗ #Параметр(1).НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + НомераНаборов.Ссылка = Т.Ссылка + #Иначе + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов + ГДЕ + #Если "#Параметр(4)" = "" #Тогда + НомераНаборов.Объект = Т.Ссылка + #Иначе + НомераНаборов.Объект = Т.#Параметр(4) + #КонецЕсли + #КонецЕсли + И НомераНаборов.#Параметр(2) + И НЕ Ложь В + ( + Выбрать Первые 1 Ложь // Выбор первого не разрешенного значения доступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + ИЗ #Параметр(1).НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + НаборыЗначений.Ссылка = Т.Ссылка + #Иначе + ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений + ГДЕ + #Если "#Параметр(4)" = "" #Тогда + НаборыЗначений.Объект = Т.Ссылка + #Иначе + НаборыЗначений.Объект = Т.#Параметр(4) + #КонецЕсли + #КонецЕсли + И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + И НЕ + ( + Выбор + // Проверка заведомого ложного или заведомо истинного однострочного набора значений. + Когда НаборыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) + Тогда НаборыЗначений.ЗначениеДоступа <> Неопределено + // Проверка отключения ограничения по виду доступа. + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезОграничения) + Тогда Истина + // Проверка права доступа пользователя к таблице ЗначенияДоступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), + Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) ) + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТипЗначения(ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы) = ТипЗначения(НаборыЗначений.ЗначениеДоступа) + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #Иначе + Когда НаборыЗначений.ТипЗначенияДоступа <> Неопределено + Тогда Истина В + ( Выбрать Первые 1 Истина + ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + ГДЕ + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы = НаборыЗначений.ТипЗначенияДоступа + И НаборыЗначений.ВидДоступа В ( Значение(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоДобавления, + ТаблицыГруппДоступаПроверкаПраваНаОбъект.ВидДоступаПравоИзменения ) + ) + #КонецЕсли + #Если НЕ &ВидыДоступаЧерезПраваПоЗначениямДоступа = "" #Тогда + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаЧерезПраваПоЗначениямДоступа) + #Иначе + Когда НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа + #КонецЕсли + Тогда + ( + НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + ИЛИ + Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2) + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено + ( + Выбрать Первые 1 Ложь + ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений + ПО + ИерархияЗначений.ИспользоватьПраваСсылки + И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ПраваПоЗначениям.Таблица = "#Параметр(1)" + И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа + И ПраваПоЗначениям.#Параметр(2)Запрещено + И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем + Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ПО + #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + #Иначе + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + #КонецЕсли + И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь + ) + ) + #КонецЕсли + Иначе + #Если НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" И + НЕ &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный" #Тогда // когда не КаждыйВидЕдинственный + ( + // Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа. + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + НаборыЗначений.ВидДоступа В (&ВидыДоступаЕдинственныеДляТипаЗначенияДоступа) + #Иначе + НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа + #КонецЕсли + // Проверка наличия вида доступа у значения доступа. + ИЛИ НЕ Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений + ГДЕ + ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И ВидыЗначений.ТолькоВидДоступа = Истина + ) + ) + И + #КонецЕсли + Выбор + Когда + #Если НЕ &ОграничиватьДоступПоВидуПользователи = "" + И &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #ИначеЕсли НЕ &ОграничиватьДоступПоВидуВнешниеПользователи = "" + И НЕ &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда + + НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И Истина В + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей + ГДЕ + ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи) + И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь + И ПользователиИГруппыПользователей.ГруппаДоступа = НаборыЗначений.ЗначениеДоступа + ) + ИЛИ + #КонецЕсли + #Если &ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп" ИЛИ + &ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп" #Тогда // когда КаждыйВидБезГрупп + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + #Иначе + Выбор + #Если "#Параметр(4)" = "" И ("#Параметр(2)" = "Добавление" ИЛИ "#Параметр(2)" = "Изменение") #Тогда + Когда НаборыЗначений.ВидДоступа В (&ВидыДоступаБезГруппЗначенияДоступа) + #Иначе + Когда НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа + #КонецЕсли + Тогда + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения + ГДЕ + Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = Ложь + И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Иначе + Выбор + Когда Истина В // Поиск значения в группе доступа (пользователей) через группы доступа значений. + ( + Выбрать Первые 1 Истина + ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения + ПО + ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа + И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Значения.ВидДоступа = НаборыЗначений.ВидДоступа + И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа + И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа + ) + Тогда Истина + Иначе Ложь + Конец + Конец + #КонецЕсли + = + Выбор + Когда Истина В // Проверка наличия ограничения по виду доступа для значений. + ( + Выбрать Истина + ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды + ГДЕ + Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа + И Виды.ВидДоступа = НаборыЗначений.ВидДоступа + И Виды.ТолькоВидДоступа = Истина + ) + Тогда Истина + Иначе Ложь + Конец + Тогда Истина + Иначе Ложь + Конец + Конец + ) + ) // НЕ Ложь В + ) +) +#КонецЕсли + + + + diff --git a/SSL/src/Roles/ЧтениеЗадач/ЧтениеЗадач.mdo b/SSL/src/Roles/ЧтениеЗадач/ЧтениеЗадач.mdo new file mode 100644 index 000000000..66eeb9b79 --- /dev/null +++ b/SSL/src/Roles/ЧтениеЗадач/ЧтениеЗадач.mdo @@ -0,0 +1,8 @@ + + + ЧтениеЗадач + + ru + Чтение задач + + diff --git a/SSL/src/Roles/ЧтениеОтветовНаВопросыАнкет/Rights.rights b/SSL/src/Roles/ЧтениеОтветовНаВопросыАнкет/Rights.rights new file mode 100644 index 000000000..3b395101b --- /dev/null +++ b/SSL/src/Roles/ЧтениеОтветовНаВопросыАнкет/Rights.rights @@ -0,0 +1,826 @@ + + + false + false + true + + Catalog.ШаблоныАнкет + + Read + true + + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Predefined + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Ref + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.IsFolder + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Owner + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Parent + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Description + + View + true + + + + Catalog.ШаблоныАнкет.StandardAttribute.Code + + View + true + + + + InformationRegister.ОтветыНаВопросыАнкет + + Read + true + + + View + true + + + + InformationRegister.ОтветыНаВопросыАнкет.StandardAttribute.Active + + View + true + + + + InformationRegister.ОтветыНаВопросыАнкет.StandardAttribute.LineNumber + + View + true + + + + InformationRegister.ОтветыНаВопросыАнкет.StandardAttribute.Recorder + + View + true + + + + InformationRegister.ОтветыНаВопросыАнкет.StandardAttribute.Period + + View + true + + + + Catalog.ВопросыШаблонаАнкеты + + Read + true + + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.Predefined + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.Ref + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.IsFolder + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.Owner + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.Parent + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.Description + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.StandardAttribute.Code + + View + true + + + + Document.НазначениеОпросов.Attribute.СвободныйОпрос + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.ТипОтвета + + View + true + + + + Document.НазначениеОпросов.Attribute.Комментарий + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.Точность + + View + true + + + + InformationRegister.ОтветыНаВопросыАнкет.Dimension.Вопрос + + View + true + + + + Catalog.ШаблоныАнкет.Attribute.Заключение + + View + true + + + + Document.НазначениеОпросов.Attribute.ВозможностьПредварительногоСохранения + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.АгрегироватьСуммуВОтчетах + + View + true + + + + Catalog.ВариантыОтветовАнкет.Attribute.ТребуетОткрытогоОтвета + + View + true + + + + Catalog.ШаблоныАнкет.Attribute.Вступление + + View + true + + + + Document.Анкета.Attribute.ДатаРедактирования + + View + true + + + + InformationRegister.ОтветыНаВопросыАнкет.Dimension.НомерЯчейки + + View + true + + + + Document.НазначениеОпросов.TabularSection.Респонденты.Attribute.Респондент + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.Формулировка + + View + true + + + + Catalog.ВариантыОтветовАнкет + + Read + true + + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Predefined + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Ref + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.IsFolder + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Owner + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Parent + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Description + + View + true + + + + Catalog.ВариантыОтветовАнкет.StandardAttribute.Code + + View + true + + + + Document.Анкета.TabularSection.Состав + + View + true + + + + Document.НазначениеОпросов + + Read + true + + + View + true + + + + Document.НазначениеОпросов.StandardAttribute.Posted + + View + true + + + + Document.НазначениеОпросов.StandardAttribute.Ref + + View + true + + + + Document.НазначениеОпросов.StandardAttribute.DeletionMark + + View + true + + + + Document.НазначениеОпросов.StandardAttribute.Date + + View + true + + + + Document.НазначениеОпросов.StandardAttribute.Number + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.МинимальноеЗначение + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.Обязательный + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.TabularSection.ПредопределенныеОтветы.Attribute.ЭлементарныйВопрос + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.МаксимальноеЗначение + + View + true + + + + Document.Анкета.TabularSection.Состав.Attribute.ЭлементарныйВопрос + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.ЭлементарныйВопрос + + View + true + + + + Document.НазначениеОпросов.Attribute.ДатаНачала + + View + true + + + + Document.НазначениеОпросов.TabularSection.Респонденты + + View + true + + + + Catalog.ШаблоныАнкет.Attribute.РедактированиеШаблонаЗавершено + + View + true + + + + Document.Анкета + + Read + true + + + View + true + + + + Document.Анкета.StandardAttribute.Posted + + View + true + + + + Document.Анкета.StandardAttribute.Ref + + View + true + + + + Document.Анкета.StandardAttribute.DeletionMark + + View + true + + + + Document.Анкета.StandardAttribute.Date + + View + true + + + + Document.Анкета.StandardAttribute.Number + + View + true + + + + InformationRegister.ОтветыНаВопросыАнкет.Dimension.ЭлементарныйВопрос + + View + true + + + + Document.НазначениеОпросов.Attribute.ДатаОкончания + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.ВысотаЭлементаФормулировкиВопроса + + View + true + + + + Document.Анкета.TabularSection.Состав.Attribute.Ответ + + View + true + + + + InformationRegister.ОтветыНаВопросыАнкет.Attribute.ОткрытыйОтвет + + View + true + + + + Document.Анкета.TabularSection.Состав.Attribute.ОткрытыйОтвет + + View + true + + + + InformationRegister.ОтветыНаВопросыАнкет.Dimension.Анкета + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.Заметки + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.TabularSection.ПредопределенныеОтветы + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.ЗаполнятьАвтоматически + + View + true + + + + Document.НазначениеОпросов.Attribute.ТипРеспондентов + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.Формулировка + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.Длина + + View + true + + + + Document.Анкета.Attribute.Опрос + + View + true + + + + Document.НазначениеОпросов.Attribute.Наименование + + View + true + + + + Report.АнкетированиеАналитическийОтчет + + Use + true + + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.ПояснениеКомментария + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.ТипТабличногоВопроса + + View + true + + + + Catalog.ВариантыОтветовАнкет.Attribute.РеквизитДопУпорядочивания + + View + true + + + + Document.Анкета.TabularSection.Состав.Attribute.Вопрос + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.TabularSection.СоставТабличногоВопроса + + View + true + + + + Document.Анкета.TabularSection.Состав.Attribute.НомерЯчейки + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.TabularSection.СоставТабличногоВопроса.Attribute.ЭлементарныйВопрос + + View + true + + + + Catalog.ШаблоныАнкет.Attribute.Заголовок + + View + true + + + + Document.Анкета.Attribute.РедактируемыйРаздел + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.РодительВопрос + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.ТребуетсяКомментарий + + View + true + + + + Document.НазначениеОпросов.Attribute.НеПоказыватьВАрхивеАнкет + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.Attribute.ТипВопроса + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования + + Read + true + + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.ValueType + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.Description + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.Code + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.IsFolder + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.Parent + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.Predefined + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.DeletionMark + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.StandardAttribute.Ref + + View + true + + + + Report.АнализОпроса + + Use + true + + + View + true + + + + Catalog.ВопросыШаблонаАнкеты.TabularSection.ПредопределенныеОтветы.Attribute.Ответ + + View + true + + + + Document.Анкета.Attribute.Респондент + + View + true + + + + InformationRegister.ОтветыНаВопросыАнкет.Resource.Ответ + + View + true + + + + ChartOfCharacteristicTypes.ВопросыДляАнкетирования.Attribute.ВидКонтактнойИнформации + + View + true + + + + Document.НазначениеОпросов.Attribute.ШаблонАнкеты + + View + true + + + diff --git a/SSL/src/Roles/ЧтениеОтветовНаВопросыАнкет/ЧтениеОтветовНаВопросыАнкет.mdo b/SSL/src/Roles/ЧтениеОтветовНаВопросыАнкет/ЧтениеОтветовНаВопросыАнкет.mdo new file mode 100644 index 000000000..df2ea663c --- /dev/null +++ b/SSL/src/Roles/ЧтениеОтветовНаВопросыАнкет/ЧтениеОтветовНаВопросыАнкет.mdo @@ -0,0 +1,8 @@ + + + ЧтениеОтветовНаВопросыАнкет + + ru + Чтение ответов на вопросы анкет + + diff --git a/SSL/src/Roles/ЧтениеПерсональныхДанныхФизическихЛиц/Rights.rights b/SSL/src/Roles/ЧтениеПерсональныхДанныхФизическихЛиц/Rights.rights new file mode 100644 index 000000000..c6e806ad4 --- /dev/null +++ b/SSL/src/Roles/ЧтениеПерсональныхДанныхФизическихЛиц/Rights.rights @@ -0,0 +1,214 @@ + + + false + false + true + + Catalog.ФизическиеЛица.Attribute.ДатаРождения + + View + true + + + + InformationRegister.ДокументыФизическихЛиц + + Read + true + + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.StandardAttribute.Active + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.StandardAttribute.LineNumber + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.StandardAttribute.Recorder + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.StandardAttribute.Period + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.ЯвляетсяДокументомУдостоверяющимЛичность + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.Dimension.Физлицо + + View + true + + + + Catalog.ФизическиеЛица + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Predefined + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Ref + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.IsFolder + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Owner + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Parent + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Description + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Code + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.Номер + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.Command.ДокументыФизическогоЛица + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.ДатаВыдачи + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.Серия + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.КемВыдан + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.СрокДействия + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.Представление + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.КодПодразделения + + View + true + + + + Catalog.ФизическиеЛица.Attribute.Пол + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.Resource.УдалитьВидДокумента + + View + true + + + + InformationRegister.ДокументыФизическихЛиц.Dimension.ВидДокумента + + View + true + + + diff --git a/SSL/src/Roles/ЧтениеПерсональныхДанныхФизическихЛиц/ЧтениеПерсональныхДанныхФизическихЛиц.mdo b/SSL/src/Roles/ЧтениеПерсональныхДанныхФизическихЛиц/ЧтениеПерсональныхДанныхФизическихЛиц.mdo new file mode 100644 index 000000000..85040e737 --- /dev/null +++ b/SSL/src/Roles/ЧтениеПерсональныхДанныхФизическихЛиц/ЧтениеПерсональныхДанныхФизическихЛиц.mdo @@ -0,0 +1,8 @@ + + + ЧтениеПерсональныхДанныхФизическихЛиц + + ru + Чтение персональных данных физических лиц + + diff --git a/SSL/src/Roles/ЧтениеФизическихЛиц/Rights.rights b/SSL/src/Roles/ЧтениеФизическихЛиц/Rights.rights new file mode 100644 index 000000000..50fa4b7df --- /dev/null +++ b/SSL/src/Roles/ЧтениеФизическихЛиц/Rights.rights @@ -0,0 +1,91 @@ + + + false + false + true + + InformationRegister.ДокументыФизическихЛиц + + Read + false + + #ПоЗначениямРасширенный( "РегистрСведений.ПаспортныеДанныеФизЛиц","Чтение","", +"", +"", +"ГруппыФизическихЛиц","Т.Физлицо","", +"","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","" ) + + + + + Catalog.ФизическиеЛица + + Read + true + + + View + true + + + InputByString + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Predefined + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Ref + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.DeletionMark + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.IsFolder + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Owner + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Parent + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Description + + View + true + + + + Catalog.ФизическиеЛица.StandardAttribute.Code + + View + true + + + diff --git a/SSL/src/Roles/ЧтениеФизическихЛиц/ЧтениеФизическихЛиц.mdo b/SSL/src/Roles/ЧтениеФизическихЛиц/ЧтениеФизическихЛиц.mdo new file mode 100644 index 000000000..a5c6f6d73 --- /dev/null +++ b/SSL/src/Roles/ЧтениеФизическихЛиц/ЧтениеФизическихЛиц.mdo @@ -0,0 +1,8 @@ + + + ЧтениеФизическихЛиц + + ru + Чтение физических лиц + + diff --git a/SSL/src/ScheduledJobs/ВыполнениеОбменаДанными/Schedule.schedule b/SSL/src/ScheduledJobs/ВыполнениеОбменаДанными/Schedule.schedule new file mode 100644 index 000000000..541280214 --- /dev/null +++ b/SSL/src/ScheduledJobs/ВыполнениеОбменаДанными/Schedule.schedule @@ -0,0 +1,22 @@ + + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + diff --git a/SSL/src/ScheduledJobs/ВыполнениеОбменаДанными/ВыполнениеОбменаДанными.mdo b/SSL/src/ScheduledJobs/ВыполнениеОбменаДанными/ВыполнениеОбменаДанными.mdo new file mode 100644 index 000000000..f2ee6df47 --- /dev/null +++ b/SSL/src/ScheduledJobs/ВыполнениеОбменаДанными/ВыполнениеОбменаДанными.mdo @@ -0,0 +1,14 @@ + + + ВыполнениеОбменаДанными + + ru + Выполнение обмена данными + + Задание предназначено для выполнения обмена данными по расписанию + CommonModule.ОбменДаннымиСервер.ВыполнитьОбменДаннымиПоСценариюОбменаДанными + Выполнение обмена + true + 3 + 10 + diff --git a/SSL/src/ScheduledJobs/ЗагрузкаКурсовВалют/Schedule.schedule b/SSL/src/ScheduledJobs/ЗагрузкаКурсовВалют/Schedule.schedule new file mode 100644 index 000000000..db5dafdc8 --- /dev/null +++ b/SSL/src/ScheduledJobs/ЗагрузкаКурсовВалют/Schedule.schedule @@ -0,0 +1,22 @@ + + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + diff --git a/SSL/src/ScheduledJobs/ЗагрузкаКурсовВалют/ЗагрузкаКурсовВалют.mdo b/SSL/src/ScheduledJobs/ЗагрузкаКурсовВалют/ЗагрузкаКурсовВалют.mdo new file mode 100644 index 000000000..048a4ec17 --- /dev/null +++ b/SSL/src/ScheduledJobs/ЗагрузкаКурсовВалют/ЗагрузкаКурсовВалют.mdo @@ -0,0 +1,13 @@ + + + ЗагрузкаКурсовВалют + + ru + Загрузка курсов валют + + CommonModule.РаботаСКурсамиВалютСобытия.ЗагрузитьАктуальныйКурс + true + true + 3 + 10 + diff --git a/SSL/src/ScheduledJobs/ЗаполнениеДанныхДляОграниченияДоступа/Schedule.schedule b/SSL/src/ScheduledJobs/ЗаполнениеДанныхДляОграниченияДоступа/Schedule.schedule new file mode 100644 index 000000000..5513b3374 --- /dev/null +++ b/SSL/src/ScheduledJobs/ЗаполнениеДанныхДляОграниченияДоступа/Schedule.schedule @@ -0,0 +1,22 @@ + + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + diff --git a/SSL/src/ScheduledJobs/ЗаполнениеДанныхДляОграниченияДоступа/ЗаполнениеДанныхДляОграниченияДоступа.mdo b/SSL/src/ScheduledJobs/ЗаполнениеДанныхДляОграниченияДоступа/ЗаполнениеДанныхДляОграниченияДоступа.mdo new file mode 100644 index 000000000..bbcc4369a --- /dev/null +++ b/SSL/src/ScheduledJobs/ЗаполнениеДанныхДляОграниченияДоступа/ЗаполнениеДанныхДляОграниченияДоступа.mdo @@ -0,0 +1,13 @@ + + + ЗаполнениеДанныхДляОграниченияДоступа + + ru + Заполнение данных для ограничения доступа + + CommonModule.УправлениеДоступом.ЗаполнениеДанныхДляОграниченияДоступаОбработчикЗадания + Заполнение данных для ограничения доступа + true + 3 + 10 + diff --git a/SSL/src/ScheduledJobs/ЗапускДополнительныхОбработок/ЗапускДополнительныхОбработок.mdo b/SSL/src/ScheduledJobs/ЗапускДополнительныхОбработок/ЗапускДополнительныхОбработок.mdo new file mode 100644 index 000000000..f39ad0a27 --- /dev/null +++ b/SSL/src/ScheduledJobs/ЗапускДополнительныхОбработок/ЗапускДополнительныхОбработок.mdo @@ -0,0 +1,14 @@ + + + ЗапускДополнительныхОбработок + + ru + Запуск дополнительных обработок + + Задание служит для запуска дополнительных глобальных обработок по регламентному заданию + CommonModule.ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуПоРегламентномуЗаданию + Запуск обработок + true + 3 + 10 + diff --git a/SSL/src/ScheduledJobs/ИзвлечениеТекста/Schedule.schedule b/SSL/src/ScheduledJobs/ИзвлечениеТекста/Schedule.schedule new file mode 100644 index 000000000..364e21ad7 --- /dev/null +++ b/SSL/src/ScheduledJobs/ИзвлечениеТекста/Schedule.schedule @@ -0,0 +1,22 @@ + + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + diff --git a/SSL/src/ScheduledJobs/ИзвлечениеТекста/ИзвлечениеТекста.mdo b/SSL/src/ScheduledJobs/ИзвлечениеТекста/ИзвлечениеТекста.mdo new file mode 100644 index 000000000..6d3cdef17 --- /dev/null +++ b/SSL/src/ScheduledJobs/ИзвлечениеТекста/ИзвлечениеТекста.mdo @@ -0,0 +1,13 @@ + + + ИзвлечениеТекста + + ru + Извлечение текста + + CommonModule.ФайловыеФункции.ИзвлечениеТекста + true + true + 3 + 10 + diff --git a/SSL/src/ScheduledJobs/КонтрольЖурналаРегистрации/Schedule.schedule b/SSL/src/ScheduledJobs/КонтрольЖурналаРегистрации/Schedule.schedule new file mode 100644 index 000000000..06bd33233 --- /dev/null +++ b/SSL/src/ScheduledJobs/КонтрольЖурналаРегистрации/Schedule.schedule @@ -0,0 +1,24 @@ + + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + + + diff --git a/SSL/src/ScheduledJobs/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo b/SSL/src/ScheduledJobs/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo new file mode 100644 index 000000000..a7aead7de --- /dev/null +++ b/SSL/src/ScheduledJobs/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo @@ -0,0 +1,14 @@ + + + КонтрольЖурналаРегистрации + + ru + Контроль журнала регистрации + + CommonModule.КонтрольЖурналаРегистрации.ОбработкаРегламентногоЗадания_КонтрольОшибокВЖурналеРегистрации + Контроль журнала регистрации + true + true + 3 + 10 + diff --git a/SSL/src/ScheduledJobs/МониторингЗадач/Schedule.schedule b/SSL/src/ScheduledJobs/МониторингЗадач/Schedule.schedule new file mode 100644 index 000000000..ca7c07a4f --- /dev/null +++ b/SSL/src/ScheduledJobs/МониторингЗадач/Schedule.schedule @@ -0,0 +1,22 @@ + + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + diff --git a/SSL/src/ScheduledJobs/МониторингЗадач/МониторингЗадач.mdo b/SSL/src/ScheduledJobs/МониторингЗадач/МониторингЗадач.mdo new file mode 100644 index 000000000..c50f2f1d5 --- /dev/null +++ b/SSL/src/ScheduledJobs/МониторингЗадач/МониторингЗадач.mdo @@ -0,0 +1,12 @@ + + + МониторингЗадач + + ru + Мониторинг задач + + CommonModule.БизнесПроцессыИЗадачиСервер.ПроконтролироватьЗадачи + true + 3 + 10 + diff --git a/SSL/src/ScheduledJobs/ОбновлениеАгрегатов/ОбновлениеАгрегатов.mdo b/SSL/src/ScheduledJobs/ОбновлениеАгрегатов/ОбновлениеАгрегатов.mdo new file mode 100644 index 000000000..5ae9b54da --- /dev/null +++ b/SSL/src/ScheduledJobs/ОбновлениеАгрегатов/ОбновлениеАгрегатов.mdo @@ -0,0 +1,13 @@ + + + ОбновлениеАгрегатов + + ru + Обновление агрегатов + + CommonModule.УправлениеИтогамиИАгрегатамиСобытия.ОбновлениеАгрегатов + ОбновлениеАгрегатов + true + 3 + 10 + diff --git a/SSL/src/ScheduledJobs/ОбновлениеИндексаППД/Schedule.schedule b/SSL/src/ScheduledJobs/ОбновлениеИндексаППД/Schedule.schedule new file mode 100644 index 000000000..5bfed5d04 --- /dev/null +++ b/SSL/src/ScheduledJobs/ОбновлениеИндексаППД/Schedule.schedule @@ -0,0 +1,22 @@ + + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + diff --git a/SSL/src/ScheduledJobs/ОбновлениеИндексаППД/ОбновлениеИндексаППД.mdo b/SSL/src/ScheduledJobs/ОбновлениеИндексаППД/ОбновлениеИндексаППД.mdo new file mode 100644 index 000000000..2105ca5e6 --- /dev/null +++ b/SSL/src/ScheduledJobs/ОбновлениеИндексаППД/ОбновлениеИндексаППД.mdo @@ -0,0 +1,13 @@ + + + ОбновлениеИндексаППД + + ru + Обновление индекса ППД + + CommonModule.ПолнотекстовыйПоискСервер.ОбновлениеИндексаППД + true + true + 3 + 10 + diff --git a/SSL/src/ScheduledJobs/ПерестроениеАгрегатов/ПерестроениеАгрегатов.mdo b/SSL/src/ScheduledJobs/ПерестроениеАгрегатов/ПерестроениеАгрегатов.mdo new file mode 100644 index 000000000..8d5a7f18b --- /dev/null +++ b/SSL/src/ScheduledJobs/ПерестроениеАгрегатов/ПерестроениеАгрегатов.mdo @@ -0,0 +1,13 @@ + + + ПерестроениеАгрегатов + + ru + Перестроение агрегатов + + CommonModule.УправлениеИтогамиИАгрегатамиСобытия.ПерестроениеАгрегатов + ПерестроениеАгрегатов + true + 3 + 10 + diff --git a/SSL/src/ScheduledJobs/СлияниеИндексаППД/Schedule.schedule b/SSL/src/ScheduledJobs/СлияниеИндексаППД/Schedule.schedule new file mode 100644 index 000000000..55aa42512 --- /dev/null +++ b/SSL/src/ScheduledJobs/СлияниеИндексаППД/Schedule.schedule @@ -0,0 +1,22 @@ + + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + diff --git a/SSL/src/ScheduledJobs/СлияниеИндексаППД/СлияниеИндексаППД.mdo b/SSL/src/ScheduledJobs/СлияниеИндексаППД/СлияниеИндексаППД.mdo new file mode 100644 index 000000000..a7dd34cde --- /dev/null +++ b/SSL/src/ScheduledJobs/СлияниеИндексаППД/СлияниеИндексаППД.mdo @@ -0,0 +1,13 @@ + + + СлияниеИндексаППД + + ru + Слияние индекса ППД + + CommonModule.ПолнотекстовыйПоискСервер.СлияниеИндексаППД + true + true + 3 + 10 + diff --git a/SSL/src/ScheduledJobs/УведомлениеИсполнителейОНовыхЗадачах/Schedule.schedule b/SSL/src/ScheduledJobs/УведомлениеИсполнителейОНовыхЗадачах/Schedule.schedule new file mode 100644 index 000000000..ca7c07a4f --- /dev/null +++ b/SSL/src/ScheduledJobs/УведомлениеИсполнителейОНовыхЗадачах/Schedule.schedule @@ -0,0 +1,22 @@ + + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + diff --git a/SSL/src/ScheduledJobs/УведомлениеИсполнителейОНовыхЗадачах/УведомлениеИсполнителейОНовыхЗадачах.mdo b/SSL/src/ScheduledJobs/УведомлениеИсполнителейОНовыхЗадачах/УведомлениеИсполнителейОНовыхЗадачах.mdo new file mode 100644 index 000000000..cafe640ac --- /dev/null +++ b/SSL/src/ScheduledJobs/УведомлениеИсполнителейОНовыхЗадачах/УведомлениеИсполнителейОНовыхЗадачах.mdo @@ -0,0 +1,13 @@ + + + УведомлениеИсполнителейОНовыхЗадачах + + ru + Уведомление исполнителей о новых задачах + + CommonModule.БизнесПроцессыИЗадачиСервер.УведомитьИсполнителейОНовыхЗадачах + true + true + 3 + 10 + diff --git a/SSL/src/ScheduledJobs/УстановкаПериодаРассчитанныхИтогов/УстановкаПериодаРассчитанныхИтогов.mdo b/SSL/src/ScheduledJobs/УстановкаПериодаРассчитанныхИтогов/УстановкаПериодаРассчитанныхИтогов.mdo new file mode 100644 index 000000000..073be9f06 --- /dev/null +++ b/SSL/src/ScheduledJobs/УстановкаПериодаРассчитанныхИтогов/УстановкаПериодаРассчитанныхИтогов.mdo @@ -0,0 +1,12 @@ + + + УстановкаПериодаРассчитанныхИтогов + + ru + Установка периода рассчитанных итогов + + CommonModule.УправлениеИтогамиИАгрегатамиСобытия.УстановкаПериодаРассчитанныхИтогов + true + 3 + 10 + diff --git a/SSL/src/SessionParameters/ВидыДоступаБезГруппЗначенияДоступа/ВидыДоступаБезГруппЗначенияДоступа.mdo b/SSL/src/SessionParameters/ВидыДоступаБезГруппЗначенияДоступа/ВидыДоступаБезГруппЗначенияДоступа.mdo new file mode 100644 index 000000000..7789eee9c --- /dev/null +++ b/SSL/src/SessionParameters/ВидыДоступаБезГруппЗначенияДоступа/ВидыДоступаБезГруппЗначенияДоступа.mdo @@ -0,0 +1,11 @@ + + + ВидыДоступаБезГруппЗначенияДоступа + + ru + Виды доступа без групп значения доступа + + + FixedArray + + diff --git a/SSL/src/SessionParameters/ВидыДоступаБезОграничения/ВидыДоступаБезОграничения.mdo b/SSL/src/SessionParameters/ВидыДоступаБезОграничения/ВидыДоступаБезОграничения.mdo new file mode 100644 index 000000000..bbc96deb8 --- /dev/null +++ b/SSL/src/SessionParameters/ВидыДоступаБезОграничения/ВидыДоступаБезОграничения.mdo @@ -0,0 +1,11 @@ + + + ВидыДоступаБезОграничения + + ru + Виды доступа без ограничения + + + FixedArray + + diff --git a/SSL/src/SessionParameters/ВидыДоступаЕдинственныеДляТипаЗначенияДоступа/ВидыДоступаЕдинственныеДляТипаЗначенияДоступа.mdo b/SSL/src/SessionParameters/ВидыДоступаЕдинственныеДляТипаЗначенияДоступа/ВидыДоступаЕдинственныеДляТипаЗначенияДоступа.mdo new file mode 100644 index 000000000..9947f07f4 --- /dev/null +++ b/SSL/src/SessionParameters/ВидыДоступаЕдинственныеДляТипаЗначенияДоступа/ВидыДоступаЕдинственныеДляТипаЗначенияДоступа.mdo @@ -0,0 +1,11 @@ + + + ВидыДоступаЕдинственныеДляТипаЗначенияДоступа + + ru + Виды доступа единственные для типа значения доступа + + + FixedArray + + diff --git a/SSL/src/SessionParameters/ВидыДоступаЧерезПраваПоЗначениямДоступа/ВидыДоступаЧерезПраваПоЗначениямДоступа.mdo b/SSL/src/SessionParameters/ВидыДоступаЧерезПраваПоЗначениямДоступа/ВидыДоступаЧерезПраваПоЗначениямДоступа.mdo new file mode 100644 index 000000000..1026b7803 --- /dev/null +++ b/SSL/src/SessionParameters/ВидыДоступаЧерезПраваПоЗначениямДоступа/ВидыДоступаЧерезПраваПоЗначениямДоступа.mdo @@ -0,0 +1,15 @@ + + + ВидыДоступаЧерезПраваПоЗначениямДоступа + + ru + Виды доступа через права по значениям доступа + + + FixedArray + String + + 10 + + + diff --git a/SSL/src/SessionParameters/ДатаОбновленияПовторноИспользуемыхЗначенийМРО/ДатаОбновленияПовторноИспользуемыхЗначенийМРО.mdo b/SSL/src/SessionParameters/ДатаОбновленияПовторноИспользуемыхЗначенийМРО/ДатаОбновленияПовторноИспользуемыхЗначенийМРО.mdo new file mode 100644 index 000000000..735903f3e --- /dev/null +++ b/SSL/src/SessionParameters/ДатаОбновленияПовторноИспользуемыхЗначенийМРО/ДатаОбновленияПовторноИспользуемыхЗначенийМРО.mdo @@ -0,0 +1,13 @@ + + + ДатаОбновленияПовторноИспользуемыхЗначенийМРО + + ru + Дата обновления повторно используемых значений МРО + + Дата на которую повторно-используемые значения механизма регистрации объектов были cчитаны в текущем сеансе + + Date + + + diff --git a/SSL/src/SessionParameters/ИспользуемыеПланыОбмена/ИспользуемыеПланыОбмена.mdo b/SSL/src/SessionParameters/ИспользуемыеПланыОбмена/ИспользуемыеПланыОбмена.mdo new file mode 100644 index 000000000..1c5e56c82 --- /dev/null +++ b/SSL/src/SessionParameters/ИспользуемыеПланыОбмена/ИспользуемыеПланыОбмена.mdo @@ -0,0 +1,12 @@ + + + ИспользуемыеПланыОбмена + + ru + Используемые планы обмена + + массив имен планов обмена, которые используются для регистрации изменений + + FixedArray + + diff --git a/SSL/src/SessionParameters/ОбменДаннымиВключен/ОбменДаннымиВключен.mdo b/SSL/src/SessionParameters/ОбменДаннымиВключен/ОбменДаннымиВключен.mdo new file mode 100644 index 000000000..d5037a959 --- /dev/null +++ b/SSL/src/SessionParameters/ОбменДаннымиВключен/ОбменДаннымиВключен.mdo @@ -0,0 +1,12 @@ + + + ОбменДаннымиВключен + + ru + Обмен данными включен + + определяет регистрировать или нет объекты на узлах планов обмена для выгрузки + + Boolean + + diff --git a/SSL/src/SessionParameters/ОграничиватьДоступПоВиду/ОграничиватьДоступПоВиду.mdo b/SSL/src/SessionParameters/ОграничиватьДоступПоВиду/ОграничиватьДоступПоВиду.mdo new file mode 100644 index 000000000..7701fdac5 --- /dev/null +++ b/SSL/src/SessionParameters/ОграничиватьДоступПоВиду/ОграничиватьДоступПоВиду.mdo @@ -0,0 +1,14 @@ + + + ОграничиватьДоступПоВиду + + ru + Ограничивать доступ по виду + + + String + + 50 + + + diff --git a/SSL/src/SessionParameters/ОграничиватьДоступПоВидуВнешниеПользователи/ОграничиватьДоступПоВидуВнешниеПользователи.mdo b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуВнешниеПользователи/ОграничиватьДоступПоВидуВнешниеПользователи.mdo new file mode 100644 index 000000000..04e89b60f --- /dev/null +++ b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуВнешниеПользователи/ОграничиватьДоступПоВидуВнешниеПользователи.mdo @@ -0,0 +1,14 @@ + + + ОграничиватьДоступПоВидуВнешниеПользователи + + ru + Ограничивать доступ по виду внешние пользователи + + + String + + 50 + + + diff --git a/SSL/src/SessionParameters/ОграничиватьДоступПоВидуДополнительныеСведения/ОграничиватьДоступПоВидуДополнительныеСведения.mdo b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуДополнительныеСведения/ОграничиватьДоступПоВидуДополнительныеСведения.mdo new file mode 100644 index 000000000..7a00562a0 --- /dev/null +++ b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуДополнительныеСведения/ОграничиватьДоступПоВидуДополнительныеСведения.mdo @@ -0,0 +1,14 @@ + + + ОграничиватьДоступПоВидуДополнительныеСведения + + ru + Ограничивать доступ по виду дополнительные сведения + + + String + + 50 + + + diff --git a/SSL/src/SessionParameters/ОграничиватьДоступПоВидуОбъект/ОграничиватьДоступПоВидуОбъект.mdo b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуОбъект/ОграничиватьДоступПоВидуОбъект.mdo new file mode 100644 index 000000000..233f8f0c4 --- /dev/null +++ b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуОбъект/ОграничиватьДоступПоВидуОбъект.mdo @@ -0,0 +1,14 @@ + + + ОграничиватьДоступПоВидуОбъект + + ru + Ограничивать доступ по виду объект + + + String + + 50 + + + diff --git a/SSL/src/SessionParameters/ОграничиватьДоступПоВидуПользователи/ОграничиватьДоступПоВидуПользователи.mdo b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуПользователи/ОграничиватьДоступПоВидуПользователи.mdo new file mode 100644 index 000000000..f6fdda320 --- /dev/null +++ b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуПользователи/ОграничиватьДоступПоВидуПользователи.mdo @@ -0,0 +1,14 @@ + + + ОграничиватьДоступПоВидуПользователи + + ru + Ограничивать доступ по виду пользователи + + + String + + 50 + + + diff --git a/SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоДобавления/ОграничиватьДоступПоВидуПравоДобавления.mdo b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоДобавления/ОграничиватьДоступПоВидуПравоДобавления.mdo new file mode 100644 index 000000000..0430690b6 --- /dev/null +++ b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоДобавления/ОграничиватьДоступПоВидуПравоДобавления.mdo @@ -0,0 +1,14 @@ + + + ОграничиватьДоступПоВидуПравоДобавления + + ru + Ограничивать доступ по виду право добавления + + + String + + 50 + + + diff --git a/SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоИзменения/ОграничиватьДоступПоВидуПравоИзменения.mdo b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоИзменения/ОграничиватьДоступПоВидуПравоИзменения.mdo new file mode 100644 index 000000000..0e0af842e --- /dev/null +++ b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоИзменения/ОграничиватьДоступПоВидуПравоИзменения.mdo @@ -0,0 +1,14 @@ + + + ОграничиватьДоступПоВидуПравоИзменения + + ru + Ограничивать доступ по виду право изменения + + + String + + 50 + + + diff --git a/SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоЧтения/ОграничиватьДоступПоВидуПравоЧтения.mdo b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоЧтения/ОграничиватьДоступПоВидуПравоЧтения.mdo new file mode 100644 index 000000000..29cd7e5ff --- /dev/null +++ b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоЧтения/ОграничиватьДоступПоВидуПравоЧтения.mdo @@ -0,0 +1,14 @@ + + + ОграничиватьДоступПоВидуПравоЧтения + + ru + Ограничивать доступ по виду право чтения + + + String + + 50 + + + diff --git a/SSL/src/SessionParameters/ОграничиватьДоступПоВидуУсловие/ОграничиватьДоступПоВидуУсловие.mdo b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуУсловие/ОграничиватьДоступПоВидуУсловие.mdo new file mode 100644 index 000000000..90ad83832 --- /dev/null +++ b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуУсловие/ОграничиватьДоступПоВидуУсловие.mdo @@ -0,0 +1,14 @@ + + + ОграничиватьДоступПоВидуУсловие + + ru + Ограничивать доступ по виду условие + + + String + + 50 + + + diff --git a/SSL/src/SessionParameters/ОграничиватьДоступПоВидуУчетныеЗаписиЭлектроннойПочты/ОграничиватьДоступПоВидуУчетныеЗаписиЭлектроннойПочты.mdo b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуУчетныеЗаписиЭлектроннойПочты/ОграничиватьДоступПоВидуУчетныеЗаписиЭлектроннойПочты.mdo new file mode 100644 index 000000000..58cebd5a8 --- /dev/null +++ b/SSL/src/SessionParameters/ОграничиватьДоступПоВидуУчетныеЗаписиЭлектроннойПочты/ОграничиватьДоступПоВидуУчетныеЗаписиЭлектроннойПочты.mdo @@ -0,0 +1,14 @@ + + + ОграничиватьДоступПоВидуУчетныеЗаписиЭлектроннойПочты + + ru + Ограничивать доступ по виду учетные записи электронной почты + + + String + + 50 + + + diff --git a/SSL/src/SessionParameters/ПравилаВыборочнойРегистрацииОбъектов/ПравилаВыборочнойРегистрацииОбъектов.mdo b/SSL/src/SessionParameters/ПравилаВыборочнойРегистрацииОбъектов/ПравилаВыборочнойРегистрацииОбъектов.mdo new file mode 100644 index 000000000..ad6dbba1b --- /dev/null +++ b/SSL/src/SessionParameters/ПравилаВыборочнойРегистрацииОбъектов/ПравилаВыборочнойРегистрацииОбъектов.mdo @@ -0,0 +1,11 @@ + + + ПравилаВыборочнойРегистрацииОбъектов + + ru + Правила выборочной регистрации объектов + + + ValueStorage + + diff --git a/SSL/src/SessionParameters/ПравилаРегистрацииОбъектов/ПравилаРегистрацииОбъектов.mdo b/SSL/src/SessionParameters/ПравилаРегистрацииОбъектов/ПравилаРегистрацииОбъектов.mdo new file mode 100644 index 000000000..d0e5d08a1 --- /dev/null +++ b/SSL/src/SessionParameters/ПравилаРегистрацииОбъектов/ПравилаРегистрацииОбъектов.mdo @@ -0,0 +1,12 @@ + + + ПравилаРегистрацииОбъектов + + ru + Правила регистрации объектов + + Общая таблица правил регистрации объектов для всех планов обмена конфигурации + + ValueStorage + + diff --git a/SSL/src/SessionParameters/ПредлагатьУстановкуРасширенияРаботыСФайлами/ПредлагатьУстановкуРасширенияРаботыСФайлами.mdo b/SSL/src/SessionParameters/ПредлагатьУстановкуРасширенияРаботыСФайлами/ПредлагатьУстановкуРасширенияРаботыСФайлами.mdo new file mode 100644 index 000000000..80d30c6a7 --- /dev/null +++ b/SSL/src/SessionParameters/ПредлагатьУстановкуРасширенияРаботыСФайлами/ПредлагатьУстановкуРасширенияРаботыСФайлами.mdo @@ -0,0 +1,11 @@ + + + ПредлагатьУстановкуРасширенияРаботыСФайлами + + ru + Предлагать установку расширения работы с файлами + + + Boolean + + diff --git a/SSL/src/SessionParameters/ПутьКРабочемуКаталогуПользователя/ПутьКРабочемуКаталогуПользователя.mdo b/SSL/src/SessionParameters/ПутьКРабочемуКаталогуПользователя/ПутьКРабочемуКаталогуПользователя.mdo new file mode 100644 index 000000000..d7525ad93 --- /dev/null +++ b/SSL/src/SessionParameters/ПутьКРабочемуКаталогуПользователя/ПутьКРабочемуКаталогуПользователя.mdo @@ -0,0 +1,12 @@ + + + ПутьКРабочемуКаталогуПользователя + + ru + Путь к рабочему каталогу пользователя + + + String + + + diff --git a/SSL/src/SessionParameters/ТекущийВнешнийПользователь/ТекущийВнешнийПользователь.mdo b/SSL/src/SessionParameters/ТекущийВнешнийПользователь/ТекущийВнешнийПользователь.mdo new file mode 100644 index 000000000..27a941c6f --- /dev/null +++ b/SSL/src/SessionParameters/ТекущийВнешнийПользователь/ТекущийВнешнийПользователь.mdo @@ -0,0 +1,11 @@ + + + ТекущийВнешнийПользователь + + ru + Текущий внешний пользователь + + + CatalogRef.ВнешниеПользователи + + diff --git a/SSL/src/SessionParameters/ТекущийПользователь/ТекущийПользователь.mdo b/SSL/src/SessionParameters/ТекущийПользователь/ТекущийПользователь.mdo new file mode 100644 index 000000000..c33366b01 --- /dev/null +++ b/SSL/src/SessionParameters/ТекущийПользователь/ТекущийПользователь.mdo @@ -0,0 +1,11 @@ + + + ТекущийПользователь + + ru + Текущий пользователь + + + CatalogRef.Пользователи + + diff --git a/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/ConditionalAppearance.dcssca b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/ConditionalAppearance.dcssca new file mode 100644 index 000000000..c69d93711 --- /dev/null +++ b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/ConditionalAppearance.dcssca @@ -0,0 +1,28 @@ + + + + + + Наименование + + + + + СписокВариантовОтчета.ЧастоИспВариант + Equal + true + + + + + false + ЦветФона + style:FieldBackColor + + + Шрифт + + + + + diff --git a/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/Form.form b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/Form.form new file mode 100644 index 000000000..b7a9565c8 --- /dev/null +++ b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/Form.form @@ -0,0 +1,815 @@ + + + + <key>ru</key> + <value>Выбор варианта отчета</value> + + + СписокВариантовОтчета + 1 + true + true + + true + + + СписокВариантовОтчета + + false + None + Add + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + OutputList + SelectAll + SortListAsc + SortListDesc + + Наименование + 4 + + <key>ru</key> + <value>Название</value> + + true + true + + true + + + СписокВариантовОтчета.Наименование + + + НаименованиеРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Автор + 11 + + <key>ru</key> + <value>Автор</value> + + true + true + + true + + + СписокВариантовОтчета.Автор + + + АвторРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 12 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + СписокВариантовОтчетаКоманднаяПанель + 3 + Left + + + Selection + СписокВариантовОтчетаВыбор + + + СписокВариантовОтчетаСтрокаПоиска + 28 + + СписокВариантовОтчетаСтрокаПоискаРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + СписокВариантовОтчетаСтрокаПоискаКонтекстноеМеню + 29 + true + + СписокВариантовОтчета + + true + + + + СписокВариантовОтчетаСостояниеПросмотра + 31 + + СписокВариантовОтчетаСостояниеПросмотраРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + СписокВариантовОтчетаСостояниеПросмотраКонтекстноеМеню + 32 + true + + ViewStatusAddition + СписокВариантовОтчета + + true + + + + СписокВариантовОтчетаУправлениеПоиском + 34 + + СписокВариантовОтчетаУправлениеПоискомРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + СписокВариантовОтчетаУправлениеПоискомКонтекстноеМеню + 35 + true + + SearchControlAddition + СписокВариантовОтчета + + true + + + + СписокВариантовОтчетаРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + СписокВариантовОтчетаКонтекстноеМеню + 2 + true + + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + false + true + Auto + Auto + ExpandAllLevels + true + true + None + None + None + true + +
    + + ГруппаОписание + 20 + + КартинкаИнфо + 18 + + <key>ru</key> + <value>Картинка инфо</value> + + true + true + + true + + + КартинкаИнфоРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + КартинкаИнфоКонтекстноеМеню + 19 + true + + 2 + true + 1 + true + + + CommonPicture.Информация + + + + + Описание + 16 + true + true + + true + + + Items.СписокВариантовОтчета.CurrentData.Описание + + None + + ОписаниеРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 17 + true + + LabelField + true + Enter + true + Left + true + + true + 2 + true + + + true + true + + true + + + <key>ru</key> + <value>Группа описание</value> + + + ru + Группа описание + + + ГруппаОписаниеРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + Top + true + + ФормаКоманднаяПанель + -1 + + Выбрать + 6 + + <key>ru</key> + <value>Выбрать</value> + + true + true + + true + + false + + ВыбратьРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Form.Command.Загрузить + PictureAndText + true + true + true + UserCmds + Auto + + + СписокВариантовОтчетаНайти + 21 + true + true + + true + + + СписокВариантовОтчетаНайтиРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + Form.Item.СписокВариантовОтчета.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ФормаОтменитьПоиск + 22 + true + true + + true + + + ФормаОтменитьПоискРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + Form.Item.СписокВариантовОтчета.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + ФормаЗакрыть + 13 + true + true + + true + + + ФормаЗакрытьРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + PictureAndText + true + true + UserCmds + Auto + + Left + + + 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> + + 3 + + String + + + + true + + + true + + + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 5 + + CatalogRef.ВариантыОтчетов + + + true + + + true + + + + ЧастоИспВариант + + <key>ru</key> + <value>Часто исп вариант</value> + + 2 + + Boolean + + + true + + + true + + + + Автор + + <key>ru</key> + <value>Автор</value> + + 4 + + CatalogRef.Пользователи + + + true + + + true + + + + АвторПредставление + + <key>ru</key> + <value>Автор представление</value> + + 6 + + String + + 500 + + + + true + + + true + + + + Описание + + <key>ru</key> + <value>Описание</value> + + 7 + + String + + + + true + + + true + + + + + СтандартныеНастройки + + <key>ru</key> + <value>Стандартные настройки</value> + + 2 + + ValueList + + + true + + + true + + + СтандартныеНастройки.Check + + + СтандартныеНастройки.Picture + + + СтандартныеНастройки.RowsCount + + + + + + + КлючОбъекта + + <key>ru</key> + <value>Ключ объекта</value> + + 3 + + String + + + + true + + + true + + + + КлючТекущихНастроек + + <key>ru</key> + <value>Ключ текущих настроек</value> + + 4 + + String + + + + true + + + true + + + + ТекущийПользователь + + <key>ru</key> + <value>Текущий пользователь</value> + + 5 + + CatalogRef.Пользователи + + + true + + + true + + + + РейтингВариантовОтчета + + <key>ru</key> + <value>Рейтинг вариантов отчета</value> + + 6 + + ValueTable + + + true + + + true + + + Ключ + + <key>ru</key> + <value>Ключ</value> + + 1 + + String + + + + true + + + true + + + + Значение + + <key>ru</key> + <value>Значение</value> + + 2 + + Date + + + + true + + + true + + + + + Загрузить + + <key>ru</key> + <value>Загрузить</value> + + 1 + + ru + Загрузить + + + true + + + StdPicture.ChooseFromList + + + + ЗагрузитьВыполнить + + + Auto + Auto + + + КлючОбъекта + + + + КлючТекущихНастроек + + + + СтандартныеНастройки + + ValueList + + + + ТекущийПользователь + + CatalogRef.Пользователи + + + + ПоказыватьТолькоИзбранные + + Boolean + + + + + + +
    diff --git a/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/Help/ru.html b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/Help/ru.html new file mode 100644 index 000000000..d346eaea9 --- /dev/null +++ b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/Help/ru.html @@ -0,0 +1,13 @@ + +

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

    +

    Для того, что бы выбрать нужный вариант отчета требуется установить курсор таблицы на нужный вариант отчета и нажать на кнопку "Выбор"

    +

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

    +

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

    +

    Отмеченные (используемые) варианты отчета

    +

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

    +

    Если нужно отметить или снять отметку варианта для этого нужно нажать на кнопку "Отметить".

    +

    См. также: 

    +

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

    +

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

    +

    Пользовательские настройки варианта отчета

    +

     

    \ No newline at end of file diff --git a/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/Module.bsl b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/Module.bsl new file mode 100644 index 000000000..7213dfa22 --- /dev/null +++ b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаЗагрузки/Module.bsl @@ -0,0 +1,93 @@ +&НаКлиенте +Процедура ЗагрузитьВыполнить() + + Если Элементы.СписокВариантовОтчета.ТекущаяСтрока <> Неопределено Тогда + + КлючТекущегоВарианта = Элементы.СписокВариантовОтчета.ТекущиеДанные.КлючВариантаОтчета; + СписокВыбора = Новый СписокЗначений; + ВыборНастроек = Новый ВыборНастроек(КлючТекущегоВарианта); + Закрыть(ВыборНастроек); + + Иначе + + Закрыть(); + + КонецЕсли; + +КонецПроцедуры + + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + КлючОбъекта = Параметры.КлючОбъекта; + КлючТекущихНастроек = Параметры.КлючТекущихНастроек; + СтандартныеНастройки = Параметры.СтандартныеНастройки; + ТекущийПользователь = Параметры.ТекущийПользователь; + ПоказыватьТолькоИзбранные = Параметры.ПоказыватьТолькоИзбранные; + + Если НЕ ЗначениеЗаполнено(ТекущийПользователь) тогда + ТекущийПользователь = ОбщегоНазначения.ТекущийПользователь(); + Параметры.ТекущийПользователь = ТекущийПользователь; + КонецЕсли; + + ЗаполнитьСписокВариантовОтчета(); + + СтрокиТекВарианта = СписокВариантовОтчета.НайтиСтроки(Новый Структура("КлючВариантаОтчета", КлючТекущихНастроек)); + Если СтрокиТекВарианта.Количество() > 0 тогда + Элементы.СписокВариантовОтчета.ТекущаяСтрока = СтрокиТекВарианта[0].ПолучитьИдентификатор(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСписокВариантовОтчета(КлючВарианта = Неопределено) + + ВариантыОтчета = РеквизитФормыВЗначение("СписокВариантовОтчета"); + ВариантыОтчета.Очистить(); + ВариантыОтчета.Колонки.Добавить("ДатаИспользования"); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ВариантыОтчета.Наименование КАК Наименование, + | ВариантыОтчета.Ссылка, + | ВариантыОтчета.КлючВарианта, + | ВариантыОтчета.Администратор, + | ВариантыОтчета.Администратор.Наименование КАК АдминистраторПредставление, + | ВариантыОтчета.Описание + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчета + |ГДЕ + | ВариантыОтчета.КлючОбъекта = &КлючОбъекта + | И (НЕ ВариантыОтчета.ПометкаУдаления) + | + |УПОРЯДОЧИТЬ ПО + | Наименование"; + + Запрос.Параметры.Вставить("КлючОбъекта", КлючОбъекта); + + УстановитьПривилегированныйРежим(истина); + РезультатЗапроса = Запрос.Выполнить(); + Выборка = РезультатЗапроса.Выбрать(); + УстановитьПривилегированныйРежим(ложь); + + Пока Выборка.Следующий() Цикл + СтрокаСписка = ВариантыОтчета.Добавить(); + СтрокаСписка.Наименование = Выборка.Наименование; + СтрокаСписка.КлючВариантаОтчета = Выборка.КлючВарианта; + СтрокаСписка.Ссылка = Выборка.Ссылка; + СтрокаСписка.Автор = Выборка.Администратор; + СтрокаСписка.АвторПредставление = Выборка.АдминистраторПредставление; + СтрокаСписка.Описание = Выборка.Описание; + КонецЦикла; + + ЗначениеВРеквизитФормы(ВариантыОтчета, "СписокВариантовОтчета"); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокВариантовОтчетаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + ЗагрузитьВыполнить(); +КонецПроцедуры + + diff --git a/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/ConditionalAppearance.dcssca b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/ConditionalAppearance.dcssca new file mode 100644 index 000000000..682a83f5d --- /dev/null +++ b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/ConditionalAppearance.dcssca @@ -0,0 +1,48 @@ + + + + + + ВариантыОтчета + + + + + ВариантыОтчетовТ.Ответственный + NotEqual + Справочник.Пользователи.ПустаяСсылка + + + + + ЦветТекста + #999999 + + + ТолькоПросмотр + true + + + + + + + Описание + + + + + ТипВариантаОтчета + InList + Перечисление.ТипыВариантовОтчетов.Предопределенный + Перечисление.ТипыВариантовОтчетов.Отчет + + + + + ТолькоПросмотр + true + + + + diff --git a/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/Form.form b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/Form.form new file mode 100644 index 000000000..aeb75bbd9 --- /dev/null +++ b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/Form.form @@ -0,0 +1,2001 @@ + + + + <key>ru</key> + <value>Сохранение варианта отчета</value> + + + Конструктор + 34 + + СохранениеСущ + 36 + + Группа + 65 + + НовыеИлиСохранитьСуществ + 37 + true + true + + true + + + НовыеИлиСохранитьСуществ + + None + + OnChange + НовыеИлиСохранитьСуществПриИзменении + + + НовыеИлиСохранитьСуществРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + НовыеИлиСохранитьСуществКонтекстноеМеню + 38 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Создать новый вариант отчета + + + 2 + + + + + ru + Сохранить в существующий вариант отчет + + + 1 + + + Vertical + + + + ПанельСправки + 66 + + Справка + 67 + true + true + + true + + + СправкаРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Панель справки</value> + + + ru + Панель справки + + true + + ПанельСправкиРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Группа</value> + + + ru + Группа + + + ГруппаРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ВариантыОтчета + 1 + true + true + + true + + + ВариантыОтчетовТ + + false + None + Add + Change + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + SelectAll + SortListAsc + SortListDesc + + Название + 10 + + <key>ru</key> + <value>Название</value> + + true + true + + true + + + ВариантыОтчетовТ.Представление + + + НазваниеРасширеннаяПодсказка + 92 + Label + true + true + + Left + + + + НазваниеКонтекстноеМеню + 11 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Ответственный + 46 + + <key>ru</key> + <value>Автор</value> + + true + true + + true + + + ВариантыОтчетовТ.Ответственный + + + ОтветственныйРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + + ОтветственныйКонтекстноеМеню + 47 + true + + InputField + Auto + true + Left + true + + 7 + true + true + true + true + true + true + Normal + + + Top + + ВариантыОтчетаКоманднаяПанель + 3 + + ВариантыОтчетаНайти + 63 + true + true + + true + + + ВариантыОтчетаНайтиРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + Form.Item.ВариантыОтчета.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ВариантыОтчетаОтменитьПоиск + 64 + true + true + + true + + + ВариантыОтчетаОтменитьПоискРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + Form.Item.ВариантыОтчета.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + ВариантыОтчетаВыбор + + + OnActivateRow + СписокНастроекПриАктивизацииСтроки + + + ВариантыОтчетаСтрокаПоиска + 83 + + ВариантыОтчетаСтрокаПоискаРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + ВариантыОтчетаСтрокаПоискаКонтекстноеМеню + 84 + true + + ВариантыОтчета + + true + + + + ВариантыОтчетаСостояниеПросмотра + 86 + + ВариантыОтчетаСостояниеПросмотраРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + ВариантыОтчетаСостояниеПросмотраКонтекстноеМеню + 87 + true + + ViewStatusAddition + ВариантыОтчета + + true + + + + ВариантыОтчетаУправлениеПоиском + 89 + + ВариантыОтчетаУправлениеПоискомРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + + ВариантыОтчетаУправлениеПоискомКонтекстноеМеню + 90 + true + + SearchControlAddition + ВариантыОтчета + + true + + + + ВариантыОтчетаРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + ВариантыОтчетаКонтекстноеМеню + 2 + true + + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + false + true + Auto + Auto + true + true + true + true + None + None + None + true + +
    + + ГруппаОписание + 58 + + КартинкаИнфо + 59 + + <key>ru</key> + <value>Картинка инфо</value> + + true + true + + true + + + КартинкаИнфоРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + КартинкаИнфоКонтекстноеМеню + 60 + true + + 2 + true + 1 + true + + + CommonPicture.Информация + + + + + ВариантыОтчетаОписание + 56 + true + true + + true + + + Items.ВариантыОтчета.CurrentData.Описание + + None + + ВариантыОтчетаОписаниеРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + + ВариантыОтчетаОписаниеКонтекстноеМеню + 57 + true + + LabelField + Auto + true + Left + true + + true + 2 + true + + + true + true + + true + + + <key>ru</key> + <value>Группа описание</value> + + + ru + Группа описание + + + ГруппаОписаниеРасширеннаяПодсказка + 104 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Сохранение сущ</value> + + + СохранениеСущРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + Page + + Vertical + auto + +
    + + Новый + 35 + + ГруппаСправка + 68 + + Справка1 + 69 + true + true + + true + + + Справка1РасширеннаяПодсказка + 110 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа справка</value> + + + ru + Группа справка + + + ГруппаСправкаРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + CommandBar + + Left + + + + НазваниеВараинтаОтчета + 6 + + <key>ru</key> + <value>Название</value> + + true + true + + true + + + ИмяСохраняемойНастройки + + + НазваниеВараинтаОтчетаРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + + НазваниеВараинтаОтчетаКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Автор + 54 + true + true + + true + + + Автор + + + АвторРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 55 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Описание + 42 + true + true + + true + + + Описание + + Top + + ОписаниеРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 43 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаПользователи + 48 + + НастроитьВидимостьВариантаУПользователя + 44 + + <key>ru</key> + <value>Быстрый доступ:</value> + + true + true + + true + + + НастроитьВидимостьВариантаУПользователяРасширеннаяПодсказка + 118 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастроитьВидимостьВариантаУПользователя + Normal + Auto + true + true + UserCmds + Auto + + + Использование + 52 + true + true + + true + + + ИспользованиеРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + + ИспользованиеКонтекстноеМеню + 53 + true + + Label + true + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа пользователи</value> + + + ru + Группа пользователи + + + ГруппаПользователиРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаПодсистемы + 51 + + НастроитьПодсистемы + 45 + + <key>ru</key> + <value>Разделы:</value> + + true + true + + true + + + НастроитьПодсистемыРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастроитьПодсистемы + Normal + Auto + true + true + UserCmds + Auto + + + Подсистемы + 49 + true + true + + true + + + ПодсистемыРасширеннаяПодсказка + 122 + Label + true + true + + Left + + + + ПодсистемыКонтекстноеМеню + 50 + true + + Label + true + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа подсистемы</value> + + + ru + Группа подсистемы + + + ГруппаПодсистемыРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + 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 + Конструктор + + + КонструкторРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Pages + + Auto + +
    + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаНазад + 41 + true + true + + true + + + ФормаНазадРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + Form.Command.Назад + Normal + Auto + true + true + UserCmds + Auto + + + ФормаДалее + 40 + true + true + + true + + + ФормаДалееРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + Form.Command.Далее + Normal + Auto + true + true + UserCmds + Auto + + + ФормаГотово + 39 + + <key>ru</key> + <value>Сохранить</value> + + true + true + + true + + + ФормаГотовоРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + Form.Command.Готово + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСоздании + + DontBlock + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + ВариантыОтчетовТ + + <key>ru</key> + <value>Варианты отчетов Т</value> + + 1 + + ValueTable + + + true + + + true + + true + + КлючОбъекта + + <key>ru</key> + <value>Ключ объекта</value> + + 1 + + String + + 150 + + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Представление</value> + + 2 + + String + + + + true + + + true + + + + Описание + + <key>ru</key> + <value>Описание</value> + + 4 + + String + + + + true + + + true + + + + Ответственный + + <key>ru</key> + <value>Ответственный</value> + + 5 + + CatalogRef.Пользователи + + + true + + + true + + + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 6 + + CatalogRef.ВариантыОтчетов + + + true + + + true + + + + Видимость + + <key>ru</key> + <value>Видимость</value> + + 3 + + Boolean + + + true + + + true + + + + ОтветственныйПредставление + + <key>ru</key> + <value>Ответственный</value> + + 7 + + String + + 500 + + + + true + + + true + + + + ТипВариантаОтчета + + <key>ru</key> + <value>Тип варианта отчета</value> + + 8 + + EnumRef.ТипыВариантовОтчетов + + + 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 + + CatalogRef.Пользователи + + + 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> + + 8 + + Boolean + + + true + + + true + + + + НастройкаВидимости + + <key>ru</key> + <value>Настройка видимости</value> + + 10 + + ValueTable + + + true + + + true + + + Пользователь + + <key>ru</key> + <value>Пользователь</value> + + 1 + + CatalogRef.Пользователи + + + true + + + true + + + + Видимость + + <key>ru</key> + <value>Видимость</value> + + 2 + + Boolean + + + true + + + true + + + + + Подсистемы + + <key>ru</key> + <value>Подсистемы</value> + + 11 + + 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 + + Boolean + + + true + + + true + + + + + Видимость + + <key>ru</key> + <value>Видимость</value> + + 9 + + Boolean + + + true + + + true + + + + ДеревоПодсистем + + <key>ru</key> + <value>Дерево подсистем</value> + + 12 + + ValueTree + + + 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 + + Boolean + + + true + + + true + + + + Использование + + <key>ru</key> + <value>Использование</value> + + 4 + + Boolean + + + true + + + true + + + + + НовыеИлиСохранитьСуществ + + <key>ru</key> + <value>Новые или сохранить существ</value> + + 13 + + Number + + 1 + + + + 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 + + Boolean + + + true + + + true + + + + Ключ + + <key>ru</key> + <value>Ключ</value> + + 4 + + String + + + + true + + + true + + + + + ВидимостьНастройкиВариантов + + <key>ru</key> + <value>Видимость настройки вариантов</value> + + 14 + + ValueTable + + + true + + + true + + + Пользователь + + <key>ru</key> + <value>Пользователь</value> + + 1 + + CatalogRef.Пользователи + + + 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> + + 15 + + CatalogRef.Пользователи + + + true + + + true + + + + Предопределенный + + <key>ru</key> + <value>Предопределенный</value> + + 16 + + Boolean + + + true + + + true + + + + ТипВариантаОтчета + + <key>ru</key> + <value>Тип варианта отчета</value> + + 17 + + EnumRef.ТипыВариантовОтчетов + + + true + + + true + + + + Вариант + + <key>ru</key> + <value>Вариант</value> + + 18 + + CatalogRef.ВариантыОтчетов + + + 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 + + + + Назад + + + Auto + Auto + + + НастроитьПодсистемы + + <key>ru</key> + <value>Разделы:</value> + + 7 + + ru + Настройка разделов + + + true + + + + НастроитьПодсистемы + + + Auto + Auto + + + КлючОбъекта + + + + КлючТекущихНастроек + + + + ТекущийПользователь + + CatalogRef.Пользователи + + + + + + +
    diff --git a/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/Help/ru.html b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/Help/ru.html new file mode 100644 index 000000000..958bea751 --- /dev/null +++ b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/Help/ru.html @@ -0,0 +1,9 @@ + +

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

    +

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

    +

    Удаление варианта отчета

    +

    Если требуется удалить не правильно сохраненный вариант отчета. Для этого требуется выделить в списке вариантов отчета нужный вариант и нажать кнопку "Удалить вариант отчета".

    +

    См. также: 

    +

    Загрузка вариантов отчета

    +

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

    +

    Пользовательские настройки варианта отчета

    \ No newline at end of file diff --git a/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/Module.bsl b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/Module.bsl new file mode 100644 index 000000000..82ec64276 --- /dev/null +++ b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/ФормаСохранения/Module.bsl @@ -0,0 +1,700 @@ +&НаСервере +Функция НайтиНастройкуПоИмени(ИмяСохраняемойНастройки) + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ВариантыОтчетов.КлючВарианта КАК КлючВарианта + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов + |ГДЕ + | ВариантыОтчетов.КлючОбъекта = &КлючОбъекта + | И (НЕ ВариантыОтчетов.ПометкаУдаления) + | И ВариантыОтчетов.Ссылка = &Ссылка"; + + Если ЕстьПравоИзменения и НЕ ЕстьПравоДобавления тогда + Запрос.Текст = " + | И (ВариантыОтчетов.Администратор = &Пользователь)"; + КонецЕсли; + + + Запрос.Параметры.Вставить("КлючОбъекта", КлючОбъекта); + Запрос.Параметры.Вставить("Ссылка", Вариант); + Запрос.Параметры.Вставить("Пользователь", ТекущийПользователь); + + УстановитьПривилегированныйРежим(истина); + РезультатЗапроса = Запрос.Выполнить(); + УстановитьПривилегированныйРежим(ложь); + + Если РезультатЗапроса.Пустой() Тогда + Возврат Неопределено; + Иначе + УстановитьПривилегированныйРежим(истина); + Выборка = РезультатЗапроса.Выбрать(); + УстановитьПривилегированныйРежим(ложь); + Выборка.Следующий(); + Возврат Выборка.КлючВарианта; + КонецЕсли; + +КонецФункции + +&НаСервере +Функция СоздатьНовуюНастройку(ИмяНастройки) + + УстановитьПривилегированныйРежим(истина); + Элемент = Справочники.ВариантыОтчетов.СоздатьЭлемент(); + Элемент.Наименование = ИмяНастройки; + Элемент.Описание = Описание; + Элемент.Администратор = Автор; + Элемент.КлючОбъекта = КлючОбъекта; + Элемент.КлючВарианта = Строка(Новый УникальныйИдентификатор()); + Элемент.ТипВариантаОтчета = Перечисления.ТипыВариантовОтчетов.Пользовательский; + + ИмяОтчета = СтрЗаменить(КлючОбъекта, "Отчет.", ""); + МетаданныеОтчета = Метаданные.Отчеты.Найти(ИмяОтчета); + Если МетаданныеОтчета <> Неопределено тогда + Элемент.ПредставлениеОбъекта = МетаданныеОтчета.Синоним; + КонецЕсли; + + Элемент.Видимость = Видимость; + Для каждого ЭлементПользователи из НастройкаВидимости Цикл + СтрокаПользователи = Элемент.НастройкаВидимости.Добавить(); + СтрокаПользователи.Пользователь = ЭлементПользователи.Пользователь; + КонецЦикла; + + Элемент.Подсистемы.Очистить(); + Для каждого ЭлементПользователи из Подсистемы Цикл + СтрокаПользователи = Элемент.Подсистемы.Добавить(); + СтрокаПользователи.Подсистема = ЭлементПользователи.Подсистема; + СтрокаПользователи.Название = ЭлементПользователи.Название; + СтрокаПользователи.Предопределенная = ЭлементПользователи.Предопределенная; + КонецЦикла; + + Элемент.Записать(); + Возврат Элемент.КлючВарианта; + УстановитьПривилегированныйРежим(ложь); + +КонецФункции + +&НаСервере +Функция РазрешеноИзменять(КодСохраняемойНастройки) + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1 + | ВариантыОтчетов.Ссылка КАК ССылка + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов + |ГДЕ + | ВариантыОтчетов.КлючОбъекта = &КлючОбъекта + | И ВариантыОтчетов.КлючВарианта = &КодСохраняемойНастройки + | И ВариантыОтчетов.Администратор = &Пользователь + | И (НЕ ВариантыОтчетов.ПометкаУдаления)"; + + Запрос.Параметры.Вставить("КлючОбъекта", КлючОбъекта); + Запрос.Параметры.Вставить("КодСохраняемойНастройки", КодСохраняемойНастройки); + Запрос.Параметры.Вставить("Пользователь", ТекущийПользователь); + УстановитьПривилегированныйРежим(истина); + РезультатЗапроса = Запрос.Выполнить(); + УстановитьПривилегированныйРежим(ложь); + + Возврат НЕ РезультатЗапроса.Пустой(); + +КонецФункции + +&НаКлиенте +Процедура СохранитьВыполнить() + + Если ИмяСохраняемойНастройки = "" тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не задано название варианта отчета.'"), ,"НазваниеВараинтаОтчета"); + Возврат; + КонецЕсли; + + Если НовыеИлиСохранитьСуществ = 1 тогда + + КодСохраняемойНастройки = НайтиНастройкуПоИмени(ИмяСохраняемойНастройки); + + Если КодСохраняемойНастройки <> Неопределено Тогда + // Уже была настройка с таким именем. Спросим у пользователя, нужно ли перезаписать старую настройку. + Если Не РазрешеноИзменять(КодСохраняемойНастройки) тогда + Предупреждение(НСтр("ru = 'Вам запрещено менять данный вариант отчета!'")); + Возврат; + КонецЕсли; + + ОбновитьНастройку(КодСохраняемойНастройки); + КонецЕсли; + Иначе + // Еще не было настройки с таким именем - сделаем новую + КодСохраняемойНастройки = СоздатьНовуюНастройку(ИмяСохраняемойНастройки); + Если КодСохраняемойНастройки = Неопределено тогда + Предупреждение(НСтр("ru = 'Вам запрещено сохранять свои варианты отчета.'")); + Возврат; + КонецЕсли; + + КонецЕсли; + + Закрыть(Новый ВыборНастроек(КодСохраняемойНастройки)); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьНастройку(КодСохраняемойНастройки) + + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетов.Ссылка + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов + |ГДЕ + | ВариантыОтчетов.КлючВарианта = &КлючВарианта + | И ВариантыОтчетов.КлючОбъекта = &КлючОбъекта"; + + Запрос = Новый Запрос(ТЗ); + Запрос.УстановитьПараметр("КлючВарианта", КодСохраняемойНастройки); + Запрос.УстановитьПараметр("КлючОбъекта", КлючОбъекта); + УстановитьПривилегированныйРежим(истина); + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() тогда + Элемент = Выборка.Ссылка.ПолучитьОбъект(); + Элемент.Описание = Описание; + Элемент.Наименование = ИмяСохраняемойНастройки; + + Элемент.Видимость = Видимость; + Элемент.НастройкаВидимости.Очистить(); + Для каждого ЭлементПользователи из НастройкаВидимости Цикл + СтрокаПользователи = Элемент.НастройкаВидимости.Добавить(); + СтрокаПользователи.Пользователь = ЭлементПользователи.Пользователь; + КонецЦикла; + + Элемент.Подсистемы.Очистить(); + Для каждого ЭлементПользователи из Подсистемы Цикл + СтрокаПользователи = Элемент.Подсистемы.Добавить(); + СтрокаПользователи.Подсистема = ЭлементПользователи.Подсистема; + СтрокаПользователи.Название = ЭлементПользователи.Название; + СтрокаПользователи.Предопределенная = ЭлементПользователи.Предопределенная; + КонецЦикла; + + Элемент.Записать(); + УстановитьПривилегированныйРежим(ложь); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ +// + +&НаСервере +Процедура ПриСоздании(Отказ, СтандартнаяОбработка) + + Перем КлючТекущихНастроек; + ЕстьПравоИзменения = ПравоДоступа("Добавление", Метаданные.Справочники.ВариантыОтчетов); + ЕстьПравоДобавления = ПравоДоступа("Изменение", Метаданные.Справочники.ВариантыОтчетов); + + Элементы.ФормаДалее.Доступность = Истина; + Элементы.ФормаНазад.Доступность = Ложь; + + + ТипВариантаОтчета = Перечисления.ТипыВариантовОтчетов.Предопределенный; + + НовыеИлиСохранитьСуществ = 1; + + КлючОбъекта = Параметры.КлючОбъекта; + КлючТекущихНастроек = Параметры.КлючТекущихНастроек; + ТекущийПользователь = ВариантыОтчетов.ТекущийПользователь(); + + ЗаполнитьСписок(); + + СтрокиТаблицы = ВариантыОтчетовТ.НайтиСтроки(Новый Структура("КлючОбъекта", КлючТекущихНастроек)); + Если СтрокиТаблицы.Количество() > 0 тогда + СтрокаСписка = СтрокиТаблицы[0]; + Описание = СтрокаСписка.Описание; + + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетовПодсистемы.Подсистема, + | ВариантыОтчетовПодсистемы.Название, + | ВариантыОтчетовПодсистемы.Предопределенная + |ИЗ + | Справочник.ВариантыОтчетов.Подсистемы КАК ВариантыОтчетовПодсистемы + |ГДЕ + | ВариантыОтчетовПодсистемы.Ссылка = &Вариант"; + + Запрос = Новый Запрос(ТЗ); + Запрос.УстановитьПараметр("Вариант", СтрокаСписка.Ссылка); + УстановитьПривилегированныйРежим(истина); + Выборка = Запрос.Выполнить().Выбрать(); + УстановитьПривилегированныйРежим(ложь); + + Пока Выборка.Следующий() Цикл + СтрокаПодсистемы = Подсистемы.Добавить(); + СтрокаПодсистемы.Подсистема = Выборка.Подсистема; + СтрокаПодсистемы.Название = Выборка.Название; + СтрокаПодсистемы.Предопределенная = Выборка.Предопределенная; + КонецЦикла; + + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетовПодсистемы.Подсистема, + | ВариантыОтчетовПодсистемы.Название, + | ВариантыОтчетовПодсистемы.Предопределенная, + | ВариантыОтчетовПодсистемы.Ссылка.КлючОбъекта + ""\"" + ВариантыОтчетовПодсистемы.Ссылка.КлючВарианта КАК Ключ + |ИЗ + | Справочник.ВариантыОтчетов.Подсистемы КАК ВариантыОтчетовПодсистемы + |ГДЕ + | ВариантыОтчетовПодсистемы.Ссылка.КлючОбъекта В(&КлючОбъекта)"; + + Запрос = Новый Запрос(ТЗ); + Запрос.УстановитьПараметр("КлючОбъекта", КлючОбъекта); + УстановитьПривилегированныйРежим(истина); + Выборка = Запрос.Выполнить().Выбрать(); + УстановитьПривилегированныйРежим(ложь); + + Пока Выборка.Следующий() Цикл + СтрокаПодсистемы = ПодсистемыВариантов.Добавить(); + СтрокаПодсистемы.Подсистема = Выборка.Подсистема; + СтрокаПодсистемы.Название = Выборка.Название; + СтрокаПодсистемы.Предопределенная = Выборка.Предопределенная; + СтрокаПодсистемы.Ключ = Выборка.Ключ; + КонецЦикла; + + + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетовНастройкаВидимости.Пользователь, + | (НЕ ВариантыОтчетовНастройкаВидимости.Ссылка.Видимость) КАК Видимость, + | ВариантыОтчетовНастройкаВидимости.Ссылка.Видимость КАК ВидимостьОбщая, + | ВариантыОтчетовНастройкаВидимости.Ссылка.КлючОбъекта + ""\"" + ВариантыОтчетовНастройкаВидимости.Ссылка.КлючВарианта КАК Ключ + |ИЗ + | Справочник.ВариантыОтчетов.НастройкаВидимости КАК ВариантыОтчетовНастройкаВидимости + |ГДЕ + | ВариантыОтчетовНастройкаВидимости.Ссылка.КлючОбъекта В(&КлючОбъекта)"; + + Запрос = Новый Запрос(ТЗ); + Запрос.УстановитьПараметр("КлючОбъекта", КлючОбъекта); + УстановитьПривилегированныйРежим(истина); + Выборка = Запрос.Выполнить().Выбрать(); + УстановитьПривилегированныйРежим(ложь); + + Пока Выборка.Следующий() Цикл + СтрокаПодсистемы = ВидимостьНастройкиВариантов.Добавить(); + СтрокаПодсистемы.Пользователь = Выборка.Пользователь; + СтрокаПодсистемы.Видимость = Выборка.Видимость; + СтрокаПодсистемы.Ключ = Выборка.Ключ; + КонецЦикла; + + Элементы.ВариантыОтчета.ТекущаяСтрока = СтрокаСписка.ПолучитьИдентификатор(); + КонецЕсли; + + ЗаполнитьПодсистемы(); + + СтрокаУО = ЭтаФорма.УсловноеОформление.Элементы[0]; + + ЗначениеОтбора = СтрокаУО.Отбор.Элементы[0]; + ЗначениеОтбора.ПравоеЗначение = ТекущийПользователь; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьПодсистемы() + + Для каждого Подсистема из Метаданные.Подсистемы Цикл + + Если Не Подсистема.ВключатьВКомандныйИнтерфейс тогда + Продолжить; + КонецЕсли; + + СтрокаПодсистемы = ДеревоПодсистем.ПолучитьЭлементы().Добавить(); + + СтрокаПодсистемы.ПутьКПодсистеме = Подсистема.Имя; + СтрокаПодсистемы.Название = Подсистема.Синоним; + + МассивСтрок = Подсистемы.НайтиСтроки(Новый Структура("Подсистема", СтрокаПодсистемы.ПутьКПодсистеме)); + СтрокаПодсистемы.Использование = МассивСтрок.Количество() > 0; + Если СтрокаПодсистемы.Использование тогда + СтрокаПодсистемы.Предопределенная = МассивСтрок[0].Предопределенная; + КонецЕсли; + + + ДобавитьДеревоПодсистем(Подсистема, СтрокаПодсистемы); + + КонецЦикла; + + ВиртуальныеПодсистемы = ВариантыОтчетов.ПолучитьВиртуальныеПодсистемы(Подсистема); + + Для каждого Подсистема из ВиртуальныеПодсистемы Цикл + + СтрокаПодсистемы = ДеревоПодсистем.Строки.Добавить(); + + СтрокаПодсистемы.ПутьКПодсистеме = Подсистема.Значение; + СтрокаПодсистемы.Название = Подсистема.Представлени; + + МассивСтрок = Подсистемы.НайтиСтроки(Новый Структура("Подсистема", Подсистема.Значение)); + СтрокаПодсистемы.Использование = МассивСтрок.Количество() > 0; + Если СтрокаПодсистемы.Использование тогда + СтрокаПодсистемы.Предопределенная = МассивСтрок[0].Предопределенная; + КонецЕсли; + + ДобавитьДеревоВиртуальныхПодсистем(Подсистема.Значение, СтрокаПодсистемы); + + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьДеревоПодсистем(Подсистема, СтрокаПодсистемы) + + Для каждого ПодсистемаПодчиненная из Подсистема.Подсистемы Цикл + + Если Не ПодсистемаПодчиненная.ВключатьВКомандныйИнтерфейс тогда + Продолжить; + КонецЕсли; + + СтрокаПодсистемыПодчиненой = СтрокаПодсистемы.ПолучитьЭлементы().Добавить(); + СтрокаПодсистемыПодчиненой.Название = ПодсистемаПодчиненная.Синоним; + МассивСтрок = Подсистемы.НайтиСтроки(Новый Структура("Подсистема", СтрокаПодсистемы.ПутьКПодсистеме + "\" + ПодсистемаПодчиненная.Имя)); + СтрокаПодсистемыПодчиненой.Использование = МассивСтрок.Количество() > 0; + Если СтрокаПодсистемыПодчиненой.Использование тогда + СтрокаПодсистемыПодчиненой.Предопределенная = МассивСтрок[0].Предопределенная; + КонецЕсли; + СтрокаПодсистемыПодчиненой.ПутьКПодсистеме = СтрокаПодсистемы.ПутьКПодсистеме + "\" + ПодсистемаПодчиненная.Имя; + ДобавитьДеревоПодсистем(ПодсистемаПодчиненная, СтрокаПодсистемыПодчиненой); + + КонецЦикла; + + ВиртуальныеПодсистемы = ВариантыОтчетов.ПолучитьВиртуальныеПодсистемы(СтрокаПодсистемы.ПутьКПодсистеме); + + Для каждого ПодсистемаПодчиненная из ВиртуальныеПодсистемы Цикл + + СтрокаПодсистемыПодчиненой = СтрокаПодсистемы.ПолучитьЭлементы().Добавить(); + СтрокаПодсистемыПодчиненой.Название = ПодсистемаПодчиненная.Представление; + МассивСтрок = Подсистемы.НайтиСтроки(Новый Структура("Подсистема", ПодсистемаПодчиненная.Значение)); + СтрокаПодсистемыПодчиненой.Использование = МассивСтрок.Количество() > 0; + Если СтрокаПодсистемыПодчиненой.Использование тогда + СтрокаПодсистемыПодчиненой.Предопределенная = МассивСтрок[0].Предопределенная; + КонецЕсли; + СтрокаПодсистемыПодчиненой.ПутьКПодсистеме = ПодсистемаПодчиненная.Значение; + ДобавитьДеревоВиртуальныхПодсистем(ПодсистемаПодчиненная.Значение, СтрокаПодсистемыПодчиненой); + + КонецЦикла; +КонецПроцедуры + +Процедура ДобавитьДеревоВиртуальныхПодсистем(Подсистема, СтрокаПодсистемы) + + ВиртуальныеПодсистемы = ВариантыОтчетов.ПолучитьВиртуальныеПодсистемы(Подсистема); + + Для каждого ПодсистемаПодчиненная из ВиртуальныеПодсистемы Цикл + + СтрокаПодсистемыПодчиненой = СтрокаПодсистемы.ПолучитьЭлементы().Добавить(); + СтрокаПодсистемыПодчиненой.Название = ПодсистемаПодчиненная.Представление; + МассивСтрок = Подсистемы.НайтиСтроки(Новый Структура("Подсистема", ПодсистемаПодчиненная.Значение)); + СтрокаПодсистемыПодчиненой.Использование = МассивСтрок.Количество() > 0; + Если СтрокаПодсистемыПодчиненой.Использование тогда + СтрокаПодсистемыПодчиненой.Предопределенная = МассивСтрок[0].Предопределенная; + КонецЕсли; + СтрокаПодсистемыПодчиненой.ПутьКПодсистеме = ПодсистемаПодчиненная.Значение; + ДобавитьДеревоВиртуальныхПодсистем(ПодсистемаПодчиненная.Значение, СтрокаПодсистемыПодчиненой); + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСписок() + + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ВариантыОтчетов.Ссылка КАК Ссылка, + | ВариантыОтчетов.Наименование КАК Наименование, + | ВариантыОтчетов.КлючОбъекта, + | ВариантыОтчетов.Администратор, + | ВариантыОтчетов.Администратор.Наименование КАК ОтветственныйПредставление, + | ВариантыОтчетов.КлючВарианта, + | ВариантыОтчетов.Описание, + | ВариантыОтчетов.Видимость, + | ВариантыОтчетов.ТипВариантаОтчета + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов + |ГДЕ + | ВариантыОтчетов.КлючОбъекта = &КлючОбъекта + | И (НЕ ВариантыОтчетов.ПометкаУдаления)"; + + Если ЕстьПравоИзменения и НЕ ЕстьПравоДобавления тогда + Запрос.Текст = " + | И (ВариантыОтчетов.Администратор = &Пользователь)"; + КонецЕсли; + + Запрос.Параметры.Вставить("КлючОбъекта", КлючОбъекта); + Запрос.Параметры.Вставить("Пользователь", ТекущийПользователь); + + УстановитьПривилегированныйРежим(истина); + РезультатЗапроса = Запрос.Выполнить(); + Выборка = РезультатЗапроса.Выбрать(); + УстановитьПривилегированныйРежим(ложь); + + ВариантыОтчетовТ.Очистить(); + Пока Выборка.Следующий() Цикл + Строкаварианта = ВариантыОтчетовТ.Добавить(); + Строкаварианта.КлючОбъекта = Выборка.КлючВарианта; + Строкаварианта.Представление = Выборка.Наименование; + Строкаварианта.Ответственный = Выборка.Администратор; + Строкаварианта.Ссылка = Выборка.Ссылка; + Строкаварианта.Описание = Выборка.Описание; + Строкаварианта.Видимость = Выборка.Видимость; + Строкаварианта.ТипВариантаОтчета = Выборка.ТипВариантаОтчета; + Строкаварианта.ОтветственныйПредставление = Выборка.ОтветственныйПредставление; + КонецЦикла; + + ВариантыОтчетовТ.Сортировать("Представление"); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокНастроекПриАктивизацииСтроки(Элемент) + Если Элементы.Конструктор.ТекущаяСтраница = Элементы.Новый тогда + Возврат; + КонецЕсли; + Если НовыеИлиСохранитьСуществ = 1 Тогда + Если Элемент.ТекущиеДанные <> Неопределено тогда + Если ТекущийПользователь <> Элемент.ТекущиеДанные.Ответственный тогда + Элементы.ФормаГотово.Доступность = ложь; + Элементы.ФормаДалее.Доступность = ложь; + Иначе + Элементы.ФормаГотово.Доступность = истина; + Элементы.ФормаДалее.Доступность = истина; + КонецЕсли; + Иначе + Элементы.ФормаГотово.Доступность = ложь; + Элементы.ФормаДалее.Доступность = ложь; + Элементы.ВариантыОтчета.Доступность = ложь; + КонецЕсли; + Иначе + Элементы.ФормаГотово.Доступность = ложь; + Элементы.ФормаДалее.Доступность = истина; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ВариантыОтчетаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + СохранитьВыполнить(); +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьВидимостьВариантаУПользователя(Команда) + + СписокПользователей = Новый СписокЗначений; + Для каждого СтрокаПользователь из НастройкаВидимости Цикл + СписокПользователей.Добавить(СтрокаПользователь.Пользователь, , Не Видимость); + КонецЦикла; + ПараметрыФормы = Новый Структура("Видимость, Пользователи", Видимость, СписокПользователей); + + Структура = ОткрытьФормуМодально("Справочник.ВариантыОтчетов.Форма.РедактированиеВидимости", ПараметрыФормы, ЭтаФорма); + Если Структура = Неопределено тогда + Возврат; + КонецЕсли; + + СписокПользователей = Структура.Пользователи; + + НастройкаВидимости.Очистить(); + + Видимость = Структура.Видимость; + Для каждого ЭлементПользователи из СписокПользователей Цикл + СтрокаПользователи = НастройкаВидимости.Добавить(); + СтрокаПользователи.Пользователь = ЭлементПользователи.Значение; + СтрокаПользователи.Видимость = ЭлементПользователи.Пометка; + КонецЦикла; + + Элементы.Использование.Заголовок = ОписаниеПользователей(); + +КонецПроцедуры + +&НаКлиенте +Процедура Далее(Команда) + + Если НовыеИлиСохранитьСуществ = 2 тогда + НастройкаВидимости.Очистить(); + ИмяСохраняемойНастройки = ""; + Видимость = Ложь; + Описание = ""; + Автор = ТекущийПользователь; + СтрокаПользователя = НастройкаВидимости.Добавить(); + СтрокаПользователя.Пользователь = ТекущийПользователь; + СтрокаПользователя.Видимость = истина; + Подсистемы.Очистить(); + Для каждого СтрокаПодсистемы из ДеревоПодсистем.ПолучитьЭлементы() Цикл + СтрокаПодсистемы.Использование = СтрокаПодсистемы.Предопределенная; + УстановитьГруппировкуПоУмолчанию(СтрокаПодсистемы, истина); + Если СтрокаПодсистемы.Использование тогда + СтрокаПодсистем = Подсистемы.Добавить(); + СтрокаПодсистем.Подсистема = СтрокаПодсистемы.ПутьКПодсистеме; + СтрокаПодсистем.Название = СтрокаПодсистемы.Название; + СтрокаПодсистем.Предопределенная = СтрокаПодсистемы.Предопределенная; + КонецЕсли; + КонецЦикла; + ИначеЕсли НовыеИлиСохранитьСуществ = 1 тогда + ИмяСохраняемойНастройки = Элементы.ВариантыОтчета.ТекущиеДанные.Представление; + Описание = Элементы.ВариантыОтчета.ТекущиеДанные.Описание; + Автор = Элементы.ВариантыОтчета.ТекущиеДанные.Ответственный; + Вариант = Элементы.ВариантыОтчета.ТекущиеДанные.Ссылка; + Если ТипВариантаОтчета = Элементы.ВариантыОтчета.ТекущиеДанные.ТипВариантаОтчета тогда + Элементы.Описание.ТолькоПросмотр = Истина; + КонецЕсли; + + Подсистемы.Очистить(); + + // устновить текущих пользователей + Видимость = Элементы.ВариантыОтчета.ТекущиеДанные.Видимость; + Для каждого СтрокаПодсистемы из ДеревоПодсистем.ПолучитьЭлементы() Цикл + МассивСтрок = ПодсистемыВариантов.НайтиСтроки(Новый Структура("Ключ, Подсистема", Элементы.ВариантыОтчета.ТекущиеДанные.КлючОбъекта, СтрокаПодсистемы.ПутьКПодсистеме)); + Если МассивСтрок.Количество() > 0 тогда + СтрокаПодсистемы.Использование = истина; + КонецЕсли; + УстановитьГруппировкуПоУмолчанию(СтрокаПодсистемы, ложь); + КонецЦикла; + + МассивСтрок = ВидимостьНастройкиВариантов.НайтиСтроки(Новый Структура("Ключ", КлючОбъекта + "\" + Элементы.ВариантыОтчета.ТекущиеДанные.КлючОбъекта)); + + НастройкаВидимости.Очистить(); + + Для каждого СтрокаПользователя из МассивСтрок Цикл + НоваяСтрока = НастройкаВидимости.Добавить(); + НоваяСтрока.Пользователь = СтрокаПользователя.Пользователь; + НоваяСтрока.Видимость = НЕ Видимость; + КонецЦикла; + + + + КонецЕсли; + + Элементы.Конструктор.ТекущаяСтраница = Элементы.Новый; + Элементы.ФормаДалее.Доступность = Ложь; + Элементы.ФормаНазад.Доступность = Истина; + Элементы.ФормаГотово.Доступность = Истина; + + Элементы.Подсистемы.Заголовок = ОписаниеПодсистем(); + Элементы.Использование.Заголовок = ОписаниеПользователей(); + +КонецПроцедуры + +&НаКлиенте +Функция ОписаниеПользователей() + + ОписаниеПользователя = ""; + Если Видимость тогда + ОписаниеПользователя = "все" + ?(НастройкаВидимости.Количество() > 0, " кроме: ", " "); + Иначе + ОписаниеПользователя = ""; + КонецЕсли; + Для каждого СтрокаПользователя из НастройкаВидимости Цикл + ОписаниеПользователя = ОписаниеПользователя + СтрокаПользователя.Пользователь + ", "; + КонецЦикла; + ОписаниеПользователя = Лев(ОписаниеПользователя, СтрДлина(ОписаниеПользователя)-2); + + Возврат ОписаниеПользователя; + +КонецФункции + +&НаКлиенте +Функция ОписаниеПодсистем() + + СписокПодсистем = ""; + + Для каждого Подсистема из Подсистемы Цикл + СписокПодсистем = СписокПодсистем + Подсистема.Название + ", "; + КонецЦикла; + + Возврат Лев(СписокПодсистем, СтрДлина(СписокПодсистем)-2) + +КонецФункции + +&НаКлиенте +Процедура УстановитьГруппировкуПоУмолчанию(СтрокаПодсистемы, Предопределенная = истина) + + Для каждого СтрокаПодсистемыПодчиненной из СтрокаПодсистемы.ПолучитьЭлементы() Цикл + Если НЕ Предопределенная тогда + МассивСтрок = ПодсистемыВариантов.НайтиСтроки(Новый Структура("Ключ, Подсистема", Элементы.ВариантыОтчета.ТекущиеДанные.КлючОбъекта, СтрокаПодсистемы.ПутьКПодсистеме)); + Если МассивСтрок.Количество() > 0 тогда + СтрокаПодсистемыПодчиненной.Использование = истина; + КонецЕсли; + Иначе + СтрокаПодсистемыПодчиненной.Использование = СтрокаПодсистемыПодчиненной.Предопределенная; + КонецЕсли; + Если СтрокаПодсистемыПодчиненной.Использование тогда + СтрокаПодсистем = Подсистемы.Добавить(); + СтрокаПодсистем.Подсистема = СтрокаПодсистемыПодчиненной.ПутьКПодсистеме; + СтрокаПодсистем.Название = СтрокаПодсистемыПодчиненной.Название; + СтрокаПодсистем.Предопределенная = СтрокаПодсистемыПодчиненной.Предопределенная; + КонецЕсли; + + УстановитьГруппировкуПоУмолчанию(СтрокаПодсистемыПодчиненной); + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура Назад(Команда) + + Элементы.Конструктор.ТекущаяСтраница = Элементы.СохранениеСущ; + Элементы.ФормаДалее.Доступность = Истина; + Элементы.ФормаНазад.Доступность = Ложь; + Элементы.Описание.ТолькоПросмотр = ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура Готово(Команда) + СохранитьВыполнить(); +КонецПроцедуры + +&НаКлиенте +Процедура НовыеИлиСохранитьСуществПриИзменении(Элемент) + ТекущиеДанные = Элементы.ВариантыОтчета.ТекущиеДанные; + Если НовыеИлиСохранитьСуществ = 1 Тогда + Если ТекущиеДанные <> Неопределено тогда + Если ТекущийПользователь <> ТекущиеДанные.Ответственный тогда + Элементы.ФормаГотово.Доступность = ложь; + Элементы.ФормаДалее.Доступность = ложь; + Иначе + Элементы.ФормаГотово.Доступность = Истина; + Элементы.ФормаДалее.Доступность = истина; + КонецЕсли; + Элементы.ВариантыОтчета.Доступность = истина; + Иначе + Элементы.ФормаГотово.Доступность = ложь; + Элементы.ФормаДалее.Доступность = ложь; + Элементы.ВариантыОтчета.Доступность = ложь; + КонецЕсли; + Иначе + Элементы.ФормаГотово.Доступность = ложь; + Элементы.ФормаДалее.Доступность = истина; + Элементы.ВариантыОтчета.Доступность = ложь; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьПодсистемы(Команда) + + ПараметрыФормы = Новый Структура("ДеревоПодсистем", ДеревоПодсистем); + + ВозвращаемыеПараметры = ОткрытьФормуМодально("Справочник.ВариантыОтчетов.Форма.РедактированиеПодсистемы", ПараметрыФормы, ЭтаФорма); + + Если ВозвращаемыеПараметры <> Неопределено тогда + Подсистемы.Очистить(); + Для каждого ОписаниеПодсистема из ВозвращаемыеПараметры.СписокПодсистем Цикл + СтрокаПодсистемы = Подсистемы.Добавить(); + СтрокаПодсистемы.Подсистема = ОписаниеПодсистема.Подсистема; + СтрокаПодсистемы.Название = ОписаниеПодсистема.Название; + СтрокаПодсистемы.Предопределенная = ОписаниеПодсистема.Предопределенная; + КонецЦикла; + + Элементы.Подсистемы.Заголовок = ОписаниеПодсистем(); + + ПоместитьДеревоЗначенийВформу(ВозвращаемыеПараметры.ДеревоПодсистем); + + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПоместитьДеревоЗначенийВформу(ДеревоПодсистем) + + ДеревоПодсистемЗначение = ДанныеФормыВЗначение(ДеревоПодсистем, Тип("ДеревоЗначений")); + ЗначениеВРеквизитФормы(ДеревоПодсистемЗначение, "ДеревоПодсистем"); + +КонецПроцедуры + + diff --git a/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/ManagerModule.bsl b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/ManagerModule.bsl new file mode 100644 index 000000000..3cf3a588c --- /dev/null +++ b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/ManagerModule.bsl @@ -0,0 +1,113 @@ + +Процедура ОбработкаЗагрузки(КлючОбъекта, КлючНастроек, Настройки, ОписаниеНастроек, Пользователь) + + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетов.Наименование, + | ВариантыОтчетов.ХранилищеЗначений + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов + |ГДЕ + | ВариантыОтчетов.КлючОбъекта = &КлючОбъекта + | И ВариантыОтчетов.КлючВарианта = &КлючВарианта"; + + Запрос = Новый Запрос(ТЗ); + Запрос.УстановитьПараметр("КлючОбъекта", КлючОбъекта); + Запрос.УстановитьПараметр("КлючВарианта", КлючНастроек); + + УстановитьПривилегированныйРежим(истина); + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + ОписаниеНастроек.Представление = Выборка.Наименование; + Настройки = Выборка.ХранилищеЗначений.Получить(); + КонецЕсли; + УстановитьПривилегированныйРежим(ложь); + +КонецПроцедуры + +Процедура ОбработкаСохранения(КлючОбъекта, КлючНастроек, Настройка, ОписаниеНастроек, Пользователь) + + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетов.Ссылка + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов + |ГДЕ + | ВариантыОтчетов.КлючОбъекта = &КлючОбъекта + | И ВариантыОтчетов.КлючВарианта = &КлючВарианта"; + + Запрос = Новый Запрос(ТЗ); + Запрос.УстановитьПараметр("КлючОбъекта", КлючОбъекта); + Запрос.УстановитьПараметр("КлючВарианта", КлючНастроек); + УстановитьПривилегированныйРежим(истина); + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + НастройкаОбъект = Выборка.Ссылка.ПолучитьОбъект(); + НастройкаОбъект.ХранилищеЗначений = Новый ХранилищеЗначения(Настройка, Новый СжатиеДанных()); + Если ОписаниеНастроек <> Неопределено Тогда + НастройкаОбъект.Наименование = ОписаниеНастроек.Представление; + КонецЕсли; + НастройкаОбъект.Записать(); + КонецЕсли; + УстановитьПривилегированныйРежим(ложь); + +КонецПроцедуры + +Процедура ОбработкаПолученияОписания(КлючОбъекта, КлючНастроек, ОписаниеНастроек, Пользователь) + + ОписаниеНастроек.КлючОбъекта = КлючОбъекта; + ОписаниеНастроек.КлючНастроек = КлючНастроек; + + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетов.Ссылка, + | ВариантыОтчетов.Наименование + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов + |ГДЕ + | ВариантыОтчетов.КлючОбъекта = &КлючОбъекта + | И ВариантыОтчетов.КлючВарианта = &КлючВарианта"; + + Запрос = Новый Запрос(ТЗ); + Запрос.УстановитьПараметр("КлючОбъекта", КлючОбъекта); + Запрос.УстановитьПараметр("КлючВарианта", КлючНастроек); + УстановитьПривилегированныйРежим(истина); + Выборка = Запрос.Выполнить().Выбрать(); + УстановитьПривилегированныйРежим(ложь); + + Если Выборка.Следующий() Тогда + ВариантОтчета = Выборка.Ссылка; + Если Не ВариантОтчета.Пустая() Тогда + ОписаниеНастроек.Представление = Выборка.Наименование; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработкаУстановкиОписания(КлючОбъекта, КлючНастроек, ОписаниеНастроек, Пользователь) + ТЗ = "ВЫБРАТЬ + | ВариантыОтчетов.Ссылка + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетов + |ГДЕ + | ВариантыОтчетов.КлючОбъекта = &КлючОбъекта + | И ВариантыОтчетов.КлючВарианта = &КлючВарианта"; + + Запрос = Новый Запрос(ТЗ); + Запрос.УстановитьПараметр("КлючОбъекта", КлючОбъекта); + Запрос.УстановитьПараметр("КлючВарианта", КлючНастроек); + УстановитьПривилегированныйРежим(истина); + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + Ссылка = Выборка.Ссылка; + Если Не Ссылка.Пустая() Тогда + НастройкаОбъект = Ссылка.ПолучитьОбъект(); + НастройкаОбъект.Наименование = ОписаниеНастроек.Представление; + НастройкаОбъект.Записать(); + КонецЕсли; + КонецЕсли; + УстановитьПривилегированныйРежим(ложь); + +КонецПроцедуры + + diff --git a/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/ХранилищеВариантовОтчетов.mdo b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/ХранилищеВариантовОтчетов.mdo new file mode 100644 index 000000000..078052ecf --- /dev/null +++ b/SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/ХранилищеВариантовОтчетов.mdo @@ -0,0 +1,41 @@ + + + + + + ХранилищеВариантовОтчетов + + ru + Хранилище вариантов отчетов + + SettingsStorage.ХранилищеВариантовОтчетов.Form.ФормаСохранения + SettingsStorage.ХранилищеВариантовОтчетов.Form.ФормаЗагрузки + + ФормаСохранения + + ru + Форма сохранения + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаЗагрузки + + ru + Форма загрузки + + + + ru + + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/StyleItems/ВыполненнаяЗадача/ВыполненнаяЗадача.mdo b/SSL/src/StyleItems/ВыполненнаяЗадача/ВыполненнаяЗадача.mdo new file mode 100644 index 000000000..47db350f0 --- /dev/null +++ b/SSL/src/StyleItems/ВыполненнаяЗадача/ВыполненнаяЗадача.mdo @@ -0,0 +1,13 @@ + + + ВыполненнаяЗадача + + ru + Выполненная задача + + + + Web.DarkSlateGray + + + diff --git a/SSL/src/StyleItems/ЗавершенныйБизнесПроцесс/ЗавершенныйБизнесПроцесс.mdo b/SSL/src/StyleItems/ЗавершенныйБизнесПроцесс/ЗавершенныйБизнесПроцесс.mdo new file mode 100644 index 000000000..0b7d4da2d --- /dev/null +++ b/SSL/src/StyleItems/ЗавершенныйБизнесПроцесс/ЗавершенныйБизнесПроцесс.mdo @@ -0,0 +1,13 @@ + + + ЗавершенныйБизнесПроцесс + + ru + Завершенный бизнес-процесс + + + + Web.Gray + + + diff --git a/SSL/src/StyleItems/НеСтартованныйБизнесПроцесс/НеСтартованныйБизнесПроцесс.mdo b/SSL/src/StyleItems/НеСтартованныйБизнесПроцесс/НеСтартованныйБизнесПроцесс.mdo new file mode 100644 index 000000000..4217a58d4 --- /dev/null +++ b/SSL/src/StyleItems/НеСтартованныйБизнесПроцесс/НеСтартованныйБизнесПроцесс.mdo @@ -0,0 +1,13 @@ + + + НеСтартованныйБизнесПроцесс + + ru + Не стартованный бизнес-процесс + + + + Web.FireBrick + + + diff --git a/SSL/src/StyleItems/ПользовательВыбранный/ПользовательВыбранный.mdo b/SSL/src/StyleItems/ПользовательВыбранный/ПользовательВыбранный.mdo new file mode 100644 index 000000000..04fde5024 --- /dev/null +++ b/SSL/src/StyleItems/ПользовательВыбранный/ПользовательВыбранный.mdo @@ -0,0 +1,13 @@ + + + ПользовательВыбранный + + ru + Пользователь выбранный + + + + Web.Gainsboro + + + diff --git a/SSL/src/StyleItems/ПоясняющийОшибкуТекст/ПоясняющийОшибкуТекст.mdo b/SSL/src/StyleItems/ПоясняющийОшибкуТекст/ПоясняющийОшибкуТекст.mdo new file mode 100644 index 000000000..6239f6925 --- /dev/null +++ b/SSL/src/StyleItems/ПоясняющийОшибкуТекст/ПоясняющийОшибкуТекст.mdo @@ -0,0 +1,13 @@ + + + ПоясняющийОшибкуТекст + + ru + Поясняющий ошибку текст + + + + Style.SpecialTextColor + + + diff --git a/SSL/src/StyleItems/ПоясняющийТекст/ПоясняющийТекст.mdo b/SSL/src/StyleItems/ПоясняющийТекст/ПоясняющийТекст.mdo new file mode 100644 index 000000000..0a37816fa --- /dev/null +++ b/SSL/src/StyleItems/ПоясняющийТекст/ПоясняющийТекст.mdo @@ -0,0 +1,16 @@ + + + ПоясняющийТекст + + ru + Поясняющий текст + + Оформление справочного текста в форме + + + 25 + 85 + 174 + + + diff --git a/SSL/src/StyleItems/ПросроченнаяЗадача/ПросроченнаяЗадача.mdo b/SSL/src/StyleItems/ПросроченнаяЗадача/ПросроченнаяЗадача.mdo new file mode 100644 index 000000000..5aa78c3f7 --- /dev/null +++ b/SSL/src/StyleItems/ПросроченнаяЗадача/ПросроченнаяЗадача.mdo @@ -0,0 +1,13 @@ + + + ПросроченнаяЗадача + + ru + Просроченная задача + + + + Web.Maroon + + + diff --git a/SSL/src/StyleItems/РольБезИсполнителей/РольБезИсполнителей.mdo b/SSL/src/StyleItems/РольБезИсполнителей/РольБезИсполнителей.mdo new file mode 100644 index 000000000..6e9eff949 --- /dev/null +++ b/SSL/src/StyleItems/РольБезИсполнителей/РольБезИсполнителей.mdo @@ -0,0 +1,14 @@ + + + РольБезИсполнителей + + ru + Роль без исполнителей + + Роль исполнителей задач, на которую не назначено ни одного исполнителя + + + Web.Maroon + + + diff --git a/SSL/src/StyleItems/УдаленныйДополнительныйРеквизитЦвет/УдаленныйДополнительныйРеквизитЦвет.mdo b/SSL/src/StyleItems/УдаленныйДополнительныйРеквизитЦвет/УдаленныйДополнительныйРеквизитЦвет.mdo new file mode 100644 index 000000000..e24bee961 --- /dev/null +++ b/SSL/src/StyleItems/УдаленныйДополнительныйРеквизитЦвет/УдаленныйДополнительныйРеквизитЦвет.mdo @@ -0,0 +1,13 @@ + + + УдаленныйДополнительныйРеквизитЦвет + + ru + Удаленный дополнительный реквизит цвет + + + + 255 + + + diff --git a/SSL/src/StyleItems/УдаленныйДополнительныйРеквизитШрифт/УдаленныйДополнительныйРеквизитШрифт.mdo b/SSL/src/StyleItems/УдаленныйДополнительныйРеквизитШрифт/УдаленныйДополнительныйРеквизитШрифт.mdo new file mode 100644 index 000000000..a5f9a2222 --- /dev/null +++ b/SSL/src/StyleItems/УдаленныйДополнительныйРеквизитШрифт/УдаленныйДополнительныйРеквизитШрифт.mdo @@ -0,0 +1,18 @@ + + + УдаленныйДополнительныйРеквизитШрифт + + ru + Удаленный дополнительный реквизит шрифт + + Font + + + Style.TextFont + false + false + false + true + + + diff --git a/SSL/src/StyleItems/ФайлЗанятыйДругимПользователем/ФайлЗанятыйДругимПользователем.mdo b/SSL/src/StyleItems/ФайлЗанятыйДругимПользователем/ФайлЗанятыйДругимПользователем.mdo new file mode 100644 index 000000000..2ff33d07e --- /dev/null +++ b/SSL/src/StyleItems/ФайлЗанятыйДругимПользователем/ФайлЗанятыйДругимПользователем.mdo @@ -0,0 +1,13 @@ + + + ФайлЗанятыйДругимПользователем + + ru + Файл занятый другим пользователем + + + + Web.Gray + + + diff --git a/SSL/src/StyleItems/ФайлЗанятыйТекущимПользователем/ФайлЗанятыйТекущимПользователем.mdo b/SSL/src/StyleItems/ФайлЗанятыйТекущимПользователем/ФайлЗанятыйТекущимПользователем.mdo new file mode 100644 index 000000000..bc5d6c772 --- /dev/null +++ b/SSL/src/StyleItems/ФайлЗанятыйТекущимПользователем/ФайлЗанятыйТекущимПользователем.mdo @@ -0,0 +1,13 @@ + + + ФайлЗанятыйТекущимПользователем + + ru + Файл занятый текущим пользователем + + + + Web.Green + + + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/АдресныйКлассификатор/АдресныйКлассификатор.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/АдресныйКлассификатор/АдресныйКлассификатор.mdo new file mode 100644 index 000000000..c30882aba --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/АдресныйКлассификатор/АдресныйКлассификатор.mdo @@ -0,0 +1,15 @@ + + + АдресныйКлассификатор + + ru + Адресный классификатор + + CommonModule.АдресныйКлассификаторКлиент + InformationRegister.АдресныеСокращения + InformationRegister.АдресныйКлассификатор + InformationRegister.ВерсииОбъектовАдресногоКлассификатора + CommonModule.АдресныйКлассификатор + CommonModule.АдресныйКлассификаторКлиентСервер + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Анкетирование/CommandInterface.cmi b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Анкетирование/CommandInterface.cmi new file mode 100644 index 000000000..5acd3b8ba --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Анкетирование/CommandInterface.cmi @@ -0,0 +1,9 @@ + + + + + Catalog.ВопросыШаблонаАнкеты.StandardCommand.OpenList + + + + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Анкетирование/Анкетирование.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Анкетирование/Анкетирование.mdo new file mode 100644 index 000000000..4a6b15de2 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Анкетирование/Анкетирование.mdo @@ -0,0 +1,44 @@ + + + Анкетирование + + ru + Анкетирование + + Enum.ТипыОтветовНаВопрос + ChartOfCharacteristicTypes.ВопросыДляАнкетирования + Constant.ИспользоватьАнкетирование + Catalog.ВариантыОтветовАнкет + Catalog.ШаблоныАнкет + Enum.ТипыВопросовШаблонаАнкеты + Enum.ТипыТабличныхВопросов + Catalog.ВопросыШаблонаАнкеты + Document.НазначениеОпросов + Document.Анкета + InformationRegister.ОтветыНаВопросыАнкет + CommonModule.Анкетирование + CommonModule.АнкетированиеКлиент + CommonModule.АнкетированиеКлиентСервер + Report.АнализОпроса + CommonPicture.ПодсистемаАнкетирование + CommonPicture.КоллекцияКартинокДеревоАнкеты + CommonPicture.ДобавитьРазделАнкеты + CommonPicture.ДобавитьПростойВопрос + CommonPicture.ДобавитьУсловныйВопрос + CommonPicture.ДобавитьТабличныйВопрос + CommonCommand.СписокРеспондента + CommonPicture.ПревьюТабличногоВопросаОтветыВСтроках + CommonPicture.ПревьюТабличногоВопросаСоставной + CommonPicture.ПревьюТабличногоВопросаОтветыВКолонках + CommonPicture.ПревьюТабличногоВопросаОтветыСтрокиИКолонки + CommonForm.МастерАнкетыПоРазделам + DataProcessor.СписокРеспондента + Report.АнкетированиеАналитическийОтчет + CommonPicture.КоллекцияКартинокДоступныеАнкеты + CommonPicture.АрхивАнкета + Role.ЧтениеОтветовНаВопросыАнкет + Role.ДобавлениеИзменениеОтветовНаВопросыАнкет + Role.ДобавлениеИзменениеШаблоновАнкет + Role.ДобавлениеИзменениеОпросов + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БазоваяФункциональность/БазоваяФункциональность.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БазоваяФункциональность/БазоваяФункциональность.mdo new file mode 100644 index 000000000..375a4cad0 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БазоваяФункциональность/БазоваяФункциональность.mdo @@ -0,0 +1,53 @@ + + + БазоваяФункциональность + + ru + Базовая функциональность + + CommonModule.ОбщегоНазначения + CommonModule.ОбщегоНазначенияКлиент + CommonModule.ОбщегоНазначенияКлиентСервер + CommonModule.СтандартныеПодсистемыКлиентПовтИсп + CommonModule.СтандартныеПодсистемыПереопределяемый + CommonModule.СтроковыеФункцииКлиентСервер + CommonForm.ВыборОбъектовМетаданных + CommonPicture.Информация32 + CommonPicture.КоллекцияВидыАктивныхПользователей + CommonPicture.КоллекцияВидыСобытийЖурналаРегистрации + CommonPicture.КоллекцияДляПомеченныхНаУдалениеОбъектов + CommonPicture.Ошибка32 + CommonPicture.ПодсистемаАдминистрирование + CommonPicture.Предупреждение32 + CommonPicture.РазорватьСоединение + Constant.ЗаголовокСистемы + DataProcessor.ЖурналРегистрации + DataProcessor.УдалениеПомеченныхОбъектов + CommonModule.ОбщегоНазначенияПереопределяемый + Role.ВыводНаПринтерФайлБуферОбмена + Role.ДобавлениеИзменениеБазовойНСИ + Role.ЗапускAutomation + Role.ЗапускВебКлиента + Role.ЗапускВнешнегоСоединения + Role.ЗапускТолстогоКлиента + Role.ЗапускТонкогоКлиента + Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок + Role.ОбновлениеКонфигурацииБазыДанных + Role.ПросмотрЖурналаРегистрации + Role.ЧтениеБазовойНСИ + Role.Администрирование + Role.ПолныеПрава + CommonCommand.УстановитьРасширениеРаботыСФайлами + Role.БазовыеПрава + StyleItem.ПоясняющийТекст + CommonModule.ОбщегоНазначенияКлиентПовтИсп + SessionParameter.ПредлагатьУстановкуРасширенияРаботыСФайлами + CommonForm.ВопросОбУстановкеРасширенияРаботыСФайлами + DataProcessor.УправлениеНастройкамиФорм + CommonPicture.Информация + CommonPicture.КоллекцияПиктограммЭлементов + DataProcessor.ГрупповоеИзменениеОбъектов + StyleItem.ПоясняющийОшибкуТекст + CommonPicture.ВидыОпераций + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БизнесПроцессыИЗадачи/CommandInterface.cmi b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БизнесПроцессыИЗадачи/CommandInterface.cmi new file mode 100644 index 000000000..4507cd295 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БизнесПроцессыИЗадачи/CommandInterface.cmi @@ -0,0 +1,11 @@ + + + + + BusinessProcess.Задание.StandardCommand.Create + + true + + + + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БизнесПроцессыИЗадачи/БизнесПроцессыИЗадачи.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БизнесПроцессыИЗадачи/БизнесПроцессыИЗадачи.mdo new file mode 100644 index 000000000..e6a519d43 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БизнесПроцессыИЗадачи/БизнесПроцессыИЗадачи.mdo @@ -0,0 +1,55 @@ + + + БизнесПроцессыИЗадачи + + ru + Бизнес-процессы и задачи + + CommonPicture.ПодсистемаБизнесПроцессыИЗадачи + CommonModule.БизнесПроцессыИЗадачиКлиент + CommonModule.БизнесПроцессыИЗадачиПереопределяемый + CommonModule.БизнесПроцессыИЗадачиСервер + EventSubscription.ЗаписатьВСписокБизнесПроцессов + ScheduledJob.МониторингЗадач + ScheduledJob.УведомлениеИсполнителейОНовыхЗадачах + Constant.ДатаУведомленияОНовыхЗадачах + Constant.ИспользоватьБизнесПроцессыИЗадачи + Catalog.РолиИсполнителей + Enum.ВариантыВажностиЗадачи + Report.СписокИстекающихЗадач + Report.СписокПросроченныхЗадач + Report.СправкаОбИсполнительскойДисциплине + Report.Задачи + Report.СписокЗависшихЗадач + DataProcessor.КартаМаршрутаБизнесПроцесса + InformationRegister.ИсполнителиЗадач + InformationRegister.СписокБизнесПроцессов + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач + CommonCommand.ЗадачиПоПредмету + CommonCommand.РолеваяАдресацияПоОбъекту + BusinessProcess.Задание + Task.ЗадачаИсполнителя + Subsystem.СтандартныеПодсистемы.Subsystem.БизнесПроцессыИЗадачи + CommonModule.БизнесПроцессыИЗадачиСобытия + Constant.ИзменятьЗаданияЗаднимЧислом + StyleItem.ВыполненнаяЗадача + StyleItem.ПросроченнаяЗадача + CommonCommand.ЗадачиПоБизнесПроцессу + CommonCommand.КартаМаршрутаБизнесПроцесса + CommonPicture.КоллекцияВариантыВажностиЗадачи + Constant.ИспользоватьДатуИВремяВСрокахЗадач + Role.ДобавлениеИзменениеРолейИсполнителей + Constant.ИспользоватьДатуНачалаЗадач + StyleItem.ЗавершенныйБизнесПроцесс + StyleItem.НеСтартованныйБизнесПроцесс + Report.ОтчетПоБизнесПроцессам + Report.ОтчетПоЗаданиям + EventSubscription.УстановитьПометкуУдаленияЗадач + Catalog.ГруппыИсполнителейЗадач + Role.ДобавлениеИзменениеЗаданий + Role.ЧтениеЗаданий + Role.ИзменениеВыполнениеЗадач + StyleItem.РольБезИсполнителей + Role.ЧтениеЗадач + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Валюты/Валюты.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Валюты/Валюты.mdo new file mode 100644 index 000000000..fdc6d6f91 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Валюты/Валюты.mdo @@ -0,0 +1,16 @@ + + + Валюты + + ru + Валюты + + CommonModule.РаботаСКурсамиВалютСобытия + ScheduledJob.ЗагрузкаКурсовВалют + Catalog.Валюты + DataProcessor.КурсыВалютРБК + InformationRegister.КурсыВалют + CommonModule.РаботаСКурсамиВалют + CommonModule.РаботаСКурсамиВалютКлиентСервер + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВариантыОтчетов/ВариантыОтчетов.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВариантыОтчетов/ВариантыОтчетов.mdo new file mode 100644 index 000000000..1fe22d53e --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВариантыОтчетов/ВариантыОтчетов.mdo @@ -0,0 +1,23 @@ + + + ВариантыОтчетов + + ru + Варианты отчетов + + SettingsStorage.ХранилищеВариантовОтчетов + CommonModule.ВариантыОтчетов + Catalog.ВариантыОтчетов + Subsystem.СтандартныеПодсистемы.Subsystem.ВариантыОтчетов + Enum.ТипыВариантовОтчетов + CommonForm.ПанельОтчетов + CommonModule.ВариантыОтчетовПереопределяемый + CommonModule.ВариантыОтчетовКлиент + CommonForm.ВсеОтчеты + CommonModule.ВариантыОтчетовКлиентПереопределяемый + Role.ДобавлениеИзменениеВариантовОтчетов + CommonPicture.Информация + CommonPicture.ЗакрепитьВариантОтчета + CommonPicture.ОткрепитьВариантОтчета + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВерсионированиеОбъектов/ВерсионированиеОбъектов.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВерсионированиеОбъектов/ВерсионированиеОбъектов.mdo new file mode 100644 index 000000000..43558e73b --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВерсионированиеОбъектов/ВерсионированиеОбъектов.mdo @@ -0,0 +1,18 @@ + + + ВерсионированиеОбъектов + + ru + Версионирование объектов + + CommonPicture.ИсторияВерсий + CommonModule.ВерсионированиеОбъектовСобытия + Constant.ИспользоватьВерсионированиеОбъектов + Enum.ВариантыВерсионированияОбъектов + Report.ОтчетПоВерсиям + InformationRegister.ВерсииОбъектов + InformationRegister.НастройкаВерсионированияОбъектов + CommonCommand.ИсторияИзменений + CommonModule.ВерсионированиеОбъектов + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo new file mode 100644 index 000000000..6142590a1 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ДополнительныеОтчетыИОбработки/ДополнительныеОтчетыИОбработки.mdo @@ -0,0 +1,28 @@ + + + ДополнительныеОтчетыИОбработки + + ru + Дополнительные отчеты и обработки + + CommonCommand.ДополнительныеОтчетыИОбработкиПечатныеФормы + CommonForm.ДополнительныеОтчетыИОбработки + Enum.ВидыДополнительныхОтчетовИОбработок + CommonCommand.ДополнительныеОтчетыИОбработкиОтчеты + CommonCommand.ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта + CommonCommand.ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов + InformationRegister.НазначениеДополнительныхОбработок + Catalog.ДополнительныеОтчетыИОбработки + Role.ИспользованиеДополнительныхОтчетовИОбработок + CommonModule.ДополнительныеОтчетыИОбработки + CommonModule.ДополнительныеОтчетыИОбработкиКлиент + Enum.СпособыВызоваДополнительныхОбработок + Role.ДобавлениеИзменениеДополнительныхОтчетовИОбработок + CommonModule.ДополнительныеОтчетыИОбработкиКлиентСервер + Enum.ВариантыПубликацииДополнительныхОтчетовИОбработок + ScheduledJob.ЗапускДополнительныхОбработок + InformationRegister.ПользовательскиеНастройкиДоступаКОбработкам + CommonModule.ДополнительныеОтчетыИОбработкиПереопределяемый + CommonForm.НастройкаМоихОтчетовИОбработок + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗавершениеРаботыПользователей/CommandInterface.cmi b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗавершениеРаботыПользователей/CommandInterface.cmi new file mode 100644 index 000000000..d35dc9645 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗавершениеРаботыПользователей/CommandInterface.cmi @@ -0,0 +1,9 @@ + + + + + DataProcessor.БлокировкаСоединенийСИнформационнойБазой.StandardCommand.Open + + + + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗавершениеРаботыПользователей/ЗавершениеРаботыПользователей.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗавершениеРаботыПользователей/ЗавершениеРаботыПользователей.mdo new file mode 100644 index 000000000..9643b22e5 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗавершениеРаботыПользователей/ЗавершениеРаботыПользователей.mdo @@ -0,0 +1,17 @@ + + + ЗавершениеРаботыПользователей + + ru + Завершение работы пользователей + + CommonModule.СоединенияИБ + CommonModule.СоединенияИБГлобальный + CommonModule.СоединенияИБКлиент + Constant.ПараметрыАдминистрированияИБ + DataProcessor.БлокировкаСоединенийСИнформационнойБазой + CommonModule.СоединенияИБКлиентСервер + DataProcessor.АктивныеПользователи + CommonForm.ПараметрыАдминистрированияСервернойИБ + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗапретРедактированияРеквизитовОбъектов/ЗапретРедактированияРеквизитовОбъектов.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗапретРедактированияРеквизитовОбъектов/ЗапретРедактированияРеквизитовОбъектов.mdo new file mode 100644 index 000000000..a3b0fbbd5 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗапретРедактированияРеквизитовОбъектов/ЗапретРедактированияРеквизитовОбъектов.mdo @@ -0,0 +1,14 @@ + + + ЗапретРедактированияРеквизитовОбъектов + + ru + Запрет редактирования реквизитов объектов + + Role.РедактированиеРеквизитовОбъектов + CommonModule.ЗапретРедактированияРеквизитовОбъектовКлиент + Subsystem.СтандартныеПодсистемы.Subsystem.ЗапретРедактированияРеквизитовОбъектов + CommonPicture.РазрешитьРедактированиеРеквизитовОбъекта + CommonModule.ЗапретРедактированияРеквизитовОбъектов + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КалендарныеГрафики/КалендарныеГрафики.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КалендарныеГрафики/КалендарныеГрафики.mdo new file mode 100644 index 000000000..444c8f9d4 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КалендарныеГрафики/КалендарныеГрафики.mdo @@ -0,0 +1,13 @@ + + + КалендарныеГрафики + + ru + Календарные графики + + Catalog.Календари + InformationRegister.КалендарныеГрафики + Subsystem.СтандартныеПодсистемы.Subsystem.КалендарныеГрафики + CommonModule.КалендарныеГрафики + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтактнаяИнформация/КонтактнаяИнформация.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтактнаяИнформация/КонтактнаяИнформация.mdo new file mode 100644 index 000000000..20bce69f7 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтактнаяИнформация/КонтактнаяИнформация.mdo @@ -0,0 +1,24 @@ + + + КонтактнаяИнформация + + ru + Контактная информация + + CommonPicture.КонтактнаяИнформация + CommonModule.УправлениеКонтактнойИнформациейКлассификаторы + CommonModule.УправлениеКонтактнойИнформациейКлиент + CommonModule.УправлениеКонтактнойИнформациейПереопределяемый + CommonModule.УправлениеКонтактнойИнформацией + CommonForm.ПоискПоИндексу + CommonForm.ВводАдреса + CommonForm.ВводТелефона + Catalog.ВидыКонтактнойИнформации + Catalog.СтраныМира + Enum.ТипыКонтактнойИнформации + Subsystem.СтандартныеПодсистемы.Subsystem.КонтактнаяИнформация + CommonModule.УправлениеКонтактнойИнформациейКлассификаторыКлиент + EventSubscription.ЗаполнитьКонтактнуюИнформацию + CommonModule.УправлениеКонтактнойИнформациейСобытия + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтрольДинамическогоОбновленияКонфигурации/КонтрольДинамическогоОбновленияКонфигурации.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтрольДинамическогоОбновленияКонфигурации/КонтрольДинамическогоОбновленияКонфигурации.mdo new file mode 100644 index 000000000..67cd791a2 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтрольДинамическогоОбновленияКонфигурации/КонтрольДинамическогоОбновленияКонфигурации.mdo @@ -0,0 +1,12 @@ + + + КонтрольДинамическогоОбновленияКонфигурации + + ru + Контроль динамического обновления конфигурации + + CommonModule.КонтрольДинамическогоОбновленияКонфигурацииГлобальный + CommonModule.КонтрольДинамическогоОбновленияКонфигурацииКлиент + CommonModule.КонтрольДинамическогоОбновленияКонфигурации + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo new file mode 100644 index 000000000..2b172528f --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтрольЖурналаРегистрации/КонтрольЖурналаРегистрации.mdo @@ -0,0 +1,13 @@ + + + КонтрольЖурналаРегистрации + + ru + Контроль журнала регистрации + + CommonModule.КонтрольЖурналаРегистрации + ScheduledJob.КонтрольЖурналаРегистрации + Constant.АдресатыПолученияОтчетаПоЖурналуРегистрации + DataProcessor.КонтрольЖурналаРегистрации + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/НастройкаПорядкаЭлементов/НастройкаПорядкаЭлементов.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/НастройкаПорядкаЭлементов/НастройкаПорядкаЭлементов.mdo new file mode 100644 index 000000000..28ee8da20 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/НастройкаПорядкаЭлементов/НастройкаПорядкаЭлементов.mdo @@ -0,0 +1,12 @@ + + + НастройкаПорядкаЭлементов + + ru + Настройка порядка элементов + + CommonModule.НастройкаПорядкаЭлементов + CommonModule.НастройкаПорядкаЭлементовКлиент + CommonModule.НастройкаПорядкаЭлементовСобытия + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбменДанными/ОбменДанными.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбменДанными/ОбменДанными.mdo new file mode 100644 index 000000000..b24704450 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбменДанными/ОбменДанными.mdo @@ -0,0 +1,74 @@ + + + ОбменДанными + + ru + Обмен данными + + CommonModule.ОбменДаннымиКлиент + CommonModule.ОбменДаннымиПовтИсп + CommonModule.ОбменДаннымиСобытия + CommonModule.ОбменДаннымиСервер + ScheduledJob.ВыполнениеОбменаДанными + Constant.ИспользоватьОбменДанными + Catalog.СценарииОбменовДанными + Enum.ДействияПриОбмене + Enum.ПриоритетыОбъектовОбмена + Enum.РезультатыВыполненияОбмена + Enum.ВидыТранспортаСообщенийОбмена + DataProcessor.ЗагрузкаПравилРегистрацииОбъектов + DataProcessor.КонвертацияОбъектовИнформационныхБаз + DataProcessor.ТранспортСообщенийОбменаFILE + InformationRegister.НастройкиТранспортаОбмена + CommonCommand.НастроитьПараметрыТранспортаСообщенийОбмена + SessionParameter.ОбменДаннымиВключен + SessionParameter.ПравилаРегистрацииОбъектов + InformationRegister.СостояниеОбменовДанными + CommonCommand.ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных + SessionParameter.ИспользуемыеПланыОбмена + SessionParameter.ДатаОбновленияПовторноИспользуемыхЗначенийМРО + Constant.ДатаОбновленияПовторноИспользуемыхЗначенийМРО + EventSubscription.ОбменДаннымиПередЗаписьюУзлаПланаОбмена + EventSubscription.ОбменДаннымиПередУдалениемУзлаПланаОбмена + CommonPicture.ВыполнитьЗапускОбменаДанными + CommonPicture.ПодсистемаОбменДанными + Constant.ПрефиксУзлаРаспределеннойИнформационнойБазы + CommonModule.ОбменДаннымиПереопределяемый + InformationRegister.СоответствиеОбъектовИнформационныхБаз + Enum.ВидыПравилДляОбменаДанными + InformationRegister.ПравилаДляОбменаДанными + Enum.ИсточникиПравилДляОбменаДанными + SessionParameter.ПравилаВыборочнойРегистрацииОбъектов + CommonCommand.ОткрытьПравилаКонвертацииОбъектов + CommonCommand.ОткрытьПравилаРегистрацииОбъектов + CommandGroup.ПараметрыОбменаДанными + DataProcessor.ПомощникСозданияОбменаДанными + CommonPicture.ПараметрыОбменаДанными + DataProcessor.ЗагрузкаПравилКонвертацииОбъектов + DataProcessor.СопоставлениеОбъектовИнформационныхБаз + DataProcessor.ПомощникСопоставленияОбъектовИнформационныхБаз + DataProcessor.ТранспортСообщенийОбменаFTP + DataProcessor.ТранспортСообщенийОбменаEMAIL + CommonPicture.СостояниеОбменаДанными + InformationRegister.СостояниеУспешныхОбменовДанными + CommonPicture.СтатусыСопоставленияОбъектов + DataProcessor.КонвертацияОбъектовРаспределенныхИнформационныхБаз + CommonCommand.ОткрытьФормуУправленияОбменамиДанных + CommonCommand.ВыполнитьОбменДанными + CommonCommand.ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных + CommonCommand.ОткрытьСценарииОбменовДанными + CommonForm.ВыполнениеОбменаДанными + CommonPicture.СостояниеОбменаДаннымиУспех + CommonPicture.СостояниеОбменаДаннымиОшибка + CommonPicture.КартинкаРедактировать + CommonForm.УправлениеОбменамиДанных + CommonPicture.Внимание + Role.ДобавлениеИзменениеОбменовДанными + Role.ВыполнениеОбменовДанными + CommandGroup.ВыполнениеОбменаДанными + CommonCommand.ВыполнитьОбменДаннымиИнтерактивно + Enum.ВерсииПодсистемыОбменаДанными + StyleItem.ПоясняющийТекст + DataProcessor.УниверсальныйОбменДаннымиXML + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбновлениеВерсииИБ/ОбновлениеВерсииИБ.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбновлениеВерсииИБ/ОбновлениеВерсииИБ.mdo new file mode 100644 index 000000000..892de453d --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбновлениеВерсииИБ/ОбновлениеВерсииИБ.mdo @@ -0,0 +1,15 @@ + + + ОбновлениеВерсииИБ + + ru + Обновление версии ИБ + + CommonModule.ОбновлениеИнформационнойБазы + CommonModule.ОбновлениеИнформационнойБазыКлиент + CommonModule.ОбновлениеИнформационнойБазыПереопределяемый + InformationRegister.ВерсииПодсистем + CommonModule.ОбновлениеИнформационнойБазыКлиентПереопределяемый + CommonForm.ОписаниеИзмененийСистемы + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбновлениеКонфигурации/ОбновлениеКонфигурации.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбновлениеКонфигурации/ОбновлениеКонфигурации.mdo new file mode 100644 index 000000000..507b1baee --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбновлениеКонфигурации/ОбновлениеКонфигурации.mdo @@ -0,0 +1,22 @@ + + + ОбновлениеКонфигурации + + ru + Обновление конфигурации + + CommonModule.ОбновлениеКонфигурации + CommonModule.ОбновлениеКонфигурацииПереопределяемый + CommonModule.ОбновлениеКонфигурацииКлиент + CommonModule.ОбновлениеКонфигурацииКлиентГлобальный + CommonModule.ОбновлениеКонфигурацииКлиентПовтИсп + CommonModule.ОбновлениеКонфигурацииКлиентПереопределяемый + Role.ПроверкаДоступныхОбновленийКонфигурации + CommonPicture.ЗаставкаОбновленияКонфигурации + CommonPicture.ЗначокЗаставкиОбновленияКонфигурации + CommonPicture.ДлительнаяОперация48 + CommonPicture.Переключатель + Constant.СтатусОбновленияКонфигурации + DataProcessor.ОбновлениеКонфигурации + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Организации/Организации.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Организации/Организации.mdo new file mode 100644 index 000000000..91511d6ba --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Организации/Организации.mdo @@ -0,0 +1,10 @@ + + + Организации + + ru + Организации + + Catalog.Организации + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Печать/Печать.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Печать/Печать.mdo new file mode 100644 index 000000000..6c0c9cb25 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Печать/Печать.mdo @@ -0,0 +1,29 @@ + + + Печать + + ru + Печать + + CommonPicture.ОтправитьEmail + CommonModule.УправлениеПечатьюКлиент + CommonModule.УправлениеПечатью + CommonForm.НастройкаПечатныхФормПередОтправкой + CommonForm.ПечатьДокументов + CommandGroup.Печать + CommonModule.УправлениеПечатьюMSWordКлиент + CommonModule.УправлениеПечатьюOOWriterКлиент + InformationRegister.ПользовательскиеМакетыПечати + CommonPicture.ТипыМакетов + CommonCommand.РедактированиеМакетовПечатныхФорм + Role.ИзменениеМакетовПечатныхФорм + CommonPicture.ОткрытьМакет + CommonPicture.РедактироватьМакет + CommonPicture.ОтменитьРедактированиеМакета + CommonPicture.ЗавершитьРедактированиеМакета + CommonPicture.УдалитьПользовательскийМакет + CommonPicture.ИспользоватьПользовательскийМакет + CommonPicture.ИспользоватьПоставляемыйМакет + CommonModule.УправлениеПечатьюПереопределяемый + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПолнотекстовыйПоиск/ПолнотекстовыйПоиск.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПолнотекстовыйПоиск/ПолнотекстовыйПоиск.mdo new file mode 100644 index 000000000..86cfe1cb5 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПолнотекстовыйПоиск/ПолнотекстовыйПоиск.mdo @@ -0,0 +1,18 @@ + + + ПолнотекстовыйПоиск + + ru + Полнотекстовый поиск + + CommonPicture.ПолнотекстовыйПоискДалее + CommonPicture.ПолнотекстовыйПоискНазад + CommonModule.ПолнотекстовыйПоискСервер + ScheduledJob.ОбновлениеИндексаППД + ScheduledJob.СлияниеИндексаППД + DataProcessor.ПолнотекстовыйПоискВДанных + DataProcessor.УправлениеПолнотекстовымПоиском + Constant.ИспользоватьПолнотекстовыйПоиск + CommonModule.ПолнотекстовыйПоискКлиентПереопределяемый + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПолучениеФайловИзИнтернета/ПолучениеФайловИзИнтернета.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПолучениеФайловИзИнтернета/ПолучениеФайловИзИнтернета.mdo new file mode 100644 index 000000000..86369735b --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПолучениеФайловИзИнтернета/ПолучениеФайловИзИнтернета.mdo @@ -0,0 +1,15 @@ + + + ПолучениеФайловИзИнтернета + + ru + Получение файлов из интернета + + CommonModule.ПолучениеФайловИзИнтернетаКлиентСервер + CommonModule.ПолучениеФайловИзИнтернета + Constant.НастройкаПроксиСервера + CommonForm.ПараметрыПроксиСервера + CommonModule.ПолучениеФайловИзИнтернетаКлиент + CommonCommand.ПерсональнаяНастройкаПроксиСервера + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Пользователи/Пользователи.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Пользователи/Пользователи.mdo new file mode 100644 index 000000000..36b541453 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Пользователи/Пользователи.mdo @@ -0,0 +1,46 @@ + + + Пользователи + + ru + Пользователи + + CommonPicture.ПиктограммыПользователя + SessionParameter.ТекущийПользователь + CommonModule.Пользователи + Catalog.Пользователи + CommonModule.ПользователиПереопределяемый + CommonPicture.ПользователиВыполнитьСинхронизацию + StyleItem.ПользовательВыбранный + Role.ПолныеПрава + InformationRegister.СоставГруппПользователей + Catalog.ГруппыПользователей + CommonPicture.ПиктограммыПользователя06 + CommonPicture.ПиктограммыПользователя05 + CommonPicture.ПиктограммыПользователя04 + CommonPicture.ПиктограммыПользователя03 + CommonPicture.ПиктограммыПользователя02 + CommonPicture.ПиктограммыПользователя01 + CommonModule.ПользователиСерверПовтИсп + CommonPicture.ПоказатьТолькоВыбранныеРоли + CommonPicture.ПиктограммыПользователя07 + CommonPicture.ПиктограммыПользователя08 + CommonPicture.ПиктограммыПользователя09 + CommonPicture.ПиктограммыПользователя10 + CommonPicture.ПиктограммыПользователя11 + CommonPicture.ПиктограммыПользователя12 + Catalog.ГруппыВнешнихПользователей + Catalog.ВнешниеПользователи + Constant.ИспользоватьВнешнихПользователей + CommonCommand.ВнешнийПользовательОбъектаАвторизации + EventSubscription.ОбновитьПредставлениеВнешнегоПользователя + Role.ЧтениеВнешнихПользователей + Role.ДобавлениеИзменениеВнешнихПользователей + Role.ИзменениеТекущегоВнешнегоПользователя + SessionParameter.ТекущийВнешнийПользователь + CommonModule.ВнешниеПользователиСобытия + CommonModule.ВнешниеПользователи + Role.ИзменениеТекущегоПользователя + CommonModule.ПользователиКлиентПереопределяемый + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПрефиксацияОбъектов/ПрефиксацияОбъектов.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПрефиксацияОбъектов/ПрефиксацияОбъектов.mdo new file mode 100644 index 000000000..c96c84427 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПрефиксацияОбъектов/ПрефиксацияОбъектов.mdo @@ -0,0 +1,12 @@ + + + ПрефиксацияОбъектов + + ru + Префиксация объектов + + CommonModule.ПрефиксацияОбъектовСобытия + CommonModule.ПрефиксацияОбъектовПовтИсп + CommonModule.ПрефиксацияОбъектовКлиентСервер + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПроверкаЛегальностиПолученияОбновления/ПроверкаЛегальностиПолученияОбновления.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПроверкаЛегальностиПолученияОбновления/ПроверкаЛегальностиПолученияОбновления.mdo new file mode 100644 index 000000000..eba3a1981 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПроверкаЛегальностиПолученияОбновления/ПроверкаЛегальностиПолученияОбновления.mdo @@ -0,0 +1,12 @@ + + + ПроверкаЛегальностиПолученияОбновления + + ru + Проверка легальности получения обновления + + true + DataProcessor.ЛегальностьПолученияОбновлений + CommonModule.ПроверкаЛегальностиПолученияОбновленияКлиент + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РаботаСПочтовымиСообщениями/РаботаСПочтовымиСообщениями.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РаботаСПочтовымиСообщениями/РаботаСПочтовымиСообщениями.mdo new file mode 100644 index 000000000..cc62c17f7 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РаботаСПочтовымиСообщениями/РаботаСПочтовымиСообщениями.mdo @@ -0,0 +1,23 @@ + + + РаботаСПочтовымиСообщениями + + ru + Работа с почтовыми сообщениями + + CommonModule.ЭлектроннаяПочтаКлиент + CommonModule.ЭлектроннаяПочта + CommonModule.РаботаСПочтовымиСообщениямиКлиент + CommonModule.РаботаСПочтовымиСообщениями + CommonForm.ПодтверждениеПароляУчетнойЗаписи + CommonForm.РедактированиеНовогоПисьма + Catalog.УчетныеЗаписиЭлектроннойПочты + Enum.ВариантыSMTPАутентификации + Enum.СпособыPOP3Аутентификации + Enum.СпособыSMTPАутентификации + Enum.ТипыТекстовЭлектронныхПисем + CommonPicture.ПриложитьФайл + CommonCommand.НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты + Role.ИспользованиеУчетныхЗаписейЭлектроннойПочты + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РаботаСФайлами/РаботаСФайлами.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РаботаСФайлами/РаботаСФайлами.mdo new file mode 100644 index 000000000..5bc7ca576 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РаботаСФайлами/РаботаСФайлами.mdo @@ -0,0 +1,86 @@ + + + РаботаСФайлами + + ru + Работа с файлами + + CommonPicture.КартинкаЗакончитьРедактирование + CommonPicture.КартинкаЗанять + CommonPicture.КартинкаОпубликовать + CommonPicture.КартинкаОсвободить + CommonPicture.КартинкаОткрыть + CommonPicture.КартинкаРедактировать + CommonPicture.КартинкаСохранитьКак + CommonPicture.Папка + CommonPicture.ПиктограммыФайлов + CommonPicture.ПодсистемаРаботаСФайлами + CommonModule.РаботаСФайлами + CommonModule.РаботаСФайламиКлиентСервер + CommonModule.РаботаСФайламиКлиент + CommonModule.ФайловыеФункцииКлиент + CommonModule.ФайловыеФункции + ScheduledJob.ИзвлечениеТекста + Constant.ИзвлекатьТекстыФайловНаСервере + Constant.МаксимальныйРазмерФайла + CommonForm.НастройкаЛокальногоКэшаФайлов + Catalog.ВерсииФайлов + Catalog.Файлы + Catalog.ПапкиФайлов + Enum.ДействияСФайламиПоДвойномуЩелчку + Enum.СтатусыИзвлеченияТекстаФайлов + InformationRegister.ФайлыВРабочемКаталоге + CommonCommand.ПрисоединенныеФайлы + CommonModule.РаботаСФайламиКлиентПовтИсп + CommonModule.РаботаСФайламиПереопределяемый + Enum.ТипыХраненияФайлов + Constant.ТипХраненияФайлов + Catalog.ТомаХраненияФайлов + CommonModule.КомандыРаботыСФайлами + CommonModule.ФайловыеФункцииКлиентСервер + InformationRegister.РабочиеКаталогиФайлов + Enum.СпособыСравненияВерсийФайлов + CommonPicture.Папки + StyleItem.ФайлЗанятыйТекущимПользователем + StyleItem.ФайлЗанятыйДругимПользователем + CommonModule.ОбменФайлами + CommonCommand.ОбменДаннымиРазместитьФайлыВТомах + CommonPicture.Сканирование + CommonPicture.РабочийКаталогПоУмолчанию + InformationRegister.НомераСканированныхФайлов + FilterCriterion.ФайлыВТоме + CommonModule.РаботаСоСканеромКлиент + Enum.ФорматыСканированногоИзображения + Enum.РазрешенияСканированногоИзображения + Enum.ЦветностиИзображения + CommonModule.РаботаСФайламиПовтИсп + Enum.ПоворотИзображения + Enum.РазмерыБумаги + Constant.ЗапретЗагрузкиФайловПоРасширению + Constant.СписокЗапрещенныхРасширений + SessionParameter.ПутьКРабочемуКаталогуПользователя + CommonPicture.ИерархическийСписок + DataProcessor.АвтоматическоеИзвлечениеТекстов + CommonForm.СозданиеНачальногоОбразаСФайлами + CommonCommand.СозданиеНачальногоОбразаСФайлами + CommonForm.НастройкиЭЦП + CommonModule.ЭлектронноЦифроваяПодпись + CommonModule.ЭлектронноЦифроваяПодписьКлиент + Catalog.НазначенияСертификатовЭЦП + CommonPicture.Зашифрован + CommonPicture.Подписан + Constant.АлгоритмПодписи + Constant.АлгоритмХеширования + Constant.АлгоритмШифрования + Constant.ВыполнятьПроверкуЭЦПНаСервере + Constant.ИспользоватьЭлектронноЦифровыеПодписиИШифрование + Constant.ПровайдерЭЦП + Constant.ТипПровайдераЭЦП + Enum.ДействияПриСохраненииСЭЦП + CommonModule.ЭлектронноЦифроваяПодписьКлиентПовтИсп + CommonForm.ВыборСертификатаЭЦПДляПодписи + CommonForm.ПерсональныеНастройкиЭЦП + CommonForm.ФормаСертификатаЭЦП + InformationRegister.ПутиМодулейКриптографииСерверовЛинукс + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РегламентныеЗадания/РегламентныеЗадания.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РегламентныеЗадания/РегламентныеЗадания.mdo new file mode 100644 index 000000000..075389dc9 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РегламентныеЗадания/РегламентныеЗадания.mdo @@ -0,0 +1,18 @@ + + + РегламентныеЗадания + + ru + Регламентные задания + + CommonPicture.НастройкаОбработкиРегламентныхЗаданий + CommonPicture.ОбработатьРегламентноеЗаданиеВручную + CommonPicture.ОтдельныйСеансОбработкиРегламентныхЗаданий + CommonPicture.ОшибкаОбработкиРегламентныхЗаданий + CommonModule.РегламентныеЗаданияГлобальный + CommonModule.РегламентныеЗаданияКлиент + CommonModule.РегламентныеЗаданияСервер + Constant.СостояниеОбработкиРегламентныхЗаданий + DataProcessor.РегламентныеИФоновыеЗадания + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Свойства/Свойства.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Свойства/Свойства.mdo new file mode 100644 index 000000000..02390c661 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Свойства/Свойства.mdo @@ -0,0 +1,27 @@ + + + Свойства + + ru + Свойства + + CommonPicture.ДобавитьДопСвойствоВНабор + CommonPicture.ДополнительныеРеквизитыСведения + CommonPicture.ДополнительныеСведения + CommonPicture.КартинкаВДеревеСвойств + CommonModule.УправлениеСвойствамиКлиент + CommonModule.УправлениеСвойствамиПереопределяемый + CommonModule.УправлениеСвойствами + Constant.ИспользоватьДополнительныеРеквизитыИСведения + CommonForm.РедактированиеЗначенийСвойств + Catalog.ЗначенияСвойствОбъектов + Catalog.НаборыДополнительныхРеквизитовИСведений + InformationRegister.ДополнительныеСведения + ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения + CommonCommand.ДополнительныеСведения + Role.ЧтениеДополнительныхСведений + Role.ИзменениеДополнительныхСведений + StyleItem.УдаленныйДополнительныйРеквизитЦвет + StyleItem.УдаленныйДополнительныйРеквизитШрифт + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/СтруктураПодчиненности/СтруктураПодчиненности.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/СтруктураПодчиненности/СтруктураПодчиненности.mdo new file mode 100644 index 000000000..6801e5ae9 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/СтруктураПодчиненности/СтруктураПодчиненности.mdo @@ -0,0 +1,37 @@ + + + СтруктураПодчиненности + + ru + Структура подчиненности + + CommonForm.СтруктураПодчиненности + FilterCriterion.СвязанныеДокументы + CommonCommand.СтруктураПодчиненности + CommonPicture.ДокументПроведенКоннекторЛево + CommonPicture.ДокументПомеченНаУдалениеКоннекторЛево + CommonPicture.ДокументЗаписанКоннекторЛево + CommonPicture.КоннекторПравоНиз + CommonPicture.КоннекторВерхПравоНиз + CommonPicture.КоннекторВерхПраво + CommonPicture.КоннекторЛевоПраво + CommonPicture.КоннекторЛевоНизПраво + CommonPicture.КоннекторВерхНиз + CommonTemplate.СтруктураПодчиненности + CommonPicture.ДокументПроведенКоннекторВерх + CommonPicture.ДокументПроведенКоннекторНиз + CommonPicture.ДокументПроведенКоннекторВерхНиз + CommonPicture.ДокументПроведенКоннекторЛевоНиз + CommonPicture.ДокументПроведенКоннекторЛевоВерх + CommonPicture.ДокументПомеченНаУдалениеКоннекторВерх + CommonPicture.ДокументПомеченНаУдалениеКоннекторНиз + CommonPicture.ДокументПомеченНаУдалениеКоннекторВерхНиз + CommonPicture.ДокументПомеченНаУдалениеКоннекторЛевоНиз + CommonPicture.ДокументПомеченНаУдалениеКоннекторЛевоВерх + CommonPicture.ДокументЗаписанКоннекторВерх + CommonPicture.ДокументЗаписанКоннекторНиз + CommonPicture.ДокументЗаписанКоннекторВерхНиз + CommonPicture.ДокументЗаписанКоннекторЛевоНиз + CommonPicture.ДокументЗаписанКоннекторЛевоВерх + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеДоступом/УправлениеДоступом.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеДоступом/УправлениеДоступом.mdo new file mode 100644 index 000000000..b80601319 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеДоступом/УправлениеДоступом.mdo @@ -0,0 +1,51 @@ + + + УправлениеДоступом + + ru + Управление доступом + + + CommonPicture.ПодсистемаУправленияДоступом + + SessionParameter.ВидыДоступаЕдинственныеДляТипаЗначенияДоступа + SessionParameter.ВидыДоступаБезГруппЗначенияДоступа + SessionParameter.ОграничиватьДоступПоВиду + Role.ДобавлениеИзменениеПользователейИГруппДоступа + CommonModule.УправлениеДоступомПереопределяемый + CommonModule.УправлениеДоступом + EventSubscription.ЗаписатьГруппыИВидыДоступа + EventSubscription.ЗаписатьНаборыЗначенийДоступа + Constant.ОграничиватьДоступНаУровнеЗаписей + Catalog.ПрофилиГруппДоступа + Catalog.ГруппыДоступа + InformationRegister.ГруппыЗначенийДоступа + InformationRegister.НаборыЗначенийДоступа + InformationRegister.ЗначенияГруппДоступа + InformationRegister.ТаблицыГруппДоступа + ChartOfCharacteristicTypes.ВидыДоступа + CommonPicture.ПодсистемаУправленияДоступом + SessionParameter.ОграничиватьДоступПоВидуПользователи + CommonModule.УправлениеДоступомСобытия + ScheduledJob.ЗаполнениеДанныхДляОграниченияДоступа + InformationRegister.ПраваПоЗначениямДоступа + SessionParameter.ВидыДоступаЧерезПраваПоЗначениямДоступа + CommonCommand.ПраваПоЗначениюДоступа + CommonForm.ПраваПоЗначениямДоступа + CommonPicture.РаспространяетсяВИерархии + CommonCommand.ПраваПользователяПоЗначениямДоступа + EventSubscription.ЗаписатьЗависимыеНаборыЗначенийДоступа + SessionParameter.ОграничиватьДоступПоВидуПравоЧтения + SessionParameter.ОграничиватьДоступПоВидуУсловие + SessionParameter.ОграничиватьДоступПоВидуОбъект + CommonModule.УправлениеДоступомСерверПовтИсп + InformationRegister.ЗависимостиПравДоступа + SessionParameter.ОграничиватьДоступПоВидуПравоДобавления + SessionParameter.ОграничиватьДоступПоВидуПравоИзменения + SessionParameter.ОграничиватьДоступПоВидуВнешниеПользователи + SessionParameter.ВидыДоступаБезОграничения + CommonCommand.ПраваВнешнегоПользователяПоЗначениямДоступа + SessionParameter.ОграничиватьДоступПоВидуДополнительныеСведения + SessionParameter.ОграничиватьДоступПоВидуУчетныеЗаписиЭлектроннойПочты + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеИтогамиИАгрегатами/УправлениеИтогамиИАгрегатами.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеИтогамиИАгрегатами/УправлениеИтогамиИАгрегатами.mdo new file mode 100644 index 000000000..e7740501d --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеИтогамиИАгрегатами/УправлениеИтогамиИАгрегатами.mdo @@ -0,0 +1,14 @@ + + + УправлениеИтогамиИАгрегатами + + ru + Управление итогами и агрегатами + + CommonModule.УправлениеИтогамиИАгрегатамиСобытия + ScheduledJob.ОбновлениеАгрегатов + ScheduledJob.ПерестроениеАгрегатов + DataProcessor.УправлениеИтогамиИАгрегатами + ScheduledJob.УстановкаПериодаРассчитанныхИтогов + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ФизическиеЛица/ФизическиеЛица.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ФизическиеЛица/ФизическиеЛица.mdo new file mode 100644 index 000000000..756904fde --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ФизическиеЛица/ФизическиеЛица.mdo @@ -0,0 +1,18 @@ + + + ФизическиеЛица + + ru + Физические лица + + Catalog.ВидыДокументовФизическихЛиц + Catalog.ФизическиеЛица + Enum.ПолФизическогоЛица + InformationRegister.ДокументыФизическихЛиц + Role.ДобавлениеИзменениеФизическихЛиц + Role.ЧтениеПерсональныхДанныхФизическихЛиц + Role.ДобавлениеИзменениеПерсональныхДанныхФизическихЛиц + CommonModule.ФизическиеЛица + Role.ЧтениеФизическихЛиц + Subsystem.СтандартныеПодсистемы + diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/СтандартныеПодсистемы.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/СтандартныеПодсистемы.mdo new file mode 100644 index 000000000..478ed5818 --- /dev/null +++ b/SSL/src/Subsystems/СтандартныеПодсистемы/СтандартныеПодсистемы.mdo @@ -0,0 +1,42 @@ + + + СтандартныеПодсистемы + + ru + Стандартные подсистемы + + Subsystem.СтандартныеПодсистемы + АдресныйКлассификатор + Анкетирование + БазоваяФункциональность + БизнесПроцессыИЗадачи + Валюты + ВариантыОтчетов + ВерсионированиеОбъектов + ДополнительныеОтчетыИОбработки + ЗавершениеРаботыПользователей + ЗапретРедактированияРеквизитовОбъектов + КалендарныеГрафики + КонтактнаяИнформация + КонтрольДинамическогоОбновленияКонфигурации + КонтрольЖурналаРегистрации + НастройкаПорядкаЭлементов + ОбменДанными + ОбновлениеВерсииИБ + ОбновлениеКонфигурации + Организации + Печать + ПолнотекстовыйПоиск + ПолучениеФайловИзИнтернета + Пользователи + ПрефиксацияОбъектов + ПроверкаЛегальностиПолученияОбновления + РаботаСПочтовымиСообщениями + РаботаСФайлами + РегламентныеЗадания + Свойства + СтруктураПодчиненности + УправлениеДоступом + УправлениеИтогамиИАгрегатами + ФизическиеЛица + diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Commands/ВсеЗадачи/CommandModule.bsl b/SSL/src/Tasks/ЗадачаИсполнителя/Commands/ВсеЗадачи/CommandModule.bsl new file mode 100644 index 000000000..1bd4bb7c6 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Commands/ВсеЗадачи/CommandModule.bsl @@ -0,0 +1,11 @@ +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОткрытьФорму( + "Задача.ЗадачаИсполнителя.ФормаСписка", + Новый Структура("ЗаголовокФормы", НСтр("ru = 'Все задачи'")), + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Commands/Выполнено/CommandModule.bsl b/SSL/src/Tasks/ЗадачаИсполнителя/Commands/Выполнено/CommandModule.bsl new file mode 100644 index 000000000..88a8dddde --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Commands/Выполнено/CommandModule.bsl @@ -0,0 +1,20 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + Если ПараметрКоманды = Неопределено Тогда + Предупреждение(НСтр("ru = 'Не выбраны задачи.'")); + Возврат; + КонецЕсли; + + Для Каждого Задача Из ПараметрКоманды Цикл + БизнесПроцессыИЗадачиСервер.ВыполнитьЗадачу(Задача, Истина); + ПоказатьОповещениеПользователя( + НСтр("ru = 'Задача выполнена'"), + ПолучитьНавигационнуюСсылку(Задача), + Строка(Задача)); + КонецЦикла; + Оповестить("ЗадачаВыполнена", ПараметрКоманды); + +КонецПроцедуры + diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Commands/МоиЗадачи/CommandModule.bsl b/SSL/src/Tasks/ЗадачаИсполнителя/Commands/МоиЗадачи/CommandModule.bsl new file mode 100644 index 000000000..29873566c --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Commands/МоиЗадачи/CommandModule.bsl @@ -0,0 +1,11 @@ +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОткрытьФорму( + "Задача.ЗадачаИсполнителя.Форма.МоиЗадачи", + , + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Commands/Перенаправить/CommandModule.bsl b/SSL/src/Tasks/ЗадачаИсполнителя/Commands/Перенаправить/CommandModule.bsl new file mode 100644 index 000000000..51b5c417b --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Commands/Перенаправить/CommandModule.bsl @@ -0,0 +1,7 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + БизнесПроцессыИЗадачиКлиент.ПеренаправитьЗадачи(ПараметрКоманды, ПараметрыВыполненияКоманды.Источник); + +КонецПроцедуры diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Form.form b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Form.form new file mode 100644 index 000000000..2a28978ad --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Form.form @@ -0,0 +1,787 @@ + + + + <key>ru</key> + <value>Дополнительно</value> + + + ГруппаШапка + 45 + + Наименование + 41 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 42 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Номер + 43 + true + true + + true + + + Объект.Number + + + НомерРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 44 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа шапка</value> + + + ru + Группа шапка + + true + + ГруппаШапкаРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаВходящие + 56 + + Дата + 57 + true + true + + true + + + Объект.Date + + + ДатаРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 58 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + СрокИсполнения + 71 + true + true + + true + + + Объект.СрокИсполнения + + + СрокИсполненияРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + СрокИсполненияКонтекстноеМеню + 72 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа входящие</value> + + + ru + Группа входящие + + true + + ГруппаВходящиеРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаАдресация3 + 69 + + Исполнитель + 27 + true + true + + true + + + Объект.Исполнитель + + + ИсполнительРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + ИсполнительКонтекстноеМеню + 28 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + РольИсполнителя + 29 + true + true + + true + + + Объект.РольИсполнителя + + + РольИсполнителяРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + РольИсполнителяКонтекстноеМеню + 30 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ОсновнойОбъектАдресации + 31 + true + true + + true + + + Объект.ОсновнойОбъектАдресации + + + ОсновнойОбъектАдресацииРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + + ОсновнойОбъектАдресацииКонтекстноеМеню + 32 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ДополнительныйОбъектАдресации + 33 + true + true + + true + + + Объект.ДополнительныйОбъектАдресации + + + ДополнительныйОбъектАдресацииРасширеннаяПодсказка + 92 + Label + true + true + + Left + + + + ДополнительныйОбъектАдресацииКонтекстноеМеню + 34 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Адресация </value> + + + System.DefaultGUIFont + true + false + false + false + + + ГруппаАдресация3РасширеннаяПодсказка + 85 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаБизнесПроцесс + 51 + + БизнесПроцесс + 52 + true + true + + true + + + Объект.BusinessProcess + + + БизнесПроцессРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + + БизнесПроцессКонтекстноеМеню + 53 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ТочкаМаршрута + 54 + true + true + + true + + + Объект.RoutePoint + + + ТочкаМаршрутаРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + + ТочкаМаршрутаКонтекстноеМеню + 55 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Бизнес-процесс</value> + + + System.DefaultGUIFont + true + false + false + false + + true + + ГруппаБизнесПроцессРасширеннаяПодсказка + 94 + Label + true + true + + Left + + + UsualGroup + + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаРезультат + 63 + + Выполнена + 64 + true + true + + true + + + Объект.Executed + + + ВыполненаРасширеннаяПодсказка + 100 + Label + true + true + + Left + + + + ВыполненаКонтекстноеМеню + 65 + true + + CheckBoxField + Enter + true + Left + true + + + + ДатаИсполнения + 66 + true + true + + true + + + Объект.ДатаИсполнения + + + ДатаИсполненияРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + + ДатаИсполненияКонтекстноеМеню + 67 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Результат выполнения задачи</value> + + + System.DefaultGUIFont + true + false + false + false + + true + true + + ГруппаРезультатРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + UsualGroup + + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + Закрыть + 37 + true + true + + true + + false + + ЗакрытьРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Form.StandardCommand.Close + true + true + true + UserCmds + Auto + + + Справка + 70 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + TaskObject.ЗадачаИсполнителя + + + true + + + true + +
    true
    +
    + + Ключ + + TaskRef.ЗадачаИсполнителя + + + + + + + +
    diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Help/ru.html b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Help/ru.html new file mode 100644 index 000000000..8cabaa18b --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Help/ru.html @@ -0,0 +1,5 @@ + +

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

    +

    См. также:

    + \ No newline at end of file diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Module.bsl b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Module.bsl new file mode 100644 index 000000000..81383c05f --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Module.bsl @@ -0,0 +1,10 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗначениеВРеквизитФормы(Параметры.Ключ.ПолучитьОбъект(), "Объект"); + БизнесПроцессыИЗадачиСервер.УстановитьФорматДаты(Элементы.СрокИсполнения); + БизнесПроцессыИЗадачиСервер.УстановитьФорматДаты(Элементы.Дата); + БизнесПроцессыИЗадачиСервер.УстановитьФорматДаты(Элементы.ДатаИсполнения); + +КонецПроцедуры diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоБизнесПроцессу/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоБизнесПроцессу/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..5c43e7b70 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоБизнесПроцессу/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,30 @@ + + + + + DeletionMark + Equal + false + + + false + Executed + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + Number + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоБизнесПроцессу/Form.form b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоБизнесПроцессу/Form.form new file mode 100644 index 000000000..bba332f35 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоБизнесПроцессу/Form.form @@ -0,0 +1,509 @@ + + + + <key>ru</key> + <value>Задачи бизнес-процесса</value> + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Номер + 4 + + <key>ru</key> + <value>Номер</value> + + true + true + + true + + + Список.Number + + true + + НомерРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Наименование + 6 + + <key>ru</key> + <value>Задача</value> + + true + true + + true + + + Список.Description + + + НаименованиеРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Дата + 8 + + <key>ru</key> + <value>Создана</value> + + true + true + + true + + + Список.Date + + + ДатаРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Исполнитель + 18 + true + true + + true + + + Список.Исполнитель + + + ИсполнительРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ИсполнительКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Предмет + 23 + true + true + + true + + + Список.Предмет + + + ПредметРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ПредметКонтекстноеМеню + 24 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + Selection + СписокВыбор + + + BeforeRowChange + СписокПередНачаломИзменения + + + СписокСтрокаПоиска + 26 + + СписокСтрокаПоискаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 27 + true + + Список + + true + + + + СписокСостояниеПросмотра + 29 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 30 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 32 + + СписокУправлениеПоискомРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 33 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + 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 + +
    + + ПоказыватьВыполненные + 21 + true + true + + true + + + ПоказыватьВыполненные + + Right + + OnChange + ПоказыватьВыполненныеПриИзменении + + + ПоказыватьВыполненныеРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ПоказыватьВыполненныеКонтекстноеМеню + 22 + true + + CheckBoxField + Enter + true + Left + true + + + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + DontBlock + Use + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.BusinessProcess + +
    true
    + + Task.ЗадачаИсполнителя + true + true + true + true + +
    + + ПоказыватьВыполненные + + <key>ru</key> + <value>Показывать выполненные</value> + + 2 + + Boolean + + + true + + + true + + + ПоказыватьВыполненные + + + + СоздатьЗадание + + <key>ru</key> + <value>Задание</value> + + 1 + + ru + Создать задание + + + true + + + + СоздатьЗадание + + + Auto + Auto + + + ЗначениеОтбора + + AnyRef + + true + + + + + + +
    diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоБизнесПроцессу/Module.bsl b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоБизнесПроцессу/Module.bsl new file mode 100644 index 000000000..496382303 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоБизнесПроцессу/Module.bsl @@ -0,0 +1,62 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора + (Список.Отбор,"БизнесПроцесс", Параметры.ЗначениеОтбора); + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Задачи бизнес-процесса %1'"), Строка(Параметры.ЗначениеОтбора)); + БизнесПроцессыИЗадачиСервер.УстановитьОформлениеЗадач(Список.УсловноеОформление); + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор, "Выполнена", Ложь); +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "ЗадачаИзменена" ИЛИ ИмяСобытия = "ЗадачаВыполнена" Тогда + Элементы.Список.Обновить(); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "Выполнена"); + + Если НЕ Настройки["ПоказыватьВыполненные"] Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор,"Выполнена", Ложь); + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + БизнесПроцессыИЗадачиКлиент.СписокЗадачВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка); +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломИзменения(Элемент, Отказ) + БизнесПроцессыИЗадачиКлиент.СписокЗадачПередНачаломИзменения(Элемент, Отказ); +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьЗадание(Команда) + БизнесПроцессыИЗадачиКлиент.СоздатьЗадание(ЭтаФорма); +КонецПроцедуры + +&НаКлиенте +Процедура ПоказыватьВыполненныеПриИзменении(Элемент) + + ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "Выполнена"); + + Если НЕ ПоказыватьВыполненные Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор, "Выполнена", Ложь); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоПредмету/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоПредмету/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..1ab0d6e0e --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоПредмету/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,32 @@ + + + + + false + DeletionMark + Equal + false + + + false + Executed + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + false + Number + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоПредмету/Form.form b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоПредмету/Form.form new file mode 100644 index 000000000..9ae8e6372 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоПредмету/Form.form @@ -0,0 +1,465 @@ + + + + <key>ru</key> + <value>Задачи по предмету</value> + + + Список + 1 + true + true + + true + + + Список + + true + false + None + + Номер + 4 + + <key>ru</key> + <value>Номер</value> + + true + true + + true + + + Список.Number + + true + + НомерРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Наименование + 6 + + <key>ru</key> + <value>Задача</value> + + true + true + + true + + + Список.Description + + + НаименованиеРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Исполнитель + 18 + true + true + + true + + + Список.Исполнитель + + + ИсполнительРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + ИсполнительКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + СрокИсполнения + 23 + true + true + + true + + + Список.СрокИсполнения + + + СрокИсполненияРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + СрокИсполненияКонтекстноеМеню + 24 + true + + LabelField + Enter + true + Left + true + + true + true + + ru + ДЛФ=D + + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + Selection + СписокВыбор + + + СписокСтрокаПоиска + 26 + + СписокСтрокаПоискаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 27 + true + + Список + + true + + + + СписокСостояниеПросмотра + 29 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 30 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 32 + + СписокУправлениеПоискомРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 33 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + 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 + +
    + + ПоказыватьВыполненные + 21 + true + true + + true + + + ПоказыватьВыполненные + + Right + + OnChange + ПоказыватьВыполненныеПриИзменении + + + ПоказыватьВыполненныеРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + ПоказыватьВыполненныеКонтекстноеМеню + 22 + true + + CheckBoxField + Enter + true + Left + true + + + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + DontBlock + Use + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + ВЫБРАТЬ + Задачи.Ссылка, + Задачи.ПометкаУдаления, + Задачи.Номер, + Задачи.Дата, + Задачи.БизнесПроцесс, + Задачи.ТочкаМаршрута, + Задачи.Наименование, + Задачи.Выполнена, + Задачи.Важность, + Задачи.ДатаИсполнения, + Задачи.Автор, + Задачи.Описание, + Задачи.СрокИсполнения, + Задачи.РезультатВыполнения, + Задачи.Исполнитель, + Задачи.РольИсполнителя, + Задачи.ОсновнойОбъектАдресации, + Задачи.ДополнительныйОбъектАдресации, + Задачи.Представление +ИЗ + Задача.ЗадачаИсполнителя КАК Задачи + +ГДЕ Задачи.Предмет = &ПараметрОтбора + Task.ЗадачаИсполнителя + true + true + true + true + true + +
    + + ПоказыватьВыполненные + + <key>ru</key> + <value>Показывать выполненные</value> + + 2 + + Boolean + + + true + + + true + + + ПоказыватьВыполненные + + + + ЗначениеОтбора + + AnyRef + + true + + + + + + +
    diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоПредмету/Module.bsl b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоПредмету/Module.bsl new file mode 100644 index 000000000..acbc287f6 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ЗадачиПоПредмету/Module.bsl @@ -0,0 +1,52 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Список.Параметры.Элементы[0].Значение = Параметры.ЗначениеОтбора; + Список.Параметры.Элементы[0].Использование = Истина; + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Задачи по предмету %1'"), Строка(Параметры.ЗначениеОтбора)); + ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); + Элементы.СрокИсполнения.Формат = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"); + БизнесПроцессыИЗадачиСервер.УстановитьОформлениеЗадач(Список.УсловноеОформление); + УстановитьОтбор(Новый Структура("ПоказыватьВыполненные", ПоказыватьВыполненные)); +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "ЗадачаИзменена" ИЛИ ИмяСобытия = "ЗадачаВыполнена" Тогда + Элементы.Список.Обновить(); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + УстановитьОтбор(Настройки); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + БизнесПроцессыИЗадачиКлиент.СписокЗадачВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка); +КонецПроцедуры + +&НаКлиенте +Процедура ПоказыватьВыполненныеПриИзменении(Элемент) + УстановитьОтбор(Новый Структура("ПоказыватьВыполненные", ПоказыватьВыполненные)); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура УстановитьОтбор(ПараметрыОтбора) + ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "Выполнена"); + + Если НЕ ПараметрыОтбора["ПоказыватьВыполненные"] Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор, "Выполнена", Ложь); + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачи/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачи/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..321a23049 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачи/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,35 @@ + + + + + DeletionMark + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + false + СрокИсполнения + Asc + + + false + Важность + Asc + + + false + СрокНачалаИсполнения + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачи/Form.form b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачи/Form.form new file mode 100644 index 000000000..462e60339 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачи/Form.form @@ -0,0 +1,1059 @@ + + + + <key>ru</key> + <value>Мои задачи</value> + + + ОсновнаяКоманднаяПанель + 1 + + КоманднаяПанельСписка + 48 + true + true + + true + + + <key>ru</key> + <value>Командная панель списка</value> + + + ru + Командная панель списка + + + КоманднаяПанельСпискаРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + Item.Список + + + + СгруппироватьПо + 51 + + СписокСгруппироватьПоВажности + 52 + true + true + + true + + false + + СписокСгруппироватьПоВажностиРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + Form.Command.СгруппироватьПоВажности + Normal + Auto + true + true + UserCmds + Auto + + + СписокСгруппироватьПоТочкеМаршрута + 53 + true + true + + true + + false + + СписокСгруппироватьПоТочкеМаршрутаРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + Form.Command.СгруппироватьПоТочкеМаршрута + Normal + Auto + true + true + UserCmds + Auto + + + СписокСгруппироватьПоАвтору + 61 + true + true + + true + + false + + СписокСгруппироватьПоАвторуРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Form.Command.СгруппироватьПоАвтору + Normal + Auto + true + true + UserCmds + Auto + + + СписокСгруппироватьПоПредмету + 62 + true + true + + true + + false + + СписокСгруппироватьПоПредметуРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + Form.Command.СгруппироватьПоПредмету + Normal + Auto + true + true + UserCmds + Auto + + + СписокСгруппироватьСгруппироватьПоБезГруппировки + 54 + true + true + + true + + false + + СписокСгруппироватьСгруппироватьПоБезГруппировкиРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + Form.Command.СгруппироватьПоБезГруппировки + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Сгруппировать по</value> + + + ru + Сгруппировать по колонке + + + СгруппироватьПоРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + КоманднаяПанельФормы + 8 + true + true + + true + + + КоманднаяПанельФормыРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + FormCommandPanelGlobalCommands + + + + Справка + 65 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + + ИзменитьФорму + 56 + true + true + + true + + false + + ИзменитьФормуРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + CommandBar + + Left + + + + Список + 9 + true + true + + true + + + Список + + false + None + Delete + SetDeletionMark + + Важность + 24 + true + true + + true + + + Список.ВажностьКартинка + + None + + ВажностьРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + ВажностьКонтекстноеМеню + 25 + true + + PictureField + true + Enter + true + Left + true + + true + true + true + true + + CommonPicture.КоллекцияВариантыВажностиЗадачи + + + + 1 + + + + + Номер + 57 + true + true + + true + + + Список.Number + + + НомерРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 58 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Наименование + 16 + true + true + + true + + + Список.Description + + + НаименованиеРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 17 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ДатаНачала + 46 + true + true + + true + + + Список.ДатаНачала + + + ДатаНачалаРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + + ДатаНачалаКонтекстноеМеню + 47 + true + + InputField + Enter + true + Left + true + + 10 + true + true + true + true + true + Normal + + + + СрокИсполнения + 36 + true + true + + true + + + Список.СрокИсполнения + + + СрокИсполненияРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + + СрокИсполненияКонтекстноеМеню + 37 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Автор + 40 + true + + true + + + Список.Автор + + + АвторРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 41 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Предмет + 63 + true + true + + + Список.ПредметСтрокой + + + ПредметРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + + ПредметКонтекстноеМеню + 64 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Дата + 66 + + <key>ru</key> + <value>Записана</value> + + true + true + + true + + + Список.Date + + + ДатаРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 67 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 11 + Left + true + + + Selection + СписокВыбор + + + BeforeAddRow + СписокПередНачаломДобавления + + + СписокСтрокаПоиска + 80 + + СписокСтрокаПоискаРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 81 + true + + Список + + true + + + + СписокСостояниеПросмотра + 83 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 84 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 86 + + СписокУправлениеПоискомРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 87 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 10 + true + + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + true + + Список.DefaultPicture + + + Style.BorderColor + + None + None + None + true + + true + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + true + + true + +
    + + ПоказыватьВыполненные + 38 + true + true + + true + + + ПоказыватьВыполненные + + Right + + OnChange + ПоказыватьВыполненныеПриИзменении + + + ПоказыватьВыполненныеРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + + ПоказыватьВыполненныеКонтекстноеМеню + 39 + true + + CheckBoxField + Enter + true + Left + true + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + DontBlock + Use + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + ВЫБРАТЬ + ЗадачиПоИсполнителю.Ссылка, + ЗадачиПоИсполнителю.ПометкаУдаления, + ЗадачиПоИсполнителю.Номер, + ЗадачиПоИсполнителю.Дата, + ЗадачиПоИсполнителю.БизнесПроцесс, + ЗадачиПоИсполнителю.ТочкаМаршрута, + ЗадачиПоИсполнителю.Наименование, + ЗадачиПоИсполнителю.Выполнена, + ЗадачиПоИсполнителю.СрокИсполнения, + ВЫБОР + КОГДА ЗадачиПоИсполнителю.ДатаНачала = &НезаполненнаяДата + ТОГДА &ТекущаяДата + ИНАЧЕ ЗадачиПоИсполнителю.ДатаНачала + КОНЕЦ КАК ДатаНачала, + ЗадачиПоИсполнителю.ДатаИсполнения, + ЗадачиПоИсполнителю.Важность, + ЗадачиПоИсполнителю.Описание, + ЗадачиПоИсполнителю.РольИсполнителя, + ЗадачиПоИсполнителю.Исполнитель, + ЗадачиПоИсполнителю.Представление, + ЗадачиПоИсполнителю.ПредметСтрокой, + ЗадачиПоИсполнителю.Автор, + ВЫБОР + КОГДА ЗадачиПоИсполнителю.Важность = ЗНАЧЕНИЕ(Перечисление.ВариантыВажностиЗадачи.Низкая) + ТОГДА 0 + КОГДА ЗадачиПоИсполнителю.Важность = ЗНАЧЕНИЕ(Перечисление.ВариантыВажностиЗадачи.Высокая) + ТОГДА 2 + ИНАЧЕ 1 + КОНЕЦ КАК ВажностьКартинка +ИЗ + Задача.ЗадачаИсполнителя.ЗадачиПоИсполнителю КАК ЗадачиПоИсполнителю + Task.ЗадачаИсполнителя.TasksByExecutive + true + true + 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> + + 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 + + + + СгруппироватьПоАвтору + + + Auto + Auto + + + СгруппироватьПоПредмету + + <key>ru</key> + <value>Предмет</value> + + 7 + + ru + Сгруппировать по предмету + + + true + + + + СгруппироватьПоПредмету + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачи/Module.bsl b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачи/Module.bsl new file mode 100644 index 000000000..aee2ee2f4 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачи/Module.bsl @@ -0,0 +1,136 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Список.Параметры.УстановитьЗначениеПараметра("ТекущаяДата", НачалоДня(ТекущаяДата())); + Список.Параметры.УстановитьЗначениеПараметра("НезаполненнаяДата", Дата(1,1,1)); + + ПараметрыОтбора = Новый Соответствие(); + ПараметрыОтбора.Вставить("ПоказыватьВыполненные", ПоказыватьВыполненные); + УстановитьОтбор(ПараметрыОтбора); + + ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); + Элементы.СрокИсполнения.Формат = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"); + Элементы.ДатаНачала.Формат = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"); + + БизнесПроцессыИЗадачиСервер.УстановитьОформлениеЗадач(Список.УсловноеОформление); + +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + СгруппироватьПоКолонкеНаСервере(Настройки["РежимГруппировки"]); + УстановитьОтбор(Настройки); +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "ЗадачаВыполнена" ИЛИ ИмяСобытия = "ЗадачаИзменена" Тогда + Элементы.Список.Обновить(); + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура СгруппироватьПоВажности(Команда) + СгруппироватьПоКолонке("Важность"); +КонецПроцедуры + +&НаКлиенте +Процедура СгруппироватьПоБезГруппировки(Команда) + СгруппироватьПоКолонке(""); +КонецПроцедуры + +&НаКлиенте +Процедура СгруппироватьПоТочкеМаршрута(Команда) + СгруппироватьПоКолонке("ТочкаМаршрута"); +КонецПроцедуры + +&НаКлиенте +Процедура СгруппироватьПоАвтору(Команда) + СгруппироватьПоКолонке("Автор"); +КонецПроцедуры + +&НаКлиенте +Процедура СгруппироватьПоПредмету(Команда) + СгруппироватьПоКолонке("ПредметСтрокой"); +КонецПроцедуры + +&НаКлиенте +Процедура ПоказыватьВыполненныеПриИзменении(Элемент) + + УстановитьОтборНаКлиенте(); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + БизнесПроцессыИЗадачиКлиент.СписокЗадачПередНачаломДобавления(ЭтаФорма, Элемент, Отказ, Копирование, + Родитель, Группа); +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + БизнесПроцессыИЗадачиКлиент.СписокЗадачВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура СгруппироватьПоКолонке(Знач ИмяКолонкиРевизита) + РежимГруппировки = ИмяКолонкиРевизита; + Если НЕ ПустаяСтрока(РежимГруппировки) Тогда + ПоказыватьВыполненные = Ложь; + УстановитьОтборНаКлиенте(); + КонецЕсли; + Список.Группировка.Элементы.Очистить(); + Если НЕ ПустаяСтрока(ИмяКолонкиРевизита) Тогда + ПолеГруппировки = Список.Группировка.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); + ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных(ИмяКолонкиРевизита); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура СгруппироватьПоКолонкеНаСервере(Знач ИмяКолонкиРевизита) + РежимГруппировки = ИмяКолонкиРевизита; + Если НЕ ПустаяСтрока(РежимГруппировки) Тогда + ПоказыватьВыполненные = Ложь; + ПараметрыОтбора = Новый Соответствие(); + ПараметрыОтбора.Вставить("ПоказыватьВыполненные", ПоказыватьВыполненные); + УстановитьОтбор(ПараметрыОтбора); + КонецЕсли; + Список.Группировка.Элементы.Очистить(); + Если НЕ ПустаяСтрока(ИмяКолонкиРевизита) Тогда + ПолеГруппировки = Список.Группировка.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); + ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных(ИмяКолонкиРевизита); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьОтборНаКлиенте() + + ПараметрыОтбора = Новый Соответствие(); + ПараметрыОтбора.Вставить("ПоказыватьВыполненные", ПоказыватьВыполненные); + УстановитьОтбор(ПараметрыОтбора); + +КонецПроцедуры + +&НаСервере +Процедура УстановитьОтбор(ПараметрыОтбора) + + ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "Выполнена"); + + Если ПараметрыОтбора["ПоказыватьВыполненные"] Тогда + СгруппироватьПоКолонкеНаСервере(""); + Иначе + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор, "Выполнена", Ложь); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачиДляРабочегоСтола/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачиДляРабочегоСтола/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..321a23049 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачиДляРабочегоСтола/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,35 @@ + + + + + DeletionMark + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + false + СрокИсполнения + Asc + + + false + Важность + Asc + + + false + СрокНачалаИсполнения + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачиДляРабочегоСтола/Form.form b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачиДляРабочегоСтола/Form.form new file mode 100644 index 000000000..26a8abaeb --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачиДляРабочегоСтола/Form.form @@ -0,0 +1,1169 @@ + + + + <key>ru</key> + <value>Мои задачи</value> + + + ОсновнаяКоманднаяПанель + 1 + + КоманднаяПанельСписка + 48 + + Изменить + 69 + true + true + + true + + false + + ИзменитьРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Change + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + Обновить + 70 + true + true + + true + + false + + ОбновитьРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Refresh + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Командная панель списка</value> + + + ru + Командная панель списка + + + КоманднаяПанельСпискаРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + + + СгруппироватьПо + 51 + + СписокСгруппироватьПоВажности + 52 + true + true + + true + + false + + СписокСгруппироватьПоВажностиРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + Form.Command.СгруппироватьПоВажности + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СписокСгруппироватьПоТочкеМаршрута + 53 + true + true + + true + + false + + СписокСгруппироватьПоТочкеМаршрутаРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + Form.Command.СгруппироватьПоТочкеМаршрута + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СписокСгруппироватьПоАвтору + 61 + true + true + + true + + false + + СписокСгруппироватьПоАвторуРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + Form.Command.СгруппироватьПоАвтору + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СписокСгруппироватьПоПредмету + 62 + true + true + + true + + false + + СписокСгруппироватьПоПредметуРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + Form.Command.СгруппироватьПоПредмету + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СписокСгруппироватьСгруппироватьПоБезГруппировки + 54 + true + true + + true + + false + + СписокСгруппироватьСгруппироватьПоБезГруппировкиРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + Form.Command.СгруппироватьПоБезГруппировки + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Сгруппировать по</value> + + + ru + Сгруппировать по колонке + + + СгруппироватьПоРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + КоманднаяПанельФормы + 8 + + ЗадачаЗадачаИсполнителяВыполнено + 67 + true + true + + true + + + Items.Список.CurrentData.Ref + + false + + ЗадачаЗадачаИсполнителяВыполненоРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + Task.ЗадачаИсполнителя.Command.Выполнено + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ЗадачаЗадачаИсполнителяПеренаправить + 68 + true + true + + true + + + Items.Список.CurrentData.Ref + + false + + ЗадачаЗадачаИсполнителяПеренаправитьРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + Task.ЗадачаИсполнителя.Command.Перенаправить + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + КоманднаяПанельФормыРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + CommandBar + + Left + + + + Список + 9 + true + true + + true + + + Список + + false + None + CancelSearch + Copy + CopyToClipboard + Delete + Find + ListSettings + OutputList + SetDateInterval + SetDeletionMark + + Важность + 24 + true + true + + true + + + Список.ВажностьКартинка + + None + + ВажностьРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + + ВажностьКонтекстноеМеню + 25 + true + + PictureField + true + Enter + true + Left + true + + true + true + true + true + + CommonPicture.КоллекцияВариантыВажностиЗадачи + + + + 1 + + + + + Номер + 57 + true + true + + + Список.Number + + + НомерРасширеннаяПодсказка + 104 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 58 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Наименование + 16 + true + true + + true + + + Список.Description + + + НаименованиеРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 17 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ДатаНачала + 46 + true + true + + true + + + Список.ДатаНачала + + + ДатаНачалаРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + + ДатаНачалаКонтекстноеМеню + 47 + true + + InputField + Enter + true + Left + true + + 10 + true + true + true + true + true + Normal + + + + СрокИсполнения + 36 + true + true + + true + + + Список.СрокИсполнения + + + СрокИсполненияРасширеннаяПодсказка + 110 + Label + true + true + + Left + + + + СрокИсполненияКонтекстноеМеню + 37 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Автор + 40 + true + + true + + + Список.Автор + + + АвторРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 41 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Дата + 65 + + <key>ru</key> + <value>Записана</value> + + true + true + + true + + + Список.Date + + + ДатаРасширеннаяПодсказка + 114 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 66 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 11 + Left + true + + + Selection + СписокВыбор + + + BeforeAddRow + СписокПередНачаломДобавления + + + BeforeRowChange + СписокПередНачаломИзменения + + + СписокСтрокаПоиска + 93 + + СписокСтрокаПоискаРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 94 + true + + Список + + true + + + + СписокСостояниеПросмотра + 96 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 97 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 99 + + СписокУправлениеПоискомРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 100 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 92 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 10 + + КонтекстноеМенюСписокИзменить + 71 + true + true + + true + + false + + КонтекстноеМенюСписокИзменитьРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Change + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокОбновить + 72 + true + true + + true + + false + + КонтекстноеМенюСписокОбновитьРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Refresh + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокВывестиСписок + 74 + true + true + + true + + false + + КонтекстноеМенюСписокВывестиСписокРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + Form.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюСписокСправка + 73 + true + true + + true + + false + + КонтекстноеМенюСписокСправкаРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + true + + Список.DefaultPicture + + + Style.BorderColor + + None + None + None + true + + true + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + true + + true + +
    + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + DontBlock + Use + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + ВЫБРАТЬ + ЗадачиПоИсполнителю.Ссылка, + ЗадачиПоИсполнителю.ПометкаУдаления, + ЗадачиПоИсполнителю.Номер, + ЗадачиПоИсполнителю.Дата, + ЗадачиПоИсполнителю.БизнесПроцесс, + ЗадачиПоИсполнителю.ТочкаМаршрута, + ЗадачиПоИсполнителю.Наименование, + ЗадачиПоИсполнителю.Выполнена, + ЗадачиПоИсполнителю.СрокИсполнения, + ВЫБОР + КОГДА ЗадачиПоИсполнителю.ДатаНачала = &НезаполненнаяДата + ТОГДА &ТекущаяДата + ИНАЧЕ ЗадачиПоИсполнителю.ДатаНачала + КОНЕЦ КАК ДатаНачала, + ЗадачиПоИсполнителю.ДатаИсполнения, + ЗадачиПоИсполнителю.Важность, + ЗадачиПоИсполнителю.Описание, + ЗадачиПоИсполнителю.РольИсполнителя, + ЗадачиПоИсполнителю.Исполнитель, + ЗадачиПоИсполнителю.Представление, + ЗадачиПоИсполнителю.ПредметСтрокой, + ЗадачиПоИсполнителю.Автор, + ВЫБОР + КОГДА ЗадачиПоИсполнителю.Важность = ЗНАЧЕНИЕ(Перечисление.ВариантыВажностиЗадачи.Низкая) + ТОГДА 0 + КОГДА ЗадачиПоИсполнителю.Важность = ЗНАЧЕНИЕ(Перечисление.ВариантыВажностиЗадачи.Высокая) + ТОГДА 2 + ИНАЧЕ 1 + КОНЕЦ КАК ВажностьКартинка +ИЗ + Задача.ЗадачаИсполнителя.ЗадачиПоИсполнителю КАК ЗадачиПоИсполнителю + Task.ЗадачаИсполнителя.TasksByExecutive + true + true + 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> + + 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 + + + + СгруппироватьПоАвтору + + + Auto + Auto + + + СгруппироватьПоПредмету + + <key>ru</key> + <value>Предмет</value> + + 7 + + ru + Сгруппировать по предмету + + + true + + + + СгруппироватьПоПредмету + + + Auto + Auto + + + + + + +
    diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачиДляРабочегоСтола/Module.bsl b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачиДляРабочегоСтола/Module.bsl new file mode 100644 index 000000000..8d3562808 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/МоиЗадачиДляРабочегоСтола/Module.bsl @@ -0,0 +1,99 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Список.Параметры.УстановитьЗначениеПараметра("ТекущаяДата", НачалоДня(ТекущаяДата())); + Список.Параметры.УстановитьЗначениеПараметра("НезаполненнаяДата", Дата(1,1,1)); + + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор, "Выполнена", Ложь); + + ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); + Элементы.СрокИсполнения.Формат = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"); + Элементы.ДатаНачала.Формат = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"); + + БизнесПроцессыИЗадачиСервер.УстановитьОформлениеЗадач(Список.УсловноеОформление); + +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + СгруппироватьПоКолонкеНаСервере(Настройки["РежимГруппировки"]); +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "ЗадачаВыполнена" ИЛИ ИмяСобытия = "ЗадачаИзменена" Тогда + Элементы.Список.Обновить(); + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура СгруппироватьПоВажности(Команда) + СгруппироватьПоКолонке("Важность"); +КонецПроцедуры + +&НаКлиенте +Процедура СгруппироватьПоБезГруппировки(Команда) + СгруппироватьПоКолонке(""); +КонецПроцедуры + +&НаКлиенте +Процедура СгруппироватьПоТочкеМаршрута(Команда) + СгруппироватьПоКолонке("ТочкаМаршрута"); +КонецПроцедуры + +&НаКлиенте +Процедура СгруппироватьПоАвтору(Команда) + СгруппироватьПоКолонке("Автор"); +КонецПроцедуры + +&НаКлиенте +Процедура СгруппироватьПоПредмету(Команда) + СгруппироватьПоКолонке("ПредметСтрокой"); +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + БизнесПроцессыИЗадачиКлиент.СписокЗадачПередНачаломДобавления(ЭтаФорма, Элемент, Отказ, Копирование, + Родитель, Группа); +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + БизнесПроцессыИЗадачиКлиент.СписокЗадачВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка); +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломИзменения(Элемент, Отказ) + БизнесПроцессыИЗадачиКлиент.СписокЗадачПередНачаломИзменения(Элемент, Отказ); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура СгруппироватьПоКолонке(Знач ИмяКолонкиРевизита) + РежимГруппировки = ИмяКолонкиРевизита; + Список.Группировка.Элементы.Очистить(); + Если НЕ ПустаяСтрока(ИмяКолонкиРевизита) Тогда + ПолеГруппировки = Список.Группировка.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); + ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных(ИмяКолонкиРевизита); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура СгруппироватьПоКолонкеНаСервере(Знач ИмяКолонкиРевизита) + РежимГруппировки = ИмяКолонкиРевизита; + Список.Группировка.Элементы.Очистить(); + Если НЕ ПустаяСтрока(ИмяКолонкиРевизита) Тогда + ПолеГруппировки = Список.Группировка.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); + ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных(ИмяКолонкиРевизита); + КонецЕсли; +КонецПроцедуры + diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ПеренаправитьЗадачи/Form.form b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ПеренаправитьЗадачи/Form.form new file mode 100644 index 000000000..7aa71fd7f --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ПеренаправитьЗадачи/Form.form @@ -0,0 +1,886 @@ + + + + <key>ru</key> + <value>Выбрать исполнителя</value> + + + ДекорацияЗаголовок + 5 + + <key>ru</key> + <value>Выбранная задача</value> + + true + true + + true + + + ДекорацияЗаголовокРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ДекорацияЗаголовокКонтекстноеМеню + 6 + true + + Label + 60 + true + true + false + + Left + + + + ГруппаАдресация + 11 + + ТипАдресации + 9 + true + true + + true + + + ТипАдресации + + None + + OnChange + ТипАдресацииПриИзменении + + + ТипАдресацииРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + ТипАдресацииКонтекстноеМеню + 10 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Исполнителю: + + + 0 + + + + + ru + Исполнителям роли: + + + 1 + + + Vertical + + + + Группа + 12 + + Исполнитель + 1 + true + true + + true + + + Исполнитель + + true + None + + OnChange + ИсполнительПриИзменении + + + ИсполнительРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ИсполнительКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + false + Items + true + true + true + Normal + + + + Роль + 13 + true + true + + true + + + Роль + + None + + OnChange + РольПриИзменении + + + РольРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + РольКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + + true + true + true + false + Items + true + true + true + Normal + + + true + true + + true + + + ГруппаРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + ГруппаАдресацияРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаОдинОбъектАдресации + 33 + + ОдинОсновнойОбъектАдресации + 34 + true + true + + true + + + ОсновнойОбъектАдресации + + + ОдинОсновнойОбъектАдресацииРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + ОдинОсновнойОбъектАдресацииКонтекстноеМеню + 35 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа один объект адресации</value> + + + ru + Группа один объект адресации + + + ГруппаОдинОбъектАдресацииРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаДваОбъектаАдресации + 36 + + ОсновнойОбъектАдресации + 37 + true + true + + true + + + ОсновнойОбъектАдресации + + + ОсновнойОбъектАдресацииРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + ОсновнойОбъектАдресацииКонтекстноеМеню + 38 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ДополнительныйОбъектАдресации + 39 + true + true + + true + + + ДополнительныйОбъектАдресации + + + ДополнительныйОбъектАдресацииРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + ДополнительныйОбъектАдресацииКонтекстноеМеню + 40 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа два объекта адресации</value> + + + ru + Группа два объекта адресации + + + ГруппаДваОбъектаАдресацииРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Комментарий + 7 + true + true + + true + + + Комментарий + + + КомментарийРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ИгнорироватьПредупреждения + 41 + true + + true + + + ИгнорироватьПредупреждения + + Right + + ИгнорироватьПредупрежденияРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + ИгнорироватьПредупрежденияКонтекстноеМеню + 42 + true + + CheckBoxField + Enter + true + Left + true + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + OK + 3 + true + true + + true + + false + + OKРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + Form.Command.OK + Auto + true + true + true + UserCmds + Auto + + + Отмена + 4 + true + true + + true + + false + + ОтменаРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаСправка + 28 + + Справка + 27 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ГруппаСправкаРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + + FillCheckProcessingAtServer + ОбработкаПроверкиЗаполненияНаСервере + + DontBlock + true + true + Vertical + true + true + UseIfNecessary + auto + true + + Исполнитель + + <key>ru</key> + <value>Исполнитель</value> + + 1 + + CatalogRef.Пользователи + + + true + + + true + + + + Комментарий + + <key>ru</key> + <value>Комментарий</value> + + 2 + + String + + + + true + + + true + + + + ТипАдресации + + <key>ru</key> + <value>Тип адресации</value> + + 3 + + Number + + 1 + + + + true + + + true + + + + Роль + + <key>ru</key> + <value>Роль</value> + + 4 + + CatalogRef.РолиИсполнителей + + + true + + + true + + + + ИспользуетсяБезОбъектовАдресации + + <key>ru</key> + <value>Используется без объектов адресации</value> + + 5 + + Boolean + + + true + + + true + + + + ИспользуетсяСОбъектамиАдресации + + <key>ru</key> + <value>Используется с объектами адресации</value> + + 6 + + Boolean + + + true + + + true + + + + ОсновнойОбъектАдресации + + <key>ru</key> + <value>Основной объект адресации</value> + + 7 + + Characteristic.ОбъектыАдресацииЗадач + + + true + + + true + + + + ТипыДополнительногоОбъектаАдресации + + <key>ru</key> + <value>Типы дополнительного объекта адресации</value> + + 8 + + TypeDescription + + + true + + + true + + + + ТипыОсновногоОбъектаАдресации + + <key>ru</key> + <value>Типы основного объекта адресации</value> + + 9 + + TypeDescription + + + true + + + true + + + + ДополнительныйОбъектАдресации + + <key>ru</key> + <value>Доп. объект адресации</value> + + 10 + + Characteristic.ОбъектыАдресацииЗадач + + + true + + + true + + + + ИгнорироватьПредупреждения + + <key>ru</key> + <value>Игнорировать предупреждения</value> + + 11 + + Boolean + + + true + + + true + + + + OK + + <key>ru</key> + <value>OK</value> + + 1 + + ru + OK + + + true + + + + OK + + + Auto + Auto + + + Задача + + TaskRef.ЗадачаИсполнителя + + + + КоличествоЗадач + + Number + + 10 + + + + + ЗаголовокФормы + + String + + + true + + + + + + diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ПеренаправитьЗадачи/Help/ru.html b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ПеренаправитьЗадачи/Help/ru.html new file mode 100644 index 000000000..e1bc43604 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ПеренаправитьЗадачи/Help/ru.html @@ -0,0 +1,6 @@ + +

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

    +

    См. также

    + \ No newline at end of file diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ПеренаправитьЗадачи/Module.bsl b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ПеренаправитьЗадачи/Module.bsl new file mode 100644 index 000000000..d7bb4ce9e --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ПеренаправитьЗадачи/Module.bsl @@ -0,0 +1,201 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ТекстЗаголовкаФормы = Параметры.ЗаголовокФормы; + ЗаголовокПоУмолчанию = ПустаяСтрока(ТекстЗаголовкаФормы); + Если НЕ ЗаголовокПоУмолчанию Тогда + Заголовок = ТекстЗаголовкаФормы; + КонецЕсли; + + ТекстЗаголовка = ""; + + Если Параметры.КоличествоЗадач > 1 Тогда + ТекстЗаголовка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 (%2)'"), + ?(ЗаголовокПоУмолчанию, НСтр("'ru = 'Выбрано задач'"), ТекстЗаголовкаФормы), + Строка(Параметры.КоличествоЗадач)); + ИначеЕсли Параметры.КоличествоЗадач = 1 Тогда + ТекстЗаголовка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 %2'"), + ?(ЗаголовокПоУмолчанию, НСтр("'ru = 'Выбранная задача'"), ТекстЗаголовкаФормы), + Строка(Параметры.Задача)); + Иначе + Элементы.ДекорацияЗаголовок.Видимость = Ложь; + КонецЕсли; + Элементы.ДекорацияЗаголовок.Заголовок = ТекстЗаголовка; + + УстановитьТипыОбъектовАдресации(); + УстановитьСостояниеЭлементов(); + +КонецПроцедуры + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + + Если ТипАдресации = 0 Тогда + Если Исполнитель.Пустая() Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Не указан исполнитель задачи.'"),,, + "Исполнитель", + Отказ); + КонецЕсли; + Возврат; + КонецЕсли; + + Если Роль.Пустая() Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Не указана роль исполнителей задачи.'"),,, + "Роль", + Отказ); + Возврат; + КонецЕсли; + + ЗаданыТипыОсновногоОбъектаАдресации = ИспользуетсяСОбъектамиАдресации + И ЗначениеЗаполнено(ТипыОсновногоОбъектаАдресации); + ЗаданыТипыДополнительногоОбъектаАдресации = ИспользуетсяСОбъектамиАдресации + И ЗначениеЗаполнено(ТипыДополнительногоОбъектаАдресации); + + Если ЗаданыТипыОсновногоОбъектаАдресации И ОсновнойОбъектАдресации = Неопределено Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Поле ""%1"" не заполнено.'"), + Роль.ТипыОсновногоОбъектаАдресации.Наименование),,, + "ОсновнойОбъектАдресации", + Отказ); + Возврат; + ИначеЕсли ЗаданыТипыДополнительногоОбъектаАдресации И ДополнительныйОбъектАдресации = Неопределено Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Поле ""%1"" не заполнено.'"), + Роль.ТипыДополнительногоОбъектаАдресации.Наименование),,, + "ДополнительныйОбъектАдресации", + Отказ); + Возврат; + КонецЕсли; + + Если НЕ ИгнорироватьПредупреждения И + НЕ БизнесПроцессыИЗадачиСервер.ЕстьИсполнителиРоли(Роль, ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'На указанную роль не назначено ни одного исполнителя. (Чтобы проигнорировать это предупреждение, установите флажок.)'"),,, + "Роль", + Отказ); + Элементы.ИгнорироватьПредупреждения.Видимость = Истина; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ИсполнительПриИзменении(Элемент) + + ТипАдресации = 0; + РольИсполнителя = Неопределено; + ОсновнойОбъектАдресации = Неопределено; + ДополнительныйОбъектАдресации = Неопределено; + УстановитьТипыОбъектовАдресации(); + УстановитьСостояниеЭлементов(); + +КонецПроцедуры + +&НаКлиенте +Процедура РольПриИзменении(Элемент) + + ТипАдресации = 1; + Исполнитель = Неопределено; + ОсновнойОбъектАдресации = Неопределено; + ДополнительныйОбъектАдресации = Неопределено; + УстановитьТипыОбъектовАдресации(); + УстановитьСостояниеЭлементов(); + +КонецПроцедуры + +&НаКлиенте +Процедура ТипАдресацииПриИзменении(Элемент) + УстановитьСостояниеЭлементов(); +КонецПроцедуры + +&НаКлиенте +Процедура OK(Команда) + + ОчиститьСообщения(); + + Если НЕ ПроверитьЗаполнение() Тогда + Возврат; + КонецЕсли; + + Закрыть(ПараметрыЗакрытия()); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура УстановитьТипыОбъектовАдресации() + + ТипыОсновногоОбъектаАдресации = Роль.ТипыОсновногоОбъектаАдресации.ТипЗначения; + ТипыДополнительногоОбъектаАдресации = Роль.ТипыДополнительногоОбъектаАдресации.ТипЗначения; + ИспользуетсяСОбъектамиАдресации = Роль.ИспользуетсяСОбъектамиАдресации; + ИспользуетсяБезОбъектовАдресации = Роль.ИспользуетсяБезОбъектовАдресации; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьСостояниеЭлементов() + + Элементы.Исполнитель.ОтметкаНезаполненного = Ложь; + Элементы.Исполнитель.АвтоОтметкаНезаполненного = ТипАдресации = 0; + Элементы.Исполнитель.Доступность = ТипАдресации = 0; + Элементы.Роль.ОтметкаНезаполненного = Ложь; + Элементы.Роль.АвтоОтметкаНезаполненного = ТипАдресации <> 0; + Элементы.Роль.Доступность = ТипАдресации <> 0; + + ЗаданыТипыОсновногоОбъектаАдресации = ИспользуетсяСОбъектамиАдресации + И ЗначениеЗаполнено(ТипыОсновногоОбъектаАдресации); + ЗаданыТипыДополнительногоОбъектаАдресации = ИспользуетсяСОбъектамиАдресации + И ЗначениеЗаполнено(ТипыДополнительногоОбъектаАдресации); + + Элементы.ОсновнойОбъектАдресации.Заголовок = Роль.ТипыОсновногоОбъектаАдресации.Наименование; + Элементы.ОдинОсновнойОбъектАдресации.Заголовок = Роль.ТипыОсновногоОбъектаАдресации.Наименование; + + Если ЗаданыТипыОсновногоОбъектаАдресации И ЗаданыТипыДополнительногоОбъектаАдресации Тогда + Элементы.ГруппаОдинОбъектАдресации.Видимость = Ложь; + Элементы.ГруппаДваОбъектаАдресации.Видимость = Истина; + ИначеЕсли ЗаданыТипыОсновногоОбъектаАдресации Тогда + Элементы.ГруппаОдинОбъектАдресации.Видимость = Истина; + Элементы.ГруппаДваОбъектаАдресации.Видимость = Ложь; + Иначе + Элементы.ГруппаОдинОбъектАдресации.Видимость = Ложь; + Элементы.ГруппаДваОбъектаАдресации.Видимость = Ложь; + КонецЕсли; + + Элементы.ДополнительныйОбъектАдресации.Заголовок = Роль.ТипыДополнительногоОбъектаАдресации.Наименование; + + Элементы.ОсновнойОбъектАдресации.АвтоОтметкаНезаполненного = ЗаданыТипыОсновногоОбъектаАдресации + И НЕ ИспользуетсяБезОбъектовАдресации; + Элементы.ОдинОсновнойОбъектАдресации.АвтоОтметкаНезаполненного = ЗаданыТипыОсновногоОбъектаАдресации + И НЕ ИспользуетсяБезОбъектовАдресации; + Элементы.ДополнительныйОбъектАдресации.АвтоОтметкаНезаполненного = ЗаданыТипыДополнительногоОбъектаАдресации + И НЕ ИспользуетсяБезОбъектовАдресации; + Элементы.ОдинОсновнойОбъектАдресации.ОграничениеТипа = ТипыОсновногоОбъектаАдресации; + Элементы.ОсновнойОбъектАдресации.ОграничениеТипа = ТипыОсновногоОбъектаАдресации; + Элементы.ДополнительныйОбъектАдресации.ОграничениеТипа = ТипыДополнительногоОбъектаАдресации; + +КонецПроцедуры + +&НаКлиенте +Функция ПараметрыЗакрытия() + + Возврат Новый Структура("Исполнитель,РольИсполнителя,ОсновнойОбъектАдресации,ДополнительныйОбъектАдресации,Комментарий", + Исполнитель, + Роль, + ?(ОсновнойОбъектАдресации <> Неопределено И НЕ ОсновнойОбъектАдресации.Пустая(), ОсновнойОбъектАдресации, Неопределено), + ?(ДополнительныйОбъектАдресации <> Неопределено И НЕ ДополнительныйОбъектАдресации.Пустая(), ДополнительныйОбъектАдресации, Неопределено), + Комментарий); + +КонецФункции diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаЗадачи/Form.form b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаЗадачи/Form.form new file mode 100644 index 000000000..bf2ce6a5e --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаЗадачи/Form.form @@ -0,0 +1,1309 @@ + + + + ГруппаФормаВыполнения + 93 + + ДекорацияКартинка + 91 + true + true + + true + + + ДекорацияКартинкаРасширеннаяПодсказка + 128 + Label + true + true + + Left + + + + ДекорацияКартинкаКонтекстноеМеню + 92 + true + + 4 + true + 2 + true + false + false + false + + + CommonPicture.Информация32 + + + + + ГруппаФормаВыполненияТекст + 96 + + ДекорацияТекст + 94 + + <key>ru</key> + <value>Это общая форма задачи. Для выполнения этой задачи можно открыть специальную форму.</value> + + true + true + + true + + + ДекорацияТекстРасширеннаяПодсказка + 130 + Label + true + true + + Left + + + + ДекорацияТекстКонтекстноеМеню + 95 + true + + Label + true + true + false + + Left + + + + ДекорацияОткрытьФормуЗадачи + 97 + + <key>ru</key> + <value>Перейти в форму для выполнения задачи</value> + + true + true + + true + + + ДекорацияОткрытьФормуЗадачиРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + + ДекорацияОткрытьФормуЗадачиКонтекстноеМеню + 98 + true + + Label + true + true + false + + + Click + ДекорацияОткрытьФормуЗадачиНажатие + + true + Left + + + true + true + + true + + + ru + Группа форма выполнения текст + + + ГруппаФормаВыполненияТекстРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + false + + ГруппаФормаВыполненияРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаСостояние + 99 + true + true + + true + + true + false + + ГруппаСостояниеРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + UsualGroup + + Auto + StrongSeparation + true + true + Auto + Auto + + + + ГруппаЗаголовок + 83 + + Автор + 78 + true + true + + true + + + Объект.Автор + + + АвторРасширеннаяПодсказка + 134 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 79 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Дата + 113 + true + true + + true + + + Объект.Date + + + ДатаРасширеннаяПодсказка + 136 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 114 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Номер + 115 + true + true + + true + + + Объект.Number + + + НомерРасширеннаяПодсказка + 138 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 116 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа заголовок</value> + + true + + ГруппаЗаголовокРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаИсполнение + 28 + + Исполнитель + 20 + + <key>ru</key> + <value>Исполнитель</value> + + true + true + + true + + + Объект.Исполнитель + + + ru + Исполнитель + + + ИсполнительРасширеннаяПодсказка + 141 + Label + true + true + + Left + + + + ИсполнительКонтекстноеМеню + 21 + true + + InputField + true + Enter + true + Left + true + Left + + true + true + true + true + true + true + Normal + + + + СрокИсполнения + 12 + true + true + + true + + + Объект.СрокИсполнения + + + СрокИсполненияРасширеннаяПодсказка + 143 + Label + true + true + + Left + + + + СрокИсполненияКонтекстноеМеню + 13 + true + + InputField + Enter + true + Left + true + Left + + true + true + true + true + true + true + Normal + + + + Важность + 16 + true + true + + true + + + Объект.Важность + + + ВажностьРасширеннаяПодсказка + 145 + Label + true + true + + Left + + + + ВажностьКонтекстноеМеню + 17 + true + + InputField + Enter + true + Left + true + Left + + 10 + true + true + false + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Исполнение</value> + + + System.DefaultGUIFont + true + false + false + false + + true + + ГруппаИсполнениеРасширеннаяПодсказка + 140 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаПриоритет + 88 + + СрокНачалаИсполнения + 85 + true + true + + true + + + Объект.ДатаНачала + + + СрокНачалаИсполненияРасширеннаяПодсказка + 148 + Label + true + true + + Left + + + + СрокНачалаИсполненияКонтекстноеМеню + 86 + true + + InputField + Enter + true + Left + true + + 10 + true + true + + ru + ДЛФ=D + + true + true + true + Normal + + + + СрокНачалаИсполненияВремя + 110 + true + true + + true + + + Объект.ДатаНачала + + None + + СрокНачалаИсполненияВремяРасширеннаяПодсказка + 150 + Label + true + true + + Left + + + + СрокНачалаИсполненияВремяКонтекстноеМеню + 111 + true + + InputField + Enter + true + Left + true + + 8 + true + true + false + + ru + ДЛФ=T + + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Приоритет</value> + + + ГруппаПриоритетРасширеннаяПодсказка + 147 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаСодержание + 77 + + Наименование + 117 + true + true + + true + + + Объект.Description + + + НаименованиеРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 118 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Предмет + 106 + true + true + + true + + + Объект.Предмет + + + ПредметРасширеннаяПодсказка + 155 + Label + true + true + + Left + + + + ПредметКонтекстноеМеню + 107 + true + + LabelField + Enter + true + Left + true + + true + true + true + + + + Описание + 18 + true + true + + true + + + Объект.Описание + + None + + ОписаниеРасширеннаяПодсказка + 157 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 19 + true + + InputField + true + Enter + true + Left + true + Left + + true + 5 + true + true + true + true + true + + Style.BorderColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Содержание</value> + + + System.DefaultGUIFont + true + false + false + false + + + ГруппаСодержаниеРасширеннаяПодсказка + 152 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаРезультат + 27 + + ГруппаВыполненаДата + 54 + + Выполнена + 87 + true + true + + true + + false + + ВыполненаРасширеннаяПодсказка + 161 + Label + true + true + + Left + + + UsualButton + Form.Command.Выполнена + Normal + Auto + true + true + UserCmds + Auto + + + ДатаИсполнения + 119 + + <key>ru</key> + <value>Дата</value> + + true + true + + true + + + Объект.ДатаИсполнения + + + OnChange + ДатаИсполненияПриИзменении + + + ДатаИсполненияРасширеннаяПодсказка + 162 + Label + true + true + + Left + + + + ДатаИсполненияКонтекстноеМеню + 120 + true + + InputField + Enter + true + Left + true + + 10 + true + true + false + + ru + ДЛФ=D + + true + true + true + Normal + + + + ДатаИсполненияВремя + 121 + true + true + + true + + + Объект.ДатаИсполнения + + None + + ДатаИсполненияВремяРасширеннаяПодсказка + 164 + Label + true + true + + Left + + + + ДатаИсполненияВремяКонтекстноеМеню + 122 + true + + InputField + Enter + true + Left + true + + 8 + true + true + false + + ru + ДЛФ=T + + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа выполнена дата</value> + + + ru + Группа выполнена дата + + true + + ГруппаВыполненаДатаРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Результат выполнения</value> + + + System.DefaultGUIFont + true + false + false + false + + + ГруппаРезультатРасширеннаяПодсказка + 159 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ЗаписатьИЗакрыть + 45 + true + true + + true + + false + + ЗаписатьИЗакрытьРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + Auto + true + true + true + UserCmds + Auto + + + ОсновнаяКоманднаяПанель + 105 + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 124 + Label + true + true + + Left + + + + FormCommandPanelGlobalCommands + + + + Дополнительно + 112 + true + true + + true + + false + + ДополнительноРасширеннаяПодсказка + 125 + Label + true + true + + Left + + + Form.Command.Дополнительно + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + Справка + 43 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Объект + 1 + + TaskObject.ЗадачаИсполнителя + + + true + + + true + +
    true
    + true +
    + + НачальныйПризнакВыполнения + + <key>ru</key> + <value>Начальный признак выполнения</value> + + 2 + + Boolean + + + true + + + true + + + + ПредметСтрокой + + <key>ru</key> + <value>Предмет</value> + + 5 + + String + + + + true + + + true + + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 1 + + ru + Записать и закрыть + + + true + + + + ЗаписатьИЗакрытьВыполнить + + + Auto + Auto + + + Выполнена + + <key>ru</key> + <value>Выполнена</value> + + 3 + + ru + Отметить задачу как выполненную и закрыть + + + true + + + StdPicture.ExecuteTask + + + + ВыполненаВыполнить + + + TextPicture + true + Auto + Auto + + + Дополнительно + + <key>ru</key> + <value>Дополнительно</value> + + 2 + + ru + Дополнительная информация о задаче + + + true + + + + Дополнительно + + + Auto + Auto + + + + + + Task.ЗадачаИсполнителя.Command.Выполнено + FormCommandBarImportant + 1 + + + + BusinessProcess.Задание.StandardCommand.CreateBasedOn + + true + + + + + + + OnReadAtServer + ПриЧтенииНаСервере + + +
    diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаЗадачи/Module.bsl b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаЗадачи/Module.bsl new file mode 100644 index 000000000..feb221a30 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаЗадачи/Module.bsl @@ -0,0 +1,85 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Объект.БизнесПроцесс) Тогда + ПараметрыФормы = БизнесПроцессыИЗадачиСервер.ПолучитьФормуВыполненияЗадачи(Объект.Ссылка); + ЕстьФормаЗадачи = ПараметрыФормы.Свойство("ИмяФормы"); + Элементы.ГруппаФормаВыполнения.Видимость = ЕстьФормаЗадачи; + Элементы.Выполнена.Доступность = НЕ ЕстьФормаЗадачи; + КонецЕсли; + НачальныйПризнакВыполнения = Объект.Выполнена; + Если Объект.Ссылка.Пустая() Тогда + Объект.Важность = Перечисления.ВариантыВажностиЗадачи.Обычная; + Объект.СрокИсполнения = ТекущаяДата(); + КонецЕсли; + + Элементы.Предмет.Гиперссылка = Объект.Предмет <> Неопределено И НЕ Объект.Предмет.Пустая(); + ПредметСтрокой = БизнесПроцессыИЗадачиСервер.ПредметСтрокой(Объект.Предмет); + + ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); + Элементы.СрокНачалаИсполненияВремя.Видимость = ИспользоватьДатуИВремяВСрокахЗадач; + Элементы.ДатаИсполненияВремя.Видимость = ИспользоватьДатуИВремяВСрокахЗадач; + БизнесПроцессыИЗадачиСервер.УстановитьФорматДаты(Элементы.СрокИсполнения); + БизнесПроцессыИЗадачиСервер.УстановитьФорматДаты(Элементы.Дата); + + БизнесПроцессыИЗадачиСервер.ФормаЗадачиПриСозданииНаСервере(ЭтаФорма, Объект, + Элементы.ГруппаСостояние, Элементы.ДатаИсполнения); + +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + БизнесПроцессыИЗадачиСервер.ФормаЗадачиПриСозданииНаСервере(ЭтаФорма, Объект, + Элементы.ГруппаСостояние, Элементы.ДатаИсполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + БизнесПроцессыИЗадачиКлиент.ФормаЗадачиОбработкаОповещения(ЭтаФорма, ИмяСобытия, Параметр, Источник); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ЗаписатьИЗакрытьВыполнить() + + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполненаВыполнить() + + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ДекорацияОткрытьФормуЗадачиНажатие(Элемент) + + БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(Объект.Ссылка); + Модифицированность = Ложь; + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура Дополнительно(Команда) + + БизнесПроцессыИЗадачиКлиент.ОткрытьДопИнформациюОЗадаче(Объект.Ссылка); + +КонецПроцедуры + +&НаКлиенте +Процедура ДатаИсполненияПриИзменении(Элемент) + + Если Объект.ДатаИсполнения = НачалоДня(Объект.ДатаИсполнения) Тогда + Объект.ДатаИсполнения = КонецДня(Объект.ДатаИсполнения); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..c6e4fb805 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,21 @@ + + + + + false + DeletionMark + Equal + false + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Form.form b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..d2fd9db69 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Form.form @@ -0,0 +1,1320 @@ + + + + ОсновнаяКоманднаяПанель + 47 + + КоманднаяПанельСписка + 45 + true + true + + true + + + КоманднаяПанельСпискаРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + Item.Список + + + + КоманднаяПанельФормы + 46 + true + true + + true + + + КоманднаяПанельФормыРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + FormCommandPanelGlobalCommands + + + + ИзменитьФорму + 48 + true + true + + true + + false + + ИзменитьФормуРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 53 + true + true + + true + + false + + СправкаРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + CommandBar + + Left + + + + ГруппаЗаголовок + 54 + + СтрокаБизнесПроцесса + 55 + + <key>ru</key> + <value>Бизнес-процесс</value> + + true + true + + true + + + СтрокаБизнесПроцесса + + + СтрокаБизнесПроцессаРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + + СтрокаБизнесПроцессаКонтекстноеМеню + 56 + true + + LabelField + Enter + true + Left + true + + true + true + + Style.ПоясняющийТекст + + + + + СтрокаЗадачи + 57 + + <key>ru</key> + <value>Точка маршрута</value> + + true + true + + true + + + СтрокаЗадачи + + + СтрокаЗадачиРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + + СтрокаЗадачиКонтекстноеМеню + 58 + true + + LabelField + Enter + true + Left + true + + true + true + + Style.ПоясняющийТекст + + + + true + + true + + + <key>ru</key> + <value>Группа заголовок</value> + + + ru + Группа заголовок + + + ГруппаЗаголовокРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаОтбор + 43 + + ПоАвтору + 18 + true + true + + true + + + ПоАвтору + + + OnChange + ПоАвторуПриИзменении + + + ПоАвторуРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + + ПоАвторуКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + + true + true + false + true + Items + true + true + true + Normal + + + + ПоИсполнителю + 20 + true + true + + true + + + ПоИсполнителю + + + OnChange + ПоИсполнителюПриИзменении + + + ПоИсполнителюРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + + ПоИсполнителюКонтекстноеМеню + 21 + true + + InputField + Enter + true + Left + true + + true + true + false + true + Items + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа отбор</value> + + + ru + Группа отбор + + false + + ГруппаОтборРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаСостояние + 42 + + ПоказыватьЗадачи + 49 + true + true + + true + + + ПоказыватьЗадачи + + + OnChange + ПоказыватьЗадачиПриИзменении + + + ПоказыватьЗадачиРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + + ПоказыватьЗадачиКонтекстноеМеню + 50 + true + + RadioButtonField + Enter + true + Left + true + + + + ru + не выполненные + + + 2 + + + + + ru + выполненные + + + 1 + + + + + ru + все + + + 0 + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Группа состояние</value> + + + ru + Группа состояние + + + ГруппаСостояниеРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + Список + 1 + true + true + + true + + + Список + + false + None + Copy + Delete + SetDeletionMark + + Номер + 4 + true + true + + true + + + Список.Number + + true + + НомерРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + + НомерКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Наименование + 6 + true + true + + true + + + Список.Description + + + НаименованиеРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + Автор + 22 + true + true + + true + + + Список.Автор + + + АвторРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 23 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Исполнитель + 24 + true + true + + true + + + Список.Исполнитель + + + ИсполнительРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + + ИсполнительКонтекстноеМеню + 25 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + РольИсполнителя + 34 + true + true + + true + + + Список.РольИсполнителя + + + РольИсполнителяРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + + РольИсполнителяКонтекстноеМеню + 35 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ОсновнойОбъектАдресации + 40 + true + true + + true + + + Список.ОсновнойОбъектАдресации + + + ОсновнойОбъектАдресацииРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + + ОсновнойОбъектАдресацииКонтекстноеМеню + 41 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ДополнительныйОбъектАдресации + 38 + true + true + + true + + + Список.ДополнительныйОбъектАдресации + + + ДополнительныйОбъектАдресацииРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + + ДополнительныйОбъектАдресацииКонтекстноеМеню + 39 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Выполнена + 10 + true + true + + true + + + Список.Executed + + + ВыполненаРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + + ВыполненаКонтекстноеМеню + 11 + true + + CheckBoxField + Enter + true + Left + true + + + + Дата + 8 + + <key>ru</key> + <value>Записана</value> + + true + true + + true + + + Список.Date + + + ДатаРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + + ДатаКонтекстноеМеню + 9 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + СрокИсполнения + 30 + true + true + + true + + + Список.СрокИсполнения + + + СрокИсполненияРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + СрокИсполненияКонтекстноеМеню + 31 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ДатаИсполнения + 32 + true + true + + true + + + Список.ДатаИсполнения + + + ДатаИсполненияРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + + ДатаИсполненияКонтекстноеМеню + 33 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Предмет + 51 + true + true + + + Список.ПредметСтрокой + + + ПредметРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + ПредметКонтекстноеМеню + 52 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + Selection + СписокВыбор + + + BeforeAddRow + СписокПередНачаломДобавления + + + BeforeRowChange + СписокПередНачаломИзменения + + + СписокСтрокаПоиска + 78 + + СписокСтрокаПоискаРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 79 + true + + Список + + true + + + + СписокСостояниеПросмотра + 81 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 82 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 84 + + СписокУправлениеПоискомРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 85 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + + Список.DefaultPicture + + + Style.BorderColor + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + +
    + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + NotificationProcessing + ОбработкаОповещения + + + OnCreateAtServer + ПриСозданииНаСервере + + + BeforeLoadDataFromSettingsAtServer + ПриЗагрузкеДанныхИзНастроекНаСервере + + DontBlock + Use + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
    true
    + + ВЫБРАТЬ + ЗадачаЗадачаИсполнителя.Ссылка, + ЗадачаЗадачаИсполнителя.ПометкаУдаления, + ЗадачаЗадачаИсполнителя.Номер, + ЗадачаЗадачаИсполнителя.Дата, + ЗадачаЗадачаИсполнителя.БизнесПроцесс, + ЗадачаЗадачаИсполнителя.ТочкаМаршрута, + ЗадачаЗадачаИсполнителя.Наименование, + ЗадачаЗадачаИсполнителя.Выполнена, + ЗадачаЗадачаИсполнителя.Важность, + ЗадачаЗадачаИсполнителя.ДатаИсполнения, + ЗадачаЗадачаИсполнителя.Автор, + ЗадачаЗадачаИсполнителя.Описание, + ЗадачаЗадачаИсполнителя.СрокИсполнения, + ЗадачаЗадачаИсполнителя.РезультатВыполнения, + ЗадачаЗадачаИсполнителя.ПредметСтрокой, + ЗадачаЗадачаИсполнителя.Исполнитель, + ЗадачаЗадачаИсполнителя.РольИсполнителя, + ЗадачаЗадачаИсполнителя.ОсновнойОбъектАдресации, + ЗадачаЗадачаИсполнителя.ДополнительныйОбъектАдресации +ИЗ + Задача.ЗадачаИсполнителя КАК ЗадачаЗадачаИсполнителя +ГДЕ + (&Исполнитель ЕСТЬ NULL + ИЛИ ЗадачаЗадачаИсполнителя.Исполнитель = &Исполнитель + ИЛИ ИСТИНА В + (ВЫБРАТЬ + ИСТИНА + ИЗ + РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач + ГДЕ + ЗадачаЗадачаИсполнителя.РольИсполнителя = ИсполнителиЗадач.РольИсполнителя + И ЗадачаЗадачаИсполнителя.ОсновнойОбъектАдресации = ИсполнителиЗадач.ОсновнойОбъектАдресации + И ЗадачаЗадачаИсполнителя.ДополнительныйОбъектАдресации = ИсполнителиЗадач.ДополнительныйОбъектАдресации + И ИсполнителиЗадач.Исполнитель = &Исполнитель)) + Task.ЗадачаИсполнителя + true + true + true + true + true + +
    + + ПоАвтору + + <key>ru</key> + <value>По автору</value> + + 2 + + CatalogRef.Пользователи + + + true + + + true + + + ПоАвтору + + + + ПоИсполнителю + + <key>ru</key> + <value>По исполнителю</value> + + 3 + + CatalogRef.Пользователи + + + true + + + true + + + ПоИсполнителю + + + + ПоказыватьЗадачи + + <key>ru</key> + <value>Показывать задачи</value> + + 4 + + Number + + 1 + true + + + + true + + + true + + + ПоказыватьЗадачи + + + + СтрокаБизнесПроцесса + + <key>ru</key> + <value>Строка бизнес процесса</value> + + 5 + + String + + 100 + + + + true + + + true + + + + СтрокаЗадачи + + <key>ru</key> + <value>Строка задачи</value> + + 6 + + String + + 100 + + + + true + + + true + + + + ЗаголовокФормы + + String + + + + + + + + +
    diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Module.bsl b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..c9f0a6a38 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,140 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Перем ТекстЗаголовкаФормы; + Если Параметры.Свойство("ЗаголовокФормы", ТекстЗаголовкаФормы) И + НЕ ПустаяСтрока(ТекстЗаголовкаФормы) Тогда + Заголовок = ТекстЗаголовкаФормы; + АвтоЗаголовок = Ложь; + + КонецЕсли; + + Если Параметры.Свойство("БизнесПроцесс") Тогда + СтрокаБизнесПроцесса = Параметры.БизнесПроцесс; + СтрокаЗадачи = Параметры.Задача; + Элементы.ГруппаЗаголовок.Видимость = Истина; + КонецЕсли; + + Если Параметры.Свойство("ПоказыватьЗадачи") Тогда + ПоказыватьЗадачи = Параметры.ПоказыватьЗадачи; + Иначе + ПоказыватьЗадачи = 2; + КонецЕсли; + + Если Параметры.Свойство("ВидимостьОтборов") Тогда + Элементы.ГруппаОтбор.Видимость = Параметры.ВидимостьОтборов; + КонецЕсли; + + Если Параметры.Свойство("БлокировкаОкнаВладельца") Тогда + РежимОткрытияОкна = Параметры.БлокировкаОкнаВладельца; + КонецЕсли; + + ПоАвтору = ОбщегоНазначения.ТекущийПользователь(); + УстановитьОтбор(); + + ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); + Элементы.СрокИсполнения.Формат = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"); + Элементы.ДатаИсполнения.Формат = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"); + + БизнесПроцессыИЗадачиСервер.УстановитьОформлениеЗадач(Список.УсловноеОформление); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "ЗадачаВыполнена" ИЛИ ИмяСобытия = "ЗадачаИзменена" Тогда + Элементы.Список.Обновить(); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + + УстановитьОтборСписка(Список, Настройки); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ПоИсполнителюПриИзменении(Элемент) + УстановитьОтбор(); +КонецПроцедуры + +&НаКлиенте +Процедура ПоАвторуПриИзменении(Элемент) + УстановитьОтбор(); +КонецПроцедуры + +&НаКлиенте +Процедура ПоказыватьЗадачиПриИзменении(Элемент) + УстановитьОтбор(); +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + БизнесПроцессыИЗадачиКлиент.СписокЗадачПередНачаломДобавления(ЭтаФорма, Элемент, Отказ, Копирование, + Родитель, Группа); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + БизнесПроцессыИЗадачиКлиент.СписокЗадачВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка); +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломИзменения(Элемент, Отказ) + БизнесПроцессыИЗадачиКлиент.СписокЗадачПередНачаломИзменения(Элемент, Отказ); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура УстановитьОтбор() + ПараметрыОтбора = Новый Соответствие(); + ПараметрыОтбора.Вставить("ПоАвтору", ПоАвтору); + ПараметрыОтбора.Вставить("ПоИсполнителю", ПоИсполнителю); + ПараметрыОтбора.Вставить("ПоказыватьЗадачи", ПоказыватьЗадачи); + УстановитьОтборСписка(Список, ПараметрыОтбора); +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура УстановитьОтборСписка(Список, ПараметрыОтбора) + + Если ПараметрыОтбора["ПоАвтору"].Пустая() Тогда + ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "Автор"); + Иначе + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор, "Автор", ПараметрыОтбора["ПоАвтору"]); + КонецЕсли; + + Если ПараметрыОтбора["ПоИсполнителю"].Пустая() Тогда + Список.Параметры.УстановитьЗначениеПараметра("Исполнитель", NULL); + Иначе + Список.Параметры.УстановитьЗначениеПараметра("Исполнитель", ПараметрыОтбора["ПоИсполнителю"]); + КонецЕсли; + + ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "Выполнена"); + Если ПараметрыОтбора["ПоказыватьЗадачи"] <> 0 Тогда + + Если ПараметрыОтбора["ПоказыватьЗадачи"] = 1 Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор, "Выполнена", Истина); + КонецЕсли; + + Если ПараметрыОтбора["ПоказыватьЗадачи"] = 2 Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( + Список.Отбор, "Выполнена", Ложь); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Help/ru.html b/SSL/src/Tasks/ЗадачаИсполнителя/Help/ru.html new file mode 100644 index 000000000..00bbc4437 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/Help/ru.html @@ -0,0 +1,5 @@ + +

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

    +

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

    +

    См. также:

    +

     

    \ No newline at end of file diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/ManagerModule.bsl b/SSL/src/Tasks/ЗадачаИсполнителя/ManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/ObjectModule.bsl b/SSL/src/Tasks/ЗадачаИсполнителя/ObjectModule.bsl new file mode 100644 index 000000000..ed8fa8c9c --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/ObjectModule.bsl @@ -0,0 +1,110 @@ + +// Возвращает Истина, если в задаче указан исполнитель или роль исполнителя. +// +Функция РеквизитыАдресацииЗаполнены() Экспорт + + Возврат НЕ Исполнитель.Пустая() ИЛИ НЕ РольИсполнителя.Пустая(); + +КонецФункции + +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + + ЗадачаБылаВыполнена = Ссылка.Выполнена; + Если НЕ ЗадачаБылаВыполнена И Выполнена Тогда + + Если НЕ РеквизитыАдресацииЗаполнены() Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Необходимо указать исполнителя задачи.'"),,, + "Объект.Исполнитель", Отказ); + Возврат; + КонецЕсли; + + ИначеЕсли ЗадачаБылаВыполнена И Выполнена Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Эта задача уже была выполнена ранее.'"),,,, Отказ); + Возврат; + КонецЕсли; + + Если СрокИсполнения <> '00010101' И ДатаНачала > СрокИсполнения Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Дата начала исполнения не должна превышать крайний срок.'"),,, + "Объект.ДатаНачала", Отказ); + Возврат; + КонецЕсли; + +КонецПроцедуры + +Процедура ПередЗаписью(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + ЗадачаБылаВыполнена = Ложь; + Если НЕ Ссылка.Пустая() Тогда + ЗадачаБылаВыполнена = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Ссылка, "Выполнена"); + КонецЕсли; + Если НЕ ЗадачаБылаВыполнена И Выполнена Тогда + // Если задача выполнена, то запишем в реквизит Исполнитель того + // пользователя, который фактически выполнил задачу. Это нам потом + // потребуется для отчетов. Такую запись делаем только в том + // случае, если в базе было не выполнено, а в объекте стало выполнено + Если Исполнитель.Пустая() Тогда + Исполнитель = ОбщегоНазначения.ТекущийПользователь(); + КонецЕсли; + Если ДатаИсполнения = Дата(1,1,1) Тогда + ДатаИсполнения = ТекущаяДата(); + КонецЕсли; + КонецЕсли; + + Если Важность.Пустая() Тогда + Важность = Перечисления.ВариантыВажностиЗадачи.Обычная; + КонецЕсли; + + Если ПустаяСтрока(ПредметСтрокой) Тогда + ПредметСтрокой = БизнесПроцессыИЗадачиСервер.ПредметСтрокой(Предмет); + КонецЕсли; + + ПредыдущаяПометкаУдаления = Ложь; + Если НЕ Ссылка.Пустая() Тогда + ПредыдущаяПометкаУдаления = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Ссылка, "ПометкаУдаления"); + КонецЕсли; + Если ПредыдущаяПометкаУдаления <> ПометкаУдаления Тогда + УстановитьПривилегированныйРежим(Истина); + НачатьТранзакцию(); + Попытка + ВложенныеБизнесПроцессы = БизнесПроцессыИЗадачиСервер.БизнесПроцессыВедущейЗадачи(Ссылка); + Для Каждого ВложенныйБизнесПроцесс Из ВложенныеБизнесПроцессы Цикл + БизнесПроцессОбъект = ВложенныйБизнесПроцесс.ПолучитьОбъект(); + БизнесПроцессОбъект.УстановитьПометкуУдаления(ПометкаУдаления); + КонецЦикла; + УстановитьПривилегированныйРежим(Ложь); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецЕсли; + + // УправлениеДоступом + ГруппаИсполнителейЗадач = Справочники.ГруппыИсполнителейЗадач.ГруппаИсполнителейЗадач(РольИсполнителя, ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации); + // Конец УправлениеДоступом + +КонецПроцедуры + +Процедура ОбработкаЗаполнения(ДанныеЗаполнения) + + Если ТипЗнч(ДанныеЗаполнения) = Тип("ЗадачаОбъект.ЗадачаИсполнителя") Тогда + ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения, + "БизнесПроцесс,ТочкаМаршрута,Наименование,Исполнитель,РольИсполнителя,ОсновнойОбъектАдресации," + + "ДополнительныйОбъектАдресации,Важность,ДатаИсполнения,Автор,Описание,СрокИсполнения," + + "ДатаНачала,РезультатВыполнения,Предмет"); + Дата = ТекущаяДата(); + КонецЕсли; + Если НЕ ЗначениеЗаполнено(Важность) Тогда + Важность = Перечисления.ВариантыВажностиЗадачи.Обычная; + КонецЕсли; + +КонецПроцедуры + + diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/ЗадачаИсполнителя.mdo b/SSL/src/Tasks/ЗадачаИсполнителя/ЗадачаИсполнителя.mdo new file mode 100644 index 000000000..c361ec225 --- /dev/null +++ b/SSL/src/Tasks/ЗадачаИсполнителя/ЗадачаИсполнителя.mdo @@ -0,0 +1,607 @@ + + + + + + + + + + ЗадачаИсполнителя + + ru + Задача + + Task.ЗадачаИсполнителя.StandardAttribute.Description + Task.ЗадачаИсполнителя.StandardAttribute.Number + DontUse + + Use + Executed + + ru + Выполнена + + Задача выполнена + + ru + Задача выполнена + + + Use + + + + + Use + Description + + ru + Задача + + Краткое описание задачи + + ru + Краткое описание задачи + + + ShowError + Use + + + + + Use + RoutePoint + + Use + + + + + Use + BusinessProcess + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + Date + + ru + Создана + + Дата создания задачи + + ru + Дата создания задачи + + + 0001-01-01T00:00:00 + + Use + + + + + Use + Number + + + + Use + + + + DontUse + true + + + ru + + + Managed + Use + + ru + Задачи + + String + 12 + true + true + 150 + InformationRegister.ИсполнителиЗадач + Task.ЗадачаИсполнителя.AddressingAttribute.Исполнитель + SessionParameter.ТекущийПользователь + AsDescription + InDialog + Task.ЗадачаИсполнителя.Form.ФормаЗадачи + Task.ЗадачаИсполнителя.Form.ФормаСписка + + Важность + + ru + Важность + + Важность задачи - для приоритезации исполнителем своих задач + + EnumRef.ВариантыВажностиЗадачи + + + ru + Важность задачи + + + + Use + DontUse + true + + Enum.ВариантыВажностиЗадачи.EnumValue.Обычная + + Index + Use + Use + + + ДатаИсполнения + + ru + Дата выполнения + + Дата и время фактического выполнения задачи + + Date + + + + ru + Фактическая дата выполнения задачи + + + + + 0001-01-01T00:00:00 + + Index + Use + Use + + + Автор + + ru + Автор + + Автор бизнес-процесса, который сформировал задачу + + CatalogRef.Пользователи + + + ru + Автор задачи + + + + + Catalog.Пользователи.EmptyRef + + Index + Use + Use + + + Описание + + ru + Описание + + Описание постановки задачи для исполнителя + + String + + + + ru + Подробное описание задачи + + true + true + + + true + + Use + Use + + + СрокИсполнения + + ru + Срок + + Плановый срок исполнения задачи + + Date + + + + ru + Плановый срок выполнения задачи + + + + + 0001-01-01T00:00:00 + + Index + Use + Use + + + ДатаНачала + + ru + Дата начала + + Дата начала выполнения задачи - для приоритезации исполнителем своих задач + + Date + + + + ru + Дата начала выполнения задачи + + + + + 0001-01-01T00:00:00 + + Index + Use + Use + + + РезультатВыполнения + + ru + Результат выполнения + + Описание результата выполнения + + String + + + + ru + Описание результата выполнения + + true + true + + + + Use + Use + + + Предмет + + ru + Предмет + + Предмет задачи + + AnyRef + + + ru + Объект информационной базы, по поводу которого была введена задача + + + + + Use + Use + + + ГруппаИсполнителейЗадач + + ru + Группа исполнителей задач + + + CatalogRef.ГруппыИсполнителейЗадач + + + + + Index + Use + Use + + + ПредметСтрокой + + ru + Предмет + + Строковое представление предмета + + String + + 500 + + + + + + Index + Use + Use + + + Дополнительно + + ru + Дополнительно + + + + ru + + + PersonalComputer + MobileDevice + + + ЗадачиПоБизнесПроцессу + + ru + Задачи по бизнес-процессу + + PersonalComputer + MobileDevice + + + ЗадачиПоПредмету + + ru + Задачи по предмету + + PersonalComputer + MobileDevice + + + МоиЗадачи + + ru + Мои задачи + + PersonalComputer + MobileDevice + + + МоиЗадачиДляРабочегоСтола + + ru + Мои задачи + + PersonalComputer + MobileDevice + + + ПеренаправитьЗадачи + + ru + Перенаправить задачи + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаЗадачи + + ru + Форма задачи + + Форма выполнения задачи по умолчанию + PersonalComputer + MobileDevice + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + Исполнитель + + ru + Исполнитель + + + CatalogRef.Пользователи + + + ru + Пользователь, которому поручено выполнение задачи + + + + DontUse + Use + Use + + Catalog.Пользователи.EmptyRef + + Index + InformationRegister.ИсполнителиЗадач.Dimension.Исполнитель + Use + + + РольИсполнителя + + ru + Роль исполнителя + + + CatalogRef.РолиИсполнителей + + + ru + Роль исполнителя, которой адресована задача + + + + DontUse + Use + Use + + Catalog.РолиИсполнителей.EmptyRef + + Index + InformationRegister.ИсполнителиЗадач.Dimension.РольИсполнителя + Use + + + ОсновнойОбъектАдресации + + ru + Основной объект адресации + + + Characteristic.ОбъектыАдресацииЗадач + + + ru + Основной объект адресации, если задача адресована роли исполнителя + + + + Use + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.EmptyRef + + Index + InformationRegister.ИсполнителиЗадач.Dimension.ОсновнойОбъектАдресации + Use + + + ДополнительныйОбъектАдресации + + ru + Дополнительный объект адресации + + + Characteristic.ОбъектыАдресацииЗадач + + + ru + Дополнительный объект адресации, если задача адресована роли исполнителя + + + + Use + + ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач.EmptyRef + + Index + InformationRegister.ИсполнителиЗадач.Dimension.ДополнительныйОбъектАдресации + Use + + + ВсеЗадачи + + ru + Все задачи + + NavigationPanelOrdinary + Auto + + ru + Список всех задач + + + + Выполнено + + ru + Выполнено + + FormCommandBarImportant + + TaskRef.ЗадачаИсполнителя + + Multiple + true + PictureAndText + + ru + Отметить задачу как выполненную + + + StdPicture.ExecuteTask + + + + МоиЗадачи + + ru + Мои задачи + + NavigationPanelOrdinary + Auto + + ru + Список задач исполнителя + + + + Перенаправить + + ru + Перенаправить + + FormCommandBarImportant + + TaskRef.ЗадачаИсполнителя + + Multiple + true + PictureAndText + + ru + Перенаправить задачу другому исполнителю + + +

    x#9KS&vym9QK!evStG$Ie{K)gI33uRRskR}*-!(4 zQl&a7#QFnR?O?^aAljs7tC}=NFfe3l+xqz!-vJY~P~@j%T5m z-HBK(K`0X8s7%K9ET}>>BYm-m2n{R2EWJE-HxAg7V3p>9895#&{pHwKAZ>NyfhiWF z48U&nh#{DWl6xm6z{Q6cMDm))yLcgSaH{#jevY{=!y#c?R+ zM-T|xQD@wRTw*hFh|N$e3_t}%DN5HBLO@s{>M_oYry0fU)Z=DRz?7xeKS+<@Y#w{q zx&@_2SqZm|HVqt{`3!3g9^QikBOHdz#hz%SmH6iA^liPqqC_c`PZrhKVnaF(igJ~4 z0a1~^D_4Y3t|+5K)S;O?qzwujp8{2`!r4jkwVXz2&sXijuPsW<4e0q%lZyqJD25S-(C^hWVAj<`e-QwrMy1yT&q}vs^dvom z33(88j15&z!pe8MEHF~Fr-XbG0a8|yh_-wgu7YlAj)mR8nRe<5&|(3T>>@f?OS0au z$Fa)+w31uTWe8lZLS6OPC#z0cbd;*t>E^97Or6b?vahfK0Y6zRohDW4`xc>87}p%3 zkiqX`Fg~&i`) z|*XXrsyP~ zb6@lGnf#p--J$5E_ZeDwSN?L>Y6=82-o>tm6PZh64if-mrh&%~pz3yQ$`w;66KJLS zKUu!m#9G!NzFu;+q86dZ+{!wPPS!>qtL%qli}i>W)*Nl6A_anS@H&p+%g&<-)A96k z`JdB^;-@Vo-e|j{&nMF~=la6mp#fm>`J`oVayvuo9DKe`RN`G%$#K(T1C0rNT4&7C zwbmec^?rfL1(XslA;e|cda4AyhF~aB^d+G>frPgi8e}GchAd()RV*J~lwImh$-?z#KzAk70P;w4jXrAmjr(h97Ubs4-wxMS=zebe>O)HJVh_ zep2g!9P2+^P4Z}J`nORB{}BU#9PUl|B@LqqCDltK4HC3WMYIa)9akEhbO@X5vO03boDnef##W^UDl6V#up)PWM6Iw+KSIOXIE0P;M5q=xW~si#!G zWBYWGpr)aeDAimNJCuym-CzU&3EHH(sn6A7f<7>rHA~eK+T{Aj1SS8ulDRs_piu!p zf;NGL_?&X<7>a7ZJ(^=hO^PFR@ag(Fh*$ezHx2-Dm~xHj5QjJ@swrk$)ks%?X*m9= zDVAH*A)X*=oL`O={(n@VN#O{i2MDL0#}m&9L>R@8Z!uw05{duPSl>OB-k7#Nwdl9XZ z1OPciN_tI%pzFozmQr_#Ua6)EwVGt1a8h%ws?$%@Bm_L21xK|XMu-<-3jlJc7)zs^ z4h;xaHPAoQ6tl8w0E%YMbVwabRCDC0=XT`)ATK8IN=+s*HCYg>S?_277NePN;qFt@ zQ0!HMn?6@i?8l2TW;HYdfE*ICP?P8xN=;PY4K>m7Wz^{({(bfOO*2lVRIRc+nRvB- zWUr=t0gZmYsxx0xD6kO#}AnsdlL;WExd3Yc&RdpP-b{fEzT^<(pXp)N}a3 zlj%YG`+j`C!5z|asXXmWECE0oVZ$`QuIS_gvqCX!u>PQ$X}EPtwVGssu#r+em9nlH z;c{B|Z?bSQMbMV2;aByFyqfTiDAOV(pvaHqW;965nGB9%t_Y<(<#P?aaB}Q)V@uWK zT*XUKTDRCYL3eN_GJr;k{DkwH={*O!D5svIwxXsoO;cIu2;^~$vtxxB3lejtf+Ls7 zLvA$BMd)Wd<7l9Ws|H-e%OX07uA-VqI%+bJ$=&8mVg+k*?txA`M#F10Vl&NUP67qx z-O7v<5GdstnT>JA0faL36|xl=8OT9A71i|&XP_CRW>z;QdgwOR+*LJiu4=>S8N7GK3fbp$aM7aimhN|u*9>A6%IYe zdG63E<_&d)CbP7ktN01ssMB30h-N-&RE<1%ePEbO7kMsHl$xFmtEtpEL0{qOVI~xE zB?bwNwIij#1At755PE~gCW+ry)uK8_t%CITC2vYSHG1=zqFXvDP{>qG+FO5WJy`WRf=b)I)aQq4oOhw@pbJajcX)yCQ44hI;z)_CEKL_%P@l5CEHp{)fA674aO%Ow8 zgr`yp<$M9kg&db;;1tGQZed*{DB0EriPmly?cWQI3WMRyyo$mzOTQJl7n&U&X1yfQ(gAVoH2YA&3d2uG2N@jo^zGKCZAPRbDmGq9uLF&ro78~B zjZs%ktWv50K-ENL{y8zq1`15QgQc6#TPxnWJOpuxQZWm5xyXsU$x3gTvL6q3NUXAL zXzN`F-HVQbLUv4-d2n=@iGYJlqjmOm07Ro)55o*o2{ozBXKMF^?C=oeGGnOVwLmo0 z4$*iUSX61%)O9)3a~8wY1a9CtP@Mq{g1BhhS{2BJy9;q6mZ<>(-C z&}xEtsTm@Ag;Oa*rCjDZB~%#IEg>DE5^rX;z6f&-+!u`{pmWg*XzA?5{iavpw~U}N z!hw=LExDHpK(@~5<^Qvz8GLaa^i52@2Ftc|U|~FiGf)nXAAoQy4Uu>YL=x=?mL!;= zs8`6Q;k-138Aml;DXyKOnGW5ODuddg;~F4y49zQ+G_AzhtXzk-`X=DI_55eNGysR zCacR(;}}&?46Bq15Q(_;-vfY5I#+RpCw$wjILm~>3CQP=WjmyIj7d=psm&qvz^E_{ zDS^ctDtW{G$Vg(yT~Gvzx8lI0QMqr?b^M6Kxc*LtT{p|BN#!e7Y^v8EJZ;;lo5|~P z?fQXKBU-t%=`;Wg)GjW%*XG+bI_?0OgtjudwNF4w(>YB16)qHH>jI|blCEc!9D!2Ea358#gw%*Mwbmy!fn7|Fh4()qn!L(sByV zv5=j_l4(fexV3in@poP=$NQKfn$cwCAQ#CGZ|Ch+$O-^5Jrjw^FU~1tnf*Gv%4$KX zlPn%RsHBe}Q2MzPG1W1r>P|*oRY^U7mUM#^Mv{+9`K(98JW!Ud49i9C!%^;RnlzNR zs%waOjYSMH2sp^GOkLmHkP1%9wa$35xzXIls~T9Jrf_HX1U$o(3Q}6fF_b1$1=T`; z)opSQDo;%yU_}@N02O>6dOHKb(FIN2Qg8a&x{jeCzpegfd3uHD5GH~m5|2ZwwH;c! z=0GCd&SI6JG|;@V+w{J1Tngj;V2|&^$t*Wv`~rYX!;om_ci7l}QGFL?w%hruq5Y30!50?HEx(x~Auz(x9~jv$E)T-V&Ts|7lJGLXq4T&+^7 zXFo&N0taomQJ~M~GSH6gEr3z?>V0_ZK#GVPuFhgqw>eewtm0aNN}}%^saZ(G2Gu%) zj`m%%D;fZL)(5F)=n}uJ%azLURei?K9Zip8*0_844FZPCp%ilp0%|B6M()rG$#ff} z+d3egZiR3p#_z@z(W-NX9s@G@=0>*T*zJV2_Bensvt#yVEI_EnpPk6s8^{&&yV7o|8gK zv#euFkxmU#N9j6*y8N&{O~KD(RkjAmd3io`6(K8>HIW zA)ahOT@S@qDYZdA;`RqO@jpG=V#(f7s0FVP+HRSr=`7K~ZaK;WT z#upl|u0#+4@&JSpEbTaxbwjdq8S5XV{1}2}9Qzp83U{QstRbRFbvieixSYDPs}`-m z)P%xJ$W_)I5CHg0OSTfLO%*JTP&E?{159LlA!f(7=HXSgg=z&_CB$Ei^)P&oE4qMy z%rGV{U0x2&NSExS#`Mdo1AQ7i(6v41&& z1At7ck$JX^K-r5gdkkN87Y;;HAk{PgCKEq# z6lIJdlW4_FtvCQ_CVsu&sPTtjMs^T{4sn@MmbnXA zzeuN{UMXqahC~KZGBTDqDbN9 zG!7nqs*uk*GI5Yx;?%r zq>Sr*`WWU|-eQ|@B}eNg9ud-Fr%&h5&(3PG7!gAJY>Lg+n#gINHrtu{7*`zix|ZD> zZ-LVg@yhm@m5m1LCUszNJLvaR%;%9qjN^onXFxb4J{daTiL8F4kh^|YMzh&Y1pqme ztVG_t28x!vD=d0}gQAf!jst|EmzC5}h-SjG=esjvV^3TqqKxCSQi-xn0CDZ4uB=U9 zqLnk6y&)>1ms7P~DO=3R)&D*7FBufIz`oN?05^1j!%R$ zYW&1h(+Di1Zr#X`xDHbr63B{Isz4d_w+eDn<`BqT6g z&lmvYK!M?R`uCc<~CKJR87COXVuamv1G!O1x0#R(j~}JPNEY{3MN~krZHwl^G#}hW19njOcNmH z#J63O(^d$9?E9K)5E+zM*#x8PDYcnd-6&uAtn_bc?HIfnCG5C=Tx6t)J{WtnDXWmG}#$US87lPytV=XJwn zwc>30p4*V;(p<^rm33RzTC~VzI~AQyM*zVNhh*yJMNh@sU5l6}qACppHU#)|5~UiX zpH>akx=FbOb6fEom~FtBH5^3wW+ww0aFXc^T$9DXYLKeZAQ5+NZN;00Wy?3pgtFK*X101 z?&gief`&yg8>bBgaSSBSSIWRa7M#wd?}F~-A4GyKK{=m=o|PYlp5^b?E-fg>FF4_I zFz2Wbv&V2bPdSCD7oe2G;|r+#7U)_i^OrPHQ=E~b^?JOff)XA>pT}JIU08kTwGfWY zhy3^`5`PTN_}gn?-chfEY-SLO;~B_jX@xq^$~7fK$Y%y15^IOEulO%Ga?QJNdwz=9 zV4Ay?YAV^Psr1Dr7ky4i=L3LDqfJ(oWq;njnnH0VF-X=hs9TW^2t~Vior4z0!qIN9 zqMh261%VWf_u?^~+RHdQ2HD|#NZ@%W~hvZ~k!{KYtLo7JzQrNKgXVAa>K^ECc`3xNSl6S)i7k&&z`=5d3r@S3* z|M^u2ydgOM4L^p_foCOBukpJxn#|`7#hob>k{X@Dzs>N!ay3B&Q#C+R0S7r4%wht` z*Cjhp^;6tr8O&9aLNsdP{@R2K)g9jYhI@+R`10o}6n(PLx#$w;TmD+u_Q;Q5-{xCk z-m2F_*OH4FM7>8`3hBW(p-2i= zocb2n@$?OF+kan)++q$aU;So$o)X-5{YT)=U%gXeUX1+_tR`KFn6hfEngU!66HBOB z#Z6|PlHMpOlYfdd8gQLPYf{aMY(lNGppM_LJ^e<9r&heR3r8$X-b`&qVeiHpV07F&bnwrD=h|tLug8((U_a4}A*9QQsl#aDG$eFOhE7Igpm>t~-8y@^IoN>hu;Mns% zBnc8K>N{(65RYRxbptV3jqypOu4ew^{t8L%aRdT4Sc{bM5_We*oW5(NSU3!dIUV!P zgySy$4lF1wb zh;a3}={^XE5T~jQ^Lk4t97P?Y9Wwooz=j9@4OX810Y2vFGu{JT3s2L!%;K}*v0JZ! zLiS!fKE&a$6nA0bwH3Rf7vR{l{sEGxtK9fsS5((R{8WDcQY|kMHW6hfB(kov3#(b^ zelq*q-J5X-)kMQL8gq@>EQP8j&yMzgqy@SNL{Nkw=e&W2L#TGdc(t4u6ce|^X*_Y;KXUYA zEY$*0e4cGj{tU*3pN8DnPRM6=gZV&2VqXjvr6SRkj&WyY{U0Eo9YT>S!Tjm*JO2fN z74s4@)c)v+BB+{<&ezC_)nH)ib&vg4asq%n2eVcqU`!=;sfp((QSg=j`m)+gpio5A z(If{SRZ6=-Rm8L_CSONf;9WO%x?(h*#MwInncaVeksT%G7Nz1YFDpxC?_VWNkIO|& z@sQOs{OH~Xh^?SV72_3hBL3lBf8~{WO0TNj?#mMQjp(9?LH3MSuy5Nv44x3>{K7VZ zq7~2hq1dFQ+NxjuwHYRIgl0C98rezJa|~4#$K;C&bdW>Tyj*drCcdE7n-?baCRI&L z$Bjx4uqP{J>>zTCndAv5R;#iX_yi0TH<-%NoFzng082o$zqit!v!imtI;xP8Ifvrx zWXMS%L=&mHgc+=F=r|5Zu%<%n)}jp*1}96<2`%*TIt!~#+(6;Q{*3SxYp#6GkIl+w zsircmF$oiIAlueWQbwb!ra{2eAyz~jRgJ!NodhKT0T|-vL;+NE2nFW>STV^i5zVmio~%eIxI;kODB~xBqylke^Q)Co9B70pt`Xmsw&D=foS-i#_)6n z!|#Qxt6xgId6gPHH+SC|?zQ}x91Un*@wUD=oa5#gRub80NHRGel^cd%fmcn#2mLvE z4Wkja3IKBObPjPNxr|GMS32y#v(}2ov-K*Bu`k zC$Vmv{K06jbmab8)4MLY$I}{*VMf^D5jbiRxgUG~O2C%kt_=y7QWGDuskG~I7EnRj zpF^scGx4HaZS{hU3a_nlU^yn|-K9hhmBIjuLSr07XoZzb>`J_CjcPnPrwekEDNqJN z&fez5l`Ai4oG$@`tz#@mbh0I(9AAsG80s|$Tf{BxKT<2#ae$Q%T%de2HU})}yoG{1 z?XnKwr3Q8LW_fYuEJ7KQ)ViA0gnqQ+7}X3X9tU#44RW58rp9NEB|1^}X@Omv*FyKa zqdATwJGu{yXqaav3ncW{R9^a1NAxzogSBITWI?H#o@)$f5a=L>1|RNt+6B~ES3r91 zhhSve_n|O&D}>`Vgj1(NqWf=QcVn7(9ZG5~HiHaVi(})rg z*|y1nSc*#sgajD)8;W@dM_M5g>w!`s%h~BEnH#NbkP~7wITtJh`PlGwe%^36$vOf9 zkJFk~7Xm58Pcff?c&dlLk7stXIhcMox$cKzZ4gg(KrTCoeTY};$;_O^d*1#3J_l{R z%i)=|e}K%;E;dpSI0*z?D5s3)hjhX@8&OK%sU$*$`4Rpfj!2rN2)_eQjjER^XNkjN zX!f8&)vTy{@;`)epkiQ@Esn9^*|tbQOciKf_Et!AoWejT7y4n}v)_aK*dADL{56p2 zzY9io{0`dYzZ_b6FMvHyf0NJeTk$T4Bp35_vO`b6wnx4S#qk}`v;0bEpMNpW?7Fg2 z2}btZ2b&-G0wg<@!_w7PL#pd|e$M`_e})bBd;!YYaU{$bFY*y#Ej<1Mc(2pof$Oe> zVs;;#`0{^aPH_KqZ-E8JTnVer`2-SJiaFKBhkgW4-uX3NG(7t3kHDhiu4Ez}+VeQv zfBlDH*-5X5g{xlWxw(*c@a|1_!=}f62dBRL)39s9ov`TWmm~2f;qg2F10KEOd;HE; zu6`YyaNc_nh-t_pKpwd98}Rgl*TRC8=fGK)ehU8bt53iqxBm#vzVs8Y;-pu?O+Whx zo0Bhk!wTBfH?dE4~2FuDzC{Esr_l&2aO7y@j1L&%Wa8kZkRPyMOaO2DKH6 zaY>2BYbSv>@4+?iHmdZBt!vpkVaXZS!GcqM25k$j(f}!C!HUj z67X4^;5wX`%QGB#%sLgC`FlCnQ!KTDXY`Htd>FPr`VB~Tp9G1vViBu{y4jwth?zwu>S7PLhrIy;I^xE@KmWRvEgMre-5NNR&Z{q z+~_dG(~BV9vIwsM(6jUs*!lDy;fC*=4nw;hg(FXYKN4mVuXQmjTm5!;^wuxK9lv@T zq}ms;SMSdCe}Z+leT5eV$u#`njh}~SAN(bkqigM22JO8^A>qCiwmtP{IProHKx^j_ z(AKpaPJh)ku=$Cb;D5e-ISlT48qR;+SDsrhpTDam2SaZqyp}l8`&Webg z_K`TY=8~&9d*Zsgehi7$dC=Ou4ByWPEIaXXn786w{C$fgM4%#iQ=Mm*QZ*@x0uFMJ zmGpW`Np|plC}h^NxDsty35oWTxrB6n=waBm{#!`6t02+2+M5q5g<&Y=b|LYfii5ct zb(cBX{)B@%u=#h$VYVShI2KZ!$IJZ;4ykpMHwCLq&t`Je!5oA;H8P*`Ud3}9@xGXmY?!wPQ>u++MhEauU!2G ze(r~E{u=C9e;X6%vg2P3y^B}#>`uwO@4MkEkQv?q)~(-##j7rW`A572c5Z%969kHr zXI=Vn6t8wbOUL}G@dDd%XTAwK`j*4B-@F_~2etf$cRL#RuT>6JvPNTNkME8-81Az?;iDe)KvsSIWL5__A>0bHvb=@yR2q+V${ zY^PrQe%4p+y8f%)K3C1w87CEV&N)hIo$I)mGcW%}sII;J?j5kc}**tPC+ zFy4PRUyIx^T6$l?39NTK_AMxkZS@E%gy->A_=0`-}TS1?$7_oMgYp2o9^BzdIFNCGXy^{am zyX_&^`sANEVf8VmzY!JqZdkSEO1*FEBdGLi_msXx$HT3^{uC?hOdytyQK7c>mhZvV zr*4PyulzDzdjWGf;y7LNj)wdG@L6wy(CbdkMJRegve?ZADQi}USpFo)I=z(1H42rT z<*b+FP)I&g_wjhwU3;EL&b+oc?aE+o=EoT;~Q*#sxriHuSKFM+UD8 zl#3ZIhY*hSajH_XV7d9Gs8)L@)&=>I4S1a~af45AIv^_lR-rn3Rul>U2qv1$zIE)c z#pYp4d+d@~Sn+ccv5l~(N8FG9&kf^mK}ERlB(AA3y!T0nA}~o*qqIWw46VJ#@oya5 z^%y?u7>hyrcc;1h8fRC*-@RbvD`3qlzW~4g{%csgqIi&@Jx?-NiP+1mGb}_7un30t zZ9;KwJ5MMSzd{_bfIx6;#hihDBL#%fvPL9IG4y#hfFzQwx+rI*z;P;-;wTr@2}NTN z!s`(5LsWMpWa*^VQsm1m_C*Q50dmmQ6US#8z~5hnFis+&Wck}h$hihz)WCt#)@gsY z@$ldvT!;l{#Ib>Kh_!ZmwbAuzu+;B{0$33m1WNfI5t+Bhws;zBc1thsWY1VyQ_w{{ zQ(oa0^tuHXD6M2UeGrM2HclGkaziZ|Pr{3E; zCrX?j35+3pj}W$aW~ZzvTwla+cpr&zu{Z+KF6s(W7QMebf+xYQ{PezwONKa*%LKm* zu)8qomRF!3McmbP4Cvp5`rv}r8Ce-2G*iK0mn*P$OFzzbZ8+Gm8rKXR@JDqrLbB)= zmYV4n*Dq9TItg>;b^3`kb2CBl8irAmM4FXf0vyGJJ9sP&ZY9o(fTmL|dEmO9FjwKC zI;f135^U>hP}V~dVJt3+i`^{H%`Iv zC8;)a_^TsXK?rOnSl%FV=60^t!2+4~agv)G%9Qk)j!r#FK~RPx{!|mQuxr-~!zZ3= zcML~?XZbN)|El^D?X~sJWNJ1%A1l&HO1UA}JF<%-6WQI}v!>N1#<90JTI#Qy{ z@#=)TRc;NpjI%H2t$%^6T7k-~klTE{r^asQ8t+^H`TWNHwaU4O7ES~aF$KE`A;1e< zs?OquQJ2Wd{f)kW4Z~L>PWfE(-D`Sa2fydAs#)joct~C0P;Cx3AUiVZ#r;=GPI#uV zkkCv6Msd8g!#x}~wt_Rj*&>hIOp~U_0fwb>-6{oM(Hb2mqCHo2 zZF8xXTa)`rd3D)2$Vq&zY_1+v(cZkuu1O^4Iy-^{MY(Y*RZ-6M0=6YQ)|T6t-t4bS zq3LaoOu3FYGrFY+*sN=~0aJ!l&8?P%c0G1=5u9p0L$5H8TU@86lCI$a$8r4S->Uk8 zE|#qq`IL?KHDzYCxTL3c&QwmdcArdU@S@*9{%nK0Gdi9|?n170fetdM z?m^0Ei7h+yLi6KPw}Mac>^tgzp#fmw5lbUf>JWYz|6Xr;!OmYVy*KI8m zgu$&p;IN_{W|tVDh6i8?wk%kh{@70u$v0)|Rv|Dzr&f^xf1z zF7cN*M{kjxD>ac>T zNV+!>vc=AcC|u_AY{-bl;uASq7(RapCoVjO z@)VEk8-SLS1Ccm#yGVq593U1C+saV^KqgxUESGetVXD5W%p~mFvl&Q_EkzS#f~K;{Pe(44PGp z^sk3vb_C+B^I^e}YZy3tw>^wA_Il2v)iwVFwx|v6eujZJXYr|c&Ndhy*$sV*Pl9|d z1A}`uAW`EpEIS2;_HJOy*SuvXqv*R2a-+K;5{qd|BZaIX@wd%627kj7c+a_zNOi&R z?#J<*LFid{3h&SCdz^tfJ~RZQL;HAQX-P+!OGn}{Xm6)tqqd02GpAXf`OIgY_nYo` z{F}|JS4Y|T(#s2Zr=_*G8)8w#8O{s23Y#i9kwGO7vChjNIrl9vy8YK&N3Zu7aw$0% z2Dki{*D?&A!2w_VQb^Bz0|ICXL=uZ3-F+IQx>m#J?!O|SaPW`$5M=f~0Qr$k5@%B8 zI_j-`7eMEdD`5BfUqIX3^YOTMLTm3!pncBiP#oWj``5sNWB)g#yN-j7d1pc2ir1hl zO)lB*{)}9gwy}_r?6nvWk`6(!4W54g){CmFtqD2UY{VDo#xq6 zF$Zg2@ijQ=wEqS3S6l$gPPiPF9Q!KR_{jh8TG+n+4#*7e zf>*!em(bR=6dt+#KOx!D2baD3=P*9J8+L5CAFjOmI*7$u;NjbU4DG#3;qrI?2>N%e zhyLwP!0SK!dv=%Kxb7ylxRImof1PK0x=_y+8F<~HU$=U(}*%&`jNBXItke#{*8 z*@u3Mz#7F#ZPZI}kw|F637ylspbsaY%>5{z-Oh_72iWEx`+*m)l1?H+x(!))BEiC| z7FR5s4Rc5|L?F9()-)vcyj09W+oHE{=5?o%W$)Pvi6s=!Wb5oB>`L+UcVPXke+Rpt z`Zpxdxd@#3TpOKNO>#pxa66F;>_DR3jvQiuXII68pO<9P0PFAg5Ip?*D`4N|-|?av zxu$G+=(}*wFJ6j(codeuj7+2wurvwwy^eg6Wu=|5h@$ILzAB3^mciL$lQ zVQ}`77TEUWjqu}7FNY`Y`gi>v@f}&A1Uz}~PvDndIS2mq!?&~IzHsGv$o0m!bTf%! zsn&Vyazc&8G!pS>ffczoIVvWSU3wpiSuA=XQB!96TxJ0KAab03oV+qnE|)}y48fLl zH^7Fqzk(I3{|?T2-FJ}tZG@YC^j`eji~40=>Z)sQM{6@JUEK^09Xn#qIA^UHC1R0< zDcRl*ZCpb`ly6n$8Iw%CgFCmw&>kBWBu1d4wFs%+i=buhMUWkQ2;yz4s->IjYJ_wx zy9(Ooze+nH4nKu6_g#?aIEMGlUG;XTEPEXTGB>gw_B{O)jneFR2!-H)Qw@qCRv&;AjCaS62coCK-PBVqmBUuMGJx9LV+2|x4o z+8yPwn?K4XSc((rTXsH#j!ME`fBiNjxIxajJ2tctPP*i?knUW@Ikh-j3W$LMl()(s zL4agYV!`^-Mzp69J|LPT6*C6e|-~* zavPzovsat5>AfO=Nlcux{5S+@2R`ezx+u??(`J^L7pE69lrp;Jbs+0cpbiqLn(hs~ zC{`{Mk)w>^{}Je1`c~NeUNXa;qLeVgxsqt19AE7(g;d?TFl zif{POFsgIj*}X(9TM=M6l# z=NaTozl2Rs+yYCFy%^5C^crmd!Im8xhrQdkLtF1j$eA?vIqsadvKIqe1S$HlT!utz zJBov+LFc?9yfj5*ykP6z3|mg0K>%UfI4?(&#bnMAOHuA$#Qs&h~dG6DOgSX+3im*uSb&(C$A(?53=^ z6SpuW2^+a!(03LERE7PNmaX|PEIj^gFlWW3FuLzCs1yc~*dJzR#m)L9dY4{+#2DkU2F2U}tozG9p+0jWtUUca5JSSJMvjPcSDcUk zcX1#T=kGN%F~w57aKicjmkF2jjMFduGzTnE>qVuzrE`hS_J|_W%9CHi$3+oL7QQ}K_{O*ge@|4%W>PxO>QH&DW&0l#OtT^QyNOkmbVItS8Ud)a* zPnsQwSYo5c5yft6v#Et5!Vzqm9Nf7DO2{>I-hmL;)yNL6gRN`7f`g`T_Uwo8!N(yp zfTD&`hU9n_;>fxk=z>sUGjfd6pr!9jzRUO^Ddi7y{CF|D4LTN_4;>3Hyb+2Z3=GHm&x8sWsDXyK7&QWCL95nguc)i6G^oL;j!(;05fjfTlPwX2;F7qYij7OgO8W`!{2zUPa6R>l`JuHqb zJN~8kUhjsE-fjf$9Etrefm>#pz(M+t6|1dPKO?AeMtSop=d#vx%ePSRoYy*M4k~bc z>_=5988EVY2P(Up*ovZ8VNK2eVi*yfBi*Yos}~B1%b1)@E+i)0C_5xtB zIl9am%iyGYSei>H$%{p1UmX>wvv`n4>%3z>z;Wx3pwdq32aYPSX_^A5EaZ3#Pk0}4 zzmwq3pI*o&W%7hoPJy3;o`*OC={aO#)k(7rDdBAMI*uEzN}R8lA7k+(6iR4sW)t|_ zz9kpHnpgb`T>JIYAwSm7pe^9Bt1tdI%vpK{-0<(0u?IAjWXoko*iXs~$F<)Wjk&4) z(-dbkDQkm)tx(}EYo*&(+7-W4tY&bLbr0Q@cDxLQAR3J_VQbG_lere{Pq%kMdrvQP z%~`-sku0#9hL#9a5juL(Fg~ya#m;r?>=;f}0&m`_9I@CX?MNh>sq;S> zlG4X;9pjYiq9K{sog$RRb5OMLeDRTDmqk+?8(Gm0vAthM0vevn-i~$uF00n2q~|mHLX!E+l(5KLi!WW;3)d6YbVfR8j-cVYhiD_w-y#gzyOrtj|lr zI_;*Ww8t*3v>YWQS2_+X!Z_ z>4gXf0ND?J6Nl{a<6A*>wB!Ft&os{2)S=8XEJfS3^sPWnl7oC^ALNGjB3SmZ36uP? zxI}=dIfDxpo#`1^q%mnKroq91G{o`MUtz}mIyOh3dR5ic?Cv7EIlvTQ8#ZMEmSDmF1qc!# zX(Lb@X{n_IZM5~yEB^!o-WvvN!+-$U0Bsl+MN={X5gJHA1KDD;S*)rz-Z95GJ|`kF zGa@qYdqqm!HQfZV?tOQvJH!`f{yxJB-;rFSMKTTGafh1bMO2+@>Z68n1k?GcO3%(u z?kG2EGM%e6X91Y^-vc7B##8kCh#s=y zVql(Ms&*6Z6kszK2D+IN6`RU|-TfaXCgJYcdIh+7AA;nR&U+dtA{Z=~&a$ZGrKxeE zQ`+@TW7CBzRlHJe&&kp}f^v5W)ow`ux-!8*;haq6HHOfgCkK?jP{{KHwHFku3NhmL3L$DX{DK4H*+5-%~-DNER<$*H{-YJenUKMyFF;* zP8hj_cJ9i!Oq_H;(M=&Lb*jLO`i7CJ%W!d%lMHxC=O(D2Tn<=6fb?U&~!6s3#Ze=2=1)g zPh>>YU>e0&;SBP{7og4_zUBb&ViVmMwbOxewWJ?@rrOg*%tQv6Wm(1~Slbvt2g_hm zw~CN0nW+kVI+HLxdAplg*K_EVvOJuo<(Uw6&$xk5)em@1gkqn{G&b_33f7BU2mGk} zoVdk8$0X8{KM?)oubC^?%>?>q;c7o$=Uyx&6Rj%wk-AiLJi=H8uKB3cwN87tq!wt> z$g-vTG=YgClSA3XGzcRW&>r35gm6xI)Z6;^M217ouNceM9dJ`zP zQ<}Sa3)A7ubq_<%pkoW+D%^VEo3JdqqxkbIzqTxN7sS0^gykoG1Ip=7@h+)dtY&+# zAhreQ7L(|+Pi>ntcfpF1buYH6Fvs&5pft>RhQd^$Av84&TU+8w&j3I)ntX#a#R z5jzw$9+kPkvA}yzb_`wd@DBTJ5R2m0kKf6>buSZi*`(HLNaI#AsJTYblX=Y7y1;2HSL`TvP7{!ozDe9=kKt!DIo7(3+xrYcXndTj_7Of3Vtn4kwk&zPwzX?h{HZ6>BP zXpz~05%*LnPQY$w?RHp8ZAu8))irwN6fq)6E;^Ei))nepvQ}2WSR~aZ!t!sbr%D$- zTP3NoEObSkEk!L&bsaiVh@SFCn6`FXwaTv_+H%j>#}>kV9QGIyy_QS2@!TSw!@%Gm z{PL5(1Iq`$rro(_b4c?(D=fMm3D{pE7`SG(CUH-J00Oy0E(^i2X*X&_2-pTyq1lcrayg?S@QR!K3dpdMOM3%oK?Zl;;CZ68sz zMr|(@c1$O>MxhGYTOKggL=b?X^|DM*%LOKes!+bLCrjTN0EjMD%OT&nbw zaQ2yh3;E)oK~S%sYt1Bj8DL?F9zUa9F+25M@OVFvEu}1kRc#lYL#;s6v_X7jrtBJX z)~2Ffb%Q|yn=Z)j1VOrK_2pp?J zq3|aT)(6VQI4&Tvw<6a!Keg5LL3#&l5;Vi6*k;3o(MlK6@Nz*HzX*X=R>~rtYYFa* zTh}l0z+0@sVo@}${Owx`+5`jiZ6=N?E_kV1FAA~}9j&O1<2?Bvy|oU;O+<@p7cB3x zt#>GeTkI`G_sSNtVprVsew!S!?BWx@Ij_=pmO-PmQ)+n5g3&LJMqyV##X*?^y#k?& z5FD6#7;K(5RINHaac~yB-^+A+0>MUZ@0xWKqtbI{20Qxg|6RY}+YFcYQ2%xJCJ*37 z%Q3Jb;AN~(lf|`}t3K&y-R67EbZ+E)vfFI#V|Y;pLdqZvD>_RN1YGT{m2Z0h$PJr* zw@k&J)iSb*oP_@^0;^VctDAE5OTXeqcd*~Q(F&J_(qlM|@R84tT`>_X5LneXt4wW! z0|y_vYj3xk7-3kzXm3L+JB3~;qqiRD#Ud7EDY)U^OA=xu7|G488I%mx!mh2{FSb3|tF= z0|(>wmLPx2Z-ZX+GBYr+GQN9b8evCjJ616eU3YF2FedBdFF3>zv)g%?gG8EtUw{7I1Oc;V;#o? zlsJr&h%5?&r1&VU$;(qH90|V8qoz*Wd4cOy9xoH35dxb)I|XXkVZoXyf?HjJ+vm4O@%d zWU)p!RvfVyH`qS3GFYxlW&>Jy885g0tN&aM1gx~KZAGkZhLOz)t=1Wp{_d=e7$o<~ zQYJ;dn}^Akg7To0O%h8oA#{c^CUBq(86d{|nRg&0#Uq^YYE1C{dI1FOaCu+sVXvNN zCgu~)@)maIt23|aPV}MwopuJ&=v7!OG>)3IJBy_ne9IR^`w_c;cyX9Zm@y9Km7UHn>0RuyY zLvZ`mZXB^L7GV4=81CJSydd3*?L^yq)skok(yd!T-=8dHG@x&kr6o@4i1`e%O8+yxCsa zetmb{_kY>|!Y_Jt3(@<3r0412&FMP35{@WtaHo2I9))cYypp$-uSF{x*TpOL_X|D6 zke${=d-03b0kh%{9Cxu=7x$)bpI^6P7fa-`EZdc|;A0NNvF+(M@MCw1KtXO5S&cvy z5-W1SN?F&O)rwwAfbCePDTT7-x+7^f+io-}9(`&v+S#N1 zpU14J&u;6$Kx{s^uuv>I) zAP&G`W@W^PD=9p8PV_Mf+D)R~Hgq#_yMUSj(kOsbvIU5qN6{{oFqR{XDnTb04tDwR-X`=Cxcl3Z zJgd=X$Iz>&BHC4ZFD-n7>*faGeP5N`>SFh2fkaC<7Y8oXZHKZTBA?b(UZG};V1851 zQmI&jT`CzyschArZ`1_xRTRDjnIG}yV@1u* z`?a^!IH=H}=Puf=6goqOD)WP)bFqfW17S%n3rmFD{_n9%=h|@yf)6OL`lf{YxzI!z z96trvSH*283oC`&CCmB`DFB`+v&auo76i*#Q|7g1LJ=5n3O5KF6^Mu2mlanG4s4pZ z1x6dl<0}pj{&4ZwdUG?b#+;+6gE$srB;zY!IQTP?0(I*dINFPahDFe>lH0X~n|fE! z%QUsPlw&SfM;|&Cdx-s&Z_&y|<7n!(Z}G55?GPLq(!u+5>>@fImgr&&v`RYIcU(Us zIQrj)Nv+GQDvBxs0)~n?C=idzlE9G=FcNJ&RPnF{2VG*=3*5hMbr6K{;z0l~=;}dm z<`0Im(dg7Mh5_ykZ6y{12;P#DM!UrX-Ixc*>JuQW#|=}h{o)i>W(&N=M6W=IzVm0b z3yx*B+WWizP&m_pcH4Syi}Y|81XeKbq;{VH7nb`L#S~Itgmqa=j7wFM#VDJ)F2bme z4KP%jiR>(g6gP+duMR-ar0B%nS_r@(#p`%gen2VEt!MbL1>(pKJJK@ZZqoz5-;Ql? zP?ZM{l-~AlvpS6sHV&(Htx&RX-`;>GRXFaMv=_dYBKED4-Nyy?Ou4nwqfH2Bxv}^R z@rLcjl3Uf?mLy3N)V%JSh%E`bRH3pO4WE&2Iq87GwGr005g&zX1@=Dt0v$`Zr6mz= zD%PR9?IVm092p17&I0)@B#0wzB{*6!84Jv%W1;rHM;!6LP~6Ox;-??{Zeh1=q$i9M z4!uA0(POz3&x$a?cfy7 z&xu~E#{kUx;tX(^;O(ph3a@g$x4J%zHQE6$X|>aI1qu2c^XlNh2bliFocYJ7o;Gg@n5H7B|*n#yvi;Y{J=q+eoyeD_f_y0fr~ z@~7`NIH6EIUzb{*%zUYXqMzMHF2)On_8?zh6WP`gJ%L{66ip*UjVYuV` z%FM8X)|(f%tLmc5M)f2+ofZgsDQnv|MQcdPVR(ZctmtO@`W7rJk`euFVvNb;hCsYF zdh7f?E}twF#8O%gd2m#HcoCLyD6QTZ`^W0jlUzv;f`I8RrEWI~RlLI2UkQNxr$2mW z)Gwu7s~10GocKJMbJy7`nP!rB5C_i!kOPd@OO2uASl|-U;z$~l~)`@ zhu+j}Y(%FvWB1_;Yf#H-RP-#X0C#%u=1i4Pe7<$H0T$bO`edVYAJa60$ut6)oitzj zGgz_8b?-TeMrX02N|QIJ8c4xs7{z&LE~7Zjqa@vhal*8VX0RX}jQhV z0Abjx2xFEAM@>-AlsKB&24~TNXOYkv(H-ZuLZ>|HzhA#&w5oE z)l$OpYz1i%!0{V*lr~79bOEEid19~L?7B9>@2rwm3V08Qx?U}G79)DIsckP4`g!6T z*i+h(q>;`R81ia?Q?qdLuzrPH;*bZcrA|d*^>7K#C|aOGbYl=39HtN`0&%NbC2JNX z+Ch<*aB;RJFQI~?MF{uan83qN--G}C=gIXqzAe{1IN0EX4KMnb01&6yI!-3*IOB7= ziqgr7FZoO+(`7Q5T@zTY;Ugk&crE}rdEmw%EcWvB@BZr3^yP=UJg9%~YqP80`U>7J z|8@mAxms6Gua#apg9LF$J8#^Z31RK$UDMI9W+FywA!29-{2(0NUD;jWV5N+4zs5$Z zOM=5f<-iJ9!82N!Ut1d3I{my_vrlFjrvnO&uP zPG^_NbbdvTxdctz@Cv1QCsWUYL{R42H|a~c$|lP@-}uvL^YFne{*^C9Cy(D>DGl$d zA6-#g(!lY9yO2&Jt$wR?3OoCq%PKecpH}T6rqR?eJIbpg;&6 z3q0DzvoTT!o1|`#ZL;JKJc^M){Q}2g4B?Cpqn)+FVH_iD3*%WFn_S4D|M7xwRZ*7} zYO`j z0LH3oZV%L`fx%Jg-_iM!!E~<2s6N7lFjcWgyda|Cr@5|-0 z^0zsT9a$EeQ@8n=fw6%txl?7;7&&O}uM+U?XHVe%yASGbd@ou4zwgKu;RX#jRQis7 z`!bo#uTla>kXYdiWMtmDFRayi4y^DzBz-_x9-+I z$``Bu`3JP8EoIHXh$GO9-6D|WQmr!D7&8L|zD)R1TMqTN0>*T9PF75JjZjg zAc4CRg<;LUTtc3UXz zlE9GNhjf_{FiuW0nB6_8ui<$8$A1y6E?2US$s5iRXlKkZOpg=nseQ|<>iB5yS`IbRr34) zCtv;FZsb` zYdTgS4tC!Z4C0V}@V)O96Gm-Ut5($t2&`MU-LR!7)$LsHV@tuHi0Gf$G=%AVf-+m= zkLtzd(f8x+YJ*J_NRh@E>PcL(7-_np0Q{1z#)N)z1BkO!0fk(v`N>nZ9>!v_fz6>k|` zk)XY<6{$GJE9v{&5Ezy#a%GE3$-43LLZf8M;E3o<(*UMZG7FPQecjAA?{8=8^>tJ= zHTh4p$HgH=8l7R2kSnEPi^a(kiZ#zPFpjkwwKyWMoIEAqoW~Sn(B`<+LS4@f7%vt; zxDP8%ucs$>f1vbYxX&hz^C+FDLJ{pI*SzcGo8{edyE%!A?NMFT@gIHbdiTvgTkRfx zB8xx&soCVS@0?8T-@`PLh2X+eS!k&;mM|{z9M)H7%8Ia*Gi#zVP?Bs$|94`v`2y|! zDRK-na?P$=?~^p(U>fnZ&k9cV%yws-6m`3~`&lrs=tV4GN}p!bwm`yU4q2s^M|p(? zQ_1>;6i~BO*lr5?j>uY2Y*)1sZ$_1htpsbJClqj}aX{Z48TllwcQD;OZKk{RRhm~a zXab&)g(eKSeM$sPm}DC+}B>3a_n`aNq==Q|}{S<#Q)N*(Vu*Gev}&H1Z^5U0%Zs$9S*N+3>C z3i`vYUslPRDQ!QspK1YJp4$Ow)n0@fpN!3ak9cZs#tE%D1P-_e?DjL0E>fyafW17M zG_E7Z2n~aQEJMDf&%L9KqpYEzzxjI2f}ix=$ky_hqC_CH_IX6-B#X%kN0`f`yoM~_ z$w^-1DZN72DE>Cy)1ZkJDB>0ri}T6R$&*yOQRkeY?5xK8=xNHJhzS&7P=b|Fe9?{< zZRECzvdP&jj0$cuNVuJV08&opm*sAALg#TtZdOSksnq4>NMDjgDRzsxDzhJ*?eK#~ z>*^2xL~Krvv*^Ly0Z0e8_-XQ~x992olQg-16h@N?t>`8vw}JEYCAkz8vuQv>U?~Vl zEQPFvH%;|e$*QT$f?70eb%H3+foZD~Ze-U2GX|{Vo3%!U3n4`Qjcg-b^}=jm7aYi;mfXu;n;mKrlGUd~-zBU{U585LLdL*X3?r zsoUu9g0ItkWijKq=GCrDF1~vi{l(v$2eb&n#Vn0ZjT1mF98zZ0Gs3ZUf_{#NQWm##o$I&h)+SEE$A6O@Xi0ZWzJ^~Ya$hN92 zEa_#TUcV|e9V!Dvsn;q%XeHaG(EyPKAnY89?@88#9l3Y_a8Ni34=FI!br53M$t44g2hCHZ`{e^`zNz7 z5fzz^f=M+*5=+6VwY8F9t`&2L(j>2iUZ6&pQ|Xg8Mn0M^jeNAeu5VZJ(kT1!Sk#NS zP38J=hqPu(+8|zf!FjvhLbi6HRRc0YptTIJ!GJ4r+$M{=I;z)YSXVNlEg+N?fk8wG z&sa#22n@pz!yu4RNbYVJ7ZJySli89}@u~%6&IP<<)efREP;^PZ(FHx`GGYr65g_RK zV7X0*5?;pR#b!0pUv5KR_$rC!>v%Ffmvud9Dqi%(tYT0Q2 z=Pbowl1Oq$YN2%12`vG4J}7of$%z}Gdhirjz-XNdZ4DaJPt}U&K%ecBR+<;Jk7qF_ zvL(?cJ&v$OuvI}flU413`N0u3-!9LU#Wa;L~$x}wLf=s8<Ojn zz{`5PBnnezpj3#0tO}o3^utA(?ScVQ8eo(L3;l)V+2|@|xI{n9b z3NKY4s573vi&zvhF7#YQvSZ6YU|4s_5Y;|Dze*GUbmy$62y{}_ z*eW}|T<+7W1Ca4v4W2gRddZf4=!;Y$)50(lM#{Zik`{bTi(l4NMxe41@@7|;X+LWlXG=B3qA?Sx7)QL&-qe{JFbkRJmqUD-`Q zC1{aE3>Zl1hMDU3p+(3vmAr^!wYVjLpi+QfASJS@l14B3#DF5!XA?WunXrsOz_gbH z1SVHjuZyw;3A1lR{D0ExMJl(Y^er@1je0y<5pyR90}eo}o+q{dhONVp6X?rYQE_Sw zaR!3Y#ZcBkP2eR(#3QLmy5s3P&M^{+@ zx-SSzEiOYRlRtB{qT5Ss=EqjG$;uV_}4w?(aSOCST zqTQm)He5I%SBim7*EuW+ z^kda?)OzL!h=bx@-3EFh?)E<1GuCxDZaM_w;j20vhhyIn9KM3XaX1bDIUI-M0Fc9R zI1T_g9Ealoki&5}4gfhEhvNW{!*Mtc0683o;{cGuaX4PT7b}3IrK7nOwW9rJ8!Jt#&z9cK<5nU7fZC~|jN~V;m4A82vBsnBu(MucjxM1p zIgPY$pIWT`rvF=RT&scLkt<01yq##t0Mxe&uap)w8RQHBV;MnA%sc!V**mKA(pkp8 z5y&bLRDFxKIu_`gybAOMW&3XWJFfb6@%C@^dOqd}z6x4R=koH2iW=`GD{~yqPkc;N z<{+i+*i8n$wg110GLiyEhh@-i^5l=nF>{gY?yG6?u-3mMN6ON}Ij+pkxz83w0fVg_ z*ODE_bzMkQ)bN@*VLmDmu8cgy(-f8+>0jHP-73|(ENsFay49K1z27=xGb|Lr1@4AL zyQ*Q_gs3m&EZ?YCZhBBlwTiGTAWKoUzD7CUmwm93@A=_5N!_VH>SV zo7ETXQ;}OL@*`-;73d{a)G>~7mF!3!6NMA~h7GweeLcsu&u+#mFSz8V@5ioJWF83~ z38Ii8Kw(X-Xy3b|HoM(`7Uxj=BC&5m=vG#hOA(!u{pS$%nU#fy%>1td3a?$xIFRgD~FQT|b_>1a|w${&2lnn5ZNV?MIRHh0pXekRax zoHnBPo%g@*YQzxKK!kfLj$8Y!Q?aH{*U0+Nx6=Ap^4z6jWcyc;INYZrN=YsJ0nhit z!$@fPa^FJFQficGy+A_@to>K}uepxnw_cP~{8#$9&CP#f3E#TVE##Ege#im8Afx_^c3-Jw|ID0M&m z+ekrveKwSQ@TE{5hvKPEgDbAH@suufH|!p#h~?^Pr0Nbzk*ct)cP>e|xA2UN<324j zr`W)P<2v89_TK_0YdNvfP6cP*eWWXG$RxPP?6^;Fn}ITWEbx0TYriPv#)nZT1gLxU z0>bi?oDz$oEru9B#4)8_WMrEA+c+=#buCT@cJ9CQsxaKvHa;{9zf3MZ)0E++{ zITr`htD>LX!}#^5rUcyZR`Uw}nheBVe#4Krm4|N6(+%p(8{m6C+J2R zig?yOzto9x-t<2H6O&){FNj1UuYJg2&KLD=tAi{H`MxxtY!dtbt_HW&wce67tsHh= zfCVV6PR1H4ii5#{lL1TC&V6P1hVJ&CPs)2OlCLE&?eBQ>*^8AY>Mu#W4 z$JX{;MqH$7%h{#9)PPm^4PBew$2`y2sH~Dj4^wCRn?cB!J7dDiMZ}5t$=!EzYX(Sf zCFO$Soqq!v-c0aoi|6xyb6T$r&A8JsWBGcLZ9DQ6e*#iuEQ_AMCs2H5K!2IKUp)_3%3(n~*u$S6{4!U?Pl`fA&+h1w7Q%v?--eV8@-^lGiXTEk^ zyZ#RR=l|;NUKnO1yW?l0BNv+Le3w)bMIh9qN|Z}YdP>iB7}P;`rB7d zoBo_$DGK<^XT3#>Rzi87e|U(yTDQItxT~acktxF}TVXV-*i0A4qE9f<&n355_|FD% zmB%qzY2m-4J}92RR#AO#tD>$rxv&650n5E{9{weyAMW;NNDHD zpd6dWSLnsmA%3A2ixnLaN28`q1Tw8DEb9chek8>ism7DC!#8L8{sXh7#i`=;veis|@x@y}q- zXsvir;(+-Tt1(P2sec|2)LH&=dCk`U5b3_#Q0_#vL*_mfKxLJ;z-kTmP64cM6=dj0*Xx#%=dp(W z68?d;o*OX`e0oz#uFs%K+58ws;+b1XlH1&VXeaM?VP5sww@wOB>r(uy5)c5g~y58_4^(t@#bAOW%9!Y)ZS`*ckpJC5s__vzG-1rMr?pT9c0rOjz z$*+mYYWWx5vfX-+BkGLZ;pxcmV8=|89ZzDj>;Tz0w%;Q0c*t3i{hn<|(MG9nr)bmg z&aWmeq>GYU+(GFi^Z4A6Y;t3-Zruuc|HsR;?bU{iTk1Cl;3_Dxw z=UW z8^+i2!4@W;g$AW%IU?l41Wi(UKlwLwi*boW z9Wz)i9v=?K&raza(t$i?;ogx6({nwELw$*gR^I8|#atOiJQ6N%psv(Zc9}wu@tC@U zAcE=c!(W~Ler&Xi1WxGwI6!|oJZgxT5yX=chQ0g0ZL6N(&@8t_9y7_5A=B<%zPAKv zr91tB%ScXvTl~8rC_q<0FR-T^~&g#~tWD1`knf40K#A z#E_otdJ^*nXB5YV0L>B zxPzfY&OR5@xL!RmVa~WVn+QBN9**^WmVKtHSh|5-CZs zmsj`1We}B#fY{hggIh?*ASA>euy?nUz}fb+6u@eKfK2%+?wSaE@5Z**{9E;XtHZj1 z$az2fus>{FH#RO#)E4}&am>dp`;Zo`(WBvH(-tt-sDtu2tee5;Mf&5fd}Xb(vrpPSZ8f|DoShzTEBY+Tgg^+xX6XL1XwkCVBLFmuH5( zoNrugEP?G(-5Wk!)29&e`f0bC_Fgx=-{;}5VzSi|2TvCQqj33$k?0Wl4r2YjfrSWh zdB$086rHpCC+GruzXI%C(O ztU2nif`6dGPc>+W8`)F$lgUy?+ziJmdYN*k{JT5Ng{8tsP>q}dTs!-K0_peZP!&ZVv*cm4f$qax>4F?LU;k!UQZL*ok|L_y3 z7Go+}3LCEVQ~LlSv5~sRh(&_vVx38Oc@r+Vs`&FYU4N-6HG>FH4Qm|^YUXA_O7sTP0`ZKaVVQ3H&4 z2J29(%28q&=e%Xf#4tqKsI|e*Ay?9WP!tF(6n5H@=x}^~xEU@<5HncwhUN|LB#4{9 zmC<*fuC{Ar9TSH8W8(Us`WR^7k0}2_l0|uLMzwjsOm(neBi5}43IT%#+#|Y z&&8YawWc@CclNK*%t4#~<1OA7H@6JP5)ytB7U|rml;FfeRJqd`UxUJSbiNzZk&Em6 z^#U>$1^)b7(%?2$dRT?JwIaqwUQH2;4}$`O%qG`aZk)XnQJ!6c^b3NF#1JoOBuUUR zY*rdOtv`u?OP6-J5fDl6g)ANyMFYh{Rr+@!PLmAN>&r!DsYb(BsB2HYr2IzU>obFm zWGqf3k}l=2r=tnJA#U1m=oOHL4>&vPtr{_ z!LI~LXAUZAJ*^n*mku1Ns_NdcZ(Cp7UyDIal;wXfVfpi(cSghxC~FEjZQq%ACQ~Hp z0;ubod8vU#Q$Mz&x$sfcqcOvIP7E^A-ZXZq6km*G@vz-J9`u1#Hwd}Wo~2w#{y~i& z8_w5*;GD^Nk{rRT9y@UYM4Qj2o|9+#KZ3t#fW|tY`Gy}*D0ZrA>R5wm92#&g&+TO4 zaaklfU>m;5({K?N2wq+~{;-MlkD=vIv0l9B62MI7_mPzO?j z9v}CwJU6azWIgo`Wh|HTJ?Eg3-G(^ z-&P=fF)`2GqP4cs*%c*p`W38 zF#^yF(ayZyLdUhlo#V2olgJ`;UxgyZ;G_!tDdm)ut=m{ zu@exA^(c=z&wcs(xwxD-C_azjH+TDG4VUvYj4BD;PTqvFKRRb@^-U8OO)O0~C$GHH zx}9~iv{BT$ex9@}ep+^$s;9$#jTmhBEbK{dw*)?(Y6&BvrU?l@0|AKPR6hGs`yKcG z6t!HdK*$KTVzYx0DzjzpY9gXg>)}UM5~N8n)nQPQJ$URL9Q~VR_!914vc0B}$LY8_D+VY6w&E6VBagsu!}QE1a%?VGA=_qq?Ir(OS}l@bZ~tMBMykD z15BT~TipjhX<*^nfACuu_b)l%kAUy2FQ%U;=%kGmG0hC9B%0@B#x!NnXS{@(S9<|u zLDC*8jbxs0;B9MgEaAZI(?PC#k;Ni{xwy}Ir~7EuG9Q|T!~srk`VjyLhZHf4>88348?ziv#!Q=sXZ59$-@lhxAL(_FU05+q9G?BA!*ZKl))Yp4$eyz?NJqjT2OSMK76v^ZI1hwu27KO zhkVTWkmqwb&XmBV1VoTy38GP@x%a}+nPq3{S1&yt_^Xd0hY27>quBfLQ&iBYU?vQB zzKxN1+CHN2WnmJYtJPtnyMtX0hz4esV-%-Kl$?8|C8Y>|foEgWZ4Ec88M<9jSG@Vj z311p|X}is_gtYgt;yNt|r5`k&FZ|KKn4Y4NN=gtqsol*yMfUX5@gq);2?dxZ8Ss(Q zH|UO`j2k2s+7fc-c9PC+sA}FE%#L3qJ*krMaMZDN9t3=NZF`J^Gk#OILpj9KB6D4;kA zWiMV|A2Cg?1D?+M_~iPOY0Nl=w{ZjAHv(&4hfx7*Yc0xeA~4pB57oWT2##+*H6 zn#E(X5o*LHuY8+J{4##sgX838F|m;v zXosU#Xb6J*B2q4ObVLF{pc~Gklw}Qa{x-_!-ydpw9+9Z|)Mo{5*Wa*ML`ZQf1d-EA z61QEk>W6I-o_R)paSJM3j2!oP-w~K33?gJeQuZg%0F}8W1}dQ)blLx{v5u|`J|ainGaCOX05ECq~z*Ao#qH-plY_S{O3!#rWqj z$8dt1cZ<(@4@$_WabjUzLX?E5Ej-_Z;-+P24EdSUk`(hkLg5H%H4;fRC{Hc+&_t?k z$S(|>Yq?VM>3(|QpsqnoUQDBp#shX5lwQdo~xZQ`$PZEw8_Z5V>zM^=NY`v`?ARr2!Qnl{~L> zytC?%FX#Xg-Y)`jPNV`0-@j=AY0~~iLAkc5dAPr9JE2g|G5}EElhSXM+$eXuvtt_Pfd1vGbuzC!yO4#`T+-pgbx9sCDcuDz3bbcPAA2QvhYs6s&I;O;wC^+P)Q_Wmh7d| z*CvRqP}HQzkkqe%a`b+7x8E(bg4cWy)L+1yb4>gf2g!!W}eA+}jS*lu#Jdx}8 z`ad4;9ErWM@yf1=emP8T6^UHwrEj6MI+S2Ki2gpdYS>8UA=hm&L>hyGlMCC4k}X%p z4Jx>}L8wuM8BOGbKXV7xy|SCJUymK)|5IqY>`YJZWmQgb<6(~=1b`WalSFVtNApQ zoz+tDi~3zp^k(0BM~;!T%TMm{JdtoQNU56unyhtoa%SO!xG2;LudAUluUh?;bZZ1= znyai5zvPHBZOy6Z&%$ygY;Y%~@RTa7rmrqel?Tq);VpxKbLew!zQ4?U`8f$MSm7;k z{^9xvddb-YVMMmK=z-hUGLYYdKpf{kEIaz16M%7vLwM2v8tI=Lgg90~ zZ1A%;NRil)rd}tv)w8jRI#PsUUYZ6^V~1y-_hrZ4PY8 zAD_l4EK$cdv?bpOAqMKPIV29(U?j>ieeb-F@65Uem8w_34A{i$Syi)vjj_S=wY`ba z1=@(YjA15iLEnmyLKtb1kQhGbyp6eQLg(MpPQozv8KcOk!H!RB{D7aQy_-vM*ZdL$ z;c7J38DvgA#_xH^C8mipA_a9TB(S0n%bJNusYQdNw{Lx;S{rgP0HF^XGMY4a%HpA= zf9ki?|CLvxM21St=Fz51WkfdN6e{AnwasX6q3;Eb1HLYQal)j11jb9oo~(?+@so4c zP!XB@8UYmcyD1=wg^1+R!Z+MJd+iobYA}Z_7D;WRbT>LyS@C#p#z^vjmn?-6ZN1;F65H ze(!!4LR-OS_dKoGnMYz+$s7?=^&5;DeOLd<2P5dZHu>n<;;@ZxcDK?No6ZR^wRxSHS!IHCVvV8Mp67%?{@V{+TO{zD95^&VzQbTE%gtUY#ODF?s zCCMRi8s(Xefb=OzAvd-| z_%W=qk;{SnB;&7cAard->;0zBT2W$JRS4F$d)3KHU3(<1s9UL~dfLSlEiv=lWBrg4 z=%ZydAoSCm(&|3lhE0$g^C+dK5sT{F7d!r_QX?_|VuNzkNTm{!h^fZdab(Fj*sRU$ zNE;!C^I}524HlZrgFMPo>MzG;j2%R>06_Ae5>&#UtG}Z5N5#?O$g*SE9fL;+kipYn zbtNd)&CQvqK(R&3R(0`Xs?jo@77z4)6P?2IL9xIh|Eh)GV(+!T(WYL_@o$k;_VK*G>^O_T%?62QyJ$%53jh2F{cVDXrUiQ%WxV%Hz}5ojZJbv+dEk zf9EkMu)7~}MWnOGvhWN-7RBR^mQ)ogLlRrZo|c?fzl9ykIBoW%8R1kyuyA0G+;&sq0%D8XCjt6x4T}HAhd~gr5U4k7hpUW;QMp1=#b{fX? zGTM3HVQejusNp31ozM4?%gs^_&6BB_lI%o4r3Mi2JbuFjmP@iK<++qy8BP>kUX=Y{ z%U1?>!236c6i-uFV4{iZ8*sF6FoeF$DNUmy0K0!+F7v|*{bar`6Zn!O8?x1;7P)Y48oRh`_Y-ecDCg<1Z($ zl@4u*^>Hh7a_1!7(sd7>=<(y!kX`a4v#^RS+K~+<;JxnHv9^bkJ8~_~84pz({ghIV z7ZHs4J2I=qWSeslaT68-9?pL4So+Ax6o5^pf zU@YmLmXe2O1@px{IT5nLAo)S^tzOk45j(k1?!>1vRiYn%RmsXPOGih|gA}@pD0io6 zdT3e?#{Uete&O^OkxR@Ra>>udwUW3fzmxoUB*+!h<1ar(mpX?9_+rlWF0aQn)aDom z0SeD!`8CSyQ#%?Z`!wB_Lfc$`Bj)^*#M3|43)V8-QVB>$f&huvaZalrHUg)40&LiN zg`l6lb&-_Fk9=}q7MlxCvMaCj7a$AyS*92-51z)Wp)hLdBucj=52boSX?I{(au13J z+2J88ovLPe?mrgUusliI@DeLN^0nYv)L#?=hS+|!J@lAAGynadsR$JP35fcbas)z2 zVn^VRf}xcm>#lc8=Ar(<4^2nZ(qh!9r{d>-jkYLFef2u7{j#oCQB82S?1p*X17el% zqGVi@7CO`+rAGgxS##g*D?(Y7D4En5)LWiZn-7S z86{>eZM(FJm;K~54-q0IvzhHM$($=JpR4_w{L52yk6?Z?FoGo$UwgwS|GoF7`rZGm zINyKF&xQ4DKK2aPnA}ufX8sUsd{P*JxiU4hsN^2W2kgp6o4)Lsa`?|?f)Tv>Zf*N? zy3fNo?R>c>3lu4^X7m`<0uM6+s=RJ$OxH~~W)qBjXI;W~3GDd8wujk&iP%!bCqp>M zdI+UbY=QBMx#xxyNX3i)THVOkQ)oS%`)@r1VV-*d?2^_Y*N_-a4ppJUQi$Q^gU-bm zT|(-Tk<$R;F!obFcJuR}BO{IdY_lAv7`y!weCMxqQeVrvoh+<`_TlEy0Vv?t?*iRL z^hWV-%S+>7d9ll+%crx~movvlA?H)y&BqNoIAR4$pO>owQ@?F=Q|8{QytC%t2;KYq z^(-5=t!;#Fj1a5I%Vh>};C)7*zDtVfeVQo??9XtT!57*SK4c!|+*1Anvx5%{Hux2N zomb|fv>zU&t}~2W6rK0dbkh;06#{Sm=w{G~Lrt8A35TmH@(t>uBrGq{dz(if@xrIf z34PBej-2bC0q;6d3-3k*dNrQz3tqj)*>NsFw~nv3j>DU;&znm^Qu~duvOoSBmhtRU1vmx1D}@yTZoCjUVaq&^dt0s4JxMl z^fdG8SGB6(D0voi1;8RjSca8x`d2NtJMZ9bG`{rs*teO;)~G^^QY47qz}XR^EADU! z%V#h31M!D2S{I41C)gy#NXc}z6nK7k@u*tvC9m3#r$McPg}?_Z~9O( zCAY@B`0M>lhSI~Eh_>YMIRm*C`YveyKY6Wwy}@EMx6^CkkoaRs+Z*6c{_6ArxMUs_ zsm>4ARDH@60AY%6KP3*>CSK{=CW<|XRJSSc_qcfMdwsNb<@On^ZQJk(L!5-4dyKgd z`C+-*=E(W-HgD>^){jkeO@?mQTxZw?hr)?X^xn++q~;9G^K1<+ejKC17&-I^ z-e~Dzt_aAgf%Sf@#f0^0T!gT`Vu|4?;Y(GoQVBCnFS=zz2(*<0wPq@LkIQN6cMCDE zjGhkIlLqCPdDz_gA6fZ+IVjIUE(%eJ)iY3DEe7+g<#s z5$Cv`#&`GuM_r9rjs3Zys$g*??w|CUg}h@~oF;}G8fC0#=1O+e1}Uc{L?iD}wH!{k z+jDl+)Z#jO$}O*Q`^A69xav*gV4l5coRC=F=`W+8^hzRZp$1}!DfT0XsTHMVeh^I) z3sG@K?{(QQao^prW>i_z&qq^_zgA^2$mvuaUzz745&#Ehq{xPeHue?1+e-Echd?RA?~zTSP@&M30_6%c782`(lJxmyh!tFKoxDcp2e zWK2%rvz%Yu=qLp4Y}Q)QV7Tz&;6lC#pzgL2%YbvU3^3HT`33GcrP1V2gzA?xBo_pC zMNcu5pj2$iIu$RmTdV0L38MWRdG~AVm#>rPX83*Prtj@Pmii=?rJP(*&%H-NbPRm% z&~UiWV?jSEZ3nK*q^w#d?SYR1>z@LUVGw`*btOu5E(m7?f^A#PrWG&$FWRC(t1}(`I^DGQq7(X)bMmJEqH-VAT z*><$(g5A+udDR`k^ar;8fiwfC{*AVT$a4B<+}EnS`!86tZQ@5L#GU8DP8xz#SAplq zfj`@is%xSH?;--33m&z^Z?qWXi`WC6MgzNd*D#QNyt!%LT@2nr`v4dBeZuQqf_+M%QP)&%26_m>Cd~n;v5ID%Tq>< zE6r7RN4k9mcw~=&Sfd#lBotuCjzHKX@5P{%I1D!!pqH=QYO;Y1`9#DXIjv=`u>2H?Ev6R|jAdCM6g3?llk2{y&)^wc$UwUlj{XHOy#Fg_b>{q@ zZwm`Ypx;uwSKkRsZrd^7DrfH=hlJ2v*M+1b@TXNc_0nZ8Y%?&hqd?yYMBtMa;-t0Z zAd=wtdGqXf<1B3xd2GuJ#CM5-1c#zO9Y=N7k30d}_IA=lLI#ql233wcib4fvSk`qi zEeV*+F9=8PKRBuf8P0zAZ_L#HZS-`pyFe7D0AUJ9Hqp{=u8%cOCZm2AB8BR_=Cu=7 zc1J@kfzuvc;Ju%jPPOC4!6^}sP#{U_glrt>9jnD5Jzh#f_UI@$@{c`4hhJ zD{nLQ^!0-3b?&wnF7be|`}mEG?`{1PX9HmDO?c!jeuE3I9v4I6PebzHfj=D^7%}|O zkHx|ovmINB0Ce0q-{{qIj4YS0q5lB{`>sP@sM0n2^#?c14OuyC&~@M|EU;~}D9Ys& z6I~yiZ58#mQAlD=nA$AP=--Y21prR=MXuERlXa?WLgFKcayZ=<0FZeOA?_}``&;n* zSJSBf0iLD^d#f>iwVeWi@K>0pBqxm?TrvJD?wNYD|JIjC75#=x$MbzliSMAW-XNZM zaUvJdpio}gy635xCzX4z^Z|J{qw9jdRD3z@#yqEUR zr4XIl;GfT3L{jMi)VNY{r=dcV&ByS%?;*(V8ko17;BUX0$WT@$;nHe{xr9##7cO|O z|WsMnc`m9E|$umwq38wM3h zY%?Le^=pS$g3_tpQZ6J810o85mv$SD{1Ms%NR~(T-|Db=n zk)fzE5EH)&JcRMm+ItjipE`>_G_d)5Jch6MAo``q<&KDMZ2D?%Tn$C-jtnG*nFhlC z99y>pA+4SQ>0mAR6*hBsAQsBWoIDl#fF!b)DIMprkLN|T|3$LSnR)RuTr?DGW1ZeZ z6qmXCEaP-%<|gF}t;q>-@Ij_&CwcwOIn<}&_Y5xp4TN!pgF|VwthQYBoT|tC=X8Vb zxF_=2u485x59$+pC8iTB9o}j!0rC4KZWZJPK*k)4{D{nJ{wEx!rmv!zx6edS1E=+9 zyQ9~l-K%vWqvvP;$Na~Ffai`_zEB2K$}ULyJ;8B^T176pus6|Ci>Jt@#*Io}tb`A} zIoTSE6}JzOjj z`c`ACKAxsslGj}F)lH(FA&04Mbias?pxCfFT4ButDPoypL!7WarhCsx(<()SAU{6# z!uyl8rrxDYJVGfkcD|ekw1P~y(%ytnpW#j&))T3U+}<8k=ulr!{x7t|Y!%Tii;Oh#2DIz0zX^HXC}Ixf#L z*B`cAyuroc7oHY%i{A|xZcJ7!+f7HqVNy=qFqZs52>IkdK2HkqMq-)Qyp@e~5nJeb z^o;~r<)yfAVb1+ZJU!eto0aaI$&0f?_?69q8 z!I4M0+sl_`;*?0ZjC~`g)$J}X#*=VecnCgh$Ivo-M@&SX(L8Ftxvk*fUj|RC=`Sf_ z#&lND7U4s7$o%0~cXzv8e5Grk-oyj0p9 ztN9;k?a46k!f?dSl2Hx~spfKMPRLgU&<+HTbb7I5BIz}Gt=y2uIB7ABrl)saAIJ`0n5%bR3%~#`A z%v1Ch4`3VgcsLE}Q+3OmH|xBU^NC_`$*I^$NkEeyE#^jK71R0GwIoPJeA4Fv>>yr-9{gAYk+=^LhU<>(>Z3Zpa=5V2f8)5hL6c&){G* z;NPgynQ2rZ4wXsQ)Tymp-d~seVd|k4K+4?4%$!20xyc|^%Gmgg6L2MJKngw+EZiTu z!&qp2TX6Q8(|4cKXn)9A-{mCcPouUSkgIX_9v8iML8Z0ZtcNyci34-8a?H8)PE4}U zMO#h3>D)RT#OE7}68c4It`kiVmFGdp;kM@WDOPYx!q03P7!rI(df4%OuE2&y=tA|! z;g%4}yW;0xn@_)zxtvUwWT+@`)t^o_U+fjVa9B4dI$=R|hgylz|#;5ArPS zh7%?fXaIui54HVD`wN@i;0g{V(|qwB9mx3=Z{s4~Gqo5Ky}8>Rt#IDDz2xb)__NmI z!V-%2x#DW$oCH^b$ znn6N}DJY3X2tMQ6a8F!{e)SMe2aZ2q4tv2neK~OO-PxY8+$Tz{5#~sxFiwxNv!by` z7gA`zk6?)c3FP1y$+6hAAgm6m;mkRF#MB=eY#*cq=8Ea_5ik1r^-6-{5uE5(sFMMD zC}`Aoe2%$8&v%U1)Qe6|YG^axug1{I{zP8d?5qPns780!zlv=jOCi$-NuE>;1pB&B z#51TCGR$;yc4BVp-FrMB#fMsy7AqDvHz6TXYAGjFT>>X*b$YOhH9v?bapl3ITQB@! z{*DoA^!m0b;0L`WO3Le4M{)`ctDMCx4c;s_0hm_koq4eBn5c1yxXh3k7`YBve$6`mMMzO^OBn*k_i=zK;>?!DZ{Jadsd zXs&_(TvtZ(RsE3437yR3gWvc_00-E{Gi@h7glQ~*bG2(90et(s7M-xRt&1P6+yf!3 zXWqmVG?v7)Jl*Z3i0H@tOl@#04RC>Ip&{O9Dz?qS6eyA^egr&%i=2qkH;coh`_UHq zi{DE`x?oe6a-wcEi06Qk^I2rqX9R|m^tw5Uh7C93j9rBfsITePRIn;~e+jDg!Ex-Y z{LN|mEkgs|v4746S3A`TyB6cj^u>!JhZT4|j1+ zFs4iWj-i1XgNr$NFmzC*f4T4g@9yxAtY};sG5uE6?VU`3aVVO##ro^XffuaEHS}G0sXr(GrmMfrd%te{_4Of`pfRs+hzDC3am^B8TfZRv1PP z(zq5RfURr*7ZLCN>%_t=I>x%A9ij&!5vA2sBsUEc zsRC1Jx0^jp9+V*FXGfFR{p^4sj{NTfALj)=S-JhD}V zrnFwG{L83)uM}KJu-p@{U+eW$F1n4jp|=fh;EVljhDOsY!xsx4*FIZGoviQ7u2&oj zu9po65k@rs9(kzOU+liCt%D=3=`(9qY!%->x|`OQB&1iar`?f;F0rvEO2{I{ps9U` z;XGQgs1F8{7@qL`<}3*jL8qtvTEK{~ljYq}w{VESa-n$P^Of`7+uH#myX2t7_X#L{ zdVNi|WpWEp{JTk7L~RfmG^a)@RY9L@0=!iXB-8ln1Qt|VX!IIaA%7)qmto5uNax{H zAD(dklWfFtM>Z!rn|~+D1zFbXtQaV zHKPJZsR{EKg?k5g?q+$(ShSWF#`m?orTMlGO0q`NOFuawJEF$uaz8+qfL-HC{d)SR za-}ghC~ArCZ~~|!q5Ma^MOux8ss5Czr-uU<*+ zpMbB)+T%^0-jPZe(M)(+jV)~|!$344E6?m-zMifo_>?qdv*j{!h@rn5*Yz&!$wn%E z+j;#7npIrtuZVN!$M8T$jSb$XcDMdp4S-{jQe>HCfmCN3MgsS23Pi^=`-GiGI)4gQ zd7RVAQ`imWv{>v&rCqKQWLBBsT;ysRgHu?O(Bcy^_yGD}>Kf?X5>4dKKP_BTkI_~6 z9bCwm<{`4`L|Qb|U`4uYC(u=V(x0uC>0|{=kjx&6W*-scN&LQk@uT{VM|)=Bm$YM% zk9;TzI{<(7N%~U*S6qhY{h%SJGi$L`2GZ3&vNB#};dhN*U5E;EP5R!UI00o`D%+4$ z^qUp<$;$Bogk%6dA|mL~Q#(2(osqq}s`+8nP;4@~XKoSFXEV`PjSAH1(Zb*2!$cv5 zZ(ubu8gBYt|F)?w>20rl3kHQ2DYY?N@wmbt%u4G?XCY%#tF-JB*h1ban5u^Sx%g0c z5!k%V_AvJH{HROLRUV20B1DRA{AP-zfK01$h||>aGBtwt=WAG9Bbz(Vi3b_I_0ZRx z%)}a6o(~O1H`yNSPK(4&vb!2WW+wjO(vEO&_fhY{fs9Tu}i{DVwonCgO z09NA$4b^bmOIh|gI4a*hD(1Cw=h*zg)%~qFQeJFCiToo6wLTj~#a`I|e*%FIe(>wW z#6;`h!GnZ|DM3M<1T_H=Y$gwvi2#yTs6*`M+zgN|0nwBgdf^65#i1(wW-b6z2h1kA zNjJ}}Q?%>AR0oo(=Zk~D9Sk5PFaj7Rg7`HV>QMMUq~9x6tQZ0)#VjH*E?Fy9(^0dj zuF}bbI-C3VVm9qnr|4Dp>V^w-%KcHd?Z82X4;?zR0zjZ^z$pZVQ2AYQj&N;R+eADv zGCg0MWFW0r-HHuWIWT6+S$YLVQ!dvF(Rbo3O*vSd!J(6=)kKF$6+|om5=yCzhcY2x zPyq#C;c>ccxMx`dx0#*~on&NCz|n-Lx?K@iCrfv7J?TUk-7KY@D{EVmXLeH3JAtE< zYf0VwOsD=cfQ*cej;=twGEUL5t-r^#?vFArg??EAq!$j;OGc_D?jLg@{>+wZHa({s z9i`JXO(y>8{#Q+KRw(H!R<2x${?XsY;U;LO5X%IR`2fk1aaQa^pxw;0#~oVd z7&+JCSe@CnDYxo|voswPnwWO0^pF%cNpUua9e}J}y;=bAfenYeNJZ5oBB|R@-nnL3 z0;HE2?_R{Q6rh?a?45{fHY0e`caI6Umx;nA_pUSTHrdxn#0qs13so!*1B!5tfYCBw z9HFCR5o?xmc?xj7m{XgGH{EcIUM*rx-2S`aB6UuVO%?DaZu=ExUPLSaGUd64^LvAH zOgYXmjFrnwzb#YXGeEi}*tyUNx*eJ4(!4ucJ)_&jO5J>8liBj7-|0BWlwUvN#HnGk zZk4D=ShtF03y^q}suHJCQ9-&ftJZnpc4L8R%9Z@P#;*2FT|%n7hnu*dRGGk2iggp6 zqgQa44$>MM8(R?oGVT2CrcD_yx5Jt}G#$k_&9ml4mMTD6y^L&gW%=qPdd05la~a&N zi7Q4Eui0*l0NuWmtL!;0W9UC&f}B z2N)6OkcDem0Ay-5BXYN9;W{odTgz2by{L|udJXnaH&ApFey46tN0l<)ty82A&^zOD*PnkqKGsLT*j+LgKqthx*^;qdPgTt)Qv-89Rbfq zw`nSJrJgkxj+;&I;R7%z+py(MobnbeDtd`qXTRVHpB4omKFLi~pYdzJyO|j4WbW*= z?N;3DcG9jJ9itnfZ%VM8LY}5X#JV=?)lJ5)$5*(aQj|FyDs|cgxF|h$6aH6myH0!8 zlO-Wy5emQJV-Fm4)KMsA?X(4I)LxX|Sa<2wL9tFe>vo2|*U7(>nAFtl-0e(yQw6+} zcW;Ff-aemvF3Qn@G9I`IddE;F;7Nhk*6NgiGVlN);by8sLnEzSw{G1kVj?Nbr828F z3Hsbbd2FK4HsMHh@6c4vuhTtx^`+|c?538hDn-55SXXAoZAafHhYOMA>1)FL1h7nm zKA#pq{N$hm17_YfAmo4LEM1dJ0wAO$NQqrx1UUsew^Ef6pqg-#iU&m~n3UzG(?nR+ z{;Kf#b=;y8C#y0S*WI&IaJX)Cs5+OEPOBU{0cN(~K%}B?;T*KRBG89^oqq7a2gjm$ zptgzE0b$ZtEyE2UW0fI_&C&n}`M^^Ex%=+BPu{a<&-j)tTUL;KMTs{_b)dX^KALwo z{#L1TQxlI(ILKVBDQV(*-UR5~>SNs~;d8+`6kMEZl$V7;lKx~H`uz}-gQ0KzBB&|W zg#ds6BDNC-hzS7UYdAg;uAP@vg^L0ZQY6RVIB?*=x^3IGt$+OS$HxPJhF7m%jbBd5 zifLeS;URVr*}D^Abh6LK$#A+6y}BKF=gQ*L1Zdrum%EtSu|Owd;s01MPXQbj1t8?kKH?<; ztKGSC=TWpNE;bK5@W9w*mtD4sG{H13N!i@D+k zbwKGxoa$tqi@!m-2K^*p=v}Z>op;`O{GYt}=9>?O<42fuIWG|Y7&H*h1pokJ%m7kW z0Auw)7$6a==6%+1(E*~BWLPO^m>@>&$F(4gK*NkO0T5GLw{Be-8f9qr?%gF90Wfrc z@^z!ccQTiDT3_CDeaCFfu-%Anb>7Rf5eJ(@QEa*%L|jBkca+=F&y+KO5s-T0#*I@L zV1g(;9tOi{4-ORa0EiMCR0D%JNBcLR2^{2LxOTyEAuI|&{KTJSIT}Lo3IN$38g~S4 z5=5)DIIRU4b$svMy;GN8e)(t+xkdm9@+>So>@O8RCA4RhLdLDrMP@r^&<*j=CZKkc zIh4(q<@_!b;Q9R+8h;~stV z(Q=j+pwLoL$Xs1cMChJ402(77~Q#Tx}8_QEC^K7TN9G|}sy#fvaD3lso*|a2P z(XLG5lJJH;BRpu}?&Zw5ozn&erdv3LxP}v<+JKNK#T-Ym$SDx|#oc{6G|B;jhT)vX zx?`ImE$!VX?o`53GJ@TH`|V>vKN;V&Y11%Z33|wga&^m{0pKtpMd!gy&{JUfbfVHI zR}o2*3B@KL>Bj$RF2nXT^>R+7sMEX!prHMf=2;?*LR!I%=WBtBVw_%fP0+i*SMK?MqqwKM}RP{1wFE6oCRzyrgBqUj*8 z+yPRyQy@wjb_%Oj7@5kM)6l8->Z}A1Eb0%9%@$6w0&W6VA>bIR(1Ok~9TfN}M6l3F zt)R5G0$7IOEa86{4P5DuMJNIe#3O=Hr}d=47A$T#-b~eVkE!l4Y+Ja!2nwBoi%M9y2YVusMtavOsx`!K^rgn58Y~ zTTt{fK%~Ue*!bZb3Pf81!??u?fWbC&{t9gY4FI8UE$P0A4|kuZuJ9R;9B}nQA@Q zJ(rk1Jp4}|zI{150E#KOnailce{&)%xdh5KmMF&=+Q5)I2m_rZyqO*pQ1m@OG+h!p z1EAoSGh*Rj1d?_Q1kAA!fWmJB%!q-;Z-=Qt9Bb{_v!`687D^dTAIHehkwbx74FMiF z4VD*Z1=A$rmSlFH(N>Gp3Y&$o|>lXNqKoglJl1KxC`SSz4&;Q~8LB$_rLOlge;6}43GsB!ED7DreNkdS{7JLgkKUoz%YVu@3&|f!|q(J z9d=PPbgbnn|A*|l(z%jzEqL;fj}IFK8z>a2#zyoZM_5BuqpSeo05|QIpxVB2394~` zDVOZhgJD8*N-~=>^4lEKm|tTdj$jFFlu@?p`Irolev-dtI&8|;DNnflLl#R(;1QvF zfE=-3=cTqj6_|b-5ZdvYio*FE-r@+3;5b8jO}5r$L(B#WzZA8- z;!eNC1pt83Dg!d7tXFb|!L1KijRLSjVA9b;dz3F*2VM8-OmJo1c)u~e= z1tiCf{JvC#zav6nx?_dA&$EiSLaa|np>~8`nE6$}nQjujC5|zcIYSqEZ*Htya;Yw@ z+yuGgk^z!SE*T)Xb7hnKH9J$a^ S$V}e=0000T9?sco?f3m~&Tq$RX(-`gQ(&W@px~(}%j^87L;sBp2>9Rbhlk+&C$GE}jJ$Q- z?7V%gJZ({AY}~AEp(^jK>}_>yt!zGe{I(TGL4l&G$jj*YEghMC{KR1YA>_kV(CC%A z=D0-D?dD1gUKgp@&L@y%eK@TtDT|CYI93_54OV@LA!5xWN``LYE7O9d!MH$cc^AxI zyz6Kdhn>DY_V)gWvbz1MhsuM>;Q$N$>#HN)+fVjo-DN?`E3*=2E3>D!osU7`j@do2 z#AVKDL)-vn4JznYVUJMv&7Xk2SYk}j|IgS&+4vcY7D>#E57zi9EG_Ku{}>0Tsq+t* z-A@~tKI`*5G7$MM9nZ(mhX835CwkJ>{h4ap`-Q8(m&?UMqR;XL@MsFSBU?C1rIqYk zaAZbp&IcKueUD%KZ~fouPAAZHDfT}q)D4!zhHF&{>Y0J%N!FAS;LorwQ^ODaGYl#Y zcsKAFc;zdMl7fwZ?B|rw9j_lqmkOu37Sbz>An-*1U>vUk1H+n73cb@6tN_4Ix{k1< zI6F`JM{D}s9q`BXw$(H*!?njU1U>jRY(9)3wq6(3k<@*8+X{q=rGarv@yDf}`M$gv za0zuG*oOn2H`b{!2Y@H9KEVMPWaF-z_C}Ev?N@1y|8n1jTS~e4bV>7^DGoAU*RREg z5_*d(qfDWiw@ngX(J%BQ%QqwrA`2Wq0Q&=$&?}?fc>_W!k?z6So_Re`WK30~O)FP< z<_C-v{#p|`2Wd2I|kcUCu-sK$lM0(;%%f^p3L+#%_bvbX!r?e|`H z{Pow615V+~r|Bdl5-HwlwiMCzZFOqnYzu5oe-B3=t_8$2-6g7ul)sXBgJ}IdLd#wUGNEXl9nsCbQU#kP*6`p+EvVh8sKsKKVcCclf>|XP%!M3x2 z2MO~%2TA<)alIrKt~clEIsDz(lF6-{?)%;ZQFA9lz)ye*?u8a4Am3Kik;>VR_0{4A>c<(+^z*{afa}sBL>`iyOfP+U4 zX-rNX1W-?N#yc3lM2jD!ZhuirwWJJM6A1f)v^vc~(BCkd(nAClq->PTadHdI z>Clvowb`<2c+hexfsccK&+^*-;CEU{U5fbN9IJ*J!Q{h}wL|NTQ5E6}V;eB=#jq)} zjp#qe$Z7@ugN&za?nh3c!jRcit;~R| z9@_NDiWjNH09K0&NT}qF)aw=P^qp;%c7pR`DrOYbJqL&;ZCRf zKT7ja8fVU+`QPKUK+v|VI07|D5y-aM@OGYV>j`1&7~UK`$XKIV&Sj3kGumSR$0O54{lxe z0%xT^%zrfxxMC<7qD0De6c)(VOO7BZh7Davi*Cq!mV-0UJX9r++j#9^MpB@15B?eK z&Q8Mb-XBQ;?&nKY-KD)xPvS@<19WZ;GmZGKTHd$Z+^9^AuaKQSuTmTt%6UT3k zgJxPquTlDuXytX=8FeP%Yi%Yq@{Dx0txFs&7E+IGGp9wrKU}7Jrvdvf}5EkAwcy~uW~rZGRX!EAU;# z3m63YD4-^b?Hf80LL5E-yg4!bEy+W!6SDp?R7utyl9w3$Y5XHtW7NVK@BT{t8~Rf) z3q;icc5Oxo;DbW2r7KW8?r70|T8fYPvny&5 zr@&PUUJ3H^d+S%kJMKyk|B~&}<6xS{0lz63S|g|av9;V#WS&kE)y>79%@~ zjVshw$j?!48Z*P?SeCZu#|#GXlx6crTJ0f=J)h$CNBFdAKW9l3heBoqR};^iJI(D0 ztM>QRKzpQl(T)IgT@q4k1$4DUEJ?>qhVTgF>y2!D#P6|`JWa;RxKuL&>AgS}M}nz84wehK>B_Oce-?4LKEaf+=qBaGU<&M?!ITZR_xW7-Hw}qPU)H+n@Ww)} z!hkkQwYMUz?3LfZpi&kbilS|^w;mQm&6E&EQTz*8&G5iv6W;#EHD(ag(!m|92#+@6 zcL4@vI<){LQb497-4n+tj!Sa}j368k>;mI-yY>8A@|fdxSM+#yT{bQoLhpo@90Sn@D&Ftc zXTp3;qIf+8ZnsAYTsdZ=^sw?3O7uzEvZ%Zn=&=vmX+ zp?<>5y%fd%P@)r6_U$9h!=r!7V@9M88CdTMMlGO?A+vsYZ)I(b3Iqb75PaTm^l76y z_aOB`rZ~Ff+GA7tLzLL8k?BHcE$fc_TA2C|p+6qvrj4K#gxU8$xg+7YvL8ve_Rv9L zVIM?}K&e47X~AVSKY1Iz=6O9R?Wj;iiRO;xlWHx*!zaZlUeVY=hYFJk2HtU`>`s`z z`TY`1BOw1K%X&wje+e^1Ic6J%jf10A#l|BJvG0Mt-a+gT=GB!rCyy5I&L4y%i+sRw zN<tLTYaIcY1DB07$6&Ad0V(#LWc*+NofT0Qvbx;J-gH&H#tS5yj8|?ri}g(Eb9*x>x`kLheg+=b~%Qv zH#|{3&B*paRFiTQ2Q5@~0jxVMK86CL%6fTg4$=sDPnw%TJLUZ8TxAB@Pocs-S0K|4 zZ!8(YNO~n#n7s!*YVl+_Yg}U~nERg6cMb6xj_L37)&lcZW^N;X&xz#o6~v)bUr{D1 zsLCq+0)pUG$C6QtkPcvrwIWd8yHWx%K|C4L)cPY*@>o9oe4G%fs25k_vXCF;#mfYP z^ag#SOraE!)D(l#NOlspW}=T6(3vTlc?WYN10>r7x`OSdxKN=IX)#O<_l_D zo^COy=htb==1&|*NlG>d4-B@h7_h;QK3S&dr{`&oIaR`7B*I$nw3a#E(k)t9nT4U* z*j_;YNnA+eymy-A)8*iumsN4qPIYCRO8{llVPa7s@lH{~CV4Z5y=j_u$-?B)q)>ao z>WO$w`gtNJ*G%k+#e<)rU%&o&$4Hoq5{j2LiyAeiBw=0A-aZ0vM^J&%oBsqX%bW$Q zh}A^qZmwI%NR9y-k#31k&Y^z`wRae$$AsCdHFQ9rf_!s472Sokt&?9g;LIs)1xv8A znq(lBG3BLHrTBZ+MJwDGV#5souzwjse!n{;CEJyQwzZ_!FncVP@{izNO6Z+_0j%QT zNyMbUXjE(7)_Ka{_3*cN*n4UyIdu<@SSs95s&!0;!r9dofAd*FtCEF>pFCQ|FpBJL%PRt?RO}PpmW9c!f;6X&g>q=z3+OtLV>g7HV+t)=1x4k|$a`3@K>cz_ znzznRJvTv@Y)pqKY!){_n0YbZdGd` zjV&YDPvEB6NdE`a$eY!usp?uVwm>3<4_)#T>9BhfB!;D#StR?Wp0; z$nMbpc$~g1He@0F@@@8!j)=dJtXC?KIEHI2^&+Wc0}`fQDbt@fqY)e~kCMi5ElbE2 zmZe?FSbbb^$i!#CQWU&1Gor<6Xr%8}Ed`Y5lyD~k$YvMEjrrHWqFk78=!@txCbIid zV^7vQgnD%HL8Q>Ekc4b-ul9c_{^^NQ@JBsF6XY-Zk`7c)OMc<@ydrrx-X;ltY+HUZ z+ZuNx)tW;~hI(2uE4dw$YfNg z&xntg9j{Qx3LB|%AjmqIp~-lp>y2vSmh-R*OGhLn;x-Ybs+OSkp97S~>@EHL$Wtr$ zC(wVEQnX=Oi><;ZPJ-If*wwTSD5luRGu$O2KlYR~Z-q0yDF)800 znw;NK&&|hmE>#4c^d*K;mP(S!MICkmP{-o&qI`!V$%W0%$jSZz62yEnWl{A+{V&8Q z91#B!v#}-VAUG?I)X;1oHLdK-{z7GMd!*;zNH$un-qlkXz^ySJK7JTx$~AI9i)^}2rS>~6VxdCpHtx~s^f(1_AlKd;d+Js^Xx38qR) zf#X%JFz>L-ExN!X0SZs$|0KfXZ7&GmCo?UJ8C0HF! z{%zAkb`YjDL7>gwQVv-?yapWWC6C*kogP%9=c&`0wGHblKMFs(H3Oyrkbc3oxDwe_ ze&oOfp*S({9ihQequPFOK*|%%1*Ncbh7j}Xdg{B^%VdWKzlfu%Qbc2!=0245{m}M8 z$D3AVa}wmKW+?nnwHz_)Z4v=K8_N?1P+*JQL*5k?Ro4YdrlXQ*lTwpg%Lcih3L}xD za)D4F_czfIpDNX{(XdLVy&wG2vwA>Mk}OwNy+1%z`=2Ag(Lgp4HLht@GB_$`-^st@ zHQUGHq*@G?6_}H!*hN+C{j)J+U|P-0{HuHV>0|=uQ;F#*C}J`ts;$?`2){lQX6<_O zrr3_F;Zd)#%ia@}O&{Z8FaCQ+FlnM~d$OMtzh1ij}QZR`~UX|bdmL*knI*Da~^t}KkU3v$&QGh0F%Y&2z=X;oNU z`490FDyqLIV50E&O7S?1+gEb=sAa7FOwf=P>7c<_$}L-E&$h1HF(8 zdJqnU{EGZ27$mP{wePcMWE1|D8b0GHCMk;aA9ti;P0vl9?$Y9t3v^EgIC}V@FVj!b z+&3*eu&>v_STofe>}s5(z{aG8IQZjuXUqSFTZy_7|NOx{4X(Kw9O_)I&U*XU^dfL^ z_NGqE9_{Z)6^5cc!|v7$Rq+m=3v%ZgL}oX{Seh67yyDwc6I-fTsD=4$dC4iPH{xMg zdp#}-5^R|(Ks^~6MZ5JROX%4y9+QW{m&LNbck{3S7VDg~4$o5z{W)1pA+3cRV}fR7 zN2_=r5dVgV`SL*QisGn}g)7Hjk;$OQ_@a|uwDX6z@7-{4PtSc?n{#T_%Rjs~@UtEM zBs=uabgdXqWe9NM-VkR+PrsmBdHcG8DjM6a=dzWz?)9w8V=;n%f%4N=G%ND z0yy9dx!COvJnB4s?6II;TgK@|aP)cCVgt=orrAUag5-W%u|3sxe&Tbj)!VMknKb%jZ7nQo}EL*y|qYSU&cCTa>wS zp=r}7#!%>LX_!3;Wjybz-4FR1X+4gIpX^sZh==P8p}xa{McrLU=ef5+sc9#Of!&fI zv=^d#yZY>kIRS~}9ZAM1oMdB`y6@=}fUT$d%kkX*-m)JLl)Ak%2|T$k3l1ysVIwwj zYw{uJ{+RH51J+(f$b~7_APRBJfVOkK#RfqrHyAwxivD6r{sf}nrXe1vJyCnQzH?*m!Lhe9DqC}EPN=M$RigR06)@KDJ6Nh? z-yPT5ihv&s#lxGog?Lwl5b$rIAWOWGS@n9zD5IqrhEXKAn7%KN`v?{Aa_5BBfyemai5T{!cHO1f8DQc9#x{$a)?J&Mfohow~$H!*oJikq5 zU0q$QT_f;lNdUoBubG2SR0o#SE30=f6`<&6zhWcbp3(fV4PkGqn z)cELu?kAo=?Cm9ul}~!D&m&UO!2(9L+)dMa#Qq0(foY}v=wFV?<-kdEle2Pik=Q2~ie()_d!{W^*` z45y@AwpEnZ9SvCzCGu-zaK$#q_*0apH`H+Un76++$p73O{}w%6rrCr#xV@)q@gVph z!uIsyCWSIQHqEfCVJ1NqpBiCbwwslPNPOnR>zq~nD*3@_Sj3%4JJg=L_!ZSqN@*8? zU_*m~m}1tA%>X+#)o3EoN3RB6Rm&32H$$!jG39T`(@yDN>z+VqZ^b5~VVz8&d4LI=HL@FHoz(l!ncd1xbI}1gvGMut>5^Op#2SIv{ zMwm6eD$)i~ii~Q0&9-HiT>j8nBau%XARyy}7V1bsJRdCD_Wiq#@lM7{-mf=Dc1lWx ze8Pp(r}biFZx7wFdd*pE&YJ`rP*!lbJ9^ZsT8JEpMEjLieb+Sj+JvQBx8sXArP7Aw z-sl?nKCK=5*pKB(JZ~YlvoIgwihpMnr`arLTwVig0!&&HW0~NK8Z3={oTWGuyY*F} z`!On#F%FdWcDtd#-L7XE%NCTTY6SI8QAAW<-=9E#bBT`^kY!8z&Z`RUpm@NgFPK4} zzwHwjy2^aEQLzBgejgmjUu5Z&;Q#!yC`sZ0eOro7QfMT6T0_TMEjx16qGgohZCkso zkqcgLE0Qa~iT;qHIj0us6I?X?wGrlj&A4I4jA^YfsPRqQIPj!>w;zO0(JZYZSe6+$ zdNak`eaCrsAw&bLoA1Bip@N#pGSqK{xXcVFa=y9TO4F3A{H*50e}q}5CeNHnk(CiH z|D%t&;fd(bFMg#hkZ2T$<-8_9+B=cgt&p@4hn3j+T9(#^g3SBm=oLjhnOtIoK&j(I z*BZgxM1nvCQZr;*49Sf35Of2^!cSg#E@7olcu^`aRk&0&zZG<;rW`+Z9b+U)l6sj| zqDi=hTk%k!QZz|3(vG$=IdY=*0kNj3sIz~HmbT^k+M`4UZ=;B!MgypcsmU@}$ zKAba41>eP|MJKKZPRx@r(+-nXO=y|mG8pVE;~~^gGievI0Rk8gl89LMH_41@3ubyp zEFuL~4aaFQiA}EKf1Hwt!+$Z*MtP;Hw!=6`zY^Bqi_ybyAB8gK-nl*x-u|QXr=z{w zi}>$cp4>uNOpsr^nBL{?mkPW&Je$gjpVRw^_mIc(#a|fWZ#tjQ{r#WZ>*uDspS}H) zc{FzBgvwu^himW^Qr;upy??#33Z5AYGcu7jk!zqno;dd}@Y*r3hm447^r(-Qjg(lQ z!?5(3Mb$M7(dI<@b_4!h^ZEUIcC*8?JZka`J)#@@>SHQ9y{q}MV__+nwK&r@CYZC- zzZSA5*6n|jW$)H`nb+2_bJyvXC+@!I-W&p*BgVxj--$(``@nFjoX_ZkWDD?ZO|x6> zH51@nHT~?_KL;%|tCj6ZLC-+@ZL@oIM6TKR5VwND1;#;lc}FLZyz* z{UZP&JevgQ59b~erv!K5R)OTWbkS&?ot+yF78X!2?)`IbKG|vhx4#VtAeQuuSolkv zz=vO|q6atTH0WOfxl9}cbFLG|OBUD57uL0e{PBLU`YwE6BCS$OZ7n{P>F#sUc4|Sq z@%rdb(H`Vq{{R~byIDtT<4|+`HomKbN1SYHxNv%V3zsc$XCcB;>`OTtS}<~P3G}pq z(!72}P8IiSQ?9G)g?y8Z-2LMpF6|4WL~+z;Pv&+PpVj8j^+1{_ChY1a!_sAyolMJs zcj)y-euf2@99t&ZUtBJ*GW@ajrfVkx^$tY~^=_t|Fr9wO$Xq2YWY z3=MO$+yf34I`{9i8e`ryPqh_Ub84ymqZu{r&yna_H@EfEQH1E8as7XR;QyD3|Ib`~ g+O^;xnI#JUeSv;YNWa&Al>rnL1r7OHS@IeJ#SGBj*4rM;^vv{hf4_e3 z_pVQHT^GU;j&Q6!#PAe^BOD<>!V!)TAmIo{2#|1uBLqk|!Vv-_9N`E75{__$00~Dp zLV$!L93eo$5sq+#00~Dpu5HL0+4;5a{g+KY0M~Uui^d^y_%X1g1PEaF_$d?cnBC{{ zmHOwv#p4J30RSe7MO%E$c0n*`>$q-{p2x=xe4j~wOQL}L3Qc^jshd_4_tkM9eBEsc zAT;7pO*d^D{|3F*H0t;s10UA~L9o(^XiXMH+pwJm{avZIn!0V9co4==GG--Wnu&Kj zOE(=`lmw^JXhE%If~v@{XLx|0Z#rh&$#P&U9fzq*0)O-VAXUOx!rBM8v>T zg@6QIM8M#F2JYXIWtaZeHCZy!NvA0aqK?39;YXkd1iq#u2rWc#1s~URz4e}B+b{Oo ziKgG{INLiHISwBZ9Pp%+xBa;FTRIuJx#=(?>zRtk9{(qBY~-+@W-0qq02)a1b{~`N-{)!;6Vq7 z>=_x+WLi+s9r)mblfPfDH(rdzV?A}Q>D-PCCGi|NyBi>Ea)AVCD8dwOm!v7+*EK+v zT&7vvZNF&Blq8873dEush^r5DGroua=l@#&F6wam$YC$~!1MO=0q6R_^Y`T->wpj1 z;5E?9Y8WN>X=K)e%RK_h=(N0(gB*ds@!v@ZbQSg9cG$YNX$#c z!ip&M4mme03!ZxTP8dxmp|#26yzc?xagx<~LPCI)p(fPv|0Hsh?XgM8p%7Ko1B6oK zB7F@I;!E^<^j6a-fu~1(u|Na1%`}0*EAvBcdpf^gRb5A}qD;8DdNm-I&2o#W|{>{>%$wwSS z#ov)#T+CUP)lgM!o4Am}auL4p7`CPeRmrq0jh4}K=c@kzf?7lZ8^)al z$g4wmwe6cWsbUfBATa(RL9YeYHg?zMK|?%uON$HVMM1pjZb8$uVIUcWU;Nz1U}kcd zX^vhTeQ8Lue64041aS$>*cjg3w;m*v?tq{;K#vu-g7L{LUlWrj3}@8ad2t-b^ZxpnKc zN^50hWm&q3<|2XNmc3)}#ZTP_nSppugM(f7z9pK-MFg`7N_8G*sl=!1)(P6_DuQwv z)fH+G*|+zg9~-yYE&)V>X1!6-Tdl&)N;7G+bhve99KQ1OLy#Vb^^7ZbM`{p{IZKc> z=Ao%ffhk6}%+&H+yuy$yOJg*d6j|(O5FaE$|7a7Nxp-wL0qtQLL+@UPeF0F1R=5{P9Qi2kkB#@mdjso{ggri zN_PoJZ)*?=5|&C!mT48Y5+D@gAkOjR$8Lwue*7*54Dw#}%jk1};G{%TA!%emfjywB z=`GPBbO+Q_c@F|apy)GdlXm*JAaqjj1vgN8(W4s0ONl3q2$0KVb9nU4EdwG;XA$A) z$L@y5?!A?zj`Z7V0(}n$2hEA3||3@mF$82K3`f8#@3Xp4&HK<{|3jz(~%3 z;8>ds5P*m(AEfK+yLg%Q0MD!vpp!e<0ZO;&)hi(J!C|ARQ^>C@ps8hV1vnBh4ZiTn zd*RMQQ#}~~+*JVa=Aj67ZWeTT1i8D+BHx=fsqmwaSnd-5+7a}&VHF@A-9QQGlYlna zZjQoYAb13(X*k6~{^Dk5@sb%eHZ%ZVedb{p$t0nrn|(d6b__rO$+KkDA=$hLM&@>$ z)tjnC1k@aRiI6Ltpt~L7u_2%UY_CQk(o6)sRxLN`wQ81}4x0&%iIG9(#vMu}HoX%` z2#`%6>~`TCn2|}m<;U@fO|u>bQO3MHED`+lueO_)O?c0v6^tJGKoNwX&JniNHB1$( z6a%T0OOw%I`Znqal+II&C+ zl{iGx`yiIy3(?dRXo+Fi>_kEa5Iio_AeZofE7z@w5C{a0ryn~4pSb@p;~UNnTrqiP z0))6oV+EYbJjj^?I5BUSEFK_Jf`VQGpJeThhe7j-vWz7!5Z5ZsL1W=fFqTh1tDb{u zwE?wy3tG(jsC*duc5$E-a#UYh2IgkO>uwsPN1u9$>tqW%Or^WA_4tnMD$q3-5rO7zI&{ z0o*`g6@ue{myhKoMS3kjJGmw7E{~eUsOO=%bOM@-Z-QN$LvzdpS&Kt#FawFy5W|v< zyvWoIXf}1I*Bel;HKCkG&@fW#fUJl}a;c=(0@+ytvwi_e7k4z;0kJ>ZCH3ViwL2U%8bKgT$BH9*MlcZ?d? z`B{k0+z+mG{TCAL>b)+jC=>(T2|dphP*mNhL-YLe&_HmQjU{|aMsrDHAZ6VTO%rT^ zr>9W+3B*%8ra}zu|B>MYnkyC<2%1Ktg@7SV(}W@d$Uw7&ikiquq#`XvHbJ%)5QrC` zI{y+Zq8^gbEQ=(^5hOE^p8g2zx&O-`snK;c2(|iYwVFB76KRje+>b%5o`m74 z{rJQoaI6+;i3UoIZ7ov=hnxkx)YWUH>$0wftY@#|u)BX80TYWPU?>wsGs{GP7^r2M zc(+FYHVwSP_-Du6A7p_Y-rRBFiQqF=T3n2>TB@%v5&&k!MoN0hKcD5!Mvi&%p`= zK&Y>>Ud;kDN;rvY$PZ%3Euy%MLVR$Pxjh{u-~<#M$+*!X&@>qU90V)@!~>4Y0PG+? zAv4TIjYscGB{diy$w0Ls!-^VeDjLS_|}#eVgfhY-Ztj)`%E03p6EtI$}v0K%m+pbhN<*ETog^~Je6 zg;O|26TO|q+jd^@2GOW7sCk5A8_X-E*Ng3?3Pec(1wE!hk%b{+9NDZP|1RQM;E@gFi=j0Mxm|p=!a$w(73_&vpGLm{KsW1$RLwN31 z0;Zxxu1L~Z3v~01)vFVG1XTn%$Co~JKhTm7y9pe-0wBJfWM)5r%;X`W+HkFY zUoxw7)0%0bIY9)S?zkOSrr>#Y9nW1WbF+)wz~FkWEEm;_Wi-J+&Ehx~(-y=5Bmxai zPDN26o*aO9JOQTBVql>O+0+F%zgUCw7w4f-uR$^i|NnN{z}gtekrrA`>6s zZr^KDBghZ-d)Au3Jy;#LE+K@a+M@<>7@rVXl4NHeFHp#AeL-eCgiI&`L!)N#buYXH zb0`T?!@GaAYQfp_StRW(7#+m-4N^`MfJ}mgiw3x`8U-&5&0z?Hl61~E0 z!e#s?x4fLk*KS60Wbkq(JSiDpP8##(3 zNNCPD3=od%X(quD_?jSYmp9E{Y=;1%D3NttylepY*ctU^tzG z<}UD9?P`E9x3AfR(uKDnzW>2%1PEIuV4tr+9L_t~3Tm$RnT$-6BS5gdg=qvHX?J~a zxXje@CbjLEUW}MS8ziEyWoU&)n}URr7j$G!VWB;_-5@wt34Ja(2K?kh_p+o(z6zG< zLN1$K!0$7zO3WvQ;ek8%qxLdkw+?wX{aC6KX=YDDa`HA%2S$;wUzKo5Ez_R%VjhCm zLssxw4vAci5HWYGCODGQSzpj!9m@5WRr6iCwzmQlTaL|U!130L@>h~_(5&%HC~uW0 zfyFm{a5!B+SuG9{^cXMLYTHz8ggD?W-(VQJU9VO1S99@_$@tj)x3Y-&ZsZ>Q1`uv( z-!Mej3@e}eDI^X*0bL6Ku07ItM;~!{>mO=%z^I4l8UK`cLS8E}v8b`O2MmFmSlsG& zoeoGGrycvC$G)4l{XFG2Ii01|9H(Ozb=Egr3n(rFmlBD$Q(=N;qVM7rs1Br1X_nB& zlCA&{GOZ5n8H3yQO|XUwJLmde-xv48pn8lyLizM&XpvU_BG~0cyyI$KpIv!v!AUfV zQ#j*?K4>{GhfPM0z>@i6quEBJpU5{89?NhYi~sE~b8by>`D(>2A+E8POp1QZzNfL3gr(_ZVLgj zj>bp%BFYa?{sQHbHv|%#D9xo)c=xy2os}l#YH?`mxKpmZ%9|+v`DOy8pE@g6`Sxj)7f_xWwpCjzitaC-`Q*p$ zU>dT=ZjdzMDF2WH<@ZtU4gung)*58tb0|MV`Ad{1HvEY=YpncvG^ONqO)Q*5Q~q7L z1CGvPdd(sYV(T3f>oQYowZ`zwDVKx8@i_=-C(F|y9U!;}8V8y!8^!7}yPV)M(A?zn z0peFJ`mSIHI$c;+mX}xX$<}(@udA+O3=)m1$pc?kfMX!qZBm5*!mS?e(i_Fs|Y1v#yp#K zlq_!R4VE+I3KsJcwQ(HuWcl$BpQuAOVRtwWu`Q8l5c+Of!(7)b1{U9pqU77v#NF3s z1V$|u&>(^GUkI37x!iINAL^^m2LXbj<&PXW1m@bre1?m=4cg=0bzY-Ye|{O|7g7EM zLiu$Lm@6TKMZjB2Cn383VJ}9p3YItthxtkYyj@Pf zz8Ab(xusWmlA#5`4k4YkKx@TA0$Wbbftgqi0|;>i-LM%bDF4fHc*D0K7iseoW(s=X zxq;|dwR{ZKO);Xv6m)2n|M+PnIAl53F{II&+-i#V+c z=*y=O406D}Z`=8@?=kW{SZvGV6&5uua3rX%tboxdvPeCdTMP^qd9o}HmJWIMfMIpG zNgG6-1|enQfdZH|p>z||;%O=DyFHLv`1!3y4eFIL*isB8?)d^3LKIf=MP4`G(HwOA zq}>{gdc9t&tr;XF4Kkcccr`C>-vVT{=|w>KLzKI2mWkDmG#3U28XDDDcVDrz7~JEzoHzeG1^ zY6Xg=T<+$j9$tnaF#u4KiSOE_$xQX?uIqISF%1KBs%sY%P}4IoHgOmdBYRc%oh0#Z5)lM50_ORS_WN^b$?ax3xKM&RUV^F>H1_8`TAMr8i840mSu|TWEiijoQL!H5o4vB58=u+zs*ZgAj?Oc_uKh z`VdwyB}vR(?3L5<6c!c(k)Tv66%9i#$nvhrFbbMpzl8EE%D=u=pzOLcg<}Y1pj(UJ zBm)~{Rl^&(*d|+!U@o|>?%llu014DeA^jk8sezMJfb{qb4B*|ocIa^^W-mf{@gxH8 zI4I@Q5OJ0vD(kG1i6|?q;kHM-?KVj#bIM}LiXJGbRM%*swg3g>)Lux9-3F1&6e=c_ z6=)HGk47VqNG4%yYz(HSry-LWVyTcG#M2V+Zb}t!DDry(1OiZOy3>af$;nAB zU;ZCZsP7f`;xrl!`1Dhse)m_t@oRA6VxDK;3ai|>ou%05L|U%HC!`B9nr_Kt0tQg_ zOpQaid=LtSd(q4(K&`k0rQ(MmR!)IdK8L1Q4ta(F)sh7@BZ1svFPc!EwxE(>S~-iF zy{X7+sQNHXz!)EgQ3OU3wFl))c?8~SCnv(HBPAY^&#$cD?^`p?oqjjDd3Pu$l@-GB&7 zMHhJhj%yAMl&&T^{7z09g(mj+WE>~;DClT1RZ1l&6z@Q=JPM6U9$Mu&unQl6I4#4- z&>>J_gPuPfi4YxEG!kK5OooPsVSIc7GDAb`Io7$6ylK4J&(|7$OVr?!3)BlMms?&D zMPc3C^{bdz{j{L3!-4VZ8`T)Q0U+;kU{GZBignkNPO_9M!MRJh&dRmz*JQ{pFJC%! zX7<>fci#Ev!w1sv>e(W!)C`EKtW7p_S}Qu<@@uZxW$m_?Ok`kjn5#7sjX^AqV3`Nar3)}R=DUbViIKjS> z#vmK>kFTULx_&&GLB~(evx17jAR*(M?%S7w;iL-3=E~4SA{_yV#~X0+vjCk}D9f}7FRUV9NFew&5O3z-mEa2C zHMypVsYR(RP&_dCJ(n<vU(=8Syw=Azdgq8XF`$OkF&g#YufyjCHb1rLjS}f#CdP}dY2M}6&@$~s6 z$QCN=-Y~XtMAk5+$Q$_x%Fk~VIQj`7j5qV``zU`O<)h$LnO)a1#x(JcoxBKFYfFw= zr1|W#&puZu6uOoQNN6%Vcpw9h+>(JzTmc15(|H*f&AJMG3i-Tg8S4Uso+o$q@l*5AgMmaLpfUa@%EKss zXDflxZvc_Fo9-W>+|TXd>t5fR?E6Bc4rk|<8R@+;k(c#sHhcQ{AHML`TCa}}MBuSo zhvAV!LyVJ9-jv0)1Oo{JO`x8{^V^j`#Chu6BGj7(XzJBZ zfvPC^qc6Ym?w7vwrBBGx<%6DLl4odRZC&ej za=QDvyq=!?Q^l%sMoT`jvYU{`n8u39H$n`%qzy~Gbmle=ODHhudp1a z4HB!%)bi^)oOTJXvx;yB`H0&F!rDLy_Q`U%2aNR>)^#VB%N0b)Q&%ka48gImumCT< z_#%Ax;fI&~<~NQbNWS%5mLc3DAPE7oVR)QA?~(<(MYC#m4BDq9_Zq zr%#ij?Ld(gFM49dR<_H%TfE&*yBWl_nN_R3 zS3zR$Cmj+Xs+CH$R;@0PCO~ZhZ@lpay!-CE*YvxYCP8zn(QH975xZuyGz3T=4l1R6 z`{YH`9ySQV#xArZ$xBFdXOEwF=REy=AyAWCT#Iyz)5S?VEyBg=bTP5H z8D_g3jpDAMQM!Bda!|nPm`bPh5BP zaDcFYpWS)h>2MSVngCF&c8ui88stjx5vOft@y6I9bMY3l*=+sQS6_u%t#)1K@65S* z__crkyYS1u`fuQS&%ex`i^q08PomoLhuiL%$~1?pj0Bw6n+Fdh?C!a_)0z z+o#frD9q0(X;F^TploY-nJui9%P~ddBrii@rJ97!Qi+%l+ zlE6Yft6jq#2QUaVtPJj9ES_(1YvAafTl zRGO_OHCr2j&JtTT2MKK{xs$k61J5?YDS9`RwB#Wk*UYQtc$2vMWq1 z$}_sKSb(K`nWebjz;IBDocycrfB$*2QEreX8qW-{tX*9<*jneN>6u!lPuzWiZadxF z#PU5{4$r}|1Ll_7%}FjJ;c%H*74(Anu3`caeb2(BOUpL3Sn-7aM5%y1HK*enfK|-9wG*JxG<0Y2gbC+De94MC44V*T4w|V=~K;D+^ z2Ni=v-CZ~Br2QOo@d{LPVi)o&1+Fbt>p5R_X&f~EcEjW7Pfox;{+Hi@#pV3dt($dsHk;-(1_Un?w3$iG7(Y}=h3u@hN{vmknNqtL9 zay{NvsaIRsrKJkz80%ecH(+*McWwz0`EUQnKZf7>);E~rVkc;l9SsngWVJ>UzV(}b z2tRt|t2Ot0VKq{lgVll5F94F<>l}r#d*u&AAUhoZWxR zpWbu-qn~{A&La=pJ2pAJC!R>gR8?c`OajBte% z0;DGgBdBOv&0e^)*&pq4kB^Nc+|A|lXL9*hW`FY9D}Sb`YIH;mH!{MeZwcX>jm2AE=?p^z`MMFCJ2dCu2g02K_Wq}E+~>D zM{&YyD5@-@?vRy8G!jWA5{W^Sfy~g*(CFyc_{7xY$i(Dya(rSkJvu&tx@t6)98ASg zQ$=E`CNsVxdh3Z?nx89}rl|*j(d1mC3Y%0y5CS9|n*}0&(8TOo#D*<`h!IpnsBB_MwBN?knaudu*x1Cx#N^cU-aX?p`womuPVE^U8W|g? z)a&+JZ@%$90;Y@~Uglb(76Ky#NI#FYG!cQR&f1fjCKJl3%4V0z#F7<7i5xs|0L`%B zbVSo8QPb=t6K;8Vx!GzqW+h3Qw=Ao%BUp0?kZ^2BHMy>ZCR7czN-dR2kw@ZP0#CJ4 ziK3B~%49O;kt0W{$BrFisqW#}ptENebo35KIIeq$;VB45I6{DgBOD<>!V!)TAmIo{ x2#|1uBLqk|!Vv-_9N`E75{_`}(DDBT7y#y=ztmP%cFzC+002ovPDHLkV1k*Q(;ol; literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаДалее/Picture.png b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаДалее/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..24dfd2caf72d559f22414382543a1116813ce9be GIT binary patch literal 460 zcmV;-0WA!5ds1Q(n?MT=BH~u0P&$Z{TbE0)h~Q$*7tp<5pMVw@Y<@D|uup%Ps_cj2!0B}!e^9Rs_ zy}W(%5+|8?rM1ohvm)~8t_G>Z)EJn<`l$+lKXkRx5ilttiN*$&ZQI$z zi&io$r}y@OaS@rh`UEP!3wUns)px literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаДалее1/Picture.png b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаДалее1/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..24dfd2caf72d559f22414382543a1116813ce9be GIT binary patch literal 460 zcmV;-0WA!5ds1Q(n?MT=BH~u0P&$Z{TbE0)h~Q$*7tp<5pMVw@Y<@D|uup%Ps_cj2!0B}!e^9Rs_ zy}W(%5+|8?rM1ohvm)~8t_G>Z)EJn<`l$+lKXkRx5ilttiN*$&ZQI$z zi&io$r}y@OaS@rh`UEP!3wUns)px literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаДалее11/Picture.png b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаДалее11/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..24dfd2caf72d559f22414382543a1116813ce9be GIT binary patch literal 460 zcmV;-0WA!5ds1Q(n?MT=BH~u0P&$Z{TbE0)h~Q$*7tp<5pMVw@Y<@D|uup%Ps_cj2!0B}!e^9Rs_ zy}W(%5+|8?rM1ohvm)~8t_G>Z)EJn<`l$+lKXkRx5ilttiN*$&ZQI$z zi&io$r}y@OaS@rh`UEP!3wUns)px literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаНазад/Picture.png b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаНазад/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9a0e4d0170905af59af314d2a5046811c77ea9 GIT binary patch literal 386 zcmV-|0e$|7P)NRIw1ua@rLHZ^ z8Of&5EOox}clbb4e4E&q(z2;F6gdc1fqMR{=X!oA+zObcseD%@oSKPStK(QjTHq)$07*qoM6N<$f|bOp8~^|S literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаНазад1/Picture.png b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаНазад1/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9a0e4d0170905af59af314d2a5046811c77ea9 GIT binary patch literal 386 zcmV-|0e$|7P)NRIw1ua@rLHZ^ z8Of&5EOox}clbb4e4E&q(z2;F6gdc1fqMR{=X!oA+zObcseD%@oSKPStK(QjTHq)$07*qoM6N<$f|bOp8~^|S literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаНазад2/Picture.png b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаНазад2/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9a0e4d0170905af59af314d2a5046811c77ea9 GIT binary patch literal 386 zcmV-|0e$|7P)NRIw1ua@rLHZ^ z8Of&5EOox}clbb4e4E&q(z2;F6gdc1fqMR{=X!oA+zObcseD%@oSKPStK(QjTHq)$07*qoM6N<$f|bOp8~^|S literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаНазад3/Picture.png b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/КомандаНазад3/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9a0e4d0170905af59af314d2a5046811c77ea9 GIT binary patch literal 386 zcmV-|0e$|7P)NRIw1ua@rLHZ^ z8Of&5EOox}clbb4e4E&q(z2;F6gdc1fqMR{=X!oA+zObcseD%@oSKPStK(QjTHq)$07*qoM6N<$f|bOp8~^|S literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/ПустаяКартинка/Picture.png b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Items/ПустаяКартинка/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..f02154247c2653f7aa4f2c50135ee47eb28d1f9f GIT binary patch literal 75 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`LY^*;Ar`&K2@ Неопределено); + + // получаем значения по умолчанию для плана обмена + ПолучитьЗначенияПоУмолчаниюПланаОбмена(); + + Объект.ПрефиксИнформационнойБазыИсточника = ПолучитьФункциональнуюОпцию("ПрефиксИнформационнойБазы"); + Объект.ПрефиксИнформационнойБазыИсточникаУстановлен = ЗначениеЗаполнено(Объект.ПрефиксИнформационнойБазыИсточника); + + Если Не Объект.ПрефиксИнформационнойБазыИсточникаУстановлен Тогда + Объект.ПрефиксИнформационнойБазыИсточника = ОбменДаннымиПереопределяемый.ПрефиксИнформационнойБазыПоУмолчанию(); + КонецЕсли; + + ВариантРаботыМастера = "НастроитьНовыйОбменДанными"; + + МетаданныеПланаОбмена = Метаданные.ПланыОбмена[Объект.ИмяПланаОбмена]; + + Объект.ЭтоНастройкаРаспределеннойИнформационнойБазы = МетаданныеПланаОбмена.РаспределеннаяИнформационнаяБаза; + + УстановитьВидимостьНаСервере(); + + // + Объект.ИспользоватьПараметрыТранспортаFILE = Истина; + Объект.ИспользоватьПараметрыТранспортаFTP = Ложь; + Объект.ИспользоватьПараметрыТранспортаEMAIL = Ложь; + + Элементы.НастройкиТранспортаFILE.Доступность = Объект.ИспользоватьПараметрыТранспортаFILE; + Элементы.НастройкиТранспортаFTP.Доступность = Объект.ИспользоватьПараметрыТранспортаFTP; + Элементы.НастройкиТранспортаEMAIL.Доступность = Объект.ИспользоватьПараметрыТранспортаEMAIL; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + // проверка для работы мастера в Веб-клиенте + Если Не ПодключитьРасширениеРаботыСФайлами() Тогда + + НСтрока = НСтр("ru = 'Для работы помощника необходимо установить расширение работы с файлами!'"); + + Предупреждение(НСтрока); + Отказ = Истина; + Возврат; + КонецЕсли; + + мТекущийНомерСтраницы = 0; + + ИнициализацияМастераНаКлиенте(); + + УстановитьВидимостьНаКлиенте(); + + мЗакрытьФормуБезусловно = Ложь; + + ВариантРаботыМастераПриИзменении(Неопределено); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Если мЗакрытьФормуБезусловно = Истина Тогда + Возврат; + КонецЕсли; + + НСтрока = НСтр("ru = 'Отменить настройку обмена и выйти из помощника?'"); + + Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет); + + Если Ответ = КодВозвратаДиалога.Нет Тогда + + Отказ = Истина; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии() + + Оповестить("ЗакрытаФормаПомощникаСозданияОбменаДанными"); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ МАСТЕРА + +&НаКлиенте +Процедура КомандаДалее(Команда) + + ИзменитьНомерСтраницы(+1); + +КонецПроцедуры + +&НаКлиенте +Процедура КомандаНазад(Команда) + + ИзменитьНомерСтраницы(-1); + +КонецПроцедуры + +&НаКлиенте +Процедура КомандаГотово(Команда) + + Отказ = Ложь; + + ВыполнитьПроверкиПриНажатииГотово(Отказ); + + Если Не Отказ Тогда + + ВыполнитьДействияПриНажатииГотово(Отказ); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура КомандаОтмена(Команда) + + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВариантРаботыМастераПриИзменении(Элемент) + + ОтображениеЭлементовКомпозицииКартинокПервойСтраницыМастера(); + + мТекущийНомерСтраницы = мНомераСтраницИВариантыМастера[ВариантРаботыМастера]; + + Элементы.СтраницыВыбораФайлаСНастройкамиОбмена.ТекущаяСтраница = ?(ВариантРаботыМастера = врмПродолжитьНастройкуОбменаДанными(), + Элементы.СтраницаВыбораФайлаСНастройкамиОбмена, + Элементы.СтраницаВыбораФайлаСНастройкамиОбменаПустая); + // +КонецПроцедуры + +&НаКлиенте +Процедура КомандаСправка(Команда) + + ОткрытьСправкуФормы(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ МАСТЕРА + +&НаКлиенте +Процедура УстановитьВидимостьНаКлиенте() + + // устанавливаем текущую страницу мастера + Элементы.СтраницыМастера.ТекущаяСтраница = мСтраницыМастера[мТекущийНомерСтраницы]; + + // устанавливаем текущую страницу кнопок мастера + Элементы.КнопкиМастера.ТекущаяСтраница = мКнопкиМастера[мТекущийНомерСтраницы]; + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьНомерСтраницы(Итератор) + + Отказ = Ложь; + + // изменяем номер текущей страницы + Инкремент(мТекущийНомерСтраницы, Итератор); + + // обработчики событий при смене страницы мастера + ВыполнитьОбработчикиСобытийМастераПриСменеСтраницы(Отказ, Итератор > 0); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + // отображаем новую страницу мастера + УстановитьВидимостьНаКлиенте(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьОбработчикиСобытийМастераПриСменеСтраницы(Отказ, ЭтоУвеличениеНомераСтраницы) + + ПриИзмененииНомераСтраницы(Отказ); + + Если ЭтоУвеличениеНомераСтраницы Тогда + + ВыполнитьПроверкиПриПереходеНаСледующуюСтраницу(Отказ); + + Если Не Отказ Тогда + + ВыполнитьДействияПриПереходеНаСледующуюСтраницу(Отказ); + + КонецЕсли; + + Иначе + + ВыполнитьПроверкиПриПереходеНаПредыдущуюСтраницу(Отказ); + + Если Не Отказ Тогда + + ВыполнитьДействияПриПереходеНаПредыдущуюСтраницу(Отказ); + + КонецЕсли; + + КонецЕсли; + + Если Отказ Тогда + + Инкремент(мТекущийНомерСтраницы, ?(ЭтоУвеличениеНомераСтраницы, -1, +1)); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ИнициализацияМастераНаКлиенте() + + // инициализация коллекций значений для формирования описания настроек транспорта сообщений обмена + ПредставлениеНастроекТранспортаFILE = Новый Структура; + ПредставлениеНастроекТранспортаFILE.Вставить("FILEКаталогОбменаИнформацией", НСтр("ru = 'Каталог обмена информацией'")); + ПредставлениеНастроекТранспортаFILE.Вставить("FILEСжиматьФайлИсходящегоСообщения", НСтр("ru = 'Выполнять сжатие файла сообщения обмена'")); + + ПредставлениеНастроекТранспортаFTP = Новый Структура; + ПредставлениеНастроекТранспортаFTP.Вставить("FTPСоединениеПуть", НСтр("ru = 'Путь к каталогу'")); + ПредставлениеНастроекТранспортаFTP.Вставить("FTPСоединениеПорт", НСтр("ru = 'Порт'")); + ПредставлениеНастроекТранспортаFTP.Вставить("FTPСоединениеПользователь", НСтр("ru = 'Пользователь (логин)'")); + ПредставлениеНастроекТранспортаFTP.Вставить("FTPСоединениеПароль", НСтр("ru = 'Пароль'")); + ПредставлениеНастроекТранспортаFTP.Вставить("FTPСоединениеМаксимальныйДопустимыйРазмерСообщения", НСтр("ru = 'Допустимый размер сообщения обмена (0 – нет ограничений), КБт'")); + ПредставлениеНастроекТранспортаFTP.Вставить("FTPСоединениеПассивноеСоединение", НСтр("ru = 'Пассивное соединение'")); + ПредставлениеНастроекТранспортаFTP.Вставить("FTPСжиматьФайлИсходящегоСообщения", НСтр("ru = 'Выполнять сжатие файла сообщения обмена'")); + + ПредставлениеНастроекТранспортаEMAIL = Новый Структура; + ПредставлениеНастроекТранспортаEMAIL.Вставить("EMAILУчетнаяЗапись", НСтр("ru = 'Учетная запись электронной почты'")); + ПредставлениеНастроекТранспортаEMAIL.Вставить("EMAILМаксимальныйДопустимыйРазмерСообщения", НСтр("ru = 'Допустимый размер сообщения обмена (0 – нет ограничений), КБт'")); + ПредставлениеНастроекТранспортаEMAIL.Вставить("EMAILСжиматьФайлИсходящегоСообщения", НСтр("ru = 'Выполнять сжатие файла сообщения обмена'")); + + мПредставленияНастроекТранспорта = Новый Соответствие; + мПредставленияНастроекТранспорта.Вставить("Обмен через локальный или сетевой каталог", ПредставлениеНастроекТранспортаFILE); + мПредставленияНастроекТранспорта.Вставить("Обмен через FTP-ресурс", ПредставлениеНастроекТранспортаFTP); + мПредставленияНастроекТранспорта.Вставить("Обмен по почте", ПредставлениеНастроекТранспортаEMAIL); + + // инициализация переключения страниц мастера + мНомераСтраницИВариантыМастера = Новый Соответствие; + мНомераСтраницИВариантыМастера.Вставить("НастроитьНовыйОбменДанными", смНачало_1()); + мНомераСтраницИВариантыМастера.Вставить("ПродолжитьНастройкуОбменаДанными", смНачало_2()); + + Если мТекущийНомерСтраницы = 0 Тогда + мТекущийНомерСтраницы = мНомераСтраницИВариантыМастера[ВариантРаботыМастера]; + КонецЕсли; + + мСтраницыМастера = Новый Соответствие; + мКнопкиМастера = Новый Соответствие; + + // СТРАНИЦЫ МАСТЕРА + + // НастроитьНовыйОбменДанными + мСтраницыМастера.Вставить(смНачало_1(), Элементы.СтраницаМастераНачало); + мСтраницыМастера.Вставить(смЗаданиеПараметровТранспорта_1_FILE(), Элементы.СтраницаМастераЗаданиеПараметровТранспортаFILE); + мСтраницыМастера.Вставить(смЗаданиеПараметровТранспорта_1_FTP(), Элементы.СтраницаМастераЗаданиеПараметровТранспортаFTP); + мСтраницыМастера.Вставить(смЗаданиеПараметровТранспорта_1_EMAIL(), Элементы.СтраницаМастераЗаданиеПараметровТранспортаEMAIL); + мСтраницыМастера.Вставить(смНастройкаПараметров_1(), Элементы.СтраницаМастераНастройкаПараметров); + мСтраницыМастера.Вставить(смИтогНастройкиОбмена_1(), Элементы.СтраницаМастераИтогНастройкиОбмена); + мСтраницыМастера.Вставить(смОкончаниеСВыгрузкойНастройки_1(), Элементы.СтраницаМастераОкончаниеСВыгрузкойНастройки); + + // ПродолжитьНастройкуОбменаДанными + мСтраницыМастера.Вставить(смНачало_2(), Элементы.СтраницаМастераНачало); + мСтраницыМастера.Вставить(смЗаданиеПараметровТранспорта_2_FILE(), Элементы.СтраницаМастераЗаданиеПараметровТранспортаFILE); + мСтраницыМастера.Вставить(смЗаданиеПараметровТранспорта_2_FTP(), Элементы.СтраницаМастераЗаданиеПараметровТранспортаFTP); + мСтраницыМастера.Вставить(смЗаданиеПараметровТранспорта_2_EMAIL(), Элементы.СтраницаМастераЗаданиеПараметровТранспортаEMAIL); + мСтраницыМастера.Вставить(смНастройкаПараметров_2(), Элементы.СтраницаМастераНастройкаПараметров); + мСтраницыМастера.Вставить(смИтогНастройкиОбмена_2(), Элементы.СтраницаМастераИтогНастройкиОбмена); + + // КНОПКИ МАСТЕРА + + // НастроитьНовыйОбменДанными + мКнопкиМастера.Вставить(смНачало_1(), Элементы.КнопкиНачала); + мКнопкиМастера.Вставить(смЗаданиеПараметровТранспорта_1_FILE(), Элементы.КнопкиПродолжения); + мКнопкиМастера.Вставить(смЗаданиеПараметровТранспорта_1_FTP(), Элементы.КнопкиПродолжения); + мКнопкиМастера.Вставить(смЗаданиеПараметровТранспорта_1_EMAIL(), Элементы.КнопкиПродолжения); + мКнопкиМастера.Вставить(смНастройкаПараметров_1(), Элементы.КнопкиПродолжения); + мКнопкиМастера.Вставить(смИтогНастройкиОбмена_1(), Элементы.КнопкиПродолжения); + мКнопкиМастера.Вставить(смОкончаниеСВыгрузкойНастройки_1(), Элементы.КнопкиОкончания); + + // ПродолжитьНастройкуОбменаДанными + мКнопкиМастера.Вставить(смНачало_2(), Элементы.КнопкиНачала); + мКнопкиМастера.Вставить(смЗаданиеПараметровТранспорта_2_FILE(), Элементы.КнопкиПродолжения); + мКнопкиМастера.Вставить(смЗаданиеПараметровТранспорта_2_FTP(), Элементы.КнопкиПродолжения); + мКнопкиМастера.Вставить(смЗаданиеПараметровТранспорта_2_EMAIL(), Элементы.КнопкиПродолжения); + мКнопкиМастера.Вставить(смНастройкаПараметров_2(), Элементы.КнопкиПродолжения); + мКнопкиМастера.Вставить(смИтогНастройкиОбмена_2(), Элементы.КнопкиОкончанияВоВторойБазе); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРИКЛАДНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ МАСТЕРА +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// ПРИКЛАДНЫЕ ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура НастройкаОграниченийРегистрацииДанных(Команда) + + ИмяФормыНастройкиУзла = "ПланОбмена.[ИмяПланаОбмена].Форма.ФормаНастройкиУзла"; + ИмяФормыНастройкиУзла = СтрЗаменить(ИмяФормыНастройкиУзла, "[ИмяПланаОбмена]", Объект.ИмяПланаОбмена); + + РезультатОткрытия = ОткрытьФормуМодально(ИмяФормыНастройкиУзла, НастройкаОтборовНаУзле, ЭтаФорма); + + Если РезультатОткрытия <> Неопределено Тогда + + Для Каждого НастройкаОтбора ИЗ НастройкаОтборовНаУзле Цикл + + НастройкаОтборовНаУзле[НастройкаОтбора.Ключ] = РезультатОткрытия[НастройкаОтбора.Ключ]; + + КонецЦикла; + + // вызов сервера + ПолучитьОписаниеОграниченийПередачиДанных(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура НастройкаЗначенийПоУмолчанию(Команда) + + ИмяФормыНастройкиУзла = "ПланОбмена.[ИмяПланаОбмена].Форма.ФормаНастройкиЗначенийПоУмолчанию"; + ИмяФормыНастройкиУзла = СтрЗаменить(ИмяФормыНастройкиУзла, "[ИмяПланаОбмена]", Объект.ИмяПланаОбмена); + + РезультатОткрытия = ОткрытьФормуМодально(ИмяФормыНастройкиУзла, ЗначенияПоУмолчаниюНаУзле, ЭтаФорма); + + Если РезультатОткрытия <> Неопределено Тогда + + Для Каждого Настройка ИЗ ЗначенияПоУмолчаниюНаУзле Цикл + + ЗначенияПоУмолчаниюНаУзле[Настройка.Ключ] = РезультатОткрытия[Настройка.Ключ]; + + КонецЦикла; + + // вызов сервера + ПолучитьОписаниеЗначенийПоУмолчанию(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьФайлНастроекОбменаДанными(Команда) + + Перем ВыбранноеИмяФайла; + Перем АдресВременногоХранилища; + + ИмяФайлаПоУмолчанию = ?(ПустаяСтрока(Объект.ИмяФайлаНастроекОбменаДаннымиДляЗагрузки), ИмяФайлаНастроекДляПриемника, Объект.ИмяФайлаНастроекОбменаДаннымиДляЗагрузки); + + Если ПоместитьФайл(АдресВременногоХранилища, ИмяФайлаПоУмолчанию, ВыбранноеИмяФайла, Истина, УникальныйИдентификатор) Тогда + + Отказ = Ложь; + + // вызов сервера + ЗагрузитьПараметрыМастера(Отказ, АдресВременногоХранилища); + + Если Отказ Тогда + + Предупреждение(НСтр("ru = 'Указан неправильный файл настроек обмена данными!'")); + + Иначе + + Объект.ИмяФайлаНастроекОбменаДаннымиДляЗагрузки = ВыбранноеИмяФайла; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьФайлНастроекОбменаДанными(Команда) + + Перем АдресВременногоХранилища; + + Отказ = Ложь; + + // вызов сервера + ВыгрузитьНастройкиОбменаДляПриемника(Отказ, АдресВременногоХранилища); + + Если Отказ Тогда + + Предупреждение(НСтр("ru = 'При сохранении файла настроек обмена данными возникли ошибки!'")); + + Иначе + + #Если ВебКлиент Тогда + + ПолучитьФайл(АдресВременногоХранилища, ИмяФайлаНастроекДляПриемника, Истина); + + Объект.ИмяФайлаНастроекОбменаДанными = ИмяФайлаНастроекДляПриемника; + + #Иначе + + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); + + Диалог.Заголовок = НСтр("ru = 'Укажите имя файла настроек обмена данными'"); + Диалог.Расширение = "xml"; + Диалог.Фильтр = "Файл настроек обмена данными(*.xml)|*.xml"; + Диалог.ПолноеИмяФайла = ИмяФайлаНастроекДляПриемника; + + Если Диалог.Выбрать() Тогда + + Объект.ИмяФайлаНастроекОбменаДанными = Диалог.ПолноеИмяФайла; + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища); + + УдалитьИзВременногоХранилища(АдресВременногоХранилища); + + // получаем файл + ДвоичныеДанные.Записать(Объект.ИмяФайлаНастроекОбменаДанными); + + КонецЕсли; + + #КонецЕсли + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура FILEКаталогОбменаИнформациейНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ОбменДаннымиКлиент.ОбработчикВыбораФайловогоКаталога(Объект, "FILEКаталогОбменаИнформацией", СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура FILEКаталогОбменаИнформациейОткрытие(Элемент, СтандартнаяОбработка) + + ОбменДаннымиКлиент.ОбработчикОткрытияФайлаИлиКаталога(Объект, "FILEКаталогОбменаИнформацией", СтандартнаяОбработка) + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьПодключениеFILE(Команда) + + ПроверитьПодключение("FILE"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьПодключениеFTP(Команда) + + ПроверитьПодключение("FTP"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьПодключениеEMAIL(Команда) + + ПроверитьПодключение("EMAIL"); + +КонецПроцедуры + +&НаКлиенте +Процедура ИспользоватьПараметрыТранспортаFILEПриИзменении(Элемент) + + Элементы.НастройкиТранспортаFILE.Доступность = Объект.ИспользоватьПараметрыТранспортаFILE; + +КонецПроцедуры + +&НаКлиенте +Процедура ИспользоватьПараметрыТранспортаFTPПриИзменении(Элемент) + + Элементы.НастройкиТранспортаFTP.Доступность = Объект.ИспользоватьПараметрыТранспортаFTP; + +КонецПроцедуры + +&НаКлиенте +Процедура ИспользоватьПараметрыТранспортаEMAILПриИзменении(Элемент) + + Элементы.НастройкиТранспортаEMAIL.Доступность = Объект.ИспользоватьПараметрыТранспортаEMAIL; + +КонецПроцедуры + +&НаКлиенте +Процедура КартинкаПервойИнформационнойБазы1Нажатие(Элемент) + + ВариантРаботыМастера = врмНастроитьНовыйОбменДанными(); + + ВариантРаботыМастераПриИзменении(Неопределено); + +КонецПроцедуры + +&НаКлиенте +Процедура КартинкаВторойИнформационнойБазы1Нажатие(Элемент) + + ВариантРаботыМастера = врмПродолжитьНастройкуОбменаДанными(); + + ВариантРаботыМастераПриИзменении(Неопределено); + +КонецПроцедуры + +////////////////////////////////////////////////////////// +// ПРИКЛАДНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ВыполнитьПроверкиПриНажатииГотово(Отказ) + + Если ЭтоСтраницаМастера(Элементы.СтраницаМастераОкончаниеСВыгрузкойНастройки) Тогда + + Если ПустаяСтрока(Объект.ИмяФайлаНастроекОбменаДанными) Тогда + + НСтрока = НСтр("ru = 'Сохраните файл с настройками для информационной базы-приемника'"); + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,"Объект.ИмяФайлаНастроекОбменаДанными",, Отказ); + + КонецЕсли; + + ИначеЕсли мТекущийНомерСтраницы = смИтогНастройкиОбмена_2() Тогда // Создание новой настройки обмена данными + + НастроитьНовыйОбменДаннымиНаКлиенте(Отказ); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьДействияПриНажатииГотово(Отказ) + + Если ЭтоСтраницаМастера(Элементы.СтраницаМастераОкончаниеСВыгрузкойНастройки) Тогда + + ЗакрытьФормуВыполнитьОбменНаКлиенте(Отказ); + + ИначеЕсли мТекущийНомерСтраницы = смИтогНастройкиОбмена_2() Тогда + + // закрываем форму; открываем помщник сопоставления с заданной настройкой обмена + мЗакрытьФормуБезусловно = Истина; + + Закрыть(); + + ФайлСообщенияОбменаСуществует = Истина; + + ОткрытьПомощникСопоставления = ФайлСообщенияОбменаСуществует И Не Объект.ЭтоНастройкаРаспределеннойИнформационнойБазы; + + Если ОткрытьПомощникСопоставления Тогда + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("УзелИнформационнойБазы", Объект.УзелИнформационнойБазы); + ПараметрыФормы.Вставить("ВидТранспортаСообщенийОбмена", Объект.ВидТранспортаСообщенийОбмена); + ПараметрыФормы.Вставить("ВыполнитьСопоставлениеПриОткрытии", Ложь); + + ОткрытьФорму("Обработка.ПомощникСопоставленияОбъектовИнформационныхБаз.Форма", ПараметрыФормы); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// ===== {ОБРАБОТЧИКИ СОБЫТИЙ СМЕНЫ СТРАНИЦЫ МАСТЕРА} Начало + +&НаКлиенте +Процедура ВыполнитьПроверкиПриПереходеНаСледующуюСтраницу(Отказ) + + Если ПредыдущийНомерСтраницы() = смНастройкаПараметров_1() + ИЛИ ПредыдущийНомерСтраницы() = смНастройкаПараметров_2() Тогда // Наименование настройки обмена данными + + ПроверитьНаименованиеНастройкиВыполненияОбмена(Отказ); + + ИначеЕсли ( ПредыдущийНомерСтраницы() = смЗаданиеПараметровТранспорта_1_FILE() + ИЛИ ПредыдущийНомерСтраницы() = смЗаданиеПараметровТранспорта_2_FILE()) + И Объект.ИспользоватьПараметрыТранспортаFILE Тогда // Проверка подключения обработки транспорта FILE + + ПроверитьПодключениеНаКлиенте(Отказ, "FILE"); + + ИначеЕсли ( ПредыдущийНомерСтраницы() = смЗаданиеПараметровТранспорта_1_FTP() + ИЛИ ПредыдущийНомерСтраницы() = смЗаданиеПараметровТранспорта_2_FTP()) + И Объект.ИспользоватьПараметрыТранспортаFTP Тогда // Проверка подключения обработки транспорта FTP + + ПроверитьПодключениеНаКлиенте(Отказ, "FTP"); + + ИначеЕсли ( ПредыдущийНомерСтраницы() = смЗаданиеПараметровТранспорта_1_EMAIL() + ИЛИ ПредыдущийНомерСтраницы() = смЗаданиеПараметровТранспорта_2_EMAIL()) + И Объект.ИспользоватьПараметрыТранспортаEMAIL Тогда // Проверка подключения обработки транспорта EMAIL + + ПроверитьПодключениеНаКлиенте(Отказ, "EMAIL"); + + ИначеЕсли ПредыдущийНомерСтраницы() = смНачало_2() Тогда // Проверка выполнения загрузки параметров настройки из источника + + ПроверитьИмяФайлаНастроекОбменаДаннымиДляЗагрузки(Отказ); + + КонецЕсли; + + Если (мТекущийНомерСтраницы = смНастройкаПараметров_1() + ИЛИ мТекущийНомерСтраницы = смНастройкаПараметров_2()) + И НЕ (Объект.ИспользоватьПараметрыТранспортаEMAIL + ИЛИ Объект.ИспользоватьПараметрыТранспортаFILE + ИЛИ Объект.ИспользоватьПараметрыТранспортаFTP) Тогда + // если перешли на страницу доп. параметров, и не выбран ни одни вид транспорта + // то это предупреждаем об ошибке + + Отказ = Истина; + + Предупреждение(НСтр("ru = 'Не указаны настройки ни для одного вида обмена данными! + |Следует использовать хотя бы один вид обмена данными.'")); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьДействияПриПереходеНаСледующуюСтраницу(Отказ) + + Если ЭтоСтраницаМастера(Элементы.СтраницаМастераИтогНастройкиОбмена) Тогда // Представление результата настройки обмена + + ПолучитьПредставлениеРезультатаНастройкиОбмена(); + + Элементы.СтраницыНадписиИнформацииОбОткрытииПомощникаСопоставления.ТекущаяСтраница = ?( + (ВариантРаботыМастера = врмПродолжитьНастройкуОбменаДанными() + И Не Объект.ЭтоНастройкаРаспределеннойИнформационнойБазы), + Элементы.СтраницаНадписиИнформацииОбОткрытииПомощникаСопоставления, + Элементы.СтраницаНадписиИнформацииОбОткрытииПомощникаСопоставленияПустая); + // + ИначеЕсли ЭтоСтраницаМастера(Элементы.СтраницаМастераОкончаниеСВыгрузкойНастройки) Тогда // Создание новой настройки обмена данными + + Состояние(НСтр("ru = 'Выполняется создание настройки обмена данными'")); + + // создаем настройку обмена; выгружаем файл с настройками для второй ИБ + ВыполнитьДействияПриПереходеНаЗавершающуюСтраницуПервогоШагаНастройки(Отказ); + + Если Отказ Тогда + + Предупреждение(НСтр("ru = 'При создании настройки обмена данными возникли ошибки!'")); + + КонецЕсли; + + ИначеЕсли ЭтоСтраницаМастера(Элементы.СтраницаМастераНастройкаПараметров) Тогда + + СписокЗначений = ДоступныеВариантыРаботыМастера( + Объект.ИспользоватьПараметрыТранспортаEMAIL, + Объект.ИспользоватьПараметрыТранспортаFILE, + Объект.ИспользоватьПараметрыТранспортаFTP); + // + + СписокВыбора = Элементы.ВидТранспортаСообщенийОбмена.СписокВыбора; + СписокВыбора.Очистить(); + + Для каждого Элемент Из СписокЗначений Цикл + + ЗаполнитьЗначенияСвойств(СписокВыбора.Добавить(), Элемент); + + КонецЦикла; + + Если Объект.ИспользоватьПараметрыТранспортаFILE Тогда + + Объект.ВидТранспортаСообщенийОбмена = ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.FILE") + + ИначеЕсли Объект.ИспользоватьПараметрыТранспортаFTP Тогда + + Объект.ВидТранспортаСообщенийОбмена = ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.FTP") + + ИначеЕсли Объект.ИспользоватьПараметрыТранспортаEMAIL Тогда + + Объект.ВидТранспортаСообщенийОбмена = ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.EMAIL") + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьПроверкиПриПереходеНаПредыдущуюСтраницу(Отказ) + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьДействияПриПереходеНаПредыдущуюСтраницу(Отказ) + +КонецПроцедуры + +&НаКлиенте +Процедура ПриИзмененииНомераСтраницы(Отказ) + +КонецПроцедуры + +// ===== {ОБРАБОТЧИКИ СОБЫТИЙ СМЕНЫ СТРАНИЦЫ МАСТЕРА} Окончание + +&НаСервере +Процедура НастроитьНовыйОбменДаннымиНаСервере(Отказ) + + ОпределитьТипАвтоматическогоОбменаДанными(); + + Объект.ВариантРаботыМастера = ВариантРаботыМастера; + + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + + ОбработкаОбъект.ВыполнитьДействияПоНастройкеНовогоОбменаДанными(Отказ, НастройкаОтборовНаУзле, ЗначенияПоУмолчаниюНаУзле); + + ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); + +КонецПроцедуры + +&НаСервере +Процедура ВыполнитьДействияПриПереходеНаЗавершающуюСтраницуПервогоШагаНастройки(Отказ) + + НастроитьНовыйОбменДаннымиНаСервере(Отказ); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + Если Объект.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FILE Тогда + + АдресВременногоХранилища = ""; + + ВыгрузитьНастройкиОбменаДляПриемника(Отказ, АдресВременногоХранилища); + + Если Не Отказ Тогда + + Объект.ИмяФайлаНастроекОбменаДанными = ОбщегоНазначенияКлиентСервер.ПолучитьИмяФайла(Объект.FILEКаталогОбменаИнформацией, ИмяФайлаНастроекДляПриемника); + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища); + + УдалитьИзВременногоХранилища(АдресВременногоХранилища); + + // получаем файл + ДвоичныеДанные.Записать(Объект.ИмяФайлаНастроекОбменаДанными); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОпределитьТипАвтоматическогоОбменаДанными() + +КонецПроцедуры + +&НаСервере +Процедура УстановитьВидимостьНаСервере() + + Элементы.ПояснениеВыбораКаталогаОбменаИнформациейНаСервере.Видимость = Не ОбщегоНазначения.ИнформационнаяБазаФайловая(); + + Элементы.ГиперссылкаМетодикаВыбораИнформационнойБазы.Видимость = Не Объект.ЭтоНастройкаРаспределеннойИнформационнойБазы; + + Элементы.РамкаГруппыПрефиксаИнформационнойБазы.Видимость = Не Объект.ПрефиксИнформационнойБазыИсточникаУстановлен; + + Элементы.РамкаГруппыЗначенийПоУмолчанию.Видимость = Не Объект.ЭтоНастройкаРаспределеннойИнформационнойБазы; + + Элементы.СтраницыОтображенияФинальногоДействия.ТекущаяСтраница = ?(Объект.ЭтоНастройкаРаспределеннойИнформационнойБазы, + Элементы.СтраницаВыполнитьСозданиеНачальногоОбразаПодчиненногоУзла, + Элементы.СтраницаВыполнитьВыгрузкуДанныхДляСопоставления); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолучитьПредставлениеРезультатаНастройкиОбмена() + + СтрокаСообщения = НСтр("ru = '[ПредставлениеРезультатаТранспортСообщений] + | + |[ПредставлениеРезультатаОтборыНаУзле] + | + |[ПредставлениеРезультатаЗначенияПоУмолчаниюНаУзле] + | + |Префикс информационной базы: [ПредставлениеРезультатаПрефиксИнформационнойБазы] + |'"); + // + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ПредставлениеРезультатаТранспортСообщений]", ПредставлениеРезультатаТранспортСообщений()); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ПредставлениеРезультатаОтборыНаУзле]", ПредставлениеРезультатаОтборыНаУзле()); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ПредставлениеРезультатаЗначенияПоУмолчаниюНаУзле]", ПредставлениеРезультатаЗначенияПоУмолчаниюНаУзле()); + СтрокаСообщения = СтрЗаменить(СтрокаСообщения, "[ПредставлениеРезультатаПрефиксИнформационнойБазы]", ПредставлениеРезультатаПрефиксИнформационнойБазы()); + + ПредставлениеРезультатаНастройкиОбмена = СтрокаСообщения; + +КонецПроцедуры + +&НаКлиенте +Функция ПредставлениеРезультатаТранспортСообщений() + + Результат = Строка(Объект.ВидТранспортаСообщенийОбмена) + + НСтр("ru = ', параметры:'") + Символы.ПС + + ПолучитьОписаниеНастроекТранспортаОбмена(); + + Возврат СокрЛП(Результат); + +КонецФункции + +&НаКлиенте +Функция ПредставлениеРезультатаОтборыНаУзле() + + Возврат ОписаниеОграниченийПередачиДанных; + +КонецФункции + +&НаКлиенте +Функция ПредставлениеРезультатаЗначенияПоУмолчаниюНаУзле() + + Возврат ОписаниеЗначенийПоУмолчанию; + +КонецФункции + +&НаКлиенте +Функция ПредставлениеРезультатаПрефиксИнформационнойБазы() + + Возврат Объект.ПрефиксИнформационнойБазыИсточника; + +КонецФункции + +&НаСервере +Процедура ВыгрузитьНастройкиОбменаДляПриемника(Отказ, АдресВременногоХранилища) + + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + + ОбработкаОбъект.ВыполнитьВыгрузкуПараметровМастера(Отказ, АдресВременногоХранилища); + + ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); + +КонецПроцедуры + +&НаСервере +Процедура ЗагрузитьПараметрыМастера(Отказ, АдресВременногоХранилища) + + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + + ОбработкаОбъект.ВыполнитьЗагрузкуПараметровМастера(Отказ, АдресВременногоХранилища); + + ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); + + Элементы.НастройкиТранспортаFILE.Доступность = Объект.ИспользоватьПараметрыТранспортаFILE; + Элементы.НастройкиТранспортаFTP.Доступность = Объект.ИспользоватьПараметрыТранспортаFTP; + Элементы.НастройкиТранспортаEMAIL.Доступность = Объект.ИспользоватьПараметрыТранспортаEMAIL; + +КонецПроцедуры + +&НаСервере +Процедура ПолучитьЗначенияПоУмолчаниюПланаОбмена() + + МенеджерПланаОбмена = ПланыОбмена[Объект.ИмяПланаОбмена]; + + ИмяФайлаНастроекДляПриемника = МенеджерПланаОбмена.ИмяФайлаНастроекДляПриемника() + ".xml"; + + НастройкаОтборовНаУзле = МенеджерПланаОбмена.НастройкаОтборовНаУзле(); + ЗначенияПоУмолчаниюНаУзле = МенеджерПланаОбмена.ЗначенияПоУмолчаниюНаУзле(); + + ОписаниеОграниченийПередачиДанных = МенеджерПланаОбмена.ОписаниеОграниченийПередачиДанных(НастройкаОтборовНаУзле); + ОписаниеЗначенийПоУмолчанию = МенеджерПланаОбмена.ОписаниеЗначенийПоУмолчанию(ЗначенияПоУмолчаниюНаУзле); + + ИмяФормыСозданияНачальногоОбраза = МенеджерПланаОбмена.ИмяФормыСозданияНачальногоОбраза(); + + ИспользуемыеТранспортыСообщенийОбмена = МенеджерПланаОбмена.ИспользуемыеТранспортыСообщенийОбмена(); + + ИспользоватьТранспортСообщенийОбменаEMAIL = (ИспользуемыеТранспортыСообщенийОбмена.Найти(Перечисления.ВидыТранспортаСообщенийОбмена.EMAIL) <> Неопределено); + ИспользоватьТранспортСообщенийОбменаFILE = (ИспользуемыеТранспортыСообщенийОбмена.Найти(Перечисления.ВидыТранспортаСообщенийОбмена.FILE) <> Неопределено); + ИспользоватьТранспортСообщенийОбменаFTP = (ИспользуемыеТранспортыСообщенийОбмена.Найти(Перечисления.ВидыТранспортаСообщенийОбмена.FTP) <> Неопределено); + +КонецПроцедуры + +&НаСервере +Процедура ПолучитьОписаниеОграниченийПередачиДанных() + + ОписаниеОграниченийПередачиДанных = ПланыОбмена[Объект.ИмяПланаОбмена].ОписаниеОграниченийПередачиДанных(НастройкаОтборовНаУзле); + +КонецПроцедуры + +&НаСервере +Процедура ПолучитьОписаниеЗначенийПоУмолчанию() + + ОписаниеЗначенийПоУмолчанию = ПланыОбмена[Объект.ИмяПланаОбмена].ОписаниеЗначенийПоУмолчанию(ЗначенияПоУмолчаниюНаУзле); + +КонецПроцедуры + +&НаКлиенте +Процедура ИнициализацияОбменаДаннымиНаКлиенте(Отказ) + + Состояние(НСтр("ru = 'Выполняется выгрузка данных...'")); + + // выполняем выгрузку данных + ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(Отказ, Объект.УзелИнформационнойБазы, Ложь, Истина, Объект.ВидТранспортаСообщенийОбмена); + + Состояние(НСтр("ru = 'Выгрузка данных завершена'")); + + Если Отказ Тогда + + Предупреждение(НСтр("ru = 'Во время выгрузки данных возникли ошибки!'")); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьНовыйОбменДаннымиНаКлиенте(Отказ) + + Состояние(НСтр("ru = 'Выполняется создание настройки обмена данными'")); + + НастроитьНовыйОбменДаннымиНаСервере(Отказ); + + Если Отказ Тогда + + Предупреждение(НСтр("ru = 'При создании настройки обмена данными возникли ошибки!'")); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьНаименованиеНастройкиВыполненияОбмена(Отказ) + + Если ПустаяСтрока(Объект.НаименованиеНастройкиВыполненияОбмена) Тогда + + НСтрока = НСтр("ru = 'Укажите наименование настройки обмена данными'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,, "Объект.НаименованиеНастройкиВыполненияОбмена",, Отказ); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьИмяФайлаНастроекОбменаДаннымиДляЗагрузки(Отказ) + + Если ПустаяСтрока(Объект.ИмяФайлаНастроекОбменаДаннымиДляЗагрузки) Тогда + + НСтрока = НСтр("ru = 'Выберите файл с настройками обмена данными'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтрока,,"Объект.ИмяФайлаНастроекОбменаДаннымиДляЗагрузки",, Отказ); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФормуВыполнитьОбменНаКлиенте(Отказ) + + Если Объект.ЭтоНастройкаРаспределеннойИнформационнойБазы Тогда + + Если ВыполнитьСозданиеНачальногоОбразаСейчас Тогда + + ПараметрыФормы = Новый Структура("Ключ, Узел", Объект.УзелИнформационнойБазы, Объект.УзелИнформационнойБазы); + + ОткрытьФормуМодально(ИмяФормыСозданияНачальногоОбраза, ПараметрыФормы); + + КонецЕсли; + + Иначе + + Если ВыполнитьОбменДаннымиСейчас Тогда + + ИнициализацияОбменаДаннымиНаКлиенте(Отказ); + + КонецЕсли; + + КонецЕсли; + + мЗакрытьФормуБезусловно = Истина; + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьОписаниеНастроекТранспортаОбмена() + + // возвращаемое значение функции + Результат = ""; + + СписокВыбора = Элементы.ВидТранспортаСообщенийОбмена.СписокВыбора; + Элемент = СписокВыбора.НайтиПоЗначению(Объект.ВидТранспортаСообщенийОбмена); + + Для Каждого Элемент ИЗ мПредставленияНастроекТранспорта[Элемент.Представление] Цикл + + ЗначениеНастройки = Объект[Элемент.Ключ]; + + Если Найти(ВРег(Элемент.Значение), "ПАРОЛЬ") <> 0 Тогда + + // если задан пароль, то значение пароля не выводим + ЗначениеНастройки = ?(ПустаяСтрока(ЗначениеНастройки), НСтр("ru = '<не задан>'"), НСтр("ru = '<указан>'")); + + ИначеЕсли Не ТипЗначения(ЗначениеНастройки, "Число") + И Не ТипЗначения(ЗначениеНастройки, "Булево") + И Не ЗначениеЗаполнено(ЗначениеНастройки) Тогда + + // если значение настройки не задано, то выводим значение "<пусто>" + ЗначениеНастройки = НСтр("ru = '<пусто>'"); + + КонецЕсли; + + СтрокаНастройки = "[Представление]: [Значение]"; + СтрокаНастройки = СтрЗаменить(СтрокаНастройки, "[Представление]", Элемент.Значение); + СтрокаНастройки = СтрЗаменить(СтрокаНастройки, "[Значение]", ЗначениеНастройки); + + Результат = Результат + СтрокаНастройки + Символы.ПС; + + КонецЦикла; + + Если ПустаяСтрока(Результат) Тогда + + Результат = НСтр("ru = 'Параметры транспорта не заданы.'"); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция ТипЗначения(Значение, ИмяТипа) + + Возврат ТипЗнч(Значение) = Тип(ИмяТипа); + +КонецФункции + +&НаКлиенте +Процедура ПроверитьПодключение(ВидТранспорта) + + Отказ = Ложь; + + ПроверитьПодключениеНаСервере(Отказ, ВидТранспорта); + + СтрокаСообщения = ?(Отказ, НСтр("ru = 'Ошибка установки подключения!'"), + НСтр("ru = 'Подключение успешно установлено!'")); + // + Предупреждение(СтрокаСообщения); + +КонецПроцедуры + +&НаСервере +Процедура ПроверитьПодключениеНаСервере(Отказ, ВидТранспорта) + + Если ТипЗнч(ВидТранспорта) = Тип("Строка") Тогда + + ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена[ВидТранспорта]; + + КонецЕсли; + + ОбменДаннымиСервер.ПроверитьПодключениеОбработкиТранспортаСообщенийОбмена(Отказ, Объект, ВидТранспорта); + +КонецПроцедуры + +&НаКлиенте +Процедура Инкремент(Число, Знач Итератор = 1) + + Число = Число + Итератор; + +КонецПроцедуры + +&НаКлиенте +Функция ЭтоСтраницаМастера(ЭлементФормы) + + Возврат мСтраницыМастера[мТекущийНомерСтраницы] = ЭлементФормы; + +КонецФункции + +&НаКлиенте +Функция ПредыдущийНомерСтраницы() + + Возврат мТекущийНомерСтраницы - 1; + +КонецФункции + +&НаКлиенте +Процедура ПроверитьПодключениеНаКлиенте(Отказ, ВидТранспорта) + + Состояние(НСтр("ru = 'Выполняется проверка параметров транспорта...'")); + + ПроверитьПодключениеНаСервере(Отказ, ВидТранспорта); + + Если Отказ Тогда + + Предупреждение(НСтр("ru = 'Ошибка установки подключения!'")); + + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ДоступныеВариантыРаботыМастера( + Знач ИспользоватьПараметрыТранспортаEMAIL, + Знач ИспользоватьПараметрыТранспортаFILE, + Знач ИспользоватьПараметрыТранспортаFTP) + // + СписокЗначений = Новый СписокЗначений; + + Если ИспользоватьПараметрыТранспортаFILE Тогда + ЗначениеПеречисления = Перечисления.ВидыТранспортаСообщенийОбмена.FILE; + СписокЗначений.Добавить(ЗначениеПеречисления, Строка(ЗначениеПеречисления)); + КонецЕсли; + + Если ИспользоватьПараметрыТранспортаFTP Тогда + ЗначениеПеречисления = Перечисления.ВидыТранспортаСообщенийОбмена.FTP; + СписокЗначений.Добавить(ЗначениеПеречисления, Строка(ЗначениеПеречисления)); + КонецЕсли; + + Если ИспользоватьПараметрыТранспортаEMAIL Тогда + ЗначениеПеречисления = Перечисления.ВидыТранспортаСообщенийОбмена.EMAIL; + СписокЗначений.Добавить(ЗначениеПеречисления, Строка(ЗначениеПеречисления)); + КонецЕсли; + + Возврат СписокЗначений; +КонецФункции + +&НаКлиенте +Процедура ОтображениеЭлементовКомпозицииКартинокПервойСтраницыМастера() + + ЭтоПерваяИнформационнаяБаза = (ВариантРаботыМастера = врмНастроитьНовыйОбменДанными()); + + Постфикс1 = ?(ЭтоПерваяИнформационнаяБаза, "Активная", "Неактивная"); + Постфикс2 = ?(ЭтоПерваяИнформационнаяБаза, "Неактивная", "Активная"); + + ИмяСтраницыПервойИнформационнойБазы = "СтраницаПервойИнформационнойБазы[Постфикс]"; + ИмяСтраницыПервойИнформационнойБазы = СтрЗаменить(ИмяСтраницыПервойИнформационнойБазы, "[Постфикс]", Постфикс1); + + ИмяСтраницыВторойИнформационнойБазы = "СтраницаВторойИнформационнойБазы[Постфикс]"; + ИмяСтраницыВторойИнформационнойБазы = СтрЗаменить(ИмяСтраницыВторойИнформационнойБазы, "[Постфикс]", Постфикс2); + + Элементы.СтраницыПервойИнформационнойБазы.ТекущаяСтраница = Элементы[ИмяСтраницыПервойИнформационнойБазы]; + Элементы.СтраницыВторойИнформационнойБазы.ТекущаяСтраница = Элементы[ИмяСтраницыВторойИнформационнойБазы]; + +КонецПроцедуры + +// ЗНАЧЕНИЯ КОНСТАНТ + +&НаКлиенте +Функция врмНастроитьНовыйОбменДанными() + + Возврат "НастроитьНовыйОбменДанными"; + +КонецФункции + +&НаКлиенте +Функция врмПродолжитьНастройкуОбменаДанными() + + Возврат "ПродолжитьНастройкуОбменаДанными"; + +КонецФункции + +// КОНСТАНТЫ ПЕРВОГО ЭТАПА НАСТРОЙКИ + +&НаКлиенте +Функция смНачало_1() + + Возврат 10; + +КонецФункции + +&НаКлиенте +Функция смЗаданиеПараметровТранспорта_1_FILE() + + Результат = 10; + + Если ИспользоватьТранспортСообщенийОбменаFILE Тогда + Инкремент(Результат); + КонецЕсли; + + Если Не ИспользоватьТранспортСообщенийОбменаFILE Тогда + Возврат 0; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция смЗаданиеПараметровТранспорта_1_FTP() + + Результат = 10; + + Если ИспользоватьТранспортСообщенийОбменаFILE Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаFTP Тогда + Инкремент(Результат); + КонецЕсли; + + Если Не ИспользоватьТранспортСообщенийОбменаFTP Тогда + Возврат 0; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция смЗаданиеПараметровТранспорта_1_EMAIL() + + Результат = 10; + + Если ИспользоватьТранспортСообщенийОбменаFILE Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаFTP Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаEMAIL Тогда + Инкремент(Результат); + КонецЕсли; + + Если Не ИспользоватьТранспортСообщенийОбменаEMAIL Тогда + Возврат 0; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция смНастройкаПараметров_1() + + Результат = 11; + + Если ИспользоватьТранспортСообщенийОбменаFILE Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаFTP Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаEMAIL Тогда + Инкремент(Результат); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция смИтогНастройкиОбмена_1() + + Результат = 12; + + Если ИспользоватьТранспортСообщенийОбменаFILE Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаFTP Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаEMAIL Тогда + Инкремент(Результат); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция смОкончаниеСВыгрузкойНастройки_1() + + Результат = 13; + + Если ИспользоватьТранспортСообщенийОбменаFILE Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаFTP Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаEMAIL Тогда + Инкремент(Результат); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// КОНСТАНТЫ ВТОРОГО ЭТАПА НАСТРОЙКИ + +&НаКлиенте +Функция смНачало_2() + + Возврат 40; + +КонецФункции + +&НаКлиенте +Функция смЗаданиеПараметровТранспорта_2_FILE() + + Результат = 40; + + Если ИспользоватьТранспортСообщенийОбменаFILE Тогда + Инкремент(Результат); + КонецЕсли; + + Если Не ИспользоватьТранспортСообщенийОбменаFILE Тогда + Возврат 0; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция смЗаданиеПараметровТранспорта_2_FTP() + + Результат = 40; + + Если ИспользоватьТранспортСообщенийОбменаFILE Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаFTP Тогда + Инкремент(Результат); + КонецЕсли; + + Если Не ИспользоватьТранспортСообщенийОбменаFTP Тогда + Возврат 0; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция смЗаданиеПараметровТранспорта_2_EMAIL() + + Результат = 40; + + Если ИспользоватьТранспортСообщенийОбменаFILE Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаFTP Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаEMAIL Тогда + Инкремент(Результат); + КонецЕсли; + + Если Не ИспользоватьТранспортСообщенийОбменаEMAIL Тогда + Возврат 0; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция смНастройкаПараметров_2() + + Результат = 41; + + Если ИспользоватьТранспортСообщенийОбменаFILE Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаFTP Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаEMAIL Тогда + Инкремент(Результат); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция смИтогНастройкиОбмена_2() + + + Результат = 42; + + Если ИспользоватьТранспортСообщенийОбменаFILE Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаFTP Тогда + Инкремент(Результат); + КонецЕсли; + + Если ИспользоватьТранспортСообщенийОбменаEMAIL Тогда + Инкремент(Результат); + КонецЕсли; + + Возврат Результат; + +КонецФункции diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html new file mode 100644 index 000000000..4dd5e0f59 --- /dev/null +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html @@ -0,0 +1,12 @@ + +